From d57f6ab8609134ff114140645f0c423b9ad638eb Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Thu, 10 Jun 2021 16:44:32 +0000 Subject: [PATCH 01/98] Replace recursive by iterative implementation of heapify --- .../Tpetra_TestBlockCrsMeshDatabase.hpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/tpetra/core/example/BlockCrs/Tpetra_TestBlockCrsMeshDatabase.hpp b/packages/tpetra/core/example/BlockCrs/Tpetra_TestBlockCrsMeshDatabase.hpp index 777a0eabe7c9..b722be73a433 100644 --- a/packages/tpetra/core/example/BlockCrs/Tpetra_TestBlockCrsMeshDatabase.hpp +++ b/packages/tpetra/core/example/BlockCrs/Tpetra_TestBlockCrsMeshDatabase.hpp @@ -117,16 +117,18 @@ namespace BlockCrsTest { template KOKKOS_INLINE_FUNCTION static void heapify(T1 *v, T2 n, T2 i) { - T2 largest = i; - T2 l = 2*i + 1; - T2 r = 2*i + 2; - - if (l < n && v[l] > v[largest]) largest = l; - if (r < n && v[r] > v[largest]) largest = r; - if (largest != i) { + while (true) { + T2 largest = i; + T2 l = 2*i + 1; + T2 r = 2*i + 2; + + if (l < n && v[l] > v[largest]) largest = l; + if (r < n && v[r] > v[largest]) largest = r; + if (largest == i) + break; // swap T1 tmp = v[i]; v[i] = v[largest]; v[largest] = tmp; - heapify(v, n, largest); + i = largest; } } From e2359aea1986b54f0878ffdc9543f46f88bb61f1 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Thu, 10 Jun 2021 13:19:54 +0000 Subject: [PATCH 02/98] Tpetra: Enable more SYCL tests --- .../core/ext/TpetraExt_MatrixMatrix_SYCL.hpp | 826 ++++++++++++++++++ .../core/ext/TpetraExt_MatrixMatrix_def.hpp | 1 + .../TpetraExt_TripleMatrixMultiply_def.hpp | 1 + .../ImportExport2/ImportExport2_UnitTests.cpp | 15 +- .../MatrixMatrix/MatrixMatrix_UnitTests.cpp | 13 +- 5 files changed, 851 insertions(+), 5 deletions(-) create mode 100644 packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp diff --git a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp new file mode 100644 index 000000000000..d29c8292ea62 --- /dev/null +++ b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp @@ -0,0 +1,826 @@ +// @HEADER +// *********************************************************************** +// +// Tpetra: Templated Linear Algebra Services Package +// Copyright (2008) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +// @HEADER + +#ifndef TPETRA_MATRIXMATRIX_SYCL_DEF_HPP +#define TPETRA_MATRIXMATRIX_SYCL_DEF_HPP + +#ifdef HAVE_TPETRA_INST_SYCL +namespace Tpetra { +namespace MMdetails { + +/*********************************************************************************************************/ +// MMM KernelWrappers for Partial Specialization to SYCL +template +struct KernelWrappers { + static inline void mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label = std::string(), + const Teuchos::RCP& params = Teuchos::null); + + + + static inline void mult_A_B_reuse_kernel_wrapper(CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label = std::string(), + const Teuchos::RCP& params = Teuchos::null); + +}; + +// Jacobi KernelWrappers for Partial Specialization to SYCL +template +struct KernelWrappers2 { + static inline void jacobi_A_B_newmatrix_kernel_wrapper(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label = std::string(), + const Teuchos::RCP& params = Teuchos::null); + + static inline void jacobi_A_B_reuse_kernel_wrapper(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label = std::string(), + const Teuchos::RCP& params = Teuchos::null); + + static inline void jacobi_A_B_newmatrix_KokkosKernels(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label = std::string(), + const Teuchos::RCP& params = Teuchos::null); +}; + + +/*********************************************************************************************************/ +// AB NewMatrix Kernel wrappers (KokkosKernels/SYCL Version) +template +void KernelWrappers::mult_A_B_newmatrix_kernel_wrapper(CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label, + const Teuchos::RCP& params) { + + +#ifdef HAVE_TPETRA_MMM_TIMINGS + std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": "); + using Teuchos::TimeMonitor; + Teuchos::RCP MM = rcp(new TimeMonitor(*(TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Newmatrix SYCLWrapper"))))); +#endif + // Node-specific code + typedef Kokkos::Compat::KokkosSYCLWrapperNode Node; + std::string nodename("SYCL"); + + // Lots and lots of typedefs + using Teuchos::RCP; + typedef typename Tpetra::CrsMatrix::local_matrix_device_type KCRS; + typedef typename KCRS::device_type device_t; + typedef typename KCRS::StaticCrsGraphType graph_t; + typedef typename graph_t::row_map_type::non_const_type lno_view_t; + typedef typename graph_t::row_map_type::const_type c_lno_view_t; + typedef typename graph_t::entries_type::non_const_type lno_nnz_view_t; + typedef typename KCRS::values_type::non_const_type scalar_view_t; + //typedef typename graph_t::row_map_type::const_type lno_view_t_const; + + // Options + int team_work_size = 16; // Defaults to 16 as per Deveci 12/7/16 - csiefer + std::string myalg("SPGEMM_KK_MEMORY"); + if(!params.is_null()) { + if(params->isParameter("sycl: algorithm")) + myalg = params->get("sycl: algorithm",myalg); + if(params->isParameter("sycl: team work size")) + team_work_size = params->get("sycl: team work size",team_work_size); + } + + // KokkosKernelsHandle + typedef KokkosKernels::Experimental::KokkosKernelsHandle< + typename lno_view_t::const_value_type,typename lno_nnz_view_t::const_value_type, typename scalar_view_t::const_value_type, + typename device_t::execution_space, typename device_t::memory_space,typename device_t::memory_space > KernelHandle; + + // Grab the Kokkos::SparseCrsMatrices + const KCRS & Amat = Aview.origMatrix->getLocalMatrixDevice(); + const KCRS & Bmat = Bview.origMatrix->getLocalMatrixDevice(); + + c_lno_view_t Arowptr = Amat.graph.row_map, + Browptr = Bmat.graph.row_map; + const lno_nnz_view_t Acolind = Amat.graph.entries, + Bcolind = Bmat.graph.entries; + const scalar_view_t Avals = Amat.values, + Bvals = Bmat.values; + + c_lno_view_t Irowptr; + lno_nnz_view_t Icolind; + scalar_view_t Ivals; + if(!Bview.importMatrix.is_null()) { + auto lclB = Bview.importMatrix->getLocalMatrixDevice(); + Irowptr = lclB.graph.row_map; + Icolind = lclB.graph.entries; + Ivals = lclB.values; + } + + + // Get the algorithm mode + std::string alg = nodename+std::string(" algorithm"); + // printf("DEBUG: Using kernel: %s\n",myalg.c_str()); + if(!params.is_null() && params->isParameter(alg)) myalg = params->get(alg,myalg); + KokkosSparse::SPGEMMAlgorithm alg_enum = KokkosSparse::StringToSPGEMMAlgorithm(myalg); + + // Merge the B and Bimport matrices + const KCRS Bmerged = Tpetra::MMdetails::merge_matrices(Aview,Bview,Acol2Brow,Acol2Irow,Bcol2Ccol,Icol2Ccol,C.getColMap()->getNodeNumElements()); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Newmatrix SYCLCore")))); +#endif + + // Do the multiply on whatever we've got + typename KernelHandle::nnz_lno_t AnumRows = Amat.numRows(); + typename KernelHandle::nnz_lno_t BnumRows = Bmerged.numRows(); + typename KernelHandle::nnz_lno_t BnumCols = Bmerged.numCols(); + + lno_view_t row_mapC (Kokkos::ViewAllocateWithoutInitializing("non_const_lnow_row"), AnumRows + 1); + lno_nnz_view_t entriesC; + scalar_view_t valuesC; + KernelHandle kh; + kh.create_spgemm_handle(alg_enum); + kh.set_team_work_size(team_work_size); + + KokkosSparse::Experimental::spgemm_symbolic(&kh,AnumRows,BnumRows,BnumCols,Amat.graph.row_map,Amat.graph.entries,false,Bmerged.graph.row_map,Bmerged.graph.entries,false,row_mapC); + + size_t c_nnz_size = kh.get_spgemm_handle()->get_c_nnz(); + if (c_nnz_size){ + entriesC = lno_nnz_view_t (Kokkos::ViewAllocateWithoutInitializing("entriesC"), c_nnz_size); + valuesC = scalar_view_t (Kokkos::ViewAllocateWithoutInitializing("valuesC"), c_nnz_size); + } + KokkosSparse::Experimental::spgemm_numeric(&kh,AnumRows,BnumRows,BnumCols,Amat.graph.row_map,Amat.graph.entries,Amat.values,false,Bmerged.graph.row_map,Bmerged.graph.entries,Bmerged.values,false,row_mapC,entriesC,valuesC); + kh.destroy_spgemm_handle(); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Newmatrix SYCLSort")))); +#endif + + // Sort & set values + if (params.is_null() || params->get("sort entries",true)) + Import_Util::sortCrsEntries(row_mapC, entriesC, valuesC); + C.setAllValues(row_mapC,entriesC,valuesC); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Newmatrix SYCLESFC")))); +#endif + + // Final Fillcomplete + RCP labelList = rcp(new Teuchos::ParameterList); + labelList->set("Timer Label",label); + if(!params.is_null()) labelList->set("compute global constants",params->get("compute global constants",true)); + RCP > dummyExport; + C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport,dummyExport,labelList); +} + + +/*********************************************************************************************************/ +template +void KernelWrappers::mult_A_B_reuse_kernel_wrapper( + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & targetMapToOrigRow_dev, + const LocalOrdinalViewType & targetMapToImportRow_dev, + const LocalOrdinalViewType & Bcol2Ccol_dev, + const LocalOrdinalViewType & Icol2Ccol_dev, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label, + const Teuchos::RCP& params) { + + // FIXME: Right now, this is a cut-and-paste of the serial kernel + typedef Kokkos::Compat::KokkosSYCLWrapperNode Node; + +#ifdef HAVE_TPETRA_MMM_TIMINGS + std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": "); + using Teuchos::TimeMonitor; + Teuchos::RCP MM = rcp(new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Reuse SerialCore")))); + Teuchos::RCP MM2; +#endif + using Teuchos::RCP; + using Teuchos::rcp; + + + // Lots and lots of typedefs + typedef typename Tpetra::CrsMatrix::local_matrix_host_type KCRS; + typedef typename KCRS::StaticCrsGraphType graph_t; + typedef typename graph_t::row_map_type::const_type c_lno_view_t; + typedef typename graph_t::entries_type::non_const_type lno_nnz_view_t; + typedef typename KCRS::values_type::non_const_type scalar_view_t; + + typedef Scalar SC; + typedef LocalOrdinal LO; + typedef GlobalOrdinal GO; + typedef Node NO; + typedef Map map_type; + const size_t ST_INVALID = Teuchos::OrdinalTraits::invalid(); + const LO LO_INVALID = Teuchos::OrdinalTraits::invalid(); + const SC SC_ZERO = Teuchos::ScalarTraits::zero(); + + // Since this is being run on SYCL, we need to fence because the below code will use UVM + // typename graph_t::execution_space().fence(); + + // KDDKDD UVM Without UVM, need to copy targetMap arrays to host. + // KDDKDD UVM Ideally, this function would run on device and use + // KDDKDD UVM KokkosKernels instead of this host implementation. + auto targetMapToOrigRow = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + targetMapToOrigRow_dev); + auto targetMapToImportRow = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + targetMapToImportRow_dev); + auto Bcol2Ccol = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + Bcol2Ccol_dev); + auto Icol2Ccol = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + Icol2Ccol_dev); + + // Sizes + RCP Ccolmap = C.getColMap(); + size_t m = Aview.origMatrix->getNodeNumRows(); + size_t n = Ccolmap->getNodeNumElements(); + + // Grab the Kokkos::SparseCrsMatrices & inner stuff + const KCRS & Amat = Aview.origMatrix->getLocalMatrixHost(); + const KCRS & Bmat = Bview.origMatrix->getLocalMatrixHost(); + const KCRS & Cmat = C.getLocalMatrixHost(); + + c_lno_view_t Arowptr = Amat.graph.row_map, + Browptr = Bmat.graph.row_map, + Crowptr = Cmat.graph.row_map; + const lno_nnz_view_t Acolind = Amat.graph.entries, + Bcolind = Bmat.graph.entries, + Ccolind = Cmat.graph.entries; + const scalar_view_t Avals = Amat.values, Bvals = Bmat.values; + scalar_view_t Cvals = Cmat.values; + + c_lno_view_t Irowptr; + lno_nnz_view_t Icolind; + scalar_view_t Ivals; + if(!Bview.importMatrix.is_null()) { + auto lclB = Bview.importMatrix->getLocalMatrixHost(); + Irowptr = lclB.graph.row_map; + Icolind = lclB.graph.entries; + Ivals = lclB.values; + } + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM2 = Teuchos::null; MM2 = rcp(new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string("MMM Newmatrix SerialCore - Compare")))); +#endif + + // Classic csr assembly (low memory edition) + // mfh 27 Sep 2016: The c_status array is an implementation detail + // of the local sparse matrix-matrix multiply routine. + + // The status array will contain the index into colind where this entry was last deposited. + // c_status[i] < CSR_ip - not in the row yet + // c_status[i] >= CSR_ip - this is the entry where you can find the data + // We start with this filled with INVALID's indicating that there are no entries yet. + // Sadly, this complicates the code due to the fact that size_t's are unsigned. + std::vector c_status(n, ST_INVALID); + + // For each row of A/C + size_t CSR_ip = 0, OLD_ip = 0; + for (size_t i = 0; i < m; i++) { + // First fill the c_status array w/ locations where we're allowed to + // generate nonzeros for this row + OLD_ip = Crowptr[i]; + CSR_ip = Crowptr[i+1]; + for (size_t k = OLD_ip; k < CSR_ip; k++) { + c_status[Ccolind[k]] = k; + + // Reset values in the row of C + Cvals[k] = SC_ZERO; + } + + for (size_t k = Arowptr[i]; k < Arowptr[i+1]; k++) { + LO Aik = Acolind[k]; + const SC Aval = Avals[k]; + if (Aval == SC_ZERO) + continue; + + if (targetMapToOrigRow[Aik] != LO_INVALID) { + // Local matrix + size_t Bk = Teuchos::as(targetMapToOrigRow[Aik]); + + for (size_t j = Browptr[Bk]; j < Browptr[Bk+1]; ++j) { + LO Bkj = Bcolind[j]; + LO Cij = Bcol2Ccol[Bkj]; + + TEUCHOS_TEST_FOR_EXCEPTION(c_status[Cij] < OLD_ip || c_status[Cij] >= CSR_ip, + std::runtime_error, "Trying to insert a new entry (" << i << "," << Cij << ") into a static graph " << + "(c_status = " << c_status[Cij] << " of [" << OLD_ip << "," << CSR_ip << "))"); + + Cvals[c_status[Cij]] += Aval * Bvals[j]; + } + + } else { + // Remote matrix + size_t Ik = Teuchos::as(targetMapToImportRow[Aik]); + for (size_t j = Irowptr[Ik]; j < Irowptr[Ik+1]; ++j) { + LO Ikj = Icolind[j]; + LO Cij = Icol2Ccol[Ikj]; + + TEUCHOS_TEST_FOR_EXCEPTION(c_status[Cij] < OLD_ip || c_status[Cij] >= CSR_ip, + std::runtime_error, "Trying to insert a new entry (" << i << "," << Cij << ") into a static graph " << + "(c_status = " << c_status[Cij] << " of [" << OLD_ip << "," << CSR_ip << "))"); + + Cvals[c_status[Cij]] += Aval * Ivals[j]; + } + } + } + } + + C.fillComplete(C.getDomainMap(), C.getRangeMap()); +} + +/*********************************************************************************************************/ +template +void KernelWrappers2::jacobi_A_B_newmatrix_kernel_wrapper(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label, + const Teuchos::RCP& params) { + +#ifdef HAVE_TPETRA_MMM_TIMINGS + std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": "); + using Teuchos::TimeMonitor; + Teuchos::RCP MM; +#endif + + // Node-specific code + using Teuchos::RCP; + + // Options + //int team_work_size = 16; // Defaults to 16 as per Deveci 12/7/16 - csiefer // unreferenced + std::string myalg("KK"); + if(!params.is_null()) { + if(params->isParameter("sycl: jacobi algorithm")) + myalg = params->get("sycl: jacobi algorithm",myalg); + } + + if(myalg == "MSAK") { + ::Tpetra::MatrixMatrix::ExtraKernels::jacobi_A_B_newmatrix_MultiplyScaleAddKernel(omega,Dinv,Aview,Bview,Acol2Brow,Acol2Irow,Bcol2Ccol,Icol2Ccol,C,Cimport,label,params); + } + else if(myalg == "KK") { + jacobi_A_B_newmatrix_KokkosKernels(omega,Dinv,Aview,Bview,Acol2Brow,Acol2Irow,Bcol2Ccol,Icol2Ccol,C,Cimport,label,params); + } + else { + throw std::runtime_error("Tpetra::MatrixMatrix::Jacobi newmatrix unknown kernel"); + } + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Newmatrix SYCLESFC")))); +#endif + + // Final Fillcomplete + RCP labelList = rcp(new Teuchos::ParameterList); + labelList->set("Timer Label",label); + if(!params.is_null()) labelList->set("compute global constants",params->get("compute global constants",true)); + + // NOTE: MSAK already fillCompletes, so we have to check here + if(!C.isFillComplete()) { + RCP > dummyExport; + C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport,dummyExport,labelList); + } + +} + + + +/*********************************************************************************************************/ +template +void KernelWrappers2::jacobi_A_B_reuse_kernel_wrapper(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & targetMapToOrigRow_dev, + const LocalOrdinalViewType & targetMapToImportRow_dev, + const LocalOrdinalViewType & Bcol2Ccol_dev, + const LocalOrdinalViewType & Icol2Ccol_dev, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label, + const Teuchos::RCP& params) { + + // FIXME: Right now, this is a cut-and-paste of the serial kernel + typedef Kokkos::Compat::KokkosSYCLWrapperNode Node; + +#ifdef HAVE_TPETRA_MMM_TIMINGS + std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": "); + using Teuchos::TimeMonitor; + Teuchos::RCP MM = rcp(new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Reuse SYCLCore")))); + Teuchos::RCP MM2; +#endif + using Teuchos::RCP; + using Teuchos::rcp; + + // Lots and lots of typedefs + typedef typename Tpetra::CrsMatrix::local_matrix_host_type KCRS; + typedef typename KCRS::StaticCrsGraphType graph_t; + typedef typename graph_t::row_map_type::const_type c_lno_view_t; + typedef typename graph_t::entries_type::non_const_type lno_nnz_view_t; + typedef typename KCRS::values_type::non_const_type scalar_view_t; + typedef typename scalar_view_t::memory_space scalar_memory_space; + + typedef Scalar SC; + typedef LocalOrdinal LO; + typedef GlobalOrdinal GO; + typedef Node NO; + typedef Map map_type; + const size_t ST_INVALID = Teuchos::OrdinalTraits::invalid(); + const LO LO_INVALID = Teuchos::OrdinalTraits::invalid(); + const SC SC_ZERO = Teuchos::ScalarTraits::zero(); + + // Since this is being run on SYCL, we need to fence because the below host code will use UVM + // KDDKDD typename graph_t::execution_space().fence(); + + // KDDKDD UVM Without UVM, need to copy targetMap arrays to host. + // KDDKDD UVM Ideally, this function would run on device and use + // KDDKDD UVM KokkosKernels instead of this host implementation. + auto targetMapToOrigRow = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + targetMapToOrigRow_dev); + auto targetMapToImportRow = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + targetMapToImportRow_dev); + auto Bcol2Ccol = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + Bcol2Ccol_dev); + auto Icol2Ccol = + Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), + Icol2Ccol_dev); + + + // Sizes + RCP Ccolmap = C.getColMap(); + size_t m = Aview.origMatrix->getNodeNumRows(); + size_t n = Ccolmap->getNodeNumElements(); + + // Grab the Kokkos::SparseCrsMatrices & inner stuff + const KCRS & Amat = Aview.origMatrix->getLocalMatrixHost(); + const KCRS & Bmat = Bview.origMatrix->getLocalMatrixHost(); + const KCRS & Cmat = C.getLocalMatrixHost(); + + c_lno_view_t Arowptr = Amat.graph.row_map, Browptr = Bmat.graph.row_map, Crowptr = Cmat.graph.row_map; + const lno_nnz_view_t Acolind = Amat.graph.entries, Bcolind = Bmat.graph.entries, Ccolind = Cmat.graph.entries; + const scalar_view_t Avals = Amat.values, Bvals = Bmat.values; + scalar_view_t Cvals = Cmat.values; + + c_lno_view_t Irowptr; + lno_nnz_view_t Icolind; + scalar_view_t Ivals; + if(!Bview.importMatrix.is_null()) { + auto lclB = Bview.importMatrix->getLocalMatrixHost(); + Irowptr = lclB.graph.row_map; + Icolind = lclB.graph.entries; + Ivals = lclB.values; + } + + // Jacobi-specific inner stuff + auto Dvals = + Dinv.template getLocalView(Access::ReadOnly); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM2 = Teuchos::null; MM2 = rcp(new TimeMonitor(*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Reuse SYCLCore - Compare")))); +#endif + + // The status array will contain the index into colind where this entry was last deposited. + // c_status[i] < CSR_ip - not in the row yet + // c_status[i] >= CSR_ip - this is the entry where you can find the data + // We start with this filled with INVALID's indicating that there are no entries yet. + // Sadly, this complicates the code due to the fact that size_t's are unsigned. + std::vector c_status(n, ST_INVALID); + + // For each row of A/C + size_t CSR_ip = 0, OLD_ip = 0; + for (size_t i = 0; i < m; i++) { + + // First fill the c_status array w/ locations where we're allowed to + // generate nonzeros for this row + OLD_ip = Crowptr[i]; + CSR_ip = Crowptr[i+1]; + for (size_t k = OLD_ip; k < CSR_ip; k++) { + c_status[Ccolind[k]] = k; + + // Reset values in the row of C + Cvals[k] = SC_ZERO; + } + + SC minusOmegaDval = -omega*Dvals(i,0); + + // Entries of B + for (size_t j = Browptr[i]; j < Browptr[i+1]; j++) { + Scalar Bval = Bvals[j]; + if (Bval == SC_ZERO) + continue; + LO Bij = Bcolind[j]; + LO Cij = Bcol2Ccol[Bij]; + + TEUCHOS_TEST_FOR_EXCEPTION(c_status[Cij] < OLD_ip || c_status[Cij] >= CSR_ip, + std::runtime_error, "Trying to insert a new entry into a static graph"); + + Cvals[c_status[Cij]] = Bvals[j]; + } + + // Entries of -omega * Dinv * A * B + for (size_t k = Arowptr[i]; k < Arowptr[i+1]; k++) { + LO Aik = Acolind[k]; + const SC Aval = Avals[k]; + if (Aval == SC_ZERO) + continue; + + if (targetMapToOrigRow[Aik] != LO_INVALID) { + // Local matrix + size_t Bk = Teuchos::as(targetMapToOrigRow[Aik]); + + for (size_t j = Browptr[Bk]; j < Browptr[Bk+1]; ++j) { + LO Bkj = Bcolind[j]; + LO Cij = Bcol2Ccol[Bkj]; + + TEUCHOS_TEST_FOR_EXCEPTION(c_status[Cij] < OLD_ip || c_status[Cij] >= CSR_ip, + std::runtime_error, "Trying to insert a new entry into a static graph"); + + Cvals[c_status[Cij]] += minusOmegaDval * Aval * Bvals[j]; + } + + } else { + // Remote matrix + size_t Ik = Teuchos::as(targetMapToImportRow[Aik]); + for (size_t j = Irowptr[Ik]; j < Irowptr[Ik+1]; ++j) { + LO Ikj = Icolind[j]; + LO Cij = Icol2Ccol[Ikj]; + + TEUCHOS_TEST_FOR_EXCEPTION(c_status[Cij] < OLD_ip || c_status[Cij] >= CSR_ip, + std::runtime_error, "Trying to insert a new entry into a static graph"); + + Cvals[c_status[Cij]] += minusOmegaDval * Aval * Ivals[j]; + } + } + } + } + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM2= Teuchos::null; + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Reuse ESFC")))); +#endif + + C.fillComplete(C.getDomainMap(), C.getRangeMap()); + +} + +/*********************************************************************************************************/ +template +void KernelWrappers2::jacobi_A_B_newmatrix_KokkosKernels(Scalar omega, + const Vector & Dinv, + CrsMatrixStruct& Aview, + CrsMatrixStruct& Bview, + const LocalOrdinalViewType & Acol2Brow, + const LocalOrdinalViewType & Acol2Irow, + const LocalOrdinalViewType & Bcol2Ccol, + const LocalOrdinalViewType & Icol2Ccol, + CrsMatrix& C, + Teuchos::RCP > Cimport, + const std::string& label, + const Teuchos::RCP& params) { + +#ifdef HAVE_TPETRA_MMM_TIMINGS + std::string prefix_mmm = std::string("TpetraExt ") + label + std::string(": "); + using Teuchos::TimeMonitor; + Teuchos::RCP MM; +#endif + + // Check if the diagonal entries exist in debug mode + const bool debug = Tpetra::Details::Behavior::debug(); + if(debug) { + + auto rowMap = Aview.origMatrix->getRowMap(); + Tpetra::Vector diags(rowMap); + Aview.origMatrix->getLocalDiagCopy(diags); + size_t diagLength = rowMap->getNodeNumElements(); + Teuchos::Array diagonal(diagLength); + diags.get1dCopy(diagonal()); + + for(size_t i = 0; i < diagLength; ++i) { + TEUCHOS_TEST_FOR_EXCEPTION(diagonal[i] == Teuchos::ScalarTraits::zero(), + std::runtime_error, + "Matrix A has a zero/missing diagonal: " << diagonal[i] << std::endl << + "KokkosKernels Jacobi-fused SpGEMM requires nonzero diagonal entries in A" << std::endl); + } + } + + // Usings + using device_t = typename Kokkos::Compat::KokkosSYCLWrapperNode::device_type; + using matrix_t = typename Tpetra::CrsMatrix::local_matrix_device_type; + using graph_t = typename matrix_t::StaticCrsGraphType; + using lno_view_t = typename graph_t::row_map_type::non_const_type; + using c_lno_view_t = typename graph_t::row_map_type::const_type; + using lno_nnz_view_t = typename graph_t::entries_type::non_const_type; + using scalar_view_t = typename matrix_t::values_type::non_const_type; + + // KokkosKernels handle + using handle_t = typename KokkosKernels::Experimental::KokkosKernelsHandle< + typename lno_view_t::const_value_type,typename lno_nnz_view_t::const_value_type, typename scalar_view_t::const_value_type, + typename device_t::execution_space, typename device_t::memory_space,typename device_t::memory_space >; + + // Get the rowPtr, colInd and vals of importMatrix + c_lno_view_t Irowptr; + lno_nnz_view_t Icolind; + scalar_view_t Ivals; + if(!Bview.importMatrix.is_null()) { + auto lclB = Bview.importMatrix->getLocalMatrixDevice(); + Irowptr = lclB.graph.row_map; + Icolind = lclB.graph.entries; + Ivals = lclB.values; + } + + // Merge the B and Bimport matrices + const matrix_t Bmerged = Tpetra::MMdetails::merge_matrices(Aview,Bview,Acol2Brow,Acol2Irow,Bcol2Ccol,Icol2Ccol,C.getColMap()->getNodeNumElements()); + + // Get the properties and arrays of input matrices + const matrix_t & Amat = Aview.origMatrix->getLocalMatrixDevice(); + const matrix_t & Bmat = Bview.origMatrix->getLocalMatrixDevice(); + + typename handle_t::nnz_lno_t AnumRows = Amat.numRows(); + typename handle_t::nnz_lno_t BnumRows = Bmerged.numRows(); + typename handle_t::nnz_lno_t BnumCols = Bmerged.numCols(); + + c_lno_view_t Arowptr = Amat.graph.row_map, Browptr = Bmerged.graph.row_map; + const lno_nnz_view_t Acolind = Amat.graph.entries, Bcolind = Bmerged.graph.entries; + const scalar_view_t Avals = Amat.values, Bvals = Bmerged.values; + + // Arrays of the output matrix + lno_view_t row_mapC (Kokkos::ViewAllocateWithoutInitializing("non_const_lnow_row"), AnumRows + 1); + lno_nnz_view_t entriesC; + scalar_view_t valuesC; + + // Options + int team_work_size = 16; + std::string myalg("SPGEMM_KK_MEMORY"); + if(!params.is_null()) { + if(params->isParameter("sycl: algorithm")) + myalg = params->get("sycl: algorithm",myalg); + if(params->isParameter("sycl: team work size")) + team_work_size = params->get("sycl: team work size",team_work_size); + } + + // Get the algorithm mode + std::string nodename("SYCL"); + std::string alg = nodename + std::string(" algorithm"); + if(!params.is_null() && params->isParameter(alg)) myalg = params->get(alg,myalg); + KokkosSparse::SPGEMMAlgorithm alg_enum = KokkosSparse::StringToSPGEMMAlgorithm(myalg); + + + // KokkosKernels call + handle_t kh; + kh.create_spgemm_handle(alg_enum); + kh.set_team_work_size(team_work_size); + + KokkosSparse::Experimental::spgemm_symbolic(&kh, AnumRows, BnumRows, BnumCols, + Arowptr, Acolind, false, + Browptr, Bcolind, false, + row_mapC); + + size_t c_nnz_size = kh.get_spgemm_handle()->get_c_nnz(); + if (c_nnz_size){ + entriesC = lno_nnz_view_t (Kokkos::ViewAllocateWithoutInitializing("entriesC"), c_nnz_size); + valuesC = scalar_view_t (Kokkos::ViewAllocateWithoutInitializing("valuesC"), c_nnz_size); + } + + KokkosSparse::Experimental::spgemm_jacobi(&kh, AnumRows, BnumRows, BnumCols, + Arowptr, Acolind, Avals, false, + Browptr, Bcolind, Bvals, false, + row_mapC, entriesC, valuesC, + omega, Dinv.getLocalViewDevice(Access::ReadOnly)); + kh.destroy_spgemm_handle(); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Newmatrix SYCLSort")))); +#endif + + // Sort & set values + if (params.is_null() || params->get("sort entries",true)) + Import_Util::sortCrsEntries(row_mapC, entriesC, valuesC); + C.setAllValues(row_mapC,entriesC,valuesC); + +#ifdef HAVE_TPETRA_MMM_TIMINGS + MM = Teuchos::null; MM = rcp(new TimeMonitor (*TimeMonitor::getNewTimer(prefix_mmm + std::string("Jacobi Newmatrix SYCLESFC")))); +#endif + + // Final Fillcomplete + Teuchos::RCP labelList = rcp(new Teuchos::ParameterList); + labelList->set("Timer Label",label); + if(!params.is_null()) labelList->set("compute global constants",params->get("compute global constants",true)); + Teuchos::RCP > dummyExport; + C.expertStaticFillComplete(Bview.origMatrix->getDomainMap(), Aview.origMatrix->getRangeMap(), Cimport,dummyExport,labelList); +} + + }//MMdetails +}//Tpetra + +#endif//SYCL + +#endif diff --git a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp index 37101e7a8a29..63048b9b5a2a 100644 --- a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp +++ b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp @@ -82,6 +82,7 @@ #include "TpetraExt_MatrixMatrix_OpenMP.hpp" #include "TpetraExt_MatrixMatrix_Cuda.hpp" #include "TpetraExt_MatrixMatrix_HIP.hpp" +#include "TpetraExt_MatrixMatrix_SYCL.hpp" namespace Tpetra { diff --git a/packages/tpetra/core/ext/TpetraExt_TripleMatrixMultiply_def.hpp b/packages/tpetra/core/ext/TpetraExt_TripleMatrixMultiply_def.hpp index 2a2c082d739f..5df1da47daed 100644 --- a/packages/tpetra/core/ext/TpetraExt_TripleMatrixMultiply_def.hpp +++ b/packages/tpetra/core/ext/TpetraExt_TripleMatrixMultiply_def.hpp @@ -74,6 +74,7 @@ #include "TpetraExt_MatrixMatrix_OpenMP.hpp" #include "TpetraExt_MatrixMatrix_Cuda.hpp" #include "TpetraExt_MatrixMatrix_HIP.hpp" +#include "TpetraExt_MatrixMatrix_SYCL.hpp" namespace Tpetra { diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 0451932d45d0..0c5e007a220d 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -2845,11 +2845,20 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( Import_Util, GetPids, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( Import_Util, GetTwoTransferOwnershipVector, LO, GO ) -#define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ +#define UNIT_TEST_GROUP_SC_LO_GO_COMMON( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, MueLuStyle, LO, GO, SC ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) + +// FIXME_SYCL requires quering free device memory +#ifdef HAVE_TPETRA_SYCL + #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ + UNIT_TEST_GROUP_SC_LO_GO_COMMON( SC, LO, GO ) +#else + #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ + UNIT_TEST_GROUP_SC_LO_GO_COMMON( SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, MueLuStyle, LO, GO, SC ) +#endif // Note: This test fails. Should fix later. // TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( ReverseImportExport, doImport, ORDINAL, SCALAR ) diff --git a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp index 0256eafe3f78..f28e19289b4c 100644 --- a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp @@ -2209,8 +2209,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMatAdd, locally_unsorted, SC, LO, GO }*/ -#define UNIT_TEST_GROUP_SC_LO_GO_NO( SC, LO, GO, NT ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, operations_test,SC, LO, GO, NT) \ +#define UNIT_TEST_GROUP_SC_LO_GO_NO_COMMON( SC, LO, GO, NT ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, range_row_test, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, ATI_range_row_test, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, threaded_add_sorted, SC, LO, GO, NT) \ @@ -2222,6 +2221,16 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMatAdd, locally_unsorted, SC, LO, GO TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_col_maps, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_index_base, SC, LO, GO, NT) +// FIXME_SYCL requires quering free device memory +#ifdef HAVE_TPETRA_SYCL + #define UNIT_TEST_GROUP_SC_LO_GO_NO( SC, LO, GO, NT ) \ + UNIT_TEST_GROUP_SC_LO_GO_NO_COMMON( SC, LO, GO, NT ) +#else + #define UNIT_TEST_GROUP_SC_LO_GO_NO( SC, LO, GO, NT ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, operations_test,SC, LO, GO, NT) \ + UNIT_TEST_GROUP_SC_LO_GO_NO_COMMON( SC, LO, GO, NT ) +#endif + TPETRA_ETI_MANGLING_TYPEDEFS() TPETRA_INSTANTIATE_SLGN_NO_ORDINAL_SCALAR( UNIT_TEST_GROUP_SC_LO_GO_NO ) From 76e1cd9ed50a94541b5c58074d49d35c7deefec6 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Wed, 9 Jun 2021 19:42:43 -0600 Subject: [PATCH 03/98] tpetra: move sort_crs_matrix out of Impl namespace Compatibility change for kokkos-kernels, see kokkos/kokkos-kernels#932 --- packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp b/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp index d3c87118e9f9..abf00b35c7ef 100644 --- a/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp +++ b/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp @@ -49,6 +49,7 @@ #include "Teuchos_ParameterList.hpp" #include "Teuchos_TimeMonitor.hpp" #include "KokkosKernels_SparseUtils.hpp" +#include "KokkosKernels_Sorting.hpp" namespace Tpetra { @@ -177,7 +178,7 @@ createTransposeLocal (const Teuchos::RCP& params) local_matrix_device_type lclMatrix = crsMatrix->getLocalMatrixDevice (); local_matrix_device_type lclTransposeMatrix = KokkosKernels::Impl::transpose_matrix(lclMatrix); if (sort) - KokkosKernels::Impl::sort_crs_matrix(lclTransposeMatrix); + KokkosKernels::sort_crs_matrix(lclTransposeMatrix); // Prebuild the importers and exporters the no-communication way, // flipping the importers and exporters around. From da10abee897c0b59d0c67c482e4f1c446cfbd7e9 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 8 Jul 2021 10:20:14 -0600 Subject: [PATCH 04/98] amesos2: move sort_crs_matrix out of Impl namespace Compatibility change for kokkos-kernels, see kokkos/kokkos-kernels#932 --- packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp b/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp index 84fe54e163bb..4cb885a92c98 100644 --- a/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp @@ -52,6 +52,7 @@ #define TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM #if defined(TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM) #include "KokkosKernels_SparseUtils.hpp" +#include "KokkosKernels_Sorting.hpp" #endif namespace Amesos2 { @@ -608,7 +609,7 @@ namespace Amesos2 { // sort if( ordering == SORTED_INDICES ) { using execution_space = typename KV_GS::execution_space; - KokkosKernels::Impl::sort_crs_matrix + KokkosKernels::sort_crs_matrix (rowptr, colind, nzval); } #endif From f8c911dc674536830c229830c8eff4cd6dc20a14 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Mon, 12 Jul 2021 14:52:37 -0600 Subject: [PATCH 05/98] zoltan2: modify "Vector" alias in Test_Sphynx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address errors of form: ../../packages/zoltan2/test/sphynx/Test_Sphynx.cpp:86:18: error: reference to ‘Vector’ is ambiguous typedef Vector::node_type Node; ^~~~~~ --- packages/zoltan2/test/sphynx/Test_Sphynx.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/zoltan2/test/sphynx/Test_Sphynx.cpp b/packages/zoltan2/test/sphynx/Test_Sphynx.cpp index 3b48e83096cc..81290f7abe59 100644 --- a/packages/zoltan2/test/sphynx/Test_Sphynx.cpp +++ b/packages/zoltan2/test/sphynx/Test_Sphynx.cpp @@ -82,12 +82,12 @@ typedef zscalar_t z2TestScalar; typedef Tpetra::CrsMatrix SparseMatrix; typedef Tpetra::CrsGraph SparseGraph; -typedef Tpetra::Vector Vector; -typedef Vector::node_type Node; +typedef Tpetra::Vector VectorT; +typedef VectorT::node_type Node; typedef Zoltan2::XpetraCrsMatrixAdapter SparseMatrixAdapter; typedef Zoltan2::XpetraCrsGraphAdapter SparseGraphAdapter; -typedef Zoltan2::XpetraMultiVectorAdapter MultiVectorAdapter; +typedef Zoltan2::XpetraMultiVectorAdapter MultiVectorAdapter; // Integer vector @@ -209,7 +209,7 @@ int main(int narg, char** arg) << "NumLocalRows (rank 0) = " << origMatrix->getNodeNumRows() << std::endl; ////// Create a vector to use with the matrix. - RCP origVector, origProd; + RCP origVector, origProd; origProd = Tpetra::createVector( origMatrix->getRangeMap()); origVector = Tpetra::createVector( @@ -393,12 +393,12 @@ int main(int narg, char** arg) } if (me == 0) std::cout << "Redistributing vectors..." << std::endl; - Vector *redistribVector; + VectorT *redistribVector; MultiVectorAdapter adapterVector(origVector); //, weights, weightStrides); adapterVector.applyPartitioningSolution(*origVector, redistribVector, problem.getSolution()); - RCP redistribProd; + RCP redistribProd; redistribProd = Tpetra::createVector( redistribMatrix->getRangeMap()); From f310e1236c1b3e846a0bcd62a5d3ae90ef52c26f Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Thu, 22 Jul 2021 16:08:35 -0400 Subject: [PATCH 06/98] Improve comments --- packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp | 3 +++ .../core/test/ImportExport2/ImportExport2_UnitTests.cpp | 4 +++- .../tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp index d29c8292ea62..8a76ac813b08 100644 --- a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp +++ b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_SYCL.hpp @@ -39,6 +39,9 @@ // ************************************************************************ // @HEADER + +// This is a verbatim copy of the other TpetraExt_MatrixMatrix_*.hpp files +// replacing the execution/memory space by the ones corresponding to SYCL. #ifndef TPETRA_MATRIXMATRIX_SYCL_DEF_HPP #define TPETRA_MATRIXMATRIX_SYCL_DEF_HPP diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 0c5e007a220d..decb2583f0ac 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -2845,12 +2845,14 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( Import_Util, GetPids, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( Import_Util, GetTwoTransferOwnershipVector, LO, GO ) +// These are the tests associated to UNIT_TEST_GROUP_SC_LO_GO that work for all backends. #define UNIT_TEST_GROUP_SC_LO_GO_COMMON( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) -// FIXME_SYCL requires quering free device memory +// FIXME_SYCL requires querying free device memory in KokkosKernels. +// The SYCL specifications don't allow asking for that. #ifdef HAVE_TPETRA_SYCL #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ UNIT_TEST_GROUP_SC_LO_GO_COMMON( SC, LO, GO ) diff --git a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp index f28e19289b4c..e0b5770eb83a 100644 --- a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp @@ -2209,6 +2209,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMatAdd, locally_unsorted, SC, LO, GO }*/ +// These are the tests associated to UNIT_TEST_GROUP_SC_LO_GO_NO that work for all backends. #define UNIT_TEST_GROUP_SC_LO_GO_NO_COMMON( SC, LO, GO, NT ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, range_row_test, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMat, ATI_range_row_test, SC, LO, GO, NT) \ @@ -2221,7 +2222,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMatAdd, locally_unsorted, SC, LO, GO TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_col_maps, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_index_base, SC, LO, GO, NT) -// FIXME_SYCL requires quering free device memory +// FIXME_SYCL requires querying free device memory in KokkosKernels. +// The SYCL specifications don't allow asking for that. #ifdef HAVE_TPETRA_SYCL #define UNIT_TEST_GROUP_SC_LO_GO_NO( SC, LO, GO, NT ) \ UNIT_TEST_GROUP_SC_LO_GO_NO_COMMON( SC, LO, GO, NT ) From 544eedaef44840b0079897a0ddafcbf4c854050b Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 22 Jul 2021 14:48:05 -0600 Subject: [PATCH 07/98] sacado, stokhos: replace KOKKOS_IMPL_CUDA_* macros with Cuda functions Change made for compatibiltility with kokkos/kokkos#4138 --- .../src/new_design/Sacado_Fad_Exp_Atomic.hpp | 28 ++++--------------- .../kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp | 6 ++-- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp b/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp index e1e0dc090887..25843e04f45c 100644 --- a/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp +++ b/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp @@ -122,12 +122,8 @@ namespace Sacado { return_type return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask() ; + unsigned int active = __ballot_sync(mask, 1); unsigned int done_active = 0; while (active != done_active) { if (!done) { @@ -140,11 +136,7 @@ namespace Sacado { done = 1; } } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - done_active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, done); -#else - done_active = KOKKOS_IMPL_CUDA_BALLOT(done); -#endif + done_active = __ballot_sync(mask, done); } return return_val; } @@ -218,12 +210,8 @@ namespace Sacado { return_type return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask() ; + unsigned int active = __ballot_sync(mask, 1); unsigned int done_active = 0; while (active != done_active) { if (!done) { @@ -236,11 +224,7 @@ namespace Sacado { done = 1; } } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - done_active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, done); -#else - done_active = KOKKOS_IMPL_CUDA_BALLOT(done); -#endif + done_active = __ballot_sync(mask, done); } return return_val; } diff --git a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp index 8dcb0e5c1d9c..e01a3d15320e 100644 --- a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp +++ b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp @@ -72,19 +72,19 @@ template KOKKOS_INLINE_FUNCTION Scalar shfl_down(const Scalar &val, const int& delta, const int& width, const int& mask){ - return KOKKOS_IMPL_CUDA_SHFL_DOWN_MASK(mask, val, delta, width); + return __shfl_down_sync(mask, val, delta, width); } template KOKKOS_INLINE_FUNCTION Scalar shfl_up(const Scalar &val, const int& delta, const int& width, const int& mask){ - return KOKKOS_IMPL_CUDA_SHFL_UP_MASK(mask, val, delta, width); + return __shfl_up_sync(mask, val, delta, width); } KOKKOS_INLINE_FUNCTION void sync_warp(const int& mask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(mask); + __syncwarp(mask); } } // namespace Stokhos From 3b4f1164fa086cfefd2fdd61aa0f2edde8820b93 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Thu, 22 Jul 2021 17:42:59 -0400 Subject: [PATCH 08/98] Mention KokkosKernel issue --- .../tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp | 3 ++- .../tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index decb2583f0ac..5a5b787b4b95 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -2851,7 +2851,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) -// FIXME_SYCL requires querying free device memory in KokkosKernels. +// FIXME_SYCL requires querying free device memory in KokkosKernels, see +// https://github.com/kokkos/kokkos-kernels/issues/1062. // The SYCL specifications don't allow asking for that. #ifdef HAVE_TPETRA_SYCL #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ diff --git a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp index e0b5770eb83a..63b13fd6a208 100644 --- a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp @@ -2222,7 +2222,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMatAdd, locally_unsorted, SC, LO, GO TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_col_maps, SC, LO, GO, NT) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_MatMatAdd, different_index_base, SC, LO, GO, NT) -// FIXME_SYCL requires querying free device memory in KokkosKernels. +// FIXME_SYCL requires querying free device memory in KokkosKernels, see +// https://github.com/kokkos/kokkos-kernels/issues/1062. // The SYCL specifications don't allow asking for that. #ifdef HAVE_TPETRA_SYCL #define UNIT_TEST_GROUP_SC_LO_GO_NO( SC, LO, GO, NT ) \ From 60e27ce1bc1e27717a8d156f86ec86ad391c4a2d Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Wed, 9 Jun 2021 19:42:43 -0600 Subject: [PATCH 09/98] tpetra: move sort_crs_matrix out of Impl namespace Compatibility change for kokkos-kernels, see kokkos/kokkos-kernels#932 --- packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp b/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp index d3c87118e9f9..abf00b35c7ef 100644 --- a/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp +++ b/packages/tpetra/core/src/Tpetra_RowMatrixTransposer_def.hpp @@ -49,6 +49,7 @@ #include "Teuchos_ParameterList.hpp" #include "Teuchos_TimeMonitor.hpp" #include "KokkosKernels_SparseUtils.hpp" +#include "KokkosKernels_Sorting.hpp" namespace Tpetra { @@ -177,7 +178,7 @@ createTransposeLocal (const Teuchos::RCP& params) local_matrix_device_type lclMatrix = crsMatrix->getLocalMatrixDevice (); local_matrix_device_type lclTransposeMatrix = KokkosKernels::Impl::transpose_matrix(lclMatrix); if (sort) - KokkosKernels::Impl::sort_crs_matrix(lclTransposeMatrix); + KokkosKernels::sort_crs_matrix(lclTransposeMatrix); // Prebuild the importers and exporters the no-communication way, // flipping the importers and exporters around. From c0e1471ba1c44b23ffe49cf5f66139659b1af363 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 8 Jul 2021 10:20:14 -0600 Subject: [PATCH 10/98] amesos2: move sort_crs_matrix out of Impl namespace Compatibility change for kokkos-kernels, see kokkos/kokkos-kernels#932 --- packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp b/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp index 84fe54e163bb..4cb885a92c98 100644 --- a/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_MatrixAdapter_def.hpp @@ -52,6 +52,7 @@ #define TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM #if defined(TESTING_AMESOS2_WITH_TPETRA_REMOVE_UVM) #include "KokkosKernels_SparseUtils.hpp" +#include "KokkosKernels_Sorting.hpp" #endif namespace Amesos2 { @@ -608,7 +609,7 @@ namespace Amesos2 { // sort if( ordering == SORTED_INDICES ) { using execution_space = typename KV_GS::execution_space; - KokkosKernels::Impl::sort_crs_matrix + KokkosKernels::sort_crs_matrix (rowptr, colind, nzval); } #endif From a891ab2828f486273fd27584de8c2d048f928778 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Mon, 12 Jul 2021 14:52:37 -0600 Subject: [PATCH 11/98] zoltan2: modify "Vector" alias in Test_Sphynx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address errors of form: ../../packages/zoltan2/test/sphynx/Test_Sphynx.cpp:86:18: error: reference to ‘Vector’ is ambiguous typedef Vector::node_type Node; ^~~~~~ --- packages/zoltan2/test/sphynx/Test_Sphynx.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/zoltan2/test/sphynx/Test_Sphynx.cpp b/packages/zoltan2/test/sphynx/Test_Sphynx.cpp index 3b48e83096cc..81290f7abe59 100644 --- a/packages/zoltan2/test/sphynx/Test_Sphynx.cpp +++ b/packages/zoltan2/test/sphynx/Test_Sphynx.cpp @@ -82,12 +82,12 @@ typedef zscalar_t z2TestScalar; typedef Tpetra::CrsMatrix SparseMatrix; typedef Tpetra::CrsGraph SparseGraph; -typedef Tpetra::Vector Vector; -typedef Vector::node_type Node; +typedef Tpetra::Vector VectorT; +typedef VectorT::node_type Node; typedef Zoltan2::XpetraCrsMatrixAdapter SparseMatrixAdapter; typedef Zoltan2::XpetraCrsGraphAdapter SparseGraphAdapter; -typedef Zoltan2::XpetraMultiVectorAdapter MultiVectorAdapter; +typedef Zoltan2::XpetraMultiVectorAdapter MultiVectorAdapter; // Integer vector @@ -209,7 +209,7 @@ int main(int narg, char** arg) << "NumLocalRows (rank 0) = " << origMatrix->getNodeNumRows() << std::endl; ////// Create a vector to use with the matrix. - RCP origVector, origProd; + RCP origVector, origProd; origProd = Tpetra::createVector( origMatrix->getRangeMap()); origVector = Tpetra::createVector( @@ -393,12 +393,12 @@ int main(int narg, char** arg) } if (me == 0) std::cout << "Redistributing vectors..." << std::endl; - Vector *redistribVector; + VectorT *redistribVector; MultiVectorAdapter adapterVector(origVector); //, weights, weightStrides); adapterVector.applyPartitioningSolution(*origVector, redistribVector, problem.getSolution()); - RCP redistribProd; + RCP redistribProd; redistribProd = Tpetra::createVector( redistribMatrix->getRangeMap()); From f86c91a8bf1257941f9793deb6454dc4cff1a27c Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 22 Jul 2021 14:48:05 -0600 Subject: [PATCH 12/98] sacado, stokhos: replace KOKKOS_IMPL_CUDA_* macros with Cuda functions Change made for compatibiltility with kokkos/kokkos#4138 --- .../src/new_design/Sacado_Fad_Exp_Atomic.hpp | 28 ++++--------------- .../kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp | 6 ++-- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp b/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp index e1e0dc090887..25843e04f45c 100644 --- a/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp +++ b/packages/sacado/src/new_design/Sacado_Fad_Exp_Atomic.hpp @@ -122,12 +122,8 @@ namespace Sacado { return_type return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask() ; + unsigned int active = __ballot_sync(mask, 1); unsigned int done_active = 0; while (active != done_active) { if (!done) { @@ -140,11 +136,7 @@ namespace Sacado { done = 1; } } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - done_active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, done); -#else - done_active = KOKKOS_IMPL_CUDA_BALLOT(done); -#endif + done_active = __ballot_sync(mask, done); } return return_val; } @@ -218,12 +210,8 @@ namespace Sacado { return_type return_val; // This is a way to (hopefully) avoid dead lock in a warp int done = 0; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - unsigned int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask() ; + unsigned int active = __ballot_sync(mask, 1); unsigned int done_active = 0; while (active != done_active) { if (!done) { @@ -236,11 +224,7 @@ namespace Sacado { done = 1; } } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - done_active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, done); -#else - done_active = KOKKOS_IMPL_CUDA_BALLOT(done); -#endif + done_active = __ballot_sync(mask, done); } return return_val; } diff --git a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp index 8dcb0e5c1d9c..e01a3d15320e 100644 --- a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp +++ b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp @@ -72,19 +72,19 @@ template KOKKOS_INLINE_FUNCTION Scalar shfl_down(const Scalar &val, const int& delta, const int& width, const int& mask){ - return KOKKOS_IMPL_CUDA_SHFL_DOWN_MASK(mask, val, delta, width); + return __shfl_down_sync(mask, val, delta, width); } template KOKKOS_INLINE_FUNCTION Scalar shfl_up(const Scalar &val, const int& delta, const int& width, const int& mask){ - return KOKKOS_IMPL_CUDA_SHFL_UP_MASK(mask, val, delta, width); + return __shfl_up_sync(mask, val, delta, width); } KOKKOS_INLINE_FUNCTION void sync_warp(const int& mask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(mask); + __syncwarp(mask); } } // namespace Stokhos From d72eb85100a6d8fc9eeed43607d2eb39a7d78489 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 30 Sep 2021 20:51:58 -0600 Subject: [PATCH 13/98] atdm/contributed/weaver: update modules --- cmake/std/atdm/contributed/weaver/environment.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/std/atdm/contributed/weaver/environment.sh b/cmake/std/atdm/contributed/weaver/environment.sh index 897711ef1e62..388abfb4c58f 100755 --- a/cmake/std/atdm/contributed/weaver/environment.sh +++ b/cmake/std/atdm/contributed/weaver/environment.sh @@ -177,7 +177,7 @@ elif [[ "$ATDM_CONFIG_COMPILER" == "CUDA"* ]] ; then fi # Ninja -module load ninja/1.7.2 +#module load ninja/1.7.2 # CMake #module swap cmake/3.6.2 cmake/3.12.3 From e6aee98a85cb88637a16e07d1e9698eb9e9ef0a0 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 30 Sep 2021 21:05:28 -0600 Subject: [PATCH 14/98] intrepid2: workaround intel internal compiler error in Intrepid2_Data --- packages/intrepid2/src/Shared/Intrepid2_Data.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/intrepid2/src/Shared/Intrepid2_Data.hpp b/packages/intrepid2/src/Shared/Intrepid2_Data.hpp index a33cf77e6f0a..f2e04b3dd66a 100644 --- a/packages/intrepid2/src/Shared/Intrepid2_Data.hpp +++ b/packages/intrepid2/src/Shared/Intrepid2_Data.hpp @@ -1655,6 +1655,21 @@ class ZeroView { //! Copies 0.0 to the underlying View. void clear() const { +#ifdef KOKKOS_COMPILER_INTEL +// Workaround intel internal compiler errors + DataScalar zero = DataScalar(0); + switch (dataRank_) + { + case 1: {Kokkos::parallel_for(Kokkos::RangePolicy(0, data1_.extent(0)), KOKKOS_LAMBDA(int i) {data1_(i) = zero;}); break; } + case 2: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0},{data2_.extent(0),data2_.extent(1)}), KOKKOS_LAMBDA(int i0, int i1) {data2_(i0, i1) = zero;}); break; } + case 3: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0,0},{data3_.extent(0),data3_.extent(1),data3_.extent(2)}), KOKKOS_LAMBDA(int i0, int i1, int i2) {data3_(i0, i1, i2) = zero;}); break; } + case 4: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0,0,0},{data4_.extent(0),data4_.extent(1),data4_.extent(2),data4_.extent(3)}), KOKKOS_LAMBDA(int i0, int i1, int i2, int i3) {data4_(i0, i1, i2, i3) = zero;}); break; } + case 5: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0,0,0,0},{data5_.extent(0),data5_.extent(1),data5_.extent(2),data5_.extent(3),data5_.extent(4)}), KOKKOS_LAMBDA(int i0, int i1, int i2, int i3, int i4) {data5_(i0, i1, i2, i3, i4) = zero;}); break; } + case 6: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0,0,0,0,0},{data6_.extent(0),data6_.extent(1),data6_.extent(2),data6_.extent(3),data6_.extent(4),data6_.extent(5)}), KOKKOS_LAMBDA(int i0, int i1, int i2, int i3, int i4, int i5) {data6_(i0, i1, i2, i3, i4, i5) = zero;}); break; } + case 7: {Kokkos::parallel_for(Kokkos::MDRangePolicy, execution_space>({0,0,0,0,0,0},{data7_.extent(0),data7_.extent(1),data7_.extent(2),data7_.extent(3),data7_.extent(4),data7_.extent(5)}), KOKKOS_LAMBDA(int i0, int i1, int i2, int i3, int i4, int i5 ) {for (int i6 = 0; i6 < data7_.extent(6); ++i6) data7_(i0, i1, i2, i3, i4, i5, i6) = zero;}); break; } + default: INTREPID2_TEST_FOR_EXCEPTION(true, std::invalid_argument, "Invalid data rank"); + } +#else switch (dataRank_) { case 1: Kokkos::deep_copy(data1_, 0.0); break; @@ -1666,6 +1681,7 @@ class ZeroView { case 7: Kokkos::deep_copy(data7_, 0.0); break; default: INTREPID2_TEST_FOR_EXCEPTION(true, std::invalid_argument, "Invalid data rank"); } +#endif } //! Copies from the provided DynRankView into the underlying Kokkos::View container storing the unique data. From b539d1a3200034d8eaa1dcdb83436d7fa92fd340 Mon Sep 17 00:00:00 2001 From: Roger Pawlowski Date: Wed, 6 Oct 2021 12:40:18 -0600 Subject: [PATCH 15/98] Panzer: fix 1D line mesh issue on cuda --- packages/panzer/disc-fe/src/Panzer_IntegrationValues2.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/panzer/disc-fe/src/Panzer_IntegrationValues2.cpp b/packages/panzer/disc-fe/src/Panzer_IntegrationValues2.cpp index cbe5c45a2d3d..77e14cb368bd 100644 --- a/packages/panzer/disc-fe/src/Panzer_IntegrationValues2.cpp +++ b/packages/panzer/disc-fe/src/Panzer_IntegrationValues2.cpp @@ -1717,6 +1717,7 @@ getCubaturePointsRef(const bool cache, Kokkos::parallel_for("copy values",policy,KOKKOS_LAMBDA (const int cell,const int point, const int dim) { aux(cell,point_offset + point,dim) = side_cub_points(point,dim); }); + PHX::Device::execution_space().fence(); } } else { From 54a5a70f77e091a0a93e28230725d17b94942d61 Mon Sep 17 00:00:00 2001 From: Julia Plews Date: Tue, 12 Oct 2021 15:38:56 -0600 Subject: [PATCH 16/98] MiniTensor: fix or at least work around some __host__ __device__ marking problems on CUDA build. Use std:: instead of boost:: in some places? --- .../minitensor/src/MiniTensor_LinearAlgebra.h | 135 +++------ .../src/MiniTensor_LinearAlgebra.i.h | 109 ++++--- .../src/MiniTensor_LinearAlgebra.t.h | 267 +++++++----------- .../minitensor/src/MiniTensor_Mechanics.t.h | 2 +- .../minitensor/src/MiniTensor_Solvers.t.h | 4 +- packages/minitensor/src/MiniTensor_Storage.h | 114 +++----- packages/minitensor/src/MiniTensor_Tensor.i.h | 16 +- .../minitensor/src/MiniTensor_TensorBase.i.h | 7 +- .../minitensor/src/MiniTensor_Utilities.h | 15 +- .../minitensor/src/MiniTensor_Utilities.i.h | 18 +- packages/minitensor/src/MiniTensor_Vector.h | 1 - packages/minitensor/src/MiniTensor_Vector.i.h | 16 +- packages/minitensor/test/test_01.cc | 22 +- 13 files changed, 278 insertions(+), 448 deletions(-) diff --git a/packages/minitensor/src/MiniTensor_LinearAlgebra.h b/packages/minitensor/src/MiniTensor_LinearAlgebra.h index cf373bfd617c..c702a66486df 100644 --- a/packages/minitensor/src/MiniTensor_LinearAlgebra.h +++ b/packages/minitensor/src/MiniTensor_LinearAlgebra.h @@ -183,10 +183,7 @@ I3(Tensor const & A); /// Exponential map. /// \return \f$ \exp A \f$ /// -template -KOKKOS_INLINE_FUNCTION -Tensor -exp(Tensor const & A); +template Tensor exp(Tensor const &A); /// /// Exponential map by Taylor series, radius of convergence is infinity @@ -202,10 +199,7 @@ exp_taylor(Tensor const & A); /// See algorithm 10.20 in Functions of Matrices, N.J. Higham, SIAM, 2008. /// \return \f$ \exp A \f$ /// -template -KOKKOS_INLINE_FUNCTION -Tensor -exp_pade(Tensor const & A); +template Tensor exp_pade(Tensor const &A); /// /// Logarithmic map. @@ -338,20 +332,16 @@ norm_off_diagonal(Tensor const & A); /// that rely on Jacobi-type procedures. /// \return \f$ (p,q) = arg max_{i,j} |a_{ij}| \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair -arg_max_abs(Tensor const & A); +template +std::pair arg_max_abs(Tensor const &A); /// /// Arg max off-diagonal. Useful for SVD and other algorithms /// that rely on Jacobi-type procedures. /// \return \f$ (p,q) = arg max_{i \neq j} |a_{ij}| \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair -arg_max_off_diagonal(Tensor const & A); +template +std::pair arg_max_off_diagonal(Tensor const &A); /// /// Sort and index. Useful for ordering singular values @@ -360,18 +350,15 @@ arg_max_off_diagonal(Tensor const & A); /// \param u vector to sort /// \return v P sorted vector, permutation matrix such that v = P^T u /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -sort_permutation(Vector const & u); +template +std::pair, Tensor> sort_permutation(Vector const &u); /// /// Singular value decomposition (SVD) /// \return \f$ A = USV^T\f$ /// -template -boost::tuple, Tensor, Tensor> -svd(Tensor const & A); +template +std::tuple, Tensor, Tensor> svd(Tensor const &A); /// /// Project to O(N) (Orthogonal Group) using a Newton-type algorithm. @@ -392,62 +379,54 @@ polar_rotation(Tensor const & A); /// \param A tensor (often a deformation-gradient-like tensor) /// \return \f$ VR = A \f$ with \f$ R \in SO(N) \f$ and \f$ V \in SPD(N) \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_left(Tensor const & A); +template +std::pair, Tensor> polar_left(Tensor const &A); /// /// Right polar decomposition /// \param A tensor (often a deformation-gradient-like tensor) /// \return \f$ RU = A \f$ with \f$ R \in SO(N) \f$ and \f$ U \in SPD(N) \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_right(Tensor const & A); +template +std::pair, Tensor> polar_right(Tensor const &A); /// /// Left polar decomposition computed with eigenvalue decomposition /// \param A tensor (often a deformation-gradient-like tensor) /// \return \f$ VR = A \f$ with \f$ R \in SO(N) \f$ and \f$ V \in SPD(N) \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_left_eig(Tensor const & A); +template +std::pair, Tensor> polar_left_eig(Tensor const &A); /// /// R^3 right polar decomposition /// \param A tensor (often a deformation-gradient-like tensor) /// \return \f$ RU = F \f$ with \f$ R \in SO(N) \f$ and \f$ U \in SPD(N) \f$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_right_eig(Tensor const & A); +template +std::pair, Tensor> polar_right_eig(Tensor const &A); /// /// Left polar decomposition with matrix logarithm for V /// \param F tensor (often a deformation-gradient-like tensor) /// \return \f$ VR = F \f$ with \f$ R \in SO(N) \f$ and V SPD, and log V /// -template -boost::tuple, Tensor, Tensor> -polar_left_logV(Tensor const & F); +template +std::tuple, Tensor, Tensor> +polar_left_logV(Tensor const &F); -template -boost::tuple, Tensor, Tensor> -polar_left_logV_eig(Tensor const & F); +template +std::tuple, Tensor, Tensor> +polar_left_logV_eig(Tensor const &F); /// /// Left polar decomposition with matrix logarithm for V using eig_spd_cos /// \param F tensor (often a deformation-gradient-like tensor) /// \return \f$ VR = F \f$ with \f$ R \in SO(N) \f$ and V SPD, and log V /// -template -boost::tuple, Tensor, Tensor> -polar_left_logV_lame(Tensor const & F); +template +std::tuple, Tensor, Tensor> +polar_left_logV_lame(Tensor const &F); /// /// Logarithmic map using BCH expansion (4 terms) @@ -465,37 +444,28 @@ bch(Tensor const & v, Tensor const & r); /// \param \f$ A = [f, g; g, h] \in S(2) \f$ /// \return \f$ c, s \rightarrow [c, -s; s, c]\f$ diagonalizes A$ /// -template -KOKKOS_INLINE_FUNCTION -std::pair -schur_sym(const T f, const T g, const T h); +template +std::pair schur_sym(const T f, const T g, const T h); /// /// Givens rotation. [c, -s; s, c] [a; b] = [r; 0] /// \return c and s /// -template -KOKKOS_INLINE_FUNCTION -std::pair -givens(T const & a, T const & b); +template std::pair givens(T const &a, T const &b); /// /// Eigenvalue decomposition for symmetric 2nd-order tensor /// \return V eigenvectors, D eigenvalues in diagonal Matlab-style /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_sym(Tensor const & A); +template +std::pair, Tensor> eig_sym(Tensor const &A); /// /// Eigenvalue decomposition for SPD 2nd-order tensor /// \return V eigenvectors, D eigenvalues in diagonal Matlab-style /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_spd(Tensor const & A); +template +std::pair, Tensor> eig_spd(Tensor const &A); /// /// Eigenvalue decomposition for SPD 2nd-order tensor @@ -503,10 +473,8 @@ eig_spd(Tensor const & A); /// This algorithm comes from the journal article /// Scherzinger and Dohrmann, CMAME 197 (2008) 4007-4015 /// -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_spd_cos(Tensor const & A); +template +std::pair, Tensor> eig_spd_cos(Tensor const &A); /// /// Cholesky decomposition, rank-1 update algorithm @@ -515,10 +483,8 @@ eig_spd_cos(Tensor const & A); /// \return G Cholesky factor A = GG^T and completed (bool) /// algorithm ran to completion /// -template -KOKKOS_INLINE_FUNCTION -std::pair, bool > -cholesky(Tensor const & A); +template +std::pair, bool> cholesky(Tensor const &A); /// /// Preconditioner types @@ -535,10 +501,9 @@ enum class PreconditionerType /// Compute a preconditioner for improving the conditioning of a /// linear system. /// -template -KOKKOS_INLINE_FUNCTION -std::pair, RHS> -precon(PreconditionerType const pt, Tensor const & A, RHS const & B); +template +std::pair, RHS> precon(PreconditionerType const pt, + Tensor const &A, RHS const &B); /// /// Solve linear system of equations. @@ -551,11 +516,9 @@ precon(PreconditionerType const pt, Tensor const & A, RHS const & B); /// \param b rhs of the system Ax=b /// \return x solution(s) to the system Ax=b /// -template -KOKKOS_INLINE_FUNCTION -RHS -solve(Tensor const & A, RHS const & b, - PreconditionerType const pt = PreconditionerType::IDENTITY); +template +RHS solve(Tensor const &A, RHS const &b, + PreconditionerType const pt = PreconditionerType::IDENTITY); template KOKKOS_INLINE_FUNCTION @@ -565,18 +528,12 @@ solve_full_pivot(Tensor const & A, RHS const & b); /// /// Condition number: ratio of largest to smalest singular values. /// -template -KOKKOS_INLINE_FUNCTION -T -cond(Tensor const & A); +template T cond(Tensor const &A); /// /// Reciprocal condition number: ratio of smallest to largest singular values. /// -template -KOKKOS_INLINE_FUNCTION -T -inv_cond(Tensor const & A); +template T inv_cond(Tensor const &A); } // namespace minitensor diff --git a/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h b/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h index 91e6123822dd..92e4aa540653 100644 --- a/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h +++ b/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h @@ -96,6 +96,8 @@ KOKKOS_INLINE_FUNCTION T norm_1(Tensor const & A) { + using KAT = Kokkos::ArithTraits; + Index const dimension = A.get_dimension(); @@ -107,40 +109,39 @@ norm_1(Tensor const & A) switch (dimension) { - default: + default: - for (Index i = 0; i < dimension; ++i) { - T t = 0.0; - for (Index j = 0; j < dimension; ++j) { - t += std::abs(A(j, i)); - } - v(i) = t; + for (Index i = 0; i < dimension; ++i) { + T t = 0.0; + for (Index j = 0; j < dimension; ++j) { + t += KAT::abs(A(j, i)); } + v(i) = t; + } - for (Index i = 0; i < dimension; ++i) { - s = std::max(s, v(i)); - } - break; - - case 3: - v(0) = std::abs(A(0,0)) + std::abs(A(1,0)) + std::abs(A(2,0)); - v(1) = std::abs(A(0,1)) + std::abs(A(1,1)) + std::abs(A(2,1)); - v(2) = std::abs(A(0,2)) + std::abs(A(1,2)) + std::abs(A(2,2)); + for (Index i = 0; i < dimension; ++i) { + s = max(s, v(i)); + } + break; - s = std::max(std::max(v(0),v(1)),v(2)); - break; + case 3: + v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(1, 0)) + KAT::abs(A(2, 0)); + v(1) = KAT::abs(A(0, 1)) + KAT::abs(A(1, 1)) + KAT::abs(A(2, 1)); + v(2) = KAT::abs(A(0, 2)) + KAT::abs(A(1, 2)) + KAT::abs(A(2, 2)); - case 2: - v(0) = std::abs(A(0,0)) + std::abs(A(1,0)); - v(1) = std::abs(A(0,1)) + std::abs(A(1,1)); + s = max(max(v(0), v(1)), v(2)); + break; - s = std::max(v(0),v(1)); - break; + case 2: + v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(1, 0)); + v(1) = KAT::abs(A(0, 1)) + KAT::abs(A(1, 1)); - case 1: - s = std::abs(A(0,0)); - break; + s = max(v(0), v(1)); + break; + case 1: + s = KAT::abs(A(0, 0)); + break; } return s; @@ -155,6 +156,8 @@ KOKKOS_INLINE_FUNCTION T norm_infinity(Tensor const & A) { + using KAT = Kokkos::ArithTraits; + Index const dimension = A.get_dimension(); @@ -169,33 +172,33 @@ norm_infinity(Tensor const & A) for (Index i = 0; i < dimension; ++i) { T t = 0.0; for (Index j = 0; j < dimension; ++j) { - t += std::abs(A(i, j)); + t += KAT::abs(A(i, j)); } v(i) = t; } for (Index i = 0; i < dimension; ++i) { - s = std::max(s, v(i)); + s = max(s, v(i)); } break; case 3: - v(0) = std::abs(A(0,0)) + std::abs(A(0,1)) + std::abs(A(0,2)); - v(1) = std::abs(A(1,0)) + std::abs(A(1,1)) + std::abs(A(1,2)); - v(2) = std::abs(A(2,0)) + std::abs(A(2,1)) + std::abs(A(2,2)); + v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(0, 1)) + KAT::abs(A(0, 2)); + v(1) = KAT::abs(A(1, 0)) + KAT::abs(A(1, 1)) + KAT::abs(A(1, 2)); + v(2) = KAT::abs(A(2, 0)) + KAT::abs(A(2, 1)) + KAT::abs(A(2, 2)); - s = std::max(std::max(v(0),v(1)),v(2)); + s = max(max(v(0), v(1)), v(2)); break; case 2: - v(0) = std::abs(A(0,0)) + std::abs(A(0,1)); - v(1) = std::abs(A(1,0)) + std::abs(A(1,1)); + v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(0, 1)); + v(1) = KAT::abs(A(1, 0)) + KAT::abs(A(1, 1)); - s = std::max(v(0),v(1)); + s = max(v(0), v(1)); break; case 1: - s = std::abs(A(0,0)); + s = KAT::abs(A(0, 0)); break; } @@ -375,10 +378,11 @@ I2(Tensor const & A) default: #ifdef KOKKOS_ENABLE_CUDA Kokkos::abort("I2 for N > 3 not implemented."); + return T(); #else std::cerr << "I2 for N > 3 not implemented." << std::endl; -#endif exit(1); +#endif break; case 3: @@ -420,10 +424,11 @@ I3(Tensor const & A) default: #ifdef KOKKOS_ENABLE_CUDA Kokkos::abort("I3 for N > 3 not implemented."); -#else + return T(); +#else std::cerr << "I3 for N > 3 not implemented." << std::endl; -#endif exit(1); +#endif break; case 3: @@ -446,16 +451,11 @@ I3(Tensor const & A) // // Condition number. // -template -KOKKOS_INLINE_FUNCTION -T -cond(Tensor const & A) -{ +template T cond(Tensor const &A) { Index const dimension = A.get_dimension(); - Tensor const - S = boost::get<1>(svd(A)); + Tensor const S = std::get<1>(svd(A)); T const k = S(0, 0) / S(dimension - 1, dimension - 1); @@ -466,16 +466,11 @@ cond(Tensor const & A) // // Reciprocal condition number. // -template -KOKKOS_INLINE_FUNCTION -T -inv_cond(Tensor const & A) -{ +template T inv_cond(Tensor const &A) { Index const dimension = A.get_dimension(); - Tensor const - S = boost::get<1>(svd(A)); + Tensor const S = std::get<1>(svd(A)); T const k = S(dimension - 1, dimension - 1) / S(0, 0); @@ -487,11 +482,8 @@ inv_cond(Tensor const & A) // Sort and index in descending order. Useful for ordering singular values // and eigenvalues and corresponding vectors in the respective decompositions. // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -sort_permutation(Vector const & u) -{ +template +std::pair, Tensor> sort_permutation(Vector const &u) { Index const dimension = u.get_dimension(); @@ -517,7 +509,6 @@ sort_permutation(Vector const & u) } return std::make_pair(v, P); - } } // namespace minitensor diff --git a/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h b/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h index 85d14a5e164d..bb6674069e1f 100644 --- a/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h +++ b/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h @@ -39,6 +39,7 @@ // ************************************************************************ // @HEADER +#include "Kokkos_ArithTraits.hpp" #if !defined(MiniTensor_LinearAlgebra_t_h) #define MiniTensor_LinearAlgebra_t_h @@ -289,11 +290,7 @@ subtensor(Tensor const & A, Index const i, Index const j) // // Exponential map // -template -KOKKOS_INLINE_FUNCTION -Tensor -exp(Tensor const & A) -{ +template Tensor exp(Tensor const &A) { return exp_pade(A); } @@ -438,11 +435,9 @@ polynomial_coefficient(Index const order, Index const index) // // Padé approximant polynomial odd and even terms. // -template -KOKKOS_INLINE_FUNCTION +template std::pair, Tensor> -pade_polynomial_terms(Tensor const & A, Index const order) -{ +pade_polynomial_terms(Tensor const &A, Index const order) { Index const dimension = A.get_dimension(); @@ -549,11 +544,7 @@ binary_powering(Tensor const & A, Index const exponent) // \param A tensor // \return \f$ \exp A \f$ // -template -KOKKOS_INLINE_FUNCTION -Tensor -exp_pade(Tensor const & A) -{ +template Tensor exp_pade(Tensor const &A) { Index const dimension = A.get_dimension(); @@ -588,7 +579,7 @@ exp_pade(Tensor const & A) Tensor V; - boost::tie(U, V) = pade_polynomial_terms(A, order); + std::tie(U, V) = pade_polynomial_terms(A, order); B = inverse(V - U) * (U + V); @@ -810,7 +801,7 @@ log_eig_sym(Tensor const & A) Tensor D(dimension); - boost::tie(V, D) = eig_sym(A); + std::tie(V, D) = eig_sym(A); for (Index i = 0; i < dimension; ++i) { D(i, i) = std::log(D(i, i)); @@ -1159,11 +1150,8 @@ norm_off_diagonal(Tensor const & A) // \param A // \return \f$ (p,q) = arg max_{i,j} |a_{ij}| \f$ // -template -//KOKKOS_INLINE_FUNCTION -std::pair -arg_max_abs(Tensor const & A) -{ +template +std::pair arg_max_abs(Tensor const &A) { Index p = 0; Index q = 0; @@ -1193,11 +1181,8 @@ arg_max_abs(Tensor const & A) // \param A // \return \f$ (p,q) = arg max_{i \neq j} |a_{ij}| \f$ // -template -KOKKOS_INLINE_FUNCTION -std::pair -arg_max_off_diagonal(Tensor const & A) -{ +template +std::pair arg_max_off_diagonal(Tensor const &A) { Index p = 0; Index q = 1; @@ -1229,10 +1214,9 @@ namespace { // \param f, g, h where A = [f, g; 0, h] // \return \f$ A = USV^T\f$ // -template -boost::tuple, Tensor, Tensor> -svd_bidiagonal(T f, T g, T h) -{ +template +std::tuple, Tensor, Tensor> svd_bidiagonal(T f, T g, + T h) { T fa = std::abs(f); T ga = std::abs(g); T ha = std::abs(h); @@ -1312,7 +1296,7 @@ svd_bidiagonal(T f, T g, T h) Tensor S(s0, 0.0, 0.0, s1); Tensor V(cv, -sv, sv, cv); - return boost::make_tuple(U, S, V); + return std::make_tuple(U, S, V); } // @@ -1320,16 +1304,15 @@ svd_bidiagonal(T f, T g, T h) // \param A tensor // \return \f$ A = USV^T\f$ // -template -boost::tuple, Tensor, Tensor> -svd_2x2(Tensor const & A) -{ +template +std::tuple, Tensor, Tensor> +svd_2x2(Tensor const &A) { assert(A.get_dimension() == 2); // First compute a givens rotation to eliminate 1,0 entry in tensor T c = 1.0; T s = 0.0; - boost::tie(c, s) = givens(A(0,0), A(1,0)); + std::tie(c, s) = givens(A(0, 0), A(1, 0)); Tensor R(c, -s, s, c); @@ -1341,13 +1324,13 @@ svd_2x2(Tensor const & A) Tensor X(2), S(2), V(2); - boost::tie(X, S, V) = svd_bidiagonal(B(0,0), B(0,1), B(1,1)); + std::tie(X, S, V) = svd_bidiagonal(B(0, 0), B(0, 1), B(1, 1)); // Complete general 2x2 SVD with givens rotation calculated above Tensor U = transpose(R) * X; - return boost::make_tuple(U, S, V); + return std::make_tuple(U, S, V); } // @@ -1355,10 +1338,9 @@ svd_2x2(Tensor const & A) // \param A tensor // \return \f$ A = USV^T\f$ // -template -boost::tuple, Tensor, Tensor> -svd_NxN(Tensor const & A) -{ +template +std::tuple, Tensor, Tensor> +svd_NxN(Tensor const &A) { // Scale first T const norm_a = norm(A); @@ -1399,7 +1381,7 @@ svd_NxN(Tensor const & A) Index q = 0; - boost::tie(p,q) = arg_max_off_diagonal(S); + std::tie(p, q) = arg_max_off_diagonal(S); if (p > q) { std::swap(p, q); @@ -1412,7 +1394,7 @@ svd_NxN(Tensor const & A) Tensor L(2), D(2), R(2); - boost::tie(L, D, R) = svd_2x2(Spq); + std::tie(L, D, R) = svd_2x2(Spq); T const & cl = L(0,0); @@ -1456,12 +1438,12 @@ svd_NxN(Tensor const & A) Vector s(dimension); Tensor P(dimension); - boost::tie(s, P) = sort_permutation(diag(S)); + std::tie(s, P) = sort_permutation(diag(S)); S = scale * diag(s); U = U * P; V = V * P; - return boost::make_tuple(U, diag(diag(S)), transpose(V)); + return std::make_tuple(U, diag(diag(S)), transpose(V)); } } // anonymous namespace @@ -1471,10 +1453,9 @@ svd_NxN(Tensor const & A) // \param A tensor // \return \f$ A = USV^T\f$ // -template -boost::tuple, Tensor, Tensor> -svd(Tensor const & A) -{ +template +std::tuple, Tensor, Tensor> +svd(Tensor const &A) { Index const dimension = A.get_dimension(); @@ -1484,16 +1465,16 @@ svd(Tensor const & A) switch (dimension) { default: - boost::tie(U, S, V) = svd_NxN(A); + std::tie(U, S, V) = svd_NxN(A); break; case 2: - boost::tie(U, S, V) = svd_2x2(A); + std::tie(U, S, V) = svd_2x2(A); break; } - return boost::make_tuple(U, S, V); + return std::make_tuple(U, S, V); } // @@ -1519,8 +1500,8 @@ polar_rotation(Tensor const & A) T const tol_scale = 0.01; - T const - tol_conv = std::sqrt(dimension) * machine_epsilon(); + T const tol_conv = + Kokkos::ArithTraits::sqrt(dimension) * machine_epsilon(); Tensor X = A; @@ -1588,11 +1569,8 @@ polar_rotation(Tensor const & A) // \param A tensor (often a deformation-gradient-like tensor) // \return \f$ VR = A \f$ with \f$ R \in SO(N) \f$ and \f$ V \in SPD(N) \f$ // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_left(Tensor const & A) -{ +template +std::pair, Tensor> polar_left(Tensor const &A) { Tensor R = polar_rotation(A); @@ -1607,11 +1585,8 @@ polar_left(Tensor const & A) // \param A tensor (often a deformation-gradient-like tensor) // \return \f$ RU = A \f$ with \f$ R \in SO(N) \f$ and \f$ U \in SPD(N) \f$ // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_right(Tensor const & A) -{ +template +std::pair, Tensor> polar_right(Tensor const &A) { Tensor R = polar_rotation(A); @@ -1626,11 +1601,8 @@ polar_right(Tensor const & A) // \param F tensor (often a deformation-gradient-like tensor) // \return \f$ VR = F \f$ with \f$ R \in SO(3) \f$ and V SPD(3) // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_left_eig(Tensor const & F) -{ +template +std::pair, Tensor> polar_left_eig(Tensor const &F) { assert(F.get_dimension() == 3); // set up return tensors @@ -1654,7 +1626,7 @@ polar_left_eig(Tensor const & F) Tensor eVec(3); - boost::tie(eVec, eVal) = eig_spd(b); + std::tie(eVec, eVal) = eig_spd(b); // compute sqrt() and inv(sqrt()) of eigenvalues Tensor @@ -1683,11 +1655,8 @@ polar_left_eig(Tensor const & F) // \param F tensor (often a deformation-gradient-like tensor) // \return \f$ RU = F \f$ with \f$ R \in SO(3) \f$ and U SPD(3) // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -polar_right_eig(Tensor const & F) -{ +template +std::pair, Tensor> polar_right_eig(Tensor const &F) { Index const dimension = F.get_dimension(); @@ -1714,7 +1683,7 @@ polar_right_eig(Tensor const & F) Tensor eVec(dimension); - boost::tie(eVec, eVal) = eig_spd(C); + std::tie(eVec, eVal) = eig_spd(C); // compute sqrt() and inv(sqrt()) of eigenvalues Tensor @@ -1744,17 +1713,16 @@ polar_right_eig(Tensor const & F) // \param F tensor (often a deformation-gradient-like tensor) // \return \f$ VR = F \f$ with \f$ R \in SO(N) \f$ and V SPD(N), and log V // -template -boost::tuple, Tensor, Tensor> -polar_left_logV(Tensor const & F) -{ +template +std::tuple, Tensor, Tensor> +polar_left_logV(Tensor const &F) { Index const dimension = F.get_dimension(); Tensor X(dimension), S(dimension), Y(dimension); - boost::tie(X, S, Y) = svd(F); + std::tie(X, S, Y) = svd(F); Tensor R = X * transpose(Y); @@ -1772,13 +1740,12 @@ polar_left_logV(Tensor const & F) Tensor v = X * s * transpose(X); - return boost::make_tuple(V, R, v); + return std::make_tuple(V, R, v); } -template -boost::tuple, Tensor, Tensor> -polar_left_logV_eig(Tensor const & F) -{ +template +std::tuple, Tensor, Tensor> +polar_left_logV_eig(Tensor const &F) { Index const dimension = F.get_dimension(); @@ -1788,7 +1755,7 @@ polar_left_logV_eig(Tensor const & F) Tensor V(dimension), D(dimension); - boost::tie(V, D) = eig_sym(b); + std::tie(V, D) = eig_sym(b); Tensor DQ(dimension, Filler::ZEROS), DI(dimension, Filler::ZEROS), DL(dimension, Filler::ZEROS); @@ -1808,7 +1775,7 @@ polar_left_logV_eig(Tensor const & F) Tensor const x = V * dot_t(DL, V); - return boost::make_tuple(X, R, x); + return std::make_tuple(X, R, x); } // @@ -1816,10 +1783,9 @@ polar_left_logV_eig(Tensor const & F) // \param F tensor (often a deformation-gradient-like tensor) // \return \f$ VR = F \f$ with \f$ R \in SO(N) \f$ and V SPD(N), and log V // -template -boost::tuple, Tensor, Tensor> -polar_left_logV_lame(Tensor const & F) -{ +template +std::tuple, Tensor, Tensor> +polar_left_logV_lame(Tensor const &F) { Index const dimension = F.get_dimension(); @@ -1832,7 +1798,7 @@ polar_left_logV_lame(Tensor const & F) // get eigenvalues/eigenvectors Tensor eVal(dimension); Tensor eVec(dimension); - boost::tie(eVec,eVal) = eig_spd_cos(b); + std::tie(eVec, eVal) = eig_spd_cos(b); // compute sqrt() and inv(sqrt()) of eigenvalues Tensor x = zero(3); @@ -1853,7 +1819,7 @@ polar_left_logV_lame(Tensor const & F) v = eVec*lnx*transpose(eVec); R = Vinv*F; - return boost::make_tuple(V,R,v); + return std::make_tuple(V, R, v); } // @@ -1888,11 +1854,8 @@ bch(Tensor const & x, Tensor const & y) // \param \f$ A = [f, g; g, h] \in S(2) \f$ // \return \f$ c, s \rightarrow [c, -s; s, c]\f diagonalizes A$ // -template -KOKKOS_INLINE_FUNCTION -std::pair -schur_sym(T const f, T const g, T const h) -{ +template +std::pair schur_sym(T const f, T const g, T const h) { T c = 1.0; T s = 0.0; @@ -1916,11 +1879,7 @@ schur_sym(T const f, T const g, T const h) // \param a, b // \return c, s // -template -KOKKOS_INLINE_FUNCTION -std::pair -givens(T const & a, T const & b) -{ +template std::pair givens(T const &a, T const &b) { T c = 1.0; T s = 0.0; @@ -1947,11 +1906,8 @@ namespace { // \return V eigenvectors, D eigenvalues in diagonal Matlab-style // See algorithm 8.4.2 in Matrix Computations, Golub & Van Loan 1996 // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_sym_NxN(Tensor const & A) -{ +template +std::pair, Tensor> eig_sym_NxN(Tensor const &A) { Tensor D = sym(A); @@ -1984,7 +1940,7 @@ eig_sym_NxN(Tensor const & A) Index q = 0; - boost::tie(p,q) = arg_max_off_diagonal(D); + std::tie(p, q) = arg_max_off_diagonal(D); if (p > q) { std::swap(p,q); } @@ -2002,7 +1958,7 @@ eig_sym_NxN(Tensor const & A) T c, s; - boost::tie(c, s) = schur_sym(f, g, h); + std::tie(c, s) = schur_sym(f, g, h); // Apply Givens rotation to matrices // that are converging to eigenvalues and eigenvectors @@ -2018,7 +1974,7 @@ eig_sym_NxN(Tensor const & A) Vector d(dimension); Tensor P(dimension); - boost::tie(d, P) = sort_permutation(diag(D)); + std::tie(d, P) = sort_permutation(diag(D)); D = diag(d); V = V * P; @@ -2030,11 +1986,8 @@ eig_sym_NxN(Tensor const & A) // \param A tensor // \return V eigenvectors, D eigenvalues in diagonal Matlab-style // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_sym_2x2(Tensor const & A) -{ +template +std::pair, Tensor> eig_sym_2x2(Tensor const &A) { assert(A.get_dimension() == 2); T const f = A(0,0); @@ -2093,15 +2046,15 @@ eig_sym_2x2(Tensor const & A) T c, s; - boost::tie(c, s) = schur_sym(f, g, h); + std::tie(c, s) = schur_sym(f, g, h); Tensor V(c, -s, s, c); if (swap_diag == true) { // swap eigenvectors if eigenvalues were swapped - std::swap(V(0,0), V(0,1)); - std::swap(V(1,0), V(1,1)); + std::swap(V(0, 0), V(0, 1)); + std::swap(V(1, 0), V(1, 1)); } return std::make_pair(V, D); @@ -2114,11 +2067,8 @@ eig_sym_2x2(Tensor const & A) // \param A tensor // \return V eigenvectors, D eigenvalues in diagonal Matlab-style // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_sym(Tensor const & A) -{ +template +std::pair, Tensor> eig_sym(Tensor const &A) { Index const dimension = A.get_dimension(); @@ -2128,11 +2078,11 @@ eig_sym(Tensor const & A) switch (dimension) { default: - boost::tie(V, D) = eig_sym_NxN(A); + std::tie(V, D) = eig_sym_NxN(A); break; case 2: - boost::tie(V, D) = eig_sym_2x2(A); + std::tie(V, D) = eig_sym_2x2(A); break; } @@ -2145,11 +2095,8 @@ eig_sym(Tensor const & A) // \param A tensor // \return V eigenvectors, D eigenvalues in diagonal Matlab-style // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_spd(Tensor const & A) -{ +template +std::pair, Tensor> eig_spd(Tensor const &A) { return eig_sym(A); } @@ -2158,11 +2105,8 @@ eig_spd(Tensor const & A) // \param A tensor // \return V eigenvectors, D eigenvalues in diagonal Matlab-style // -template -KOKKOS_INLINE_FUNCTION -std::pair, Tensor> -eig_spd_cos(Tensor const & A) -{ +template +std::pair, Tensor> eig_spd_cos(Tensor const &A) { Index const dimension = A.get_dimension(); @@ -2415,11 +2359,8 @@ eig_spd_cos(Tensor const & A) // \return G Cholesky factor A = GG^T // \return completed (bool) algorithm ran to completion // -template -KOKKOS_INLINE_FUNCTION -std::pair, bool > -cholesky(Tensor const & A) -{ +template +std::pair, bool> cholesky(Tensor const &A) { Tensor G = sym(A); @@ -2465,22 +2406,18 @@ namespace { // // // -template -KOKKOS_INLINE_FUNCTION -std::pair, RHS> -identity_precon(Tensor const & A, RHS const & B) -{ +template +std::pair, RHS> identity_precon(Tensor const &A, + RHS const &B) { return std::make_pair(A, B); } // // // -template -KOKKOS_INLINE_FUNCTION -std::pair, RHS> -diagonal_precon(Tensor const & A, RHS const & B) -{ +template +std::pair, RHS> diagonal_precon(Tensor const &A, + RHS const &B) { Vector const d = diag(A); @@ -2496,11 +2433,8 @@ diagonal_precon(Tensor const & A, RHS const & B) // // // -template -KOKKOS_INLINE_FUNCTION -std::pair, RHS> -maxabsrow_precon(Tensor const & A, RHS & B) -{ +template +std::pair, RHS> maxabsrow_precon(Tensor const &A, RHS &B) { Index const dimension = A.get_dimension(); @@ -2519,11 +2453,9 @@ maxabsrow_precon(Tensor const & A, RHS & B) // // // -template -KOKKOS_INLINE_FUNCTION -std::pair, RHS> -precon(PreconditionerType const pt, Tensor const & A, RHS const & B) -{ +template +std::pair, RHS> precon(PreconditionerType const pt, + Tensor const &A, RHS const &B) { switch (pt) { default: MT_ERROR_EXIT("Unknown preconditioner type."); @@ -2550,18 +2482,15 @@ precon(PreconditionerType const pt, Tensor const & A, RHS const & B) // as it just Gauss-Jordan elimination. It is intended to be used in // conjunction with Kokkos to take advantage of thread parallelism. // -template -KOKKOS_INLINE_FUNCTION -RHS -solve(Tensor const & A, RHS const & b, PreconditionerType const pt) -{ +template +RHS solve(Tensor const &A, RHS const &b, PreconditionerType const pt) { Tensor PA; RHS Pb; - boost::tie(PA, Pb) = precon(pt, A, b); + std::tie(PA, Pb) = precon(pt, A, b); return solve_full_pivot(PA, Pb); } diff --git a/packages/minitensor/src/MiniTensor_Mechanics.t.h b/packages/minitensor/src/MiniTensor_Mechanics.t.h index d9d4ec23d23c..61df4c1950bc 100644 --- a/packages/minitensor/src/MiniTensor_Mechanics.t.h +++ b/packages/minitensor/src/MiniTensor_Mechanics.t.h @@ -663,7 +663,7 @@ check_strong_ellipticity(Tensor4 const & A) Tensor D; - boost::tie(V, D) = eig_sym(Q); + std::tie(V, D) = eig_sym(Q); curr_eigenvalue = D(dimension - 1, dimension - 1); diff --git a/packages/minitensor/src/MiniTensor_Solvers.t.h b/packages/minitensor/src/MiniTensor_Solvers.t.h index 2cf4dd758d2a..ec6a37b34b2b 100644 --- a/packages/minitensor/src/MiniTensor_Solvers.t.h +++ b/packages/minitensor/src/MiniTensor_Solvers.t.h @@ -564,7 +564,7 @@ step(Tensor const & Hessian, Vector const & gradient) bool is_posdef{false}; - boost::tie(L, is_posdef) = cholesky(K); + std::tie(L, is_posdef) = cholesky(K); if (is_posdef == false) { MT_ERROR_EXIT("Trust region subproblem encountered singular Hessian."); @@ -635,7 +635,7 @@ step(Tensor const & Hessian, Vector const & gradient) bool is_posdef{false}; - boost::tie(L, is_posdef) = cholesky(K); + std::tie(L, is_posdef) = cholesky(K); if (is_posdef == false) { MT_ERROR_EXIT("Trust region subproblem encountered singular Hessian."); diff --git a/packages/minitensor/src/MiniTensor_Storage.h b/packages/minitensor/src/MiniTensor_Storage.h index 56b00c903253..5fa993169ec5 100644 --- a/packages/minitensor/src/MiniTensor_Storage.h +++ b/packages/minitensor/src/MiniTensor_Storage.h @@ -39,6 +39,7 @@ // ************************************************************************ // @HEADER +#include "Kokkos_Macros.hpp" #if !defined(MiniTensor_Storage_h) #define MiniTensor_Storage_h @@ -49,12 +50,12 @@ namespace minitensor { /// Set to constant value if not dynamic template struct dimension_const { - static Index const value = C; + static constexpr Index value = C; }; template struct dimension_const { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; /// Validate dimension @@ -64,13 +65,13 @@ struct check_static { #if defined(KOKKOS_ENABLE_CUDA) // Empty #else - static Index const - maximum_dimension = static_cast(std::numeric_limits::digits); + static constexpr Index maximum_dimension = + static_cast(std::numeric_limits::digits); static_assert(D > maximum_dimension, "Dimension is too large"); #endif - static Index const value = D; + static constexpr Index value = D; }; template @@ -91,132 +92,105 @@ check_dynamic(Index const dimension) /// Integer power template restricted to orders defined below template struct dimension_power { - static Index const value = 0; + static constexpr Index value = 0; }; template struct dimension_power { - static Index const value = D; + static constexpr Index value = D; }; template struct dimension_power { - static Index const value = D * D; + static constexpr Index value = D * D; }; template struct dimension_power { - static Index const value = D * D * D; + static constexpr Index value = D * D * D; }; template struct dimension_power { - static Index const value = D * D * D * D; + static constexpr Index value = D * D * D * D; }; /// Integer square for manipulations between 2nd and 4rd-order tensors. template struct dimension_square { - static Index const value = 0; + static constexpr Index value = 0; }; template<> struct dimension_square { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; -template<> -struct dimension_square<1> { - static Index const value = 1; -}; +template <> struct dimension_square<1> { static constexpr Index value = 1; }; -template<> -struct dimension_square<2> { - static Index const value = 4; -}; +template <> struct dimension_square<2> { static constexpr Index value = 4; }; -template<> -struct dimension_square<3> { - static Index const value = 9; -}; +template <> struct dimension_square<3> { static constexpr Index value = 9; }; -template<> -struct dimension_square<4> { - static Index const value = 16; -}; +template <> struct dimension_square<4> { static constexpr Index value = 16; }; /// Integer square root template restricted to dimensions defined below. /// Useful for constructing a 2nd-order tensor from a 4th-order /// tensor with static storage. -template -struct dimension_sqrt { - static Index const value = 0; -}; +template struct dimension_sqrt { static constexpr Index value = 0; }; template<> struct dimension_sqrt { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; -template<> -struct dimension_sqrt<1> { - static Index const value = 1; -}; +template <> struct dimension_sqrt<1> { static constexpr Index value = 1; }; -template<> -struct dimension_sqrt<4> { - static Index const value = 2; -}; +template <> struct dimension_sqrt<4> { static constexpr Index value = 2; }; -template<> -struct dimension_sqrt<9> { - static Index const value = 3; -}; +template <> struct dimension_sqrt<9> { static constexpr Index value = 3; }; -template<> -struct dimension_sqrt<16> { - static Index const value = 4; -}; +template <> struct dimension_sqrt<16> { static constexpr Index value = 4; }; /// Manipulation of static and dynamic dimensions. template struct dimension_add { - static Index const value = N + P; + static constexpr Index value = N + P; }; template struct dimension_add { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; template struct dimension_subtract { - static Index const value = N - P; + static constexpr Index value = N - P; }; template struct dimension_subtract { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; template struct dimension_product { - static Index const value = N * P; + static constexpr Index value = N * P; }; template struct dimension_product { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; template struct dimension_product { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; template<> struct dimension_product { - static Index const value = DYNAMIC; + static constexpr Index value = DYNAMIC; }; /// @@ -240,13 +214,12 @@ class Storage bool IS_DYNAMIC = false; + KOKKOS_INLINE_FUNCTION Storage() { } - explicit - Storage(Index const number_entries) - { + explicit KOKKOS_INLINE_FUNCTION Storage(Index const number_entries) { resize(number_entries); } @@ -255,6 +228,7 @@ class Storage Storage & operator=(Storage const & s) = delete; + KOKKOS_INLINE_FUNCTION ~Storage() { } @@ -316,12 +290,7 @@ class Storage return &storage_[0]; } - static constexpr - Index - static_size() - { - return N; - } + static KOKKOS_INLINE_FUNCTION constexpr Index static_size() { return N; } private: @@ -353,13 +322,12 @@ class Storage bool IS_STATIC = false; + KOKKOS_INLINE_FUNCTION Storage() { } - explicit - Storage(Index const number_entries) - { + explicit KOKKOS_INLINE_FUNCTION Storage(Index const number_entries) { resize(number_entries); } @@ -368,6 +336,7 @@ class Storage Storage & operator=(Storage const & s) = delete; + KOKKOS_INLINE_FUNCTION ~Storage() { clear(); @@ -432,12 +401,7 @@ class Storage return storage_; } - static constexpr - Index - static_size() - { - return 0; - } + static KOKKOS_INLINE_FUNCTION constexpr Index static_size() { return 0; } private: diff --git a/packages/minitensor/src/MiniTensor_Tensor.i.h b/packages/minitensor/src/MiniTensor_Tensor.i.h index e92855003ed8..97e07d3aa085 100644 --- a/packages/minitensor/src/MiniTensor_Tensor.i.h +++ b/packages/minitensor/src/MiniTensor_Tensor.i.h @@ -1646,25 +1646,31 @@ transpose(Tensor const & A) Tensor B = A; + auto my_swap = [&](T &a, T &b) { + T c = a; + a = b; + b = c; + }; + switch (dimension) { default: for (Index i = 0; i < dimension; ++i) { for (Index j = i + 1; j < dimension; ++j) { - std::swap(B(i, j), B(j, i)); + my_swap(B(i, j), B(j, i)); } } break; case 3: - std::swap(B(0, 1), B(1, 0)); - std::swap(B(0, 2), B(2, 0)); + my_swap(B(0, 1), B(1, 0)); + my_swap(B(0, 2), B(2, 0)); - std::swap(B(1, 2), B(2, 1)); + my_swap(B(1, 2), B(2, 1)); break; case 2: - std::swap(B(0, 1), B(1, 0)); + my_swap(B(0, 1), B(1, 0)); break; } diff --git a/packages/minitensor/src/MiniTensor_TensorBase.i.h b/packages/minitensor/src/MiniTensor_TensorBase.i.h index cc2b782cd7d9..572ffd60b702 100644 --- a/packages/minitensor/src/MiniTensor_TensorBase.i.h +++ b/packages/minitensor/src/MiniTensor_TensorBase.i.h @@ -399,6 +399,8 @@ TensorBase::fill(Filler const value) } break; +#ifdef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST + case Filler::RANDOM: for (Index i = 0; i < number_components; ++i) { auto & entry = (*this)[i]; @@ -423,6 +425,8 @@ TensorBase::fill(Filler const value) } break; +#endif + case Filler::NANS: for (Index i = 0; i < number_components; ++i) { auto & entry = (*this)[i]; @@ -432,7 +436,8 @@ TensorBase::fill(Filler const value) break; default: - MT_ERROR_EXIT("Unknown specification of value for filling components."); + MT_ERROR_EXIT("Unknown or undefined (in execution space) specification of " + "value for filling components."); break; } diff --git a/packages/minitensor/src/MiniTensor_Utilities.h b/packages/minitensor/src/MiniTensor_Utilities.h index 565536f1ccaa..7e149ba65a5f 100644 --- a/packages/minitensor/src/MiniTensor_Utilities.h +++ b/packages/minitensor/src/MiniTensor_Utilities.h @@ -141,26 +141,17 @@ tau(); /// Random number generation. Uniform distribution U(-1,1) /// which is the Teuchos default (!). /// -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random(); +template typename Sacado::ScalarType::type random(); /// /// Random number generation. Uniform distribution U(0,1). /// -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random_uniform(); +template typename Sacado::ScalarType::type random_uniform(); /// /// Random number generation. Normal distribution N(0,1). /// -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random_normal(); +template typename Sacado::ScalarType::type random_normal(); /// /// Fill all levels of AD to specified constant. diff --git a/packages/minitensor/src/MiniTensor_Utilities.i.h b/packages/minitensor/src/MiniTensor_Utilities.i.h index 60b7a7b52d1a..dbdbedfe86b3 100644 --- a/packages/minitensor/src/MiniTensor_Utilities.i.h +++ b/packages/minitensor/src/MiniTensor_Utilities.i.h @@ -187,11 +187,7 @@ tau() // // Random number generation. Teuchos [-1,1] // -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random() -{ +template typename Sacado::ScalarType::type random() { using S = typename Sacado::ScalarType::type; return Teuchos::ScalarTraits().random(); } @@ -199,11 +195,7 @@ random() // // Uniform [0,1] random number generation. // -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random_uniform() -{ +template typename Sacado::ScalarType::type random_uniform() { using S = typename Sacado::ScalarType::type; return static_cast(0.5 * random() + 0.5); } @@ -211,11 +203,7 @@ random_uniform() // // Normal N(0,1) random number generation. // -template -KOKKOS_INLINE_FUNCTION -typename Sacado::ScalarType::type -random_normal() -{ +template typename Sacado::ScalarType::type random_normal() { using S = typename Sacado::ScalarType::type; S const diff --git a/packages/minitensor/src/MiniTensor_Vector.h b/packages/minitensor/src/MiniTensor_Vector.h index 7b2c57ed9aec..9455dc4d46b5 100644 --- a/packages/minitensor/src/MiniTensor_Vector.h +++ b/packages/minitensor/src/MiniTensor_Vector.h @@ -506,7 +506,6 @@ unit(Vector const & u); /// \return v, beta /// template -KOKKOS_INLINE_FUNCTION std::pair, T> house(Vector const & x); diff --git a/packages/minitensor/src/MiniTensor_Vector.i.h b/packages/minitensor/src/MiniTensor_Vector.i.h index 0f90b39c3e5a..ebe5e5545272 100644 --- a/packages/minitensor/src/MiniTensor_Vector.i.h +++ b/packages/minitensor/src/MiniTensor_Vector.i.h @@ -39,6 +39,7 @@ // ************************************************************************ // @HEADER +#include "Kokkos_ArithTraits.hpp" #if !defined(MiniTensor_Vector_i_h) #define MiniTensor_Vector_i_h @@ -802,6 +803,8 @@ KOKKOS_INLINE_FUNCTION T norm_infinity(Vector const & u) { + using KAT = Kokkos::ArithTraits; + Index const dimension = u.get_dimension(); @@ -812,16 +815,16 @@ norm_infinity(Vector const & u) default: for (Index i = 0; i < dimension; ++i) { - s = std::max(s, std::abs(u(i))); + s = max(KAT::abs(u(i)), s); } break; case 3: - s = std::max(std::max(std::abs(u(0)), std::abs(u(1))), std::abs(u(2))); + s = max(max(KAT::abs(u(0)), KAT::abs(u(1))), KAT::abs(u(2))); break; case 2: - s = std::max(std::abs(u(0)), std::abs(u(1))); + s = max(KAT::abs(u(0)), KAT::abs(u(1))); break; } @@ -842,11 +845,8 @@ unit(Vector const & u) // // Compute Householder vector // -template -KOKKOS_INLINE_FUNCTION -std::pair, T> -house(Vector const & x) -{ +template +std::pair, T> house(Vector const &x) { Vector v = x; diff --git a/packages/minitensor/test/test_01.cc b/packages/minitensor/test/test_01.cc index 975d36871f3c..fa0ba3f9701d 100644 --- a/packages/minitensor/test/test_01.cc +++ b/packages/minitensor/test/test_01.cc @@ -901,7 +901,7 @@ TEST(MiniTensor, SymmetricEigen) Tensor V(3); Tensor D(3); - boost::tie(V, D) = eig_sym(A); + std::tie(V, D) = eig_sym(A); ASSERT_LE(std::abs(D(0, 0) - 1.1), machine_epsilon()); ASSERT_LE(std::abs(D(1, 1) - 1.0), machine_epsilon()); @@ -921,7 +921,7 @@ TEST(MiniTensor, LeftPolarDecomposition) Tensor V(3); Tensor R(3); - boost::tie(V, R) = polar_left(F); + std::tie(V, R) = polar_left(F); Real const error_x = norm(V - X) / norm(X); @@ -1031,7 +1031,7 @@ TEST(MiniTensor, PolarLeftLog) Tensor V(3), R(3), v(3); - boost::tie(V, R, v) = polar_left_logV(F); + std::tie(V, R, v) = polar_left_logV(F); Real const error = norm(v - x) / norm(x); @@ -1084,7 +1084,7 @@ TEST(MiniTensor, SVD2x2) Tensor U(2), S(2), V(2); - boost::tie(U, S, V) = svd(A); + std::tie(U, S, V) = svd(A); Tensor B = U * S * transpose(V); @@ -1099,7 +1099,7 @@ TEST(MiniTensor, SVD3x3) Tensor U(3), S(3), V(3); - boost::tie(U, S, V) = svd(A); + std::tie(U, S, V) = svd(A); Tensor const B = U * S * transpose(V); @@ -1115,7 +1115,7 @@ TEST(MiniTensor, SVD3x3Fad) Tensor> U(3), S(3), V(3); - boost::tie(U, S, V) = svd(A); + std::tie(U, S, V) = svd(A); Tensor> const B = U * S * transpose(V); @@ -1183,7 +1183,7 @@ TEST(MiniTensor, SymmetricEigen2x2) Tensor V(2), D(2); - boost::tie(V, D) = eig_sym(A); + std::tie(V, D) = eig_sym(A); Tensor const B = V * D * transpose(V); @@ -1198,7 +1198,7 @@ TEST(MiniTensor, SymmetricEigen3x3) Tensor V(3), D(3); - boost::tie(V, D) = eig_sym(A); + std::tie(V, D) = eig_sym(A); Tensor const B = V * D * transpose(V); @@ -1213,11 +1213,11 @@ TEST(MiniTensor, Polar3x3) Tensor R(3), U(3); - boost::tie(R, U) = polar_right(A); + std::tie(R, U) = polar_right(A); Tensor X(3), D(3), Y(3); - boost::tie(X, D, Y) = svd(A); + std::tie(X, D, Y) = svd(A); Tensor const B = R - X * transpose(Y) + U - Y * D * transpose(Y); @@ -1234,7 +1234,7 @@ TEST(MiniTensor, Cholesky) bool is_spd; - boost::tie(G, is_spd) = cholesky(A); + std::tie(G, is_spd) = cholesky(A); Tensor const B(1.0, 0.0, 0.0, 1.0, 2.0, 0.0, 1.0, 1.0, 1.0); From 536a3841d2c0f5e4d3df992c76620810cf495665 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Wed, 13 Oct 2021 20:41:51 -0600 Subject: [PATCH 17/98] tpetra: move sort_crs_* out of Impl namespace More compatibility changes for kokkos-kernels, see kokkos/kokkos-kernels#932 --- packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp | 2 +- packages/tpetra/core/src/Tpetra_CrsGraphTransposer_def.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp index a11686002906..a9d5994f122f 100644 --- a/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp +++ b/packages/tpetra/core/ext/TpetraExt_MatrixMatrix_def.hpp @@ -813,7 +813,7 @@ add (const Scalar& alpha, col_inds_array, global_col_inds_array, typename map_type::local_map_type> (localColinds, globalColinds, CcolMap->getLocalMap())); - KokkosKernels::Impl::sort_crs_matrix(rowptrs, localColinds, vals); + KokkosKernels::sort_crs_matrix(rowptrs, localColinds, vals); C.setAllValues(rowptrs, localColinds, vals); C.fillComplete(CDomainMap, CRangeMap, params); if(!doFillComplete) diff --git a/packages/tpetra/core/src/Tpetra_CrsGraphTransposer_def.hpp b/packages/tpetra/core/src/Tpetra_CrsGraphTransposer_def.hpp index 28e63f3fcd78..dc4310f47aa7 100644 --- a/packages/tpetra/core/src/Tpetra_CrsGraphTransposer_def.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsGraphTransposer_def.hpp @@ -362,7 +362,7 @@ namespace Tpetra { bool sort = true; if (sort) - KokkosKernels::Impl::sort_crs_graph(rowptrsSym, colindsSym); + KokkosKernels::sort_crs_graph(rowptrsSym, colindsSym); local_graph_device_type lclGraphSym = local_graph_device_type(colindsSym, rowptrsSym); @@ -475,7 +475,7 @@ namespace Tpetra { lclGraphT_rowmap, lclGraphT_entries); if (sort) - KokkosKernels::Impl::sort_crs_graph< + KokkosKernels::sort_crs_graph< typename local_graph_device_type::execution_space, rowmap_t, entries_t>( lclGraphT_rowmap, From 2cf5e8134f79f08cfa7fd4e0ea52725a9843bcac Mon Sep 17 00:00:00 2001 From: Tim Fuller Date: Wed, 6 Oct 2021 16:05:12 -0600 Subject: [PATCH 18/98] adding "start owned" parameter to FECrsMatrix to start the matrix in FE_ACTIVE_OWNED mode closes 9638 --- packages/tpetra/core/src/Tpetra_FECrsMatrix_def.hpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/tpetra/core/src/Tpetra_FECrsMatrix_def.hpp b/packages/tpetra/core/src/Tpetra_FECrsMatrix_def.hpp index 81d8ffc754e5..0132d6aceab5 100644 --- a/packages/tpetra/core/src/Tpetra_FECrsMatrix_def.hpp +++ b/packages/tpetra/core/src/Tpetra_FECrsMatrix_def.hpp @@ -71,7 +71,17 @@ FECrsMatrix(const Teuchos::RCP& graph, ( *graph->activeCrsGraph_!= fe_crs_graph_type::FE_ACTIVE_OWNED,std::runtime_error, "Input graph must be in FE_ACTIVE_OWNED mode when this constructor is called."); - activeCrsMatrix_ = Teuchos::rcp(new FEWhichActive(FE_ACTIVE_OWNED_PLUS_SHARED)); + bool start_owned = false; + if (! params.is_null ()) { + if (params->isParameter ("start owned")) { + start_owned = params->get("start owned", start_owned); + } + } + if(start_owned) { + activeCrsMatrix_ = Teuchos::rcp(new FEWhichActive(FE_ACTIVE_OWNED)); + } else { + activeCrsMatrix_ = Teuchos::rcp(new FEWhichActive(FE_ACTIVE_OWNED_PLUS_SHARED)); + } // Make an "inactive" matrix, if we need to if(!graph->inactiveCrsGraph_.is_null() ) { From 96820bd35316017da45c79e83e7ced4101899b45 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Thu, 14 Oct 2021 12:19:28 -0600 Subject: [PATCH 19/98] STK: Snapshot 10-14-21 12:18 --- .../stk_doc_tests/cmake/Dependencies.cmake | 2 +- .../stk_emend/independent_set/CMakeLists.txt | 10 + .../independent_set/IndependentSetDummy.cpp | 3 + .../stk_expreval/stk_expreval/Evaluator.cpp | 1 + .../stk_expreval/stk_expreval/Evaluator.hpp | 9 +- .../generate_tpl_paths_from_sierra_proj | 84 -- .../cmake_install_test/load_gcc_modules | 1 - .../cmake_install_test/run_cmake_stk | 2 +- packages/stk/stk_io/cmake/Dependencies.cmake | 2 +- packages/stk/stk_io/stk_io/Heartbeat.cpp | 66 - packages/stk/stk_io/stk_io/Heartbeat.hpp | 28 - packages/stk/stk_io/stk_io/OutputFile.cpp | 31 - packages/stk/stk_io/stk_io/OutputFile.hpp | 10 - packages/stk/stk_io/stk_io/StkIoUtils.hpp | 4 - .../stk/stk_io/stk_io/StkMeshIoBroker.cpp | 38 - .../stk/stk_io/stk_io/StkMeshIoBroker.hpp | 103 +- .../stk/stk_mesh/stk_mesh/base/Bucket.cpp | 532 ++------ .../stk/stk_mesh/stk_mesh/base/Bucket.hpp | 317 +---- .../stk_mesh/base/BucketConnectivity.hpp | 1170 ----------------- .../stk/stk_mesh/stk_mesh/base/BulkData.cpp | 64 +- .../stk/stk_mesh/stk_mesh/base/BulkData.hpp | 219 ++- .../stk_mesh/base/ConnectedSparseNodes.hpp | 115 ++ .../stk_mesh/base/ConnectedTopologyNodes.hpp | 101 ++ .../stk_mesh/stk_mesh/base/Connectivity.cpp | 250 ++++ .../stk_mesh/stk_mesh/base/Connectivity.hpp | 249 ++++ .../stk_mesh/stk_mesh/base/DeviceField.hpp | 68 +- .../stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp | 84 +- .../stk/stk_mesh/stk_mesh/base/DeviceMesh.hpp | 16 +- .../stk/stk_mesh/stk_mesh/base/EntityKey.hpp | 5 +- .../stk/stk_mesh/stk_mesh/base/FieldBLAS.hpp | 28 + .../stk/stk_mesh/stk_mesh/base/FieldBase.cpp | 62 +- .../stk/stk_mesh/stk_mesh/base/FieldBase.hpp | 8 +- .../stk_mesh/base/FieldDataManager.cpp | 22 +- .../stk_mesh/base/FieldDataManager.hpp | 1 - .../stk_mesh/base/FindRestriction.cpp | 6 +- .../stk_mesh/stk_mesh/base/GetNgpField.hpp | 1 + .../stk/stk_mesh/stk_mesh/base/HostField.hpp | 55 +- .../stk/stk_mesh/stk_mesh/base/MetaData.cpp | 9 +- .../stk_mesh/stk_mesh/base/NgpFieldBase.hpp | 5 + .../stk/stk_mesh/stk_mesh/base/NgpTypes.hpp | 2 +- .../stk_mesh/base/SparseConnectivity.cpp | 193 +++ .../stk_mesh/base/SparseConnectivity.hpp | 151 +++ packages/stk/stk_mesh/stk_mesh/base/Types.hpp | 3 + .../stk_mesh/baseImpl/BucketRepository.cpp | 47 - .../stk_mesh/baseImpl/BucketRepository.hpp | 3 - .../stk_mesh/baseImpl/MeshImplUtils.cpp | 53 +- .../stk_mesh/baseImpl/MeshImplUtils.hpp | 33 +- .../stk_mesh/baseImpl/MeshModification.cpp | 1 + .../stk_mesh/baseImpl/MeshPrintUtils.cpp | 16 +- .../stk_mesh/baseImpl/MeshPrintUtils.hpp | 3 + .../stk_search/stk_search/CoarseSearch.hpp | 21 +- .../stk_tools/mesh_tools/DetectHingesImpl.cpp | 2 +- .../stk_topology/topology_decl.hpp | 7 +- .../stk_unit_test_utils/BucketTester.hpp | 2 +- .../Search_UnitTestUtils.hpp | 5 +- .../stk_unit_test_utils/TextMesh.cpp | 329 +++-- .../stk_unit_tests/cmake/Dependencies.cmake | 2 +- .../stk_mesh/FieldBlas/UnitTestFieldBLAS.cpp | 37 + .../stk_mesh/UnitTestBucket.cpp | 91 +- .../stk_mesh/UnitTestBucketConnectivity.cpp | 345 ----- .../stk_mesh/UnitTestBulkData.cpp | 2 +- .../stk_mesh/UnitTestConnectivity.cpp | 386 ++++++ .../stk_mesh/UnitTestFEMMetaData.cpp | 13 +- .../stk_mesh/UnitTestSparseConnectivity.cpp | 256 ++++ .../stk_mesh/UnitTestTextMesh.cpp | 38 +- ...okkosBulkDataBucketCentroidCalculation.cpp | 8 +- .../stk_mesh/ngp/NgpParallelCommTest.cpp | 16 +- .../stk_unit_tests/stk_mesh/ngp/howToNgp.cpp | 82 +- .../stk_mesh/ngp/ngpFieldTest.cpp | 240 ++-- .../stk_mesh/ngp/ngpMultiStateFieldTests.cpp | 64 + .../stk_search/UnitTestCoarseSearch.cpp | 354 +++-- .../stk_simd_old/UnitTestStkSimdView2d.cpp | 2 + .../mesh_clone/UnitTestBulkDataClone.cpp | 4 +- .../stk_unit_tests/stk_util/CMakeLists.txt | 1 + .../environment/UnitTestOutputLog.cpp | 311 +++-- .../ngp/UnitTestNgpVirtualFunction.cpp | 85 ++ packages/stk/stk_util/Jamfile | 2 + .../stk_util/parallel/ParallelIndex.hpp | 4 +- .../stk_util/registry/ProductRegistry.cpp | 2 +- .../stk_util/stk_util/util/ParameterList.hpp | 7 +- 80 files changed, 3467 insertions(+), 3537 deletions(-) create mode 100644 packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp delete mode 100755 packages/stk/stk_integration_tests/cmake_install_test/generate_tpl_paths_from_sierra_proj delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/ConnectedTopologyNodes.hpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/Connectivity.hpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp create mode 100644 packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp delete mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp create mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp create mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp create mode 100644 packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp diff --git a/packages/stk/stk_doc_tests/cmake/Dependencies.cmake b/packages/stk/stk_doc_tests/cmake/Dependencies.cmake index 5d2024b68528..e37ee08c0e37 100644 --- a/packages/stk/stk_doc_tests/cmake/Dependencies.cmake +++ b/packages/stk/stk_doc_tests/cmake/Dependencies.cmake @@ -5,4 +5,4 @@ SET(TEST_REQUIRED_DEP_PACKAGES Gtest STKUtil STKNGP_TEST STKUnit_test_utils) SET(LIB_REQUIRED_DEP_TPLS) SET(LIB_OPTIONAL_DEP_TPLS) SET(TEST_REQUIRED_DEP_TPLS) -SET(TEST_OPTIONAL_DEP_TPLS Boost MPI) +SET(TEST_OPTIONAL_DEP_TPLS MPI) diff --git a/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt b/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt index 65456ef38091..961a9218c3b9 100644 --- a/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt +++ b/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt @@ -46,8 +46,18 @@ # SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + stk_emend + HEADERS ${HEADERS} + SOURCES ${SOURCES} + ) INSTALL(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/stk_emend/independent_set) diff --git a/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp b/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp new file mode 100644 index 000000000000..b2ef6c6c65a0 --- /dev/null +++ b/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp @@ -0,0 +1,3 @@ +namespace independent_set { +void IndependentSetDummy() {} +} diff --git a/packages/stk/stk_expreval/stk_expreval/Evaluator.cpp b/packages/stk/stk_expreval/stk_expreval/Evaluator.cpp index a8f0a09d698f..3f26dc2f03ba 100644 --- a/packages/stk/stk_expreval/stk_expreval/Evaluator.cpp +++ b/packages/stk/stk_expreval/stk_expreval/Evaluator.cpp @@ -149,6 +149,7 @@ class Node Eval* m_owner; }; +KOKKOS_FUNCTION NgpNode::NgpNode() : m_opcode(OPCODE_UNDEFINED), m_data{{0.0}}, diff --git a/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp b/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp index 46c06efd7abe..420e0cef16c9 100644 --- a/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp +++ b/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp @@ -315,7 +315,6 @@ class NgpNode KOKKOS_FUNCTION NgpNode(); - KOKKOS_FUNCTION explicit NgpNode(const Node& node); KOKKOS_DEFAULTED_FUNCTION @@ -505,7 +504,11 @@ class ParsedEval double evaluate(DeviceVariableMap& deviceVariableMap) const { + #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST return m_deviceNodes[m_headNodeIndex].eval(deviceVariableMap); + #else + return m_hostNodes[m_headNodeIndex].eval(deviceVariableMap); + #endif } private: @@ -535,7 +538,11 @@ class DeviceVariableMap { NGP_ThrowRequireMsg(parsedEval.get_num_variables() <= NUMVARS, "Size of DeviceVariableMap is too small"); +#ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST const ParsedEval::NodeView& deviceNodes = parsedEval.m_deviceNodes; +#else + const auto & deviceNodes = parsedEval.m_hostNodes; +#endif for (unsigned nodeIndex = 0u; nodeIndex < deviceNodes.extent(0); ++nodeIndex) { if (deviceNodes(nodeIndex).m_opcode == OPCODE_ASSIGN) { diff --git a/packages/stk/stk_integration_tests/cmake_install_test/generate_tpl_paths_from_sierra_proj b/packages/stk/stk_integration_tests/cmake_install_test/generate_tpl_paths_from_sierra_proj deleted file mode 100755 index a6f96138e1cd..000000000000 --- a/packages/stk/stk_integration_tests/cmake_install_test/generate_tpl_paths_from_sierra_proj +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash - -findlibdir() { - local libname=$1 - local fullpath=`eval "find ${output_dir}/trilinos_tpls -name ${libname}"` - local libdir=$2 - local dir=`eval "dirname ${fullpath}"` - eval $libdir="'$dir'" -} - -findincdir() { - local header=$1 - local incdir=$2 - local fullpath=`eval "find ${output_dir}/trilinos_tpls/TPLs_src -name ${header}"` - local dir=`eval "dirname ${fullpath}"` - eval $incdir="'$dir'" -} - -sierra_dir=$1 -output_dir=$2 -tpl_paths_file=$3 - -printf "sierra_proj = ${sierra_dir}\n"; -printf "output_dir = ${output_dir}\n"; -printf "output tpl_paths_file= ${tpl_paths_file}\n"; - -rm -f ${tpl_paths_file} - -cd ${sierra_dir} -echo "using bake to generate TPLs..." -bake -j8 --no-trilinos --no-seacas --builddir=${output_dir}/BAKE --installdir=${output_dir}/trilinos_tpls /tpl/trilinos//install-trilinos-tpls >& ${output_dir}/bake-tpls.out - -if [ $? -ne 0 ] ; then - echo "!! error using bake to generate tpls. check output in ${output_dir}/bake-tpls.out"; - exit 1; -fi - -echo "------------------------" - -boost_inc_dir=$sierra_dir/TPLs_src/boost - -blas_lib=/usr/lib64/libblas.so -lapack_lib=/usr/lib64/liblapack.so - -netcdf_root_dir=$sierra_dir/TPLs_src/netcdf/netcdf-c-4.7.4 -findincdir netcdf.h netcdf_inc_dir -findlibdir libnetcdf.a netcdf_lib_dir -echo "netcdf_lib_dir: $netcdf_lib_dir" - -findincdir hdf5.h hdf_inc_dir -findlibdir libhdf5.a hdf_lib_dir -echo "hdf_lib_dir: $hdf_lib_dir" - -findincdir pnetcdf.h pnetcdf_inc_dir -findlibdir libpnetcdf.a pnetcdf_lib_dir -echo "pnetcdf_lib_dir: $pnetcdf_lib_dir" - -parmetis_inc_dir=$sierra_dir/TPLs_src/parmetis/include -metis_inc_dir=$sierra_dir/TPLs_src/parmetis/metis/include - -findlibdir libparmetis.a parmetis_lib_dir -echo "parmetis_lib_dir: ${parmetis_lib_dir}" - -findlibdir libmetis.a metis_lib_dir -echo "metis_lib_dir: ${metis_lib_dir}" - -echo "------------------------" - -cat << EOF > ${tpl_paths_file} -BLAS_LIBRARIES=${blas_lib} -LAPACK_LIBRARIES=${lapack_lib} -BOOST_INC_DIR=${boost_inc_dir} -NETCDF_INC_DIR=${netcdf_inc_dir} -NETCDF_LIB_DIR=${netcdf_lib_dir} -PNETCDF_INC_DIR=${pnetcdf_inc_dir} -PNETCDF_LIB_DIR=${pnetcdf_lib_dir} -HDF_INC_DIR=${hdf_inc_dir} -HDF_LIB_DIR=${hdf_lib_dir} -METIS_INC_DIR=${metis_inc_dir} -METIS_LIB_DIR=${metis_lib_dir} -PARMETIS_INC_DIR=${parmetis_inc_dir} -PARMETIS_LIB_DIR=${parmetis_lib_dir} -EOF - diff --git a/packages/stk/stk_integration_tests/cmake_install_test/load_gcc_modules b/packages/stk/stk_integration_tests/cmake_install_test/load_gcc_modules index 7b57261e312e..e7e9a1d0b8a9 100644 --- a/packages/stk/stk_integration_tests/cmake_install_test/load_gcc_modules +++ b/packages/stk/stk_integration_tests/cmake_install_test/load_gcc_modules @@ -4,7 +4,6 @@ module load cde/v2/cmake/3.19.2 module load cde/v2/compiler/gcc/7.2.0 module load cde/v2/gcc/7.2.0/openmpi/4.0.5 module load cde/v2/gcc/7.2.0/netlib-lapack/3.8.0 -module load cde/v2/gcc/7.2.0/boost/1.73.0 module load cde/v2/gcc/7.2.0/hdf5/1.10.6 module load cde/v2/gcc/7.2.0/netcdf-c/4.7.3 module load cde/v2/gcc/7.2.0/parallel-netcdf/1.12.1 diff --git a/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk b/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk index c5da6dd7afb9..c19fadf7dcff 100755 --- a/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk +++ b/packages/stk/stk_integration_tests/cmake_install_test/run_cmake_stk @@ -78,7 +78,7 @@ cmake \ -DTpetra_ENABLE_CUDA:BOOL=${cuda_on_or_off} \ -DTrilinos_ENABLE_KokkosKernels:BOOL=ON \ -DTrilinos_ENABLE_Zoltan:BOOL=ON \ --DTrilinos_ENABLE_Fortran:BOOL=OFF \ +-DTrilinos_ENABLE_Fortran:BOOL=ON \ -DCMAKE_CXX_FLAGS:STRING="-DNOT_HAVE_STK_SEACASAPREPRO_LIB -D${fortran_macro} ${cmake_cxx_flags} -Werror=dangling-else" \ -DSTK_ENABLE_TESTS:BOOL=ON \ -DTrilinos_ENABLE_STK:BOOL=ON \ diff --git a/packages/stk/stk_io/cmake/Dependencies.cmake b/packages/stk/stk_io/cmake/Dependencies.cmake index 2d7cc69d9feb..3dae5591447b 100644 --- a/packages/stk/stk_io/cmake/Dependencies.cmake +++ b/packages/stk/stk_io/cmake/Dependencies.cmake @@ -3,6 +3,6 @@ SET(LIB_OPTIONAL_DEP_PACKAGES) SET(TEST_REQUIRED_DEP_PACKAGES Gtest) SET(TEST_OPTIONAL_DEP_PACKAGES) SET(LIB_REQUIRED_DEP_TPLS) -SET(LIB_OPTIONAL_DEP_TPLS Boost) +SET(LIB_OPTIONAL_DEP_TPLS) SET(TEST_REQUIRED_DEP_TPLS) SET(TEST_OPTIONAL_DEP_TPLS) diff --git a/packages/stk/stk_io/stk_io/Heartbeat.cpp b/packages/stk/stk_io/stk_io/Heartbeat.cpp index 45c4499d98d1..830dc79ea39d 100644 --- a/packages/stk/stk_io/stk_io/Heartbeat.cpp +++ b/packages/stk/stk_io/stk_io/Heartbeat.cpp @@ -238,37 +238,6 @@ void impl::Heartbeat::add_global_ref(const std::string &name, } } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void impl::Heartbeat::define_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies, - Ioss::Field::RoleType role) -{ - internal_define_global_ref(name, value, type, copies, role); -} - -STK_DEPRECATED void impl::Heartbeat::add_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies, - Ioss::Field::RoleType role) -{ - if (m_processor == 0) { - ThrowErrorMsgIf (m_currentStep != 0, - "At least one output step has been written to the history/heartbeat file. " - "Variables cannot be added anymore."); - - Ioss::State currentState = m_region->get_state(); - if(currentState != Ioss::STATE_DEFINE_TRANSIENT) { - m_region->begin_mode(Ioss::STATE_DEFINE_TRANSIENT); - } - - internal_define_global_ref(name, value, type, copies, role); - } -} -#endif - void impl::Heartbeat::internal_define_global_ref(const std::string &name, const STK_ANY_NAMESPACE::any *value, const std::string &storage, @@ -291,18 +260,6 @@ void impl::Heartbeat::internal_define_global_ref(const std::string &name, } } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void impl::Heartbeat::define_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies, - Ioss::Field::RoleType role) -{ - internal_define_global_ref(name, value, storage, dataType, copies, role); -} -#endif - void impl::Heartbeat::define_global_ref(const std::string &name, const stk::util::Parameter ¶m, const std::string &storage, @@ -334,29 +291,6 @@ void impl::Heartbeat::add_global_ref(const std::string &name, } } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void impl::Heartbeat::add_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies, - Ioss::Field::RoleType role) -{ - if (m_processor == 0) { - ThrowErrorMsgIf (m_currentStep != 0, - "At least one output step has been written to the history/heartbeat file. " - "Variables cannot be added anymore."); - - Ioss::State currentState = m_region->get_state(); - if(currentState != Ioss::STATE_DEFINE_TRANSIENT) { - m_region->begin_mode(Ioss::STATE_DEFINE_TRANSIENT); - } - - internal_define_global_ref(name, value, storage, dataType, copies, role); - } -} -#endif - void impl::Heartbeat::process_output_pre_write(int step, double time) { if (m_processor == 0) { diff --git a/packages/stk/stk_io/stk_io/Heartbeat.hpp b/packages/stk/stk_io/stk_io/Heartbeat.hpp index 83a6f61865fb..daae8903993f 100644 --- a/packages/stk/stk_io/stk_io/Heartbeat.hpp +++ b/packages/stk/stk_io/stk_io/Heartbeat.hpp @@ -112,34 +112,6 @@ class Heartbeat { int copies = 1, Ioss::Field::RoleType role = Ioss::Field::TRANSIENT); -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void define_global_ref(const std::string &variableName, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::TRANSIENT); - - STK_DEPRECATED void define_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::TRANSIENT); - - STK_DEPRECATED void add_global_ref(const std::string &variableName, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::TRANSIENT); - - STK_DEPRECATED void add_global_ref(const std::string &name, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::TRANSIENT); -#endif - void process_output(int step, double time); void process_output_pre_write(int step, double time); void process_output_write(int step, double time); diff --git a/packages/stk/stk_io/stk_io/OutputFile.cpp b/packages/stk/stk_io/stk_io/OutputFile.cpp index b56c87708b4e..ca323a5ec51a 100644 --- a/packages/stk/stk_io/stk_io/OutputFile.cpp +++ b/packages/stk/stk_io/stk_io/OutputFile.cpp @@ -394,17 +394,6 @@ void OutputFile::add_global_ref(const std::string &name, const stk::util::Parame internal_add_global(m_region, name, parameter_type.first, parameter_type.second); m_globalAnyFields.emplace_back(name, ¶m.value, param.type); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void OutputFile::add_global_ref(const std::string &name, const STK_ANY_NAMESPACE::any *value, stk::util::ParameterType::Type type) -{ - ThrowErrorMsgIf (m_fieldsDefined, - "On region named " << m_region->name() << - " Attempting to add global variable after data has already been written to the database."); - std::pair parameter_type = get_io_parameter_size_and_type(type, *value); - internal_add_global(m_region, name, parameter_type.first, parameter_type.second); - m_globalAnyFields.emplace_back(name, value, type); -} -#endif bool OutputFile::has_global(const std::string &globalVarName) const { @@ -421,18 +410,6 @@ void OutputFile::add_global(const std::string &name, const stk::util::Parameter internal_add_global(m_region, name, parameter_type.first, parameter_type.second); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void OutputFile::add_global(const std::string &name, const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type) -{ - ThrowErrorMsgIf (m_fieldsDefined, - "On region named " << m_region->name() << - " Attempting to add global variable after data has already been written to the database."); - std::pair parameter_type = get_io_parameter_size_and_type(type, value); - m_anyGlobalVariablesDefined = true; // This output file has at least 1 global variable. - internal_add_global(m_region, name, parameter_type.first, parameter_type.second); -} -#endif - void OutputFile::add_global(const std::string &globalVarName, Ioss::Field::BasicType dataType) { ThrowErrorMsgIf (m_fieldsDefined, @@ -460,14 +437,6 @@ void OutputFile::add_global(const std::string &globalVarName, const std::string internal_add_global(m_region, globalVarName, storage, dataType); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void OutputFile::write_global(const std::string &globalVarName, - const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type) -{ - internal_write_parameter(m_region, globalVarName, value, type); -} -#endif - void OutputFile::write_global(const std::string &globalVarName, const stk::util::Parameter ¶m) { diff --git a/packages/stk/stk_io/stk_io/OutputFile.hpp b/packages/stk/stk_io/stk_io/OutputFile.hpp index 47e98528de26..8228f934d727 100644 --- a/packages/stk/stk_io/stk_io/OutputFile.hpp +++ b/packages/stk/stk_io/stk_io/OutputFile.hpp @@ -161,23 +161,13 @@ class OutputFile internal_add_global(m_region, variableName, parameter_type.first, parameter_type.second); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void add_global(const std::string &variableName, const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type); -#endif void add_global_ref(const std::string &variableName, const stk::util::Parameter &value); -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void add_global_ref(const std::string &variableName, const STK_ANY_NAMESPACE::any *value, stk::util::ParameterType::Type type); -#endif void add_global(const std::string &variableName, Ioss::Field::BasicType dataType); void add_global(const std::string &variableName, const std::string &type, Ioss::Field::BasicType dataType); void add_global(const std::string &variableName, int component_count, Ioss::Field::BasicType dataType); void write_global(const std::string &variableName, const stk::util::Parameter ¶m); -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void write_global(const std::string &variableName, - const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type); -#endif void write_global(const std::string &variableName, double globalVarData); void write_global(const std::string &variableName, int globalVarData); void write_global(const std::string &variableName, std::vector& globalVarData); diff --git a/packages/stk/stk_io/stk_io/StkIoUtils.hpp b/packages/stk/stk_io/stk_io/StkIoUtils.hpp index 8588fc5cb334..a1530d2364c5 100644 --- a/packages/stk/stk_io/stk_io/StkIoUtils.hpp +++ b/packages/stk/stk_io/stk_io/StkIoUtils.hpp @@ -47,10 +47,6 @@ #include "stk_util/util/ParameterList.hpp" #include "Ioss_Field.h" -#ifdef STK_HAVE_BOOST -#include -#endif - namespace stk { namespace io { class StkMeshIoBroker; } } namespace stk { namespace mesh { class BulkData; } } namespace stk { namespace mesh { class MetaData; } } diff --git a/packages/stk/stk_io/stk_io/StkMeshIoBroker.cpp b/packages/stk/stk_io/stk_io/StkMeshIoBroker.cpp index 51bd6a29fd3f..e2b5340f0ad7 100644 --- a/packages/stk/stk_io/stk_io/StkMeshIoBroker.cpp +++ b/packages/stk/stk_io/stk_io/StkMeshIoBroker.cpp @@ -921,17 +921,6 @@ bool StkMeshIoBroker::get_global(const std::string &globalVarName, return internal_read_parameter(region, globalVarName, param.value, param.type, abort_if_not_found); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED bool StkMeshIoBroker::get_global(const std::string &globalVarName, - STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type, - bool abort_if_not_found) const -{ - validate_input_file_index(m_activeMeshIndex); - auto region = m_inputFiles[m_activeMeshIndex]->get_input_io_region(); - return internal_read_parameter(region, globalVarName, value, type, abort_if_not_found); -} -#endif - size_t StkMeshIoBroker::get_global_variable_length(const std::string& globalVarName) const { validate_input_file_index(m_activeMeshIndex); @@ -994,15 +983,6 @@ void StkMeshIoBroker::add_global(size_t output_file_index, const std::string &na m_outputFiles[output_file_index]->add_global(name, param); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void StkMeshIoBroker::add_global(size_t output_file_index, const std::string &name, - const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type) -{ - validate_output_file_index(output_file_index); - m_outputFiles[output_file_index]->add_global(name, value, type); -} -#endif - void StkMeshIoBroker::add_global_ref(size_t output_file_index, const std::string &name, const stk::util::Parameter ¶m) { @@ -1010,15 +990,6 @@ void StkMeshIoBroker::add_global_ref(size_t output_file_index, const std::string m_outputFiles[output_file_index]->add_global_ref(name, param); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void StkMeshIoBroker::add_global_ref(size_t output_file_index, const std::string &name, - const STK_ANY_NAMESPACE::any *value, stk::util::ParameterType::Type type) -{ - validate_output_file_index(output_file_index); - m_outputFiles[output_file_index]->add_global_ref(name, value, type); -} -#endif - void StkMeshIoBroker::add_global(size_t output_file_index, const std::string &globalVarName, Ioss::Field::BasicType dataType) { validate_output_file_index(output_file_index); @@ -1045,15 +1016,6 @@ void StkMeshIoBroker::write_global(size_t output_file_index, m_outputFiles[output_file_index]->write_global(variableName, param); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 -STK_DEPRECATED void StkMeshIoBroker::write_global(size_t output_file_index, const std::string &globalVarName, - const STK_ANY_NAMESPACE::any &value, stk::util::ParameterType::Type type) const -{ - validate_output_file_index(output_file_index); - m_outputFiles[output_file_index]->write_global(globalVarName, value, type); -} -#endif - void StkMeshIoBroker::write_global(size_t output_file_index, const std::string &globalVarName, double globalVarData) const { validate_output_file_index(output_file_index); diff --git a/packages/stk/stk_io/stk_io/StkMeshIoBroker.hpp b/packages/stk/stk_io/stk_io/StkMeshIoBroker.hpp index be6f7f7ac573..c94501ce0b3a 100644 --- a/packages/stk/stk_io/stk_io/StkMeshIoBroker.hpp +++ b/packages/stk/stk_io/stk_io/StkMeshIoBroker.hpp @@ -389,12 +389,6 @@ namespace stk { bool get_global(const std::string &variableName, stk::util::Parameter ¶m, bool abort_if_not_found=true) const; -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED bool get_global(const std::string &variableName, - STK_ANY_NAMESPACE::any &value, - stk::util::ParameterType::Type type, - bool abort_if_not_found=true) const; -#endif bool get_global(const std::string &variableName, int &globalVar, bool abort_if_not_found=true) const; @@ -489,16 +483,7 @@ namespace stk { validate_output_file_index(output_file_index); m_outputFiles[output_file_index]->add_global(variableName, value, type); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void add_global_ref(size_t output_file_index, - const std::string &variableName, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type); - STK_DEPRECATED void add_global(size_t output_file_index, - const std::string &variableName, - const STK_ANY_NAMESPACE::any &value, - stk::util::ParameterType::Type type); -#endif + void add_global(size_t output_file_index, const std::string &variableName, Ioss::Field::BasicType dataType); @@ -557,12 +542,6 @@ namespace stk { const std::string& variableName, const stk::util::Parameter& param) const; -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void write_global(size_t output_file_index, - const std::string &variableName, - const STK_ANY_NAMESPACE::any &value, - stk::util::ParameterType::Type type) const; -#endif void write_global(size_t output_file_index, const std::string &variableName, double data) const; @@ -610,38 +589,6 @@ namespace stk { int copies = 1, Ioss::Field::RoleType role = Ioss::Field::REDUCTION); -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED void define_heartbeat_global(size_t index, - const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::REDUCTION); - - STK_DEPRECATED void define_heartbeat_global(size_t index, - const std::string &globalVarName, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::REDUCTION); - - STK_DEPRECATED void add_heartbeat_global(size_t index, - const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::REDUCTION); - - STK_DEPRECATED void add_heartbeat_global(size_t index, - const std::string &globalVarName, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies = 1, - Ioss::Field::RoleType role = Ioss::Field::REDUCTION); -#endif - bool has_heartbeat_global(size_t output_file_index, const std::string &globalVarName) const; size_t get_heartbeat_global_component_count(size_t output_file_index, @@ -962,54 +909,6 @@ namespace stk { m_heartbeat[index]->add_global_ref(globalVarName, param, storage, dataType, copies, role); } -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 - STK_DEPRECATED inline void StkMeshIoBroker::define_heartbeat_global(size_t index, - const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies, - Ioss::Field::RoleType role) - { - STKIORequire(index < m_heartbeat.size()); - m_heartbeat[index]->define_global_ref(name, value, type, copies, role); - } - - inline void StkMeshIoBroker::define_heartbeat_global(size_t index, - const std::string &globalVarName, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies, - Ioss::Field::RoleType role) - { - STKIORequire(index < m_heartbeat.size()); - m_heartbeat[index]->define_global_ref(globalVarName, value, storage, dataType, copies, role); - } - - STK_DEPRECATED inline void StkMeshIoBroker::add_heartbeat_global(size_t index, - const std::string &name, - const STK_ANY_NAMESPACE::any *value, - stk::util::ParameterType::Type type, - int copies, - Ioss::Field::RoleType role) - { - STKIORequire(index < m_heartbeat.size()); - m_heartbeat[index]->add_global_ref(name, value, type, copies, role); - } - - STK_DEPRECATED inline void StkMeshIoBroker::add_heartbeat_global(size_t index, - const std::string &globalVarName, - const STK_ANY_NAMESPACE::any *value, - const std::string &storage, - Ioss::Field::BasicType dataType, - int copies, - Ioss::Field::RoleType role) - { - STKIORequire(index < m_heartbeat.size()); - m_heartbeat[index]->add_global_ref(globalVarName, value, storage, dataType, copies, role); - } -#endif - inline void StkMeshIoBroker::process_heartbeat_output(size_t index, int step, double time) { STKIORequire(index < m_heartbeat.size()); diff --git a/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp b/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp index e18d12a7653f..18696c21f07f 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp @@ -38,8 +38,9 @@ #include // for operator<<, basic_ostream, etc #include // for BulkData, field_data, etc #include // for Entity +#include +#include #include // for MetaData, get_cell_topology, etc -#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity #include "stk_mesh/base/FieldBase.hpp" // for FieldBase #include #include "stk_mesh/base/Part.hpp" // for Part @@ -50,127 +51,20 @@ namespace stk { namespace mesh { namespace impl { template class BucketConnectivity; } } } - //---------------------------------------------------------------------- namespace stk { namespace mesh { namespace { -#ifndef NDEBUG -struct CheckSizeFunctor -{ - template - void operator()(const Bucket& bucket, const Connectivity& connectivity, const Bucket*) const - { ThrowAssert(bucket.size() == static_cast(connectivity.size())); } - - bool is_modifying() const { return false; } -}; -#endif - -struct AddEntityFunctor -{ - template - void operator()(Bucket&, Connectivity& connectivity, Bucket*) - { connectivity.add_entity(); } - - bool is_modifying() const { return true; } -}; - -struct RemoveEntityFunctor -{ - template - void operator()(Bucket&, Connectivity& connectivity, Bucket*) - { connectivity.remove_entity(); } - - bool is_modifying() const { return true; } -}; - -struct DeclareRelationFunctor -{ - DeclareRelationFunctor(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, - Permutation permutation) - : m_bucket_ordinal(bucket_ordinal), - m_to(to), - m_ordinal(ordinal), - m_permutation(permutation), - m_modified(false) - {} - - template - void operator()(Bucket& bucket, Connectivity& connectivity) - { - ThrowAssert( (Connectivity::target_rank == static_cast(stk::topology::INVALID_RANK) && - bucket.mesh().entity_rank(m_to) > static_cast(stk::topology::ELEMENT_RANK)) || - bucket.mesh().entity_rank(m_to) == Connectivity::target_rank ); - ThrowAssert(!m_modified); - m_modified = connectivity.add_connectivity(m_bucket_ordinal, m_to, m_ordinal, m_permutation); - } - - unsigned m_bucket_ordinal; - Entity m_to; - ConnectivityOrdinal m_ordinal; - Permutation m_permutation; - bool m_modified; -}; - -struct DestroyRelationFunctor -{ - DestroyRelationFunctor(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) - : m_bucket_ordinal(bucket_ordinal), - m_to(to), - m_ordinal(ordinal), - m_modified(false) - {} - - template - void operator()(Bucket& bucket, Connectivity& connectivity) - { - ThrowAssert( (Connectivity::target_rank == static_cast(stk::topology::INVALID_RANK) && - bucket.mesh().entity_rank(m_to) > static_cast(stk::topology::ELEMENT_RANK)) || - bucket.mesh().entity_rank(m_to) == Connectivity::target_rank); - ThrowAssert(!m_modified); - m_modified = connectivity.remove_connectivity(m_bucket_ordinal, m_to, m_ordinal); - } - - unsigned m_bucket_ordinal; - Entity m_to; - ConnectivityOrdinal m_ordinal; - bool m_modified; -}; - -struct DebugPrintFunctor -{ - DebugPrintFunctor(std::ostream& out, unsigned ordinal = -1u) : m_out(out), m_ordinal(ordinal) {} - - template - void operator()(const Bucket&, const Connectivity& connectivity, const Bucket*) const - { - if (m_ordinal == -1u) { - connectivity.debug_dump(m_out); - } - else { - connectivity.debug_dump(m_out, m_ordinal); - } - } - - bool is_modifying() const { return false; } - - std::ostream& m_out; - unsigned m_ordinal; -}; - -template void setup_connectivity(stk::topology bucket_topology, EntityRank from_rank, EntityRank to_rank, - ConnectivityType& conn_type, - FixedConnectivity& fixed_conn) + ConnectivityType& conn_type) { if (bucket_topology != stk::topology::END_TOPOLOGY && bucket_topology.num_sub_topology(to_rank) > 0 && to_rank == stk::topology::NODE_RANK) { - fixed_conn.set_num_connectivity(bucket_topology.num_sub_topology(to_rank)); conn_type = FIXED_CONNECTIVITY; } else if (from_rank > stk::topology::ELEMENT_RANK || @@ -182,31 +76,6 @@ void setup_connectivity(stk::topology bucket_topology, } //namespace anonymous -namespace impl { - -struct OverwriteEntityFunctor -{ - OverwriteEntityFunctor(unsigned old_ordinal, unsigned new_ordinal) : m_old_ordinal(old_ordinal), m_new_ordinal(new_ordinal) {} - - template - void operator()(Bucket& bucket, Connectivity& connectivity, Bucket* otherBucket) - { - impl::BucketConnectivity & otherConnectivity = get_other_connectivity(otherBucket); - otherConnectivity.copy_entity(m_old_ordinal, connectivity, m_new_ordinal); - } - - bool is_modifying() const { return true; } - - template - static - impl::BucketConnectivity& get_other_connectivity(Bucket* other_bucket); - - unsigned m_old_ordinal; - unsigned m_new_ordinal; -}; - -} - //---------------------------------------------------------------------- bool raw_part_equal( const unsigned * lhs , const unsigned * rhs ) @@ -239,18 +108,17 @@ bool BucketLess::operator()( const unsigned * lhs , const Bucket * rhs_bucket ) const { return bucket_key_less( lhs , rhs_bucket->key() ); } -//---------------------------------------------------------------------- - Bucket::Bucket(BulkData & arg_mesh, EntityRank arg_entity_rank, const std::vector & arg_key, size_t arg_capacity, unsigned bucket_id) : m_mesh(arg_mesh), + m_sparse_connectivity(arg_mesh.get_sparse_connectivity()), m_entity_rank(arg_entity_rank), - m_topology(), m_key(arg_key), m_partOrdsBeginEnd(m_key.data()+1,m_key.data()+m_key[0]), + m_topology(get_topology(m_mesh.mesh_meta_data(), arg_entity_rank, superset_part_ordinals())), m_capacity(arg_capacity), m_size(0), m_bucket_id(bucket_id), @@ -261,28 +129,16 @@ Bucket::Bucket(BulkData & arg_mesh, m_node_kind(INVALID_CONNECTIVITY_TYPE), m_edge_kind(INVALID_CONNECTIVITY_TYPE), m_face_kind(INVALID_CONNECTIVITY_TYPE), - m_element_kind(INVALID_CONNECTIVITY_TYPE), - m_fixed_node_connectivity(), - m_fixed_edge_connectivity(), - m_fixed_face_connectivity(), - m_fixed_element_connectivity(), - m_dynamic_node_connectivity(arg_entity_rank, &m_mesh), - m_dynamic_edge_connectivity(arg_entity_rank, &m_mesh), - m_dynamic_face_connectivity(arg_entity_rank, &m_mesh), - m_dynamic_element_connectivity(arg_entity_rank, &m_mesh), - m_dynamic_other_connectivity(arg_entity_rank, &m_mesh), + m_topoNodes(m_topology, m_entities), + m_sparseNodes(m_sparse_connectivity, m_entity_rank, m_entities), m_owned(has_superset(*this, m_mesh.mesh_meta_data().locally_owned_part())), m_shared(has_superset(*this, m_mesh.mesh_meta_data().globally_shared_part())), m_aura(has_superset(*this, m_mesh.mesh_meta_data().aura_part())) { ThrowAssertMsg(arg_capacity != 0, "Buckets should never have zero capacity"); - - m_topology = get_topology(m_mesh.mesh_meta_data(), arg_entity_rank, superset_part_ordinals()); - - setup_connectivity(m_topology, arg_entity_rank, stk::topology::NODE_RANK, m_node_kind, m_fixed_node_connectivity); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::EDGE_RANK, m_edge_kind, m_fixed_edge_connectivity); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::FACE_RANK, m_face_kind, m_fixed_face_connectivity); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::ELEMENT_RANK, m_element_kind, m_fixed_element_connectivity); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::NODE_RANK, m_node_kind); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::EDGE_RANK, m_edge_kind); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::FACE_RANK, m_face_kind); m_parts.reserve(m_key.size()); supersets(m_parts); @@ -296,93 +152,36 @@ Bucket::~Bucket() m_mesh.destroy_bucket_callback(m_entity_rank, *this, m_capacity); } -size_t Bucket::memory_size_in_bytes() const -{ - size_t bytes = sizeof(Bucket); - bytes += impl::capacity_in_bytes(m_entities); - bytes += m_fixed_node_connectivity.heap_memory_in_bytes(); - bytes += m_fixed_edge_connectivity.heap_memory_in_bytes(); - bytes += m_fixed_face_connectivity.heap_memory_in_bytes(); - bytes += m_fixed_element_connectivity.heap_memory_in_bytes(); - bytes += m_dynamic_node_connectivity.heap_memory_in_bytes(); - bytes += m_dynamic_edge_connectivity.heap_memory_in_bytes(); - bytes += m_dynamic_face_connectivity.heap_memory_in_bytes(); - bytes += m_dynamic_element_connectivity.heap_memory_in_bytes(); - bytes += m_dynamic_other_connectivity.heap_memory_in_bytes(); - return bytes; -} - -void Bucket::change_existing_connectivity(unsigned bucket_ordinal, stk::mesh::Entity* new_nodes) +void Bucket::change_connected_nodes(unsigned bucket_ordinal, stk::mesh::Entity* new_nodes) { - unsigned num_nodes = this->num_nodes(bucket_ordinal); - Entity *nodes=0; - if (m_node_kind == FIXED_CONNECTIVITY) - { - nodes = m_fixed_node_connectivity.begin(bucket_ordinal); - } - else - { - nodes = m_dynamic_node_connectivity.begin(bucket_ordinal); - } - - for (unsigned i=0;i stk::topology::NODE_RANK && + entity_rank() <= stk::topology::ELEM_RANK) { + const unsigned numNodes = m_topology.num_nodes(); + ThrowRequireMsg(m_node_kind == FIXED_CONNECTIVITY, "Bucket topo="< 0 && fromNumNodes == numNodes) { + const Entity* entityNodes = from_bucket.begin_nodes(from_ordinal); + if (m_topology == stk::topology::INVALID_TOPOLOGY || from_bucket.topology() == stk::topology::INVALID_TOPOLOGY) { + const ConnectivityOrdinal* ords = from_bucket.begin_node_ordinals(from_ordinal); + for(unsigned i=0; imesh().add_entity_callback(entity_rank(), bucket_id(), m_size); ++m_size; - - AddEntityFunctor functor; - process_all_connectivity(functor); } bool Bucket::destroy_relation(Entity e_from, Entity e_to, const RelationIdentifier local_id ) { - const unsigned from_bucket_ordinal = mesh().bucket_ordinal(e_from); - DestroyRelationFunctor functor(from_bucket_ordinal, e_to, static_cast(local_id)); - modify_connectivity(functor, m_mesh.entity_rank(e_to)); + EntityRank toRank = mesh().entity_rank(e_to); + if (toRank != stk::topology::NODE_RANK) { + EntityRank fromRank = mesh().entity_rank(e_from); + return m_sparse_connectivity.remove_connectivity(fromRank, e_from, toRank, e_to, local_id); + } + + Bucket& fromBucket = mesh().bucket(e_from); + if (fromBucket.bucket_id() != bucket_id()) { + return fromBucket.destroy_relation(e_from, e_to, local_id); + } - return functor.m_modified; + const unsigned from_bucket_ordinal = mesh().bucket_ordinal(e_from); + + CONN_TYPE(m_node_kind, m_topoNodes.set_connected_node(from_bucket_ordinal, Entity(), local_id), m_sparseNodes.set_connected_node(from_bucket_ordinal, Entity(), local_id)); + return true; } bool Bucket::declare_relation(unsigned bucket_ordinal, Entity e_to, const ConnectivityOrdinal ordinal, Permutation permutation ) { - DeclareRelationFunctor functor(bucket_ordinal, e_to, ordinal, permutation); - modify_connectivity(functor, m_mesh.entity_rank(e_to)); + EntityRank toRank = mesh().entity_rank(e_to); + if (toRank == stk::topology::NODE_RANK) { + return (m_node_kind==FIXED_CONNECTIVITY ? m_topoNodes.set_connected_node(bucket_ordinal, e_to, ordinal) : m_sparseNodes.reset_connected_node(bucket_ordinal, e_to, ordinal)); + } - return functor.m_modified; + return m_sparse_connectivity.add_connectivity(entity_rank(), m_entities[bucket_ordinal], + toRank, e_to, ordinal, permutation); } void Bucket::remove_entity() @@ -722,9 +522,6 @@ void Bucket::remove_entity() --m_size; initialize_slot(m_size, Entity()); - - RemoveEntityFunctor functor; - process_all_connectivity(functor); } void Bucket::copy_entity(Entity entity) @@ -737,73 +534,11 @@ void Bucket::copy_entity(Entity entity) ThrowAssert(mesh().entity_rank(entity) == m_entity_rank); mark_for_modification(); - Bucket* old_bucket = mesh().bucket_ptr(entity); - const unsigned old_ordinal = mesh().bucket_ordinal(entity); this->mesh().add_entity_callback(this->entity_rank(), this->bucket_id(), m_size); reset_entity_location(entity, m_size); ++m_size; - - // Unfortunately, we had to copy/paste modify_connectivity to allow dynamic->fixed moves. The - // modify_connectivity framework couldn't elegantly handle this case. - switch(m_node_kind) { - case FIXED_CONNECTIVITY: - if (old_bucket->m_node_kind == FIXED_CONNECTIVITY) { - old_bucket->m_fixed_node_connectivity.copy_entity(old_ordinal, m_fixed_node_connectivity); - } - else { - ThrowAssert(old_bucket->m_node_kind != INVALID_CONNECTIVITY_TYPE); - old_bucket->m_dynamic_node_connectivity.copy_to_fixed(old_ordinal, m_fixed_node_connectivity); - } - break; - case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_node_connectivity.copy_entity(old_ordinal, m_dynamic_node_connectivity); break; - default: break; - } - - switch(m_edge_kind) { - case FIXED_CONNECTIVITY: - if (old_bucket->m_edge_kind == FIXED_CONNECTIVITY) { - old_bucket->m_fixed_edge_connectivity.copy_entity(old_ordinal, m_fixed_edge_connectivity); - } - else { - ThrowAssert(old_bucket->m_edge_kind != INVALID_CONNECTIVITY_TYPE); - old_bucket->m_dynamic_edge_connectivity.copy_to_fixed(old_ordinal, m_fixed_edge_connectivity); - } - break; - case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_edge_connectivity.copy_entity(old_ordinal, m_dynamic_edge_connectivity); break; - default: break; - } - - switch(m_face_kind) { - case FIXED_CONNECTIVITY: - if (old_bucket->m_face_kind == FIXED_CONNECTIVITY) { - old_bucket->m_fixed_face_connectivity.copy_entity(old_ordinal, m_fixed_face_connectivity); - } - else { - ThrowAssert(old_bucket->m_face_kind != INVALID_CONNECTIVITY_TYPE); - old_bucket->m_dynamic_face_connectivity.copy_to_fixed(old_ordinal, m_fixed_face_connectivity); - } - break; - case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_face_connectivity.copy_entity(old_ordinal, m_dynamic_face_connectivity); break; - default: break; - } - - switch(m_element_kind) { - case FIXED_CONNECTIVITY: - if (old_bucket->m_element_kind == FIXED_CONNECTIVITY) { - old_bucket->m_fixed_element_connectivity.copy_entity(old_ordinal, m_fixed_element_connectivity); - } - else { - ThrowAssert(old_bucket->m_element_kind != INVALID_CONNECTIVITY_TYPE); - old_bucket->m_dynamic_element_connectivity.copy_to_fixed(old_ordinal, m_fixed_element_connectivity); - } - break; - case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_element_connectivity.copy_entity(old_ordinal, m_dynamic_element_connectivity); break; - default: break; - } - - old_bucket->m_dynamic_other_connectivity.copy_entity(old_ordinal, m_dynamic_other_connectivity); } void Bucket::overwrite_entity(unsigned to_ordinal, Entity entity, const FieldVector* fields) @@ -813,11 +548,7 @@ void Bucket::overwrite_entity(unsigned to_ordinal, Entity entity, const FieldVec ThrowAssert(mesh().bucket_ptr(entity) != nullptr); ThrowAssert(mesh().entity_rank(entity) == m_entity_rank); - const MeshIndex from_index = m_mesh.mesh_index(entity); reset_entity_location(entity, to_ordinal, fields); - - impl::OverwriteEntityFunctor functor(from_index.bucket_ordinal, to_ordinal); - process_all_connectivity(functor, from_index.bucket); } @@ -838,96 +569,5 @@ void Bucket::parent_topology( EntityRank parent_rank, std::vector stk::util::sort_and_unique(parent_topologies); } -void Bucket::check_size_invariant() const -{ -#ifndef NDEBUG -// for (size_t i = 0; i < m_entities.size(); ++i) { -// if (i < m_size) { -// ThrowAssert(mesh().is_valid(m_entities[i])); -// } -// else { -// ThrowAssert(!mesh().is_valid(m_entities[i])); -// } -// } - - CheckSizeFunctor functor; - const_cast(this)->process_all_connectivity(functor); -#endif -} - -void Bucket::debug_dump(std::ostream& out, unsigned ordinal) const -{ - DebugPrintFunctor functor(out, ordinal); - const_cast(this)->process_all_connectivity(functor); -} - -void Bucket::debug_check_for_invalid_connectivity_request(ConnectivityType const* type) const -{ -#ifndef NDEBUG - EntityRank rank = stk::topology::END_RANK; - if (type == &m_node_kind) { - rank = stk::topology::NODE_RANK; - } - else if (type == &m_edge_kind) { - rank = stk::topology::EDGE_RANK; - } - else if (type == &m_face_kind) { - rank = stk::topology::FACE_RANK; - } - else if (type == &m_element_kind) { - rank = stk::topology::ELEMENT_RANK; - } - else { - ThrowAssert(false); - } - // Asking for connectivity between entities of equal rank is always invalid and ok to ask for - // Asking for connectivity between for FACE_RANK in 2d is always invalid and ok to ask for - bool isThisEntityAskingForConnectivityToItsOwnRank = entity_rank() == rank; - bool isThisEntityAskingForFaceConnectivityOnTwoDimensionalMesh = rank == stk::topology::FACE_RANK && mesh().mesh_meta_data().spatial_dimension() == 2; - ThrowAssert( isThisEntityAskingForConnectivityToItsOwnRank || isThisEntityAskingForFaceConnectivityOnTwoDimensionalMesh); -#endif -} - -namespace impl { - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_fixed_node_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_fixed_edge_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_fixed_face_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_fixed_element_connectivity; } - - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_dynamic_node_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_dynamic_edge_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_dynamic_face_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_dynamic_element_connectivity; } - -template <> -impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) -{ return other_bucket->m_dynamic_other_connectivity; } - -} - } // namespace mesh } // namespace stk diff --git a/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp b/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp index c22360e04b29..5a4b3966bd6f 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp @@ -38,10 +38,12 @@ #include // for size_t, NULL #include // for lower_bound #include // for ostream -#include // for BucketConnectivity #include // for Entity #include // for contains_ordinal, Part #include +#include +#include +#include #include // for topology, etc #include // for ThrowAssert, etc #include @@ -54,7 +56,6 @@ namespace stk { namespace mesh { class FieldBase; } } namespace stk { namespace mesh { class DeviceMesh; } } namespace stk { namespace mesh { namespace impl { class BucketRepository; } } } namespace stk { namespace mesh { namespace impl { class Partition; } } } -namespace stk { namespace mesh { namespace impl { struct OverwriteEntityFunctor; } } } namespace stk { namespace mesh { @@ -75,36 +76,28 @@ print( std::ostream & , const std::string & indent , const Bucket & ); // The part count and parts are equal bool raw_part_equal( const unsigned * lhs , const unsigned * rhs ); -#define CONNECTIVITY_TYPE_SWITCH(entity_kind, fixed_func_sig, dynamic_func_sig, check_invalid) \ - switch(entity_kind) { \ - case FIXED_CONNECTIVITY: \ - return fixed_func_sig; \ - case DYNAMIC_CONNECTIVITY: \ - return dynamic_func_sig; \ - default: \ - if (check_invalid) { \ - check_for_invalid_connectivity_request(&entity_kind); \ - } \ - return 0; \ - } +#define CONN_TYPE(conn_type, fixed_conn, sparse_conn) \ + ((conn_type == FIXED_CONNECTIVITY) ? fixed_conn : sparse_conn) -#define RANK_SWITCH(rank, begin_or_end, postfix, bucket_ordinal) \ +#define RANK_SWITCH(rank, begin_or_end, item_type, bucket_ordinal) \ \ - switch(rank) { \ - case stk::topology::NODE_RANK: return begin_or_end##_node##postfix(bucket_ordinal); \ - case stk::topology::EDGE_RANK: return begin_or_end##_edge##postfix(bucket_ordinal); \ - case stk::topology::FACE_RANK: return begin_or_end##_face##postfix(bucket_ordinal); \ - case stk::topology::ELEMENT_RANK: return begin_or_end##_element##postfix(bucket_ordinal); \ - default: \ - return begin_other##postfix(bucket_ordinal) + get_others_##begin_or_end##_index(bucket_ordinal, rank); \ + switch(rank) { \ + case stk::topology::NODE_RANK: \ + switch(m_node_kind) { \ + case FIXED_CONNECTIVITY: return m_topoNodes.begin_or_end##item_type(bucket_ordinal); \ + case DYNAMIC_CONNECTIVITY: return m_sparseNodes.begin_or_end##item_type(bucket_ordinal); \ + default: return nullptr; \ + } \ + default: \ + return m_sparse_connectivity.begin_or_end##item_type(m_entities[bucket_ordinal], rank); \ } //---------------------------------------------------------------------- -/** \brief A container for the connectivity for a homogeneous collection of +/** \brief A container for a homogeneous collection of * \ref stk::mesh::Entity "entities". * - * The entities are homogeneous in that they are of the same entity type - * and are members of the same of parts. + * The entities are homogeneous in that they are of the same rank and topology + * and are members of the same parts. */ class Bucket { @@ -134,8 +127,6 @@ class Bucket /** \brief Number of entities associated with this bucket */ size_type size() const { return m_size ; } - size_t memory_size_in_bytes() const; - /** \brief Capacity of this bucket */ size_t capacity() const { return m_capacity ; } @@ -212,87 +203,83 @@ class Bucket int parallel_owner_rank(unsigned ordinal) const; - void check_size_invariant() const; - //generic rank connectivity calls Entity const* begin(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, begin, s, bucket_ordinal) } + { RANK_SWITCH(rank, begin, _connectivity, bucket_ordinal) } ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal, EntityRank rank) const { RANK_SWITCH(rank, begin, _ordinals, bucket_ordinal) } Permutation const* begin_permutations(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, begin, _permutations, bucket_ordinal) } + { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], rank); } Entity const* end(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, end, s, bucket_ordinal) } + { RANK_SWITCH(rank, end, _connectivity, bucket_ordinal) } ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal, EntityRank rank) const { RANK_SWITCH(rank, end, _ordinals, bucket_ordinal) } Permutation const* end_permutations(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, end, _permutations, bucket_ordinal) } + { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], rank); } unsigned num_connectivity(unsigned bucket_ordinal, EntityRank rank) const; Entity const* begin_nodes(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin(bucket_ordinal), m_dynamic_node_connectivity.begin(bucket_ordinal), true) } + { return CONN_TYPE(m_node_kind, m_topoNodes.begin_connectivity(bucket_ordinal), m_sparseNodes.begin_connectivity(bucket_ordinal)); } Entity const* begin_edges(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin(bucket_ordinal), m_dynamic_edge_connectivity.begin(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } Entity const* begin_faces(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin(bucket_ordinal), m_dynamic_face_connectivity.begin(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } Entity const* begin_elements(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin(bucket_ordinal), m_dynamic_element_connectivity.begin(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } ConnectivityOrdinal const* begin_node_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_node_connectivity.begin_ordinals(bucket_ordinal), true) } + { return CONN_TYPE(m_node_kind, m_topoNodes.begin_ordinals(bucket_ordinal), m_sparseNodes.begin_ordinals(bucket_ordinal)); } ConnectivityOrdinal const* begin_edge_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_edge_connectivity.begin_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } ConnectivityOrdinal const* begin_face_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_face_connectivity.begin_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } ConnectivityOrdinal const* begin_element_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_element_connectivity.begin_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } - Permutation const* begin_node_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin_permutations(bucket_ordinal), m_dynamic_node_connectivity.begin_permutations(bucket_ordinal), true) } + Permutation const* begin_node_permutations(unsigned bucket_ordinal) const { return nullptr; } Permutation const* begin_edge_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin_permutations(bucket_ordinal), m_dynamic_edge_connectivity.begin_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } Permutation const* begin_face_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin_permutations(bucket_ordinal), m_dynamic_face_connectivity.begin_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } Permutation const* begin_element_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin_permutations(bucket_ordinal), m_dynamic_element_connectivity.begin_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } unsigned num_nodes(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.num_connectivity(bucket_ordinal), m_dynamic_node_connectivity.num_connectivity(bucket_ordinal), false) } + { return CONN_TYPE(m_node_kind, m_topoNodes.num_nodes_per_entity(bucket_ordinal), m_sparseNodes.num_nodes_per_entity(bucket_ordinal)); } unsigned num_edges(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.num_connectivity(bucket_ordinal), m_dynamic_edge_connectivity.num_connectivity(bucket_ordinal), false) } + { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } unsigned num_faces(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.num_connectivity(bucket_ordinal), m_dynamic_face_connectivity.num_connectivity(bucket_ordinal), false) } + { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } unsigned num_elements(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.num_connectivity(bucket_ordinal), m_dynamic_element_connectivity.num_connectivity(bucket_ordinal), false) } + { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } Entity const* end_nodes(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end(bucket_ordinal), m_dynamic_node_connectivity.end(bucket_ordinal), true) } + { return CONN_TYPE(m_node_kind, m_topoNodes.end_connectivity(bucket_ordinal), m_sparseNodes.end_connectivity(bucket_ordinal)); } Entity const* end_edges(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end(bucket_ordinal), m_dynamic_edge_connectivity.end(bucket_ordinal), true) } + { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } Entity const* end_faces(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end(bucket_ordinal), m_dynamic_face_connectivity.end(bucket_ordinal), true) } + { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } Entity const* end_elements(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end(bucket_ordinal), m_dynamic_element_connectivity.end(bucket_ordinal), true) } + { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } ConnectivityOrdinal const* end_node_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end_ordinals(bucket_ordinal), m_dynamic_node_connectivity.end_ordinals(bucket_ordinal), true) } + { return CONN_TYPE(m_node_kind, m_topoNodes.end_ordinals(bucket_ordinal), m_sparseNodes.end_ordinals(bucket_ordinal)); } ConnectivityOrdinal const* end_edge_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end_ordinals(bucket_ordinal), m_dynamic_edge_connectivity.end_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } ConnectivityOrdinal const* end_face_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end_ordinals(bucket_ordinal), m_dynamic_face_connectivity.end_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } ConnectivityOrdinal const* end_element_ordinals(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end_ordinals(bucket_ordinal), m_dynamic_element_connectivity.end_ordinals(bucket_ordinal), true) } + { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } - Permutation const* end_node_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end_permutations(bucket_ordinal), m_dynamic_node_connectivity.end_permutations(bucket_ordinal), true) } + Permutation const* end_node_permutations(unsigned bucket_ordinal) const { return nullptr; } Permutation const* end_edge_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end_permutations(bucket_ordinal), m_dynamic_edge_connectivity.end_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } Permutation const* end_face_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end_permutations(bucket_ordinal), m_dynamic_face_connectivity.end_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } Permutation const* end_element_permutations(unsigned bucket_ordinal) const - { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end_permutations(bucket_ordinal), m_dynamic_element_connectivity.end_permutations(bucket_ordinal), true) } + { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } bool has_permutation(EntityRank rank) const; @@ -304,7 +291,9 @@ class Bucket using ConnectedOrdinals = util::StridedArray; using Permutations = util::StridedArray; - unsigned get_num_nodes_per_entity() const { return topology().num_nodes(); } +#ifndef STK_HIDE_DEPRECATED_CODE // Delete after November 2021 + STK_DEPRECATED unsigned get_num_nodes_per_entity() const { return topology().num_nodes(); } +#endif ConnectedEntities get_connected_entities(unsigned offsetIntoBucket, stk::mesh::EntityRank connectedRank) const { return ConnectedEntities(begin(offsetIntoBucket, connectedRank), @@ -347,44 +336,17 @@ class Bucket void reset_bucket_parts(const OrdinalVector& newPartOrdinals); protected: - void change_existing_connectivity(unsigned bucket_ordinal, stk::mesh::Entity* new_nodes); - void change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, unsigned elem_connectivity_ordinal, stk::mesh::Permutation permut); - void change_existing_permutation_for_connected_edge(unsigned bucket_ordinal_of_higher_ranked_entity, unsigned edge_connectivity_ordinal, stk::mesh::Permutation permut); - void change_existing_permutation_for_connected_face(unsigned bucket_ordinal_of_higher_ranked_entity, unsigned face_connectivity_ordinal, stk::mesh::Permutation permut); + void change_connected_nodes(unsigned bucket_ordinal, Entity* new_nodes); + void change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, ConnectivityOrdinal elem_connectivity_ordinal, Permutation permut); + void change_existing_permutation_for_connected_edge(unsigned bucket_ordinal_of_higher_ranked_entity, ConnectivityOrdinal edge_connectivity_ordinal, Permutation permut); + void change_existing_permutation_for_connected_face(unsigned bucket_ordinal_of_higher_ranked_entity, ConnectivityOrdinal face_connectivity_ordinal, Permutation permut); virtual ~Bucket(); -private: - +protected: bool destroy_relation(Entity e_from, Entity e_to, const RelationIdentifier local_id ); bool declare_relation(unsigned bucket_ordinal, Entity e_to, const ConnectivityOrdinal ordinal, Permutation permutation); - // The following *_other* functions should not be made available externally, in - // order to avoid external confusion with "constraint" and "other" connectivities. - // They are currently used within this class to provide connectivities - // externally through another interface. - Entity const* begin_others(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.begin(bucket_ordinal); - } - ConnectivityOrdinal const* begin_other_ordinals(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.begin_ordinals(bucket_ordinal); - } - Permutation const* begin_other_permutations(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.begin_permutations(bucket_ordinal); - } - unsigned num_other(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.num_connectivity(bucket_ordinal); - } - Entity const* end_others(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.end(bucket_ordinal); - } - ConnectivityOrdinal const* end_other_ordinals(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.end_ordinals(bucket_ordinal); - } - Permutation const* end_other_permutations(unsigned bucket_ordinal) const { - return m_dynamic_other_connectivity.end_permutations(bucket_ordinal); - } - void supersets( PartVector & ) const ; /** \brief The \ref stk::mesh::BulkData "bulk data manager" @@ -441,65 +403,34 @@ class Bucket // Optional fields argument, only copy listed fields void reset_entity_location(Entity entity, unsigned to_ordinal, const std::vector* fields = nullptr); - unsigned get_others_begin_index(unsigned bucket_ordinal, EntityRank rank) const; - unsigned get_others_end_index(unsigned bucket_ordinal, EntityRank rank) const; - unsigned get_others_index_count(unsigned bucket_ordinal, EntityRank rank) const; - - template - void modify_connectivity(T& callable, EntityRank rank); - - template - void process_all_connectivity(T& callable, Bucket* other_bucket = nullptr); - - void check_for_invalid_connectivity_request(ConnectivityType const* type) const - { -#ifndef NDEBUG - debug_check_for_invalid_connectivity_request(type); -#endif - } - - void debug_check_for_invalid_connectivity_request(ConnectivityType const* type) const; - - friend class impl::BucketRepository; + friend class BulkData; friend class impl::Partition; - friend struct impl::OverwriteEntityFunctor; - friend class BulkData; // Replacement friend. - friend struct Entity; + friend class impl::BucketRepository; friend class DeviceMesh; BulkData & m_mesh ; // Where this bucket resides + SparseConnectivity & m_sparse_connectivity; const EntityRank m_entity_rank ; // Type of entities for this bucket - stk::topology m_topology ; // The topology of this bucket std::vector m_key ; // REFACTOR std::pair m_partOrdsBeginEnd; + stk::topology m_topology ; // The topology of this bucket const size_t m_capacity ; // Capacity for entities size_type m_size ; // Number of entities - unsigned m_bucket_id; // Index into its BucketRepository's m_bucket[entity_rank()], these are NOT unique + unsigned m_bucket_id; unsigned m_ngp_bucket_id; bool m_is_modified; PartVector m_parts; // Entity data - std::vector m_entities; // Array of entity handles; will be removed soon + std::vector m_entities; impl::Partition *m_partition; ConnectivityType m_node_kind; ConnectivityType m_edge_kind; ConnectivityType m_face_kind; - ConnectivityType m_element_kind; - - impl::BucketConnectivity m_fixed_node_connectivity; // fixed connectivity to nodes - impl::BucketConnectivity m_fixed_edge_connectivity; // fixed connectivity to edges - impl::BucketConnectivity m_fixed_face_connectivity; // fixed connectivity to faces - impl::BucketConnectivity m_fixed_element_connectivity; // fixed connectivity to elements - - impl::BucketConnectivity m_dynamic_node_connectivity; // dynamic connectivity to nodes - impl::BucketConnectivity m_dynamic_edge_connectivity; // dynamic connectivity to edges - impl::BucketConnectivity m_dynamic_face_connectivity; // dynamic connectivity to faces - impl::BucketConnectivity m_dynamic_element_connectivity; // dynamic connectivity to elements - - impl::BucketConnectivity m_dynamic_other_connectivity; // dynamic connectivity to everything else + ConnectedTopologyNodes m_topoNodes; + ConnectedSparseNodes m_sparseNodes; bool m_owned; bool m_shared; @@ -508,8 +439,6 @@ class Bucket std::vector m_ngp_field_bucket_id; std::vector m_ngp_field_is_modified; }; -#undef CONNECTIVITY_TYPE_SWITCH -#undef RANK_SWITCH /** \brief Is this bucket a subset of the given * \ref stk::mesh::Part "part" by partID @@ -590,31 +519,16 @@ inline unsigned Bucket::num_connectivity(unsigned bucket_ordinal, EntityRank rank) const { switch(rank) { - case stk::topology::NODE_RANK: return num_nodes(bucket_ordinal); - case stk::topology::EDGE_RANK: return num_edges(bucket_ordinal); - case stk::topology::FACE_RANK: return num_faces(bucket_ordinal); - case stk::topology::ELEMENT_RANK: return num_elements(bucket_ordinal); + case stk::topology::NODE_RANK: return num_nodes(bucket_ordinal); default: - return get_others_index_count(bucket_ordinal, rank); + return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], rank); } } inline bool Bucket::has_permutation(EntityRank rank) const { - switch(rank) { - case stk::topology::NODE_RANK: - return m_node_kind == FIXED_CONNECTIVITY ? m_fixed_node_connectivity.has_permutation() : m_dynamic_node_connectivity.has_permutation(); - case stk::topology::EDGE_RANK: - return m_edge_kind == FIXED_CONNECTIVITY ? m_fixed_edge_connectivity.has_permutation() : m_dynamic_edge_connectivity.has_permutation(); - case stk::topology::FACE_RANK: - return m_face_kind == FIXED_CONNECTIVITY ? m_fixed_face_connectivity.has_permutation() : m_dynamic_face_connectivity.has_permutation(); - case stk::topology::ELEMENT_RANK: - return m_element_kind == FIXED_CONNECTIVITY ? m_fixed_element_connectivity.has_permutation() : m_dynamic_element_connectivity.has_permutation(); - case stk::topology::CONSTRAINT_RANK: - default: - return false; - } + return SparseConnectivity::has_permutation(entity_rank(), rank); } inline @@ -627,106 +541,15 @@ ConnectivityType Bucket::connectivity_type(EntityRank rank) const return m_edge_kind; case stk::topology::FACE_RANK: return m_face_kind; - case stk::topology::ELEMENT_RANK: - return m_element_kind; default: return DYNAMIC_CONNECTIVITY; } } -template -inline -void Bucket::process_all_connectivity(T& callable, Bucket* other_bucket) -{ - if (callable.is_modifying()) { - mark_for_modification(); - } - - switch(m_node_kind) { - case FIXED_CONNECTIVITY: - callable.template operator()(*this, m_fixed_node_connectivity, other_bucket); break; - case DYNAMIC_CONNECTIVITY: - callable.template operator()(*this, m_dynamic_node_connectivity, other_bucket); break; - default: break; - } - - switch(m_edge_kind) { - case FIXED_CONNECTIVITY: - callable.template operator()(*this, m_fixed_edge_connectivity, other_bucket); break; - case DYNAMIC_CONNECTIVITY: - callable.template operator()(*this, m_dynamic_edge_connectivity, other_bucket); break; - default: break; - } - - switch(m_face_kind) { - case FIXED_CONNECTIVITY: - callable.template operator()(*this, m_fixed_face_connectivity, other_bucket); break; - case DYNAMIC_CONNECTIVITY: - callable.template operator()(*this, m_dynamic_face_connectivity, other_bucket); break; - default: break; - } - - switch(m_element_kind) { - case FIXED_CONNECTIVITY: - callable.template operator()(*this, m_fixed_element_connectivity, other_bucket); break; - case DYNAMIC_CONNECTIVITY: - callable.template operator()(*this, m_dynamic_element_connectivity, other_bucket); break; - default: break; - } - - callable.template operator()(*this, m_dynamic_other_connectivity, other_bucket); -} - -template -inline -void Bucket::modify_connectivity(T& callable, EntityRank rank) -{ - switch(rank) { - case stk::topology::NODE_RANK: - ThrowAssert(m_node_kind != INVALID_CONNECTIVITY_TYPE); - mark_for_modification(); - - switch(m_node_kind) { - case FIXED_CONNECTIVITY: callable(*this, m_fixed_node_connectivity); break; - case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_node_connectivity); break; - default: break; - } - break; - case stk::topology::EDGE_RANK: - ThrowAssert(m_edge_kind != INVALID_CONNECTIVITY_TYPE); - switch(m_edge_kind) { - case FIXED_CONNECTIVITY: callable(*this, m_fixed_edge_connectivity); break; - case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_edge_connectivity); break; - default: break; - } - break; - case stk::topology::FACE_RANK: - ThrowAssert(m_face_kind != INVALID_CONNECTIVITY_TYPE); - switch(m_face_kind) { - case FIXED_CONNECTIVITY: callable(*this, m_fixed_face_connectivity); break; - case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_face_connectivity); break; - default: break; - } - break; - case stk::topology::ELEMENT_RANK: - ThrowAssert(m_element_kind != INVALID_CONNECTIVITY_TYPE); - switch(m_element_kind) { - case FIXED_CONNECTIVITY: callable(*this, m_fixed_element_connectivity); break; - case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_element_connectivity); break; - default: break; - } - break; - default: - callable(*this, m_dynamic_other_connectivity); - break; - } -} - typedef Bucket::iterator BucketIterator; } // namespace mesh } // namespace stk - - #endif + diff --git a/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp b/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp deleted file mode 100644 index c5d6391af751..000000000000 --- a/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp +++ /dev/null @@ -1,1170 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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. -// - -#ifndef STK_MESH_BUCKET_CONNECTIVITY_HPP -#define STK_MESH_BUCKET_CONNECTIVITY_HPP - -#include "stk_mesh/base/Types.hpp" // for ConnectivityOrdinal, etc -#include // for Entity -#include "stk_util/util/ReportHandler.hpp" - -namespace stk { -namespace mesh { - -class BulkData; - -namespace impl { - -struct LowerConnectivityCompare -{ - bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const - { - // only compare ordinals - return first_ordinal < second_ordinal; - } -}; - -template -struct LowerConnectivitityRankSensitiveCompare -{ - LowerConnectivitityRankSensitiveCompare(const BULKDATA &bulk_data) : m_mesh(bulk_data) { } - - const BULKDATA &m_mesh; - - bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, - Entity second_entity, ConnectivityOrdinal second_ordinal) const; -}; - -struct HigherConnectivityCompare -{ - bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const - { - // Needs to match LessRelation in BulkData.hpp - return std::make_pair(first_ordinal, first_entity.is_local_offset_valid() ? first_entity.local_offset() : Entity::MaxEntity) < - std::make_pair(second_ordinal, second_entity.is_local_offset_valid() ? second_entity.local_offset() : Entity::MaxEntity); - } -}; - -template -struct HigherConnectivityRankSensitiveCompare -{ - HigherConnectivityRankSensitiveCompare(const BULKDATA &bulk_data) : m_mesh(bulk_data) { } - - const BULKDATA &m_mesh; - - bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, - ConnectivityOrdinal second_ordinal) const; -}; - -template -inline void check_bucket_ordinal(unsigned bucket_ordinal, Connectivity const* connectivity) -{ - ThrowAssertMsg(bucket_ordinal < connectivity->size(), - "bucket_ordinal " << bucket_ordinal << " is out of range, bucket size is " << connectivity->size()); -} - -template -class BucketConnectivity; - -template -size_t capacity_in_bytes(const VecType& v) -{ - return sizeof(typename VecType::value_type)*v.capacity(); -} - -template -class BucketConnectivity -{ - public: - typedef BucketConnectivity SelfType; - typedef BucketConnectivity OtherType; - - static const EntityRank target_rank = TargetRank; - static const ConnectivityType connectivity_type = FIXED_CONNECTIVITY; - - typedef std::vector EntityVector; - typedef std::vector ConnectivityOrdinalVector; - typedef std::vector PermutationVector; - - BucketConnectivity() //default constructed BucketConnectivity implies connectivity is not used - : m_num_connectivity(0u) - , m_targets() - , m_ordinals() - , m_permutations() - {} - - BucketConnectivity(unsigned arg_num_connectivity) - : m_num_connectivity(0) - , m_targets() - , m_ordinals() - , m_permutations() - { - set_num_connectivity(arg_num_connectivity); - } - - void set_num_connectivity(unsigned arg_num_connectivity) - { - ThrowAssertMsg(m_num_connectivity == 0, "Cannot reset num_connectivity"); - ThrowAssertMsg(arg_num_connectivity != 0, "Cannot set num connectivity to 0 for fixed connectivity"); - - m_num_connectivity = arg_num_connectivity; - - // Ordinal is the same for all fixed, just counts up - m_ordinals.resize(m_num_connectivity); - for (ConnectivityOrdinal ord=static_cast(0); ord < static_cast(m_num_connectivity); ++ord) { - m_ordinals[ord] = ord; - } - } - - // Entity iterator - - Entity const* begin(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[bucket_ordinal * m_num_connectivity]; } - - Entity * begin(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[bucket_ordinal * m_num_connectivity]; } - - Entity const* end(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[(bucket_ordinal + 1) * m_num_connectivity]; } - - Entity * end(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[(bucket_ordinal + 1) * m_num_connectivity]; } - - // Ordinal iterator - - ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return m_ordinals.data(); } - - ConnectivityOrdinal * begin_ordinals(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return m_ordinals.data(); } - - ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return m_ordinals.data() + m_num_connectivity; } - - ConnectivityOrdinal * end_ordinals(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return m_ordinals.data() + m_num_connectivity; } - - // Permutation iterator - - Permutation const* begin_permutations(unsigned bucket_ordinal) const - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[bucket_ordinal * m_num_connectivity]; - } - - Permutation * begin_permutations(unsigned bucket_ordinal) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[bucket_ordinal * m_num_connectivity]; - } - - Permutation const* end_permutations(unsigned bucket_ordinal) const - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[(bucket_ordinal + 1) * m_num_connectivity]; - } - - Permutation * end_permutations(unsigned bucket_ordinal) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[(bucket_ordinal + 1) * m_num_connectivity]; - } - - // Queries - - unsigned num_connectivity(unsigned /*bucket_ordinal*/) const - { return m_num_connectivity; } - - // return number of entities - unsigned size() const - { return m_targets.size() / m_num_connectivity; } - - // Modification API - - bool add_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation = INVALID_PERMUTATION) - { - ThrowAssertMsg(ordinal < m_num_connectivity, - "Ordinal " << (uint32_t)ordinal << " exceeds topological limit: " << m_num_connectivity); - impl::check_bucket_ordinal(bucket_ordinal, this); -#ifndef NDEBUG - // TODO - Add topology invariant; target entity should match a sub topology -#endif - - unsigned index = m_num_connectivity*bucket_ordinal + ordinal; - - if (m_targets[index] == to) { - ThrowAssert(!has_permutation() || m_permutations[index] == permutation); - // Already exists - return false; - } - - m_targets[index] = to; - - if (has_permutation()) { - m_permutations[index] = permutation; - } - - return true; - } - - bool remove_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) - { - ThrowAssertMsg(ordinal < m_num_connectivity, - "Ordinal " << (uint32_t)ordinal << " exceeds topological limit: " << m_num_connectivity); - impl::check_bucket_ordinal(bucket_ordinal, this); - - unsigned index = m_num_connectivity*bucket_ordinal + ordinal; - if (m_targets[index] != to) { - return false; - } - - // Clear - m_targets[index] = Entity(); - if (has_permutation()) { - m_permutations[index] = INVALID_PERMUTATION; - } - - return true; - } - - void begin_modification() - {} - - template // hack to get around dependency - void end_modification(BULKDATA* mesh = NULL); - - void add_entity() - { - const unsigned new_conn_size = m_targets.size() + m_num_connectivity; - Entity invalid; - m_targets.resize(new_conn_size, invalid); // Not a perf issue: vectors are smart when resizing - if (has_permutation()) { - m_permutations.resize(new_conn_size, INVALID_PERMUTATION); - } - } - - // Always removes last entity - void remove_entity() - { - ThrowAssertMsg(size() > 0, "Cannot remove, connectivity is already empty"); - - const unsigned new_conn_size = m_targets.size() - m_num_connectivity; - m_targets.resize(new_conn_size); - if (has_permutation()) { - m_permutations.resize(new_conn_size); - } - } - - void copy_entity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal=-1u) - { - ThrowAssertMsg(size() > 0, "Cannot move, connectivity is empty"); - - if (to_ordinal == -1u) { // check if we should just append - to_ordinal = to.size(); - to.add_entity(); // make room for new entity - } - - // Copy connectivity to other BucketConnectivity - copy_connectivity(from_ordinal, to, to_ordinal); - } - - void copy_to_fixed(unsigned from_ordinal, SelfType& to) - { ThrowAssert(false); } - - void copy_to_fixed(unsigned from_ordinal, OtherType& to) - { ThrowAssert(false); } - - bool has_permutation() const - { - const static bool rv = TargetRank != stk::topology::NODE_RANK; - return rv; - } - - size_t heap_memory_in_bytes() const - { - return capacity_in_bytes(m_targets) - + capacity_in_bytes(m_ordinals) - + capacity_in_bytes(m_permutations); - } - - void debug_dump(std::ostream& out) const - { - out << "For fixed connectivity to rank: " << TargetRank << "\n"; - out << " size is: " << size() << "\n"; - for (int i = 0, ie = size(); i < ie; ++i) { - out << " At ordinal " << i << "\n"; - debug_dump(out, i); - } - out << std::endl; - } - - void debug_dump(std::ostream& out, unsigned ordinal) const - { - for (int j = m_num_connectivity * ordinal, je = m_num_connectivity*(ordinal+1); j < je; ++j) { - out << " target:" << m_targets[j].local_offset() << "\n"; - } - } - -private: - - void copy_connectivity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal) - { - unsigned to_offset = to_ordinal * m_num_connectivity; - unsigned from_offset = from_ordinal * m_num_connectivity; - - std::copy(m_targets.begin() + from_offset, - m_targets.begin() + from_offset + m_num_connectivity, - to.m_targets.begin() + to_offset); - - if (has_permutation()) { - std::copy(m_permutations.begin() + from_offset, - m_permutations.begin() + from_offset + m_num_connectivity, - to.m_permutations.begin() + to_offset); - } - } - - // Illegal - BucketConnectivity(const SelfType&); - SelfType& operator=(const SelfType&); - - // MEMBERS - - unsigned m_num_connectivity; - - // connectivity data - EntityVector m_targets; - ConnectivityOrdinalVector m_ordinals; // shared for all entities - PermutationVector m_permutations; - - // friend OtherType; // 1337! Will have to wait for c++11 - friend class BucketConnectivity; -}; - -// Want a way for all dynamic connectivity instantiations to share the same id space -struct Counter -{ - static int counter; -}; - -// Profiling data for an individual dynamic connectivity object -struct DynConnData -{ - // from-rank for the associated dynamic connectivity - EntityRank m_from_rank; - - // to-rank for the associated dynamic connectivity - EntityRank m_to_rank; - - // the maximum capacity ever achieved by connectivity vectors - size_t m_max_capacity; - - // at the point at which maximum capacity (member above) was achieved, how much memory - // was lost due to "abandoned space". - // "abandoned space" - When an entity overflows its current chunks, it gets additional - // chunks but must be copied to the end. The space left behind is abandoned and will - // not be reused until the next compress (resize_and_order_by_index). - size_t m_abandoned_space; - - // at the point at which maximum capacity (member above) was achieved, how much memory - // was lost due to unused chunk capacity. If chunk size is > 1, it's possible that an - // entity is not using all the space available in it's chunk. For example, if chunk size - // is 8 and an entity has 5 connectivities, then unused chunk capacity is 3 for that - // entity. This member stores the sum over all entities. - size_t m_unused_chunk_capacity; - - // The number of times this dynamic connectivity had to be grown - size_t m_num_growths; - - // The number of times any entity overflowed it's chunk allocation and had to be - // copied to the end - size_t m_num_entity_relocations; - - // at the point at which maximum capacity (member above) was achieved, what is the - // total amount of wasted memory - size_t m_total_unused_memory; - - // at the point at which maximum capacity (member above) was achieved, what is the - // amount of memory that is wasted due to vector capacity growth over-provisioning. - size_t m_unused_capacity; - - // at the point at which maximum capacity (member above) was achieved, what is the - // number of connectivity being stored. - size_t m_total_num_conn; - - DynConnData(EntityRank from_rank, EntityRank to_rank) : - m_from_rank(from_rank), - m_to_rank(to_rank), - m_max_capacity(0), - m_abandoned_space(0), - m_unused_chunk_capacity(0), - m_num_growths(0), - m_num_entity_relocations(0), - m_total_unused_memory(0), - m_unused_capacity(0), - m_total_num_conn(0) - {} -}; - -template -class BucketConnectivity -{ - enum connectivity_direction { Lower=0,Higher=1,Adjacent=2 }; - -public: - typedef BucketConnectivity SelfType; - typedef BucketConnectivity OtherType; - - static const EntityRank target_rank = TargetRank; - static const ConnectivityType connectivity_type = DYNAMIC_CONNECTIVITY; - - typedef std::vector EntityVector; - typedef std::vector ConnectivityOrdinalVector; - typedef std::vector PermutationVector; - typedef std::vector UInt32Vector; - typedef std::vector UInt16Vector; - - static const unsigned chunk_size = 1u; - - BucketConnectivity(EntityRank from_rank, BulkData *bulk_data) - : m_from_rank(from_rank) - , m_direction( (m_from_rank > TargetRank) ? Lower : ((m_from_rank == TargetRank) ? Adjacent : Higher)) - , m_active(false) - , m_needs_shrink_to_fit(false) - , m_num_inactive(0) - , m_indices() - , m_num_connectivities() - , m_total_connectivities(0) - , m_targets() - , m_ordinals() - , m_permutations() - , m_bulk_data(bulk_data) - , m_id(Counter::counter++) - , m_rank_sensitive_higher_connectivity_cmp(*m_bulk_data) - , m_rank_sensitive_lower_connectivity_cmp(*m_bulk_data) - , m_last_capacity(0) - { - } - - // Entity iterator - - Entity const* begin(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[m_active ? m_indices[bucket_ordinal] : 0]; } - - Entity * begin(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_targets[m_active ? m_indices[bucket_ordinal] : 0]; } - - Entity const* end(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return begin(bucket_ordinal) + num_connectivity(bucket_ordinal); } - - Entity * end(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return begin(bucket_ordinal) + num_connectivity(bucket_ordinal); } - - // Ordinal iterator - - ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_ordinals[m_active ? m_indices[bucket_ordinal] : 0]; } - - ConnectivityOrdinal * begin_ordinals(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return &m_ordinals[m_active ? m_indices[bucket_ordinal] : 0]; } - - ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return begin_ordinals(bucket_ordinal) + num_connectivity(bucket_ordinal); } - - ConnectivityOrdinal * end_ordinals(unsigned bucket_ordinal) - { impl::check_bucket_ordinal(bucket_ordinal, this); - return begin_ordinals(bucket_ordinal) + num_connectivity(bucket_ordinal); } - - // Permutation iterator - - Permutation const* begin_permutations(unsigned bucket_ordinal) const - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[m_active ? m_indices[bucket_ordinal] : 0]; - } - - Permutation * begin_permutations(unsigned bucket_ordinal) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return &m_permutations[m_active ? m_indices[bucket_ordinal] : 0]; - } - - Permutation const* end_permutations(unsigned bucket_ordinal) const - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return begin_permutations(bucket_ordinal) + num_connectivity(bucket_ordinal); - } - - Permutation * end_permutations(unsigned bucket_ordinal) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - if (!has_permutation()) return NULL; - return begin_permutations(bucket_ordinal) + num_connectivity(bucket_ordinal); - } - - // Queries - - unsigned num_connectivity(unsigned bucket_ordinal) const - { impl::check_bucket_ordinal(bucket_ordinal, this); - return m_active ? m_num_connectivities[bucket_ordinal] : 0; } - - // return number of entities - unsigned size() const - { return m_active ? m_indices.size() : m_num_inactive; } - - // Modification API - - bool add_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation = INVALID_PERMUTATION) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - - m_needs_shrink_to_fit = true; - - if (!m_active) { - activate(); - } - - if (target_rank <= stk::topology::ELEMENT_RANK) { - switch(m_direction) - { - case Lower: return add_helper(bucket_ordinal, to, ordinal, permutation, LowerConnectivityCompare()); - case Higher: return add_helper(bucket_ordinal, to, ordinal, permutation, HigherConnectivityCompare()); - case Adjacent: return add_helper(bucket_ordinal, to, ordinal, permutation, LowerConnectivityCompare()); // same comparing as lower - default: - ThrowAssertMsg(false, "What type of connectivity are you trying to add? " << m_direction); - return false; - } - } - else { - switch(m_direction) - { - case Lower: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_lower_connectivity_cmp); - case Higher: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_higher_connectivity_cmp); - case Adjacent: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_lower_connectivity_cmp); - default: - ThrowAssertMsg(false, "What type of connectivity are you trying to add? " << m_direction); - return false; - } - } - } - - bool remove_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) - { - impl::check_bucket_ordinal(bucket_ordinal, this); - - if (!m_active) return false; - - uint32_t found_idx = ~0u; - const uint32_t end_i = m_indices[bucket_ordinal]+m_num_connectivities[bucket_ordinal]; - for (uint32_t i = m_indices[bucket_ordinal]; i < end_i; ++i) - { - //remove connectivity - if ( m_targets[i] == to && m_ordinals[i] == ordinal ) { - found_idx = i; - --m_num_connectivities[bucket_ordinal]; - --m_total_connectivities; - break; - } - } - - //slide memory down - if (found_idx != ~0u) { - m_needs_shrink_to_fit = true; - for (uint32_t i = found_idx; i < end_i - 1; ++i) { - m_targets[i] = m_targets[i+1]; - m_ordinals[i] = m_ordinals[i+1]; - if (has_permutation()) { - m_permutations[i] = m_permutations[i+1]; - } - } - } - - return found_idx != ~0u; - } - - void begin_modification() - {} - - template - void end_modification(BULKDATA* mesh = NULL); - - void add_entity() - { - if (m_active) { - m_indices.push_back(m_targets.size()); - m_num_connectivities.push_back(0); - m_needs_shrink_to_fit = true; - } - else { - ++m_num_inactive; - } - } - - void remove_entity() - { - ThrowAssertMsg(size() > 0, "Cannot remove, connectivity is already empty"); - - if (m_active) { - m_indices.pop_back(); - m_total_connectivities -= m_num_connectivities.back(); - m_num_connectivities.pop_back(); - m_needs_shrink_to_fit = true; - } - else { - --m_num_inactive; - } - } - - void copy_entity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal=-1u) - { - ThrowAssert(m_from_rank == to.m_from_rank); - impl::check_bucket_ordinal(from_ordinal, this); - - if (to_ordinal == -1u) { - to_ordinal = to.size(); - to.add_entity(); - } - impl::check_bucket_ordinal(to_ordinal, &to); - - // Manage activation state - if (!m_active) { - if (to.m_active) { - to.m_total_connectivities -= to.m_num_connectivities[to_ordinal]; - to.m_num_connectivities[to_ordinal] = 0; - to.m_needs_shrink_to_fit = true; - } - return; - } - if (m_active && !to.m_active) { - to.activate(); - } - - // Copy data - if (&to == this) { - // easy - // note this implements swap semantics instead of copy, but this is necessary - // to avoid aliasing in certain situations when sorting Partitions - std::swap(m_indices[to_ordinal], m_indices[from_ordinal]); - std::swap(m_num_connectivities[to_ordinal], m_num_connectivities[from_ordinal]); - - m_needs_shrink_to_fit = true; - to.m_needs_shrink_to_fit = true; - } - else { - // much harder - const unsigned from_num = m_num_connectivities[from_ordinal]; - const unsigned to_num = to.m_num_connectivities[to_ordinal]; - const int delta_num = from_num - to_num; - if (delta_num > 0) { - // If adding additional connectivity, need to reserve space - to.add_connectivity_helper(to_ordinal, delta_num); - } - else { - to.m_num_connectivities[to_ordinal] = from_num; - to.m_total_connectivities += delta_num; - } - if (delta_num != 0) { - to.m_needs_shrink_to_fit = true; - } - copy_connectivity(from_ordinal, to, to_ordinal); - } - } - - void copy_to_fixed(unsigned from_ordinal, OtherType& to) - { - const unsigned num_conn_to_move = m_active ? m_num_connectivities[from_ordinal] : 0; - - ThrowAssert(OtherType::connectivity_type == FIXED_CONNECTIVITY); - ThrowAssertMsg(size() > 0, "Cannot move, connectivity is empty"); - ThrowAssertMsg(num_conn_to_move <= to.num_connectivity(666 /*any unsigned, doesn't matter*/), "Incompatible"); - - const unsigned to_offset = to.m_targets.size(); - to.add_entity(); // make room for new entity - - const unsigned from_offset = m_active ? m_indices[from_ordinal] : 0; - -#ifndef NDEBUG - // Check the ordinals are compatible with fixed connectivity - ConnectivityOrdinal const* ordinals = m_ordinals.data() + from_offset; - for (unsigned i = 0; i < num_conn_to_move; ++i) { - ThrowAssert(ordinals[i] == i); - } -#endif - - std::copy(m_targets.begin() + from_offset, - m_targets.begin() + from_offset + num_conn_to_move, - to.m_targets.begin() + to_offset); - - if (has_permutation()) { - std::copy(m_permutations.begin() + from_offset, - m_permutations.begin() + from_offset + num_conn_to_move, - to.m_permutations.begin() + to_offset); - } - } - - void copy_to_fixed(unsigned from_ordinal, SelfType& to) - { ThrowAssert(false); } - - bool has_permutation() const - { return does_rank_have_valid_permutations(TargetRank) && does_rank_have_valid_permutations(m_from_rank); } - - size_t heap_memory_in_bytes() const - { - return capacity_in_bytes(m_targets) - + capacity_in_bytes(m_ordinals) - + capacity_in_bytes(m_permutations); - } - - void debug_dump(std::ostream& out) const - { - out << "For dynamic connectivity to rank: " << TargetRank << ", with id: " << m_id << "\n"; - if (m_active) { - out << " size is: " << m_indices.size() << "\n"; - for (int i = 0, ie = m_indices.size(); i < ie; ++i) { - out << " At ordinal " << i << "\n"; - debug_dump(out, i, false); - } - out << std::endl; - } - else { - out << " size is: " << m_num_inactive << ", but inactive" << std::endl; - } - } - - void debug_dump(std::ostream& out, unsigned ordinal, bool add_context=true) const - { - if (m_active) { - int idx = m_indices[ordinal]; - int num = m_num_connectivities[ordinal]; - if (add_context) { - out << "For dynamic connectivity to rank: " << TargetRank << ", with id: " << m_id << "\n"; - } - out << " Index is: " << idx << ", Num is: " << num << "\n"; - for (int j = idx, je = idx + num; j < je; ++j) { - out << " (target:" << m_targets[j].local_offset() << ", ordinal:" << (uint32_t)m_ordinals[j] << ")\n"; - } - } - else { - out << " Index is: 0, Num is: 0\n"; - } - } - -private: - - bool does_rank_have_valid_permutations(stk::mesh::EntityRank rank) const - { - return rank > stk::topology::NODE_RANK && rank < stk::topology::CONSTRAINT_RANK; - } - - void copy_connectivity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal) - { - unsigned num_conn = m_num_connectivities[from_ordinal]; - unsigned to_offset = to.m_indices[to_ordinal]; - unsigned from_offset = m_indices[from_ordinal]; - ThrowAssert(to.m_num_connectivities[to_ordinal] == num_conn); - - std::copy(m_targets.begin() + from_offset, - m_targets.begin() + from_offset + num_conn, - to.m_targets.begin() + to_offset); - - std::copy(m_ordinals.begin() + from_offset, - m_ordinals.begin() + from_offset + num_conn, - to.m_ordinals.begin() + to_offset); - - if (has_permutation()) { - std::copy(m_permutations.begin() + from_offset, - m_permutations.begin() + from_offset + num_conn, - to.m_permutations.begin() + to_offset); - } - } - - static unsigned num_chunks(unsigned num) - { return (num + chunk_size -1)/chunk_size; } - - void activate() - { - ThrowAssert(!m_active); - - m_indices.resize(m_num_inactive, 0); - m_num_connectivities.resize(m_num_inactive, 0); - - m_active = true; - m_num_inactive = 0; - } - - template - void resize_and_order_by_index_helper(Vector & data, unsigned capacity, bool update_index = false) - { - Vector temp; - temp.reserve(capacity); - - uint32_t current_index=0; - for(size_t i=0, e=m_indices.size(); i 0 ? 2 * old_capacity : 8*chunk_size; - while (new_capacity < minimum_size) { - new_capacity *= 2; - } - return new_capacity; - } - - // The old capacity is at or above the threshold for being careful about growing - // the connectivity representation(and memory footprint). Only grow the capacity - // if compressing the representation will not yield sufficient unused capacity. - if (capacity_ratio * m_total_connectivities > old_capacity) - { - return 2 * old_capacity; - } - else - { - return old_capacity; - } - } - - void add_connectivity_helper(unsigned bucket_ordinal, unsigned num_to_add=1) - { - const unsigned chunks_needed_by_entity = num_chunks(m_num_connectivities[bucket_ordinal]+num_to_add); - const unsigned chunks_used_by_entity = num_chunks(m_num_connectivities[bucket_ordinal]); - - if (chunks_needed_by_entity == chunks_used_by_entity) - { - m_total_connectivities += num_to_add; - m_num_connectivities[bucket_ordinal] += num_to_add; - return; - } - - const unsigned chunks_available = num_chunks(m_targets.capacity() - m_targets.size()); - - if (chunks_available < chunks_needed_by_entity) - { - const unsigned new_capacity = compute_new_connectivity_capacity(m_targets.size() + chunks_needed_by_entity * chunk_size); - resize_and_order_by_index(new_capacity); - } - - const bool last_entity_by_index = (chunks_used_by_entity > 0) && - (m_indices[bucket_ordinal] + chunks_used_by_entity*chunk_size == m_targets.size()); - Entity invalid; - - //copy to end - if (!last_entity_by_index) - { - uint32_t new_index = static_cast(m_targets.size()); - - m_targets.insert(m_targets.end(), chunks_needed_by_entity*chunk_size, invalid); - std::copy(begin(bucket_ordinal), end(bucket_ordinal), m_targets.begin() + new_index); - - m_ordinals.insert(m_ordinals.end(), chunks_needed_by_entity*chunk_size, INVALID_CONNECTIVITY_ORDINAL); - std::copy(begin_ordinals(bucket_ordinal), end_ordinals(bucket_ordinal), m_ordinals.begin() + new_index); - - if (has_permutation()) { - m_permutations.insert(m_permutations.end(), chunks_needed_by_entity*chunk_size, INVALID_PERMUTATION); - std::copy(begin_permutations(bucket_ordinal), end_permutations(bucket_ordinal), m_permutations.begin() + new_index); - } - - m_indices[bucket_ordinal] = new_index; - } - //add new chunk to end - else { - const unsigned extra_chunks_needed = chunks_needed_by_entity - chunks_used_by_entity; - m_targets.insert(m_targets.end(), extra_chunks_needed*chunk_size, invalid); - m_ordinals.insert(m_ordinals.end(), extra_chunks_needed*chunk_size, INVALID_CONNECTIVITY_ORDINAL); - if (has_permutation()) { - m_permutations.insert(m_permutations.end(), extra_chunks_needed*chunk_size, INVALID_PERMUTATION); - } - } - - m_total_connectivities += num_to_add; - m_num_connectivities[bucket_ordinal] += num_to_add; - } - - template - bool add_helper(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation, - const ConnectivityComparator &compare) - { -#ifndef NDEBUG - // TODO - If downward conn, check to's rank and topology -#endif - bool rv = true; - - add_connectivity_helper(bucket_ordinal); - - const uint32_t begin_index = m_indices[bucket_ordinal] + m_num_connectivities[bucket_ordinal] - 1; - - if (m_num_connectivities[bucket_ordinal] == 1) { - m_targets[begin_index] = to; - m_ordinals[begin_index] = ordinal; - if (has_permutation()) { - m_permutations[begin_index] = permutation; - } - return true; - } - - for (uint32_t i = begin_index, e = m_indices[bucket_ordinal]; i > e; --i) - { - //slide up - if ( compare(to, ordinal, m_targets[i-1], m_ordinals[i-1u]) ) { - m_targets[i] = m_targets[i-1u]; - m_ordinals[i] = m_ordinals[i-1u]; - if (has_permutation()) { - m_permutations[i] = m_permutations[i-1u]; - } - //insert if on last iteration - if ((i-1)==e) { - m_targets[i-1u] = to; - m_ordinals[i-1u] = ordinal; - if (has_permutation()) { - m_permutations[i-1u] = permutation; - } - } - } - //insert - else if ( compare(m_targets[i-1], m_ordinals[i-1u], to, ordinal) ) { - m_targets[i] = to; - m_ordinals[i] = ordinal; - if (has_permutation()) { - m_permutations[i] = permutation; - } - break; - } - //duplicate -- insert new and remove the original - else - { - m_targets[i] = to; - m_ordinals[i] = ordinal; - if (has_permutation()) { - m_permutations[i] = permutation; - } - remove_connectivity(bucket_ordinal, to, ordinal); - rv = false; - break; - } - } - - return rv; - } - - // Illegal - BucketConnectivity(const SelfType&); - SelfType& operator=(const SelfType&); - - // MEMBERS - - EntityRank m_from_rank; - connectivity_direction m_direction; - - bool m_active; // In many cases, uses will not make use of dynamic connectivity, so don't even waste the memory unless it looks like they want it - bool m_needs_shrink_to_fit; // True if this object potentially has partially full vectors or out-of-order entities - unsigned m_num_inactive; - - // meta data - UInt32Vector m_indices; // Common index into vectors below that stores where connectivity starts for a partition_offset (entity). - UInt32Vector m_num_connectivities; - unsigned m_total_connectivities; - - // connectivity data - EntityVector m_targets; - ConnectivityOrdinalVector m_ordinals; - PermutationVector m_permutations; - - BulkData * m_bulk_data; - int m_id; - - impl::HigherConnectivityRankSensitiveCompare m_rank_sensitive_higher_connectivity_cmp; - impl::LowerConnectivitityRankSensitiveCompare m_rank_sensitive_lower_connectivity_cmp; - - size_t m_last_capacity; - - size_t m_data_idx; -}; - -} - -// -// BucketConnectivity -// - -template -template // hack to get around dependency -inline -void impl::BucketConnectivity::end_modification(BULKDATA* mesh) -{ - //TODO: If bucket is blocked, no longer need to shrink to fit! - - if (m_targets.size() < m_targets.capacity()) { - - { - EntityVector temp(m_targets.begin(), m_targets.end()); - m_targets.swap(temp); - } - - { - PermutationVector temp(m_permutations.begin(), m_permutations.end()); - m_permutations.swap(temp); - } - } - -} - -template -template -inline -void impl::BucketConnectivity::end_modification(BULKDATA* mesh) -{ - if (m_active && m_needs_shrink_to_fit) { - resize_and_order_by_index(); - - { - UInt32Vector temp(m_indices.begin(), m_indices.end()); - m_indices.swap(temp); - } - - { - UInt32Vector temp(m_num_connectivities.begin(), m_num_connectivities.end()); - m_num_connectivities.swap(temp); - } - - m_needs_shrink_to_fit = false; - } -} - -template -inline -bool impl::LowerConnectivitityRankSensitiveCompare::operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, - Entity second_entity, ConnectivityOrdinal second_ordinal) const -{ - const EntityRank first_rank = m_mesh.entity_rank(first_entity); - const EntityRank second_rank = m_mesh.entity_rank(second_entity); - - return (first_rank < second_rank) - || ((first_rank == second_rank) && (first_ordinal < second_ordinal)); -} - -template -inline -bool impl::HigherConnectivityRankSensitiveCompare::operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const -{ - const EntityRank first_rank = m_mesh.entity_rank(first_entity); - const EntityRank second_rank = m_mesh.entity_rank(second_entity); - - if (first_rank < second_rank) { - return true; - } - if (first_rank > second_rank) { - return false; - } - // Needs to match LessRelation in BulkData.hpp - return std::make_pair(first_ordinal, first_entity.is_local_offset_valid() ? first_entity.local_offset() : Entity::MaxEntity) < - std::make_pair(second_ordinal, second_entity.is_local_offset_valid() ? second_entity.local_offset() : Entity::MaxEntity); -} - - - - - -}} //namespace stk::mesh::impl - -#endif diff --git a/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp b/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp index 614bd2e82048..94a407d97780 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp @@ -100,10 +100,6 @@ namespace stk { namespace mesh { -namespace impl { -int Counter::counter = 0; -} - // Static constant on BulkData: const uint16_t BulkData::orphaned_node_marking = 25000; @@ -376,6 +372,7 @@ BulkData::BulkData(MetaData & mesh_meta_data, *this, mesh_meta_data.entity_rank_count(), bucket_capacity), + m_sparse_connectivity(mesh_meta_data.entity_rank_count()), m_use_identifiers_for_resolving_sharing(false), m_modSummary(*this), m_meshDiagnosticObserver(std::make_shared(*this)), @@ -528,7 +525,7 @@ void BulkData::require_entity_owner( const Entity entity , void BulkData::require_good_rank_and_id(EntityRank ent_rank, EntityId ent_id) const { - const EntityRank rank_count = static_cast(m_mesh_meta_data.entity_rank_count()); + const EntityRank rank_count = m_mesh_meta_data.entity_rank_count(); const bool ok_id = EntityKey::is_valid_id(ent_id); const bool ok_rank = ent_rank < rank_count && !(ent_rank == stk::topology::FACE_RANK && mesh_meta_data().spatial_dimension() == 2); @@ -552,13 +549,11 @@ void BulkData::mark_entity_and_upward_related_entities_as_modified(Entity entity size_t BulkData::count_relations(Entity entity) const { - const MeshIndex &mesh_idx = mesh_index(entity); - const EntityRank end_rank = static_cast(m_mesh_meta_data.entity_rank_count()); size_t count = 0; for (EntityRank irank = stk::topology::BEGIN_RANK; irank < end_rank; ++irank) { - count += mesh_idx.bucket->num_connectivity(mesh_idx.bucket_ordinal, irank); + count += num_connectivity(entity, irank); } return count; } @@ -611,6 +606,7 @@ Entity BulkData::generate_new_entity(unsigned preferred_offset) } else if (!m_deleted_entities.empty()) { new_local_offset = m_deleted_entities.front(); + m_sparse_connectivity.get_connectivity(Entity(new_local_offset)).clear(); m_deleted_entities.pop_front(); } @@ -626,6 +622,7 @@ Entity BulkData::generate_new_entity(unsigned preferred_offset) m_mark_entity.push_back(NOT_MARKED); m_closure_count.push_back(static_cast(0)); m_local_ids.push_back(stk::mesh::GetInvalidLocalId()); + m_sparse_connectivity.update_size_of_entity_index_space(m_mesh_indexes.size()); #ifdef SIERRA_MIGRATION if (m_add_fmwk_data) { @@ -799,6 +796,7 @@ PARTVECTOR add_root_topology_part(const PARTVECTOR &parts, stk::mesh::Part &root PARTVECTOR initialParts(parts.size() + 1); initialParts = parts; initialParts.push_back(&rootTopoPart); + stk::util::sort_and_unique(initialParts, PartLess()); return initialParts; } @@ -1634,10 +1632,12 @@ void BulkData::comm_procs( EntityKey key, std::vector & procs ) const void BulkData::comm_procs(Entity entity, std::vector & procs ) const { + procs.clear(); ThrowAssertMsg(is_valid(entity), "BulkData::comm_procs ERROR, input entity "<comm_map), procs); + } } void BulkData::comm_shared_procs(EntityKey key, std::vector & procs ) const @@ -2299,7 +2299,7 @@ void BulkData::internal_declare_relation( Entity entity , { require_ok_to_modify(); - stk::mesh::EntityRank erank = entity_rank(entity); + stk::mesh::EntityRank entityRank = entity_rank(entity); OrdinalVector scratch2, scratch3; @@ -2308,14 +2308,15 @@ void BulkData::internal_declare_relation( Entity entity , Entity e = i->entity(); const unsigned n = i->relation_ordinal(); const Permutation permut = i->getPermutation(); - if ( entity_rank(e) < erank ) { + const EntityRank eRank = entity_rank(e); + if ( eRank < entityRank ) { internal_declare_relation( entity , e , n, permut, ordinal_scratch, scratch2, scratch3); } - else if ( erank < entity_rank(e) ) { + else if ( entityRank < eRank ) { internal_declare_relation( e , entity , n, permut, ordinal_scratch, scratch2, scratch3); } else { - ThrowErrorMsg("declare_relation given entities of the same entity rank ("< " < ghostStatus(get_size_of_entity_index_space(), false); + m_entity_repo->clear_all_cache(); + stk::mesh::impl::comm_sync_aura_send_recv(*this, add_send, entityProcMapping, ghostStatus ); @@ -3664,25 +3667,22 @@ void BulkData::fill_list_of_entities_to_send_for_aura_ghosting(EntityProcMapping // Iterate over all shared entities, ensure that upwardly related // entities to each shared entity will be ghosted to the sharing proc. Selector shared = mesh_meta_data().globally_shared_part(); + const SparseConnectivity& sparseConnectivity = m_sparse_connectivity; std::vector sharingProcs; impl::for_each_selected_entity_run_no_threads(*this, stk::topology::NODE_RANK, shared, - [&sendAuraEntityProcs, &entitySharing, &sharingProcs, &end_rank] + [&sendAuraEntityProcs, &sparseConnectivity, &entitySharing, &sharingProcs, &end_rank] (const BulkData& bulk, const MeshIndex& meshIndex) { const Bucket& bucket = *meshIndex.bucket; const unsigned bucketOrd = meshIndex.bucket_ordinal; - const EntityRank nextHigherRank = stk::topology::EDGE_RANK; + const Connectivity& connObject = sparseConnectivity.get_connectivity(bucket[bucketOrd]); bulk.comm_shared_procs(bucket[bucketOrd], sharingProcs); - for (const int sharingProc : sharingProcs) { - - for (EntityRank higherRank = nextHigherRank; higherRank < end_rank; ++higherRank) { - const unsigned num_rels = bucket.num_connectivity(bucketOrd, higherRank); - const Entity* rels = bucket.begin(bucketOrd, higherRank); - - for (unsigned r = 0; r < num_rels; ++r) { - stk::mesh::impl::insert_upward_relations(bulk, entitySharing, rels[r], stk::topology::NODE_RANK, sharingProc, sendAuraEntityProcs); - } + PairIterEntity conn = connObject.get_connectivity(stk::topology::EDGE_RANK, end_rank); + for (Entity relEntity : conn) { + const Connectivity& relConnectivity = sparseConnectivity.get_connectivity(relEntity); + for (const int sharingProc : sharingProcs) { + stk::mesh::impl::insert_upward_relations(bulk, relConnectivity, entitySharing, relEntity, sharingProc, sendAuraEntityProcs); } } } @@ -3881,7 +3881,7 @@ void BulkData::change_connectivity_for_edge_or_face(stk::mesh::Entity side, cons if(bucket(elements[i]).owned()) { stk::mesh::Bucket& bucket_edge = bucket(side); - bucket_edge.change_existing_connectivity(bucket_ordinal(side), nodes.data()); + bucket_edge.change_connected_nodes(bucket_ordinal(side), nodes.data()); stk::mesh::Permutation new_permutation = get_permutation(*this, elements[i], nodes); ThrowRequireWithSierraHelpMsg(new_permutation!=stk::mesh::INVALID_PERMUTATION); @@ -4685,7 +4685,7 @@ void BulkData::internal_finish_modification_end(ModEndOptimizationFlag opt) m_bucket_repository.internal_default_sort_bucket_entities(should_sort_faces_by_node_ids()); } - m_bucket_repository.internal_modification_end(); + m_bucket_repository.sync_from_partitions(); m_meshModification.set_sync_state_synchronized(); m_add_node_sharing_called = false; @@ -5083,12 +5083,8 @@ void BulkData::internal_update_all_sharing_procs() const EntityCommListInfoVector& all_comm = m_entity_comm_list; for (const EntityCommListInfo& info : all_comm) { - const Entity entity = info.entity; - const Bucket& bkt = bucket(entity); - - if (bkt.shared() && info.entity_comm != nullptr) { - const EntityRank rank = bkt.entity_rank(); - + if (info.entity_comm != nullptr && info.entity_comm->isShared) { + const EntityRank rank = info.key.rank(); const EntityCommInfoVector& commInfo = info.entity_comm->comm_map; const unsigned len = commInfo.size(); unsigned i = 0; @@ -6359,7 +6355,7 @@ void BulkData::sort_entities(const stk::mesh::EntitySorterBase& sorter) ThrowRequireMsg(in_synchronized_state(), "Error, sort_entities cannot be called from inside a modification cycle."); m_bucket_repository.internal_custom_sort_bucket_entities(sorter); - m_bucket_repository.internal_modification_end(); + m_bucket_repository.sync_from_partitions(); if(parallel_size() > 1) check_mesh_consistency(); diff --git a/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp b/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp index 4976764cea06..bd73f2e42267 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp @@ -62,6 +62,7 @@ #include "stk_mesh/base/Bucket.hpp" // for Bucket #include "stk_mesh/base/EntityKey.hpp" // for EntityKey, hash_value #include "stk_mesh/base/FieldDataManager.hpp" +#include "stk_mesh/base/SparseConnectivity.hpp" #include "stk_mesh/base/Relation.hpp" // for Relation, etc #include "stk_topology/topology.hpp" // for topology, etc #include "stk_util/util/ReportHandler.hpp" // for ThrowAssert, etc @@ -869,6 +870,9 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu void set_large_ids_flag(bool largeIds) { m_supportsLargeIds = largeIds; } protected: //functions + SparseConnectivity& get_sparse_connectivity() { return m_sparse_connectivity; } + const SparseConnectivity& get_sparse_connectivity() const { return m_sparse_connectivity; } + Entity declare_entity( EntityRank ent_rank , EntityId ent_id);// Mod Mark @@ -1581,6 +1585,7 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu FieldDataManager *m_field_data_manager; mutable std::vector m_selector_to_buckets_maps; impl::BucketRepository m_bucket_repository; // needs to be destructed first! + SparseConnectivity m_sparse_connectivity; bool m_use_identifiers_for_resolving_sharing; std::string m_lastModificationDescription; stk::EmptyModificationSummary m_modSummary; @@ -1604,9 +1609,11 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu inline unsigned BulkData::num_connectivity(Entity entity, EntityRank rank) const { - ThrowAssert(bucket_ptr(entity)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->num_connectivity(mesh_idx.bucket_ordinal, rank); + if (rank == stk::topology::NODE_RANK) { + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket==nullptr ? 0 : mesh_idx.bucket->num_nodes(mesh_idx.bucket_ordinal); + } + return m_sparse_connectivity.num_connectivity(entity, rank); } inline unsigned @@ -1631,8 +1638,11 @@ inline Entity const* BulkData::begin(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin(mesh_idx.bucket_ordinal, rank); + if (rank == stk::topology::NODE_RANK) { + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_nodes(mesh_idx.bucket_ordinal); + } + return m_sparse_connectivity.begin_connectivity(entity, rank); } inline Entity const* @@ -1643,28 +1653,25 @@ BulkData::begin_nodes(Entity entity) const return mesh_idx.bucket->begin_nodes(mesh_idx.bucket_ordinal); } -inline Entity const* -BulkData::begin_edges(Entity entity) const +inline +Entity const* BulkData::begin_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_edges(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_connectivity(entity, stk::topology::EDGE_RANK); } -inline Entity const* -BulkData::begin_faces(Entity entity) const +inline +Entity const* BulkData::begin_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_faces(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_connectivity(entity, stk::topology::FACE_RANK); } -inline Entity const* -BulkData::begin_elements(Entity entity) const +inline +Entity const* BulkData::begin_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_elements(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_connectivity(entity, stk::topology::ELEM_RANK); } inline ConnectivityOrdinal const* @@ -1683,68 +1690,60 @@ BulkData::begin_node_ordinals(Entity entity) const return mesh_idx.bucket->begin_node_ordinals(mesh_idx.bucket_ordinal); } -inline ConnectivityOrdinal const* -BulkData::begin_edge_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::begin_edge_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_edge_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_ordinals(entity, stk::topology::EDGE_RANK); } -inline ConnectivityOrdinal const* -BulkData::begin_face_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::begin_face_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_face_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_ordinals(entity, stk::topology::FACE_RANK); } -inline ConnectivityOrdinal const* -BulkData::begin_element_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::begin_element_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_element_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_ordinals(entity, stk::topology::ELEM_RANK); } inline Permutation const* BulkData::begin_permutations(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_permutations(mesh_idx.bucket_ordinal, rank); + return m_sparse_connectivity.begin_permutations(entity, rank); } -inline Permutation const* -BulkData::begin_node_permutations(Entity entity) const +inline +Permutation const* BulkData::begin_node_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::NODE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_node_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_permutations(entity, stk::topology::NODE_RANK); } -inline Permutation const* -BulkData::begin_edge_permutations(Entity entity) const +inline +Permutation const* BulkData::begin_edge_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_edge_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_permutations(entity, stk::topology::EDGE_RANK); } -inline Permutation const* -BulkData::begin_face_permutations(Entity entity) const +inline +Permutation const* BulkData::begin_face_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_face_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_permutations(entity, stk::topology::FACE_RANK); } -inline Permutation const* -BulkData::begin_element_permutations(Entity entity) const +inline +Permutation const* BulkData::begin_element_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_element_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.begin_permutations(entity, stk::topology::ELEM_RANK); } inline unsigned @@ -1755,36 +1754,36 @@ BulkData::num_nodes(Entity entity) const return mesh_idx.bucket->num_nodes(mesh_idx.bucket_ordinal); } -inline unsigned -BulkData::num_edges(Entity entity) const +inline +unsigned BulkData::num_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->num_edges(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.num_connectivity(entity, stk::topology::EDGE_RANK); } -inline unsigned -BulkData::num_faces(Entity entity) const +inline +unsigned BulkData::num_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->num_faces(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.num_connectivity(entity, stk::topology::FACE_RANK); } -inline unsigned -BulkData::num_elements(Entity entity) const +inline +unsigned BulkData::num_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->num_elements(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.num_connectivity(entity, stk::topology::ELEM_RANK); } inline Entity const* BulkData::end(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end(mesh_idx.bucket_ordinal, rank); + if (rank == stk::topology::NODE_RANK) { + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_nodes(mesh_idx.bucket_ordinal); + } + return m_sparse_connectivity.end_connectivity(entity, rank); } inline Entity const* @@ -1795,28 +1794,25 @@ BulkData::end_nodes(Entity entity) const return mesh_idx.bucket->end_nodes(mesh_idx.bucket_ordinal); } -inline Entity const* -BulkData::end_edges(Entity entity) const +inline +Entity const* BulkData::end_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_edges(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_connectivity(entity, stk::topology::EDGE_RANK); } -inline Entity const* -BulkData::end_faces(Entity entity) const +inline +Entity const* BulkData::end_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_faces(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_connectivity(entity, stk::topology::FACE_RANK); } -inline Entity const* -BulkData::end_elements(Entity entity) const +inline +Entity const* BulkData::end_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_elements(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_connectivity(entity, stk::topology::ELEMENT_RANK); } inline ConnectivityOrdinal const* @@ -1835,75 +1831,67 @@ BulkData::end_node_ordinals(Entity entity) const return mesh_idx.bucket->end_node_ordinals(mesh_idx.bucket_ordinal); } -inline ConnectivityOrdinal const* -BulkData::end_edge_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::end_edge_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_edge_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_ordinals(entity, stk::topology::EDGE_RANK); } -inline ConnectivityOrdinal const* -BulkData::end_face_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::end_face_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_face_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_ordinals(entity, stk::topology::FACE_RANK); } -inline ConnectivityOrdinal const* -BulkData::end_element_ordinals(Entity entity) const +inline +ConnectivityOrdinal const* BulkData::end_element_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_element_ordinals(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_ordinals(entity, stk::topology::ELEM_RANK); } -inline Permutation const* -BulkData::end_permutations(Entity entity, EntityRank rank) const +inline +Permutation const* BulkData::end_permutations(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_permutations(mesh_idx.bucket_ordinal, rank); + return m_sparse_connectivity.end_permutations(entity, rank); } -inline Permutation const* -BulkData::end_node_permutations(Entity entity) const +inline +Permutation const* BulkData::end_node_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::NODE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_node_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_permutations(entity, stk::topology::NODE_RANK); } -inline Permutation const* -BulkData::end_edge_permutations(Entity entity) const +inline +Permutation const* BulkData::end_edge_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_edge_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_permutations(entity, stk::topology::EDGE_RANK); } -inline Permutation const* -BulkData::end_face_permutations(Entity entity) const +inline +Permutation const* BulkData::end_face_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_face_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_permutations(entity, stk::topology::FACE_RANK); } -inline Permutation const* -BulkData::end_element_permutations(Entity entity) const +inline +Permutation const* BulkData::end_element_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_element_permutations(mesh_idx.bucket_ordinal); + return m_sparse_connectivity.end_permutations(entity, stk::topology::ELEM_RANK); } -inline bool -BulkData::has_permutation(Entity entity, EntityRank rank) const +inline +bool BulkData::has_permutation(Entity entity, EntityRank rank) const { ThrowAssert(bucket_ptr(entity)); - return bucket(entity).has_permutation(rank); + return m_sparse_connectivity.has_permutation(entity_rank(entity), rank); } inline bool @@ -1930,13 +1918,16 @@ BulkData::in_receive_ghost( EntityKey key ) const inline bool BulkData::in_receive_ghost( Entity entity ) const { - const std::vector & ghosts= ghostings(); - for (size_t i=ghosts.size()-1;i>=AURA;--i) - { - if ( in_receive_ghost(*ghosts[i], entity) ) - return true; + if (m_entitycomm[entity.local_offset()] == nullptr) { + return false; } - return false; + + const int owner_rank = parallel_owner_rank(entity); + if (owner_rank == parallel_rank()) { + return false; + } + + return m_entitycomm[entity.local_offset()]->isGhost; } inline bool diff --git a/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp b/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp new file mode 100644 index 000000000000..2f7fb3dd4c58 --- /dev/null +++ b/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp @@ -0,0 +1,115 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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. +// + +#ifndef STK_MESH_CONNECTED_SPARSE_NODES_HPP +#define STK_MESH_CONNECTED_SPARSE_NODES_HPP + +#include +#include +#include +#include +#include + +namespace stk { +namespace mesh { + +class ConnectedSparseNodes { +public: + ConnectedSparseNodes(SparseConnectivity& sparseConnectivity, + EntityRank fromRank, + const EntityVector& fromEntities) + : m_sparseConnectivity(sparseConnectivity), + m_fromEntities(fromEntities), + m_fromRank(fromRank) + {} + + ~ConnectedSparseNodes(){} + + unsigned num_nodes_per_entity(unsigned fromEntity) const + { return m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } + + const Entity* begin_connectivity(unsigned fromEntity) const + { return m_sparseConnectivity.begin_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } + + const Entity* end_connectivity(unsigned fromEntity) const + { return m_sparseConnectivity.end_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } + + const ConnectivityOrdinal* begin_ordinals(unsigned fromEntity) const + { return m_sparseConnectivity.begin_ordinals(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } + + const ConnectivityOrdinal* end_ordinals(unsigned fromEntity) const + { return m_sparseConnectivity.end_ordinals(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } + + bool set_connected_node(unsigned fromEntity, Entity connectedNode, ConnectivityOrdinal ordinal) + { + if (connectedNode.local_offset() > 0) { + return m_sparseConnectivity.add_connectivity(m_fromRank, m_fromEntities[fromEntity], + stk::topology::NODE_RANK, connectedNode, ordinal, + INVALID_PERMUTATION); + } + else { + const unsigned numBefore = m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); + bool returnVal = m_sparseConnectivity.remove_connectivity(m_fromRank, m_fromEntities[fromEntity], + stk::topology::NODE_RANK, connectedNode, ordinal); + const unsigned numAfter = m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); + ThrowRequireMsg((numBefore==0 && numAfter==0) || (numBefore>0 && numAfter==numBefore-1),"remove didn't work"); + return returnVal; + } + } + + bool reset_connected_node(unsigned fromEntity, Entity connectedNode, ConnectivityOrdinal ordinal) + { + return m_sparseConnectivity.replace_or_add_connectivity(m_fromRank, m_fromEntities[fromEntity], + stk::topology::NODE_RANK, connectedNode, ordinal); + } + + void reset_connected_nodes(unsigned fromEntity, unsigned numNodes, const Entity* connectedNodes) + { + for(unsigned i=0; i +#include // for EntityRank, ConnectivityOrdinal, EntityVector +#include +#include + +namespace stk { +namespace mesh { + +class ConnectedTopologyNodes { +public: + ConnectedTopologyNodes(stk::topology fromTopology, const EntityVector& fromEntities) + : m_connectedNodes(fromTopology.num_nodes()*fromEntities.size(), Entity()), + m_ordinals(fromTopology.num_nodes()), + m_numNodesPerEntity(fromTopology.num_nodes()) + { + for (unsigned n=0; n m_ordinals; + unsigned m_numNodesPerEntity; +}; + +} // namespace mesh +} // namespace stk + +#endif //STK_MESH_CONNECTED_TOPOLOGY_NODES_HPP + diff --git a/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp b/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp new file mode 100644 index 000000000000..790ebf1bcb12 --- /dev/null +++ b/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp @@ -0,0 +1,250 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 + +namespace stk { +namespace mesh { + +Connectivity::Connectivity() + : m_connectivity(nullptr), + m_offsetsAndOrdinals(nullptr) +{ + m_offsetsAndOrdinals = new ConnectivityOrdinal[m_capacityIndex + 1]; + for(unsigned i=0; i +#include // for EntityRank +#include +#include +#include + +namespace stk { +namespace mesh { + +class Connectivity { +public: + Connectivity(); + + static constexpr uint16_t MAX_NUM_RANKS = stk::topology::NUM_RANKS+1; + + Connectivity(const Connectivity& rhs) + : m_connectivity(nullptr), + m_offsetsAndOrdinals(nullptr) + { + *this = rhs; + } + + Connectivity(Connectivity && rhs) noexcept + : m_connectivity(nullptr), + m_offsetsAndOrdinals(nullptr) + { + *this = std::move(rhs); + } + + Connectivity& operator=(const Connectivity& rhs) + { + delete [] m_connectivity; + delete [] m_offsetsAndOrdinals; + + unsigned capacity = rhs.get_capacity(); + if (capacity > 0) { + m_connectivity = new Entity[capacity]; + } + + m_offsetsAndOrdinals = new ConnectivityOrdinal[m_firstOrdinalIndex + capacity]; + for(unsigned i=0; i("needSyncToDevice"); - const int maxStates = static_cast(MaximumFieldStates); for (int s=0; sclear_sync_state(); + } + + void clear_host_sync_state() override + { + hostField->clear_host_sync_state(); + } + + void clear_device_sync_state() override + { + hostField->clear_device_sync_state(); } void sync_to_host() override @@ -390,21 +395,20 @@ class DeviceField : public NgpFieldBase void swap(DeviceField &other) { swap_views(deviceData, other.deviceData); - swap_views(needSyncToHost, other.needSyncToHost); - swap_views(needSyncToDevice, other.needSyncToDevice); } -protected: - bool need_sync_to_host() const + bool need_sync_to_host() const override { - return needSyncToHost(); + return hostField->need_sync_to_host(); } - bool need_sync_to_device() const + bool need_sync_to_device() const override { - return needSyncToDevice(); + return hostField->need_sync_to_device(); } +protected: + void debug_modification_begin() override { fieldSyncDebugger.detect_device_field_modification(this); @@ -427,24 +431,17 @@ class DeviceField : public NgpFieldBase void set_modify_on_host() { -#ifdef KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK - ThrowRequireMsg(needSyncToHost() == false, "field " << hostField->name()); -#endif - needSyncToDevice() = true; + hostField->modify_on_host(); } void set_modify_on_device() { -#ifdef KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK - ThrowRequireMsg(needSyncToDevice() == false, "field " << hostField->name()); -#endif - needSyncToHost() = true; + hostField->modify_on_device(); } void clear_sync_state_flags() { - needSyncToHost() = false; - needSyncToDevice() = false; + hostField->clear_sync_state(); } void construct_view(const BucketVector& buckets, const std::string& name, unsigned numPerEntity) @@ -661,7 +658,7 @@ class DeviceField : public NgpFieldBase { if (hostField) { impl::transpose_to_pinned_and_mapped_memory(asyncCopyState.execSpace, *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); - clear_sync_state_flags(); + clear_device_sync_state(); hostField->increment_num_syncs_to_host(); } } @@ -679,16 +676,14 @@ class DeviceField : public NgpFieldBase { if (hostField) { impl::transpose_from_pinned_and_mapped_memory(asyncCopyState.execSpace, *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); - clear_sync_state_flags(); + clear_host_sync_state(); hostField->increment_num_syncs_to_device(); } } void internal_sync_to_device() { - bool needToSyncToDevice = need_sync_to_device(); - - if (needToSyncToDevice) { + if (need_sync_to_device()) { ProfilingBlock prof("copy_to_device for " + hostField->name()); if(hostBulk->synchronized_count() != synchronizedCount) { update_field(); @@ -721,9 +716,6 @@ class DeviceField : public NgpFieldBase FieldDataPointerHostViewType hostBucketPtrData; FieldDataPointerDeviceViewType deviceBucketPtrData; - Kokkos::View needSyncToHost; - Kokkos::View needSyncToDevice; - typename UnsignedViewType::HostMirror hostSelectedBucketOffset; UnsignedViewType deviceSelectedBucketOffset; typename UnsignedViewType::HostMirror newHostSelectedBucketOffset; diff --git a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp index d876b846dfeb..6481f55e257c 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp @@ -47,18 +47,30 @@ void DeviceBucket::initialize_bucket_attributes(const stk::mesh::Bucket &bucket) void DeviceBucket::allocate(const stk::mesh::Bucket &bucket) { - unsigned numNodesPerEntity = bucket.topology().num_nodes(); + nodeOffsets = OrdinalViewType(Kokkos::view_alloc(Kokkos::WithoutInitializing, "NodeOffsets"), bucket.size()+1); + hostNodeOffsets = Kokkos::create_mirror_view(Kokkos::HostSpace(), nodeOffsets, Kokkos::WithoutInitializing); + + unsigned maxNodesPerEntity = bucketTopology.num_nodes(); + unsigned totalNumNodes = bucketTopology.num_nodes()*bucketCapacity; + if (bucket.topology() == stk::topology::INVALID_TOPOLOGY) { + maxNodesPerEntity = 0; + totalNumNodes = 0; + for(unsigned i=0; i(numNodesPerEntity)); + static_cast(maxNodesPerEntity)); hostNodeOrdinals = Kokkos::create_mirror_view(Kokkos::HostSpace(), nodeOrdinals, Kokkos::WithoutInitializing); partOrdinals = PartOrdinalViewType(Kokkos::view_alloc(Kokkos::WithoutInitializing, "PartOrdinals"), parts.size()); @@ -67,8 +79,15 @@ void DeviceBucket::allocate(const stk::mesh::Bucket &bucket) void DeviceBucket::initialize_from_host(const stk::mesh::Bucket &bucket) { - unsigned numNodesPerEntity = bucket.topology().num_nodes(); - for (unsigned i = 0; i < numNodesPerEntity; ++i) { + unsigned maxNodesPerEntity = bucket.topology().num_nodes(); + if (bucket.topology() == stk::topology::INVALID_TOPOLOGY) { + maxNodesPerEntity = 0; + for(unsigned i=0; i(i); } Kokkos::deep_copy(nodeOrdinals, hostNodeOrdinals); @@ -85,17 +104,55 @@ void DeviceBucket::initialize_from_host(const stk::mesh::Bucket &bucket) void DeviceBucket::update_from_host(const stk::mesh::Bucket &bucket) { bucketSize = bucket.size(); - unsigned nodesPerElem = bucket.topology().num_nodes(); + + if (bucketSize+1 != hostNodeOffsets.size()) { + nodeOffsets = OrdinalViewType(Kokkos::view_alloc(Kokkos::WithoutInitializing, "NodeOffsets"), bucketSize+1); + hostNodeOffsets = Kokkos::create_mirror_view(Kokkos::HostSpace(), nodeOffsets, Kokkos::WithoutInitializing); + } + + unsigned totalNumNodes = bucket.topology().num_nodes()*bucketCapacity; + unsigned maxNodesPerEntity = bucket.topology().num_nodes(); + if (bucket.topology() == stk::topology::INVALID_TOPOLOGY) { + totalNumNodes = 0; + maxNodesPerEntity = 0; + for(unsigned i=0; i(maxNodesPerEntity)); + hostNodeOrdinals = Kokkos::create_mirror_view(Kokkos::HostSpace(), nodeOrdinals, Kokkos::WithoutInitializing); + for (unsigned i = 0; i < maxNodesPerEntity; ++i) { + hostNodeOrdinals(i) = static_cast(i); + } + Kokkos::deep_copy(nodeOrdinals, hostNodeOrdinals); + } + + unsigned nodeOffset = 0; for (unsigned iEntity = 0; iEntity < bucket.size(); ++iEntity) { stk::mesh::Entity entity = bucket[iEntity]; hostEntities(iEntity) = entity; + const unsigned nodesPerEntity = bucket.num_nodes(iEntity); const stk::mesh::Entity * elemNodes = bucket.begin_nodes(iEntity); - for (unsigned iNode = 0; iNode < nodesPerElem; ++iNode) { - hostNodeConnectivity(iEntity, iNode) = elemNodes[iNode]; + for (unsigned iNode = 0; iNode < nodesPerEntity; ++iNode) { + hostNodeConnectivity(nodeOffset + iNode) = elemNodes[iNode]; } + hostNodeOffsets(iEntity) = nodeOffset; + nodeOffset += nodesPerEntity; } + hostNodeOffsets(bucket.size()) = nodeOffset; + Kokkos::deep_copy(entities, hostEntities); Kokkos::deep_copy(nodeConnectivity, hostNodeConnectivity); + Kokkos::deep_copy(nodeOffsets, hostNodeOffsets); } void DeviceMesh::update_mesh() @@ -273,13 +330,13 @@ void DeviceMesh::fill_sparse_connectivities(const stk::mesh::BulkData& bulk_in) for(stk::mesh::EntityRank connectedRank=stk::topology::EDGE_RANK; connectedRank( static_cast(arg_rank) << RANK_SHIFT | arg_id) ) { - NGP_ThrowAssertMsg( arg_rank <= static_cast(255), "Error: given an out of range entity rank"); - NGP_ThrowAssertMsg( arg_id <= MAX_ID, "Error: given an out of range entity id"); + NGP_ThrowAssertMsg((arg_rank >= stk::topology::BEGIN_RANK) && (arg_rank < stk::topology::INVALID_RANK), + "Error: given an out of range entity rank"); + NGP_ThrowAssertMsg(arg_id <= MAX_ID, "Error: given an out of range entity id"); } KOKKOS_FUNCTION diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldBLAS.hpp b/packages/stk/stk_mesh/stk_mesh/base/FieldBLAS.hpp index 0134cf525ccf..a678e8ffb33b 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldBLAS.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldBLAS.hpp @@ -939,6 +939,26 @@ void field_fill(const Scalar alpha, const FieldBase& xField, const Selector& sel unfix_omp_threads(orig_thread_count); } +template +inline +void field_fill(const Scalar alpha, const std::vector& xFields, const Selector& selector) +{ + ThrowAssert(xFields.size() >= 1 ); + + stk::mesh::EntityRank fieldEntityRank = xFields[0]->entity_rank(); + BucketVector const& buckets = xFields[0]->get_mesh().get_buckets(fieldEntityRank,selector); + + for (auto&& bucket : buckets){ + for (unsigned int i=0; i(xField) ); + ThrowAssert(fieldEntityRank == xField.entity_rank()); + BucketSpan x(xField, *bucket); + FortranBLAS::fill(x.size(),alpha,x.data()); + } + } +} + template inline void field_fill(const Scalar alpha, const FieldBase& xField) @@ -947,6 +967,14 @@ void field_fill(const Scalar alpha, const FieldBase& xField) field_fill(alpha,xField,selector); } +template +inline +void field_fill(const Scalar alpha, const std::vector& xFields) +{ + const Selector selector = selectField(*xFields[0]); + field_fill(alpha,xFields,selector); +} + template inline void INTERNAL_field_swap(const FieldBase& xField, const FieldBase& yField, const Selector& selector) diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldBase.cpp b/packages/stk/stk_mesh/stk_mesh/base/FieldBase.cpp index 72c551db680e..e452658267a8 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldBase.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldBase.cpp @@ -342,7 +342,7 @@ unsigned FieldBase::max_size( EntityRank ent_rank) const { unsigned max = 0 ; - if(static_cast(entity_rank()) == ent_rank) + if (entity_rank() == ent_rank) { const FieldRestrictionVector & rMap = restrictions(); const FieldRestrictionVector::const_iterator ie = rMap.end() ; @@ -367,6 +367,12 @@ void FieldBase::rotate_multistate_data() for (unsigned s = 1; s < numStates; ++s) { FieldBase* sField = field_state(static_cast(s)); m_field_meta_data.swap(sField->m_field_meta_data); + + std::swap(m_numSyncsToDevice, sField->m_numSyncsToDevice); + std::swap(m_numSyncsToHost, sField->m_numSyncsToHost); + + std::swap(m_modifiedOnHost, sField->m_modifiedOnHost); + std::swap(m_modifiedOnDevice, sField->m_modifiedOnDevice); } } } @@ -374,33 +380,43 @@ void FieldBase::rotate_multistate_data() void FieldBase::modify_on_host() const { - if (m_ngpField != nullptr) { - m_ngpField->modify_on_host(); - } + ThrowRequireMsg(m_modifiedOnDevice == false, + "Modify on host called for Field: " << name() << " but it has an uncleared modified_on_device"); + + m_modifiedOnHost = true; } void FieldBase::modify_on_device() const { - if (m_ngpField != nullptr) { - m_ngpField->modify_on_device(); - } + ThrowRequireMsg(m_modifiedOnHost == false, + "Modify on device called for Field: " << name() << " but it has an uncleared modified_on_host"); + + m_modifiedOnDevice = true; } void FieldBase::modify_on_host(const Selector& s) const { - if (m_ngpField != nullptr) { - m_ngpField->modify_on_host(s); - } + modify_on_host(); } void FieldBase::modify_on_device(const Selector& s) const { - if (m_ngpField != nullptr) { - m_ngpField->modify_on_device(s); - } + modify_on_device(); +} + +bool +FieldBase::need_sync_to_device() const +{ + return m_modifiedOnHost; +} + +bool +FieldBase::need_sync_to_host() const +{ + return m_modifiedOnDevice; } void @@ -408,6 +424,8 @@ FieldBase::sync_to_host() const { if (m_ngpField != nullptr) { m_ngpField->sync_to_host(); + } else { + clear_device_sync_state(); } } @@ -416,31 +434,37 @@ FieldBase::sync_to_device() const { if (m_ngpField != nullptr) { m_ngpField->sync_to_device(); + } else { + clear_host_sync_state(); } } void FieldBase::clear_sync_state() const { - if (m_ngpField != nullptr) { - m_ngpField->clear_sync_state(); + if(m_ngpField != nullptr) { + m_ngpField->notify_sync_debugger_clear_sync_state(); } + m_modifiedOnHost = false; + m_modifiedOnDevice = false; } void FieldBase::clear_host_sync_state() const { - if (m_ngpField != nullptr) { - m_ngpField->clear_host_sync_state(); + if(m_ngpField != nullptr) { + m_ngpField->notify_sync_debugger_clear_host_sync_state(); } + m_modifiedOnHost = false; } void FieldBase::clear_device_sync_state() const { - if (m_ngpField != nullptr) { - m_ngpField->clear_device_sync_state(); + if(m_ngpField != nullptr) { + m_ngpField->notify_sync_debugger_clear_device_sync_state(); } + m_modifiedOnDevice = false; } void diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldBase.hpp b/packages/stk/stk_mesh/stk_mesh/base/FieldBase.hpp index 7af36a9dad56..aff73d7445d7 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldBase.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldBase.hpp @@ -231,6 +231,8 @@ class FieldBase void modify_on_device() const; void modify_on_host(const Selector& s) const; void modify_on_device(const Selector& s) const; + bool need_sync_to_host() const; + bool need_sync_to_device() const; void sync_to_host() const; void sync_to_device() const; void clear_sync_state() const; @@ -344,7 +346,9 @@ class FieldBase m_this_state(arg_this_state), m_ngpField(nullptr), m_numSyncsToHost(0), - m_numSyncsToDevice(0) + m_numSyncsToDevice(0), + m_modifiedOnHost(false), + m_modifiedOnDevice(false) { FieldBase * const pzero = nullptr ; const shards::ArrayDimTag * const dzero = nullptr ; @@ -377,6 +381,8 @@ class FieldBase mutable NgpFieldBase * m_ngpField; mutable size_t m_numSyncsToHost; mutable size_t m_numSyncsToDevice; + mutable bool m_modifiedOnHost; + mutable bool m_modifiedOnDevice; mutable Teuchos::any m_stkFieldSyncDebugger; }; diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.cpp b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.cpp index 993520c27c58..abae4a408231 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.cpp @@ -134,7 +134,7 @@ void DefaultFieldDataManager::allocate_bucket_field_data(const EntityRank rank, FieldMetaData field_meta_data = {nullptr, 0}; const FieldBase & field = *fields[i]; - if(static_cast(field.entity_rank()) == rank) + if (field.entity_rank() == rank) { size_t num_bytes_per_entity = getNumBytesForField(field, rank, superset_parts); if(num_bytes_per_entity > 0) @@ -159,7 +159,7 @@ void DefaultFieldDataManager::allocate_bucket_field_data(const EntityRank rank, for(size_t i = 0; i < fields.size(); ++i) { const FieldBase & field = *fields[i]; - if(static_cast(field.entity_rank()) == rank) + if (field.entity_rank() == rank) { const unsigned char* init_val = reinterpret_cast(field.get_initial_value()); FieldMetaData& field_meta_data = const_cast(field.get_meta_data_for_field().back()); @@ -177,7 +177,7 @@ void DefaultFieldDataManager::allocate_bucket_field_data(const EntityRank rank, void DefaultFieldDataManager::allocate_new_field_meta_data(const EntityRank rank, const unsigned bucketId, const std::vector& allFields) { for (FieldBase* field : allFields) { - if (static_cast(field->entity_rank()) == rank) { + if (field->entity_rank() == rank) { if (bucketId >= field->get_meta_data_for_field().size()) { FieldMetaData fieldMetaData = {nullptr, 0}; field->get_meta_data_for_field().push_back(fieldMetaData); @@ -195,7 +195,7 @@ std::vector DefaultFieldDataManager::get_old_bucket_field_offsets(const size_t currentFieldOldOffset = 0; for (unsigned int i = 0; i < allFields.size(); ++i) { const bool isFieldValid = (allFields[i] != nullptr); - const bool isTargetRank = (static_cast(allFields[i]->entity_rank()) == rank); + const bool isTargetRank = (allFields[i]->entity_rank() == rank); if (isFieldValid && isTargetRank) { const bool isBucketInRange = (bucketId < allFields[i]->get_meta_data_for_field().size()); @@ -220,7 +220,7 @@ std::vector DefaultFieldDataManager::get_new_bucket_field_offsets(const size_t currentFieldNewOffset = 0; for (size_t i = 0; i < allFields.size(); ++i) { const FieldBase& field = *allFields[i]; - if (static_cast(field.entity_rank()) == rank) { + if (field.entity_rank() == rank) { size_t numBytesPerEntity = getNumBytesForField(field, rank, supersetParts); size_t fieldDataSizeThisBucket = stk::adjust_up_to_alignment_boundary(numBytesPerEntity * capacity, alignment_increment_bytes); @@ -246,7 +246,7 @@ void DefaultFieldDataManager::copy_field_data_from_old_to_new_bucket(const Entit { size_t fieldIndex = 0; for (const FieldBase* field : allFields) { - if (static_cast(field->entity_rank()) == rank) { + if (field->entity_rank() == rank) { size_t oldFieldAllocationSize = oldOffsetForField[fieldIndex + 1] - oldOffsetForField[fieldIndex]; std::memcpy(newAllocationAllFields + newOffsetForField[fieldIndex], oldAllocationAllFields + oldOffsetForField[fieldIndex], oldFieldAllocationSize); @@ -264,7 +264,7 @@ void DefaultFieldDataManager::update_field_pointers_to_new_bucket(const EntityRa size_t currentFieldOffset = 0; for (size_t i = 0; i < allFields.size(); ++i) { const FieldBase& field = *allFields[i]; - if (static_cast(field.entity_rank()) == rank) { + if (field.entity_rank() == rank) { FieldMetaData& fieldMetaData = const_cast(field.get_meta_data_for_field()[bucketId]); updateFieldPointer(fieldMetaData, capacity, currentFieldOffset, newAllocationAllFields, alignment_increment_bytes); } @@ -273,7 +273,7 @@ void DefaultFieldDataManager::update_field_pointers_to_new_bucket(const EntityRa void DefaultFieldDataManager::initialize_new_field_values(FieldBase& currentField, const EntityRank rank, const unsigned bucketId, const size_t capacity) { - if (static_cast(currentField.entity_rank()) == rank) { + if (currentField.entity_rank() == rank) { const unsigned char* initVal = reinterpret_cast(currentField.get_initial_value()); FieldMetaData& fieldMetaData = const_cast(currentField.get_meta_data_for_field()[bucketId]); initializeField(fieldMetaData, initVal, capacity); @@ -317,7 +317,7 @@ void DefaultFieldDataManager::deallocate_bucket_field_data(const EntityRank rank for(unsigned int i = 0; i < fields.size(); ++i) { if(fields[i] == nullptr || - static_cast(fields[i]->entity_rank()) != rank || + fields[i]->entity_rank() != rank || fields[i]->get_meta_data_for_field().size() <= bucket_id) continue; FieldMetaData& field_data = fields[i]->get_meta_data_for_field()[bucket_id]; @@ -346,7 +346,7 @@ void DefaultFieldDataManager::reorder_bucket_field_data(EntityRank rank, const s for(size_t i = 0; i < fields.size(); ++i) { - if(static_cast(fields[i]->entity_rank()) == rank) + if (fields[i]->entity_rank() == rank) { FieldMetaDataVector new_field_meta_data_vector(reorderedBucketIds.size()); for(unsigned m = 0, e = reorderedBucketIds.size(); m < e; ++m) @@ -388,7 +388,7 @@ void DefaultFieldDataManager::initialize_entity_field_data(EntityRank rank, unsi for(size_t i = 0; i < fields.size(); ++i) { const FieldBase & field = *fields[i]; - if(static_cast(field.entity_rank()) == rank) + if (field.entity_rank() == rank) { const FieldMetaData& field_meta_data = fields[i]->get_meta_data_for_field()[bucket_id]; const int num_bytes_per_entity = field_meta_data.m_bytes_per_entity; diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp index c117cd39be7c..0a02b25b0c84 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp @@ -70,7 +70,6 @@ class AllocatorAdaptor : public AllocatorAdaptorInterface { } }; - class FieldDataManager { public: diff --git a/packages/stk/stk_mesh/stk_mesh/base/FindRestriction.cpp b/packages/stk/stk_mesh/stk_mesh/base/FindRestriction.cpp index 329957478b71..a139a0449c7f 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FindRestriction.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FindRestriction.cpp @@ -87,7 +87,7 @@ const FieldBase::Restriction& find_restriction(const FieldBase& field, EntityRank erank, const PartVector& parts) { - if(static_cast(field.entity_rank()) == erank) + if (field.entity_rank() == erank) { const std::vector & restrictions = field.restrictions(); for(std::vector::const_iterator it=restrictions.begin(), it_end=restrictions.end(); it != it_end; ++it) { @@ -104,7 +104,7 @@ const FieldBase::Restriction& find_restriction(const FieldBase& field, EntityRank erank, const Part & part) { - if(static_cast(field.entity_rank()) == erank) + if (field.entity_rank() == erank) { const std::vector & restrictions = field.restrictions(); for(std::vector::const_iterator it=restrictions.begin(), it_end=restrictions.end(); it != it_end; ++it) { @@ -125,7 +125,7 @@ const FieldBase::Restriction& find_and_check_restriction(const FieldBase& field, const FieldBase::Restriction & empty = empty_field_restriction(); const FieldBase::Restriction * restriction = & empty; - if(static_cast(field.entity_rank()) == erank) + if (field.entity_rank() == erank) { const std::vector & restrictions = field.restrictions(); for(std::vector::const_iterator it=restrictions.begin(), it_end=restrictions.end(); it != it_end; ++it) { diff --git a/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp b/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp index fc3b4f6cfabb..358d24d4b571 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp @@ -49,6 +49,7 @@ NgpField & get_updated_ngp_field_async(const FieldBase & stkFiel if (ngpField == nullptr) { ngpField = new NgpField(stkField.get_mesh(), stkField, execSpace, true); impl::set_ngp_field(stkField, ngpField); + ngpField->clear_host_sync_state(); } else { if (stkField.get_mesh().synchronized_count() != ngpField->synchronized_count()) { diff --git a/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp b/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp index ef6f378c5583..5cfc1794dcc7 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp @@ -68,8 +68,6 @@ class HostField : public NgpFieldBase synchronizedCount(0), asyncCopyState(impl::AsyncCopyState()) { - needSyncToHost = std::make_shared(false); - needSyncToDevice = std::make_shared(false); } HostField(const stk::mesh::BulkData& b, const stk::mesh::FieldBase& f, bool isFromGetUpdatedNgpField = false) @@ -80,8 +78,6 @@ class HostField : public NgpFieldBase asyncCopyState(impl::AsyncCopyState()) { field->template make_field_sync_debugger(); - needSyncToHost = std::make_shared(false); - needSyncToDevice = std::make_shared(false); update_field(); } @@ -99,9 +95,7 @@ class HostField : public NgpFieldBase void update_field() override { - if (hostBulk->synchronized_count() != synchronizedCount) { - copy_host_to_device(); - } + field->increment_num_syncs_to_device(); synchronizedCount = hostBulk->synchronized_count(); } @@ -183,28 +177,27 @@ class HostField : public NgpFieldBase }); } - void modify_on_host() override { set_modify_on_host(); } + void modify_on_host() override { field->modify_on_host(); } - void modify_on_device() override { set_modify_on_device(); } + void modify_on_device() override { field->modify_on_device(); } void clear_sync_state() override { - *needSyncToHost = false; - *needSyncToDevice = false; + field->clear_sync_state(); } - void modify_on_host(const Selector& selector) override { set_modify_on_host(); } + void modify_on_host(const Selector& selector) override { field->modify_on_host(selector); } - void modify_on_device(const Selector& selector) override { set_modify_on_device(); } + void modify_on_device(const Selector& selector) override { field->modify_on_device(selector); } void clear_host_sync_state() override { - *needSyncToDevice = false; + field->clear_host_sync_state(); } void clear_device_sync_state() override { - *needSyncToHost = false; + field->clear_device_sync_state(); } void sync_to_host() override @@ -217,6 +210,7 @@ class HostField : public NgpFieldBase { if (need_sync_to_host()) { copy_device_to_host(); + clear_device_sync_state(); } } @@ -233,6 +227,7 @@ class HostField : public NgpFieldBase update_field(); } copy_host_to_device(); + clear_host_sync_state(); } } @@ -244,10 +239,7 @@ class HostField : public NgpFieldBase void update_bucket_pointer_view() override { } - void swap(HostField &other) { - needSyncToHost.swap(other.needSyncToHost); - needSyncToDevice.swap(other.needSyncToDevice); - } + void swap(HostField &other) { } stk::mesh::EntityRank get_rank() const { return field ? field->entity_rank() : stk::topology::INVALID_RANK; } @@ -257,44 +249,33 @@ class HostField : public NgpFieldBase void debug_modification_end(size_t) override {} void debug_detect_device_field_modification() override {} -protected: - bool need_sync_to_host() const { return *needSyncToHost; } + bool need_sync_to_host() const override { return field->need_sync_to_host(); } + + bool need_sync_to_device() const override { return field->need_sync_to_device(); } - bool need_sync_to_device() const { return *needSyncToDevice; } + void notify_sync_debugger_clear_sync_state() override {} + void notify_sync_debugger_clear_host_sync_state() override {} + void notify_sync_debugger_clear_device_sync_state() override {} private: - void set_modify_on_host() { -#ifdef KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK - ThrowRequireMsg(*needSyncToHost == false, "field " << field->name()); -#endif - *needSyncToDevice = true; - } void set_modify_on_device() { -#ifdef KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK - ThrowRequireMsg(*needSyncToDevice == false, "field " << field->name()); -#endif - *needSyncToHost = true; + field->modify_on_device(); } void copy_host_to_device() { field->increment_num_syncs_to_device(); - clear_sync_state(); } void copy_device_to_host() { field->increment_num_syncs_to_host(); - clear_sync_state(); } const BulkData* hostBulk; const stk::mesh::FieldBase * field; - std::shared_ptr needSyncToHost; - std::shared_ptr needSyncToDevice; - size_t synchronizedCount; impl::AsyncCopyState asyncCopyState; }; diff --git a/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp b/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp index c6f178a13d96..2666ef879c78 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/MetaData.cpp @@ -1095,12 +1095,9 @@ get_topology(const MetaData& meta_data, EntityRank entity_rank, const std::pair< first_found_part = ∂ } else { - if ( top != stk::topology::INVALID_TOPOLOGY && top != topology) { - std::ostringstream os; - os << "topology defined as both " << topology.name() << " and as " << top.name() - << "; a given mesh entity must have only one topology."; - throw std::runtime_error(os.str()); - } + ThrowRequireMsg(top == stk::topology::INVALID_TOPOLOGY || top == topology, + "topology defined as both " << topology.name() << " and as " << top.name() + << "; a given mesh entity must have only one topology."); } } } diff --git a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp index 0fedde4861c3..3cdbcc52481a 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp @@ -26,6 +26,8 @@ class NgpFieldBase virtual void modify_on_host(const Selector& selector) = 0; virtual void modify_on_device() = 0; virtual void modify_on_device(const Selector& selector) = 0; + virtual bool need_sync_to_host() const = 0; + virtual bool need_sync_to_device() const = 0; virtual void clear_sync_state() = 0; virtual void clear_host_sync_state() = 0; virtual void clear_device_sync_state() = 0; @@ -43,6 +45,9 @@ class NgpFieldBase virtual void debug_modification_end(size_t synchronizationCount) = 0; virtual void debug_detect_device_field_modification() = 0; virtual unsigned debug_get_bucket_offset(unsigned bucketOrdinal) const = 0; + virtual void notify_sync_debugger_clear_sync_state() = 0; + virtual void notify_sync_debugger_clear_host_sync_state() = 0; + virtual void notify_sync_debugger_clear_device_sync_state() = 0; }; } diff --git a/packages/stk/stk_mesh/stk_mesh/base/NgpTypes.hpp b/packages/stk/stk_mesh/stk_mesh/base/NgpTypes.hpp index 8a2c990faa94..a01887716a7e 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/NgpTypes.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/NgpTypes.hpp @@ -45,7 +45,7 @@ namespace mesh { using DeviceCommMapIndices = Kokkos::View; using EntityKeyViewType = Kokkos::View; using EntityViewType = Kokkos::View; -using BucketConnectivityType = Kokkos::View; +using BucketConnectivityType = Kokkos::View; using UnsignedViewType = Kokkos::View; using BoolViewType = Kokkos::View; using OrdinalViewType = Kokkos::View; diff --git a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp new file mode 100644 index 000000000000..b0b351e3d407 --- /dev/null +++ b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp @@ -0,0 +1,193 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 + +namespace stk { +namespace mesh { + +SparseConnectivity::SparseConnectivity(unsigned numRanks) + : m_numRanks(numRanks) +{ + update_num_ranks(numRanks); +} + +void SparseConnectivity::update_num_ranks(unsigned numRanks) +{ + const unsigned minNumRanks = stk::topology::NUM_RANKS; + m_numRanks = std::max(numRanks, minNumRanks); + + m_entityPermutationOffset.resize(m_numRanks); + m_permutations.resize(m_numRanks); + for(unsigned rank=0; rank()); + } +} + +void SparseConnectivity::update_size_of_entity_index_space(unsigned numEntities) +{ + m_meshConnectivity.resize(numEntities); +} + +bool SparseConnectivity::has_permutation(EntityRank fromRank, EntityRank toRank) +{ + return (fromRank > stk::topology::NODE_RANK && fromRank < stk::topology::CONSTRAINT_RANK) + && (toRank > stk::topology::NODE_RANK && toRank < stk::topology::CONSTRAINT_RANK); +} + +const Permutation* SparseConnectivity::begin_permutations(Entity fromEntity, + EntityRank connectedRank) const +{ + if (static_cast(connectedRank) < m_entityPermutationOffset.size() && + fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { + const int entityOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; + return m_permutations[connectedRank][entityOffset].data(); + } + return nullptr; +} + +const Permutation* SparseConnectivity::end_permutations(Entity fromEntity, + EntityRank connectedRank) const +{ + if (static_cast(connectedRank) < m_entityPermutationOffset.size() && + fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { + const int entityOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; + const std::vector& perms = m_permutations[connectedRank][entityOffset]; + return (perms.data()+perms.size()); + } + return nullptr; +} + +bool SparseConnectivity::add_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal, + Permutation permutation) +{ + Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; + int insertLocation = conn.add_connectivity(connectedRank, + connectedEntity, ordinal, (connectedRank > fromRank)); + + if (insertLocation >= 0 && has_permutation(fromRank, connectedRank)) { + if (fromEntity.local_offset() >= m_entityPermutationOffset[connectedRank].size()) { + m_entityPermutationOffset[connectedRank].resize(fromEntity.local_offset()+1); + m_entityPermutationOffset[connectedRank][fromEntity.local_offset()] = 0; + } + unsigned& permOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; + if (permOffset == 0) { + permOffset = m_permutations[connectedRank].size(); + m_permutations[connectedRank].push_back(std::vector(1, permutation)); + return true; + } + std::vector& permutations = m_permutations[connectedRank][permOffset]; + permutations.insert(permutations.begin()+insertLocation, permutation); + } + + return insertLocation >= 0; +} + +bool SparseConnectivity::replace_or_add_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal) +{ + Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; + int insertLocation = conn.replace_or_add_connectivity(connectedRank, + connectedEntity, ordinal); + + return insertLocation >= 0; +} + +bool SparseConnectivity::remove_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal) +{ + Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; + int location = conn.remove_connectivity(connectedRank, connectedEntity, ordinal); + + if (location >= 0) { + if (has_permutation(fromRank, connectedRank)) { + const unsigned permOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; + std::vector& permutations = m_permutations[connectedRank][permOffset]; + permutations.erase(permutations.begin()+location); + } + return true; + } + return false; +} + +bool SparseConnectivity::replace_permutation(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + ConnectivityOrdinal ordinal, + Permutation newPermutation) +{ + if (fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { + const ConnectivityOrdinal* ordsBegin = begin_ordinals(fromEntity, connectedRank); + const ConnectivityOrdinal* ordsEnd = end_ordinals(fromEntity, connectedRank); + + bool foundIt = false; + const bool downward = fromRank > connectedRank; + unsigned idx = ordsEnd - ordsBegin; + if (downward) { + const ConnectivityOrdinal* iter = std::lower_bound(ordsBegin, ordsEnd, ordinal); + idx = iter - ordsBegin; + foundIt = (iter != ordsEnd && *iter == ordinal); + } + else { + const ConnectivityOrdinal* iter = std::find(ordsBegin, ordsEnd, ordinal); + idx = iter - ordsBegin; + foundIt = (iter != ordsEnd); + } + if (foundIt) { + const int entityPermOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; + std::vector& perms = m_permutations[connectedRank][entityPermOffset]; + perms[idx] = newPermutation; + return true; + } + } + return false; +} + +} // namespace mesh +} // namespace stk + diff --git a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp new file mode 100644 index 000000000000..a05f87d84a73 --- /dev/null +++ b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp @@ -0,0 +1,151 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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. +// + +#ifndef STK_MESH_SPARSECONNECTIVITY_HPP +#define STK_MESH_SPARSECONNECTIVITY_HPP + +#include +#include // for EntityRank +#include +#include +#include + +namespace stk { +namespace mesh { + +class SparseConnectivity { +public: + SparseConnectivity(unsigned numRanks = stk::topology::NUM_RANKS); + virtual ~SparseConnectivity(){} + + void update_num_ranks(unsigned numRanks); + void update_size_of_entity_index_space(unsigned numEntities); + + static bool has_permutation(EntityRank fromRank, EntityRank toRank); + + unsigned num_connectivity(Entity fromEntity, EntityRank connectedRank) const; + + const Entity* begin_connectivity(Entity fromEntity, EntityRank connectedRank) const; + const Entity* end_connectivity(Entity fromEntity, EntityRank connectedRank) const; + + const ConnectivityOrdinal* begin_ordinals(Entity fromEntity, EntityRank connectedRank) const; + const ConnectivityOrdinal* end_ordinals(Entity fromEntity, EntityRank connectedRank) const; + + const Permutation* begin_permutations(Entity fromEntity, EntityRank connectedRank) const; + const Permutation* end_permutations(Entity fromEntity, EntityRank connectedRank) const; + + bool add_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal, + Permutation permutation); + + bool replace_or_add_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal); + + bool remove_connectivity(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + Entity connectedEntity, + ConnectivityOrdinal ordinal); + + bool replace_permutation(EntityRank fromRank, + Entity fromEntity, + EntityRank connectedRank, + ConnectivityOrdinal ordinal, + Permutation newPermutation); + + PairIterEntity get_connectivity(Entity fromEntity, EntityRank connectedRank) const; + + const Connectivity& get_connectivity(Entity entity) const { return m_meshConnectivity[entity.local_offset()]; } + Connectivity& get_connectivity(Entity entity) { return m_meshConnectivity[entity.local_offset()]; } + +private: + + std::vector m_meshConnectivity; + std::vector> m_entityPermutationOffset; + std::vector>> m_permutations; + unsigned m_numRanks; +}; + +inline +unsigned SparseConnectivity::num_connectivity(Entity fromEntity, + EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].num_connectivity(connectedRank); +} + +inline +const Entity* SparseConnectivity::begin_connectivity(Entity fromEntity, + EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].begin_connectivity(connectedRank); +} + +inline +const Entity* SparseConnectivity::end_connectivity(Entity fromEntity, + EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].end_connectivity(connectedRank); +} + +inline +PairIterEntity SparseConnectivity::get_connectivity(Entity fromEntity, EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].get_connectivity(connectedRank); +} + +inline +const ConnectivityOrdinal* SparseConnectivity::begin_ordinals(Entity fromEntity, + EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].begin_ordinals(connectedRank); +} + +inline +const ConnectivityOrdinal* SparseConnectivity::end_ordinals(Entity fromEntity, + EntityRank connectedRank) const +{ + return m_meshConnectivity[fromEntity.local_offset()].end_ordinals(connectedRank); +} + +} // namespace mesh +} // namespace stk + +#endif //STK_MESH_SPARSECONNECTIVITY_HPP + diff --git a/packages/stk/stk_mesh/stk_mesh/base/Types.hpp b/packages/stk/stk_mesh/stk_mesh/base/Types.hpp index 083a6e1018ba..13729f625b3c 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Types.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Types.hpp @@ -236,6 +236,9 @@ typedef std::vector EntityCommInfoVector; typedef PairIter< EntityCommInfoVector::const_iterator > PairIterEntityComm ; #endif + +using PairIterEntity = PairIter; + /** \} */ //---------------------------------------------------------------------- diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp index 2143cdaf75f2..575e12b98169 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp @@ -42,7 +42,6 @@ #include // for Partition, lower_bound #include #include -#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity #include "stk_mesh/base/FieldBase.hpp" // for FieldBase #include "stk_mesh/base/MetaData.hpp" // for MetaData #include "stk_mesh/base/Types.hpp" // for BucketVector, EntityRank, etc @@ -278,52 +277,6 @@ Partition* BucketRepository::create_partition( return partition; } -void BucketRepository::internal_modification_end() -{ - sync_from_partitions(); - - for(EntityRank from_rank = stk::topology::NODE_RANK; from_rank < stk::topology::NUM_RANKS; ++from_rank) - { - const BucketVector &buckets = this->buckets(from_rank); - unsigned num_buckets = buckets.size(); - for(unsigned j = 0; j < num_buckets; ++j) - { - ThrowAssert(buckets[j] != NULL); - Bucket &bucket = *buckets[j]; - - // Update the hop-saving connectivity data on this bucket. - // - for(EntityRank to_rank = stk::topology::NODE_RANK; to_rank < stk::topology::NUM_RANKS; ++to_rank) - { - if (from_rank == to_rank) { - continue; - } - - switch(to_rank) - { - case stk::topology::NODE_RANK: - bucket.m_fixed_node_connectivity.end_modification(&bucket.m_mesh); - break; - case stk::topology::EDGE_RANK: - bucket.m_dynamic_edge_connectivity.end_modification(&bucket.m_mesh); - break; - case stk::topology::FACE_RANK: - bucket.m_dynamic_face_connectivity.end_modification(&bucket.m_mesh); - break; - case stk::topology::ELEMENT_RANK: - bucket.m_dynamic_element_connectivity.end_modification(&bucket.m_mesh); - break; - case stk::topology::INVALID_RANK: - break; - default: - bucket.m_dynamic_other_connectivity.end_modification(&bucket.m_mesh); - break; - } - } - } - } -} - void BucketRepository::sync_from_partitions() { for (EntityRank rank = stk::topology::NODE_RANK; rank < static_cast(m_partitions.size()); ++rank) diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp index 11398d136ee8..db99005a0d88 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp @@ -132,9 +132,6 @@ class BucketRepository PartOrdinal* keyPtr, PartOrdinal* keyEnd); - // For use by BulkData::internal_modification_end(). - void internal_modification_end(); - // Update m_buckets from the partitions. void sync_from_partitions(); void sync_from_partitions(EntityRank rank); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp index 3b5dc54a2c99..7d66af99bfbd 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp @@ -1264,52 +1264,10 @@ void comm_sync_aura_send_recv( } } -void insert_upward_relations(const BulkData& bulk_data, Entity rel_entity, - const EntityRank rank_of_orig_entity, - const int share_proc, - std::vector& send) -{ - EntityRank rel_entity_rank = bulk_data.entity_rank(rel_entity); - ThrowAssert(rel_entity_rank > rank_of_orig_entity); - - // If related entity is higher rank, I own it, and it is not - // already shared by proc, ghost it to the sharing processor. - if ( bulk_data.bucket(rel_entity).owned() && ! bulk_data.in_shared(rel_entity, share_proc) ) { - - send.emplace_back(rel_entity,share_proc); - - // There may be even higher-ranking entities that need to be ghosted, so we must recurse - const EntityRank end_rank = static_cast(bulk_data.mesh_meta_data().entity_rank_count()); - for (EntityRank irank = static_cast(rel_entity_rank + 1); irank < end_rank; ++irank) - { - const int num_rels = bulk_data.num_connectivity(rel_entity, irank); - Entity const* rels = bulk_data.begin(rel_entity, irank); - - for (int r = 0; r < num_rels; ++r) - { - Entity const rel_of_rel_entity = rels[r]; - if (bulk_data.is_valid(rel_of_rel_entity)) { - insert_upward_relations(bulk_data, rel_of_rel_entity, rel_entity_rank, share_proc, send); - } - } - } - } -} - -EntityRank get_highest_upward_connected_rank(const BulkData& mesh, Entity entity) -{ - const EntityRank entityRank = mesh.entity_rank(entity); - EntityRank highestRank = static_cast(mesh.mesh_meta_data().entity_rank_count()-1); - while(highestRank > entityRank && mesh.num_connectivity(entity, highestRank) == 0) { - highestRank = static_cast(highestRank-1); - } - return highestRank; -} - void insert_upward_relations(const BulkData& bulk_data, + const Connectivity& entityConnectivity, const EntityProcMapping& entitySharing, Entity rel_entity, - const EntityRank rank_of_orig_entity, const int share_proc, EntityProcMapping& send) { @@ -1321,13 +1279,8 @@ void insert_upward_relations(const BulkData& bulk_data, send.addEntityProc(rel_entity,share_proc); - const unsigned bucketOrd = idx.bucket_ordinal; - const EntityRank upwardRank = get_highest_upward_connected_rank(bulk_data, rel_entity); - const int numRels = bucket.num_connectivity(bucketOrd, upwardRank); - Entity const* rels = bucket.begin(bucketOrd, upwardRank); - - for (int r = 0; r < numRels; ++r) { - Entity const upwardEntity = rels[r]; + PairIterEntity conn = entityConnectivity.get_highest_rank_connectivity(bulk_data.entity_rank(rel_entity)); + for( Entity upwardEntity : conn) { if (bulk_data.is_valid(upwardEntity) && bulk_data.bucket(upwardEntity).owned()) { if (!entitySharing.find(upwardEntity, share_proc)) { send.addEntityProc(upwardEntity, share_proc); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp index e3f049063a23..8403ea4f2a17 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp @@ -59,8 +59,34 @@ struct EntityGhostData; //stk-mesh capabilities. //---------------------------------------------------------------------- +void remove_entities_not_connected_to_other_nodes(const BulkData& mesh, EntityRank rank, + unsigned numNodes, const Entity* nodes, + std::vector& elementsInCommon); + void find_entities_these_nodes_have_in_common(const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); +template +void find_entities_these_nodes_have_in_common_and(const BulkData& mesh, EntityRank rank, + unsigned numNodes, const Entity* nodes, + std::vector& elementsInCommon, + const Pred& pred) +{ + elementsInCommon.clear(); + if(numNodes > 0) + { + const Entity* begin = mesh.begin(nodes[0], rank); + const Entity* end = mesh.end(nodes[0], rank); + elementsInCommon.reserve(std::distance(begin,end)); + for(const Entity* ent = begin; ent != end; ++ent) { + if (pred(*ent)) { + elementsInCommon.push_back(*ent); + } + } + + remove_entities_not_connected_to_other_nodes(mesh, rank, numNodes, nodes, elementsInCommon); + } +} + void find_entities_with_larger_ids_these_nodes_have_in_common_and_locally_owned(stk::mesh::EntityId id, const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); bool do_these_nodes_have_any_shell_elements_in_common(BulkData& mesh, unsigned numNodes, const Entity* nodes); @@ -218,15 +244,10 @@ void comm_sync_aura_send_recv( EntityProcMapping& entityProcMapping, std::vector& ghostStatus ); -void insert_upward_relations(const BulkData& bulk_data, Entity rel_entity, - const EntityRank rank_of_orig_entity, - const int share_proc, - std::vector& send); - void insert_upward_relations(const BulkData& bulk_data, + const Connectivity& entityConnectivity, const EntityProcMapping& entitySharing, Entity rel_entity, - const EntityRank rank_of_orig_entity, const int share_proc, EntityProcMapping& send); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp index b7bb82c7bb7a..c301ada91b24 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp @@ -21,6 +21,7 @@ bool MeshModification::modification_begin(const std::string description) if (numRanks > m_bulkData.m_selector_to_buckets_maps.size()) { m_bulkData.m_selector_to_buckets_maps.resize(numRanks); } + m_bulkData.m_sparse_connectivity.update_num_ranks(m_bulkData.mesh_meta_data().entity_rank_count()); } if ( this->in_modifiable_state() ) return false ; diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp index 100a2c2e1f68..8945a5620fe3 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp @@ -95,7 +95,7 @@ void print_field_data_for_entity(const BulkData& mesh, const MeshIndex& meshInde size_t b_ord = meshIndex.bucket_ordinal; const FieldVector& all_fields = mesh.mesh_meta_data().get_fields(); for(FieldBase* field : all_fields) { - if(static_cast(field->entity_rank()) != bucket->entity_rank()) continue; + if(field->entity_rank() != bucket->entity_rank()) continue; FieldMetaData field_meta_data = field->get_meta_data_for_field()[bucket->bucket_id()]; unsigned data_size = field_meta_data.m_bytes_per_entity; if (data_size > 0) { // entity has this field? @@ -187,6 +187,20 @@ void print_connectivity_of_rank(const BulkData& M, Entity entity, } } +void print_upward_connectivity(const BulkData& bulk, Entity entity, std::ostream& out) +{ + EntityRank nextRank = static_cast(bulk.entity_rank(entity)+1); + EntityRank endRank = static_cast(bulk.mesh_meta_data().entity_rank_count()); + + for(EntityRank rank = nextRank; rank < endRank; ++rank) { + const unsigned num = bulk.num_connectivity(entity, rank); + const Entity* conn = bulk.begin(entity, rank); + for(unsigned i=0; i -void coarse_search( std::vector > const& domain, - std::vector > const& range, - SearchMethod method, - stk::ParallelMachine comm, - std::vector< std::pair< DomainIdent, RangeIdent> > & intersections, - bool communicateRangeBoxInfo=true - ) +void coarse_search(std::vector> const& domain, + std::vector> const& range, + SearchMethod method, + stk::ParallelMachine comm, + std::vector>& intersections, + bool communicateRangeBoxInfo = true, + bool determineDomainAndRange = true) { switch( method ) { case KDTREE: - coarse_search_kdtree_driver(domain,range,comm,intersections,communicateRangeBoxInfo); + if (determineDomainAndRange) { + coarse_search_kdtree_driver(domain,range,comm,intersections,communicateRangeBoxInfo); + } + else { + coarse_search_kdtree(domain,range,comm,intersections,communicateRangeBoxInfo); + } break; default: std::cerr << "coarse_search(..) interface used does not support SearchMethod " << method << std::endl; diff --git a/packages/stk/stk_tools/stk_tools/mesh_tools/DetectHingesImpl.cpp b/packages/stk/stk_tools/stk_tools/mesh_tools/DetectHingesImpl.cpp index 9c0ef6a62420..56557ebaf3f0 100644 --- a/packages/stk/stk_tools/stk_tools/mesh_tools/DetectHingesImpl.cpp +++ b/packages/stk/stk_tools/stk_tools/mesh_tools/DetectHingesImpl.cpp @@ -106,7 +106,7 @@ class SideFinder std::sort(m_scratchSpace, m_scratchSpace+subTopo.num_nodes()); if(are_equal(m_scratchSpace, nodes)) { - elementTopo.sub_topology_nodes(elemNodes, subRank, i, nodes.begin()); + elementTopo.sub_topology_nodes(elemNodes, subRank, i, nodes.data()); return true; } } diff --git a/packages/stk/stk_topology/stk_topology/topology_decl.hpp b/packages/stk/stk_topology/stk_topology/topology_decl.hpp index 414e412a2707..7079e82884e2 100644 --- a/packages/stk/stk_topology/stk_topology/topology_decl.hpp +++ b/packages/stk/stk_topology/stk_topology/topology_decl.hpp @@ -4,6 +4,8 @@ // IWYU pragma: private, include "stk_topology/topology.hpp" #include "stk_util/stk_config.h" #include +#include +#include namespace stk { @@ -25,7 +27,7 @@ struct EquivalentPermutation struct topology { - enum rank_t + enum rank_t : int8_t { BEGIN_RANK , NODE_RANK = BEGIN_RANK @@ -35,8 +37,7 @@ struct topology , CONSTRAINT_RANK , END_RANK , NUM_RANKS = END_RANK - , INVALID_RANK = 256 - , FORCE_RANK_TO_UNSIGNED = 256 + , INVALID_RANK = std::numeric_limits::max() }; //To add new topologies consult the toolkit team diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp index 3a7d0423dd7a..58d544df65f0 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp @@ -49,7 +49,7 @@ class BucketTester : public stk::mesh::Bucket void my_change_connected_nodes(unsigned bucket_ordinal, Entity* new_nodes) { - this->change_existing_connectivity(bucket_ordinal, new_nodes); + this->change_connected_nodes(bucket_ordinal, new_nodes); } void my_change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/Search_UnitTestUtils.hpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/Search_UnitTestUtils.hpp index 127325993050..60fc4fecc6ba 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/Search_UnitTestUtils.hpp +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/Search_UnitTestUtils.hpp @@ -59,9 +59,8 @@ typedef std::vector< StkBoxWithId > StkBoxVector; typedef stk::search::Box FloatBox; typedef std::vector > SearchResults; -typedef std::pair BoxWithId; -typedef std::vector< BoxWithId > FloatBoxVector; - +typedef std::pair FloatBoxWithId; +typedef std::vector FloatBoxVector; template VolumeType generateBoundingVolume(double x, double y, double z, double radius); diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp index 4394de07b491..94884859a0d0 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp @@ -35,7 +35,7 @@ namespace stk namespace unit_test_util { -typedef std::set EntityIdSet; +using EntityIdSet = std::set; class TopologyMapping { @@ -97,16 +97,6 @@ class TopologyMapping }; }; -struct ElementData -{ - int proc; - stk::topology topology; - stk::mesh::EntityId identifier; - stk::mesh::EntityIdVector nodeIds; - std::string partName = ""; - unsigned partId; -}; - class PartIdMapping { public: @@ -206,6 +196,16 @@ class PartIdMapping bool m_idsAssigned; }; +struct ElementData +{ + int proc; + stk::mesh::EntityId identifier; + stk::topology topology; + stk::mesh::EntityIdVector nodeIds; + std::string partName = ""; + unsigned partId; +}; + struct TextMeshData { unsigned spatialDim; @@ -244,173 +244,267 @@ struct TextMeshData std::unordered_map m_nodesOnProc; }; -class TextMeshParser +class Lexer { public: - TextMeshParser(unsigned dim) - : m_spatialDim(dim) + Lexer() + : m_token(""), + m_isNumber(false) + { } + + void set_input_string(const std::string& input) { - validate_spatial_dim(); + m_input = input; + m_currentIndex = 0; + read_next_token(); } - TextMeshData parse(const std::string& meshDescription) + int get_int() { - TextMeshData data; - data.spatialDim = m_spatialDim; - - const std::vector lines = split(meshDescription, '\n'); - - m_lineNumber = 1; - for (const std::string& line : lines) { - ElementData elem = parse_element(line); - data.add_element(elem); - m_lineNumber++; - } - - for (ElementData& elem : data.elementDataVec) { - set_part_id(elem); - } - - return data; + read_next_token(); + return std::stoi(m_oldToken); } -private: - void validate_spatial_dim() + unsigned get_unsigned() { - ThrowRequireMsg(m_spatialDim == 2 || m_spatialDim == 3, "Error! Spatial dimension not defined to be 2 or 3!"); + read_next_token(); + return std::stoul(m_oldToken); } - std::vector split(const std::string &s, char delim) + std::string get_string() { - std::vector tokens; - std::stringstream ss(s); - std::string item; - while (std::getline(ss, item, delim)) { - tokens.push_back(item); - } - return tokens; + read_next_token(); + return make_upper_case(m_oldToken); } - ElementData parse_element(const std::string& rawLine) + void get_newline() { - std::string line = make_upper_case(remove_spaces(rawLine)); + read_next_token(); + } - const std::vector tokens = split(line, ','); - validate_min_token_count(tokens.size()); + bool has_token() const { return m_token != ""; } + bool has_newline() const { return m_token == "\n"; } + bool has_number() const { return has_token() && m_isNumber; } + bool has_string() const { return has_token() && !has_number() && !has_newline(); } - ElementData elementData; - elementData.proc = parse_proc(tokens[0]); - elementData.identifier = parse_identifier(tokens[1]); - elementData.topology = parse_topology(tokens[2]); +private: + void read_next_token() + { + m_oldToken = m_token; - unsigned numNodes = elementData.topology.num_nodes(); + if (char_is_newline()) { + m_isNumber = false; + m_token = "\n"; + m_currentIndex++; + return; + } - validate_token_count(tokens.size(), numNodes, elementData.topology.name()); + m_token = ""; + m_isNumber = true; - for (unsigned i=0; i= numNodes+4) { - elementData.partName = tokens[3+numNodes]; - } - else { - elementData.partName = "block_" + elementData.topology.name(); - } - validate_part_name(elementData.partName); + if (char_is_comma()) { + m_currentIndex++; + break; + } - if (tokens.size() >= numNodes+5) { - m_partIds.register_part_name_with_id(elementData.partName, parse_part_id(tokens[4+numNodes])); - } - else { - m_partIds.register_part_name(elementData.partName); + if (char_is_newline()) { + break; + } + + m_isNumber &= char_is_digit(); + m_token += current_char(); + m_currentIndex++; } + } - return elementData; + bool has_more_input() + { + return m_currentIndex < m_input.size(); } + bool char_is_whitespace() { return current_char() == ' '; } + bool char_is_comma() { return current_char() == ','; } + bool char_is_newline() { return current_char() == '\n'; } + bool char_is_digit() { return std::isdigit(static_cast(current_char())); } + + char current_char() { return m_input[m_currentIndex]; } + std::string make_upper_case(std::string str) { std::transform(str.begin(), str.end(), str.begin(), ::toupper); return str; } - std::string remove_spaces(std::string str) + std::string m_input; + unsigned m_currentIndex; + + std::string m_oldToken; + std::string m_token; + + bool m_isNumber; +}; + +class TextMeshParser +{ +public: + TextMeshParser(unsigned dim) { - std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' '); - str.erase(end_pos, str.end()); - return str; + m_data.spatialDim = dim; } - void validate_min_token_count(size_t numTokens) + TextMeshData parse(const std::string& meshDescription) { - ThrowRequireMsg(numTokens >= 4, - "Error! Each line must contain the following fields (with at least one node): " - "Processor, GlobalId, Element Topology, NodeIds. Error on line " << m_lineNumber << "."); + initialize_parse(meshDescription); + parse_description(); + set_part_ids(); + return m_data; + } + +private: + void initialize_parse(const std::string& meshDescription) + { + m_lexer.set_input_string(meshDescription); + m_lineNumber = 1; + validate_required_field(m_lexer.has_token()); + } + + void parse_description() + { + while (m_lexer.has_token()) { + ElementData elemData = parse_element(); + m_data.add_element(elemData); + + validate_no_extra_fields(); + parse_newline(); + } + } + + ElementData parse_element() + { + ElementData elem; + elem.proc = parse_proc_id(); + elem.identifier = parse_elem_id(); + elem.topology = parse_topology(); + elem.nodeIds = parse_node_ids(elem.topology); + elem.partName = parse_part(elem.topology); + return elem; } - int parse_proc(const std::string& token) + int parse_proc_id() { - return std::stoi(token); + validate_required_field(m_lexer.has_number()); + return parse_int(); } - stk::mesh::EntityId parse_identifier(const std::string& token) + stk::mesh::EntityId parse_elem_id() { - return static_cast(std::stoul(token)); + validate_required_field(m_lexer.has_number()); + return parse_unsigned(); } - stk::topology parse_topology(const std::string& token) + stk::topology parse_topology() { - stk::topology topology = m_topologyMapping.topology(token); - validate_topology(topology, token); + validate_required_field(m_lexer.has_string()); + std::string topologyName = parse_string(); + + stk::topology topology = m_topologyMapping.topology(topologyName); + validate_topology(topology, topologyName); + return topology; } - unsigned parse_part_id(const std::string& token) + stk::mesh::EntityIdVector parse_node_ids(const stk::topology& topology) { - return std::stoul(token); + stk::mesh::EntityIdVector nodeIds; + while (m_lexer.has_number()) { + nodeIds.push_back(parse_unsigned()); + } + validate_node_count(topology, nodeIds.size()); + return nodeIds; } - void validate_topology(const stk::topology& topology, const std::string& token) + std::string parse_part(const stk::topology& topology) { - ThrowRequireMsg(topology != stk::topology::INVALID_TOPOLOGY, - "Error! Topology = >>" << token << "<< is invalid from line " << m_lineNumber << "."); - ThrowRequireMsg(topology.defined_on_spatial_dimension(m_spatialDim), - "Error on input line " << m_lineNumber << ". Topology = " << topology - << " is not defined on spatial dimension = " << m_spatialDim - << " set in MetaData."); + std::string partName; + + if (m_lexer.has_string()) { + partName = parse_string(); + } + else { + partName = "block_" + topology.name(); + } + + if (m_lexer.has_number()) { + unsigned partId = parse_unsigned(); + m_partIds.register_part_name_with_id(partName, partId); + } + else { + m_partIds.register_part_name(partName); + } + + return partName; + } + + int parse_int() { return m_lexer.get_int(); } + unsigned parse_unsigned() { return m_lexer.get_unsigned(); } + std::string parse_string() { return m_lexer.get_string(); } + + void parse_newline() + { + m_lexer.get_newline(); + m_lineNumber++; + } + + void validate_required_field(bool hasNextRequiredField) + { + ThrowRequireMsg(hasNextRequiredField, + "Error! Each line must contain the following fields (with at least one node): " + "Processor, GlobalId, Element Topology, NodeIds. Error on line " << m_lineNumber << "."); } - void validate_token_count(size_t numTokens, unsigned numNodes, const std::string& topologyName) + void validate_no_extra_fields() { - ThrowRequireMsg(numTokens >= numNodes+3 && numTokens <= numNodes+5, - "Error! The input line appears to contain " << numTokens-3 << " nodes, but the topology " - << topologyName << " needs " << numNodes << " nodes on line " << m_lineNumber << "."); + ThrowRequireMsg(!m_lexer.has_token() || m_lexer.has_newline(), + "Error! Each line should not contain more than the following fields (with at least one node): " + "Processor, GlobalId, Element Topology, NodeIds, Part Name, PartId. " + "Error on line " << m_lineNumber << "."); } - void validate_part_name(const std::string& name) + void validate_topology(const stk::topology& topology, const std::string& providedName) { - ThrowRequireMsg(!is_number(name), - "The input line " << m_lineNumber << " specifies the numeric part name " << name); + ThrowRequireMsg(topology != stk::topology::INVALID_TOPOLOGY, + "Error! Topology = >>" << providedName << "<< is invalid from line " << m_lineNumber << "."); + ThrowRequireMsg(topology.defined_on_spatial_dimension(m_data.spatialDim), + "Error on input line " << m_lineNumber << ". Topology = " << topology + << " is not defined on spatial dimension = " << m_data.spatialDim + << " set in MetaData."); } - bool is_number(const std::string& name) + void validate_node_count(const stk::topology& topology, size_t numNodes) { - unsigned num; - std::istringstream nameStream(name); - nameStream >> num; - return !nameStream.fail(); + size_t numTopologyNodes = topology.num_nodes(); + ThrowRequireMsg(numNodes == numTopologyNodes, + "Error! The input line appears to contain " << numNodes << " nodes, but the topology " + << topology << " needs " << numTopologyNodes << " nodes on line " << m_lineNumber << "."); } - void set_part_id(ElementData& elem) + void set_part_ids() { - elem.partId = m_partIds.get(elem.partName); + for (ElementData& elem : m_data.elementDataVec) { + elem.partId = m_partIds.get(elem.partName); + } } - unsigned m_spatialDim; + unsigned m_lineNumber; + TextMeshData m_data; + Lexer m_lexer; TopologyMapping m_topologyMapping; - size_t m_lineNumber; PartIdMapping m_partIds; }; @@ -612,9 +706,11 @@ class TextMesh TextMesh(stk::mesh::BulkData& b, const std::string& meshDesc) : m_bulk(b), m_meta(m_bulk.mesh_meta_data()), - m_parser(m_meta.spatial_dimension()), - m_data(m_parser.parse(meshDesc)) - { } + m_parser(m_meta.spatial_dimension()) + { + validate_spatial_dim(m_meta.spatial_dimension()); + m_data = m_parser.parse(meshDesc); + } void setup_mesh() { @@ -632,6 +728,11 @@ class TextMesh } private: + void validate_spatial_dim(unsigned spatialDim) + { + ThrowRequireMsg(spatialDim == 2 || spatialDim == 3, "Error! Spatial dimension not defined to be 2 or 3!"); + } + stk::mesh::BulkData& m_bulk; stk::mesh::MetaData& m_meta; diff --git a/packages/stk/stk_unit_tests/cmake/Dependencies.cmake b/packages/stk/stk_unit_tests/cmake/Dependencies.cmake index 9ddd99b2705d..04cfd890cb24 100644 --- a/packages/stk/stk_unit_tests/cmake/Dependencies.cmake +++ b/packages/stk/stk_unit_tests/cmake/Dependencies.cmake @@ -5,4 +5,4 @@ SET(TEST_OPTIONAL_DEP_PACKAGES Shards STKCoupling STKTopology STKMath STKSimd ST SET(LIB_REQUIRED_DEP_TPLS) SET(LIB_OPTIONAL_DEP_TPLS) SET(TEST_REQUIRED_DEP_TPLS) -SET(TEST_OPTIONAL_DEP_TPLS Boost MPI) +SET(TEST_OPTIONAL_DEP_TPLS MPI) diff --git a/packages/stk/stk_unit_tests/stk_mesh/FieldBlas/UnitTestFieldBLAS.cpp b/packages/stk/stk_unit_tests/stk_mesh/FieldBlas/UnitTestFieldBLAS.cpp index 13d0d782e504..5fadeca39b18 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/FieldBlas/UnitTestFieldBLAS.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/FieldBlas/UnitTestFieldBLAS.cpp @@ -804,6 +804,15 @@ void test_fill(const Scalar alpha,const Scalar initial1) testFieldValidation(Fixture,alpha,alpha,Scalar()); } +template +void test_fill_many(const Scalar alpha,const Scalar initial1) +{ + BLASFixture Fixture (initial1,initial1,initial1); + + stk::mesh::field_fill(alpha,{Fixture.fieldBase1, Fixture.fieldBase2, Fixture.fieldBase3}); + testFieldValidation(Fixture,alpha,alpha,alpha); +} + TEST(FieldBLAS,fill_double) { const double alpha = 4.27; @@ -811,6 +820,13 @@ TEST(FieldBLAS,fill_double) test_fill(alpha,initial1); } +TEST(FieldBLAS,fill_many_double) +{ + const double alpha = 4.27; + const double initial1 = -3.73; + test_fill_many(alpha,initial1); +} + TEST(FieldBLAS,fill_float) { const float alpha = 4.2; @@ -818,6 +834,13 @@ TEST(FieldBLAS,fill_float) test_fill(alpha,initial1); } +TEST(FieldBLAS,fill_float_many) +{ + const float alpha = 4.2; + const float initial1 = -3.7; + test_fill_many(alpha,initial1); +} + TEST(FieldBLAS,fill_complex) { const std::complex alpha = std::complex(4.11,-7.63); @@ -825,6 +848,13 @@ TEST(FieldBLAS,fill_complex) test_fill(alpha,initial1); } +TEST(FieldBLAS,fill_complex_many) +{ + const std::complex alpha = std::complex(4.11,-7.63); + const std::complex initial1 = std::complex(-7.21,-1.23); + test_fill_many(alpha,initial1); +} + TEST(FieldBLAS,fill_int) { const int alpha = 4; @@ -832,6 +862,13 @@ TEST(FieldBLAS,fill_int) test_fill(alpha,initial1); } +TEST(FieldBLAS,fill_int_many) +{ + const int alpha = 4; + const int initial1 = -3; + test_fill_many(alpha,initial1); +} + template void test_fill_selector(Scalar alpha,Scalar initial1,Scalar initial2) { diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp index 59838cf9313d..232600e5ed98 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp @@ -194,7 +194,7 @@ TEST(UnitTestingOfBucket, bucketSortChangeEntityId) void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity elem, stk::mesh::Entity side, stk::mesh::EntityVector& nodes) { - stk::mesh::EntityRank rank = bulk.entity_rank(side); + stk::mesh::EntityRank sideRank = bulk.entity_rank(side); Entity const *rels_itr = bulk.begin_nodes(side); unsigned num_nodes = bulk.num_nodes(side); @@ -205,7 +205,7 @@ void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity ele stk::mesh::Permutation const *perms = bulk.begin_permutations(side, stk::topology::ELEM_RANK); std::pair ordinalAndPermutation = - stk::mesh::get_ordinal_and_permutation(bulk, elem, rank, nodes); + stk::mesh::get_ordinal_and_permutation(bulk, elem, sideRank, nodes); stk::mesh::Permutation gold_permutation = ordinalAndPermutation.second; ASSERT_TRUE(gold_permutation!=stk::mesh::INVALID_PERMUTATION); @@ -226,8 +226,8 @@ void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity ele stk::mesh::ConnectivityOrdinal elements_side_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; - unsigned num_sides = bulk.num_connectivity(elem, rank); - const stk::mesh::Entity *sides = bulk.begin(elem, rank); + unsigned num_sides = bulk.num_connectivity(elem, sideRank); + const stk::mesh::Entity *sides = bulk.begin(elem, sideRank); for (unsigned i=0;i 1) { GTEST_SKIP(); } + + setup_mesh(1, 1, 1); + + stk::mesh::Entity elem1 = get_bulk().get_entity(stk::topology::ELEM_RANK, 1); + stk::mesh::Bucket& bucket = get_bulk().bucket(elem1); + unsigned bucket_ordinal = get_bulk().bucket_ordinal(elem1); + EXPECT_EQ(0u, bucket_ordinal); + + const stk::mesh::Entity* nodes = bucket.begin_nodes(bucket_ordinal); + stk::mesh::ConnectivityOrdinal ord = 0; + stk::mesh::Permutation perm = stk::mesh::INVALID_PERMUTATION; + + BucketTester& bktTester = static_cast(bucket); + EXPECT_FALSE(bktTester.my_declare_relation(bucket_ordinal, nodes[0], ord, perm)); +} + TEST_F(BucketHex, changing_conn_on_bucket_for_face_to_element) { if (stk::parallel_machine_size(MPI_COMM_WORLD) == 1) @@ -356,41 +386,31 @@ TEST_F(BucketHex, changing_conn_on_bucket_for_face_to_element) std::pair ordinalAndPermutation = stk::mesh::get_ordinal_and_permutation(bulk, elem, stk::topology::FACE_RANK, new_nodes); + stk::mesh::ConnectivityOrdinal faceElemOrdinal = ordinalAndPermutation.first; stk::mesh::Permutation new_permutation = ordinalAndPermutation.second; - unsigned faces_element_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; - unsigned num_elems = bulk.num_elements(side); - const stk::mesh::Entity *elements = bulk.begin_elements(side); - for (unsigned i=0;i(i); - break; - } - } - - unsigned elements_face_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + stk::mesh::ConnectivityOrdinal elemFaceOrdinal = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; unsigned num_faces = bulk.num_faces(elem); const stk::mesh::Entity *faces = bulk.begin_faces(elem); + const stk::mesh::ConnectivityOrdinal *faceOrds = bulk.begin_ordinals(elem, stk::topology::FACE_RANK); for (unsigned i=0;i(i); + elemFaceOrdinal = faceOrds[i]; break; } } - ASSERT_TRUE(elements_face_offset!=stk::mesh::INVALID_CONNECTIVITY_ORDINAL); + ASSERT_TRUE(elemFaceOrdinal!=stk::mesh::INVALID_CONNECTIVITY_ORDINAL); stk::mesh::unit_test::BucketTester& bucket_side = static_cast(bulk.bucket(side)); bucket_side.my_change_connected_nodes(bulk.bucket_ordinal(side), &new_nodes[0]); - bucket_side.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(side), faces_element_offset, new_permutation); + bucket_side.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(side), faceElemOrdinal, new_permutation); stk::mesh::unit_test::BucketTester& bucket_elem = static_cast(bulk.bucket(elem)); - bucket_elem.my_change_existing_permutation_for_connected_face(bulk.bucket_ordinal(elem), elements_face_offset, new_permutation); + bucket_elem.my_change_existing_permutation_for_connected_face(bulk.bucket_ordinal(elem), elemFaceOrdinal, new_permutation); test_nodes_and_permutation(bulk, elem, side, new_nodes); } @@ -424,42 +444,33 @@ TEST_F(BucketHex, changing_conn_on_bucket_for_edge_to_element) std::pair ordinalAndPermutation = stk::mesh::get_ordinal_and_permutation(bulk, elem, stk::topology::EDGE_RANK, new_nodes); + stk::mesh::ConnectivityOrdinal edgeElemOrdinal = ordinalAndPermutation.first; stk::mesh::Permutation new_permutation = ordinalAndPermutation.second; - unsigned edges_element_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; - unsigned num_elems = bulk.num_elements(edge); - const stk::mesh::Entity *elements = bulk.begin_elements(edge); - for (unsigned i=0;i(i); - break; - } - } - - unsigned elements_edge_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + stk::mesh::ConnectivityOrdinal elemEdgeOrdinal = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; unsigned num_edges = bulk.num_edges(elem); const stk::mesh::Entity *edges = bulk.begin_edges(elem); + const stk::mesh::ConnectivityOrdinal *edgeOrds = bulk.begin_ordinals(elem, stk::topology::EDGE_RANK); for (unsigned i=0;i(i); + elemEdgeOrdinal = edgeOrds[i]; break; } } - ASSERT_TRUE(elements_edge_offset != stk::mesh::INVALID_CONNECTIVITY_ORDINAL); + ASSERT_TRUE(elemEdgeOrdinal != stk::mesh::INVALID_CONNECTIVITY_ORDINAL); stk::mesh::unit_test::BucketTester& bucket_edge = static_cast(bulk.bucket(edge)); bucket_edge.my_change_connected_nodes(bulk.bucket_ordinal(edge), &new_nodes[0]); - bucket_edge.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(edge), edges_element_offset, new_permutation); + + bucket_edge.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(edge), edgeElemOrdinal, new_permutation); stk::mesh::unit_test::BucketTester& bucket_elem = static_cast(bulk.bucket(elem)); - bucket_elem.my_change_existing_permutation_for_connected_edge(bulk.bucket_ordinal(elem), elements_edge_offset, new_permutation); + bucket_elem.my_change_existing_permutation_for_connected_edge(bulk.bucket_ordinal(elem), elemEdgeOrdinal, new_permutation); test_nodes_and_permutation(bulk, elem, edge, new_nodes); } @@ -471,8 +482,6 @@ void do_nonmodifying_debug_check(const stk::mesh::BulkData & bulk, const stk::me const stk::mesh::BucketVector & buckets = bulk.buckets(stk::topology::NODE_RANK); ASSERT_EQ(buckets.size(), 1u); - buckets[0]->check_size_invariant(); - EXPECT_FALSE(buckets[0]->get_ngp_field_bucket_is_modified(coordsField.mesh_meta_data_ordinal())); } diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp deleted file mode 100644 index 81e4d791a248..000000000000 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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 // for NULL -#include // for uint64_t -#include // for copy -#include -#include // for vector -#include "gtest/gtest.h" // for AssertHelper, TEST - -// CRW: this should be in BucketConnectivity.hpp, but circular dependency for now -#include "stk_mesh/base/BulkData.hpp" - -#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity -#include "stk_mesh/base/Entity.hpp" // for Entity, operator<< -#include "stk_mesh/base/Types.hpp" // for ConnectivityOrdinal, etc -#include "stk_topology/topology.hpp" // for topology, etc -namespace stk { namespace mesh { class BulkData; } } - -using namespace stk::mesh; - -namespace { - -typedef impl::BucketConnectivity fixed_conn; -typedef impl::BucketConnectivity dynamic_conn; - -void check_uninit_conn_size(fixed_conn& conn, unsigned num_conn, unsigned ordinal) -{ - EXPECT_EQ(conn.num_connectivity(ordinal), num_conn); -} - -void check_uninit_conn_size(dynamic_conn& conn, unsigned num_conn, unsigned ordinal) -{ - EXPECT_EQ(conn.num_connectivity(ordinal), 0u); -} - -void check_even_conn_removed(fixed_conn& conn, unsigned num_conn, unsigned ordinal) -{ - EXPECT_EQ(conn.num_connectivity(ordinal), num_conn); - - Entity const* targets = conn.begin(ordinal); - for (unsigned i = 0; i < num_conn; ++i) { - Entity e_to(ordinal * num_conn + i + 1); - if ( (i % 2) == 0 ) { - EXPECT_EQ(targets[i], Entity()); - } - else { - EXPECT_EQ(targets[i], e_to); - } - } -} - -void check_even_conn_removed(dynamic_conn& conn, unsigned num_conn, unsigned ordinal) -{ - EXPECT_EQ(conn.num_connectivity(ordinal), num_conn / 2); - - Entity const* targets = conn.begin(ordinal); - ConnectivityOrdinal const* ordinals = conn.begin_ordinals(ordinal); - for (unsigned i = 0; i < num_conn / 2; ++i) { - Entity e_to(ordinal * num_conn + ((2*i) + 1) + 1); - EXPECT_EQ(targets[i], e_to); - EXPECT_EQ(ordinals[i], static_cast((2*i) + 1)); - } -} - -template -void test_simple_add(Connectivity& connectivity, unsigned num_entities_to_add, unsigned num_to_add) -{ - // Populate connectivity all at once for each entity - - EXPECT_EQ(connectivity.size(), 0u); - - for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { - connectivity.add_entity(); - - EXPECT_EQ(connectivity.size(), ord + 1); - check_uninit_conn_size(connectivity, num_to_add, ord); - - for (uint64_t i = 0; i < num_to_add; ++i) { - Entity e_to(ord * num_to_add + i + 1); - connectivity.add_connectivity(ord, e_to, static_cast(i)); - } - - EXPECT_EQ(connectivity.num_connectivity(ord), num_to_add); - - Entity const* begin = connectivity.begin(ord); - Entity const* end = connectivity.end(ord); - ConnectivityOrdinal const* begin_ord = connectivity.begin_ordinals(ord); - ConnectivityOrdinal const* end_ord = connectivity.end_ordinals(ord); - - EXPECT_EQ(end - begin, num_to_add); - EXPECT_EQ(end_ord - begin_ord, num_to_add); - - for (uint64_t i = 0; i < num_to_add; ++i) { - Entity expected_to(ord * num_to_add + i + 1); - EXPECT_EQ(expected_to, begin[i]); - EXPECT_EQ(static_cast(i), begin_ord[i]); - } - } -} - -template -void test_complex_add(Connectivity& connectivity, unsigned num_entities_to_add, unsigned num_to_add) -{ - // Populate connectivity one at a time for each entity - - EXPECT_EQ(connectivity.size(), 0u); - - for (uint64_t i = 0; i < num_to_add; ++i) { - for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { - if (i == 0) { - connectivity.add_entity(); - } - - if (i == 0) { - EXPECT_EQ(connectivity.size(), ord + 1); - } - else { - EXPECT_EQ(connectivity.size(), num_entities_to_add); - } - - Entity e_to(ord * num_to_add + i + 1); - connectivity.add_connectivity(ord, e_to, static_cast(i)); - } - } - - for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { - EXPECT_EQ(connectivity.num_connectivity(ord), num_to_add); - - Entity const* begin = connectivity.begin(ord); - Entity const* end = connectivity.end(ord); - ConnectivityOrdinal const* begin_ord = connectivity.begin_ordinals(ord); - ConnectivityOrdinal const* end_ord = connectivity.end_ordinals(ord); - - EXPECT_EQ(end - begin, num_to_add); - EXPECT_EQ(end_ord - begin_ord, num_to_add); - - for (uint64_t i = 0; i < num_to_add; ++i) { - Entity expected_to(ord * num_to_add + i + 1); - EXPECT_EQ(expected_to, begin[i]); - EXPECT_EQ(static_cast(i), begin_ord[i]); - } - } -} - -template -void test_remove(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) -{ - test_simple_add(connectivity, num_entities, num_to_add); - - unsigned ord_to_remove_from = num_entities / 2; - - for (uint64_t i = 0; i < num_to_add; ++i) { - Entity e_to(ord_to_remove_from * num_to_add + i + 1); - if ( (i % 2) == 0 ) { - bool rv = connectivity.remove_connectivity(ord_to_remove_from, e_to, static_cast(i)); - EXPECT_TRUE(rv); - } - } - - check_even_conn_removed(connectivity, num_to_add, ord_to_remove_from); -} - -template -void test_inter_conn_copy(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) -{ - // TODO -} - -template -void test_intra_conn_copy(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) -{ - // TODO -} - -template -void test_mod_end(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) -{ - // TODO -} - -} - -TEST(BucketConnectivity, fixed_simple_add) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_simple_add(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_simple_add) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_simple_add(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, fixed_complex_add) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_complex_add(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_complex_add) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_complex_add(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, fixed_remove) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_remove(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_remove) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_remove(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, fixed_intra_conn_copy) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_intra_conn_copy(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_intra_conn_copy) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_intra_conn_copy(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, fixed_inter_conn_copy) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_inter_conn_copy(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_inter_conn_copy) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_inter_conn_copy(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, fixed_mod_end) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - fixed_conn conn(num_to_add); - - test_mod_end(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} - -TEST(BucketConnectivity, dynamic_mod_end) -{ - const unsigned num_to_add = 8; - const unsigned num_entities = 100; - BulkData * bulk = NULL; - dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); - - test_mod_end(conn, num_entities, num_to_add); - conn.end_modification(bulk); -} diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBulkData.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBulkData.cpp index 472e9bebe15d..49fbc9e8560e 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBulkData.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBulkData.cpp @@ -5967,7 +5967,7 @@ TEST(BulkData, makeElementWithConflictingTopologies) mesh.modification_begin(); - EXPECT_THROW(stk::mesh::declare_element(mesh, parts, element_ids[0], elem_node_ids[0]), std::runtime_error); + EXPECT_THROW(stk::mesh::declare_element(mesh, parts, element_ids[0], elem_node_ids[0]), std::logic_error); mesh.modification_end(); } diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp new file mode 100644 index 000000000000..2939e67a3119 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp @@ -0,0 +1,386 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 + +namespace { + +const stk::mesh::EntityRank nodeRank = stk::topology::NODE_RANK; +const stk::mesh::EntityRank edgeRank = stk::topology::EDGE_RANK; +const stk::mesh::EntityRank faceRank = stk::topology::FACE_RANK; +const stk::mesh::EntityRank elemRank = stk::topology::ELEM_RANK; +const stk::mesh::EntityRank constraintRank = stk::topology::CONSTRAINT_RANK; + +class ConnectivityTester : public stk::mesh::Connectivity { +public: + void expect_null_ptrs() + { + EXPECT_EQ(nullptr, m_connectivity); + EXPECT_EQ(nullptr, m_offsetsAndOrdinals); + } + + void expect_zeros_and_empty() + { + const unsigned numOffsets = stk::mesh::Connectivity::MAX_NUM_RANKS+1; + for(unsigned r=0; r& numPerRank) + { + EXPECT_TRUE(stk::mesh::Connectivity::MAX_NUM_RANKS == numPerRank.size()); + for(unsigned r=0; r(r))); + } + } + + void expect_connectivity(const std::vector& conn) + { + EXPECT_EQ(conn.size(), m_offsetsAndOrdinals[stk::mesh::Connectivity::MAX_NUM_RANKS]); + for(unsigned i=0; i& ords) + { + EXPECT_EQ(ords.size(), m_offsetsAndOrdinals[stk::mesh::Connectivity::MAX_NUM_RANKS]); + for(unsigned i=0; i& numPerRank) + { + ConnectivityTester& connTester = static_cast(connObject); + connTester.expect_num_per_rank(numPerRank); + } + + void expect_num_per_rank(const std::vector& numPerRank) + { + expect_num_per_rank(connectivity, numPerRank); + } + + void expect_connectivity(stk::mesh::Connectivity& connObject, const std::vector& conn) + { + ConnectivityTester& connTester = static_cast(connObject); + connTester.expect_connectivity(conn); + } + + void expect_connectivity(const std::vector& conn) + { + expect_connectivity(connectivity, conn); + } + + void expect_ordinals(const std::vector& ords) + { + ConnectivityTester& connTester = static_cast(connectivity); + connTester.expect_ordinals(ords); + } + + void add_2nodes_2elems() + { + const bool allowDuplicateOrdinals = true; + + EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + } + +protected: + stk::mesh::Connectivity connectivity; + stk::mesh::Entity node1, node2, node3; + stk::mesh::Entity face1, face2, face3; + stk::mesh::Entity elem1, elem2, elem3; + stk::mesh::Entity constraint1; + stk::mesh::Entity highest1; + stk::mesh::ConnectivityOrdinal ordinal1, ordinal2, ordinal3; +}; + +TEST_F(TestConnectivity, defaultConstruct_zerosAndEmpty) +{ + ConnectivityTester& connTester = static_cast(connectivity); + connTester.expect_zeros_and_empty(); +} + +TEST_F(TestConnectivity, addConnectivity) +{ + add_2nodes_2elems(); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + expect_connectivity({node1, node2, elem1, elem2}); + expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); +} + +TEST_F(TestConnectivity, addConnectivity_then_clear) +{ + add_2nodes_2elems(); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + connectivity.clear(); + expect_num_per_rank({0, 0, 0, 0, 0, 0}); +} + +TEST_F(TestConnectivity, assignment) +{ + add_2nodes_2elems(); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + + stk::mesh::Connectivity connCopy = connectivity; + expect_num_per_rank(connCopy, {2, 0, 0, 2, 0, 0}); + expect_num_per_rank(connectivity, {2, 0, 0, 2, 0, 0}); + + connCopy = std::move(connectivity); + expect_num_per_rank(connCopy, {2, 0, 0, 2, 0, 0}); + ConnectivityTester& connTester = static_cast(connectivity); + connTester.expect_null_ptrs(); +} + +TEST_F(TestConnectivity, replaceOrAddConnectivity_not_pre_existing) +{ + EXPECT_EQ(0, connectivity.replace_or_add_connectivity(nodeRank, node1, ordinal1)); + EXPECT_EQ(1, connectivity.replace_or_add_connectivity(nodeRank, node2, ordinal2)); + EXPECT_EQ(0, connectivity.replace_or_add_connectivity(elemRank, elem1, ordinal1)); + EXPECT_EQ(1, connectivity.replace_or_add_connectivity(elemRank, elem2, ordinal2)); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + expect_connectivity({node1, node2, elem1, elem2}); + expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); +} + +TEST_F(TestConnectivity, replaceOrAddConnectivity_pre_existing) +{ + const bool allowDuplicateOrdinals = true; + EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(nodeRank, node1, ordinal1)); + EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(nodeRank, node2, ordinal2)); + EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(elemRank, elem1, ordinal1)); + EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(elemRank, elem2, ordinal2)); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + expect_connectivity({node1, node2, elem1, elem2}); + expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); +} + +TEST_F(TestConnectivity, addAndRemoveConnectivity) +{ + const bool allowDuplicateOrdinals = true; + + EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + expect_num_per_rank({2, 0, 0, 2, 0, 0}); + expect_connectivity({node1, node2, elem1, elem2}); + expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); + + EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); + expect_num_per_rank({2, 0, 0, 1, 0, 0}); + expect_connectivity({node1, node2, elem2}); + expect_ordinals({ordinal1, ordinal2, ordinal2}); + + stk::mesh::PairIterEntity conn = connectivity.get_connectivity(elemRank); + const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); + const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); + EXPECT_EQ(elem2, elems[0]); + EXPECT_EQ(1u, conn.size()); + EXPECT_EQ(conn.begin(), elems); + EXPECT_EQ(conn.end(), elems+1); + EXPECT_EQ(ordinal2, ords[0]); + + EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); + expect_num_per_rank({2, 0, 0, 0, 0, 0}); + expect_connectivity({node1, node2}); + expect_ordinals({ordinal1, ordinal2}); + conn = connectivity.get_connectivity(elemRank); + EXPECT_EQ(connectivity.begin_connectivity(elemRank), connectivity.end_connectivity(elemRank)); + EXPECT_TRUE(conn.empty()); + EXPECT_EQ(conn.begin(), conn.end()); + EXPECT_EQ(connectivity.begin_ordinals(elemRank), connectivity.end_ordinals(elemRank)); +} + +TEST_F(TestConnectivity, addAndRemoveMultipleRanks) +{ + const bool allowDuplicateOrdinals = true; + + EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(faceRank, face1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(0, connectivity.add_connectivity(constraintRank, constraint1, ordinal1, allowDuplicateOrdinals)); + expect_num_per_rank({1, 0, 1, 2, 1, 0}); + + EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); + expect_num_per_rank({1, 0, 1, 1, 1, 0}); + + const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); + const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); + EXPECT_EQ(elem2, elems[0]); + EXPECT_EQ(ordinal2, ords[0]); + + EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); + expect_num_per_rank({1, 0, 1, 0, 1, 0}); + + EXPECT_EQ(connectivity.begin_connectivity(elemRank), connectivity.end_connectivity(elemRank)); + EXPECT_EQ(connectivity.begin_ordinals(elemRank), connectivity.end_ordinals(elemRank)); + EXPECT_NE(connectivity.begin_connectivity(faceRank), connectivity.end_connectivity(faceRank)); + EXPECT_NE(connectivity.begin_ordinals(faceRank), connectivity.end_ordinals(faceRank)); +} + +TEST_F(TestConnectivity, addRemoveAddAddRemoveAdd) +{ + const bool allowDuplicateOrdinals = true; + + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + expect_num_per_rank({0, 0, 0, 1, 0, 0}); + + EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); + expect_num_per_rank({0, 0, 0, 0, 0, 0}); + + EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); + expect_num_per_rank({0, 0, 0, 1, 0, 0}); + + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + expect_num_per_rank({0, 0, 0, 2, 0, 0}); + + EXPECT_EQ(1, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); + expect_num_per_rank({0, 0, 0, 1, 0, 0}); + + EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); + expect_num_per_rank({0, 0, 0, 2, 0, 0}); + + const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); + const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); + EXPECT_EQ(elem1, elems[0]); + EXPECT_EQ(elem2, elems[1]); + EXPECT_EQ(ordinal1, ords[0]); + EXPECT_EQ(ordinal2, ords[1]); +} + +TEST_F(TestConnectivity, addAndRemoveMultipleConnectivity) +{ + const bool allowDuplicateOrdinals = true; + + EXPECT_EQ(0, connectivity.add_connectivity(faceRank, face1, ordinal1, allowDuplicateOrdinals)); + EXPECT_EQ(1, connectivity.add_connectivity(faceRank, face2, ordinal2, allowDuplicateOrdinals)); + EXPECT_EQ(2, connectivity.add_connectivity(faceRank, face3, ordinal3, allowDuplicateOrdinals)); + expect_num_per_rank({0, 0, 3, 0, 0, 0}); + + { + const stk::mesh::Entity* faces = connectivity.begin_connectivity(faceRank); + const stk::mesh::ConnectivityOrdinal* ordinals = connectivity.begin_ordinals(faceRank); + + EXPECT_EQ(face1, faces[0]); + EXPECT_EQ(face2, faces[1]); + EXPECT_EQ(face3, faces[2]); + EXPECT_EQ(ordinal1, ordinals[0]); + EXPECT_EQ(ordinal2, ordinals[1]); + EXPECT_EQ(ordinal3, ordinals[2]); + } + + EXPECT_EQ(1, connectivity.remove_connectivity(faceRank, face2, ordinal2)); + expect_num_per_rank({0, 0, 2, 0, 0, 0}); + + int indexOfRemovedEntity = connectivity.remove_connectivity(faceRank, face2, ordinal2); + bool duplicateRemoveCausedNoChange = (indexOfRemovedEntity == -1); + EXPECT_TRUE(duplicateRemoveCausedNoChange); + + expect_num_per_rank({0, 0, 2, 0, 0, 0}); + expect_connectivity({face1, face3}); + expect_ordinals({ordinal1, ordinal3}); + + EXPECT_EQ(1, connectivity.remove_connectivity(faceRank, face3, ordinal3)); + expect_num_per_rank({0, 0, 1, 0, 0, 0}); + expect_connectivity({face1}); + expect_ordinals({ordinal1}); + + EXPECT_EQ(0, connectivity.remove_connectivity(faceRank, face1, ordinal1)); + expect_num_per_rank({0, 0, 0, 0, 0, 0}); + + EXPECT_EQ(connectivity.begin_connectivity(faceRank), connectivity.end_connectivity(faceRank)); + EXPECT_EQ(connectivity.begin_ordinals(faceRank), connectivity.end_ordinals(faceRank)); +} + +TEST_F(TestConnectivity, moveInVector) +{ + const bool allowDuplicateOrdinals = true; + std::vector connectivities(1); + connectivities[0].add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals); + { + ConnectivityTester& connTester = static_cast(connectivities[0]); + connTester.expect_num_per_rank({1, 0, 0, 0, 0, 0}); + connTester.expect_connectivity({node1}); + connTester.expect_ordinals({ordinal1}); + } + + connectivities.resize(2); + { + ConnectivityTester& connTester = static_cast(connectivities[0]); + connTester.expect_num_per_rank({1, 0, 0, 0, 0, 0}); + connTester.expect_connectivity({node1}); + connTester.expect_ordinals({ordinal1}); + } +} + +class MyClass { +public: + stk::mesh::Entity* entityPtr; + stk::mesh::ConnectivityOrdinal* ordPtr; +}; + +TEST_F(TestConnectivity, simpleStructSize) +{ + EXPECT_EQ(16u, sizeof(MyClass)); + EXPECT_EQ(sizeof(MyClass), sizeof(stk::mesh::Connectivity)); +} + +} + diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestFEMMetaData.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestFEMMetaData.cpp index ecd207774314..f3b82cea459f 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestFEMMetaData.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestFEMMetaData.cpp @@ -54,7 +54,7 @@ TEST ( UnitTestMetaData, create ) EXPECT_TRUE ( true ); EXPECT_FALSE( fem_meta.is_initialized() ); EXPECT_EQ( fem_meta.spatial_dimension(), 0u ); - EXPECT_EQ( fem_meta.side_rank(), static_cast(stk::topology::INVALID_RANK) ); + EXPECT_EQ( fem_meta.side_rank(), stk::topology::INVALID_RANK ); // Verify throws/etc for FEM calls prior to initialization: stk::mesh::Part & universal_part = fem_meta.universal_part(); @@ -84,7 +84,7 @@ TEST( UnitTestMetaData, entity_ranks_1 ) stk::mesh::MetaData fem_meta; const size_t spatial_dimension = 1; fem_meta.initialize(spatial_dimension); - EXPECT_EQ( fem_meta.side_rank(), static_cast(stk::topology::NODE_RANK) ); + EXPECT_EQ( fem_meta.side_rank(), stk::topology::NODE_RANK ); } TEST( UnitTestMetaData, entity_ranks_2 ) @@ -92,7 +92,7 @@ TEST( UnitTestMetaData, entity_ranks_2 ) stk::mesh::MetaData fem_meta; const size_t spatial_dimension = 2; fem_meta.initialize(spatial_dimension); - EXPECT_EQ( fem_meta.side_rank(), static_cast(stk::topology::EDGE_RANK) ); + EXPECT_EQ( fem_meta.side_rank(), stk::topology::EDGE_RANK ); } TEST( UnitTestMetaData, entity_ranks_3 ) @@ -100,7 +100,7 @@ TEST( UnitTestMetaData, entity_ranks_3 ) stk::mesh::MetaData fem_meta; const size_t spatial_dimension = 3; fem_meta.initialize(spatial_dimension); - EXPECT_EQ( fem_meta.side_rank(), static_cast(stk::topology::FACE_RANK) ); + EXPECT_EQ( fem_meta.side_rank(), stk::topology::FACE_RANK ); } TEST( UnitTestMetaData, get_topology_trivial ) @@ -111,7 +111,7 @@ TEST( UnitTestMetaData, get_topology_trivial ) stk::mesh::Part & hex_part = fem_meta.get_topology_root_part(stk::topology::HEX_8); EXPECT_TRUE( stk::mesh::is_auto_declared_part(hex_part) ); - EXPECT_EQ( hex_part.primary_entity_rank(), spatial_dimension ); + EXPECT_EQ( hex_part.primary_entity_rank(), stk::topology::ELEM_RANK ); stk::topology hex_topology = fem_meta.get_topology(hex_part); EXPECT_EQ( (hex_topology == stk::topology::HEX_8), true ); @@ -126,9 +126,8 @@ TEST( UnitTestMetaData, cell_topology_subsetting ) { stk::mesh::MetaData fem_meta; const size_t spatial_dimension = 3; - const stk::mesh::EntityRank element_rank = static_cast(spatial_dimension); fem_meta.initialize(spatial_dimension); - stk::mesh::Part & element_part = fem_meta.declare_part("element part", element_rank ); + stk::mesh::Part & element_part = fem_meta.declare_part("element part", stk::topology::ELEM_RANK ); stk::mesh::set_topology( element_part, stk::topology::HEX_8 ); stk::mesh::Part & hex_part = fem_meta.get_topology_root_part(stk::topology::HEX_8); diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp new file mode 100644 index 000000000000..6692f677c238 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp @@ -0,0 +1,256 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 + +namespace { + +const stk::mesh::EntityRank nodeRank = stk::topology::NODE_RANK; +const stk::mesh::EntityRank edgeRank = stk::topology::EDGE_RANK; +const stk::mesh::EntityRank faceRank = stk::topology::FACE_RANK; +const stk::mesh::EntityRank elemRank = stk::topology::ELEM_RANK; +const stk::mesh::EntityRank constraintRank = stk::topology::CONSTRAINT_RANK; + +TEST(SparseConnectivity, hasPermutation) +{ + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, elemRank)); + EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(edgeRank, elemRank)); + EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(faceRank, elemRank)); + EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(edgeRank, faceRank)); + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, edgeRank)); + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, faceRank)); + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, constraintRank)); + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(faceRank, constraintRank)); + EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(elemRank, constraintRank)); +} + +TEST(SparseConnectivity, addAndRemoveConnectivity) +{ + stk::mesh::SparseConnectivity sparseConnectivity; + + unsigned nodeEntityOffset = 1; + unsigned elemEntityOffset = 9; + sparseConnectivity.update_size_of_entity_index_space(10); + + stk::mesh::Entity node(nodeEntityOffset); + stk::mesh::Entity elem(elemEntityOffset); + stk::mesh::ConnectivityOrdinal ordinal = 0; + stk::mesh::Permutation perm = stk::mesh::Permutation::INVALID_PERMUTATION; + + EXPECT_TRUE(sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm)); + bool addAlreadyExistingShouldBeFalse = sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm); + EXPECT_FALSE(addAlreadyExistingShouldBeFalse); + + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); + + stk::mesh::Entity elem2(elemEntityOffset+1); + sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1, perm); + + EXPECT_EQ(2u, sparseConnectivity.num_connectivity(node, elemRank)); + + sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, ordinal); + + stk::mesh::PairIterEntity conn = sparseConnectivity.get_connectivity(node, elemRank); + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); + EXPECT_EQ(1u, conn.size()); + + const stk::mesh::Entity* elems = sparseConnectivity.begin_connectivity(node, elemRank); + EXPECT_EQ(elem2, elems[0]); + EXPECT_EQ(elems, conn.begin()); + + sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); + + EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); + conn = sparseConnectivity.get_connectivity(node, elemRank); + EXPECT_TRUE(conn.empty()); +} + +TEST(SparseConnectivity, replaceOrAddAndRemoveConnectivity) +{ + stk::mesh::SparseConnectivity sparseConnectivity; + + unsigned nodeEntityOffset = 1; + unsigned elemEntityOffset = 9; + sparseConnectivity.update_size_of_entity_index_space(10); + + stk::mesh::Entity node(nodeEntityOffset); + stk::mesh::Entity elem(elemEntityOffset); + stk::mesh::Entity elem2(elemEntityOffset+1); + stk::mesh::ConnectivityOrdinal ordinal = 0; + + EXPECT_TRUE(sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal)); + bool replaceAlreadyExistingShouldBeFalse = sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal); + EXPECT_FALSE(replaceAlreadyExistingShouldBeFalse); + + bool replaceWithDifferentElemShouldBeTrue = sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem, ordinal); + EXPECT_TRUE(replaceWithDifferentElemShouldBeTrue); + + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); + + sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); + + EXPECT_EQ(2u, sparseConnectivity.num_connectivity(node, elemRank)); + + sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, ordinal); + + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); + + const stk::mesh::Entity* elems = sparseConnectivity.begin_connectivity(node, elemRank); + EXPECT_EQ(elem2, elems[0]); + + sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); + + EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); +} + +TEST(SparseConnectivity, beginEnd) +{ + stk::mesh::SparseConnectivity sparseConnectivity; + + unsigned nodeEntityOffset = 1; + unsigned elemEntityOffset = 9; + sparseConnectivity.update_size_of_entity_index_space(10); + stk::mesh::Entity node(nodeEntityOffset); + stk::mesh::Entity elem(elemEntityOffset); + stk::mesh::ConnectivityOrdinal ordinal = 0; + stk::mesh::Permutation perm = stk::mesh::Permutation::INVALID_PERMUTATION; + + sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm); + + stk::mesh::Entity elem2(elemEntityOffset+1); + sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1, perm); + + const stk::mesh::Entity* beginElems = sparseConnectivity.begin_connectivity(node, elemRank); + const stk::mesh::Entity* endElems = sparseConnectivity.end_connectivity(node, elemRank); + + EXPECT_EQ(2u, std::distance(beginElems, endElems)); + + EXPECT_EQ(elem, beginElems[0]); + EXPECT_EQ(elem2, beginElems[1]); + + const stk::mesh::ConnectivityOrdinal* beginElemOrds = sparseConnectivity.begin_ordinals(node, elemRank); + const stk::mesh::ConnectivityOrdinal* endElemOrds = sparseConnectivity.end_ordinals(node, elemRank); + + EXPECT_EQ(2u, std::distance(beginElemOrds, endElemOrds)); + + EXPECT_EQ(ordinal, beginElemOrds[0]); + EXPECT_EQ(ordinal+1, beginElemOrds[1]); + + EXPECT_EQ(nullptr, sparseConnectivity.begin_permutations(node, elemRank)); + EXPECT_EQ(nullptr, sparseConnectivity.end_permutations(node, elemRank)); +} + +TEST(SparseConnectivity, permutations) +{ + stk::mesh::SparseConnectivity sparseConnectivity; + + unsigned faceEntityOffset = 1; + unsigned elemEntityOffset = 9; + sparseConnectivity.update_size_of_entity_index_space(10); + stk::mesh::Entity face(faceEntityOffset); + stk::mesh::Entity elem(elemEntityOffset); + stk::mesh::ConnectivityOrdinal ordinal = 0; + stk::mesh::Permutation perm = static_cast(1); + stk::mesh::Permutation perm2 = static_cast(-1); + + sparseConnectivity.add_connectivity(faceRank, face, elemRank, elem, ordinal, perm); + + stk::mesh::Entity elem2(elemEntityOffset+1); + sparseConnectivity.add_connectivity(faceRank, face, elemRank, elem2, ordinal+1, perm2); + + const stk::mesh::Permutation* beginElemPerms = sparseConnectivity.begin_permutations(face, elemRank); + const stk::mesh::Permutation* endElemPerms = sparseConnectivity.end_permutations(face, elemRank); + + EXPECT_EQ(2u, std::distance(beginElemPerms, endElemPerms)); + + EXPECT_EQ(perm, beginElemPerms[0]); + EXPECT_EQ(perm2, beginElemPerms[1]); +} + +TEST(SparseConnectivity, addConnMultiple) +{ + stk::mesh::SparseConnectivity sparseConnectivity; + + unsigned nodeEntityOffset = 1; + unsigned node2EntityOffset = 2; + unsigned elemEntityOffset = 3; + unsigned faceEntityOffset = 10; + sparseConnectivity.update_size_of_entity_index_space(4); + + stk::mesh::Entity node(nodeEntityOffset); + stk::mesh::Entity node2(node2EntityOffset); + stk::mesh::Entity face(faceEntityOffset); + stk::mesh::Entity elem(elemEntityOffset); + stk::mesh::ConnectivityOrdinal nodeElemOrd = 5; + stk::mesh::ConnectivityOrdinal node2ElemOrd = 6; + stk::mesh::ConnectivityOrdinal nodeFaceOrd = 2; + stk::mesh::ConnectivityOrdinal elemFaceOrd = 3; + stk::mesh::Permutation invalidPerm = stk::mesh::Permutation::INVALID_PERMUTATION; + stk::mesh::Permutation perm = static_cast(0); + + sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, nodeElemOrd, invalidPerm); + const stk::mesh::Connectivity& nodeConn = sparseConnectivity.get_connectivity(node); + (void)nodeConn; + + sparseConnectivity.add_connectivity(nodeRank, node, faceRank, face, nodeFaceOrd, invalidPerm); + sparseConnectivity.add_connectivity(elemRank, elem, faceRank, face, elemFaceOrd, perm); + + sparseConnectivity.update_size_of_entity_index_space(11); + + sparseConnectivity.add_connectivity(nodeRank, node2, elemRank, elem, node2ElemOrd, invalidPerm); + + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, faceRank)); + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(elem, faceRank)); + EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node2, elemRank)); + + const stk::mesh::Permutation* perms = sparseConnectivity.begin_permutations(elem, faceRank); + const stk::mesh::Permutation* endPerms = sparseConnectivity.end_permutations(elem, faceRank); + EXPECT_TRUE(perms != nullptr); + EXPECT_TRUE(endPerms != nullptr); + EXPECT_EQ(1u, std::distance(perms, endPerms)); + EXPECT_EQ(perm, perms[0]); + + EXPECT_TRUE(sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, nodeElemOrd)); + EXPECT_TRUE(sparseConnectivity.remove_connectivity(nodeRank, node2, elemRank, elem, node2ElemOrd)); + + EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); + EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node2, elemRank)); +} + +} + diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp index ed63d5772fa5..87bb2ea7f49a 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp @@ -773,12 +773,36 @@ TEST_F(TestTextMesh, tooManyCoordinates) EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc, coordinates), std::logic_error); } -TEST_F(TestTextMesh, tooLittleData) +TEST_F(TestTextMesh, tooLittleData_empty) +{ + std::string meshDesc = ""; + EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); +} + +TEST_F(TestTextMesh, tooLittleData_startsWithString) +{ + std::string meshDesc = "hi"; + EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); +} + +TEST_F(TestTextMesh, tooLittleData_noGlobalId) +{ + std::string meshDesc = "0 "; + EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); +} + +TEST_F(TestTextMesh, tooLittleData_noTopology) { std::string meshDesc = "0,1,"; EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); } +TEST_F(TestTextMesh, tooLittleData_noNodes) +{ + std::string meshDesc = "0,1,HEX_8"; + EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); +} + TEST_F(TestTextMesh, tooLittleDataWithCoordinates) { std::string meshDesc = "0,1,"; @@ -827,6 +851,18 @@ TEST_F(TestTextMesh, spatialDimInconsistentWithMetaDataWithCoordinates) EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc, coordinates), std::logic_error); } +TEST_F(TestTextMesh, endingWithNewlineIsOk) +{ + std::string meshDesc = "0,1,HEX_8,1,2,3,4,5,6,7,8\n"; + EXPECT_NO_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc)); +} + +TEST_F(TestTextMesh, stringAfterPartNameIsError) +{ + std::string meshDesc = "0,1,HEX_8,1,2,3,4,5,6,7,8,block_1,bogus\n"; + EXPECT_THROW(stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc), std::logic_error); +} + TEST_F(TestTextMesh, particleHex) { if (get_parallel_size() != 1) return; diff --git a/packages/stk/stk_unit_tests/stk_mesh/ngp/KokkosBulkDataBucketCentroidCalculation.cpp b/packages/stk/stk_unit_tests/stk_mesh/ngp/KokkosBulkDataBucketCentroidCalculation.cpp index 553f031af6d1..5e8ac559153e 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/ngp/KokkosBulkDataBucketCentroidCalculation.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/ngp/KokkosBulkDataBucketCentroidCalculation.cpp @@ -75,7 +75,7 @@ struct GpuGatherBucketScratchData { const stk::mesh::NgpMesh::BucketType& bucket = ngpMesh.get_bucket(stk::topology::ELEM_RANK, elementBucketIndex); const unsigned numElements = bucket.size(); - const unsigned nodesPerElem = bucket.get_num_nodes_per_entity(); + const unsigned nodesPerElem = bucket.topology().num_nodes(); const unsigned dim = elementCentroids.extent(1); double temp[3] = {0.0, 0.0, 0.0}; for(unsigned elementIndex=0; elementIndex; class ParallelDataExchangeSymPackUnpackHandler { public: - ParallelDataExchangeSymPackUnpackHandler(std::vector> & neighbors, - ValueViewType & deviceValues) + ParallelDataExchangeSymPackUnpackHandler(std::vector>& neighbors, + ValueViewType& deviceValues) : m_neighbors(neighbors), m_deviceNeighbors(Kokkos::create_staticcrsgraph("DeviceNeighborsCrs", neighbors)), m_deviceValues(deviceValues) { } - ParallelDataExchangeSymPackUnpackHandler(const ParallelDataExchangeSymPackUnpackHandler & rhs) = default; + ParallelDataExchangeSymPackUnpackHandler(const ParallelDataExchangeSymPackUnpackHandler& rhs) = default; - void hostSizeMessages(int proc, size_t & numValues) const + void hostSizeMessages(int proc, size_t& numValues) const { numValues = 0; for (size_t i = 0; i < m_neighbors.size(); ++i) { @@ -45,7 +45,7 @@ class ParallelDataExchangeSymPackUnpackHandler } STK_FUNCTION - void devicePackMessage(int myProc, int proc, ValueViewType & sendData) const + void devicePackMessage(int myProc, int proc, ValueViewType& sendData) const { size_t bufIdx = 0; for (size_t i = 0; i < m_deviceNeighbors.numRows(); ++i) { @@ -60,7 +60,7 @@ class ParallelDataExchangeSymPackUnpackHandler } STK_FUNCTION - void deviceUnpackMessage(int myProc, int proc, ValueViewType & recvData) const + void deviceUnpackMessage(int myProc, int proc, ValueViewType& recvData) const { size_t valueLocation[3]; size_t valueLocationIdx = 0; @@ -97,7 +97,7 @@ class ParallelDataExchangeSymPackUnpackHandler } private: - std::vector> m_neighbors; + std::vector>& m_neighbors; NeighborCrsViewType m_deviceNeighbors; ValueViewType m_deviceValues; }; @@ -197,7 +197,7 @@ std::vector> get_neighbors(int pSize, int pRank) return neighbors; } -NGP_TEST_F(NgpParallelComm, DISABLED_symmetricPackUnpack) +NGP_TEST_F(NgpParallelComm, symmetricPackUnpack) { const int pSize = stk::parallel_machine_size(MPI_COMM_WORLD); const int pRank = stk::parallel_machine_rank(MPI_COMM_WORLD); diff --git a/packages/stk/stk_unit_tests/stk_mesh/ngp/howToNgp.cpp b/packages/stk/stk_unit_tests/stk_mesh/ngp/howToNgp.cpp index 3fd46cd14b09..077efdc5ab25 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/ngp/howToNgp.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/ngp/howToNgp.cpp @@ -380,7 +380,7 @@ void run_connected_face_test(const stk::mesh::BulkData& bulk) TEST_F(NgpHowTo, loopOverElemFaces) { if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { - return; + GTEST_SKIP(); } auto &field = get_meta().declare_field>(stk::topology::NODE_RANK, "myField"); double init = 0.0; @@ -390,6 +390,79 @@ TEST_F(NgpHowTo, loopOverElemFaces) run_connected_face_test(get_bulk()); } +void add_constraint_on_nodes_1_thru_4(stk::mesh::BulkData& bulk, + stk::mesh::EntityId constraintId) +{ + bulk.modification_begin(); + stk::mesh::Entity constraintEntity = bulk.declare_constraint(constraintId); + for(stk::mesh::EntityId nodeId = 1; nodeId <= 4; ++nodeId) { + stk::mesh::Entity node = bulk.get_entity(stk::topology::NODE_RANK, nodeId); + stk::mesh::ConnectivityOrdinal ord = static_cast(nodeId-1); + bulk.declare_relation(constraintEntity, node, ord); + } + bulk.modification_end(); +} + +void run_constraint_node_test(const stk::mesh::BulkData& bulk, + stk::mesh::EntityId constraintId) +{ + stk::mesh::Entity constraint = bulk.get_entity(stk::topology::CONSTRAINT_RANK, constraintId); + ASSERT_TRUE(bulk.is_valid(constraint)); + stk::mesh::Entity node0 = bulk.begin_nodes(constraint)[0]; + stk::mesh::Entity node1 = bulk.begin_nodes(constraint)[1]; + stk::mesh::Entity node2 = bulk.begin_nodes(constraint)[2]; + stk::mesh::Entity node3 = bulk.begin_nodes(constraint)[3]; + ASSERT_TRUE(bulk.is_valid(node0)); + ASSERT_TRUE(bulk.is_valid(node1)); + ASSERT_TRUE(bulk.is_valid(node2)); + ASSERT_TRUE(bulk.is_valid(node3)); + + const unsigned expectedNumNodes = bulk.num_nodes(constraint); + + const stk::mesh::NgpMesh & ngpMesh = stk::mesh::get_updated_ngp_mesh(bulk); + Kokkos::parallel_for(1, + KOKKOS_LAMBDA(const unsigned& i) { + stk::mesh::FastMeshIndex constraintMeshIndex = ngpMesh.fast_mesh_index(constraint); + + stk::mesh::NgpMesh::ConnectedEntities ngpNodes = ngpMesh.get_connected_entities(stk::topology::CONSTRAINT_RANK, constraintMeshIndex, stk::topology::NODE_RANK); + NGP_EXPECT_EQ(expectedNumNodes, ngpNodes.size()); + NGP_EXPECT_EQ(node0, ngpNodes[0]); + NGP_EXPECT_EQ(node1, ngpNodes[1]); + NGP_EXPECT_EQ(node2, ngpNodes[2]); + NGP_EXPECT_EQ(node3, ngpNodes[3]); + + stk::mesh::NgpMesh::ConnectedOrdinals ngpOrdinals = ngpMesh.get_connected_ordinals(stk::topology::CONSTRAINT_RANK, constraintMeshIndex, stk::topology::NODE_RANK); + NGP_EXPECT_EQ(4u, ngpOrdinals.size()); + NGP_EXPECT_EQ(0, ngpOrdinals[0]); + NGP_EXPECT_EQ(1, ngpOrdinals[1]); + NGP_EXPECT_EQ(2, ngpOrdinals[2]); + NGP_EXPECT_EQ(3, ngpOrdinals[3]); + } + ); +} + +class NgpHowToConstraint : public stk::unit_test_util::MeshFixture +{ +public: + NgpHowToConstraint() : MeshFixture(3, {"node", "edge", "face", "elem", "constraint"}) + {} +}; + +TEST_F(NgpHowToConstraint, checkNodalConnectivity) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { + GTEST_SKIP(); + } + auto &field = get_meta().declare_field>(stk::topology::NODE_RANK, "myField"); + double init = 0.0; + stk::mesh::put_field_on_mesh(field, get_meta().universal_part(), &init); + setup_mesh("generated:1x1x1", stk::mesh::BulkData::NO_AUTO_AURA); + stk::mesh::EntityId constraintId = 1; + add_constraint_on_nodes_1_thru_4(get_bulk(), constraintId); + + run_constraint_node_test(get_bulk(), constraintId); +} + void run_connected_face_ordinal_test(const stk::mesh::BulkData& bulk) { stk::topology elemTopo = stk::topology::HEX_8; @@ -794,6 +867,7 @@ TEST_F(NgpHowTo, setAllScalarFieldValues) double initialValue = 0.0; stk::mesh::Field &stkField = create_field_with_num_states_and_init(get_meta(), "myField", numStates, initialValue); setup_mesh("generated:1x1x4", stk::mesh::BulkData::AUTO_AURA); + stkField.sync_to_device(); stk::mesh::NgpField& ngpField = stk::mesh::get_updated_ngp_field(stkField); stk::mesh::NgpMesh & ngpMesh = stk::mesh::get_updated_ngp_mesh(get_bulk()); @@ -818,6 +892,7 @@ TEST_F(NgpHowTo, setAllVectorFieldValues) fieldDimension, initialValue); setup_mesh("generated:1x1x4", stk::mesh::BulkData::AUTO_AURA); + stkField.sync_to_device(); stk::mesh::NgpField& ngpField = stk::mesh::get_updated_ngp_field(stkField); const stk::mesh::NgpMesh& ngpMesh = stk::mesh::get_updated_ngp_mesh(get_bulk()); @@ -1078,6 +1153,10 @@ NGP_TEST_F(NgpHowTo, ReuseNgpField) stk::mesh::Field &doubleStkField = create_field_with_num_states_and_init(get_meta(), "field10", numStates, (double)0); setup_mesh("generated:1x1x4", stk::mesh::BulkData::AUTO_AURA); + auto fields = get_meta().get_fields(); + for(auto field : fields) { + field->sync_to_device(); + } { fill_field_on_device(get_bulk(), shortStkField, (short)42); @@ -1208,6 +1287,7 @@ TEST(NgpMesh, meshIndices) stk::mesh::put_field_on_mesh(field, meta.universal_part(), &init); stk::io::fill_mesh("generated:1x1x1", bulk); + field.sync_to_device(); stk::mesh::NgpMesh& ngpMesh = stk::mesh::get_updated_ngp_mesh(bulk); stk::mesh::NgpField & ngpField = stk::mesh::get_updated_ngp_field(field); int fieldVal = 5; diff --git a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldTest.cpp b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldTest.cpp index c5e2cac892c8..83740cb44f11 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldTest.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpFieldTest.cpp @@ -80,6 +80,22 @@ class NgpFieldFixture : public stk::unit_test_util::MeshFixture return field; } + void setup_one_field_one_element_mesh() + { + const unsigned bucketCapacity = 1; + setup_empty_mesh(stk::mesh::BulkData::NO_AUTO_AURA, bucketCapacity); + + stk::mesh::Field& stkField = get_meta().declare_field>( + stk::topology::ELEM_RANK, "field1"); + stk::mesh::Part& block = get_meta().declare_part_with_topology("block_1", stk::topology::SHELL_QUAD_4); + + const int init1 = 1; + stk::mesh::put_field_on_mesh(stkField, block, 1, &init1); + + const std::string meshDesc = "0,1,SHELL_QUAD_4,1,2,5,6,block_1\n"; + stk::unit_test_util::setup_text_mesh(get_bulk(), meshDesc); + } + void setup_two_field_two_element_mesh() { const unsigned bucketCapacity = 1; @@ -806,13 +822,12 @@ void move_data_between_fields_on_host(const stk::mesh::BulkData & bulk, ngpDest.modify_on_host(); } -void test_field_values_on_device(stk::mesh::BulkData& bulk, - const stk::mesh::Field& stkField, - const stk::mesh::Part& part, - const int expectedFieldValue) +void test_field_values_on_device_without_initial_sync(stk::mesh::BulkData& bulk, + const stk::mesh::Field& stkField, + const stk::mesh::Part& part, + const int expectedFieldValue) { stk::mesh::NgpField & ngpField = stk::mesh::get_updated_ngp_field(stkField); - ngpField.sync_to_device(); stk::mesh::Selector selection = bulk.mesh_meta_data().locally_owned_part() & part; const stk::mesh::BucketVector& buckets = bulk.get_buckets(stkField.entity_rank(), selection); @@ -826,6 +841,17 @@ void test_field_values_on_device(stk::mesh::BulkData& bulk, }); } +void test_field_values_on_device(stk::mesh::BulkData& bulk, + const stk::mesh::Field& stkField, + const stk::mesh::Part& part, + const int expectedFieldValue) +{ + stk::mesh::NgpField & ngpField = stk::mesh::get_updated_ngp_field(stkField); + ngpField.sync_to_device(); + + test_field_values_on_device_without_initial_sync(bulk, stkField, part, expectedFieldValue); +} + void test_field_values_on_device(stk::mesh::BulkData &bulk, const stk::mesh::Field & stkField, const int expectedFieldValue) @@ -833,13 +859,11 @@ void test_field_values_on_device(stk::mesh::BulkData &bulk, test_field_values_on_device(bulk, stkField, bulk.mesh_meta_data().locally_owned_part(), expectedFieldValue); } -void test_field_values_on_host(const stk::mesh::BulkData& bulk, - const stk::mesh::Field& stkField, - const stk::mesh::Part& part, - const int expectedFieldValue) +void test_field_values_on_host_without_initial_sync(const stk::mesh::BulkData& bulk, + const stk::mesh::Field& stkField, + const stk::mesh::Part& part, + const int expectedFieldValue) { - stkField.sync_to_host(); - stk::mesh::Selector selection = bulk.mesh_meta_data().locally_owned_part() & part; const stk::mesh::BucketVector& buckets = bulk.get_buckets(stkField.entity_rank(), selection); for (size_t iBucket=0; iBucket& stkField, + const stk::mesh::Part& part, + const int expectedFieldValue) +{ + stkField.sync_to_host(); + + test_field_values_on_host_without_initial_sync(bulk, stkField, part, expectedFieldValue); +} + void test_field_values_on_host(const stk::mesh::BulkData& bulk, const stk::mesh::Field& stkField, const int expectedFieldValue) @@ -869,7 +903,7 @@ void initialize_ngp_field(stk::mesh::Field & stkField) } template -void modify_field_on_host(stk::mesh::BulkData & bulk, stk::mesh::Field & field, int multiplier) +void multiply_field_data_on_host(stk::mesh::BulkData & bulk, stk::mesh::Field & field, int multiplier) { const stk::mesh::BucketVector& buckets = bulk.buckets(field.entity_rank()); for (stk::mesh::Bucket * bucket : buckets) { @@ -878,6 +912,12 @@ void modify_field_on_host(stk::mesh::BulkData & bulk, stk::mesh::Field & fiel fieldData[iEntity] *= multiplier; } } +} + +template +void modify_field_on_host(stk::mesh::BulkData & bulk, stk::mesh::Field & field, int multiplier) +{ + multiply_field_data_on_host(bulk, field, multiplier); field.modify_on_host(); } @@ -900,12 +940,11 @@ void sync_field_to_device(stk::mesh::Field & field) } template -void modify_field_on_device(stk::mesh::BulkData & bulk, stk::mesh::Field & stkField, int multiplier) +void multiply_field_data_on_device(stk::mesh::BulkData & bulk, stk::mesh::Field & stkField, int multiplier) { stk::mesh::NgpMesh & ngpMesh = stk::mesh::get_updated_ngp_mesh(bulk); const stk::mesh::MetaData & meta = bulk.mesh_meta_data(); stk::mesh::NgpField & ngpField = stk::mesh::get_updated_ngp_field(stkField); - ngpField.sync_to_device(); stk::mesh::for_each_entity_run(ngpMesh, stk::topology::ELEM_RANK, meta.locally_owned_part(), KOKKOS_LAMBDA(const stk::mesh::FastMeshIndex& entity) { @@ -914,6 +953,16 @@ void modify_field_on_device(stk::mesh::BulkData & bulk, stk::mesh::Field & st ngpField(entity, component) *= multiplier; } }); +} + +template +void modify_field_on_device(stk::mesh::BulkData & bulk, stk::mesh::Field & stkField, int multiplier) +{ + stk::mesh::NgpField & ngpField = stk::mesh::get_updated_ngp_field(stkField); + ngpField.sync_to_device(); + + multiply_field_data_on_device(bulk, stkField, multiplier); + stkField.modify_on_device(); } @@ -972,6 +1021,58 @@ TEST_F(NgpFieldFixture, noFieldDataTest) EXPECT_NO_THROW(stk::mesh::get_updated_ngp_field(field)); } +TEST_F(NgpFieldFixture, ModifyOnHostFlagClearedOnInitialNgpFieldConstruction) +{ + if (get_parallel_size() != 1) return; + + setup_one_field_one_element_mesh(); + + stk::mesh::Field& field1 = dynamic_cast&>( + *get_meta().get_field(stk::topology::ELEM_RANK, "field1")); + EXPECT_FALSE(field1.need_sync_to_device()); + field1.modify_on_host(); + + auto ngpfield = stk::mesh::get_updated_ngp_field(field1); + EXPECT_FALSE(field1.need_sync_to_device()); +} + +TEST_F(NgpFieldFixture, InvalidModifyFlagCondition) +{ + if (get_parallel_size() != 1) return; + + setup_one_field_one_element_mesh(); + + stk::mesh::Field& field1 = dynamic_cast&>( + *get_meta().get_field(stk::topology::ELEM_RANK, "field1")); + EXPECT_FALSE(field1.need_sync_to_device()); + + auto ngpfield = stk::mesh::get_updated_ngp_field(field1); + EXPECT_FALSE(field1.need_sync_to_device()); + + field1.modify_on_host(); + EXPECT_THROW(ngpfield.modify_on_device(), std::logic_error); +} + +TEST_F(NgpFieldFixture, PersistentModifyOnDeviceFlag) +{ + if (get_parallel_size() != 1) return; + + setup_one_field_one_element_mesh(); + + stk::mesh::Field& field1 = dynamic_cast&>( + *get_meta().get_field(stk::topology::ELEM_RANK, "field1")); + EXPECT_FALSE(field1.need_sync_to_host()); + field1.modify_on_device(); + + auto ngpfield = stk::mesh::get_updated_ngp_field(field1); + EXPECT_TRUE(field1.need_sync_to_host()); + + multiply_field_data_on_device(get_bulk(), field1, 2); + ngpfield.sync_to_host(); + + test_field_values_on_host_without_initial_sync(get_bulk(), field1, get_meta().universal_part(), 2); +} + TEST_F(NgpFieldFixture, noOverwriteInVariableLengthFields) { if (get_parallel_size() != 1) return; @@ -1442,117 +1543,6 @@ TEST_F(NgpFieldFixture, updateBucketPtrView) ngpField.update_bucket_pointer_view(); } -class NgpFieldSwapFixture : public NgpFieldFixture { -public: - void setup_fields_for_swap() { - stk::mesh::Field& stkIntField1 = create_field(stk::topology::ELEM_RANK, "intField1"); - stk::mesh::Field& stkIntField2 = create_field(stk::topology::ELEM_RANK, "intField2"); - setup_mesh("generated:1x1x1", stk::mesh::BulkData::NO_AUTO_AURA); - - stk::mesh::NgpField& ngpField1 = stk::mesh::get_updated_ngp_field(stkIntField1); - stk::mesh::NgpField& ngpField2 = stk::mesh::get_updated_ngp_field(stkIntField2); - testNgpField1 = static_cast&>(ngpField1); - testNgpField2 = static_cast&>(ngpField2); - } - -protected: - NgpFieldTester testNgpField1; - NgpFieldTester testNgpField2; - -}; - -TEST_F(NgpFieldSwapFixture, SwapSyncState_ModFlagsUnset) -{ - if(stk::parallel_machine_size(MPI_COMM_WORLD) != 1) { return; } - - setup_fields_for_swap(); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); - - testNgpField1.swap(testNgpField2); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); -} - -TEST_F(NgpFieldSwapFixture, SwapSyncState_ModFlagsSetModDevice) -{ - if(stk::parallel_machine_size(MPI_COMM_WORLD) != 1) { return; } - - setup_fields_for_swap(); - - testNgpField1.modify_on_device(); - - EXPECT_TRUE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); - - testNgpField1.swap(testNgpField2); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_TRUE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); -} - -TEST_F(NgpFieldSwapFixture, SwapSyncState_ModFlagsSetModHost) -{ - if(stk::parallel_machine_size(MPI_COMM_WORLD) != 1) { return; } - - setup_fields_for_swap(); - - testNgpField2.modify_on_host(); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_TRUE(testNgpField2.test_need_sync_to_device()); - - testNgpField1.swap(testNgpField2); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_TRUE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); -} - -TEST_F(NgpFieldSwapFixture, SwapSyncState_ModFlagsSetModHostDevice) -{ - if(stk::parallel_machine_size(MPI_COMM_WORLD) != 1) { return; } - - setup_fields_for_swap(); - - testNgpField1.modify_on_host(); - testNgpField2.modify_on_device(); - - EXPECT_FALSE(testNgpField1.test_need_sync_to_host()); - EXPECT_TRUE(testNgpField2.test_need_sync_to_host()); - EXPECT_TRUE(testNgpField1.test_need_sync_to_device()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_device()); - - testNgpField1.swap(testNgpField2); - - EXPECT_TRUE(testNgpField1.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField2.test_need_sync_to_host()); - EXPECT_FALSE(testNgpField1.test_need_sync_to_device()); - EXPECT_TRUE(testNgpField2.test_need_sync_to_device()); -} - -TEST_F(OptimizedNgpFieldFixture, ChangeBucketContentsByUserWithSingleComponent) -{ - if (get_parallel_size() != 1) return; - - unsigned numComponents = 1; - - run_change_bucket_content_by_user(numComponents); -} - // ------------------------- ------------------------- // | | | | | | | | // | 1 | 2 | 3 | ===> | 1 | 2 | 3 | diff --git a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpMultiStateFieldTests.cpp b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpMultiStateFieldTests.cpp index 89cc02fed60b..1733400126b9 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpMultiStateFieldTests.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/ngp/ngpMultiStateFieldTests.cpp @@ -229,3 +229,67 @@ NGP_TEST_F(NgpMultiStateFieldTest, persistentDeviceField_hasCorrectDataAfterStat delete_class_on_device(persistentDeviceClass); } + +NGP_TEST_F(NgpMultiStateFieldTest, persistentSyncToDeviceCountAfterStateRotation) +{ + if (get_parallel_size() != 1) GTEST_SKIP(); + setup_multistate_field(); + setup_mesh(2, 2, 2); + + stk::mesh::NgpField& ngpFieldNew = stk::mesh::get_updated_ngp_field(get_field_new()); + stk::mesh::NgpField& ngpFieldOld = stk::mesh::get_updated_ngp_field(get_field_old()); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_device(), ngpFieldOld.num_syncs_to_device()); + + ngpFieldNew.modify_on_host(); + ngpFieldNew.sync_to_device(); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_device(), ngpFieldOld.num_syncs_to_device()+1); + + perform_field_state_rotation(); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_device()+1, ngpFieldOld.num_syncs_to_device()); +} + +NGP_TEST_F(NgpMultiStateFieldTest, persistentSyncToHostCountAfterStateRotation) +{ + if (get_parallel_size() != 1) GTEST_SKIP(); + setup_multistate_field(); + setup_mesh(2, 2, 2); + + stk::mesh::NgpField& ngpFieldNew = stk::mesh::get_updated_ngp_field(get_field_new()); + stk::mesh::NgpField& ngpFieldOld = stk::mesh::get_updated_ngp_field(get_field_old()); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_device(), ngpFieldOld.num_syncs_to_device()); + + ngpFieldOld.modify_on_device(); + ngpFieldOld.sync_to_host(); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_host()+1, ngpFieldOld.num_syncs_to_host()); + + perform_field_state_rotation(); + + EXPECT_EQ(ngpFieldNew.num_syncs_to_host(), ngpFieldOld.num_syncs_to_host()+1); +} + +NGP_TEST_F(NgpMultiStateFieldTest, persistentModifyOnHostAfterStateRotation) +{ + if (get_parallel_size() != 1) GTEST_SKIP(); + setup_multistate_field(); + setup_mesh(2, 2, 2); + + stk::mesh::NgpField& ngpFieldNew = stk::mesh::get_updated_ngp_field(get_field_new()); + stk::mesh::NgpField& ngpFieldOld = stk::mesh::get_updated_ngp_field(get_field_old()); + ngpFieldNew.clear_sync_state(); + ngpFieldOld.clear_sync_state(); + + ngpFieldNew.modify_on_host(); + + EXPECT_TRUE(ngpFieldNew.need_sync_to_device()); + EXPECT_FALSE(ngpFieldOld.need_sync_to_device()); + + get_bulk().update_field_data_states(); + + EXPECT_FALSE(ngpFieldNew.need_sync_to_device()); + EXPECT_TRUE(ngpFieldOld.need_sync_to_device()); +} \ No newline at end of file diff --git a/packages/stk/stk_unit_tests/stk_search/UnitTestCoarseSearch.cpp b/packages/stk/stk_unit_tests/stk_search/UnitTestCoarseSearch.cpp index 64595f794cdf..403f4ffe173d 100644 --- a/packages/stk/stk_unit_tests/stk_search/UnitTestCoarseSearch.cpp +++ b/packages/stk/stk_unit_tests/stk_search/UnitTestCoarseSearch.cpp @@ -6,15 +6,15 @@ // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: -// +// // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. -// +// // * 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. -// +// // * Neither the name of NTESS nor the names of its contributors // may be used to endorse or promote products derived from this // software without specific prior written permission. @@ -30,19 +30,23 @@ // 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 -#include #include -#include #include +#include +#include +#include +#include +#include +#include + +typedef stk::search::Point Point; +typedef stk::search::Box StkBox; +typedef std::vector< std::pair > BoxVector; namespace std { template @@ -52,52 +56,44 @@ std::ostream & operator<<(std::ostream & out, std::pair Point; - typedef stk::search::Box StkBox; - typedef std::vector< std::pair > BoxVector; - int num_procs = stk::parallel_machine_size(comm); int proc_id = stk::parallel_machine_rank(comm); @@ -130,7 +126,153 @@ void testCoarseSearchForAlgorithm(stk::search::SearchMethod algorithm, MPI_Comm expect_search_results(num_procs, proc_id, searchResults); } -void testCoarseSearchForAlgorithmUsingFloatAABoxes(stk::search::SearchMethod algorithm, MPI_Comm comm) +std::pair build_range_boxes_and_nested_domain_boxes(int num_procs, int proc_id, int sizeParam=1) +{ + BoxVector local_domain, local_range; + + int startID = 0; + if (proc_id == 0) { + for (int i = 0; i < sizeParam; ++i) { + for (int j = 0; j < sizeParam; ++j, ++startID) { + StkBox box( Point(num_procs*i, num_procs*j, 0.0), Point(num_procs*(i+1), num_procs*(j+1), 1.0)); + Ident id(startID, proc_id); + local_range.push_back(std::make_pair(box,id)); + } + } + } + + for (int procShift = 0; procShift < num_procs; ++procShift) { + for (int i = 0; i < sizeParam; ++i) { + for (int j = 0; j < sizeParam; ++j, ++startID) { + StkBox box( Point(procShift*sizeParam+i, sizeParam*proc_id+j, 0.0), Point(procShift*sizeParam+i+1.0, sizeParam*proc_id+j+1, 1.0)); + Ident id(startID, proc_id); + local_domain.push_back(std::make_pair(box,id)); + } + } + } + + return std::make_pair(local_domain, local_range); + +} + +void expect_coarse_search_range_box_communication(int num_procs, + int proc_id, + const SearchResults& searchResultsCommunicateOn, + const SearchResults& searchResultsCommunicateOff) +{ + if (num_procs == 1) { + ASSERT_EQ(searchResultsCommunicateOn.size(), 1u); + ASSERT_EQ(searchResultsCommunicateOff.size(), 1u); + EXPECT_EQ(searchResultsCommunicateOn[0], std::make_pair(Ident(1, 0), Ident(0, 0))); + EXPECT_EQ(searchResultsCommunicateOff[0], std::make_pair(Ident(1, 0), Ident(0, 0))); + } + + else { + bool onRangeBoxProc = (proc_id == 0); + if (onRangeBoxProc) { + ASSERT_GT(searchResultsCommunicateOn.size(), searchResultsCommunicateOff.size()); + ASSERT_EQ(searchResultsCommunicateOn.size(), static_cast(num_procs * num_procs)); + } else { + ASSERT_EQ(searchResultsCommunicateOn.size(), static_cast(num_procs)); + } + ASSERT_EQ(searchResultsCommunicateOff.size(), static_cast(num_procs)); + + for (auto searchResult : searchResultsCommunicateOff) { + EXPECT_EQ(searchResult.first.proc(), proc_id); + } + } +} + +void test_coarse_search_range_box_communication(stk::search::SearchMethod algorithm, MPI_Comm comm) +{ + + BoxVector local_domain, local_range; + int num_procs = stk::parallel_machine_size(comm); + int proc_id = stk::parallel_machine_rank(comm); + + std::tie(local_domain, local_range) = build_range_boxes_and_nested_domain_boxes(num_procs, proc_id); + + SearchResults searchResultsCommunicateOn; + SearchResults searchResultsCommunicateOff; + + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsCommunicateOn, true, false); + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsCommunicateOff, false, false); + + expect_coarse_search_range_box_communication(num_procs, proc_id, searchResultsCommunicateOn, searchResultsCommunicateOff); +} + +TEST(stk_search, coarse_search_range_box_communication) +{ + test_coarse_search_range_box_communication(stk::search::KDTREE, MPI_COMM_WORLD); +} + +void test_coarse_search_determine_domain_and_range_communicate_on(stk::search::SearchMethod algorithm, MPI_Comm comm) +{ + + BoxVector local_domain, local_range; + int num_procs = stk::parallel_machine_size(comm); + int proc_id = stk::parallel_machine_rank(comm); + + std::tie(local_domain, local_range) = build_range_boxes_and_nested_domain_boxes(num_procs, proc_id); + + SearchResults searchResultsDetermineOn; + SearchResults searchResultsDetermineOff; + + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsDetermineOn, true, true); + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsDetermineOff, true, false); + + std::sort(searchResultsDetermineOn.begin(), searchResultsDetermineOn.end()); + std::sort(searchResultsDetermineOff.begin(), searchResultsDetermineOff.end()); + + EXPECT_EQ(searchResultsDetermineOn, searchResultsDetermineOff); +} + +TEST(stk_search, coarse_search_determine_domain_and_range_communicate_on) +{ + test_coarse_search_determine_domain_and_range_communicate_on(stk::search::KDTREE, MPI_COMM_WORLD); +} + +void test_coarse_search_two_pass(stk::search::SearchMethod algorithm, MPI_Comm comm, int sizeParam) +{ + BoxVector local_domain, local_range, additional_domain; + int num_procs = stk::parallel_machine_size(comm); + int proc_id = stk::parallel_machine_rank(comm); + + std::tie(local_domain, local_range) = build_range_boxes_and_nested_domain_boxes(num_procs, proc_id, sizeParam); + if (proc_id == num_procs - 1) { + StkBox box( Point(0.0, 0.0, 0.0), Point(1.0, 1.0, 1.0)); + Ident id(local_domain.size(), proc_id); + additional_domain.push_back(std::make_pair(box,id)); + } + + SearchResults searchResultsPassOne; + SearchResults searchResultsPassTwo; + SearchResults searchResultsAllBoxes; + + bool communicate = false; + bool determine = false; + + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsPassOne, communicate, determine); + stk::search::coarse_search(additional_domain, local_range, algorithm, comm, searchResultsPassTwo, communicate, determine); + + local_domain.insert(local_domain.end(), additional_domain.begin(), additional_domain.end()); + + stk::search::coarse_search(local_domain, local_range, algorithm, comm, searchResultsAllBoxes, communicate, determine); + + searchResultsPassOne.insert(searchResultsPassOne.end(), searchResultsPassTwo.begin(), searchResultsPassTwo.end()); + + std::sort(searchResultsPassOne.begin(), searchResultsPassOne.end()); + std::sort(searchResultsAllBoxes.begin(), searchResultsAllBoxes.end()); + + EXPECT_EQ(searchResultsPassOne, searchResultsAllBoxes); +} + +TEST(stk_search, coarse_search_two_pass) +{ + test_coarse_search_two_pass(stk::search::KDTREE, MPI_COMM_WORLD, 2); +} + +void test_coarse_search_for_algorithm_using_float_boxes(stk::search::SearchMethod algorithm, MPI_Comm comm) { int num_procs = stk::parallel_machine_size(comm); int proc_id = stk::parallel_machine_rank(comm); @@ -166,83 +308,70 @@ void testCoarseSearchForAlgorithmUsingFloatAABoxes(stk::search::SearchMethod alg TEST(stk_search, coarse_search_kdtree) { - testCoarseSearchForAlgorithm(stk::search::KDTREE, MPI_COMM_WORLD); + test_coarse_search_for_algorithm(stk::search::KDTREE, MPI_COMM_WORLD); } TEST(stk_search, coarse_search_kdtree_using_float_aa_boxes) { - testCoarseSearchForAlgorithmUsingFloatAABoxes(stk::search::KDTREE, MPI_COMM_WORLD); + test_coarse_search_for_algorithm_using_float_boxes(stk::search::KDTREE, MPI_COMM_WORLD); } -void testIdentProcWithSearch(stk::search::SearchMethod searchMethod) +void test_ident_proc_with_search(stk::search::SearchMethod searchMethod) { - MPI_Comm comm = MPI_COMM_WORLD; - int procId=-1; - MPI_Comm_rank(comm, &procId); - int numProcs = -1; - MPI_Comm_size(comm, &numProcs); - - if ( numProcs != 1 ) - { - FloatBox box1(0,0,0,1,1,1); - FloatBox box2(0.5, 0.5, 0.5, 1.5, 1.5, 1.5); - Ident id1(1, 0); - Ident id2(1, 1); - - FloatBoxVector boxes; - if ( procId == 0 ) - { - boxes.push_back(std::make_pair(box1, id1)); - } - else if ( procId == 1 ) - { - boxes.push_back(std::make_pair(box2, id2)); - } + MPI_Comm comm = MPI_COMM_WORLD; + int procId = -1; + MPI_Comm_rank(comm, &procId); + int numProcs = -1; + MPI_Comm_size(comm, &numProcs); + + if (numProcs != 1) { + FloatBox box1(0, 0, 0, 1, 1, 1); + FloatBox box2(0.5, 0.5, 0.5, 1.5, 1.5, 1.5); + Ident id1(1, 0); + Ident id2(1, 1); + + FloatBoxVector boxes; + if (procId == 0) { + boxes.push_back(std::make_pair(box1, id1)); + } else if (procId == 1) { + boxes.push_back(std::make_pair(box2, id2)); + } - SearchResults searchResults; + SearchResults searchResults; - coarse_search(boxes, boxes, searchMethod, comm, searchResults); + coarse_search(boxes, boxes, searchMethod, comm, searchResults); - SearchResults goldResults; + SearchResults goldResults; - Ident goldId1(1, 0); - Ident goldId2(1, 1); + Ident goldId1(1, 0); + Ident goldId2(1, 1); - if (procId == 0 ) - { - goldResults.push_back(std::make_pair(goldId1, goldId1)); - goldResults.push_back(std::make_pair(goldId1, goldId2)); - goldResults.push_back(std::make_pair(goldId2, goldId1)); - ASSERT_EQ(goldResults.size(), searchResults.size()); - } - else if ( procId == 1 ) - { - goldResults.push_back(std::make_pair(goldId1, goldId2)); - goldResults.push_back(std::make_pair(goldId2, goldId1)); - goldResults.push_back(std::make_pair(goldId2, goldId2)); - ASSERT_EQ(3u, searchResults.size()); - } + if (procId == 0) { + goldResults.push_back(std::make_pair(goldId1, goldId1)); + goldResults.push_back(std::make_pair(goldId1, goldId2)); + goldResults.push_back(std::make_pair(goldId2, goldId1)); + ASSERT_EQ(goldResults.size(), searchResults.size()); + } else if (procId == 1) { + goldResults.push_back(std::make_pair(goldId1, goldId2)); + goldResults.push_back(std::make_pair(goldId2, goldId1)); + goldResults.push_back(std::make_pair(goldId2, goldId2)); + ASSERT_EQ(3u, searchResults.size()); + } - for (size_t i=0;i Ident; - typedef stk::search::Point Point; - typedef stk::search::Box StkBox; - typedef std::vector > BoxVector; - typedef std::vector > SearchResults; - stk::ParallelMachine comm = MPI_COMM_WORLD; //int num_procs = stk::parallel_machine_size(comm); int proc_id = stk::parallel_machine_rank(comm); @@ -289,10 +418,10 @@ void testCoarseSearchOnePoint(stk::search::SearchMethod searchMethod) TEST(stk_search, coarse_search_one_point_KDTREE) { - testCoarseSearchOnePoint(stk::search::KDTREE); + test_coarse_search_one_point(stk::search::KDTREE); } -void testCoarseSearchForDeterminingSharingAllAllCase(stk::search::SearchMethod searchMethod) +void test_coarse_search_for_determining_sharing_all_all_case(stk::search::SearchMethod searchMethod) { const stk::ParallelMachine comm = MPI_COMM_WORLD; const int p_rank = stk::parallel_machine_rank(comm); @@ -343,12 +472,11 @@ void testCoarseSearchForDeterminingSharingAllAllCase(stk::search::SearchMethod s TEST(CoarseSearch, forDeterminingSharingAllAllCase_KDTREE) { - testCoarseSearchForDeterminingSharingAllAllCase(stk::search::KDTREE); + test_coarse_search_for_determining_sharing_all_all_case(stk::search::KDTREE); } - -void testCoarseSearchForDeterminingSharingLinearAdjacentCase(stk::search::SearchMethod searchMethod, - int numLoops = 1) +void test_coarse_search_for_determining_sharing_linear_adjacent_case( + stk::search::SearchMethod searchMethod, int numLoops = 1) { const stk::ParallelMachine comm = MPI_COMM_WORLD; const int p_rank = stk::parallel_machine_rank(comm); @@ -446,12 +574,12 @@ void testCoarseSearchForDeterminingSharingLinearAdjacentCase(stk::search::Search TEST(CoarseSearch, forDeterminingSharingLinearAdjacentCase_KDTREE) { - testCoarseSearchForDeterminingSharingLinearAdjacentCase(stk::search::KDTREE); + test_coarse_search_for_determining_sharing_linear_adjacent_case(stk::search::KDTREE); } TEST(CoarseSearchScaling, forDeterminingSharingLinearAdjacentCase_KDTREE) { - testCoarseSearchForDeterminingSharingLinearAdjacentCase(stk::search::KDTREE, 1000); + test_coarse_search_for_determining_sharing_linear_adjacent_case(stk::search::KDTREE, 1000); } } //namespace diff --git a/packages/stk/stk_unit_tests/stk_simd_old/UnitTestStkSimdView2d.cpp b/packages/stk/stk_unit_tests/stk_simd_old/UnitTestStkSimdView2d.cpp index 011d46d984ad..48700d20f9ea 100644 --- a/packages/stk/stk_unit_tests/stk_simd_old/UnitTestStkSimdView2d.cpp +++ b/packages/stk/stk_unit_tests/stk_simd_old/UnitTestStkSimdView2d.cpp @@ -84,10 +84,12 @@ class StkSimdView2dTester { set_b_to_2a_plus_b_functor_with_tag(a, b); test_view_equal_to_index_multiple(stk::simd::copy_from_device(b), 5); +#ifndef KOKKOS_ENABLE_CUDA auto aHost = stk::simd::copy_from_device(a); auto bHost = stk::simd::copy_from_device(b); set_b_to_3a_plus_b_for_each_lambda(aHost, bHost); test_view_equal_to_index_multiple(bHost, 8); +#endif } void parallel_reduce_test(int loopSize, int j) const { diff --git a/packages/stk/stk_unit_tests/stk_tools/mesh_clone/UnitTestBulkDataClone.cpp b/packages/stk/stk_unit_tests/stk_tools/mesh_clone/UnitTestBulkDataClone.cpp index 8fd3c1be43b9..c7b94b2dbe4a 100644 --- a/packages/stk/stk_unit_tests/stk_tools/mesh_clone/UnitTestBulkDataClone.cpp +++ b/packages/stk/stk_unit_tests/stk_tools/mesh_clone/UnitTestBulkDataClone.cpp @@ -321,7 +321,7 @@ class CloningMesh : public stk::unit_test_util::MeshFixture expect_equal_entity_counts(oldBulk, universalPart, newBulk); const stk::mesh::MetaData &oldMeta = oldBulk.mesh_meta_data(); - ASSERT_EQ(5u, oldMeta.entity_rank_count()); + ASSERT_EQ(5u, static_cast(oldMeta.entity_rank_count())); stk::mesh::Selector localOrSharedSelector = oldMeta.locally_owned_part() | oldMeta.globally_shared_part(); stk::mesh::EntityRank endRank = static_cast(oldMeta.entity_rank_count()); stk::mesh::EntityVector oldEntities; @@ -364,7 +364,7 @@ class CloningMesh : public stk::unit_test_util::MeshFixture expect_equal_entity_counts(oldBulk, copySelector, newBulk); const stk::mesh::MetaData &oldMeta = oldBulk.mesh_meta_data(); - ASSERT_EQ(5u, oldMeta.entity_rank_count()); + ASSERT_EQ(5u, static_cast(oldMeta.entity_rank_count())); stk::mesh::Selector localOrSharedSelector = copySelector & (oldMeta.locally_owned_part() | oldMeta.globally_shared_part()); stk::mesh::EntityRank endRank = static_cast(oldMeta.entity_rank_count()); stk::mesh::EntityVector oldEntities; diff --git a/packages/stk/stk_unit_tests/stk_util/CMakeLists.txt b/packages/stk/stk_unit_tests/stk_util/CMakeLists.txt index 2866fae9e89e..a6198872f16e 100644 --- a/packages/stk/stk_unit_tests/stk_util/CMakeLists.txt +++ b/packages/stk/stk_unit_tests/stk_util/CMakeLists.txt @@ -38,6 +38,7 @@ FILE(GLOB SOURCES *.cpp command_line/*.cpp diag/*.cpp environment/*.cpp + ngp/*.cpp parallel/*.cpp registry/*.cpp util/*.cpp) diff --git a/packages/stk/stk_unit_tests/stk_util/environment/UnitTestOutputLog.cpp b/packages/stk/stk_unit_tests/stk_util/environment/UnitTestOutputLog.cpp index 74d5a9470cd4..e4fd3bac33f6 100644 --- a/packages/stk/stk_unit_tests/stk_util/environment/UnitTestOutputLog.cpp +++ b/packages/stk/stk_unit_tests/stk_util/environment/UnitTestOutputLog.cpp @@ -35,169 +35,226 @@ #include "gtest/gtest.h" #include "stk_util/parallel/Parallel.hpp" #include "stk_util/environment/OutputLog.hpp" +#include "stk_util/environment/EnvData.hpp" +#include "stk_util/environment/Env.hpp" #include #include #include -TEST(UnitTestOutputLog, UnitTest) +class TestOutputStreams : public ::testing::Test { - if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } - - // UseCase-Environment registers a bunch of things automatically, some of - // which conflict with this test. We unregister the conflicting streams - // here. - if (stk::get_log_ostream("cout") != NULL) { - stk::unregister_log_ostream(*stk::get_log_ostream("cout")); - } - if (stk::get_log_ostream("cerr") != NULL) { - stk::unregister_log_ostream(*stk::get_log_ostream("cerr")); - } - if (stk::get_ostream_ostream("out") != NULL) { - stk::unregister_ostream(*stk::get_ostream_ostream("out")); - } - if (stk::get_ostream_ostream("pout") != NULL) { - stk::unregister_ostream(*stk::get_ostream_ostream("pout")); +protected: + virtual void SetUp() override + { + // We unregister any conflicting streams here. + if (stk::get_log_ostream("cout") != NULL) { + stk::unregister_log_ostream(*stk::get_log_ostream("cout")); + } + if (stk::get_log_ostream("cerr") != NULL) { + stk::unregister_log_ostream(*stk::get_log_ostream("cerr")); + } + if (stk::get_ostream_ostream("out") != NULL) { + stk::unregister_ostream(*stk::get_ostream_ostream("out")); + } + if (stk::get_ostream_ostream("pout") != NULL) { + stk::unregister_ostream(*stk::get_ostream_ostream("pout")); + } } +}; + +TEST_F(TestOutputStreams, RegisterBindUnregister) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } // Make cout and cerr available as log stream targets. stk::register_log_ostream(std::cout, "cout"); stk::register_log_ostream(std::cerr, "cerr"); - // Test registration, binding, rebinding and unregistration - { - std::ostringstream log1; - std::ostringstream log2; - - std::ostream out(std::cout.rdbuf()); - - stk::register_ostream(out, "out"); - - ASSERT_TRUE(stk::is_registered_ostream("out")); - - stk::register_log_ostream(log1, "log1"); - stk::register_log_ostream(log2, "log2"); - - stk::bind_output_streams("out>log1"); - - out << "stk::bind_output_streams(\"out>log1\");" << std::endl; - - stk::bind_output_streams("out>+log2"); - out << "stk::bind_output_streams(\"out>+log2\");" << std::endl; - - stk::bind_output_streams("out>-log1"); - out << "stk::bind_output_streams(\"out>-log1\");" << std::endl; - - stk::bind_output_streams("out>-log2"); - out << "stk::bind_output_streams(\"out>-log2\");" << std::endl; - - std::ostringstream log1_result; - log1_result << "stk::bind_output_streams(\"out>log1\");" << std::endl - << "stk::bind_output_streams(\"out>+log2\");" << std::endl; - - std::ostringstream log2_result; - log2_result << "stk::bind_output_streams(\"out>+log2\");" << std::endl - << "stk::bind_output_streams(\"out>-log1\");" << std::endl; - - ASSERT_EQ((log1_result.str() == log1.str()), true); - ASSERT_EQ((log2_result.str() == log2.str()), true); - - stk::unregister_log_ostream(log1); - stk::unregister_log_ostream(log2); - stk::unregister_ostream(out); - - ASSERT_EQ(out.rdbuf(), std::cout.rdbuf()); - } + std::ostringstream log1; + std::ostringstream log2; + + std::ostream out(std::cout.rdbuf()); - // Test logging to a file - { - std::ostream out(std::cout.rdbuf()); + stk::register_ostream(out, "out"); - stk::register_ostream(out, "out"); + ASSERT_TRUE(stk::is_registered_ostream("out")); + + stk::register_log_ostream(log1, "log1"); + stk::register_log_ostream(log2, "log2"); - stk::bind_output_streams("log=\"logfile\" out>log"); + stk::bind_output_streams("out>log1"); - ASSERT_EQ((std::string("logfile") == stk::get_log_path("log")), true); - - out << "This is a test" << std::endl; + out << "stk::bind_output_streams(\"out>log1\");" << std::endl; - stk::bind_output_streams("log=\"\""); - - stk::unregister_ostream(out); + stk::bind_output_streams("out>+log2"); + out << "stk::bind_output_streams(\"out>+log2\");" << std::endl; + + stk::bind_output_streams("out>-log1"); + out << "stk::bind_output_streams(\"out>-log1\");" << std::endl; - std::ostringstream log_result; - log_result << "This is a test"; - - std::ifstream log_stream("logfile"); - std::string log_string; - getline(log_stream, log_string); - ASSERT_EQ((log_result.str() == log_string), true); + stk::bind_output_streams("out>-log2"); + out << "stk::bind_output_streams(\"out>-log2\");" << std::endl; + + std::ostringstream log1_result; + log1_result << "stk::bind_output_streams(\"out>log1\");" << std::endl + << "stk::bind_output_streams(\"out>+log2\");" << std::endl; + + std::ostringstream log2_result; + log2_result << "stk::bind_output_streams(\"out>+log2\");" << std::endl + << "stk::bind_output_streams(\"out>-log1\");" << std::endl; + + ASSERT_EQ((log1_result.str() == log1.str()), true); + ASSERT_EQ((log2_result.str() == log2.str()), true); + + stk::unregister_log_ostream(log1); + stk::unregister_log_ostream(log2); + stk::unregister_ostream(out); + + ASSERT_EQ(out.rdbuf(), std::cout.rdbuf()); +} + +TEST_F(TestOutputStreams, LogToFile) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } + + std::ostream out(std::cout.rdbuf()); + + stk::register_ostream(out, "out"); + + stk::bind_output_streams("log=\"logfile\" out>log"); + + ASSERT_EQ((std::string("logfile") == stk::get_log_path("log")), true); + + out << "This is a test" << std::endl; + + stk::bind_output_streams("log=\"\""); + + stk::unregister_ostream(out); + + std::ostringstream log_result; + log_result << "This is a test"; + + std::ifstream log_stream("logfile"); + std::string log_string; + getline(log_stream, log_string); + ASSERT_EQ((log_result.str() == log_string), true); +} + +TEST_F(TestOutputStreams, LogViaOutputP0) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } + + stk::bind_output_streams("log=\"myfile.log\""); + stk::EnvData::instance().m_outputP0 = stk::get_log_ostream("log"); + + ASSERT_EQ((std::string("myfile.log") == stk::get_log_path("log")), true); + + sierra::Env::outputP0() << "This is a test" << std::endl; + + stk::bind_output_streams("log=\"\""); + + std::ostringstream log_result; + log_result << "This is a test"; + + std::ifstream log_stream("myfile.log"); + std::string log_string; + getline(log_stream, log_string); + ASSERT_EQ((log_result.str() == log_string), true); +} + +TEST_F(TestOutputStreams, LogViaSierraOut) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } + + if (stk::get_ostream_ostream("out") == NULL) { + stk::register_ostream(sierra::out(), "out"); } - // Test results of unregistration of an output stream bound as a log stream - { - std::ostringstream default_log; - std::ostream out(default_log.rdbuf()); - std::ostream pout(std::cout.rdbuf()); + stk::bind_output_streams("log=\"myfile.log\" out>log"); + + ASSERT_EQ((std::string("myfile.log") == stk::get_log_path("log")), true); + + sierra::out() << "This is a test" << std::endl; - stk::register_ostream(out, "out"); - stk::register_ostream(pout, "pout"); + stk::bind_output_streams("log=\"\""); - // Constructing the log streams after the registered output stream is not exception safe. - std::ostringstream log; - stk::register_log_ostream(log, "log"); + std::ostringstream log_result; + log_result << "This is a test"; + + std::ifstream log_stream("myfile.log"); + std::string log_string; + getline(log_stream, log_string); + ASSERT_EQ((log_result.str() == log_string), true); +} - // As a result, this try catch block must be represent to ensure the that unregistration - // happens correctly. - try { - stk::bind_output_streams("out>pout pout>log"); +TEST_F(TestOutputStreams, UnregisterOutputBoundAsLog) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } - out << "This is to out" << std::endl; - pout << "This is to pout" << std::endl; + std::ostringstream default_log; + std::ostream out(default_log.rdbuf()); + std::ostream pout(std::cout.rdbuf()); - std::ostringstream log_result; - log_result << "This is to out" << std::endl - << "This is to pout" << std::endl; - - ASSERT_EQ((log_result.str() == log.str()), true); + stk::register_ostream(out, "out"); + stk::register_ostream(pout, "pout"); - throw std::exception(); - } - catch (...) { - } + // Constructing the log streams after the registered output stream is not exception safe. + std::ostringstream log; + stk::register_log_ostream(log, "log"); - stk::unregister_log_ostream(log); - stk::unregister_ostream(pout); - stk::unregister_ostream(out); + // As a result, this try catch block must be represent to ensure the that unregistration + // happens correctly. + try { + stk::bind_output_streams("out>pout pout>log"); out << "This is to out" << std::endl; + pout << "This is to pout" << std::endl; std::ostringstream log_result; - log_result << "This is to out" << std::endl; - ASSERT_EQ((log_result.str() == default_log.str()), true); + log_result << "This is to out" << std::endl + << "This is to pout" << std::endl; + + ASSERT_EQ((log_result.str() == log.str()), true); + + throw std::exception(); + } + catch (...) { } - // Test exception of registration with existing name - { - std::ostringstream log1; - std::ostringstream log2; - - std::ostream out(std::cout.rdbuf()); - std::ostream pout(std::cout.rdbuf()); + stk::unregister_log_ostream(log); + stk::unregister_ostream(pout); + stk::unregister_ostream(out); - stk::register_ostream(out, "out"); - ASSERT_THROW(stk::register_ostream(pout, "out"), std::runtime_error); + out << "This is to out" << std::endl; - ASSERT_EQ(&out, stk::get_ostream_ostream("out")); + std::ostringstream log_result; + log_result << "This is to out" << std::endl; + ASSERT_EQ((log_result.str() == default_log.str()), true); +} - stk::register_log_ostream(log1, "log"); - - ASSERT_THROW(stk::bind_output_streams("badout>log"), std::runtime_error); - - ASSERT_THROW(stk::bind_output_streams("out>badlog"), std::runtime_error); +TEST_F(TestOutputStreams, RegisterExistingName) +{ + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) { GTEST_SKIP(); } - stk::unregister_log_ostream(log1); - stk::unregister_ostream(out); - } + std::ostringstream log1; + std::ostringstream log2; + + std::ostream out(std::cout.rdbuf()); + std::ostream pout(std::cout.rdbuf()); + + stk::register_ostream(out, "out"); + ASSERT_THROW(stk::register_ostream(pout, "out"), std::runtime_error); + + ASSERT_EQ(&out, stk::get_ostream_ostream("out")); + + stk::register_log_ostream(log1, "log"); + + ASSERT_THROW(stk::bind_output_streams("badout>log"), std::runtime_error); + + ASSERT_THROW(stk::bind_output_streams("out>badlog"), std::runtime_error); + + stk::unregister_log_ostream(log1); + stk::unregister_ostream(out); } diff --git a/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp b/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp new file mode 100644 index 000000000000..62e284586ce3 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp @@ -0,0 +1,85 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 "gtest/gtest.h" +#include +#include + +namespace ngp { + +class NgpBase { +public: + KOKKOS_DEFAULTED_FUNCTION NgpBase() = default; + KOKKOS_FUNCTION virtual ~NgpBase() {} + + virtual void host_function() = 0; +}; + +template +class NgpDerived : public NgpBase +{ +public: + KOKKOS_FUNCTION + NgpDerived() + : NgpBase() + {} + + KOKKOS_FUNCTION + ~NgpDerived() {} + + virtual void host_function() { } +}; + +} + +namespace { + +void test_device_class() +{ + int constructionFinished = 0; + Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(const unsigned& i, int& localFinished) { + ngp::NgpDerived derivedClass; + localFinished = 1; + }, constructionFinished); + + EXPECT_EQ(1, constructionFinished); +} + +TEST(NgpDevice, virtualFunction) +{ + test_device_class(); +} + +} + diff --git a/packages/stk/stk_util/Jamfile b/packages/stk/stk_util/Jamfile index 06e57e3c1ed6..f6d32d725c09 100644 --- a/packages/stk/stk_util/Jamfile +++ b/packages/stk/stk_util/Jamfile @@ -173,6 +173,7 @@ exe stk_util_utest [ glob $(stk_util-root)/../stk_unit_tests/stk_util/environment/*.cpp ] [ glob $(stk_util-root)/../stk_unit_tests/stk_util/command_line/*.cpp ] [ glob $(stk_util-root)/../stk_unit_tests/stk_util/diag/*.cpp ] + [ glob $(stk_util-root)/../stk_unit_tests/stk_util/ngp/*.cpp ] [ glob $(stk_util-root)/../stk_unit_tests/stk_util/parallel/*.cpp ] /sierra/stk_unit_test_utils//stk_unit_main /sierra/stk_unit_test_utils//stk_unit_test_utils @@ -311,6 +312,7 @@ lib stk_util_util [ glob $(stk_util-root)/stk_util/util/*.cpp ] ] /mpi//mpi + /tpl/trilinos//teuchoscore /tpl/trilinos//kokkoscore /tpl/boost//boost_header_only_libs : diff --git a/packages/stk/stk_util/stk_util/parallel/ParallelIndex.hpp b/packages/stk/stk_util/stk_util/parallel/ParallelIndex.hpp index 9836831a3a78..71ad80b76783 100644 --- a/packages/stk/stk_util/stk_util/parallel/ParallelIndex.hpp +++ b/packages/stk/stk_util/stk_util/parallel/ParallelIndex.hpp @@ -96,8 +96,9 @@ class ParallelIndex { #endif /* DOXYGEN_COMPILE */ +#ifndef STK_HIDE_DEPRECATED_CODE Delete this whole header after June 2021 /** \brief Construct with locally-submitted keys */ - ParallelIndex( ParallelMachine comm, +STK_DEPRECATED ParallelIndex( ParallelMachine comm, const std::vector & local ) : m_comm( comm ), m_key_proc(), @@ -117,6 +118,7 @@ class ParallelIndex { sort_unique( m_key_proc ); } +#endif // STK_HIDE_DEPRECATED_CODE ~ParallelIndex() {} diff --git a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp index 2eb71e574bd9..6f3012616b9b 100644 --- a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp +++ b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp @@ -42,7 +42,7 @@ //In Sierra, STK_VERSION_STRING is provided on the compile line by bake. //For Trilinos stk snapshots, the following macro definition gets populated with //the real version string by the trilinos_snapshot.sh script. -#define STK_VERSION_STRING "5.1.9-59-g9d464b74" +#define STK_VERSION_STRING "5.3.1-48-ga8ff7841" #endif namespace stk { diff --git a/packages/stk/stk_util/stk_util/util/ParameterList.hpp b/packages/stk/stk_util/stk_util/util/ParameterList.hpp index 102bdbd482c8..8fa7563e2ae8 100644 --- a/packages/stk/stk_util/stk_util/util/ParameterList.hpp +++ b/packages/stk/stk_util/stk_util/util/ParameterList.hpp @@ -35,15 +35,10 @@ #ifndef PARAMETERLIST_HPP #define PARAMETERLIST_HPP -#include "stk_util/stk_config.h" // for STK_HAVE_BOOST +#include "stk_util/stk_config.h" -#ifdef STK_HAVE_BOOST -#include "boost/any.hpp" // for any, any_cast -#define STK_ANY_NAMESPACE boost -#else #include "Teuchos_any.hpp" #define STK_ANY_NAMESPACE Teuchos -#endif #include // for int64_t #include // for operator<<, basic_ostream, ostream, cerr From fa115c10f82348066bf89cf7aff9fa129acff585 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 14 Oct 2021 16:31:35 -0600 Subject: [PATCH 20/98] ifpack2,sacado: rename CUDA_SAFE_CALL -> KOKKOS_IMPL_CUDA_SAFE_CALL Rename CUDA_SAFE_CALL for compatibility with kokkos/kokkos#4249 See issue #9587 --- .../ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp | 8 ++++---- packages/sacado/src/Sacado_DynamicArrayTraits.hpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp index 73790de2bf78..dd5db17ab029 100644 --- a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp +++ b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp @@ -315,10 +315,10 @@ namespace Ifpack2 { #if defined(KOKKOS_ENABLE_CUDA) && defined(IFPACK2_BLOCKTRIDICONTAINER_ENABLE_PROFILE) #define IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_BEGIN \ - CUDA_SAFE_CALL(cudaProfilerStart()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaProfilerStart()); #define IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_END \ - { CUDA_SAFE_CALL( cudaProfilerStop() ); } + { KOKKOS_IMPL_CUDA_SAFE_CALL( cudaProfilerStop() ); } #else /// later put vtune profiler region #define IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_BEGIN @@ -676,7 +676,7 @@ namespace Ifpack2 { exec_instances.clear(); exec_instances.resize(num_streams); for (local_ordinal_type i=0;i::createInstance(stream[i], exec_instances[i]); } } @@ -688,7 +688,7 @@ namespace Ifpack2 { { const local_ordinal_type num_streams = stream.size(); for (local_ordinal_type i=0;i(0,1),f); @@ -136,7 +136,7 @@ namespace Sacado { inline void destroyGlobalMemoryPool(const Kokkos::Cuda& space) { - CUDA_SAFE_CALL( cudaFree( (void*) Impl::global_sacado_cuda_memory_pool_device ) ); + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaFree( (void*) Impl::global_sacado_cuda_memory_pool_device ) ); delete Impl::global_sacado_cuda_memory_pool_host; } @@ -193,7 +193,7 @@ namespace Sacado { #if defined( CUDA_VERSION ) && ( 6000 <= CUDA_VERSION ) && defined(KOKKOS_ENABLE_CUDA_UVM) && !defined( __CUDA_ARCH__ ) T* m = 0; if (sz > 0) - CUDA_SAFE_CALL( cudaMallocManaged( (void**) &m, sz*sizeof(T), cudaMemAttachGlobal ) ); + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaMallocManaged( (void**) &m, sz*sizeof(T), cudaMemAttachGlobal ) ); #elif defined(HAVE_SACADO_KOKKOSCORE) && defined(SACADO_KOKKOS_USE_MEMORY_POOL) && !defined(SACADO_DISABLE_CUDA_IN_KOKKOS) && defined(__CUDA_ARCH__) // This code assumes all threads enter ds_alloc, even those with sz == 0 T* m = 0; @@ -235,7 +235,7 @@ namespace Sacado { static void ds_free(T* m, int sz) { #if defined( CUDA_VERSION ) && ( 6000 <= CUDA_VERSION ) && defined(KOKKOS_ENABLE_CUDA_UVM) && !defined( __CUDA_ARCH__ ) if (sz > 0) - CUDA_SAFE_CALL( cudaFree(m) ); + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaFree(m) ); #elif defined(HAVE_SACADO_KOKKOSCORE) && defined(SACADO_KOKKOS_USE_MEMORY_POOL) && !defined(SACADO_DISABLE_CUDA_IN_KOKKOS) && defined(__CUDA_ARCH__) const int total_sz = warpReduce(sz); const int lane = warpLane(); From 189fe360cfb17acd95eed6013f1cdb895fbcd4fd Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Fri, 15 Oct 2021 10:57:58 -0600 Subject: [PATCH 21/98] TrilinosCouplings: Adding 2D anisotropic diffusion --- .../examples/scaling/CMakeLists.txt | 1 + ...ouplings_IntrepidPoissonExampleHelpers.cpp | 16 +++++++ ...ouplings_IntrepidPoissonExampleHelpers.hpp | 5 +++ .../scaling/example_Poisson2D_pn_tpetra.cpp | 44 ++++++++++++++++--- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/packages/trilinoscouplings/examples/scaling/CMakeLists.txt b/packages/trilinoscouplings/examples/scaling/CMakeLists.txt index 0145d4f9df78..d579fca201ad 100644 --- a/packages/trilinoscouplings/examples/scaling/CMakeLists.txt +++ b/packages/trilinoscouplings/examples/scaling/CMakeLists.txt @@ -172,6 +172,7 @@ IF(${PACKAGE_NAME}_ENABLE_Epetra AND ${PACKAGE_NAME}_ENABLE_EpetraExt AND Example_Poisson2D_pn_tpetra SOURCES example_Poisson2D_pn_tpetra.cpp TrilinosCouplings_Pamgen_Utils.cpp + TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp COMM mpi ) diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp index 7cec51bec895..dcab796e5b84 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.cpp @@ -113,6 +113,8 @@ double materialTensorOffDiagonalValue_; Matrix3 rotation_, strength_,diff_total_; +std::vector matrix2D_; + bool useDiffusionMatrix() { return use_diffusion_; } @@ -136,6 +138,20 @@ const std::vector& getDiffusionMatrix() { +const std::vector& getDiffusionMatrix2D() { + // Gets the x/y sub-matrix + if(!use_diffusion_) + throw std::runtime_error("setDiffusionRotationStrength has not been called"); + matrix2D_.resize(4); + matrix2D_[0] = diff_total_(0,0); + matrix2D_[1] = diff_total_(0,1); + matrix2D_[2] = diff_total_(1,0); + matrix2D_[3] = diff_total_(1,1); + + return matrix2D_; +} + + void setDiffusionRotationAndStrength(const std::vector& theta, const std::vector& diagonal) { rotation_ = Z_Rotation(theta[2]*M_PI/180.0) * Y_Rotation(theta[1]*M_PI/180.0) * X_Rotation(theta[0]*M_PI/180.0); diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.hpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.hpp index 35f7e680cab8..5daf4cda0bd5 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.hpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_IntrepidPoissonExampleHelpers.hpp @@ -110,6 +110,11 @@ void setDiffusionRotationAndStrength(const std::vector& diff_rotation_an /// \brief Gets the diffusion Tensor const std::vector & getDiffusionMatrix(); + +/// \brief Gets the 2D diffusion Tensor (for 2D problems) +const std::vector & getDiffusionMatrix2D(); + + /// \brief Use the diffusion tensor rather than the off-diagonal values bool useDiffusionMatrix(); diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp index 3eefdc36f7ca..f25806937d62 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp @@ -87,6 +87,8 @@ // TrilinosCouplings includes #include "TrilinosCouplings_config.h" #include "TrilinosCouplings_Pamgen_Utils.hpp" +#include "TrilinosCouplings_IntrepidPoissonExampleHelpers.hpp" + // Intrepid includes #include "Intrepid_FunctionSpaceTools.hpp" @@ -469,6 +471,25 @@ int main(int argc, char *argv[]) { clp.setOption ("seed", &randomSeed, "Random Seed."); + // Material diffusion strength and rotation (in 3D) + // We'll get the 2D version of this later + std::vector diff_rotation_angle {0.0, 0.0, 0.0}; + std::vector diff_strength {1.0, 1.0, 1.0}; + for(int i=0; i<3; i++) { + char letter[4] = "xyz"; + char str1[80], str2[80]; + // Rotation + sprintf(str1,"rot_%c_angle",letter[i]); + sprintf(str2,"Rotation around %c axis, in degrees",letter[i]); + clp.setOption(str1,&diff_rotation_angle[i],str2); + + // Strength + sprintf(str1,"strength_%c",letter[i]); + sprintf(str2,"Strength of pre-rotation %c-diffusion",letter[i]); + clp.setOption(str1,&diff_strength[i],str2); + } + + switch (clp.parse(argc, argv)) { case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED: return EXIT_SUCCESS; case Teuchos::CommandLineProcessor::PARSE_ERROR: @@ -499,6 +520,15 @@ int main(int argc, char *argv[]) { } + // Diffusion Tensor + ::TrilinosCouplings::IntrepidPoissonExample::setDiffusionRotationAndStrength(diff_rotation_angle, diff_strength); + if(MyPID == 0) { + const std::vector & A = ::TrilinosCouplings::IntrepidPoissonExample::getDiffusionMatrix2D(); + std::cout<<"[ "< diffusion_tensor; + template void materialTensor(Scalar material[][2], const Scalar& x, const Scalar& y) { - - material[0][0] = 1.; - material[0][1] = 0.; + if(diffusion_tensor.size() == 0) + diffusion_tensor = ::TrilinosCouplings::IntrepidPoissonExample::getDiffusionMatrix2D(); + material[0][0] = (Scalar)diffusion_tensor[0]; + material[0][1] = (Scalar)diffusion_tensor[1]; // - material[1][0] = 0.; - material[1][1] = 1.; + material[1][0] = (Scalar)diffusion_tensor[2]; + material[1][1] = (Scalar)diffusion_tensor[3]; } /**********************************************************************************/ From 7b63df4de5b60b9b5461521eb92637242a97b394 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Fri, 15 Oct 2021 12:17:55 -0600 Subject: [PATCH 22/98] Update packages to move Kokkos::Timer out of impl namespace Silences deprecation warnings, compatibility with kokkos/kokkos#4201 Affected packaged: ifpack2, intrepid2, mortel, muelu, shylu_node{basker, fastilu, tacho}, sacado, stokhos, trilinoscouplings Commands used: grep -Rl --exclude-dir=kokkos --exclude-dir=kokkos-kernels "Impl::Timer" * | xargs sed -i 's/Impl::Timer/Timer/g' grep -Rl --exclude-dir=kokkos --exclude-dir=kokkos-kernels "Kokkos_Timer" * | xargs sed -i 's:Kokkos_Timer:Kokkos_Timer:g' --- .../src/Ifpack2_Details_FastILU_Base_def.hpp | 6 +-- .../ifpack2/src/Ifpack2_Details_Fic_def.hpp | 2 +- .../ifpack2/src/Ifpack2_Details_Fildl_def.hpp | 2 +- .../ifpack2/src/Ifpack2_Details_Filu_def.hpp | 2 +- .../ComputeBasis/Cuda/test_hgrad.cpp | 2 +- .../ComputeBasis/OpenMP/test_hgrad.cpp | 2 +- .../ComputeBasis/Serial/test_hgrad.cpp | 2 +- .../perf-test/ComputeBasis/test_hgrad.hpp | 2 +- .../ComputeBasis/test_hgrad_vector.hpp | 2 +- .../perf-test/DynRankView/Cuda/test_01.cpp | 2 +- .../perf-test/DynRankView/OpenMP/test_01.cpp | 2 +- .../perf-test/DynRankView/Serial/test_01.cpp | 2 +- .../perf-test/DynRankView/Serial/test_02.cpp | 2 +- .../perf-test/DynRankView/test_01.hpp | 2 +- .../perf-test/DynRankView/test_02.hpp | 2 +- packages/intrepid2/perf-test/test_util.hpp | 2 +- .../src/mrk_default_kokkos_device_type.hpp | 2 +- .../test/perf_tests_kokkos/KokkosKernels.cpp | 4 +- .../test/performance/advection/advection.cpp | 12 +++--- .../advection/advection_hierarchical.cpp | 6 +-- .../advection/advection_hierarchical_dfad.cpp | 6 +-- .../advection_const_basis/advection.cpp | 12 +++--- .../advection_hierarchical.cpp | 6 +-- .../advection_hierarchical_dfad.cpp | 6 +-- .../fenl_assembly/TestAssembly.hpp | 2 +- .../fenl_assembly/fenl_functors.hpp | 4 +- .../fenl_assembly_view/TestAssembly.hpp | 2 +- .../fenl_assembly_view/fenl_functors.hpp | 4 +- .../test/performance/mat_vec/common.hpp | 2 +- .../mat_vec/fad_kokkos_mat_vec_perf.cpp | 8 ++-- .../test/performance/mat_vec/mat_vec.cpp | 14 +++---- .../mat_vec/mat_vec_hierarchical.cpp | 4 +- .../mat_vec/mat_vec_hierarchical_dfad.cpp | 6 +-- .../shylu_node/basker/src/shylubasker_def.hpp | 2 +- .../basker/src/shylubasker_error_manager.hpp | 2 +- .../basker/src/shylubasker_matrix_def.hpp | 2 +- .../basker/src/shylubasker_nfactor.hpp | 10 ++--- .../basker/src/shylubasker_nfactor_blk.hpp | 4 +- .../src/shylubasker_nfactor_blk_inc.hpp | 4 +- .../basker/src/shylubasker_nfactor_col.hpp | 4 +- .../basker/src/shylubasker_nfactor_col2.hpp | 10 ++--- .../src/shylubasker_nfactor_col_inc.hpp | 2 +- .../basker/src/shylubasker_nfactor_diag.hpp | 2 +- .../basker/src/shylubasker_nfactor_inc.hpp | 8 ++-- .../basker/src/shylubasker_nfactor_kokkos.hpp | 38 +++++++++---------- .../basker/src/shylubasker_order.hpp | 4 +- .../basker/src/shylubasker_order_amd.hpp | 2 +- .../basker/src/shylubasker_order_scotch.hpp | 4 +- .../basker/src/shylubasker_sfactor.hpp | 2 +- .../basker/src/shylubasker_solve_rhs.hpp | 2 +- .../src/shylubasker_solve_rhs_kokkos.hpp | 2 +- .../basker/src/shylubasker_util.hpp | 4 +- .../basker/test/basker_test_inc.cpp | 4 +- .../shylu_node/fastilu/src/shylu_fastic.hpp | 8 ++-- .../shylu_node/fastilu/src/shylu_fastildl.hpp | 8 ++-- .../shylu_node/fastilu/src/shylu_fastilu.hpp | 8 ++-- .../example/Tacho_ExampleCholCuSolver.cpp | 4 +- .../example/Tacho_ExampleCholLevelSet.cpp | 4 +- .../example/Tacho_ExampleCholPardiso.cpp | 4 +- .../example/Tacho_ExampleCholSupernodes.cpp | 4 +- .../example/Tacho_ExampleCholTriSolve.cpp | 4 +- ...ampleCombineDataFileToMatrixMarketFile.cpp | 2 +- .../example/Tacho_ExampleCuSparseTriSolve.cpp | 4 +- .../example/Tacho_ExampleDenseByBlocks.cpp | 4 +- .../Tacho_ExampleDeviceDenseCholesky.hpp | 2 +- .../example/Tacho_ExampleDeviceDenseLDL.hpp | 2 +- .../Tacho_ExampleDeviceDenseSolver.hpp | 2 +- .../Tacho_ExampleExternalInterface.cpp | 2 +- .../Tacho_ExampleExternalInterface.hpp | 4 +- .../tacho/example/Tacho_ExamplePerfTest.cpp | 6 +-- packages/shylu/shylu_node/tacho/src/Tacho.hpp | 2 +- .../shylu_node/tacho/src/Tacho_CuSolver.hpp | 6 +-- .../tacho/src/Tacho_CuSparseTriSolve.hpp | 4 +- .../shylu_node/tacho/src/Tacho_Driver.hpp | 2 +- .../tacho/src/Tacho_MatrixMarket.hpp | 2 +- .../shylu_node/tacho/src/Tacho_Solver.hpp.org | 2 +- .../tacho/src/impl/Tacho_Driver_Impl.hpp | 4 +- .../tacho/src/impl/Tacho_GraphTools_CAMD.hpp | 2 +- .../tacho/src/impl/Tacho_GraphTools_Metis.cpp | 2 +- .../src/impl/Tacho_GraphTools_MetisMT.hpp | 2 +- .../src/impl/Tacho_GraphTools_Scotch.hpp | 2 +- .../tacho/src/impl/Tacho_Internal.hpp | 2 +- .../tacho/src/impl/Tacho_LevelSetTools.hpp | 6 +-- .../tacho/src/impl/Tacho_NumericTools.hpp | 20 +++++----- .../src/impl/Tacho_NumericTools_LevelSet.hpp | 10 ++--- .../src/impl/Tacho_NumericTools_Serial.hpp | 10 ++--- .../tacho/src/impl/Tacho_Solver_Impl.hpp | 8 ++-- .../tacho/src/impl/Tacho_SymbolicTools.cpp | 4 +- .../tacho/src/impl/Tacho_TriSolveTools.hpp | 6 +-- .../shylu_node/tacho/src/impl/Tacho_Util.hpp | 2 +- .../unit-test/Tacho_TestCrsMatrixBase.hpp | 2 +- .../unit-test/Tacho_TestCuda_dcomplex.cpp | 2 +- .../tacho/unit-test/Tacho_TestCuda_double.cpp | 2 +- .../unit-test/Tacho_TestDenseByBlocks.hpp | 2 +- .../Tacho_TestDenseLinearAlgebra.hpp | 2 +- .../unit-test/Tacho_TestDenseMatrixView.hpp | 2 +- .../tacho/unit-test/Tacho_TestGraph.hpp | 2 +- .../tacho/unit-test/Tacho_TestNumeric.hpp | 2 +- .../unit-test/Tacho_TestOpenMP_dcomplex.cpp | 2 +- .../unit-test/Tacho_TestOpenMP_double.cpp | 2 +- .../unit-test/Tacho_TestSerial_dcomplex.cpp | 2 +- .../unit-test/Tacho_TestSerial_double.cpp | 2 +- .../tacho/unit-test/Tacho_TestSymbolic.hpp | 2 +- .../tacho/unit-test/Tacho_TestTaskFunctor.hpp | 2 +- .../FadMPAssembly/TestAssembly.hpp | 4 +- .../FadMPAssembly/fenl_functors.hpp | 4 +- .../KokkosArraySPMVKernels/TestEpetra.cpp | 4 +- .../KokkosArraySPMVKernels/TestStochastic.hpp | 24 ++++++------ .../test/Performance/KokkosSpMM/TestSpMM.hpp | 8 ++-- .../Performance/MPAssembly/TestAssembly.hpp | 4 +- .../Performance/MPAssembly/fenl_functors.hpp | 4 +- .../Performance/MPVectorKernels/TestSpMv.hpp | 6 +-- .../PCEMeanMultiply/TestMeanMultiply.hpp | 12 +++--- .../examples/fenl/CGSolve.hpp | 6 +-- .../examples/fenl/fenl_functors.hpp | 4 +- .../examples/fenl/fenl_impl.hpp | 8 ++-- 116 files changed, 267 insertions(+), 267 deletions(-) diff --git a/packages/ifpack2/src/Ifpack2_Details_FastILU_Base_def.hpp b/packages/ifpack2/src/Ifpack2_Details_FastILU_Base_def.hpp index 802991269cdd..7a12468a8dbd 100644 --- a/packages/ifpack2/src/Ifpack2_Details_FastILU_Base_def.hpp +++ b/packages/ifpack2/src/Ifpack2_Details_FastILU_Base_def.hpp @@ -46,7 +46,7 @@ #define __IFPACK2_FASTILU_BASE_DEF_HPP__ #include -#include +#include #include #include "Teuchos_TimeMonitor.hpp" @@ -164,7 +164,7 @@ initialize() { throw std::runtime_error(std::string("Called ") + getName() + "::initialize() but matrix was null (call setMatrix() with a non-null matrix first)"); } - Kokkos::Impl::Timer copyTimer; + Kokkos::Timer copyTimer; CrsArrayReader::getStructure(mat_.get(), localRowPtrsHost_, localRowPtrs_, localColInds_); crsCopyTime_ = copyTimer.seconds(); initLocalPrec(); //note: initLocalPrec updates initTime @@ -196,7 +196,7 @@ compute() //get copy of values array from matrix - Kokkos::Impl::Timer copyTimer; + Kokkos::Timer copyTimer; CrsArrayReader::getValues(mat_.get(), localValues_, localRowPtrsHost_); crsCopyTime_ += copyTimer.seconds(); //add to the time spent getting rowptrs/colinds computeLocalPrec(); //this updates computeTime_ diff --git a/packages/ifpack2/src/Ifpack2_Details_Fic_def.hpp b/packages/ifpack2/src/Ifpack2_Details_Fic_def.hpp index 578f188b8b52..ea43f0438462 100644 --- a/packages/ifpack2/src/Ifpack2_Details_Fic_def.hpp +++ b/packages/ifpack2/src/Ifpack2_Details_Fic_def.hpp @@ -47,7 +47,7 @@ #include "Ifpack2_Details_Fic_decl.hpp" #include "Ifpack2_Details_CrsArrays.hpp" -#include +#include #include namespace Ifpack2 diff --git a/packages/ifpack2/src/Ifpack2_Details_Fildl_def.hpp b/packages/ifpack2/src/Ifpack2_Details_Fildl_def.hpp index 89428adf81d2..f34c588a3417 100644 --- a/packages/ifpack2/src/Ifpack2_Details_Fildl_def.hpp +++ b/packages/ifpack2/src/Ifpack2_Details_Fildl_def.hpp @@ -47,7 +47,7 @@ #include "Ifpack2_Details_Fildl_decl.hpp" #include "Ifpack2_Details_CrsArrays.hpp" -#include +#include #include namespace Ifpack2 diff --git a/packages/ifpack2/src/Ifpack2_Details_Filu_def.hpp b/packages/ifpack2/src/Ifpack2_Details_Filu_def.hpp index 2576b32a91bd..1c6cb3b4fb2b 100644 --- a/packages/ifpack2/src/Ifpack2_Details_Filu_def.hpp +++ b/packages/ifpack2/src/Ifpack2_Details_Filu_def.hpp @@ -47,7 +47,7 @@ #include "Ifpack2_Details_Filu_decl.hpp" #include "Ifpack2_Details_CrsArrays.hpp" -#include +#include #include namespace Ifpack2 diff --git a/packages/intrepid2/perf-test/ComputeBasis/Cuda/test_hgrad.cpp b/packages/intrepid2/perf-test/ComputeBasis/Cuda/test_hgrad.cpp index d546ecd70650..b95bee32b7ba 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/Cuda/test_hgrad.cpp +++ b/packages/intrepid2/perf-test/ComputeBasis/Cuda/test_hgrad.cpp @@ -48,7 +48,7 @@ #include #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/ComputeBasis/OpenMP/test_hgrad.cpp b/packages/intrepid2/perf-test/ComputeBasis/OpenMP/test_hgrad.cpp index a20f5cbe6290..5c519082b500 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/OpenMP/test_hgrad.cpp +++ b/packages/intrepid2/perf-test/ComputeBasis/OpenMP/test_hgrad.cpp @@ -48,7 +48,7 @@ #include #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/ComputeBasis/Serial/test_hgrad.cpp b/packages/intrepid2/perf-test/ComputeBasis/Serial/test_hgrad.cpp index f8c74d46b5e7..267698c9acd5 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/Serial/test_hgrad.cpp +++ b/packages/intrepid2/perf-test/ComputeBasis/Serial/test_hgrad.cpp @@ -48,7 +48,7 @@ #include #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp index a124196a9234..fbc85c747cef 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp +++ b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp @@ -100,7 +100,7 @@ namespace Intrepid2 { constexpr size_t LLC_CAPACITY = 32*1024*1024; Intrepid2::Test::Flush flush; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_horizontal = 0, t_vertical = 0; int errorFlag = 0; diff --git a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp index 7a657389a828..b2166912709a 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp +++ b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp @@ -105,7 +105,7 @@ namespace Intrepid2 { constexpr size_t LLC_CAPACITY = 32*1024*1024; Intrepid2::Test::Flush flush; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_vectorize = 0; int errorFlag = 0; diff --git a/packages/intrepid2/perf-test/DynRankView/Cuda/test_01.cpp b/packages/intrepid2/perf-test/DynRankView/Cuda/test_01.cpp index 3153701d4989..34906730acc4 100644 --- a/packages/intrepid2/perf-test/DynRankView/Cuda/test_01.cpp +++ b/packages/intrepid2/perf-test/DynRankView/Cuda/test_01.cpp @@ -46,7 +46,7 @@ */ #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/DynRankView/OpenMP/test_01.cpp b/packages/intrepid2/perf-test/DynRankView/OpenMP/test_01.cpp index 6d495563ca66..815eb62d1277 100644 --- a/packages/intrepid2/perf-test/DynRankView/OpenMP/test_01.cpp +++ b/packages/intrepid2/perf-test/DynRankView/OpenMP/test_01.cpp @@ -46,7 +46,7 @@ */ #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/DynRankView/Serial/test_01.cpp b/packages/intrepid2/perf-test/DynRankView/Serial/test_01.cpp index 94d154596a4a..c35c074d04fc 100644 --- a/packages/intrepid2/perf-test/DynRankView/Serial/test_01.cpp +++ b/packages/intrepid2/perf-test/DynRankView/Serial/test_01.cpp @@ -46,7 +46,7 @@ */ #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/DynRankView/Serial/test_02.cpp b/packages/intrepid2/perf-test/DynRankView/Serial/test_02.cpp index 12b887f10810..0e41ada32299 100644 --- a/packages/intrepid2/perf-test/DynRankView/Serial/test_02.cpp +++ b/packages/intrepid2/perf-test/DynRankView/Serial/test_02.cpp @@ -46,7 +46,7 @@ */ #include "Kokkos_Core.hpp" -#include +#include #include "Teuchos_CommandLineProcessor.hpp" diff --git a/packages/intrepid2/perf-test/DynRankView/test_01.hpp b/packages/intrepid2/perf-test/DynRankView/test_01.hpp index b73baf402f99..08f0676c4510 100644 --- a/packages/intrepid2/perf-test/DynRankView/test_01.hpp +++ b/packages/intrepid2/perf-test/DynRankView/test_01.hpp @@ -162,7 +162,7 @@ namespace Intrepid2 { << " Test Array Structure (C,P,D) = " << C << ", " << P << ", " << D << "\n" << "===============================================================================\n"; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_dynrankview[20] = {}, t_view[20] = {}; int errorFlag = 0, itest = 0; diff --git a/packages/intrepid2/perf-test/DynRankView/test_02.hpp b/packages/intrepid2/perf-test/DynRankView/test_02.hpp index ea573bfc109b..d71b6965fbdb 100644 --- a/packages/intrepid2/perf-test/DynRankView/test_02.hpp +++ b/packages/intrepid2/perf-test/DynRankView/test_02.hpp @@ -159,7 +159,7 @@ namespace Intrepid2 { << " Test Array Structure (C,P,D) = " << C << ", " << P << ", " << D << "\n" << "===============================================================================\n"; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_without_subview[20] = {}, t_with_subview[20] = {}; int errorFlag = 0, itest = 0; diff --git a/packages/intrepid2/perf-test/test_util.hpp b/packages/intrepid2/perf-test/test_util.hpp index cbe840de3b58..46b5fa4d1597 100644 --- a/packages/intrepid2/perf-test/test_util.hpp +++ b/packages/intrepid2/perf-test/test_util.hpp @@ -45,7 +45,7 @@ \author Created by Kyungjoo Kim. */ #include "Kokkos_Core.hpp" -#include +#include namespace Intrepid2 { diff --git a/packages/moertel/morkon/src/mrk_default_kokkos_device_type.hpp b/packages/moertel/morkon/src/mrk_default_kokkos_device_type.hpp index 72930d5376fd..3d81918fa556 100644 --- a/packages/moertel/morkon/src/mrk_default_kokkos_device_type.hpp +++ b/packages/moertel/morkon/src/mrk_default_kokkos_device_type.hpp @@ -104,6 +104,6 @@ struct morkon_base_impl { #include #include -#include +#include #endif diff --git a/packages/muelu/test/perf_tests_kokkos/KokkosKernels.cpp b/packages/muelu/test/perf_tests_kokkos/KokkosKernels.cpp index 05b3ec8fc35f..d5adf4e38b7e 100644 --- a/packages/muelu/test/perf_tests_kokkos/KokkosKernels.cpp +++ b/packages/muelu/test/perf_tests_kokkos/KokkosKernels.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include template class LWGraph_kokkos { @@ -285,7 +285,7 @@ int main_(int argc, char **argv) { local_matrix_type A = kernel_construct(n); execution_space().fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; #ifdef KOKKOS_ENABLE_SERIAL if (typeid(device_type) == typeid(Kokkos::Serial)) { diff --git a/packages/sacado/test/performance/advection/advection.cpp b/packages/sacado/test/performance/advection/advection.cpp index 7d9b7c9492d6..28e514a4a1a8 100644 --- a/packages/sacado/test/performance/advection/advection.cpp +++ b/packages/sacado/test/performance/advection/advection.cpp @@ -31,7 +31,7 @@ #include "advection.hpp" #include "common.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template @@ -242,7 +242,7 @@ double time_fad_flat(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux, wgb, src, wbs, residual); Kokkos::fence(); @@ -344,7 +344,7 @@ double time_analytic_const(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux_const, wgb, src, wbs, residual); Kokkos::fence(); @@ -380,7 +380,7 @@ double time_analytic_team(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux_const, wgb, src, wbs, residual); Kokkos::fence(); diff --git a/packages/sacado/test/performance/advection/advection_hierarchical.cpp b/packages/sacado/test/performance/advection/advection_hierarchical.cpp index 680287ebc11f..1ba13d8e1a32 100644 --- a/packages/sacado/test/performance/advection/advection_hierarchical.cpp +++ b/packages/sacado/test/performance/advection/advection_hierarchical.cpp @@ -34,7 +34,7 @@ #include "advection_hierarchical.hpp" #include "common.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template @@ -144,7 +144,7 @@ double time_fad_hierarchical_flat(int ncells, int num_basis, int num_points, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i @@ -160,7 +160,7 @@ double time_dfad_hierarchical_team(int ncells, int num_basis, int num_points, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i @@ -241,7 +241,7 @@ double time_fad_flat(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux, wgb, src, wbs, residual); Kokkos::fence(); @@ -346,7 +346,7 @@ double time_analytic_const(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux_const, wgb, src, wbs, residual); Kokkos::fence(); @@ -383,7 +383,7 @@ double time_analytic_team(int ncells, int num_basis, int num_points, int ndim, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i(flux_const, wgb, src, wbs, residual); Kokkos::fence(); diff --git a/packages/sacado/test/performance/advection_const_basis/advection_hierarchical.cpp b/packages/sacado/test/performance/advection_const_basis/advection_hierarchical.cpp index c22cb121bc6f..b374642e5801 100644 --- a/packages/sacado/test/performance/advection_const_basis/advection_hierarchical.cpp +++ b/packages/sacado/test/performance/advection_const_basis/advection_hierarchical.cpp @@ -34,7 +34,7 @@ #include "advection_hierarchical.hpp" #include "common.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template @@ -145,7 +145,7 @@ double time_fad_hierarchical_flat(int ncells, int num_basis, int num_points, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i @@ -161,7 +161,7 @@ double time_dfad_hierarchical_team(int ncells, int num_basis, int num_points, // Time execution Kokkos::fence(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int i=0; i #include -#include +#include #include #include @@ -161,7 +161,7 @@ class NodeNodeGraph { //-------------------------------- // Guess at capacity required for the map: - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; wall_clock.reset(); phase = FILL_NODE_SET ; diff --git a/packages/sacado/test/performance/fenl_assembly_view/TestAssembly.hpp b/packages/sacado/test/performance/fenl_assembly_view/TestAssembly.hpp index 5f8925c74f6a..06b4bee9ddc6 100644 --- a/packages/sacado/test/performance/fenl_assembly_view/TestAssembly.hpp +++ b/packages/sacado/test/performance/fenl_assembly_view/TestAssembly.hpp @@ -109,7 +109,7 @@ Perf fenl_assembly( //------------------------------------ - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; Perf perf_stats = Perf() ; diff --git a/packages/sacado/test/performance/fenl_assembly_view/fenl_functors.hpp b/packages/sacado/test/performance/fenl_assembly_view/fenl_functors.hpp index c8ab92ec893c..749e22d518bb 100644 --- a/packages/sacado/test/performance/fenl_assembly_view/fenl_functors.hpp +++ b/packages/sacado/test/performance/fenl_assembly_view/fenl_functors.hpp @@ -58,7 +58,7 @@ #include #include -#include +#include #include #include @@ -161,7 +161,7 @@ class NodeNodeGraph { //-------------------------------- // Guess at capacity required for the map: - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; wall_clock.reset(); phase = FILL_NODE_SET ; diff --git a/packages/sacado/test/performance/mat_vec/common.hpp b/packages/sacado/test/performance/mat_vec/common.hpp index 4e157717f8d5..100448f5b473 100644 --- a/packages/sacado/test/performance/mat_vec/common.hpp +++ b/packages/sacado/test/performance/mat_vec/common.hpp @@ -31,7 +31,7 @@ //#define SACADO_DISABLE_FAD_VIEW_SPEC -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" struct Perf { double time; diff --git a/packages/sacado/test/performance/mat_vec/fad_kokkos_mat_vec_perf.cpp b/packages/sacado/test/performance/mat_vec/fad_kokkos_mat_vec_perf.cpp index e5c49429bb37..fd45718a56d4 100644 --- a/packages/sacado/test/performance/mat_vec/fad_kokkos_mat_vec_perf.cpp +++ b/packages/sacado/test/performance/mat_vec/fad_kokkos_mat_vec_perf.cpp @@ -39,7 +39,7 @@ #include "Teuchos_StandardCatchMacros.hpp" #include "Teuchos_Time.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" // For vtune #include @@ -244,7 +244,7 @@ do_time_fad(const size_t m, const size_t n, const size_t p, const size_t nloop, Kokkos::deep_copy(A, a); Kokkos::deep_copy(b, a); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -327,7 +327,7 @@ do_time_fad_hierarchical(const size_t m, const size_t n, const size_t p, Kokkos::deep_copy(A, a); Kokkos::deep_copy(b, a); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; #if defined(SACADO_KOKKOS_USE_MEMORY_POOL) @@ -388,7 +388,7 @@ do_time_val(const size_t m, const size_t n, const size_t nloop, Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up diff --git a/packages/sacado/test/performance/mat_vec/mat_vec.cpp b/packages/sacado/test/performance/mat_vec/mat_vec.cpp index f17740c46ef3..fbeff8d07ec6 100644 --- a/packages/sacado/test/performance/mat_vec/mat_vec.cpp +++ b/packages/sacado/test/performance/mat_vec/mat_vec.cpp @@ -33,7 +33,7 @@ #include "mat_vec.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template void run_mat_vec(const ViewTypeA& A, const ViewTypeB& b, const ViewTypeC& c) { @@ -250,7 +250,7 @@ do_time_val(const size_t m, const size_t n, const size_t nloop, Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -310,7 +310,7 @@ do_time_fad(const size_t m, const size_t n, const size_t p, const size_t nloop, Kokkos::deep_copy(typename ViewTypeA::array_type(A), 1.0); Kokkos::deep_copy(typename ViewTypeB::array_type(b), 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -365,7 +365,7 @@ do_time_scratch(const size_t m, const size_t n, const size_t p, const size_t nlo Kokkos::deep_copy(typename ViewTypeA::array_type(A), 1.0); Kokkos::deep_copy(typename ViewTypeB::array_type(b), 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -411,7 +411,7 @@ do_time_analytic(const size_t m, const size_t n, const size_t p, Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -450,7 +450,7 @@ do_time_analytic_sl(const size_t m, const size_t n, const size_t p, Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up @@ -489,7 +489,7 @@ do_time_analytic_s(const size_t m, const size_t n, Kokkos::deep_copy(A, 1.0); Kokkos::deep_copy(b, 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up diff --git a/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical.cpp b/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical.cpp index 9a6f0783096f..e1c2f6c36922 100644 --- a/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical.cpp +++ b/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical.cpp @@ -34,7 +34,7 @@ #include "mat_vec_hierarchical.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template void run_mat_vec_hierarchical(const ViewTypeA& A, const ViewTypeB& b, @@ -137,7 +137,7 @@ do_time_fad_hierarchical(const size_t m, const size_t n, const size_t p, Kokkos::deep_copy(typename ConViewTypeA::array_type(A), 1.0); Kokkos::deep_copy(typename ConViewTypeB::array_type(b), 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up diff --git a/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical_dfad.cpp b/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical_dfad.cpp index a47fd693f614..9759b5c962ec 100644 --- a/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical_dfad.cpp +++ b/packages/sacado/test/performance/mat_vec/mat_vec_hierarchical_dfad.cpp @@ -34,7 +34,7 @@ #include "mat_vec_hierarchical_dfad.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template void run_mat_vec_hierarchical_dfad(const ViewTypeA& A, const ViewTypeB& b, @@ -159,7 +159,7 @@ do_time_fad_hierarchical_dfad(const size_t m, const size_t n, const size_t p, Kokkos::deep_copy(typename ConViewTypeA::array_type(A), 1.0); Kokkos::deep_copy(typename ConViewTypeB::array_type(b), 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; #if defined (KOKKOS_ENABLE_CUDA) @@ -231,7 +231,7 @@ do_time_fad_hierarchical_dfad_scratch( Kokkos::deep_copy(typename ConViewTypeA::array_type(A), 1.0); Kokkos::deep_copy(typename ConViewTypeB::array_type(b), 1.0); - Kokkos::Impl::Timer wall_clock; + Kokkos::Timer wall_clock; Perf perf; // Execute the kernel once to warm up diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp index b5f973fb1248..3040c44c0873 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp @@ -20,7 +20,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_error_manager.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_error_manager.hpp index 1fd4c26d5f1e..e3ffd0690d04 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_error_manager.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_error_manager.hpp @@ -12,7 +12,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_matrix_def.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_matrix_def.hpp index 145adc9a7162..742c235f5bae 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_matrix_def.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_matrix_def.hpp @@ -7,7 +7,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor.hpp index db0f590da4fd..986eaabb0533 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor.hpp @@ -18,7 +18,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif @@ -74,7 +74,7 @@ namespace BaskerNS gm = A.nrow; BASKER_MATRIX ATEMP; - //Kokkos::Impl::Timer tza; + //Kokkos::Timer tza; int info = BASKER_SUCCESS; if(Options.btf == BASKER_TRUE) { @@ -87,7 +87,7 @@ namespace BaskerNS //printf("Switch time: %f \n", tza.seconds()); #ifdef BASKER_KOKKOS - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; typedef Kokkos::TeamPolicy TeamPolicy; // --------------------------------------------------------------- // @@ -185,7 +185,7 @@ namespace BaskerNS for(Int l=1; l <= tree.nlvls; l++) { #ifdef BASKER_TIMER - Kokkos::Impl::Timer timer_inner_sep; + Kokkos::Timer timer_inner_sep; #endif //#ifdef BASKER_OLD_BARRIER //Int lthreads = pow(2,l); @@ -350,7 +350,7 @@ namespace BaskerNS } }//end btf call - Kokkos::Impl::Timer tzback; + Kokkos::Timer tzback; if(Options.btf == BASKER_TRUE) { A = ATEMP; diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk.hpp index 25e28a292310..3c2dafbf0359 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk.hpp @@ -11,7 +11,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif #include "Teuchos_ScalarTraits.hpp" @@ -164,7 +164,7 @@ namespace BaskerNS #endif #ifdef BASKER_TIME - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; #endif Int i, j; diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk_inc.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk_inc.hpp index 6aa2370f4b69..fc843c070aaa 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk_inc.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_blk_inc.hpp @@ -9,7 +9,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif namespace BaskerNS @@ -203,7 +203,7 @@ namespace BaskerNS //for(i = M.col_ptr(k); i < M.col_ptr(k+1); ++i) //Debug of dim - //Kokkos::Impl::Timer timer; + //Kokkos::Timer timer; if(Options.same_pattern == BASKER_FALSE) { for(Int i = M.col_ptr(k+1)-1; i >= M.col_ptr(k); --i) diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col.hpp index 961fc57160ad..ea759af07375 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col.hpp @@ -15,7 +15,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif #ifdef BASKER_DEBUG @@ -155,7 +155,7 @@ namespace BaskerNS BASKER_BOOL sep_lvl_flg = BASKER_FALSE; #ifdef BASKER_DEBUG_TIME - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; #endif //-----------Upper Col Factor------------// diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col2.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col2.hpp index 5fa26deb81fb..a39633346ffa 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col2.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col2.hpp @@ -14,7 +14,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif #ifdef BASKER_DEBUG @@ -137,7 +137,7 @@ namespace BaskerNS } #ifdef BASKER_TIMER - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; #endif #ifdef BASKER_DEBUG_NFACTOR_COL2 @@ -261,9 +261,9 @@ namespace BaskerNS double time_extend = 0.0; double time_faccol = 0.0; double time_facoff = 0.0; - Kokkos::Impl::Timer timer_extend; - Kokkos::Impl::Timer timer_faccol; - Kokkos::Impl::Timer timer_facoff; + Kokkos::Timer timer_extend; + Kokkos::Timer timer_faccol; + Kokkos::Timer timer_facoff; #endif for(Int k = 0; k < ncol && info == BASKER_SUCCESS; ++k) { diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col_inc.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col_inc.hpp index 7f04f00f19b2..1c500bed8d3b 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col_inc.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_col_inc.hpp @@ -10,7 +10,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif namespace BaskerNS diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_diag.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_diag.hpp index fdaf60ce5b11..6aa17db19023 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_diag.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_diag.hpp @@ -10,7 +10,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif //#define BASKER_TIMER diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_inc.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_inc.hpp index f5761ab6316d..851b217098f5 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_inc.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_inc.hpp @@ -18,7 +18,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif @@ -55,7 +55,7 @@ namespace BaskerNS //====TIMER== #ifdef BASKER_TIME - //Kokkos::Impl::Timer timer; + //Kokkos::Timer timer; #endif //===TIMER=== @@ -158,7 +158,7 @@ namespace BaskerNS } #ifdef BASKER_KOKKOS - //Kokkos::Impl::Timer timer_inner_sep; + //Kokkos::Timer timer_inner_sep; #ifdef BASKER_NO_LAMBDA kokkos_nfactor_sep2_inc_lvl @@ -240,7 +240,7 @@ namespace BaskerNS { //=====Timer #ifdef BASKER_TIME - //Kokkos::Impl::Timer timer_btf; + //Kokkos::Timer timer_btf; #endif //====Timer diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_kokkos.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_kokkos.hpp index 67c054808e13..a0e7bc32530c 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_kokkos.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_nfactor_kokkos.hpp @@ -10,7 +10,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif //#include @@ -425,7 +425,7 @@ namespace Basker #endif #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_reach; + Kokkos::Timer timer_reach; #endif //Search reach if not yet considered @@ -456,7 +456,7 @@ namespace Basker #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_solve; + Kokkos::Timer timer_solve; #endif back_solve @@ -691,7 +691,7 @@ namespace Basker void operator()(const team_member &thread) const { #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; #endif //Need to wrap around Exe_Space @@ -875,7 +875,7 @@ namespace Basker { #ifdef BASKER_TIME_NFACTOR - Kokkos::Impl::Timer timer_total; + Kokkos::Timer timer_total; #endif Int bcol = U.scol; @@ -944,7 +944,7 @@ namespace Basker #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_reach; + Kokkos::Timer timer_reach; double t_i_reach = 0; #endif @@ -967,7 +967,7 @@ namespace Basker #ifdef BASKER_TIME_NFACTOR - Kokkos::Impl::Timer timer_l_r; + Kokkos::Timer timer_l_r; #endif //if not colored find local reach @@ -1021,7 +1021,7 @@ namespace Basker //printf("kid: %d xnnz: %d \n", kid, xnnz); #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_solve; + Kokkos::Timer timer_solve; #endif //call an atomic backsolve @@ -1037,7 +1037,7 @@ namespace Basker #endif #ifdef BASKER_TIME_NFACTOR - Kokkos::Impl::Timer timer_book; + Kokkos::Timer timer_book; #endif //count nnz will be need in this column @@ -1777,7 +1777,7 @@ namespace Basker #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_reach; + Kokkos::Timer timer_reach; #endif for(i = A.col_ptr(k); i < A.col_ptr(k+1); i++) @@ -1823,7 +1823,7 @@ namespace Basker #endif #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_solve; + Kokkos::Timer timer_solve; #endif /* @@ -2114,7 +2114,7 @@ namespace Basker void operator()(const team_member &thread) const { #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_sep; + Kokkos::Timer timer_sep; #endif //#ifdef BASKER_TIME @@ -2190,7 +2190,7 @@ namespace Basker //--------------------TRI SOLVE-----------------------// //check module for all level p #ifdef BASKER_TIME_EXTEND - Kokkos::Impl::Timer timer_tri_solve; + Kokkos::Timer timer_tri_solve; #endif //if((kid%(l+1)) == 0) @@ -2203,7 +2203,7 @@ namespace Basker #endif #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_tri_solve_start; + Kokkos::Timer timer_tri_solve_start; #endif @@ -2263,7 +2263,7 @@ namespace Basker #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_tri_solve_fill; + Kokkos::Timer timer_tri_solve_fill; #endif @@ -2290,7 +2290,7 @@ namespace Basker #endif #ifdef BASKER_TIME_DETAIL - Kokkos::Impl::Timer timer_tri_solve_col; + Kokkos::Timer timer_tri_solve_col; #endif column_tri_solve @@ -2344,7 +2344,7 @@ namespace Basker #endif #ifdef BASKER_TIME_EXTEND - Kokkos::Impl::Timer timer_reduce; + Kokkos::Timer timer_reduce; #endif //-----------------REDUCE---------------------/// @@ -2452,7 +2452,7 @@ namespace Basker #endif #ifdef BASKER_TIME_EXTEND - Kokkos::Impl::Timer timer_factor; + Kokkos::Timer timer_factor; #endif ///-------------Col Factor--------------------// @@ -2582,7 +2582,7 @@ namespace Basker #ifdef BASKER_TIME_EXTEND - Kokkos::Impl::Timer timer_rollback; + Kokkos::Timer timer_rollback; #endif if(roll_back) diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_order.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_order.hpp index 94b8f2326589..76351a4b7b67 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_order.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_order.hpp @@ -1,7 +1,7 @@ #ifndef SHYLUBASKER_ORDER_HPP #define SHYLUBASKER_ORDER_HPP -#include +#include //Basker Includes #include "shylubasker_types.hpp" @@ -452,7 +452,7 @@ static int basker_sort_matrix_col(const void *arg1, const void *arg2) void Basker::order_incomplete() { - Kokkos::Impl::Timer timer_one; + Kokkos::Timer timer_one; if(Options.matching == BASKER_TRUE) { diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_order_amd.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_order_amd.hpp index 09b8b35b2c4b..5398ca86ff13 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_order_amd.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_order_amd.hpp @@ -607,7 +607,7 @@ namespace BaskerNS BBT.col_ptr(i+1) = nnz2; } - Kokkos::Impl::Timer timer_metis; + Kokkos::Timer timer_metis; #if 1 // allocate inv-permutation vectors INT_1DARRAY metis_iperm; diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_order_scotch.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_order_scotch.hpp index 06fad98289ba..5df4622cc404 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_order_scotch.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_order_scotch.hpp @@ -143,7 +143,7 @@ namespace BaskerNS #else using scotch_integral_type = int32_t; //NDE: make this depend on the scotch type #endif - Kokkos::Impl::Timer timer_scotch; + Kokkos::Timer timer_scotch; Int num_levels = num_domains; Int num_doms = pow(2.0, (double)(num_levels+1)) - 1; @@ -173,7 +173,7 @@ namespace BaskerNS #if !defined(HAVE_SHYLU_NODEBASKER_METIS) BASKER_ASSERT(false, ">> BASKER ASSERT: METIS is not enabled <<"); #else - Kokkos::Impl::Timer timer_metis; + Kokkos::Timer timer_metis; double time_metis = 0.0; //idx_t metis_offset = btf_tabs(btf_tabs_offset-1); diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_sfactor.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_sfactor.hpp index be82342aac9a..3e77c9f9cefd 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_sfactor.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_sfactor.hpp @@ -24,7 +24,7 @@ using namespace std; #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs.hpp index ecb7b909ce3f..88ff1c1cefff 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs.hpp @@ -11,7 +11,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs_kokkos.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs_kokkos.hpp index be4d06b98f0c..7eaba33e8757 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs_kokkos.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_solve_rhs_kokkos.hpp @@ -13,7 +13,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #endif #include diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_util.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_util.hpp index 09aaa7a41056..8968a514b868 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_util.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_util.hpp @@ -10,7 +10,7 @@ /*Kokkos Includes*/ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif @@ -1677,7 +1677,7 @@ namespace BaskerNS { printf( "\n get_L \n\n" ); //Add Check - //Kokkos::Impl::Timer timer; + //Kokkos::Timer timer; n = gn; nnz = get_Lnnz(); (*col_ptr) = new Int[gn+1](); diff --git a/packages/shylu/shylu_node/basker/test/basker_test_inc.cpp b/packages/shylu/shylu_node/basker/test/basker_test_inc.cpp index 40dd2d4e804a..af09566dd00a 100644 --- a/packages/shylu/shylu_node/basker/test/basker_test_inc.cpp +++ b/packages/shylu/shylu_node/basker/test/basker_test_inc.cpp @@ -8,7 +8,7 @@ #ifdef BASKER_KOKKOS #include -#include +#include #else #include #endif @@ -209,7 +209,7 @@ int main(int argc, char* argv[]) cout << "--------------Done Setting Threads----------" << endl; mybasker.Symbolic(m,n,nnz,col_ptr,row_idx,vals); cout << "--------------Done SFactor------------------" << endl; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; mybasker.Factor_Inc(0); cout << "--------------Done NFactor-----------------" << endl; cout << "First Factor Time: " << timer.seconds() << endl; diff --git a/packages/shylu/shylu_node/fastilu/src/shylu_fastic.hpp b/packages/shylu/shylu_node/fastilu/src/shylu_fastic.hpp index 6bb2dae53178..fe2b6bc20c85 100644 --- a/packages/shylu/shylu_node/fastilu/src/shylu_fastic.hpp +++ b/packages/shylu/shylu_node/fastilu/src/shylu_fastic.hpp @@ -56,7 +56,7 @@ #include #include -#include +#include #include "shylu_fastilu.hpp" @@ -167,7 +167,7 @@ class FastICPrec void initialize() { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; //Here we have to allocate memory for L, U. if((level > 0) && (guessFlag != 0)) { @@ -755,7 +755,7 @@ class FastICPrec void compute() { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; if((level > 0) && (guessFlag != 0)) { initGuessPrec->compute(); @@ -784,7 +784,7 @@ class FastICPrec void apply(ScalarArray &x, ScalarArray &y) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; ParCopyFunctor parCopyFunctor(nRows, xTemp, x); ExecSpace().fence(); Kokkos::parallel_for(nRows, parCopyFunctor); diff --git a/packages/shylu/shylu_node/fastilu/src/shylu_fastildl.hpp b/packages/shylu/shylu_node/fastilu/src/shylu_fastildl.hpp index c3a6f2ea72c9..844d6efa9191 100644 --- a/packages/shylu/shylu_node/fastilu/src/shylu_fastildl.hpp +++ b/packages/shylu/shylu_node/fastilu/src/shylu_fastildl.hpp @@ -55,7 +55,7 @@ #include #include -#include +#include #include "shylu_fastilu.hpp" @@ -169,7 +169,7 @@ class FastILDLPrec void initialize() { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; //Here we have to allocate memory for L, U. if((level > 0) && (guessFlag != 0)) { @@ -737,7 +737,7 @@ class FastILDLPrec { initGuessPrec->compute(); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; numericILU(); FastILDLFunctor icFunctor(nRows, aRowMap, aColIdx, aRowIdx, aVal, lRowMap, lColIdx, lVal, diagElems, omega); @@ -762,7 +762,7 @@ class FastILDLPrec void apply(ScalarArray &x, ScalarArray &y) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; ParCopyFunctor parCopyFunctor(nRows, xTemp, x); ExecSpace().fence(); Kokkos::parallel_for(nRows, parCopyFunctor); diff --git a/packages/shylu/shylu_node/fastilu/src/shylu_fastilu.hpp b/packages/shylu/shylu_node/fastilu/src/shylu_fastilu.hpp index f76e339ea508..7572efd7c2a7 100644 --- a/packages/shylu/shylu_node/fastilu/src/shylu_fastilu.hpp +++ b/packages/shylu/shylu_node/fastilu/src/shylu_fastilu.hpp @@ -56,7 +56,7 @@ #include #include -#include +#include //whether to print extra debug output at runtime to stdout //comment out next line to disable @@ -846,7 +846,7 @@ class FastILUPrec //Symbolic Factorization Phase void initialize() { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; if ((level > 0) && (guessFlag !=0)) { initGuessPrec->initialize(); @@ -902,7 +902,7 @@ class FastILUPrec // void compute() { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; if ((level > 0) && (guessFlag !=0)) { initGuessPrec->compute(); @@ -937,7 +937,7 @@ class FastILUPrec //*not* support multiple right hand sizes. void apply(ScalarArray &x, ScalarArray &y) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; //required to prevent contamination of the input. ParCopyFunctor parCopyFunctor(nRows, xTemp, x); diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholCuSolver.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholCuSolver.cpp index 965ec219fe03..1cdb45c17357 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholCuSolver.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholCuSolver.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -38,7 +38,7 @@ int main (int argc, char *argv[]) { Tacho::printExecSpaceConfiguration("DeviceSpace", detail); Tacho::printExecSpaceConfiguration("HostSpace", detail); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; int r_val = 0; #if defined(KOKKOS_ENABLE_CUDA) { diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholLevelSet.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholLevelSet.cpp index fca902a5d623..33db60f960c7 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholLevelSet.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholLevelSet.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -90,7 +90,7 @@ int main (int argc, char *argv[]) { typedef Tacho::CrsMatrixBase CrsMatrixBaseTypeHost; typedef Kokkos::View DenseMatrixBaseType; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t = 0.0; if (is_root()) std::cout << "CholLevelSet:: import input file = " << file << std::endl; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholPardiso.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholPardiso.cpp index 63d77df00e90..4b6804d3ed01 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholPardiso.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholPardiso.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -47,7 +47,7 @@ int main (int argc, char *argv[]) { mkl_set_dynamic(0); mkl_set_num_threads(nthreads); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t = 0.0; Pardiso pardiso; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholSupernodes.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholSupernodes.cpp index 21254ad47fdb..935db7538cb0 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholSupernodes.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholSupernodes.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -68,7 +68,7 @@ int main (int argc, char *argv[]) { typedef CrsMatrixBase CrsMatrixBaseTypeHost; typedef Kokkos::View DenseMatrixBaseType; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t = 0.0; std::cout << "CholSupernodes:: import input file = " << file << std::endl; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholTriSolve.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholTriSolve.cpp index 82db50333f61..304b25f36f40 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholTriSolve.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCholTriSolve.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -79,7 +79,7 @@ int main (int argc, char *argv[]) { typedef Tacho::CrsMatrixBase CrsMatrixBaseTypeHost; typedef Kokkos::View DenseMatrixBaseType; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t = 0.0; std::cout << "CholTriSolve:: import input file = " << file << std::endl; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCombineDataFileToMatrixMarketFile.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCombineDataFileToMatrixMarketFile.cpp index 45b8d79a9734..05b20ff19186 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCombineDataFileToMatrixMarketFile.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCombineDataFileToMatrixMarketFile.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCuSparseTriSolve.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCuSparseTriSolve.cpp index ab228c5f44cb..801b5f6f093c 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCuSparseTriSolve.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleCuSparseTriSolve.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_Solver.hpp" @@ -57,7 +57,7 @@ int main (int argc, char *argv[]) { typedef Kokkos::TaskSchedulerMultiple scheduler_type; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; int r_val = 0; #if defined(KOKKOS_ENABLE_CUDA) { diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDenseByBlocks.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDenseByBlocks.cpp index 2e3ecf60824e..462f28755536 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDenseByBlocks.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDenseByBlocks.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "Tacho_Internal.hpp" #include "Tacho_CommandLineParser.hpp" @@ -66,7 +66,7 @@ int main (int argc, char *argv[]) { typedef DenseMatrixView DenseMatrixViewHostType; typedef DenseMatrixView DenseMatrixOfBlocksHostType; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; scheduler_type sched; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseCholesky.hpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseCholesky.hpp index c575f0aeedfd..4bb3d92e22ba 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseCholesky.hpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseCholesky.hpp @@ -20,7 +20,7 @@ template int driver_chol (const int m, const bool verbose) { int max_iter = 1; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; const bool detail = false; typedef typename Tacho::UseThisDevice::type device_type; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseLDL.hpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseLDL.hpp index e73f1b3cecdf..0b384c6c8784 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseLDL.hpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseLDL.hpp @@ -28,7 +28,7 @@ template int driver_ldl (const int m, const bool verbose) { int max_iter = 1; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; const bool detail = false; typedef typename Tacho::UseThisDevice::type device_type; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseSolver.hpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseSolver.hpp index 4a13a5097e1b..ba0c12beec73 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseSolver.hpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleDeviceDenseSolver.hpp @@ -25,7 +25,7 @@ int driver (int argc, char *argv[]) { if (r_parse) return 0; // print help return Kokkos::initialize(argc, argv); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; const bool detail = false; typedef typename Tacho::UseThisDevice::type device_type; diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.cpp index 2f4af505f861..6fcb2b9969a5 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.cpp @@ -36,7 +36,7 @@ void testTachoSolver(int nSolvers, const int posDef = 1, const int numRuns = 1) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; const double tol = 1e-10;// tol *= 10; // original tolerance may be too tight /// diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.hpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.hpp index 3a4b5169f9b1..dfceb6269d71 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.hpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExampleExternalInterface.hpp @@ -124,7 +124,7 @@ namespace tacho { value_type_array ax(values, numTerms); #endif - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); if (numGraphRows > 0) { @@ -208,7 +208,7 @@ namespace tacho { value_type_array ax(values, numSolvers*numTerms); #endif - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); /// m_Solver holds symbolic factorization to be shared with array solver diff --git a/packages/shylu/shylu_node/tacho/example/Tacho_ExamplePerfTest.cpp b/packages/shylu/shylu_node/tacho/example/Tacho_ExamplePerfTest.cpp index 266e7b05bde3..0de486a71d6b 100644 --- a/packages/shylu/shylu_node/tacho/example/Tacho_ExamplePerfTest.cpp +++ b/packages/shylu/shylu_node/tacho/example/Tacho_ExamplePerfTest.cpp @@ -146,7 +146,7 @@ int main (int argc, char *argv[]) { #if defined( __INTEL_MKL__ ) flush.run(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_solve = 0, t_solve_niter = 0; typedef Tacho::Pardiso Pardiso; @@ -270,7 +270,7 @@ int main (int argc, char *argv[]) { #if defined( TACHO_HAVE_SUITESPARSE ) flush.run(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_analyze = 0, t_factor = 0, t_solve = 0, t_solve_niter = 0; cholmod_sparse *AA ; @@ -419,7 +419,7 @@ int main (int argc, char *argv[]) { if (test_tacho) { flush.run(); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_solve = 0, t_solve_niter = 0; /// diff --git a/packages/shylu/shylu_node/tacho/src/Tacho.hpp b/packages/shylu/shylu_node/tacho/src/Tacho.hpp index 2b5d3182e051..4dd86d161b5f 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho.hpp +++ b/packages/shylu/shylu_node/tacho/src/Tacho.hpp @@ -4,7 +4,7 @@ #include "Tacho_config.h" #include "Kokkos_Core.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" #include #include diff --git a/packages/shylu/shylu_node/tacho/src/Tacho_CuSolver.hpp b/packages/shylu/shylu_node/tacho/src/Tacho_CuSolver.hpp index 233e031e0bc4..06296e3f21dd 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho_CuSolver.hpp +++ b/packages/shylu/shylu_node/tacho/src/Tacho_CuSolver.hpp @@ -82,7 +82,7 @@ namespace Tacho { printf("cuSolver: Analyze\n"); printf("=================\n"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _m = m; @@ -140,7 +140,7 @@ namespace Tacho { printf("cuSolver: Factorize\n"); printf("===================\n"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); size_t internalDataInBytes, workspaceInBytes; @@ -186,7 +186,7 @@ namespace Tacho { printf("cuSolver: Solve\n"); printf("===============\n"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); /// solve A x = t diff --git a/packages/shylu/shylu_node/tacho/src/Tacho_CuSparseTriSolve.hpp b/packages/shylu/shylu_node/tacho/src/Tacho_CuSparseTriSolve.hpp index bcab0246722c..f5270295c7d3 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho_CuSparseTriSolve.hpp +++ b/packages/shylu/shylu_node/tacho/src/Tacho_CuSparseTriSolve.hpp @@ -112,7 +112,7 @@ namespace Tacho { printf("cuSparse: Analyze\n"); printf("=================\n"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _m = m; @@ -239,7 +239,7 @@ namespace Tacho { printf("cuSolver: Solve\n"); printf("===============\n"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); diff --git a/packages/shylu/shylu_node/tacho/src/Tacho_Driver.hpp b/packages/shylu/shylu_node/tacho/src/Tacho_Driver.hpp index e20a4ba82446..c26f9e188846 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho_Driver.hpp +++ b/packages/shylu/shylu_node/tacho/src/Tacho_Driver.hpp @@ -8,7 +8,7 @@ #include "Tacho.hpp" #include -#include +#include namespace Tacho { diff --git a/packages/shylu/shylu_node/tacho/src/Tacho_MatrixMarket.hpp b/packages/shylu/shylu_node/tacho/src/Tacho_MatrixMarket.hpp index af7122c9e567..ccaf7f329268 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho_MatrixMarket.hpp +++ b/packages/shylu/shylu_node/tacho/src/Tacho_MatrixMarket.hpp @@ -137,7 +137,7 @@ namespace Tacho { typename DeviceType::memory_space >::assignable, "DeviceType is not assignable from HostSpace" ); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); diff --git a/packages/shylu/shylu_node/tacho/src/Tacho_Solver.hpp.org b/packages/shylu/shylu_node/tacho/src/Tacho_Solver.hpp.org index 21db17b797c5..326d70aa7e4f 100644 --- a/packages/shylu/shylu_node/tacho/src/Tacho_Solver.hpp.org +++ b/packages/shylu/shylu_node/tacho/src/Tacho_Solver.hpp.org @@ -8,7 +8,7 @@ #include "Tacho.hpp" #include -#include +#include namespace Tacho { diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp index 18c1d65a90cb..80a5ed91812c 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Driver_Impl.hpp @@ -511,7 +511,7 @@ namespace Tacho { ::factorize_small_host(const value_type_array &ax) { double t_copy(0), t_factor(0); { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); _A = value_type_matrix_host("A", _m, _m); @@ -605,7 +605,7 @@ namespace Tacho { ::solve_small_host(const value_type_matrix &x, const value_type_matrix &b, const value_type_matrix &t) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_copy(0), t_solve(0); { timer.reset(); diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_CAMD.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_CAMD.hpp index 6c6fa3c0bbe3..d0c6359a6e90 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_CAMD.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_CAMD.hpp @@ -118,7 +118,7 @@ namespace Tacho { } void reorder(const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_camd = 0; TACHO_SUITESPARSE(camd_defaults)(_control); diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Metis.cpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Metis.cpp index 9f9d80bec4fe..8fb318281fe6 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Metis.cpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Metis.cpp @@ -53,7 +53,7 @@ namespace Tacho { /// void GraphTools_Metis::reorder(const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_metis = 0; int ierr = 0; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_MetisMT.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_MetisMT.hpp index e16685d8d19c..464995db6011 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_MetisMT.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_MetisMT.hpp @@ -111,7 +111,7 @@ namespace Tacho { /// void reorder(const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_metis = 0; int ierr = 0; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Scotch.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Scotch.hpp index cec56d74cca4..0e1cbe2f2290 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Scotch.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_GraphTools_Scotch.hpp @@ -118,7 +118,7 @@ namespace Tacho { /// void reorder(const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_scotch = 0; _verbose = verbose; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Internal.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Internal.hpp index e2b0474cd379..d426aebdce21 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Internal.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Internal.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_Partition.hpp" diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_LevelSetTools.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_LevelSetTools.hpp index 752affc7780a..702e4d5ebf39 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_LevelSetTools.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_LevelSetTools.hpp @@ -335,7 +335,7 @@ namespace Tacho { stat.n_device_factorize = 0; stat.n_device_solve = 0; stat.n_team_factorize= 0; stat.n_team_solve = 0; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -841,7 +841,7 @@ namespace Tacho { factorizeCholesky(const value_type_array &ax, const ordinal_type verbose = 0) { constexpr bool is_host = std::is_same::value; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); value_type_array work; @@ -1303,7 +1303,7 @@ namespace Tacho { // solve U^{H} (U x) = b const ordinal_type nrhs = x.extent(1); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; stat.n_kernel_launching = 0; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp index d7a58331fa7a..c13c84c231a5 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp @@ -455,7 +455,7 @@ namespace Tacho { return; } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -506,7 +506,7 @@ namespace Tacho { return; } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -571,7 +571,7 @@ namespace Tacho { t.data() == b.data(), std::logic_error, "x, b and t have the same data pointer"); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _info.x = t; @@ -621,7 +621,7 @@ namespace Tacho { return; } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -687,7 +687,7 @@ namespace Tacho { t.data() == b.data(), std::logic_error, "x, b and t have the same data pointer"); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _info.x = t; @@ -738,7 +738,7 @@ namespace Tacho { void factorizeCholesky_Parallel(const value_type_array &ax, const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -857,7 +857,7 @@ namespace Tacho { factorizeCholesky_ParallelPanel(const value_type_array &ax, const ordinal_type panelsize, const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -992,7 +992,7 @@ namespace Tacho { t.data() == b.data(), std::logic_error, "x, b and t have the same data pointer"); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _info.x = t; @@ -1102,7 +1102,7 @@ namespace Tacho { factorizeCholesky_ParallelByBlocks(const value_type_array &ax, const ordinal_type blksize, const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -1230,7 +1230,7 @@ namespace Tacho { const ordinal_type blksize, const ordinal_type panelsize, const ordinal_type verbose = 0) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp index 9730acaf0525..975e0edd9b4a 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_LevelSet.hpp @@ -310,7 +310,7 @@ namespace Tacho { stat_level.n_device_factorize = 0; stat_level.n_device_solve = 0; stat_level.n_team_factorize= 0; stat_level.n_team_solve = 0; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -931,7 +931,7 @@ namespace Tacho { factorizeCholesky(const value_type_array &ax, const ordinal_type verbose) { constexpr bool is_host = std::is_same::value; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); value_type_array work; @@ -1505,7 +1505,7 @@ namespace Tacho { // solve U^{H} (U x) = b const ordinal_type nrhs = x.extent(1); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; stat_level.n_kernel_launching = 0; @@ -1690,7 +1690,7 @@ namespace Tacho { factorizeLDL(const value_type_array &ax, const ordinal_type verbose) { constexpr bool is_host = std::is_same::value; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); value_type_array work; @@ -1840,7 +1840,7 @@ namespace Tacho { // solve L D L^{H} x = b const ordinal_type nrhs = x.extent(1); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; stat_level.n_kernel_launching = 0; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Serial.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Serial.hpp index 7c5cd3c6cd4c..1cc43da13be9 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Serial.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools_Serial.hpp @@ -110,7 +110,7 @@ namespace Tacho { void factorizeCholesky(const value_type_array &ax, const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -155,7 +155,7 @@ namespace Tacho { factorizeCholesky(const value_type_array &ax, const ordinal_type panelsize, const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -204,7 +204,7 @@ namespace Tacho { const value_type_matrix &b, // right hand side const value_type_matrix &t, // temporary workspace (store permuted vectors) const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _info.x = t; @@ -256,7 +256,7 @@ namespace Tacho { "Serial interface works on host device only"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; { timer.reset(); { @@ -322,7 +322,7 @@ namespace Tacho { "x, b and t have the same data pointer"); } - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; _info.x = t; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Solver_Impl.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Solver_Impl.hpp index 88ad61d03262..d6f308b3db4a 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Solver_Impl.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Solver_Impl.hpp @@ -459,7 +459,7 @@ namespace Tacho { printf("======================\n"); } if (_m < _small_problem_thres) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); _A = value_type_matrix_host("A", _m, _m); @@ -565,7 +565,7 @@ namespace Tacho { printf("======================\n"); } if (_m < _small_problem_thres) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); _A = value_type_matrix_host("A", _m, _m); @@ -650,7 +650,7 @@ namespace Tacho { } if (_m < _small_problem_thres) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); Kokkos::deep_copy(x, b); @@ -713,7 +713,7 @@ namespace Tacho { } if (_m < _small_problem_thres) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); Kokkos::deep_copy(x, b); diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_SymbolicTools.cpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_SymbolicTools.cpp index 2d1ef3b819f4..f275e75ce2e5 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_SymbolicTools.cpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_SymbolicTools.cpp @@ -664,7 +664,7 @@ namespace Tacho { void SymbolicTools:: symbolicFactorize(const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_symfact = 0, t_supernode = 0, t_extra = 0, m_used =0, m_peak = 0; auto track_alloc = [&](const double in) { @@ -839,7 +839,7 @@ namespace Tacho { void SymbolicTools:: evaporateSymbolicFactors(const ordinal_type_array &aw, const ordinal_type verbose) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; double t_evaporate = 0, m_used =0, m_peak = 0; auto track_alloc = [&](const double in) { diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_TriSolveTools.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_TriSolveTools.hpp index 2cc5e0bd7a81..5b3157d00b38 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_TriSolveTools.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_TriSolveTools.hpp @@ -255,7 +255,7 @@ namespace Tacho { stat.n_device_problems = 0; stat.n_team_problems = 0; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); @@ -760,7 +760,7 @@ namespace Tacho { stat.n_device_problems = 0; stat.n_team_problems = 0; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; timer.reset(); #if defined(KOKKOS_ENABLE_CUDA) @@ -866,7 +866,7 @@ namespace Tacho { TACHO_TEST_FOR_EXCEPTION(nrhs > _max_nrhs, std::logic_error, "nrhs is bigger than max nrhs"); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; stat.n_kernel_launching = 0; diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Util.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Util.hpp index 500329075934..29fed790df77 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_Util.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_Util.hpp @@ -24,7 +24,7 @@ #include #include "Kokkos_Core.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" #if defined (__INTEL_MKL__) #include "mkl.h" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCrsMatrixBase.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCrsMatrixBase.hpp index bc3a7d3b511a..6aebc10573af 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCrsMatrixBase.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCrsMatrixBase.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_CrsMatrixBase.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_dcomplex.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_dcomplex.cpp index 31386aa794ce..44c6688b9593 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_dcomplex.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_dcomplex.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_dcomplex"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_double.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_double.cpp index 80b6b029800b..75659731f2de 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_double.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestCuda_double.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_double"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseByBlocks.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseByBlocks.hpp index c1c6b9c7ebc4..8c5fe063de9f 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseByBlocks.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseByBlocks.hpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_DenseMatrixView.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseLinearAlgebra.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseLinearAlgebra.hpp index 19eac4d2aca2..73b8670cd621 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseLinearAlgebra.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseLinearAlgebra.hpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_Blas_Team.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseMatrixView.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseMatrixView.hpp index 65af77e30c87..28f1567473b1 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseMatrixView.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestDenseMatrixView.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_DenseMatrixView.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestGraph.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestGraph.hpp index 6cb3600a6dd7..9e05e32bccce 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestGraph.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestGraph.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_CrsMatrixBase.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestNumeric.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestNumeric.hpp index cc3f19750318..0db1fec23ed9 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestNumeric.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestNumeric.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_CrsMatrixBase.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_dcomplex.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_dcomplex.cpp index b4545c107457..fac278da1e33 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_dcomplex.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_dcomplex.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_dcomplex"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_double.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_double.cpp index ddc344eb41c3..2762908c5fef 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_double.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestOpenMP_double.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_double"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_dcomplex.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_dcomplex.cpp index fda170ce198a..a4802f1661e0 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_dcomplex.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_dcomplex.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_dcomplex"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_double.cpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_double.cpp index 07025658a14e..9735bfd956c7 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_double.cpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSerial_double.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include static const std::string MM_TEST_FILE="test_double"; diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSymbolic.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSymbolic.hpp index f9758134353b..2f6952193674 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSymbolic.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestSymbolic.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_CrsMatrixBase.hpp" diff --git a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestTaskFunctor.hpp b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestTaskFunctor.hpp index f1f2d00f90f9..3e751039571a 100644 --- a/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestTaskFunctor.hpp +++ b/packages/shylu/shylu_node/tacho/unit-test/Tacho_TestTaskFunctor.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "Tacho_Util.hpp" #include "Tacho_TaskFunctor_MemoryPool.hpp" diff --git a/packages/stokhos/test/Performance/FadMPAssembly/TestAssembly.hpp b/packages/stokhos/test/Performance/FadMPAssembly/TestAssembly.hpp index 0c8963c858b4..ec907687147d 100644 --- a/packages/stokhos/test/Performance/FadMPAssembly/TestAssembly.hpp +++ b/packages/stokhos/test/Performance/FadMPAssembly/TestAssembly.hpp @@ -52,7 +52,7 @@ // Kokkos libraries' headers: #include #include -#include +#include // Utilities #include @@ -188,7 +188,7 @@ Perf fenl_assembly( //------------------------------------ - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; Perf perf_stats = Perf() ; diff --git a/packages/stokhos/test/Performance/FadMPAssembly/fenl_functors.hpp b/packages/stokhos/test/Performance/FadMPAssembly/fenl_functors.hpp index baf9f80d799f..9f6d6c232877 100644 --- a/packages/stokhos/test/Performance/FadMPAssembly/fenl_functors.hpp +++ b/packages/stokhos/test/Performance/FadMPAssembly/fenl_functors.hpp @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include @@ -253,7 +253,7 @@ class NodeNodeGraph { //-------------------------------- // Guess at capacity required for the map: - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; wall_clock.reset(); phase = FILL_NODE_SET ; diff --git a/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestEpetra.cpp b/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestEpetra.cpp index e5f3e934d627..2fa9e2aaab17 100644 --- a/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestEpetra.cpp +++ b/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestEpetra.cpp @@ -49,7 +49,7 @@ #include "Stokhos_Sparse3TensorUtilities.hpp" #include "EpetraExt_BlockUtility.h" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" #ifdef HAVE_MPI #include "Epetra_MpiComm.h" @@ -173,7 +173,7 @@ run_test(const int p, const int d, const int nGrid, const int nIter, sg_y->init(0.0); // Apply operator - Kokkos::Impl::Timer clock; + Kokkos::Timer clock; for (int iter=0; iterApply( *(sg_x->getBlockVector()), *(sg_y->getBlockVector()) ); diff --git a/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestStochastic.hpp b/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestStochastic.hpp index f37cb5e948ba..b9cd8824ed91 100644 --- a/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestStochastic.hpp +++ b/packages/stokhos/test/Performance/KokkosArraySPMVKernels/TestStochastic.hpp @@ -43,7 +43,7 @@ #include #include "Kokkos_Core.hpp" -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" #include "Stokhos_Update.hpp" #include "Stokhos_CrsMatrix.hpp" @@ -221,7 +221,7 @@ test_product_tensor_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Kokkos::deep_copy( x, x0 ); // akin to import Stokhos::multiply( matrix , x , y ); @@ -322,7 +322,7 @@ test_product_tensor_diagonal_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -481,7 +481,7 @@ test_product_flat_commuted_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -636,7 +636,7 @@ test_product_flat_original_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -739,7 +739,7 @@ test_tiled_product_tensor_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -849,7 +849,7 @@ test_simple_tiled_product_tensor_matrix( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -954,7 +954,7 @@ test_lexo_block_tensor( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -1062,7 +1062,7 @@ test_linear_tensor( //------------------------------ Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for ( int iter = 0 ; iter < iterCount ; ++iter ) { Stokhos::multiply( matrix , x , y ); } @@ -1163,7 +1163,7 @@ test_original_matrix_free_vec( Device().fence(); SparseMatOps smo; - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; int n_apply = 0; int n_add = 0; for ( int iter = 0 ; iter < iterCount ; ++iter ) { @@ -1301,7 +1301,7 @@ test_original_matrix_free_view( Device().fence(); SparseMatOps smo; - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; int n_apply = 0; int n_add = 0; for ( int iter = 0 ; iter < iterCount ; ++iter ) { @@ -1451,7 +1451,7 @@ test_original_matrix_free_kokkos( } Device().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; int n_apply = 0; int n_add = 0; for ( int iter = 0 ; iter < iterCount ; ++iter ) { diff --git a/packages/stokhos/test/Performance/KokkosSpMM/TestSpMM.hpp b/packages/stokhos/test/Performance/KokkosSpMM/TestSpMM.hpp index 113969fa490c..764b2299de29 100644 --- a/packages/stokhos/test/Performance/KokkosSpMM/TestSpMM.hpp +++ b/packages/stokhos/test/Performance/KokkosSpMM/TestSpMM.hpp @@ -46,7 +46,7 @@ // Utilities -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template< typename IntType > inline @@ -161,7 +161,7 @@ test_spmm(const OrdinalType ensemble_length, } execution_space().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for (ordinal_type iter = 0; iter < iterCount; ++iter) { for (ordinal_type e=0; e #include -#include +#include // Utilities #include @@ -204,7 +204,7 @@ Perf fenl_assembly( //------------------------------------ - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; Perf perf_stats = Perf() ; diff --git a/packages/stokhos/test/Performance/MPAssembly/fenl_functors.hpp b/packages/stokhos/test/Performance/MPAssembly/fenl_functors.hpp index 250f4a52f344..8771314d2e0f 100644 --- a/packages/stokhos/test/Performance/MPAssembly/fenl_functors.hpp +++ b/packages/stokhos/test/Performance/MPAssembly/fenl_functors.hpp @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include @@ -249,7 +249,7 @@ class NodeNodeGraph { //-------------------------------- // Guess at capacity required for the map: - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; wall_clock.reset(); phase = FILL_NODE_SET ; diff --git a/packages/stokhos/test/Performance/MPVectorKernels/TestSpMv.hpp b/packages/stokhos/test/Performance/MPVectorKernels/TestSpMv.hpp index d1a72cb47132..868975b6395d 100644 --- a/packages/stokhos/test/Performance/MPVectorKernels/TestSpMv.hpp +++ b/packages/stokhos/test/Performance/MPVectorKernels/TestSpMv.hpp @@ -52,7 +52,7 @@ #include "Sacado_mpl_integral_c.hpp" // Utilities -#include "impl/Kokkos_Timer.hpp" +#include "Kokkos_Timer.hpp" template< typename IntType > inline @@ -164,7 +164,7 @@ test_mpvector_spmv(const int ensemble_length, Stokhos::multiply( matrix, x, y, tag ); execution_space().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for (int iter = 0; iter < iterCount; ++iter) { Stokhos::multiply( matrix, x, y, tag ); } @@ -242,7 +242,7 @@ test_scalar_spmv(const int ensemble_length, } execution_space().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for (int iter = 0; iter < iterCount; ++iter) { for (int e=0; e inline @@ -238,7 +238,7 @@ test_mean_multiply(const OrdinalType order, } execution_space().fence(); - Kokkos::Impl::Timer clock ; + Kokkos::Timer clock ; for (ordinal_type iter = 0; iter < iterCount; ++iter) { for (ordinal_type col=0; col #include #include -#include +#include #include #include @@ -119,7 +119,7 @@ result_struct cg_solve( Kokkos::Details::ArithTraits::epsilon(), int print = 0) { - Kokkos::Impl::Timer total_timer; + Kokkos::Timer total_timer; typedef typename CrsMatrix::scalar_type ScalarType; typedef Kokkos::Details::ArithTraits KAT; @@ -147,7 +147,7 @@ result_struct cg_solve( double addtime = 0; double matvectime = 0; - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; p->update(1.0,*x,0.0,*x,0.0); addtime += timer.seconds(); timer.reset(); diff --git a/packages/trilinoscouplings/examples/fenl/fenl_functors.hpp b/packages/trilinoscouplings/examples/fenl/fenl_functors.hpp index 4fa3fa16e1bd..d96293e2faa0 100644 --- a/packages/trilinoscouplings/examples/fenl/fenl_functors.hpp +++ b/packages/trilinoscouplings/examples/fenl/fenl_functors.hpp @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include @@ -134,7 +134,7 @@ class NodeNodeGraph { //-------------------------------- // Guess at capacity required for the map: - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; wall_clock.reset(); diff --git a/packages/trilinoscouplings/examples/fenl/fenl_impl.hpp b/packages/trilinoscouplings/examples/fenl/fenl_impl.hpp index 6a694513f67e..07de6070b1cb 100644 --- a/packages/trilinoscouplings/examples/fenl/fenl_impl.hpp +++ b/packages/trilinoscouplings/examples/fenl/fenl_impl.hpp @@ -51,7 +51,7 @@ #include #include #include -#include +#include #include #include @@ -356,8 +356,8 @@ class Problem { typedef DirichletComputation< FixtureType , LocalMatrixType > DirichletComputationType ; typedef ResponseComputation< FixtureType , LocalVectorType > ResponseComputationType ; - Kokkos::Impl::Timer wall_clock ; - Kokkos::Impl::Timer newton_clock ; + Kokkos::Timer wall_clock ; + Kokkos::Timer newton_clock ; newton_clock.reset(); LocalMatrixType jacobian = g_jacobian.getLocalMatrixDevice(); @@ -753,7 +753,7 @@ Perf fenl( //------------------------------------ - Kokkos::Impl::Timer wall_clock ; + Kokkos::Timer wall_clock ; Perf perf_stats = Perf() ; From 0d9ab221cb0bcc6dc14ca8526f86d9dadcc78fda Mon Sep 17 00:00:00 2001 From: "K. Devine" Date: Fri, 15 Oct 2021 14:38:31 -0600 Subject: [PATCH 23/98] tpetra: fixed shadow warnings, including one true bug where loop index was re-used as a loop index in a nested loop --- .../test/ImportExport2/ImportExport2_UnitTests.cpp | 1 - .../tpetra/core/test/RowMatrixTransposer/sorted.cpp | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 95ec17d71174..46d026504efa 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -497,7 +497,6 @@ namespace { // constructor. The returned matrix should also be diagonal and // should equal tgt_mat. Teuchos::ParameterList dummy; - typedef CrsMatrix crs_type; RCP A_tgt2 = Tpetra::importAndFillCompleteCrsMatrix (src_mat, importer, Teuchos::null, diff --git a/packages/tpetra/core/test/RowMatrixTransposer/sorted.cpp b/packages/tpetra/core/test/RowMatrixTransposer/sorted.cpp index 2ad0a00b2555..38f380131bc8 100644 --- a/packages/tpetra/core/test/RowMatrixTransposer/sorted.cpp +++ b/packages/tpetra/core/test/RowMatrixTransposer/sorted.cpp @@ -247,12 +247,12 @@ testTranspose (bool& success, valsBuf.begin ()); bool good = true; - for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { - if (lclColIndsBuf[lclRow] != lclRow) { + for (LO lclInd = 0; lclInd < lclNumRows; ++lclInd) { + if (lclColIndsBuf[lclInd] != lclInd) { good = false; break; } - else if (valsBuf[lclRow] != 1.0) { + else if (valsBuf[lclInd] != 1.0) { good = false; break; } @@ -308,12 +308,12 @@ testTranspose (bool& success, if (success) { bool good = true; - for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { - if (lclColInds[lclRow] != lclRow) { + for (LO lclInd = 0; lclInd < lclNumRows; ++lclInd) { + if (lclColInds[lclInd] != lclInd) { good = false; break; } - else if (vals[lclRow] != 1.0) { + else if (vals[lclInd] != 1.0) { good = false; break; } From d7b6eacc33d51d0c5a19f8a9927509a7632ebb2b Mon Sep 17 00:00:00 2001 From: Vinh Dang Date: Fri, 15 Oct 2021 23:12:29 -0700 Subject: [PATCH 24/98] Set Cuda host pinned memory as default --- packages/adelus/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adelus/CMakeLists.txt b/packages/adelus/CMakeLists.txt index 1c1de927e4eb..5b48737ea4df 100644 --- a/packages/adelus/CMakeLists.txt +++ b/packages/adelus/CMakeLists.txt @@ -55,7 +55,7 @@ TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_TIMING TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_CUDAHOSTPINNED CUDA_HOST_PINNED_MPI "Use Cuda Host Pinned memory for MPI." - OFF ) + ON ) TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_USEDEEPCOPY USE_DEEPCOPY From b9a2b4de588e727e8dcbc2bc149a6d7ff0171b10 Mon Sep 17 00:00:00 2001 From: Vinh Dang Date: Sun, 17 Oct 2021 15:28:29 -0700 Subject: [PATCH 25/98] Enable using Cuda host pinned mem --- packages/adelus/src/Adelus_perm1.hpp | 34 +++++++++++++-- packages/adelus/src/Adelus_solve.hpp | 62 ++++++++++++++-------------- 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/packages/adelus/src/Adelus_perm1.hpp b/packages/adelus/src/Adelus_perm1.hpp index 53e8eda5b868..bf51426c688a 100644 --- a/packages/adelus/src/Adelus_perm1.hpp +++ b/packages/adelus/src/Adelus_perm1.hpp @@ -300,6 +300,9 @@ namespace Adelus { int ptr1_idx, myfirstrow; #ifdef GET_TIMING + #if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + double t1, copyhostpinnedtime; + #endif double t2; double totalpermtime; #endif @@ -316,10 +319,18 @@ namespace Adelus { #endif typedef typename ZDView::device_type::memory_space memory_space; typedef Kokkos::View ViewMatrixType; - + + #if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + typedef Kokkos::View View2DHostPinnType;//CudaHostPinnedSpace + #endif + if (my_rhs_ > 0) { - ViewMatrixType rhs_temp ( "rhs_temp", nrows_matrix, my_rhs_ );//allocate full-size RHS vectors + ViewMatrixType rhs_temp ( "rhs_temp", nrows_matrix, my_rhs_ );//allocate full-size RHS vectors + #if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + View2DHostPinnType h_rhs_temp( "h_rhs_temp", nrows_matrix, my_rhs_ ); + #endif + Kokkos::deep_copy(rhs_temp, 0);//initialize with 0s ncols_proc1 = ncols_matrix/nprocs_row; @@ -357,18 +368,35 @@ namespace Adelus { ptr1_idx++; } + #if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + #ifdef GET_TIMING + t1 = MPI_Wtime(); + #endif + Kokkos::deep_copy(h_rhs_temp,rhs_temp); + #ifdef GET_TIMING + copyhostpinnedtime = (MPI_Wtime()-t1); + #endif + MPI_Allreduce( MPI_IN_PLACE, h_rhs_temp.data(), nrows_matrix*my_rhs_, ADELUS_MPI_DATA_TYPE, MPI_SUM, col_comm); + + Kokkos::deep_copy( subview(ZV, Kokkos::ALL(), Kokkos::make_pair(0, my_rhs_)), + subview(h_rhs_temp, Kokkos::make_pair(myfirstrow-1, myfirstrow-1+my_rows), Kokkos::ALL()) ); + #else //CUDA-aware MPI MPI_Allreduce( MPI_IN_PLACE, rhs_temp.data(), nrows_matrix*my_rhs_, ADELUS_MPI_DATA_TYPE, MPI_SUM, col_comm); Kokkos::deep_copy( subview(ZV, Kokkos::ALL(), Kokkos::make_pair(0, my_rhs_)), subview(rhs_temp, Kokkos::make_pair(myfirstrow-1, myfirstrow-1+my_rows), Kokkos::ALL()) ); - + #endif } #ifdef GET_TIMING totalpermtime = MPI_Wtime() - t2; #endif + #ifdef GET_TIMING + #if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + showtime("Time to copy dev mem --> host pinned mem",©hostpinnedtime); + #endif showtime("Total time in perm",&totalpermtime); #endif } diff --git a/packages/adelus/src/Adelus_solve.hpp b/packages/adelus/src/Adelus_solve.hpp index d04c3a2c72f7..4e7620da206d 100644 --- a/packages/adelus/src/Adelus_solve.hpp +++ b/packages/adelus/src/Adelus_solve.hpp @@ -149,9 +149,9 @@ void back_solve6(ZDView& ZV) double t1,t2; double allocviewtime,eliminaterhstime,bcastrowtime,updrhstime,xchgrhstime; double totalsolvetime; -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -// double copyhostpinnedtime; -//#endif +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + double copyhostpinnedtime; +#endif #endif MPI_Request msgrequest; @@ -181,9 +181,9 @@ void back_solve6(ZDView& ZV) #ifdef GET_TIMING allocviewtime=eliminaterhstime=bcastrowtime=updrhstime=xchgrhstime=0.0; -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -// copyhostpinnedtime=0.0; -//#endif +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + copyhostpinnedtime=0.0; +#endif t1 = MPI_Wtime(); #endif @@ -251,15 +251,15 @@ void back_solve6(ZDView& ZV) #endif } -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -//#ifdef GET_TIMING -// t1 = MPI_Wtime(); -//#endif -// Kokkos::deep_copy(h_row1,row1); -//#ifdef GET_TIMING -// copyhostpinnedtime += (MPI_Wtime()-t1); -//#endif -//#endif +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) +#ifdef GET_TIMING + t1 = MPI_Wtime(); +#endif + Kokkos::deep_copy(h_row1,row1); +#ifdef GET_TIMING + copyhostpinnedtime += (MPI_Wtime()-t1); +#endif +#endif #ifdef GET_TIMING t1 = MPI_Wtime(); @@ -268,11 +268,11 @@ void back_solve6(ZDView& ZV) type[0] = SOCOLTYPE+j; //MPI_Bcast((char *) row1, bytes[0], MPI_CHAR, mesh_row(root), col_comm); -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -// MPI_Bcast(reinterpret_cast(h_row1.data()), bytes[0], MPI_CHAR, mesh_row(root), col_comm); -//#else //CUDA-aware MPI -- Note: Looks like MPI_Bcast is still working well with device (cuda) pointers (and faster than using cuda host pinned memory) +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + MPI_Bcast(reinterpret_cast(h_row1.data()), bytes[0], MPI_CHAR, mesh_row(root), col_comm); +#else //CUDA-aware MPI MPI_Bcast(reinterpret_cast(row1.data()), bytes[0], MPI_CHAR, mesh_row(root), col_comm); -//#endif +#endif // added this barrier for CPLANT operation MPI_Barrier(col_comm); @@ -280,15 +280,15 @@ void back_solve6(ZDView& ZV) bcastrowtime += (MPI_Wtime()-t1); #endif -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -//#ifdef GET_TIMING -// t1 = MPI_Wtime(); -//#endif -// Kokkos::deep_copy(row1,h_row1); -//#ifdef GET_TIMING -// copyhostpinnedtime += (MPI_Wtime()-t1); -//#endif -//#endif +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) +#ifdef GET_TIMING + t1 = MPI_Wtime(); +#endif + Kokkos::deep_copy(row1,h_row1); +#ifdef GET_TIMING + copyhostpinnedtime += (MPI_Wtime()-t1); +#endif +#endif #ifdef GET_TIMING t1 = MPI_Wtime(); @@ -376,9 +376,9 @@ void back_solve6(ZDView& ZV) showtime("Time to eliminate rhs",&eliminaterhstime); showtime("Time to bcast temp row",&bcastrowtime); showtime("Time to update rhs",&updrhstime); -//#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) -// showtime("Time to copy host pinned mem <--> dev mem",©hostpinnedtime); -//#endif +#if defined(CUDA_HOST_PINNED_MPI) && defined(KOKKOS_ENABLE_CUDA) + showtime("Time to copy host pinned mem <--> dev mem",©hostpinnedtime); +#endif showtime("Time to xchg rhs",&xchgrhstime); showtime("Total time in solve",&totalsolvetime); #endif From 67fe3bf5430602b2d2d1807932ba3f3566210be7 Mon Sep 17 00:00:00 2001 From: Vinh Dang Date: Sun, 17 Oct 2021 21:27:35 -0700 Subject: [PATCH 26/98] Check requested number of GPUs against available number of GPUs --- packages/adelus/test/vector_random/cxx_main.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/adelus/test/vector_random/cxx_main.cpp b/packages/adelus/test/vector_random/cxx_main.cpp index b51a0c326b66..5c7772a64465 100644 --- a/packages/adelus/test/vector_random/cxx_main.cpp +++ b/packages/adelus/test/vector_random/cxx_main.cpp @@ -210,6 +210,16 @@ int main(int argc, char *argv[]) #ifdef KOKKOS_ENABLE_CUDA int gpu_count; cudaGetDeviceCount ( &gpu_count ); + if (nptile > gpu_count) { + if( rank == 0 ) { + std::cout << "Request more GPUs than the number of GPUs available " + << "to MPI processes (requested: " << nptile + << " vs. available: " << gpu_count + << "). Exit without test." << std::endl; + } + return 0; + } + Kokkos::InitArguments args; args.num_threads = 0; args.num_numa = 0; From fd27eb3418b60fc65ab91dabb1317cd600971a8a Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Mon, 18 Oct 2021 20:57:19 -0600 Subject: [PATCH 27/98] MueLu: Adding signed SA style dropping option --- .../MueLu_CoalesceDropFactory_def.hpp | 58 ++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp index c4b903035125..9af45faff43f 100644 --- a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp +++ b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp @@ -132,7 +132,8 @@ namespace MueLu { { typedef Teuchos::StringToIntegralParameterEntryValidator validatorType; - validParamList->getEntry("aggregation: drop scheme").setValidator(rcp(new validatorType(Teuchos::tuple("classical", "distance laplacian","signed classical","block diagonal","block diagonal classical","block diagonal distance laplacian","block diagonal signed classical","block diagonal colored signed classical"), "aggregation: drop scheme"))); + // "signed classical" is the Ruge-Stuben style (relative to max off-diagonal), "sign classical sa" is the signed version of the sa criterion (relative to the diagonal values) + validParamList->getEntry("aggregation: drop scheme").setValidator(rcp(new validatorType(Teuchos::tuple("signed classical sa","classical", "distance laplacian","signed classical","block diagonal","block diagonal classical","block diagonal distance laplacian","block diagonal signed classical","block diagonal colored signed classical"), "aggregation: drop scheme"))); } SET_VALID_ENTRY("aggregation: distance laplacian algo"); @@ -174,7 +175,7 @@ namespace MueLu { void CoalesceDropFactory::Build(Level ¤tLevel) const { FactoryMonitor m(*this, "Build", currentLevel); - + typedef Teuchos::ScalarTraits STS; typedef typename STS::magnitudeType real_type; typedef Xpetra::MultiVector RealValuedMultiVector; @@ -196,7 +197,8 @@ namespace MueLu { bool use_block_algorithm=false; LO interleaved_blocksize = as(pL.get("aggregation: block diagonal: interleaved blocksize")); - bool useSignedClassical = false; + bool useSignedClassicalRS = false; + bool useSignedClassicalSA = false; bool generateColoringGraph = false; // NOTE: If we're doing blockDiagonal, we'll not want to do rowSum twice (we'll do it @@ -210,8 +212,13 @@ namespace MueLu { Coords = Get< RCP >(currentLevel, "Coordinates"); A = realA; } + else if(algo == "signed classical sa") { + useSignedClassicalSA = true; + algo = "classical"; + A = realA; + } else if(algo == "signed classical" || algo == "block diagonal colored signed classical" || algo == "block diagonal signed classical") { - useSignedClassical = true; + useSignedClassicalRS = true; // if(realA->GetFixedBlockSize() > 1) { RCP BlockNumber = Get >(currentLevel, "BlockNumber"); // Ghost the column block numbers if we need to @@ -378,12 +385,14 @@ namespace MueLu { const typename STS::magnitudeType dirichletThreshold = STS::magnitude(as(pL.get("aggregation: Dirichlet threshold"))); - // NOTE: We don't support signed classical with cut drop at present - TEUCHOS_TEST_FOR_EXCEPTION(useSignedClassical && classicalAlgo != defaultAlgo, Exceptions::RuntimeError, "\"aggregation: classical algo\" != default is not supported for scalled classical aggregation"); - + // NOTE: We don't support signed classical RS or SA with cut drop at present + TEUCHOS_TEST_FOR_EXCEPTION(useSignedClassicalRS && classicalAlgo != defaultAlgo, Exceptions::RuntimeError, "\"aggregation: classical algo\" != default is not supported for scalled classical aggregation"); + TEUCHOS_TEST_FOR_EXCEPTION(useSignedClassicalSA && classicalAlgo != defaultAlgo, Exceptions::RuntimeError, "\"aggregation: classical algo\" != default is not supported for scalled classical sa aggregation"); GO numDropped = 0, numTotal = 0; std::string graphType = "unamalgamated"; //for description purposes only + + /************************** RS or SA-style Classical Dropping (and variants) **************************/ if (algo == "classical") { if (predrop_ == null) { // ap: this is a hack: had to declare predrop_ as mutable @@ -404,7 +413,7 @@ namespace MueLu { // At this points we either have // (predrop_ != null) // Therefore, it is sufficient to check only threshold - if (A->GetFixedBlockSize() == 1 && threshold == STS::zero() && !useSignedClassical && A->hasCrsGraph()) { + if (A->GetFixedBlockSize() == 1 && threshold == STS::zero() && !useSignedClassicalRS && !useSignedClassicalSA && A->hasCrsGraph()) { // Case 1: scalar problem, no dropping => just use matrix graph RCP graph = rcp(new Graph(A->getCrsGraph(), "graph of A")); // Detect and record rows that correspond to Dirichlet boundary conditions @@ -431,7 +440,8 @@ namespace MueLu { } else if ( (A->GetFixedBlockSize() == 1 && threshold != STS::zero()) || (A->GetFixedBlockSize() == 1 && threshold == STS::zero() && !A->hasCrsGraph()) || - (A->GetFixedBlockSize() == 1 && useSignedClassical) ) { + (A->GetFixedBlockSize() == 1 && useSignedClassicalRS) || + (A->GetFixedBlockSize() == 1 && useSignedClassicalSA) ) { // Case 2: scalar problem with dropping => record the column indices of undropped entries, but still use original // graph's map information, e.g., whether index is local // OR a matrix without a CrsGraph @@ -444,7 +454,8 @@ namespace MueLu { RCP ghostedDiag; ArrayRCP ghostedDiagVals; ArrayRCP negMaxOffDiagonal; - if(useSignedClassical) { + // RS style needs the max negative off-diagonal, SA style needs the diagonal + if(useSignedClassicalRS) { if(ghostedBlockNumber.is_null()) { negMaxOffDiagonal = MueLu::Utilities::GetMatrixMaxMinusOffDiagonal(*A); if (GetVerbLevel() & Statistics1) @@ -489,12 +500,12 @@ namespace MueLu { //FIXME For now, hardwiring the dropping in here LO rownnz = 0; - if(useSignedClassical) { - // Signed classical + if(useSignedClassicalRS) { + // Signed classical RS style for (LO colID = 0; colID < Teuchos::as(nnz); colID++) { LO col = indices[colID]; MT max_neg_aik = realThreshold * STS::real(negMaxOffDiagonal[row]); - MT neg_aij = - STS::real(vals[colID]); + MT neg_aij = - STS::real(vals[colID]); /* if(row==1326) printf("A(%d,%d) = %6.4e, block = (%d,%d) neg_aij = %6.4e max_neg_aik = %6.4e\n",row,col,vals[colID], g_block_id.is_null() ? -1 : g_block_id[row], g_block_id.is_null() ? -1 : g_block_id[col], @@ -507,6 +518,27 @@ namespace MueLu { } rows[row+1] = realnnz; } + else if(useSignedClassicalSA) { + // Signed classical SA style + for (LO colID = 0; colID < Teuchos::as(nnz); colID++) { + LO col = indices[colID]; + + bool is_nonpositive = STS::real(vals[colID]) <= 0; + MT aiiajj = STS::magnitude(threshold*threshold * ghostedDiagVals[col]*ghostedDiagVals[row]); // eps^2*|a_ii|*|a_jj| + MT aij = is_nonpositive ? STS::magnitude(vals[colID]*vals[colID]) : (-STS::magnitude(vals[colID]*vals[colID])); // + |a_ij|^2, if a_ij < 0, - |a_ij|^2 if a_ij >=0 + + if(row==1326) printf("A(%d,%d) = %6.4e, raw_aij = %6.4e aij = %6.4e aiiajj = %6.4e\n",row,col,vals[colID], + vals[colID],aij, aiiajj); + + + if ((!rowIsDirichlet && aij > aiiajj) || row == col) { + columns[realnnz++] = col; + rownnz++; + } else + numDropped++; + } + rows[row+1] = realnnz; + } else { // Standard abs classical for (LO colID = 0; colID < Teuchos::as(nnz); colID++) { From 13007a8aa2bc4e7795b82c31f6f29076e5e75bb9 Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Mon, 18 Oct 2021 21:09:25 -0600 Subject: [PATCH 28/98] MueLu: Adding signed SA style dropping option --- .../MueLu_CoalesceDropFactory_def.hpp | 4 +- .../test/unit_tests/CoalesceDropFactory.cpp | 44 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp index 9af45faff43f..ded2947f9a3a 100644 --- a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp +++ b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp @@ -164,7 +164,9 @@ namespace MueLu { if (algo == "distance laplacian" || algo == "block diagonal distance laplacian") { Input(currentLevel, "Coordinates"); } - if (algo.find("block diagonal") != std::string::npos || algo.find("signed classical") != std::string::npos) { + if(algo == "signed classical sa") + ; + else if (algo.find("block diagonal") != std::string::npos || algo.find("signed classical") != std::string::npos) { Input(currentLevel, "BlockNumber"); } } diff --git a/packages/muelu/test/unit_tests/CoalesceDropFactory.cpp b/packages/muelu/test/unit_tests/CoalesceDropFactory.cpp index c730e165e812..63883e9521c8 100644 --- a/packages/muelu/test/unit_tests/CoalesceDropFactory.cpp +++ b/packages/muelu/test/unit_tests/CoalesceDropFactory.cpp @@ -1620,6 +1620,47 @@ namespace MueLuTests { + TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CoalesceDropFactory, SignedClassicalSA, Scalar, LocalOrdinal, GlobalOrdinal, Node) { +# include + typedef Teuchos::ScalarTraits STS; + typedef typename STS::magnitudeType real_type; + + MUELU_TESTING_SET_OSTREAM; + MUELU_TESTING_LIMIT_SCOPE(Scalar,GlobalOrdinal,Node); + out << "version: " << MueLu::Version() << std::endl; + + RCP > comm = Parameters::getDefaultComm(); + Xpetra::UnderlyingLib lib = TestHelpers::Parameters::getLib(); + + GO nx = 10*comm->getSize(); + Teuchos::ParameterList matrixList; + matrixList.set("nx",nx); + matrixList.set("ny",(GO)10); + matrixList.set("nz",(GO)10); + matrixList.set("matrixType","Laplace3D"); + RCP A =TestHelpers::TestFactory::BuildMatrix(matrixList,lib); + + Level fineLevel; + fineLevel.Set("A", A); + + + RCP amalgFact = rcp(new AmalgamationFactory()); + CoalesceDropFactory coalesceDropFact; + coalesceDropFact.SetFactory("UnAmalgamationInfo",amalgFact); + coalesceDropFact.SetParameter("aggregation: drop tol",Teuchos::ParameterEntry(0.0)); + coalesceDropFact.SetParameter("aggregation: drop scheme",Teuchos::ParameterEntry(std::string("signed classical sa"))); + fineLevel.Request("Graph",&coalesceDropFact); + fineLevel.Request("DofsPerNode", &coalesceDropFact); + + coalesceDropFact.Build(fineLevel); + + RCP graph = fineLevel.Get >("Graph", &coalesceDropFact); + LO myDofsPerNode = fineLevel.Get("DofsPerNode", &coalesceDropFact); + TEST_EQUALITY(Teuchos::as(myDofsPerNode) == 1, true); + } + + + #define MUELU_ETI_GROUP(SC,LO,GO,Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,Constructor,SC,LO,GO,Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,Build,SC,LO,GO,Node) \ @@ -1642,7 +1683,8 @@ namespace MueLuTests { TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,BlockDiagonalDistanceLaplacian,SC,LO,GO,Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,BlockDiagonalDistanceLaplacianWeighted,SC,LO,GO,Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,DistanceLaplacianWeighted,SC,LO,GO,Node) \ - TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,AggresiveDroppingIsMarkedAsBoundary,SC,LO,GO,Node) + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,AggresiveDroppingIsMarkedAsBoundary,SC,LO,GO,Node) \ + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(CoalesceDropFactory,SignedClassicalSA,SC,LO,GO,Node) \ #include From 2d80622c1cb6d8021145f5421cd1f406290d2b96 Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Mon, 18 Oct 2021 21:14:38 -0600 Subject: [PATCH 29/98] TrilinosCouplings: Output mods --- .../examples/scaling/example_Poisson2D_pn_tpetra.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp index f25806937d62..caea27002639 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp @@ -2106,9 +2106,10 @@ int TestMultiLevelPreconditionerLaplace(char ProblemType[], ParameterList belosList; belosList.set("Maximum Iterations", maxIts); // Maximum number of iterations allowed belosList.set("Convergence Tolerance", tol); // Relative convergence tolerance requested - belosList.set("Verbosity", Belos::Errors + Belos::Warnings + Belos::StatusTestDetails); + // belosList.set("Verbosity", Belos::Errors + Belos::Warnings + Belos::StatusTestDetails); belosList.set("Output Frequency", 1); - belosList.set("Output Style", Belos::Brief); + belosList.set("Output Style", 1); + belosList.set ("Verbosity", 33); bool scaleResidualHist = true; if (!scaleResidualHist) belosList.set("Implicit Residual Scaling", "None"); From f7b64daabfa49abaa8b2f82171937cf0890a78e1 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 4 Oct 2021 18:26:23 -0600 Subject: [PATCH 30/98] Tpetra: Added outline of a test for async MultiVector transfers --- .../ImportExport2/ImportExport2_UnitTests.cpp | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 95ec17d71174..de65b768a563 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -871,6 +871,111 @@ namespace { } + template + class MultiVectorTransferFixture { + private: + using map_type = Map; + using mv_type = MultiVector; + + public: + MultiVectorTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~MultiVectorTransferFixture() { } + + bool shouldSkipTest() { + return isSerial(); + } + + void setupMultiVectors(int collectRank) { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = 3; + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMV = rcp(new mv_type(sourceMap, 1)); + sourceMV->randomize(); + + const size_t totalElements = numProcs*sourceNumLocalElements; + const size_t targetNumLocalElements = (myRank == collectRank) ? totalElements : 0; + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMV = rcp(new mv_type(targetMap, 1)); + targetMV->putScalar(Teuchos::ScalarTraits::zero()); + } + + void performTransfer() { + Import importer(sourceMap, targetMap, getImportParameterList()); + targetMV->doImport(*sourceMV, importer, INSERT); + } + + void checkResults() { + RCP referenceMV = generateReferenceWithClassicalCodePath(); + compareMultiVectors(targetMV, referenceMV); + } + + private: + void compareMultiVectors(RCP resultMV, RCP referenceMV) { + auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); + auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); + + for (GO globalRow = targetMap->getMinGlobalIndex(); globalRow <= targetMap->getMaxGlobalIndex(); ++globalRow) { + const LO localRow = targetMap->getLocalElement(globalRow); + TEST_EQUALITY(data(localRow, 0), referenceData(localRow, 0)); + } + } + + RCP generateReferenceWithClassicalCodePath() { + Import importer(sourceMap, targetMap, getImportParameterList()); + expertSetRemoteLIDsContiguous(importer, false); + TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); + + RCP referenceMV = rcp(new mv_type(targetMap, 1)); + referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->doImport(*sourceMV, importer, INSERT); + TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); + + return referenceMV; + } + + bool isSerial() { + if (numProcs < 2) { + out << "This test is only meaningful if running with multiple MPI " + "processes, but you ran it with only 1 process." << endl; + return true; + } + else return false; + } + + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMV; + RCP targetMV; + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) return; + + fixture.setupMultiVectors(0); + fixture.performTransfer(); + fixture.checkResults(); + } + + template bool graphs_are_same(const RCP& G1, const RCP& G2) { @@ -3038,6 +3143,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorImport, doImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, MueLuStyle, LO, GO, SC ) From bfbeb3da7e6914f8b650307a89f52595c0fa62fc Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Fri, 8 Oct 2021 12:02:03 -0600 Subject: [PATCH 31/98] Tpetra: update async MultiVector transfer test to be independent of transfer method --- .../ImportExport2/ImportExport2_UnitTests.cpp | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index de65b768a563..f154be9dfb8b 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -908,18 +908,18 @@ namespace { targetMV->putScalar(Teuchos::ScalarTraits::zero()); } - void performTransfer() { - Import importer(sourceMap, targetMap, getImportParameterList()); - targetMV->doImport(*sourceMV, importer, INSERT); + template + void performTransfer(const TransferMethod& transferMethod) { + transferMethod(sourceMV, targetMV); } void checkResults() { - RCP referenceMV = generateReferenceWithClassicalCodePath(); + RCP referenceMV = generateReferenceWithClassicalCodePath(); compareMultiVectors(targetMV, referenceMV); } private: - void compareMultiVectors(RCP resultMV, RCP referenceMV) { + void compareMultiVectors(RCP resultMV, RCP referenceMV) { auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); @@ -965,13 +965,25 @@ namespace { RCP targetMV; }; + template + class ForwardImport { + private: + using mv_type = MultiVector; + + public: + void operator()(RCP sourceMV, RCP targetMV) const { + Import importer(sourceMV->getMap(), targetMV->getMap(), getImportParameterList()); + targetMV->doImport(*sourceMV, importer, INSERT); + } + }; + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) return; fixture.setupMultiVectors(0); - fixture.performTransfer(); + fixture.performTransfer(ForwardImport()); fixture.checkResults(); } From 31d9c298600b135526ca1df86dc5227a32e211e7 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Fri, 8 Oct 2021 12:18:26 -0600 Subject: [PATCH 32/98] Tpetra: update async MultiVector transfer test to be independent of reference solution --- .../ImportExport2/ImportExport2_UnitTests.cpp | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index f154be9dfb8b..c44e2bdc0248 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -909,12 +909,13 @@ namespace { } template - void performTransfer(const TransferMethod& transferMethod) { - transferMethod(sourceMV, targetMV); + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMV, targetMV); } - void checkResults() { - RCP referenceMV = generateReferenceWithClassicalCodePath(); + template + void checkResults(const ReferenceSolution& referenceSolution) { + RCP referenceMV = referenceSolution.generateWithClassicalCodePath(sourceMV, targetMap); compareMultiVectors(targetMV, referenceMV); } @@ -929,19 +930,6 @@ namespace { } } - RCP generateReferenceWithClassicalCodePath() { - Import importer(sourceMap, targetMap, getImportParameterList()); - expertSetRemoteLIDsContiguous(importer, false); - TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); - - RCP referenceMV = rcp(new mv_type(targetMap, 1)); - referenceMV->putScalar(Teuchos::ScalarTraits::zero()); - referenceMV->doImport(*sourceMV, importer, INSERT); - TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); - - return referenceMV; - } - bool isSerial() { if (numProcs < 2) { out << "This test is only meaningful if running with multiple MPI " @@ -965,6 +953,28 @@ namespace { RCP targetMV; }; + template + class ReferenceImport { + private: + using map_type = Map; + using mv_type = MultiVector; + + public: + RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { + RCP sourceMap = sourceMV->getMap(); + Import importer(sourceMap, targetMap, getImportParameterList()); + expertSetRemoteLIDsContiguous(importer, false); + TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); + + RCP referenceMV = rcp(new mv_type(targetMap, 1)); + referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->doImport(*sourceMV, importer, INSERT); + TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); + + return referenceMV; + } + }; + template class ForwardImport { private: @@ -984,7 +994,7 @@ namespace { fixture.setupMultiVectors(0); fixture.performTransfer(ForwardImport()); - fixture.checkResults(); + fixture.checkResults(ReferenceImport()); } From 7258c08dda1daad410cb9a4e30ae8091eb988de6 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 11 Oct 2021 16:41:36 -0600 Subject: [PATCH 33/98] Tpetra: Added outline of tests for async CrsMatrix transfers --- .../ImportExport2/ImportExport2_UnitTests.cpp | 306 ++++++++++++++++++ 1 file changed, 306 insertions(+) diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index c44e2bdc0248..3cdd1a121b21 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -998,6 +998,310 @@ namespace { } + template + class CrsMatrixDiagonalTransferFixture { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + CrsMatrixDiagonalTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~CrsMatrixDiagonalTransferFixture() { } + + bool shouldSkipTest() { + return isSerial(); + } + + void setupMatrices(int collectRank) { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t targetNumLocalElements = 3; + const size_t totalElements = numProcs*targetNumLocalElements; + const size_t sourceNumLocalElements = (myRank == collectRank) ? totalElements : 0; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); + + if (sourceNumLocalElements != 0) { + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); + } + } + sourceMat->fillComplete(); + + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); + } + + template + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMat, targetMat); + } + + template + void checkResults(const ReferenceSolution& referenceSolution) { + RCP referenceMat = referenceSolution.generateUsingAllInOneImport(sourceMat, targetMap); + checkMatrixIsDiagonal(targetMat); + checkMatrixIsDiagonal(referenceMat); + compareMatrices(targetMat, referenceMat); + } + + private: + void checkMatrixIsDiagonal(RCP matrix) { + for (GO gblRow = targetMap->getMinGlobalIndex (); + gblRow <= targetMap->getMaxGlobalIndex (); + ++gblRow) { + const LO lclRow = targetMap->getLocalElement (gblRow); + + typename crs_type::local_inds_host_view_type lclInds; + typename crs_type::values_host_view_type lclVals; + matrix->getLocalRowView (lclRow, lclInds, lclVals); + TEST_EQUALITY_CONST(lclInds.size(), 1); + TEST_EQUALITY_CONST(lclVals.size(), 1); + + if (lclInds.size () != 0) { // don't segfault in error case + TEST_EQUALITY(matrix->getColMap ()->getGlobalElement (lclInds[0]), gblRow); + } + if (lclVals.size () != 0) { // don't segfault in error case + TEST_EQUALITY(lclVals[0], as (gblRow)); + } + } + } + + void compareMatrices(RCP resultMat, RCP referenceMat) { + using size_type = typename Array::size_type; + using magnitude_type = typename ScalarTraits::magnitudeType; + + using lids_type = typename crs_type::nonconst_local_inds_host_view_type; + using vals_type = typename crs_type::nonconst_values_host_view_type; + + const magnitude_type tol = as(10)*ScalarTraits::eps(); + + lids_type resultRowIndices; + vals_type resultRowValues; + lids_type referenceRowIndices; + vals_type referenceRowValues; + for (LO localRow = targetMap->getMinLocalIndex(); localRow <= targetMap->getMaxLocalIndex(); ++localRow) + { + size_t resultNumEntries = resultMat->getNumEntriesInLocalRow(localRow); + size_t referenceNumEntries = referenceMat->getNumEntriesInLocalRow(localRow); + TEST_EQUALITY(resultNumEntries, referenceNumEntries); + + if (resultNumEntries > as(resultRowIndices.size())) { + Kokkos::resize(resultRowIndices, resultNumEntries); + Kokkos::resize(resultRowValues, resultNumEntries); + } + if (referenceNumEntries > as(referenceRowIndices.size())) { + Kokkos::resize(referenceRowIndices, referenceNumEntries); + Kokkos::resize(referenceRowValues, referenceNumEntries); + } + + resultMat->getLocalRowCopy(localRow, resultRowIndices, resultRowValues, resultNumEntries); + referenceMat->getLocalRowCopy(localRow, referenceRowIndices, referenceRowValues, referenceNumEntries); + + Tpetra::sort2(resultRowIndices, resultRowIndices.extent(0), resultRowValues); + Tpetra::sort2(referenceRowIndices, referenceRowIndices.extent(0), referenceRowValues); + + for (size_type k = 0; k < static_cast(resultNumEntries); ++k) { + TEST_EQUALITY(resultRowIndices[k], referenceRowIndices[k]); + TEST_FLOATING_EQUALITY(resultRowValues[k], referenceRowValues[k], tol); + } + } + } + + bool isSerial() { + if (numProcs < 2) { + out << "This test is only meaningful if running with multiple MPI " + "processes, but you ran it with only 1 process." << endl; + return true; + } + else return false; + } + + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMat; + RCP targetMat; + }; + + template + class ReferenceImportMatrix { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + RCP generateUsingAllInOneImport(RCP sourceMat, RCP targetMap) const { + RCP sourceMap = sourceMat->getMap(); + Import importer(sourceMap, targetMap, getImportParameterList()); + + Teuchos::ParameterList dummy; + RCP referenceMat = Tpetra::importAndFillCompleteCrsMatrix( + sourceMat, importer, Teuchos::null, Teuchos::null, rcp(&dummy,false)); + return referenceMat; + } + }; + + template + class ForwardImportMatrix { + private: + using crs_type = CrsMatrix; + + public: + void operator()(RCP sourceMat, RCP targetMat) const { + Import importer(sourceMat->getMap(), targetMat->getMap(), getImportParameterList()); + targetMat->doImport(*sourceMat, importer, INSERT); + targetMat->fillComplete(); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, Scalar ) + { + CrsMatrixDiagonalTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) return; + + fixture.setupMatrices(0); + fixture.performTransfer(ForwardImportMatrix()); + fixture.checkResults(ReferenceImportMatrix()); + } + + + template + class CrsMatrixLowerTriangularTransferFixture { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + CrsMatrixLowerTriangularTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~CrsMatrixLowerTriangularTransferFixture() { } + + bool shouldSkipTest() { + return hasOddNumProcs(); + } + + void setupMatrices() { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; + const size_t targetNumLocalElements = 4; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); + + Array cols(1); + Array vals(1); + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + if (row > 0) { + cols.resize(row); + vals.resize(row); + for (GO col=0; col(col); + vals[col] = as(col); + } + sourceMat->insertGlobalValues(row, cols, vals); + } + } + sourceMat->fillComplete(); + + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); + } + + template + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMat, targetMat); + } + + void checkResults() { + using lids_type = typename crs_type::local_inds_host_view_type; + using vals_type = typename crs_type::values_host_view_type; + + const RCP colMap = targetMat->getColMap(); + + for (GO globalRow=targetMap->getMinGlobalIndex(); globalRow<=targetMap->getMaxGlobalIndex(); ++globalRow) { + LO localRow = targetMap->getLocalElement(globalRow); + lids_type rowIndices; + vals_type rowValues; + + targetMat->getLocalRowView(localRow, rowIndices, rowValues); + TEST_EQUALITY(rowIndices.extent(0), (size_t) globalRow); + TEST_EQUALITY(rowValues.extent(0), (size_t) globalRow); + + Array indices(rowIndices.size()); + Array values(rowValues.size()); + + for (decltype (rowIndices.size()) j=0; jgetGlobalElement(rowIndices[j]); + values[j] = rowValues[j]; + } + Tpetra::sort2(indices.begin(), indices.end(), values.begin()); + + for (decltype (rowIndices.size()) j=0; j(j)); + TEST_EQUALITY(values[j], as(j)); + } + } + } + + private: + bool hasOddNumProcs() { + if (numProcs%2 != 0) { + out << "This test is only meaningful if running with an even number of MPI processes." << endl; + return true; + } + else return false; + } + + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMat; + RCP targetMat; + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, Scalar ) + { + CrsMatrixLowerTriangularTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) return; + + fixture.setupMatrices(); + fixture.performTransfer(ForwardImportMatrix()); + fixture.checkResults(); + } + + template bool graphs_are_same(const RCP& G1, const RCP& G2) { @@ -3166,6 +3470,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorImport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, MueLuStyle, LO, GO, SC ) From f6c4d6928d90241394e50030b4d76dc22e455496 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 09:26:30 -0600 Subject: [PATCH 34/98] Tpetra: separate file for async transfer tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 653 ++++++++++++++++++ .../core/test/ImportExport2/CMakeLists.txt | 10 + .../ImportExport2/ImportExport2_UnitTests.cpp | 434 ------------ 3 files changed, 663 insertions(+), 434 deletions(-) create mode 100644 packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp new file mode 100644 index 000000000000..7f51425495a2 --- /dev/null +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -0,0 +1,653 @@ +// @HEADER +// *********************************************************************** +// +// Tpetra: Templated Linear Algebra Services Package +// Copyright (2008) Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +// @HEADER + +#include +#include + +#include +#include +#include +#include +#include +#include "Tpetra_CrsGraph.hpp" +#include "Tpetra_CrsMatrix.hpp" +#include "Tpetra_MultiVector.hpp" +#include "Tpetra_Core.hpp" +#include "Tpetra_Distributor.hpp" +#include "Tpetra_Map.hpp" +#include "Tpetra_Util.hpp" +#include "Tpetra_Import.hpp" +#include "Tpetra_Import_Util.hpp" +#include "Tpetra_Import_Util2.hpp" +#include "Tpetra_Details_packCrsMatrix.hpp" +#include "Tpetra_Details_unpackCrsMatrixAndCombine.hpp" +#include "Tpetra_Export.hpp" +#include "Tpetra_RowMatrixTransposer.hpp" +#include "TpetraExt_MatrixMatrix.hpp" +#include "Tpetra_Details_Behavior.hpp" +#include "Tpetra_Details_gathervPrint.hpp" +#include +#include + +namespace { + + using Teuchos::as; + using Teuchos::Array; + using Teuchos::ArrayRCP; + using Teuchos::ArrayView; + using Teuchos::arrayViewFromVector; + using Teuchos::Comm; + using Teuchos::FancyOStream; + using Teuchos::getFancyOStream; + using Teuchos::includesVerbLevel; + using Teuchos::OrdinalTraits; + using Teuchos::OSTab; + using Teuchos::outArg; + using Teuchos::ParameterList; + using Teuchos::parameterList; + using Teuchos::RCP; + using Teuchos::rcp; + using Teuchos::rcpFromRef; + using Teuchos::REDUCE_MAX; + using Teuchos::reduceAll; + using Teuchos::ScalarTraits; + using Teuchos::tuple; + + using Tpetra::ADD; + using Tpetra::createContigMap; + using Tpetra::CrsGraph; + using Tpetra::CrsMatrix; + using Tpetra::MultiVector; + using Tpetra::Export; + using Tpetra::Import; + using Tpetra::INSERT; + using Tpetra::Map; + using Tpetra::REPLACE; + using Tpetra::StaticProfile; + + using std::cerr; + using std::cout; + using std::ostream_iterator; + using std::endl; + + using Node = Tpetra::Map<>::node_type; + + // Command-line argument values (initially set to defaults). + bool testMpi = true; + double errorTolSlack = 1e+1; + std::string distributorSendType ("Send"); + bool barrierBetween = true; + bool verbose = false; + + TEUCHOS_STATIC_SETUP() + { + Teuchos::CommandLineProcessor &clp = Teuchos::UnitTestRepository::getCLP(); + clp.addOutputSetupOptions(true); + clp.setOption( + "test-mpi", "test-serial", &testMpi, + "Test MPI (if available) or force test of serial. In a serial build," + " this option is ignored and a serial comm is always used." ); + clp.setOption( + "error-tol-slack", &errorTolSlack, + "Slack off of machine epsilon used to check test results" ); + // FIXME (mfh 02 Apr 2012) It would be better to ask Distributor + // for the list of valid send types, but setOption() needs a const + // char[], not an std::string. + clp.setOption ("distributor-send-type", &distributorSendType, + "In MPI tests, the type of send operation that the Tpetra::" + "Distributor will use. Valid values include \"Isend\", " + "\"Rsend\", \"Send\", and \"Ssend\"."); + clp.setOption ("barrier-between", "no-barrier-between", &barrierBetween, + "In MPI tests, whether Tpetra::Distributor will execute a " + "barrier between posting receives and posting sends."); + clp.setOption ("verbose", "quiet", &verbose, "Whether to print verbose " + "output."); + } + + RCP > + getDefaultComm() + { + if (testMpi) { + return Tpetra::getDefaultComm (); + } + else { + return rcp (new Teuchos::SerialComm ()); + } + } + + RCP + getDistributorParameterList () + { + static RCP plist; // NOT THREAD SAFE, but that's OK here. + if (plist.is_null ()) { + plist = parameterList ("Tpetra::Distributor"); + plist->set ("Send type", distributorSendType); + plist->set ("Barrier between receives and sends", barrierBetween); + + if (verbose && getDefaultComm()->getRank() == 0) { + cout << "ParameterList for Distributor: " << *plist << endl; + } + + if (verbose) { + // Tell Distributor to print verbose output. + Teuchos::VerboseObject::setDefaultVerbLevel (Teuchos::VERB_EXTREME); + } + } + return plist; + } + + RCP getImportParameterList () { + return getDistributorParameterList (); // For now. + } + + RCP getExportParameterList () { + return parameterList (* (getDistributorParameterList ())); // For now. + } + + RCP getCrsGraphParameterList () { + static RCP plist; // NOT THREAD SAFE, but that's OK here. + if (plist.is_null ()) { + plist = parameterList ("Tpetra::CrsGraph"); + plist->set ("Import", * (getImportParameterList ())); + plist->set ("Export", * (getExportParameterList ())); + + if (verbose && getDefaultComm()->getRank() == 0) { + cout << "ParameterList for CrsGraph: " << *plist << endl; + } + } + return plist; + } + + RCP getCrsMatrixParameterList () { + return parameterList (* (getCrsGraphParameterList ())); // For now. + } + + + + // + // UNIT TESTS + // + + + template + class MultiVectorTransferFixture { + private: + using map_type = Map; + using mv_type = MultiVector; + + public: + MultiVectorTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~MultiVectorTransferFixture() { } + + bool shouldSkipTest() { + return numProcs < 2; + } + + void printSkippedTestMessage() { + out << "This test is only meaningful if running with multiple MPI " + "processes, but you ran it with only 1 process." << endl; + } + + void setupMultiVectors(int collectRank) { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = 3; + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMV = rcp(new mv_type(sourceMap, 1)); + sourceMV->randomize(); + + const size_t totalElements = numProcs*sourceNumLocalElements; + const size_t targetNumLocalElements = (myRank == collectRank) ? totalElements : 0; + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMV = rcp(new mv_type(targetMap, 1)); + targetMV->putScalar(Teuchos::ScalarTraits::zero()); + } + + template + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMV, targetMV); + } + + template + void checkResults(const ReferenceSolution& referenceSolution) { + RCP referenceMV = referenceSolution.generateWithClassicalCodePath(sourceMV, targetMap); + compareMultiVectors(targetMV, referenceMV); + } + + private: + void compareMultiVectors(RCP resultMV, RCP referenceMV) { + auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); + auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); + + for (GO globalRow = targetMap->getMinGlobalIndex(); globalRow <= targetMap->getMaxGlobalIndex(); ++globalRow) { + const LO localRow = targetMap->getLocalElement(globalRow); + TEST_EQUALITY(data(localRow, 0), referenceData(localRow, 0)); + } + } + + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMV; + RCP targetMV; + }; + + template + class ReferenceImport { + private: + using map_type = Map; + using mv_type = MultiVector; + + public: + RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { + RCP sourceMap = sourceMV->getMap(); + Import importer(sourceMap, targetMap, getImportParameterList()); + expertSetRemoteLIDsContiguous(importer, false); + TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); + + RCP referenceMV = rcp(new mv_type(targetMap, 1)); + referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->doImport(*sourceMV, importer, INSERT); + TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); + + return referenceMV; + } + }; + + template + class ForwardImport { + private: + using mv_type = MultiVector; + + public: + void operator()(RCP sourceMV, RCP targetMV) const { + Import importer(sourceMV->getMap(), targetMV->getMap(), getImportParameterList()); + targetMV->doImport(*sourceMV, importer, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setupMultiVectors(0); + fixture.performTransfer(ForwardImport()); + fixture.checkResults(ReferenceImport()); + } + + + template + class CrsMatrixDiagonalTransferFixture { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + CrsMatrixDiagonalTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~CrsMatrixDiagonalTransferFixture() { } + + bool shouldSkipTest() { + return numProcs < 2; + } + + void printSkippedTestMessage() { + out << "This test is only meaningful if running with multiple MPI " + "processes, but you ran it with only 1 process." << endl; + } + + + void setupMatrices(int collectRank) { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t targetNumLocalElements = 3; + const size_t totalElements = numProcs*targetNumLocalElements; + const size_t sourceNumLocalElements = (myRank == collectRank) ? totalElements : 0; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); + + if (sourceNumLocalElements != 0) { + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); + } + } + sourceMat->fillComplete(); + + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); + } + + template + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMat, targetMat); + } + + template + void checkResults(const ReferenceSolution& referenceSolution) { + RCP referenceMat = referenceSolution.generateUsingAllInOneImport(sourceMat, targetMap); + checkMatrixIsDiagonal(targetMat); + checkMatrixIsDiagonal(referenceMat); + compareMatrices(targetMat, referenceMat); + } + + private: + void checkMatrixIsDiagonal(RCP matrix) { + for (GO gblRow = targetMap->getMinGlobalIndex (); + gblRow <= targetMap->getMaxGlobalIndex (); + ++gblRow) { + const LO lclRow = targetMap->getLocalElement (gblRow); + + typename crs_type::local_inds_host_view_type lclInds; + typename crs_type::values_host_view_type lclVals; + matrix->getLocalRowView (lclRow, lclInds, lclVals); + TEST_EQUALITY_CONST(lclInds.size(), 1); + TEST_EQUALITY_CONST(lclVals.size(), 1); + + if (lclInds.size () != 0) { // don't segfault in error case + TEST_EQUALITY(matrix->getColMap ()->getGlobalElement (lclInds[0]), gblRow); + } + if (lclVals.size () != 0) { // don't segfault in error case + TEST_EQUALITY(lclVals[0], as (gblRow)); + } + } + } + + void compareMatrices(RCP resultMat, RCP referenceMat) { + using size_type = typename Array::size_type; + using magnitude_type = typename ScalarTraits::magnitudeType; + + using lids_type = typename crs_type::nonconst_local_inds_host_view_type; + using vals_type = typename crs_type::nonconst_values_host_view_type; + + const magnitude_type tol = as(10)*ScalarTraits::eps(); + + lids_type resultRowIndices; + vals_type resultRowValues; + lids_type referenceRowIndices; + vals_type referenceRowValues; + for (LO localRow = targetMap->getMinLocalIndex(); localRow <= targetMap->getMaxLocalIndex(); ++localRow) + { + size_t resultNumEntries = resultMat->getNumEntriesInLocalRow(localRow); + size_t referenceNumEntries = referenceMat->getNumEntriesInLocalRow(localRow); + TEST_EQUALITY(resultNumEntries, referenceNumEntries); + + if (resultNumEntries > as(resultRowIndices.size())) { + Kokkos::resize(resultRowIndices, resultNumEntries); + Kokkos::resize(resultRowValues, resultNumEntries); + } + if (referenceNumEntries > as(referenceRowIndices.size())) { + Kokkos::resize(referenceRowIndices, referenceNumEntries); + Kokkos::resize(referenceRowValues, referenceNumEntries); + } + + resultMat->getLocalRowCopy(localRow, resultRowIndices, resultRowValues, resultNumEntries); + referenceMat->getLocalRowCopy(localRow, referenceRowIndices, referenceRowValues, referenceNumEntries); + + Tpetra::sort2(resultRowIndices, resultRowIndices.extent(0), resultRowValues); + Tpetra::sort2(referenceRowIndices, referenceRowIndices.extent(0), referenceRowValues); + + for (size_type k = 0; k < static_cast(resultNumEntries); ++k) { + TEST_EQUALITY(resultRowIndices[k], referenceRowIndices[k]); + TEST_FLOATING_EQUALITY(resultRowValues[k], referenceRowValues[k], tol); + } + } + } + + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMat; + RCP targetMat; + }; + + template + class ReferenceImportMatrix { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + RCP generateUsingAllInOneImport(RCP sourceMat, RCP targetMap) const { + RCP sourceMap = sourceMat->getMap(); + Import importer(sourceMap, targetMap, getImportParameterList()); + + Teuchos::ParameterList dummy; + RCP referenceMat = Tpetra::importAndFillCompleteCrsMatrix( + sourceMat, importer, Teuchos::null, Teuchos::null, rcp(&dummy,false)); + return referenceMat; + } + }; + + template + class ForwardImportMatrix { + private: + using crs_type = CrsMatrix; + + public: + void operator()(RCP sourceMat, RCP targetMat) const { + Import importer(sourceMat->getMap(), targetMat->getMap(), getImportParameterList()); + targetMat->doImport(*sourceMat, importer, INSERT); + targetMat->fillComplete(); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, Scalar ) + { + CrsMatrixDiagonalTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setupMatrices(0); + fixture.performTransfer(ForwardImportMatrix()); + fixture.checkResults(ReferenceImportMatrix()); + } + + + template + class CrsMatrixLowerTriangularTransferFixture { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + CrsMatrixLowerTriangularTransferFixture(Teuchos::FancyOStream& o, bool& s) + : out(o), + success(s), + comm(getDefaultComm()), + numProcs(comm->getSize()), + myRank(comm->getRank()) + { } + + ~CrsMatrixLowerTriangularTransferFixture() { } + + bool shouldSkipTest() { + return numProcs%2 != 0; + } + + void printSkippedTestMessage() { + out << "This test is only meaningful if running with an even number of MPI processes." << endl; + } + + void setupMatrices() { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; + const size_t targetNumLocalElements = 4; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); + + Array cols(1); + Array vals(1); + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + if (row > 0) { + cols.resize(row); + vals.resize(row); + for (GO col=0; col(col); + vals[col] = as(col); + } + sourceMat->insertGlobalValues(row, cols, vals); + } + } + sourceMat->fillComplete(); + + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); + } + + template + void performTransfer(const TransferMethod& transfer) { + transfer(sourceMat, targetMat); + } + + void checkResults() { + using lids_type = typename crs_type::local_inds_host_view_type; + using vals_type = typename crs_type::values_host_view_type; + + const RCP colMap = targetMat->getColMap(); + + for (GO globalRow=targetMap->getMinGlobalIndex(); globalRow<=targetMap->getMaxGlobalIndex(); ++globalRow) { + LO localRow = targetMap->getLocalElement(globalRow); + lids_type rowIndices; + vals_type rowValues; + + targetMat->getLocalRowView(localRow, rowIndices, rowValues); + TEST_EQUALITY(rowIndices.extent(0), (size_t) globalRow); + TEST_EQUALITY(rowValues.extent(0), (size_t) globalRow); + + Array indices(rowIndices.size()); + Array values(rowValues.size()); + + for (decltype (rowIndices.size()) j=0; jgetGlobalElement(rowIndices[j]); + values[j] = rowValues[j]; + } + Tpetra::sort2(indices.begin(), indices.end(), values.begin()); + + for (decltype (rowIndices.size()) j=0; j(j)); + TEST_EQUALITY(values[j], as(j)); + } + } + } + + private: + Teuchos::FancyOStream& out; + bool& success; + + RCP> comm; + const int numProcs; + const int myRank; + + RCP sourceMap; + RCP targetMap; + + RCP sourceMat; + RCP targetMat; + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, Scalar ) + { + CrsMatrixLowerTriangularTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setupMatrices(); + fixture.performTransfer(ForwardImportMatrix()); + fixture.checkResults(); + } + + + // + // INSTANTIATIONS + // + +#define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, SC ) \ + + TPETRA_ETI_MANGLING_TYPEDEFS() + + // Test for all Scalar, LO, GO template parameter + // combinations, and the default Node type. + TPETRA_INSTANTIATE_SLG_NO_ORDINAL_SCALAR( UNIT_TEST_GROUP_SC_LO_GO ) +} diff --git a/packages/tpetra/core/test/ImportExport2/CMakeLists.txt b/packages/tpetra/core/test/ImportExport2/CMakeLists.txt index eb8ea85f2569..c1a2f26f55de 100644 --- a/packages/tpetra/core/test/ImportExport2/CMakeLists.txt +++ b/packages/tpetra/core/test/ImportExport2/CMakeLists.txt @@ -8,6 +8,16 @@ TRIBITS_ADD_EXECUTABLE_AND_TEST( STANDARD_PASS_OUTPUT ) +TRIBITS_ADD_EXECUTABLE_AND_TEST( + AsyncTransfer_UnitTests + SOURCES + AsyncTransfer_UnitTests.cpp + ${TEUCHOS_STD_UNIT_TEST_MAIN} + COMM serial mpi + ARGS "--globally-reduce-test-result --output-show-proc-rank --output-to-root-rank-only=-1" + STANDARD_PASS_OUTPUT + ) + TRIBITS_ADD_EXECUTABLE_AND_TEST( ImportExport2_CrsSortingUtils SOURCES diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 3cdd1a121b21..95ec17d71174 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -871,437 +871,6 @@ namespace { } - template - class MultiVectorTransferFixture { - private: - using map_type = Map; - using mv_type = MultiVector; - - public: - MultiVectorTransferFixture(Teuchos::FancyOStream& o, bool& s) - : out(o), - success(s), - comm(getDefaultComm()), - numProcs(comm->getSize()), - myRank(comm->getRank()) - { } - - ~MultiVectorTransferFixture() { } - - bool shouldSkipTest() { - return isSerial(); - } - - void setupMultiVectors(int collectRank) { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t sourceNumLocalElements = 3; - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMV = rcp(new mv_type(sourceMap, 1)); - sourceMV->randomize(); - - const size_t totalElements = numProcs*sourceNumLocalElements; - const size_t targetNumLocalElements = (myRank == collectRank) ? totalElements : 0; - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMV = rcp(new mv_type(targetMap, 1)); - targetMV->putScalar(Teuchos::ScalarTraits::zero()); - } - - template - void performTransfer(const TransferMethod& transfer) { - transfer(sourceMV, targetMV); - } - - template - void checkResults(const ReferenceSolution& referenceSolution) { - RCP referenceMV = referenceSolution.generateWithClassicalCodePath(sourceMV, targetMap); - compareMultiVectors(targetMV, referenceMV); - } - - private: - void compareMultiVectors(RCP resultMV, RCP referenceMV) { - auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); - auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); - - for (GO globalRow = targetMap->getMinGlobalIndex(); globalRow <= targetMap->getMaxGlobalIndex(); ++globalRow) { - const LO localRow = targetMap->getLocalElement(globalRow); - TEST_EQUALITY(data(localRow, 0), referenceData(localRow, 0)); - } - } - - bool isSerial() { - if (numProcs < 2) { - out << "This test is only meaningful if running with multiple MPI " - "processes, but you ran it with only 1 process." << endl; - return true; - } - else return false; - } - - Teuchos::FancyOStream& out; - bool& success; - - RCP> comm; - const int numProcs; - const int myRank; - - RCP sourceMap; - RCP targetMap; - - RCP sourceMV; - RCP targetMV; - }; - - template - class ReferenceImport { - private: - using map_type = Map; - using mv_type = MultiVector; - - public: - RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { - RCP sourceMap = sourceMV->getMap(); - Import importer(sourceMap, targetMap, getImportParameterList()); - expertSetRemoteLIDsContiguous(importer, false); - TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); - - RCP referenceMV = rcp(new mv_type(targetMap, 1)); - referenceMV->putScalar(Teuchos::ScalarTraits::zero()); - referenceMV->doImport(*sourceMV, importer, INSERT); - TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); - - return referenceMV; - } - }; - - template - class ForwardImport { - private: - using mv_type = MultiVector; - - public: - void operator()(RCP sourceMV, RCP targetMV) const { - Import importer(sourceMV->getMap(), targetMV->getMap(), getImportParameterList()); - targetMV->doImport(*sourceMV, importer, INSERT); - } - }; - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) - { - MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) return; - - fixture.setupMultiVectors(0); - fixture.performTransfer(ForwardImport()); - fixture.checkResults(ReferenceImport()); - } - - - template - class CrsMatrixDiagonalTransferFixture { - private: - using map_type = Map; - using crs_type = CrsMatrix; - - public: - CrsMatrixDiagonalTransferFixture(Teuchos::FancyOStream& o, bool& s) - : out(o), - success(s), - comm(getDefaultComm()), - numProcs(comm->getSize()), - myRank(comm->getRank()) - { } - - ~CrsMatrixDiagonalTransferFixture() { } - - bool shouldSkipTest() { - return isSerial(); - } - - void setupMatrices(int collectRank) { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t targetNumLocalElements = 3; - const size_t totalElements = numProcs*targetNumLocalElements; - const size_t sourceNumLocalElements = (myRank == collectRank) ? totalElements : 0; - - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); - - if (sourceNumLocalElements != 0) { - for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { - sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); - } - } - sourceMat->fillComplete(); - - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); - } - - template - void performTransfer(const TransferMethod& transfer) { - transfer(sourceMat, targetMat); - } - - template - void checkResults(const ReferenceSolution& referenceSolution) { - RCP referenceMat = referenceSolution.generateUsingAllInOneImport(sourceMat, targetMap); - checkMatrixIsDiagonal(targetMat); - checkMatrixIsDiagonal(referenceMat); - compareMatrices(targetMat, referenceMat); - } - - private: - void checkMatrixIsDiagonal(RCP matrix) { - for (GO gblRow = targetMap->getMinGlobalIndex (); - gblRow <= targetMap->getMaxGlobalIndex (); - ++gblRow) { - const LO lclRow = targetMap->getLocalElement (gblRow); - - typename crs_type::local_inds_host_view_type lclInds; - typename crs_type::values_host_view_type lclVals; - matrix->getLocalRowView (lclRow, lclInds, lclVals); - TEST_EQUALITY_CONST(lclInds.size(), 1); - TEST_EQUALITY_CONST(lclVals.size(), 1); - - if (lclInds.size () != 0) { // don't segfault in error case - TEST_EQUALITY(matrix->getColMap ()->getGlobalElement (lclInds[0]), gblRow); - } - if (lclVals.size () != 0) { // don't segfault in error case - TEST_EQUALITY(lclVals[0], as (gblRow)); - } - } - } - - void compareMatrices(RCP resultMat, RCP referenceMat) { - using size_type = typename Array::size_type; - using magnitude_type = typename ScalarTraits::magnitudeType; - - using lids_type = typename crs_type::nonconst_local_inds_host_view_type; - using vals_type = typename crs_type::nonconst_values_host_view_type; - - const magnitude_type tol = as(10)*ScalarTraits::eps(); - - lids_type resultRowIndices; - vals_type resultRowValues; - lids_type referenceRowIndices; - vals_type referenceRowValues; - for (LO localRow = targetMap->getMinLocalIndex(); localRow <= targetMap->getMaxLocalIndex(); ++localRow) - { - size_t resultNumEntries = resultMat->getNumEntriesInLocalRow(localRow); - size_t referenceNumEntries = referenceMat->getNumEntriesInLocalRow(localRow); - TEST_EQUALITY(resultNumEntries, referenceNumEntries); - - if (resultNumEntries > as(resultRowIndices.size())) { - Kokkos::resize(resultRowIndices, resultNumEntries); - Kokkos::resize(resultRowValues, resultNumEntries); - } - if (referenceNumEntries > as(referenceRowIndices.size())) { - Kokkos::resize(referenceRowIndices, referenceNumEntries); - Kokkos::resize(referenceRowValues, referenceNumEntries); - } - - resultMat->getLocalRowCopy(localRow, resultRowIndices, resultRowValues, resultNumEntries); - referenceMat->getLocalRowCopy(localRow, referenceRowIndices, referenceRowValues, referenceNumEntries); - - Tpetra::sort2(resultRowIndices, resultRowIndices.extent(0), resultRowValues); - Tpetra::sort2(referenceRowIndices, referenceRowIndices.extent(0), referenceRowValues); - - for (size_type k = 0; k < static_cast(resultNumEntries); ++k) { - TEST_EQUALITY(resultRowIndices[k], referenceRowIndices[k]); - TEST_FLOATING_EQUALITY(resultRowValues[k], referenceRowValues[k], tol); - } - } - } - - bool isSerial() { - if (numProcs < 2) { - out << "This test is only meaningful if running with multiple MPI " - "processes, but you ran it with only 1 process." << endl; - return true; - } - else return false; - } - - Teuchos::FancyOStream& out; - bool& success; - - RCP> comm; - const int numProcs; - const int myRank; - - RCP sourceMap; - RCP targetMap; - - RCP sourceMat; - RCP targetMat; - }; - - template - class ReferenceImportMatrix { - private: - using map_type = Map; - using crs_type = CrsMatrix; - - public: - RCP generateUsingAllInOneImport(RCP sourceMat, RCP targetMap) const { - RCP sourceMap = sourceMat->getMap(); - Import importer(sourceMap, targetMap, getImportParameterList()); - - Teuchos::ParameterList dummy; - RCP referenceMat = Tpetra::importAndFillCompleteCrsMatrix( - sourceMat, importer, Teuchos::null, Teuchos::null, rcp(&dummy,false)); - return referenceMat; - } - }; - - template - class ForwardImportMatrix { - private: - using crs_type = CrsMatrix; - - public: - void operator()(RCP sourceMat, RCP targetMat) const { - Import importer(sourceMat->getMap(), targetMat->getMap(), getImportParameterList()); - targetMat->doImport(*sourceMat, importer, INSERT); - targetMat->fillComplete(); - } - }; - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, Scalar ) - { - CrsMatrixDiagonalTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) return; - - fixture.setupMatrices(0); - fixture.performTransfer(ForwardImportMatrix()); - fixture.checkResults(ReferenceImportMatrix()); - } - - - template - class CrsMatrixLowerTriangularTransferFixture { - private: - using map_type = Map; - using crs_type = CrsMatrix; - - public: - CrsMatrixLowerTriangularTransferFixture(Teuchos::FancyOStream& o, bool& s) - : out(o), - success(s), - comm(getDefaultComm()), - numProcs(comm->getSize()), - myRank(comm->getRank()) - { } - - ~CrsMatrixLowerTriangularTransferFixture() { } - - bool shouldSkipTest() { - return hasOddNumProcs(); - } - - void setupMatrices() { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; - const size_t targetNumLocalElements = 4; - - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); - - Array cols(1); - Array vals(1); - for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { - if (row > 0) { - cols.resize(row); - vals.resize(row); - for (GO col=0; col(col); - vals[col] = as(col); - } - sourceMat->insertGlobalValues(row, cols, vals); - } - } - sourceMat->fillComplete(); - - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); - } - - template - void performTransfer(const TransferMethod& transfer) { - transfer(sourceMat, targetMat); - } - - void checkResults() { - using lids_type = typename crs_type::local_inds_host_view_type; - using vals_type = typename crs_type::values_host_view_type; - - const RCP colMap = targetMat->getColMap(); - - for (GO globalRow=targetMap->getMinGlobalIndex(); globalRow<=targetMap->getMaxGlobalIndex(); ++globalRow) { - LO localRow = targetMap->getLocalElement(globalRow); - lids_type rowIndices; - vals_type rowValues; - - targetMat->getLocalRowView(localRow, rowIndices, rowValues); - TEST_EQUALITY(rowIndices.extent(0), (size_t) globalRow); - TEST_EQUALITY(rowValues.extent(0), (size_t) globalRow); - - Array indices(rowIndices.size()); - Array values(rowValues.size()); - - for (decltype (rowIndices.size()) j=0; jgetGlobalElement(rowIndices[j]); - values[j] = rowValues[j]; - } - Tpetra::sort2(indices.begin(), indices.end(), values.begin()); - - for (decltype (rowIndices.size()) j=0; j(j)); - TEST_EQUALITY(values[j], as(j)); - } - } - } - - private: - bool hasOddNumProcs() { - if (numProcs%2 != 0) { - out << "This test is only meaningful if running with an even number of MPI processes." << endl; - return true; - } - else return false; - } - - Teuchos::FancyOStream& out; - bool& success; - - RCP> comm; - const int numProcs; - const int myRank; - - RCP sourceMap; - RCP targetMap; - - RCP sourceMat; - RCP targetMat; - }; - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, Scalar ) - { - CrsMatrixLowerTriangularTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) return; - - fixture.setupMatrices(); - fixture.performTransfer(ForwardImportMatrix()); - fixture.checkResults(); - } - - template bool graphs_are_same(const RCP& G1, const RCP& G2) { @@ -3469,9 +3038,6 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Import_Util,GetTwoTransferOwnershipVector, LO #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorImport, doImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, doImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Import_Util, UnpackAndCombineWithOwningPIDs, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( FusedImportExport, MueLuStyle, LO, GO, SC ) From 4d0359e8d59d1768db86e9cf3755e85b3764ee25 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:05:05 -0600 Subject: [PATCH 35/98] Tpetra: decouple import method from tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 7f51425495a2..ccfe84c50de7 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -92,6 +92,7 @@ namespace { using Teuchos::tuple; using Tpetra::ADD; + using Tpetra::DistObject; using Tpetra::createContigMap; using Tpetra::CrsGraph; using Tpetra::CrsMatrix; @@ -307,15 +308,15 @@ namespace { } }; - template + template class ForwardImport { private: - using mv_type = MultiVector; + using DistObjectRCP = RCP>; public: - void operator()(RCP sourceMV, RCP targetMV) const { - Import importer(sourceMV->getMap(), targetMV->getMap(), getImportParameterList()); - targetMV->doImport(*sourceMV, importer, INSERT); + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Import importer(source->getMap(), target->getMap(), getImportParameterList()); + target->doImport(*source, importer, INSERT); } }; @@ -385,6 +386,7 @@ namespace { template void performTransfer(const TransferMethod& transfer) { transfer(sourceMat, targetMat); + targetMat->fillComplete(); } template @@ -490,19 +492,6 @@ namespace { } }; - template - class ForwardImportMatrix { - private: - using crs_type = CrsMatrix; - - public: - void operator()(RCP sourceMat, RCP targetMat) const { - Import importer(sourceMat->getMap(), targetMat->getMap(), getImportParameterList()); - targetMat->doImport(*sourceMat, importer, INSERT); - targetMat->fillComplete(); - } - }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, Scalar ) { CrsMatrixDiagonalTransferFixture fixture(out, success); @@ -512,7 +501,7 @@ namespace { } fixture.setupMatrices(0); - fixture.performTransfer(ForwardImportMatrix()); + fixture.performTransfer(ForwardImport()); fixture.checkResults(ReferenceImportMatrix()); } @@ -574,6 +563,7 @@ namespace { template void performTransfer(const TransferMethod& transfer) { transfer(sourceMat, targetMat); + targetMat->fillComplete(); } void checkResults() { @@ -631,7 +621,7 @@ namespace { } fixture.setupMatrices(); - fixture.performTransfer(ForwardImportMatrix()); + fixture.performTransfer(ForwardImport()); fixture.checkResults(); } From 1fd4addbc09757fc8519e4123fa7fa02eb1a5145 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:10:47 -0600 Subject: [PATCH 36/98] Tpetra: cleanup MultiVectorTransferFixture --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index ccfe84c50de7..b97bb68a3624 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -202,9 +202,8 @@ namespace { } - // - // UNIT TESTS + // UNIT TEST FIXTURES // @@ -234,20 +233,9 @@ namespace { "processes, but you ran it with only 1 process." << endl; } - void setupMultiVectors(int collectRank) { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t sourceNumLocalElements = 3; - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMV = rcp(new mv_type(sourceMap, 1)); - sourceMV->randomize(); - - const size_t totalElements = numProcs*sourceNumLocalElements; - const size_t targetNumLocalElements = (myRank == collectRank) ? totalElements : 0; - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMV = rcp(new mv_type(targetMap, 1)); - targetMV->putScalar(Teuchos::ScalarTraits::zero()); + void setup(int collectRank) { + setupMaps(collectRank); + setupMultiVectors(); } template @@ -262,6 +250,26 @@ namespace { } private: + void setupMaps(int collectRank) { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = 3; + const size_t totalElements = numProcs*sourceNumLocalElements; + const size_t targetNumLocalElements = (myRank == collectRank) ? totalElements : 0; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + } + + void setupMultiVectors() { + sourceMV = rcp(new mv_type(sourceMap, 1)); + sourceMV->randomize(); + + targetMV = rcp(new mv_type(targetMap, 1)); + targetMV->putScalar(Teuchos::ScalarTraits::zero()); + } + void compareMultiVectors(RCP resultMV, RCP referenceMV) { auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); @@ -287,7 +295,7 @@ namespace { }; template - class ReferenceImport { + class ReferenceImportMultiVector { private: using map_type = Map; using mv_type = MultiVector; @@ -308,6 +316,12 @@ namespace { } }; + + // + // UNIT TESTS + // + + template class ForwardImport { private: @@ -328,9 +342,9 @@ namespace { return; } - fixture.setupMultiVectors(0); + fixture.setup(0); fixture.performTransfer(ForwardImport()); - fixture.checkResults(ReferenceImport()); + fixture.checkResults(ReferenceImportMultiVector()); } From b84b02a822aaf346a595d1fc6182c83a6832555f Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:28:21 -0600 Subject: [PATCH 37/98] Tpetra: cleanup DiagonalCrsMatrixTransferFixture --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 155 +++++++++--------- 1 file changed, 79 insertions(+), 76 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index b97bb68a3624..da76ebfef571 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -317,45 +317,14 @@ namespace { }; - // - // UNIT TESTS - // - - - template - class ForwardImport { - private: - using DistObjectRCP = RCP>; - - public: - void operator()(DistObjectRCP source, DistObjectRCP target) const { - Import importer(source->getMap(), target->getMap(), getImportParameterList()); - target->doImport(*source, importer, INSERT); - } - }; - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) - { - MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } - - fixture.setup(0); - fixture.performTransfer(ForwardImport()); - fixture.checkResults(ReferenceImportMultiVector()); - } - - template - class CrsMatrixDiagonalTransferFixture { + class DiagonalCrsMatrixTransferFixture { private: using map_type = Map; using crs_type = CrsMatrix; public: - CrsMatrixDiagonalTransferFixture(Teuchos::FancyOStream& o, bool& s) + DiagonalCrsMatrixTransferFixture(Teuchos::FancyOStream& o, bool& s) : out(o), success(s), comm(getDefaultComm()), @@ -363,7 +332,7 @@ namespace { myRank(comm->getRank()) { } - ~CrsMatrixDiagonalTransferFixture() { } + ~DiagonalCrsMatrixTransferFixture() { } bool shouldSkipTest() { return numProcs < 2; @@ -374,27 +343,9 @@ namespace { "processes, but you ran it with only 1 process." << endl; } - - void setupMatrices(int collectRank) { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t targetNumLocalElements = 3; - const size_t totalElements = numProcs*targetNumLocalElements; - const size_t sourceNumLocalElements = (myRank == collectRank) ? totalElements : 0; - - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); - - if (sourceNumLocalElements != 0) { - for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { - sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); - } - } - sourceMat->fillComplete(); - - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); + void setup() { + setupMaps(); + setupMatrices(); } template @@ -412,23 +363,44 @@ namespace { } private: + void setupMaps() { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t targetNumLocalElements = 3; + const size_t totalElements = numProcs*targetNumLocalElements; + const size_t sourceNumLocalElements = (myRank == 0) ? totalElements : 0; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + } + + void setupMatrices() { + sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); + targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); + + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); + } + sourceMat->fillComplete(); + } + void checkMatrixIsDiagonal(RCP matrix) { - for (GO gblRow = targetMap->getMinGlobalIndex (); - gblRow <= targetMap->getMaxGlobalIndex (); - ++gblRow) { - const LO lclRow = targetMap->getLocalElement (gblRow); - - typename crs_type::local_inds_host_view_type lclInds; - typename crs_type::values_host_view_type lclVals; - matrix->getLocalRowView (lclRow, lclInds, lclVals); - TEST_EQUALITY_CONST(lclInds.size(), 1); - TEST_EQUALITY_CONST(lclVals.size(), 1); - - if (lclInds.size () != 0) { // don't segfault in error case - TEST_EQUALITY(matrix->getColMap ()->getGlobalElement (lclInds[0]), gblRow); + for (GO globalRow = targetMap->getMinGlobalIndex(); globalRow <= targetMap->getMaxGlobalIndex(); ++globalRow) { + const LO localRow = targetMap->getLocalElement(globalRow); + + typename crs_type::local_inds_host_view_type localInds; + typename crs_type::values_host_view_type localVals; + matrix->getLocalRowView(localRow, localInds, localVals); + + TEST_EQUALITY_CONST(localInds.size(), 1); + if (localInds.size() == 1) { + TEST_EQUALITY(matrix->getColMap()->getGlobalElement(localInds[0]), globalRow); } - if (lclVals.size () != 0) { // don't segfault in error case - TEST_EQUALITY(lclVals[0], as (gblRow)); + + TEST_EQUALITY_CONST(localVals.size(), 1); + if (localVals.size() == 1) { + TEST_EQUALITY(localVals[0], as(globalRow)); } } } @@ -446,8 +418,8 @@ namespace { vals_type resultRowValues; lids_type referenceRowIndices; vals_type referenceRowValues; - for (LO localRow = targetMap->getMinLocalIndex(); localRow <= targetMap->getMaxLocalIndex(); ++localRow) - { + + for (LO localRow = targetMap->getMinLocalIndex(); localRow <= targetMap->getMaxLocalIndex(); ++localRow) { size_t resultNumEntries = resultMat->getNumEntriesInLocalRow(localRow); size_t referenceNumEntries = referenceMat->getNumEntriesInLocalRow(localRow); TEST_EQUALITY(resultNumEntries, referenceNumEntries); @@ -506,15 +478,46 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, Scalar ) + + // + // UNIT TESTS + // + + + template + class ForwardImport { + private: + using DistObjectRCP = RCP>; + + public: + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Import importer(source->getMap(), target->getMap(), getImportParameterList()); + target->doImport(*source, importer, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(0); + fixture.performTransfer(ForwardImport()); + fixture.checkResults(ReferenceImportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) { - CrsMatrixDiagonalTransferFixture fixture(out, success); + DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { fixture.printSkippedTestMessage(); return; } - fixture.setupMatrices(0); + fixture.setup(); fixture.performTransfer(ForwardImport()); fixture.checkResults(ReferenceImportMatrix()); } @@ -646,7 +649,7 @@ namespace { #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_diagonal, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 262bb8107ee224351c630a24927cdd24ea7410e5 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:35:06 -0600 Subject: [PATCH 38/98] Tpetra: cleanup LowerTriangularCrsMatrixTransferFixture --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 167 +++++++++--------- 1 file changed, 87 insertions(+), 80 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index da76ebfef571..1b31f8d7dda2 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -479,58 +479,14 @@ namespace { }; - // - // UNIT TESTS - // - - - template - class ForwardImport { - private: - using DistObjectRCP = RCP>; - - public: - void operator()(DistObjectRCP source, DistObjectRCP target) const { - Import importer(source->getMap(), target->getMap(), getImportParameterList()); - target->doImport(*source, importer, INSERT); - } - }; - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) - { - MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } - - fixture.setup(0); - fixture.performTransfer(ForwardImport()); - fixture.checkResults(ReferenceImportMultiVector()); - } - - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) - { - DiagonalCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } - - fixture.setup(); - fixture.performTransfer(ForwardImport()); - fixture.checkResults(ReferenceImportMatrix()); - } - - template - class CrsMatrixLowerTriangularTransferFixture { + class LowerTriangularCrsMatrixTransferFixture { private: using map_type = Map; using crs_type = CrsMatrix; public: - CrsMatrixLowerTriangularTransferFixture(Teuchos::FancyOStream& o, bool& s) + LowerTriangularCrsMatrixTransferFixture(Teuchos::FancyOStream& o, bool& s) : out(o), success(s), comm(getDefaultComm()), @@ -538,7 +494,7 @@ namespace { myRank(comm->getRank()) { } - ~CrsMatrixLowerTriangularTransferFixture() { } + ~LowerTriangularCrsMatrixTransferFixture() { } bool shouldSkipTest() { return numProcs%2 != 0; @@ -548,33 +504,9 @@ namespace { out << "This test is only meaningful if running with an even number of MPI processes." << endl; } - void setupMatrices() { - const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); - - const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; - const size_t targetNumLocalElements = 4; - - sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); - sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); - - Array cols(1); - Array vals(1); - for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { - if (row > 0) { - cols.resize(row); - vals.resize(row); - for (GO col=0; col(col); - vals[col] = as(col); - } - sourceMat->insertGlobalValues(row, cols, vals); - } - } - sourceMat->fillComplete(); - - targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); - targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); + void setup() { + setupMaps(); + setupMatrices(); } template @@ -601,13 +533,13 @@ namespace { Array indices(rowIndices.size()); Array values(rowValues.size()); - for (decltype (rowIndices.size()) j=0; jgetGlobalElement(rowIndices[j]); values[j] = rowValues[j]; } Tpetra::sort2(indices.begin(), indices.end(), values.begin()); - for (decltype (rowIndices.size()) j=0; j(j)); TEST_EQUALITY(values[j], as(j)); } @@ -615,6 +547,37 @@ namespace { } private: + void setupMaps() { + const GO indexBase = 0; + const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + + const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; + const size_t targetNumLocalElements = 4; + + sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); + targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); + } + + void setupMatrices() { + sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); + targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); + + Array cols(1); + Array vals(1); + for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { + if (row > 0) { + cols.resize(row); + vals.resize(row); + for (GO col=0; col(col); + vals[col] = as(col); + } + sourceMat->insertGlobalValues(row, cols, vals); + } + } + sourceMat->fillComplete(); + } + Teuchos::FancyOStream& out; bool& success; @@ -629,15 +592,59 @@ namespace { RCP targetMat; }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, Scalar ) + + // + // UNIT TESTS + // + + + template + class ForwardImport { + private: + using DistObjectRCP = RCP>; + + public: + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Import importer(source->getMap(), target->getMap(), getImportParameterList()); + target->doImport(*source, importer, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) { - CrsMatrixLowerTriangularTransferFixture fixture(out, success); + MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { fixture.printSkippedTestMessage(); return; } - fixture.setupMatrices(); + fixture.setup(0); + fixture.performTransfer(ForwardImport()); + fixture.checkResults(ReferenceImportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) + { + DiagonalCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ForwardImport()); + fixture.checkResults(ReferenceImportMatrix()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( LowerTriangularCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) + { + LowerTriangularCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); fixture.performTransfer(ForwardImport()); fixture.checkResults(); } @@ -650,7 +657,7 @@ namespace { #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( CrsMatrixTransfer, asyncImport_lowerTriangular, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( LowerTriangularCrsMatrixTransfer, asyncImport, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 37f0f36eb5acafeb29c4fc271c5139840a66b197 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:38:00 -0600 Subject: [PATCH 39/98] Tpetra: change ForwardImport implementation to be truly asynchronous --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 1b31f8d7dda2..b08583171cf9 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -606,11 +606,12 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { Import importer(source->getMap(), target->getMap(), getImportParameterList()); - target->doImport(*source, importer, INSERT); + target->beginImport(*source, importer, INSERT); + target->endImport(*source, importer, INSERT); } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncForwardImport, LO, GO, Scalar ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -623,7 +624,7 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncForwardImport, LO, GO, Scalar ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -636,7 +637,7 @@ namespace { fixture.checkResults(ReferenceImportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( LowerTriangularCrsMatrixTransfer, asyncImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( LowerTriangularCrsMatrixTransfer, asyncForwardImport, LO, GO, Scalar ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -655,9 +656,9 @@ namespace { // #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( DiagonalCrsMatrixTransfer, asyncImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( LowerTriangularCrsMatrixTransfer, asyncImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncForwardImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( DiagonalCrsMatrixTransfer, asyncForwardImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( LowerTriangularCrsMatrixTransfer, asyncForwardImport, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 8df998165523c03ff627242ed1870e7fea29607f Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:41:54 -0600 Subject: [PATCH 40/98] Tpetra: rearrange test names --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index b08583171cf9..7016a64d9e6f 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -611,7 +611,7 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( MultiVectorTransfer, asyncForwardImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank0, LO, GO, Scalar ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -624,7 +624,20 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( DiagonalCrsMatrixTransfer, asyncForwardImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank1, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(1); + fixture.performTransfer(ForwardImport()); + fixture.checkResults(ReferenceImportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, DiagonalCrsMatrix, LO, GO, Scalar ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -637,7 +650,7 @@ namespace { fixture.checkResults(ReferenceImportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( LowerTriangularCrsMatrixTransfer, asyncForwardImport, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, LowerTriangularCrsMatrix, LO, GO, Scalar ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -656,9 +669,10 @@ namespace { // #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( MultiVectorTransfer, asyncForwardImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( DiagonalCrsMatrixTransfer, asyncForwardImport, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( LowerTriangularCrsMatrixTransfer, asyncForwardImport, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank0, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank1, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, DiagonalCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 132c004a8296ec56a3a65c7bbc8d4ecc33ed8170 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 21:44:52 -0600 Subject: [PATCH 41/98] Tpetra: add ReverseImport tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 7016a64d9e6f..d127a6379876 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -664,6 +664,72 @@ namespace { } + template + class ReverseImport { + private: + using DistObjectRCP = RCP>; + + public: + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Export exporter(target->getMap(), source->getMap(), getImportParameterList()); + target->beginImport(*source, exporter, INSERT); + target->endImport(*source, exporter, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank0, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(0); + fixture.performTransfer(ReverseImport()); + fixture.checkResults(ReferenceImportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank1, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(1); + fixture.performTransfer(ReverseImport()); + fixture.checkResults(ReferenceImportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, DiagonalCrsMatrix, LO, GO, Scalar ) + { + DiagonalCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ReverseImport()); + fixture.checkResults(ReferenceImportMatrix()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + { + LowerTriangularCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ReverseImport()); + fixture.checkResults(); + } + + // // INSTANTIATIONS // @@ -673,6 +739,10 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank1, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, DiagonalCrsMatrix, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank0, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank1, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, DiagonalCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 0985c3a336ed72b267ec5483cb8f9a622414bff2 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 22:01:42 -0600 Subject: [PATCH 42/98] Tpetra: add ForwardExport tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 116 +++++++++++++++++- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index d127a6379876..27a357f209c1 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -316,6 +316,28 @@ namespace { } }; + template + class ReferenceExportMultiVector { + private: + using map_type = Map; + using mv_type = MultiVector; + + public: + RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { + RCP sourceMap = sourceMV->getMap(); + Export exporter(sourceMap, targetMap, getExportParameterList()); + expertSetRemoteLIDsContiguous(exporter, false); + TEUCHOS_ASSERT(!exporter.areRemoteLIDsContiguous()); + + RCP referenceMV = rcp(new mv_type(targetMap, 1)); + referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->doExport(*sourceMV, exporter, INSERT); + TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); + + return referenceMV; + } + }; + template class DiagonalCrsMatrixTransferFixture { @@ -356,7 +378,7 @@ namespace { template void checkResults(const ReferenceSolution& referenceSolution) { - RCP referenceMat = referenceSolution.generateUsingAllInOneImport(sourceMat, targetMap); + RCP referenceMat = referenceSolution.generateUsingAllInOne(sourceMat, targetMap); checkMatrixIsDiagonal(targetMat); checkMatrixIsDiagonal(referenceMat); compareMatrices(targetMat, referenceMat); @@ -467,7 +489,7 @@ namespace { using crs_type = CrsMatrix; public: - RCP generateUsingAllInOneImport(RCP sourceMat, RCP targetMap) const { + RCP generateUsingAllInOne(RCP sourceMat, RCP targetMap) const { RCP sourceMap = sourceMat->getMap(); Import importer(sourceMap, targetMap, getImportParameterList()); @@ -478,6 +500,24 @@ namespace { } }; + template + class ReferenceExportMatrix { + private: + using map_type = Map; + using crs_type = CrsMatrix; + + public: + RCP generateUsingAllInOne(RCP sourceMat, RCP targetMap) const { + RCP sourceMap = sourceMat->getMap(); + Export exporter(sourceMap, targetMap, getExportParameterList()); + + Teuchos::ParameterList dummy; + RCP referenceMat = Tpetra::exportAndFillCompleteCrsMatrix( + sourceMat, exporter, Teuchos::null, Teuchos::null, rcp(&dummy,false)); + return referenceMat; + } + }; + template class LowerTriangularCrsMatrixTransferFixture { @@ -671,7 +711,7 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { - Export exporter(target->getMap(), source->getMap(), getImportParameterList()); + Export exporter(target->getMap(), source->getMap(), getExportParameterList()); target->beginImport(*source, exporter, INSERT); target->endImport(*source, exporter, INSERT); } @@ -730,6 +770,72 @@ namespace { } + template + class ForwardExport { + private: + using DistObjectRCP = RCP>; + + public: + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Export exporter(source->getMap(), target->getMap(), getExportParameterList()); + target->beginExport(*source, exporter, INSERT); + target->endExport(*source, exporter, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank0, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(0); + fixture.performTransfer(ForwardExport()); + fixture.checkResults(ReferenceExportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank1, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(1); + fixture.performTransfer(ForwardExport()); + fixture.checkResults(ReferenceExportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, DiagonalCrsMatrix, LO, GO, Scalar ) + { + DiagonalCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ForwardExport()); + fixture.checkResults(ReferenceExportMatrix()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + { + LowerTriangularCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ForwardExport()); + fixture.checkResults(); + } + + // // INSTANTIATIONS // @@ -743,6 +849,10 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank1, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, DiagonalCrsMatrix, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank0, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank1, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, DiagonalCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, LowerTriangularCrsMatrix, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From d5b43ee358e87366c5b7bd1e271b45705f22880e Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 18 Oct 2021 22:03:57 -0600 Subject: [PATCH 43/98] Tpetra: add ReverseExport tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 27a357f209c1..e80c4f8ddd6b 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -836,6 +836,72 @@ namespace { } + template + class ReverseExport { + private: + using DistObjectRCP = RCP>; + + public: + void operator()(DistObjectRCP source, DistObjectRCP target) const { + Import importer(target->getMap(), source->getMap(), getImportParameterList()); + target->beginExport(*source, importer, INSERT); + target->endExport(*source, importer, INSERT); + } + }; + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank0, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(0); + fixture.performTransfer(ReverseExport()); + fixture.checkResults(ReferenceExportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank1, LO, GO, Scalar ) + { + MultiVectorTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(1); + fixture.performTransfer(ReverseExport()); + fixture.checkResults(ReferenceExportMultiVector()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, DiagonalCrsMatrix, LO, GO, Scalar ) + { + DiagonalCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ReverseExport()); + fixture.checkResults(ReferenceExportMatrix()); + } + + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + { + LowerTriangularCrsMatrixTransferFixture fixture(out, success); + if (fixture.shouldSkipTest()) { + fixture.printSkippedTestMessage(); + return; + } + + fixture.setup(); + fixture.performTransfer(ReverseExport()); + fixture.checkResults(); + } + + // // INSTANTIATIONS // @@ -853,6 +919,10 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank1, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, DiagonalCrsMatrix, LO, GO, SC ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, LowerTriangularCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank0, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank1, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, DiagonalCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, LowerTriangularCrsMatrix, LO, GO, SC ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From 01ddff6d5a260976f09c884d2348c197fe8de45d Mon Sep 17 00:00:00 2001 From: Vinh Dang Date: Mon, 18 Oct 2021 23:14:55 -0700 Subject: [PATCH 44/98] Add MPI_Finalize before return --- packages/adelus/test/vector_random/cxx_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/adelus/test/vector_random/cxx_main.cpp b/packages/adelus/test/vector_random/cxx_main.cpp index 5c7772a64465..1e1408e7dac4 100644 --- a/packages/adelus/test/vector_random/cxx_main.cpp +++ b/packages/adelus/test/vector_random/cxx_main.cpp @@ -217,6 +217,7 @@ int main(int argc, char *argv[]) << " vs. available: " << gpu_count << "). Exit without test." << std::endl; } + MPI_Finalize() ; return 0; } From 03f4904c34de80b947b4ef0c82be958da7711a7c Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Tue, 19 Oct 2021 01:03:01 -0600 Subject: [PATCH 45/98] Amesos2::SuperLU_dist: add option to apply Equil --- .../src/Amesos2_Superludist_FunctionMap.hpp | 4 +- .../amesos2/src/Amesos2_Superludist_def.hpp | 97 +++++++++++-------- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/packages/amesos2/src/Amesos2_Superludist_FunctionMap.hpp b/packages/amesos2/src/Amesos2_Superludist_FunctionMap.hpp index 7eb5862b1b6d..cd92961a72b1 100644 --- a/packages/amesos2/src/Amesos2_Superludist_FunctionMap.hpp +++ b/packages/amesos2/src/Amesos2_Superludist_FunctionMap.hpp @@ -532,14 +532,14 @@ namespace Amesos2 { } static void gsequ_loc(SLUD::SuperMatrix* A, double* r, double* c, - double* rowcnd, double* colcnd, double* amax, int* info, + double* rowcnd, double* colcnd, double* amax, SLUD::int_t* info, SLUD::gridinfo_t* grid) { SLUD::Z::pzgsequ(A, r, c, rowcnd, colcnd, amax, info, grid); } static void gsequ(SLUD::SuperMatrix* A, double* r, double* c, - double* rowcnd, double* colcnd, double* amax, int* info) + double* rowcnd, double* colcnd, double* amax, SLUD::int_t* info) { SLUD::Z::zgsequ_dist(A, r, c, rowcnd, colcnd, amax, info); } diff --git a/packages/amesos2/src/Amesos2_Superludist_def.hpp b/packages/amesos2/src/Amesos2_Superludist_def.hpp index f312b2b48e44..4cd1fea25c5d 100644 --- a/packages/amesos2/src/Amesos2_Superludist_def.hpp +++ b/packages/amesos2/src/Amesos2_Superludist_def.hpp @@ -355,17 +355,17 @@ namespace Amesos2 { free( data_.fstVtxSep ); #endif } + float info = 0.0; + { #ifdef HAVE_AMESOS2_TIMERS - Teuchos::TimeMonitor preOrderTime( this->timers_.preOrderTime_ ); + Teuchos::TimeMonitor preOrderTime( this->timers_.preOrderTime_ ); #endif - - float info = 0.0; - info = SLUD::get_perm_c_parmetis( &(data_.A), - data_.perm_r.getRawPtr(), data_.perm_c.getRawPtr(), - data_.grid.nprow * data_.grid.npcol, data_.domains, - &(data_.sizes), &(data_.fstVtxSep), - &(data_.grid), &(data_.symb_comm) ); - + info = SLUD::get_perm_c_parmetis( &(data_.A), + data_.perm_r.getRawPtr(), data_.perm_c.getRawPtr(), + data_.grid.nprow * data_.grid.npcol, data_.domains, + &(data_.sizes), &(data_.fstVtxSep), + &(data_.grid), &(data_.symb_comm) ); + } TEUCHOS_TEST_FOR_EXCEPTION( info > 0.0, std::runtime_error, "SuperLU_DIST pre-ordering ran out of memory after allocating " @@ -389,18 +389,18 @@ namespace Amesos2 { if( in_grid_ ){ + float info = 0.0; + { #ifdef HAVE_AMESOS2_TIMERS - Teuchos::TimeMonitor symFactTime( this->timers_.symFactTime_ ); + Teuchos::TimeMonitor symFactTime( this->timers_.symFactTime_ ); #endif - - float info = 0.0; - info = SLUD::symbfact_dist((data_.grid.nprow) * (data_.grid.npcol), - data_.domains, &(data_.A), data_.perm_c.getRawPtr(), - data_.perm_r.getRawPtr(), data_.sizes, - data_.fstVtxSep, &(data_.pslu_freeable), - &(data_.grid.comm), &(data_.symb_comm), - &(data_.mem_usage)); - + info = SLUD::symbfact_dist((data_.grid.nprow) * (data_.grid.npcol), + data_.domains, &(data_.A), data_.perm_c.getRawPtr(), + data_.perm_r.getRawPtr(), data_.sizes, + data_.fstVtxSep, &(data_.pslu_freeable), + &(data_.grid.comm), &(data_.symb_comm), + &(data_.mem_usage)); + } TEUCHOS_TEST_FOR_EXCEPTION( info > 0.0, std::runtime_error, "SuperLU_DIST symbolic factorization ran out of memory after" @@ -420,17 +420,25 @@ namespace Amesos2 { // loadA_impl(); // Refresh the matrix values - // if( data_.options.Equil == SLUD::YES ){ - // // Apply the scalings computed in preOrdering - // function_map::laqgs(&(data_.A), data_.R.getRawPtr(), - // data_.C.getRawPtr(), data_.rowcnd, data_.colcnd, - // data_.amax, &(data_.equed)); + if( in_grid_ ) { + if( data_.options.Equil == SLUD::YES ) { + SLUD::int_t info = 0; - // data_.rowequ = (data_.equed == SLUD::ROW) || (data_.equed == SLUD::BOTH); - // data_.colequ = (data_.equed == SLUD::COL) || (data_.equed == SLUD::BOTH); - // } + // Compute scaling + data_.R.resize(this->globalNumRows_); + data_.C.resize(this->globalNumCols_); + function_map::gsequ_loc(&(data_.A), data_.R.getRawPtr(), data_.C.getRawPtr(), + &(data_.rowcnd), &(data_.colcnd), &(data_.amax), &info, &(data_.grid)); + + // Apply the scalings + function_map::laqgs_loc(&(data_.A), data_.R.getRawPtr(), data_.C.getRawPtr(), + data_.rowcnd, data_.colcnd, data_.amax, + &(data_.equed)); + + data_.rowequ = (data_.equed == SLUD::ROW) || (data_.equed == SLUD::BOTH); + data_.colequ = (data_.equed == SLUD::COL) || (data_.equed == SLUD::BOTH); + } - if( in_grid_ ){ // Apply the column ordering, so that AC is the column-permuted A, and compute etree size_t nnz_loc = ((SLUD::NRformat_loc*)data_.A.Store)->nnz_loc; for( size_t i = 0; i < nnz_loc; ++i ) colind_[i] = data_.perm_c[colind_[i]]; @@ -462,7 +470,6 @@ namespace Amesos2 { #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_); #endif - function_map::gstrf(&(data_.options), this->globalNumRows_, this->globalNumCols_, anorm, &(data_.lu), &(data_.grid), &(data_.stat), &info); @@ -511,7 +518,6 @@ namespace Amesos2 { #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor convTimer(this->timers_.vecConvTime_); #endif - { // The input dense matrix for B should be distributed in the // same manner as the superlu_dist matrix. That is, if a @@ -522,7 +528,6 @@ namespace Amesos2 { #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_); #endif - // get grid-distributed mv data. The multivector data will be // distributed across the processes in the SuperLU_DIST grid. typedef Util::get_1d_copy_helper,slu_type> copy_helper; @@ -563,12 +568,20 @@ namespace Amesos2 { same_solve_struct_ = true; } + // Apply row-scaling if requested + if (data_.options.Equil == SLUD::YES && data_.rowequ) { + SLUD::int_t ld = as(local_len_rhs); + for(global_size_type j = 0; j < nrhs; ++j) { + for(size_t i = 0; i < local_len_rhs; ++i) bvals_[i + j*ld] *= data_.R[i]; + } + } + + // Solve int ierr = 0; // returned error code { #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_); #endif - function_map::gstrs(as(this->globalNumRows_), &(data_.lu), &(data_.scale_perm), &(data_.grid), bvals_.getRawPtr(), as(local_len_rhs), as(first_global_row_b), @@ -606,6 +619,14 @@ namespace Amesos2 { as(nrhs), &(data_.grid)); } + + // Apply col-scaling if requested + if (data_.options.Equil == SLUD::YES && data_.colequ) { + SLUD::int_t ld = as(local_len_rhs); + for(global_size_type j = 0; j < nrhs; ++j) { + for(size_t i = 0; i < local_len_rhs; ++i) xvals_[i + j*ld] *= data_.C[i]; + } + } } /* Update X's global values */ @@ -613,7 +634,6 @@ namespace Amesos2 { #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_); #endif - typedef Util::put_1d_data_helper,slu_type> put_helper; put_helper::do_put(X, xvals_(), @@ -672,10 +692,9 @@ namespace Amesos2 { data_.options.Trans = SLUD::NOTRANS; // should always be set this way; - // TODO: Uncomment when supported - // bool equil = parameterList->get("Equil", true); - // data_.options.Equil = equil ? SLUD::YES : SLUD::NO; - data_.options.Equil = SLUD::NO; + // Equilbration option + bool equil = parameterList->get("Equil", false); + data_.options.Equil = equil ? SLUD::YES : SLUD::NO; if( parameterList->isParameter("ColPerm") ){ RCP colperm_validator = valid_params->getEntry("ColPerm").validator(); @@ -743,8 +762,8 @@ namespace Amesos2 { tuple(SLUD::NOTRANS), pl.getRawPtr()); - // TODO: uncomment when supported - // pl->set("Equil", false, "Whether to equilibrate the system before solve"); + // Equillbration + pl->set("Equil", false, "Whether to equilibrate the system before solve"); // TODO: uncomment when supported // setStringToIntegralParameter("IterRefine", "NOREFINE", From a72563ad7881c971e8edeef6bc76927409785bc5 Mon Sep 17 00:00:00 2001 From: Cameron Smith Date: Tue, 19 Oct 2021 09:36:52 -0400 Subject: [PATCH 46/98] update config/config.* to build on summit downloaded latest versions from git://git.savannah.gnu.org/config.git 191bcb948f7191c36eefe634336f5fc5c0c4c2be --- packages/zoltan/config/config.guess | 1702 +++++++++-------- packages/zoltan/config/config.sub | 2630 ++++++++++++++------------- 2 files changed, 2338 insertions(+), 1994 deletions(-) diff --git a/packages/zoltan/config/config.guess b/packages/zoltan/config/config.guess index 49ba16f15c66..e81d3ae7c210 100755 --- a/packages/zoltan/config/config.guess +++ b/packages/zoltan/config/config.guess @@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. -timestamp='2012-01-01' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2021-06-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,26 +17,30 @@ timestamp='2012-01-01' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -45,7 +49,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -56,9 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -92,7 +94,8 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 +# Just in case it came from the environment. +GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires @@ -104,45 +107,90 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -154,22 +202,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -184,41 +242,80 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -232,163 +329,158 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + set_cc_for_build + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -398,44 +490,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -444,95 +536,96 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux${UNAME_RELEASE} + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux${UNAME_RELEASE} + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -543,76 +636,77 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -645,13 +739,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if test "$HP_ARCH" = hppa2.0w then - eval $set_cc_for_build + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -662,23 +756,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -703,38 +797,38 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -742,129 +836,145 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + case $UNAME_PROCESSOR in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case $UNAME_MACHINE in x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -874,168 +984,226 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) - eval $set_cc_for_build + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi + fi + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1043,12 +1211,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1058,43 +1226,43 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1102,9 +1270,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1113,223 +1281,281 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv${UNAME_RELEASE} + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; + x86_64:Haiku:*:*) + GUESS=x86_64-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi -eval $set_cc_for_build -cat >$dummy.c < "$dummy.c" < -# include +#include +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif #endif main () { @@ -1342,20 +1568,12 @@ main () #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" -#endif - ); exit (0); -#endif + "" #endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); + ); exit (0); #endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) @@ -1397,39 +1615,54 @@ main () #endif #if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); + struct utsname un; + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif #endif #if defined (alliant) && defined (i860) @@ -1440,54 +1673,46 @@ main () } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +echo "$0: unable to guess system type" >&2 -# Convex versions that predate uname can use getsysinfo(1) +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +our_year=`echo $timestamp | sed 's,-.*,,'` +thisyear=`date +%Y` +# shellcheck disable=SC2003 +script_age=`expr "$thisyear" - "$our_year"` +if test "$script_age" -lt 3 ; then + cat >&2 </dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/packages/zoltan/config/config.sub b/packages/zoltan/config/config.sub index d6b6b3c768ff..d74fb6deac94 100755 --- a/packages/zoltan/config/config.sub +++ b/packages/zoltan/config/config.sub @@ -1,38 +1,33 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. -timestamp='2012-01-01' +# shellcheck disable=SC2006,SC2268 # see below for rationale -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +timestamp='2021-08-14' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -40,7 +35,7 @@ timestamp='2012-01-01' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -57,15 +52,21 @@ timestamp='2012-01-01' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -75,9 +76,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -99,12 +98,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -120,1181 +119,1181 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -psos*) - os=-psos + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown + op50n) + cpu=hppa1.1 + vendor=oki ;; - - xscaleeb) - basic_machine=armeb-unknown + op60c) + cpu=hppa1.1 + vendor=oki ;; - - xscaleel) - basic_machine=armel-unknown + ibm*) + cpu=i370 + vendor=ibm ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 + orion105) + cpu=clipper + vendor=highlevel ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; + # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att + cpu=m68000 + vendor=att ;; 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux + cpu=we32k + vendor=att ;; bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec + cpu=powerpc + vendor=ibm + basic_os=cnk ;; decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 + cpu=pdp10 + vendor=dec + basic_os=tops10 ;; decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 + cpu=pdp10 + vendor=dec + basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon + cpu=m68k + vendor=motorola ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 ;; encore | umax | mmax) - basic_machine=ns32k-encore + cpu=ns32k + vendor=encore ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} ;; fx2800) - basic_machine=i860-alliant + cpu=i860 + vendor=alliant ;; genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 + cpu=ns32k + vendor=ns ;; h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp + cpu=m68000 + vendor=hp ;; hp9k3[2-9][0-9]) - basic_machine=m68k-hp + cpu=m68k + vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm + cpu=hppa1.0 + vendor=hp ;; i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 ;; i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 ;; i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv ;; i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} ;; iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) + cpu=mips + vendor=sgi + case $basic_os in + irix*) ;; *) - os=-irix4 + basic_os=irix4 ;; esac ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; miniframe) - basic_machine=m68000-convergent + cpu=m68000 + vendor=convergent ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint ;; news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) ;; - -ns2*) - os=-nextstep2 + ns2*) + basic_os=nextstep2 ;; *) - os=-nextstep3 + basic_os=nextstep3 ;; esac ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem + cpu=np1 + vendor=gould ;; op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k + cpu=hppa1.1 + vendor=oki + basic_os=proelf ;; pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; pbd) - basic_machine=sparc-tti + cpu=sparc + vendor=tti ;; pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + cpu=m68k + vendor=tti ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + pc532) + cpu=ns32k + vendor=pc532 ;; pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + cpu=pn + vendor=gould ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + power) + cpu=power + vendor=ibm ;; ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff + cpu=i386 + vendor=ibm ;; rm[46]00) - basic_machine=mips-siemens + cpu=mips + vendor=siemens ;; rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm + cpu=romp + vendor=ibm ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks ;; - sde) - basic_machine=mipsisa32-sde - os=-elf + tower | tower-32) + cpu=m68k + vendor=ncr ;; - sei) - basic_machine=mips-sei - os=-seiux + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu ;; - sequent) - basic_machine=i386-sequent + w65) + cpu=w65 + vendor=wdc ;; - sh) - basic_machine=sh-hitachi - os=-hms + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf ;; - sh5el) - basic_machine=sh5le-unknown + none) + cpu=none + vendor=none ;; - sh64) - basic_machine=sh64-unknown + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb | arc32 | arc64 \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | loongarch32 | loongarch64 | loongarchx32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r3 | mipsisa32r3el \ + | mipsisa32r5 | mipsisa32r5el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r3 | mipsisa64r3el \ + | mipsisa64r5 | mipsisa64r5el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | thumbv7* \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1302,203 +1301,215 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x$basic_os != x then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1511,255 +1522,362 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +kernel= +case $cpu-$vendor in score-*) - os=-elf + os=elf ;; spu-*) - os=-elf + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os=aout ;; c4x-* | tic4x-*) - os=-coff + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf ;; tic54x-*) - os=-coff + os=coff ;; tic55x-*) - os=-coff + os=coff ;; tic6x-*) - os=-coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; mep-*) - os=-elf + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 ;; - *-be) - os=-beos + pru-*) + os=elf ;; - *-haiku) - os=-haiku + *-be) + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna + os=luna ;; - *-next ) - os=-nextstep + *-next) + os=nextstep ;; *-sequent) - os=-ptx + os=ptx ;; *-crds) - os=-unos + os=unos ;; *-ns) - os=-genix + os=genix ;; i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) vendor=ibm ;; - -os400*) + s390-* | s390x-*) vendor=ibm ;; - -ptx*) + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" From 49eda37d4872d091642d42863e04ef3a6cae016e Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Tue, 19 Oct 2021 08:34:11 -0600 Subject: [PATCH 47/98] MueLu: Removing printf --- .../MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp index ded2947f9a3a..60b76d6dc427 100644 --- a/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp +++ b/packages/muelu/src/Graph/MatrixTransformation/MueLu_CoalesceDropFactory_def.hpp @@ -528,10 +528,10 @@ namespace MueLu { bool is_nonpositive = STS::real(vals[colID]) <= 0; MT aiiajj = STS::magnitude(threshold*threshold * ghostedDiagVals[col]*ghostedDiagVals[row]); // eps^2*|a_ii|*|a_jj| MT aij = is_nonpositive ? STS::magnitude(vals[colID]*vals[colID]) : (-STS::magnitude(vals[colID]*vals[colID])); // + |a_ij|^2, if a_ij < 0, - |a_ij|^2 if a_ij >=0 - + /* if(row==1326) printf("A(%d,%d) = %6.4e, raw_aij = %6.4e aij = %6.4e aiiajj = %6.4e\n",row,col,vals[colID], vals[colID],aij, aiiajj); - + */ if ((!rowIsDirichlet && aij > aiiajj) || row == col) { columns[realnnz++] = col; From d91d3fcf845d8f550253dc34fa936bdec38a2253 Mon Sep 17 00:00:00 2001 From: rstumin Date: Tue, 19 Oct 2021 13:38:56 -0600 Subject: [PATCH 48/98] new version of prolongator constraint satisfication capability --- .../MueLu_SaPFactory_decl.hpp | 4 + .../MueLu_SaPFactory_def.hpp | 324 +++++++++++++++++- 2 files changed, 327 insertions(+), 1 deletion(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_decl.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_decl.hpp index 43c926dda95f..eb6dabbad4d9 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_decl.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_decl.hpp @@ -146,6 +146,10 @@ template A, RCP& P) const; + void newSatisfyPConstraints(RCP& P) const; + + bool constrainRow(Scalar *orig, LocalOrdinal nEntries, Scalar leftBound, Scalar rghtBound,Scalar rsumTarget, Scalar *fixedUnsorted, Scalar *scalarData) const; + //@} diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp index b1480a2f065c..9a6bc42eb819 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp @@ -226,7 +226,10 @@ namespace MueLu { // finalP = Ptent + (I - \omega D^{-1}A) Ptent finalP = Xpetra::IteratorOps::Jacobi(omega, *invDiag, *A, *Ptent, finalP, GetOStream(Statistics2), std::string("MueLu::SaP-")+levelIDs, APparams); - if (enforceConstraints) SatisfyPConstraints( A, finalP); + if (enforceConstraints) { + if (A->GetFixedBlockSize() == 1) newSatisfyPConstraints( finalP); + else SatisfyPConstraints( A, finalP); + } } } else { @@ -377,6 +380,325 @@ namespace MueLu { } // for (size_t i = 0; i < as(P->getRowMap()->getNumNodeElements()); i++) ... } //SatsifyPConstraints() + template + void SaPFactory::newSatisfyPConstraints(RCP& P) const { + + const Scalar zero = Teuchos::ScalarTraits::zero(); + const Scalar one = Teuchos::ScalarTraits::one(); + + LocalOrdinal maxEntriesPerRow = 100; // increased later if needed + Teuchos::ArrayRCP scalarData(3*maxEntriesPerRow); + bool hasFeasible; + + for (size_t i = 0; i < as(P->getRowMap()->getNodeNumElements()); i++) { + + Teuchos::ArrayView indices; + Teuchos::ArrayView vals1; + Teuchos::ArrayView< Scalar> vals; + P->getLocalRowView((LocalOrdinal) i, indices, vals1); + size_t nnz = indices.size(); + if (nnz != 0) { + + vals = ArrayView(const_cast(vals1.getRawPtr()), nnz); + Scalar rsumTarget = Teuchos::ScalarTraits::zero(); + for (size_t j = 0; j < nnz; j++) rsumTarget += vals[j]; + + if (nnz > as(maxEntriesPerRow)) { + maxEntriesPerRow = nnz*3; + scalarData.resize(3*maxEntriesPerRow); + } + hasFeasible = constrainRow(vals.getRawPtr(), as(nnz), zero , one, rsumTarget, vals.getRawPtr(), scalarData.getRawPtr()); + + if (!hasFeasible) { // just set all entries to the same value giving a row sum of 1 + for (size_t j = 0; j < nnz; j++) vals[j] = one/as(nnz); + } + } + + } // for (size_t i = 0; i < as(P->getRowMap()->getNumNodeElements()); i++) ... + } //SatsifyPConstraints() + + template + bool SaPFactory::constrainRow(Scalar *orig, LocalOrdinal nEntries, Scalar leftBound, Scalar rghtBound,Scalar rsumTarget, Scalar *fixedUnsorted, Scalar *scalarData) const { +/* + Input + orig data that should be adjusted to satisfy bound constraints and + row sum constraint. orig is not modified by this function. + + nEntries length or 'orig' + + leftBound, define bound constraints for the results. + rghtBound + + rsumTarget defines an equality constraint for the row sum + + fixedUnsorted on output, if a feasible solutuion exists then + || orig - fixedUnsorted || = min when also + leftBound <= fixedUnsorted[i] <= rghtBound for all i + and sum(fixedUnsorted) = rsumTarget. + + Note: it is possible to use the same pointer for + fixedUnsorted and orig. In this case, orig gets + overwritten with the new constraint satisfying values. + + scalarData a work array that should be 3x nEntries. + + On return constrain() indicates whether or not a feasible solution exists. +*/ + +/* + Given a sequence of numbers o1 ... on, fix these so that they are as + close as possible to the original but satisfy bound constraints and also + have the same row sum as the oi's. If we know who is going to lie on a + bound, then the "best" answer (i.e., || o - f ||_2 = min) perturbs + each element that doesn't lie on a bound by the same amount. + + We can represent the oi's by considering scattered points on a number line + + | | + | | + o o o | o o o o o o |o o + | | + + \____/ \____/ + <---- <---- + delta delta + + Bounds are shown by vertical lines. The fi's must lie within the bounds, so + the 3 leftmost points must be shifted to the right and the 2 rightmost must + be shifted to the left. If these fi points are all shifted to the bounds + while the others remain in the same location, the row sum constraint is + likely not satisfied and so more shifting is necessary. In the figure, the f + rowsum is too large and so there must be more shifting to the left. + + To minimize || o - f ||_2, we basically shift all "interiors" by the same + amount, denoted delta. The only trick is that some points near bounds are + still affected by the bounds and so these points might be shifted more or less + than delta. In the example,t he 3 rightmost points are shifted in the opposite + direction as delta to the bound. The 4th point is shifted by something less + than delta so it does not violate the lower bound. The rightmost point is + shifted to the bound by some amount larger than delta. However, the 2nd point + is shifted by delta (i.e., it lies inside the two bounds). + + If we know delta, we can figure out everything. If we know which points + are special (not shifted by delta), we can also figure out everything. + The problem is these two things (delta and the special points) are + inter-connected. An algorithm for computing follows. + + 1) move exterior points to the bounds and compute how much the row sum is off + (rowSumDeviation). We assume now that the new row sum is high, so interior + points must be shifted left. + + 2) Mark closest point just left of the leftmost bound, closestToLeftBound, + and compute its distance to the leftmost bound. Mark closest point to the + left of the rightmost bound, closestToRghtBound, and compute its distance to + right bound. There are two cases to consider. + + 3) Case 1: closestToLeftBound is closer than closestToRghtBound. + Assume that shifting by delta does not move closestToLeftBound past the + left bound. This means that it will be shifted by delta. However, + closestToRghtBound will be shifted by more than delta. So the total + number of points shifted by delta (|interiorToBounds|) includes + closestToLeftBound up to and including the point just to the left of + closestToRghtBound. So + + delta = rowSumDeviation/ |interiorToBounds| . + + Recall that rowSumDeviation already accounts for the non-delta shift of + of closestToRightBound. Now check whether our assumption is valid. + + If delta <= closestToLeftBoundDist, assumption is true so delta can be + applied to interiorToBounds ... and we are done. + Else assumption is false. Shift closestToLeftBound to the left bound. + Update rowSumDeviation, interiorToBounds, and identify new + closestToLeftBound. Repeat step 3). + + Case 2: closestToRghtBound is closer than closestToLeftBound. + Assume that shifting by delta does not move closestToRghtBound past right + bound. This means that it must be shifted by more than delta to right + bound. So the total number of points shifted by delta again includes + closestToLeftBound up to and including the point just to the left of + closestToRghtBound. So again compute + + delta = rowSumDeviation/ |interiorToBounds| . + + If delta <= closestToRghtBoundDist, assumption is true so delta is + can be applied to interiorToBounds ... and we are done + Else assumption is false. Put closestToRghtBound in the + interiorToBounds set. Remove it's contribution to rowSumDeviation, + identify new closestToRghtBound. Repeat step 3) + + + To implement, sort the oi's so things like closestToLeftBound is just index + into sorted array. Updaing closestToLeftBound or closestToRghtBound requires + increment by 1. |interiorToBounds|= closestToRghtBound - closestToLeftBound + To handle the case when the rowsum is low (requiring right interior shifts), + just flip the signs on data and use the left-shift code (and then flip back + before exiting function. +*/ + bool hasFeasibleSol; + Scalar notFlippedLeftBound, notFlippedRghtBound, aBigNumber, *origSorted; + Scalar rowSumDeviation, temp, *fixedSorted, delta; + Scalar closestToLeftBoundDist, closestToRghtBoundDist; + LocalOrdinal closestToLeftBound, closestToRghtBound; + LocalOrdinal *inds; + bool flipped; + + notFlippedLeftBound = leftBound; + notFlippedRghtBound = rghtBound; + + if ((Teuchos::ScalarTraits::real(rsumTarget) >= Teuchos::ScalarTraits::real(leftBound*nEntries)) && + (Teuchos::ScalarTraits::real(rsumTarget) <= Teuchos::ScalarTraits::real(rghtBound*nEntries))) + hasFeasibleSol = true; + else { + hasFeasibleSol=false; + return hasFeasibleSol; + } + flipped = false; + // compute aBigNumber to handle some corner cases where we need + // something large so that an if statement will be false + aBigNumber = Teuchos::ScalarTraits::zero(); + for (LocalOrdinal i = 0; i < nEntries; i++) { + if ( Teuchos::ScalarTraits::magnitude(orig[i]) > aBigNumber) + aBigNumber = Teuchos::ScalarTraits::magnitude(orig[i]); + } + aBigNumber = aBigNumber+ (Teuchos::ScalarTraits::magnitude(leftBound) + Teuchos::ScalarTraits::magnitude(rghtBound))*as(100.0); + + origSorted = &scalarData[0]; + fixedSorted = &(scalarData[nEntries]); + inds = (LocalOrdinal *) &(scalarData[2*nEntries]); + + for (LocalOrdinal i = 0; i < nEntries; i++) inds[i] = i; + for (LocalOrdinal i = 0; i < nEntries; i++) origSorted[i] = orig[i]; /* orig no longer used */ + + // sort so that orig[inds] is sorted. + std::sort(inds, inds+nEntries, + [origSorted](LocalOrdinal leftIndex, LocalOrdinal rightIndex) + { return Teuchos::ScalarTraits::real(origSorted[leftIndex]) < Teuchos::ScalarTraits::real(origSorted[rightIndex]);}); + + for (LocalOrdinal i = 0; i < nEntries; i++) origSorted[i] = orig[inds[i]]; + // find entry in origSorted just to the right of the leftBound + closestToLeftBound = 0; + while ((closestToLeftBound < nEntries) && (Teuchos::ScalarTraits::real(origSorted[closestToLeftBound]) <= Teuchos::ScalarTraits::real(leftBound))) closestToLeftBound++; + + // find entry in origSorted just to the right of the rghtBound + closestToRghtBound = closestToLeftBound; + while ((closestToRghtBound < nEntries) && (Teuchos::ScalarTraits::real(origSorted[closestToRghtBound]) <= Teuchos::ScalarTraits::real(rghtBound))) closestToRghtBound++; + + // compute distance between closestToLeftBound and the left bound and the + // distance between closestToRghtBound and the right bound. + + closestToLeftBoundDist = origSorted[closestToLeftBound] - leftBound; + if (closestToRghtBound==nEntries) closestToRghtBoundDist= aBigNumber; + else closestToRghtBoundDist= origSorted[closestToRghtBound] - rghtBound; + + // compute how far the rowSum is off from the target row sum taking into account + // numbers that have been shifted to satisfy bound constraint + + rowSumDeviation = leftBound*closestToLeftBound + (nEntries-closestToRghtBound)*rghtBound - rsumTarget; + for (LocalOrdinal i=closestToLeftBound; i < closestToRghtBound; i++) rowSumDeviation += origSorted[i]; + + // the code that follow after this if statement assumes that rowSumDeviation is positive. If this + // is not the case, flip the signs of everything so that rowSumDeviation is now positive. + // Later we will flip the data back to its original form. + if (rowSumDeviation < Teuchos::ScalarTraits::zero()) { + flipped = true; + temp = leftBound; leftBound = -rghtBound; rghtBound = temp; + + /* flip sign of origSorted and reverse ordering so that the negative version is sorted */ + + if ((nEntries%2) == 1) origSorted[(nEntries/2) ] = -origSorted[(nEntries/2) ]; + for (LocalOrdinal i=0; i < nEntries/2; i++) { + temp=origSorted[i]; + origSorted[i] = -origSorted[nEntries-1-i]; + origSorted[nEntries-i-1] = -temp; + } + + /* reverse bounds */ + + temp = closestToLeftBound; + closestToLeftBound = nEntries-closestToRghtBound; + closestToRghtBound = nEntries-temp; + closestToLeftBoundDist = origSorted[closestToLeftBound] - leftBound; + if (closestToRghtBound==nEntries) closestToRghtBoundDist= aBigNumber; + else closestToRghtBoundDist= origSorted[closestToRghtBound] - rghtBound; + + rowSumDeviation = -rowSumDeviation; + } + + // initial fixedSorted so bounds are satisfied and interiors correspond to origSorted + + for (LocalOrdinal i = 0; i < closestToLeftBound; i++) fixedSorted[i] = leftBound; + for (LocalOrdinal i = closestToLeftBound; i < closestToRghtBound; i++) fixedSorted[i] = origSorted[i]; + for (LocalOrdinal i = closestToRghtBound; i < nEntries; i++) fixedSorted[i] = rghtBound; + + while ((Teuchos::ScalarTraits::magnitude(rowSumDeviation) > Teuchos::ScalarTraits::magnitude(as(1.e-10)*rsumTarget))){ // && ( (closestToLeftBound < nEntries ) || (closestToRghtBound < nEntries))) { + if (closestToRghtBound != closestToLeftBound) + delta = rowSumDeviation/ (closestToRghtBound - closestToLeftBound); + else delta = aBigNumber; + + if (Teuchos::ScalarTraits::magnitude(closestToLeftBoundDist) <= Teuchos::ScalarTraits::magnitude(closestToRghtBoundDist)) { + if (Teuchos::ScalarTraits::magnitude(delta) <= Teuchos::ScalarTraits::magnitude(closestToLeftBoundDist)) { + rowSumDeviation = Teuchos::ScalarTraits::zero(); + for (LocalOrdinal i = closestToLeftBound; i < closestToRghtBound ; i++) fixedSorted[i] = origSorted[i] - delta; + } + else { + rowSumDeviation = rowSumDeviation - closestToLeftBoundDist; + fixedSorted[closestToLeftBound] = leftBound; + closestToLeftBound++; + if (closestToLeftBound < nEntries) closestToLeftBoundDist = origSorted[closestToLeftBound] - leftBound; + else closestToLeftBoundDist = aBigNumber; + } + } + else { + if (Teuchos::ScalarTraits::magnitude(delta) <= Teuchos::ScalarTraits::magnitude(closestToRghtBoundDist)) { + rowSumDeviation = 0; + for (LocalOrdinal i = closestToLeftBound; i < closestToRghtBound ; i++) fixedSorted[i] = origSorted[i] - delta; + } + else { + rowSumDeviation = rowSumDeviation + closestToRghtBoundDist; +// if (closestToRghtBound < nEntries) { + fixedSorted[closestToRghtBound] = origSorted[closestToRghtBound]; + closestToRghtBound++; + // } + if (closestToRghtBound >= nEntries) closestToRghtBoundDist = aBigNumber; + else closestToRghtBoundDist = origSorted[closestToRghtBound] - rghtBound; + } + } + } + + if (flipped) { + /* flip sign of fixedSorted and reverse ordering so that the positve version is sorted */ + + if ((nEntries%2) == 1) fixedSorted[(nEntries/2) ] = -fixedSorted[(nEntries/2) ]; + for (LocalOrdinal i=0; i < nEntries/2; i++) { + temp=fixedSorted[i]; + fixedSorted[i] = -fixedSorted[nEntries-1-i]; + fixedSorted[nEntries-i-1] = -temp; + } + } + for (LocalOrdinal i = 0; i < nEntries; i++) fixedUnsorted[inds[i]] = fixedSorted[i]; + + /* check that no constraints are violated */ + + bool lowerViolation = false; + bool upperViolation = false; + bool sumViolation = false; + temp = Teuchos::ScalarTraits::zero(); + for (LocalOrdinal i = 0; i < nEntries; i++) { + if (Teuchos::ScalarTraits::real(fixedUnsorted[i]) < Teuchos::ScalarTraits::real(notFlippedLeftBound)) lowerViolation = true; + if (Teuchos::ScalarTraits::real(fixedUnsorted[i]) > Teuchos::ScalarTraits::real(notFlippedRghtBound)) upperViolation = true; + temp += fixedUnsorted[i]; + } + if (Teuchos::ScalarTraits::magnitude(temp - rsumTarget) > Teuchos::ScalarTraits::magnitude(as(1.0e-8)*rsumTarget)) sumViolation = true; + + TEUCHOS_TEST_FOR_EXCEPTION(lowerViolation, Exceptions::RuntimeError, "MueLu::SaPFactory::constrainRow: feasible solution but computation resulted in a lower bound violation??? "); + TEUCHOS_TEST_FOR_EXCEPTION(upperViolation, Exceptions::RuntimeError, "MueLu::SaPFactory::constrainRow: feasible solution but computation resulted in an upper bound violation??? "); + TEUCHOS_TEST_FOR_EXCEPTION(sumViolation, Exceptions::RuntimeError, "MueLu::SaPFactory::constrainRow: feasible solution but computation resulted in a row sum violation??? "); + + return hasFeasibleSol; +} + + } //namespace MueLu #endif // MUELU_SAPFACTORY_DEF_HPP From 31ff38eb0d52a12e4ba3f300633d2443ec94b0be Mon Sep 17 00:00:00 2001 From: Alan Williams Date: Tue, 19 Oct 2021 14:33:54 -0600 Subject: [PATCH 49/98] Percept changes needed for stk entity-rank changes. --- .../percept/src/adapt/CompareCoordinates.hpp | 42 +++++++++++++++++++ packages/percept/src/adapt/NodeRegistry.cpp | 32 +++++++++++--- .../src/adapt/RefinementInfoByType.cpp | 9 ++-- packages/percept/src/adapt/Refiner.cpp | 6 +-- .../src/adapt/RefinerPattern_Pyr5_Het_N.hpp | 4 +- .../src/adapt/RefinerPattern_Tet4_Tet4_N.hpp | 13 +++--- packages/percept/src/adapt/RefinerUtil.cpp | 2 +- .../src/adapt/SerializeNodeRegistry.hpp | 6 +-- packages/percept/src/adapt/TriangulateTri.hpp | 23 +++++++--- ...ormRefinerPattern_Line2_Line2_2_sierra.hpp | 4 +- ...iformRefinerPattern_Tet4_Tet4_8_sierra.hpp | 13 +++--- packages/percept/src/percept/PerceptMesh.cpp | 6 +-- packages/percept/src/percept/PerceptUtils.cpp | 4 +- .../geometry/kernel/GeometryKernelPGEOM.cpp | 4 +- .../geometry/kernel/GeometryKernelPGEOM.hpp | 6 +-- .../stk_geom/3D/FitGregoryPatchesPBGL.cpp | 11 ----- packages/percept/src/percept/norm/H1Norm.hpp | 2 + 17 files changed, 128 insertions(+), 59 deletions(-) create mode 100644 packages/percept/src/adapt/CompareCoordinates.hpp diff --git a/packages/percept/src/adapt/CompareCoordinates.hpp b/packages/percept/src/adapt/CompareCoordinates.hpp new file mode 100644 index 000000000000..7c44ac413743 --- /dev/null +++ b/packages/percept/src/adapt/CompareCoordinates.hpp @@ -0,0 +1,42 @@ +#ifndef adapt_CompareCoordinates_hpp +#define adapt_CompareCoordinates_hpp + +#include +#include + +inline bool float_less(double a, double b) +{ + return static_cast(a) < static_cast(b); +} + +inline bool is_less_than_in_x_then_y_then_z(const double * A, const double * B) +{ + if (float_less(A[0], B[0])) return true; + if (float_less(B[0], A[0])) return false; + if (float_less(A[1], B[1])) return true; + if (float_less(B[1], A[1])) return false; + if (float_less(A[2], B[2])) return true; + if (float_less(B[2], A[2])) return false; + + // How do you want to handle a tie? + return false; +} + +template +std::array get_rank_of_nodes_based_on_coordinates(std::array & node_coords) +{ + // initialize original index locations + std::array index; + std::iota(index.begin(), index.end(), 0); + + std::stable_sort(index.begin(), index.end(), + [&node_coords](size_t i1, size_t i2) {return is_less_than_in_x_then_y_then_z(node_coords[i1], node_coords[i2]);}); + + // invert indices to get node rank by coordinates + std::array rank; + for (size_t i=0; i < SIZE; ++i) + rank[index[i]] = i; + return rank; +} + +#endif diff --git a/packages/percept/src/adapt/NodeRegistry.cpp b/packages/percept/src/adapt/NodeRegistry.cpp index 60cea730238d..27987f7b13c2 100644 --- a/packages/percept/src/adapt/NodeRegistry.cpp +++ b/packages/percept/src/adapt/NodeRegistry.cpp @@ -531,7 +531,7 @@ { if (field_data[ipts]) { - for (int isp = 0; isp < fieldDim; isp++) + for (int isp = 0; isp < std::min(fieldDim,3); isp++) { c_p[isp] += field_data[ipts][isp]*spc[ipts][isp]; } @@ -1488,7 +1488,7 @@ stk::mesh::EntityRank db_rank = std::get(nodeId_elementOwnerId).rank(); stk::mesh::EntityId element_id = m_eMesh.identifier(element); - stk::mesh::EntityId element_rank = m_eMesh.entity_rank(element); + stk::mesh::EntityRank element_rank = m_eMesh.entity_rank(element); bool should_put_in_id = (element_id < db_id); bool should_put_in_rank_gt = (element_rank > db_rank); bool should_put_in_rank_gte = (element_rank >= db_rank); @@ -1560,7 +1560,7 @@ // if empty or if my id is the smallest, make this element the owner stk::mesh::EntityId db_id = std::get(nodeId_elementOwnerId).id(); - stk::mesh::EntityId db_rank = std::get(nodeId_elementOwnerId).rank(); + stk::mesh::EntityRank db_rank = std::get(nodeId_elementOwnerId).rank(); bool should_put_in_id = (m_eMesh.identifier(element) < db_id); bool should_put_in_rank_gt = (m_eMesh.entity_rank(element) > db_rank); @@ -1603,7 +1603,7 @@ stk::mesh::EntityRank db_rank = std::get(nodeId_elementOwnerId).rank(); stk::mesh::EntityId element_id = m_eMesh.identifier(element); - stk::mesh::EntityId element_rank = m_eMesh.entity_rank(element); + stk::mesh::EntityRank element_rank = m_eMesh.entity_rank(element); bool should_put_in_id = (element_id < db_id); bool should_put_in_rank_gt = (element_rank > db_rank); bool should_put_in_rank_gte = (element_rank >= db_rank); @@ -2656,9 +2656,29 @@ // set map values to new node id's unsigned inode=0; - for (SubDimCellToDataMap::iterator cell_iter = m_cell_2_data_map.begin(); cell_iter != m_cell_2_data_map.end(); ++cell_iter) + struct MySubDimCellCompare + { + bool + operator()(const SubDimCell_SDCEntityType& x, + const SubDimCell_SDCEntityType& y) const + { + MyEntityLess el = MyEntityLess(x.m_eMesh); + return std::lexicographical_compare(x.begin(), x.end(), + y.begin(), y.end(), el); + } + } mySubDimCellCompare; + + typedef std::vector SubDimCellVector; + SubDimCellVector keys; + keys.reserve(m_cell_2_data_map.size()); + for (SubDimCellToDataMap::iterator cell_iter = m_cell_2_data_map.begin(); cell_iter != m_cell_2_data_map.end(); ++cell_iter) { + keys.push_back((*cell_iter).first); + } + std::sort(keys.begin(), keys.end(), mySubDimCellCompare); + + for (SubDimCellVector::const_iterator cell_iter = keys.begin(); cell_iter != keys.end(); ++cell_iter) { - SubDimCellData& data = (*cell_iter).second; + SubDimCellData& data = m_cell_2_data_map[*cell_iter]; NodeIdsOnSubDimEntityType& nodeIds_onSE = std::get(data); if (!nodeIds_onSE.size()) continue; diff --git a/packages/percept/src/adapt/RefinementInfoByType.cpp b/packages/percept/src/adapt/RefinementInfoByType.cpp index 2beb57180679..641e9f05e39a 100644 --- a/packages/percept/src/adapt/RefinementInfoByType.cpp +++ b/packages/percept/src/adapt/RefinementInfoByType.cpp @@ -283,16 +283,15 @@ //const percept::MyPairIterRelation elem_nodes (m_eMesh, element, stk::topology::NODE_RANK); if (num_elem_marked) { - for (unsigned irank=1; irank <= ((unsigned)rank); ++irank) + for (stk::mesh::EntityRank irank=stk::topology::EDGE_RANK; irank <= rank; ++irank) { unsigned numSubDimNeededEntities = 0; - stk::mesh::EntityRank crank = (stk::mesh::EntityRank)irank; - if (irank == (unsigned)eMesh.edge_rank()) + if (irank == eMesh.edge_rank()) { numSubDimNeededEntities = cell_topo_data->edge_count; } - else if (irank == (unsigned)eMesh.side_rank()) + else if (irank == eMesh.side_rank()) { numSubDimNeededEntities = cell_topo_data->side_count; } @@ -303,7 +302,7 @@ for (unsigned iSubDimOrd = 0; iSubDimOrd < numSubDimNeededEntities; iSubDimOrd++) { - NodeIdsOnSubDimEntityType* nodeIds_onSE_ptr = nodeRegistry.getNewNodesOnSubDimEntity(element, crank, iSubDimOrd); + NodeIdsOnSubDimEntityType* nodeIds_onSE_ptr = nodeRegistry.getNewNodesOnSubDimEntity(element, irank, iSubDimOrd); if (nodeIds_onSE_ptr == 0) { continue; diff --git a/packages/percept/src/adapt/Refiner.cpp b/packages/percept/src/adapt/Refiner.cpp index 837166d67dea..aa3c0abacf3b 100644 --- a/packages/percept/src/adapt/Refiner.cpp +++ b/packages/percept/src/adapt/Refiner.cpp @@ -1552,7 +1552,7 @@ bool stk_auto= stk::mesh::is_auto_declared_part(*parts[ip]); if (stk_auto) continue; - unsigned per = parts[ip]->primary_entity_rank(); + stk::mesh::EntityRank per = parts[ip]->primary_entity_rank(); if (per == m_eMesh.side_rank()) { @@ -1934,7 +1934,7 @@ numSubDimNeededEntities = 1; } - if (needed_entity_ranks[ineed_ent].first >= new_sub_entity_nodes.size()) + if (static_cast(needed_entity_ranks[ineed_ent].first) >= new_sub_entity_nodes.size()) { throw std::logic_error("Refiner::createNewNeededNodeIds logic err #1"); } @@ -2129,7 +2129,7 @@ if (side_auto_part) continue; - unsigned per = side_parts[isp]->primary_entity_rank(); + stk::mesh::EntityRank per = side_parts[isp]->primary_entity_rank(); if (per != side_rank_iter) continue; diff --git a/packages/percept/src/adapt/RefinerPattern_Pyr5_Het_N.hpp b/packages/percept/src/adapt/RefinerPattern_Pyr5_Het_N.hpp index 30d29b100caf..89ba192d8dd9 100644 --- a/packages/percept/src/adapt/RefinerPattern_Pyr5_Het_N.hpp +++ b/packages/percept/src/adapt/RefinerPattern_Pyr5_Het_N.hpp @@ -231,7 +231,7 @@ namespace percept { std::vector new_nodes; bool useAltNode = false; - if (new_sub_entity_nodes.size() > m_primaryEntityRank && new_sub_entity_nodes[m_primaryEntityRank].size() && !new_sub_entity_nodes[m_primaryEntityRank][0].size()) + if (new_sub_entity_nodes.size() > static_cast(m_primaryEntityRank) && new_sub_entity_nodes[m_primaryEntityRank].size() && !new_sub_entity_nodes[m_primaryEntityRank][0].size()) { //throw std::runtime_error("no centroid node available"); // std::cout << " bad element: " << std::endl; @@ -527,7 +527,7 @@ namespace percept { std::vector new_nodes; bool useAltNode = false; - if (new_sub_entity_nodes.size() > m_primaryEntityRank && new_sub_entity_nodes[m_primaryEntityRank].size() && !new_sub_entity_nodes[m_primaryEntityRank][0].size()) + if (new_sub_entity_nodes.size() > static_cast(m_primaryEntityRank) && new_sub_entity_nodes[m_primaryEntityRank].size() && !new_sub_entity_nodes[m_primaryEntityRank][0].size()) { //throw std::runtime_error("no centroid node availabled"); // std::cout << " bad element: " << std::endl; diff --git a/packages/percept/src/adapt/RefinerPattern_Tet4_Tet4_N.hpp b/packages/percept/src/adapt/RefinerPattern_Tet4_Tet4_N.hpp index 2f6c461e4fd4..86b8102d4365 100644 --- a/packages/percept/src/adapt/RefinerPattern_Tet4_Tet4_N.hpp +++ b/packages/percept/src/adapt/RefinerPattern_Tet4_Tet4_N.hpp @@ -13,7 +13,7 @@ //#include "UniformRefinerPattern.hpp" #include #include - +#include #include #include @@ -226,7 +226,7 @@ // general case (now includes uniform refinement (all edges marked)) else { - double * node_coords[4]; + std::array node_coords; for (int inode=0; inode < 4; inode++) { node_coords[inode] = stk::mesh::field_data( *eMesh.get_coordinates_field() , tet_elem_nodes[inode] ); @@ -236,14 +236,15 @@ << node_coords[inode][2] << std::endl; } + const std::array node_rank = get_rank_of_nodes_based_on_coordinates(node_coords); std::vector new_tets; bool choose_best_tets = true; moab::SimplexTemplateRefiner str(choose_best_tets); str.refine_3_simplex(new_tets, edge_marks, 1, - node_coords[0], 0, eMesh.identifier(tet_elem_nodes[0]), - node_coords[1], 0, eMesh.identifier(tet_elem_nodes[1]), - node_coords[2], 0, eMesh.identifier(tet_elem_nodes[2]), - node_coords[3], 0, eMesh.identifier(tet_elem_nodes[3]) ); + node_coords[0], 0, node_rank[0], + node_coords[1], 0, node_rank[1], + node_coords[2], 0, node_rank[2], + node_coords[3], 0, node_rank[3] ); if (0) { diff --git a/packages/percept/src/adapt/RefinerUtil.cpp b/packages/percept/src/adapt/RefinerUtil.cpp index a7bb98c87c9b..7234b9e19550 100644 --- a/packages/percept/src/adapt/RefinerUtil.cpp +++ b/packages/percept/src/adapt/RefinerUtil.cpp @@ -364,7 +364,7 @@ namespace percept { } // change so all -block get removed and replaced with + only - for (unsigned irank=eMesh.side_rank(); irank <= eMesh.element_rank(); irank++) + for (stk::mesh::EntityRank irank=eMesh.side_rank(); irank <= eMesh.element_rank(); irank++) { bool found_minus = false, found_plus = false; for (unsigned ib=0; ib < blocks[irank].size(); ++ib) diff --git a/packages/percept/src/adapt/SerializeNodeRegistry.hpp b/packages/percept/src/adapt/SerializeNodeRegistry.hpp index 02e7b260030d..c0d830183702 100644 --- a/packages/percept/src/adapt/SerializeNodeRegistry.hpp +++ b/packages/percept/src/adapt/SerializeNodeRegistry.hpp @@ -1520,14 +1520,14 @@ SubDimCellToDataMap& map = nodeRegistry.getMap(); //std::cout << msg << " tmp serialize_write map size: " << map.size() << std::endl; - if (0) emitter << YAML::Anchor("NodeRegistry::map"); YAML_ERRCHECK; + //if (0) emitter << YAML::Anchor("NodeRegistry::map"); YAML_ERRCHECK; //emitter << YAML::Flow; YAML_ERRCHECK; emitter << YAML::BeginMap; YAML_ERRCHECK; // key.serialized = { nodeid_0,... : set } // value.serialized = { {new_nid0, new_nid1,...}:vector, {elem_own[rank, ele_id]:EntityKey} } - int jj=0; + //int jj=0; for (iter = map.begin(); iter != map.end(); ++iter) { const SubDimCell_SDCEntityType& subDimEntity = (*iter).first; @@ -1560,7 +1560,7 @@ emitter << YAML::Key; YAML_ERRCHECK; emitter << YAML::Flow; YAML_ERRCHECK; emitter << YAML::BeginSeq; YAML_ERRCHECK; - if (0) emitter << YAML::Anchor(std::string("seq")+std::to_string(jj++)); YAML_ERRCHECK; + //if (0) emitter << YAML::Anchor(std::string("seq")+std::to_string(jj++)); YAML_ERRCHECK; for (unsigned k=0; k < subDimEntity.size(); k++) { //std::cout << " " << subDimEntity[k]->identifier() << " "; diff --git a/packages/percept/src/adapt/TriangulateTri.hpp b/packages/percept/src/adapt/TriangulateTri.hpp index 801ac1ca4d24..a0162faf1b4e 100644 --- a/packages/percept/src/adapt/TriangulateTri.hpp +++ b/packages/percept/src/adapt/TriangulateTri.hpp @@ -11,6 +11,7 @@ #include #include +#include namespace percept { @@ -60,6 +61,13 @@ namespace percept { //const percept::MyPairIterRelation elem_nodes (m_eMesh, element,stk::topology::NODE_RANK); /NLM CoordinatesFieldType* coordField = eMesh.get_coordinates_field(); + std::array node_coords; + for (int i=0; i<3; ++i) + { + node_coords[i] = stk::mesh::field_data( *coordField , elem_nodes[i] ); + } + const std::array node_rank = get_rank_of_nodes_based_on_coordinates( node_coords ); + unsigned num_edges_marked=0; for (int iedge = 0; iedge < 3; iedge++) { @@ -137,15 +145,20 @@ namespace percept { { stk::mesh::Entity node_0 = elem_nodes[cell_topo_data->edge[iedge].node[0]]; stk::mesh::Entity node_1 = elem_nodes[cell_topo_data->edge[iedge].node[1]]; + int rank_node_0 = node_rank[cell_topo_data->edge[iedge].node[0]]; + int rank_node_1 = node_rank[cell_topo_data->edge[iedge].node[1]]; //bool reverse = false; // ensure edge_len is computed identically, independent of edge orientation - if (eMesh.identifier(node_0) > eMesh.identifier(node_1)) + if (node_rank[cell_topo_data->edge[iedge].node[0]] > node_rank[cell_topo_data->edge[iedge].node[1]]) { //reverse = true; stk::mesh::Entity node_temp = node_0; node_0 = node_1; node_1 = node_temp; + const int rank_temp = rank_node_0; + rank_node_0 = rank_node_1; + rank_node_1 = rank_temp; } double * const coord_0 = stk::mesh::field_data( *coordField , node_0 ); @@ -160,16 +173,16 @@ namespace percept { if (edge_len_squared > max_edge_length) { - id_diff_0 = eMesh.identifier(node_0); - id_diff_1 = eMesh.identifier(node_1); + id_diff_0 = rank_node_0; + id_diff_1 = rank_node_1; max_edge_length = edge_len_squared; jedge_max_edge = iedge; } // intentional floating-point comparison (tie-break) else if (edge_len_squared == max_edge_length) { - unsigned loc_id_diff_0 = eMesh.identifier(node_0); - unsigned loc_id_diff_1 = eMesh.identifier(node_1); + unsigned loc_id_diff_0 = rank_node_0; + unsigned loc_id_diff_1 = rank_node_1; bool lexical_less = false; if (loc_id_diff_0 < id_diff_0) { diff --git a/packages/percept/src/adapt/UniformRefinerPattern_Line2_Line2_2_sierra.hpp b/packages/percept/src/adapt/UniformRefinerPattern_Line2_Line2_2_sierra.hpp index 9796bb948fdb..20f656f52982 100644 --- a/packages/percept/src/adapt/UniformRefinerPattern_Line2_Line2_2_sierra.hpp +++ b/packages/percept/src/adapt/UniformRefinerPattern_Line2_Line2_2_sierra.hpp @@ -144,14 +144,14 @@ create_side_element(eMesh, use_declare_element_side, nodes, 2, newElement); stk::mesh::FieldBase * proc_rank_field_edge = m_eMesh.get_field(stk::topology::EDGE_RANK, "proc_rank_edge"); - if (proc_rank_field_edge && proc_rank_field_edge->field_array_rank() != m_eMesh.edge_rank()) + if (proc_rank_field_edge && proc_rank_field_edge->field_array_rank() != static_cast(m_eMesh.edge_rank())) { if (0) std::cout << "P[" << m_eMesh.get_rank() << "] tmp newElement.entity_rank = " << m_eMesh.entity_rank(newElement) << " proc_rank_field_edge->rank() = " << proc_rank_field_edge->field_array_rank() << " m_eMesh.edge_rank() = " << m_eMesh.edge_rank() << std::endl; } - else if (proc_rank_field_edge && proc_rank_field_edge->field_array_rank() == m_eMesh.edge_rank()) + else if (proc_rank_field_edge && proc_rank_field_edge->field_array_rank() == static_cast(m_eMesh.edge_rank())) { double *fdata =stk::mesh::field_data( *static_cast(proc_rank_field_edge) , newElement ); fdata[0] = double(eMesh.owner_rank(newElement)); diff --git a/packages/percept/src/adapt/UniformRefinerPattern_Tet4_Tet4_8_sierra.hpp b/packages/percept/src/adapt/UniformRefinerPattern_Tet4_Tet4_8_sierra.hpp index b1ed08796fb2..669a63c5ba01 100644 --- a/packages/percept/src/adapt/UniformRefinerPattern_Tet4_Tet4_8_sierra.hpp +++ b/packages/percept/src/adapt/UniformRefinerPattern_Tet4_Tet4_8_sierra.hpp @@ -13,7 +13,7 @@ //#include "UniformRefinerPattern.hpp" #include #include - +#include #include #define USE_FACE_BREAKER_T4_T4_8 1 @@ -114,7 +114,7 @@ // uniform refinement tets.resize(8); - double * node_coords[4]; + std::array node_coords; for (int inode=0; inode < 4; inode++) { node_coords[inode] = stk::mesh::field_data( *eMesh.get_coordinates_field() , tet_elem_nodes[inode] ); @@ -124,14 +124,15 @@ << node_coords[inode][2] << std::endl; } + const std::array node_rank = get_rank_of_nodes_based_on_coordinates(node_coords); std::vector new_tets; bool choose_best_tets = true; moab::SimplexTemplateRefiner str(choose_best_tets); str.refine_3_simplex(new_tets, edge_marks, 1, - node_coords[0], 0, eMesh.identifier(tet_elem_nodes[0]), - node_coords[1], 0, eMesh.identifier(tet_elem_nodes[1]), - node_coords[2], 0, eMesh.identifier(tet_elem_nodes[2]), - node_coords[3], 0, eMesh.identifier(tet_elem_nodes[3]) ); + node_coords[0], 0, node_rank[0], + node_coords[1], 0, node_rank[1], + node_coords[2], 0, node_rank[2], + node_coords[3], 0, node_rank[3] ); if (0) { diff --git a/packages/percept/src/percept/PerceptMesh.cpp b/packages/percept/src/percept/PerceptMesh.cpp index b1af440fd263..8ca87124d473 100644 --- a/packages/percept/src/percept/PerceptMesh.cpp +++ b/packages/percept/src/percept/PerceptMesh.cpp @@ -5490,11 +5490,11 @@ { bool stk_auto= stk::mesh::is_auto_declared_part(*parts[ip]); if (stk_auto) continue; - unsigned per = parts[ip]->primary_entity_rank(); + stk::mesh::EntityRank per = parts[ip]->primary_entity_rank(); if (per == element_rank()) { const CellTopologyData *const topology = this->get_cell_topology(*parts[ip]); - if (!topology || topology->dimension != per) + if (!topology || topology->dimension != static_cast(per)) { std::cout << "Warning: PerceptMesh::get_skin_part: skipping part with dimension < element_rank, part name= " << parts[ip]->name() << std::endl; continue; @@ -6158,7 +6158,7 @@ if (!data_traits.is_floating_point) continue; - unsigned field_rank = field->entity_rank(); + stk::mesh::EntityRank field_rank = field->entity_rank(); if (field_rank == stk::topology::NODE_RANK) { continue; diff --git a/packages/percept/src/percept/PerceptUtils.cpp b/packages/percept/src/percept/PerceptUtils.cpp index 253838155f59..20dab1ffee85 100644 --- a/packages/percept/src/percept/PerceptUtils.cpp +++ b/packages/percept/src/percept/PerceptUtils.cpp @@ -189,7 +189,9 @@ void convert_stk_topology_to_ioss_name( const stk::topology stk_topo, std::string& ioss_topo) { - if (stk_topo == stk::topology::LINE_2) + if (stk_topo == stk::topology::NODE) + ioss_topo = "sphere"; + else if (stk_topo == stk::topology::LINE_2) ioss_topo = "edge2"; else if (stk_topo == stk::topology::LINE_3) ioss_topo = "edge3"; diff --git a/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.cpp b/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.cpp index 3f926f90fc9a..47f218988c76 100644 --- a/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.cpp +++ b/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.cpp @@ -78,7 +78,7 @@ namespace percept { } bool get_beam_from_ids(const stk::mesh::BulkData *mesh, - std::vector edge_node_ids, stk::mesh::Entity &beam) + const std::vector& edge_node_ids, stk::mesh::Entity &beam) { std::vector edgeNodes(edge_node_ids.size()); @@ -116,7 +116,7 @@ namespace percept { } bool get_shell_from_ids(const stk::mesh::BulkData *mesh, - std::vector face_node_ids, stk::mesh::Entity &shell) + const std::vector& face_node_ids, stk::mesh::Entity &shell) { std::vector faceNodes(face_node_ids.size()); diff --git a/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.hpp b/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.hpp index 122753458e71..edef8442c18c 100644 --- a/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.hpp +++ b/packages/percept/src/percept/mesh/geometry/kernel/GeometryKernelPGEOM.hpp @@ -27,14 +27,14 @@ bool get_node_from_id(const stk::mesh::BulkData *mesh, int node_id, stk::mesh::Entity &node); bool get_beam_from_ids(const stk::mesh::BulkData *mesh, - std::vector edge_node_ids, stk::mesh::Entity &edge); + const std::vector& edge_node_ids, stk::mesh::Entity &edge); bool get_shell_from_ids(const stk::mesh::BulkData *mesh, - std::vector face_node_ids, stk::mesh::Entity &quad); + const std::vector& face_node_ids, stk::mesh::Entity &quad); // UNUSED FUNCTION WILL PROBABLY DISCARD bool get_shell_from_ids_LIBERAL(const stk::mesh::BulkData *mesh, - std::vector face_node_ids, stk::mesh::Entity &shell); + const std::vector& face_node_ids, stk::mesh::Entity &shell); bool get_hex_from_id(const stk::mesh::BulkData *mesh, int hex_id, stk::mesh::Entity &hex); diff --git a/packages/percept/src/percept/mesh/geometry/stk_geom/3D/FitGregoryPatchesPBGL.cpp b/packages/percept/src/percept/mesh/geometry/stk_geom/3D/FitGregoryPatchesPBGL.cpp index 0f1259e9252a..68b78564a12f 100644 --- a/packages/percept/src/percept/mesh/geometry/stk_geom/3D/FitGregoryPatchesPBGL.cpp +++ b/packages/percept/src/percept/mesh/geometry/stk_geom/3D/FitGregoryPatchesPBGL.cpp @@ -39,23 +39,12 @@ #endif // __INTEL_COMPILER #include -#include -#include #include #include #include -#include #include #include -#include -#include #include -#include - -#include -#include - -#include #include #if (BOOST_VERSION / 100 % 1000) > 55 diff --git a/packages/percept/src/percept/norm/H1Norm.hpp b/packages/percept/src/percept/norm/H1Norm.hpp index 19a2d58291bb..fd7656722bf2 100644 --- a/packages/percept/src/percept/norm/H1Norm.hpp +++ b/packages/percept/src/percept/norm/H1Norm.hpp @@ -151,7 +151,9 @@ //std::cout << "type= " << typeid(integrand).name() << " " << typeid(FieldFunction).name() << std::endl; if (typeid(integrand) == typeid(FieldFunction)) + { VERIFY_OP_ON(m_turboOpt, !=, TURBO_NONE, "Can't use TURBO_NONE with Norm of FieldFunction"); + } { // FIXME - make all percept code const-correct From 48770fec0596930b137559801c55f897a6b47997 Mon Sep 17 00:00:00 2001 From: Alejandro Mota Date: Tue, 19 Oct 2021 19:30:29 -0700 Subject: [PATCH 50/98] Changes to fix errors in LCM --- .../src/MiniTensor_LinearAlgebra.i.h | 32 ++++++++----------- packages/minitensor/src/MiniTensor_Tensor.i.h | 19 +++-------- .../minitensor/src/MiniTensor_Utilities.h | 12 +++++-- .../minitensor/src/MiniTensor_Utilities.i.h | 24 +++++++++----- packages/minitensor/src/MiniTensor_Vector.i.h | 8 ++--- 5 files changed, 48 insertions(+), 47 deletions(-) diff --git a/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h b/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h index 92e4aa540653..9b57ef699f94 100644 --- a/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h +++ b/packages/minitensor/src/MiniTensor_LinearAlgebra.i.h @@ -96,8 +96,6 @@ KOKKOS_INLINE_FUNCTION T norm_1(Tensor const & A) { - using KAT = Kokkos::ArithTraits; - Index const dimension = A.get_dimension(); @@ -114,7 +112,7 @@ norm_1(Tensor const & A) for (Index i = 0; i < dimension; ++i) { T t = 0.0; for (Index j = 0; j < dimension; ++j) { - t += KAT::abs(A(j, i)); + t += minitensor::abs(A(j, i)); } v(i) = t; } @@ -125,22 +123,22 @@ norm_1(Tensor const & A) break; case 3: - v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(1, 0)) + KAT::abs(A(2, 0)); - v(1) = KAT::abs(A(0, 1)) + KAT::abs(A(1, 1)) + KAT::abs(A(2, 1)); - v(2) = KAT::abs(A(0, 2)) + KAT::abs(A(1, 2)) + KAT::abs(A(2, 2)); + v(0) = minitensor::abs(A(0, 0)) + minitensor::abs(A(1, 0)) + minitensor::abs(A(2, 0)); + v(1) = minitensor::abs(A(0, 1)) + minitensor::abs(A(1, 1)) + minitensor::abs(A(2, 1)); + v(2) = minitensor::abs(A(0, 2)) + minitensor::abs(A(1, 2)) + minitensor::abs(A(2, 2)); s = max(max(v(0), v(1)), v(2)); break; case 2: - v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(1, 0)); - v(1) = KAT::abs(A(0, 1)) + KAT::abs(A(1, 1)); + v(0) = minitensor::abs(A(0, 0)) + minitensor::abs(A(1, 0)); + v(1) = minitensor::abs(A(0, 1)) + minitensor::abs(A(1, 1)); s = max(v(0), v(1)); break; case 1: - s = KAT::abs(A(0, 0)); + s = minitensor::abs(A(0, 0)); break; } @@ -156,8 +154,6 @@ KOKKOS_INLINE_FUNCTION T norm_infinity(Tensor const & A) { - using KAT = Kokkos::ArithTraits; - Index const dimension = A.get_dimension(); @@ -172,7 +168,7 @@ norm_infinity(Tensor const & A) for (Index i = 0; i < dimension; ++i) { T t = 0.0; for (Index j = 0; j < dimension; ++j) { - t += KAT::abs(A(i, j)); + t += minitensor::abs(A(i, j)); } v(i) = t; } @@ -183,22 +179,22 @@ norm_infinity(Tensor const & A) break; case 3: - v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(0, 1)) + KAT::abs(A(0, 2)); - v(1) = KAT::abs(A(1, 0)) + KAT::abs(A(1, 1)) + KAT::abs(A(1, 2)); - v(2) = KAT::abs(A(2, 0)) + KAT::abs(A(2, 1)) + KAT::abs(A(2, 2)); + v(0) = minitensor::abs(A(0, 0)) + minitensor::abs(A(0, 1)) + minitensor::abs(A(0, 2)); + v(1) = minitensor::abs(A(1, 0)) + minitensor::abs(A(1, 1)) + minitensor::abs(A(1, 2)); + v(2) = minitensor::abs(A(2, 0)) + minitensor::abs(A(2, 1)) + minitensor::abs(A(2, 2)); s = max(max(v(0), v(1)), v(2)); break; case 2: - v(0) = KAT::abs(A(0, 0)) + KAT::abs(A(0, 1)); - v(1) = KAT::abs(A(1, 0)) + KAT::abs(A(1, 1)); + v(0) = minitensor::abs(A(0, 0)) + minitensor::abs(A(0, 1)); + v(1) = minitensor::abs(A(1, 0)) + minitensor::abs(A(1, 1)); s = max(v(0), v(1)); break; case 1: - s = KAT::abs(A(0, 0)); + s = minitensor::abs(A(0, 0)); break; } diff --git a/packages/minitensor/src/MiniTensor_Tensor.i.h b/packages/minitensor/src/MiniTensor_Tensor.i.h index 97e07d3aa085..7bde2f3b1302 100644 --- a/packages/minitensor/src/MiniTensor_Tensor.i.h +++ b/packages/minitensor/src/MiniTensor_Tensor.i.h @@ -1646,32 +1646,23 @@ transpose(Tensor const & A) Tensor B = A; - auto my_swap = [&](T &a, T &b) { - T c = a; - a = b; - b = c; - }; - switch (dimension) { default: for (Index i = 0; i < dimension; ++i) { for (Index j = i + 1; j < dimension; ++j) { - my_swap(B(i, j), B(j, i)); + minitensor::swap(B(i, j), B(j, i)); } } break; case 3: - my_swap(B(0, 1), B(1, 0)); - my_swap(B(0, 2), B(2, 0)); - - my_swap(B(1, 2), B(2, 1)); - + minitensor::swap(B(0, 1), B(1, 0)); + minitensor::swap(B(0, 2), B(2, 0)); + minitensor::swap(B(1, 2), B(2, 1)); break; case 2: - my_swap(B(0, 1), B(1, 0)); - + minitensor::swap(B(0, 1), B(1, 0)); break; } diff --git a/packages/minitensor/src/MiniTensor_Utilities.h b/packages/minitensor/src/MiniTensor_Utilities.h index 7e149ba65a5f..2e6091fee574 100644 --- a/packages/minitensor/src/MiniTensor_Utilities.h +++ b/packages/minitensor/src/MiniTensor_Utilities.h @@ -49,6 +49,14 @@ namespace minitensor { +// +// abs function +// +template +KOKKOS_INLINE_FUNCTION +T +abs(T const & a); + // //swap function // @@ -63,7 +71,7 @@ swap(T & a, T & b); template KOKKOS_INLINE_FUNCTION T -max(const T & a,const T & b); +max(T const & a, T const & b); // // max function @@ -71,7 +79,7 @@ max(const T & a,const T & b); template KOKKOS_INLINE_FUNCTION T -min(const T & a,const T & b); +min(T const & a,T const & b); /// /// Sign function diff --git a/packages/minitensor/src/MiniTensor_Utilities.i.h b/packages/minitensor/src/MiniTensor_Utilities.i.h index dbdbedfe86b3..9e19785e7a5c 100644 --- a/packages/minitensor/src/MiniTensor_Utilities.i.h +++ b/packages/minitensor/src/MiniTensor_Utilities.i.h @@ -50,6 +50,17 @@ namespace minitensor { +// +// +// +template +KOKKOS_INLINE_FUNCTION +T +abs(T const & a) +{ + return a < T(0) ? -a : a; +} + // // // @@ -61,12 +72,9 @@ swap(T & a, T & b) // Guard against the same memory location. if (&a == &b) return; - // XOR algorithm - a ^= b; - b ^= a; - a ^= b; - - return; + auto const c = a; + a = b; + b = c; } // @@ -75,7 +83,7 @@ swap(T & a, T & b) template KOKKOS_INLINE_FUNCTION T -max(const T & a, const T & b) +max(T const & a, T const & b) { return a > b ? a : b; } @@ -86,7 +94,7 @@ max(const T & a, const T & b) template KOKKOS_INLINE_FUNCTION T -min(const T & a, const T & b) +min(T const & a, T const & b) { return a < b ? a : b; } diff --git a/packages/minitensor/src/MiniTensor_Vector.i.h b/packages/minitensor/src/MiniTensor_Vector.i.h index ebe5e5545272..6c0ebfac6536 100644 --- a/packages/minitensor/src/MiniTensor_Vector.i.h +++ b/packages/minitensor/src/MiniTensor_Vector.i.h @@ -803,8 +803,6 @@ KOKKOS_INLINE_FUNCTION T norm_infinity(Vector const & u) { - using KAT = Kokkos::ArithTraits; - Index const dimension = u.get_dimension(); @@ -815,16 +813,16 @@ norm_infinity(Vector const & u) default: for (Index i = 0; i < dimension; ++i) { - s = max(KAT::abs(u(i)), s); + s = max(minitensor::abs(u(i)), s); } break; case 3: - s = max(max(KAT::abs(u(0)), KAT::abs(u(1))), KAT::abs(u(2))); + s = max(max(minitensor::abs(u(0)), minitensor::abs(u(1))), minitensor::abs(u(2))); break; case 2: - s = max(KAT::abs(u(0)), KAT::abs(u(1))); + s = max(minitensor::abs(u(0)), minitensor::abs(u(1))); break; } From 186a40ba6549ff196909ef8d069342ffb13a8f65 Mon Sep 17 00:00:00 2001 From: drnobleabq <44879870+drnobleabq@users.noreply.github.com> Date: Wed, 20 Oct 2021 13:22:30 -0600 Subject: [PATCH 51/98] First krino commit (#9825) * First krino commit * Floating point comparison fix and clang cleanup --- PackagesList.cmake | 1 + packages/krino/CMakeLists.txt | 13 + packages/krino/LICENSE | 30 + packages/krino/cmake/Dependencies.cmake | 8 + .../build_sierra_krino_as_Trilinos_package.sh | 108 + .../krino/cmake_install_test/load_gcc_modules | 13 + .../krino/cmake_install_test/run_cmake_krino | 52 + .../Akri_DeleteSmallElementsMain.cpp | 187 + .../delete_small_elements/CMakeLists.txt | 12 + packages/krino/krino/Apps_krino.cpp | 47 + packages/krino/krino/CMakeLists.txt | 17 + .../Akri_AdaptivityInterface.cpp | 679 +++ .../Akri_AdaptivityInterface.hpp | 36 + .../krino/adaptivity_interface/CMakeLists.txt | 19 + .../Akri_InterfaceGeometry.hpp | 79 + .../Akri_InterfaceGeometry_dummy.cpp | 3 + .../CMakeLists.txt | 18 + .../krino_lib/Akri_AdaptivityHelpers.cpp | 138 + .../krino_lib/Akri_AdaptivityHelpers.hpp | 41 + .../krino/krino_lib/Akri_AnalyticSurf.cpp | 323 ++ .../krino/krino_lib/Akri_AnalyticSurf.hpp | 186 + .../Akri_AnalyticSurfaceInterfaceGeometry.cpp | 203 + .../Akri_AnalyticSurfaceInterfaceGeometry.hpp | 111 + .../krino/krino_lib/Akri_AuxMetaData.cpp | 396 ++ .../krino/krino_lib/Akri_AuxMetaData.hpp | 180 + .../krino/krino_lib/Akri_BoundingBox.cpp | 214 + .../krino/krino_lib/Akri_BoundingBox.hpp | 212 + .../krino/krino_lib/Akri_BoundingBoxMesh.cpp | 697 ++++ .../krino/krino_lib/Akri_BoundingBoxMesh.hpp | 157 + .../krino_lib/Akri_CDFEM_Parent_Edge.cpp | 636 +++ .../krino_lib/Akri_CDFEM_Parent_Edge.hpp | 137 + .../krino_lib/Akri_CDFEM_Parent_Edges.cpp | 492 +++ .../krino_lib/Akri_CDFEM_Parent_Edges.hpp | 86 + .../krino/krino_lib/Akri_CDFEM_Snapper.hpp | 31 + .../krino/krino_lib/Akri_CDFEM_Support.cpp | 364 ++ .../krino/krino_lib/Akri_CDFEM_Support.hpp | 259 ++ .../krino/krino/krino_lib/Akri_CDMesh.cpp | 3689 +++++++++++++++++ .../krino/krino/krino_lib/Akri_CDMesh.hpp | 333 ++ .../krino/krino_lib/Akri_CDMesh_Debug.cpp | 229 + .../krino/krino_lib/Akri_CDMesh_Debug.hpp | 20 + .../krino_lib/Akri_CDMesh_Refinement.cpp | 367 ++ .../krino_lib/Akri_CDMesh_Refinement.hpp | 31 + .../krino/krino_lib/Akri_CDMesh_Utils.cpp | 143 + .../krino/krino_lib/Akri_CDMesh_Utils.hpp | 34 + .../krino_lib/Akri_Composite_Surface.cpp | 108 + .../krino_lib/Akri_Composite_Surface.hpp | 64 + .../Akri_Compute_Surface_Distance.cpp | 122 + .../Akri_Compute_Surface_Distance.hpp | 42 + .../krino/krino_lib/Akri_ContourElement.cpp | 556 +++ .../krino/krino_lib/Akri_ContourElement.hpp | 130 + .../krino_lib/Akri_ContourSubElement.cpp | 2565 ++++++++++++ .../krino_lib/Akri_ContourSubElement.hpp | 311 ++ .../krino/krino_lib/Akri_Cutting_Surface.cpp | 170 + .../krino/krino_lib/Akri_Cutting_Surface.hpp | 81 + .../Akri_DecompositionHasChanged.cpp | 302 ++ .../Akri_DecompositionHasChanged.hpp | 25 + .../krino/krino/krino_lib/Akri_DiagWriter.cpp | 54 + .../krino/krino/krino_lib/Akri_DiagWriter.hpp | 63 + .../krino/krino_lib/Akri_DiagWriter_fwd.hpp | 37 + .../krino/krino_lib/Akri_DistanceSweeper.cpp | 177 + .../krino/krino_lib/Akri_DistanceSweeper.hpp | 22 + .../krino/krino/krino_lib/Akri_Element.cpp | 1077 +++++ .../krino/krino/krino_lib/Akri_Element.hpp | 207 + .../krino_lib/Akri_ElementCutterUtils.cpp | 184 + .../krino_lib/Akri_ElementCutterUtils.hpp | 37 + .../krino/krino_lib/Akri_Element_Cutter.cpp | 1064 +++++ .../krino/krino_lib/Akri_Element_Cutter.hpp | 132 + .../krino_lib/Akri_Element_Intersections.cpp | 28 + .../krino_lib/Akri_Element_Intersections.hpp | 34 + .../krino/krino_lib/Akri_EntityIdPool.cpp | 92 + .../krino/krino_lib/Akri_EntityIdPool.hpp | 39 + packages/krino/krino/krino_lib/Akri_Facet.cpp | 197 + packages/krino/krino/krino_lib/Akri_Facet.hpp | 158 + .../krino/krino_lib/Akri_Faceted_Surface.cpp | 494 +++ .../krino/krino_lib/Akri_Faceted_Surface.hpp | 69 + .../krino/krino_lib/Akri_Fast_Marching.cpp | 726 ++++ .../krino/krino_lib/Akri_Fast_Marching.hpp | 104 + .../krino/krino/krino_lib/Akri_FieldRef.cpp | 54 + .../krino/krino/krino_lib/Akri_FieldRef.hpp | 168 + .../krino/krino/krino_lib/Akri_IC_Alg.cpp | 225 + .../krino/krino/krino_lib/Akri_IC_Alg.hpp | 55 + .../krino/krino_lib/Akri_IC_Calculator.cpp | 100 + .../krino/krino_lib/Akri_IC_Calculator.hpp | 53 + .../krino/krino/krino_lib/Akri_IO_Helpers.cpp | 101 + .../krino/krino/krino_lib/Akri_IO_Helpers.hpp | 66 + .../krino/krino_lib/Akri_InterfaceID.hpp | 98 + .../Akri_Interface_Name_Generator.hpp | 71 + .../krino_lib/Akri_Intersection_Points.cpp | 267 ++ .../krino_lib/Akri_Intersection_Points.hpp | 75 + .../krino/krino/krino_lib/Akri_LevelSet.cpp | 1822 ++++++++ .../krino/krino/krino_lib/Akri_LevelSet.hpp | 339 ++ .../Akri_LevelSetInterfaceGeometry.cpp | 931 +++++ .../Akri_LevelSetInterfaceGeometry.hpp | 122 + .../krino_lib/Akri_LevelSet_Identifier.hpp | 37 + .../krino/krino_lib/Akri_LowerEnvelope.cpp | 317 ++ .../krino/krino_lib/Akri_LowerEnvelope.hpp | 120 + .../Akri_MasterElementDeterminer.cpp | 105 + .../Akri_MasterElementDeterminer.hpp | 30 + .../krino/krino/krino_lib/Akri_MathUtil.cpp | 233 ++ .../krino/krino/krino_lib/Akri_MathUtil.hpp | 35 + .../krino/krino/krino_lib/Akri_MeshClone.cpp | 629 +++ .../krino/krino/krino_lib/Akri_MeshClone.hpp | 67 + .../krino/krino_lib/Akri_MeshDiagnostics.cpp | 70 + .../krino/krino_lib/Akri_MeshDiagnostics.hpp | 23 + .../krino/krino_lib/Akri_MeshHelpers.cpp | 2560 ++++++++++++ .../krino/krino_lib/Akri_MeshHelpers.hpp | 182 + .../krino/krino_lib/Akri_MeshInputOptions.cpp | 52 + .../krino/krino_lib/Akri_MeshInputOptions.hpp | 112 + .../krino/krino_lib/Akri_MeshSurface.cpp | 1019 +++++ .../krino/krino_lib/Akri_MeshSurface.hpp | 177 + .../krino/krino_lib/Akri_MortonIndex.hpp | 58 + .../krino_lib/Akri_NodeToCapturedDomains.cpp | 121 + .../krino_lib/Akri_NodeToCapturedDomains.hpp | 31 + .../krino/krino_lib/Akri_OrderedIdPair.hpp | 50 + .../krino_lib/Akri_ParallelCommHelpers.hpp | 77 + .../krino_lib/Akri_ParallelErrorMessage.cpp | 30 + .../krino_lib/Akri_ParallelErrorMessage.hpp | 43 + .../krino_lib/Akri_ParentsToChildMapper.cpp | 188 + .../krino_lib/Akri_ParentsToChildMapper.hpp | 78 + .../krino/krino/krino_lib/Akri_PhaseTag.cpp | 112 + .../krino/krino/krino_lib/Akri_PhaseTag.hpp | 171 + .../krino/krino_lib/Akri_Phase_Support.cpp | 961 +++++ .../krino/krino_lib/Akri_Phase_Support.hpp | 212 + packages/krino/krino/krino_lib/Akri_Plane.hpp | 20 + .../krino_lib/Akri_Plane_Intersections.cpp | 144 + .../krino_lib/Akri_Plane_Intersections.hpp | 31 + .../krino/krino_lib/Akri_ProlongationData.cpp | 659 +++ .../krino/krino_lib/Akri_ProlongationData.hpp | 139 + .../krino/krino_lib/Akri_QualityMetric.cpp | 127 + .../krino/krino_lib/Akri_QualityMetric.hpp | 76 + .../krino/krino_lib/Akri_RegionInterface.cpp | 15 + .../krino/krino_lib/Akri_RegionInterface.hpp | 65 + .../krino/krino_lib/Akri_ReportHandler.hpp | 21 + .../krino/krino/krino_lib/Akri_SearchTree.cpp | 257 ++ .../krino/krino/krino_lib/Akri_SearchTree.hpp | 119 + .../krino/krino/krino_lib/Akri_Segment.hpp | 83 + packages/krino/krino/krino_lib/Akri_Snap.cpp | 633 +++ packages/krino/krino/krino_lib/Akri_Snap.hpp | 35 + .../Akri_SnapIndependentSetFinder.hpp | 34 + .../krino/krino/krino_lib/Akri_SnapInfo.cpp | 71 + .../krino/krino/krino_lib/Akri_SnapInfo.hpp | 87 + .../krino/krino/krino_lib/Akri_SnapToNode.cpp | 59 + .../krino/krino/krino_lib/Akri_SnapToNode.hpp | 26 + .../krino/krino/krino_lib/Akri_SubElement.cpp | 2833 +++++++++++++ .../krino/krino/krino_lib/Akri_SubElement.hpp | 431 ++ .../Akri_SubElementChildNodeAncestry.cpp | 246 ++ .../Akri_SubElementChildNodeAncestry.hpp | 49 + .../krino_lib/Akri_SubElementNodeAncestry.cpp | 32 + .../krino_lib/Akri_SubElementNodeAncestry.hpp | 65 + .../krino/krino/krino_lib/Akri_Surface.cpp | 28 + .../krino/krino/krino_lib/Akri_Surface.hpp | 98 + .../krino/krino_lib/Akri_Transformation.cpp | 112 + .../krino/krino_lib/Akri_Transformation.hpp | 65 + .../krino/krino/krino_lib/Akri_Triangle.hpp | 169 + .../krino/krino/krino_lib/Akri_TypeDefs.hpp | 27 + .../krino/krino/krino_lib/Akri_Utility.hpp | 66 + packages/krino/krino/krino_lib/Akri_Vec.cpp | 38 + packages/krino/krino/krino_lib/Akri_Vec.hpp | 26 + packages/krino/krino/krino_lib/CMakeLists.txt | 19 + .../master_element/Akri_MasterElement.hpp | 21 + .../Akri_MasterElementBasis.hpp | 701 ++++ .../master_element/Akri_MasterElementCalc.cpp | 456 ++ .../master_element/Akri_MasterElementCalc.hpp | 122 + .../Akri_MasterElementHybrid.cpp | 181 + .../Akri_MasterElementHybrid.hpp | 137 + .../Akri_MasterElementIntrepid.cpp | 287 ++ .../Akri_MasterElementIntrepid.hpp | 135 + .../krino/krino/master_element/CMakeLists.txt | 19 + .../parser/Akri_CDFEM_Options_Parser.cpp | 139 + .../parser/Akri_CDFEM_Options_Parser.hpp | 21 + .../krino/krino/parser/Akri_IC_Parser.cpp | 457 ++ .../krino/krino/parser/Akri_IC_Parser.hpp | 21 + .../krino/parser/Akri_LevelSet_Parser.cpp | 167 + .../krino/parser/Akri_LevelSet_Parser.hpp | 21 + .../krino/parser/Akri_MeshInput_Parser.cpp | 181 + .../krino/parser/Akri_MeshInput_Parser.hpp | 22 + .../krino/krino/parser/Akri_Phase_Parser.cpp | 101 + .../krino/krino/parser/Akri_Phase_Parser.hpp | 22 + .../krino/krino/parser/Akri_Region_Parser.cpp | 84 + .../krino/krino/parser/Akri_Region_Parser.hpp | 21 + .../parser/Akri_ResultsOutput_Parser.cpp | 72 + .../parser/Akri_ResultsOutput_Parser.hpp | 21 + .../krino/parser/Akri_Simulation_Parser.cpp | 54 + .../krino/parser/Akri_Simulation_Parser.hpp | 20 + packages/krino/krino/parser/Akri_YAML.hpp | 48 + .../krino/krino/parser/Akri_YAML_Parser.cpp | 235 ++ .../krino/krino/parser/Akri_YAML_Parser.hpp | 60 + packages/krino/krino/parser/CMakeLists.txt | 19 + .../rebalance_utils/Akri_RebalanceUtils.cpp | 230 + .../rebalance_utils/Akri_RebalanceUtils.hpp | 46 + .../Akri_RebalanceUtils_Impl.cpp | 348 ++ .../Akri_RebalanceUtils_Impl.hpp | 44 + .../krino/rebalance_utils/CMakeLists.txt | 19 + packages/krino/krino/region/Akri_Region.cpp | 664 +++ packages/krino/krino/region/Akri_Region.hpp | 81 + .../krino/region/Akri_RegisterProduct.cpp | 30 + .../krino/region/Akri_RegisterProduct.hpp | 20 + .../region/Akri_ResultsOutputOptions.hpp | 88 + .../krino/krino/region/Akri_Simulation.cpp | 179 + .../krino/krino/region/Akri_Simulation.hpp | 68 + packages/krino/krino/region/Akri_Startup.cpp | 306 ++ packages/krino/krino/region/Akri_Startup.hpp | 36 + packages/krino/krino/region/CMakeLists.txt | 19 + .../krino/unit_tests/Akri_UnitMathUtils.cpp | 64 + .../krino/unit_tests/Akri_UnitTestUtils.cpp | 23 + .../krino/unit_tests/Akri_UnitTestUtils.hpp | 19 + .../unit_tests/Akri_Unit_Analytic_CDMesh.cpp | 276 ++ .../Akri_Unit_CDFEM_Parent_Edge.cpp | 782 ++++ .../krino/unit_tests/Akri_Unit_CDMesh.cpp | 3092 ++++++++++++++ .../unit_tests/Akri_Unit_ContourElement.cpp | 83 + .../krino/unit_tests/Akri_Unit_Element.cpp | 718 ++++ .../unit_tests/Akri_Unit_Element_Cutter.cpp | 188 + .../Akri_Unit_Explicit_Hamilton_Jacobi.cpp | 903 ++++ .../krino/unit_tests/Akri_Unit_Geometry.cpp | 444 ++ .../unit_tests/Akri_Unit_LogRedirecter.cpp | 27 + .../unit_tests/Akri_Unit_LogRedirecter.hpp | 32 + .../unit_tests/Akri_Unit_LowerEnvelope.cpp | 260 ++ .../unit_tests/Akri_Unit_MeshHelpers.cpp | 278 ++ .../unit_tests/Akri_Unit_MeshHelpers.hpp | 24 + .../unit_tests/Akri_Unit_MortonIndex.cpp | 52 + .../Akri_Unit_ParallelErrorMessage.cpp | 42 + .../Akri_Unit_Part_Decomposition_Fixture.cpp | 197 + .../Akri_Unit_Part_Decomposition_Fixture.hpp | 75 + .../unit_tests/Akri_Unit_Phase_Support.cpp | 231 ++ .../unit_tests/Akri_Unit_RebalanceUtils.cpp | 446 ++ .../Akri_Unit_Single_Element_Fixtures.cpp | 136 + .../Akri_Unit_Single_Element_Fixtures.hpp | 79 + .../krino/krino/unit_tests/Akri_Unit_main.cpp | 32 + .../krino/krino/unit_tests/CMakeLists.txt | 14 + .../stk_emend/independent_set/CMakeLists.txt | 10 + .../independent_set/IndependentSetDummy.cpp | 3 + 231 files changed, 54507 insertions(+) create mode 100644 packages/krino/CMakeLists.txt create mode 100644 packages/krino/LICENSE create mode 100644 packages/krino/cmake/Dependencies.cmake create mode 100755 packages/krino/cmake_install_test/build_sierra_krino_as_Trilinos_package.sh create mode 100644 packages/krino/cmake_install_test/load_gcc_modules create mode 100755 packages/krino/cmake_install_test/run_cmake_krino create mode 100644 packages/krino/delete_small_elements/Akri_DeleteSmallElementsMain.cpp create mode 100644 packages/krino/delete_small_elements/CMakeLists.txt create mode 100644 packages/krino/krino/Apps_krino.cpp create mode 100644 packages/krino/krino/CMakeLists.txt create mode 100644 packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.cpp create mode 100644 packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.hpp create mode 100644 packages/krino/krino/adaptivity_interface/CMakeLists.txt create mode 100644 packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry.hpp create mode 100644 packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry_dummy.cpp create mode 100644 packages/krino/krino/interface_geometry_interface/CMakeLists.txt create mode 100644 packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_AnalyticSurf.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_AnalyticSurf.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_AuxMetaData.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_AuxMetaData.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_BoundingBox.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_BoundingBox.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Snapper.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Support.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDFEM_Support.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Debug.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Debug.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Utils.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_CDMesh_Utils.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Composite_Surface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Composite_Surface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ContourElement.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ContourElement.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ContourSubElement.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ContourSubElement.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Cutting_Surface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Cutting_Surface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_DiagWriter.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_DiagWriter.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_DiagWriter_fwd.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_DistanceSweeper.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_DistanceSweeper.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ElementCutterUtils.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ElementCutterUtils.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element_Cutter.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element_Cutter.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element_Intersections.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Element_Intersections.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_EntityIdPool.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_EntityIdPool.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Facet.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Facet.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Faceted_Surface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Faceted_Surface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Fast_Marching.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Fast_Marching.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_FieldRef.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_FieldRef.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_IC_Alg.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_IC_Alg.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_IC_Calculator.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_IC_Calculator.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_IO_Helpers.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_IO_Helpers.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_InterfaceID.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Interface_Name_Generator.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Intersection_Points.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Intersection_Points.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_LevelSet.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_LevelSet.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_LevelSet_Identifier.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_LowerEnvelope.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_LowerEnvelope.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MathUtil.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MathUtil.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshClone.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshClone.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshDiagnostics.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshDiagnostics.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshHelpers.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshHelpers.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshInputOptions.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshInputOptions.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshSurface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_MeshSurface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_MortonIndex.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_OrderedIdPair.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ParallelCommHelpers.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ParentsToChildMapper.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ParentsToChildMapper.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_PhaseTag.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_PhaseTag.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Phase_Support.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Phase_Support.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Plane.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Plane_Intersections.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Plane_Intersections.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ProlongationData.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_ProlongationData.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_QualityMetric.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_QualityMetric.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_RegionInterface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_RegionInterface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_ReportHandler.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SearchTree.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SearchTree.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Segment.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Snap.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Snap.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SnapIndependentSetFinder.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SnapInfo.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SnapInfo.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SnapToNode.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SnapToNode.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElement.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElement.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Surface.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Surface.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Transformation.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Transformation.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Triangle.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_TypeDefs.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Utility.hpp create mode 100644 packages/krino/krino/krino_lib/Akri_Vec.cpp create mode 100644 packages/krino/krino/krino_lib/Akri_Vec.hpp create mode 100644 packages/krino/krino/krino_lib/CMakeLists.txt create mode 100644 packages/krino/krino/master_element/Akri_MasterElement.hpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementBasis.hpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementCalc.cpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementCalc.hpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementHybrid.cpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementHybrid.hpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementIntrepid.cpp create mode 100644 packages/krino/krino/master_element/Akri_MasterElementIntrepid.hpp create mode 100644 packages/krino/krino/master_element/CMakeLists.txt create mode 100644 packages/krino/krino/parser/Akri_CDFEM_Options_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_CDFEM_Options_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_IC_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_IC_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_LevelSet_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_LevelSet_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_MeshInput_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_MeshInput_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_Phase_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_Phase_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_Region_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_Region_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_ResultsOutput_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_ResultsOutput_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_Simulation_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_Simulation_Parser.hpp create mode 100644 packages/krino/krino/parser/Akri_YAML.hpp create mode 100644 packages/krino/krino/parser/Akri_YAML_Parser.cpp create mode 100644 packages/krino/krino/parser/Akri_YAML_Parser.hpp create mode 100644 packages/krino/krino/parser/CMakeLists.txt create mode 100644 packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.cpp create mode 100644 packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.hpp create mode 100644 packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.cpp create mode 100644 packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.hpp create mode 100644 packages/krino/krino/rebalance_utils/CMakeLists.txt create mode 100644 packages/krino/krino/region/Akri_Region.cpp create mode 100644 packages/krino/krino/region/Akri_Region.hpp create mode 100644 packages/krino/krino/region/Akri_RegisterProduct.cpp create mode 100644 packages/krino/krino/region/Akri_RegisterProduct.hpp create mode 100644 packages/krino/krino/region/Akri_ResultsOutputOptions.hpp create mode 100644 packages/krino/krino/region/Akri_Simulation.cpp create mode 100644 packages/krino/krino/region/Akri_Simulation.hpp create mode 100644 packages/krino/krino/region/Akri_Startup.cpp create mode 100644 packages/krino/krino/region/Akri_Startup.hpp create mode 100644 packages/krino/krino/region/CMakeLists.txt create mode 100644 packages/krino/krino/unit_tests/Akri_UnitMathUtils.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_UnitTestUtils.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_UnitTestUtils.hpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Analytic_CDMesh.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_CDFEM_Parent_Edge.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_CDMesh.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_ContourElement.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Element.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Element_Cutter.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Explicit_Hamilton_Jacobi.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Geometry.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.hpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_LowerEnvelope.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.hpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_MortonIndex.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_ParallelErrorMessage.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.hpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Phase_Support.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_RebalanceUtils.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.cpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.hpp create mode 100644 packages/krino/krino/unit_tests/Akri_Unit_main.cpp create mode 100644 packages/krino/krino/unit_tests/CMakeLists.txt create mode 100644 packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp diff --git a/PackagesList.cmake b/PackagesList.cmake index 4a44aafd4eb9..08dc43e67ae0 100644 --- a/PackagesList.cmake +++ b/PackagesList.cmake @@ -112,6 +112,7 @@ TRIBITS_REPOSITORY_DEFINE_PACKAGES( Compadre packages/compadre ST STK packages/stk PT # Depends on boost Percept packages/percept PT # Depends on boost + Krino packages/krino PT # Depends on boost SCORECapf_zoltan SCOREC/zoltan ST SCORECapf_stk SCOREC/stk ST SCORECma SCOREC/ma ST diff --git a/packages/krino/CMakeLists.txt b/packages/krino/CMakeLists.txt new file mode 100644 index 000000000000..2f2c2ab9c734 --- /dev/null +++ b/packages/krino/CMakeLists.txt @@ -0,0 +1,13 @@ + +message("Building Krino as a Trilinos package") +TRIBITS_PACKAGE(Krino) + +TRIBITS_ADD_DEBUG_OPTION() +TRIBITS_ADD_SHOW_DEPRECATED_WARNINGS_OPTION() + +if (${Trilinos_ENABLE_Krino}) + add_subdirectory(krino) + add_subdirectory(delete_small_elements) +endif() + +TRIBITS_PACKAGE_POSTPROCESS() diff --git a/packages/krino/LICENSE b/packages/krino/LICENSE new file mode 100644 index 000000000000..33d63e2fe002 --- /dev/null +++ b/packages/krino/LICENSE @@ -0,0 +1,30 @@ +Copyright 2002 - 2008, 2010, 2011 National Technology & Engineering +Solutions of Sandia, LLC (NTESS). + +Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government +retains certain rights in this software. + +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. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT HOLDER 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. diff --git a/packages/krino/cmake/Dependencies.cmake b/packages/krino/cmake/Dependencies.cmake new file mode 100644 index 000000000000..76d77c60821f --- /dev/null +++ b/packages/krino/cmake/Dependencies.cmake @@ -0,0 +1,8 @@ +SET(LIB_REQUIRED_DEP_PACKAGES SEACASIoss SEACASExodus STKBalance STKMath STKIO STKSearch STKTopology STKUtil STKTools STKEmend Percept Intrepid) +SET(LIB_OPTIONAL_DEP_PACKAGES) +SET(TEST_REQUIRED_DEP_PACKAGES Gtest STKUnit_test_utils) +SET(TEST_OPTIONAL_DEP_PACKAGES) +SET(LIB_REQUIRED_DEP_TPLS Boost) +SET(LIB_OPTIONAL_DEP_TPLS MPI yaml-cpp) +SET(TEST_REQUIRED_DEP_TPLS) +SET(TEST_OPTIONAL_DEP_TPLS) diff --git a/packages/krino/cmake_install_test/build_sierra_krino_as_Trilinos_package.sh b/packages/krino/cmake_install_test/build_sierra_krino_as_Trilinos_package.sh new file mode 100755 index 000000000000..650cc502eca4 --- /dev/null +++ b/packages/krino/cmake_install_test/build_sierra_krino_as_Trilinos_package.sh @@ -0,0 +1,108 @@ +#!/bin/sh + +function execute() { + stdbuf -o0 -e0 echo "% $@" ; + eval "$@" ; + if [ $? -ne 0 ] ; then + echo "'$@' failed."; + exit 1; + fi +} + +function cd_to_new_dir() +{ + execute rm -rf $1 + execute mkdir $1 + execute cd $1 +} + +function exit_with_message() +{ + echo $1 + exit 1 +} + +function make_and_install() +{ + make -j 16 || exit_with_message "Failed building $1" + make install || exit_with_message "Failed installing $1" +} + +function build_yaml() +{ + productName=yaml + + cd_to_new_dir ${output_dir}/${productName} + execute tar -xzf ${sierra_proj}/TPLs_src/spack/spack_tpls/yaml-cpp/*.tar.gz + cd_to_new_dir ${productName}_build + + export CC=gcc + export CXX=g++ + execute cmake -DCMAKE_BUILD_TYPE=${build_type^^} -DYAML_CPP_BUILD_TESTS=false -DCMAKE_INSTALL_PREFIX=../${productName}_install ../yaml-cpp + make_and_install $productName + unset CC + unset CXX +} + +function build_trilinos_with_krino() +{ + productName=trilinos + + trilinos_dir=${output_dir}/${productName} + if [ ! -d ${trilinos_dir} ] ; then + execute mkdir ${trilinos_dir} + fi + execute cd ${trilinos_dir} + + if [ ! -d Trilinos ] ; then + execute git clone -b develop https://github.com/trilinos/Trilinos.git Trilinos + #else + #execute cd Trilinos + #execute git checkout develop + #execute git reset --hard origin/develop + #execute git pull + #execute cd .. + fi + + if [ -d Trilinos/packages/krino ] ; then + execute rm -rf Trilinos/packages/krino; + fi + if [ ! -L Trilinos/packages/krino ] ; then + execute ln -s ${sierra_proj}/krino Trilinos/packages + fi + + rm -rf ${productName}_install + cd_to_new_dir ${productName}_build + + export TRILINOS_INSTALL_DIR=../${productName}_install + $sierra_proj/krino/cmake_install_test/run_cmake_krino + make_and_install $productName +} + +function runTests() +{ + cd $1 + ctest -j 16 || exit_with_message "$2 tests failed" + cd ../.. +} + +sierra_proj=${SIERRA_PROJ:-${PWD}} +output_dir=${OUTPUT_DIR:-${PWD}/../krino-cmake-testing} + +cuda_on_or_off=${CUDA:-OFF} +build_type=${CMAKE_BUILD_TYPE:-release} +date_suffix=`date +%F_%H-%M-%S` + +source $sierra_proj/krino/cmake_install_test/load_gcc_modules + +if [ ! -d ${output_dir} ] ; then + execute mkdir ${output_dir} +fi + +build_yaml +build_trilinos_with_krino + +#runTests morph/morph_build "Morph" +#runTests morph_and_sgm/morph_and_sgm_build "Morph and SGM" +#runTests morphWithExe/morphWithExe_build "MorphWithExe" + diff --git a/packages/krino/cmake_install_test/load_gcc_modules b/packages/krino/cmake_install_test/load_gcc_modules new file mode 100644 index 000000000000..7b57261e312e --- /dev/null +++ b/packages/krino/cmake_install_test/load_gcc_modules @@ -0,0 +1,13 @@ +#!/bin/bash + +module load cde/v2/cmake/3.19.2 +module load cde/v2/compiler/gcc/7.2.0 +module load cde/v2/gcc/7.2.0/openmpi/4.0.5 +module load cde/v2/gcc/7.2.0/netlib-lapack/3.8.0 +module load cde/v2/gcc/7.2.0/boost/1.73.0 +module load cde/v2/gcc/7.2.0/hdf5/1.10.6 +module load cde/v2/gcc/7.2.0/netcdf-c/4.7.3 +module load cde/v2/gcc/7.2.0/parallel-netcdf/1.12.1 +module load cde/v2/gcc/7.2.0/metis/5.1.0 +module load cde/v2/gcc/7.2.0/parmetis/4.0.3 + diff --git a/packages/krino/cmake_install_test/run_cmake_krino b/packages/krino/cmake_install_test/run_cmake_krino new file mode 100755 index 000000000000..9f052313e1f0 --- /dev/null +++ b/packages/krino/cmake_install_test/run_cmake_krino @@ -0,0 +1,52 @@ +#!/bin/bash + +trilinos_src_dir=${TRILINOS_DIR:-${PWD}/../Trilinos} +build_dir=${BUILD_DIR:-${PWD}} +build_type=${CMAKE_BUILD_TYPE:-release} +trilinos_install_dir=${TRILINOS_INSTALL_DIR:-${PWD}/../trilinos_install_dir} + +yaml_install_dir=${YAML_INSTALL_DIR:-${build_dir}/../../yaml/yaml_install} + +printf "\nTRILINOS_DIR=${trilinos_src_dir}\n"; +printf "BUILD_DIR=${build_dir}\n"; +printf "CMAKE_BUILD_TYPE=${build_type}\n"; +printf "TRILINOS_INSTALL_DIR=${trilinos_install_dir}\n"; +printf "YAML_INSTALL_DIR=${yaml_install_dir}\n"; +printf "\nTo change these vars, set as env vars or pass to this script like 'VAR=value run_cmake_stk'\n\n"; + +if [ ! -d ${trilinos_src_dir}/packages/seacas ] && [ ! -L ${trilinos_src_dir}/packages/seacas ] ; then + echo "Trilinos dir (${trilinos_src_dir}) doesn't have packages/seacas directory. If using a Sierra project, make a soft-link to Sierra's seacas directory."; + exit 1; +fi +if [ ! -d ${trilinos_src_dir}/packages/stk ] && [ ! -L ${trilinos_src_dir}/packages/stk ]; then + echo "Trilinos dir (${trilinos_src_dir}) doesn't have packages/stk directory. If using a Sierra project, make a soft-link to Sierra's stk directory."; + exit 1; +fi +if [ ! -d ${trilinos_src_dir}/packages/krino ] && [ ! -L ${trilinos_src_dir}/packages/krino ]; then + echo "Trilinos dir (${trilinos_src_dir}) doesn't have packages/krino directory. If using a Sierra project, make a soft-link to Sierra's krino directory."; + exit 1; +fi + +mkdir -p $trilinos_install_dir +mkdir -p $build_dir + +cd ${build_dir} + +# Cleanup old cache before we configure +rm -rf CMakeFiles CMakeCache.txt + +cmake \ +-DCMAKE_INSTALL_PREFIX=$trilinos_install_dir \ +-DCMAKE_BUILD_TYPE=${build_type^^} \ +-DKrino_ENABLE_TESTS:BOOL=ON \ +-DTrilinos_ENABLE_Krino:BOOL=ON \ +-DTrilinos_ENABLE_Fortran:BOOL=ON \ +-DTPL_ENABLE_yaml-cpp=ON \ +-Dyaml-cpp_INCLUDE_DIRS=${yaml_install_dir}/include \ +-Dyaml-cpp_LIBRARY_DIRS=${yaml_install_dir}/lib \ +-DTPL_ENABLE_Boost:BOOL=ON \ +-DTPL_ENABLE_MPI=ON \ +-DTPL_ENABLE_Pnetcdf:BOOL=ON \ +-DTPL_ENABLE_HDF5:BOOL=ON \ +${trilinos_src_dir}/ + diff --git a/packages/krino/delete_small_elements/Akri_DeleteSmallElementsMain.cpp b/packages/krino/delete_small_elements/Akri_DeleteSmallElementsMain.cpp new file mode 100644 index 000000000000..1a5fd03eaabc --- /dev/null +++ b/packages/krino/delete_small_elements/Akri_DeleteSmallElementsMain.cpp @@ -0,0 +1,187 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +struct DeleteSmallElementsInputData +{ + static constexpr const char * mDefaultString{"None"}; + std::string meshIn{mDefaultString}; + std::string meshOut{mDefaultString}; + bool blockNameSpecified{false}; + std::string blockName{mDefaultString}; + double minNodalVolume{0.0}; + bool minNodalVolumeSpecified{false}; + double minRelativeNodalVolume{-1.0}; + bool minRelativeNodalVolumeSpecified{false}; +}; + +bool read_command_line( int argc, char *argv[], DeleteSmallElementsInputData & inputData, stk::ParallelMachine comm) +{ + DeleteSmallElementsInputData defaultValues; + + const stk::CommandLineOption inmeshOption{"inmesh", "i", "Filename of input genesis mesh."}; + const stk::CommandLineOption outmeshOption{"outmesh", "o", "Filename of output genesis mesh to write."}; + + const stk::CommandLineOption minNodalVolumeOption{"min_nodal_volume", "m", "Remove all nodes and attached entities smaller than this size. Either --min_nodal_volume or --min_relative_nodal_volume can be specified, but not both."}; + const stk::CommandLineOption minRelativeNodalVolumeOption{"min_relative_nodal_volume", "r", "Remove all all nodes and attached entities smaller than this factor times the maximum element volume in the input mesh. Either --min_nodal_volume or --min_relative_nodal_volume can be specified, but not both"}; + const stk::CommandLineOption blockNameOption{"block", "b", "Confine consideration to the specified block."}; + + stk::CommandLineParserParallel commandLine(comm); + commandLine.disallow_unrecognized(); + + commandLine.add_required(inmeshOption); + commandLine.add_required(outmeshOption); + commandLine.add_optional(blockNameOption, inputData.blockName); + commandLine.add_optional(minNodalVolumeOption, inputData.minNodalVolume); + commandLine.add_optional(minRelativeNodalVolumeOption, inputData.minRelativeNodalVolume); + + + stk::CommandLineParser::ParseState state = commandLine.parse(argc, const_cast(argv)); + if(state == stk::CommandLineParser::ParseComplete) + { + inputData.meshIn = commandLine.get_option_value(inmeshOption.name); + inputData.meshOut = commandLine.get_option_value(outmeshOption.name); + + inputData.blockNameSpecified = commandLine.is_option_parsed(blockNameOption.name); + inputData.minNodalVolumeSpecified = commandLine.is_option_parsed(minNodalVolumeOption.name); + inputData.minRelativeNodalVolumeSpecified = commandLine.is_option_parsed(minRelativeNodalVolumeOption.name); + + if(inputData.blockNameSpecified) + { + inputData.blockName = commandLine.get_option_value(blockNameOption.name); + } + + if(inputData.minNodalVolumeSpecified && inputData.minRelativeNodalVolumeSpecified) + { + sierra::Env::outputP0() << "ERROR: You cannot specify both --"+minNodalVolumeOption.name+" and --"+minRelativeNodalVolumeOption.name+"." << std::endl; + state = stk::CommandLineParser::ParseError; + } + + if(inputData.minNodalVolumeSpecified) + { + inputData.minNodalVolume = commandLine.get_option_value(minNodalVolumeOption.name); + if (inputData.minNodalVolume < 0.0) + { + sierra::Env::outputP0() << "ERROR: size specified via --"+minNodalVolumeOption.name+" must be >= 0." << std::endl; + state = stk::CommandLineParser::ParseError; + } + } + + if(inputData.minRelativeNodalVolumeSpecified) + { + inputData.minRelativeNodalVolume = commandLine.get_option_value(minRelativeNodalVolumeOption.name); + if (inputData.minRelativeNodalVolume < 0.0) + { + sierra::Env::outputP0() << "ERROR: edge length ratio specified via --"+minRelativeNodalVolumeOption.name+" must be >= 0." << std::endl; + state = stk::CommandLineParser::ParseError; + } + } + } + + if(state != stk::CommandLineParser::ParseComplete) + sierra::Env::outputP0() << commandLine.get_usage() << std::endl; + + return state == stk::CommandLineParser::ParseComplete; +} + +static bool delete_small_elements(const DeleteSmallElementsInputData& inputData, + const stk::ParallelMachine comm) +{ + stk::mesh::MetaData meta; + stk::mesh::BulkData bulk(meta, comm); + + stk::io::fill_mesh_with_auto_decomp(inputData.meshIn, bulk); + + // delete infinitesimal elements + double minEdgeLength, maxEdgeLength, minElementVolume, maxElementVolume; + compute_element_quality(bulk, minEdgeLength, maxEdgeLength, minElementVolume, maxElementVolume); + sierra::Env::outputP0() << "Overall mesh size results: minEdgeLength=" << minEdgeLength << ", maxEdgeLength=" << maxEdgeLength << ", minElementVolume=" << minElementVolume << ", maxElementVolume=" << maxElementVolume << std::endl; + + stk::mesh::Selector blockSelector = meta.universal_part(); + if (inputData.blockNameSpecified) + { + stk::mesh::Part * block = meta.get_part(inputData.blockName); + if (!block) + { + sierra::Env::outputP0() << "Did not find part with name " << inputData.blockName << "." << std::endl; + return false; + } + blockSelector = *block; + } + + const double minRetainedElementVolume = inputData.minNodalVolumeSpecified ? inputData.minNodalVolume : (inputData.minRelativeNodalVolume*maxElementVolume); + if (minElementVolume < minRetainedElementVolume) + delete_all_entities_using_nodes_with_nodal_volume_below_threshold(bulk, blockSelector, minRetainedElementVolume); + else + sierra::Env::outputP0() << "All nodes already have nodal volume larger than " << minRetainedElementVolume << "." << std::endl; + + stk::io::StkMeshIoBroker io_broker; + io_broker.set_bulk_data(bulk); + size_t resultFileIndex = io_broker.create_output_mesh(inputData.meshOut, stk::io::WRITE_RESULTS); + io_broker.write_output_mesh(resultFileIndex); + + return true; +} + +static bool run_delete_small_elements(int argc, char **argv, stk::ParallelMachine comm) +{ + int proc = stk::parallel_machine_rank(comm); + if(proc != 0) + stk::EnvData::instance().m_outputP0 = &stk::EnvData::instance().m_outputNull; + + DeleteSmallElementsInputData inputData; + bool didParseOk = read_command_line(argc, argv, inputData, comm); + + bool successfullyRun{false}; + + if (didParseOk) + { + successfullyRun = delete_small_elements(inputData, comm); + + stk::parallel_machine_barrier(comm); + } + + return successfullyRun; +} + +} + +int main(int argc, char **argv) +{ + stk::ParallelMachine comm{stk::parallel_machine_init(&argc, &argv)}; + + bool successfullyRun{false}; + + try + { + successfullyRun = krino::run_delete_small_elements(argc, argv, comm); + } + catch(std::exception &e) + { + std::cerr << "Proc " << stk::parallel_machine_rank(comm) << ": " << e.what() << std::endl; + const int errorCode{-1}; + MPI_Abort(comm, errorCode); + } + + stk::parallel_machine_finalize(); + + return successfullyRun ? 0 : 1; +} diff --git a/packages/krino/delete_small_elements/CMakeLists.txt b/packages/krino/delete_small_elements/CMakeLists.txt new file mode 100644 index 000000000000..864b989c454e --- /dev/null +++ b/packages/krino/delete_small_elements/CMakeLists.txt @@ -0,0 +1,12 @@ +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +SET(SOURCES_MAIN Akri_DeleteSmallElementsMain.cpp) + +set(EXE_NAME delete_small_elements) +TRIBITS_ADD_EXECUTABLE( + ${EXE_NAME} + SOURCES ${SOURCES_MAIN} + NOEXEPREFIX INSTALLABLE + ) diff --git a/packages/krino/krino/Apps_krino.cpp b/packages/krino/krino/Apps_krino.cpp new file mode 100644 index 000000000000..dd24cd296feb --- /dev/null +++ b/packages/krino/krino/Apps_krino.cpp @@ -0,0 +1,47 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +int main( int argc, char ** argv ) +{ + krino::Startup startup(argc, argv); + + if (startup.exit_early()) { + return 0; + } + + bool is_parsing = true; + + try { + krino::YAML_Parser::parse(); + + is_parsing = false; + krino::Simulation & simulation = krino::Simulation::get(); + simulation.commit(); + simulation.initialize(); + simulation.execute(); + } + catch (std::exception &x) { + stk::diag::Trace::Preserve preserve__; + startup.handle_exception(x.what(),is_parsing); + } + catch (...) { + stk::diag::Trace::Preserve preserve__; + startup.handle_exception("Unknown",is_parsing); + } + + // call Simulation::reset() manually to make sure the associated static objects are destroyed before MPI_FINALIZE is called by ~Startup + krino::Simulation::reset(); + + // all done + return 0; +} diff --git a/packages/krino/krino/CMakeLists.txt b/packages/krino/krino/CMakeLists.txt new file mode 100644 index 000000000000..4e8c7ece3d53 --- /dev/null +++ b/packages/krino/krino/CMakeLists.txt @@ -0,0 +1,17 @@ +add_subdirectory(interface_geometry_interface) +add_subdirectory(master_element) +add_subdirectory(krino_lib) +add_subdirectory(adaptivity_interface) +add_subdirectory(region) +add_subdirectory(rebalance_utils) +add_subdirectory(parser) +add_subdirectory(unit_tests) + +SET(SOURCES_MAIN Apps_krino.cpp) + +set(EXE_NAME krino) +TRIBITS_ADD_EXECUTABLE( + ${EXE_NAME} + SOURCES ${SOURCES_MAIN} + NOEXEPREFIX NOEXESUFFIX INSTALLABLE + ) diff --git a/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.cpp b/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.cpp new file mode 100644 index 000000000000..47ea5ae3d3ed --- /dev/null +++ b/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.cpp @@ -0,0 +1,679 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +#ifdef __INTEL_COMPILER +#include // for ElementRefinePredicate +#include +#include +#include // for UniformRefiner +#include +#include +#include +#include +#include +#else +// this disables the checking of shadowed variables on GCC only +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include // for ElementRefinePredicate +#include +#include +#include // for UniformRefiner +#include +#include +#include +#include +#include +#pragma GCC diagnostic pop +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino +{ + +namespace +{ + +class HAdaptImpl +{ +public: + HAdaptImpl(stk::mesh::MetaData & meta) + : my_meta(meta), + my_active_part(nullptr), + my_root_timer(nullptr) + { + } + void setup(stk::mesh::Part & active_part, stk::diag::Timer & root_timer); + void do_adaptive_refinement(const std::string & marker_field_name); + void do_initial_uniform_refinement(const int num_levels); + +private: + void get_counts(const stk::mesh::FieldBase & marker_field, + unsigned & refinement_count, + unsigned & unrefinement_count) const; + void check_supported_element_types() const; + + stk::mesh::MetaData & my_meta; + std::unique_ptr my_pMesh; + std::unique_ptr my_adaptive_refinement_pattern; + std::unique_ptr my_element_refine_predicate; + std::unique_ptr> my_breaker; + stk::mesh::Selector my_selector; + stk::mesh::Part * my_active_part; + stk::diag::Timer * my_root_timer; +}; + +HAdaptImpl & get(stk::mesh::MetaData & meta) +{ + HAdaptImpl * hadapt = const_cast(meta.get_attribute()); + if (nullptr == hadapt) + { + hadapt = new HAdaptImpl(meta); + meta.declare_attribute_with_delete(hadapt); + } + return *hadapt; +} + +void HAdaptImpl::check_supported_element_types() const +{ + const stk::mesh::PartVector & all_parts = my_meta.get_parts(); + for (size_t i = 0; i < all_parts.size(); ++i) + { + const stk::mesh::Part & part = *all_parts[i]; + if (stk::io::is_part_io_part(part) && part.primary_entity_rank() == stk::topology::ELEMENT_RANK) + { + if ((2 == my_meta.spatial_dimension() && + part.topology() == stk::topology::TRIANGLE_3_2D) || + (3 == my_meta.spatial_dimension() && + part.topology() == stk::topology::TETRAHEDRON_4) || + part.topology() == stk::topology::PARTICLE) + { + continue; + } + ThrowErrorMsg("Elements in block " + << part.name() << " have topology " << part.topology().name() + << " which is currently not supported for adaptive refinement."); + } + } +} + +void HAdaptImpl::get_counts(const stk::mesh::FieldBase & marker_field, + unsigned & refinement_count, + unsigned & unrefinement_count) const +{ + stk::mesh::BulkData & mesh = marker_field.get_mesh(); + stk::mesh::Part & active_part = *my_active_part; + stk::mesh::Selector field_selector = stk::mesh::selectField(marker_field) & active_part & mesh.mesh_meta_data().locally_owned_part(); + + unsigned local_refinement_count = 0; + unsigned local_unrefinement_count = 0; + + const stk::mesh::BucketVector & buckets = + mesh.get_buckets(stk::topology::ELEMENT_RANK, field_selector); + + for (stk::mesh::BucketVector::const_iterator ib = buckets.begin(); ib != buckets.end(); ++ib) + { + const stk::mesh::Bucket & b = **ib; + const int length = b.size(); + + for (int i = 0; i < length; ++i) + { + stk::mesh::Entity elem = b[i]; + + const int & marker = *((int *)stk::mesh::field_data(marker_field, elem)); + if (marker < 0) + { + ++local_unrefinement_count; + } + else if (marker > 0) + { + ++local_refinement_count; + } + } + } + refinement_count = 0; + unrefinement_count = 0; + stk::all_reduce_sum( + mesh.parallel(), (int *)&local_refinement_count, (int *)&refinement_count, 1); + stk::all_reduce_sum(mesh.parallel(), + (int *)&local_unrefinement_count, + (int *)&unrefinement_count, + 1); +} + +void HAdaptImpl::setup(stk::mesh::Part & active_part, stk::diag::Timer & root_timer) +{ + /* %TRACE[ON]% */ Trace trace__( + "void HAdapt::setup(stk::mesh::Part & active_part)"); /* %TRACE% */ + + my_active_part = &active_part; + my_root_timer = &root_timer; + + static stk::diag::Timer timerAdapt_("Adapt", *my_root_timer); + static stk::diag::Timer timerSetup_("Setup", timerAdapt_); + stk::diag::TimeBlock tbTimerSetup_(timerSetup_); + + const unsigned nDim = my_meta.spatial_dimension(); + + my_pMesh = std::make_unique(&my_meta, nullptr, false); + + typedef stk::mesh::Field PerceptVector; + const stk::mesh::FieldBase & coordinates_base = *my_meta.coordinate_field(); + PerceptVector & typed_coordinates = + reinterpret_cast(const_cast(coordinates_base)); + my_pMesh->setCoordinatesField(&typed_coordinates); + + my_pMesh->register_and_set_refine_fields(); + my_pMesh->add_field_int("refine_field", stk::topology::NODE_RANK, 0); + + if (2 == nDim) + { + my_adaptive_refinement_pattern = std::make_unique(*my_pMesh); + } + else + { + my_adaptive_refinement_pattern = std::make_unique(*my_pMesh); + } + + my_pMesh->output_active_children_only(true); + my_pMesh->setProperty("Refiner_skip_side_part_fixes", "true"); +} + +namespace +{ +void limit_coarsening_to_child_elements_with_all_siblings_marked_for_coarsening_and_no_children( + percept::PerceptMesh & eMesh, + const stk::mesh::FieldBase & marker_field) +{ + const stk::mesh::BulkData & mesh = *eMesh.get_bulk_data(); + const auto & local_buckets = + mesh.get_buckets(stk::topology::ELEMENT_RANK, mesh.mesh_meta_data().locally_owned_part()); + + std::vector children; + std::vector childrenOfChild; + + // Only mark element for COARSEN if all children are marked COARSEN + for (auto && b_ptr : local_buckets) + { + for (auto && elem : *b_ptr) + { + eMesh.getChildren(elem, children, false, false); + if (!children.empty()) + { + bool all_children_marked_COARSEN = true; + for (auto && child : children) + { + int & marker = (*((int *)stk::mesh::field_data( marker_field, child ))); + + if (marker == -1) + eMesh.getChildren(child, childrenOfChild, false, false); + if (marker != -1 || !childrenOfChild.empty()) + { + all_children_marked_COARSEN = false; + break; + } + } + if (!all_children_marked_COARSEN) + { + for (auto && child : children) + { + int & marker = (*((int *)stk::mesh::field_data( marker_field, child ))); + if (marker == -1) + { + marker = 0; + } + } + } + } + } + } +} + + +void fill_percept_refine_field(percept::PerceptMesh & eMesh, + const stk::mesh::FieldBase & marker_field) +{ + limit_coarsening_to_child_elements_with_all_siblings_marked_for_coarsening_and_no_children(eMesh, marker_field); + + stk::mesh::BulkData & mesh = *eMesh.get_bulk_data(); + stk::mesh::communicate_field_data(mesh, {&marker_field}); + + stk::mesh::Part &parent_part = *mesh.mesh_meta_data().get_part("refine_inactive_elements_part_3"); + stk::mesh::FieldBase & refine_field = *eMesh.m_refine_field; + + for (auto && b_ptr : mesh.get_buckets(stk::topology::ELEMENT_RANK, stk::mesh::selectField(marker_field))) + { + const stk::mesh::Bucket & b = *b_ptr; + const bool is_parent = b.member(parent_part); + const int length = b.size(); + const unsigned marker_field_length = stk::mesh::field_scalars_per_entity(marker_field, b); + ThrowRequire(1 == stk::mesh::field_scalars_per_entity(refine_field, b)); + + int * marker = (int *)stk::mesh::field_data(marker_field, b); + int * refine = (int *)stk::mesh::field_data(refine_field, b); + if (is_parent) + { + for (int i = 0; i < length; ++i) + { + marker[i*marker_field_length] = 0; + } + } + + for (int i = 0; i < length; ++i) + { + refine[i] = marker[i*marker_field_length]; + } + } +} + +void delete_partless_faces_and_edges(stk::mesh::BulkData & mesh) +{ + std::vector entities; + std::vector relatives; + std::vector relative_ordinals; + + mesh.modification_begin(); + + for (stk::mesh::EntityRank entity_rank : {stk::topology::FACE_RANK, stk::topology::EDGE_RANK}) + { + stk::mesh::get_entities(mesh, entity_rank, entities); + + for (auto && entity : entities) + { + stk::mesh::Bucket & bucket = mesh.bucket(entity); + + const stk::mesh::PartVector & bucket_parts = bucket.supersets(); + bool bucket_has_same_rank_part = + std::find_if(bucket_parts.begin(), + bucket_parts.end(), + [&](const stk::mesh::Part * bucket_part) + { + return (bucket_part->primary_entity_rank() == bucket.entity_rank() && + !stk::mesh::is_auto_declared_part(*bucket_part)); + }) != bucket_parts.end(); + + if (!bucket_has_same_rank_part && + mesh.num_connectivity(entity, stk::topology::CONSTRAINT_RANK) == 0) + { + for (stk::mesh::EntityRank irank = stk::topology::ELEMENT_RANK; irank != entity_rank; + --irank) + { + // Previously this attempted to delete forward or backward and still the list got + // corrupted, + // so just copy into vector and delete from there. + relatives.assign(mesh.begin(entity, irank), mesh.end(entity, irank)); + relative_ordinals.assign( + mesh.begin_ordinals(entity, irank), mesh.end_ordinals(entity, irank)); + + for (size_t irel = 0; irel < relatives.size(); ++irel) + { + ThrowRequireMsg(mesh.destroy_relation(relatives[irel], entity, relative_ordinals[irel]), + "Could not destroy relation between " << mesh.entity_key(relatives[irel]) << " and " + << mesh.entity_key(entity)); + } + } + ThrowRequireMsg( + mesh.destroy_entity(entity), "Could not destroy entity " << mesh.entity_key(entity)); + } + } + } + + mesh.modification_end(); +} + +void update_active_inactive_entities(stk::mesh::BulkData & mesh, + stk::mesh::Part & active_part) +{ + const auto & meta = mesh.mesh_meta_data(); + stk::mesh::PartVector active_part_vec(1, &active_part); + stk::mesh::PartVector inactive_part_vec; + stk::mesh::Selector select_locally_owned(meta.locally_owned_part()); + stk::mesh::Selector percept_active_selector = get_refinement_active_part(meta, stk::topology::ELEMENT_RANK); + + mesh.modification_begin(); + std::vector entities; + for (stk::mesh::EntityRank entity_rank = stk::topology::NODE_RANK; + entity_rank <= stk::topology::ELEMENT_RANK; + ++entity_rank) + { + stk::mesh::get_selected_entities(select_locally_owned, mesh.buckets(entity_rank), entities); + for (auto && entity : entities) + { + if (percept_active_selector(mesh.bucket(entity))) + mesh.change_entity_parts(entity, active_part_vec, inactive_part_vec); + else + mesh.change_entity_parts(entity, inactive_part_vec, active_part_vec); + } + } + mesh.modification_end(); +} + +void +fixup_side_permutation(stk::mesh::BulkData & mesh) +{ + mesh.modification_begin(); + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + + const stk::mesh::BucketVector & buckets = mesh.buckets(stk::topology::ELEMENT_RANK); + + for (auto&& bucket_ptr : buckets) + { + for (auto&& elem : *bucket_ptr) + { + const stk::mesh::Entity* elem_sides = mesh.begin(elem, meta.side_rank()); + const unsigned num_elem_sides = mesh.num_connectivity(elem, meta.side_rank()); + + for (size_t it_side = 0; it_side < num_elem_sides; ++it_side) + { + auto relationship = determine_ordinal_and_permutation(mesh, elem, elem_sides[it_side]); + set_relation_permutation(mesh, elem, elem_sides[it_side], relationship.first, relationship.second); + } + } + } + mesh.modification_end(); +} + +} + +void HAdaptImpl::do_adaptive_refinement(const std::string & marker_field_name) +{ + /* %TRACE[ON]% */ Trace trace__( + "void HAdapt::do_adaptive_refinement(const std::string &marker_field)"); /* %TRACE% */ + + ThrowAssertMsg(my_root_timer != nullptr, "HAdapt::setup() not called."); + static stk::diag::Timer timerAdapt_("Adapt", *my_root_timer); + static stk::diag::Timer timerSetup_("Setup", timerAdapt_); + static stk::diag::Timer timerFmwkUpdating_("Update Active Part", timerAdapt_); + static stk::diag::Timer timerRefine_("Refine", timerAdapt_); + static stk::diag::Timer timerUnrefine_("Unrefine", timerAdapt_); + + stk::diag::TimeBlock tbTimerAdapt_(timerAdapt_); + + constexpr bool debug = false; + + check_supported_element_types(); + + stk::mesh::BulkData & bulk = my_meta.mesh_bulk_data(); + if (!my_pMesh->get_bulk_data()) + { + my_pMesh->set_bulk_data(&bulk); + } + + const stk::mesh::FieldBase * element_marker_field = + my_meta.get_field(stk::topology::ELEMENT_RANK, marker_field_name); + ThrowRequire(element_marker_field); + my_selector = stk::mesh::selectField(*element_marker_field); + + if (!my_breaker) + { + const double tolerance = 0.0; // not used + stk::mesh::FieldBase * refine_field = my_pMesh->m_refine_field; + my_element_refine_predicate = std::make_unique( + *my_pMesh, &my_selector, refine_field, tolerance); // Note that this stores pointer to selector so temporary is not ok + my_breaker = std::make_unique>( + *my_element_refine_predicate, *my_pMesh, *my_adaptive_refinement_pattern, nullptr, debug); + my_breaker->setRemoveOldElements(false); + my_breaker->setAlwaysInitializeNodeRegistry(false); + } + + my_breaker->initializeRefine(); + + unsigned refinement_count = 0; + unsigned unrefinement_count = 0; + + fill_percept_refine_field(*my_pMesh, *element_marker_field); + + get_counts(*element_marker_field, refinement_count, unrefinement_count); + krinolog << "Number of elements marked for refinement = " << refinement_count << "\n"; + krinolog << "Number of elements marked for unrefinement = " << unrefinement_count << stk::diag::dendl; + + const unsigned total_marked_count = refinement_count + unrefinement_count; + if (0 == total_marked_count) + { + krinolog << "Adapt: No elements marked for refinement or unrefinement. " + "Skipping adaptivity" << stk::diag::dendl; + return; + } + + delete_partless_faces_and_edges(bulk); + + { + stk::diag::TimeBlock tbTimerRefine_(timerRefine_); + my_breaker->setAlternateRootTimer(&timerRefine_); + my_breaker->setModBegEndRootTimer(&timerAdapt_); + + std::vector counts; + stk::mesh::comm_mesh_counts(bulk, counts); + + krinolog << "Adapt: before refine, mesh has " << counts[0] << " nodes, " << counts[1] + << " edges, " << counts[2] << " faces, " << counts[3] << " elements" << stk::diag::dendl; + + my_breaker->refine(); + + stk::mesh::comm_mesh_counts(bulk, counts); + + krinolog << "Adapt: after refine, mesh has " << counts[0] << " nodes, " << counts[1] + << " edges, " << counts[2] << " faces, " << counts[3] << " elements" << stk::diag::dendl; + + my_breaker->setAlternateRootTimer(0); + my_breaker->setModBegEndRootTimer(0); + } + + // update refine field to include newly created children + fill_percept_refine_field(*my_pMesh, *element_marker_field); + + { + stk::diag::TimeBlock tbTimerUnrefine_(timerUnrefine_); + my_breaker->setAlternateRootTimer(&timerUnrefine_); + my_breaker->setModBegEndRootTimer(&timerAdapt_); + my_breaker->unrefine(); + my_breaker->setAlternateRootTimer(0); + my_breaker->setModBegEndRootTimer(0); + } + + { + stk::diag::TimeBlock tbTimerRebuilding_(timerFmwkUpdating_); + // The Encore-Percept interface also called induce_nodal_unranked_superset_parts + // and topology nodeset inducer but I don't believe those are needed here. + ThrowRequireMsg(my_active_part != nullptr, "Active part not set for krino::HAdapt"); + update_active_inactive_entities(bulk, *my_active_part); + fixup_side_permutation(bulk); + } +} + +void HAdaptImpl::do_initial_uniform_refinement(const int num_levels) +{ + /* %TRACE[ON]% */ Trace trace__( + "void HAdapt::do_uniform_refinement()"); /* %TRACE% */ + + ThrowAssertMsg(my_root_timer != nullptr, "HAdapt::setup() not called."); + static stk::diag::Timer timerAdapt_("Adapt", *my_root_timer); + static stk::diag::Timer timerSetup_("Setup", timerAdapt_); + static stk::diag::Timer timerFmwkUpdating_("Update Active Part", timerAdapt_); + static stk::diag::Timer timerRefine_("Refine", timerAdapt_); + + stk::diag::TimeBlock tbTimerAdapt_(timerAdapt_); + + check_supported_element_types(); + + stk::mesh::BulkData & bulk = my_meta.mesh_bulk_data(); + if (!my_pMesh->get_bulk_data()) + { + my_pMesh->set_bulk_data(&bulk); + } + + percept::UniformRefiner urefine(*my_pMesh, *my_adaptive_refinement_pattern, nullptr); + urefine.setAlternateRootTimer(&timerAdapt_); + + { + stk::diag::TimeBlock tbTimerRefine_(timerRefine_); + + std::vector counts; + stk::mesh::comm_mesh_counts(bulk, counts); + + krinolog << "Adapt: before refine, mesh has " << counts[0] << " nodes, " << counts[1] + << " edges, " << counts[2] << " faces, " << counts[3] << " elements" << stk::diag::dendl; + + for (int level=0; level counts; + stk::mesh::comm_mesh_counts(bulk, counts); + num_initial_elements = counts[3]; + } + + const auto & meta = bulk.mesh_meta_data(); + percept::MarkerInfo markerInfo; + markerInfo.errorIndicator_ = meta.get_field(stk::topology::ELEMENT_RANK, indicator_field_name); + markerInfo.refineField_ = meta.get_field(stk::topology::ELEMENT_RANK, marker_field_name); + markerInfo.refineFieldOrig_ = meta.get_field(stk::topology::ELEMENT_RANK, "refine_field_orig"); + markerInfo.refineLevelField_ = meta.get_field(stk::topology::ELEMENT_RANK, "refine_level"); + /* + markerInfo.useMarker_ = true; + + markerInfo.numInitialElements_ = num_initial_elements; + markerInfo.maxRefinementLevel_ = max_refinement_level; + markerInfo.maxRefinementNumberOfElementsFraction_ = max_element_growth_factor; + markerInfo.debug_ = false; + + markerInfo.refineFraction_ = refine_fraction; + markerInfo.unrefineFraction_ = unrefine_fraction; + + percept::MarkerUsingErrIndFraction marker(const_cast(bulk), markerInfo); + marker.mark();*/ + + const auto & percept_parent_part = get_refinement_inactive_part(meta, stk::topology::ELEMENT_RANK); + const auto & active_buckets = + bulk.get_buckets(stk::topology::ELEMENT_RANK, + stk::mesh::selectField(*markerInfo.errorIndicator_) & + !percept_parent_part & + meta.locally_owned_part()); + const int buckets_to_sample = std::min(1000ul, active_buckets.size()); + std::vector sample_values; + sample_values.reserve(512*buckets_to_sample); + int j=0; + for(int i=0; i < buckets_to_sample; ++i) + { + const double * ind_data = field_data(*markerInfo.errorIndicator_, *active_buckets[i]); + const int size = active_buckets[i]->size(); + j += size; + sample_values.insert(sample_values.end(), ind_data, ind_data + size); + } + + // This is not scalable + std::vector global_vals; + stk::parallel_vector_concat(bulk.parallel(), sample_values, global_vals); + std::sort(global_vals.begin(), global_vals.end()); + + const auto current_active_elements = global_vals.size(); + + const double remaining_levels = max_refinement_level - current_refinement_level; + const double fraction_to_refine = + current_active_elements >= target_elem_count ? 0: + 1./12. * ( + std::pow( + static_cast(target_elem_count) / static_cast(current_active_elements), + 1./remaining_levels) + - 1.); + + const int global_fraction_index = (1.-fraction_to_refine) * current_active_elements; + const double threshold_val = global_vals[global_fraction_index]; + + for(auto && b_ptr : active_buckets) + { + const auto & bucket = *b_ptr; + const double * ind_data = field_data(*markerInfo.errorIndicator_, bucket); + int * marker_data = field_data(*markerInfo.refineField_, bucket); + const int size = bucket.size(); + for(int i=0; i < size; ++i) + { + marker_data[i] = ind_data[i] > threshold_val ? 1 : 0; + } + } +} + +} +} // namespace krino diff --git a/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.hpp b/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.hpp new file mode 100644 index 000000000000..84c5b21c340d --- /dev/null +++ b/packages/krino/krino/adaptivity_interface/Akri_AdaptivityInterface.hpp @@ -0,0 +1,36 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_ADAPTIVITYINTERFACE_H_ +#define KRINO_INCLUDE_AKRI_ADAPTIVITYINTERFACE_H_ + +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace mesh { class Part; } } +namespace stk { namespace diag { class Timer; } } + +namespace krino { + +namespace HAdapt +{ + void setup(stk::mesh::MetaData & meta, stk::mesh::Part & active_part, stk::diag::Timer & root_timer); + void do_adaptive_refinement(stk::mesh::MetaData & meta, const std::string & marker_field_name); + void do_uniform_refinement(stk::mesh::MetaData & meta, const int num_levels); + void mark_based_on_indicator_field(const stk::mesh::BulkData & bulk, + const std::string & marker_field_name, + const std::string & indicator_field_name, + const int max_refinement_level, + const int current_refinement_level, + const uint64_t target_elem_count); +} + +} // namespace krino + +#endif /* KRINO_INCLUDE_AKRI_ADAPTIVITYINTERFACE_H_ */ diff --git a/packages/krino/krino/adaptivity_interface/CMakeLists.txt b/packages/krino/krino/adaptivity_interface/CMakeLists.txt new file mode 100644 index 000000000000..6c8d3a739a32 --- /dev/null +++ b/packages/krino/krino/adaptivity_interface/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_adaptivity_interface_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + DEPLIBS krino_lib) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_adaptivity_interface_lib) + diff --git a/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry.hpp b/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry.hpp new file mode 100644 index 000000000000..2f2a3a32d69d --- /dev/null +++ b/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry.hpp @@ -0,0 +1,79 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_INTERFACEGEOMETRY_H_ +#define AKRI_INTERFACEGEOMETRY_H_ +#include +#include +#include +#include +#include +#include + +namespace krino { + +class SnapInfo; + +class ElementCutter +{ +public: + virtual ~ElementCutter() {} + virtual std::vector get_sorted_cutting_interfaces() const = 0; + virtual std::vector get_interface_signs_based_on_crossings(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains) const = 0; + virtual void fill_tetrahedron_face_interior_intersections(const std::array & faceNodes, + const InterfaceID & interface1, + const InterfaceID & interface2, + const ElementIntersectionPointFilter & intersectionPointFilter, + std::vector & intersections) const = 0; + virtual bool might_have_interior_or_face_intersections() const = 0; + virtual void fill_interior_intersections(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const = 0; + virtual std::string visualize(const stk::mesh::BulkData & mesh) const = 0; + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const = 0; + virtual double interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const = 0; + virtual int sign_at_position(const InterfaceID interface, const Vector3d & paramCoords) const = 0; + virtual int get_starting_phase_for_cutting_surfaces() const = 0; +}; + +class InterfaceGeometry { +public: + InterfaceGeometry() {} + + virtual ~InterfaceGeometry() {} + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, const NodeToCapturedDomainsMap & nodesToCapturedDomains) const = 0; + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const std::vector & elementsToIntersect, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const = 0; + + virtual std::vector get_edge_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const = 0; + + virtual void append_element_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const std::vector & elementsToIntersect, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) const = 0; + + // FIXME: Temporary methods + virtual void store_phase_for_uncut_elements(const stk::mesh::BulkData & mesh) const = 0; + virtual void store_phase_for_elements_that_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + const std::vector & independentSnapInfos, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const = 0; + + virtual const ElementToDomainMap & get_phase_for_uncut_elements() const = 0; + + virtual std::unique_ptr build_element_cutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::function &)> & intersectingPlanesDiagonalPicker) const = 0; + + virtual PhaseTag get_starting_phase(const ElementCutter * cutter) const = 0; +}; +} + +#endif // AKRI_INTERFACEGEOMETRY_H_ diff --git a/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry_dummy.cpp b/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry_dummy.cpp new file mode 100644 index 000000000000..5879b01607a9 --- /dev/null +++ b/packages/krino/krino/interface_geometry_interface/Akri_InterfaceGeometry_dummy.cpp @@ -0,0 +1,3 @@ +namespace krino { +void InterfaceGeometryDummy() {} +} diff --git a/packages/krino/krino/interface_geometry_interface/CMakeLists.txt b/packages/krino/krino/interface_geometry_interface/CMakeLists.txt new file mode 100644 index 000000000000..917ba031808d --- /dev/null +++ b/packages/krino/krino/interface_geometry_interface/CMakeLists.txt @@ -0,0 +1,18 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + interface_geometry_interface_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES}) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/interface_geometry_interface_lib) + diff --git a/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.cpp b/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.cpp new file mode 100644 index 000000000000..cd9709bd0f33 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.cpp @@ -0,0 +1,138 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino +{ + +stk::mesh::Part & get_refinement_active_part(const stk::mesh::MetaData & meta, stk::mesh::EntityRank rank) +{ + const std::string active_part_name = "refine_active_elements_part_"+std::to_string((int)rank); + stk::mesh::Part* active_part = meta.get_part(active_part_name); + ThrowRequireMsg(nullptr != active_part, "Active part not found: " << active_part_name); + return *active_part; +} +stk::mesh::Part & get_refinement_inactive_part(const stk::mesh::MetaData & meta, stk::mesh::EntityRank rank) +{ + const std::string inactive_part_name = "refine_inactive_elements_part_"+std::to_string((int)rank); + stk::mesh::Part* inactive_part = meta.get_part(inactive_part_name); + ThrowRequireMsg(nullptr != inactive_part, "Inactive part not found: " << inactive_part_name); + return *inactive_part; +} + +void filter_refinement_marker(const stk::mesh::BulkData & mesh, FieldRef elem_marker, const stk::mesh::Selector & do_not_refine_or_unrefine_selector) +{ + const auto & perceptParentPart = get_refinement_inactive_part(mesh.mesh_meta_data(), stk::topology::ELEMENT_RANK); + + for (auto && bucketPtr : mesh.get_buckets(stk::topology::ELEMENT_RANK, mesh.mesh_meta_data().locally_owned_part())) + { + int * markers = field_data(elem_marker, *bucketPtr); + const int size = bucketPtr->size(); + if (do_not_refine_or_unrefine_selector(*bucketPtr)) + { + for (int i = 0; i < size; ++i) + if (markers[i] == Refinement_Marker::REFINE || markers[i] == Refinement_Marker::COARSEN) + markers[i] = Refinement_Marker::NOTHING; + } + else if (bucketPtr->member(perceptParentPart)) + { + for (int i = 0; i < size; ++i) + if (markers[i] == Refinement_Marker::REFINE) + markers[i] = Refinement_Marker::NOTHING; + } + } +} + +stk::mesh::Selector cdfem_do_not_refine_or_unrefine_selector(const CDFEM_Support & cdfem_support) +{ + const stk::mesh::Selector parent_or_child_selector = + cdfem_support.get_child_part() | cdfem_support.get_parent_part(); + const stk::mesh::Selector decomposed_blocks_selector = + krino::Phase_Support::get(cdfem_support.get_mesh_meta()).get_all_decomposed_blocks_selector(); + const stk::mesh::Selector do_not_refine_selector = (!decomposed_blocks_selector) | parent_or_child_selector; + return do_not_refine_selector; +} + + +void perform_multilevel_adaptivity(stk::mesh::BulkData & mesh, + const std::string & marker_field_name, + const std::function & marker_function, + const std::function & adapt_function, + const stk::mesh::Selector & do_not_refine_selector) +{ + Tracespec trace__("perform_multilevel_adaptivity()"); + + const auto & aux_meta = AuxMetaData::get(mesh.mesh_meta_data()); + + const FieldRef elem_marker = aux_meta.get_field( + stk::topology::ELEMENT_RANK, marker_field_name, stk::mesh::StateNew); + + const stk::mesh::Selector active_selector = aux_meta.active_part(); + const stk::mesh::Selector locally_owned_selector = mesh.mesh_meta_data().locally_owned_part(); + + std::vector children; + + bool done = false; + int num_refinements = 0; + while (!done) + { + marker_function(marker_field_name, num_refinements); + filter_refinement_marker(mesh, elem_marker, do_not_refine_selector); + + const auto & local_buckets = mesh.get_buckets(stk::topology::ELEMENT_RANK, locally_owned_selector); + unsigned num_marked_refine = 0; + for (auto && b_ptr : local_buckets) + { + int * markers = field_data(elem_marker, *b_ptr); + for (size_t i = 0; i < b_ptr->size(); ++i) + { + if (markers[i] == Refinement_Marker::REFINE) ++num_marked_refine; + } + } + + // Only worth cost of adaptive refinement if any elements are marked for refinement + unsigned global_num_marked_refine = 0; + stk::all_reduce_sum(mesh.parallel(), &num_marked_refine, &global_num_marked_refine, 1); + if (global_num_marked_refine > 0) + { + const int debug_level = 0; + adapt_function(marker_field_name, debug_level); + + ++num_refinements; + } + else + { + done = true; + } + } + + // This probably should not be needed. + CDMesh::fixup_adapted_element_parts(mesh); + + // This probably should not be needed. + attach_sides_to_elements(mesh); +} +} diff --git a/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.hpp b/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.hpp new file mode 100644 index 000000000000..17a29e7ccafb --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AdaptivityHelpers.hpp @@ -0,0 +1,41 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_ADAPTIVITYHELPERS_H_ +#define KRINO_INCLUDE_AKRI_ADAPTIVITYHELPERS_H_ + +#include +#include +#include +#include + +namespace krino { + +class CDFEM_Support; + +stk::mesh::Part & get_refinement_active_part(const stk::mesh::MetaData & meta, stk::mesh::EntityRank rank); +stk::mesh::Part & get_refinement_inactive_part(const stk::mesh::MetaData & meta, stk::mesh::EntityRank rank); +stk::mesh::Selector cdfem_do_not_refine_or_unrefine_selector(const CDFEM_Support & cdfem_support); + +enum Refinement_Marker + { + COARSEN = -1, + NOTHING = 0, + REFINE = 1 + }; + +void +perform_multilevel_adaptivity(stk::mesh::BulkData & mesh, + const std::string & marker_field_name, + const std::function & marker_function, + const std::function & adapt_function, + const stk::mesh::Selector & do_not_refine_selector = stk::mesh::Selector()); + +} + +#endif /* KRINO_INCLUDE_AKRI_ADAPTIVITYHELPERS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_AnalyticSurf.cpp b/packages/krino/krino/krino_lib/Akri_AnalyticSurf.cpp new file mode 100644 index 000000000000..374396fb7bbf --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AnalyticSurf.cpp @@ -0,0 +1,323 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +#include + +namespace krino{ + +Cylinder::Cylinder(const std::string & n, // surface name + const double e1[3], // first endpoint of axis + const double e2[3], // second endpoint of axis + const double r, // radius of cylinder + const int sign) + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + dist_sign(sign) +{ + // initialize internal description of cylinder + radius = r; + + p1 = Vector3d(e1); + p2 = Vector3d(e2); + + xi = p2 - p1; + + length = xi.length(); + + xi.unitize(); +} + +void +Cylinder::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) +{ + if (NULL == my_transformation) + { + return; + } + + my_transformation->update(time); + my_transformation->apply(p1); + my_transformation->apply(p2); + + xi = p2 - p1; + + length = xi.length(); + + xi.unitize(); +} + +BoundingBox +Cylinder::get_bounding_box() +{ + BoundingBox bbox; + bbox.accommodate(p1); + bbox.accommodate(p2); + bbox.pad(radius); + return bbox; +} + +double +Cylinder::point_signed_distance(const Vector3d &x) const +{ + double D = std::numeric_limits::max(); + + // convert x to cylindrical coordinates + + // v is the vector from p1 to x. + Vector3d v = x - p1; + + // Xix is the projection of v along the axis of the cylinder + const double Xix = Dot(v,xi); + + // u is the associated vector + Vector3d u = Xix*xi; + + // Rx is the distance from the axis of the cylinder to x + + const double Rx = (v - u).length(); + + if ( Xix <= 0 ) + { + // x is behind the cylinder. + // The closest point on the cylinder lies on the rear circular face. + + if ( Rx <= radius ) + { + D = -Xix; + } + else + { + D = std::sqrt(Xix*Xix + (Rx-radius)*(Rx-radius)); + } + } + else if( Xix > 0 && Xix < length) + { + // x is not in front of or behind the cylinder: it is alongside the cylinder. + // the signed distance is given by Rx - radius unless this point is closer + // to one of the circular faces + + if ( Rx >= radius ) + { + D = Rx - radius; + } + else + { + D = std::max( std::max(Rx - radius, -Xix), Xix-length ); + } + } + else + { + // x is in front of the cylinder. + // The closest point on the cylinder lies on the front circular face. + + if ( Rx <= radius ) + { + D = Xix-length; + } + else + { + D = std::sqrt((Xix-length)*(Xix-length) + (Rx-radius)*(Rx-radius)); + } + } + + return dist_sign*D; +} + +Point::Point(const std::string & n, // surface name + const Vector3d & coords) + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + my_coords(coords) +{ +} + +double +Point::point_signed_distance(const Vector3d &x) const +{ + return (x-my_coords).length_squared(); +} + +BoundingBox +Point::get_bounding_box() +{ + BoundingBox bbox; + bbox.accommodate(my_coords); + return bbox; +} + +Sphere::Sphere(const std::string & n, // surface name + const Vector3d & center, + const double radius, + const int sign) + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + myDistSign(sign), + myCenter(center), + myRadius(radius) +{ +} + +void +Sphere::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) +{ + if (nullptr != my_transformation) + { + my_transformation->update(time); + my_transformation->apply(myCenter); + } +} + +BoundingBox +Sphere::get_bounding_box() +{ + return BoundingBox( + Vector3d(myCenter[0]-myRadius, myCenter[1]-myRadius, myCenter[2]-myRadius), + Vector3d(myCenter[0]+myRadius, myCenter[1]+myRadius, myCenter[2]+myRadius) + ); +} + +double +Sphere::point_signed_distance(const Vector3d &x) const +{ + return (myDistSign*((x-myCenter).length() - myRadius)); +} + +Ellipsoid::Ellipsoid( + const std::string & name, // surface name + const std::vector & center, + const std::vector & semiAxes, + const std::vector & rotationVec, + const int sign) +: SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + mySign(sign) +{ + ThrowAssert(center.size() == 3 && semiAxes.size() == 3); + mySemiAxesNorm = 0.0; + for(unsigned i = 0; i < 3; ++i) { + myCenter[i] = center[i]; + mySemiAxes[i] = semiAxes[i]; + mySemiAxesNorm += mySemiAxes[i]*mySemiAxes[i]; + } + mySemiAxesNorm = std::sqrt(mySemiAxesNorm); + + if (!rotationVec.empty()) + { + ThrowAssert(rotationVec.size() == 3); + Vector3d pointRotation(-rotationVec[0], -rotationVec[1], -rotationVec[2]); // myRotation is the rotation used for the query point locations, which is the opposite of the rotation of the ellipsoid + myRotation = std::make_unique(); + myRotation->set_from_rotation_vector(pointRotation); + } +} + +BoundingBox +Ellipsoid::get_bounding_box() +{ + if (!myRotation) + return BoundingBox(myCenter-mySemiAxes, myCenter+mySemiAxes); + + const Vector3d min = myCenter-mySemiAxes; + const Vector3d max = myCenter+mySemiAxes; + BoundingBox rotatedBbox; + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(min[0],min[1],min[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(min[0],min[1],max[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(min[0],max[1],min[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(min[0],max[1],max[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(max[0],min[1],min[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(max[0],min[1],max[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(max[0],max[1],min[2]))); + rotatedBbox.accommodate(myRotation->reverse_rotate_3d_vector(Vector3d(max[0],max[1],max[2]))); + + return rotatedBbox; +} + +double +Ellipsoid::point_signed_distance(const Vector3d &x) const +{ + Vector3d delta = x-myCenter; + if (myRotation) + delta = myRotation->rotate_3d_vector(delta); + // Not an exact distance except in the case of a sphere + const double dx = delta[0]/mySemiAxes[0]; + const double dy = delta[1]/mySemiAxes[1]; + const double dz = delta[2]/mySemiAxes[2]; + return mySign*(mySemiAxesNorm*std::sqrt(dx*dx+dy*dy+dz*dz)-mySemiAxesNorm); +} + +Plane::Plane(const std::string & n, // surface name + const double normal[3], + const double offset, + const double multiplier) + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + myMultiplier(multiplier), + myNormal(normal), + myOffset(offset) +{ + myNormal.unitize(); +} + +double +Plane::point_signed_distance(const Vector3d &x) const +{ + return myMultiplier*(Dot(myNormal, x) + myOffset); +} + +BoundingBox +Plane::get_bounding_box() +{ + //bounding box is entire domain + return BoundingBox(Vector3d(-std::numeric_limits::max(), -std::numeric_limits::max(), -std::numeric_limits::max()), + Vector3d(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max())); +} + +Random::Random(const unsigned long seed) + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign(), + my_amplitude(1.0) +{ + my_srand(seed); +} + +double +Random::point_signed_distance(const Vector3d &x) const +{ + // generate random number between -my_amplitude and my_amplitude + return my_amplitude * (-1.0 + 2.0 * my_rand()); +} + +BoundingBox +Random::get_bounding_box() +{ + //bounding box is entire domain + return BoundingBox(Vector3d(-std::numeric_limits::max(), -std::numeric_limits::max(), -std::numeric_limits::max()), + Vector3d(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max())); +} + +Analytic_Isosurface::Analytic_Isosurface() + : SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign() +{ +} + +BoundingBox +Analytic_Isosurface::get_bounding_box() +{ + return BoundingBox( + Vector3d(-1.,-1.,-1.), + Vector3d(1.,1.,1.) + ); +} + +double +Analytic_Isosurface::point_signed_distance(const Vector3d &coord) const +{ + const double x = coord[0]; + const double y = coord[1]; + const double z = coord[2]; + return 2.*y*(y*y-3.*x*x)*(1.-z*z) + std::pow(x*x+y*y,2) - (9.*z*z-1.)*(1.-z*z); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_AnalyticSurf.hpp b/packages/krino/krino/krino_lib/Akri_AnalyticSurf.hpp new file mode 100644 index 000000000000..18f70a5bb0e1 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AnalyticSurf.hpp @@ -0,0 +1,186 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_AnalyticSurf_h +#define Akri_AnalyticSurf_h + +#include +#include +#include + +#include +#include + +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class Entity; } } +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace mesh { class Selector; } } + +namespace krino { + +class Cylinder: public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Cylinder(const std::string & n, // surface name + const double e1[3], // first endpoint of axis + const double e2[3], // second endpoint of axis + const double r, // radius of cylinder + const int sign); + + virtual ~Cylinder() {} + + virtual Surface_Type type() const override { return CYLINDER; } + virtual size_t storage_size() const override { return sizeof(Cylinder); } + + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) override; + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + int dist_sign; + double radius; + double length; + + // two end points + Vector3d p1, p2; + + // unit vector in direction of axis. + Vector3d xi; +}; + +class Sphere: public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Sphere(const std::string & n, // surface name + const Vector3d & center, + const double radius, + const int sign = 1); + + virtual ~Sphere() {} + + virtual Surface_Type type() const override { return SPHERE; } + virtual size_t storage_size() const override { return sizeof(Sphere); } + + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) override; + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + int myDistSign; + Vector3d myCenter; + double myRadius; +}; + +class Ellipsoid : public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Ellipsoid( + const std::string & name, // surface name + const std::vector & center, + const std::vector & semiAxes, + const std::vector & rotationVec, + const int sign); + + virtual ~Ellipsoid() {} + + virtual Surface_Type type() const override { return ELLIPSOID; } + virtual size_t storage_size() const override { return sizeof(Ellipsoid); } + + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + int mySign; + + //center of ellipsoid + Vector3d myCenter; + + Vector3d mySemiAxes; + double mySemiAxesNorm; + std::unique_ptr myRotation; +}; + +class Plane: public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Plane(const std::string & n, // surface name + const double normal[3], + const double offset, + const double multiplier); + + virtual ~Plane() {} + + virtual Surface_Type type() const override { return PLANE; } + virtual size_t storage_size() const override { return sizeof(Plane); } + + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + double myMultiplier; + + Vector3d myNormal; //unit normal to plane + double myOffset; //eq of plane is 0 = offset + normal \dot x +}; + +class Point: public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Point(const std::string & n, // surface name + const Vector3d & coords); + + virtual ~Point() {} + + virtual Surface_Type type() const override { return POINT; } + virtual size_t storage_size() const override { return sizeof(Point); } + + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + Vector3d my_coords; +}; + +class Random : public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Random(const unsigned long seed); + + virtual ~Random() {} + + virtual Surface_Type type() const override { return RANDOM; } + virtual size_t storage_size() const override { return sizeof(Random); } + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) override + { + if (truncation_length > 0.0) my_amplitude = truncation_length; + } + + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; + +private: + mutable unsigned long iseed; + double my_amplitude; + + double my_rand() const { iseed = (1664525L*iseed + 1013904223L) & 0xffffffff; + return( ((double) iseed) / ((double) 0xffffffff) ); } + void my_srand(unsigned int seed) const {iseed = seed;} +}; + +class Analytic_Isosurface: public SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign { +public: + Analytic_Isosurface(); + + virtual ~Analytic_Isosurface() {} + + virtual Surface_Type type() const override { return SPHERE; } + virtual size_t storage_size() const override { return sizeof(Analytic_Isosurface); } + + virtual double point_signed_distance(const Vector3d &x) const override; + virtual BoundingBox get_bounding_box() override; +}; + +} // namespace krino + +#endif // Akri_AnalyticSurf_h diff --git a/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.cpp b/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.cpp new file mode 100644 index 000000000000..5062a28d0c4b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.cpp @@ -0,0 +1,203 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +static int surface_sign_at_position(const Surface & surface, const Vector3d & pt) +{ + const double phi = surface.point_signed_distance(pt); + return ( (phi < 0.) ? -1 : 1 ); // GOMA sign convention +} + +static std::function build_edge_distance_function(const Surface & surface, const Segment3d & edge) +{ + std::function distanceFunction = + [&surface, &edge](const double x) + { + return surface.point_signed_distance((1.-x)*edge.GetNode(0) + x*edge.GetNode(1)); + }; + return distanceFunction; +} + +static double find_crossing_position(const Surface & surface, const Segment3d & edge) +{ + const double phi0 = surface.point_signed_distance(edge.GetNode(0)); + const double phi1 = surface.point_signed_distance(edge.GetNode(1)); + const auto result = find_root(build_edge_distance_function(surface, edge), 0., 1., phi0, phi1); + ThrowRequire(result.first); + return result.second; +} + +SurfaceElementCutter::SurfaceElementCutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const Surface & surface) +: myMasterElem(MasterElementDeterminer::getMasterElement(mesh.bucket(element).topology())), + mySurface(surface) +{ + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + fill_element_node_coordinates(mesh, element, coordsField, myElementNodeCoords); +} + +bool SurfaceElementCutter::have_crossing(const InterfaceID interface, const Segment3d & edge) const +{ + return surface_sign_at_position(mySurface, parametric_to_global_coordinates(edge.GetNode(0))) != + surface_sign_at_position(mySurface, parametric_to_global_coordinates(edge.GetNode(1))); +} + +double SurfaceElementCutter::interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const +{ + const Segment3d globalEdge(parametric_to_global_coordinates(edge.GetNode(0)), parametric_to_global_coordinates(edge.GetNode(1))); + return find_crossing_position(mySurface, globalEdge); +} + +int SurfaceElementCutter::sign_at_position(const InterfaceID interface, const Vector3d & paramCoords) const +{ + return surface_sign_at_position(mySurface, parametric_to_global_coordinates(paramCoords)); +} + +Vector3d SurfaceElementCutter::parametric_to_global_coordinates(const Vector3d & pCoords) const +{ + std::vector nodalShapeFunctions(myMasterElem.num_nodes()); + myMasterElem.shape_fcn(1, pCoords.data(), nodalShapeFunctions.data()); + Vector3d pt(Vector3d::ZERO); + for (unsigned n=0; n & elementsToIntersect, + const Surface & surface, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) +{ + const bool intersectionPointIsOwned = true; + std::vector intersectionPointSortedDomains; + const int dim = mesh.mesh_meta_data().spatial_dimension(); + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + std::set> edgesAlreadyChecked; + for (auto && elem : elementsToIntersect) + { + const stk::topology topology = mesh.bucket(elem).topology(); + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(elem); + const unsigned numEdges = topology.num_edges(); + + for (unsigned iedge = 0; iedge < numEdges; ++iedge) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topology, iedge); + const stk::mesh::Entity node0 = elem_nodes[edge_node_ordinals[0]]; + const stk::mesh::Entity node1 = elem_nodes[edge_node_ordinals[1]]; + const stk::mesh::EntityId node0Id = mesh.identifier(node0); + const stk::mesh::EntityId node1Id = mesh.identifier(node1); + const std::array edgeNodeIds = (node0Id < node1Id) ? std::array{node0Id, node1Id} : std::array{node1Id, node0Id}; + auto iter = edgesAlreadyChecked.lower_bound(edgeNodeIds); + if (iter == edgesAlreadyChecked.end() || edgeNodeIds != *iter) + { + edgesAlreadyChecked.insert(iter, edgeNodeIds); + const Vector3d node0Coords(field_data(coordsField, node0), dim); + const Vector3d node1Coords(field_data(coordsField, node1), dim); + const double phi0 = surface.point_signed_distance(node0Coords); + const double phi1 = surface.point_signed_distance(node1Coords); + const bool haveCrossing = (phi0 < 0.) ? (phi1 >= 0.) : (phi1 < 0.); + if (haveCrossing) + { + const InterfaceID interface(0,0); + const double location = find_crossing_position(surface, Segment3d(node0Coords, node1Coords)); + interface.fill_sorted_domains(intersectionPointSortedDomains); + const std::vector intersectionPointNodes{node0,node1}; + if (intersectionPointFilter(intersectionPointNodes, intersectionPointSortedDomains)) + intersectionPoints.emplace_back(intersectionPointIsOwned, intersectionPointNodes, std::vector{1.-location, location}, intersectionPointSortedDomains); + } + } + } + } +} + +static BoundingBox compute_nodal_bounding_box(const stk::mesh::BulkData & mesh) +{ + const int nDim = mesh.mesh_meta_data().spatial_dimension(); + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + + BoundingBox nodeBbox; + for ( auto && bucket : mesh.buckets(stk::topology::NODE_RANK) ) + { + double *coord = field_data(coordsField, *bucket); + for (size_t n = 0; n < bucket->size(); ++n) + nodeBbox.accommodate( Vector3d(coord+n*nDim, nDim) ); + } + + return nodeBbox; +} + +static void prepare_to_compute_with_surface(const stk::mesh::BulkData & mesh, const Surface & surface) +{ + const BoundingBox nodeBbox = compute_nodal_bounding_box(mesh); + Surface & nonConstSurface = const_cast(surface); + nonConstSurface.prepare_to_compute(0.0, nodeBbox, 0.); // Setup including communication of facets that are within this processors narrow band +} + +void AnalyticSurfaceInterfaceGeometry::prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + myElementsToIntersect = get_owned_parent_elements(mesh, myActivePart, myCdfemSupport, myPhaseSupport); + prepare_to_compute_with_surface(mesh, mySurface); +} + +void AnalyticSurfaceInterfaceGeometry::prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const std::vector & elementsToIntersect, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + myElementsToIntersect = elementsToIntersect; + prepare_to_compute_with_surface(mesh, mySurface); +} + +std::vector AnalyticSurfaceInterfaceGeometry::get_edge_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + const IntersectionPointFilter intersectionPointFilter = keep_all_intersection_points_filter(); + std::vector intersectionPoints; + append_surface_edge_intersection_points(mesh, myElementsToIntersect, mySurface, intersectionPointFilter, intersectionPoints); + return intersectionPoints; +} + +void AnalyticSurfaceInterfaceGeometry::append_element_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const std::vector & elementsToIntersect, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) const +{ + prepare_to_process_elements(mesh, elementsToIntersect, nodesToCapturedDomains); + append_surface_edge_intersection_points(mesh, myElementsToIntersect, mySurface, intersectionPointFilter, intersectionPoints); +} + +std::unique_ptr AnalyticSurfaceInterfaceGeometry::build_element_cutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::function &)> & intersectingPlanesDiagonalPicker) const +{ + std::unique_ptr cutter; + cutter.reset( new SurfaceElementCutter(mesh, element, mySurface) ); + return cutter; +} + +PhaseTag AnalyticSurfaceInterfaceGeometry::get_starting_phase(const ElementCutter * cutter) const +{ + PhaseTag phase; + ThrowRequire(1 == myCdfemSupport.num_ls_fields()); + phase.add(myCdfemSupport.ls_field(0).identifier, 0); + return phase; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.hpp b/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.hpp new file mode 100644 index 000000000000..f72ce103d4d1 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AnalyticSurfaceInterfaceGeometry.hpp @@ -0,0 +1,111 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_AnalyticSurfaceInterfaceGeometry_h +#define Akri_AnalyticSurfaceInterfaceGeometry_h + +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +class CDFEM_Support; +class Phase_Support; + +class SurfaceElementCutter : public ElementCutter +{ +public: + SurfaceElementCutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const Surface & surface); + virtual ~SurfaceElementCutter() {} + + virtual bool might_have_interior_or_face_intersections() const override { return false; } + virtual void fill_interior_intersections(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const override {} + virtual std::vector get_sorted_cutting_interfaces() const override + { std::vector interfaces; interfaces.push_back(InterfaceID(0,0)); return interfaces; } + virtual std::vector get_interface_signs_based_on_crossings(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains) const override + { std::vector interfaceSigns(1,0); return interfaceSigns; } + virtual void fill_tetrahedron_face_interior_intersections(const std::array & faceNodes, + const InterfaceID & interface1, + const InterfaceID & interface2, + const ElementIntersectionPointFilter & intersectionPointFilter, + std::vector & intersections) const override {} + virtual std::string visualize(const stk::mesh::BulkData & mesh) const override { std::string empty; return empty; } + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const override; + virtual double interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const override; + virtual int sign_at_position(const InterfaceID interface, const Vector3d & paramCoords) const override; + virtual int get_starting_phase_for_cutting_surfaces() const override { return 0; } + +private: + Vector3d parametric_to_global_coordinates(const Vector3d & pCoords) const; + + const MasterElement & myMasterElem; + std::vector myElementNodeCoords; + const Surface & mySurface; +}; + +class AnalyticSurfaceInterfaceGeometry : public InterfaceGeometry { + +public: + AnalyticSurfaceInterfaceGeometry(const Surface & surface, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +: mySurface(surface), + myActivePart(activePart), + myCdfemSupport(cdfemSupport), + myPhaseSupport(phaseSupport) {} + + virtual ~AnalyticSurfaceInterfaceGeometry() {} + + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToSnappedDomains) const override; + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const std::vector & elementsToIntersect, + const NodeToCapturedDomainsMap & nodesToSnappedDomains) const override; + + virtual std::vector get_edge_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToSnappedDomains) const override; + virtual void append_element_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToSnappedDomains, + const std::vector & elementsToIntersect, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) const override; + + virtual void store_phase_for_uncut_elements(const stk::mesh::BulkData & mesh) const override {} + virtual void store_phase_for_elements_that_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + const std::vector & independentSnapInfos, + const NodeToCapturedDomainsMap & nodesToSnappedDomains) const override {} + virtual const ElementToDomainMap & get_phase_for_uncut_elements() const override { return myUncutElementPhases; } + + virtual std::unique_ptr build_element_cutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::function &)> & intersectingPlanesDiagonalPicker) const override; + + virtual PhaseTag get_starting_phase(const ElementCutter * cutter) const override; + +private: + const Surface & mySurface; + const stk::mesh::Part & myActivePart; + const CDFEM_Support & myCdfemSupport; + const Phase_Support & myPhaseSupport; + ElementToDomainMap myUncutElementPhases; + mutable std::vector myElementsToIntersect; +}; + +} // namespace krino + +#endif diff --git a/packages/krino/krino/krino_lib/Akri_AuxMetaData.cpp b/packages/krino/krino/krino_lib/Akri_AuxMetaData.cpp new file mode 100644 index 000000000000..99584a22279a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AuxMetaData.cpp @@ -0,0 +1,396 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include "Akri_FieldRef.hpp" // for FieldRef + +#include +#include "stk_mesh/base/FieldBase.hpp" // for FieldState +#include "stk_mesh/base/MetaData.hpp" +#include "stk_mesh/base/Part.hpp" // for Part +#include "stk_topology/topology.hpp" // for topology, etc +#include +#include "stk_util/util/ReportHandler.hpp" // for ThrowAssert, etc + +namespace krino +{ +const FieldType FieldType::UNSIGNED_INTEGER_64("UNSIGNED INTEGER 64", typeid(uint64_t), 1); +const FieldType FieldType::UNSIGNED_INTEGER("UNSIGNED INTEGER", typeid(unsigned), 1); +const FieldType FieldType::INTEGER("INTEGER", typeid(int), 1); +const FieldType FieldType::REAL("REAL", typeid(double), 1); + +const FieldType FieldType::VECTOR_2D("VECTOR_2D", typeid(double), 2); +const FieldType FieldType::VECTOR_3D("VECTOR_3D", typeid(double), 3); +const FieldType FieldType::MATRIX_22("MATRIX_22", typeid(double), 4); +const FieldType FieldType::MATRIX_33("MATRIX_33", typeid(double), 9); + +AuxMetaData & +AuxMetaData::get(const stk::mesh::MetaData & stk_meta) +{ + AuxMetaData * aux_meta = const_cast(stk_meta.get_attribute()); + ThrowRequireMsg(nullptr != aux_meta, "AuxMetaData not found on MetaData."); + return *aux_meta; +} + +AuxMetaData & +AuxMetaData::create(stk::mesh::MetaData & stk_meta) +{ + AuxMetaData * aux_meta = const_cast(stk_meta.get_attribute()); + ThrowRequireMsg(nullptr == aux_meta, "AuxMetaData::create should be caled only once per MetaData."); + if (nullptr == aux_meta) + { + aux_meta = new AuxMetaData(stk_meta); + stk_meta.declare_attribute_with_delete(aux_meta); + } + return *aux_meta; +} + +AuxMetaData::AuxMetaData(stk::mesh::MetaData & stk_meta) + : my_meta(stk_meta), + is_fmwk(false), + my_assert_32bit_flag(false), + my_force_64bit_flag(true), // just to guarantee testing 64 bit as much as possible + my_active_part(nullptr), + my_exposed_boundary_part(nullptr), + my_block_boundary_part(nullptr) +{ + stk::mesh::Part * existing_active_part = my_meta.get_part("ACTIVE_CONTEXT_BIT"); + if (nullptr != existing_active_part) + { + my_active_part = existing_active_part; + my_exposed_boundary_part = my_meta.get_part("EXPOSED_BOUNDARY_CONTEXT_BIT"); + my_block_boundary_part = my_meta.get_part("BLOCK_BOUNDARY_CONTEXT_BIT"); + } + else + { + ThrowRequireMsg(my_meta.spatial_dimension() > 0, "For non-Fmwk usage, AuxMetaData cannot be created until after the spatial_dimension is set on the stk::mesh::MetaData."); + ThrowRequireMsg(!my_meta.is_commit(), "For non-Fmwk usage, AuxMetaData must be created before the stk::mesh::MetaData is committed."); + my_active_part = &my_meta.declare_part("ACTIVE_CONTEXT_BIT"); + my_exposed_boundary_part = &my_meta.declare_part("EXPOSED_BOUNDARY_CONTEXT_BIT", my_meta.side_rank()); + my_block_boundary_part = &my_meta.declare_part("BLOCK_BOUNDARY_CONTEXT_BIT", my_meta.side_rank()); + } + + my_active_globally_shared_selector = stk::mesh::Selector(*my_active_part & my_meta.globally_shared_part()); + my_active_not_ghost_selector = stk::mesh::Selector(*my_active_part & (my_meta.locally_owned_part() | my_meta.globally_shared_part())); + my_active_locally_owned_selector = stk::mesh::Selector(*my_active_part & my_meta.locally_owned_part()); +} + +void +AuxMetaData::set_fmwk_functions( + const std::function & in_fmwk_get_iopart, + const std::function & in_fmwk_iopart, + const std::function & in_fmwk_define_iopart_alias, + const std::function & in_fmwk_register_field, + stk::mesh::Part * in_exposed_boundary_part, + stk::mesh::Part * in_block_boundary_part) +{ + is_fmwk = true; + clear_force_64bit_flag(); + fmwk_get_iopart = in_fmwk_get_iopart; + fmwk_iopart = in_fmwk_iopart; + fmwk_define_iopart_alias = in_fmwk_define_iopart_alias; + fmwk_register_field = in_fmwk_register_field; + my_exposed_boundary_part = in_exposed_boundary_part; + my_block_boundary_part = in_block_boundary_part; +} + +void +AuxMetaData::set_inducer_functions( + const std::function & in_inducer_induce_topology_nodesets, + const std::function & in_inducer_get_nodal_field_topology, + const std::function & in_inducer_selectField) +{ + fn_induce_topology_nodesets = in_inducer_induce_topology_nodesets; + fn_get_nodal_field_topology = in_inducer_get_nodal_field_topology; + fn_selectField = in_inducer_selectField; +} + +stk::mesh::Part & AuxMetaData::block_boundary_part() const +{ + ThrowAssert(nullptr != my_block_boundary_part); return *my_block_boundary_part; +} + +stk::mesh::Part & AuxMetaData::exposed_boundary_part() const +{ + ThrowAssert(nullptr != my_exposed_boundary_part); return *my_exposed_boundary_part; +} + +bool +AuxMetaData::has_field( const stk::mesh::EntityRank obj_type, const std::string& name ) const +{ + return NULL != my_meta.get_field(obj_type, name); +} + +bool +AuxMetaData::has_field( const stk::mesh::EntityRank obj_type, const std::string& name, stk::mesh::FieldState state ) const +{ + stk::mesh::FieldBase* field_ptr = my_meta.get_field(obj_type, name); + if (NULL == field_ptr) return false; + return NULL != field_ptr->field_state(state); +} + +FieldRef +AuxMetaData::get_field( const stk::mesh::EntityRank obj_type, const std::string& name ) const +{ + stk::mesh::FieldBase* field_ptr = my_meta.get_field(obj_type, name); + ThrowRequireMsg(NULL != field_ptr, "Field \"" << name << "\" not found."); + return FieldRef(field_ptr); +} + + +FieldRef +AuxMetaData::get_field( const stk::mesh::EntityRank obj_type, const std::string& name, stk::mesh::FieldState state ) const +{ + stk::mesh::FieldBase* field_ptr = my_meta.get_field(obj_type, name); + if(field_ptr == nullptr) + { + std::ostringstream err_msg; + err_msg << "Field \"" << name << "\" not found.\n"; + err_msg << "Registered fields are:\n"; + for(auto && field : my_meta.get_fields(obj_type)) + { + err_msg << field->name() << "\n"; + } + throw std::runtime_error(err_msg.str()); + } + return FieldRef(field_ptr, state); +} + +bool +AuxMetaData::has_part( const std::string& name ) const +{ + stk::mesh::Part * part = my_meta.get_part(name); + // If the part is not found see if the name is actually a Fmwk alias + if (!part && is_fmwk) part = fmwk_get_iopart(name); + return NULL != part; +} + +stk::mesh::Part& +AuxMetaData::get_part( const std::string& name ) const +{ + stk::mesh::Part * part = my_meta.get_part(name); + // If the part is not found see if the name is actually a Fmwk alias + if (!part && is_fmwk) part = fmwk_get_iopart(name); + ThrowRequireMsg(part, "Could not find part " << name;); + return *part; +} + +void +AuxMetaData::define_part_alias( stk::mesh::Part & part , const std::string & alias ) +{ + if (is_fmwk) + { + fmwk_define_iopart_alias(part, alias); + return; + } + // Silent no-op +} + +void +AuxMetaData::assign_part_id(stk::mesh::Part& part) +{ + static int64_t max_existing_part_id = stk::mesh::Part::INVALID_ID; + if (max_existing_part_id == stk::mesh::Part::INVALID_ID) + { + max_existing_part_id = 0; + for (auto && existing_part : my_meta.get_parts()) + { + max_existing_part_id = std::max(max_existing_part_id, existing_part->id()); + } + } + if (part.id() == stk::mesh::Part::INVALID_ID) + { + const int64_t part_id = ++max_existing_part_id; + my_meta.set_part_id(part, part_id); + } +} + +stk::mesh::Part& +AuxMetaData::declare_io_part( const std::string& name, const stk::mesh::EntityRank obj_type, const bool restartOnlyIOPart ) +{ + if (is_fmwk) + { + stk::mesh::Part & part = fmwk_iopart(name, obj_type); + if (restartOnlyIOPart) + { + myRestartOnlyIOParts.push_back(&part); + } + assign_part_id(part); + return part; + } + + stk::mesh::Part & part = my_meta.declare_part(name, obj_type); + + if (restartOnlyIOPart) + { + myRestartOnlyIOParts.push_back(&part); + } + else + { + if (!stk::io::is_part_io_part(part)) + { + stk::io::put_io_part_attribute(part); + } + } + + assign_part_id(part); + + return part; +} + +stk::mesh::Part& +AuxMetaData::declare_io_part_with_topology( const std::string& name, const stk::topology topology, const bool restartOnlyIOPart ) +{ + if (is_fmwk) + { + stk::mesh::Part & root_part = my_meta.get_topology_root_part(topology); + stk::mesh::Part & part = fmwk_iopart(name, root_part.primary_entity_rank()); + my_meta.declare_part_subset(root_part, part); + if (restartOnlyIOPart) + { + myRestartOnlyIOParts.push_back(&part); + } + assign_part_id(part); + return part; + } + + stk::mesh::Part & part = my_meta.declare_part_with_topology(name, topology); + + if (restartOnlyIOPart) + { + myRestartOnlyIOParts.push_back(&part); + } + else + { + if (!stk::io::is_part_io_part(part)) + { + stk::io::put_io_part_attribute(part); + } + } + + assign_part_id(part); + + return part; +} + +FieldRef +AuxMetaData::declare_field( + const std::string & fld_name, + const FieldType & field_type, + const stk::mesh::EntityRank entity_rank, + const unsigned num_states) +{ + stk::mesh::FieldBase * field = NULL; + const std::type_info & value_type = field_type.type_info(); + if (value_type == typeid(int)) + field = &my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + else if (value_type == typeid(double)) + field = &my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + else if (value_type == typeid(unsigned)) + field = &my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + else if (value_type == typeid(int64_t)) + field = &my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + else if (value_type == typeid(uint64_t)) + field = &my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + else { + ThrowRequireMsg(false, "Unhandled primitive type " << value_type.name()); + } + + return FieldRef(field); +} + +FieldRef +AuxMetaData::register_field( + const std::string & fld_name, + const FieldType & field_type, + const stk::mesh::EntityRank entity_rank, + const unsigned num_states, + const unsigned dimension, + const stk::mesh::Part & part, + const void * value_type_init) +{ + // don't rely on induction of non-ranked superset parts + // Note that we are only checking nodal fields here, but this could also be a problem if we are counting on a non-ranked superset part to be induced on faces or edges (unlikely?). + //ThrowRequire(entity_rank != stk::topology::NODE_RANK || !is_unranked_superset_part(part)); + + if (is_fmwk) + { + return FieldRef(fmwk_register_field(fld_name, field_type.name(), field_type.type_info(), field_type.dimension(), entity_rank, num_states, dimension, part, value_type_init)); + } + + const unsigned field_length = field_type.dimension()*dimension; + if (field_type.name() == FieldType::VECTOR_2D.name()) + { + auto & field = my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + stk::mesh::put_field_on_mesh(field, part, field_length, nullptr); + return FieldRef(field); + } + else if (field_type.name() == FieldType::VECTOR_3D.name()) + { + auto & field = my_meta.declare_field< stk::mesh::Field >(entity_rank, fld_name, num_states); + stk::mesh::put_field_on_mesh(field, part, field_length, nullptr); + return FieldRef(field); + } + + FieldRef field = declare_field(fld_name, field_type, entity_rank, num_states); + stk::mesh::put_field_on_mesh(field.field(), part, field_length, value_type_init); + return field; +} + +void +AuxMetaData::induce_topology_nodesets(stk::mesh::Selector selector) const +{ + if (fn_induce_topology_nodesets) + { + fn_induce_topology_nodesets(selector); + } + // no-op if inducer is not set + return; +} + +stk::topology +AuxMetaData::get_nodal_field_topology( const stk::mesh::FieldBase & field, stk::mesh::Entity entity ) const +{ + return get_nodal_field_topology(field, my_meta.mesh_bulk_data().bucket(entity)); +} + +stk::topology AuxMetaData::get_nodal_field_topology( const stk::mesh::FieldBase & field, const stk::mesh::Bucket & bucket ) const +{ + if (fn_get_nodal_field_topology) + { + return fn_get_nodal_field_topology(field, bucket); + } + // return bucket topology if inducer is not set and field is defined on bucket + const stk::mesh::Selector field_selector = stk::mesh::selectField(field); + stk::topology field_topology = stk::topology::INVALID_TOPOLOGY; + if (field_selector(bucket)) field_topology = bucket.topology(); + return field_topology; +} + +stk::mesh::Selector AuxMetaData::selectField( const stk::mesh::FieldBase & field, const stk::mesh::EntityRank target_rank ) const +{ + if (fn_selectField && field.entity_rank() == stk::topology::NODE_RANK) + { + return fn_selectField( field, target_rank ); + } + // return stk::mesh::selectField if inducer is not set + return stk::mesh::selectField(field); +} + +//---------------------------------------------------------------------- + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_AuxMetaData.hpp b/packages/krino/krino/krino_lib/Akri_AuxMetaData.hpp new file mode 100644 index 000000000000..e7590663a4be --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_AuxMetaData.hpp @@ -0,0 +1,180 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_AuxMetaData_h +#define Akri_AuxMetaData_h + +#include +#include // for operator<<, basic_string, etc +#include "stk_mesh/base/FieldState.hpp" // for FieldState +#include "stk_mesh/base/Selector.hpp" // for Selector +#include "stk_mesh/base/Entity.hpp" // for Entity + +namespace krino { class FieldRef; } + +#if ((__GNUC__ == 4) && (__GNUC_MINOR__ == 9)) || (__GNUC__ == 5) +// Looks like there is an issue with these compilers +// related to instatiating std::function with an incomplete +// type leading to undefine behavior +#include "stk_mesh/base/Part.hpp" // for Part +#include "stk_mesh/base/MetaData.hpp" +#include "stk_mesh/base/FieldBase.hpp" // for FieldState +#else +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace mesh { class Part; } } +namespace stk { namespace mesh { class FieldBase; } } +#endif + +namespace krino +{ + +class FieldType { +public: + static const FieldType UNSIGNED_INTEGER_64; + static const FieldType UNSIGNED_INTEGER; + static const FieldType INTEGER; + static const FieldType REAL; + + static const FieldType VECTOR_2D; + static const FieldType VECTOR_3D; + static const FieldType MATRIX_22; + static const FieldType MATRIX_33; + + const std::string & name() const { return my_name; } + const std::type_info & type_info() const { return my_type_info; } + unsigned dimension() const { return my_dimension; } + + FieldType(const std::string & nme, const std::type_info & type, const unsigned dim) : my_name(nme), my_type_info(type), my_dimension(dim) {} + +private: + const std::string my_name; + const std::type_info & my_type_info; + const unsigned my_dimension; +}; + +class AuxMetaData final +{ +public: + static AuxMetaData & get(const stk::mesh::MetaData & stk_meta); + + static AuxMetaData & create(stk::mesh::MetaData & stk_meta); // must be called before calling get + + AuxMetaData ( const AuxMetaData & ) = delete; + AuxMetaData & operator= ( const AuxMetaData & ) = delete; + + bool using_fmwk() const { return is_fmwk; } + + stk::mesh::Part & active_part() const { return *my_active_part; } + stk::mesh::Part & block_boundary_part() const; + stk::mesh::Part & exposed_boundary_part() const; + + const stk::mesh::Selector & active_not_ghost_selector() const { return my_active_not_ghost_selector; } + const stk::mesh::Selector & active_locally_owned_selector() const { return my_active_locally_owned_selector; } + const stk::mesh::Selector & active_globally_shared_selector() const { return my_active_globally_shared_selector; } + + bool get_force_64bit_flag() const { return my_force_64bit_flag; } + void clear_force_64bit_flag() { my_force_64bit_flag = false; } + bool get_assert_32bit_flag() { return my_assert_32bit_flag; } + void set_assert_32bit_flag() { my_force_64bit_flag = false; my_assert_32bit_flag = true; } + + FieldRef declare_field( + const std::string & fld_name, + const FieldType & field_type, + const stk::mesh::EntityRank entity_rank, + const unsigned num_states); + + FieldRef register_field( + const std::string & fld_name, + const FieldType & field_type, + const stk::mesh::EntityRank entity_rank, + const unsigned num_states, + const unsigned dimension, + const stk::mesh::Part & part, + const void * value_type_init = nullptr); + + void assign_part_id(stk::mesh::Part& part); + stk::mesh::Part & declare_io_part(const std::string & name, stk::mesh::EntityRank entityRank, const bool restartOnlyIOPart=false); + stk::mesh::Part & declare_io_part_with_topology(const std::string & name, const stk::topology topology, const bool restartOnlyIOPart=false); + + const std::vector & get_restart_only_io_parts() const { return myRestartOnlyIOParts; } + + bool has_part( const std::string& name ) const; + stk::mesh::Part& get_part( const std::string& name ) const; + + void define_part_alias( stk::mesh::Part & part, const std::string & alias ); + + bool has_field( const stk::mesh::EntityRank obj_type, const std::string& name ) const; + bool has_field( const stk::mesh::EntityRank obj_type, const std::string& name, stk::mesh::FieldState state ) const; + + FieldRef get_field( const stk::mesh::EntityRank obj_type, const std::string& name ) const; + FieldRef get_field( const stk::mesh::EntityRank obj_type, const std::string& name, stk::mesh::FieldState state ) const; + + void induce_topology_nodesets(stk::mesh::Selector selector = stk::mesh::Selector()) const; + stk::topology get_nodal_field_topology( const stk::mesh::FieldBase & field, stk::mesh::Entity entity ) const; + stk::topology get_nodal_field_topology( const stk::mesh::FieldBase & field, const stk::mesh::Bucket & bucket ) const; + stk::mesh::Selector selectField( const stk::mesh::FieldBase & field, const stk::mesh::EntityRank target_rank ) const; + bool is_cell_edge(stk::mesh::Entity node0, stk::mesh::Entity node1) const { return fn_is_cell_edge(node0, node1); } + + void set_fmwk_functions( + const std::function & in_fmwk_get_iopart, + const std::function & in_fmwk_iopart, + const std::function & in_fmwk_define_iopart_alias, + const std::function & in_fmwk_register_field, + stk::mesh::Part * in_exposed_boundary_part, + stk::mesh::Part * in_block_boundary_part); + void set_inducer_functions( + const std::function & in_inducer_induce_topology_nodesets, + const std::function & in_inducer_get_nodal_field_topology, + const std::function & in_inducer_selectField); + void set_is_cell_edge_function(const std::function & in_is_cell_edge) { fn_is_cell_edge = in_is_cell_edge; } + +private: + explicit AuxMetaData(stk::mesh::MetaData & stk_meta); +private: + stk::mesh::MetaData & my_meta; + bool is_fmwk; + bool my_assert_32bit_flag; + bool my_force_64bit_flag; + stk::mesh::Part * my_active_part; + stk::mesh::Part * my_exposed_boundary_part; + stk::mesh::Part * my_block_boundary_part; + stk::mesh::Selector my_active_not_ghost_selector; + stk::mesh::Selector my_active_locally_owned_selector; + stk::mesh::Selector my_active_globally_shared_selector; + std::function fmwk_get_iopart; + std::function fmwk_iopart; + std::function fmwk_define_iopart_alias; + std::function fmwk_register_field; + std::function fn_induce_topology_nodesets; + std::function fn_get_nodal_field_topology; + std::function fn_selectField; + std::function fn_is_cell_edge; + std::vector myRestartOnlyIOParts; +}; + +} // namespace krino + +#endif // Akri_AuxMetaData_h diff --git a/packages/krino/krino/krino_lib/Akri_BoundingBox.cpp b/packages/krino/krino/krino_lib/Akri_BoundingBox.cpp new file mode 100644 index 000000000000..f456350ca065 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_BoundingBox.cpp @@ -0,0 +1,214 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +#include +#include +#include + +#include + +namespace krino{ + +template +void +BoundingBox_T::pad_epsilon() +{ + if (!valid()) return; + + const double eps = std::numeric_limits::epsilon(); + + for (int i = 0; i < DIM; i++ ) + { + min[i] -= std::abs(min[i])*eps; + max[i] += std::abs(max[i])*eps; + } +} + +template +void +BoundingBox_T::gather_bboxes( const BoundingBox_T & local_bbox, + std::vector < BoundingBox_T > & all_bboxes ) +{ /* %TRACE% */ /* %TRACE% */ + + // + // globally communicate the bounding box sizes for all procs + // + + all_bboxes.clear(); + all_bboxes.reserve( stk::EnvData::parallel_size() ); + + // put bbox data in Real vector for communication + + std::vector bbox_data( 2*DIM ); + for (int i = 0, j = 0; i < DIM; i++ ) + { + bbox_data[j++] = local_bbox.min[i]; + bbox_data[j++] = local_bbox.max[i]; + } + + std::vector bboxes_data( 2*DIM * stk::EnvData::parallel_size() ); + stk::parallel_vector_concat(stk::EnvData::parallel_comm(), bbox_data, bboxes_data); + + VecType remote_min, remote_max; + for ( int i = 0; i < stk::EnvData::parallel_size(); i++ ) + { + int index = 2*DIM * i; + for (int j = 0; j < DIM; j++ ) + { + remote_min[j] = bboxes_data[index++]; + remote_max[j] = bboxes_data[index++]; + } + all_bboxes.emplace_back( remote_min, remote_max ); + } +} + +template +void +BoundingBox_T::global_reduce() +{ + const VecType local_min = min; + const VecType local_max = max; + + stk::all_reduce_min(stk::EnvData::parallel_comm(), local_min.data(), min.data(), 3); + stk::all_reduce_max(stk::EnvData::parallel_comm(), local_max.data(), max.data(), 3); +} + +template +REAL +BoundingBox_T::SqrDistLowerBnd( const VecType & pt ) const +{ + // make sure bbox is valid + ThrowAssert( valid() ); + + Real delta, SqrDist = 0.; + + for ( int i = 0; i < DIM; i++ ) + { + if ( pt[i] < min[i] ) + { + delta = min[i] - pt[i]; + SqrDist += delta * delta; + } + else if ( pt[i] > max[i] ) + { + delta = pt[i] - max[i]; + SqrDist += delta * delta; + } + } + return ( SqrDist ); +} + +template +REAL +BoundingBox_T::SqrDistUpperBnd( const VecType & pt ) const +{ /* %TRACE% */ /* %TRACE% */ +// make sure bbox is valid + ThrowAssert( valid() ); + + // We are guaranteed that there is a point on the surface on each face of the + // bounding box. So we know that the upper bound for the distance to a face is + // the distance to the farthest point on that face. So the upper bound for this + // bounding box is the minimum of the upper bounds for each face. In other words, + // the upper bound is the minimum distance to the farthest point on each face. + + VecType close_pt; + VecType far_pt; + + for ( int i = 0; i < DIM; i++ ) + { + if ( pt[i] < min[i] ) + { + close_pt[i] = min[i]; + far_pt[i] = max[i]; + } + else if ( pt[i] > max[i] ) + { + close_pt[i] = max[i]; + far_pt[i] = min[i]; + } + else + { + if (pt[i]-min[i] < max[i]-pt[i]) + { + close_pt[i] = min[i]; + far_pt[i] = max[i]; + } + else + { + close_pt[i] = max[i]; + far_pt[i] = min[i]; + } + } + } + + Real SqrDistMin; + if (3 == DIM) + { + SqrDistMin = (pt-VecType(close_pt[0],far_pt[1],far_pt[2])).length_squared(); + SqrDistMin = std::min(SqrDistMin,(pt-VecType(far_pt[0],close_pt[1],far_pt[2])).length_squared()); + SqrDistMin = std::min(SqrDistMin,(pt-VecType(far_pt[0],far_pt[1],close_pt[2])).length_squared()); + } + else + { + ThrowAssert(2 == DIM); + const Real zero = 0.0; + SqrDistMin = (pt-VecType(close_pt[0],far_pt[1],zero)).length_squared(); + SqrDistMin = std::min(SqrDistMin,(pt-VecType(far_pt[0],close_pt[1],zero)).length_squared()); + } + return ( SqrDistMin ); +} + +template +REAL +BoundingBox_T::SqrDistUpperBnd( const BoundingBox_T & pt_box ) const +{ /* %TRACE% */ /* %TRACE% */ + // This is somewhat conservative. More aggressive methods might be able to reduce this estimate + // while still always being an upper bound. + // Here we just estimate the upper bound of this distance from any point in pt_bbox to the + // surface contained in *this by the following: + // Loop the faces of *this. + // Find the maximum distance from any point in pt_bbox to any point of the face. + // Take the minimum of these maximum face distances. + + if( !pt_box.valid() ) + return std::numeric_limits::max(); + + // make sure bbox is valid + ThrowAssert( valid() ); + + Real SqrDistMin = 0.0; + for ( int j = 0; j < DIM; j++ ) + { + for ( int side = 0; side < 2; ++side) + { + Real SqrDistSideMin = 0.0; + for ( int i = 0; i < DIM; i++ ) + { + const Real delta = (i!=j) ? std::max(pt_box.max[i]-min[i],max[i]-pt_box.min[i]) : + ((side==0) ? std::max(min[i]-pt_box.min[i], pt_box.max[i]-min[i]) : std::max(max[i]-pt_box.min[i], pt_box.max[i]-max[i])); + ThrowAssert(delta >= 0.0); + SqrDistSideMin += delta*delta; + } + if (SqrDistMin==0.0 || SqrDistSideMin; +template class BoundingBox_T; + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_BoundingBox.hpp b/packages/krino/krino/krino_lib/Akri_BoundingBox.hpp new file mode 100644 index 000000000000..e64ce337df88 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_BoundingBox.hpp @@ -0,0 +1,212 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_BoundingBox_h +#define Akri_BoundingBox_h + +#include + +#include + +#include +#include + +namespace krino { + +template +class BoundingBox_T { + +public: + typedef REAL Real; + typedef Vec VecType; + +private: + VecType min; + VecType max; + +public: + static void gather_bboxes( const BoundingBox_T & local_bbox, + std::vector< BoundingBox_T > & all_bboxes ); + + void global_reduce(); + + template + void accommodate( const VECTYPE & pt ); + + template + void accommodate( const BoundingBox_T & bbox ); + + const VecType & get_min() const { return min; } + const VecType & get_max() const { return max; } + + template + bool contains( const VECTYPE & pt ) const; + + // Lower bound on the square of the distance from the point pt to surfaces contained in *this + Real SqrDistLowerBnd( const VecType & pt ) const; + + // Upper bound on the square of the distance from the point pt to surfaces contained in *this + Real SqrDistUpperBnd( const VecType & pt ) const; + + // Upper bound on the square of the distance from any point in pt_bbox to surfaces contained in *this + Real SqrDistUpperBnd( const BoundingBox_T & pt_box ) const; + + void pad( const Real & dist ); + void pad_epsilon(); + + void scale( const Real & fraction ); + + Real SqrSize() const; + + bool valid() const + { + bool is_not_valid = (min[0]>max[0]); + return !is_not_valid; + } + + bool intersects( const BoundingBox_T & bbox ) const; + bool contains( const BoundingBox_T & bbox ) const; + + int max_span_direction() const; + + VecType center() const { return Real(0.5)*(min+max); } + + void clear() { + min = VecType(std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()); + max = VecType(-std::numeric_limits::max(),-std::numeric_limits::max(),-std::numeric_limits::max()); + } + + template + BoundingBox_T( const VECTYPE & pt_min, + const VECTYPE & pt_max ) + : min(pt_min[0], pt_min[1], pt_min[2]), + max(pt_max[0], pt_max[1], pt_max[2]) {} + + BoundingBox_T() + : min(std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()), + max(-std::numeric_limits::max(),-std::numeric_limits::max(),-std::numeric_limits::max()) {} +}; + +template +template +inline void +BoundingBox_T::accommodate( const VECTYPE & pt ) +{ + for ( int i = 0; i < DIM; ++i ) + { + if ( pt[i] < min[i] ) min[i] = pt[i]; + if ( pt[i] > max[i] ) max[i] = pt[i]; + } +} + +template +template +inline void +BoundingBox_T::accommodate( const BoundingBox_T & bbox ) +{ + for ( int i = 0; i < DIM; ++i ) + { + if ( bbox.get_min()[i] < min[i] ) min[i] = bbox.get_min()[i]; + if ( bbox.get_max()[i] > max[i] ) max[i] = bbox.get_max()[i]; + } +} + +template +template +inline bool +BoundingBox_T::contains( const VECTYPE & pt ) const +{ + for ( int i = 0; i < DIM; ++i ) + { + if ( pt[i] < min[i] || pt[i] > max[i] ) return false; + } + return true; +} + +template +inline bool +BoundingBox_T::intersects( const BoundingBox_T & bbox ) const +{ + for ( int i = 0; i < DIM; ++i ) + { + if ( bbox.max[i] < min[i] || bbox.min[i] > max[i] ) return false; + } + return true; +} + +template +inline bool +BoundingBox_T::contains( const BoundingBox_T & bbox ) const +{ + for ( int i = 0; i < DIM; ++i ) + { + if ( bbox.min[i] < min[i] || bbox.max[i] > max[i] ) return false; + } + return true; +} + +template +inline int +BoundingBox_T::max_span_direction() const +{ + int max_dir = 0; + for ( int i = 1; i < DIM; ++i ) + { + if ( max[i] - min[i] > max[max_dir] - min[max_dir] ) max_dir = i; + } + return max_dir; +} + +template +inline REAL +BoundingBox_T::SqrSize() const +{ + Real sqrSize = 0.0; + if (valid()) + { + for ( int i = 0; i < DIM; ++i ) + { + sqrSize += (max[i]-min[i])*(max[i]-min[i]); + } + } + return sqrSize; +} + +template +inline void +BoundingBox_T::pad( const Real & dist ) +{ + if (!valid()) return; + + VecType extension; + for (int i = 0; i < DIM; i++ ) + extension[i] = dist; + + min -= extension; + max += extension; +} + +template +inline void +BoundingBox_T::scale( const Real & scale_factor ) +{ + if (!valid()) return; + + Real fraction = 0.5 * ( scale_factor - 1. ); + VecType extension; + for (int i = 0; i < DIM; i++ ) + extension[i] = fraction * ( max[i] - min[i] ); + min -= extension; + max += extension; +} + +typedef BoundingBox_T BoundingBox; + +} // namespace krino + +#endif // Akri_BoundingBox_h diff --git a/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.cpp b/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.cpp new file mode 100644 index 000000000000..32bd6e2b02b6 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.cpp @@ -0,0 +1,697 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace krino{ + +BoundingBoxMesh::BoundingBoxMesh(stk::topology element_topology, const std::vector & entity_rank_names) +: m_element_topology(element_topology), m_nx(0), m_ny(0), m_nz(0) +{ + ThrowRequire(element_topology == stk::topology::TRIANGLE_3_2D || + element_topology == stk::topology::QUADRILATERAL_4_2D || + element_topology == stk::topology::TETRAHEDRON_4 || + element_topology == stk::topology::HEXAHEDRON_8); + + m_meta = std::make_unique(element_topology.dimension(), entity_rank_names); + AuxMetaData & aux_meta = AuxMetaData::create(*m_meta); + stk::mesh::Part & block_part = m_meta->declare_part_with_topology( "block_1", element_topology ); + stk::io::put_io_part_attribute(block_part); + m_elem_parts.push_back(&block_part); + m_elem_parts.push_back(&aux_meta.active_part()); + m_node_parts.push_back(&aux_meta.active_part()); + + declare_domain_side_parts(block_part); +} + +void +BoundingBoxMesh::set_domain(const BoundingBoxType & mesh_bbox, const double mesh_size, const int pad_size) +{ + m_mesh_bbox = mesh_bbox; + const Vector3d padding(0.5*mesh_size*pad_size, 0.5*mesh_size*pad_size, 0.5*mesh_size*pad_size); + m_mesh_bbox = BoundingBoxType(mesh_bbox.get_min() - padding, mesh_bbox.get_max() + padding); + + const typename BoundingBoxType::VecType min = m_mesh_bbox.get_min(); + const typename BoundingBoxType::VecType max = m_mesh_bbox.get_max(); + const typename BoundingBoxType::VecType span = max-min; + m_nx = (size_t) (0.5 + span[0] / mesh_size); + const bool isTriangularLattice = (TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType || FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType); + const double dy = isTriangularLattice ? (0.5*mesh_size*std::sqrt(3.0)) : mesh_size; + m_ny = (size_t) (0.5 + span[1] / dy); + m_nz = (m_element_topology.dimension() == 2) ? 1 : ((size_t) (0.5 + span[2] / mesh_size)); + + if (m_element_topology.dimension() == 2) + { + krinolog << "Generated mesh with for domain " + << "(min,max) = ((" << min[0] << "," << min[1] << "),("<< max[0] << "," << max[1] << ")" + << ", (nx,ny) = (" << m_nx << "," << m_ny << ")" << stk::diag::dendl; + } + else + { + krinolog << "Generated mesh with for domain " + << "(min,max) = ((" << min[0] << "," << min[1] << "," << min[2] << "),("<< max[0] << "," << max[1] << "," << max[2] << ")" + << ", (nx,ny,nz) = (" << m_nx << "," << m_ny << "," << m_nz << ")" << stk::diag::dendl; + } + +} + +void BoundingBoxMesh::set_is_cell_edge_function_for_cell_based_mesh() const +{ + const std::array N = {m_nx, m_ny, m_nz}; + const int dim = m_meta->spatial_dimension(); + ThrowRequireMsg(m_mesh, "Cannot call set_is_cell_edge_function() before BulkData is created."); + const stk::mesh::BulkData & mesh = *m_mesh; + + auto is_cell_edge = [N,dim,&mesh](stk::mesh::Entity node0, stk::mesh::Entity node1) + { + const auto node0Indices = get_node_x_y_z(mesh.identifier(node0), N); + const auto node1Indices = get_node_x_y_z(mesh.identifier(node1), N); + if (dim == 2) + { + return node0Indices[0] == node1Indices[0] || node0Indices[1] == node1Indices[1]; + } + const bool matchX = node0Indices[0] == node1Indices[0]; + const bool matchY = node0Indices[1] == node1Indices[1]; + const bool matchZ = node0Indices[2] == node1Indices[2]; + return (matchX && matchY) || (matchX && matchZ) || (matchY && matchZ); + }; + + AuxMetaData & aux_meta = AuxMetaData::get(*m_meta); + aux_meta.set_is_cell_edge_function(is_cell_edge); +} + +void BoundingBoxMesh::set_is_cell_edge_function_for_BCC_mesh() const +{ + auto is_cell_edge = [](stk::mesh::Entity node0, stk::mesh::Entity node1) + { + return true; + }; + + AuxMetaData & aux_meta = AuxMetaData::get(*m_meta); + aux_meta.set_is_cell_edge_function(is_cell_edge); +} + +void +BoundingBoxMesh::populate_mesh(stk::ParallelMachine pm, const stk::mesh::BulkData::AutomaticAuraOption auto_aura_option) +{ /* %TRACE[ON]% */ Trace trace__("krino::BoundingBoxMesh::populate_mesh()"); /* %TRACE% */ + ThrowRequireMsg(m_mesh_bbox.valid(), "Must call set_domain() before populate_mesh()"); + m_mesh = std::make_unique(*m_meta, pm, auto_aura_option); + if (CUBIC_BOUNDING_BOX_MESH == myMeshStructureType) + populate_cell_based_mesh(); + else if (TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType || FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType) + populate_2D_triangular_lattice_based_mesh(); + else if (BCC_BOUNDING_BOX_MESH == myMeshStructureType || FLAT_WALLED_BCC_BOUNDING_BOX_MESH == myMeshStructureType) + populate_BCC_mesh(); + else + ThrowRequireMsg(false, "Unsupported or unrecognized mesh structure type " << myMeshStructureType); +} + +enum BCCNode { BCC_NODE=8, BCC_NODE_XMINUS=9, BCC_NODE_XPLUS=10, BCC_NODE_YMINUS=11, BCC_NODE_YPLUS=12, BCC_NODE_ZMINUS=13, BCC_NODE_ZPLUS=14 }; + +void +BoundingBoxMesh::build_face_tets( size_t cell_id, size_t ix , size_t iy , size_t iz, int iface, const std::vector & cell_node_ids ) +{ + std::vector>> faceTets = { + {{BCC_NODE, BCC_NODE_XMINUS, 0, 4}, + {BCC_NODE, BCC_NODE_XMINUS, 4, 7}, + {BCC_NODE, BCC_NODE_XMINUS, 7, 3}, + {BCC_NODE, BCC_NODE_XMINUS, 3, 0}}, + {{BCC_NODE, BCC_NODE_XPLUS, 1, 2}, + {BCC_NODE, BCC_NODE_XPLUS, 2, 6}, + {BCC_NODE, BCC_NODE_XPLUS, 6, 5}, + {BCC_NODE, BCC_NODE_XPLUS, 5, 1}}, + {{BCC_NODE, BCC_NODE_YMINUS, 0, 1}, + {BCC_NODE, BCC_NODE_YMINUS, 1, 5}, + {BCC_NODE, BCC_NODE_YMINUS, 5, 4}, + {BCC_NODE, BCC_NODE_YMINUS, 4, 0}}, + {{BCC_NODE, BCC_NODE_YPLUS, 2, 3}, + {BCC_NODE, BCC_NODE_YPLUS, 3, 7}, + {BCC_NODE, BCC_NODE_YPLUS, 7, 6}, + {BCC_NODE, BCC_NODE_YPLUS, 6, 2}}, + {{BCC_NODE, BCC_NODE_ZMINUS, 0, 3}, + {BCC_NODE, BCC_NODE_ZMINUS, 3, 2}, + {BCC_NODE, BCC_NODE_ZMINUS, 2, 1}, + {BCC_NODE, BCC_NODE_ZMINUS, 1, 0}}, + {{BCC_NODE, BCC_NODE_ZPLUS, 4, 5}, + {BCC_NODE, BCC_NODE_ZPLUS, 5, 6}, + {BCC_NODE, BCC_NODE_ZPLUS, 6, 7}, + {BCC_NODE, BCC_NODE_ZPLUS, 7, 4}} + }; + + const stk::mesh::EntityId elem_id_start = 1; + const int num_elem_per_face = 4; + const int num_faces_per_cell = 6; + const int num_nodes_per_elem = 4; + std::vector elemNodes(num_nodes_per_elem); + + const auto & faceTet = faceTets[iface]; + for (int ielem = 0; ielem < num_elem_per_face; ++ielem) + { + stk::mesh::EntityId elem_id = num_elem_per_face*num_faces_per_cell*cell_id + num_elem_per_face*iface + ielem + elem_id_start; // Uses twice as many IDs as necessary + for (int elem_node_index = 0; elem_node_indexcoordinate_field(); + stk::mesh::EntityId nodeId = get_node_id(ix, iy, iz); + stk::mesh::Entity const node = m_mesh->get_entity( stk::topology::NODE_RANK, nodeId ); + if (m_mesh->is_valid(node)) + { + m_mesh->change_entity_parts(node, m_node_parts); + + double * coord_data = static_cast(stk::mesh::field_data( *coord_field, node )); + my_coord_mapping->get_node_coordinates(coord_data, m_meta->spatial_dimension(), {ix, iy, iz}); + } +} + +void +BoundingBoxMesh::setup_BCC_node( size_t ix , size_t iy , size_t iz, int dx, int dy, int dz ) +{ + stk::mesh::FieldBase const* coord_field = m_meta->coordinate_field(); + stk::mesh::EntityId nodeId = get_BCC_node_id(ix, iy, iz, dx, dy, dz); + stk::mesh::Entity const node = m_mesh->get_entity( stk::topology::NODE_RANK, nodeId ); + if (m_mesh->is_valid(node)) + { + m_mesh->change_entity_parts(node, m_node_parts); + + const bool flattenBoundaries = FLAT_WALLED_BCC_BOUNDING_BOX_MESH == myMeshStructureType; + double * coord_data = static_cast(stk::mesh::field_data( *coord_field, node )); + my_coord_mapping->get_BCC_node_coordinates(coord_data, m_meta->spatial_dimension(), flattenBoundaries, {ix, iy, iz}, {dx, dy, dz}); + } +} + +size_t get_triangle_lattice_node_id(size_t ix, size_t iy, size_t nx, size_t ny) +{ + return 1 + iy*(nx+1) + ix + ((iy%2 == 0) ? (iy/2) : ((iy-1)/2)); +} + +void fill_triangle_lattice_node_indices(const size_t ix, const size_t iy, std::array,3> & triNodeIndices) +{ + if (iy%2 == 0) + { + if (ix%2 == 0) + triNodeIndices = {{ {{ix/2,iy}}, {{ix/2+1,iy+1}}, {{ix/2,iy+1}} }}; + else + triNodeIndices = {{ {{(ix-1)/2,iy}}, {{(ix-1)/2+1,iy}}, {{(ix-1)/2+1,iy+1}} }}; + } + else + { + if (ix%2 == 0) + triNodeIndices = {{ {{ix/2,iy}}, {{ix/2+1,iy}}, {{ix/2,iy+1}} }}; + else + triNodeIndices = {{ {{(ix-1)/2+1,iy}}, {{(ix-1)/2+1,iy+1}}, {{(ix-1)/2,iy+1}} }}; + } +} + +void +BoundingBoxMesh::populate_2D_triangular_lattice_based_mesh() +{ /* %TRACE[ON]% */ Trace trace__("krino::BoundingBoxMesh::populate_2D_triangular_lattice_based_mesh()"); /* %TRACE% */ + ThrowRequire(m_mesh); + + const int p_size = m_mesh->parallel_size(); + const int p_rank = m_mesh->parallel_rank(); + stk::mesh::FieldBase const* coord_field = m_meta->coordinate_field(); + my_coord_mapping = std::make_unique(m_nx, m_ny, m_nz, m_mesh_bbox); + + ThrowRequire(m_element_topology == stk::topology::TRIANGLE_3_2D); + const bool flattenBoundaries = FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType; + + const size_t NelemPerSlabInY = (2*m_nx+1); + const size_t Nelem = m_ny*NelemPerSlabInY; + const size_t beg_elem = ( Nelem * p_rank ) / p_size ; + const size_t end_elem = ( Nelem * ( p_rank + 1 ) ) / p_size ; + + const size_t num_local_cells = end_elem-beg_elem; + krinolog << "BoundingBoxMesh creating " << num_local_cells << " local cells." << stk::diag::dendl; + + std::vector triNodes(3); + std::array,3> triNodeIndices; + + m_mesh->modification_begin(); + + { + for (size_t elemIndex=beg_elem; elemIndex!=end_elem; ++elemIndex) + { + const size_t iy = elemIndex / NelemPerSlabInY; + const size_t ix = elemIndex - iy*NelemPerSlabInY; + + fill_triangle_lattice_node_indices(ix, iy, triNodeIndices); + + triNodes = {get_triangle_lattice_node_id(triNodeIndices[0][0], triNodeIndices[0][1], m_nx, m_ny), + get_triangle_lattice_node_id(triNodeIndices[1][0], triNodeIndices[1][1], m_nx, m_ny), + get_triangle_lattice_node_id(triNodeIndices[2][0], triNodeIndices[2][1], m_nx, m_ny)}; + + stk::mesh::declare_element( *m_mesh, m_elem_parts, elemIndex+1, triNodes ); + + for (int n=0; n<3; ++n) + { + stk::mesh::Entity const node = m_mesh->get_entity( stk::topology::NODE_RANK , triNodes[n] ); + m_mesh->change_entity_parts(node, m_node_parts); + + double * coord_data = static_cast(stk::mesh::field_data( *coord_field, node )); + + my_coord_mapping->get_triangle_lattice_node_coordinates(coord_data, flattenBoundaries, {{triNodeIndices[n][0], triNodeIndices[n][1]}}); + } + } + stk::tools::fix_node_sharing_via_search(*m_mesh); + } + m_mesh->modification_end(); + + std::vector counts; + stk::mesh::count_entities( m_meta->locally_owned_part(), *m_mesh, counts ); + krinolog << "Generated mesh with " << counts[stk::topology::ELEM_RANK] << " local elements and " << counts[stk::topology::NODE_RANK] << " local nodes." << stk::diag::dendl; +} + +void +BoundingBoxMesh::populate_BCC_mesh() +{ /* %TRACE[ON]% */ Trace trace__("krino::BoundingBoxMesh::populate_BCC_mesh()"); /* %TRACE% */ + ThrowRequire(m_mesh); + set_is_cell_edge_function_for_BCC_mesh(); + + const int p_size = m_mesh->parallel_size(); + const int p_rank = m_mesh->parallel_rank(); + + std::vector> hex_cell_node_locations = { {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} }; + std::vector>> BCC_cell_neighbors = { {BCC_NODE,{0,0,0}}, + {BCC_NODE_XMINUS,{-1,0,0}}, {BCC_NODE_XPLUS,{+1,0,0}}, + {BCC_NODE_YMINUS,{0,-1,0}}, {BCC_NODE_YPLUS,{0,+1,0}}, + {BCC_NODE_ZMINUS,{0,0,-1}}, {BCC_NODE_ZPLUS,{0,0,+1}}}; + + my_coord_mapping = std::make_unique(m_nx, m_ny, m_nz, m_mesh_bbox); + + std::pair proc_cell_range = determine_processor_cells(p_size, p_rank); + const size_t num_local_cells = proc_cell_range.second-proc_cell_range.first; + krinolog << "BoundingBoxMesh creating " << num_local_cells << " local cells." << stk::diag::dendl; + + const int num_nodes_per_cell = 8; + const int num_nodes_per_cell_plus_BCC_nodes = 15; + std::vector cell_node_ids(num_nodes_per_cell_plus_BCC_nodes); + + m_mesh->modification_begin(); + + { + size_t count = 0; + for (size_t cell_id=proc_cell_range.first; cell_id!=proc_cell_range.second; ++cell_id) + { + size_t ix = 0, iy = 0, iz = 0; + get_cell_x_y_z(cell_id, ix, iy, iz); + + if ( count != 0 && count % 1000000 == 0) + { + krinolog << "Creating local cell " << count << " ." << stk::diag::dendl; + } + ++count; + + for (int cell_node_index=0; cell_node_indexmodification_end(); + + std::vector counts; + stk::mesh::count_entities( m_meta->locally_owned_part(), *m_mesh, counts ); + krinolog << "Generated mesh with " << counts[stk::topology::ELEM_RANK] << " local elements and " << counts[stk::topology::NODE_RANK] << " local nodes." << stk::diag::dendl; +} + +void +BoundingBoxMesh::populate_cell_based_mesh() +{ /* %TRACE[ON]% */ Trace trace__("krino::BoundingBoxMesh::populate_cell_based_mesh()"); /* %TRACE% */ + ThrowRequire(m_mesh); + set_is_cell_edge_function_for_cell_based_mesh(); + + const int p_size = m_mesh->parallel_size(); + const int p_rank = m_mesh->parallel_rank(); + const int dim = m_element_topology.dimension(); + stk::mesh::FieldBase const* coord_field = m_meta->coordinate_field(); + + std::vector> hex_cell_node_locations = { {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} }; + std::vector> hex_cell_elem_nodes = {{0, 1, 2, 3, 4, 6, 7}}; + + std::vector> tet_even_cell_elem_nodes = {{0, 1, 2, 5}, + {0, 2, 7, 5}, + {0, 2, 3, 7}, + {0, 5, 7, 4}, + {2, 7, 5, 6}}; + std::vector> tet_odd_cell_elem_nodes = {{0, 1, 3, 4}, + {1, 2, 3, 6}, + {1, 3, 4, 6}, + {3, 4, 6, 7}, + {1, 6, 4, 5}}; + + std::vector> quad_cell_node_locations = { {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0} }; + std::vector> quad_cell_elem_nodes = {{0, 1, 2, 3}}; + + std::vector> tri_even_cell_elem_nodes = {{0, 1, 2}, {0, 2, 3}}; + std::vector> tri_odd_cell_elem_nodes = {{0, 1, 3}, {1, 2, 3}}; + + const std::vector> & cell_node_locations = (dim == 2) ? quad_cell_node_locations : hex_cell_node_locations; + const std::vector> & even_cell_elem_nodes = + (m_element_topology == stk::topology::TRIANGLE_3_2D) ? tri_even_cell_elem_nodes : + ((m_element_topology == stk::topology::QUADRILATERAL_4) ? quad_cell_elem_nodes : + ((m_element_topology == stk::topology::TETRAHEDRON_4) ? tet_even_cell_elem_nodes : + hex_cell_elem_nodes)); + const std::vector> & odd_cell_elem_nodes = + (m_element_topology == stk::topology::TRIANGLE_3_2D) ? tri_odd_cell_elem_nodes : + ((m_element_topology == stk::topology::QUADRILATERAL_4) ? quad_cell_elem_nodes : + ((m_element_topology == stk::topology::TETRAHEDRON_4) ? tet_odd_cell_elem_nodes : + hex_cell_elem_nodes)); + + std::unordered_map> nodes_to_procs; + generate_node_to_processor_map(p_size, p_rank, cell_node_locations, nodes_to_procs); + const int num_elem_per_cell = even_cell_elem_nodes.size(); + const int num_nodes_per_cell = cell_node_locations.size(); + const int num_nodes_per_elem = even_cell_elem_nodes[0].size(); + const stk::mesh::EntityId elem_id_start = 1; + std::vector cell_node_ids(num_nodes_per_cell); + std::vector elem_nodes(num_nodes_per_elem); + + my_coord_mapping = std::make_unique(m_nx, m_ny, m_nz, m_mesh_bbox); + + std::pair proc_cell_range = determine_processor_cells(p_size, p_rank); + const size_t num_local_cells = proc_cell_range.second-proc_cell_range.first; + krinolog << "BoundingBoxMesh creating " << num_local_cells << " local cells." << stk::diag::dendl; + + m_mesh->modification_begin(); + + { + size_t count = 0; + for (size_t cell_id=proc_cell_range.first; cell_id!=proc_cell_range.second; ++cell_id) + { + size_t ix = 0, iy = 0, iz = 0; + get_cell_x_y_z(cell_id, ix, iy, iz); + + const std::vector> & cell_elem_nodes = ((ix+iy+iz)%2 == 0) ? even_cell_elem_nodes : odd_cell_elem_nodes; + + if ( count % 1000000 == 0) + { + krinolog << "Creating local cell " << count << " ." << stk::diag::dendl; + } + ++count; + + for (int cell_node_index=0; cell_node_indexget_entity( stk::topology::NODE_RANK , node_id ); + m_mesh->change_entity_parts(node, m_node_parts); + + auto map_it = nodes_to_procs.find(node_id); + if (map_it != nodes_to_procs.end()) + { + for (auto other_proc : map_it->second) + { + m_mesh->add_node_sharing(node, other_proc); + } + } + + // Compute and assign coordinates to the node + get_node_x_y_z(node_id, ix, iy, iz); + + double * coord_data = static_cast(stk::mesh::field_data( *coord_field, node )); + my_coord_mapping->get_node_coordinates(coord_data, dim, {ix, iy, iz}); + } + } + } + } + m_mesh->modification_end(); + + std::vector counts; + stk::mesh::count_entities( m_meta->locally_owned_part(), *m_mesh, counts ); + krinolog << "Generated mesh with " << counts[stk::topology::ELEM_RANK] << " local elements and " << counts[stk::topology::NODE_RANK] << " local nodes." << stk::diag::dendl; +} + +void +BoundingBoxMesh::declare_domain_side_parts(const stk::mesh::Part & blockPart) +{ + AuxMetaData & aux_meta = AuxMetaData::get(*m_meta); + + stk::topology side_topology = m_element_topology.side_topology(); + + mySideParts.clear(); + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Xminus", side_topology)); + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Xplus", side_topology)); + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Yminus", side_topology)); + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Yplus", side_topology)); + if (m_meta->spatial_dimension() == 3) + { + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Zminus", side_topology)); + mySideParts.push_back(&aux_meta.declare_io_part_with_topology("Zplus", side_topology)); + } + + for (auto && sidePart : mySideParts) + m_meta->set_surface_to_block_mapping(sidePart, {&blockPart}); +} + +void BoundingBoxMesh::require_has_flat_boundaries() const +{ + ThrowRequireMsg(has_flat_boundaries(), "Domain sides can only be added for CUBIC or FLAT_WALLED_BC generated meshes."); +} + +static bool equal_within_tol(const double x1, const double x2, const double tol) +{ + return std::abs(x1-x2) < tol; +} + +void +BoundingBoxMesh::create_domain_sides() +{ + if (mySideParts.empty()) + return; + + require_has_flat_boundaries(); + + AuxMetaData & aux_meta = AuxMetaData::get(*m_meta); + stk::mesh::create_exposed_block_boundary_sides(*m_mesh, m_meta->universal_part(), {&aux_meta.exposed_boundary_part()}); + + stk::topology side_topology = m_element_topology.side_topology(); + ThrowRequire(mySideParts.size() >= m_meta->spatial_dimension()*2); + + std::vector sides; + stk::mesh::get_selected_entities( aux_meta.exposed_boundary_part() & m_meta->locally_owned_part(), m_mesh->buckets( m_meta->side_rank() ), sides ); + std::vector add_parts(sides.size()); + std::vector remove_parts(sides.size()); + stk::mesh::FieldBase const* coord_field = m_meta->coordinate_field(); + + const auto & min = m_mesh_bbox.get_min(); + const auto & max = m_mesh_bbox.get_max(); + const double relativeTol = 0.01; // should not be at all sensitive to this tolerance + const std::array tol {(max[0]-min[0])/m_nx*relativeTol, (max[1]-min[1])/m_ny*relativeTol, ((m_meta->spatial_dimension() == 3) ? ((max[2]-min[2])/m_nz*relativeTol) : 0.)}; + + const unsigned num_side_nodes = side_topology.num_nodes(); + for (size_t iside=0; isidebegin_nodes(sides[iside]); + std::array domainSide {-2,-2,-2}; + for (unsigned n=0; n(stk::mesh::field_data( *coord_field, side_nodes[n] )); + for (unsigned i=0; ispatial_dimension(); ++i ) + { + if (equal_within_tol(coords[i],min[i],tol[i])) + { + ThrowRequire(domainSide[i] != 1); + if (domainSide[i] == -2) domainSide[i] = -1; + } + else if (equal_within_tol(coords[i],max[i],tol[i])) + { + ThrowRequire(domainSide[i] != -1); + if (domainSide[i] == -2) domainSide[i] = 1; + } + else + { + domainSide[i] = 0; + } + } + } + + const int num_sides_set = ((domainSide[0]==-1||domainSide[0]==1) ? 1 : 0) + ((domainSide[1]==-1||domainSide[1]==1) ? 1 : 0) + ((domainSide[2]==-1||domainSide[2]==1) ? 1 : 0); + ThrowRequire(num_sides_set == 1); + stk::mesh::Part * side_part = nullptr; + if (domainSide[0] == -1) side_part = mySideParts[0]; + else if (domainSide[0] == 1) side_part = mySideParts[1]; + else if (domainSide[1] == -1) side_part = mySideParts[2]; + else if (domainSide[1] == 1) side_part = mySideParts[3]; + else if (domainSide[2] == -1) side_part = mySideParts[4]; + else if (domainSide[2] == 1) side_part = mySideParts[5]; + + add_parts[iside].push_back(side_part); + } + + m_mesh->batch_change_entity_parts(sides, add_parts, remove_parts); +} + +void +BoundingBoxMesh::get_cell_x_y_z( stk::mesh::EntityId cell_id, size_t &ix , size_t &iy , size_t &iz ) const +{ + ix = cell_id % m_nx; + cell_id /= m_nx; + + iy = cell_id % m_ny; + cell_id /= m_ny; + + iz = cell_id; +} + +std::array +BoundingBoxMesh::get_node_x_y_z( stk::mesh::EntityId entity_id, const std::array & N ) +{ + const size_t node_id_start = 1; + entity_id -= node_id_start; + + std::array indices; + indices[0] = entity_id % (N[0]+1); + entity_id /= (N[0]+1); + + indices[1] = entity_id % (N[1]+1); + entity_id /= (N[2]+1); + + indices[2] = entity_id; + return indices; +} + +void +BoundingBoxMesh::get_node_x_y_z( stk::mesh::EntityId entity_id, size_t &ix , size_t &iy , size_t &iz ) const +{ + auto indices = get_node_x_y_z(entity_id, {{m_nx,m_ny,m_nz}}); + ix = indices[0]; + iy = indices[1]; + iz = indices[2]; +} + +std::pair +BoundingBoxMesh::determine_processor_cells(const int p_size, const int p_rank) const +{ + const size_t Ntot = m_nx*m_ny*m_nz; + const size_t beg_elem = ( Ntot * p_rank ) / p_size ; + const size_t end_elem = ( Ntot * ( p_rank + 1 ) ) / p_size ; + return std::make_pair(beg_elem, end_elem); +} + +void +BoundingBoxMesh::generate_node_to_processor_map(const int p_size, + const int p_rank, + const std::vector> & cell_node_locations, + std::unordered_map> & nodes_to_procs) const +{ + std::unordered_set locally_used_nodes; + + std::pair proc_cell_range = determine_processor_cells(p_size, p_rank); + + // First create set of all nodes used by local elements + for (size_t cell_id=proc_cell_range.first; cell_id!=proc_cell_range.second; ++cell_id) + { + size_t ix = 0, iy = 0, iz = 0; + get_cell_x_y_z(cell_id, ix, iy, iz); + + for (size_t cell_node_index=0; cell_node_index other_proc_cell_range = determine_processor_cells(p_size, other_p_rank); + + for (size_t cell_id=other_proc_cell_range.first; cell_id!=other_proc_cell_range.second; ++cell_id) + { + size_t ix = 0, iy = 0, iz = 0; + get_cell_x_y_z(cell_id, ix, iy, iz); + + for (size_t cell_node_index=0; cell_node_index & node_procs = nodes_to_procs[nodeId]; + if (std::find(node_procs.begin(), node_procs.end(), other_p_rank) == node_procs.end()) + { + node_procs.push_back(other_p_rank); + } + } + } + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.hpp b/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.hpp new file mode 100644 index 000000000000..45572ed5ea79 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_BoundingBoxMesh.hpp @@ -0,0 +1,157 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_BoundingBoxMesh_h +#define Akri_BoundingBoxMesh_h + +#include +#include +#include +#include +#include + +namespace krino { + +class CartesianCoordinateMapping +{ +public: + CartesianCoordinateMapping(const size_t nx, const size_t ny, const size_t nz, + const BoundingBox_T & bbox) + : m_N{nx, ny, nz}, + m_bbox(bbox) + {} + void get_node_coordinates(double * node_coords, const int spatial_dim, const std::array & ijk) const + { + const Vector3d & min = m_bbox.get_min(); + const Vector3d & max = m_bbox.get_max(); + for (int i=0; i < spatial_dim; ++i) + node_coords[i] = min[i] + (max[i]-min[i])*ijk[i]/m_N[i]; + } + void get_triangle_lattice_node_coordinates(double * node_coords, const bool flattenBoundaries, const std::array & ij) const + { + const Vector3d & min = m_bbox.get_min(); + const Vector3d & max = m_bbox.get_max(); + const double offset = ij[1]%2==0 ? 0.0 : -0.5; + node_coords[0] = min[0] + (max[0]-min[0])/m_N[0] * (ij[0]+offset); + if (flattenBoundaries) + node_coords[0] = std::min(max[0], std::max(min[0], node_coords[0])); + node_coords[1] = min[1] + (max[1]-min[1])/m_N[1] * ij[1]; + } + void get_BCC_node_coordinates(double * node_coords, const int spatial_dim, const bool flattenBoundaries, const std::array & ijk, const std::array & dijk) const + { + const Vector3d & min = m_bbox.get_min(); + const Vector3d & max = m_bbox.get_max(); + for (int i=0; i < spatial_dim; ++i) + { + node_coords[i] = min[i] + (max[i]-min[i])*(0.5+ijk[i]+dijk[i])/m_N[i]; + if (flattenBoundaries) + node_coords[i] = std::min(max[i], std::max(min[i], node_coords[i])); + } + } +private: + const std::array m_N; + const BoundingBox_T m_bbox; +}; + +enum BoundingBoxMeshStructureType +{ + CUBIC_BOUNDING_BOX_MESH = 0, + BCC_BOUNDING_BOX_MESH = 1, + FLAT_WALLED_BCC_BOUNDING_BOX_MESH = 2, + TRIANGULAR_LATTICE_BOUNDING_BOX_MESH = 3, + FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH = 4 +}; + +class BoundingBoxMesh { +public: + typedef BoundingBox_T BoundingBoxType; + static std::array get_node_x_y_z( stk::mesh::EntityId entity_id, const std::array & N ); + +public: + BoundingBoxMesh(stk::topology element_topology, const std::vector& rank_names = std::vector()); + void set_domain(const BoundingBoxType & mesh_bbox, const double mesh_size, const int pad_cells = 0); + void populate_mesh(stk::ParallelMachine pm = MPI_COMM_WORLD, const stk::mesh::BulkData::AutomaticAuraOption auto_aura_option = stk::mesh::BulkData::AUTO_AURA); + stk::mesh::MetaData & meta_data() { ThrowAssert( nullptr != m_meta.get() ) ; return *m_meta; } + stk::mesh::BulkData & bulk_data() { ThrowAssert( nullptr != m_mesh.get() ) ; return *m_mesh; } + const stk::mesh::MetaData & meta_data() const { ThrowAssert( nullptr != m_meta.get() ) ; return *m_meta; } + const stk::mesh::BulkData & bulk_data() const { ThrowAssert( nullptr != m_mesh.get() ) ; return *m_mesh; } + + void create_domain_sides(); + const CartesianCoordinateMapping & get_coord_mapping() const { return *my_coord_mapping; } + void get_node_x_y_z( stk::mesh::EntityId entity_id, size_t &ix , size_t &iy , size_t &iz ) const; + void set_mesh_structure_type(BoundingBoxMeshStructureType type) { myMeshStructureType = type; } + bool has_flat_boundaries() const { return CUBIC_BOUNDING_BOX_MESH == myMeshStructureType || FLAT_WALLED_BCC_BOUNDING_BOX_MESH == myMeshStructureType || FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == myMeshStructureType; } +private: + void declare_domain_side_parts(const stk::mesh::Part & blockPart); + void require_has_flat_boundaries() const; + void populate_2D_triangular_lattice_based_mesh(); + void populate_BCC_mesh(); + void populate_cell_based_mesh(); + void setup_cell_node( size_t ix , size_t iy , size_t iz ); + void setup_BCC_node( size_t ix , size_t iy , size_t iz, int dx, int dy, int dz ); + void build_face_tets( size_t cell_id, size_t ix , size_t iy , size_t iz, int iface, const std::vector & cell_node_ids ); + stk::mesh::EntityId get_node_id(const size_t ix, const size_t iy, const size_t iz ) const + { + const size_t node_id_start = 1; + return node_id_start + ix + ( m_nx + 1 ) * ( iy + ( m_ny + 1 ) * iz ); + } + stk::mesh::EntityId get_BCC_node_id(const size_t ix, const size_t iy, const size_t iz, const int dx, const int dy, const int dz ) const + { + const size_t node_id_start = 1; + const size_t num_nodes = ( m_nx + 1 ) * ( m_ny + 1 ) * ( m_nz + 1 ); + return node_id_start + num_nodes + (ix+1+dx) + ( m_nx + 2 ) * ( (iy+1+dy) + ( m_ny + 2 ) * (iz+1+dz) ); + } + void get_cell_x_y_z( stk::mesh::EntityId cell_id, size_t &ix , size_t &iy , size_t &iz ) const; + std::pair determine_processor_cells(const int p_size, const int p_rank) const; + void generate_node_to_processor_map(const int p_size, + const int p_rank, + const std::vector> & cell_node_locations, + std::unordered_map> & nodes_to_procs) const; + void set_is_cell_edge_function_for_BCC_mesh() const; + void set_is_cell_edge_function_for_cell_based_mesh() const; +private: + std::unique_ptr m_meta; + std::unique_ptr m_mesh; + std::unique_ptr my_coord_mapping; + stk::mesh::PartVector m_elem_parts; + stk::mesh::PartVector m_node_parts; + const stk::topology m_element_topology; + BoundingBoxMeshStructureType myMeshStructureType{CUBIC_BOUNDING_BOX_MESH}; + size_t m_nx, m_ny, m_nz; + BoundingBoxType m_mesh_bbox; + std::vector mySideParts; +}; + +class BoundingBoxMeshTri3 : public BoundingBoxMesh +{ +public: + BoundingBoxMeshTri3() : BoundingBoxMesh(stk::topology::TRIANGLE_3_2D) {} +}; + +class BoundingBoxMeshQuad4 : public BoundingBoxMesh +{ +public: + BoundingBoxMeshQuad4() : BoundingBoxMesh(stk::topology::QUADRILATERAL_4_2D) {} +}; + +class BoundingBoxMeshTet4 : public BoundingBoxMesh +{ +public: + BoundingBoxMeshTet4() : BoundingBoxMesh(stk::topology::TETRAHEDRON_4) {} +}; + +class BoundingBoxMeshHex8 : public BoundingBoxMesh +{ +public: + BoundingBoxMeshHex8() : BoundingBoxMesh(stk::topology::HEXAHEDRON_8) {} +}; + +} // namespace krino + +#endif // Akri_BoundingBoxMesh_h diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.cpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.cpp new file mode 100644 index 000000000000..b856b61eed17 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.cpp @@ -0,0 +1,636 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include + +namespace krino{ + +CDFEM_Parent_Edge::CDFEM_Parent_Edge(const std::vector & edgeNodes, + const std::vector & edgeNodePositions) +: my_edge_nodes(edgeNodes), + my_edge_node_positions(edgeNodePositions) +{ +} + +double CDFEM_Parent_Edge::MinSize() +{ + return SegmentLowerEnvelope::MinSize(); +} + +double CDFEM_Parent_Edge::get_edge_node_position(stk::mesh::Entity edgeNode) const +{ + for (size_t i=0; isecond << " "; + } + krinolog << "}" << "\n"; +} + +void +CDFEM_Parent_Edge::find_crossings(const std::vector > & nodes_isovar) +{ + my_crossings.clear(); + my_crossing_signs.clear(); + + const int num_nodes = get_num_nodes(); + ThrowAssert(static_cast(nodes_isovar.size()) == num_nodes); + const int num_ls = nodes_isovar[0].size(); + if (num_ls > 1 && Phase_Support::has_one_levelset_per_phase()) + { + find_crossings_multiple_levelset(nodes_isovar); + find_crossings_including_fake_ones(nodes_isovar); + return; + } + + // TODO: respect minimum_internal_edge_size + + for ( int ls_index = 0; ls_index < num_ls; ++ls_index ) + { + InterfaceID iface(ls_index, ls_index); + my_crossing_signs[iface] = LevelSet::sign(nodes_isovar[num_nodes-1][ls_index]); + if( !LevelSet::sign_change(nodes_isovar[0][ls_index], nodes_isovar[num_nodes-1][ls_index]) ) continue; + for ( int s = 0; s < num_nodes-1; ++s ) + { + const double ls0 = nodes_isovar[s][ls_index]; + const double ls1 = nodes_isovar[s+1][ls_index]; + if ( LevelSet::sign_change(ls0, ls1) ) + { + const double interval_position = ls0 / ( ls0 - ls1 ); + const double abs_position = (1.-interval_position)*my_edge_node_positions[s] + interval_position*my_edge_node_positions[s+1]; + my_crossings[iface] = abs_position; + my_crossing_signs[iface] = LevelSet::sign(ls1); + } + } + } + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + debug_print_crossings(); + } +} + +std::vector*> get_sorted_internal_crossings(CrossingMap & crossings) +{ + std::vector*> sortedCrossings; + sortedCrossings.reserve(crossings.size()); + for (auto && crossing : crossings) + if (crossing.second > 0. && crossing.second < 1.) + sortedCrossings.push_back(&crossing); + + std::sort(sortedCrossings.begin(), sortedCrossings.end(), + [](const std::pair* crossing0, const std::pair* crossing1) + { return crossing0->second < crossing1->second || (crossing0->second == crossing1->second && crossing0->first < crossing1->first); }); + return sortedCrossings; +} + +void collapse_small_internal_segments_while_perserving_topology(CrossingMap &crossings, const double snapTol) +{ + const std::vector*> sortedCrossings = get_sorted_internal_crossings(crossings); + + bool done = false; + while (!done) + { + size_t minSegment = 0; + double minSegmentSize = snapTol; + for (size_t i=1; isecond - sortedCrossings[i-1]->second); + if (segmentSize > 0 && segmentSize <= minSegmentSize) + { + minSegment = i; + minSegmentSize = segmentSize; + } + } + done = minSegment == 0; + if (!done) + { + double & loc0 = sortedCrossings[minSegment-1]->second; + double & loc1 = sortedCrossings[minSegment]->second; + const double newLoc = 0.5*(loc0+loc1); + loc0 = newLoc; + loc1 = newLoc; + } + } +} + +void CDFEM_Parent_Edge::collapse_small_segments_while_preserving_topology(const double snapTol) +{ + for (auto && crossing : my_crossings) + { + if (crossing.second <= snapTol) + crossing.second = 0.0; + else if (crossing.second >= 1.-snapTol ) + crossing.second = 1.0; + } + collapse_small_internal_segments_while_perserving_topology(my_crossings, snapTol); +} + +std::vector get_effective_sorted_parent_node_domains(const int parentNodeIndex, const CrossingMap & crossings, const std::vector & sortedParentNodeDomains) +{ + std::vector effectiveSortedParentNodeDomains = sortedParentNodeDomains; + double endPoint = (parentNodeIndex == 0) ? 0. : 1.; + for (auto && crossing : crossings) + { + if (std::binary_search(sortedParentNodeDomains.begin(), sortedParentNodeDomains.end(), crossing.first.first_ls()) || + std::binary_search(sortedParentNodeDomains.begin(), sortedParentNodeDomains.end(), crossing.first.second_ls())) + { + endPoint = (parentNodeIndex == 0) ? std::max(endPoint, crossing.second) : std::min(endPoint, crossing.second); + } + } + for (auto && crossing : crossings) + { + const bool inRange = (parentNodeIndex == 0) ? (crossing.second < endPoint) : (crossing.second > endPoint); + if (inRange) + { + effectiveSortedParentNodeDomains.push_back(crossing.first.first_ls()); + effectiveSortedParentNodeDomains.push_back(crossing.first.second_ls()); + } + } + + stk::util::sort_and_unique(effectiveSortedParentNodeDomains); + return effectiveSortedParentNodeDomains; +} + +void adjust_crossing_locations_based_on_node_captured_domains_for_level_set_per_interface(const std::vector & sortedParentNode0Domains, const std::vector & sortedParentNode1Domains, CrossingMap & crossings) +{ + if (sortedParentNode0Domains.empty() && sortedParentNode1Domains.empty()) + return; + + for (auto && crossing : crossings) + { + const InterfaceID & iface = crossing.first; + ThrowAssert(iface.first_ls() == iface.second_ls()); + const bool in0 = std::binary_search(sortedParentNode0Domains.begin(), sortedParentNode0Domains.end(), iface.first_ls()); + const bool in1 = std::binary_search(sortedParentNode1Domains.begin(), sortedParentNode1Domains.end(), iface.first_ls()); + + double & loc = crossing.second; + if (in0 && (!in1 || loc<0.5)) + loc = 0.; + else if (in1 && (!in0 || loc>=0.5)) + loc = 1.; + } +} + +void adjust_crossing_locations_based_on_node_captured_domains_for_level_set_per_phase(const int parentNodeIndex, const std::vector & sortedParentNodeDomains, CrossingMap & allCrossings) +{ + if (sortedParentNodeDomains.empty()) + return; + + ThrowAssert(parentNodeIndex == 0 || parentNodeIndex == 1); + const double nodePos = (parentNodeIndex == 0) ? 0. : 1.; + + double furthestLocationToAdjust = (parentNodeIndex == 0) ? 0. : 1.; + for (auto && crossing : allCrossings) + { + const InterfaceID & iface = crossing.first; + if (std::binary_search(sortedParentNodeDomains.begin(), sortedParentNodeDomains.end(), iface.first_ls()) && + std::binary_search(sortedParentNodeDomains.begin(), sortedParentNodeDomains.end(), iface.second_ls())) + { + furthestLocationToAdjust = (parentNodeIndex == 0) ? std::max(furthestLocationToAdjust, crossing.second) : std::min(furthestLocationToAdjust, crossing.second); + crossing.second = nodePos; + } + } + + for (auto && crossing : allCrossings) + { + if ((parentNodeIndex == 0 && crossing.second < furthestLocationToAdjust) || + (parentNodeIndex == 1 && crossing.second > furthestLocationToAdjust)) + { + crossing.second = nodePos; + } + } +} + +void adjust_crossing_locations_based_on_node_captured_domains_for_level_set_per_phase(const std::vector & sortedParentNode0Domains, const std::vector & sortedParentNode1Domains, CrossingMap & allCrossings) +{ + if (sortedParentNode0Domains.empty() && sortedParentNode1Domains.empty()) + return; + + double highestLocToSendTo0 = 0.; + double lowestLocToSendTo1 = 1.; + for (auto && crossing : allCrossings) + { + const InterfaceID & iface = crossing.first; + const bool in0 = + std::binary_search(sortedParentNode0Domains.begin(), sortedParentNode0Domains.end(), iface.first_ls()) && + std::binary_search(sortedParentNode0Domains.begin(), sortedParentNode0Domains.end(), iface.second_ls()); + const bool in1 = + std::binary_search(sortedParentNode1Domains.begin(), sortedParentNode1Domains.end(), iface.first_ls()) && + std::binary_search(sortedParentNode1Domains.begin(), sortedParentNode1Domains.end(), iface.second_ls()); + + double & loc = crossing.second; + if (in0 && (!in1 || loc<0.5)) + { + highestLocToSendTo0 = std::max(loc, highestLocToSendTo0); + loc = 0.; + } + if (in1 && (!in0 || loc>=0.5)) + { + highestLocToSendTo0 = std::min(loc, lowestLocToSendTo1); + loc = 1.; + } + } + + for (auto && crossing : allCrossings) + { + double & loc = crossing.second; + if (loc < highestLocToSendTo0) + loc = 0.; + if (loc > lowestLocToSendTo1) + loc = 1.; + } +} + +void copy_real_crossing_locations_to_fake_crossing_locations(const CrossingMap & realCrossings, CrossingMap & allCrossings) +{ + for (auto && crossing : allCrossings) + { + auto iter = realCrossings.find(crossing.first); + if (iter != realCrossings.end()) + crossing.second = iter->second; + } +} + +std::pair get_begin_and_end_phases(const CrossingMap & realCrossings, const CrossingSignMap & realCrossingSign) +{ + double begLoc = 1.; + double endLoc = 0.; + int begPhase = -1; + int endPhase = -1; + for (auto && crossing : realCrossings) + { + const InterfaceID iface = crossing.first; + const double loc = crossing.second; + const int sign = realCrossingSign.at(iface); + const int fromPhase = (sign == 1) ? iface.first_ls() : iface.second_ls(); + if (loc < begLoc || (loc == begLoc && fromPhase > begPhase)) + { + begPhase = fromPhase; + begLoc = loc; + } + const int toPhase = (sign == -1) ? iface.first_ls() : iface.second_ls(); + if (loc > endLoc || (loc == endLoc && toPhase > endPhase)) + { + endPhase = toPhase; + endLoc = loc; + } + } + return {begPhase,endPhase}; +} + +static double find_next_crossing_location(const CrossingMap & crossings, + const CrossingSignMap & crossingSigns, + const double currentLocation, + const int currentPhase) +{ + double nextLocation = 1.; + for (auto && crossing : crossings) + { + if (crossing.second >= currentLocation) + { + const InterfaceID iface = crossing.first; + const int fromPhase = (crossingSigns.at(iface) == 1) ? iface.first_ls() : iface.second_ls(); + if (fromPhase == currentPhase) + nextLocation = std::min(nextLocation, crossing.second); + } + } + return nextLocation; +} + +static std::vector find_next_phase_candidates_at_location(const CrossingMap & crossings, + const CrossingSignMap & crossingSigns, + const double nextLocation, + const int currentPhase) +{ + std::vector nextPhaseCandidates; + for (auto && crossing : crossings) + { + if (crossing.second == nextLocation) + { + const InterfaceID iface = crossing.first; + const int sign = crossingSigns.at(iface); + const int fromPhase = (sign == 1) ? iface.first_ls() : iface.second_ls(); + if (fromPhase == currentPhase) + { + const int toPhase = (sign == -1) ? iface.first_ls() : iface.second_ls(); + nextPhaseCandidates.push_back(toPhase); + } + } + } + return nextPhaseCandidates; +} + +std::vector find_next_phase_candidates(const CrossingMap & crossings, + const CrossingSignMap & crossingSigns, + const double currentLocation, + const int currentPhase) +{ + const double nextLocation = find_next_crossing_location(crossings, crossingSigns, currentLocation, currentPhase); + return find_next_phase_candidates_at_location(crossings, crossingSigns, nextLocation, currentPhase); +} + +std::vector> shortest_path_to_end(const std::vector> & pathSoFar, + const CrossingMap & crossings, + const CrossingSignMap & crossingSigns, + const double currentLocation, + const int currentPhase, + const int endPhase) +{ + const std::vector nextPhaseCandidates = find_next_phase_candidates(crossings, crossingSigns, currentLocation, currentPhase); + if (nextPhaseCandidates.empty()) + { + if (currentPhase == endPhase) + return pathSoFar; + else + return {}; + } + + std::vector> shortestPath; + size_t shortestPathSize = std::numeric_limits::max(); + for (int nextPhase : nextPhaseCandidates) + { + std::vector> path = pathSoFar; + const InterfaceID iface(currentPhase, nextPhase); + const double nextLocation = crossings.at(iface); + path.emplace_back(iface, nextLocation); + const auto fullPath = shortest_path_to_end(path, crossings, crossingSigns, nextLocation, nextPhase, endPhase); + if (!fullPath.empty() && fullPath.size() < shortestPathSize) + { + shortestPath = fullPath; + shortestPathSize = fullPath.size(); + } + } + return shortestPath; +} + +std::vector> shortest_path_from_begin_to_end(const CrossingMap & crossings, + const CrossingSignMap & crossingSigns, + const int beginPhase, + const int endPhase) +{ + std::vector> emptyPath; + double beginLocation = -1.; + return shortest_path_to_end(emptyPath, crossings, crossingSigns, beginLocation, beginPhase, endPhase); +} + +bool determine_real_crossings_from_locations(CrossingMap & realCrossings, CrossingSignMap & realCrossingSigns, std::set & edgePhases, const CrossingMap & allCrossings, const CrossingSignMap & allCrossingSigns) +{ + const auto begEndPhases = get_begin_and_end_phases(realCrossings, realCrossingSigns); + + if (begEndPhases.first == begEndPhases.second) + { + return true; + } + + realCrossings.clear(); + realCrossingSigns.clear(); + edgePhases.clear(); + + const auto shortestPath = shortest_path_from_begin_to_end(allCrossings, allCrossingSigns, begEndPhases.first, begEndPhases.second); + if (shortestPath.empty()) + return false; + + for (auto && crossing : shortestPath) + { + realCrossings[crossing.first] = crossing.second; + realCrossingSigns[crossing.first] = allCrossingSigns.at(crossing.first); + edgePhases.insert(crossing.first.first_ls()); + edgePhases.insert(crossing.first.second_ls()); + } + return true; +} + +void CDFEM_Parent_Edge::adjust_crossing_locations_based_on_node_captured_domains(const std::vector & sortedParentNode0Domains, const std::vector & sortedParentNode1Domains) +{ + if (sortedParentNode0Domains.empty() && sortedParentNode1Domains.empty()) + return; + if (Phase_Support::has_one_levelset_per_phase()) + { + if (my_crossings_including_fake.empty()) + return; + + adjust_crossing_locations_based_on_node_captured_domains_for_level_set_per_phase(sortedParentNode0Domains, sortedParentNode1Domains, my_crossings_including_fake); + + const bool success = determine_real_crossings_from_locations(my_crossings, my_crossing_signs, edge_phases, my_crossings_including_fake, my_crossing_signs_including_fake); + if (!success) + krinolog << "Failed to adjust crossings " << *this << stk::diag::dendl; + } + else + { + if (my_crossings.empty()) + return; + adjust_crossing_locations_based_on_node_captured_domains_for_level_set_per_interface(sortedParentNode0Domains, sortedParentNode1Domains, my_crossings); + } +} + +void +CDFEM_Parent_Edge::find_crossings_multiple_levelset(const std::vector > & nodes_isovar) +{ + const Segment_Vector lower_envelope = SegmentLowerEnvelope::find_lower_envelope(my_edge_node_positions, nodes_isovar); + + edge_phases.clear(); + for(auto && it : lower_envelope) + { + edge_phases.insert(it.ls_index()); + } + + // Create crossings between the segments of the lower_envelope + for(Segment_Vector::const_iterator it = lower_envelope.begin(); it != lower_envelope.end()-1; ++it) + { + const LS_Segment & cur = *it; + const LS_Segment & next = *(it+1); + if (cur.ls_index() == next.ls_index()) continue; + + const double cur_right = cur.right_endpoint(); + const double next_left = next.left_endpoint(); + ThrowRequire(cur_right == next_left); + ThrowRequire(cur.ls_index() != next.ls_index()); + InterfaceID iface(cur.ls_index(), next.ls_index()); + ThrowRequireMsg(my_crossings.find(iface) == my_crossings.end(), "Multiple interface crossing error after pruning."); + my_crossings[iface] = cur_right; + my_crossing_signs[iface] = (cur.ls_index() < next.ls_index()) ? 1 : -1; + } + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + debug_print_crossings(); + } +} + +bool +CDFEM_Parent_Edge::have_any_crossings() const +{ + return !my_crossings.empty(); +} + +std::tuple +CDFEM_Parent_Edge::get_crossing_position_and_sign(const InterfaceID key) const +{ + ThrowRequire(Phase_Support::has_one_levelset_per_phase()); + + if(have_crossing(key)) + { + return std::make_tuple(get_crossing_position(key), get_crossing_sign(key), false); + } + + return std::make_tuple(get_fake_crossing_position(key), get_fake_crossing_sign(key), true); +} + +typedef std::array*,2> CrossingInterval; + +static CrossingInterval get_crossing_interval(const CDFEM_Parent_Edge & edge, const std::pair & fakeCrossing) +{ + const double fakeLoc = fakeCrossing.second; + const std::pair * before = nullptr; + const std::pair * after = nullptr; + for (auto && crossing : edge.get_crossings()) + { + const double loc = crossing.second; + if (loc == fakeLoc) + { + return {&crossing, &crossing}; + } + else if (loc < fakeLoc) + { + if (before == nullptr || loc > before->second) + before = &crossing; + } + else + { + if (after == nullptr || loc < after->second) + after = &crossing; + } + } + return {before, after}; +} + +static int get_phase_on_interval(const CDFEM_Parent_Edge & edge, const CrossingInterval & crossingInterval) +{ + const std::pair * before = crossingInterval[0]; + const std::pair * after = crossingInterval[1]; + ThrowRequire(before != nullptr || after != nullptr); + if (before != nullptr) + { + return (edge.get_crossing_sign(before->first) == -1) ? before->first.first_ls() : before->first.second_ls(); + } + return (edge.get_crossing_sign(after->first) == -1) ? after->first.second_ls() : after->first.first_ls(); +} + +static bool fake_crossing_is_actually_real(const CDFEM_Parent_Edge & edge, const CrossingInterval & crossingInterval, const std::pair & fakeCrossing) +{ + if (crossingInterval[0] != crossingInterval[1]) + { + const int phaseOnInterval = get_phase_on_interval(edge, crossingInterval); + const InterfaceID fakeInterface = fakeCrossing.first; + const bool crossingIsActuallyReal = (fakeInterface.first_ls() == phaseOnInterval || fakeInterface.second_ls() == phaseOnInterval); + return crossingIsActuallyReal; + } + return false; +} + +static void fixup_fake_crossing_location_for_consistency(CDFEM_Parent_Edge & edge, std::pair & fakeCrossing) +{ + const CrossingInterval & crossingInterval = get_crossing_interval(edge, fakeCrossing); + if (fake_crossing_is_actually_real(edge, crossingInterval, fakeCrossing)) + { + const std::pair * before = crossingInterval[0]; + const std::pair * after = crossingInterval[1]; + double & loc = fakeCrossing.second; + const bool useBefore = before ? (after ? (loc-before->second < after->second-loc) : true) : false; + loc = useBefore ? before->second : after->second; + } +} + +static bool fake_crossing_is_actually_real(const CDFEM_Parent_Edge & edge, const std::pair & fakeCrossing) +{ + const CrossingInterval & crossingInterval = get_crossing_interval(edge, fakeCrossing); + return fake_crossing_is_actually_real(edge, crossingInterval, fakeCrossing); +} + +bool CDFEM_Parent_Edge::all_fake_crossings_are_really_fake() const +{ + for (auto && crossing : my_crossings_including_fake) + if (!have_crossing(crossing.first) && fake_crossing_is_actually_real(*this, crossing)) + return false; + return true; +} + +void CDFEM_Parent_Edge::fixup_fake_crossing_locations_for_consistency() +{ + for (auto && crossing : my_crossings_including_fake) + if (!have_crossing(crossing.first)) + fixup_fake_crossing_location_for_consistency(*this, crossing); +} + +void +CDFEM_Parent_Edge::find_crossings_including_fake_ones(const std::vector > & nodes_isovar) +{ + my_crossings_including_fake.clear(); + my_crossing_signs_including_fake.clear(); + + ThrowRequire(Phase_Support::has_one_levelset_per_phase()); + const int numLS = nodes_isovar[0].size(); + std::vector lsMins(numLS,std::numeric_limits::max()); + std::vector lsMaxs(numLS,std::numeric_limits::lowest()); + for (auto && nodeIsovar : nodes_isovar) + { + for (int i=0; i result = have_crossing(iface) ? + std::make_pair(get_crossing_position(iface), get_crossing_sign(iface)) : + find_crossing_position_and_sign(iface, nodes_isovar); + if (result.first >= 0.) + { + my_crossings_including_fake[iface] = result.first; + my_crossing_signs_including_fake[iface] = result.second; + } + } + } + } + + fixup_fake_crossing_locations_for_consistency(); +} + +std::pair +CDFEM_Parent_Edge::find_crossing_position_and_sign(const InterfaceID key, const std::vector > & nodes_isovar) const +{ + ThrowRequire(Phase_Support::has_one_levelset_per_phase()); + return krino::find_crossing_position_and_sign(key, my_edge_node_positions, nodes_isovar); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.hpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.hpp new file mode 100644 index 000000000000..cceb31cf10e1 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edge.hpp @@ -0,0 +1,137 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_CDFEM_Parent_Edge_h +#define Akri_CDFEM_Parent_Edge_h + +#include +#include +#include + +#include +#include +#include + +namespace stk { namespace mesh { class BulkData; } } + +namespace krino { + +class CDFEM_Parent_Edge { +public: + CDFEM_Parent_Edge(const std::vector & edgeNodes, + const std::vector & edgeNodePositions, + const std::vector > & nodes_isovar) + : my_edge_nodes(edgeNodes), + my_edge_node_positions(edgeNodePositions) + { + ThrowAssert(edgeNodePositions.size() == nodes_isovar.size()); + find_crossings(nodes_isovar); + } + + CDFEM_Parent_Edge(const std::vector & edgeNodePositions, + const std::vector > & nodes_isovar) + : CDFEM_Parent_Edge({}, edgeNodePositions, nodes_isovar) {} + + CDFEM_Parent_Edge(const std::vector & edgeNodes, + const std::vector > & nodes_isovar) + : CDFEM_Parent_Edge(edgeNodes, {0.,1.}, nodes_isovar) {} + + CDFEM_Parent_Edge(const std::vector > & nodes_isovar) + : CDFEM_Parent_Edge({0.,1.}, nodes_isovar) {} + + CDFEM_Parent_Edge(const std::vector & edgeNodes, + const std::vector & edgeNodePositions); + CDFEM_Parent_Edge() {} + + // Must be larger than machine epsilon, but puts limit on smallest effective snap tolerance + static double MinSize(); + + bool valid() const { return !my_edge_node_positions.empty(); } + + void find_crossings(const std::vector > & nodes_isovar); + void collapse_small_segments_while_preserving_topology(const double snapTol); + + void adjust_crossing_locations_based_on_node_captured_domains(const std::vector & sortedParentNode0Domains, const std::vector & sortedParentNode1Domains); + + bool have_crossing(const InterfaceID key) const { return my_crossings.find(key) != my_crossings.end(); } + const CrossingMap & get_crossings() const { return my_crossings; } + const CrossingMap & get_crossings_including_fake() const { return my_crossings_including_fake; } + bool all_fake_crossings_are_really_fake() const; + + double get_crossing_position(const InterfaceID key) const { + CrossingMap::const_iterator it = my_crossings.find(key); + return it != my_crossings.end() ? it->second : -1.0; + } + // Crossing sign is defined as whether the interface is + or - for x > crossing point + // For multiple LS problems we'll say that -1 corresponds to InterfaceID.first being lower for x > x_crossing_point + // For uncrossed edges it will be the sign of both parent nodes + int get_crossing_sign(const InterfaceID key) const { + CrossingSignMap::const_iterator it = my_crossing_signs.find(key); + return it->second; + } + std::tuple get_crossing_position_and_sign(const InterfaceID key) const; + unsigned get_num_nodes() const { return my_edge_node_positions.size(); } + const std::vector & get_nodes() const { return my_edge_nodes; } + bool have_any_crossings() const; + std::pair get_parent_nodes() const { return std::pair(my_edge_nodes.front(), my_edge_nodes.back()); } + int get_uncrossed_phase() const { return (edge_phases.size() == 1) ? (*edge_phases.begin()) : -1; } + const std::set & get_edge_phases() const { return edge_phases; } + double get_edge_node_position(stk::mesh::Entity edgeNode) const; + + friend std::ostream & operator << (std::ostream &os, const CDFEM_Parent_Edge & edge); + void debug_print_crossings() const; + +private: + void find_crossings_multiple_levelset(const std::vector > & nodes_isovar); + std::pair find_crossing_position_and_sign(const InterfaceID key, const std::vector > & nodes_isovar) const; + void find_crossings_including_fake_ones(const std::vector > & nodes_isovar); + double get_fake_crossing_position(const InterfaceID key) const { + CrossingMap::const_iterator it = my_crossings_including_fake.find(key); + return it != my_crossings_including_fake.end() ? it->second : -1.0; + } + int get_fake_crossing_sign(const InterfaceID key) const { + CrossingSignMap::const_iterator it = my_crossing_signs_including_fake.find(key); + return it->second; + } + void fixup_fake_crossing_locations_for_consistency(); + + std::vector my_edge_nodes; + std::vector my_edge_node_positions; + CrossingMap my_crossings; + CrossingSignMap my_crossing_signs; + CrossingMap my_crossings_including_fake; + CrossingSignMap my_crossing_signs_including_fake; + std::set edge_phases; +}; + +inline std::ostream & operator << (std::ostream &os, const CDFEM_Parent_Edge & edge) +{ + const unsigned num_nodes = edge.get_num_nodes(); + os << "CDFEM parent edge has " << num_nodes << " nodes and phases { "; + for (int phase : edge.get_edge_phases()) + os << phase << " "; + os << "}\n crossings: { "; + const auto oldPrecision = os.precision(); + os.precision(16); + for ( auto && crossing : edge.get_crossings() ) + { + os << crossing.first << "@" << crossing.second << ", sign=" << edge.get_crossing_sign(crossing.first) << " "; + } + os << "}" << "\n crossings including fake: { "; + for ( auto && crossing : edge.get_crossings_including_fake() ) + { + os << crossing.first << "@" << crossing.second << ", sign=" << edge.get_fake_crossing_sign(crossing.first) << " "; + } + os << "}" << "\n"; + os.precision(oldPrecision); + return os; +} + +} // namespace krino + +#endif // Akri_CDFEM_Parent_Edge_h diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.cpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.cpp new file mode 100644 index 000000000000..d3eab40fb058 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.cpp @@ -0,0 +1,492 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino +{ + +std::set get_phases_present_on_edges(const std::vector & parentEdges) +{ + std::set phasesPresent; + for(auto && parentEdge : parentEdges) + if(parentEdge) + for (int phase : parentEdge->get_edge_phases()) + phasesPresent.insert(phase); + return phasesPresent; +} + +static void add_interface_phases(const InterfaceID & interface, std::set & phases) +{ + phases.insert(interface.first_ls()); + phases.insert(interface.second_ls()); +} + +static std::set get_all_interfaces_including_fake(const std::vector & parentEdges) +{ + std::set allInterfacesIncludingFake; + for(auto && parentEdge : parentEdges) + if(parentEdge) + for (auto && crossing : parentEdge->get_crossings_including_fake()) + allInterfacesIncludingFake.insert(crossing.first); + return allInterfacesIncludingFake; +} + +bool phase_has_interfaces_to_all_other_phases(const int phase, const std::set & phasesPresent, const std::set & interfaces) +{ + for (int otherPhase : phasesPresent) + if (interfaces.find(InterfaceID(phase,otherPhase)) == interfaces.end()) + return false; + return true; +} + +void add_phases_possibly_present_on_interior(const std::vector & parentEdges, std::set & phasesPresent) +{ + const std::set allInterfacesIncludingFake = get_all_interfaces_including_fake(parentEdges); + + std::set phasesPossiblyPresent; + for (auto && interface : allInterfacesIncludingFake) + add_interface_phases(interface, phasesPossiblyPresent); + + // This should be unit tested. What about order dependency? + for (int phase : phasesPossiblyPresent) + if (phasesPresent.find(phase) == phasesPresent.end()) + if (phase_has_interfaces_to_all_other_phases(phase, phasesPresent, allInterfacesIncludingFake)) + phasesPresent.insert(phase); +} + +std::set get_phases_present_on_edges_and_interior(const std::vector & elementParentEdges) +{ + std::set phasesPresent = get_phases_present_on_edges(elementParentEdges); + add_phases_possibly_present_on_interior(elementParentEdges, phasesPresent); + return phasesPresent; +} + +static +std::set get_interfaces_with_any_real_edge_crossings(const std::vector & elementParentEdges) +{ + std::set interfacesPresent; + for(auto && parentEdge : elementParentEdges) + if(parentEdge) + for(const auto & crossing : parentEdge->get_crossings()) + interfacesPresent.insert(crossing.first); + return interfacesPresent; +} + +std::set get_interfaces_present(const std::vector & elementParentEdges) +{ + return get_interfaces_with_any_real_edge_crossings(elementParentEdges); +} + +void fill_element_parent_edges(const stk::mesh::BulkData & mesh, + const stk::mesh::Entity elem, + const ParentEdgeMap & parentEdges, + std::vector & elementParentEdges, + std::vector & areParentEdgesAreOrientedSameAsElementEdges) +{ + const stk::topology stk_topology = mesh.bucket(elem).topology(); + const unsigned numEdges = stk_topology.num_edges(); + const stk::mesh::Entity * const nodes = mesh.begin_nodes(elem); + elementParentEdges.assign(numEdges, nullptr); + areParentEdgesAreOrientedSameAsElementEdges.assign(numEdges, true); + for(unsigned i=0; i < numEdges; ++i) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(stk_topology, i); + const CDFEM_Parent_Edge * parent_edge = + find_parent_edge(mesh, parentEdges, nodes[edge_node_ordinals[0]], nodes[edge_node_ordinals[1]]); + elementParentEdges[i] = parent_edge; + if(parent_edge && parent_edge->get_parent_nodes().first != nodes[edge_node_ordinals[0]]) + areParentEdgesAreOrientedSameAsElementEdges[i] = false; + } +} + +void fill_face_nodes_and_parent_edges(const stk::topology & elementTopology, + const int iFace, + const std::vector & elementNodes, + const std::vector & elementParentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + std::vector & faceNodes, + std::vector & faceParentEdges, + std::vector & areParentEdgesOrientedSameAsFaceEdges) +{ + ThrowAssert(elementTopology == stk::topology::TETRAHEDRON_4); + constexpr std::array,4> faceEdges = {{ {{0,4,3}}, {{1,5,4}}, {{3,5,2}}, {{2,1,0}} }}; + constexpr std::array,4> isFaceEdgeOrientedSameAsElementEdge = {{ {{true,true,false}}, {{true,true,false}}, {{true,false,true}}, {{false,false,false}} }}; + + faceNodes.resize(3); + elementTopology.face_nodes(elementNodes, iFace, faceNodes.data()); + + constexpr int numFaceEdges = 3; + faceParentEdges.resize(numFaceEdges); + areParentEdgesOrientedSameAsFaceEdges.resize(3); + for (int i=0; iprimary_entity_rank() != stk::topology::ELEMENT_RANK) continue; + + const stk::mesh::Part * nonconformal_node_iopart = phaseSupport.find_nonconformal_part(*part_ptr); + + if (phaseSupport.level_set_is_used_by_nonconformal_part(cdfemSupport.ls_field(ls_index).ptr, nonconformal_node_iopart)) + { + return true; + } + } + + return false; +} + +static bool +has_io_part_containing_phase(const Phase_Support & phase_support, const stk::mesh::PartVector & parts, const PhaseTag & phase) +{ + for(stk::mesh::PartVector::const_iterator part_iter = parts.begin(); part_iter != parts.end(); ++part_iter) + { + const stk::mesh::Part * const part = *part_iter; + if (part->primary_entity_rank() != stk::topology::ELEMENT_RANK || // limit ourselves to volume parts + !(stk::io::is_part_io_part(*part) || + phase_support.is_nonconformal(part))) + continue; + + const PhaseTag & iopart_phase = phase_support.get_iopart_phase(*part); + if (iopart_phase.contain(phase)) + { + return true; + } + } + + return false; +} + +static bool node_touches_alive_block(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity node, + const int ls_index ) +{ + const CDFEM_Inequality_Spec * death_spec = cdfemSupport.get_death_spec(ls_index); + if (nullptr == death_spec) return false; + + const PhaseTag & alive_phase = death_spec->get_active_phase(); + const stk::mesh::PartVector & node_parts = mesh.bucket(node).supersets(); + return has_io_part_containing_phase(phaseSupport, node_parts, alive_phase); +} + +static bool node_touches_dead_block(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity node, + const int ls_index ) +{ + const CDFEM_Inequality_Spec * death_spec = cdfemSupport.get_death_spec(ls_index); + if (nullptr == death_spec) return false; + + const PhaseTag & dead_phase = death_spec->get_deactivated_phase(); + const stk::mesh::PartVector & node_parts = mesh.bucket(node).supersets(); + return has_io_part_containing_phase(phaseSupport, node_parts, dead_phase); +} + +static bool node_has_real_ls_value(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity node, + const int ls_index ) +{ + if( node_touches_dead_block(mesh, cdfemSupport, phaseSupport, node, ls_index) && + !node_touches_alive_block(mesh, cdfemSupport, phaseSupport, node, ls_index) ) + return false; + + return in_block_decomposed_by_ls(mesh, cdfemSupport, phaseSupport, node, ls_index); +} + +static void debug_print_edge_info(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const std::vector & edge_nodes, + const std::vector > & nodes_isovar) +{ + const int num_nodes = nodes_isovar.size(); + if(krinolog.shouldPrint(LOG_DEBUG)) + { + const auto old_precision = krinolog.getStream().precision(); + krinolog.getStream().precision(16); + const int num_ls = cdfemSupport.num_ls_fields(); + krinolog << stk::diag::dendl << "CDFEM_Parent_Edge::find_crossings():" << "\n"; + for ( int n = 0; n < num_nodes; ++n ) + { + krinolog << " Node: " << mesh.identifier(edge_nodes[n]) << ", in_block_decomposed_by_ls = { "; + for ( int ls_index = 0; ls_index < num_ls; ++ls_index ) krinolog << in_block_decomposed_by_ls(mesh, cdfemSupport, phaseSupport, edge_nodes[n], ls_index) << " "; + krinolog << "}, has_real_ls_value = { "; + for ( int ls_index = 0; ls_index < num_ls; ++ls_index ) krinolog << node_has_real_ls_value(mesh, cdfemSupport, phaseSupport, edge_nodes[n], ls_index) << " "; + krinolog << "}, ls = { "; + for ( int ls_index = 0; ls_index < num_ls; ++ls_index ) krinolog << nodes_isovar[n][ls_index] << " "; + krinolog << "}"; + krinolog << stk::diag::dendl; + } + krinolog.getStream().precision(old_precision); + } +} + +static void edge_ls_node_values(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const std::vector & edge_nodes, + std::vector >& nodes_isovar) +{ + const unsigned num_nodes = edge_nodes.size(); + const int num_ls = cdfemSupport.num_ls_fields(); + + nodes_isovar.assign(num_nodes, std::vector(num_ls, -1.0)); + for (unsigned n = 0; n < num_nodes; ++n) + { + for (int ls_index = 0; ls_index < num_ls; ++ls_index) + { + const CDFEM_Inequality_Spec * death_spec = cdfemSupport.get_death_spec(ls_index); + FieldRef isovar = cdfemSupport.ls_field(ls_index).isovar; + + const bool node_has_ls = node_has_real_ls_value(mesh, cdfemSupport, phaseSupport, edge_nodes[n], ls_index); + nodes_isovar[n][ls_index] = 0.0; + if (node_has_ls) + { + if (nullptr != death_spec && isovar.entity_rank() == stk::topology::ELEMENT_RANK) + { + // currently requires aura to work correctly in parallel + ThrowAssertMsg(mesh.is_automatic_aura_on(), "Capability requires aura."); + bool have_pos_elem = false; + bool have_neg_elem = false; + const unsigned num_node_elems = mesh.num_elements(edge_nodes[n]); + const stk::mesh::Entity* node_elems = mesh.begin_elements(edge_nodes[n]); + for (unsigned node_elem_index=0; node_elem_index(isovar, node_elem); + if (nullptr != isoptr) + { + if (*isoptr - cdfemSupport.ls_field(ls_index).isoval < 0.) + have_neg_elem = true; + else + have_pos_elem = true; + } + } + nodes_isovar[n][ls_index] = (have_pos_elem) ? (have_neg_elem ? 0.0 : 1.0) : -1.0; + } + else + { + const double * isoptr = field_data(isovar, edge_nodes[n]); + ThrowRequireMsg(nullptr != isoptr, "Isovar " << isovar.name() << " missing on node " << debug_entity(mesh, edge_nodes[n])); + nodes_isovar[n][ls_index] = *isoptr - cdfemSupport.ls_field(ls_index).isoval; + } + } + else if (nullptr != death_spec && node_touches_dead_block(mesh, cdfemSupport, phaseSupport, edge_nodes[n], ls_index)) + { + const bool dead_is_positive = death_spec->get_deactivated_phase().contain(cdfemSupport.ls_field(ls_index).identifier,+1); + if (dead_is_positive) nodes_isovar[n][ls_index] = 1.0; + } + + if (nullptr != death_spec && node_touches_dead_block(mesh, cdfemSupport, phaseSupport, edge_nodes[n], ls_index)) + { + const bool dead_is_positive = death_spec->get_deactivated_phase().contain(cdfemSupport.ls_field(ls_index).identifier, +1); + if (dead_is_positive && nodes_isovar[n][ls_index] < 0.0) + { + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Setting node " << mesh.identifier(edge_nodes[n]) << " to zero to enforce irreversibility, ls = " << nodes_isovar[n][ls_index] << "\n"; + nodes_isovar[n][ls_index] = 0.0; + } + else if (!dead_is_positive && nodes_isovar[n][ls_index] >= 0.0) + { + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Setting node " << mesh.identifier(edge_nodes[n]) << " to -REAL_MIN to enforce irreversibility, ls = " << nodes_isovar[n][ls_index] << "\n"; + nodes_isovar[n][ls_index] = -std::numeric_limits::min(); + } + } + } + } +} + +static CDFEM_Parent_Edge & +build_parent_edge(const stk::mesh::BulkData & mesh, ParentEdgeMap & parentEdges, const ParentsToChildMapper & parentsToChildMapper, const bool linearizeEdge, stk::mesh::Entity node0, stk::mesh::Entity node1) +{ + const stk::mesh::EntityId id0 = mesh.identifier(node0); + const stk::mesh::EntityId id1 = mesh.identifier(node1); + const ParentEdgeKey edge_key(id0, id1); + CDFEM_Parent_Edge & edge = parentEdges[edge_key]; + + std::vector edgeNodes; + std::vector edgeNodePositions; + + if(!edge.valid()) + { + const std::array nodes = (id0 < id1) ? std::array{node0, node1} : std::array{node1, node0}; + if (linearizeEdge) + fill_linear_edge_nodes_and_positions(nodes[0], nodes[1], edgeNodes, edgeNodePositions); + else + fill_edge_nodes_and_positions(mesh, nodes[0], nodes[1], parentsToChildMapper, edgeNodes, edgeNodePositions); + edge = CDFEM_Parent_Edge(edgeNodes, edgeNodePositions); + } + return edge; +} + +static void find_parent_edge_crossings(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + ParentEdgeMap & parentEdges) +{ + std::vector> nodes_isovar; + + for (auto && map_entry : parentEdges) + { + CDFEM_Parent_Edge & edge = map_entry.second; + const std::vector edge_nodes = edge.get_nodes(); + edge_ls_node_values(mesh, cdfemSupport, phaseSupport, edge_nodes, nodes_isovar); + debug_print_edge_info(mesh, cdfemSupport, phaseSupport, edge_nodes, nodes_isovar); + edge.find_crossings(nodes_isovar); + } + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << stk::diag::dendl; +} + +stk::mesh::Selector get_parent_element_selector(const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + stk::mesh::Selector parentElementSelector = + (cdfemSupport.get_parent_part() | (activePart & !cdfemSupport.get_child_part())) & + phaseSupport.get_all_decomposed_blocks_selector(); + + return parentElementSelector; +} + +stk::mesh::Selector get_owned_parent_element_selector(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + stk::mesh::Selector parentElementSelector = + (cdfemSupport.get_parent_part() | (activePart & !cdfemSupport.get_child_part())) & + phaseSupport.get_all_decomposed_blocks_selector() & + mesh.mesh_meta_data().locally_owned_part(); + + return parentElementSelector; +} + +std::vector get_owned_parent_elements(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + const stk::mesh::Selector parentElementSelector = get_owned_parent_element_selector(mesh, activePart, cdfemSupport, phaseSupport); + std::vector parentElements; + stk::mesh::get_selected_entities( parentElementSelector, mesh.get_buckets(stk::topology::ELEMENT_RANK, parentElementSelector), parentElements, false ); + return parentElements; +} + +ParentEdgeMap +build_parent_edges(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper & parentsToChildMapper, + const std::function & should_build_linear_edge, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + std::vector elements; + stk::mesh::get_entities( mesh, stk::topology::ELEMENT_RANK, mesh.mesh_meta_data().locally_owned_part(), elements, false); + + return build_parent_edges_using_elements(mesh, parentsToChildMapper, should_build_linear_edge, elements, activePart, cdfemSupport, phaseSupport); +} + +std::function build_no_linearized_edges_function() +{ + return [](stk::mesh::Entity node0, stk::mesh::Entity node1) + { return false; }; +} + +std::function build_all_linearized_edges_function() +{ + return [](stk::mesh::Entity node0, stk::mesh::Entity node1) + { return true; }; +} + +ParentEdgeMap +build_parent_edges_using_elements(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper & parentsToChildMapper, + const std::function & should_build_linear_edge, + const std::vector & elements, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + const stk::mesh::Selector parentElementSelector = get_owned_parent_element_selector(mesh, activePart, cdfemSupport, phaseSupport); + + ParentEdgeMap parentEdges; + + for (auto && elem : elements) + { + if (parentElementSelector(mesh.bucket(elem))) + { + const stk::topology topology = mesh.bucket(elem).topology(); + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(elem); + const unsigned numEdges = topology.num_edges(); + + for (unsigned iedge = 0; iedge < numEdges; ++iedge) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topology, iedge); + stk::mesh::Entity node0 = elem_nodes[edge_node_ordinals[0]]; + stk::mesh::Entity node1 = elem_nodes[edge_node_ordinals[1]]; + + const bool linearizeEdge = should_build_linear_edge(node0, node1); + build_parent_edge(mesh, parentEdges, parentsToChildMapper, linearizeEdge, node0, node1); + } + } + } + + find_parent_edge_crossings(mesh, cdfemSupport, phaseSupport, parentEdges); + + return parentEdges; +} + +const CDFEM_Parent_Edge * +find_parent_edge(const stk::mesh::BulkData & mesh, const ParentEdgeMap & parentEdges, stk::mesh::Entity node0, stk::mesh::Entity node1) +{ + const stk::mesh::EntityId id0 = mesh.identifier(node0); + const stk::mesh::EntityId id1 = mesh.identifier(node1); + const ParentEdgeKey edge_key(id0, id1); + + ParentEdgeMap::const_iterator it = parentEdges.find(edge_key); + + if (it != parentEdges.end()) + return &(it->second); + + return nullptr; +} + +} // namespace diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.hpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.hpp new file mode 100644 index 000000000000..50003bf3a910 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Parent_Edges.hpp @@ -0,0 +1,86 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_CDFEM_PARENT_EDGES_H_ +#define KRINO_INCLUDE_AKRI_CDFEM_PARENT_EDGES_H_ +#include +#include +#include + +namespace krino +{ +class CDFEM_Support; +class Phase_Support; +class InterfaceID; +class ParentsToChildMapper; + +typedef OrderedIdPair ParentEdgeKey; +typedef std::map ParentEdgeMap; + +std::set get_phases_present_on_edges(const std::vector & parentEdges); +std::set get_phases_present_on_edges_and_interior(const std::vector & elementParentEdges); +std::set get_interfaces_present(const std::vector & elementParentEdges); + +const CDFEM_Parent_Edge * find_parent_edge(const stk::mesh::BulkData & mesh, const ParentEdgeMap & parentEdges, stk::mesh::Entity node0, stk::mesh::Entity node1); + +std::function build_no_linearized_edges_function(); + +std::function build_all_linearized_edges_function(); + +ParentEdgeMap +build_parent_edges_using_elements(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper & parentsToChildMapper, + const std::function & should_build_linear_edge, + const std::vector & elements, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +ParentEdgeMap +build_parent_edges(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper & parentsToChildMapper, + const std::function & should_build_linear_edge, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +void fill_element_parent_edges(const stk::mesh::BulkData & mesh, + const stk::mesh::Entity elem, + const ParentEdgeMap & parentEdges, + std::vector & elementParentEdges, + std::vector & areParentEdgesAreOrientedSameAsElementEdges); + +void fill_face_nodes_and_parent_edges(const stk::topology & elementTopology, + const int iFace, + const std::vector & elementNodes, + const std::vector & elementParentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + std::vector & faceNodes, + std::vector & faceParentEdges, + std::vector & areParentEdgesOrientedSameAsFaceEdges); + +stk::mesh::Selector get_parent_element_selector(const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +stk::mesh::Selector get_owned_parent_element_selector(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +std::vector get_owned_parent_elements(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +} + + + + +#endif /* KRINO_INCLUDE_AKRI_CDFEM_PARENT_EDGES_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Snapper.hpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Snapper.hpp new file mode 100644 index 000000000000..d63c5af7b6b9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Snapper.hpp @@ -0,0 +1,31 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_CDFEM_SNAPPER_H_ +#define KRINO_INCLUDE_AKRI_CDFEM_SNAPPER_H_ +#include + +namespace krino { + +class CDFEM_Snapper { +public: + CDFEM_Snapper() : my_cdfem_edge_tol(default_edge_tol) {} + + void set_edge_tolerance(double edge_tol) { my_cdfem_edge_tol = edge_tol; } + double get_edge_tolerance() const { ThrowRequireMsg(my_cdfem_edge_tol < 0.5, "Should not be requesting tolerance when always snapping."); return my_cdfem_edge_tol; } + bool always_snap() const { return my_cdfem_edge_tol > 0.5; } + bool snap_lo(double crossingVal) const { return always_snap() ? (crossingVal <= 0.5) : (crossingVal < get_edge_tolerance()); } + bool snap_hi(double crossingVal) const { return always_snap() ? (crossingVal > 0.5) : (crossingVal > 1.0-get_edge_tolerance()); } +private: + static constexpr double default_edge_tol = 1.e-3; + double my_cdfem_edge_tol; +}; + +} + +#endif /* KRINO_INCLUDE_AKRI_CDFEM_SNAPPER_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Support.cpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Support.cpp new file mode 100644 index 000000000000..55ed155e5b0e --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Support.cpp @@ -0,0 +1,364 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +namespace krino{ + +Edge_Interpolation_Model CDFEM_Support::the_edge_interpolation_model = PIECEWISE_LINEAR; + +CDFEM_Support & +CDFEM_Support::get(stk::mesh::MetaData & meta) +{ + CDFEM_Support * support = const_cast(meta.get_attribute()); + if (NULL == support) + { + support = new CDFEM_Support(meta); + meta.declare_attribute_with_delete(support); + } + return *support; +} + +CDFEM_Support & +CDFEM_Support::get(const stk::mesh::MetaData & meta) +{ + CDFEM_Support * support = const_cast(meta.get_attribute()); + ThrowRequireMsg(nullptr != support, "Could not find CDFEM_Support attribute on MetaData."); + return *support; +} + +CDFEM_Support::CDFEM_Support(stk::mesh::MetaData & meta) + : my_meta(meta), + my_aux_meta(AuxMetaData::get(meta)), + my_simplex_generation_method(CUT_QUADS_BY_LARGEST_ANGLE), + my_fully_coupled_cdfem(false), + my_num_initial_decomposition_cycles(1), + myGlobalIDsAreParallelConsistent(true), + my_interface_minimum_refinement_level(0), + my_interface_maximum_refinement_level(0), + my_post_adapt_uniform_refinement_levels(0), + my_post_cdfem_refinement_levels(0), + my_nonconformal_adapt_target_element_count(0), + my_cdfem_edge_degeneracy_handling(SNAP_TO_NODE), + my_cdfem_snapper(), + my_cdfem_dof_edge_tol(0.0), + my_internal_face_stabilization_multiplier(0.0), + my_flag_use_hierarchical_dofs(false), + my_flag_constrain_CDFEM_to_XFEM_space(false), + my_flag_use_nonconformal_element_size(true), + my_timer_cdfem("CDFEM", sierra::Diag::sierraTimer()), + my_timer_adapt("Nonconformal Adapt", my_timer_cdfem) +{ + my_prolongation_model = ALE_NEAREST_POINT; + + if (3 == my_meta.spatial_dimension()) + my_simplex_generation_method = CUT_QUADS_BY_NEAREST_EDGE_CUT; + + create_parts(); +} + +void CDFEM_Support::create_parts() +{ + my_parent_part = &my_meta.declare_part("CDFEM_PARENT_CONTEXT_BIT"); + my_child_part = &my_meta.declare_part("CDFEM_CHILD_CONTEXT_BIT"); + my_internal_side_part = &my_meta.declare_part("CDFEM_INTERNAL_SIDE"); + + if (my_aux_meta.using_fmwk()) + { + const bool restartOnlyIOPart = true; + my_child_edge_node_part = &my_aux_meta.declare_io_part_with_topology("CDFEM_EDGE_NODE_2_PARENTS", stk::topology::NODE, restartOnlyIOPart); + } + else + { + // Currently no need to output nodeset for krino usage + my_child_edge_node_part = &my_meta.declare_part_with_topology("CDFEM_EDGE_NODE_2_PARENTS", stk::topology::NODE); + } +} + +void CDFEM_Support::register_cdfem_mesh_displacements_field() +{ + ThrowRequireMsg(my_meta.spatial_dimension() > 1, "Spatial dimension must be set and equal to 2 or 3."); + + const FieldType & vec_type = (my_meta.spatial_dimension() == 3) ? FieldType::VECTOR_3D : FieldType::VECTOR_2D; + FieldRef cdfem_disp_field = my_aux_meta.register_field(cdfem_mesh_displacements_field_name(), vec_type, stk::topology::NODE_RANK, 2, 1, get_universal_part()); + set_cdfem_displacement_field(cdfem_disp_field); +} + +void CDFEM_Support::register_parent_node_ids_field() +{ + FieldType id_field_type = (my_aux_meta.get_assert_32bit_flag()) ? FieldType::UNSIGNED_INTEGER : FieldType::UNSIGNED_INTEGER_64; + my_parent_node_ids_field = my_aux_meta.register_field("CDFEM_2_PARENT_NODE_IDS", + id_field_type, stk::topology::NODE_RANK, 1, + 2, *my_child_edge_node_part); +} + +stk::mesh::Selector +CDFEM_Support::get_post_cdfem_refinement_selector() const +{ + stk::mesh::Selector selector = my_aux_meta.active_part(); + if (!my_post_cdfem_refinement_blocks.empty()) + { + stk::mesh::PartVector blocks; + for (auto && block_name : my_post_cdfem_refinement_blocks) + { + if (my_aux_meta.has_part(block_name)) + { + stk::mesh::Part & block = my_aux_meta.get_part(block_name); + blocks.push_back(&block); + } + else + { + stk::RuntimeDoomedAdHoc() << "post_cdfem_refinement_block " << block_name << " not found.\n"; + } + } + selector &= stk::mesh::selectUnion(blocks); + } + return selector; +} + +void +CDFEM_Support::setup_fields() +{ + my_coords_field = LevelSet::get_current_coordinates(my_meta); + + Phase_Support::get(my_meta).check_phase_parts(); + + my_ls_fields.clear(); + const LevelSetManager & region_ls = LevelSetManager::get(my_meta); + for (auto&& ls : region_ls) + { + LS_Field calc_ls_field(ls->name(),ls->get_identifier(),ls->get_isovar_field(),ls->get_isoval(),ls.get()); + my_ls_fields.push_back(calc_ls_field); + } + + const unsigned num_ls = region_ls.numberLevelSets(); + my_death_specs.resize(num_ls, nullptr); + for (unsigned i=0; i(is); + my_ale_prolongation_fields.insert(field.field_state(state)); + } +} + +void +CDFEM_Support::add_interpolation_field(const FieldRef field) +{ + ThrowAssert(field.valid()); + ThrowRequireMsg(!is_ale_prolongation_field(field), "Cannot add " << field.name() << " as interpolation field because it is already an ALE prolongation field."); + for ( unsigned is = 0; is < field.number_of_states(); ++is ) + { + const stk::mesh::FieldState state = static_cast(is); + my_interpolation_fields.insert(field.field_state(state)); + } +} + +void +CDFEM_Support::finalize_fields() +{ + krinolog << "Finalizing field prolongation strategies for CDFEM." << stk::diag::push << stk::diag::dendl; + for ( auto && field_ptr : my_meta.get_fields() ) + { + const FieldRef field(field_ptr); + if( !field.type_is() || field.field_state(stk::mesh::StateNew) == my_cdfem_displacements_field ) continue; + + if( field.entity_rank()==stk::topology::ELEMENT_RANK && + !stk::equal_case(field.name(), "transition_element") && + !stk::equal_case(field.name(), "transition_element_3") && + !stk::equal_case(field.name(), "parent_element") ) + { + my_element_fields.insert(field); + } + + if( field.entity_rank()!=stk::topology::NODE_RANK ) continue; + + const auto& initial_prolong_field_name_entry = my_initial_prolongation_field_name_map.find(field.name()); + if (initial_prolong_field_name_entry != my_initial_prolongation_field_name_map.end()) + { + const std::string & src_field_name = initial_prolong_field_name_entry->second; + ThrowErrorMsgIf(!my_aux_meta.has_field(stk::topology::NODE_RANK, src_field_name), + "Error: Could not find initial prolongation field with name " << src_field_name); + + // If the src field does not have the desired state, use StateNone (which is the same as StateNew). + FieldRef src_field = my_aux_meta.get_field(stk::topology::NODE_RANK, src_field_name); + stk::mesh::FieldState src_state = (field.state() < src_field.number_of_states()) ? field.state() : stk::mesh::StateNone; + src_field = src_field.field_state(src_state); + + my_initial_prolongation_field_map[field] = src_field; + krinolog << "Added " + << src_field.name() << " (" << state_string(src_state) << ") as initial prolongation field for " + << field.name() << " (" << state_string(field.state()) << ")" << stk::diag::dendl; + } + + if (std::find(my_force_ale_prolongation_fields.begin(), + my_force_ale_prolongation_fields.end(), + field.name()) != my_force_ale_prolongation_fields.end()) + { + add_ale_prolongation_field(field); + } + + if(is_interpolation_field(field)) + { + krinolog << field.name() << " will use interpolation." << stk::diag::dendl; + continue; + } + else if(is_ale_prolongation_field(field)) + { + krinolog << field.name() << " will use ALE prolongation." << stk::diag::dendl; + continue; + } + else if (field.name() == "node_registry") + { + krinolog << field.name() << " will not be modified." << stk::diag::dendl; + continue; + } + + krinolog << field.name() << " will be zeroed." << stk::diag::dendl; + my_zeroed_fields.insert(field); + } + krinolog << stk::diag::pop << stk::diag::dendl; +} + +void CDFEM_Support::force_ale_prolongation_for_field(const std::string & field_name) +{ + my_force_ale_prolongation_fields.push_back(field_name); +} + +bool +CDFEM_Support::add_initial_prolongation_field(const std::string & dest_field_name, const std::string & src_field_name) +{ + if (my_initial_prolongation_field_name_map.find(dest_field_name) != my_initial_prolongation_field_name_map.end()) + { + return false; + } + my_initial_prolongation_field_name_map[dest_field_name] = src_field_name; + return true; +} + +FieldRef +CDFEM_Support::get_initial_prolongation_field(const FieldRef field) const +{ + auto iter = my_initial_prolongation_field_map.find(field); + if (iter == my_initial_prolongation_field_map.end()) + return FieldRef(); + return iter->second; +} + +void +CDFEM_Support::set_simplex_generation_method(const Simplex_Generation_Method & method) +{ + ThrowAssert(method < MAX_SIMPLEX_GENERATION_METHOD); + ThrowRequireMsg(3 == my_meta.spatial_dimension() || method != CUT_QUADS_BY_NEAREST_EDGE_CUT, "Simplex generation method CUT_QUADS_BY_NEAREST_EDGE_CUT only supported in 3d."); + my_simplex_generation_method = method; +} + +void +CDFEM_Support::activate_interface_refinement(int minimumLevel, int maximumLevel) +{ + /* %TRACE% */ Traceback trace__("krino::CDFEM_Support::activate_interface_refinement(int minimum_level, int maximum_level)"); /* %TRACE% */ + + ThrowRequireMsg(my_interface_minimum_refinement_level == 0 && my_interface_maximum_refinement_level == 0, + "Interface refinement levels should only be specified once."); + ThrowRequireMsg(maximumLevel >= minimumLevel || maximumLevel == 0, + "Maximum interface refinement level must be greater than or equal to the minimum interface refinement level or left unspecified."); + if (maximumLevel == 0) maximumLevel = minimumLevel; + + my_interface_minimum_refinement_level = minimumLevel; + my_interface_maximum_refinement_level = maximumLevel; + + setup_refinement_marker(); + + if (maximumLevel > 0) + set_global_ids_are_NOT_parallel_consistent(); +} + +void +CDFEM_Support::activate_nonconformal_adaptivity(const int numLevels) +{ + /* %TRACE% */ Traceback trace__("krino::CDFEM_Support::activate_nonconformal_adaptivity(const int num_levels)"); /* %TRACE% */ + + if (numLevels < my_interface_maximum_refinement_level) + { + krinolog << "Ignoring request to activate " << numLevels << " of CDFEM nonconformal adaptivity because a maximum of " << my_interface_maximum_refinement_level << " have already been activated." << stk::diag::dendl; + return; + } + + my_interface_minimum_refinement_level = numLevels; + my_interface_maximum_refinement_level = numLevels; + + setup_refinement_marker(); + + if (numLevels > 0) + set_global_ids_are_NOT_parallel_consistent(); +} + +void +CDFEM_Support::setup_refinement_marker() +{ + /* %TRACE% */ Traceback trace__("krino::CDFEM_Support::activate_nonconformal_adaptivity(const int num_levels)"); /* %TRACE% */ + + my_nonconformal_adapt_marker_name = "CDFEM_NONCONFORMAL_MARKER"; + + my_aux_meta.register_field(my_nonconformal_adapt_marker_name, FieldType::INTEGER, stk::topology::ELEMENT_RANK, 1, 1, get_universal_part()); + my_aux_meta.register_field(my_nonconformal_adapt_marker_name, FieldType::INTEGER, stk::topology::NODE_RANK, 1, 1, get_universal_part()); +} + +int +CDFEM_Support::get_ls_index(const LevelSet * ls) const +{ + for ( unsigned ls_index = 0; ls_index < my_ls_fields.size(); ++ls_index ) + { + if (ls == ls_field(ls_index).ptr) return ls_index; + } + ThrowRuntimeError("Invalid level set field index"); +} + +void +CDFEM_Support::activate_nonconformal_adapt_target_count(const uint64_t target_count) +{ + /* %TRACE% */ Traceback trace__("CDFEM_Support::activate_nonconformal_adapt_target_count(const uint64_t target_count)"); /* %TRACE% */ + + my_nonconformal_adapt_target_element_count = target_count; + my_nonconformal_adapt_indicator_name = "CDFEM_ADAPTIVITY_ERROR_INDICATOR"; + + my_aux_meta.register_field(my_nonconformal_adapt_indicator_name, + FieldType::REAL, + stk::topology::ELEMENT_RANK, + 1, + 1, + get_universal_part()); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_CDFEM_Support.hpp b/packages/krino/krino/krino_lib/Akri_CDFEM_Support.hpp new file mode 100644 index 000000000000..3d07bd11f63a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDFEM_Support.hpp @@ -0,0 +1,259 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_CDFEM_Support_h +#define Akri_CDFEM_Support_h +// +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace krino { + +class LevelSet; +class CDFEM_Inequality_Spec; + +struct LS_Field +{ + LS_Field(const std::string & name_, const LevelSet_Identifier & identifier_, const FieldRef isovar_, const double isoval_, const LevelSet * const ptr_) + : name(name_), identifier(identifier_), isovar(isovar_), isoval(isoval_), ptr(ptr_) { + ThrowRequireMsg(isovar_.valid(), "Invalid field " + isovar_.name() + " used in CDFEM initialization"); + } + + // Constructor just for unit tests + LS_Field(const std::string & name_, const LevelSet_Identifier & identifier_) + : name(name_), identifier(identifier_), isoval(0), ptr(NULL) { + } + + std::string name; + LevelSet_Identifier identifier; + FieldRef isovar; + double isoval; + const LevelSet * ptr; +}; + +enum Prolongation_Model +{ + ALE_NEAREST_NODE=0, + ALE_NEAREST_POINT, + INTERPOLATION, + MAX_PROLONGATION_MODEL +}; + +enum Edge_Interpolation_Model +{ + PIECEWISE_LINEAR=0, + CONSTRAINED_LINEAR, + MAX_EDGE_INTERPOLATION_MODEL +}; + +enum Edge_Degeneracy_Handling +{ + SNAP_TO_NODE=0, + SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE, + MAX_EDGE_DEGENERACY_HANDLING_TYPE +}; + +enum Simplex_Generation_Method +{ + CUT_QUADS_BY_GLOBAL_IDENTIFIER=0, + CUT_QUADS_BY_LARGEST_ANGLE, + CUT_QUADS_BY_NEAREST_EDGE_CUT, + MAX_SIMPLEX_GENERATION_METHOD +}; + +class CDFEM_Support { +public: + + CDFEM_Support(stk::mesh::MetaData & meta); + ~CDFEM_Support() {} + CDFEM_Support(CDFEM_Support const&) = delete; + CDFEM_Support& operator=(CDFEM_Support const&) = delete; + + static CDFEM_Support & get(stk::mesh::MetaData & meta); + static CDFEM_Support & get(const stk::mesh::MetaData & meta); + static void use_constrained_edge_interpolation() { the_edge_interpolation_model = CONSTRAINED_LINEAR; } + static Edge_Interpolation_Model get_edge_interpolation_model() { return the_edge_interpolation_model; } + static bool use_nonconformal_adaptivity(stk::mesh::MetaData & meta) { CDFEM_Support & cdfem_support = get(meta); return cdfem_support.get_interface_maximum_refinement_level() > 0; } + static std::string cdfem_mesh_displacements_field_name() { return "CDFEM_MESH_DISPLACEMENTS"; } + + static bool is_active(const stk::mesh::MetaData & meta) + { + return Phase_Support::exists_and_has_phases_defined(meta); + } + + stk::mesh::MetaData & get_mesh_meta() { return my_meta; } + const stk::mesh::MetaData & get_mesh_meta() const { return my_meta; } + int num_ls_fields() const { return my_ls_fields.size(); } + const LS_Field & ls_field(int i) const { return my_ls_fields[i]; } + LS_Field & ls_field(int i) { return my_ls_fields[i]; } + const std::vector & ls_fields() const { return my_ls_fields; } + Prolongation_Model get_prolongation_model() const { return my_prolongation_model; } + void set_prolongation_model(const Prolongation_Model & model) { my_prolongation_model = model; } + Simplex_Generation_Method get_simplex_generation_method() const { return my_simplex_generation_method; } + void set_simplex_generation_method(const Simplex_Generation_Method & method); + bool get_global_ids_are_parallel_consistent() const { return myGlobalIDsAreParallelConsistent; } + void set_global_ids_are_NOT_parallel_consistent() { myGlobalIDsAreParallelConsistent = false; } + const CDFEM_Inequality_Spec * get_death_spec(int ls_index) const { return my_death_specs[ls_index]; } + void activate_interface_refinement(int minimum_level, int maximum_level); + void activate_nonconformal_adaptivity(const int num_levels); + int get_ls_index(const LevelSet * ls) const; + + void create_parts(); + + void register_cdfem_mesh_displacements_field(); + void register_parent_node_ids_field(); + + void setup_fields(); + void finalize_fields(); + void set_cdfem_displacement_field(const FieldRef field) { my_cdfem_displacements_field = field; } + void set_cdfem_snap_displacement_field(const FieldRef field) { myCDFEMSnapDisplacementsField = field; } + void add_ale_prolongation_field(const FieldRef field); + void add_interpolation_field(const FieldRef field); + // Just for unit test setup purposes + void add_ls_field(const LS_Field & to_add, const CDFEM_Inequality_Spec * death_spec = nullptr) { my_ls_fields.push_back(to_add); my_death_specs.push_back(death_spec); } + + void set_coords_field(const FieldRef coords_field) { my_coords_field = coords_field; } + const FieldRef get_coords_field() const { return my_coords_field; } + const FieldRef get_cdfem_displacements_field() { return my_cdfem_displacements_field; } + const FieldRef get_cdfem_snap_displacements_field() const { return myCDFEMSnapDisplacementsField; } + const FieldSet & get_ale_prolongation_fields() const { return my_ale_prolongation_fields; } + const FieldSet & get_interpolation_fields() const { return my_interpolation_fields; } + const FieldSet & get_zeroed_fields() const { return my_zeroed_fields; } + const FieldSet & get_element_fields() const { return my_element_fields; } + + bool add_initial_prolongation_field(const std::string & dest_field_name, const std::string & src_field_name); + FieldRef get_initial_prolongation_field(const FieldRef field) const; + + stk::mesh::Part & get_parent_part() const { return *my_parent_part; } + stk::mesh::Part & get_child_part() const { return *my_child_part; } + stk::mesh::Part & get_internal_side_part() const { return *my_internal_side_part; } + stk::mesh::Part & get_active_part() const { return my_aux_meta.active_part(); } + stk::mesh::Part & get_universal_part() const { return my_meta.universal_part(); } + stk::mesh::Part & get_locally_owned_part() const { return my_meta.locally_owned_part(); } + stk::mesh::Part & get_globally_shared_part() const { return my_meta.globally_shared_part(); } + + stk::mesh::Selector get_post_cdfem_refinement_selector() const; + + stk::mesh::Part & get_child_edge_node_part() const { return *my_child_edge_node_part; } + FieldRef get_parent_node_ids_field() const { return my_parent_node_ids_field; } + + void activate_fully_coupled_cdfem() { my_fully_coupled_cdfem = true; } + bool fully_coupled_cdfem() const { return my_fully_coupled_cdfem; } + + void activate_nonconformal_adapt_target_count(uint64_t val); + uint64_t get_nonconformal_adapt_target_count() const { return my_nonconformal_adapt_target_element_count; } + int get_interface_minimum_refinement_level() const { return my_interface_minimum_refinement_level; } + int get_interface_maximum_refinement_level() const { return my_interface_maximum_refinement_level; } + void set_post_adapt_refinement_levels(int levels) { my_post_adapt_uniform_refinement_levels = levels; } + int get_post_adapt_refinement_levels() const { return my_post_adapt_uniform_refinement_levels; } + void set_post_cdfem_refinement_levels(int levels) { my_post_cdfem_refinement_levels = levels; } + int get_post_cdfem_refinement_levels() const { return my_post_cdfem_refinement_levels; } + void set_post_cdfem_refinement_blocks(const std::vector & post_cdfem_refinement_blocks) { my_post_cdfem_refinement_blocks = post_cdfem_refinement_blocks; } + void set_num_initial_decomposition_cycles(int num_initial_decomposition_cycles) { my_num_initial_decomposition_cycles = num_initial_decomposition_cycles; } + // In case of both nonconformal adaptivity, perform at least 2 rounds of level set initialization and decomposition. + // This is to capture features that might be missed on the unrefined mesh. + int get_num_initial_decomposition_cycles() const { return (my_num_initial_decomposition_cycles > 1) ? my_num_initial_decomposition_cycles : ((my_interface_maximum_refinement_level > 0) ? 2 : 1); } + const std::string & get_nonconformal_adapt_marker_name() const { return my_nonconformal_adapt_marker_name; } + const std::string & get_nonconformal_adapt_indicator_name() const { return my_nonconformal_adapt_indicator_name; } + void set_nonconformal_hadapt(const std::function & hadapt) { my_nonconformal_hadapt = hadapt; } + const std::function & get_nonconformal_hadapt() const { return my_nonconformal_hadapt; } + + bool is_ale_prolongation_field(const FieldRef field) const + { + return (my_ale_prolongation_fields.find(field) != my_ale_prolongation_fields.end()); + } + bool is_interpolation_field(const FieldRef field) const + { + return (my_interpolation_fields.find(field) != my_interpolation_fields.end()); + } + + void use_nonconformal_element_size(bool flag) { my_flag_use_nonconformal_element_size = flag; } + bool use_nonconformal_element_size() const { return my_flag_use_nonconformal_element_size; } + + Edge_Degeneracy_Handling get_cdfem_edge_degeneracy_handling() const { return my_cdfem_edge_degeneracy_handling; } + void set_cdfem_edge_degeneracy_handling( const Edge_Degeneracy_Handling type ) { my_cdfem_edge_degeneracy_handling = type; } + + stk::diag::Timer & get_timer_cdfem() const { return my_timer_cdfem; } + stk::diag::Timer & get_timer_adapt() const { return my_timer_adapt; } + + void set_cdfem_edge_tol( const double tol ) { my_cdfem_snapper.set_edge_tolerance(tol); } + const CDFEM_Snapper & get_snapper() const { return my_cdfem_snapper; } + const double & get_cdfem_dof_edge_tol() const { return my_cdfem_dof_edge_tol; } + void set_cdfem_dof_edge_tol( const double tol ) { my_cdfem_dof_edge_tol = tol; } + bool use_internal_face_stabilization() const { return my_internal_face_stabilization_multiplier > 0.0; } + double get_internal_face_stabilization_multiplier() const { return my_internal_face_stabilization_multiplier; } + void set_internal_face_stabilization_multiplier( const double mult ) { my_internal_face_stabilization_multiplier = mult; } + bool get_use_hierarchical_dofs() const { return my_flag_use_hierarchical_dofs; } + void set_use_hierarchical_dofs(bool flag) { my_flag_use_hierarchical_dofs = flag; } + bool get_constrain_CDFEM_to_XFEM_space() const { return my_flag_constrain_CDFEM_to_XFEM_space; } + void set_constrain_CDFEM_to_XFEM_space(bool flag) { my_flag_constrain_CDFEM_to_XFEM_space = flag; } + + void force_ale_prolongation_for_field(const std::string & field_name); + +private: + void setup_refinement_marker(); + +private: + stk::mesh::MetaData & my_meta; + AuxMetaData & my_aux_meta; + + FieldRef my_coords_field; + std::vector my_ls_fields; + std::vector my_death_specs; + FieldRef my_cdfem_displacements_field; + FieldRef myCDFEMSnapDisplacementsField; + Prolongation_Model my_prolongation_model; + Simplex_Generation_Method my_simplex_generation_method; + std::vector my_force_ale_prolongation_fields; + FieldSet my_ale_prolongation_fields; + FieldSet my_interpolation_fields; + FieldSet my_zeroed_fields; + FieldSet my_element_fields; + std::map my_initial_prolongation_field_name_map; + std::map my_initial_prolongation_field_map; + static Edge_Interpolation_Model the_edge_interpolation_model; + stk::mesh::Part * my_parent_part; + stk::mesh::Part * my_child_part; + stk::mesh::Part * my_internal_side_part; + stk::mesh::Part * my_child_edge_node_part; + FieldRef my_parent_node_ids_field; + bool my_fully_coupled_cdfem; + int my_num_initial_decomposition_cycles; + bool myGlobalIDsAreParallelConsistent; + int my_interface_minimum_refinement_level; + int my_interface_maximum_refinement_level; + int my_post_adapt_uniform_refinement_levels; + int my_post_cdfem_refinement_levels; + std::vector my_post_cdfem_refinement_blocks; + uint64_t my_nonconformal_adapt_target_element_count; + std::string my_nonconformal_adapt_marker_name; + std::string my_nonconformal_adapt_indicator_name; + std::function my_nonconformal_hadapt; + Edge_Degeneracy_Handling my_cdfem_edge_degeneracy_handling; + CDFEM_Snapper my_cdfem_snapper; + double my_cdfem_dof_edge_tol; + double my_internal_face_stabilization_multiplier; + bool my_flag_use_hierarchical_dofs; + bool my_flag_constrain_CDFEM_to_XFEM_space; + bool my_flag_use_nonconformal_element_size; + mutable stk::diag::Timer my_timer_cdfem; + mutable stk::diag::Timer my_timer_adapt; +}; + +} // namespace krino + +#endif // Akri_CDFEM_Support_h diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh.cpp b/packages/krino/krino/krino_lib/Akri_CDMesh.cpp new file mode 100644 index 000000000000..71b66be817d4 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh.cpp @@ -0,0 +1,3689 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Needed for all_reduce_max +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace krino{ + +std::shared_ptr CDMesh::the_new_mesh; + +//-------------------------------------------------------------------------------- + +CDMesh::CDMesh( stk::mesh::BulkData & mesh, const std::shared_ptr & old_mesh ) + : my_meta(mesh.mesh_meta_data()), + my_aux_meta(AuxMetaData::get(my_meta)), + my_entity_id_pool(my_meta), + my_spatial_dim( my_meta.spatial_dimension() ), + my_cdfem_support(CDFEM_Support::get(my_meta)), + my_phase_support(Phase_Support::get(my_meta)), + my_old_mesh(old_mesh), + my_stash_step_count(-1), + my_missing_remote_prolong_facets(false), + my_timer_decompose("Decompose", my_cdfem_support.get_timer_cdfem()), + my_timer_decomposition_has_changed("Need CDFEM", my_cdfem_support.get_timer_cdfem()), + my_timer_snap("Snapping", my_timer_decompose), + my_timer_stash_field_data("Stash Field Data", my_timer_decompose), + my_timer_modify_mesh("Modify Mesh", my_cdfem_support.get_timer_cdfem()), + my_timer_prolongation("Prolongation", my_cdfem_support.get_timer_cdfem()), + my_timer_compute_CFL("Compute CFL", my_cdfem_support.get_timer_cdfem()) +{ /* %TRACE[ON]% */ Trace trace__("CDMesh::CDMesh( stk::mesh::BulkData & mesh )"); /* %TRACE% */ + + stk::mesh::insert(my_attribute_parts, my_aux_meta.active_part()); + stk::mesh::insert(my_attribute_parts, my_aux_meta.exposed_boundary_part()); + stk::mesh::insert(my_attribute_parts, my_aux_meta.block_boundary_part()); + + if(my_old_mesh) + { + my_old_mesh->my_old_mesh.reset(); + } +} + +CDMesh::~CDMesh() +{ + clear(); +} + +SubElementNode * CDMesh::add_managed_node(std::unique_ptr node) +{ + nodes.emplace_back(std::move(node)); + return nodes.back().get(); +} + +//-------------------------------------------------------------------------------- + + +stk::mesh::Part & CDMesh::get_locally_owned_part() const { return my_meta.locally_owned_part(); } +stk::mesh::Part & CDMesh::get_globally_shared_part() const { return my_meta.globally_shared_part(); } +stk::mesh::Part & CDMesh::get_active_part() const { return my_aux_meta.active_part(); } +stk::mesh::Part & CDMesh::get_block_boundary_part() const { return my_aux_meta.block_boundary_part(); } + +//-------------------------------------------------------------------------------- + +void CDMesh::add_periodic_node_pair(stk::mesh::Entity node1, stk::mesh::Entity node2) +{ + my_periodic_node_id_map[stk_bulk().identifier(node1)].push_back(stk_bulk().identifier(node2)); + my_periodic_node_id_map[stk_bulk().identifier(node2)].push_back(stk_bulk().identifier(node1)); +} + +const std::vector & CDMesh::all_interface_ids() const +{ + if(crossing_keys.empty()) + { + const int num_ls = num_ls_fields(); + if(num_ls < 2 || !Phase_Support::has_one_levelset_per_phase()) + { + crossing_keys.resize(num_ls_fields()); + for(int i=0; i < num_ls_fields(); ++i) + { + crossing_keys[i] = InterfaceID(i,i); + } + } + else + { + for(int i=0; i < num_ls_fields(); ++i) + { + for(int j=i+1; j < num_ls_fields(); ++j) + { + crossing_keys.push_back(InterfaceID(i,j)); + } + } + } + } + return crossing_keys; +} + +std::vector CDMesh::active_interface_ids() const +{ + const std::vector all_interfaces = all_interface_ids(); + if (all_interfaces.size() == 1) return all_interfaces; + + std::vector id_is_active_locally(all_interfaces.size(), false); + for (const auto & elem : elements) + { + for (auto && elemInterface : elem->get_sorted_cutting_interfaces()) + { + const auto lower = std::lower_bound(all_interfaces.begin(), all_interfaces.end(), elemInterface); + ThrowAssert(*lower == elemInterface); + id_is_active_locally[std::distance(all_interfaces.begin(), lower)] = true; + } + } + + std::vector id_is_active_globally(all_interfaces.size()); + stk::all_reduce_sum(stk_bulk().parallel(), id_is_active_locally.data(), id_is_active_globally.data(), id_is_active_locally.size()); + + std::vector active_ids; + for (size_t id=0; id & oldMesh = the_new_mesh->my_old_mesh; + const bool noSuccessfulDecompositionSinceLastFailedStep = nullptr == oldMesh; + const bool lastStepFailed = nullptr != oldMesh && oldMesh->my_stash_step_count == step_count; + const bool restoreMesh = lastStepFailed || + noSuccessfulDecompositionSinceLastFailedStep; // Even though mesh has already been restored, another process might have modified it (ie rayTracer) + if (restoreMesh) + { + the_new_mesh = std::make_shared(mesh, std::shared_ptr()); + the_new_mesh->generate_nonconformal_elements(); + the_new_mesh->restore_subelement_edge_nodes(); + the_new_mesh->restore_subelements(); + } + } +} + +void CDMesh::build_and_stash_old_mesh(const int stepCount) +{ + std::shared_ptr & old_mesh = my_old_mesh; + if (!old_mesh) + { + old_mesh = std::make_shared(stk_bulk(), std::shared_ptr()); + old_mesh->generate_nonconformal_elements(); + old_mesh->stash_field_data(-1, *this); + } + else + { + if (my_cdfem_support.get_interface_maximum_refinement_level() > 0) + { + old_mesh = std::make_shared(stk_bulk(), std::shared_ptr()); + old_mesh->rebuild_child_part(); + old_mesh->rebuild_parent_and_active_parts_using_nonconformal_and_child_parts(); + old_mesh->generate_nonconformal_elements(); + old_mesh->restore_subelement_edge_nodes(); + old_mesh->restore_subelements(); + } + + old_mesh->stash_field_data(stepCount, *this); + } +} + +static FieldSet get_snap_fields(const CDFEM_Support & cdfemSupport) +{ + FieldSet snapFields = cdfemSupport.get_interpolation_fields(); + + FieldRef cdfemSnapField = cdfemSupport.get_cdfem_snap_displacements_field(); + if (cdfemSnapField.valid()) + { + for ( unsigned is = 0; is < cdfemSnapField.number_of_states(); ++is ) + { + const stk::mesh::FieldState state = static_cast(is); + snapFields.erase(cdfemSnapField.field_state(state)); + } + + for (auto && field : cdfemSupport.ls_fields()) + { + const FieldRef lsField = field.isovar.field(); + for ( unsigned is = 0; is < lsField.number_of_states(); ++is ) + { + const stk::mesh::FieldState state = static_cast(is); + if (state != stk::mesh::StateNew) + snapFields.erase(lsField.field_state(state)); + } + } + } + return snapFields; +} + +static void interpolate_nodal_field(const FieldRef field, + stk::mesh::Entity node, + const std::vector & interpNodes, + const std::vector & interpWeights) +{ + const unsigned fieldLength = field.length(); + + double * val = field_data(field, node); + if (nullptr == val) return; + + for (unsigned i=0; i(field, interpNodes[iNode]); + ThrowRequire(nullptr != nodeVal); + + for (unsigned i=0; i & parentNodes, + std::vector & parentWeights) +{ + std::map nodeStencil; + node.build_stencil(nodeStencil); + + parentNodes.clear(); + parentWeights.clear(); + for (auto && entry : nodeStencil) + { + parentNodes.push_back(entry.first->entity()); + parentWeights.push_back(entry.second); + } +} + +static bool any_node_was_snapped(const std::vector & nodes, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + for (auto && node : nodes) + { + const auto iter = nodesToCapturedDomains.find(node); + if (iter != nodesToCapturedDomains.end() && !iter->second.empty()) + return true; + } + return false; +} + +static void apply_snapping_to_children_of_snapped_nodes(const CDFEM_Support & cdfemSupport, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const krino::SubElementNode & node, + std::vector & parentNodes, + std::vector & parentWeights) +{ + fill_parent_nodes_and_weights(node, parentNodes, parentWeights); + if (any_node_was_snapped(parentNodes, nodesToCapturedDomains)) + { + for (auto && field : cdfemSupport.get_interpolation_fields()) + interpolate_nodal_field(field, node.entity(), parentNodes, parentWeights); + } +} + +void CDMesh::snap_and_update_fields_and_captured_domains(const InterfaceGeometry & interfaceGeometry, + NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + const FieldSet snapFields = get_snap_fields(my_cdfem_support); + + FieldRef cdfemSnapField = my_cdfem_support.get_cdfem_snap_displacements_field(); + if (cdfemSnapField.valid()) + stk::mesh::field_copy(my_cdfem_support.get_coords_field(), cdfemSnapField); + + const stk::mesh::Selector parentElementSelector = get_parent_element_selector(get_active_part(), my_cdfem_support, my_phase_support); + nodesToCapturedDomains = snap_as_much_as_possible_while_maintaining_quality(stk_bulk(), parentElementSelector, snapFields, interfaceGeometry, my_cdfem_support.get_global_ids_are_parallel_consistent()); + + if (cdfemSnapField.valid()) + stk::mesh::field_axpby(+1.0, my_cdfem_support.get_coords_field(), -1.0, cdfemSnapField); + + std::vector parentNodes; + std::vector parentWeights; + + if (cdfemSnapField.valid() && my_old_mesh) + for (auto && node : my_old_mesh->nodes) + if (!node->is_mesh_node()) + apply_snapping_to_children_of_snapped_nodes(my_cdfem_support, nodesToCapturedDomains, *node, parentNodes, parentWeights); +} + +int +CDMesh::decompose_mesh(stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const int step_count, + const std::vector> & periodic_node_pairs) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::decompose_mesh()"); /* %TRACE% */ + stk::diag::TimeBlock root_timer__(CDFEM_Support::get(mesh.mesh_meta_data()).get_timer_cdfem()); + + CDFEM_Support & cdfemSupport = CDFEM_Support::get(mesh.mesh_meta_data()); + + if (!the_new_mesh) + { + // FIXME: This can cause problems for shells. + attach_sides_to_elements(mesh); + } + + + krinolog << "Decomposing mesh for region into phase conformal elements." << stk::diag::dendl; + NodeToCapturedDomainsMap nodesToCapturedDomains; + + { + the_new_mesh = std::make_shared(mesh, the_new_mesh); + + for(auto && pair : periodic_node_pairs) + { + the_new_mesh->add_periodic_node_pair(pair.first, pair.second); + } + + // Not sure if this is krino's responsibility or the driving application. If we have + // elemental death fields, these need to be parallel consistent on aura elements. + the_new_mesh->parallel_communicate_elemental_death_fields(); + + stk::diag::TimeBlock timer__(the_new_mesh->my_timer_decompose); + + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + the_new_mesh->snap_and_update_fields_and_captured_domains(interfaceGeometry, nodesToCapturedDomains); + + interfaceGeometry.prepare_to_process_elements(the_new_mesh->stk_bulk(), nodesToCapturedDomains); + } + + { + stk::diag::TimeBlock timer__(the_new_mesh->my_timer_decompose); + + the_new_mesh->generate_nonconformal_elements(); + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + the_new_mesh->snap_nearby_intersections_to_nodes(interfaceGeometry, nodesToCapturedDomains); + the_new_mesh->set_phase_of_uncut_elements(interfaceGeometry); + the_new_mesh->triangulate(interfaceGeometry); + the_new_mesh->decompose(); + } + + the_new_mesh->build_and_stash_old_mesh(step_count); + + const bool mesh_modified = the_new_mesh->modify_mesh(); + + the_new_mesh->prolongation(); + + // debugging + if ( krinolog.shouldPrint(LOG_DEBUG) ) + { + the_new_mesh->debug_output(); + } + + { + const ScaledJacobianQualityMetric qualityMetric; + krinolog << "After cutting quality is " << determine_quality(mesh, the_new_mesh->get_active_part(), qualityMetric) << stk::diag::dendl; + } + + + if (!the_new_mesh->aux_meta().using_fmwk()) + { + the_new_mesh->print_conformal_volumes_and_surface_areas(); + } + + const int status = mesh_modified ? (COORDINATES_MAY_BE_MODIFIED | MESH_MODIFIED) : COORDINATES_MAY_BE_MODIFIED; + return status; +} + +bool +CDMesh::modify_mesh() +{/* %TRACE[ON]% */ Trace trace__("krino::Mesh::modify_mesh()"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer_modify_mesh); + + ParallelThrowAssert(stk_bulk().parallel(), check_face_and_edge_ownership(stk_bulk())); + ParallelThrowAssert(stk_bulk().parallel(), check_face_and_edge_relations(stk_bulk())); + + set_entities_for_identical_nodes(); + const bool all_elems_are_set_and_correct = set_entities_for_existing_child_elements(); + + std::vector< stk::mesh::Entity> unused_old_child_elems; + get_unused_old_child_elements(unused_old_child_elems); + + const bool modificationIsNeeded = (my_cdfem_support.get_interface_maximum_refinement_level() > 0) || stk::is_true_on_any_proc(stk_bulk().parallel(), !all_elems_are_set_and_correct || !unused_old_child_elems.empty()); + + if (modificationIsNeeded) + { + stk::mesh::toggle_sideset_updaters(stk_bulk(), false); + + stk_bulk().modification_begin(); + create_node_entities(); + std::vector side_requests; + create_element_and_side_entities(side_requests); + destroy_custom_ghostings(stk_bulk()); + delete_mesh_entities(stk_bulk(), unused_old_child_elems); + stk_bulk().modification_end(); + ParallelThrowAssert(stk_bulk().parallel(), check_shared_entity_nodes(stk_bulk())); + + add_possible_interface_sides(side_requests); + batch_create_sides(stk_bulk(), side_requests); + + stk::mesh::toggle_sideset_updaters(stk_bulk(), true); + stk_bulk().modification_begin(); + update_node_activation(stk_bulk(), aux_meta().active_part()); // we should be able to skip this step if there are no higher order elements + update_element_side_parts(); + stk_bulk().modification_end(); + + ParallelThrowAssert(stk_bulk().parallel(), check_element_side_connectivity(stk_bulk(), aux_meta().exposed_boundary_part(), aux_meta().active_part())); + ParallelThrowAssert(stk_bulk().parallel(), check_element_side_parts()); + + aux_meta().induce_topology_nodesets(aux_meta().active_locally_owned_selector()); + + ParallelThrowAssert(stk_bulk().parallel(), check_induced_parts(stk_bulk())); + } + + return modificationIsNeeded; +} + +void +CDMesh::set_entities_for_identical_nodes() +{ + CDMesh* old_mesh = get_old_mesh(); + if (nullptr == old_mesh) return; + + for (auto && node : nodes) + { + if (!node->entity_is_valid(stk_bulk())) + { + const SubElementNode * old_node = node->find_node_with_common_ancestry(*old_mesh); + if (nullptr != old_node) + { + stk::mesh::Entity old_node_entity = old_node->entity(); + if (stk_bulk().is_valid(old_node_entity)) + { + node->set_entity(stk_bulk(), old_node_entity); + } + } + } + } +} + +void +CDMesh::parallel_communicate_elemental_death_fields() const +{ + std::vector< const stk::mesh::FieldBase *> element_fields; + for (auto && field : ls_fields()) + { + if (field.isovar.entity_rank() == stk::topology::ELEMENT_RANK) + { + element_fields.push_back(&field.isovar.field()); + } + } + stk::mesh::communicate_field_data(stk_bulk(), element_fields); +} + +bool +CDMesh::set_entities_for_existing_child_elements() +{ + CDMesh* old_mesh = get_old_mesh(); + if (nullptr == old_mesh) return false; + + std::vector subelem_node_entities; + std::vector existing_elems; + + bool all_element_entities_are_set_and_correct = true; + for (const auto & elem : elements) + { + if (elem->have_subelements()) + { + std::vector conformal_subelems; + elem->get_subelements(conformal_subelems); + + for (auto && subelem : conformal_subelems) + { + // If all nodes are set, look for existing element using the nodes. + subelem_node_entities.clear(); + for (auto&& subelem_node : subelem->get_nodes()) + { + stk::mesh::Entity node = subelem_node->entity(); + if (stk_bulk().is_valid(node)) subelem_node_entities.push_back(node); + } + existing_elems.clear(); + if (subelem_node_entities.size() == subelem->get_nodes().size()) + { + stk::mesh::get_entities_through_relations(stk_bulk(), subelem_node_entities, stk::topology::ELEMENT_RANK, existing_elems); + ThrowAssert(existing_elems.size() <= 1); + } + + if (existing_elems.empty()) + { + all_element_entities_are_set_and_correct = false; + } + else + { + subelem->set_entity(stk_bulk(), existing_elems[0]); + ThrowAssert(subelem->check_entity_nodes(stk_bulk())); + if (all_element_entities_are_set_and_correct && elem_io_part_changed(*subelem)) all_element_entities_are_set_and_correct = false; + } + } + } + else + { + if (all_element_entities_are_set_and_correct && elem_io_part_changed(*elem)) all_element_entities_are_set_and_correct = false; + } + } + return all_element_entities_are_set_and_correct; +} + +void +CDMesh::get_unused_old_child_elements(std::vector & unused_old_child_elems) +{ + stk::mesh::Selector selector = get_child_part(); + std::vector old_child_elems; + stk::mesh::get_selected_entities( selector, stk_bulk().buckets( stk::topology::ELEMENT_RANK ), old_child_elems ); + + unused_old_child_elems.clear(); + unused_old_child_elems.reserve(old_child_elems.size()); + + for (auto&& old_child_elem : old_child_elems) + { + const SubElement * subelem = find_child_element(old_child_elem); + if (subelem == nullptr) + { + unused_old_child_elems.push_back(old_child_elem); + } + } + child_elements.clear(); // reset child element vector +} + +bool +CDMesh::decomposition_needs_update(const InterfaceGeometry & interfaceGeometry, + const std::vector> & periodic_node_pairs) +{ + return !the_new_mesh || the_new_mesh->decomposition_has_changed(interfaceGeometry); +} + +void +CDMesh::mark_interface_elements_for_adaptivity(stk::mesh::BulkData & mesh, const InterfaceGeometry & interfaceGeometry, const std::string & marker_field_name, const int num_refinements) +{/* %TRACE[SPEC]% */ Tracespec trace__("CDMesh::mark_interface_elements_for_adaptivity(stk::mesh::BulkData & mesh, const std::string & marker_field_name, const int num_refinements)"); /* %TRACE% */ + + CDMesh cdmesh(mesh, std::shared_ptr()); + krino::mark_interface_elements_for_adaptivity(cdmesh.stk_bulk(), interfaceGeometry, cdmesh.active_interface_ids(), cdmesh.get_snapper(), cdmesh.aux_meta(), cdmesh.get_cdfem_support(), cdmesh.get_coords_field(), marker_field_name, num_refinements); +} + +void +CDMesh::nonconformal_adaptivity(stk::mesh::BulkData & mesh, const InterfaceGeometry & interfaceGeometry) +{/* %TRACE[SPEC]% */ Tracespec trace__("CDMesh::nonconformal_adaptivity(stk::mesh::BulkData & mesh)"); /* %TRACE% */ + + const auto & cdfem_support = CDFEM_Support::get(mesh.mesh_meta_data()); + stk::diag::TimeBlock timer__(cdfem_support.get_timer_adapt()); + + const std::string & marker_name = cdfem_support.get_nonconformal_adapt_marker_name(); + auto & h_adapt = cdfem_support.get_nonconformal_hadapt(); + + std::function marker_function = + [&mesh, &interfaceGeometry](const std::string & marker_field_name, int num_refinements) + { + mark_interface_elements_for_adaptivity(mesh, interfaceGeometry, marker_field_name, num_refinements); + }; + + perform_multilevel_adaptivity(mesh, marker_name, marker_function, h_adapt, cdfem_do_not_refine_or_unrefine_selector(cdfem_support)); +} + +void +CDMesh::rebuild_after_rebalance() +{ + clear(); + generate_nonconformal_elements(); + restore_subelement_edge_nodes(); + restore_subelements(); +} + +static bool side_is_adaptivity_or_cdfem_parent(stk::mesh::BulkData & mesh, stk::mesh::Entity side, const stk::mesh::Part & cdfemParentPart) +{ + if (mesh.num_connectivity(side, stk::topology::CONSTRAINT_RANK) > 0) + return true; + for (auto element : StkMeshEntities{mesh.begin_elements(side), mesh.end_elements(side)}) + if (mesh.bucket(element).member(cdfemParentPart)) + return true; + return false; +} + +void delete_extraneous_inactive_sides(stk::mesh::BulkData & mesh, const stk::mesh::Part & cdfemParentPart, const stk::mesh::Part & activePart) +{ + stk::mesh::Selector notActive = !activePart; + + std::vector sides; + stk::mesh::get_selected_entities(notActive, mesh.buckets(mesh.mesh_meta_data().side_rank()), sides, false); + + mesh.modification_begin(); + + for (auto && side : sides) + if (!side_is_adaptivity_or_cdfem_parent(mesh, side, cdfemParentPart)) + ThrowRequireMsg(disconnect_and_destroy_entity(mesh, side), "Could not destroy entity " << mesh.entity_key(side)); + + mesh.modification_end(); +} + +void +CDMesh::rebuild_from_restart_mesh(stk::mesh::BulkData & mesh) +{ + ParallelThrowRequire(mesh.parallel(), !the_new_mesh); + + the_new_mesh = std::make_shared(mesh, the_new_mesh); + the_new_mesh->rebuild_child_part(); + the_new_mesh->rebuild_parent_and_active_parts_using_nonconformal_and_child_parts(); + the_new_mesh->generate_nonconformal_elements(); + the_new_mesh->restore_subelement_edge_nodes(); + the_new_mesh->restore_subelements(); + + // rebuild conformal side parts + the_new_mesh->stk_bulk().modification_begin(); + the_new_mesh->update_element_side_parts(); + the_new_mesh->stk_bulk().modification_end(); + + delete_extraneous_inactive_sides(mesh, the_new_mesh->get_parent_part(), the_new_mesh->get_active_part()); +} + +void +CDMesh::rebuild_child_part() +{ + auto & child_part = get_child_part(); + auto & mesh = stk_bulk(); + + // Need to iterate all locally owned elements to find child elements, + // which are identified by detecting that they use child edge nodes + stk::mesh::EntityVector local_elements; + stk::mesh::Selector sel = get_active_part() & get_locally_owned_part(); + stk::mesh::get_selected_entities(sel, mesh.buckets(stk::topology::ELEMENT_RANK), + local_elements); + + auto conformal_selector = stk::mesh::selectUnion(my_phase_support.get_conformal_parts()); + const auto & child_edge_node_part = get_child_edge_node_part(); + mesh.modification_begin(); + for(auto && elem : local_elements) + { + auto elem_nodes = mesh.begin_nodes(elem); + auto num_nodes = mesh.num_nodes(elem); + bool is_child_elem = false; + for(unsigned i=0; i < num_nodes; ++i) + { + if(mesh.bucket(elem_nodes[i]).member(child_edge_node_part)) + { + is_child_elem = true; + break; + } + } + + if(is_child_elem) + { + mesh.change_entity_parts(elem, stk::mesh::ConstPartVector{&child_part}, stk::mesh::ConstPartVector{}); + } + } + mesh.modification_end(); +} + +void +CDMesh::rebuild_parent_and_active_parts_using_nonconformal_and_child_parts() +{ + auto & parent_part = get_parent_part(); + auto & mesh = stk_bulk(); + + stk::mesh::EntityVector entities; + stk::mesh::Selector sel = get_active_part() & get_locally_owned_part() & + stk::mesh::selectUnion(my_phase_support.get_nonconformal_parts()); + stk::mesh::get_selected_entities(sel, mesh.buckets(stk::topology::ELEMENT_RANK), + entities); + + mesh.modification_begin(); + for(auto && elem : entities) + { + mesh.change_entity_parts(elem, stk::mesh::ConstPartVector{&parent_part}, stk::mesh::ConstPartVector{&get_active_part()}); + } + + // Also remove active part from nonconformal sides + entities.clear(); + auto side_rank = mesh.mesh_meta_data().side_rank(); + stk::mesh::get_selected_entities(sel, mesh.buckets(side_rank), entities); + for(auto && side : entities) + { + mesh.change_entity_parts(side, stk::mesh::ConstPartVector{}, stk::mesh::ConstPartVector{&get_active_part()}); + } + + // Also need to mark parents in undecomposed blocks that have children due to hanging + // nodes + entities.clear(); + stk::mesh::Selector undecomposed_child_sel = get_active_part() & get_locally_owned_part() & + !my_phase_support.get_all_decomposed_blocks_selector() & + get_child_part(); + stk::mesh::get_selected_entities(undecomposed_child_sel, mesh.buckets(stk::topology::ELEMENT_RANK), + entities); + for(auto && elem : entities) + { + auto parent_elem = get_parent_element(elem); + ThrowRequire(mesh.is_valid(parent_elem)); + mesh.change_entity_parts(parent_elem, stk::mesh::ConstPartVector{&parent_part}, stk::mesh::ConstPartVector{&get_active_part()}); + } + mesh.modification_end(); +} + +const SubElementNode * +CDMesh::build_subelement_edge_node(const stk::mesh::Entity node_entity) +{ + const auto & mesh = stk_bulk(); + + // This is super inefficient but lets just get it working for now. + ThrowRequire(mesh.is_valid(node_entity)); + auto id = mesh.identifier(node_entity); + auto find_existing = std::find_if(nodes.begin(), nodes.end(), + [id](const std::unique_ptr & compare) + { return compare->entityId() == id; }); + if(find_existing != nodes.end()) + return find_existing->get(); + + auto parent_ids = get_edge_node_parent_ids(mesh, get_parent_node_ids_field(), node_entity); + + auto search0 = std::find_if(nodes.begin(), nodes.end(), + [parent_ids](const std::unique_ptr & compare) + { return compare->entityId() == parent_ids[0]; }); + const SubElementNode * immediate_parent0 = (search0 == nodes.end()) ? + build_subelement_edge_node(mesh.get_entity(stk::topology::NODE_RANK, parent_ids[0])) : + search0->get(); + + auto search1 = std::find_if(nodes.begin(), nodes.end(), + [parent_ids](const std::unique_ptr & compare) + { return compare->entityId() == parent_ids[1]; }); + const SubElementNode * immediate_parent1 = (search1 == nodes.end()) ? + build_subelement_edge_node(mesh.get_entity(stk::topology::NODE_RANK, parent_ids[1])) : + search1->get(); + + // For LS per phase the immediate parents are not necessarily actual parent element nodes, + // we need to go all the way up the parentage tree to find the original parent nodes so we can + // get the parent Mesh_Element. + std::set parent_elem_nodes_set; + get_parent_nodes_from_child( + mesh, node_entity, get_parent_node_ids_field(), parent_elem_nodes_set); + std::vector parent_elem_nodes( + parent_elem_nodes_set.begin(), parent_elem_nodes_set.end()); + std::vector parent_elems; + stk::mesh::get_entities_through_relations(stk_bulk(), parent_elem_nodes, stk::topology::ELEMENT_RANK, parent_elems); + + stk::mesh::Entity owner_entity; + const stk::mesh::Selector locally_owned_parent_selector = get_locally_owned_part() & get_parent_part(); + for(auto && e : parent_elems) + { + if(locally_owned_parent_selector(mesh.bucket(e))) + { + owner_entity = e; + break; + } + } + if(!mesh.is_valid(owner_entity)) + { + std::ostringstream err_msg; + err_msg << "Failed to find locally owned element connected to nodes" + << immediate_parent0->entityId() << " and " << immediate_parent1->entityId() + << " when restoring CDFEM data structures after restart.\n"; + err_msg << "Possible parent elems:\n"; + for(auto && e : parent_elems) + { + err_msg << " " << debug_entity(mesh, e) << "\n"; + } + throw std::runtime_error(err_msg.str()); + } + + auto owner_id = mesh.identifier(owner_entity); + const Mesh_Element * owner = find_mesh_element(owner_id); + ThrowRequireMsg(owner, "Could not find Mesh_Element for owner element " << owner_id << " " << debug_entity(mesh, owner_entity)); + const double position = compute_child_position( + mesh, node_entity, immediate_parent0->entity(), immediate_parent1->entity()); + std::unique_ptr newNode = std::make_unique(owner, position, immediate_parent0, immediate_parent1); + SubElementNode * edgeNode = add_managed_node(std::move(newNode)); + edgeNode->set_entity(stk_bulk(), node_entity); + return edgeNode; +} + +void +CDMesh::restore_subelement_edge_nodes() +{ + stk::mesh::Selector selector = get_child_edge_node_part() & + (get_locally_owned_part() | get_globally_shared_part()); + const auto & mesh = stk_bulk(); + const auto & buckets = mesh.get_buckets(stk::topology::NODE_RANK, selector); + const auto parent_id_field = get_parent_node_ids_field(); + + std::vector< const stk::mesh::FieldBase *> fields(1, &parent_id_field.field()); + stk::mesh::communicate_field_data(mesh, fields); + + for(const auto & b_ptr : buckets) + { + for(unsigned i=0; i < b_ptr->size(); ++i) + { + build_subelement_edge_node((*b_ptr)[i]); + } + } +} + +void +CDMesh::restore_subelements() +{ + stk::mesh::Selector selector = get_locally_owned_part() & get_child_part(); + const auto & mesh = stk_bulk(); + const auto & buckets = mesh.get_buckets(stk::topology::ELEMENT_RANK, selector); + NodeVec subelem_nodes; + for(const auto & b_ptr : buckets) + { + const stk::topology & topo = b_ptr->topology(); + const unsigned num_nodes = topo.num_nodes(); + subelem_nodes.reserve(num_nodes); + for(const auto & elem : *b_ptr) + { + const stk::mesh::Entity parent = get_parent_element(elem); + ThrowRequire(mesh.is_valid(parent) && parent != elem); + + auto parent_mesh_elem = find_mesh_element(mesh.identifier(parent)); + ThrowRequire(parent_mesh_elem); + + subelem_nodes.clear(); + // TODO: May need to create subelement edge nodes somehow + const auto * elem_nodes = mesh.begin_nodes(elem); + ThrowAssert(mesh.num_nodes(elem) == num_nodes); + for(unsigned i=0; i < num_nodes; ++i) + { + auto node_id = mesh.identifier(elem_nodes[i]); + auto find_node = std::find_if(nodes.begin(), nodes.end(), + [node_id](const std::unique_ptr & compare) + { return compare->entityId() == node_id; }); + ThrowRequire(find_node != nodes.end()); + subelem_nodes.push_back(find_node->get()); + } + + std::unique_ptr subelem; + switch(topo) + { + case stk::topology::TRIANGLE_3_2D: + subelem = std::make_unique(subelem_nodes, std::vector{-1, -1, -1}, parent_mesh_elem); + break; + case stk::topology::TETRAHEDRON_4: + subelem = std::make_unique(subelem_nodes, std::vector{-1, -1, -1, -1}, parent_mesh_elem); + break; + default: + ThrowRuntimeError("At present only Tri3 and Tet4 topologies are supported for restart of CDFEM problems."); + } + ThrowAssert(subelem); + subelem->set_entity(stk_bulk(), elem); + const_cast(parent_mesh_elem)->add_subelement(std::move(subelem)); + } + } +} + +void +CDMesh::delete_cdfem_parent_elements() +{/* %TRACE[SPEC]% */ Tracespec trace__("Mesh::delete_cdfem_parent_elements(stk::mesh::BulkData & mesh)"); /* %TRACE% */ + // Percept messes up the cdfem child/parent parts, the active part, and the percept refined part for post-cdfem refinement. + // This is kind of an extreme work-around, but here we delete all of the cdfem parents prior to the post-cdfem refiment so that + // there is nothing to mess up. + + std::vector< stk::mesh::Entity> cdfem_parent_elements; + + stk::mesh::Selector selector = get_parent_part(); + stk::mesh::get_selected_entities( selector, stk_bulk().buckets( stk::topology::ELEMENT_RANK ), cdfem_parent_elements ); + + stk_bulk().modification_begin(); + delete_mesh_entities(stk_bulk(), cdfem_parent_elements); + stk_bulk().modification_end(); +} + +void +CDMesh::fixup_adapted_element_parts(stk::mesh::BulkData & mesh) +{/* %TRACE[SPEC]% */ Tracespec trace__("Mesh::fixup_adapted_element_parts(CDFEM_Support & cdfem_support)"); /* %TRACE% */ + // Fixup volume parts that currently can be messed up by adaptivity. + // There are two types of fixes: + // 1. CDFEM parent elements that are activated by Encore adaptivity (this is expected, but needs to be fixed). + // 2. Conformal elements that have somehow picked up the non-conformal part (this probably shouldn't happen). + + Phase_Support & phase_support = Phase_Support::get(mesh.mesh_meta_data()); + CDFEM_Support & cdfem_support = CDFEM_Support::get(mesh.mesh_meta_data()); + AuxMetaData & aux_meta = AuxMetaData::get(mesh.mesh_meta_data()); + stk::mesh::Selector cdfem_parent_selector = cdfem_support.get_parent_part(); + + stk::mesh::Selector locally_owned_selector(mesh.mesh_meta_data().locally_owned_part()); + std::vector entities; + + std::vector remove_parts; + stk::mesh::PartVector bucket_remove_parts; + const stk::mesh::BucketVector & buckets = mesh.get_buckets(stk::topology::ELEMENT_RANK, locally_owned_selector); + for (auto&& bucket_ptr : buckets) + { + unsigned num_volume_parts = 0; + stk::mesh::Part * extraneous_nonconformal_part = nullptr; + const stk::mesh::PartVector & bucket_parts = bucket_ptr->supersets(); + bucket_remove_parts.clear(); + for(auto&& part : bucket_parts) + { + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK && part->subsets().empty() && part->topology() != stk::topology::INVALID_TOPOLOGY) + { + ++num_volume_parts; + if (phase_support.is_nonconformal(part)) + { + extraneous_nonconformal_part = part; + } + } + } + if (num_volume_parts > 1) + { + bucket_remove_parts.push_back(extraneous_nonconformal_part); + } + if (cdfem_parent_selector(*bucket_ptr)) + { + bucket_remove_parts.push_back(&aux_meta.active_part()); + } + if (!bucket_remove_parts.empty()) + { + entities.insert(entities.end(), bucket_ptr->begin(), bucket_ptr->end()); + remove_parts.insert(remove_parts.end(), bucket_ptr->size(), bucket_remove_parts); + } + } + stk::mesh::PartVector empty; + std::vector add_parts(entities.size(), empty); + + // This seems like a bug. For some reason batch_change_entity_parts does not work the same as calling change_entity_parts within a full modification cycle. + //mesh.bulk().batch_change_entity_parts(entities, add_parts, remove_parts); + mesh.modification_begin(); + for(size_t i=0; iget_edge_interpolation_model()) + { + return; + } + + for (auto && node : mesh->nodes) + { + const krino::SubElementEdgeNode* edge_node = dynamic_cast(node.get()); + if (nullptr == edge_node) continue; + + NodeVec parents = edge_node->get_parents(); + const double ratio = edge_node->get_position(); + + stk::mesh::Entity node_obj = edge_node->entity(); + stk::mesh::Entity parent0_obj = parents[0]->entity(); + stk::mesh::Entity parent1_obj = parents[1]->entity(); + + const int num_ls_fields = mesh->num_ls_fields(); + for (int ls_index=0; ls_indexls_field(ls_index); + double & node_val = *field_data( ls_field.isovar , node_obj); + const double & parent0_val = *field_data( ls_field.isovar , parent0_obj); + const double & parent1_val = *field_data( ls_field.isovar , parent1_obj); + + const double interp_val = (1.-ratio) * parent0_val + ratio * parent1_val; + node_val = interp_val; + } + } +} + +void +CDMesh::stash_field_data(const int step_count, const CDMesh & new_mesh) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::stash_field_data(const int step_count)"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer_stash_field_data); + my_stash_step_count = step_count; + clear_prolongation_data(); + + stash_nodal_field_data(new_mesh); + stash_elemental_field_data(); +} + +//-------------------------------------------------------------------------------- + +static void fill_nodes_of_elements_with_subelements_or_changed_phase(const stk::mesh::BulkData & mesh, + const std::vector> & newMeshElements, + const std::vector> & oldMeshElements, + std::set & nodesOfElements) +{ + nodesOfElements.clear(); + + for (auto && element : newMeshElements) + { + bool haveSubelementsOrChangedPhase = false; + if (element->have_subelements()) + { + haveSubelementsOrChangedPhase = true; + } + else + { + const Mesh_Element * oldElement = CDMesh::find_mesh_element(element->entityId(), oldMeshElements); + if (nullptr == oldElement || element->get_phase() != oldElement->get_phase()) + haveSubelementsOrChangedPhase = true; + } + + if (haveSubelementsOrChangedPhase) + for (auto && node : element->get_nodes()) + nodesOfElements.insert(node->entity()); + } +} + +static +void pack_shared_nodes_for_sharing_procs(const stk::mesh::BulkData & mesh, + const std::set & nodes, + stk::CommSparse &commSparse) +{ + std::vector nodeSharedProcs; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto node : nodes) + { + if (mesh.bucket(node).shared()) + { + mesh.comm_shared_procs(node, nodeSharedProcs); + for (int procId : nodeSharedProcs) + commSparse.send_buffer(procId).pack(mesh.identifier(node)); + } + } + }); +} + +static +void unpack_shared_nodes(const stk::mesh::BulkData & mesh, + std::set & nodes, + stk::CommSparse &commSparse) +{ + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + stk::mesh::EntityId nodeId; + commSparse.recv_buffer(procId).unpack(nodeId); + stk::mesh::Entity node = mesh.get_entity(stk::topology::NODE_RANK, nodeId); + ThrowRequire(mesh.is_valid(node)); + nodes.insert(node); + } + }); +} + +static std::set get_nodes_of_elements_with_subelements_or_have_changed_phase(const stk::mesh::BulkData & mesh, const std::vector> & newMeshElements, + const std::vector> & oldMeshElements) +{ + std::set nodesOfElements; + fill_nodes_of_elements_with_subelements_or_changed_phase(mesh, newMeshElements, oldMeshElements, nodesOfElements); + + stk::CommSparse commSparse(mesh.parallel()); + pack_shared_nodes_for_sharing_procs(mesh, nodesOfElements, commSparse); + unpack_shared_nodes(mesh, nodesOfElements, commSparse); + + return nodesOfElements; +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::stash_nodal_field_data(const CDMesh & new_mesh) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::stash_nodal_field_data()"); /* %TRACE% */ + + // stash child nodes + { + stk::mesh::Selector selector = get_locally_owned_part() & get_child_part(); + + stk::mesh::BucketVector const& buckets = stk_bulk().get_buckets( stk::topology::ELEMENT_RANK, selector ); + for ( auto&& bucket_ptr : buckets ) + { + const stk::mesh::Bucket & b = *bucket_ptr; + const size_t length = b.size(); + for (size_t ielem = 0; ielem < length; ++ielem) + { + stk::mesh::Entity elem = b[ielem]; + const unsigned num_elem_nodes = stk_bulk().num_nodes(elem); + const stk::mesh::Entity* elem_nodes = stk_bulk().begin_nodes(elem); + + for (unsigned inode = 0; inode < num_elem_nodes; ++inode) + { + stk::mesh::Entity node = elem_nodes[inode]; + ThrowAssert((stk_bulk().bucket(node).member(get_active_part()))); + ProlongationNodeData *& node_data = my_prolong_node_map[stk_bulk().identifier(node)]; + if (nullptr == node_data) + { + const bool communicate_me_to_all_sharers = stk_bulk().bucket(node).member(get_globally_shared_part()); + node_data = new ProlongationNodeData(*this, node, communicate_me_to_all_sharers); + } + } + } + } + } + + // Stash all nodes of elements that have child elements or have changed phase. + // Due to hanging nodes, etc, this is more than just the cut elements. + for (auto&& node : get_nodes_of_elements_with_subelements_or_have_changed_phase(stk_bulk(), new_mesh.elements, elements)) + { + if (stk_bulk().bucket(node).member(get_active_part())) // Don't stash inactive midside nodes + { + ThrowAssert(stk_bulk().is_valid(node)); + ProlongationNodeData *& node_data = my_prolong_node_map[stk_bulk().identifier(node)]; + if (nullptr == node_data) + { + const bool communicate_me_to_all_sharers = stk_bulk().bucket(node).member(get_globally_shared_part()); + node_data = new ProlongationNodeData(*this, node, communicate_me_to_all_sharers); + } + } + } + + // stash all inter-block nodes + if (need_nodes_for_prolongation()) + { + stk::mesh::Selector active_not_ghost_selector(get_active_part() & (get_locally_owned_part() | get_globally_shared_part())); + const stk::mesh::BucketVector & buckets = stk_bulk().get_buckets(stk::topology::NODE_RANK, active_not_ghost_selector); + for (auto&& bucket_ptr : buckets) + { + unsigned num_conformal_parts = 0; + const stk::mesh::PartVector & node_parts = bucket_ptr->supersets(); + for(auto&& node_part_ptr : node_parts) + { + // This is designed to catch side with block_2 + block_1_air, block_1_air + block_1_solid, etc. + if (node_part_ptr->primary_entity_rank() == stk::topology::ELEMENT_RANK && + !my_phase_support.is_nonconformal(node_part_ptr) && + stk::io::is_part_io_part(*node_part_ptr)) + { + ++num_conformal_parts; + } + } + + if (num_conformal_parts > 1) + { + for (auto&& node : *bucket_ptr) + { + ProlongationNodeData *& node_data = my_prolong_node_map[stk_bulk().identifier(node)]; + if (nullptr == node_data) + { + node_data = new ProlongationNodeData(*this, node, false); + } + } + } + } + } + + // build facets if needed + if (need_facets_for_prolongation()) + { + stk::mesh::Selector active_locally_owned_selector(get_active_part() & get_locally_owned_part()); + + const stk::mesh::BucketVector & buckets = stk_bulk().get_buckets(stk_bulk().mesh_meta_data().side_rank(), active_locally_owned_selector); + for (auto&& bucket_ptr : buckets) + { + unsigned num_conformal_parts = 0; + const stk::mesh::PartVector & side_parts = bucket_ptr->supersets(); + for(auto&& side_part_ptr : side_parts) + { + // This is designed to catch side with block_2 + block_1_air, block_1_air + block_1_solid, etc. + if (side_part_ptr->primary_entity_rank() == stk::topology::ELEMENT_RANK && + !my_phase_support.is_nonconformal(side_part_ptr) && + stk::io::is_part_io_part(*side_part_ptr)) + { + ++num_conformal_parts; + } + } + + if (num_conformal_parts > 1) + { + for (auto&& side : *bucket_ptr) + { + ThrowAssert( stk_bulk().num_elements(side) > 0 ); + + ProlongationFacet * prolong_facet = new ProlongationFacet(*this, side); + my_prolong_facets.push_back(prolong_facet); + } + } + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::stash_elemental_field_data() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::stash_elemental_field_data()"); /* %TRACE% */ + const FieldSet & element_fields = get_element_fields(); + if (element_fields.empty()) return; + + for (const auto & mesh_elem : elements) + { + const stk::mesh::EntityId elem_id = mesh_elem->entityId(); + stk::mesh::Entity elem = mesh_elem->entity(); + ThrowAssert(stk_bulk().is_valid(elem)); + + if(mesh_elem->have_subelements()) + { + std::vector conformal_subelems; + mesh_elem->get_subelements(conformal_subelems); + + const unsigned num_child = conformal_subelems.size(); + std::vector child_data(num_child); + std::vector< std::vector > child_intg_wts(num_child); + + for (unsigned j=0; jentityId(); + stk::mesh::Entity subelem_entity = stk_bulk().get_entity(stk::topology::ELEMENT_RANK, subelem_id); //EXPENSIVE! + ProlongationElementData * subelem_data = new ProlongationElementData(stk_bulk(), subelem_entity); + ThrowAssertMsg(0 == my_prolong_element_map.count(subelem_id), "Duplicate subelement entityId " << subelem_id); + my_prolong_element_map[subelem_id] = subelem_data; + subelem->set_prolongation_data(subelem_data); + child_data[j] = subelem_data; + + subelem->integration_weights(child_intg_wts[j]); + } + + const bool single_coincident_subelement = (num_child == 1); + if (!single_coincident_subelement) + { + ProlongationElementData * elem_data = new ProlongationElementData(stk_bulk(), child_data, child_intg_wts); + ThrowAssert(0 == my_prolong_element_map.count(elem_id)); + my_prolong_element_map[elem_id] = elem_data; + mesh_elem->set_prolongation_data(elem_data); + } + } + else + { + ProlongationElementData * elem_data = new ProlongationElementData(stk_bulk(), elem); + ThrowAssert(0 == my_prolong_element_map.count(elem_id)); + my_prolong_element_map[elem_id] = elem_data; + mesh_elem->set_prolongation_data(elem_data); + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::clear_prolongation_trees() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::clear_prolongation_trees() const"); /* %TRACE% */ + my_phase_prolong_tree_map.clear(); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::build_prolongation_trees() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::build_prolongation_trees() const"); /* %TRACE% */ + + clear_prolongation_trees(); + + if (need_facets_for_prolongation()) + { + std::map,std::vector> phase_prolong_facet_map; + + for ( unsigned n=0; nget_common_fields()].push_back(prolong_facet); + } + + for (auto && entry : phase_prolong_facet_map) + { + const std::vector & fields = entry.first; + std::vector & facets = entry.second; + + my_phase_prolong_tree_map[fields] = std::make_unique>(facets, ProlongationFacet::get_bounding_box); + ThrowAssert(!my_phase_prolong_tree_map[fields]->empty()); + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::communicate_prolongation_facet_fields() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::communicate_prolongation_facet_fields() const"); /* %TRACE% */ + + if (!need_facets_for_prolongation()) + return; + + const int num_procs = stk_bulk().parallel_size(); + if ( num_procs == 1 ) return; // Don't talk to yourself, it's embarrassing + const int me = stk_bulk().parallel_rank(); + + // formulate messages + stk::CommSparse comm_sparse(stk_bulk().parallel()); + + const size_t map_size = my_phase_prolong_tree_map.size(); + + for (int pass=0; pass<2; ++pass) + { + for ( int p=0; p & facet_fields = entry.first; + b.pack(facet_fields.size()); + for (unsigned field : facet_fields) + b.pack(field); + } + + ThrowAssert( pass == 0 || 0 == b.remaining() ); + } + + if (pass == 0) + { + comm_sparse.allocate_buffers(); + } + else + { + // send/receive + comm_sparse.communicate(); + } + } + + for ( int p=0; p facet_fields(num_fields); + for (size_t ifield = 0; ifield fieldOrdinals) +{ + const stk::mesh::FieldVector & all_fields = meta.get_fields(); + std::ostringstream os; + os << "Fields { "; + for (unsigned fieldOrdinal : fieldOrdinals) + os << all_fields[fieldOrdinal]->name() << " "; + os << "}"; + return os.str(); +} + +//-------------------------------------------------------------------------------- + +const ProlongationPointData * +CDMesh::find_prolongation_node(const SubElementNode & dst_node) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::find_prolongation_node(const SubElementNode & dst_node) const"); /* %TRACE% */ + + const Vector3d & dst_node_coords = dst_node.coordinates(); + const ProlongationPointData * src_data = nullptr; + + const std::vector required_fields = dst_node.prolongation_node_fields(*this); + + ThrowRequire(need_facets_for_prolongation()); + + const ProlongationFacet * nearest_prolong_facet = nullptr; + bool matching_empty_tree = false; + FacetDistanceQuery nearest_facet_query; + for (auto && entry : my_phase_prolong_tree_map) + { + const std::vector & tree_fields = entry.first; + SearchTree * facet_tree = entry.second.get(); + + if (std::includes(tree_fields.begin(), tree_fields.end(), required_fields.begin(), required_fields.end())) + { + if (nullptr == facet_tree) + { + matching_empty_tree = true; + continue; + } + std::vector nearest_prolong_facets; + facet_tree->find_closest_entities( dst_node_coords, nearest_prolong_facets ); + ThrowAssert(!nearest_prolong_facets.empty()); + + for (auto && prolong_facet : nearest_prolong_facets) + { + FacetDistanceQuery facet_query(*prolong_facet->get_facet(), dst_node_coords); + if (nearest_facet_query.empty() || facet_query.distance_squared() < nearest_facet_query.distance_squared()) + { + nearest_prolong_facet = prolong_facet; + nearest_facet_query = facet_query; + } + } + } + } + + if(nullptr != nearest_prolong_facet) + { + src_data = nearest_prolong_facet->get_prolongation_point_data(nearest_facet_query); + if (krinolog.shouldPrint(LOG_DEBUG)) + { + const std::vector & facet_nodes = nearest_prolong_facet->get_prolongation_nodes(); + krinolog << "Prolongation facet for " << dst_node.entityId() << " has nodes "; + for (auto&& node : facet_nodes) + { + krinolog << node->entityId() << " "; + } + krinolog << stk::diag::dendl; + } + } + + if( nullptr == src_data ) + { + if (matching_empty_tree) + { + my_missing_remote_prolong_facets = true; + if (krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Found missing remote prolong facet for node for " << dst_node.entityId() << stk::diag::dendl; + return nullptr; + } + // Search for facet failed. Now try nodes. This will handle triple points. Something better that handles an actual edge search might be better in 3d. + const ProlongationNodeData * closest_node = nullptr; + double closest_dist2 = std::numeric_limits::max(); + for (auto && entry : my_prolong_node_map) + { + const ProlongationNodeData * node = entry.second; + const std::vector & tree_fields = node->get_fields(); + if (std::includes(tree_fields.begin(), tree_fields.end(), required_fields.begin(), required_fields.end())) + { + const double dist2 = (node->get_coordinates()-dst_node_coords).length_squared(); + if (dist2 < closest_dist2) + { + closest_node = node; + closest_dist2 = dist2; + } + } + } + if (nullptr != closest_node) + { + src_data = closest_node; + if (krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Prolongation node for " << dst_node.entityId() << " is " << closest_node->entityId() << stk::diag::dendl; + } + } + + if (nullptr == src_data) + { + krinolog << "Failed to find prolongation node for node#" << dst_node.entityId() << stk::diag::dendl; + if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << " with required part fields=" << print_fields(stk_meta(), required_fields) << stk::diag::dendl; + krinolog << " with parts="; + const stk::mesh::PartVector & parts = stk_bulk().bucket(dst_node.entity()).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = parts.begin(); part_iter != parts.end(); ++part_iter) + { + const stk::mesh::Part * const part = *part_iter; + krinolog << "\"" << part->name() << "\"" << " "; + } + krinolog << stk::diag::dendl; + const unsigned num_dst_node_elements = stk_bulk().num_elements(dst_node.entity()); + const stk::mesh::Entity* dst_node_elements = stk_bulk().begin_elements(dst_node.entity()); + for (unsigned dst_node_elem_index=0; dst_node_elem_indexname() << "\"" << " "; + } + krinolog << stk::diag::dendl; + } + + krinolog << "Candidate prolongation facets:" << stk::diag::dendl; + for (auto && entry : my_phase_prolong_tree_map) + { + const std::vector & tree_fields = entry.first; + krinolog << " matching fields=" << std::includes(tree_fields.begin(), tree_fields.end(), required_fields.begin(), required_fields.end()) + << ", tree fields=" << print_fields(stk_meta(), tree_fields) + << stk::diag::dendl; + } + } + } + else if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Prolongation data for node#" << stk_bulk().identifier(dst_node.entity()) << " (" << dst_node.coordinates() << ")" + << " will be point at location (" << src_data->get_coordinates() << ")" << stk::diag::dendl; + + } + + return src_data; +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::find_node_with_common_ancestry(const SubElementNode * new_node) const +{ + return new_node->find_node_with_common_ancestry(*this); +} + +static bool entity_has_any_node_in_selector(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const stk::mesh::Selector & selector) +{ + const unsigned numNodes = mesh.num_nodes(entity); + stk::mesh::Entity const* entityNodes = mesh.begin_nodes(entity); + for (unsigned n=0; n +CDMesh::get_nonconformal_elements() const +{ + std::vector elems; + const auto & all_decomposed_blocks_selector = my_phase_support.get_all_decomposed_blocks_selector(); + stk::mesh::Selector selector = get_locally_owned_part() & (get_parent_part() | (get_active_part() & !get_child_part())); + stk::mesh::BucketVector const& buckets = stk_bulk().get_buckets(stk::topology::ELEMENT_RANK, selector); + + for (auto&& bucket : buckets) + { + const stk::topology topology = bucket->topology(); + if (Mesh_Element::is_supported_topology(topology)) + for (auto&& elem : *bucket) + if (entity_has_any_node_in_selector(stk_bulk(), elem, all_decomposed_blocks_selector)) + elems.push_back(elem); + } + + std::sort(elems.begin(), elems.end(), stk::mesh::EntityLess(stk_bulk())); + + return elems; +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::generate_nonconformal_elements() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::generate_nonconformal_elements()"); /* %TRACE% */ + ParallelThrowRequire(stk_bulk().parallel(), nodes.empty()); + ParallelThrowRequire(stk_bulk().parallel(), elements.empty()); + + const std::vector nonconformalElems = get_nonconformal_elements(); + elements.reserve(nonconformalElems.size()); + for(auto && elem : nonconformalElems) + { + auto mesh_elem = std::make_unique(*this, elem); + elements.emplace_back(std::move(mesh_elem)); + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::clear() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::clear()"); /* %TRACE% */ + + nodes.clear(); + elements.clear(); + + clear_prolongation_data(); + + mesh_node_map.clear(); + child_elements.clear(); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::clear_prolongation_data() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::clear()"); /* %TRACE% */ + for (auto && map_entry : my_prolong_node_map) + { + delete map_entry.second; + } + my_prolong_node_map.clear(); + for (auto && map_entry : my_prolong_element_map) + { + delete map_entry.second; + } + my_prolong_element_map.clear(); + + for (auto && prolong_facet : my_prolong_facets) + { + delete prolong_facet; + } + my_prolong_facets.clear(); + + clear_prolongation_trees(); +} + +bool +CDMesh::is_interface(const PhaseTag & phase, const InterfaceID interface) const +{ + return phase_matches_interface(my_cdfem_support, phase, interface); +} + +//-------------------------------------------------------------------------------- + +PhaseTag +CDMesh::determine_entity_phase(stk::mesh::Entity entity) const +{ + return determine_phase_for_entity(stk_bulk(), entity, my_phase_support); +} + +//-------------------------------------------------------------------------------- + +bool +CDMesh::elem_io_part_changed(const ElementObj & elem) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::verify_elem_part(const Mesh_Element * elem) const"); /* %TRACE% */ + const stk::mesh::Part & current_elem_io_part = find_element_part(stk_bulk(),elem.entity()); + const stk::mesh::Part * const conformal_elem_io_part = my_phase_support.find_conformal_io_part(current_elem_io_part, elem.get_phase()); + return (¤t_elem_io_part != conformal_elem_io_part || !stk_bulk().bucket(elem.entity()).member(get_active_part())); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::determine_nonconformal_parts( + stk::mesh::Entity entity, + stk::mesh::PartVector & add_parts, + stk::mesh::PartVector & remove_parts) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::determine_nonconformal_parts(stk::mesh::Entity entity, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const"); /* %TRACE% */ + + add_parts.clear(); + remove_parts.clear(); + + const auto & all_decomposed_blocks_selector = my_phase_support.get_all_decomposed_blocks_selector(); + stk::mesh::EntityRank entity_rank = stk_bulk().entity_rank(entity); + const stk::mesh::PartVector & current_parts = stk_bulk().bucket(entity).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = current_parts.begin(); part_iter != current_parts.end(); ++part_iter) + { + stk::mesh::Part & part = **part_iter; + if( part.primary_entity_rank() == entity_rank && all_decomposed_blocks_selector(part) ) + { + stk::mesh::Part * nonconformal_io_part = const_cast(my_phase_support.find_nonconformal_part(part)); + if (nullptr != nonconformal_io_part && nonconformal_io_part != &part) + { + add_parts.push_back(nonconformal_io_part); + remove_parts.push_back(&part); + + for(stk::mesh::PartVector::const_iterator sup_it = part.supersets().begin(); sup_it != part.supersets().end(); ++sup_it) + { + stk::mesh::Part & superset = **sup_it; + if (!stk::mesh::is_auto_declared_part(superset)) + { + remove_parts.push_back(&superset); + } + } + } + } + } + + // Set to inactive + remove_parts.push_back(&aux_meta().active_part()); + + if (entity_rank == stk::topology::ELEMENT_RANK) + { + add_parts.push_back(&get_parent_part()); + remove_parts.push_back(&get_child_part()); + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::determine_conformal_parts( + const stk::mesh::PartVector & current_parts, + const stk::mesh::EntityRank entity_rank, + const PhaseTag & phase, + stk::mesh::PartVector & add_parts, + stk::mesh::PartVector & remove_parts) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::determine_conformal_parts(stk::mesh::Entity entity, const PhaseTag & phase, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const"); /* %TRACE% */ + + const auto & all_decomposed_blocks_selector = my_phase_support.get_all_decomposed_blocks_selector(); + for(stk::mesh::PartVector::const_iterator part_iter = current_parts.begin(); part_iter != current_parts.end(); ++part_iter) + { + stk::mesh::Part & part = **part_iter; + if( part.primary_entity_rank() == entity_rank && + (stk::io::is_part_io_part(part) || all_decomposed_blocks_selector(&part)) ) + { + stk::mesh::Part * conformal_elem_io_part = const_cast(my_phase_support.find_conformal_io_part(part, phase)); + if (nullptr != conformal_elem_io_part && conformal_elem_io_part != &part) + { + add_parts.push_back(conformal_elem_io_part); + remove_parts.push_back(&part); + + for(stk::mesh::PartVector::const_iterator sup_it = part.supersets().begin(); sup_it != part.supersets().end(); ++sup_it) + { + stk::mesh::Part & superset = **sup_it; + if (!stk::mesh::is_auto_declared_part(superset)) + { + remove_parts.push_back(&superset); + } + } + } + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::determine_conformal_parts( + stk::mesh::Entity entity, + const PhaseTag & phase, + stk::mesh::PartVector & add_parts, + stk::mesh::PartVector & remove_parts) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::determine_conformal_parts(stk::mesh::Entity entity, const PhaseTag & phase, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const"); /* %TRACE% */ + + add_parts.clear(); + remove_parts.clear(); + + ThrowAssert(stk_bulk().is_valid(entity)); + + stk::mesh::EntityRank entity_rank = stk_bulk().entity_rank(entity); + const stk::mesh::PartVector & current_parts = stk_bulk().bucket(entity).supersets(); + determine_conformal_parts(current_parts, entity_rank, phase, add_parts, remove_parts); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::determine_child_conformal_parts( + stk::topology topology, + const stk::mesh::PartVector & parent_parts, + const PhaseTag & phase, + stk::mesh::PartVector & child_parts) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::determine_child_conformal_parts(stk::mesh::Entity entity, const PhaseTag & phase, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const"); /* %TRACE% */ + + child_parts.clear(); + + const auto & all_decomposed_blocks_selector = my_phase_support.get_all_decomposed_blocks_selector(); + stk::mesh::EntityRank entity_rank = topology.rank(); + for(stk::mesh::PartVector::const_iterator part_iter = parent_parts.begin(); part_iter != parent_parts.end(); ++part_iter) + { + stk::mesh::Part & part = **part_iter; + if( part.primary_entity_rank() == entity_rank && + (stk::io::is_part_io_part(part) || all_decomposed_blocks_selector(&part)) ) + { + stk::mesh::Part * conformal_elem_io_part = const_cast(my_phase_support.find_conformal_io_part(part, phase)); + if (nullptr != conformal_elem_io_part && !my_phase_support.is_interface(&part)) + { + child_parts.push_back(conformal_elem_io_part); + } + } + else if (stk::mesh::contain(my_attribute_parts, part)) + { + child_parts.push_back(&part); + } + } + + child_parts.push_back(&stk_meta().get_topology_root_part(topology)); + + if (entity_rank == stk::topology::ELEMENT_RANK) + { + child_parts.push_back(&get_child_part()); + } + + // Set to active + child_parts.push_back(&aux_meta().active_part()); +} + +//-------------------------------------------------------------------------------- + +bool +CDMesh::triangulate(const InterfaceGeometry & interfaceGeometry) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::triangulate(InterfaceGeometry & interfaceGeometry)"); /* %TRACE% */ + bool made_changes = false; + for (auto && elem : elements) + { + made_changes |= elem->triangulate(*this, interfaceGeometry); + } + return made_changes; +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::cut_sharp_features() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::cut_sharp_features(void)"); /* %TRACE% */ + for (auto && elem : elements) + { + elem->cut_interior_intersection_points(*this); + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::set_phase_of_uncut_elements(const InterfaceGeometry & interfaceGeometry) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::snap_nearby_intersections_to_nodes(void)"); /* %TRACE% */ + + const bool oneLSPerPhase = Phase_Support::has_one_levelset_per_phase(); + for (auto && entry : interfaceGeometry.get_phase_for_uncut_elements()) + { + Mesh_Element * elem = find_mesh_element(stk_bulk().identifier(entry.first)); + if (elem) + { + PhaseTag elemPhase; + if (oneLSPerPhase) + { + elemPhase.add(ls_field(entry.second).identifier, -1); + elem->set_phase(elemPhase); + } + else + { + ThrowRequire(1 == num_ls_fields()); + elemPhase.add(ls_field(0).identifier, entry.second); + elem->set_phase(elemPhase); + } + if (false) + krinolog << "Set phase for elem " << stk_bulk().identifier(entry.first) << ".\n" << elem->visualize(*this) << stk::diag::dendl; + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::snap_nearby_intersections_to_nodes(const InterfaceGeometry & interfaceGeometry, NodeToCapturedDomainsMap & domainsAtNodes) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::snap_nearby_intersections_to_nodes(void)"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer_snap); + + snap_to_node(stk_bulk(), interfaceGeometry, get_snapper(), domainsAtNodes); + for (auto && entry : domainsAtNodes) + { + const SubElementNode * node = get_mesh_node(stk_bulk().identifier(entry.first)); + if (node) + node->set_node_domains(entry.second); + } + + domainsAtNodes.clear(); // done using this +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::decompose() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::decompose(void)"); /* %TRACE% */ + + if (my_cdfem_support.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + cut_sharp_features(); + + // TODO: N^2 in number of phases + for (auto && interface : active_interface_ids()) + { + determine_node_signs(interface); + decompose_edges(interface); + determine_node_scores(interface); + handle_hanging_children(interface); + } + for (auto && elem : elements) + { + elem->build_quadratic_subelements(*this); + } + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << stk::diag::dendl; + + for (auto && elem : elements ) + { + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Determining subelement phases for Mesh_Element local_id=" << " identifier=" << elem->entityId(); + krinolog << "\n"; + } + elem->determine_decomposed_elem_phase(*this); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "\n"; + } + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << stk::diag::dendl; +} + +void +CDMesh::build_parallel_hanging_edge_nodes() +{ /* %TRACE[ON]% */ Trace trace__("krino::CDMesh::build_parallel_hanging_edge_nodes(void)"); /* %TRACE% */ + stk::mesh::BulkData & mesh = stk_bulk(); + + if (mesh.parallel_size() < 2) return; + + // Get all cut edges in the mesh that are parallel shared. Processing by edge nodes should be cheaper than processing + // by elements since we don't have to deal with duplicates. + std::vector shared_edge_nodes; + for (auto&& node : nodes) + { + const SubElementEdgeNode * edge_node = dynamic_cast( node.get() ); + if (nullptr != edge_node) + { + if (SubElementChildNodeAncestry::is_shared(mesh, edge_node)) + { + shared_edge_nodes.emplace_back(edge_node); + } + } + } + + std::vector sharing_procs; + std::vector edge_node_keys; + + stk::CommSparse comm_spec(mesh.parallel()); + + for (int phase=0;phase<2;++phase) + { + for (auto&& shared_edge_node : shared_edge_nodes) + { + shared_edge_node.get_parent_node_keys(edge_node_keys); + stk_bulk().shared_procs_intersection(edge_node_keys, sharing_procs); + + for (auto&& other_proc : sharing_procs) + { + if (other_proc != mesh.parallel_rank()) + { + shared_edge_node.pack_into_buffer(comm_spec.send_buffer(other_proc)); + } + } + } + + if ( phase == 0 ) + { + comm_spec.allocate_buffers(); + } + else + { + comm_spec.communicate(); + } + } + + for(int i = 0; i < mesh.parallel_size(); ++i) + { + if(i != mesh.parallel_rank()) + { + while(comm_spec.recv_buffer(i).remaining()) + { + SubElementChildNodeAncestry shared_child_node(comm_spec.recv_buffer(i)); + shared_child_node.build_missing_child_nodes(*this); + } + } + } +} + +void +CDMesh::determine_node_signs(const InterfaceID & interface) +{ + for (auto && node : nodes) + { + node->clear_node_sign(); + } + for (auto && elem : elements) + { + elem->determine_node_signs(*this, interface); + } + sync_node_signs_on_constrained_nodes(); + parallel_sync_node_signs_on_shared_nodes(); +} + +void +CDMesh::decompose_edges(const InterfaceID & interface) +{ + for (auto && elem : elements) + { + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Decomposing Mesh_Element local_id=" << " identifier=" << elem->entityId(); + krinolog << "\n"; + } + elem->decompose(*this, interface); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "\n"; + } +} + +void +CDMesh::determine_node_scores(const InterfaceID & interface) +{ + for (auto && node : nodes) + { + node->clear_node_score(); + } + for (auto && elem : elements) + { + elem->determine_node_scores(*this, interface); + } + sync_node_scores_on_constrained_nodes(); + parallel_sync_node_scores_on_shared_nodes(); +} + +template +std::vector> determine_owning_procs_of_nodes_in_ancestries(const stk::mesh::BulkData & mesh, const std::vector> & constrainedNodesAndData) +{ + std::vector edgeNodeKeys; + + std::vector> owningProcsOfNodesInAncestries; + owningProcsOfNodesInAncestries.reserve(constrainedNodesAndData.size()); + for (auto&& constrainedNodeAndData : constrainedNodesAndData) + { + owningProcsOfNodesInAncestries.emplace_back(); + std::vector & owningProcs = owningProcsOfNodesInAncestries.back(); + + const auto & nodeAncestry = constrainedNodeAndData.first; + nodeAncestry.get_parent_node_keys(edgeNodeKeys); + for (auto && edgeNodeKey : edgeNodeKeys) + owningProcs.push_back(mesh.parallel_owner_rank(mesh.get_entity(edgeNodeKey))); //Expensive? + + stk::util::sort_and_unique(owningProcs); + } + + return owningProcsOfNodesInAncestries; +} + +template +std::vector> determine_sharing_procs_of_nodes_in_ancestries(const stk::mesh::BulkData & mesh, const std::vector> & sharedNodesAndData) +{ + std::vector edgeNodeKeys; + + std::vector> sharingProcsOfNodesInAncestries; + sharingProcsOfNodesInAncestries.reserve(sharedNodesAndData.size()); + for (auto&& sharedNodeAndData : sharedNodesAndData) + { + sharingProcsOfNodesInAncestries.emplace_back(); + std::vector & sharingProcs = sharingProcsOfNodesInAncestries.back(); + + const auto & nodeAncestry = sharedNodeAndData.first; + nodeAncestry.get_parent_node_keys(edgeNodeKeys); + mesh.shared_procs_intersection(edgeNodeKeys, sharingProcs); + } + + return sharingProcsOfNodesInAncestries; +} + +template +void pack_node_data_for_node_ancestries(const stk::mesh::BulkData & mesh, const std::vector> & nodeAncestriesAndData, const std::vector> & destinationProcs, stk::CommSparse &commSparse) +{ + stk::pack_and_communicate(commSparse,[&]() + { + ThrowAssert(nodeAncestriesAndData.size() == destinationProcs.size()); + std::vector edgeNodeKeys; + + for (size_t i=0; i +void set_node_sign_or_score(const SubElementNode * node, const T & signOrScore) { ThrowRequireMsg(false, "Unsupported type in set_node_sign_or_score."); } + +template <> +void set_node_sign_or_score(const SubElementNode * node, const int & sign) { node->set_node_sign(sign); } + +template <> +void set_node_sign_or_score(const SubElementNode * node, const double & score) { node->set_node_score(score); } + +template +T get_node_sign_or_score(const SubElementNode * node) { ThrowRequireMsg(false, "Unsupported type in get_node_sign_or_score."); } + +template <> +int get_node_sign_or_score(const SubElementNode * node) { return node->get_node_sign(); } + +template <> +double get_node_sign_or_score(const SubElementNode * node) { return node->get_node_score(); } + +template +bool node_sign_or_score_is_set(const SubElementNode * node) { ThrowRequireMsg(false, "Unsupported type in node_sign_or_score_is_set."); return false; } + +template <> +bool node_sign_or_score_is_set(const SubElementNode * node) { return node->node_sign_is_set(); } + +template <> +bool node_sign_or_score_is_set(const SubElementNode * node) { return node->node_score_is_set(); } + +template +std::vector> gather_constrained_node_ancestries_and_sign_or_score(const std::vector> & nodes, + const std::unordered_map > & periodicNodeIDMap) +{ + std::vector> ancestriesAndNodeOrScore; + for (auto && node : nodes) + { + if (node_sign_or_score_is_set(node.get())) + { + SubElementChildNodeAncestry nodeAncestry(node.get()); + const auto & constrainedNodeAncestries = nodeAncestry.get_constrained_node_ancestries(periodicNodeIDMap); + for (auto && constrainedNodeAncestry : constrainedNodeAncestries) + ancestriesAndNodeOrScore.emplace_back(constrainedNodeAncestry,get_node_sign_or_score(node.get())); + } + } + return ancestriesAndNodeOrScore; +} + +template +std::vector> gather_shared_node_ancestries_and_sign_or_score(const stk::mesh::BulkData & mesh, + const std::vector> & nodes) +{ + // Get all cut edges in the mesh that are parallel shared. Processing by edge nodes should be cheaper than processing + // by elements since we don't have to deal with duplicates. + + std::vector> sharedNodeAncestriesAndSignOrScore; + for (auto && node : nodes) + if (node_sign_or_score_is_set(node.get()) && SubElementChildNodeAncestry::is_shared(mesh, node.get())) + sharedNodeAncestriesAndSignOrScore.emplace_back(node.get(),get_node_sign_or_score(node.get())); + + return sharedNodeAncestriesAndSignOrScore; +} + +template +void receive_node_sign_or_score(CDMesh & cdmesh, stk::CommSparse &commSparse) +{ + stk::unpack_communications(commSparse, [&commSparse, &cdmesh](int procId) + { + auto & buffer = commSparse.recv_buffer(procId); + SubElementChildNodeAncestry shared_edge_node(buffer); + T signOrScore = 0; + buffer.unpack(signOrScore); + + const SubElementNode * node = shared_edge_node.find_subelement_node(cdmesh); + if (node) + set_node_sign_or_score(node, signOrScore); + }); +} + +template +void sync_node_sign_or_score_on_local_constrained_nodes(CDMesh & cdmesh, const std::vector> & constrainedNodesAndSignOrScore, const std::vector> & owningProcsOfNodesInAncestries) +{ + ThrowAssert(constrainedNodesAndSignOrScore.size() == owningProcsOfNodesInAncestries.size()); + + for (size_t i=0; i +void sync_node_sign_or_score_on_constrained_nodes(CDMesh & cdmesh, + const stk::mesh::BulkData & mesh, + const std::vector> & nodes, + const std::unordered_map > & periodicNodeIDMap) +{ + if (stk::is_true_on_all_procs(cdmesh.stk_bulk().parallel(), periodicNodeIDMap.empty())) + return; + + const std::vector> constrainedNodeAncestriesAndSignOrScore = gather_constrained_node_ancestries_and_sign_or_score(nodes, periodicNodeIDMap); + const std::vector> owningProcsOfNodesInAncestries = determine_owning_procs_of_nodes_in_ancestries(mesh, constrainedNodeAncestriesAndSignOrScore); + + sync_node_sign_or_score_on_local_constrained_nodes(cdmesh, constrainedNodeAncestriesAndSignOrScore, owningProcsOfNodesInAncestries); + + if (mesh.parallel_size() < 2) return; + + stk::CommSparse commSparse(mesh.parallel()); + pack_node_data_for_node_ancestries(mesh, constrainedNodeAncestriesAndSignOrScore, owningProcsOfNodesInAncestries, commSparse); + receive_node_sign_or_score(cdmesh, commSparse); +} + +template +void sync_node_sign_or_score_on_shared_nodes(CDMesh & cdmesh, + const stk::mesh::BulkData & mesh, + const std::vector> & nodes) +{ + if (mesh.parallel_size() < 2) return; + + const std::vector> sharedNodeAncestriesAndSignOrScore = gather_shared_node_ancestries_and_sign_or_score(mesh, nodes); + const std::vector> sharingProcsOfNodesInAncestries = determine_sharing_procs_of_nodes_in_ancestries(mesh, sharedNodeAncestriesAndSignOrScore); + + stk::CommSparse commSparse(mesh.parallel()); + pack_node_data_for_node_ancestries(mesh, sharedNodeAncestriesAndSignOrScore, sharingProcsOfNodesInAncestries, commSparse); + receive_node_sign_or_score(cdmesh, commSparse); +} + +void +CDMesh::sync_node_signs_on_constrained_nodes() +{ + sync_node_sign_or_score_on_constrained_nodes(*this, stk_bulk(), nodes, my_periodic_node_id_map); +} + +void +CDMesh::sync_node_scores_on_constrained_nodes() +{ + sync_node_sign_or_score_on_constrained_nodes(*this, stk_bulk(), nodes, my_periodic_node_id_map); +} + +void +CDMesh::parallel_sync_node_signs_on_shared_nodes() +{ + sync_node_sign_or_score_on_shared_nodes(*this, stk_bulk(), nodes); +} + +void +CDMesh::parallel_sync_node_scores_on_shared_nodes() +{ + sync_node_sign_or_score_on_shared_nodes(*this, stk_bulk(), nodes); +} + +void +CDMesh::handle_hanging_children(const InterfaceID & interface) +{ /* %TRACE[ON]% */ Trace trace__("krino::CDMesh::handle_hanging_children(const InterfaceID & interface)"); /* %TRACE% */ + + build_parallel_hanging_edge_nodes(); + + for (auto && elem : elements) + { + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Handling hanging children Mesh_Element identifier=" << elem->entityId(); + krinolog << "\n"; + } + elem->handle_hanging_children(*this, interface); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "\n"; + } +} + +//-------------------------------------------------------------------------------- + +const SubElementMeshNode * +CDMesh::get_mesh_node( stk::mesh::EntityId node_id ) const +{ + NodeMap::const_iterator it = mesh_node_map.find( node_id ); + return ( it != mesh_node_map.end() ) ? it->second : nullptr; +} + +const SubElementMeshNode * +CDMesh::get_mesh_node(const SubElementNode * new_node) const +{ + const SubElementMeshNode * mesh_node = dynamic_cast( new_node ); + if (nullptr != mesh_node) + { + return get_mesh_node(new_node->entityId()); + } + return nullptr; +} + +SubElementMeshNode * +CDMesh::add_managed_mesh_node( std::unique_ptr node ) +{ + SubElementMeshNode * ptr = node.get(); + mesh_node_map.insert( NodeMap::value_type( node->entityId(), ptr ) ); + add_managed_node(std::move(node)); + return ptr; +} + +//-------------------------------------------------------------------------------- +void +CDMesh::check_isovariable_field_existence_on_decomposed_blocks(stk::mesh::BulkData & mesh, + const bool conformal_parts_require_field) +{ + CDMesh cdmesh(mesh, std::shared_ptr()); + cdmesh.check_isovariable_field_existence_on_decomposed_blocks(conformal_parts_require_field); +} + +namespace { +bool field_exists_on_part(const FieldRef field, const stk::mesh::Part & part) +{ + stk::mesh::Selector field_selector = AuxMetaData::get(part.mesh_meta_data()).selectField(field, stk::topology::ELEMENT_RANK); + return field_selector(part); +} +std::ostream & dump_fields_on_part(std::ostream & os, const stk::mesh::Part & part) +{ + const auto & meta = part.mesh_meta_data(); + for(auto && field : meta.get_fields(stk::topology::NODE_RANK)) + { + if(field_exists_on_part(*field, part)) + os << " * " << field->name() << "\n"; + } + return os; +} +} +void +CDMesh::check_isovariable_field_existence_on_decomposed_blocks(const bool conformal_parts_require_field) const +{ + const int num_ls = num_ls_fields(); + for(auto && part : stk_meta().get_mesh_parts()) + { + if(part->primary_entity_rank() != stk::topology::ELEMENT_RANK) continue; + + const auto nonconformal_part = my_phase_support.find_nonconformal_part(*part); + if(!nonconformal_part) continue; + + /* 4 cases we care about here: + * 1) Nonconformal part - Skip + * 2) Initial IO part (i.e. block_1) - Must have field + * 3) Active conformal part (either LS or active part for irreversible) - Must have field + * 4) Deactivated conformal part (irreversible only) - Skip + */ + if(my_phase_support.is_nonconformal(part)) continue; + + // If part is the initial IO part the phase will be empty + const auto & phase = my_phase_support.get_iopart_phase(*part); + + // Steady state problems that only do a single decomposition can + // get away with only defining the isovariable on the initial IO part + // so skip checking for the field in that case. + if(!conformal_parts_require_field && !phase.empty()) continue; + + for(int ls=0; ls < num_ls; ++ls) + { + const auto * LS = ls_field(ls).ptr; + const auto * death_spec = get_death_spec(ls); + const bool is_dead_block = death_spec && phase.contain(death_spec->get_deactivated_phase()); + const bool LS_uses_part = + my_phase_support.level_set_is_used_by_nonconformal_part(LS, nonconformal_part); + if(LS_uses_part && !is_dead_block) + { + const auto field = ls_field(ls).isovar; + if(!field_exists_on_part(field, *part)) + { + std::ostringstream err_msg; + err_msg << "CDFEM isovariable field " << field.name() << " is not defined on " + << part->name() << " that is supposed to be decomposed.\n" + << "Available fields on " << part->name() << " are:\n"; + dump_fields_on_part(err_msg, *part); + throw std::runtime_error(err_msg.str()); + } + } + } + } +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::create_mesh_node( + const Mesh_Element * owner, + const int lnn, + stk::mesh::Entity nodeEntity ) +{ + const stk::mesh::EntityId nodeId = stk_bulk().identifier(nodeEntity); + const SubElementMeshNode * subnode = get_mesh_node(nodeId); + + if ( nullptr == subnode ) + { + const Vector3d owner_coords = owner->get_node_parametric_coords( lnn ); + const double * global_coords_ptr = field_data(get_coords_field(), nodeEntity); + + Vector3d global_coords(global_coords_ptr, my_spatial_dim); + + std::unique_ptr meshNode = std::make_unique( owner, nodeEntity, nodeId, owner_coords, global_coords ); + subnode = add_managed_mesh_node(std::move(meshNode)); + } + + return subnode; +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::create_edge_node( const Mesh_Element * owner, + const SubElementNode * parent1, + const SubElementNode * parent2, + const double position) +{ + const SubElementNode * subnode = SubElementNode::common_child({parent1, parent2}); + + if (subnode == nullptr) + { + std::unique_ptr newNode = std::make_unique(owner, position, parent1, parent2); + subnode = add_managed_node(std::move(newNode)); + + parent1->add_child(subnode); + parent2->add_child(subnode); + } + + return subnode; +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::create_midside_node( const Mesh_Element * owner, + const SubElementNode * parent1, + const SubElementNode * parent2, + stk::mesh::Entity entity) +{ + std::pair parents = + parent1second; + } + else + { + std::unique_ptr newNode = (stk_bulk().is_valid(entity)) ? + std::make_unique(owner, parent1, parent2, entity, stk_bulk().identifier(entity)) : + std::make_unique(owner, parent1, parent2); + subnode = add_managed_node(std::move(newNode)); + my_midside_node_map[parents] = subnode; + } + + return subnode; +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::create_steiner_node( const Mesh_Element * owner, + const NodeVec & parents, + const std::vector & weights ) +{ + std::unique_ptr newNode = std::make_unique( owner, parents, weights ); + return add_managed_node(std::move(newNode)); +} + +//-------------------------------------------------------------------------------- + +const SubElementNode * +CDMesh::create_child_internal_or_face_node( const Mesh_Element * owner, + const NodeVec & parents, + const std::vector & weights ) +{ + const SubElementNode * subnode = SubElementNode::common_child(parents); + + if (subnode == nullptr) + { + std::unique_ptr newNode = std::make_unique( owner, parents, weights ); + subnode = add_managed_node(std::move(newNode)); + + for (auto && parent : parents) + parent->add_child(subnode); + } + + return subnode; +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::create_subelement_mesh_entities( + const Mesh_Element & elem, + const std::vector conformal_subelems) +{ + stk::mesh::Entity parent_elem = elem.entity(); + for (auto && subelem : conformal_subelems) + { + const stk::mesh::PartVector & parent_parts = stk_bulk().bucket(parent_elem).supersets(); + const stk::topology parent_topology = stk_bulk().bucket(parent_elem).topology(); + stk::mesh::PartVector subelem_parts; + determine_child_conformal_parts(parent_topology, parent_parts, subelem->get_phase(), subelem_parts); + + if (0 == subelem->entityId()) + { + const stk::mesh::EntityId new_id = my_entity_id_pool.get_EntityId(stk::topology::ELEMENT_RANK); + ThrowAssert(!stk_bulk().is_valid(stk_bulk().get_entity(stk::topology::ELEMENT_RANK, new_id))); + stk::mesh::Entity subelem_entity = stk_bulk().declare_element(new_id, subelem_parts); + subelem->set_entity( stk_bulk(), subelem_entity ); + ThrowAssert(stk_bulk().bucket(subelem_entity).topology() != stk::topology::INVALID_TOPOLOGY); + + const NodeVec & elem_nodes = subelem->get_nodes(); + for (unsigned n=0; nentity(); + stk_bulk().declare_relation( subelem_entity, node , n ); + } + } + else + { + stk::mesh::Entity subelem_entity = subelem->entity(); + stk_bulk().change_entity_parts(subelem_entity, subelem_parts, get_removable_parts(stk_bulk(), subelem_entity)); + } + } +} + +void +CDMesh::attach_existing_and_identify_missing_subelement_sides( + const Mesh_Element & elem, + const std::vector conformal_subelems, + std::vector & side_requests) +{ + stk::mesh::BulkData & stk_mesh = stk_bulk(); + const bool build_internal_sides = my_cdfem_support.use_internal_face_stabilization(); + + for (auto && subelem : conformal_subelems) + { + const stk::topology topology = subelem->topology(); + const stk::mesh::Entity * elem_nodes = stk_bulk().begin_nodes(subelem->entity()); + + for (unsigned s=0; s side_nodes(side_topology.num_nodes()); + topology.side_nodes(elem_nodes, s, side_nodes.data()); + + std::vector sides; + stk::mesh::get_entities_through_relations(stk_mesh, side_nodes, stk_meta().side_rank(), sides); + + if (sides.empty()) + { + stk::mesh::Entity parent_side = find_entity_by_ordinal(stk_bulk(), elem.entity(), stk_meta().side_rank(), subelem->parent_side_id(s)); + const bool have_parent_side = stk_bulk().is_valid(parent_side); + const bool is_internal_side = subelem->parent_side_id(s) == -1; + + if (have_parent_side || (is_internal_side && build_internal_sides)) + { + static stk::mesh::PartVector empty_parts; + const stk::mesh::PartVector & parent_parts = have_parent_side ? stk_bulk().bucket(parent_side).supersets() : empty_parts; + + // We have to make sure that pre-existing sideset parts are added to the side so that we + // can figure out the correct conformal side parts during the second modification pass. + stk::mesh::PartVector side_parts; + determine_child_conformal_parts(side_topology, parent_parts, subelem->get_phase(), side_parts); + if (is_internal_side) + { + side_parts.push_back(&get_internal_side_part()); + } + + side_requests.emplace_back(subelem->entity(), s, side_parts); + } + } + else + { + ThrowRequire(sides.size() == 1); + stk::mesh::Entity elem_side_entity = sides[0]; + attach_entity_to_elements(stk_bulk(), elem_side_entity); + } + } + } +} + +bool +CDMesh::check_element_side_parts() const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::check_element_side_parts()"); /* %TRACE% */ + // This method requires aura to work correctly. + if (!stk_bulk().is_automatic_aura_on()) + { + // Skip check if we don't have aura + return true; + } + + bool success = true; + stk::mesh::Selector active_locally_owned = aux_meta().active_locally_owned_selector(); + stk::mesh::BucketVector const& buckets = stk_bulk().get_buckets(stk::topology::ELEMENT_RANK, active_locally_owned); + + std::vector side_nodes; + + for (auto&& bucket : buckets) + { + const stk::topology topology = bucket->topology(); + const unsigned num_sides = topology.num_sides(); + for (auto&& elem : *bucket) + { + auto elem_nodes = stk_bulk().begin(elem, stk::topology::NODE_RANK); + for (unsigned s=0; s elems; + stk::mesh::get_entities_through_relations(stk_bulk(), side_nodes, stk::topology::ELEMENT_RANK, elems); + for(auto && touching_elem : elems) krinolog << debug_entity(stk_bulk(), touching_elem) << stk::diag::dendl; + + success = false; + } + } + } + } + + return success; +} + +std::vector get_conformal_volume_part_ordinals(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, stk::mesh::Entity entity) +{ + std::vector conformalVolumeParts; + + for(auto && part : mesh.bucket(entity).supersets()) + { + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK) + { + if (phaseSupport.is_conformal(part)) + { + conformalVolumeParts.push_back(part->mesh_meta_data_ordinal()); + } + } + } + + return conformalVolumeParts; +} + +bool have_multiple_conformal_volume_parts_in_common(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, const std::vector & sideNodes) +{ + const int numSideNodes = sideNodes.size(); + ThrowRequire(numSideNodes > 0); + + std::vector commonConformalVolumeParts = get_conformal_volume_part_ordinals(mesh, phaseSupport, sideNodes[0]); + + for (int n=1; n nodeConformalVolumeParts = get_conformal_volume_part_ordinals(mesh, phaseSupport, sideNodes[n]); + + std::vector workingSet; + workingSet.swap(commonConformalVolumeParts); + std::set_intersection(workingSet.begin(),workingSet.end(),nodeConformalVolumeParts.begin(),nodeConformalVolumeParts.end(),std::back_inserter(commonConformalVolumeParts)); + + if (commonConformalVolumeParts.empty()) + return false; + } + return true; +} + +void +CDMesh::add_possible_interface_sides(std::vector & sideRequests) const +{ + // This will add sides that *might be* interface sides. + // Because this probes the nodes, it will add "keyhole" sides that aren't actually on an interface + // This should be harmless, however, and avoids extra communication or requiring aura. + + stk::mesh::Selector active_locally_owned = aux_meta().active_locally_owned_selector(); + stk::mesh::BucketVector const& buckets = stk_bulk().get_buckets(stk::topology::ELEMENT_RANK, active_locally_owned); + + std::vector sideNodes; + + for (auto&& bucket : buckets) + { + const stk::topology topology = bucket->topology(); + const unsigned num_sides = topology.num_sides(); + for (auto&& elem : *bucket) + { + auto elem_nodes = stk_bulk().begin(elem, stk::topology::NODE_RANK); + for (unsigned s=0; s & side_nodes) const +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::check_element_side_parts(const std::vector & side_nodes)"); /* %TRACE% */ + + // This method requires aura. + ThrowRequire(stk_bulk().is_automatic_aura_on()); + + std::vector elems; + stk::mesh::get_entities_through_relations(stk_bulk(), side_nodes, stk::topology::ELEMENT_RANK, elems); + + std::vector conformal_volume_parts; + for (auto&& elem : elems) + { + if (!stk_bulk().bucket(elem).member(get_active_part())) + { + continue; + } + auto& elem_parts = stk_bulk().bucket(elem).supersets(); + for(auto&& part : elem_parts) + { + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK && my_phase_support.is_conformal(part)) + { + if (std::find(conformal_volume_parts.begin(), conformal_volume_parts.end(), part) == conformal_volume_parts.end()) + { + conformal_volume_parts.push_back(part); + } + } + } + } + + if (conformal_volume_parts.empty()) + { + return true; + } + + if (conformal_volume_parts.size() > 2) + { + krinolog << "Expected to find 1 or 2 conformal side parts when examining side nodes: "; + for (auto&& side_node : side_nodes) krinolog << stk_bulk().identifier(side_node) << " "; + krinolog << " but instead found the parts: "; + for (auto&& part : conformal_volume_parts) krinolog << part->name() << " "; + krinolog << stk::diag::dendl; + return false; + } + + std::vector side_phases(conformal_volume_parts.size()); + for (unsigned iphase = 0; iphase sides; + stk::mesh::get_entities_through_relations(stk_bulk(), side_nodes, stk_meta().side_rank(), sides); + + if (conformal_volume_parts.size() == 2 && side_phases[0] != side_phases[1]) + { + stk::mesh::PartVector conformal_side_parts; + const stk::mesh::Part * conformal_side_part = my_phase_support.find_interface_part(*conformal_volume_parts[0], *conformal_volume_parts[1]); + if (nullptr != conformal_side_part) conformal_side_parts.push_back(const_cast(conformal_side_part)); + conformal_side_part = my_phase_support.find_interface_part(*conformal_volume_parts[1], *conformal_volume_parts[0]); + if (nullptr != conformal_side_part) conformal_side_parts.push_back(const_cast(conformal_side_part)); + + if (!conformal_side_parts.empty()) + { + // Check that side exists and has conformal side parts + if (sides.size() != 1) + { + krinolog << "Expected to find 1 conformal side, but instead found " << sides.size() << " when examining side nodes: "; + for (auto&& side_node : side_nodes) krinolog << stk_bulk().identifier(side_node) << " "; + krinolog << " with conformal volume parts: "; + for (auto&& part : conformal_volume_parts) krinolog << part->name() << " "; + krinolog << stk::diag::dendl; + return false; + } + else + { + auto& side_bucket = stk_bulk().bucket(sides[0]); + if (!side_bucket.member_all(conformal_side_parts)) + { + krinolog << "Side " << stk_bulk().identifier(sides[0]) << " is missing at least one of the conformal side parts: "; + for (auto&& part : conformal_side_parts) krinolog << part->name() << " "; + krinolog << ", actual parts: "; + auto& side_parts = side_bucket.supersets(); + for (auto&& part : side_parts) krinolog << part->name() << " "; + krinolog << stk::diag::dendl; + return false; + } + } + } + } + else + { + // Check that if the side exists, then it does not have any interface sides + if (sides.size() > 1) + { + krinolog << "Expected to find 0 or 1 side, but instead found " << sides.size() << " when examining side nodes: "; + for (auto&& side_node : side_nodes) krinolog << stk_bulk().identifier(side_node) << " "; + krinolog << " with conformal volume parts: "; + for (auto&& part : conformal_volume_parts) krinolog << part->name() << " "; + krinolog << stk::diag::dendl; + return false; + } + + const stk::mesh::PartVector & existing_side_parts = stk_bulk().bucket(sides[0]).supersets(); + for(auto && sidePart : existing_side_parts) + { + if(sidePart->primary_entity_rank() == stk_meta().side_rank() && my_phase_support.is_interface(sidePart)) + { + krinolog << "Side " << stk_bulk().identifier(sides[0]) << " has an erroneous interface part " << sidePart->name() << "." << stk::diag::dendl; + return false; + } + } + } + + return true; +} + +void +CDMesh::update_element_side_parts() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::update_element_side_parts()"); /* %TRACE% */ + + // This method makes sure the correct conformal side parts are on the element sides + stk::mesh::Selector locally_owned = get_locally_owned_part(); + + std::vector< stk::mesh::Entity> sides; + stk::mesh::get_selected_entities( locally_owned, stk_bulk().buckets( stk_bulk().mesh_meta_data().side_rank() ), sides ); + + stk::mesh::PartVector add_parts; + stk::mesh::PartVector remove_parts; + + for (auto && side : sides) + { + determine_element_side_parts(side, add_parts, remove_parts); + stk_bulk().change_entity_parts(side, add_parts, remove_parts); + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "After changes: " << debug_entity(stk_bulk(), side); + } + } +} + +void +CDMesh::determine_element_side_parts(const stk::mesh::Entity side, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const +{ + if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Analyzing side " << stk_bulk().identifier(side) << " with nodes "; + const unsigned num_side_nodes = stk_bulk().num_nodes(side); + stk::mesh::Entity const* side_nodes = stk_bulk().begin_nodes(side); + for (unsigned n=0; n volume_parts; + std::vector conformal_volume_parts; + std::vector nonconformal_volume_parts; + const stk::mesh::PartVector & existing_side_parts = stk_bulk().bucket(side).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = existing_side_parts.begin(); part_iter != existing_side_parts.end(); ++part_iter) + { + const stk::mesh::Part * const side_part = *part_iter; + if (side_part->primary_entity_rank() == stk::topology::ELEMENT_RANK) + { + if (my_phase_support.is_conformal(side_part)) + { + conformal_volume_parts.push_back(side_part); + } + if (my_phase_support.is_nonconformal(side_part)) + { + nonconformal_volume_parts.push_back(side_part); + } + else if (stk::io::is_part_io_part(*side_part)) + { + volume_parts.push_back(side_part); + } + } + } + + ThrowRequire(volume_parts.size() <= 2); // Can be zero for inactive elements supporting a face + + if (conformal_volume_parts.empty()) + { + /* There are two possible cases where no conformal volume parts are found: + * 1) This side is part of a surface that does not touch any blocks that are being decomposed. + * Only the active parts for these sides should be updated. + * 2) This side is a parent side that should be deactivated and moved to the nonconformal part. + * These sides will have at least 1 nonconformal volume part from the parent volume element. + */ + if(nonconformal_volume_parts.empty()) + { + if(element_side_should_be_active(side)) + { + add_parts.push_back(&aux_meta().active_part()); + } + else + { + remove_parts.push_back(&aux_meta().active_part()); + } + } + else + { + determine_nonconformal_parts(side, add_parts, remove_parts); + } + } + + if (volume_parts.size() == 2) + { + add_parts.push_back(&get_block_boundary_part()); + } + else + { + remove_parts.push_back(&get_block_boundary_part()); + } + + if (conformal_volume_parts.empty()) + { + return; + } + + ThrowRequire(conformal_volume_parts.size() == 1 || conformal_volume_parts.size() == 2); + + std::vector side_phases(conformal_volume_parts.size()); + for (unsigned iphase = 0; iphase(my_phase_support.find_interface_part(*conformal_volume_parts[0], *conformal_volume_parts[1])); + if (nullptr != conformal_side0) add_parts.push_back(conformal_side0); + stk::mesh::Part * conformal_side1 = const_cast(my_phase_support.find_interface_part(*conformal_volume_parts[1], *conformal_volume_parts[0])); + if (nullptr != conformal_side1) add_parts.push_back(conformal_side1); + } + + for (auto && side_phase : side_phases) + { + determine_conformal_parts(existing_side_parts, stk_meta().side_rank(), side_phase, add_parts, remove_parts); + } + + if(element_side_should_be_active(side)) + { + add_parts.push_back(&aux_meta().active_part()); + } + else + { + remove_parts.push_back(&aux_meta().active_part()); + } +} + +bool +CDMesh::element_side_should_be_active(const stk::mesh::Entity side) const +{ + auto num_elems = stk_bulk().num_connectivity(side, stk::topology::ELEMENT_RANK); + const auto * touching_elems = stk_bulk().begin(side, stk::topology::ELEMENT_RANK); + auto & active_part = aux_meta().active_part(); + bool active = false; + for(unsigned i=0; i < num_elems; ++i) + { + if(stk_bulk().bucket(touching_elems[i]).member(active_part)) + { + active = true; + break; + } + } + return active; +} +void +CDMesh::handle_single_coincident_subelement(const Mesh_Element & elem, const SubElement * subelem, std::vector & side_requests) +{ + stk::mesh::Entity elem_entity = elem.entity(); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "single coincident subelement for elem #" << stk_bulk().identifier(elem_entity) << " with phase " << subelem->get_phase() << stk::diag::dendl; + subelem->set_entity( stk_bulk(), elem_entity ); + stk::mesh::PartVector add_parts; + stk::mesh::PartVector remove_parts; + determine_conformal_parts(elem_entity, subelem->get_phase(), add_parts, remove_parts); + + add_parts.push_back(&get_active_part()); + remove_parts.push_back(&get_parent_part()); + + stk_bulk().change_entity_parts(elem_entity, add_parts, remove_parts); + + std::vector subelem_vec(1, subelem); + attach_existing_and_identify_missing_subelement_sides(elem, subelem_vec, side_requests); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::generate_sorted_child_elements() +{ + child_elements.clear(); + + for (const auto & elem : elements) + { + if (elem->have_subelements()) + { + std::vector conformal_subelems; + elem->get_subelements(conformal_subelems); + + for (auto && subelem : conformal_subelems) + { + child_elements.push_back(subelem); + } + } + } + + std::sort(child_elements.begin(),child_elements.end(), ElementObj::is_less); +} + +//-------------------------------------------------------------------------------- + +const SubElement * +CDMesh::find_child_element(stk::mesh::Entity elem_mesh_obj) const +{ + // Ugh + CDMesh *const mesh = const_cast(this); + + if (child_elements.empty()) + { + mesh->generate_sorted_child_elements(); + } + + const stk::mesh::EntityId elem_id = stk_bulk().identifier(elem_mesh_obj); + auto lb_cmp = [](const ElementObj * elem, stk::mesh::EntityId target_id) { return elem->entityId() < target_id; }; + auto first = std::lower_bound(child_elements.begin(),child_elements.end(), elem_id, lb_cmp); + + if (first != child_elements.end() && (*first)->entityId() == elem_id) + { + return dynamic_cast(*first); + } + return nullptr; +} + +//-------------------------------------------------------------------------------- + +stk::mesh::Entity +CDMesh::get_parent_element(stk::mesh::Entity elem_entity) const +{ + std::set parent_elem_node_set; + + const stk::mesh::Entity * elem_nodes = stk_bulk().begin_nodes(elem_entity); + const unsigned num_base_elem_nodes = stk_bulk().bucket(elem_entity).topology().base().num_nodes(); + + for (unsigned inode=0; inode parent_elem_nodes(parent_elem_node_set.begin(), parent_elem_node_set.end()); + std::vector parent_elems; + stk::mesh::get_entities_through_relations(stk_bulk(), parent_elem_nodes, stk::topology::ELEMENT_RANK, parent_elems); + + ThrowAssert(parent_elems.size() <= 1); + + if (parent_elems.empty()) + { + krinolog << "Did not find parent element for element \n" << debug_entity(stk_bulk(), elem_entity) << stk::diag::dendl; + return stk::mesh::Entity(); + } + else + { + return parent_elems.front(); + } +} + +//-------------------------------------------------------------------------------- + +bool +CDMesh::get_parent_child_coord_transformation(stk::mesh::Entity elem_mesh_obj, double * dParentdChild) const +{ + ThrowAssert(my_cdfem_support.use_nonconformal_element_size()); + + const SubElement * subelem = find_child_element(elem_mesh_obj); + + if (nullptr == subelem) + { + krinolog << "did not find element " << stk_bulk().identifier(elem_mesh_obj) << stk::diag::dendl; + return false; + } + + subelem->get_owner_coord_transform(dParentdChild); + return true; +} + +void +CDMesh::get_parent_nodes_and_weights(stk::mesh::Entity child, stk::mesh::Entity & parent0, stk::mesh::Entity & parent1, double & position) const +{ + // Really slow! + auto id = stk_bulk().identifier(child); + auto find_existing = std::find_if(nodes.begin(), nodes.end(), + [id](const std::unique_ptr & compare) + { return compare->entityId() == id; }); + ThrowAssert(find_existing != nodes.end()); + ThrowAssert(dynamic_cast(find_existing->get()) != nullptr); + const krino::SubElementEdgeNode& edge_node = dynamic_cast(*find_existing->get()); + krino::NodeVec edge_node_parents = edge_node.get_parents(); + position = edge_node.get_position(); + parent0 = edge_node_parents[0]->entity(); + parent1 = edge_node_parents[1]->entity(); +} + +//-------------------------------------------------------------------------------- + +std::function build_get_element_volume_function(const CDMesh & cdmesh) +{ + auto get_element_size = + [&cdmesh](stk::mesh::Entity elem) + { + stk::mesh::Entity volumeElement = cdmesh.get_cdfem_support().use_nonconformal_element_size() ? cdmesh.get_parent_element(elem) : elem; + ThrowRequire(cdmesh.stk_bulk().is_valid(volumeElement)); + const double elemVolume = ElementObj::volume( cdmesh.stk_bulk(), volumeElement, cdmesh.get_coords_field() ); + return elemVolume; + }; + return get_element_size; +} + +Vector3d get_side_average_cdfem_displacement(const stk::mesh::BulkData& mesh, + const FieldRef cdfemDisplacementsField, + stk::mesh::Entity side) +{ + const int spatialDim = mesh.mesh_meta_data().spatial_dimension(); + + Vector3d avg{Vector3d::ZERO}; + int numNodes = 0; + for (auto node : StkMeshEntities{mesh.begin_nodes(side), mesh.end_nodes(side)}) + { + double * cdfemDispPtr = field_data(cdfemDisplacementsField, node); + if(nullptr != cdfemDispPtr) + { + const Vector3d cdfemDisp(cdfemDispPtr, spatialDim); + avg += cdfemDisp; + ++numNodes; + } + } + if (numNodes > 0) + avg /= numNodes; + + return avg; +} + +Vector3d get_side_normal(const stk::mesh::BulkData& mesh, + const FieldRef coordsField, + stk::mesh::Entity side) +{ + const auto * sideNodes = mesh.begin_nodes(side); + const stk::topology sideTopology = mesh.bucket(side).topology(); + if (sideTopology == stk::topology::TRIANGLE_3 || sideTopology == stk::topology::TRIANGLE_6) + { + const Vector3d v0(field_data(coordsField, sideNodes[0])); + const Vector3d v1(field_data(coordsField, sideNodes[1])); + const Vector3d v2(field_data(coordsField, sideNodes[2])); + return Cross(v1-v0,v2-v0).unit_vector(); + } + else if (sideTopology == stk::topology::LINE_2 || sideTopology == stk::topology::LINE_3) + { + const Vector3d v0(field_data(coordsField, sideNodes[0]), 2); + const Vector3d v1(field_data(coordsField, sideNodes[1]), 2); + return crossZ(v1-v0).unit_vector(); + } + ThrowRequireMsg(false, "Unsupported topology " << sideTopology); + + return Vector3d::ZERO; +} + +double get_side_cdfem_cfl(const stk::mesh::BulkData& mesh, + const FieldRef cdfemDisplacementsField, + const FieldRef coordsField, + const stk::mesh::Selector & elementSelector, + const std::function & get_element_volume, + stk::mesh::Entity side) +{ + const Vector3d sideCDFEMDisplacement = get_side_average_cdfem_displacement(mesh, cdfemDisplacementsField, side); + const Vector3d sideNormal = get_side_normal(mesh, coordsField, side); + const double sideNormalDisplacement = Dot(sideCDFEMDisplacement, sideNormal); + + double minElemVolume = 0.; + for (auto elem : StkMeshEntities{mesh.begin_elements(side), mesh.end_elements(side)}) + { + if (elementSelector(mesh.bucket(elem))) + { + const double elemVol = get_element_volume(elem); + if (minElemVolume == 0. || elemVol < minElemVolume) + minElemVolume = elemVol; + } + } + double sideCFL = 0.; + if (minElemVolume > 0.) + { + const double invDim = 1.0 / mesh.mesh_meta_data().spatial_dimension(); + const double lengthScale = std::pow(minElemVolume, invDim); + sideCFL = sideNormalDisplacement / lengthScale; + } + return sideCFL; +} + +double CDMesh::compute_cdfem_cfl() const +{ + stk::diag::TimeBlock timer__(my_timer_compute_CFL); + + const stk::mesh::Selector interfaceSideSelector = my_phase_support.get_all_conformal_surfaces_selector(); + const stk::mesh::Selector elementSelector = selectUnion(my_phase_support.get_conformal_parts()) & get_active_part() & get_locally_owned_part(); + + auto get_element_volume = build_get_element_volume_function(*this); + + double cfl = 0.; + for( auto&& bucket : stk_bulk().get_buckets(stk_bulk().mesh_meta_data().side_rank(), interfaceSideSelector) ) + { + for (auto && side : *bucket) + { + const double sideCFL = get_side_cdfem_cfl(stk_bulk(), get_cdfem_displacements_field(), get_coords_field(), elementSelector, get_element_volume, side); + if (sideCFL > 0.) + cfl = std::max(cfl, sideCFL); + } + } + + const double localCFL = cfl; + stk::all_reduce_max(stk_bulk().parallel(), &localCFL, &cfl, 1); + + return cfl; +} + + +void +CDMesh::update_adaptivity_parent_entities() +{ + if (my_cdfem_support.get_interface_maximum_refinement_level() <= 0) + { + return; + } + + stk::mesh::BulkData& stk_mesh = stk_bulk(); + + stk::mesh::Part & refine_inactive_part = get_refinement_inactive_part(stk_meta(), stk::topology::ELEMENT_RANK); + stk::mesh::Selector adaptive_parent_locally_owned_selector = get_locally_owned_part() & refine_inactive_part; + + stk::mesh::PartVector add_parts; + stk::mesh::PartVector remove_parts; + + std::vector parents; + stk::mesh::get_selected_entities( adaptive_parent_locally_owned_selector, stk_mesh.buckets( stk::topology::ELEMENT_RANK ), parents ); + + for( auto&& parent : parents ) + { + std::vector leaf_children; + get_refinement_leaf_children(stk_mesh, parent, leaf_children); + std::set child_element_parts; + for (auto&& child : leaf_children) + { + const stk::mesh::Part & child_element_part = find_element_part(stk_mesh, child); + child_element_parts.insert(&child_element_part); + } + ThrowRequire(!child_element_parts.empty()); + + if (child_element_parts.size() > 1 || my_phase_support.is_nonconformal(*child_element_parts.begin())) + { + determine_nonconformal_parts(parent, add_parts, remove_parts); + const auto& add_it = std::find(add_parts.begin(), add_parts.end(), &get_parent_part()); + if (add_it != add_parts.end()) + { + add_parts.erase(add_it); + } + } + else if (child_element_parts.size() == 1 && !my_phase_support.is_nonconformal(*child_element_parts.begin())) + { + const PhaseTag & parent_phase = my_phase_support.get_iopart_phase(**child_element_parts.begin()); + determine_conformal_parts(parent, parent_phase, add_parts, remove_parts); + remove_parts.push_back(&get_parent_part()); + remove_parts.push_back(&get_child_part()); + } + stk_mesh.change_entity_parts(parent, add_parts, remove_parts); + } +} + +void +CDMesh::update_uncut_element(const Mesh_Element & elem) +{ + const stk::mesh::Entity elem_entity = elem.entity(); + stk::mesh::BulkData & stk_mesh = stk_bulk(); + if (stk_mesh.bucket(elem_entity).member(get_parent_part()) || elem_io_part_changed(elem)) + { + stk::mesh::PartVector add_parts; + stk::mesh::PartVector remove_parts; + determine_conformal_parts(elem_entity, elem.get_phase(), add_parts, remove_parts); + add_parts.push_back(&get_active_part()); + remove_parts.push_back(&get_parent_part()); + remove_parts.push_back(&get_child_part()); + + stk_mesh.change_entity_parts(elem_entity, add_parts, remove_parts); + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::create_node_entities() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::create_node_entities(void)"); /* %TRACE% */ + stk::mesh::BulkData& stk_mesh = stk_bulk(); + + std::vector node_parents; + std::vector node_requests; + std::vector higher_order_node_requests; + for (auto && node : nodes) + { + stk::mesh::Entity & node_entity = node->entity(); + if (!stk_bulk().is_valid(node_entity)) + { + node->get_parent_entities(node_parents); + if (nullptr == dynamic_cast(node.get())) + node_requests.push_back(ChildNodeRequest(node_parents, &node_entity)); + else + higher_order_node_requests.push_back(ChildNodeRequest(node_parents, &node_entity)); + } + } + + stk::mesh::PartVector node_parts = {&aux_meta().active_part(), + &get_child_edge_node_part(), + &stk_meta().get_topology_root_part(stk::topology::NODE) + }; + batch_create_child_nodes(stk_mesh, node_requests, node_parts, my_aux_meta.get_assert_32bit_flag(), my_aux_meta.get_force_64bit_flag()); + + stk::mesh::PartVector higher_order_node_parts = {&aux_meta().active_part(), + &stk_meta().get_topology_root_part(stk::topology::NODE) + }; + batch_create_child_nodes(stk_mesh, higher_order_node_requests, higher_order_node_parts, my_aux_meta.get_assert_32bit_flag(), my_aux_meta.get_force_64bit_flag()); + + for (auto && node_request : node_requests) + { + stk::mesh::Entity new_node = *node_request.child; + if (stk_mesh.bucket(new_node).member(stk_meta().locally_owned_part())) + { + if (get_parent_node_ids_field().valid()) + { + if (node_request.parents.size() != 2) + krinolog << "Created Steiner node that cannot be restored on restart: " << stk_mesh.identifier(new_node) << " " << node_request.parents.size() << stk::diag::dendl; + store_edge_node_parent_ids(stk_bulk(), get_parent_node_ids_field(), new_node, stk_bulk().identifier(*node_request.parents.front()), stk_bulk().identifier(*node_request.parents.back())); + } + } + } + + // Since batch_create_child_nodes took pointers to the entities, the entityIds were not updated, Ugh. + for (auto&& node : nodes) + { + node->set_entityId_from_entity(stk_mesh); + if(krinolog.shouldPrint(LOG_DEBUG)) + { + if (!node->is_mesh_node()) + krinolog << "NODE ID : " << node->entityId() << ": ancestry: [" << node->get_ancestry() << "]" << stk::diag::dendl; + } + } +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::create_element_and_side_entities(std::vector & side_requests) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::create_element_and_side_entities(void)"); /* %TRACE% */ + + // Count how many we need to set pool size + unsigned num_local_subelems = 0; + for (auto && elem : elements) + { + if (elem->have_subelements()) + { + std::vector conformal_subelems; + elem->get_subelements(conformal_subelems); + num_local_subelems += conformal_subelems.size(); + } + } + + my_entity_id_pool.reserve(stk::topology::ELEMENT_RANK, num_local_subelems, my_aux_meta.get_assert_32bit_flag(), my_aux_meta.get_force_64bit_flag()); + + stk::mesh::PartVector add_parts; + stk::mesh::PartVector remove_parts; + + for (const auto & elem : elements) + { + if (elem->have_subelements()) + { + std::vector conformal_subelems; + elem->get_subelements(conformal_subelems); + + // check for corner case of a single subelement that is coincident with parent + if (elem->is_single_coincident()) + { + handle_single_coincident_subelement(*elem, conformal_subelems[0], side_requests); + } + else + { + create_subelement_mesh_entities(*elem, conformal_subelems); + attach_existing_and_identify_missing_subelement_sides(*elem, conformal_subelems, side_requests); + + determine_nonconformal_parts(elem->entity(), add_parts, remove_parts); + stk_bulk().change_entity_parts(elem->entity(), add_parts, remove_parts); + } + } + else + { + update_uncut_element(*elem); + } + } + + update_adaptivity_parent_entities(); +} + +//-------------------------------------------------------------------------------- + +void +CDMesh::prolongation() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::prolongation(void)"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer_prolongation); + + BoundingBox proc_target_bbox; + for (auto && node : nodes) + { + proc_target_bbox.accommodate(node->coordinates()); + } + if(nodes.empty()) + { + proc_target_bbox.accommodate(Vector3d::ZERO); + } + + const bool guess_and_check_proc_padding = + my_old_mesh->stash_step_count() >= 0 && + stk_bulk().parallel_size() > 1; + double proc_padding = 0.0; + if (guess_and_check_proc_padding) + { + const double max_elem_size = compute_maximum_element_size(stk_bulk()); + proc_padding = 3.0*max_elem_size; + proc_target_bbox.pad(proc_padding); + } + else + { + proc_target_bbox.pad_epsilon(); + } + + bool done = false; + while (!done) + { + done = true; + + std::vector proc_target_bboxes; + BoundingBox::gather_bboxes( proc_target_bbox, proc_target_bboxes ); + + const size_t facet_precomm_size = my_old_mesh->my_prolong_facets.size(); + ProlongationFacet::communicate(*my_old_mesh, my_old_mesh->my_prolong_facets, my_old_mesh->my_prolong_node_map, proc_target_bboxes); + + my_old_mesh->build_prolongation_trees(); + + my_old_mesh->communicate_prolongation_facet_fields(); + + const stk::mesh::Part & active_part = get_active_part(); + + // update nodal fields + my_missing_remote_prolong_facets = false; + for (auto && node : nodes) + { + if(!(node->is_prolonged()) && stk_bulk().bucket(node->entity()).member(active_part)) + { + node->prolongate_fields(*this); + } + } + + const double max_cdfem_displacement = get_maximum_cdfem_displacement(); + if (guess_and_check_proc_padding && (my_missing_remote_prolong_facets || max_cdfem_displacement > proc_padding)) + { + const double growth_multiplier = 1.5; + krinolog << "Must redo ghosting for prolongation. New size = " << growth_multiplier*max_cdfem_displacement <<"\n"; + proc_target_bbox.pad(growth_multiplier*max_cdfem_displacement-proc_padding); + proc_padding = growth_multiplier*max_cdfem_displacement; + done = false; + + for (size_t i = facet_precomm_size; i < my_old_mesh->my_prolong_facets.size(); i++ ) + delete my_old_mesh->my_prolong_facets[i]; + my_old_mesh->my_prolong_facets.resize(facet_precomm_size); + + for (auto && node : nodes) + { + node->set_prolonged_flag(false); + } + } + } + + rebase_cdfem_displacements(); + + // prolongate element fields + for (const auto & elem : elements) + { + if (elem->have_subelements()) + { + std::vector conformal_subelems; + elem->get_subelements(conformal_subelems); + + for (auto && subelem : conformal_subelems) + { + subelem->prolongate_fields(*this); + } + } + else + { + elem->prolongate_fields(*this); + } + } + + // We might want to check what causes any parallel discrepencies, but sync everything here + const stk::mesh::FieldVector & all_fields = stk_bulk().mesh_meta_data().get_fields(); + const std::vector const_fields(all_fields.begin(), all_fields.end()); + for (auto && f : all_fields) + { + f->sync_to_host(); + f->modify_on_host(); + } + stk::mesh::communicate_field_data(stk_bulk(), const_fields); +} + +void +CDMesh::rebase_cdfem_displacements() +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::rebase_cdfem_displacements(void)"); /* %TRACE% */ + // rebase cdfem mesh displacements such that STATE_OLD is zero + const FieldRef cdfem_displacements_field = get_cdfem_displacements_field(); + if (cdfem_displacements_field.valid()) + { + const unsigned field_length = cdfem_displacements_field.length(); + std::vector stk_fields(cdfem_displacements_field.number_of_states()); + for ( unsigned is = 0 ; is < cdfem_displacements_field.number_of_states(); ++is ) + { + const stk::mesh::FieldState state = static_cast(is); + stk_fields[is] = cdfem_displacements_field.field_state(state); + } + + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities( stk::mesh::selectField(cdfem_displacements_field), stk_bulk().buckets( stk::topology::NODE_RANK ), objs ); + + std::vector old_displacement(field_length); + + const unsigned len = objs.size(); + for ( unsigned iObj(0); iObj < len; ++iObj ) + { + stk::mesh::Entity node = objs[iObj]; + + const double * old_data = field_data( stk_fields[stk::mesh::StateOld], node); + ThrowRequire(nullptr != old_data); + for (unsigned d=0; d( stk_fields[is], node); + ThrowRequire(nullptr != displacement); + for (unsigned d=0; d(cdfem_displacements_field, *b); + ThrowAssert(nullptr != cdfem_displacements); + + const unsigned field_length = cdfem_displacements_field.length(*b); + + const int num_nodes = b->size(); + for(int n=0; nprimary_entity_rank() == stk::topology::ELEMENT_RANK) + { + volume_conformal_parts.push_back(conformal_part); + } + else if (my_phase_support.is_interface(conformal_part)) + { + interfacial_conformal_parts.push_back(conformal_part); + } + } + + print_volume_or_surface_area(stk_bulk(), stk::topology::ELEMENT_RANK, get_active_part(), volume_conformal_parts); + print_volume_or_surface_area(stk_bulk(), stk_meta().side_rank(), get_active_part(), interfacial_conformal_parts); +} + +void +CDMesh::debug_output() const +{ + for (const auto & elem : elements) + debug_elem_parts_and_relations(stk_bulk(), *elem); + krinolog << stk::diag::dendl; + + for (auto && node : nodes) + debug_nodal_parts_and_fields(stk_bulk(), node.get()); + krinolog << stk::diag::dendl; + + debug_sides(stk_bulk(), get_active_part()); +} + +const Mesh_Element * CDMesh::find_mesh_element(stk::mesh::EntityId elemId, const std::vector> & searchElements) +{ + auto lb_cmp = [](const std::unique_ptr & elem, stk::mesh::EntityId target_id) { return elem->entityId() < target_id; }; + auto first = std::lower_bound(searchElements.begin(),searchElements.end(), elemId, lb_cmp); + + if (first != searchElements.end() && (*first)->entityId() == elemId) + { + return (*first).get(); + } + + return nullptr; +} + +} // namespace krino + + diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh.hpp b/packages/krino/krino/krino_lib/Akri_CDMesh.hpp new file mode 100644 index 000000000000..39155fa144c0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh.hpp @@ -0,0 +1,333 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_CDMesh_h +#define Akri_CDMesh_h + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +template +class CompleteDecompositionFixture; +class SubElement; +class ElementObj; +class Mesh_Element; +class SubElementNode; +class SubElementMeshNode; +class ProlongationNodeData; +class ProlongationPointData; +class ProlongationElementData; +class ProlongationFacet; +class InterpolationEdge; +class LevelSet; +class Phase_Support; +class AuxMetaData; +struct SideRequest; +class InterfaceGeometry; + +typedef std::vector< const SubElementNode * > NodeVec; +typedef std::set< const SubElementNode * > NodeSet; +typedef std::vector< const ProlongationFacet * > ProlongFacetVec; +typedef std::unordered_map EntityProlongationNodeMap; +typedef std::unordered_map EntityProlongationElementMap; + +enum CDMeshStatus +{ + MESH_MODIFIED = 1, + COORDINATES_MAY_BE_MODIFIED = 2 +}; + +class CDMesh { +public: + + CDMesh( stk::mesh::BulkData & mesh, const std::shared_ptr & old_mesh); + + virtual ~CDMesh(); + + static void check_isovariable_field_existence_on_decomposed_blocks(stk::mesh::BulkData & mesh, + const bool conformal_parts_require_field); + static bool decomposition_needs_update(const InterfaceGeometry & interfaceGeometry, + const std::vector> & periodic_node_pairs); + static void handle_possible_failed_time_step( stk::mesh::BulkData & mesh, const int step_count ); + static int decompose_mesh( stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const int step_count, + const std::vector> & periodic_node_pairs ); + static void nonconformal_adaptivity(stk::mesh::BulkData & mesh, const InterfaceGeometry & interfaceGeometry); + static void mark_interface_elements_for_adaptivity(stk::mesh::BulkData & mesh, const InterfaceGeometry & interfaceGeometry, const std::string & marker_field_name, const int num_refinements); + void delete_cdfem_parent_elements(); + static void fixup_adapted_element_parts(stk::mesh::BulkData & mesh); + static void rebuild_from_restart_mesh(stk::mesh::BulkData & mesh); + void rebuild_after_rebalance(); + + CDMesh* get_old_mesh() { return my_old_mesh.get(); } + const CDMesh* get_old_mesh() const { return my_old_mesh.get(); } + static CDMesh* get_new_mesh() { return the_new_mesh.get(); } + + static void update_cdfem_constrained_nodes(); + void snap_and_update_fields_and_captured_domains(const InterfaceGeometry & interfaceGeometry, + NodeToCapturedDomainsMap & nodesToCapturedDomains) const; + + void communicate_prolongation_facet_fields() const; + const ProlongationPointData * find_prolongation_node(const SubElementNode & node) const; + const SubElementNode * find_node_with_common_ancestry(const SubElementNode * new_node) const; + + bool is_interface(const PhaseTag & phase, const InterfaceID interface) const; + PhaseTag determine_entity_phase(stk::mesh::Entity obj) const; + + void check_isovariable_field_existence_on_decomposed_blocks(const bool conformal_parts_require_field) const; + + std::vector get_nonconformal_elements() const; + void generate_nonconformal_elements(); + + bool triangulate(const InterfaceGeometry & interfaceGeometry); //return value indicates if any changes were made + void decompose(); + void cut_sharp_features(); + void snap_nearby_intersections_to_nodes(const InterfaceGeometry & interfaceGeometry, NodeToCapturedDomainsMap & domainsAtNodes); + void set_phase_of_uncut_elements(const InterfaceGeometry & interfaceGeometry); + + int spatial_dim() const { return my_spatial_dim; } + + const Phase_Support & get_phase_support() const { return my_phase_support; } + const CDFEM_Support & get_cdfem_support() const { return my_cdfem_support; } + CDFEM_Support & get_cdfem_support() { return my_cdfem_support; } + bool need_nodes_for_prolongation() const { return INTERPOLATION != get_prolongation_model() && my_stash_step_count >= 0; } + bool need_facets_for_prolongation() const { return ALE_NEAREST_POINT == get_prolongation_model() && my_stash_step_count >= 0; } + Prolongation_Model get_prolongation_model() const { return my_cdfem_support.get_prolongation_model(); } + Edge_Interpolation_Model get_edge_interpolation_model() const { return my_cdfem_support.get_edge_interpolation_model(); } + int num_ls_fields() const { return my_cdfem_support.num_ls_fields(); } + int get_ls_index(const LevelSet * ls) const { return my_cdfem_support.get_ls_index(ls); } + const LS_Field & ls_field(int i) const { return my_cdfem_support.ls_field(i); } + const std::vector & ls_fields() const { return my_cdfem_support.ls_fields(); } + const std::vector & all_interface_ids() const; + std::vector active_interface_ids() const; + // This should really only be used for unit test purposes. + void add_interface_id(const InterfaceID id) { crossing_keys.push_back(id); } + + const FieldRef get_coords_field() const { return my_cdfem_support.get_coords_field(); } + const FieldRef get_cdfem_displacements_field() const { return my_cdfem_support.get_cdfem_displacements_field(); } + const FieldSet & get_ale_prolongation_fields() const { return my_cdfem_support.get_ale_prolongation_fields(); } + const FieldSet & get_interpolation_fields() const { return my_cdfem_support.get_interpolation_fields(); } + const FieldSet & get_zeroed_fields() const { return my_cdfem_support.get_zeroed_fields(); } + const FieldSet & get_element_fields() const { return my_cdfem_support.get_element_fields(); } + const CDFEM_Snapper & get_snapper() const { return my_cdfem_support.get_snapper(); } + + const CDFEM_Inequality_Spec * get_death_spec(int ls_index) const { return my_cdfem_support.get_death_spec(ls_index); } + + stk::mesh::Part & get_parent_part() const { return my_cdfem_support.get_parent_part(); } + stk::mesh::Part & get_child_part() const { return my_cdfem_support.get_child_part(); } + stk::mesh::Part & get_internal_side_part() const { return my_cdfem_support.get_internal_side_part(); } + stk::mesh::Part & get_active_part() const; + stk::mesh::Part & get_locally_owned_part() const; + stk::mesh::Part & get_globally_shared_part() const; + stk::mesh::Part & get_block_boundary_part() const; + + // methods for finding or creating subelement nodes + const SubElementNode * create_mesh_node( const Mesh_Element * owner, + const int lnn, + stk::mesh::Entity nodeEntity ); + const SubElementNode * create_steiner_node( const Mesh_Element * owner, + const NodeVec & parents, + const std::vector & weights ); + const SubElementNode * create_child_internal_or_face_node( const Mesh_Element * owner, + const NodeVec & parents, + const std::vector & weights ); + const SubElementNode * create_edge_node( const Mesh_Element * owner, + const SubElementNode * parent1, const SubElementNode * parent2, + const double position); + const SubElementNode * create_midside_node( const Mesh_Element * owner, + const SubElementNode * parent1, const SubElementNode * parent2, stk::mesh::Entity entity = stk::mesh::Entity()); + void create_node_obj( const SubElementNode * node, NodeVec & parents ); + + void determine_node_signs(const InterfaceID & interface); + void decompose_edges(const InterfaceID & interface); + void determine_node_scores(const InterfaceID & interface); + + const AuxMetaData& aux_meta() const { return my_aux_meta; } + AuxMetaData& aux_meta() { return my_aux_meta; } + const stk::mesh::MetaData& stk_meta() const { return my_meta; } + stk::mesh::MetaData& stk_meta() { return my_meta; } + const stk::mesh::BulkData& stk_bulk() const { return my_meta.mesh_bulk_data(); } + stk::mesh::BulkData& stk_bulk() { return my_meta.mesh_bulk_data(); } + + void add_periodic_node_pair(stk::mesh::Entity node1, stk::mesh::Entity node2); + + // just search for existing mesh node and return NULL if not found + const SubElementMeshNode * get_mesh_node( stk::mesh::EntityId node_id ) const; + // just search for existing mesh node and return NULL if not found, starting with subelement node (possibly from another mesh) + const SubElementMeshNode * get_mesh_node(const SubElementNode * new_node) const; + + bool check_element_side_parts() const; + + const SubElement * find_child_element(stk::mesh::Entity elem_mesh_obj) const; + static const Mesh_Element * find_mesh_element(stk::mesh::EntityId elemId, const std::vector > & searchElements); + const Mesh_Element * find_mesh_element(stk::mesh::EntityId elemId) const { return find_mesh_element(elemId, elements); } + Mesh_Element * find_mesh_element(stk::mesh::EntityId elemId) { return const_cast(find_mesh_element(elemId, elements)); } // Scott Meyers says this is the right way + bool get_parent_child_coord_transformation(stk::mesh::Entity elem_mesh_obj, double * dParentdChild) const; + void get_parent_nodes_and_weights(stk::mesh::Entity child, stk::mesh::Entity & parent0, stk::mesh::Entity & parent1, double & position) const; + stk::mesh::Entity get_parent_element(stk::mesh::Entity elem_mesh_obj) const; + + double compute_cdfem_cfl() const; + + int stash_step_count() const { return my_stash_step_count; } + const ProlongationNodeData * fetch_prolong_node(stk::mesh::EntityId node_id) const { EntityProlongationNodeMap::const_iterator it = my_prolong_node_map.find(node_id); return ( (it == my_prolong_node_map.end()) ? NULL : (it->second) ); } + const ProlongationElementData * fetch_prolong_element(stk::mesh::EntityId elem_id) const { EntityProlongationElementMap::const_iterator it = my_prolong_element_map.find(elem_id); return ( (it == my_prolong_element_map.end()) ? NULL : (it->second) ); } + + void debug_output() const; + void print_conformal_volumes_and_surface_areas() const; + std::vector> & get_elements() { return elements; } + const std::vector> & get_elements() const { return elements; } + + // FIXME: Make these private. + SubElementNode * add_managed_node(std::unique_ptr node); + // expose vector of nodes + std::vector > nodes; + // expose vector of elements + std::vector > elements; + // expose vector of sorted child elements + std::vector child_elements; + +private: + //: Default constructor not allowed + CDMesh(); + + template + friend class CompleteDecompositionFixture; + + template + friend class AnalyticDecompositionFixture; + + void build_parallel_hanging_edge_nodes(); + void handle_hanging_children(const InterfaceID & interface); + void parallel_sync_nodes_on_interface(); + + void sync_node_signs_on_constrained_nodes(); + void parallel_sync_node_signs_on_shared_nodes(); + void sync_node_scores_on_constrained_nodes(); + void parallel_sync_node_scores_on_shared_nodes(); + + bool decomposition_has_changed(const InterfaceGeometry & interfaceGeometry); + bool elem_io_part_changed(const ElementObj & elem) const; + void determine_nonconformal_parts(stk::mesh::Entity entity, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const; + void determine_conformal_parts(stk::mesh::Entity entity, const PhaseTag & phase, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const; + void determine_conformal_parts(const stk::mesh::PartVector & current_parts, const stk::mesh::EntityRank entity_rank, const PhaseTag & phase, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const; + void determine_child_conformal_parts(stk::topology topology, const stk::mesh::PartVector & parent_parts, const PhaseTag & phase, stk::mesh::PartVector & child_parts) const; + void determine_element_side_parts(const stk::mesh::Entity side, stk::mesh::PartVector & add_parts, stk::mesh::PartVector & remove_parts) const; + bool element_side_should_be_active(const stk::mesh::Entity side) const; + void build_and_stash_old_mesh(const int stepCount); + void stash_field_data(const int step_count, const CDMesh & new_mesh) const; + void stash_nodal_field_data(const CDMesh & new_mesh) const; + void stash_elemental_field_data() const; + + void clear_prolongation_trees() const; + void build_prolongation_trees() const; + + void clear(); + void clear_prolongation_data() const; + + Mesh_Element * create_mesh_element(stk::mesh::Entity mesh_obj); + SubElementMeshNode * add_managed_mesh_node( std::unique_ptr node ); + + bool modify_mesh(); + void update_adaptivity_parent_entities(); + void handle_single_coincident_subelement(const Mesh_Element & elem, const SubElement * subelem, std::vector & side_requests); + void create_subelement_mesh_entities(const Mesh_Element & elem, + const std::vector conformal_subelems); + void attach_existing_and_identify_missing_subelement_sides(const Mesh_Element & elem, + const std::vector conformal_subelems, + std::vector & side_requests); + void update_uncut_element(const Mesh_Element & elem); + + void get_unused_old_child_elements(std::vector & unused_old_child_elems); + void set_entities_for_identical_nodes(); + bool set_entities_for_existing_child_elements(); + void create_new_mesh_entities(); + void create_node_entities(); + void create_element_and_side_entities(std::vector & side_requests); + + void prolongation(); + void rebase_cdfem_displacements(); + double get_maximum_cdfem_displacement() const; + + void add_possible_interface_sides(std::vector & sideRequests) const; + bool check_element_side_parts(const std::vector & side_nodes) const; + void update_element_side_parts(); + + void parallel_communicate_elemental_death_fields() const; + + void generate_sorted_child_elements(); + void cache_node_ids(); + + stk::mesh::Part & get_child_edge_node_part() const { return my_cdfem_support.get_child_edge_node_part(); } + FieldRef get_parent_node_ids_field() const { return my_cdfem_support.get_parent_node_ids_field(); } + + void rebuild_child_part(); + void rebuild_parent_and_active_parts_using_nonconformal_and_child_parts(); + void restore_subelement_edge_nodes(); + void restore_subelements(); + const SubElementNode * build_subelement_edge_node(const stk::mesh::Entity node_entity); + + stk::mesh::MetaData& my_meta; + AuxMetaData& my_aux_meta; + EntityIdPool my_entity_id_pool; + + const int my_spatial_dim; + CDFEM_Support & my_cdfem_support; + Phase_Support & my_phase_support; + typedef std::unordered_map NodeMap; + NodeMap mesh_node_map; + + std::shared_ptr my_old_mesh; + static std::shared_ptr the_new_mesh; + + std::unordered_map > my_periodic_node_id_map; + + mutable int my_stash_step_count; + mutable std::map,std::unique_ptr>> my_phase_prolong_tree_map; + + mutable bool my_missing_remote_prolong_facets; + mutable EntityProlongationNodeMap my_prolong_node_map; + mutable EntityProlongationElementMap my_prolong_element_map; + mutable ProlongFacetVec my_prolong_facets; + + mutable std::vector crossing_keys; + + mutable stk::diag::Timer my_timer_decompose; + mutable stk::diag::Timer my_timer_decomposition_has_changed; + mutable stk::diag::Timer my_timer_snap; + mutable stk::diag::Timer my_timer_stash_field_data; + mutable stk::diag::Timer my_timer_modify_mesh; + mutable stk::diag::Timer my_timer_prolongation; + mutable stk::diag::Timer my_timer_compute_CFL; + stk::mesh::PartVector my_attribute_parts; + + mutable std::map,const SubElementNode*> my_midside_node_map; +}; + +} // namespace krino + +#endif // Akri_CDMesh_h diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh_Debug.cpp b/packages/krino/krino/krino_lib/Akri_CDMesh_Debug.cpp new file mode 100644 index 000000000000..eccd3249c341 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh_Debug.cpp @@ -0,0 +1,229 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +namespace krino { + +void +debug_elem_parts_and_relations(const stk::mesh::BulkData & mesh, const Mesh_Element & elem) +{ + const stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::mesh::Entity elem_obj = elem.entity(); + + krinolog << "Elem: id=" << mesh.identifier(elem_obj) << "\n"; + krinolog << " Mesh parts="; + for(auto && elem_part : mesh.bucket(elem_obj).supersets()) + { + krinolog << "\"" << elem_part->name() << "\"" << " "; + } + krinolog << "\n"; + + krinolog << " Nodes: "; + for (auto && elem_node : elem.get_nodes()) + { + krinolog << elem_node->entityId() << " "; + } + krinolog << "\n"; + + const stk::topology topology = elem.coord_topology(); + std::vector side_nodes; + for (unsigned s = 0; s < topology.num_sides(); ++s) + { + stk::mesh::Entity side_obj = find_entity_by_ordinal(mesh, elem_obj, meta.side_rank(), s); + if (!mesh.is_valid(side_obj)) continue; + krinolog << " Elem side: side=" << s << ", id=" << mesh.identifier(side_obj); + krinolog << ", side node ids: "; + const stk::topology side_topology = topology.side_topology(s); + const stk::mesh::Entity * elem_nodes_ptr = mesh.begin_nodes(elem_obj); + side_nodes.resize(side_topology.num_nodes()); + topology.side_nodes(elem_nodes_ptr, s, side_nodes.begin()); + for (unsigned n=0; nname() << "\"" << " "; + } + krinolog << "\n"; + } + + if (elem.have_subelements()) + { + std::vector conformal_subelems; + elem.get_subelements(conformal_subelems); + + for (auto && subelem : conformal_subelems) + { + stk::mesh::Entity subelem_obj = subelem->entity(); + if (!mesh.is_valid(subelem_obj)) + { + // single conformal subelement + if (1 == conformal_subelems.size()) + { + subelem_obj = elem.entity(); + } + if (!mesh.is_valid(subelem_obj)) + { + // For debugging intermediate stage before subelement mesh objects are determined. + krinolog << " Subelem: id=-1" << "\n"; + continue; + } + } + + krinolog << " Subelem: id=" << mesh.identifier(subelem_obj) << "\n"; + krinolog << " Mesh parts="; + for(auto && subelem_part : mesh.bucket(subelem_obj).supersets()) + { + krinolog << "\"" << subelem_part->name() << "\"" << " "; + } + krinolog << "\n"; + + krinolog << " SubElemNodes: "; + for (auto && sub_node : subelem->get_nodes()) + { + krinolog << sub_node->entityId() << " "; + } + krinolog << "\n"; + + for (unsigned s = 0; s < topology.num_sides(); ++s) + { + stk::mesh::Entity side_obj = find_entity_by_ordinal(mesh, subelem_obj, meta.side_rank(), s); + if (!mesh.is_valid(side_obj)) continue; + krinolog << " Subelem side: side=" << s << ", id=" << mesh.identifier(side_obj); + krinolog << ", side node ids: "; + const stk::topology side_topology = topology.side_topology(s); + const stk::mesh::Entity * elem_nodes_ptr = mesh.begin_nodes(subelem_obj); + side_nodes.resize(side_topology.num_nodes()); + topology.side_nodes(elem_nodes_ptr, s, side_nodes.begin()); + for (unsigned n=0; nname() << "\"" << " "; + } + krinolog << "\n"; + } + } + } +} + +void +debug_nodal_parts_and_fields(const stk::mesh::BulkData & mesh, const SubElementNode * node) +{ + stk::mesh::Entity node_obj = node->entity(); + if (!mesh.is_valid(node_obj)) + { + krinolog << "Node: identifier=nullptr\n"; + return; + } + + std::string type = "UNKNOWN"; + if (nullptr != dynamic_cast(node)) type = "internal"; + if (nullptr != dynamic_cast(node)) type = "edge"; + if (nullptr != dynamic_cast(node)) type = "mesh"; + + krinolog << "Node: identifier=" << mesh.identifier(node_obj) << ", type=" << type << "\n"; + if (mesh.mesh_meta_data().spatial_dimension() == 2) + { + krinolog << " coords =" << "(" << node->coordinates()[0] << ", " << node->coordinates()[1] << ")" << "\n"; + } + else if (mesh.mesh_meta_data().spatial_dimension() == 3) + { + krinolog << " coords =" << "(" << node->coordinates()[0] << ", " << node->coordinates()[1] << ", " << node->coordinates()[2] << ")" << "\n"; + } + krinolog << " Mesh parts="; + for(auto && node_part : mesh.bucket(node_obj).supersets()) + { + krinolog << "\"" << node_part->name() << "\"" << " "; + } + krinolog << "\n"; + + for ( auto && stk_field : mesh.mesh_meta_data().get_fields() ) + { + const FieldRef field(stk_field); + + if( field.entity_rank()!=stk::topology::NODE_RANK || !field.type_is() ) continue; + + const unsigned field_length = field.length(); + + double * data = field_data(field, node_obj); + if (nullptr == data) + { + krinolog << " Field: field_name=" << field.name() << ", field_state=" << field.state() << " -> NOT DEFINED." << "\n"; + } + else + { + if (1 == field_length) + { + krinolog << " Field: field_name=" << field.name() << ", field_state=" << field.state() << ", value=" << *data << "\n"; + } + else + { + for (unsigned i=0; i objs; + stk::mesh::get_entities( mesh, mesh.mesh_meta_data().side_rank(), objs ); + + const unsigned len = objs.size(); + for ( unsigned iObj(0); iObj < len; ++iObj ) { + + stk::mesh::Entity side = objs[iObj]; + + krinolog << "side, id=" << mesh.identifier(side) << ", active = " << mesh.bucket(side).member(active_part) << ", num elem = " << mesh.num_elements(side) << ", ioparts="; + const stk::mesh::PartVector & side_parts = mesh.bucket(side).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = side_parts.begin(); part_iter != side_parts.end(); ++part_iter) + { + const stk::mesh::Part * const part = *part_iter; + if (stk::io::is_part_io_part(*part)) krinolog << part->name() << " "; + } + krinolog << "\n"; + const unsigned num_side_elems = mesh.num_elements(side); + const stk::mesh::Entity* side_elems = mesh.begin_elements(side); + for (unsigned side_elem_index=0; side_elem_index +#include + +namespace krino { + void debug_elem_parts_and_relations(const stk::mesh::BulkData & mesh, const Mesh_Element & elem); + void debug_nodal_parts_and_fields(const stk::mesh::BulkData & mesh, const SubElementNode * node); + void debug_sides(const stk::mesh::BulkData & mesh, stk::mesh::Part & active_part); +} + +#endif /* KRINO_INCLUDE_AKRI_CDMESH_DEBUG_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.cpp b/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.cpp new file mode 100644 index 000000000000..840750152089 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.cpp @@ -0,0 +1,367 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" +namespace krino { + +namespace { + void set_refine_if_not_reached_max_refine(stk::mesh::Entity elem, + const int interface_max_refine_level, + FieldRef elem_marker, + FieldRef refine_level_field, + FieldRef transition_element_field) + { + int & marker = *field_data(elem_marker, elem); + const int refine_level = *field_data(refine_level_field, elem); + const int transition_element = *field_data(transition_element_field, elem); + + if (refine_level >= transition_element+interface_max_refine_level ) + { + marker = Refinement_Marker::NOTHING; + } + else + { + marker = Refinement_Marker::REFINE; + } + } +} + +static bool node_is_snapped_to_interface(stk::mesh::Entity node, + const InterfaceID & interface, + const std::unordered_map> & nodesSnappedInterfaces) +{ + auto nodeSnappedInterfaces = nodesSnappedInterfaces.find(node); + const bool nodeIsSnapped = nodeSnappedInterfaces != nodesSnappedInterfaces.end() && + nodeSnappedInterfaces->second.find(interface) != nodeSnappedInterfaces->second.end(); + return nodeIsSnapped; +} + +void +refine_edges_with_multiple_unsnapped_crossings(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + const int interface_max_refine_level, + FieldRef elem_marker_field, + FieldRef refine_level_field, + FieldRef transition_element_field, + const std::unordered_map> & nodesSnappedInterfaces) +{ + // Refine any edge with multiple crossings that are not snapped to the nodes + std::set> edgesWithUnsnappedCrossings; + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + + const InterfaceID & interface = edge.interface; + const bool node1IsSnapped = node_is_snapped_to_interface(edge.nodes[0], interface, nodesSnappedInterfaces); + const bool node2IsSnapped = node_is_snapped_to_interface(edge.nodes[1], interface, nodesSnappedInterfaces); + if (!node1IsSnapped && !node2IsSnapped) + { + const auto insertion = edgesWithUnsnappedCrossings.insert(edge.nodes); + const bool alreadyInSet = !insertion.second; + if (alreadyInSet) + { + std::vector edge_elems; + stk::mesh::get_entities_through_relations(mesh, {edge.nodes[0], edge.nodes[1]}, + stk::topology::ELEMENT_RANK, edge_elems); + for (auto && elem : edge_elems) + { + set_refine_if_not_reached_max_refine(elem, interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field); + } + } + } + } +} + +void +refine_edges_with_nodes_with_multiple_snapped_interfaces(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + const int interface_max_refine_level, + FieldRef elem_marker_field, + FieldRef refine_level_field, + FieldRef transition_element_field, + const std::unordered_map> & node_snapped_interfaces) +{ + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + + auto node1_snapped_interfaces = node_snapped_interfaces.find(edge.nodes[0]); + auto node2_snapped_interfaces = node_snapped_interfaces.find(edge.nodes[1]); + const unsigned num_node1_interfaces = (node1_snapped_interfaces != node_snapped_interfaces.end()) ? + node1_snapped_interfaces->second.size() : 0; + const unsigned num_node2_interfaces = (node2_snapped_interfaces != node_snapped_interfaces.end()) ? + node2_snapped_interfaces->second.size() : 0; + if (num_node1_interfaces > 1 || num_node2_interfaces > 1) + { + std::vector edge_elems; + stk::mesh::get_entities_through_relations(mesh, {edge.nodes[0], edge.nodes[1]}, + stk::topology::ELEMENT_RANK, edge_elems); + for (auto && elem : edge_elems) + { + set_refine_if_not_reached_max_refine(elem, interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field); + } + } + } +} + +void +determine_which_interfaces_snap_to_each_node_and_unsnappable_nodes(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + const std::vector & active_interface_ids, + const CDFEM_Snapper & snapper, + FieldRef node_marker_field, + std::unordered_map> & node_snapped_interfaces, + std::set & unsnappable_nodes) +{ + for (auto && interface : active_interface_ids) + { + stk::mesh::field_fill(0, node_marker_field); + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + + int & node1_marker = *field_data(node_marker_field, edge.nodes[0]); + int & node2_marker = *field_data(node_marker_field, edge.nodes[1]); + if (snapper.snap_lo(edge.crossingLocation)) + { + if (parts_are_compatible_for_snapping(mesh, edge.nodes[0], edge.nodes[1])) + node1_marker = 2; + else + node1_marker = std::max(node1_marker, 1); + } + if (snapper.snap_hi(edge.crossingLocation)) + { + if (parts_are_compatible_for_snapping(mesh, edge.nodes[1], edge.nodes[0])) + node2_marker = 2; + else + node2_marker = std::max(node2_marker, 1); + } + } + stk::mesh::parallel_max(mesh, {&node_marker_field.field()}); + + for(const auto & b_ptr : mesh.buckets( stk::topology::NODE_RANK )) + { + stk::mesh::Bucket & b = *b_ptr; + int * node_marker = field_data(node_marker_field, b); + for(unsigned i=0; i < b.size(); ++i) + { + if (node_marker[i] == 1) + { + unsnappable_nodes.insert(b[i]); + } + else if (node_marker[i] == 2) + { + node_snapped_interfaces[b[i]].insert(interface); + } + } + } + } +} + +void +resolve_fine_features(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + const std::vector & active_interface_ids, + const CDFEM_Snapper & snapper, + const int interface_max_refine_level, + FieldRef elem_marker_field, + FieldRef node_marker_field, + FieldRef refine_level_field, + FieldRef transition_element_field) +{ + std::unordered_map> node_snapped_interfaces; + std::set unsnappable_nodes; + + determine_which_interfaces_snap_to_each_node_and_unsnappable_nodes(mesh, edgeIntersections, active_interface_ids, snapper, node_marker_field, node_snapped_interfaces, unsnappable_nodes); + + // Attempt at minimally aggressive. Works pretty well and has has lower element counts. + refine_edges_with_multiple_unsnapped_crossings(mesh, edgeIntersections, interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field, node_snapped_interfaces); + //refine_edges_with_unsnappable_nodes(interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field, unsnappable_nodes); + refine_edges_with_nodes_with_multiple_snapped_interfaces(mesh, edgeIntersections, interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field, node_snapped_interfaces); +} + +void +mark_nearest_node_on_cut_edges(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + FieldRef node_marker_field) +{ + const double overlap = 0.25; + + stk::mesh::field_fill(0, node_marker_field); + + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + + if (edge.crossingLocation < 0.5+overlap) + *field_data(node_marker_field, edge.nodes[0]) = 1; + if (edge.crossingLocation > 0.5-overlap) + *field_data(node_marker_field, edge.nodes[1]) = 1; + } + stk::mesh::parallel_max(mesh, {&node_marker_field.field()}); +} + +void +mark_interface_elements_for_adaptivity(const stk::mesh::BulkData& mesh, + const InterfaceGeometry & interfaceGeometry, + const std::vector & active_interface_ids, + const CDFEM_Snapper & snapper, + const AuxMetaData& aux_meta, + const CDFEM_Support & cdfem_support, + const FieldRef coords_field, + const std::string & marker_field_name, + const int num_refinements) +{ +/* %TRACE[SPEC]% */ Tracespec trace__("CDMesh::mark_interface_elements_for_adaptivity(const std::string & marker_field_name, const int num_refinements)"); /* %TRACE% */ + + // This refinement strategy cuts elements by the user-specified number of adapt levels + // before the conformal decomposition. + + const FieldRef elem_marker = aux_meta.get_field(stk::topology::ELEMENT_RANK, marker_field_name, stk::mesh::StateNew); + const FieldRef refine_level_field = aux_meta.get_field(stk::topology::ELEMENT_RANK, "refine_level"); + const std::string transition_field_name = (mesh.mesh_meta_data().spatial_dimension() == 2) ? + "transition_element" : "transition_element_3"; + const FieldRef transition_element_field = aux_meta.get_field(stk::topology::ELEMENT_RANK, transition_field_name); + + const stk::mesh::Selector active_selector(cdfem_support.get_active_part()); + const stk::mesh::Selector locally_owned_selector(cdfem_support.get_locally_owned_part()); + const stk::mesh::Selector parent_or_child_selector = cdfem_support.get_child_part() | cdfem_support.get_parent_part(); + const int interface_min_refine_level = cdfem_support.get_interface_minimum_refinement_level(); + std::vector entities; + std::vector children; + + const NodeToCapturedDomainsMap nodesToCapturedDomains; + const std::vector edgeIntersections = interfaceGeometry.get_edge_intersection_points(mesh, nodesToCapturedDomains); + + FieldRef node_marker_field = aux_meta.get_field(stk::topology::NODE_RANK, marker_field_name, stk::mesh::StateNew); + mark_nearest_node_on_cut_edges(mesh, edgeIntersections, node_marker_field); + + std::vector min_edge_lengths(cdfem_support.get_interface_maximum_refinement_level()+1, std::numeric_limits::max()); + std::vector max_edge_lengths(cdfem_support.get_interface_maximum_refinement_level()+1, 0.0); + + const std::vector debugElementIds{}; + + stk::mesh::get_selected_entities( locally_owned_selector, mesh.buckets( stk::topology::ELEMENT_RANK ), entities ); + for( auto&& elem : entities ) + { + int & marker = *field_data(elem_marker, elem); + + bool has_crossing = false; + const stk::topology stk_topology = mesh.bucket(elem).topology(); + const unsigned num_nodes = stk_topology.num_nodes(); + const stk::mesh::Entity * const elem_nodes = mesh.begin(elem, stk::topology::NODE_RANK); + for(unsigned i=0; i < num_nodes; ++i) + { + const int node_marker = *field_data(node_marker_field, elem_nodes[i]); + if(node_marker) + { + has_crossing = true; + break; + } + } + + const int target_refine_level = has_crossing ? interface_min_refine_level : 0; + const int refine_level = *field_data(refine_level_field, elem); + const int transition_element = *field_data(transition_element_field, elem); + + if (!transition_element) + { + std::vector edge_nodes; + for (unsigned i = 0; i < stk_topology.num_edges(); ++i) + { + edge_nodes.resize(stk_topology.edge_topology(i).num_nodes()); + stk_topology.edge_nodes(elem_nodes, i, edge_nodes.data()); + + const Vector3d edge_node1_coords(field_data(coords_field, edge_nodes[0]), mesh.mesh_meta_data().spatial_dimension()); + const Vector3d edge_node2_coords(field_data(coords_field, edge_nodes[1]), mesh.mesh_meta_data().spatial_dimension()); + const double length = (edge_node2_coords-edge_node1_coords).length(); + + min_edge_lengths[refine_level] = std::min(min_edge_lengths[refine_level], length); + max_edge_lengths[refine_level] = std::max(max_edge_lengths[refine_level], length); + } + } + + if (!debugElementIds.empty() && std::find(debugElementIds.begin(), debugElementIds.end(), mesh.identifier(elem)) != debugElementIds.end()) + krinolog << "Considering refinement of element " << mesh.identifier(elem) << " " << has_crossing << " " << target_refine_level << " " << refine_level << " " << transition_element << stk::diag::dendl; + + if (refine_level < target_refine_level+transition_element) + { + marker = Refinement_Marker::REFINE; + } + else if (num_refinements < interface_min_refine_level && + refine_level > target_refine_level+transition_element) + { + // Stop coarsening after num_levels of refinement to avoid infinite looping + // from the interface position moving between elements because of snapping changes + // with refinement + marker = Refinement_Marker::COARSEN; + } + else + { + marker = Refinement_Marker::NOTHING; + } + } + + { + for (int i=0; i interface_min_refine_level) + { + resolve_fine_features(mesh, edgeIntersections, active_interface_ids, snapper, interface_max_refine_level, elem_marker, node_marker_field, refine_level_field, transition_element_field); + } +} + +void +refine_edges_with_unsnappable_nodes(const stk::mesh::BulkData& mesh, + const std::vector & edgeIntersections, + const CDFEM_Snapper & snapper, + const int interface_max_refine_level, + FieldRef elem_marker_field, + FieldRef refine_level_field, + FieldRef transition_element_field, + std::set unsnappable_nodes) +{ + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + + if ((snapper.snap_lo(edge.crossingLocation) && unsnappable_nodes.find(edge.nodes[0]) != unsnappable_nodes.end()) || + (snapper.snap_hi(edge.crossingLocation) && unsnappable_nodes.find(edge.nodes[1]) != unsnappable_nodes.end())) + { + krinolog << "Refining unsnappable edge " << mesh.identifier(edge.nodes[0]) << " " << mesh.identifier(edge.nodes[1]) << " " << debug_output(mesh, edgeIntersection) << stk::diag::dendl; + std::vector edge_elems; + stk::mesh::get_entities_through_relations(mesh, {edge.nodes[0], edge.nodes[1]}, + stk::topology::ELEMENT_RANK, edge_elems); + for (auto && elem : edge_elems) + { + set_refine_if_not_reached_max_refine(elem, interface_max_refine_level, elem_marker_field, refine_level_field, transition_element_field); + } + } + } +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.hpp b/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.hpp new file mode 100644 index 000000000000..0f7725594ad9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh_Refinement.hpp @@ -0,0 +1,31 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_CDMESH_REFINEMENT_H_ +#define KRINO_INCLUDE_AKRI_CDMESH_REFINEMENT_H_ +#include +#include +#include +#include + +namespace krino { + +void +mark_interface_elements_for_adaptivity(const stk::mesh::BulkData& mesh, + const InterfaceGeometry & interfaceGeometry, + const std::vector & active_interface_ids, + const CDFEM_Snapper & snapper, + const AuxMetaData& aux_meta, + const CDFEM_Support & cdfem_support, + const FieldRef coords_field, + const std::string & marker_field_name, + const int num_refinements); + +} + +#endif /* KRINO_INCLUDE_AKRI_CDMESH_REFINEMENT_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.cpp b/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.cpp new file mode 100644 index 000000000000..717cf7a0f255 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.cpp @@ -0,0 +1,143 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +namespace krino { + +bool +parts_are_compatible_for_snapping(const stk::mesh::BulkData & mesh, stk::mesh::Entity possible_snap_node, stk::mesh::Entity fixed_node) +{ + const stk::mesh::PartVector & possible_snap_node_parts = mesh.bucket(possible_snap_node).supersets(); + const stk::mesh::PartVector & fixed_node_parts = mesh.bucket(fixed_node).supersets(); + for (auto && possible_snap_node_part : possible_snap_node_parts) + { + if ((possible_snap_node_part->primary_entity_rank() == stk::topology::ELEMENT_RANK || + possible_snap_node_part->primary_entity_rank() == mesh.mesh_meta_data().side_rank()) && + !stk::mesh::is_auto_declared_part(*possible_snap_node_part) && + possible_snap_node_part->name().compare(0,7,"refine_") != 0 && + !stk::mesh::contain(fixed_node_parts, *possible_snap_node_part)) + { + return false; + } + } + return true; +} + +static stk::mesh::Part * get_nonconformal_part(const Phase_Support & phaseSupport, stk::mesh::Part * part) +{ + return const_cast(phaseSupport.find_nonconformal_part(*part)); +} + +static bool is_part_to_check(const Phase_Support & phaseSupport, const AuxMetaData & auxMeta, const stk::mesh::Part & part) +{ + const stk::mesh::Part & exposedBoundaryPart = auxMeta.exposed_boundary_part(); + return part.primary_entity_rank() != stk::topology::INVALID_RANK && + (&part == &exposedBoundaryPart || stk::io::is_part_io_part(part)) && + part.name().compare(0,7,"refine_") != 0 && + !phaseSupport.is_interface(&part); +} + +static stk::mesh::PartVector get_nonconformal_parts_to_check(const AuxMetaData & auxMeta, const Phase_Support & phaseSupport, const stk::mesh::PartVector & inputParts) +{ + stk::mesh::PartVector partsToCheck; + partsToCheck.reserve(inputParts.size()); + for (auto && part : inputParts) + if (is_part_to_check(phaseSupport, auxMeta, *part)) + partsToCheck.push_back(get_nonconformal_part(phaseSupport, part)); + stk::util::sort_and_unique(partsToCheck, stk::mesh::PartLess()); + return partsToCheck; +} + +bool +parts_are_compatible_for_snapping_when_ignoring_phase(const stk::mesh::BulkData & mesh, const AuxMetaData & auxMeta, const Phase_Support & phaseSupport, stk::mesh::Entity possibleSnapNode, stk::mesh::Entity fixedNode) +{ + const stk::mesh::PartVector & possibleSnapNodeParts = mesh.bucket(possibleSnapNode).supersets(); + const stk::mesh::PartVector nonconformalPartsToCheck = get_nonconformal_parts_to_check(auxMeta, phaseSupport, mesh.bucket(fixedNode).supersets()); + for (auto && possibleSnapNodePart : possibleSnapNodeParts) + { + if (is_part_to_check(phaseSupport, auxMeta, *possibleSnapNodePart)) + { + stk::mesh::Part * nonconformalPart = get_nonconformal_part(phaseSupport, possibleSnapNodePart); + if (!stk::mesh::contain(nonconformalPartsToCheck, *nonconformalPart)) + return false; + } + } + return true; +} + +bool phase_matches_interface(const CDFEM_Support & cdfemSupport, const PhaseTag & phase, const InterfaceID interface) +{ + if(cdfemSupport.num_ls_fields() > 1 && Phase_Support::has_one_levelset_per_phase()) + { + return (phase.contain(cdfemSupport.ls_field(interface.first_ls()).identifier, -1) && + phase.contain(cdfemSupport.ls_field(interface.second_ls()).identifier, -1)); + } + return (phase.contain(cdfemSupport.ls_field(interface.first_ls()).identifier, -1) && + phase.contain(cdfemSupport.ls_field(interface.first_ls()).identifier, +1)); +} + +bool determine_phase_from_parts(PhaseTag & phase, const stk::mesh::PartVector & parts, const Phase_Support & phaseSupport) +{ + ThrowAssert(phase.empty()); + bool has_conformal_ioparts = false; + + for (auto && part : parts) + { + if (part->primary_entity_rank() != stk::topology::ELEMENT_RANK || // limit ourselves to phase-specific volumes + !(stk::io::is_part_io_part(*part) || + phaseSupport.is_nonconformal(part))) + continue; + + const PhaseTag & iopart_phase = phaseSupport.get_iopart_phase(*part); + + if (!iopart_phase.empty()) + has_conformal_ioparts = true; + + phase.add(iopart_phase); + } + + return (has_conformal_ioparts); +} + +PhaseTag determine_phase_for_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const Phase_Support & phaseSupport) +{ + PhaseTag phase; + const stk::mesh::PartVector & parts = mesh.bucket(entity).supersets(); + determine_phase_from_parts(phase, parts, phaseSupport); + return phase; +} + +bool node_is_on_interface(const stk::mesh::BulkData & mesh, const CDFEM_Support & cdfemSupport, const Phase_Support & phaseSupport, stk::mesh::Entity node, const InterfaceID & interface) +{ + const PhaseTag nodePhase = determine_phase_for_entity(mesh, node, phaseSupport); + return phase_matches_interface(cdfemSupport, nodePhase, interface); +} + +bool nodes_are_on_any_interface(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, const stk::mesh::Bucket & nodeBucket) +{ + auto side_rank = mesh.mesh_meta_data().side_rank(); + for(auto && part : nodeBucket.supersets()) + if(part->primary_entity_rank() == side_rank && stk::io::is_part_io_part(*part) && phaseSupport.is_interface(part)) + return true; + return false; +} + +bool node_is_on_any_interface(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, const stk::mesh::Entity node) +{ + return nodes_are_on_any_interface(mesh, phaseSupport, mesh.bucket(node)); +} + +} + + diff --git a/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.hpp b/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.hpp new file mode 100644 index 000000000000..a3007222587b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_CDMesh_Utils.hpp @@ -0,0 +1,34 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_CDMESH_UTILS_H_ +#define KRINO_INCLUDE_AKRI_CDMESH_UTILS_H_ +#include + +namespace krino { + +class CDFEM_Support; +class PhaseTag; +class InterfaceID; +class AuxMetaData; +class Phase_Support; + +bool parts_are_compatible_for_snapping(const stk::mesh::BulkData & mesh, stk::mesh::Entity possible_snap_node, stk::mesh::Entity fixed_node); +bool parts_are_compatible_for_snapping_when_ignoring_phase(const stk::mesh::BulkData & mesh, const AuxMetaData & auxMeta, const Phase_Support & phaseSupport, stk::mesh::Entity possible_snap_node, stk::mesh::Entity fixed_node); +bool phase_matches_interface(const CDFEM_Support & cdfemSupport, const PhaseTag & phase, const InterfaceID interface); +bool determine_phase_from_parts(PhaseTag & phase, const stk::mesh::PartVector & parts, const Phase_Support & phaseSupport); +PhaseTag determine_phase_for_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const Phase_Support & phaseSupport); +bool nodes_are_on_any_interface(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, const stk::mesh::Bucket & nodeBucket); +bool node_is_on_any_interface(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, const stk::mesh::Entity node); +bool node_is_on_interface(const stk::mesh::BulkData & mesh, const CDFEM_Support & cdfemSupport, const Phase_Support & phaseSupport, stk::mesh::Entity node, const InterfaceID & interface); + +} + + + +#endif /* KRINO_INCLUDE_AKRI_CDMESH_UTILS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_Composite_Surface.cpp b/packages/krino/krino/krino_lib/Akri_Composite_Surface.cpp new file mode 100644 index 000000000000..941580cc6e98 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Composite_Surface.cpp @@ -0,0 +1,108 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +namespace krino{ + +Composite_Surface::Composite_Surface(const std::string & sn) + : SurfaceThatTakesAdvantageOfNarrowBandAndThereforeMightHaveWrongSign(), + my_name(sn), + my_composition_method(MINIMUM_SIGNED_DISTANCE) {} + +Composite_Surface::~Composite_Surface() {} + +void +Composite_Surface::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) +{ /* %TRACE[ON]% */ Trace trace__("krino::Composite_Surface::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length)"); /* %TRACE% */ + + for ( auto&& surface : my_subsurfaces ) + { + surface->prepare_to_compute(time, point_bbox, truncation_length); + } + + if (truncation_length > 0.) + { + BoundingBox padded_point_bbox = point_bbox; + padded_point_bbox.pad(truncation_length); + + SurfaceAutoVec nearby_surfaces; + for ( auto&& surface : my_subsurfaces ) + { + // keep nearby or moving surfaces + if (FACETED_SURFACE == surface->type() || + nullptr != surface->get_transformation() || + point_bbox.intersects(surface->get_bounding_box())) + { + nearby_surfaces.emplace_back(std::move(surface)); + } + } + nearby_surfaces.swap(my_subsurfaces); + } + + int subsurfaces_might_produce_wrong_sign = false; + for ( auto&& surface : my_subsurfaces ) + { + if (surface->truncated_distance_may_have_wrong_sign()) + { + subsurfaces_might_produce_wrong_sign = true; + break; + } + } + int local_subsurfaces_might_produce_wrong_sign = subsurfaces_might_produce_wrong_sign; + stk::all_reduce_max(stk::EnvData::parallel_comm(), &local_subsurfaces_might_produce_wrong_sign, &subsurfaces_might_produce_wrong_sign, 1); + my_subsurfaces_might_produce_wrong_sign = subsurfaces_might_produce_wrong_sign; +} + +double +Composite_Surface::truncated_point_signed_distance(const Vector3d &x, const double narrow_band, const double far_field_value) const +{ /* %TRACE% */ /* %TRACE% */ + + if (my_composition_method == MINIMUM_SIGNED_DISTANCE) + { + ThrowRequireMsg(far_field_value >= narrow_band, "Composite surfaces have a specific requirement for far_field_value due to min/max operations."); + double dist = (narrow_band == 0.) ? std::numeric_limits::max() : far_field_value; + for ( auto&& surface : my_subsurfaces ) + { + dist = std::min(dist, surface->truncated_point_signed_distance(x, narrow_band, far_field_value)); + } + return dist; + } + else + { + ThrowRequire(my_composition_method == MAXIMUM_SIGNED_DISTANCE); + ThrowRequireMsg(far_field_value <= -narrow_band, "Composite surfaces have a specific requirement for far_field_value due to min/max operations."); + double dist = (narrow_band == 0.) ? -std::numeric_limits::max() : far_field_value; + for ( auto&& surface : my_subsurfaces ) + { + dist = std::max(dist, surface->truncated_point_signed_distance(x, narrow_band, far_field_value)); + } + return dist; + } +} + +BoundingBox +Composite_Surface::get_bounding_box() +{ + BoundingBox bbox; + for (auto && subsurf : my_subsurfaces) + { + bbox.accommodate(subsurf->get_bounding_box()); + } + return bbox; +} + + +} // namespace krino + + + diff --git a/packages/krino/krino/krino_lib/Akri_Composite_Surface.hpp b/packages/krino/krino/krino_lib/Akri_Composite_Surface.hpp new file mode 100644 index 000000000000..92dfe0ba31c0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Composite_Surface.hpp @@ -0,0 +1,64 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Composite_Surface_h +#define Akri_Composite_Surface_h + +#include + +namespace krino { + +class SurfaceTree; +class Transformation; + +class Composite_Surface : public SurfaceThatTakesAdvantageOfNarrowBandAndThereforeMightHaveWrongSign { + +public: + Composite_Surface(const std::string & sn); + virtual ~Composite_Surface(); + + enum CompositionMethod{ MINIMUM_SIGNED_DISTANCE, MAXIMUM_SIGNED_DISTANCE }; + + virtual Surface_Type type() const override { return COMPOSITE_SURFACE; } + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) override; + virtual size_t storage_size() const override { size_t tot_size = 0; for (auto && surf : my_subsurfaces) tot_size += surf->storage_size(); return tot_size; } + + // query/modify subsurfaces + void add( Surface * surf ) { my_subsurfaces.emplace_back(surf); } + void reserve(unsigned size_) { my_subsurfaces.reserve(size_); } + unsigned size() const { return my_subsurfaces.size(); } + Surface * operator()( const unsigned index ) const { return my_subsurfaces[index].get(); } + void clear() { my_subsurfaces.clear(); } + void swap(Composite_Surface & other) { my_subsurfaces.swap(other.my_subsurfaces); } + SurfaceAutoVec & get_surfaces() { return my_subsurfaces; } + const SurfaceAutoVec & get_surfaces() const { return my_subsurfaces; } + + virtual void set_transformation(Transformation * trans) override { Surface::set_transformation(trans); for (auto && subsurf : my_subsurfaces) subsurf->set_transformation(trans);} + void set_composition_method(const CompositionMethod composition_method) { my_composition_method = composition_method; } + virtual BoundingBox get_bounding_box() override; + virtual double truncated_point_signed_distance(const Vector3d &x, const double truncation_length, const double far_field_value) const override; + double point_signed_distance_with_narrow_band(const Vector3d &x, const double narrow_band) const + { + // Special to this class, this version of point_signed_distance automatically determines the far_field_value from the composition_method + return truncated_point_signed_distance(x, narrow_band, get_signed_narrow_band_size(narrow_band)); + } + + virtual bool truncated_distance_may_have_wrong_sign() const override { return my_subsurfaces_might_produce_wrong_sign; } + double get_signed_narrow_band_size(const double pos_narrow_band) const { return (my_composition_method == MINIMUM_SIGNED_DISTANCE) ? pos_narrow_band : -pos_narrow_band; } + +protected: + std::string my_name; + CompositionMethod my_composition_method; + SurfaceAutoVec my_subsurfaces; + bool my_subsurfaces_might_produce_wrong_sign = true; +}; + +} // namespace krino + + +#endif // Akri_Composite_Surface_h diff --git a/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.cpp b/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.cpp new file mode 100644 index 000000000000..0c5b01db83b9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.cpp @@ -0,0 +1,122 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino{ + +void +Compute_Surface_Distance::calculate( + const stk::mesh::BulkData & mesh, + const stk::diag::Timer &parent_timer, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & surface_selector, + const double narrowBandSize, + const double farFieldValue) +{ + calculate(mesh, parent_timer, coordinates, distance, mesh.mesh_meta_data().universal_part(), surface_selector, narrowBandSize, farFieldValue); +} + +static BoundingBox compute_nodal_bounding_box(const stk::mesh::BulkData & mesh, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & volume_selector) +{ + const int spatial_dimension = mesh.mesh_meta_data().spatial_dimension(); + + // The bounding box for that contains all the nodes on that proc + BoundingBox nodeBbox; + for ( auto && bucket : mesh.get_buckets(stk::topology::NODE_RANK, volume_selector & stk::mesh::selectField(distance)) ) + { + const size_t length = bucket->size(); + double *coord = stk::mesh::field_data(coordinates, *bucket); + + for (size_t n = 0; n < length; ++n) + nodeBbox.accommodate( Vector3d(coord+n*spatial_dimension, spatial_dimension) ); + } + + return nodeBbox; +} + +static void compute_distance_to_facets(const stk::mesh::BulkData & mesh, + const MeshSurface & facet_list, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & volume_selector, + const double narrowBandSize, + const double userFarFieldValue) +{ + const int spatial_dimension = mesh.mesh_meta_data().spatial_dimension(); + const double farFieldValue = (userFarFieldValue > 0.0) ? userFarFieldValue : narrowBandSize; // Use farFieldValue, if specified, otherwise, use narrowBandSize + for ( auto && bucket : mesh.get_buckets(stk::topology::NODE_RANK, volume_selector & stk::mesh::selectField(distance)) ) + { + const size_t length = bucket->size(); + double *dist = stk::mesh::field_data(distance, *bucket); + double * coord = stk::mesh::field_data(coordinates, *bucket); + + for (size_t n = 0; n < length; ++n) + { + ThrowAssert(&(dist[n]) != NULL); + + const Vector3d xvec(coord+n*spatial_dimension, spatial_dimension); + dist[n] = facet_list.point_unsigned_distance(xvec, narrowBandSize, farFieldValue); + } + } +} + +void print_facet_info(const MeshSurface & facet_list, stk::ParallelMachine parallel) +{ + constexpr int vec_size = 3; + std::array local_sizes, global_min, global_max; + local_sizes[0] = facet_list.storage_size(); + local_sizes[1] = facet_list.size(); + local_sizes[2] = facet_list.size()+facet_list.nonlocal_size(); + + stk::all_reduce_min( parallel, local_sizes.data(), global_min.data(), vec_size ); + stk::all_reduce_max( parallel, local_sizes.data(), global_max.data(), vec_size ); + + krinolog << "Compute Surface Distance: "<< stk::diag::dendl; + krinolog << " Local facet count: min=" << global_min[1] << ", max=" << global_max[1] << stk::diag::dendl; + krinolog << " Total facet count: min=" << global_min[2] << ", max=" << global_max[2] << stk::diag::dendl; + krinolog << " Memory usage (mb): min=" << global_min[0]/(1024.0*1024.0) << ", max=" << global_max[0]/(1024.0*1024.0) << stk::diag::dendl; +} + + +void +Compute_Surface_Distance::calculate( + const stk::mesh::BulkData & mesh, + const stk::diag::Timer &parent_timer, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & volume_selector, + const stk::mesh::Selector & surface_selector, + const double narrowBandSize, + const double farFieldValue) +{ /* %TRACE[ON]% */ Trace trace__("krino::Compute_Surface_Distance::compute_surface_distance(void)"); /* %TRACE% */ + + stk::diag::Timer timer( "Compute Surface Distance", parent_timer ); + stk::diag::TimeBlock timer_(timer); + + MeshSurface facet_list(mesh.mesh_meta_data(), coordinates, surface_selector, +1); + const BoundingBox nodeBbox = compute_nodal_bounding_box(mesh, coordinates, distance, volume_selector); + facet_list.prepare_to_compute(0.0, nodeBbox, narrowBandSize); // Setup including communication of facets that are within this processors narrow band + + print_facet_info(facet_list, mesh.parallel()); + + compute_distance_to_facets(mesh, facet_list, coordinates, distance, volume_selector, narrowBandSize, farFieldValue); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.hpp b/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.hpp new file mode 100644 index 000000000000..6795cd4002f5 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Compute_Surface_Distance.hpp @@ -0,0 +1,42 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Compute_Surface_Distance_h +#define Akri_Compute_Surface_Distance_h + +#include +#include +#include + +namespace krino { + +class Compute_Surface_Distance { +public: + static void calculate( + const stk::mesh::BulkData & mesh, + const stk::diag::Timer &parent_timer, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & surface_selector, + const double narrowBandSize = 0.0, + const double farFieldValue = 0.0); + + static void calculate( + const stk::mesh::BulkData & mesh, + const stk::diag::Timer &parent_timer, + const stk::mesh::Field& coordinates, + const stk::mesh::Field& distance, + const stk::mesh::Selector & volume_selector, + const stk::mesh::Selector & surface_selector, + const double narrowBandSize = 0.0, + const double farFieldValue = 0.0); + }; + +} // namespace krino + +#endif // Akri_Compute_Surface_Distance_h diff --git a/packages/krino/krino/krino_lib/Akri_ContourElement.cpp b/packages/krino/krino/krino_lib/Akri_ContourElement.cpp new file mode 100644 index 000000000000..9ec313d5897e --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ContourElement.cpp @@ -0,0 +1,556 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino{ + +ContourElement::ContourElement( const stk::mesh::BulkData & mesh, + stk::mesh::Entity in_mesh_obj, + const FieldRef coords_field, + const FieldRef dist_field, + const double iso_dist ) + : my_mesh( mesh ), + my_entity( in_mesh_obj ), + my_spatial_dim( mesh.mesh_meta_data().spatial_dimension() ), + my_coords_master_elem(MasterElementDeterminer::getMasterElement(mesh.bucket(in_mesh_obj), coords_field)), + my_dist_master_elem(MasterElementDeterminer::getMasterElement(mesh.bucket(in_mesh_obj), dist_field)), + my_coords_field( coords_field ), + my_dist_field( dist_field ), + my_length_scale(-1.0), + my_edge_linear_tolerance(-1.0), + my_edge_nonlinear_tolerance(-1.0) +{ /* %TRACE% */ /* %TRACE% */ + + // + // Gather obj's coordinates, distance, and velocity into ArrayContainer's. + // + + const int dim = my_spatial_dim; + + const int npe_coords = my_coords_master_elem.get_topology().num_nodes(); + const int npe_dist = my_dist_master_elem.get_topology().num_nodes(); + + my_coords.resize( dim, npe_coords ); + my_dist.resize( npe_dist ); + + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(my_entity); + + for ( int i = 0; i < npe_coords; ++i ) + { + double * var = field_data( my_coords_field, elem_nodes[i]); + for ( int d = 0; d < dim; d++ ) + { + my_coords(d,i) = var[d]; + } + } + + for ( int i = 0; i < npe_dist; ++i ) + { + double * var = field_data( my_dist_field, elem_nodes[i]); + my_dist(i) = *var - iso_dist; + } + + // the interpolate master element methods require the transpose?!? + my_coords_transpose.resize( npe_coords, dim ); + for (int i = 0; i < npe_coords; i++) + { + for (int d = 0; d < dim; d++) + { + my_coords_transpose(i,d) = my_coords(d,i); + } + } +} + +ContourElement::~ContourElement() {} + +std::ostream & +ContourElement::put( std::ostream& os ) const +{ /* %TRACE% */ /* %TRACE% */ + const int dim = my_spatial_dim; + + os << "Element description:" << std::endl + << " Coordinates topolology is " << coord_topology().name() + << ", Distance topology is " << dist_topology().name() << std::endl; + + int lnn = 0; + int coord_counter = 0; + int dist_counter = 0; + const unsigned num_nodes = my_mesh.num_nodes(my_entity); + const stk::mesh::Entity* nodes = my_mesh.begin_nodes(my_entity); + for (unsigned node_index=0; node_index(my_coords_field, node); + if ( NULL != var ) + { + Vector3d coords(Vector3d::ZERO); + for ( int d = 0; d < dim; d++ ) + coords[d] = my_coords(d,coord_counter); + os << ", coords = (" << coords[0] << "," + << coords[1] << "," + << coords[2] << ")"; + coord_counter++; + } + + var = field_data(my_dist_field, node); + if ( NULL != var ) + { + os << ", dist = " << my_dist(dist_counter++); + } + os << std::endl; + } + return os ; +} + +bool +ContourElement::have_interface_sides() const +{ + ThrowAssert(my_base_subelement); + return my_base_subelement->have_interface_sides(); +} + +double +ContourElement::distance( const Vector3d & p_coords ) const + { /* %TRACE% */ /* %TRACE% */ + double dist; + my_dist_master_elem.interpolate_point(my_spatial_dim, p_coords.data(), 1, my_dist.ptr(), &dist); + return dist; + } + +Vector3d +ContourElement::coordinates( const Vector3d & p_coords ) const + { /* %TRACE% */ /* %TRACE% */ + Vector3d coords(Vector3d::ZERO); + my_coords_master_elem.interpolate_point(my_spatial_dim, p_coords.data(), my_spatial_dim, my_coords.ptr(), coords.data()); + return coords; + } + +double +ContourElement::determinant( const Vector3d & p_coords ) const + { /* %TRACE% */ /* %TRACE% */ + double detJ, detJ_error; + + const int num_coord_dofs = coord_topology().num_nodes(); + + // temporary data + static sierra::ArrayContainer d_shapef_coords; + + // reserve enough space for results + d_shapef_coords.resize(my_spatial_dim, num_coord_dofs, 1); + + my_coords_master_elem.shape_fcn_deriv(1, p_coords.data(), d_shapef_coords.ptr()); + my_coords_master_elem.determinant( + my_spatial_dim, // Number of coordinate dimensions + 1, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.ptr(),// Mesh shape function derivatives + 1, // Number of elements + my_coords.ptr(), // Mesh coordinate values + &detJ, // Determinant of the transformation Jacobian for each element (output) + &detJ_error ); // Determinant error (output) + return detJ; + } + +Vector3d +ContourElement::continuous_distance_gradient( const Vector3d & p_coords ) const + { /* %TRACE% */ /* %TRACE% */ + // gather continuous distance gradient + sierra::ArrayContainer grad_distance; + const int npe = dist_topology().num_nodes(); + grad_distance.resize( my_spatial_dim, npe ); + stk::mesh::FieldBase* field_ptr = my_mesh.mesh_meta_data().get_field(stk::topology::NODE_RANK, "CONT_GRAD"); + ThrowRequireMsg(nullptr != field_ptr, "Field CONT_GRAD not found."); + const FieldRef contGradField(field_ptr); + const stk::mesh::Entity* elem_nodes = my_mesh.begin_nodes(my_entity); + for ( int i = 0; i < npe; ++i ) + { + double * var = field_data(contGradField, elem_nodes[i]); + for(int d = 0; d < my_spatial_dim; ++d) + grad_distance(d,i) = var[d]; + } + + Vector3d grad_dist(Vector3d::ZERO); + my_vel_master_elem->interpolate_point(my_spatial_dim, p_coords.data(), my_spatial_dim, grad_distance.ptr(), grad_dist.data()); + return grad_dist; + } + +Vector3d +ContourElement::distance_gradient( const Vector3d & p_coords ) const + { /* %TRACE% */ /* %TRACE% */ + const int dim = my_spatial_dim; + const int num_coord_dofs = my_coords.dimension(); + const int num_dist_dofs = my_dist.dimension(); + + // temporary data + static sierra::ArrayContainer d_shapef_coords; + static sierra::ArrayContainer d_shapef_dist; + static sierra::ArrayContainer grad_op; + + // reserve enough space for results + d_shapef_coords.resize(dim, num_coord_dofs); + d_shapef_dist.resize(dim, num_dist_dofs); + grad_op.resize(dim, num_dist_dofs); + Vector3d grad_dist( Vector3d::ZERO ); + double det_J; + + // pointers to array data + const double * intg_pt_loc_ptr = p_coords.data(); + double * grad_dist_ptr = grad_dist.data(); + + double gradop_error; + + my_coords_master_elem.shape_fcn_deriv(1, intg_pt_loc_ptr, d_shapef_coords.ptr()); + my_dist_master_elem.shape_fcn_deriv(1, intg_pt_loc_ptr, d_shapef_dist.ptr()); + + my_dist_master_elem.gradient_operator( + dim, // Number of coordinate dimensions + 1, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.ptr(),// Mesh shape function derivatives + num_dist_dofs, // Number of dof shape functions + d_shapef_dist.ptr(), // Dof shape function derivatives + 1, // Number of elements + my_coords.ptr(), // Mesh coordinate values + grad_op.ptr(), // Gradient operator values (output) + &det_J, // Determinant of the transformation Jacobian for each element (output) + &gradop_error ); // Gradop error (output) + + my_dist_master_elem.scalar_gradient( + 1, // Number of target points + 1, // Number of elements + grad_op.ptr(), // Gradient operator values + &det_J, // Determinant of the transformation Jacobian for each element + my_dist.ptr(), // nodal distance + grad_dist_ptr ); // Gradient of distance at integration pts (output) + return( grad_dist ); + } + +void +ContourElement::compute_distance_gradient( const sierra::Array & intg_pt_locations, + sierra::ArrayContainer & grad_dist ) const + { /* %TRACE% */ /* %TRACE% */ + const int dim = intg_pt_locations.dimension(); + const int num_intg_pts = intg_pt_locations.dimension(); + + const int num_coord_dofs = my_coords.dimension(); + const int num_dist_dofs = my_dist.dimension(); + + // temporary data + static sierra::ArrayContainer d_shapef_coords; + static sierra::ArrayContainer d_shapef_dist; + static sierra::ArrayContainer det_J; + static sierra::ArrayContainer grad_op; + + // reserve enough space for results + d_shapef_coords.resize(dim, num_coord_dofs, num_intg_pts); + d_shapef_dist.resize(dim, num_dist_dofs, num_intg_pts); + det_J.resize(num_intg_pts); + grad_op.resize(dim, num_dist_dofs, num_intg_pts); + grad_dist.resize(dim, num_intg_pts); + + double gradop_error; + + my_coords_master_elem.shape_fcn_deriv(num_intg_pts, intg_pt_locations.ptr(), d_shapef_coords.ptr()); + my_dist_master_elem.shape_fcn_deriv(num_intg_pts, intg_pt_locations.ptr(), d_shapef_dist.ptr()); + + my_dist_master_elem.gradient_operator( + dim, // Number of coordinate dimensions + num_intg_pts, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.ptr(), // Mesh shape function derivatives + num_dist_dofs, // Number of dof shape functions + d_shapef_dist.ptr(), // Dof shape function derivatives + 1, // Number of elements + my_coords.ptr(), // Mesh coordinate values + grad_op.ptr(), // Gradient operator values (output) + det_J.ptr(), // Determinant of the transformation Jacobian for each element (output) + &gradop_error ); // Gradop error (output) + + my_dist_master_elem.scalar_gradient( + num_intg_pts, // Number of target points + 1, // Number of elements + grad_op.ptr(), // Gradient operator values + det_J.ptr(), // Determinant of the transformation Jacobian for each element + my_dist.ptr(), // nodal distance + grad_dist.ptr() ); // Gradient of distance at integration pts (output) + } + +void +ContourElement::compute_subelement_decomposition(const double in_length_scale, const double in_edge_linear_tolerance, const double in_edge_nonlinear_tolerance) const + { /* %TRACE% */ /* %TRACE% */ + my_length_scale = in_length_scale; + my_edge_linear_tolerance = in_edge_linear_tolerance; + my_edge_nonlinear_tolerance = in_edge_nonlinear_tolerance; + + stk::topology topology = dist_topology(); + const int num_sides = topology.num_sides(); + std::vector side_ids(num_sides); + for (int i=0; i( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::HEXAHEDRON_27 == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::TETRAHEDRON_4 == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::TETRAHEDRON_10 == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::WEDGE_6 == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::QUADRILATERAL_4_2D == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::QUADRILATERAL_9_2D == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::TRIANGLE_3_2D == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + else if (stk::topology::TRIANGLE_6_2D == topology) + { + my_base_subelement = std::make_unique( my_dist_p_coords, side_ids, this ); + } + ThrowErrorMsgIf(!my_base_subelement, "Element with topology " << topology.name() << " not supported."); + + if ( krinolog.shouldPrint(LOG_SUBELEMENT) ) + { + if ( krinolog.shouldPrint(LOG_DEBUG) ) + { + dump_subelement_details(); + } + else + { + dump_subelement_structure(); + } + } + } + +double +ContourElement::volume() const + { /* %TRACE% */ /* %TRACE% */ + + sierra::Array intg_pt_locations; + sierra::Array intg_weights; + sierra::ArrayContainer determinants; + + std_intg_pts( intg_pt_locations, intg_weights, determinants ); + + double vol = 0.0; + + const int num_intg_pts = intg_pt_locations.dimension(); + + for ( int ip = 0; ip < num_intg_pts; ++ip ) + { + vol += intg_weights(ip) * determinants(ip); + } + return vol; + } + +double +ContourElement::average_edge_length() const +{ /* %TRACE% */ /* %TRACE% */ + const stk::topology Top = coord_topology(); + int num_edges = Top.num_edges(); + + double sum_edge_lengths = 0.0; + + for ( int edge = 0; edge < num_edges; edge++ ) + { + const unsigned * const lnn = get_edge_node_ordinals(Top, edge); + + double sqr_length = 0.0; + for ( int d = 0; d < my_spatial_dim; d++ ) sqr_length += (my_coords(d,lnn[0]) - my_coords(d,lnn[1])) * + (my_coords(d,lnn[0]) - my_coords(d,lnn[1])); + sum_edge_lengths += std::sqrt(sqr_length); + } + + return sum_edge_lengths/num_edges; +} + +double +ContourElement::elem_size() const + { /* %TRACE% */ /* %TRACE% */ + const double vol = volume(); + const double vol_root = 1.0 / my_spatial_dim; + const double h = pow( vol, vol_root ); + return h; + } + +void +ContourElement::dump_subelement_structure() const + { /* %TRACE% */ /* %TRACE% */ + ThrowErrorMsgIf(!my_base_subelement, "\ncompute_subelement_decomposition(...) must be called prior to calling dump_subelement_structure()."); + + krinolog << "***********************************************" << stk::diag::dendl; + krinolog << *this; + krinolog << "Subelement structure:" << stk::diag::dendl; + my_base_subelement->dump_structure(); + krinolog << "***********************************************" << stk::diag::dendl; + } + +void +ContourElement::dump_subelement_details() const + { /* %TRACE% */ /* %TRACE% */ + ThrowErrorMsgIf(!my_base_subelement, "\ncompute_subelement_decomposition(...) must be called prior to calling dump_subelement_details()."); + + krinolog << "***********************************************" << stk::diag::dendl; + krinolog << *this; + krinolog << "Subelement details:" << stk::diag::dendl; + my_base_subelement->dump_details(); + krinolog << "***********************************************" << stk::diag::dendl; + } + +int +ContourElement::build_subelement_facets( Faceted_Surface & facets ) +{ + ThrowErrorMsgIf(!my_base_subelement, "\ncompute_subelement_decomposition(...) must be called prior to calling build_subelement_facets(...)."); + return my_base_subelement->build_facets( facets ); +} + +int +ContourElement::gather_intg_pts( const int intg_pt_sign, + sierra::ArrayContainer & intg_pt_locations, + sierra::ArrayContainer & intg_weights, + sierra::ArrayContainer & determinants, + const bool map_to_real_coords ) +{ + ThrowErrorMsgIf(0 == intg_pt_sign && !map_to_real_coords, + "\nSubelement decomposition can currently only provide the surface integration with the overall determinant."); + ThrowErrorMsgIf(!my_base_subelement, + "\ncompute_subelement_decomposition(...) must be called prior to calling gather_intg_pts(...)."); + + const int num_intg_pts = my_base_subelement->num_intg_pts(intg_pt_sign); + + intg_pt_locations.resize(my_spatial_dim,num_intg_pts); + intg_weights.resize(num_intg_pts); + determinants.resize(num_intg_pts); + + my_base_subelement->gather_intg_pts( intg_pt_sign, + intg_pt_locations, + intg_weights, + determinants ); + + if ( 0 != intg_pt_sign && map_to_real_coords ) + { + // + // Include the determinant from element to real space + // + const int num_coord_dofs = coord_topology().num_nodes(); + + // temporary data + static sierra::ArrayContainer d_shapef_coords; + static sierra::ArrayContainer det_J; + + // reserve enough space for results + d_shapef_coords.resize(my_spatial_dim, num_coord_dofs, num_intg_pts); + det_J.resize(num_intg_pts); + + double det_J_error; + + my_coords_master_elem.shape_fcn_deriv(num_intg_pts, intg_pt_locations.ptr(), d_shapef_coords.ptr()); + my_coords_master_elem.determinant( + my_spatial_dim, // Number of coordinate dimensions + num_intg_pts, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.ptr(),// Mesh shape function derivatives + 1, // Number of elements + my_coords.ptr(), // Mesh coordinate values + det_J.ptr(), // Determinant of the transformation Jacobian for each element (output) + &det_J_error ); // Determinant error (output) + for ( int i=0; i & intg_pt_locations, + sierra::Array & intg_weights, + sierra::ArrayContainer & det_J, + const MasterElement & me ) const + { + const int num_intg_pts = me.num_intg_pts(); + const double * intg_pt_loc_ptr = me.intg_pt_locations(); + const double * intg_wt_ptr = me.intg_weights(); + + intg_pt_locations.set(intg_pt_loc_ptr,my_spatial_dim,num_intg_pts); + intg_weights.set(intg_wt_ptr,num_intg_pts); + det_J.resize( num_intg_pts ); + + double det_J_error; + + if ( me.get_topology() == my_coords_master_elem.get_topology() ) + { + my_coords_master_elem.determinant( my_spatial_dim, 1, my_coords.ptr(), det_J.ptr(), &det_J_error ); + } + else + { + const int num_coord_dofs = coord_topology().num_nodes(); + sierra::ArrayContainer d_shapef_coords(my_spatial_dim, num_coord_dofs, num_intg_pts); + my_coords_master_elem.shape_fcn_deriv(num_intg_pts, intg_pt_locations.ptr(), d_shapef_coords.ptr()); + my_coords_master_elem.determinant( + my_spatial_dim, // Number of coordinate dimensions + num_intg_pts, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.ptr(),// Mesh shape function derivatives + 1, // Number of elements + my_coords.ptr(), // Mesh coordinate values + det_J.ptr(), // Determinant of the transformation Jacobian for each element (output) + &det_J_error ); // Determinant error (output) + } + + return( num_intg_pts ); + } + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_ContourElement.hpp b/packages/krino/krino/krino_lib/Akri_ContourElement.hpp new file mode 100644 index 000000000000..f7ee798316ca --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ContourElement.hpp @@ -0,0 +1,130 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_ContourElement_h +#define Akri_ContourElement_h + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace krino { + +class ContourSubElement; + +class ContourElement { +public: + + ContourElement( const stk::mesh::BulkData & mesh, + stk::mesh::Entity mesh_obj, + const FieldRef coords_field, + const FieldRef dist_field, + const double iso_dist = 0.0 ); + ~ContourElement(); // Definition must in implementation file because SubElement is incomplete + + std::ostream & put( std::ostream& os ) const; + friend std::ostream & operator << ( std::ostream &os , const ContourElement &s ) { + return s.put(os); + } + + const MasterElement & coord_master_elem() const { return my_coords_master_elem; } + const MasterElement & dist_master_elem() const { return my_dist_master_elem; } + const MasterElement & vel_master_elem() const { return *my_vel_master_elem; } + + const stk::topology coord_topology() const { return my_coords_master_elem.get_topology(); } + const stk::topology dist_topology() const { return my_dist_master_elem.get_topology(); } + const stk::topology vel_topology() const { return my_vel_master_elem->get_topology(); } + + bool dist_is_linear() const { return dist_topology() == stk::topology::TRIANGLE_3_2D || dist_topology() == stk::topology::TETRAHEDRON_4; } + + stk::mesh::Entity entity() const { return my_entity; } + stk::mesh::EntityId elem_id() const { return my_mesh.identifier(my_entity); } + bool have_interface_sides() const; + + Vector3d coordinates( const Vector3d & p_coords ) const; + double distance( const Vector3d & p_coords ) const; + const PointVec & nodal_parametric_coordinates() const { return my_dist_p_coords; } + double determinant( const Vector3d & p_coords ) const; + + Vector3d continuous_distance_gradient( const Vector3d & p_coords ) const; + Vector3d distance_gradient( const Vector3d & p_coords ) const; + void compute_distance_gradient( const sierra::Array & intg_pt_locations, + sierra::ArrayContainer & grad_dist ) const; + + void dump_subelement_structure( void ) const; + void dump_subelement_details( void ) const; + const ContourSubElement * get_base_subelement() const { return my_base_subelement.get(); } + + int build_subelement_facets( Faceted_Surface & facets ); + + int gather_intg_pts( const int intg_pt_sign, + sierra::ArrayContainer & intg_pt_locations, + sierra::ArrayContainer & intg_weights, + sierra::ArrayContainer & determinants, + const bool map_to_real_coords ); + + int std_intg_pts( sierra::Array & intg_pt_locations, + sierra::Array & intg_weights, + sierra::ArrayContainer & determinants, + const MasterElement & me ) const; + int std_intg_pts( sierra::Array & intg_pt_locations, + sierra::Array & intg_weights, + sierra::ArrayContainer & determinants ) const { return std_intg_pts(intg_pt_locations, intg_weights, determinants, my_coords_master_elem); } + + int spatial_dim() const { return my_spatial_dim; } + double length_scale() const { return my_length_scale; } + double edge_linear_tolerance() const { return my_edge_linear_tolerance; } + double edge_nonlinear_tolerance() const { return my_edge_nonlinear_tolerance; } + + double volume() const; + double elem_size() const; + double average_edge_length() const; + + void compute_subelement_decomposition(const double length_scale, const double edge_linear_tolerance = 1.e-4, const double edge_nonlinear_tolerance = 1.0e-2) const; + +private: + const stk::mesh::BulkData & my_mesh; + stk::mesh::Entity my_entity; + const int my_spatial_dim; + + const MasterElement & my_coords_master_elem; + const MasterElement & my_dist_master_elem; + const MasterElement * my_vel_master_elem; + + const FieldRef my_coords_field; + const FieldRef my_dist_field; + const FieldRef my_vel_field; + + sierra::ArrayContainer my_coords; + sierra::ArrayContainer my_coords_transpose; + sierra::ArrayContainer my_dist; + sierra::ArrayContainer my_vel; + sierra::ArrayContainer my_vel_transpose; + + mutable PointVec my_dist_p_coords; + mutable double my_length_scale; + mutable double my_edge_linear_tolerance; + mutable double my_edge_nonlinear_tolerance; + mutable std::unique_ptr my_base_subelement; + + //: Default constructor not allowed + ContourElement(); + +}; + +} // namespace krino + +#endif // Akri_ContourElement_h diff --git a/packages/krino/krino/krino_lib/Akri_ContourSubElement.cpp b/packages/krino/krino/krino_lib/Akri_ContourSubElement.cpp new file mode 100644 index 000000000000..2ef3e52bf7c1 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ContourSubElement.cpp @@ -0,0 +1,2565 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +namespace krino{ + +bool ContourSubElement::is_more(const Vector3d & x, const Vector3d & y) +{ + // note that in the case of x==y, this will return false + if (utility::is_more(x[0],y[0]) || (!utility::is_less(x[0],y[0]) && + (utility::is_more(x[1],y[1]) || (!utility::is_less(x[1],y[1]) && + (utility::is_more(x[2],y[2])))))) + { + return true; + } + return false; +} + +ContourSubElement::ContourSubElement( const stk::topology topo, + const PointVec & coords, + const std::vector & side_ids, + const ContourElement *in_owner, + const int in_subelement_depth, + const int subelement_sign ) + : my_master_element( MasterElementDeterminer::getMasterElement(topo) ), + my_side_master_element( MasterElementDeterminer::getMasterElement(topo.side_topology()) ), + my_coords( coords ), + my_side_ids( side_ids ), + my_owner( in_owner ), + my_subelement_depth( in_subelement_depth ), + my_sign( subelement_sign ) +{ /* %TRACE% */ /* %TRACE% */ + my_num_nodes = my_coords.size(); + ThrowAssert( (unsigned)my_num_nodes == topology().num_nodes() ); + my_num_sides = my_side_ids.size(); + ThrowAssert( (unsigned)my_num_sides == topology().num_sides() ); + + // compute distance at each node + my_dist.clear(); + my_dist.reserve(my_num_nodes); + for ( int i = 0; i < my_num_nodes; i++ ) + { + double nodal_dist = my_owner->distance( my_coords[i] ); + my_dist.push_back(nodal_dist); + } +} + +int +ContourSubElement::build_facets( Faceted_Surface & facets ) +{ /* %TRACE% */ /* %TRACE% */ + int start_size = facets.size(); + + if ( !my_subelements.empty() ) + { + for ( auto && subelem : my_subelements ) + { + subelem->build_facets( facets ); + } + } + else + { + for ( int iside = 0; iside < my_num_sides; iside++ ) + { + // side_ids == -2 indicates that sides is on interface + if ( my_side_ids[iside] == -2 ) + { + const int subelem_num_facets = side_facets( facets, iside ); + if ( krinolog.shouldPrint(LOG_SUBELEMENT) ) + { + krinolog << "Subelement with area = " << side_relative_area(iside) + << " added " << subelem_num_facets << " facets." << std::endl; + } + } + } + } + + int added_facets = facets.size() - start_size; + return added_facets; +} + +void +ContourSubElement::dump_structure() const +{ /* %TRACE% */ /* %TRACE% */ + + if ( !my_subelements.empty() ) + { + for ( int i = 0; i < my_subelement_depth; i++ ) + { + krinolog << " "; + } + krinolog << "my subelement type = " << topology().name() << ", my # of subelements = " << my_subelements.size() << std::endl; + for ( auto && subelem : my_subelements ) + { + subelem->dump_structure(); + } + } + else + { + for ( int i = 0; i < my_subelement_depth; i++ ) + { + krinolog << " "; + } + krinolog << "my subelement type = " << topology().name() << std::endl; + } +} + +void +ContourSubElement::dump_details() const +{ /* %TRACE% */ /* %TRACE% */ + if ( !my_subelements.empty() ) + { + krinolog << "my subelement type = " << topology().name() << ", my # of subelements = " << my_subelements.size() << std::endl; + for ( auto && subelem : my_subelements ) + { + subelem->dump_details(); + } + } + else + { + krinolog << "--------------------begin subelement definition--------------------" << std::endl; + krinolog << *this; + krinolog << "---------------------end subelement definition---------------------" << std::endl; + } +} + +int +ContourSubElement::side_facets( Faceted_Surface & facets, int side ) const +{ /* %TRACE% */ /* %TRACE% */ + const std::string & owner_type = my_owner->dist_topology().name(); + const std::string & sub_type = topology().name(); + ThrowRuntimeError("Subelement decomposition for subelement of type '" << sub_type + << "' which was generated from owning element of type '" << owner_type + << "' is missing the capability to generate conformal facets."); + return -1; +} + +std::ostream & +ContourSubElement::put( std::ostream& os ) const +{ /* %TRACE% */ /* %TRACE% */ + os << "Subelement description:" << std::endl; + os << " type = " << topology().name() + << ", relative volume = " << relative_volume() + << ", parametric_quality = " << parametric_quality() + << ", physical_quality = " << physical_quality() << std::endl; + for ( int i = 0; i < my_num_nodes; i++ ) + { + Vector3d x = my_owner->coordinates( my_coords[i] ); + os << " coords[" << i << "] = (" + << my_coords[i][0] << "," + << my_coords[i][1] << "," + << my_coords[i][2] << ")" + << ", x = (" + << x[0] << "," + << x[1] << "," + << x[2] << ")" + << ", dist = " << my_dist[i] + << ", sign = " << -1 + 2*LevelSet::sign_change(my_dist[i],-1.) << std::endl; + } + for ( int i = 0; i < my_num_sides; i++ ) + { + os << " side_ids[" << i << "] = " << my_side_ids[i] + << ", side_relative_area[" << i << "] = " << side_relative_area(i) + << ", side_quality[" << i << "] = " << side_quality(i) << std::endl; + } + // matlab visualization + os << " matlabvertices = ["; + for ( int i = 0; i < my_num_nodes; i++ ) + { + os << my_coords[i][0] << " " + << my_coords[i][1] << " " + << my_coords[i][2] << "; "; + } + os << "];" << std::endl; + os << " physical space matlabvertices = ["; + for ( int i = 0; i < my_num_nodes; i++ ) + { + Vector3d x = my_owner->coordinates( my_coords[i] ); + os << x[0] << " " + << x[1] << " " + << x[2] << "; "; + } + os << "];" << std::endl; + + return os ; +} + +double +ContourSubElement::relative_volume() const +{ /* %TRACE% */ /* %TRACE% */ + // This is a relative volume compared to the owner volume. + // Actually this is a relative volume if the "parametric" volume of the element is unity. + // Otherwise, it is off by a factor. + const int nelem = 1; + const int dim = spatial_dim(); + const int nint = my_master_element.num_intg_pts(); + std::vector coords(my_num_nodes * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + + // integration weights + const double * intg_weights = my_master_element.intg_weights(); + + // load coords + int count = 0; + for ( int i = 0; i < my_num_nodes; i++ ) + { + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = my_coords[i][j]; + } + } + + // determinant at integration points + my_master_element.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double elem_volume = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + elem_volume += det_J[ip] * intg_weights[ip]; + } + + return elem_volume; +} + +double +ContourSubElement::side_relative_area( const int side ) const +{ /* %TRACE% */ /* %TRACE% */ + // This is a relative volume compared to the owner volume. + // Actually this is a relative volume if the "parametric" volume of the element is unity. + // Otherwise, it is off by a factor. + const int nelem = 1; + const int dim = spatial_dim(); + const int nint = my_side_master_element.num_intg_pts(); + const stk::topology Top = topology(); + const stk::topology sideTop = Top.side_topology(side); + const int side_num_nodes = sideTop.num_nodes(); + const unsigned * const lnn = get_side_node_ordinals(Top, side); + + std::vector coords(side_num_nodes * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + + // integration weights + const double * intg_weights = my_side_master_element.intg_weights(); + + // load coords + int count = 0; + for ( int i = 0; i < side_num_nodes; i++ ) + { + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = my_coords[lnn[i]][j]; + } + } + + // determinant at integration points + my_side_master_element.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double elem_side_area = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + elem_side_area += det_J[ip] * intg_weights[ip]; + } + + return elem_side_area; +} + +bool +ContourSubElement::have_interface_sides() const +{ + if ( !my_subelements.empty()) + { + for ( auto && subelem : my_subelements ) + { + if (subelem->have_interface_sides()) + { + return true; + } + } + } + else + { + for ( int iside = 0; iside < my_num_sides; iside++ ) + { + // side_ids == -2 indicates that sides is on interface + if ( my_side_ids[iside] == -2 ) + { + return true; + } + } + } + return false; +} + +ContourSubElement::~ContourSubElement() +{ /* %TRACE% */ /* %TRACE% */ + for ( auto && subelem : my_subelements ) + delete subelem; +} + +int +ContourSubElement::num_intg_pts(const int intg_pt_sign) +{ /* %TRACE% */ /* %TRACE% */ + int num_pts = 0; + + if ( !my_subelements.empty() ) + { + for ( auto && subelem : my_subelements ) + { + num_pts += subelem->num_intg_pts(intg_pt_sign); + } + } + else + { + if ( 0 == intg_pt_sign ) // interface points + { + for ( int iside = 0; iside < my_num_sides; iside++ ) + { + // side_ids == -2 indicates that side is on interface + if ( my_side_ids[iside] == -2 ) + { + num_pts += my_side_master_element.num_intg_pts(); + } + } + } + else // volume points + { + if ( intg_pt_sign != my_sign ) + { + return(0); + } + else + { + return ( my_master_element.num_intg_pts() ); + } + } + } + + return num_pts; +} + +int +ContourSubElement::gather_intg_pts( const int intg_pt_sign, + sierra::ArrayContainer & intg_pt_locations, + sierra::ArrayContainer & intg_weights, + sierra::ArrayContainer & determinant, + int index ) +{ /* %TRACE% */ /* %TRACE% */ + if ( !my_subelements.empty() ) + { + for ( auto && subelem : my_subelements ) + { + index = subelem->gather_intg_pts( intg_pt_sign, + intg_pt_locations, + intg_weights, + determinant, + index ); + } + } + else + { + if ( 0 == intg_pt_sign ) // interface points + { + for ( int iside = 0; iside < my_num_sides; iside++ ) + { + // side_ids == -2 indicates that side is on interface + if ( my_side_ids[iside] == -2 ) + { + const int nelem = 1; + const int dim = spatial_dim(); + const stk::topology Top = topology(); + const stk::topology sideTop = Top.side_topology(iside); + const int side_num_intg_pts = my_side_master_element.num_intg_pts(); + const int side_num_nodes = sideTop.num_nodes(); + const unsigned * const lnn = get_side_node_ordinals(Top, iside ); + double error; + + // temp arrays + sierra::ArrayContainer coords(dim,side_num_nodes); + sierra::ArrayContainer det_J(side_num_intg_pts); + + // load coords + for ( int i = 0; i < side_num_nodes; i++ ) + { + Vector3d coordinates = my_owner->coordinates( my_coords[lnn[i]] ); + for ( int d = 0; d < dim; d++ ) coords(d,i) = coordinates[d]; + } + + // determinant at integration points + my_side_master_element.determinant( dim, nelem, coords.ptr(), det_J.ptr(), &error ); + + // integration weights + const double * intg_wts_ptr = my_side_master_element.intg_weights(); + const sierra::Array intg_wts(intg_wts_ptr,side_num_intg_pts); + + // basis fns at integration point locations + const double * bf_ptr = my_side_master_element.shape_fcn(); + const sierra::Array bf(bf_ptr,side_num_nodes,side_num_intg_pts); + + for ( int ip = 0; ip < side_num_intg_pts; ++ip) + { + determinant(index) = det_J(ip); + intg_weights(index) = intg_wts(ip); + + Vector3d xi(Vector3d::ZERO); + for ( int i = 0; i < side_num_nodes; i++ ) + xi += bf(i,ip) * my_coords[lnn[i]]; + + for ( int d = 0; d < dim; ++d ) + intg_pt_locations(d,index) = xi[d]; + + index++; + } + } + } + } + else // volume points + { + ThrowAssert(-1 == intg_pt_sign || 1 == intg_pt_sign); + + if ( intg_pt_sign != my_sign ) + { + return(index); + } + + const int nelem = 1; + const int dim = spatial_dim(); + const int vol_num_intg_pts = my_master_element.num_intg_pts(); + + // temp arrays + sierra::ArrayContainer coords(dim,my_num_nodes); + sierra::ArrayContainer det_J(vol_num_intg_pts); + + double error; + + // integration weights + const double * intg_wts_ptr = my_master_element.intg_weights(); + const sierra::Array intg_wts(intg_wts_ptr,vol_num_intg_pts); + + // load coords + for ( int i = 0; i < my_num_nodes; i++ ) + { + for ( int d = 0; d < dim; d++ ) coords(d,i) = my_coords[i][d]; + } + + // determinant at integration points + my_master_element.determinant( dim, nelem, coords.ptr(), det_J.ptr(), &error ); + + // basis fns at integration point locations + const double * bf_ptr = my_master_element.shape_fcn(); + const sierra::Array bf(bf_ptr,my_num_nodes,vol_num_intg_pts); + + for ( int ip = 0; ip < vol_num_intg_pts; ++ip) + { + determinant(index) = det_J(ip); + intg_weights(index) = intg_wts(ip); + + Vector3d xi(Vector3d::ZERO); + for ( int i = 0; i < my_num_nodes; i++ ) + xi += bf(i,ip) * my_coords[i]; + + for ( int d = 0; d < dim; d++ ) + intg_pt_locations(d,index) = xi[d]; + + index++; + } + } + } + return(index); +} + +double +ContourSubElement::parametric_quality() const +{ /* %TRACE% */ /* %TRACE% */ + const int nelem = 1; + const int nint = my_master_element.num_intg_pts(); + const int dim = spatial_dim(); + std::vector coords(my_num_nodes * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + double sub_quality = 0.; + + // load coords + int count = 0; + for ( int i = 0; i < my_num_nodes; i++ ) + { + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = my_coords[i][j]; + } + } + + // determinant at integration points + my_master_element.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double min_det_J = 0., sum_det_J = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + if ( ip == 0 || det_J[ip] < min_det_J ) + min_det_J = det_J[ip]; + sum_det_J += std::fabs( det_J[ip] ); + } + + if ( sum_det_J < std::pow(std::numeric_limits::epsilon(),1./dim) ) + sub_quality = 1.; // element too small to consider + else + sub_quality = min_det_J * nint / sum_det_J; + + return sub_quality; +} + +double +ContourSubElement::physical_quality() const +{ /* %TRACE% */ /* %TRACE% */ + const int nelem = 1; + const int nint = my_master_element.num_intg_pts(); + const int dim = spatial_dim(); + std::vector coords(my_num_nodes * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + double sub_quality = 0.; + + // load coords + int count = 0; + for ( int i = 0; i < my_num_nodes; i++ ) + { + const Vector3d phys_coords = my_owner->coordinates(my_coords[i]); + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = phys_coords[j]; + } + } + + // determinant at integration points + my_master_element.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double min_det_J = 0., sum_det_J = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + if ( ip == 0 || det_J[ip] < min_det_J ) + min_det_J = det_J[ip]; + sum_det_J += std::fabs( det_J[ip] ); + } + + if ( sum_det_J < std::pow(std::numeric_limits::epsilon(),1./dim) * std::pow(my_owner->length_scale(),1.*dim) ) + sub_quality = 1.; // element too small to consider + else + sub_quality = min_det_J * nint / sum_det_J; + + return sub_quality; +} + +double +ContourSubElement::side_quality(const int side) const +{ /* %TRACE% */ /* %TRACE% */ + const int nelem = 1; + const int nint = my_side_master_element.num_intg_pts(); + const stk::topology Top = topology(); + const stk::topology sideTop = Top.side_topology(side); + const int side_num_nodes = sideTop.num_nodes(); + const unsigned * const lnn = get_side_node_ordinals(Top, side); + const int dim = spatial_dim(); + std::vector coords(side_num_nodes * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + double quality = 0.; + + // load coords on side + int count = 0; + for ( int i = 0; i < side_num_nodes; i++ ) + { + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = my_coords[lnn[i]][j]; + } + } + + // determinant at integration points + my_side_master_element.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double min_det_J = 0., sum_det_J = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + if ( ip == 0 || det_J[ip] < min_det_J ) + min_det_J = det_J[ip]; + sum_det_J += std::fabs( det_J[ip] ); + } + + if ( sum_det_J < std::pow(std::numeric_limits::epsilon(),1./dim) ) + quality = 1.; // element too small to consider + else + quality = min_det_J * nint / sum_det_J; + + return quality; +} + +double +ContourSubElement::find_quadratic_crossing( double d0, + double d1, + double d2 ) +{ /* %TRACE% */ /* %TRACE% */ + const double epsilon = std::numeric_limits::epsilon()*std::sqrt(d0*d0 + d1*d1 + d2*d2); + if ( std::fabs(d0) < epsilon ) return 0.0; + if ( std::fabs(d1) < epsilon ) return 1.0; + if ( std::fabs(d2) < epsilon ) return 0.5; + + ThrowAssert(d0*d1 < 0.0 && (d0*d2 < 0.0 || d1*d2 < 0.0)); // Insist on one and only one crossing + + const double a = 2.0*(d0 - 2.0*d2 + d1); + const double b = -3.0*d0 - d1 + 4.0*d2; + const double c = d0; + const int sign_b = ( b < 0.0 ) ? -1 : 1; + const double q = -0.5*(b + sign_b*std::sqrt(b*b-4.0*a*c)); + + const int sign_a = ( a < 0.0 ) ? -1 : 1; + + if (q*sign_a > 0.0 && q*sign_a < a*sign_a) + { + ThrowAssert(!(c*(( q < 0.0 ) ? -1 : 1) > 0.0 && c*(( q < 0.0 ) ? -1 : 1) < q*(( q < 0.0 ) ? -1 : 1))); // Insist on only one crossing + return (q/a); + } + else + { + ThrowAssert(c*(( q < 0.0 ) ? -1 : 1) > 0.0 && c*(( q < 0.0 ) ? -1 : 1) < q*(( q < 0.0 ) ? -1 : 1)); + return (c/q); + } +} + +ContourSubElement_Quad_4::ContourSubElement_Quad_4( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ) + : ContourSubElement( stk::topology::QUADRILATERAL_4_2D, + coords, + side_ids, + in_owner, + 0, /* in_subelement_depth*/ + 0 /* subelement_sign=0 for now, correct this below if this element is entirely on one side */ ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + non_conformal_decomposition(); +} + +int +ContourSubElement_Quad_4::non_conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + + // create 4, 3-noded, adaptive triangles + my_subelements.reserve(4); + ContourSubElement *sub = NULL; + PointVec sub_coords(3,Vector3d::ZERO); + std::vector sub_ids(3); + + Vector3d center = 0.25*(my_coords[0]+my_coords[1]+my_coords[2]+my_coords[3]); + + // triangle #1 + sub_coords[0] = my_coords[0]; + sub_coords[1] = my_coords[1]; + sub_coords[2] = center; + sub_ids[0] = my_side_ids[0]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #2 + sub_coords[0] = my_coords[1]; + sub_coords[1] = my_coords[2]; + sub_coords[2] = center; + sub_ids[0] = my_side_ids[1]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #3 + sub_coords[0] = my_coords[2]; + sub_coords[1] = my_coords[3]; + sub_ids[0] = my_side_ids[2]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #4 + sub_coords[0] = my_coords[3]; + sub_coords[1] = my_coords[0]; + sub_coords[2] = center; + sub_ids[0] = my_side_ids[3]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + return success; +} + +ContourSubElement_Quad_9::ContourSubElement_Quad_9( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement *in_owner ) + : ContourSubElement( stk::topology::QUADRILATERAL_9_2D, + coords, + side_ids, + in_owner, + 0, /* in_subelement_depth*/ + 0 /* subelement_sign=0 for now, correct this below if this element is entirely on one side */ ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + non_conformal_decomposition(); +} + +int +ContourSubElement_Quad_9::non_conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + + // create 4, 3-noded, adaptive triangles + my_subelements.reserve(4); + ContourSubElement *sub = NULL; + PointVec sub_coords(3,Vector3d::ZERO); + std::vector sub_ids(3); + + // triangle #1 + sub_coords[0] = my_coords[0]; + sub_coords[1] = my_coords[1]; + sub_coords[2] = my_coords[8]; + sub_ids[0] = my_side_ids[0]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #2 + sub_coords[0] = my_coords[1]; + sub_coords[1] = my_coords[2]; + sub_coords[2] = my_coords[8]; + sub_ids[0] = my_side_ids[1]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #3 + sub_coords[0] = my_coords[2]; + sub_coords[1] = my_coords[3]; + sub_coords[2] = my_coords[8]; + sub_ids[0] = my_side_ids[2]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // triangle #4 + sub_coords[0] = my_coords[3]; + sub_coords[1] = my_coords[0]; + sub_coords[2] = my_coords[8]; + sub_ids[0] = my_side_ids[3]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + return success; +} + +ContourSubElement_Tri_3::ContourSubElement_Tri_3( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth, + const int subelement_sign ) + : ContourSubElement( stk::topology::TRIANGLE_3_2D, + coords, + side_ids, + in_owner, + in_subelement_depth, + subelement_sign ) +{ /* %TRACE% */ /* %TRACE% */ + // if this is a conformal element, return quickly + if ( subelement_sign != 0 ) + { + return; + } + + // snap to mesh + for (int n = 0; n < 3; ++n) + { + if (std::fabs(my_dist[n]) < my_owner->edge_linear_tolerance() * my_owner->length_scale() ) + { + my_dist[n] = 0.0; + } + } + + // see if there is a crossing + bool have_crossing = false; + for ( int i = 1; i < my_num_nodes; i++ ) + { + if ( LevelSet::sign_change(my_dist[0], my_dist[i]) ) have_crossing = true; + } + + if ( have_crossing ) + { + // attempt conformal decomposition + int success = conformal_decomposition(); + ThrowErrorMsgIf(!success, " Conformal decomposition failed.\n"); + } + else + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + } +} + +int +ContourSubElement_Tri_3::conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + + // create 4 conforming triangular subelements + + // create 4, 3-noded tris + my_subelements.clear(); + my_subelements.reserve(4); + ContourSubElement *sub = NULL; + PointVec sub_coords(3,Vector3d::ZERO); + + // For any edge with a crossing, we will move the + // mid side node for that egdge to the crossing + // we will keep the modified locations of the nodes + // in a local vector of nodes (lcoords). + // We will also create local vectors for the distance and side_ids + // so that we can reorient the tri as discussed below. + PointVec lcoords = my_coords; + lcoords.resize(6,Vector3d::ZERO); + std::vector sub_ids(3); + std::vector is_on_surf(6); // initializes to 0 (false) + int sub_sign; + std::vector edge_node_ids(6); + + // find edge crossings + edge_node_ids[0] = 0; + edge_node_ids[1] = 1; + edge_node_ids[2] = 2; + edge_node_ids[3] = process_edge( 0, 1, 3, is_on_surf, lcoords, my_dist ); + edge_node_ids[4] = process_edge( 1, 2, 4, is_on_surf, lcoords, my_dist ); + edge_node_ids[5] = process_edge( 2, 0, 5, is_on_surf, lcoords, my_dist ); + + const int zero_sign = LevelSet::sign(0.0); + std::vector sub_degenerate(4); // initializes to zero (false) + + sub_degenerate[0] = is_degenerate(edge_node_ids,0,3,5); + sub_degenerate[1] = is_degenerate(edge_node_ids,3,1,4); + sub_degenerate[2] = is_degenerate(edge_node_ids,5,4,2); + sub_degenerate[3] = is_degenerate(edge_node_ids,3,4,5); + + // tri #1 + if (!sub_degenerate[0]) + { + sub_coords[0] = lcoords[0]; + sub_coords[1] = lcoords[3]; + sub_coords[2] = lcoords[5]; + sub_sign = LevelSet::sign(my_dist[0]); + sub_ids[0] = my_side_ids[0]; + sub_ids[1] = ((is_on_surf[3] && is_on_surf[5]) && (zero_sign != sub_sign || sub_degenerate[3])) ? -2 : -1; + sub_ids[2] = my_side_ids[2]; + sub = new ContourSubElement_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tri #2 + if (!sub_degenerate[1]) + { + sub_coords[0] = lcoords[3]; + sub_coords[1] = lcoords[1]; + sub_coords[2] = lcoords[4]; + sub_sign = LevelSet::sign(my_dist[1]); + sub_ids[0] = my_side_ids[0]; + sub_ids[1] = my_side_ids[1]; + sub_ids[2] = ((is_on_surf[3] && is_on_surf[4]) && (zero_sign != sub_sign || sub_degenerate[3])) ? -2 : -1; + sub = new ContourSubElement_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tri #3 + if (!sub_degenerate[2]) + { + sub_coords[0] = lcoords[5]; + sub_coords[1] = lcoords[4]; + sub_coords[2] = lcoords[2]; + sub_sign = LevelSet::sign(my_dist[2]); + sub_ids[0] = ((is_on_surf[5] && is_on_surf[4]) && (zero_sign != sub_sign || sub_degenerate[3])) ? -2 : -1; + sub_ids[1] = my_side_ids[1]; + sub_ids[2] = my_side_ids[2]; + sub = new ContourSubElement_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tri #4 + if (!sub_degenerate[3]) + { + sub_coords[0] = lcoords[3]; + sub_coords[1] = lcoords[4]; + sub_coords[2] = lcoords[5]; + sub_sign = LevelSet::sign( (is_on_surf[3] ? 0.0 : my_dist[0]+my_dist[1]) + + (is_on_surf[4] ? 0.0 : my_dist[1]+my_dist[2]) + + (is_on_surf[5] ? 0.0 : my_dist[2]+my_dist[0]) ); + sub_ids[0] = ((is_on_surf[3] && is_on_surf[4]) && (zero_sign != sub_sign || sub_degenerate[1])) ? -2 : -1; + sub_ids[1] = ((is_on_surf[4] && is_on_surf[5]) && (zero_sign != sub_sign || sub_degenerate[2])) ? -2 : -1; + sub_ids[2] = ((is_on_surf[5] && is_on_surf[3]) && (zero_sign != sub_sign || sub_degenerate[0])) ? -2 : -1; + sub = new ContourSubElement_Tri_3( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // check quality of subelements + // Here we assume that the linear tri is always decomposed into reasonable quality sub-tris + int success = true; + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + for ( unsigned i=0; iphysical_quality() < 0.0 ) + { + krinolog << "low quality subelement: " << i << "\n" + << *my_subelements[i] << "\n" + << "parent:" << "\n" + << *this << "\n"; + } + } + } + + return success; +} + +int +ContourSubElement_Tri_3::process_edge( const int i0, + const int i1, + const int i2, + std::vector & is_on_surf, + PointVec & lcoords, + const std::vector & ldist ) +{ /* %TRACE% */ /* %TRACE% */ + int edge_node_id = i2; + is_on_surf[i2] = LevelSet::sign_change( ldist[i0], ldist[i1] ); + if ( is_on_surf[i2] ) + { + // tolerance chosen very small since degeneracies should already be eliminated + const double tol = std::numeric_limits::epsilon(); + + const double d0 = std::fabs(ldist[i0]); + const double d1 = std::fabs(ldist[i1]); + + // make calculation completely symmetric + if (d0 < d1) + { + const double alpha = my_owner->dist_is_linear() ? d0/(d0+d1) : find_quadratic_crossing(ldist[i0],ldist[i1],my_owner->distance(0.5*(lcoords[i0]+lcoords[i1]))); + if (alpha < tol) + { + edge_node_id = i0; + lcoords[i2] = lcoords[edge_node_id]; + } + else + { + lcoords[i2] = (1.-alpha) * lcoords[i0] + alpha * lcoords[i1]; + } + } + else + { + const double alpha = my_owner->dist_is_linear() ? d1/(d1+d0) : find_quadratic_crossing(ldist[i1],ldist[i0],my_owner->distance(0.5*(lcoords[i1]+lcoords[i0]))); + if (alpha < tol) + { + edge_node_id = i1; + lcoords[i2] = lcoords[edge_node_id]; + } + else + { + lcoords[i2] = (1.-alpha) * lcoords[i1] + alpha * lcoords[i0]; + } + } + } + else + { + // eliminate side node by sliding to one end or the other + const double d0 = std::fabs(ldist[i0]); + const double d1 = std::fabs(ldist[i1]); + const double epsilon = std::sqrt(std::numeric_limits::epsilon()) * (d0 + d1); + + if ( d0 > d1 + epsilon ) + { + edge_node_id = i0; + } + else if ( d1 > d0 + epsilon ) + { + edge_node_id = i1; + } + else + { + // tie breaker + const Vector3d phys0 = my_owner->coordinates(lcoords[i0]); + const Vector3d phys1 = my_owner->coordinates(lcoords[i1]); + + if ( is_more(phys1,phys0) ) + { + edge_node_id = i0; + } + else + { + edge_node_id = i1; + } + } + lcoords[i2] = lcoords[edge_node_id]; + } + return edge_node_id; +} + +bool +ContourSubElement_Tri_3::is_degenerate( const std::vector & edge_node_ids, + const int i0, const int i1, const int i2 ) +{ /* %TRACE% */ /* %TRACE% */ + + // DRN: This is really ugly, hand-optimized code for looking for degenerate tris + // Basically, it checks if any of the edges are degenerate. Then it has to look for + // the entire tri being degerate because it consists of 3 colinear points. + // This is handled by checking against the 3 specific bad cases. + + if ( edge_node_ids[i0] == edge_node_ids[i1] || + edge_node_ids[i0] == edge_node_ids[i2] || + edge_node_ids[i1] == edge_node_ids[i2] ) + { + // this tri is degenerate with two coincident nodes + return true; + } + + if ( edge_node_ids[i0]==i0 && + edge_node_ids[i1]==i1 && + edge_node_ids[i2]==i2 ) + { + // this tri is not degenerate since is has no degenerate nodes + return false; + } + + // look for a colinear triangle + std::vector is_used(6); // initializes to zero (false); + is_used[edge_node_ids[i0]] = true; + is_used[edge_node_ids[i1]] = true; + is_used[edge_node_ids[i2]] = true; + + if ((is_used[0] && ((is_used[1] && is_used[3]) || (is_used[2] && is_used[5]))) || + (is_used[1] && is_used[2] && is_used[4])) + { + // this tri is colinear + return true; + } + + return false; +} + +int +ContourSubElement_Tri_3::side_facets( Faceted_Surface & facets, + int side ) const +{ /* %TRACE% */ /* %TRACE% */ + ThrowAssert( my_side_ids[side] == -2 ); + + // just one linear facet per side + const int num_facets = 1; + + const unsigned * const lnn = get_side_node_ordinals(topology(), side); + + if ( LevelSet::sign_change(0.0, (double) my_sign) ) + { + std::unique_ptr facet = std::make_unique( my_owner->coordinates(my_coords[lnn[0]]), my_owner->coordinates(my_coords[lnn[1]]) ); + facets.add( std::move(facet) ); + } + else + { + std::unique_ptr facet = std::make_unique( my_owner->coordinates(my_coords[lnn[1]]), my_owner->coordinates(my_coords[lnn[0]]) ); + facets.add( std::move(facet) ); + } + + return( num_facets ); +} + +const int ContourSubElement_Adaptive_Tri_3::MAX_REFINMENT_LEVELS = 6; + +ContourSubElement_Adaptive_Tri_3::ContourSubElement_Adaptive_Tri_3( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth ) + : ContourSubElement( stk::topology::TRIANGLE_3_2D, + coords, + side_ids, + in_owner, + in_subelement_depth, + 0 ) +{ /* %TRACE% */ /* %TRACE% */ + my_edge_age.resize(3); // initializes to zero + non_conformal_decomposition(); +} + +ContourSubElement_Adaptive_Tri_3::ContourSubElement_Adaptive_Tri_3( + const PointVec & coords, + const std::vector & side_ids, + const std::vector & edge_age, + const ContourElement * in_owner, + const int in_subelement_depth ) + : ContourSubElement( stk::topology::TRIANGLE_3_2D, + coords, + side_ids, + in_owner, + in_subelement_depth, + 0 ) +{ /* %TRACE% */ /* %TRACE% */ + my_edge_age = edge_age; + non_conformal_decomposition(); +} + +int +ContourSubElement_Adaptive_Tri_3::non_conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return success; + } + + int longest_bad_edge = -1; + + // use temporary storage for vertex and side nodes + PointVec lcoords = my_coords; + lcoords.resize(6,Vector3d::ZERO); + lcoords[3] = 0.5 * (my_coords[0] + my_coords[1]); + lcoords[4] = 0.5 * (my_coords[1] + my_coords[2]); + lcoords[5] = 0.5 * (my_coords[2] + my_coords[0]); + + PointVec lphyscoords(6); + for (int n = 0; n < 6; ++n) + { + lphyscoords[n] = my_owner->coordinates( lcoords[n] ); + } + + std::vector ldist = my_dist; + ldist.resize(6); + for (int n = 3; n < 6; ++n) + { + ldist[n] = my_owner->distance( lcoords[n] ); + } + + const stk::topology Top = stk::topology::TRIANGLE_6_2D; + int num_edges = Top.num_edges(); + + std::vector bad_edges; + bad_edges.reserve(num_edges); + + std::vector edge_lengths(num_edges); + + for ( int edge = 0; edge < num_edges; edge++ ) + { + const unsigned * const lnn = get_edge_node_ordinals(Top, edge); + + ThrowAssert(Top.edge_topology(edge).num_nodes() == 3); + + const double edge_straight_length = (lphyscoords[lnn[0]] - lphyscoords[lnn[1]]).length(); + ThrowRequire(edge_straight_length > 0.0); + edge_lengths[edge] = edge_straight_length; + + const double edge_curve_error = (lphyscoords[lnn[2]] - 0.5*(lphyscoords[lnn[0]] + lphyscoords[lnn[1]])).length(); + + const double edge_dist_error = std::fabs(ldist[lnn[2]] - 0.5*(ldist[lnn[0]]+ldist[lnn[1]])); + + const double scale = std::min(std::sqrt(std::numeric_limits::max()),std::fabs(ldist[lnn[0]]) + std::fabs(ldist[lnn[1]]) + my_owner->length_scale()); + + const double edge_error = (edge_curve_error + edge_dist_error)*edge_straight_length/(scale*scale); + + if (edge_error > my_owner->edge_nonlinear_tolerance() && my_edge_age[edge] < MAX_REFINMENT_LEVELS) + { + bad_edges.push_back(edge); + } + } + + double max_length = 0.0; + for (auto edge : bad_edges) + { + const double edge_length = edge_lengths[edge]; + ThrowRequire(edge_length > 0.0); + + // we need an absolute mechanism for selecting the edge to bisect so that all elements that share + // common edges will make the same decisions + if (utility::is_more(edge_length,max_length)) + { + longest_bad_edge = edge; + max_length = edge_length; + } + else if (!utility::is_less(edge_length,max_length)) // tie breaker + { + const Vector3d & edge_midside_coords = lphyscoords[get_edge_node_ordinals(Top, edge)[2]]; + // note that it is safe to assume that longest_bad_edge is already assigned if edge_length == max_length + const Vector3d longest_edge_midside_coords = lphyscoords[get_edge_node_ordinals(Top, longest_bad_edge)[2]]; + + ThrowAssert((utility::is_not_equal(edge_midside_coords[0],longest_edge_midside_coords[0]) || + utility::is_not_equal(edge_midside_coords[1],longest_edge_midside_coords[1]))); + + if (utility::is_more(edge_midside_coords[0],longest_edge_midside_coords[0]) || + (!utility::is_less(edge_midside_coords[0],longest_edge_midside_coords[0]) && + (utility::is_more(edge_midside_coords[1],longest_edge_midside_coords[1])))) + { + longest_bad_edge = edge; + max_length = edge_length; + } + } + } + + if ( longest_bad_edge == -1 ) + { + // no bad edges + + // use a single nonconformal linear tet subelement + my_subelements.clear(); + my_subelements.reserve(1); + + ContourSubElement *sub = new ContourSubElement_Tri_3( my_coords, my_side_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + } + else + { + // + // create 2, adaptive, 3-noded triangles by cutting the longest_bad_edge + // + + my_subelements.clear(); + my_subelements.reserve(2); + ContourSubElement *sub = NULL; + PointVec sub_coords(3,Vector3d::ZERO); + std::vector sub_ids(3); + std::vector sub_edge_age(3); + + static const unsigned permute_0[] = { 0,1,2 }; + static const unsigned permute_1[] = { 1,2,0 }; + static const unsigned permute_2[] = { 2,0,1 }; + static const unsigned * permute_table[] = { permute_0, permute_1, permute_2 }; + + const unsigned * lnn = permute_table[longest_bad_edge]; + const unsigned * lsn = lnn; // side permutation mirrors node permutation + + const Vector3d edge_node = 0.5 * (my_coords[lnn[0]] + my_coords[lnn[1]]); + + // tri #1 + sub_coords[0] = my_coords[lnn[0]]; + sub_coords[1] = edge_node; + sub_coords[2] = my_coords[lnn[2]]; + sub_ids[0] = my_side_ids[lsn[0]]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = my_side_ids[lsn[2]]; + sub_edge_age[0] = my_edge_age[lsn[0]]+1; + sub_edge_age[1] = my_edge_age[lsn[0]]+1; + sub_edge_age[2] = my_edge_age[lsn[2]]; + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, sub_edge_age, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tri #2 + sub_coords[0] = edge_node; + sub_coords[1] = my_coords[lnn[1]]; + sub_coords[2] = my_coords[lnn[2]]; + sub_ids[0] = my_side_ids[lsn[0]]; + sub_ids[1] = my_side_ids[lsn[1]]; + sub_edge_age[0] = my_edge_age[lsn[0]]+1; + sub_edge_age[1] = my_edge_age[lsn[1]]; + sub_edge_age[2] = my_edge_age[lsn[0]]+1; + sub_ids[2] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, sub_ids, sub_edge_age, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + } + + return success; +} + +ContourSubElement_Tri_6::ContourSubElement_Tri_6( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth, + const int subelement_sign ) + : ContourSubElement( stk::topology::TRIANGLE_6_2D, + coords, + side_ids, + in_owner, + in_subelement_depth, + subelement_sign ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + // use a single non-conformal, adaptive 4-noded tet + my_subelements.clear(); + my_subelements.reserve(1); + ContourSubElement *sub = NULL; + PointVec sub_coords(3,Vector3d::ZERO); + + sub_coords[0] = my_coords[0]; + sub_coords[1] = my_coords[1]; + sub_coords[2] = my_coords[2]; + + sub = new ContourSubElement_Adaptive_Tri_3( sub_coords, my_side_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); +} + +ContourSubElement_Hex_8::ContourSubElement_Hex_8( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ) + : ContourSubElement( stk::topology::HEXAHEDRON_8, + coords, + side_ids, + in_owner, + 0, /* in_subelement_depth*/ + 0 /* subelement_sign=0 for now, correct this below if this element is entirely on one side */ ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + // create 24, 4-noded, adaptive tetrahedra + my_subelements.reserve(24); + + // Conceptually, hex is broken into 6 prisms, with the + // bases of the prisms corresponding to a face of the hex. + int success = true; // optimism + for ( int face = 0; face < 6 && success; ++face ) + { + success &= subpyramid_non_conformal_decomposition( face ); + } +} + +int +ContourSubElement_Hex_8::subpyramid_non_conformal_decomposition( const int face ) +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + std::vector sub_ids(4); + + static const unsigned face_0[] = { 0,1,5,4 }; + static const unsigned face_1[] = { 1,2,6,5 }; + static const unsigned face_2[] = { 2,3,7,6 }; + static const unsigned face_3[] = { 0,4,7,3 }; + static const unsigned face_4[] = { 0,3,2,1 }; + static const unsigned face_5[] = { 4,5,6,7 }; + + static const unsigned * face_table[] = { face_0 , face_1 , face_2 , face_3 , face_4 , face_5 }; + + const unsigned * lnn = face_table[face]; + + // + // create 4, 4-noded adaptive tetrahedra + // + // The advantage of 4 tets per face over 2 tets per face is that all corners + // will be bisected. This eliminates some of the pathologies that occur when + // 3 nodes have the same value while the 4th node on the face has a different + // sign. Note that this problem can be mitigated, however, if the non-conformal + // refinement of the sub-tets will do longest edge bisection rather than the + // self-similar 8 subtet refinement. + + Vector3d vol_center = 0.125*(my_coords[0]+my_coords[1]+my_coords[2]+my_coords[3]+ + my_coords[4]+my_coords[5]+my_coords[6]+my_coords[7]); + Vector3d face_center = 0.25*(my_coords[lnn[0]]+my_coords[lnn[1]]+my_coords[lnn[2]]+my_coords[lnn[3]]); + + // tet #1 + sub_coords[0] = my_coords[lnn[0]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[1]]; + sub_coords[3] = vol_center; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #2 + sub_coords[0] = my_coords[lnn[1]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[2]]; + sub_coords[3] = vol_center; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #3 + sub_coords[0] = my_coords[lnn[2]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[3]]; + sub_coords[3] = vol_center; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #4 + sub_coords[0] = my_coords[lnn[3]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[0]]; + sub_coords[3] = vol_center; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + return success; +} + +ContourSubElement_Hex_27::ContourSubElement_Hex_27( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ) + : ContourSubElement( stk::topology::HEXAHEDRON_27, + coords, + side_ids, + in_owner, + 0, /* in_subelement_depth*/ + 0 /* subelement_sign=0 for now, correct this below if this element is entirely on one side */ ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + // create 24, 4-noded, adaptive tetrahedra + my_subelements.reserve(24); + + // Conceptually, hex is broken into 6 prisms, with the + // bases of the prisms corresponding to a face of the hex. + int success = true; // optimism + for ( int face = 0; face < 6 && success; ++face ) + { + success &= subpyramid_non_conformal_decomposition( face ); + } +} + +int +ContourSubElement_Hex_27::subpyramid_non_conformal_decomposition( const int face ) +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + std::vector sub_ids(4); + + static const unsigned face_0[] = { 0,1,5,4, 25 }; + static const unsigned face_1[] = { 1,2,6,5, 24 }; + static const unsigned face_2[] = { 2,3,7,6, 26 }; + static const unsigned face_3[] = { 0,4,7,3, 23 }; + static const unsigned face_4[] = { 0,3,2,1, 21 }; + static const unsigned face_5[] = { 4,5,6,7, 22 }; + + static const unsigned * face_table[] = { face_0 , face_1 , face_2 , face_3 , face_4 , face_5 }; + + const unsigned * lnn = face_table[face]; + + // + // create 4, 4-noded adaptive tetrahedra + // + // The advantage of 4 tets per face over 2 tets per face is that all corners + // will be bisected. This eliminates some of the pathologies that occur when + // 3 nodes have the same value while the 4th node on the face has a different + // sign. Note that this problem can be mitigated, however, if the non-conformal + // refinement of the sub-tets will do longest edge bisection rather than the + // self-similar 8 subtet refinement. + + // tet #1 + sub_coords[0] = my_coords[lnn[0]]; + sub_coords[1] = my_coords[lnn[4]]; + sub_coords[2] = my_coords[lnn[1]]; + sub_coords[3] = my_coords[20]; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #2 + sub_coords[0] = my_coords[lnn[1]]; + sub_coords[1] = my_coords[lnn[4]]; + sub_coords[2] = my_coords[lnn[2]]; + sub_coords[3] = my_coords[20]; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #3 + sub_coords[0] = my_coords[lnn[2]]; + sub_coords[1] = my_coords[lnn[4]]; + sub_coords[2] = my_coords[lnn[3]]; + sub_coords[3] = my_coords[20]; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #4 + sub_coords[0] = my_coords[lnn[3]]; + sub_coords[1] = my_coords[lnn[4]]; + sub_coords[2] = my_coords[lnn[0]]; + sub_coords[3] = my_coords[20]; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + return success; +} + +ContourSubElement_Wedge_6::ContourSubElement_Wedge_6( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ) + : ContourSubElement( stk::topology::WEDGE_6, + coords, + side_ids, + in_owner, + 0, /* in_subelement_depth*/ + 0 /* subelement_sign=0 for now, correct this below if this element is entirely on one side */ ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + // create 12, 4-noded, adaptive tetrahedra + my_subelements.reserve(12); + + int success = true; // optimism + for ( int face = 0; face < 3 && success; ++face ) + { + success &= subpyramid_non_conformal_decomposition( face ); + } +} + +int +ContourSubElement_Wedge_6::subpyramid_non_conformal_decomposition( const int face ) +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + std::vector sub_ids(4); + + static const unsigned face_0[] = {0, 1, 4, 3}; + static const unsigned face_1[] = {1, 2, 5, 4}; + static const unsigned face_2[] = {0, 3, 5, 2}; + static const unsigned * face_table[] = { face_0 , face_1 , face_2 }; + + const unsigned * lnn = face_table[face]; + + // + // create 4, 4-noded adaptive tetrahedra + // + // The advantage of 4 tets per face over 2 tets per face is that all corners + // will be bisected. This eliminates some of the pathologies that occur when + // 3 nodes have the same value while the 4th node on the face has a different + // sign. Note that this problem can be mitigated, however, if the non-conformal + // refinement of the sub-tets will do longest edge bisection rather than the + // self-similar 8 subtet refinement. + + // Not guaranteed to be within a highly deformed wedge + const Vector3d centroid = (my_coords[0]+my_coords[1]+my_coords[2]+my_coords[3]+my_coords[4]+my_coords[5])/6.; + const Vector3d face_center = 0.25*(my_coords[lnn[0]]+my_coords[lnn[1]]+my_coords[lnn[2]]+my_coords[lnn[3]]); + + // tet #1 + sub_coords[0] = my_coords[lnn[0]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[1]]; + sub_coords[3] = centroid; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #2 + sub_coords[0] = my_coords[lnn[1]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[2]]; + sub_coords[3] = centroid; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #3 + sub_coords[0] = my_coords[lnn[2]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[3]]; + sub_coords[3] = centroid; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #4 + sub_coords[0] = my_coords[lnn[3]]; + sub_coords[1] = face_center; + sub_coords[2] = my_coords[lnn[0]]; + sub_coords[3] = centroid; + sub_ids[0] = my_side_ids[face]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = -1; /* not on any parent side */ + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + return success; +} + +ContourSubElement_Tet_4::ContourSubElement_Tet_4( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth, + const int subelement_sign ) + : ContourSubElement( stk::topology::TETRAHEDRON_4, + coords, + side_ids, + in_owner, + in_subelement_depth, + subelement_sign ) +{ /* %TRACE% */ /* %TRACE% */ + // if this is a conformal element, return quickly + if ( subelement_sign != 0 ) + { + return; + } + + // snap to mesh + for (int n = 0; n < 4; ++n) + { + if (std::fabs(my_dist[n]) < my_owner->edge_linear_tolerance() * my_owner->length_scale()) + { + my_dist[n] = 0.0; + } + } + + // see if there is a crossing + bool have_crossing = false; + for ( int i = 1; i < my_num_nodes; i++ ) + { + if ( LevelSet::sign_change(my_dist[0], my_dist[i]) ) have_crossing = true; + } + + if ( have_crossing ) + { + // attempt conformal decomposition + int success = conformal_decomposition(); + ThrowErrorMsgIf(!success, " Conformal decomposition failed.\n"); + } + else + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + } +} + +int +ContourSubElement_Tet_4::conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + + // attempt to create 8 conforming tetrahedral subelements + // This attempt may unsuccessful if the resulting subelements + // are of poor quality + int success = true; // optimism + + // create 8, 4-noded tets + my_subelements.clear(); + my_subelements.reserve(8); + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + + // For any edge with a crossing, we will move the + // mid side node for that egdge to the crossing + // we will keep the modified locations of the nodes + // in a local vector of nodes (lcoords). + // We will also create local vectors for the distance and side_ids + // so that we can reorient the tet as discussed below. + PointVec lcoords = my_coords; + lcoords.resize(10,Vector3d::ZERO); + std::vector lsides = my_side_ids; + std::vector ldist = my_dist; + std::vector sub_ids(4); + std::vector is_on_surf(10); // initializes to 0 (false) + int sub_sign; + + // Find orientation of tet + // Specifically, orient such that we don't have nodes 0 and 2 on one side and + // nodes 1 and 3 on the other + if ( LevelSet::sign_change(my_dist[0],my_dist[1]) && + LevelSet::sign_change(my_dist[1],my_dist[2]) && + LevelSet::sign_change(my_dist[2],my_dist[3]) ) + { + lcoords[0] = my_coords[0]; + lcoords[1] = my_coords[3]; + lcoords[2] = my_coords[1]; + lcoords[3] = my_coords[2]; + ldist[0] = my_dist[0]; + ldist[1] = my_dist[3]; + ldist[2] = my_dist[1]; + ldist[3] = my_dist[2]; + lsides[0] = my_side_ids[2]; + lsides[1] = my_side_ids[1]; + lsides[2] = my_side_ids[3]; + lsides[3] = my_side_ids[0]; + } + + std::vector edge_node_ids(10); + edge_node_ids[0] = 0; + edge_node_ids[1] = 1; + edge_node_ids[2] = 2; + edge_node_ids[3] = 3; + edge_node_ids[4] = process_edge( 0, 1, 4, is_on_surf, lcoords, ldist ); + edge_node_ids[5] = process_edge( 1, 2, 5, is_on_surf, lcoords, ldist ); + edge_node_ids[6] = process_edge( 2, 0, 6, is_on_surf, lcoords, ldist ); + edge_node_ids[7] = process_edge( 0, 3, 7, is_on_surf, lcoords, ldist ); + edge_node_ids[8] = process_edge( 1, 3, 8, is_on_surf, lcoords, ldist ); + edge_node_ids[9] = process_edge( 2, 3, 9, is_on_surf, lcoords, ldist ); + + const int zero_sign = LevelSet::sign(0.0); + std::vector sub_degenerate(8); // initializes to zero (false) + + sub_degenerate[0] = is_degenerate(edge_node_ids,0,4,6,7); + sub_degenerate[1] = is_degenerate(edge_node_ids,4,1,5,8); + sub_degenerate[2] = is_degenerate(edge_node_ids,6,5,2,9); + sub_degenerate[3] = is_degenerate(edge_node_ids,7,8,9,3); + sub_degenerate[4] = is_degenerate(edge_node_ids,8,7,6,4); + sub_degenerate[5] = is_degenerate(edge_node_ids,6,9,8,5); + sub_degenerate[6] = is_degenerate(edge_node_ids,9,8,7,6); + sub_degenerate[7] = is_degenerate(edge_node_ids,5,6,4,8); + + // tet #1 + if (!sub_degenerate[0]) + { + sub_coords[0] = lcoords[0]; + sub_coords[1] = lcoords[4]; + sub_coords[2] = lcoords[6]; + sub_coords[3] = lcoords[7]; + sub_sign = LevelSet::sign(ldist[0]); + sub_ids[0] = lsides[0]; + sub_ids[1] = ((is_on_surf[4] && is_on_surf[6] && is_on_surf[7]) && (zero_sign != sub_sign || sub_degenerate[4])) ? -2 : -1; + sub_ids[2] = lsides[2]; + sub_ids[3] = lsides[3]; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #2 + if (!sub_degenerate[1]) + { + sub_coords[0] = lcoords[4]; + sub_coords[1] = lcoords[1]; + sub_coords[2] = lcoords[5]; + sub_coords[3] = lcoords[8]; + sub_sign = LevelSet::sign(ldist[1]); + sub_ids[0] = lsides[0]; + sub_ids[1] = lsides[1]; + sub_ids[2] = ((is_on_surf[4] && is_on_surf[5] && is_on_surf[8]) && (zero_sign != sub_sign || sub_degenerate[7])) ? -2 : -1; + sub_ids[3] = lsides[3]; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #3 + if (!sub_degenerate[2]) + { + sub_coords[0] = lcoords[6]; + sub_coords[1] = lcoords[5]; + sub_coords[2] = lcoords[2]; + sub_coords[3] = lcoords[9]; + sub_sign = LevelSet::sign(ldist[2]); + sub_ids[0] = ((is_on_surf[5] && is_on_surf[6] && is_on_surf[9]) && (zero_sign != sub_sign || sub_degenerate[5])) ? -2 : -1; + sub_ids[1] = lsides[1]; + sub_ids[2] = lsides[2]; + sub_ids[3] = lsides[3]; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #4 + if (!sub_degenerate[3]) + { + sub_coords[0] = lcoords[7]; + sub_coords[1] = lcoords[8]; + sub_coords[2] = lcoords[9]; + sub_coords[3] = lcoords[3]; + sub_sign = LevelSet::sign(ldist[3]); + sub_ids[0] = lsides[0]; + sub_ids[1] = lsides[1]; + sub_ids[2] = lsides[2]; + sub_ids[3] = ((is_on_surf[7] && is_on_surf[8] && is_on_surf[9]) && (zero_sign != sub_sign || sub_degenerate[6])) ? -2 : -1; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #5 + if (!sub_degenerate[4]) + { + sub_coords[0] = lcoords[8]; + sub_coords[1] = lcoords[7]; + sub_coords[2] = lcoords[6]; + sub_coords[3] = lcoords[4]; + sub_sign = LevelSet::sign( (is_on_surf[8] ? 0.0 : ldist[1]+ldist[3]) + + (is_on_surf[7] ? 0.0 : ldist[0]+ldist[3]) + + (is_on_surf[6] ? 0.0 : ldist[0]+ldist[2]) + + (is_on_surf[4] ? 0.0 : ldist[0]+ldist[1]) ); + sub_ids[0] = lsides[0]; // 8-7-4 + sub_ids[1] = ((is_on_surf[7] && is_on_surf[6] && is_on_surf[4]) && (zero_sign != sub_sign || sub_degenerate[0])) ? -2 : -1; + sub_ids[2] = ((is_on_surf[8] && is_on_surf[6] && is_on_surf[4]) && (zero_sign != sub_sign || sub_degenerate[7])) ? -2 : -1; + sub_ids[3] = ((is_on_surf[8] && is_on_surf[7] && is_on_surf[6]) && (zero_sign != sub_sign || sub_degenerate[6])) ? -2 : -1; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #6 + if (!sub_degenerate[5]) + { + sub_coords[0] = lcoords[6]; + sub_coords[1] = lcoords[9]; + sub_coords[2] = lcoords[8]; + sub_coords[3] = lcoords[5]; + sub_sign = LevelSet::sign( (is_on_surf[6] ? 0.0 : ldist[0]+ldist[2]) + + (is_on_surf[9] ? 0.0 : ldist[2]+ldist[3]) + + (is_on_surf[8] ? 0.0 : ldist[1]+ldist[3]) + + (is_on_surf[5] ? 0.0 : ldist[1]+ldist[2]) ); + sub_ids[0] = ((is_on_surf[6] && is_on_surf[9] && is_on_surf[5]) && (zero_sign != sub_sign || sub_degenerate[2])) ? -2 : -1; + sub_ids[1] = lsides[1]; // 8-9-5 + sub_ids[2] = ((is_on_surf[6] && is_on_surf[8] && is_on_surf[5]) && (zero_sign != sub_sign || sub_degenerate[7])) ? -2 : -1; + sub_ids[3] = ((is_on_surf[6] && is_on_surf[9] && is_on_surf[8]) && (zero_sign != sub_sign || sub_degenerate[6])) ? -2 : -1; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #7 + if (!sub_degenerate[6]) + { + sub_coords[0] = lcoords[9]; + sub_coords[1] = lcoords[8]; + sub_coords[2] = lcoords[7]; + sub_coords[3] = lcoords[6]; + sub_sign = LevelSet::sign( (is_on_surf[9] ? 0.0 : ldist[2]+ldist[3]) + + (is_on_surf[8] ? 0.0 : ldist[1]+ldist[3]) + + (is_on_surf[7] ? 0.0 : ldist[0]+ldist[3]) + + (is_on_surf[6] ? 0.0 : ldist[0]+ldist[2]) ); + sub_ids[0] = ((is_on_surf[9] && is_on_surf[8] && is_on_surf[6]) && (zero_sign != sub_sign || sub_degenerate[5])) ? -2 : -1; + sub_ids[1] = ((is_on_surf[8] && is_on_surf[7] && is_on_surf[6]) && (zero_sign != sub_sign || sub_degenerate[4])) ? -2 : -1; + sub_ids[2] = lsides[2]; // 9-7-6 + sub_ids[3] = ((is_on_surf[9] && is_on_surf[8] && is_on_surf[7]) && (zero_sign != sub_sign || sub_degenerate[3])) ? -2 : -1; + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // tet #8 + if (!sub_degenerate[7]) + { + sub_coords[0] = lcoords[5]; + sub_coords[1] = lcoords[6]; + sub_coords[2] = lcoords[4]; + sub_coords[3] = lcoords[8]; + sub_sign = LevelSet::sign( (is_on_surf[5] ? 0.0 : ldist[1]+ldist[2]) + + (is_on_surf[6] ? 0.0 : ldist[0]+ldist[2]) + + (is_on_surf[4] ? 0.0 : ldist[0]+ldist[1]) + + (is_on_surf[8] ? 0.0 : ldist[1]+ldist[3]) ); + sub_ids[0] = ((is_on_surf[5] && is_on_surf[6] && is_on_surf[8]) && (zero_sign != sub_sign || sub_degenerate[5])) ? -2 : -1; + sub_ids[1] = ((is_on_surf[6] && is_on_surf[4] && is_on_surf[8]) && (zero_sign != sub_sign || sub_degenerate[4])) ? -2 : -1; + sub_ids[2] = ((is_on_surf[5] && is_on_surf[4] && is_on_surf[8]) && (zero_sign != sub_sign || sub_degenerate[1])) ? -2 : -1; + sub_ids[3] = lsides[3]; // 4-5-6 + sub = new ContourSubElement_Tet_4( sub_coords, sub_ids, my_owner, my_subelement_depth+1, sub_sign ); + my_subelements.push_back( sub ); + } + + // check quality of subelements + // Here we assume that the linear tet is always decomposed into reasonable quality sub-tets + success = true; + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + for ( unsigned i=0; iphysical_quality() < 0.0 ) + { + krinolog << "low quality subelement: " << i << "\n" + << *my_subelements[i] << "\n" + << "parent:" << "\n" + << *this << "\n"; + } + } + } + + return success; +} + +int +ContourSubElement_Tet_4::process_edge( const int i0, + const int i1, + const int i2, + std::vector & is_on_surf, + PointVec & lcoords, + const std::vector & ldist ) +{ /* %TRACE% */ /* %TRACE% */ + int edge_node_id = i2; + is_on_surf[i2] = LevelSet::sign_change( ldist[i0], ldist[i1] ); + if ( is_on_surf[i2] ) + { + // tolerance chosen very small since degeneracies should already be eliminated + const double tol = std::numeric_limits::epsilon(); + + const double d0 = std::fabs(ldist[i0]); + const double d1 = std::fabs(ldist[i1]); + + // make calculation completely symmetric + if (d0 < d1) + { + const double linear_alpha = d0/(d0+d1); + + if (linear_alpha < tol) + { + edge_node_id = i0; + lcoords[i2] = lcoords[edge_node_id]; + } + else + { + const double alpha = my_owner->dist_is_linear() ? linear_alpha : + find_quadratic_crossing(ldist[i0],ldist[i1],my_owner->distance(0.5*(lcoords[i0]+lcoords[i1]))); + lcoords[i2] = (1.-alpha) * lcoords[i0] + alpha * lcoords[i1]; + } + } + else + { + const double linear_alpha = d1/(d1+d0); + + if (linear_alpha < tol) + { + edge_node_id = i1; + lcoords[i2] = lcoords[edge_node_id]; + } + else + { + const double alpha = my_owner->dist_is_linear() ? linear_alpha : + find_quadratic_crossing(ldist[i1],ldist[i0],my_owner->distance(0.5*(lcoords[i1]+lcoords[i0]))); + lcoords[i2] = (1.-alpha) * lcoords[i1] + alpha * lcoords[i0]; + } + } + } + else + { + // eliminate side node by sliding to one end or the other + const double d0 = std::fabs(ldist[i0]); + const double d1 = std::fabs(ldist[i1]); + const double epsilon = std::sqrt(std::numeric_limits::epsilon()) * (d0 + d1); + + if ( d0 > d1 + epsilon ) + { + edge_node_id = i0; + } + else if ( d1 > d0 + epsilon ) + { + edge_node_id = i1; + } + else + { + // tie breaker + const Vector3d phys0 = my_owner->coordinates(lcoords[i0]); + const Vector3d phys1 = my_owner->coordinates(lcoords[i1]); + + if ( is_more(phys1,phys0) ) + { + edge_node_id = i0; + } + else + { + edge_node_id = i1; + } + } + lcoords[i2] = lcoords[edge_node_id]; + } + + return edge_node_id; +} + +bool +ContourSubElement_Tet_4::is_degenerate( const std::vector & edge_node_ids, + const int i0, const int i1, const int i2, const int i3 ) +{ /* %TRACE% */ /* %TRACE% */ + + // DRN: This is really ugly, hand-optimized code for looking for degenerate tets + // Basically, it checks if any of the edges are degenerate. Then it has to look for degenerate + // faces that consist of 3 colinear points. These are handled by checking against + // the 6 specific bad cases. + + if ( edge_node_ids[i0] == edge_node_ids[i1] || + edge_node_ids[i0] == edge_node_ids[i2] || + edge_node_ids[i0] == edge_node_ids[i3] || + edge_node_ids[i1] == edge_node_ids[i2] || + edge_node_ids[i1] == edge_node_ids[i3] || + edge_node_ids[i2] == edge_node_ids[i3] ) + { + // this tet is degenerate with two coincident nodes + return true; + } + + if ( edge_node_ids[i0]==i0 && + edge_node_ids[i1]==i1 && + edge_node_ids[i2]==i2 && + edge_node_ids[i3]==i3 ) + { + // this tet is not degenerate since is has no degenerate nodes + return false; + } + + // look for a colinear face + std::vector is_used(10); // initializes to zero (false); + is_used[edge_node_ids[i0]] = true; + is_used[edge_node_ids[i1]] = true; + is_used[edge_node_ids[i2]] = true; + is_used[edge_node_ids[i3]] = true; + + if ((is_used[0] && ((is_used[1] && is_used[4]) || (is_used[2] && is_used[6]) || (is_used[3] && is_used[7]))) || + (is_used[1] && ((is_used[2] && is_used[5]) || (is_used[3] && is_used[8]))) || + (is_used[2] && is_used[3] && is_used[9])) + { + // this tet has a colinear face + return true; + } + + // look for all nodes on the same face + if ((!is_used[0] && !is_used[4] && !is_used[6] && !is_used[7]) || // all on face 1 + (!is_used[4] && !is_used[1] && !is_used[5] && !is_used[8]) || // all on face 2 + (!is_used[6] && !is_used[5] && !is_used[2] && !is_used[9]) || // all on face 0 + (!is_used[7] && !is_used[8] && !is_used[9] && !is_used[3])) // all on face 3 + { + // this tet has all nodes on one face + return true; + } + + return false; +} + +int +ContourSubElement_Tet_4::side_facets( Faceted_Surface & facets, + int side ) const +{ /* %TRACE% */ /* %TRACE% */ + ThrowAssert( my_side_ids[side] == -2 ); + + // just one linear facet per linear triangle + const int num_facets = 1; + + const unsigned * const lnn = get_side_node_ordinals(topology(), side); + + if ( LevelSet::sign_change(0.0, (double) my_sign) ) + { + std::unique_ptr facet = std::make_unique( my_owner->coordinates(my_coords[lnn[0]]), my_owner->coordinates(my_coords[lnn[1]]), my_owner->coordinates(my_coords[lnn[2]]) ); + facets.add( std::move(facet) ); + } + else + { + std::unique_ptr facet = std::make_unique( my_owner->coordinates(my_coords[lnn[0]]), my_owner->coordinates(my_coords[lnn[2]]), my_owner->coordinates(my_coords[lnn[1]]) ); + facets.add( std::move(facet) ); + } + + return( num_facets ); +} + +ContourSubElement_Tet_10::ContourSubElement_Tet_10( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth, + const int subelement_sign ) + : ContourSubElement( stk::topology::TETRAHEDRON_10, + coords, + side_ids, + in_owner, + in_subelement_depth, + subelement_sign ) +{ /* %TRACE% */ /* %TRACE% */ + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return; + } + + // use a single non-conformal, adaptive 4-noded tet + my_subelements.clear(); + my_subelements.reserve(1); + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + + sub_coords[0] = my_coords[0]; + sub_coords[1] = my_coords[1]; + sub_coords[2] = my_coords[2]; + sub_coords[3] = my_coords[3]; + + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, my_side_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); +} + +const int ContourSubElement_Adaptive_Tet_4::MAX_REFINMENT_LEVELS = 6; + +ContourSubElement_Adaptive_Tet_4::ContourSubElement_Adaptive_Tet_4( + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth ) + : ContourSubElement( stk::topology::TETRAHEDRON_4, + coords, + side_ids, + in_owner, + in_subelement_depth, + 0 ) +{ /* %TRACE% */ /* %TRACE% */ + my_edge_age.resize(6); // initializes to zero + non_conformal_decomposition(); +} + +ContourSubElement_Adaptive_Tet_4::ContourSubElement_Adaptive_Tet_4( + const PointVec & coords, + const std::vector & side_ids, + const std::vector & edge_age, + const ContourElement * in_owner, + const int in_subelement_depth ) + : ContourSubElement( stk::topology::TETRAHEDRON_4, + coords, + side_ids, + in_owner, + in_subelement_depth, + 0 ) +{ /* %TRACE% */ /* %TRACE% */ + my_edge_age = edge_age; + non_conformal_decomposition(); +} + +int +ContourSubElement_Adaptive_Tet_4::non_conformal_decomposition() +{ /* %TRACE% */ /* %TRACE% */ + int success = true; // optimism + + // Determine if we will continue to look for crossing within this element. + // This test should be conservative, proceeding to look for crossings if there + // is even a remote chance of a crossing (To avoid cracks in the surface). + + // find extrema + double max_dist = -std::numeric_limits::max(); + double min_dist = std::numeric_limits::max(); + for ( int n = 0; n < my_num_nodes; n++ ) + { + if (my_dist[n] < min_dist) min_dist = my_dist[n]; + if (my_dist[n] > max_dist) max_dist = my_dist[n]; + } + + const double variation = max_dist - min_dist; + + const bool all_hi = (min_dist - variation) > 0.0; + const bool all_lo = (max_dist + variation) < 0.0; + + if (all_hi || all_lo) + { + // correct the sign since we lie entirely on one side of the interface + my_sign = LevelSet::sign(my_dist[0]); + return success; + } + + int longest_bad_edge = -1; + + // use temporary storage for vertex and side nodes + PointVec lcoords = my_coords; + lcoords.resize(10,Vector3d::ZERO); + lcoords[4] = 0.5 * (my_coords[0] + my_coords[1]); + lcoords[5] = 0.5 * (my_coords[1] + my_coords[2]); + lcoords[6] = 0.5 * (my_coords[2] + my_coords[0]); + lcoords[7] = 0.5 * (my_coords[0] + my_coords[3]); + lcoords[8] = 0.5 * (my_coords[1] + my_coords[3]); + lcoords[9] = 0.5 * (my_coords[2] + my_coords[3]); + + PointVec lphyscoords(10); + for (int n = 0; n < 10; ++n) + { + lphyscoords[n] = my_owner->coordinates( lcoords[n] ); + } + + std::vector ldist = my_dist; + ldist.resize(10); + for (int n = 4; n < 10; ++n) + { + ldist[n] = my_owner->distance( lcoords[n] ); + } + + const stk::topology Top = stk::topology::TETRAHEDRON_10; + int num_edges = Top.num_edges(); + + std::vector bad_edges; + bad_edges.reserve(num_edges); + + std::vector edge_lengths(num_edges); + + for ( int edge = 0; edge < num_edges; edge++ ) + { + const unsigned * const lnn = get_edge_node_ordinals(Top, edge); + + ThrowAssert(Top.edge_topology(edge).num_nodes() == 3); + + const double edge_straight_length = (lphyscoords[lnn[0]] - lphyscoords[lnn[1]]).length(); + ThrowRequire(edge_straight_length > 0.0); + edge_lengths[edge] = edge_straight_length; + + const double edge_curve_error = (lphyscoords[lnn[2]] - 0.5*(lphyscoords[lnn[0]] + lphyscoords[lnn[1]])).length(); + + const double edge_dist_error = std::fabs(ldist[lnn[2]] - 0.5*(ldist[lnn[0]]+ldist[lnn[1]])); + + const double scale = std::min(std::sqrt(std::numeric_limits::max()),std::fabs(ldist[lnn[0]]) + std::fabs(ldist[lnn[1]]) + my_owner->length_scale()); + + const double edge_error = (edge_curve_error + edge_dist_error)*edge_straight_length/(scale*scale); + + if (edge_error > my_owner->edge_nonlinear_tolerance() && my_edge_age[edge] < MAX_REFINMENT_LEVELS) + { + bad_edges.push_back(edge); + } + } + + double max_length = 0.0; + for (auto edge : bad_edges) + { + const double edge_length = edge_lengths[edge]; + ThrowRequire(edge_length > 0.0); + + // we need an absolute mechanism for selecting the edge to bisect so that all elements that share + // common edges will make the same decisions + if (utility::is_more(edge_length,max_length)) + { + longest_bad_edge = edge; + max_length = edge_length; + } + else if (!utility::is_less(edge_length,max_length)) // tie breaker + { + const Vector3d & edge_midside_coords = lphyscoords[get_edge_node_ordinals(Top, edge)[2]]; + // note that it is safe to assume that longest_bad_edge is already assigned if edge_length == max_length + const Vector3d longest_edge_midside_coords = lphyscoords[get_edge_node_ordinals(Top, longest_bad_edge)[2]]; + + ThrowAssert((utility::is_not_equal(edge_midside_coords[0],longest_edge_midside_coords[0]) || + utility::is_not_equal(edge_midside_coords[1],longest_edge_midside_coords[1]) || + utility::is_not_equal(edge_midside_coords[2],longest_edge_midside_coords[2]))); + + if (utility::is_more(edge_midside_coords[0],longest_edge_midside_coords[0]) || + (!utility::is_less(edge_midside_coords[0],longest_edge_midside_coords[0]) && + (utility::is_more(edge_midside_coords[1],longest_edge_midside_coords[1]) || + (!utility::is_less(edge_midside_coords[1],longest_edge_midside_coords[1]) && + (utility::is_more(edge_midside_coords[2],longest_edge_midside_coords[2])))))) + { + longest_bad_edge = edge; + max_length = edge_length; + } + } + } + + if ( longest_bad_edge == -1 ) + { + // no bad edges + + // use a single nonconformal linear tet subelement + my_subelements.clear(); + my_subelements.reserve(1); + + ContourSubElement *sub = new ContourSubElement_Tet_4( my_coords, my_side_ids, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + } + else + { + // + // create 2, adaptive, 4-noded tetrahedra by cutting the longest_bad_edge + // + + my_subelements.clear(); + my_subelements.reserve(2); + ContourSubElement *sub = NULL; + PointVec sub_coords(4,Vector3d::ZERO); + std::vector sub_ids(4); + std::vector sub_edge_age(6); + + static const unsigned node_permute_0[] = { 0,1,2,3 }; + static const unsigned node_permute_1[] = { 1,2,0,3 }; + static const unsigned node_permute_2[] = { 2,0,1,3 }; + static const unsigned node_permute_3[] = { 3,0,2,1 }; + static const unsigned node_permute_4[] = { 1,3,2,0 }; + static const unsigned node_permute_5[] = { 3,2,1,0 }; + static const unsigned side_permute_0[] = { 0,1,2,3 }; + static const unsigned side_permute_1[] = { 1,2,0,3 }; + static const unsigned side_permute_2[] = { 2,0,1,3 }; + static const unsigned side_permute_3[] = { 0,3,1,2 }; + static const unsigned side_permute_4[] = { 0,2,3,1 }; + static const unsigned side_permute_5[] = { 2,3,0,1 }; + static const unsigned edge_permute_0[] = { 0,1,2,3,4,5 }; + static const unsigned edge_permute_1[] = { 1,2,0,4,5,3 }; + static const unsigned edge_permute_2[] = { 2,0,1,5,3,4 }; + static const unsigned edge_permute_3[] = { 3,2,5,4,0,1 }; + static const unsigned edge_permute_4[] = { 4,5,1,0,3,2 }; + static const unsigned edge_permute_5[] = { 5,1,4,3,2,0 }; + static const unsigned * node_permute_table[] = { node_permute_0, node_permute_1, node_permute_2, node_permute_3, node_permute_4, node_permute_5 }; + static const unsigned * side_permute_table[] = { side_permute_0, side_permute_1, side_permute_2, side_permute_3, side_permute_4, side_permute_5 }; + static const unsigned * edge_permute_table[] = { edge_permute_0, edge_permute_1, edge_permute_2, edge_permute_3, edge_permute_4, edge_permute_5 }; + + const unsigned * lnn = node_permute_table[longest_bad_edge]; + const unsigned * lsn = side_permute_table[longest_bad_edge]; + const unsigned * len = edge_permute_table[longest_bad_edge]; + + const Vector3d edge_node = 0.5 * (my_coords[lnn[0]] + my_coords[lnn[1]]); + + // tet #1 + sub_coords[0] = my_coords[lnn[0]]; + sub_coords[1] = edge_node; + sub_coords[2] = my_coords[lnn[2]]; + sub_coords[3] = my_coords[lnn[3]]; + sub_ids[0] = my_side_ids[lsn[0]]; + sub_ids[1] = -1; /* not on any parent side */ + sub_ids[2] = my_side_ids[lsn[2]]; + sub_ids[3] = my_side_ids[lsn[3]]; + sub_edge_age[0] = my_edge_age[len[0]]+1; + sub_edge_age[1] = my_edge_age[len[0]]+1; + sub_edge_age[2] = my_edge_age[len[2]]; + sub_edge_age[3] = my_edge_age[len[3]]; + sub_edge_age[4] = my_edge_age[len[0]]+1; + sub_edge_age[5] = my_edge_age[len[5]]; + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, sub_edge_age, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + + // tet #2 + sub_coords[0] = edge_node; + sub_coords[1] = my_coords[lnn[1]]; + sub_coords[2] = my_coords[lnn[2]]; + sub_coords[3] = my_coords[lnn[3]]; + sub_ids[0] = my_side_ids[lsn[0]]; + sub_ids[1] = my_side_ids[lsn[1]]; + sub_ids[2] = -1; /* not on any parent side */ + sub_ids[3] = my_side_ids[lsn[3]]; + sub_edge_age[0] = my_edge_age[len[0]]+1; + sub_edge_age[1] = my_edge_age[len[1]]; + sub_edge_age[2] = my_edge_age[len[0]]+1; + sub_edge_age[3] = my_edge_age[len[0]]+1; + sub_edge_age[4] = my_edge_age[len[4]]; + sub_edge_age[5] = my_edge_age[len[5]]; + sub = new ContourSubElement_Adaptive_Tet_4( sub_coords, sub_ids, sub_edge_age, my_owner, my_subelement_depth+1 ); + my_subelements.push_back( sub ); + } + + return success; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_ContourSubElement.hpp b/packages/krino/krino/krino_lib/Akri_ContourSubElement.hpp new file mode 100644 index 000000000000..b00b27325508 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ContourSubElement.hpp @@ -0,0 +1,311 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_ContourSubElement_h +#define Akri_ContourSubElement_h + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +namespace krino { + +template +bool compare_ptr_by_global_id (const T* i, const T* j) { return (i->global_id() < j->global_id()); } + +class ContourSubElement { +public: + + ContourSubElement( const stk::topology topo, + const PointVec & coords, + const std::vector & side_ids, + const ContourElement * owner, + const int in_subelement_depth, + const int subelement_sign ); + + virtual ~ContourSubElement(); + + static bool is_more(const Vector3d & v1, const Vector3d & v2); + + double relative_volume() const; + double side_relative_area( const int side ) const; + double parametric_quality() const; + double physical_quality() const; + double side_quality(const int side) const; + + int num_intg_pts( const int intg_pt_sign ); + + int gather_intg_pts( const int intg_pt_sign, + sierra::ArrayContainer & intg_pt_locations, + sierra::ArrayContainer & intg_weights, + sierra::ArrayContainer & determinants, + int index = 0 ); + + int build_facets( Faceted_Surface & facets ); + + // default implementation + virtual int side_facets( Faceted_Surface & facets, int side ) const; + + stk::topology topology() const { return my_master_element.get_topology(); } + + int spatial_dim() const { return my_owner->spatial_dim(); } + int num_subelements() const { return my_subelements.size(); } + + std::vector & get_side_ids() { return my_side_ids; } + const std::vector & get_side_ids() const { return my_side_ids; } + + const PointVec & get_coords() const { return my_coords; } + const ContourElement * owner() const { return my_owner; } + int subelement_depth() const { return my_subelement_depth; } + + void dump_structure() const; + void dump_details() const; + + bool have_interface_sides() const; + + virtual std::ostream & put( std::ostream& os ) const; + + friend std::ostream & operator << ( std::ostream &os , const ContourSubElement &s ) { + return s.put(os); + } + + static double find_quadratic_crossing( const double d0, + const double d1, + const double d2 ); + +protected: + + const MasterElement& my_master_element; + const MasterElement& my_side_master_element; + int my_num_nodes; + int my_num_sides; + PointVec my_coords; + std::vector my_side_ids; + std::vector my_dist; + std::vector< ContourSubElement * > my_subelements; + const ContourElement * my_owner; + int my_subelement_depth; // depth down the tree of subelements (0 for the base_subelement) + int my_sign; // -1 for elements on negative side, +1 for positive side, 0 for non-conformal elements spanning interface + +private: + //: Default constructor not allowed + ContourSubElement(); +}; + +class ContourSubElement_Quad_4 : public ContourSubElement { +public: + ContourSubElement_Quad_4( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ); + virtual ~ContourSubElement_Quad_4() {} + +private: + //: Default constructor not allowed + ContourSubElement_Quad_4(); + + int non_conformal_decomposition(); +}; + +class ContourSubElement_Quad_9 : public ContourSubElement { +public: + ContourSubElement_Quad_9( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ); + + virtual ~ContourSubElement_Quad_9() {} + +private: + //: Default constructor not allowed + ContourSubElement_Quad_9(); + + int non_conformal_decomposition(); +}; + +class ContourSubElement_Hex_8 : public ContourSubElement { +public: + ContourSubElement_Hex_8( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ); + virtual ~ContourSubElement_Hex_8() {} + +private: + //: Default constructor not allowed + ContourSubElement_Hex_8(); + + int subpyramid_non_conformal_decomposition( const int face ); +}; + +class ContourSubElement_Hex_27 : public ContourSubElement { +public: + ContourSubElement_Hex_27( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ); + virtual ~ContourSubElement_Hex_27() {} + +private: + //: Default constructor not allowed + ContourSubElement_Hex_27(); + + int subpyramid_non_conformal_decomposition( const int face ); +}; + +class ContourSubElement_Wedge_6 : public ContourSubElement { +public: + ContourSubElement_Wedge_6( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner ); + virtual ~ContourSubElement_Wedge_6() {} + +private: + int subpyramid_non_conformal_decomposition( const int face ); +}; + +class ContourSubElement_Tri_3 : public ContourSubElement { +public: + ContourSubElement_Tri_3( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0, + const int subelement_sign = 0 ); + virtual ~ContourSubElement_Tri_3() {} + + virtual int side_facets( Faceted_Surface & facets, int side ) const; + +private: + //: Default constructor not allowed + ContourSubElement_Tri_3(); + + int conformal_decomposition(); + + int process_edge( const int i0, + const int i1, + const int i2, + std::vector & is_on_surf, + PointVec & lnodes, + const std::vector & ldist ); + + bool is_degenerate( const std::vector & edge_node_ids, + const int i0, const int i1, const int i2 ); +}; + +class ContourSubElement_Adaptive_Tri_3 : public ContourSubElement { +public: + ContourSubElement_Adaptive_Tri_3( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0); + ContourSubElement_Adaptive_Tri_3( const PointVec & coords, + const std::vector & side_ids, + const std::vector & edge_age, + const ContourElement * in_owner, + const int in_subelement_depth = 0); + virtual ~ContourSubElement_Adaptive_Tri_3() {} + +private: + //: Default constructor not allowed + ContourSubElement_Adaptive_Tri_3(); + + static const int MAX_REFINMENT_LEVELS; + + int non_conformal_decomposition(); + + std::vector my_edge_age; +}; + +class ContourSubElement_Tri_6 : public ContourSubElement { +public: + ContourSubElement_Tri_6( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0, + const int subelement_sign = 0 ); + virtual ~ContourSubElement_Tri_6() {} + +private: + //: Default constructor not allowed + ContourSubElement_Tri_6(); +}; + +class ContourSubElement_Tet_4 : public ContourSubElement { +public: + ContourSubElement_Tet_4( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0, + const int subelement_sign = 0 ); + virtual ~ContourSubElement_Tet_4() {} + + virtual int side_facets( Faceted_Surface & facets, int side ) const; + +private: + //: Default constructor not allowed + ContourSubElement_Tet_4(); + + int conformal_decomposition(); + + int process_edge( const int i0, + const int i1, + const int i2, + std::vector & is_on_surf, + PointVec & lnodes, + const std::vector & ldist ); + + bool is_degenerate( const std::vector & edge_node_ids, + const int i0, const int i1, const int i2, const int i3 ); +}; + +class ContourSubElement_Adaptive_Tet_4 : public ContourSubElement { +public: + ContourSubElement_Adaptive_Tet_4( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0); + ContourSubElement_Adaptive_Tet_4( const PointVec & coords, + const std::vector & side_ids, + const std::vector & edge_age, + const ContourElement * in_owner, + const int in_subelement_depth = 0); + virtual ~ContourSubElement_Adaptive_Tet_4() {} + +private: + //: Default constructor not allowed + ContourSubElement_Adaptive_Tet_4(); + + static const int MAX_REFINMENT_LEVELS; + + int non_conformal_decomposition(); + + std::vector my_edge_age; +}; + +class ContourSubElement_Tet_10 : public ContourSubElement { +public: + ContourSubElement_Tet_10( const PointVec & coords, + const std::vector & side_ids, + const ContourElement * in_owner, + const int in_subelement_depth = 0, + const int subelement_sign = 0 ); + virtual ~ContourSubElement_Tet_10() {} + +private: + //: Default constructor not allowed + ContourSubElement_Tet_10(); +}; + +} // namespace krino + +#endif // Akri_ContourSubElement_h diff --git a/packages/krino/krino/krino_lib/Akri_Cutting_Surface.cpp b/packages/krino/krino/krino_lib/Akri_Cutting_Surface.cpp new file mode 100644 index 000000000000..2cef540c7dd0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Cutting_Surface.cpp @@ -0,0 +1,170 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +#include +#include + +namespace krino{ + +int +Plane_Cutting_Surface::sign_at_position(const Vector3d & p_coords) const +{ + return my_plane.signed_distance(p_coords) < 0. ? -1 : 1; +} + +bool +Plane_Cutting_Surface::on_surface(const Vector3d & p_coords, const double tol) const +{ + return std::abs(my_plane.signed_distance(p_coords)) < tol; +} + +double +Plane_Cutting_Surface::interface_crossing_position(const Segment3d & edge) const +{ + const double signed_dist_node0 = my_plane.signed_distance(edge.GetNode(0)); + const double signed_dist_node1 = my_plane.signed_distance(edge.GetNode(1)); + + if((signed_dist_node0 < 0) == (signed_dist_node1 < 0)) + { + std::stringstream str; + str << "Failed to find intersection of plane " << my_plane << " with segment " << edge; + throw std::runtime_error(str.str()); + } + + const double pos = signed_dist_node0 / (signed_dist_node0-signed_dist_node1); + + return pos; +} + +std::string Plane_Cutting_Surface::print() const +{ + std::ostringstream os; + os << "Plane cutting surface, plane = " << my_plane; + return os.str(); +} + +Intersecting_Planes_Cutting_Surface::Intersecting_Planes_Cutting_Surface(const Vector3d & p0, const Vector3d & p1, const Vector3d & p2, const Vector3d & p3) +: Cutting_Surface() +{ + // Points p0 and p2 lie on the line common to the two planes + my_plane0.set_from_most_orthogonal_angle_of_triangle(p0,p1,p2); + my_plane1.set_from_most_orthogonal_angle_of_triangle(p2,p3,p0); + + myTriangleForPlane0IsLarger = Cross(p2-p0, p1-p0).length_squared() > Cross(p2-p0, p3-p0).length_squared(); + + // Need to keep track of whether the normals to the plane point "toward" each other (positive_dihedral = true) + // or "away" from each other (positive_dihedral = false). + // We check this by seeing if p1 and p2 are on the positive side of the other plane. + const double dist1 = my_plane1.signed_distance(p1); + const double dist3 = my_plane0.signed_distance(p3); + my_positive_dihedral = (std::abs(dist1) > std::abs(dist3)) ? (dist1>0) : (dist3>0); +} + +int +Intersecting_Planes_Cutting_Surface::sign_at_position(const Vector3d & p_coords) const +{ + const double signed_dist0 = my_plane0.signed_distance(p_coords); + const double signed_dist1 = my_plane1.signed_distance(p_coords); + if (my_positive_dihedral) + { + const double min = std::min(signed_dist0,signed_dist1); + return min < 0. ? -1 : 1; + } + const double max = std::max(signed_dist0,signed_dist1); + return max < 0. ? -1 : 1; +} + +bool +Intersecting_Planes_Cutting_Surface::on_surface(const Vector3d & p_coords, const double tol) const +{ + const double signed_dist0 = my_plane0.signed_distance(p_coords); + const double signed_dist1 = my_plane1.signed_distance(p_coords); + if (my_positive_dihedral) + { + return (signed_dist0 > -tol && std::abs(signed_dist1) < tol) || + (signed_dist1 > -tol && std::abs(signed_dist0) < tol); + } + return (signed_dist0 < tol && std::abs(signed_dist1) < tol) || + (signed_dist1 < tol && std::abs(signed_dist0) < tol); +} + +double +Intersecting_Planes_Cutting_Surface::interface_crossing_position(const Segment3d & edge) const +{ + const double signed_dist0_node0 = my_plane0.signed_distance(edge.GetNode(0)); + const double signed_dist0_node1 = my_plane0.signed_distance(edge.GetNode(1)); + const double signed_dist1_node0 = my_plane1.signed_distance(edge.GetNode(0)); + const double signed_dist1_node1 = my_plane1.signed_distance(edge.GetNode(1)); + + double pos0 = signed_dist0_node0 / (signed_dist0_node0-signed_dist0_node1); + double pos1 = signed_dist1_node0 / (signed_dist1_node0-signed_dist1_node1); + + const int sign_case_id = + (((signed_dist0_node0 < 0) == my_positive_dihedral) ? 0 : 1) + + (((signed_dist1_node0 < 0) == my_positive_dihedral) ? 0 : 2) + + (((signed_dist0_node1 < 0) == my_positive_dihedral) ? 0 : 4) + + (((signed_dist1_node1 < 0) == my_positive_dihedral) ? 0 : 8); + static const int case_id_from_sign_case_id [] = {-1,-1,-1, 2,-1,-1,-1, 1,-1,-1,-1, 0, 3, 1, 0,-1}; + + const int case_id = case_id_from_sign_case_id[sign_case_id]; + switch (case_id) + { + case 0: return pos0; + case 1: return pos1; + case 2: return (pos0 < pos1) ? pos0 : pos1; + case 3: return (pos0 < pos1) ? pos1 : pos0; + } + + // Either 0 or 2 true crossings. Not ok. + std::stringstream str; + str << "Failed to find intersection of Intersecting_Planes_Cutting_Surface with planes " + << my_plane0 << " and " << my_plane1 + << " with segment " << edge + << " with crossings " << pos0 << " and " << pos1 << " with diff " << pos0-pos1 << " sign_case_id " << sign_case_id; + throw std::runtime_error(str.str()); +} + +std::string Intersecting_Planes_Cutting_Surface::print() const +{ + std::ostringstream os; + os << "Intersecting planes cutting surface. Plane 0 = " << my_plane0 << " Plane 1 = " << my_plane1 + << " positive dihedral = " << std::boolalpha << my_positive_dihedral; + return os.str(); +} + +std::string print_plane_visualization(const Plane3d & plane, std::array & geomIds, const std::string & description) +{ + std::ostringstream os; + const Vector3d x0 = plane.constant() * plane.normal(); + const Vector3d x1 = x0 + plane.normal(); + os << "Create vertex " << x0[0] << " " << x0[1] << " " << x0[2] << std::endl; + os << "Create vertex " << x1[0] << " " << x1[1] << " " << x1[2] << std::endl; + os << "Create curve vertex " << ++geomIds[0] << " " << ++geomIds[0] << std::endl; + os << "Create planar surface curve " << ++geomIds[1] << " distance 0. # Plane " << ++geomIds[2] << ": " << description << std::endl; + geomIds[0] += 4; // 4 vertices created for plane + geomIds[1] += 4; // 4 curves created for plane + return os.str(); +} + +std::string Plane_Cutting_Surface::print_visualization(std::array & geomIds, const std::string & description) const +{ + return print_plane_visualization(my_plane, geomIds, description); +} + +std::string Intersecting_Planes_Cutting_Surface::print_visualization(std::array & geomIds, const std::string & description) const +{ + const std::string viz0 = print_plane_visualization(my_plane0, geomIds, description+", plane 1/2"); + const std::string viz1 = print_plane_visualization(my_plane1, geomIds, description+", plane 2/2"); + return viz0 + viz1; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Cutting_Surface.hpp b/packages/krino/krino/krino_lib/Akri_Cutting_Surface.hpp new file mode 100644 index 000000000000..51e764864f50 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Cutting_Surface.hpp @@ -0,0 +1,81 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Cutting_Surface_h +#define Akri_Cutting_Surface_h + +#include +#include +#include +#include +#include + +namespace krino { + +class Cutting_Surface +{ +public: + Cutting_Surface() {} + virtual ~Cutting_Surface() {} + virtual bool on_surface(const Vector3d & p_coords, const double tol) const = 0; + virtual int sign_at_position(const Vector3d & p_coords) const = 0; + virtual double interface_crossing_position(const Segment3d & edge) const = 0; + virtual std::string print() const = 0; + virtual std::string print_visualization(std::array & geomIds, const std::string & description) const = 0; + virtual const Plane3d & get_plane() const = 0; +}; + +class Plane_Cutting_Surface : public Cutting_Surface +{ +public: + // for 3D from 3 points on plane + Plane_Cutting_Surface(const Vector3d & p0, const Vector3d & p1, const Vector3d & p2) : Cutting_Surface() {my_plane.set_from_most_orthogonal_angle_of_triangle(p0,p1,p2);} + // for 2D or 3D from direction and point on plane + Plane_Cutting_Surface(const Vector3d & direction, const Vector3d & p0) : my_plane(direction,p0) {} + virtual ~Plane_Cutting_Surface() {} + virtual bool on_surface(const Vector3d & p_coords, const double tol) const override; + int sign_at_position(const Vector3d & p_coords) const override; + double interface_crossing_position(const Segment3d & edge) const override; + std::string print() const override; + virtual std::string print_visualization(std::array & geomIds, const std::string & description) const override; + virtual const Plane3d & get_plane() const override { return my_plane; } +private: + Plane3d my_plane; +}; + +class Plane_Cutting_Surface_2D : public Plane_Cutting_Surface +{ +public: + // for 2D from 2 points on line + Plane_Cutting_Surface_2D(const Vector3d & p0, const Vector3d & p1) : Plane_Cutting_Surface(Vector3d(p1[1]-p0[1],p0[0]-p1[0],0),p0) {} + virtual ~Plane_Cutting_Surface_2D() {} +private: +}; + + +class Intersecting_Planes_Cutting_Surface : public Cutting_Surface +{ +public: + Intersecting_Planes_Cutting_Surface(const Vector3d & p0, const Vector3d & p1, const Vector3d & p2, const Vector3d & p3); // 3D + virtual ~Intersecting_Planes_Cutting_Surface() {} + virtual bool on_surface(const Vector3d & p_coords, const double tol) const override; + int sign_at_position(const Vector3d & p_coords) const override; + double interface_crossing_position(const Segment3d & edge) const override; + std::string print() const override; + virtual std::string print_visualization(std::array & geomIds, const std::string & description) const override; + virtual const Plane3d & get_plane() const override { /* THIS IS A BAD IDEA. SHOULD WE TEST PLANARITY? */ return myTriangleForPlane0IsLarger ? my_plane0 : my_plane1; } +private: + bool myTriangleForPlane0IsLarger; + Plane3d my_plane0; + Plane3d my_plane1; + bool my_positive_dihedral; +}; + +} // namespace krino + +#endif // Akri_Cutting_Surface_h diff --git a/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.cpp b/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.cpp new file mode 100644 index 000000000000..71bc5488dd90 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.cpp @@ -0,0 +1,302 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +static bool owned_nodes_are_handled_by_other_procs(const stk::mesh::BulkData & mesh, + const std::vector & interfaceNodesWithoutMatchingCrossing, + const std::vector & interfaceNodesWithMatchingCrossing) +{ + stk::CommSparse commSparse(mesh.parallel()); + pack_entities_for_owning_proc(mesh, interfaceNodesWithMatchingCrossing, commSparse); + std::set ownedNodesWithRemoteMatchingCrossing; + unpack_entities_from_other_procs(mesh, ownedNodesWithRemoteMatchingCrossing, commSparse); + + for (auto node : interfaceNodesWithoutMatchingCrossing) + if (mesh.bucket(node).owned() && ownedNodesWithRemoteMatchingCrossing.count(node) == 0) + return false; + + return true; +} + +static bool any_node_of_edge_including_children_is_on_interface(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const ParentsToChildMapper & parentToChildMapper, + const EdgeIntersection & edgeCrossing) +{ + std::vector edgeNodesIncludingChildren; + fill_edge_nodes(mesh, edgeCrossing.nodes[0], edgeCrossing.nodes[1], parentToChildMapper, edgeNodesIncludingChildren); + for (auto node : edgeNodesIncludingChildren) + if (node_is_on_interface(mesh, cdfemSupport, phaseSupport, node, edgeCrossing.interface)) + return true; + return false; +} + +static bool edge_crossings_have_matching_interface_node(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const ParentsToChildMapper & parentToChildMapper, + const EdgeIntersection & edgeCrossing, + const double snapTol) +{ + const auto & edgeNodes = edgeCrossing.nodes; + const auto & crossingInterface = edgeCrossing.interface; + const double crossingPosition = edgeCrossing.crossingLocation; + if (crossingPosition < snapTol) + { + if (!node_is_on_interface(mesh, cdfemSupport, phaseSupport, edgeNodes[0], crossingInterface)) + return false; + } + else if (crossingPosition > 1.-snapTol) + { + if (!node_is_on_interface(mesh, cdfemSupport, phaseSupport, edgeNodes[1], crossingInterface)) + return false; + } + else if (!any_node_of_edge_including_children_is_on_interface(mesh, cdfemSupport, phaseSupport, parentToChildMapper, edgeCrossing)) + { + return false; + } + return true; +} + +static bool edges_with_crossings_have_matching_interface_nodes(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const ParentsToChildMapper & parentToChildMapper, + const std::vector & edgeIntersections) +{ + const double snapTol = cdfemSupport.get_snapper().get_edge_tolerance(); + bool edgesWithCrossingHaveMatchingInterfaceNodes = true; + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edge(edgeIntersection); + if (!edge_crossings_have_matching_interface_node(mesh, cdfemSupport, phaseSupport, parentToChildMapper, edge, snapTol)) + { + edgesWithCrossingHaveMatchingInterfaceNodes = false; + break; + } + } + return stk::is_true_on_all_procs(mesh.parallel(), edgesWithCrossingHaveMatchingInterfaceNodes); +} + +static std::map> build_nodes_to_interfaces_within_tolerance(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const std::vector & edgeIntersections, + const ParentsToChildMapper & parentToChildMapper) +{ + + const double snapTol = cdfemSupport.get_snapper().get_edge_tolerance(); + std::vector parentEdgeNodes; + std::vector parentEdgeNodePositions; + + std::map> nodesToInterfacesWithinTolerance; + for (auto && edgeIntersection : edgeIntersections) + { + const EdgeIntersection edgeCrossing(edgeIntersection); + const auto & crossingInterface = edgeCrossing.interface; + const double crossingPosition = edgeCrossing.crossingLocation; + + parentEdgeNodes.clear(); + parentEdgeNodePositions.clear(); + fill_edge_nodes_and_positions(mesh, edgeCrossing.nodes[0], edgeCrossing.nodes[1], parentToChildMapper, parentEdgeNodes, parentEdgeNodePositions); + + for (size_t iNode=0; iNode> & nodesToInterfacesWithinTolerance) +{ + const auto mapIter = nodesToInterfacesWithinTolerance.find(node); + if (mapIter == nodesToInterfacesWithinTolerance.end()) + return false; + + const PhaseTag nodePhase = determine_phase_for_entity(mesh, node, phaseSupport); + const auto & nodeInterfacesWithinTolerance = mapIter->second; + for (auto && interfaceWithinTolerance : nodeInterfacesWithinTolerance) + if (phase_matches_interface(cdfemSupport, nodePhase, interfaceWithinTolerance)) + return true; + + return false; +} + +static void fill_interface_nodes_with_and_without_matching_crossing(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const ParentsToChildMapper & parentToChildMapper, + const std::vector & edgeIntersections, + std::vector & interfaceNodesWithMatchingCrossing, + std::vector & interfaceNodesWithoutMatchingCrossing) +{ + interfaceNodesWithMatchingCrossing.clear(); + interfaceNodesWithoutMatchingCrossing.clear(); + + const std::map> nodesToInterfacesWithinTolerance = build_nodes_to_interfaces_within_tolerance(mesh, cdfemSupport, edgeIntersections, parentToChildMapper); + + for ( auto && bucket : mesh.buckets(stk::topology::NODE_RANK) ) + { + if (nodes_are_on_any_interface(mesh, phaseSupport, *bucket)) + { + for ( auto && node : *bucket ) + { + if (node_has_matching_interface_within_tolerance(mesh, cdfemSupport, phaseSupport, node, nodesToInterfacesWithinTolerance)) + interfaceNodesWithMatchingCrossing.push_back(node); + else + interfaceNodesWithoutMatchingCrossing.push_back(node); + } + } + } +} + +static bool interface_nodes_have_matching_edge_crossing(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + const ParentsToChildMapper & parentToChildMapper, + const std::vector & edgeIntersections) +{ + std::vector interfaceNodesWithMatchingCrossing; + std::vector interfaceNodesWithoutMatchingCrossing; + fill_interface_nodes_with_and_without_matching_crossing(mesh, cdfemSupport, phaseSupport, parentToChildMapper, edgeIntersections, interfaceNodesWithMatchingCrossing, interfaceNodesWithoutMatchingCrossing); + + if (stk::is_true_on_all_procs(mesh.parallel(), interfaceNodesWithoutMatchingCrossing.empty())) + return true; + + bool allOwnedNotSharedInterfaceNodesHaveMatchingEdgeCrossing = true; + for (auto node : interfaceNodesWithoutMatchingCrossing) + { + if (mesh.bucket(node).owned() && !mesh.bucket(node).shared()) + { + allOwnedNotSharedInterfaceNodesHaveMatchingEdgeCrossing = false; + break; + } + } + + if (!stk::is_true_on_all_procs(mesh.parallel(), allOwnedNotSharedInterfaceNodesHaveMatchingEdgeCrossing)) + return false; + + const bool allInterfaceNodesHaveMatchingEdgeCrossing = + owned_nodes_are_handled_by_other_procs(mesh, interfaceNodesWithoutMatchingCrossing, interfaceNodesWithMatchingCrossing); + + return stk::is_true_on_all_procs(mesh.parallel(), allInterfaceNodesHaveMatchingEdgeCrossing); +} + +void fill_neighbor_nodes(const stk::mesh::BulkData & mesh, + stk::mesh::Entity node, + const stk::mesh::Selector & elementSelector, + std::vector & neighborNodes) +{ + neighborNodes.clear(); + for (auto element : StkMeshEntities{mesh.begin_elements(node), mesh.end_elements(node)}) + if (elementSelector(mesh.bucket(element))) + for (auto nbr : StkMeshEntities{mesh.begin_nodes(element), mesh.end_nodes(element)}) + if (nbr != node) + neighborNodes.push_back(nbr); + stk::util::sort_and_unique(neighborNodes); +} + +static bool snap_displacements_at_node_are_small_compared_to_parent_edges(const stk::mesh::BulkData & mesh, + stk::mesh::Entity node, + FieldRef cdfemSnapField, + FieldRef coordsField, + const stk::mesh::Selector & parentElementSelector, + const double snapTol) +{ + const Vector3d snapDisplacements(field_data(cdfemSnapField, node), mesh.mesh_meta_data().spatial_dimension()); + const double snapDisplacmentsSqrLength = snapDisplacements.length_squared(); + const Vector3d nodeCoords(field_data(coordsField, node), mesh.mesh_meta_data().spatial_dimension()); + std::vector neighborNodes; + fill_neighbor_nodes(mesh, node, parentElementSelector, neighborNodes); + for (auto && nbr : neighborNodes) + { + const Vector3d nbrCoords(field_data(coordsField, nbr), mesh.mesh_meta_data().spatial_dimension()); + const double edgeSqrLength = (nbrCoords-nodeCoords).length_squared(); + if (snapDisplacmentsSqrLength > snapTol*snapTol * edgeSqrLength) + return false; + } + return true; +} + +static bool locally_snap_displacements_are_small_on_nodes_with_interfaces(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + FieldRef cdfemSnapField = cdfemSupport.get_cdfem_snap_displacements_field(); + if (cdfemSnapField.valid()) + { + const double snapTol = cdfemSupport.get_snapper().get_edge_tolerance(); + FieldRef oldCdfemSnapField = cdfemSupport.get_cdfem_snap_displacements_field().field_state(stk::mesh::StateOld); + const stk::mesh::Selector parentElementSelector = get_owned_parent_element_selector(mesh, activePart, cdfemSupport, phaseSupport); + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + for ( auto && bucket : mesh.buckets(stk::topology::NODE_RANK) ) + if (bucket->field_data_is_allocated(oldCdfemSnapField) && nodes_are_on_any_interface(mesh, phaseSupport, *bucket)) + for ( auto && node : *bucket ) + if (!snap_displacements_at_node_are_small_compared_to_parent_edges(mesh, node, oldCdfemSnapField, coordsField, parentElementSelector, snapTol)) + return false; + } + return true; +} + +static bool snap_displacements_are_small_on_nodes_with_interfaces(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + return stk::is_true_on_all_procs(mesh.parallel(), locally_snap_displacements_are_small_on_nodes_with_interfaces(mesh, activePart, cdfemSupport, phaseSupport)); +} + +bool decomposition_has_changed(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + if (!snap_displacements_are_small_on_nodes_with_interfaces(mesh, activePart, cdfemSupport, phaseSupport)) + return true; + + const NodeToCapturedDomainsMap nodesToCapturedDomains; + const std::vector edgeIntersections = interfaceGeometry.get_edge_intersection_points(mesh, nodesToCapturedDomains); + + ParentsToChildMapper parentToChildMapper; + parentToChildMapper.build_map(mesh, activePart, cdfemSupport, phaseSupport); + + if (edges_with_crossings_have_matching_interface_nodes(mesh, cdfemSupport, phaseSupport, parentToChildMapper, edgeIntersections) && + interface_nodes_have_matching_edge_crossing(mesh, cdfemSupport, phaseSupport, parentToChildMapper, edgeIntersections)) + { + return false; + } + + return true; +} + + +} // namespace diff --git a/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.hpp b/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.hpp new file mode 100644 index 000000000000..f6aedb4fe6ad --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DecompositionHasChanged.hpp @@ -0,0 +1,25 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_DECOMPOSITIONHASCHANGED_H_ +#define KRINO_INCLUDE_AKRI_DECOMPOSITIONHASCHANGED_H_ +#include +#include +#include +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" +namespace krino { + +bool decomposition_has_changed(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport); + +} + +#endif /* KRINO_INCLUDE_AKRI_DECOMPOSITIONHASCHANGED_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_DiagWriter.cpp b/packages/krino/krino/krino_lib/Akri_DiagWriter.cpp new file mode 100644 index 000000000000..6135a722231b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DiagWriter.cpp @@ -0,0 +1,54 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include + +#include + +namespace krino { + +DiagWriterParser & +theDiagWriterParser() +{ + /* %TRACE% */ /* %TRACE% */ + static DiagWriterParser parser; + return parser; +} + + +stk::diag::Writer & +theDiagWriter() +{ + /* %TRACE[NONE]% */ /* %TRACE% */ + static stk::diag::Writer s_diagWriter(sierra::dwout().rdbuf(), theDiagWriterParser().parse(std::getenv("KRINOLOG"))); + + return s_diagWriter; +} + +DiagWriterParser::DiagWriterParser() + : stk::diag::WriterParser() +{ + /* %TRACE% */ /* %TRACE% */ + mask("debug", (unsigned long) (LOG_DEBUG), "Display debug diagnostic information"); + mask("subelement", (unsigned long) (LOG_SUBELEMENT), "Display subelement decomposition diagnostic information"); + mask("facets", (unsigned long) (LOG_FACETS), "Output exodus file with facets data"); + mask("parts", (unsigned long) (LOG_PARTS), "Display CDFEM parts diagnostic information"); +} + +namespace +{ + +void bootstrap() { sierra::Diag::registerWriter("krinolog", krinolog, theDiagWriterParser()); } + +stk::Bootstrap x(&bootstrap); +} // namespace + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_DiagWriter.hpp b/packages/krino/krino/krino_lib/Akri_DiagWriter.hpp new file mode 100644 index 000000000000..915dd4b42ae7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DiagWriter.hpp @@ -0,0 +1,63 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_DiagWriter_h +#define Akri_DiagWriter_h + +#include +#include +#include +#include + +#include + +namespace krino +{ + class DiagWriterParser : public stk::diag::WriterParser + { + public: + DiagWriterParser(); + }; + + stk::diag::Writer &theDiagWriter(); + DiagWriterParser &theDiagWriterParser(); + +#define krinolog krino::theDiagWriter() + +#ifdef KRINO_TRACE_ENABLED + typedef stk::diag::Tracespec Tracespec; + typedef stk::diag::Traceback Traceback; + + class Trace : public stk::diag::Trace + { + public: + Trace(const char *message) + : stk::diag::Trace(krinolog, message) + {} + }; + +#elif defined(KRINO_TRACE_TRACEBACK) + typedef stk::diag::Tracespec Tracespec; + typedef stk::diag::Traceback Traceback; + typedef stk::diag::Traceback Trace; + +#else + typedef stk::diag::Tracespec Tracespec; + typedef stk::diag::Tracespec Traceback; + typedef stk::diag::Tracespec Trace; +#endif + +#define ThrowRuntimeError(message) \ +{ \ + std::ostringstream internal_throw_runtime_message; \ + internal_throw_runtime_message << message; \ + throw std::runtime_error(internal_throw_runtime_message.str()); \ +} +} // namespace krino + +#endif // Akri_DiagWriter_h diff --git a/packages/krino/krino/krino_lib/Akri_DiagWriter_fwd.hpp b/packages/krino/krino/krino_lib/Akri_DiagWriter_fwd.hpp new file mode 100644 index 000000000000..d5aa04dc9174 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DiagWriter_fwd.hpp @@ -0,0 +1,37 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_DiagWriter_fwd_h +#define Akri_DiagWriter_fwd_h + +#define KRINO_TRACE_ENABLED +// #define KRINO_TRACE_TRACEBACK + +#include + +namespace krino +{ + class DebugOut; + + enum + { + LOG_ALWAYS = stk::LOG_ALWAYS, + LOG_MEMBERS = stk::LOG_MEMBERS, + LOG_TRACE = stk::LOG_TRACE, + LOG_TRACE_STATS = stk::LOG_TRACE_STATS, + LOG_TRACE_SUB_CALLS = stk::LOG_TRACE_SUB_CALLS, + + LOG_DEBUG = 0x00010000, + LOG_SUBELEMENT = 0x00020000, + LOG_FACETS = 0x00040000, + LOG_PARTS = 0x00080000 + }; + +} // namespace krino + +#endif // Akri_DiagWriter_fwd_h diff --git a/packages/krino/krino/krino_lib/Akri_DistanceSweeper.cpp b/packages/krino/krino/krino_lib/Akri_DistanceSweeper.cpp new file mode 100644 index 000000000000..49a96dc635ea --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DistanceSweeper.cpp @@ -0,0 +1,177 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace krino{ + +namespace { + +bool node_has_other_sign(stk::mesh::Entity node, const FieldRef distance_field, const double signed_narrow_band) +{ + double * distance = field_data(distance_field, node); + ThrowAssert(nullptr != distance); + return (signed_narrow_band < 0.) ? (*distance > 0.) : (*distance < 0.); +} + +bool node_is_inside_narrow_band(stk::mesh::Entity node, const FieldRef distance_field, const double signed_narrow_band) +{ + double * distance = field_data(distance_field, node); + ThrowAssert(nullptr != distance); + return (signed_narrow_band < 0.) ? (*distance > signed_narrow_band) : (*distance < signed_narrow_band); +} + +void get_nodes_ready_to_update(const AuxMetaData & aux_meta, const stk::mesh::BulkData& mesh, const FieldRef distance_field, const double signed_narrow_band, std::set & nodes_ready_to_update) +{ + stk::mesh::Selector field_not_ghost = aux_meta.active_not_ghost_selector() & stk::mesh::selectField(distance_field); + const stk::mesh::BucketVector & buckets = mesh.get_buckets( stk::topology::ELEMENT_RANK, field_not_ghost ); + std::vector elem_nodes_to_update; + + for ( auto && bucket : buckets ) + { + stk::topology elem_topology = bucket->topology(); + const unsigned num_nodes = elem_topology.num_nodes(); + + for ( auto && elem : *bucket ) + { + elem_nodes_to_update.clear(); + const stk::mesh::Entity* nodes = mesh.begin_nodes(elem); + bool have_node_with_other_sign = false; + for ( unsigned i = 0; i < num_nodes; ++i ) + { + stk::mesh::Entity node = nodes[i]; + if (has_field_data(distance_field, node)) + { + if (node_has_other_sign(node, distance_field, signed_narrow_band)) + { + have_node_with_other_sign = true; + } + else if (!node_is_inside_narrow_band(node, distance_field, signed_narrow_band)) + { + elem_nodes_to_update.push_back(node); + } + } + } + if (have_node_with_other_sign) + { + nodes_ready_to_update.insert(elem_nodes_to_update.begin(), elem_nodes_to_update.end()); + } + } + } +} + +void get_neighbor_nodes_ready_to_update(const AuxMetaData & aux_meta, + const stk::mesh::BulkData& mesh, + const FieldRef distance_field, + const double signed_narrow_band, + const bool check_if_nbr_is_outside_band, + stk::mesh::Entity node, + std::set & nodes_ready_to_update) +{ + const stk::mesh::Entity* node_elems = mesh.begin_elements(node); + const unsigned num_node_elements = mesh.num_elements(node); + + for (unsigned ielem = 0; ielem < num_node_elements; ++ ielem) + { + stk::mesh::Entity elem = node_elems[ielem]; + const unsigned num_nodes = mesh.num_nodes(elem); + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(elem); + for ( unsigned inode = 0; inode < num_nodes; ++inode ) + { + stk::mesh::Entity nbr_node = elem_nodes[inode]; + if (nbr_node != node && + has_field_data(distance_field, nbr_node) && + !node_has_other_sign(nbr_node, distance_field, signed_narrow_band) && + (!check_if_nbr_is_outside_band || !node_is_inside_narrow_band(nbr_node, distance_field, signed_narrow_band))) + { + nodes_ready_to_update.insert(nbr_node); + } + } + } +} + +void get_shared_nodes_ready_to_update(const AuxMetaData & aux_meta, const stk::mesh::BulkData& mesh, const FieldRef distance_field, const double signed_narrow_band, std::set & nodes_ready_to_update) +{ + stk::mesh::Selector field_globally_shared = mesh.mesh_meta_data().globally_shared_part() & stk::mesh::selectField(distance_field); + std::vector< stk::mesh::Entity> shared_nodes; + stk::mesh::get_selected_entities( field_globally_shared, mesh.buckets( stk::topology::NODE_RANK ), shared_nodes ); + const bool check_if_nbr_is_outside_band = true; + + for (auto && node : shared_nodes) + { + if (node_has_other_sign(node, distance_field, signed_narrow_band)) + { + get_neighbor_nodes_ready_to_update(aux_meta, mesh, distance_field, signed_narrow_band, check_if_nbr_is_outside_band, node, nodes_ready_to_update); + } + } +} + +} // anonymous + +void DistanceSweeper::fix_sign_by_sweeping(const stk::mesh::BulkData& mesh, const FieldRef distance_field, const double signed_narrow_band) +{ + const AuxMetaData & aux_meta = AuxMetaData::get(mesh.mesh_meta_data()); + if (signed_narrow_band == 0.0) return; + const int sign_to_fix = (signed_narrow_band < 0.) ? -1 : 1; + + std::set nodes_ready_to_update; + + get_nodes_ready_to_update(aux_meta, mesh, distance_field, signed_narrow_band, nodes_ready_to_update); + + bool done = false; + while (!done) + { + size_t num_nodes_updated = 0; + + const bool check_if_nbr_is_outside_band = false; + while (!nodes_ready_to_update.empty()) + { + ++num_nodes_updated; + stk::mesh::Entity node = *nodes_ready_to_update.begin(); + nodes_ready_to_update.erase(nodes_ready_to_update.begin()); + + double * distance = field_data(distance_field, node); + ThrowAssert(nullptr != distance); + *distance = -signed_narrow_band; + + get_neighbor_nodes_ready_to_update(aux_meta, mesh, distance_field, signed_narrow_band, check_if_nbr_is_outside_band, node, nodes_ready_to_update); + } + + done = true; + if (mesh.parallel_size() > 1) + { + const size_t local_num_nodes_updated = num_nodes_updated; + stk::all_reduce_sum(mesh.parallel(), &local_num_nodes_updated, &num_nodes_updated, 1); + + if (num_nodes_updated > 0) + { + done = false; + + std::vector parallel_fields(1, &distance_field.field()); + if (sign_to_fix > 0) stk::mesh::parallel_min(mesh, parallel_fields); + else stk::mesh::parallel_max(mesh, parallel_fields); + + get_shared_nodes_ready_to_update(aux_meta, mesh, distance_field, signed_narrow_band, nodes_ready_to_update); + } + } + } +} + +//---------------------------------------------------------------- +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_DistanceSweeper.hpp b/packages/krino/krino/krino_lib/Akri_DistanceSweeper.hpp new file mode 100644 index 000000000000..051cf9dc37cb --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_DistanceSweeper.hpp @@ -0,0 +1,22 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_DistanceSweeper_h +#define Akri_DistanceSweeper_h + +namespace stk { namespace mesh { class BulkData; } } +namespace krino { class FieldRef; } + +namespace krino { +namespace DistanceSweeper { + + void fix_sign_by_sweeping(const stk::mesh::BulkData& mesh, const FieldRef distance_field, const double signed_narrow_band); + +}} + +#endif // Akri_DistanceSweeper_h diff --git a/packages/krino/krino/krino_lib/Akri_Element.cpp b/packages/krino/krino/krino_lib/Akri_Element.cpp new file mode 100644 index 000000000000..3eb348e43e1a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element.cpp @@ -0,0 +1,1077 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" +#include +namespace krino{ + +ElementObj::ElementObj(const stk::mesh::BulkData & stkMesh, stk::mesh::Entity elemEntity) + : my_master_elem(MasterElementDeterminer::getMasterElement(stkMesh.bucket(elemEntity).topology())), + my_entity(elemEntity), + my_entityId(stkMesh.identifier(elemEntity)), + my_prolongation_data(NULL) +{ +} + +ElementObj::ElementObj(const stk::topology elem_topology, const NodeVec & nodes) + : my_master_elem(MasterElementDeterminer::getMasterElement(elem_topology)), + my_nodes(nodes), + my_entity(), + my_entityId(0), + my_prolongation_data(NULL) +{ +} + +ElementObj::~ElementObj() {} + +void +ElementObj::integration_locations( + std::vector & intg_pt_locations, + const MasterElement & me) +{ + const unsigned num_intg_pts = me.num_intg_pts(); + const double * intg_pt_loc_ptr = me.intg_pt_locations(); + const unsigned dim = me.topology_dimension(); + + intg_pt_locations.resize(num_intg_pts); + for(unsigned i=0; i & intg_weights, // includes both gauss point weight and detJ + const int numCoordDims, + const std::vector & mesh_coords, + const MasterElement & me, + const MasterElement & mesh_me) +{ + const unsigned num_intg_pts = me.num_intg_pts(); + const unsigned dim = me.topology_dimension(); + + std::vector det_J(num_intg_pts); + double det_J_error; + + if ( me.get_topology() == mesh_me.get_topology() ) + { + mesh_me.determinant( numCoordDims, 1, mesh_coords.data(), det_J.data(), &det_J_error ); + } + else + { + const int num_coord_dofs = mesh_me.get_topology().num_nodes(); + const double * intg_pt_loc_ptr = me.intg_pt_locations(); + std::vector d_shapef_coords(num_coord_dofs*dim*num_intg_pts); + mesh_me.shape_fcn_deriv(num_intg_pts, intg_pt_loc_ptr, d_shapef_coords.data()); + mesh_me.determinant( + numCoordDims, // Number of coordinate dimensions + num_intg_pts, // Number of target points + num_coord_dofs, // Number of coord shape functions + d_shapef_coords.data(), // Mesh shape function derivatives + 1, // Number of elements + mesh_coords.data(), // Mesh coordinate values + det_J.data(), // Determinant of the transformation Jacobian for each element (output) + &det_J_error ); // Determinant error (output) + } + + const double * intg_wt_ptr = me.intg_weights(); + + intg_weights.resize(num_intg_pts); + for(unsigned i=0; i & result, unsigned dim, unsigned npe) +{ + if (npe == 0) + { + npe = mesh.bucket(element).topology().num_nodes(); + } + result.resize(npe*dim); + + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(element); + + for (unsigned n=0; n(field, elem_nodes[n]); + for (unsigned d=0; d coords; + ElementObj::gather_nodal_field(mesh, element, coords_field, coords, dim); + + const MasterElement& master_elem = MasterElementDeterminer::getMasterElement(mesh.bucket(element).topology()); + + std::vector intg_weights; + ElementObj::integration_weights( intg_weights, dim, coords, master_elem ); + + double vol = 0.0; + for ( double intg_wt : intg_weights ) + { + vol += intg_wt; + } + return vol; +} + +PhaseTag +ElementObj::update_phase(const CDMesh & mesh, const PhaseTag & startPhase, const InterfaceID interface_key, const int sign) +{ + PhaseTag phase = startPhase; + if (sign == -1 || sign == 1) + { + if (interface_key.is_single_ls()) + { + phase.add(mesh.ls_field(interface_key.first_ls()).identifier,sign); + } + else + { + const int other_ls_id = (sign < 0) ? interface_key.second_ls() : interface_key.first_ls(); + if (phase.contain(mesh.ls_field(other_ls_id).identifier, -1)) + { + const int ls_id = (sign < 0) ? interface_key.first_ls() : interface_key.second_ls(); + + phase.clear(); + phase.add(mesh.ls_field(ls_id).identifier, -1); + } + } + } + + return phase; +} + +PhaseTag +ElementObj::update_phase(const CDMesh & mesh, const PhaseTag & startPhase, const std::vector & interfaces, const std::vector & interfaceSigns) +{ + PhaseTag phase = startPhase; + const int numInterfaces = interfaces.size(); + ThrowRequire((int)interfaceSigns.size() == numInterfaces); + + if (numInterfaces > 0) + { + bool badConfig = false; + int iterCount = 0; + while (true) + { + PhaseTag iterationPhase = phase; + for (int i=0; i numInterfaces) + { + krinolog << "BAD INTERFACE CROSSING CONFIG WITH STARTING PHASE: " << startPhase << stk::diag::dendl; + for (int i=0; i & nodeOwnerCoords) const +{ + nodeOwnerCoords.clear(); + nodeOwnerCoords.reserve(my_nodes.size()); + + for ( auto && node : my_nodes ) + nodeOwnerCoords.push_back(node->owner_coords(owner)); +} + +Vector3d +ElementObj::compute_local_coords_from_owner_coordinates(const Mesh_Element * owner, const Vector3d & ptOwnerCoords) const +{ + std::vector nodeOwnerCoords; + fill_node_owner_coords(owner, nodeOwnerCoords); + + ThrowAssert((spatial_dim() == 2 && (nodeOwnerCoords.size() == 3 || nodeOwnerCoords.size() == 6)) || + (spatial_dim() == 3 && (nodeOwnerCoords.size() == 4 || nodeOwnerCoords.size() == 10))); + if (spatial_dim() == 2 && nodeOwnerCoords.size() == 6) + nodeOwnerCoords.resize(3); + else if (spatial_dim() == 3 && nodeOwnerCoords.size() == 10) + nodeOwnerCoords.resize(4); + + return get_parametric_coordinates_of_point(nodeOwnerCoords, ptOwnerCoords); +} + +void +ElementObj::integration_weights( + std::vector & intg_weights, // includes both gauss point weight and detJ + const MasterElement & me ) const +{ + const unsigned dim = spatial_dim(); + const unsigned nnodes = my_nodes.size(); + std::vector flat_coords(nnodes*dim); + for ( unsigned n = 0; n < nnodes; n++ ) + { + const Vector3d & node_coords = my_nodes[n]->coordinates(); + for (unsigned d=0; d intg_weights; + integration_weights( intg_weights, my_master_elem ); + + double vol = 0.0; + + for ( double intg_weight : intg_weights ) + { + vol += intg_weight; + } + return vol; +} + +void ElementObj::add_subelement(std::unique_ptr subelem) +{ + my_subelements.emplace_back(std::move(subelem)); +} + +void ElementObj::get_subelements( std::vector & subelems ) const +{ + if ( !my_subelements.empty() ) + { + for ( auto && subelem : my_subelements ) + { + subelem->get_subelements(subelems); + } + return; + } + + const SubElement * subelem = dynamic_cast( this ); + if (NULL != subelem) subelems.push_back(subelem); +} + +void ElementObj::get_subelements( std::vector & subelems ) +{ + if ( !my_subelements.empty() ) + { + for ( auto && subelem : my_subelements ) + { + subelem->get_subelements(subelems); + } + return; + } + + SubElement * subelem = dynamic_cast( this ); + if (NULL != subelem) subelems.push_back(subelem); +} + +bool +ElementObj::have_refined_edges() const +{ /* %TRACE% */ /* %TRACE% */ + + const stk::topology Top = topology(); + const int num_edges = Top.num_edges(); + + for ( int edge = 0; edge < num_edges; edge++ ) + { + const unsigned * const lnn = get_edge_node_ordinals(Top, edge); + + const int num_edge_nodes = Top.edge_topology(edge).num_nodes(); + ThrowRequire(2 == num_edge_nodes || 3 == num_edge_nodes); + + if ((2 == num_edge_nodes && + NULL != SubElementNode::common_child({my_nodes[lnn[0]], my_nodes[lnn[1]]})) || + (3 == num_edge_nodes && + (NULL != SubElementNode::common_child({my_nodes[lnn[0]], my_nodes[lnn[2]]}) || + NULL != SubElementNode::common_child({my_nodes[lnn[1]], my_nodes[lnn[2]]})))) + { + return true; + } + } + return false; +} + +void ElementObj::cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains) +{ + throw std::runtime_error("Incorrect usage of ElementObj. The type of element cannot cut_interior_intersection_point."); +} + +void ElementObj::cut_face_intersection_point(const int iFace, const Vector3d & pCoords, const std::vector & sortedDomains) +{ + throw std::runtime_error("Incorrect usage of ElementObj. The type of element cannot cut_face_intersection_point."); +} + +bool ElementObj::captures_intersection_point_domains(const std::vector & intersectionPointDomains) const +{ + for (auto && node : my_nodes) + if (node->captures_intersection_point_domains(intersectionPointDomains)) + return true; + return false; +} + +void +ElementObj::prolongate_fields(const CDMesh & mesh) const +{ + const CDMesh* old_mesh = mesh.get_old_mesh(); + if (nullptr != old_mesh) + { + const FieldSet & element_fields = mesh.get_element_fields(); + if (element_fields.empty()) return; + + const ProlongationElementData * prolong_element = NULL; + const SubElement * subelem = dynamic_cast(this); + if (NULL == subelem) + { + prolong_element = old_mesh->fetch_prolong_element(entityId()); + } + else + { + prolong_element = old_mesh->fetch_prolong_element(subelem->get_owner().entityId()); + } + + //I think that adaptivity currently can lead to prolong_element == NULL: ThrowAssert(NULL != prolong_element); + + for(FieldSet::const_iterator it = element_fields.begin(); it != element_fields.end(); ++it) + { + const FieldRef field = *it; + + double * val = field_data(field, entity()); + if (NULL == val) continue; + + const unsigned field_length = field.length(); + + const double * owner_val = (NULL == prolong_element) ? NULL : prolong_element->get_field_data(field); + if (NULL == owner_val) + { + std::fill(val, val+field_length, 0.); + } + else + { + std::copy(owner_val, owner_val+field_length, val); + } + } + } +} + +const MasterElement* +ElementObj::get_evaluation_master_element(const FieldRef field) const +{ /* %TRACE% */ /* %TRACE% */ + // Supports Q1Q1, Q2Q2, and Q2Q1 cases + const MasterElement* calc_master_elem = &master_elem(); + const unsigned full_npe = master_elem().get_topology().num_nodes(); + ThrowAssert(field.type_is()); + + for ( unsigned n = 0; n < full_npe; n++ ) + { + double * data = field_data(field, my_nodes[n]->entity()); + if (nullptr == data) + { + calc_master_elem = &MasterElementDeterminer::getMasterElement(master_elem().get_topology().base()); + ThrowRequire(n >= calc_master_elem->num_nodes()); + break; + } + } + return calc_master_elem; +} + +void +ElementObj::evaluate_prolongation_field(const CDMesh & mesh, const FieldRef field, const unsigned field_length, const Vector3d & p_coords, double * result) const +{ /* %TRACE% */ /* %TRACE% */ + + // Figuring out the field master element here is actually quite hard since the entity may not exist any more. + // We'll assume that the field master element is the master_elem or the one with topology master_elem->get_topology().base(). + // This will handle the Q2Q1 case. + + for (unsigned i=0; i node_data(full_npe, nullptr); + const std::vector zeros(field_length,0.0); + + for ( int n = 0; n < full_npe; n++ ) + { + const ProlongationNodeData * prolong_data = mesh.fetch_prolong_node(my_nodes[n]->entityId()); + if (nullptr != prolong_data) node_data[n] = prolong_data->get_field_data(field); + if (node_data[n] == nullptr) + { + if (!initial_field.valid()) + { + initial_field = mesh.get_cdfem_support().get_initial_prolongation_field( field ); + } + if (initial_field.valid()) + { + node_data[n] = prolong_data->get_field_data(initial_field); + } + } + if (node_data[n] == nullptr) + { + calc_master_elem = &MasterElementDeterminer::getMasterElement(master_elem().get_topology().base()); + node_data[n] = zeros.data(); + } + } + + const int npe = calc_master_elem->get_topology().num_nodes(); + std::vector shapefcn (npe,0.); + calc_master_elem->shape_fcn(1, p_coords.data(), shapefcn.data()); + + for ( int n = 0; n < npe; n++ ) + { + ThrowRequire(nullptr != node_data[n]); + for (unsigned i=0; idetermine_decomposed_elem_phase(mesh); + } + // Phase for Mesh_Element with subelements is left empty + return; + } +} + +static std::function &)> +cut_element_intersecting_planes_diagonal_picker(const NodeVec & cutElemNodes) +{ + auto intersectingPlanesDiagonalPicker = + [&cutElemNodes](const std::array & faceNodes) + { + return ElementObj::determine_diagonal_for_internal_quad_of_cut_tet_from_owner_nodes(cutElemNodes[faceNodes[0]], cutElemNodes[faceNodes[1]], cutElemNodes[faceNodes[2]], cutElemNodes[faceNodes[3]]); + }; + return intersectingPlanesDiagonalPicker; +} + +std::function &)> +Mesh_Element::get_diagonal_picker() const +{ + return cut_element_intersecting_planes_diagonal_picker(my_nodes); +} + + +bool +Mesh_Element::is_single_coincident() const +{ + std::vector conformal_subelems; + get_subelements(conformal_subelems); + if(conformal_subelems.size() != 1) return false; + + const SubElement * subelem = conformal_subelems[0]; + if(subelem->topology() != coord_topology()) return false; + if (get_nodes() != subelem->get_nodes()) return false; + return true; +} + +Mesh_Element::~Mesh_Element() {} + +Mesh_Element::Mesh_Element(CDMesh & mesh, + stk::mesh::Entity elemEntity) + : ElementObj(mesh.stk_bulk(), elemEntity), + my_subelement_order(0), + my_have_interface(false) +{ + // set subelement specs + const stk::topology me_topology = my_master_elem.get_topology(); + + std::tie(my_subelement_topology, my_subelement_order) = determine_subelement_topology(me_topology); + ThrowRequire(stk::topology::INVALID_TOPOLOGY != my_subelement_topology); + + const unsigned npe_coords = me_topology.num_nodes(); + const stk::mesh::Entity* elem_nodes = mesh.stk_bulk().begin_nodes(my_entity); + + my_nodes.reserve(npe_coords); + const unsigned npe_base = me_topology.base().num_nodes(); + for (unsigned i=0; i npe_base) + { + my_nodes.resize(npe_coords); + ThrowRequireMsg(npe_coords == npe_base + me_topology.num_edges(), "Unexpected topology"); + for (unsigned edge_i=0; edge_i= npe_base && inode +Mesh_Element::determine_subelement_topology(stk::topology elem_topology) +{ + switch(elem_topology()) + { + case stk::topology::TRIANGLE_3_2D: + return std::pair(stk::topology::TRIANGLE_3_2D, 1); + case stk::topology::TRIANGLE_6_2D: + return std::pair(stk::topology::TRIANGLE_6_2D, 2); + case stk::topology::TETRAHEDRON_4: + return std::pair(stk::topology::TETRAHEDRON_4, 1); + case stk::topology::TETRAHEDRON_10: + return std::pair(stk::topology::TETRAHEDRON_10, 2); + default: + return std::pair(stk::topology::INVALID_TOPOLOGY, 0); + } +} + +Vector3d +Mesh_Element::get_node_parametric_coords( const int lnn ) const +{ + const double * nodal_parametric_coordinates = my_master_elem.nodal_parametric_coordinates(); + const int dim = spatial_dim(); + return Vector3d(&nodal_parametric_coordinates[lnn*dim],dim); +} + +static int get_local_node_number( const NodeVec & nodes, const SubElementNode * node ) +{ + for (size_t iNode=0; iNode conformal_subelems; + get_subelements(conformal_subelems); + + double minSqrDist = std::numeric_limits::max(); + for ( auto&& subelement : conformal_subelems ) + { + const Vector3d currentChildPCoords = subelement->compute_local_coords_from_owner_coordinates(this, ownerCoordinates); + const double currentChildSqrDist = compute_parametric_square_distance(currentChildPCoords); + if (currentChildSqrDist < minSqrDist) + { + minSqrDist = currentChildSqrDist; + child = subelement; + childPCoords = currentChildPCoords; + } + } +} + +Vector3d +Mesh_Element::coordinates( const Vector3d & p_coords ) const +{ /* %TRACE% */ /* %TRACE% */ + + const int npeCoords = my_nodes.size(); + std::vector shapeFcn(npeCoords); + my_master_elem.shape_fcn(1, p_coords.data(), shapeFcn.data()); + + Vector3d coords(Vector3d::ZERO); + for ( int n = 0; n < npeCoords; n++ ) + coords += shapeFcn[n] * my_nodes[n]->coordinates(); + + return coords; +} + +std::string Mesh_Element::visualize(const CDMesh & mesh) const +{ + std::ostringstream os; + os << "Debugging mesh element " << entityId() << " with cutter:\n" << myCutter->visualize(mesh.stk_bulk()) << "\n"; + return os.str(); +} + +double +Mesh_Element::interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const +{ + ThrowRequire(get_cutter()); + return get_cutter()->interface_crossing_position(interface, edge); +} + +static ElementIntersectionPointFilter build_element_intersection_filter(const NodeVec & nodes) +{ + auto filter = + [&nodes](const std::vector & intersectionPointDomains) + { + for (auto && node : nodes) + if (node->captures_intersection_point_domains(intersectionPointDomains)) + return false; + return true; + }; + return filter; +} + +void +Mesh_Element::fill_face_interior_intersections(const NodeVec & faceNodes, const InterfaceID & interface1, const InterfaceID & interface2, std::vector & faceIntersectionPoints) const +{ + ThrowRequire(get_cutter() && faceNodes.size() == 3); + const std::array faceNodeOwnerCoords = {{faceNodes[0]->owner_coords(this), faceNodes[1]->owner_coords(this), faceNodes[2]->owner_coords(this)}}; + const ElementIntersectionPointFilter intersectionPointFilter = build_element_intersection_filter(faceNodes); + get_cutter()->fill_tetrahedron_face_interior_intersections(faceNodeOwnerCoords, interface1, interface2, intersectionPointFilter, faceIntersectionPoints); +} + +int +Mesh_Element::interface_node_sign(const InterfaceID interface, const SubElementNode * node) const +{ + ThrowRequire(get_cutter()); + return get_cutter()->sign_at_position(interface, node->owner_coords(this)); +} + +double +Mesh_Element::interface_crossing_position(const InterfaceID interface, const SubElementNode * node1, const SubElementNode * node2) const +{ + ThrowRequire(get_cutter()); + Segment3d edge(node1->owner_coords(this), node2->owner_coords(this)); + return get_cutter()->interface_crossing_position(interface, edge); +} + +bool +Mesh_Element::is_prolonged() const +{ /* %TRACE% */ /* %TRACE% */ + for (auto && node : my_nodes) + { + if (!(node->is_prolonged())) return false; + } + return true; +} + +int Mesh_Element::get_interface_index(const InterfaceID interface) const +{ + ThrowAssert(have_interface(interface)); + const auto iter = std::lower_bound(myCuttingInterfaces.begin(), myCuttingInterfaces.end(), interface); + return std::distance(myCuttingInterfaces.begin(), iter); +} + +bool +Mesh_Element::triangulate(const CDMesh & mesh, const InterfaceGeometry & interfaceGeometry) +{ /* %TRACE% */ /* %TRACE% */ + + const auto & decomposedBlocksSelector = mesh.get_phase_support().get_all_decomposed_blocks_selector(); + const bool inDecomposedBlock = decomposedBlocksSelector(mesh.stk_bulk().bucket(entity())); + if (inDecomposedBlock) + { + create_cutter(mesh, interfaceGeometry); + + if (!myCuttingInterfaces.empty()) + my_have_interface = true; + + if (my_phase.empty()) + my_phase = interfaceGeometry.get_starting_phase(myCutter.get()); + else + my_have_interface = false; // uncut element with phase already set + } + + if (!have_subelements() && (have_interface() || have_refined_edges())) + { + create_base_subelement(); + } + + return false; +} + +const SubElementNode * get_node_matching_entity(const std::vector & nodes, stk::mesh::Entity stkNode) +{ + for (auto && node : nodes) + if (stkNode == node->entity()) + return node; + return nullptr; +} + +static IntersectionPointFilter +keep_all_intersecion_points_filter() +{ + auto filter = + [](const std::vector & intersectionPointNodes, const std::vector & intersectionPointSortedDomains) + { + return true; + }; + return filter; +} + +Vector3d Mesh_Element::get_intersection_point_parametric_coordinates(const IntersectionPoint & intersectionPoint) const +{ + Vector3d pCoords(Vector3d::ZERO); + const auto & intersectionPointNodes = intersectionPoint.get_nodes(); + const auto & intersectionPointWeights = intersectionPoint.get_weights(); + const size_t numIntersectionPointNodes = intersectionPointNodes.size(); + for (size_t iNode=0; iNodeowner_coords(this); + } + return pCoords; +} + +std::vector +Mesh_Element::get_interface_signs_based_on_crossings(const NodeVec & nodes) const +{ + std::vector nodeCoords; + std::vector*> nodeDomains; + + nodeCoords.clear(); + nodeDomains.clear(); + nodeCoords.reserve(nodes.size()); + nodeDomains.reserve(nodes.size()); + for (auto && node : nodes) + { + nodeCoords.push_back(node->owner_coords(this)); + nodeDomains.push_back(&node->get_sorted_node_domains()); + } + return get_cutter()->get_interface_signs_based_on_crossings(nodeCoords, nodeDomains); +} + +void +Mesh_Element::cut_interior_intersection_points(CDMesh & mesh) +{ /* %TRACE% */ /* %TRACE% */ + if (!have_interface()) + return; + + std::vector intersectionPoints; + stk::topology elementTopology = mesh.stk_bulk().bucket(entity()).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + const std::vector elementNodes(mesh.stk_bulk().begin_nodes(entity()), mesh.stk_bulk().end_nodes(entity())); + append_intersection_points_from_element_interior(masterElement, elementNodes, *myCutter, keep_all_intersecion_points_filter(), intersectionPoints); + + for (auto && intersectionPoint : intersectionPoints) + { + const Vector3d pCoords = get_intersection_point_parametric_coordinates(intersectionPoint); + + const ElementObj * containingElem = nullptr; + Vector3d containingElemPCoords; + find_child_coordinates_at_owner_coordinates(pCoords, containingElem, containingElemPCoords); + ThrowAssert(containingElem); + + ElementObj * elem = const_cast(containingElem); + if (!elem->captures_intersection_point_domains(intersectionPoint.get_sorted_domains())) + elem->cut_interior_intersection_point(mesh, containingElemPCoords, intersectionPoint.get_sorted_domains()); + } + + const std::vector interfaces = get_sorted_cutting_interfaces(); + for (size_t i1=0; i1cut_face_interior_intersection_points(mesh, interfaces[i1], interfaces[i2]); + } + } + + std::vector leafSubElements; + get_subelements(leafSubElements); + for (auto && leafSubElement : leafSubElements) + { + SubElement * subElem = const_cast(leafSubElement); + const std::vector interfaceSigns = get_interface_signs_based_on_crossings(subElem->get_nodes()); + subElem->set_interface_signs(interfaceSigns); + } +} + +void +Mesh_Element::create_cutter(const CDMesh & mesh, const InterfaceGeometry & interfaceGeometry) +{ /* %TRACE% */ /* %TRACE% */ + const auto intersectingPlanesDiagonalPicker = get_diagonal_picker(); + myCutter = interfaceGeometry.build_element_cutter(mesh.stk_bulk(), entity(), intersectingPlanesDiagonalPicker); + myCuttingInterfaces = myCutter->get_sorted_cutting_interfaces(); +} + +void +Mesh_Element::create_base_subelement() +{ /* %TRACE% */ /* %TRACE% */ + + stk::topology base_topology = coord_topology(); + + const unsigned num_sides = base_topology.num_sides(); + + std::vector parent_side_ids(num_sides); + for (unsigned i=0; i base_subelement; + if (stk::topology::TETRAHEDRON_4 == base_topology) + { + base_subelement = std::make_unique( my_nodes, parent_side_ids, this); + } + else if (stk::topology::TETRAHEDRON_10 == base_topology) + { + // purposely use lower order base subelement + std::vector sub_nodes(my_nodes.begin(), my_nodes.begin()+4); + base_subelement = std::make_unique( sub_nodes, parent_side_ids, this); + } + else if (stk::topology::TRIANGLE_3_2D == base_topology) + { + base_subelement = std::make_unique( my_nodes, parent_side_ids, this); + } + else if (stk::topology::TRIANGLE_6_2D == base_topology) + { + // purposely use lower order base subelement + std::vector sub_nodes(my_nodes.begin(), my_nodes.begin()+3); + base_subelement = std::make_unique( sub_nodes, parent_side_ids, this); + } + ThrowErrorMsgIf(!base_subelement, "Elements with topology " << base_topology.name() << " not supported for CDFEM."); + + base_subelement->initialize_interface_signs(); + add_subelement(std::move(base_subelement)); +} + +void +Mesh_Element::determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) +{ + if (have_interface(interface_key)) + { + for(auto && subelement : my_subelements) + { + subelement->SubElement::determine_node_signs(mesh, interface_key); + } + } +} + +void +Mesh_Element::determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) +{ + if (have_interface(interface_key)) + { + for(auto && subelement : my_subelements) + { + subelement->SubElement::determine_node_scores(mesh, interface_key); + } + } +} + +void +Mesh_Element::decompose(CDMesh & mesh, const InterfaceID interface_key) +{ + if (have_interface(interface_key)) + { + for(auto && subelement : my_subelements) + { + subelement->decompose(mesh, interface_key); + } + } +} + +void +Mesh_Element::handle_hanging_children(CDMesh & mesh, const InterfaceID & interface) +{ + if (!have_subelements() && have_edges_with_children()) + { + create_base_subelement(); + } + + for(auto && subelement : my_subelements) + { + subelement->handle_hanging_children(mesh, interface); + } +} + +void +Mesh_Element::build_quadratic_subelements(CDMesh & mesh) +{ + if (2 == subelement_order()) + { + for (auto && subelement : my_subelements) + { + subelement->build_quadratic_subelements(mesh); + } + } +} + +int +ElementObj::evaluate_quad(const SubElementNode * n0, const SubElementNode * n1, const SubElementNode * n2, const SubElementNode * n3) +{ /* %TRACE% */ /* %TRACE% */ + return evaluate_quad(n0->coordinates(), n1->coordinates(), n2->coordinates(), n3->coordinates()); +} + +int +ElementObj::evaluate_quad(const Vector3d & x0, const Vector3d & x1, const Vector3d & x2, const Vector3d & x3) +{ /* %TRACE% */ /* %TRACE% */ + // given 4 angles + // angle0 - angle subtended by (x3-x0) and (x1-x0) + // angle1 - angle subtended by (x0-x1) and (x2-x1) + // angle2 - angle subtended by (x1-x2) and (x3-x2) + // angle3 - angle subtended by (x2-x3) and (x0-x3) + // returns -1 if the max of angle 0 and angle 2 is significant larger than the max of angle 1 and angle 3 + // returns +1 if the opposite is true + // returns 0 if neither is true (the max angles are basically the same) OR one of the sides is degenerate + + const Vector3d side0 = x1 - x0; + const Vector3d side1 = x2 - x1; + const Vector3d side2 = x3 - x2; + const Vector3d side3 = x0 - x3; + + const double side_len0 = side0.length(); + const double side_len1 = side1.length(); + const double side_len2 = side2.length(); + const double side_len3 = side3.length(); + + // here, meas0 = -cos(angle0) * side_len0*side_len1*side_len2*side_len3 + const double meas0 = Dot(side3,side0) * side_len1*side_len2; + const double meas1 = Dot(side0,side1) * side_len2*side_len3; + const double meas2 = Dot(side1,side2) * side_len3*side_len0; + const double meas3 = Dot(side2,side3) * side_len0*side_len1; + + if ( krinolog.shouldPrint(LOG_DEBUG) ) + { + krinolog << "Lengths: " << side_len0 << ", " << side_len1 << ", " << side_len2 << ", " << side_len3 << "\n"; + krinolog << "Angle measures: " << meas0 << ", " << meas1 << ", " << meas2 << ", " << meas3 << "\n"; + krinolog << "Angles: " << std::acos(-meas0/(side_len0*side_len1*side_len2*side_len3))*180.0/3.141592654 << ", " + << std::acos(-meas1/(side_len0*side_len1*side_len2*side_len3))*180.0/3.141592654 << ", " + << std::acos(-meas2/(side_len0*side_len1*side_len2*side_len3))*180.0/3.141592654 << ", " + << std::acos(-meas3/(side_len0*side_len1*side_len2*side_len3))*180.0/3.141592654 << "\n"; + } + + const double meas02 = std::max(meas0,meas2); + const double meas13 = std::max(meas1,meas3); + + const double tol = std::numeric_limits::epsilon()*(side_len0*side_len1*side_len2*side_len3); + + if (meas02 > (meas13 + tol)) + { + return -1; + } + else if (meas13 > (meas02 + tol)) + { + return +1; + } + else + { + return 0; + } +} + +bool +ElementObj::have_edges_with_children() const +{ /* %TRACE% */ /* %TRACE% */ + const int num_edges = topology().num_edges(); + + // Iterate edges looking for any common children of the edge nodes + for ( int edge = 0; edge < num_edges; ++edge ) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topology(), edge); + + const SubElementNode * node0 = my_nodes[edge_node_ordinals[0]]; + const SubElementNode * node1 = my_nodes[edge_node_ordinals[1]]; + const SubElementNode * child = SubElementNode::common_child({node0, node1}); + if( child ) + { + return true; + } + } + return false; +} + +bool +ElementObj::determine_diagonal_for_internal_quad_of_cut_tet_from_owner_nodes(const SubElementNode * pn0, const SubElementNode * pn1, const SubElementNode * pn2, const SubElementNode * pn3) +{ + // true: connect child of pn0 and pn2 (n0) to child of pn1 and pn3 (n2) + // false: connect child of pn1 and pn2 (n1) to child of pn0 and pn3 (n3) + + // This method is used for the cutter. For CUT_QUADS_BY_GLOBAL_IDENTIFIER, use logic that is consistent with the way elements are cut. + // For other strategies, still use id based logic because this is only being used for the cutter, and it will be removed when + // we use the actual facets instead of the cutter. + + stk::mesh::EntityId pn0_id = pn0->entityId(); + stk::mesh::EntityId pn1_id = pn1->entityId(); + stk::mesh::EntityId pn2_id = pn2->entityId(); + stk::mesh::EntityId pn3_id = pn3->entityId(); + + ThrowAssert(pn0_id != 0 && pn1_id != 0 && pn2_id != 0 && pn3_id != 0); + + if ((pn0_id < pn1_id) == (pn2_id < pn3_id)) + { + return true; + } + return false; +} + +bool +ElementObj::determine_diagonal_for_internal_quad_of_cut_tet_from_edge_nodes(const Simplex_Generation_Method simplexMethod, const SubElementNode * n0, const SubElementNode * n1, const SubElementNode * n2, const SubElementNode * n3, + const bool face0, const bool face1, const bool face2, const bool face3) +{ + // true: connect n0 and n2, false: connect n1 and n3 + + if (simplexMethod == CUT_QUADS_BY_GLOBAL_IDENTIFIER) + { + SubElementNodeAncestry ancestry0 = n0->get_ancestry(); + SubElementNodeAncestry ancestry1 = n1->get_ancestry(); + SubElementNodeAncestry ancestry2 = n2->get_ancestry(); + SubElementNodeAncestry ancestry3 = n3->get_ancestry(); + + SubElementNodeAncestry ancestry02 = std::min(ancestry0, ancestry2); + SubElementNodeAncestry ancestry13 = std::min(ancestry1, ancestry3); + + return (ancestry02 < ancestry13); + } + + // Make sure that diagonal can be picked either way and still avoid Steiner point + const int caseId = (face0 ? 1 : 0) + (face1 ? 2 : 0) + (face2 ? 4 : 0) + (face3 ? 8 : 0); + ThrowRequire(caseId == 3 || caseId == 5 || caseId == 10 || caseId == 12); + + return (evaluate_quad(n0,n1,n2,n3) == -1); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Element.hpp b/packages/krino/krino/krino_lib/Akri_Element.hpp new file mode 100644 index 000000000000..10f0f06a1da5 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element.hpp @@ -0,0 +1,207 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Element_h +#define Akri_Element_h + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" +namespace krino { + +class SubElement; +class SubElementNode; +class ProlongationElementData; +class IntersectionPoint; +class ElementIntersection; + +class ElementObj { +public: + + ElementObj(const stk::mesh::BulkData & stkMesh, stk::mesh::Entity elemEntity); + ElementObj(const stk::topology elem_topology, const NodeVec & nodes); + + virtual ~ElementObj(); // Definition must in implementation file because SubElement is incomplete + + static bool is_less(const ElementObj * elem0,const ElementObj * elem1) { return (elem0->entityId() < elem1->entityId()); } + + static int evaluate_quad(const SubElementNode * n0, const SubElementNode * n1, const SubElementNode * n2, const SubElementNode * n3); + static int evaluate_quad(const Vector3d & x0, const Vector3d & x1, const Vector3d & x2, const Vector3d & x3); + static bool determine_diagonal_for_internal_quad_of_cut_tet_from_owner_nodes(const SubElementNode * pn0, const SubElementNode * pn1, const SubElementNode * pn2, const SubElementNode * pn3); + static bool determine_diagonal_for_internal_quad_of_cut_tet_from_edge_nodes(const Simplex_Generation_Method simplexMethod, const SubElementNode * n0, const SubElementNode * n1, const SubElementNode * n2, const SubElementNode * n3, + const bool face0, const bool face1, const bool face2, const bool face3); + + int spatial_dim() const { return my_master_elem.topology_dimension(); } + const NodeVec & get_nodes() const { return my_nodes; } + unsigned num_nodes() const { return my_nodes.size(); } + const PhaseTag & get_phase() const { return my_phase; } + void set_phase(const PhaseTag & phase) { my_phase = phase; } + stk::mesh::EntityId entityId() const { return my_entityId; } + bool check_entity(const stk::mesh::BulkData & mesh) const { return (my_entityId == 0) ? (my_entity == stk::mesh::Entity()) : (mesh.is_valid(my_entity) && my_entityId == mesh.identifier(my_entity)); } + stk::mesh::Entity entity() const { return my_entity; } + void set_entity( const stk::mesh::BulkData & mesh, stk::mesh::Entity meshEntity ) const { my_entity = meshEntity; my_entityId = mesh.identifier(my_entity); } + + const MasterElement & master_elem() const { return my_master_elem; } + stk::topology topology() const { return my_master_elem.get_topology(); } + void std_intg_pts( sierra::Array & intg_pt_locations, + sierra::Array & intg_weights, + sierra::ArrayContainer & det_J, + const sierra::ArrayContainer & coords, + const MasterElement & me ) const; + void std_intg_pts( sierra::Array & intg_pt_locations, + sierra::Array & intg_weights, + sierra::ArrayContainer & det_J, + const sierra::ArrayContainer & coords ) const { std_intg_pts(intg_pt_locations, intg_weights, det_J, coords, my_master_elem); } + + void fill_node_owner_coords(const Mesh_Element * owner, std::vector & coords) const; + Vector3d compute_local_coords_from_owner_coordinates(const Mesh_Element * owner, const Vector3d & coords) const; + + void integration_weights( + std::vector & intg_weights, // includes both gauss point weight and detJ + const MasterElement & me ) const; + void integration_weights( + std::vector & intg_weights ) const { return integration_weights(intg_weights, my_master_elem); } + static void integration_weights( + std::vector & intg_weights, // includes both gauss point weight and detJ + const int numCoordDims, + const std::vector & mesh_coords, + const MasterElement & me, + const MasterElement & mesh_me); + static void integration_weights( + std::vector & intg_weights, // includes both gauss point weight and detJ + const int numCoordDims, + const std::vector & mesh_coords, + const MasterElement & me) { integration_weights(intg_weights, numCoordDims, mesh_coords, me, me); } + static void integration_locations( + std::vector & intg_pt_locations, + const MasterElement & me); + static void gather_nodal_field(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef field, std::vector & result, unsigned dim = 1, unsigned npe = 0); + static double volume(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coords_field); + static PhaseTag update_phase(const CDMesh & mesh, const PhaseTag & startPhase, const InterfaceID interface_key, const int sign); + static PhaseTag update_phase(const CDMesh & mesh, const PhaseTag & startPhase, const std::vector & interfaces, const std::vector & interfaceSigns); + + const MasterElement* get_evaluation_master_element(const FieldRef field) const; + void evaluate_prolongation_field(const CDMesh & mesh, const FieldRef field, const unsigned field_length, const Vector3d & p_coords, double * result) const; + + void add_subelement(std::unique_ptr subelem); + void get_subelements( std::vector & subelems ) const; + void get_subelements( std::vector & subelems ); + bool have_subelements() const { return !my_subelements.empty(); } + unsigned num_subelements() const { return my_subelements.size(); } + bool have_refined_edges() const; + + virtual void determine_decomposed_elem_phase(const CDMesh & mesh) { ThrowRequire(false); } + virtual void cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains); + virtual void cut_face_intersection_point(const int iFace, const Vector3d & pCoords, const std::vector & sortedDomains); + bool have_edges_with_children() const; + bool captures_intersection_point_domains(const std::vector & intersectionPointDomains) const; + bool face_captures_intersection_point_domains(const int iFace, const std::vector & intersectionPointDomains) const; + + ProlongationElementData * get_prolongation_data() const { return my_prolongation_data; } + void set_prolongation_data( ProlongationElementData * data ) const { my_prolongation_data = data; } + + void prolongate_fields(const CDMesh & mesh) const; + +protected: + const MasterElement& my_master_elem; + std::vector my_nodes; + std::vector> my_subelements; + PhaseTag my_phase; + mutable stk::mesh::Entity my_entity; + mutable stk::mesh::EntityId my_entityId; + mutable ProlongationElementData * my_prolongation_data; + +private: + //: Default constructor not allowed + ElementObj(); +}; + +class Mesh_Element : public ElementObj { +public: + + Mesh_Element(CDMesh & mesh, stk::mesh::Entity elemEntity); + + virtual ~Mesh_Element(); + + static bool is_supported_topology(stk::topology elem_topology) { return determine_subelement_topology(elem_topology).first != stk::topology::INVALID_TOPOLOGY; } + static std::pair determine_subelement_topology(stk::topology elem_topology); + + Vector3d get_node_parametric_coords( const int lnn ) const; + Vector3d get_node_parametric_coords( const SubElementNode * node ) const; + + const MasterElement & coord_master_elem() const { return my_master_elem; } + + stk::topology coord_topology() const { return my_master_elem.get_topology(); } + + const stk::topology & subelement_topology() const { return my_subelement_topology; } + int subelement_order() const { return my_subelement_order; } + + std::string visualize(const CDMesh & mesh) const; + double interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const; + int interface_node_sign(const InterfaceID interface, const SubElementNode * node) const; + void fill_face_interior_intersections(const NodeVec & faceNodes, const InterfaceID & interface1, const InterfaceID & interface2, std::vector & faceIntersectionPoints) const; + double interface_crossing_position(const InterfaceID interface, const SubElementNode * node1, const SubElementNode * node2) const; + std::function &)> get_diagonal_picker() const; + + const ElementCutter * get_cutter() const { return myCutter.get(); } + ElementCutter * get_cutter() { return myCutter.get(); } + + bool is_prolonged() const; + Vector3d coordinates( const Vector3d & p_coords ) const; + + PhaseTag determine_phase_at_location(const Vector3d & location) const; + bool have_interface() const { return my_have_interface; } + bool have_interface(const InterfaceID interface) const { return std::binary_search(myCuttingInterfaces.begin(), myCuttingInterfaces.end(), interface); } + int get_num_interfaces() const { return myCuttingInterfaces.size(); } + int get_interface_index(const InterfaceID interface) const; + const std::vector & get_sorted_cutting_interfaces() const { return myCuttingInterfaces; } + virtual void determine_decomposed_elem_phase(const CDMesh & mesh) override; + + bool triangulate(const CDMesh & mesh, const InterfaceGeometry & interfaceGeometry); //return value indicates if any changes were made + void create_cutter(const CDMesh & mesh, const InterfaceGeometry & interfaceGeometry); + void create_base_subelement(); + void determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key); + void determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key); + void decompose(CDMesh & mesh, const InterfaceID interface_key); + void handle_hanging_children(CDMesh & mesh, const InterfaceID & interface); + void build_quadratic_subelements(CDMesh & mesh); + std::vector get_interface_signs_based_on_crossings(const NodeVec & nodes) const; + void cut_interior_intersection_points(CDMesh & mesh); + + void find_child_coordinates_at_owner_coordinates(const Vector3d & ownerCoordinates, const ElementObj *& child, Vector3d & child_p_coords) const; + + double volume() const; + + bool is_single_coincident() const; + +private: + Mesh_Element() = delete; + Vector3d get_intersection_point_parametric_coordinates(const IntersectionPoint & intersectionPoint) const; + std::vector gather_nodal_coordinates() const; + + int my_subelement_order; + stk::topology my_subelement_topology; + bool my_have_interface; + + std::unique_ptr myCutter; + std::vector myCuttingInterfaces; +}; + +} // namespace krino + +#endif // Akri_Element_h diff --git a/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.cpp b/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.cpp new file mode 100644 index 000000000000..e640df211435 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.cpp @@ -0,0 +1,184 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" +#include + +namespace krino { + +static void fill_nodal_shape_functions(const MasterElement & masterElement, const Vector3d & elementParametricCoords, std::vector & nodalShapeFunctions) +{ + const int npe = masterElement.num_nodes(); + nodalShapeFunctions.resize(npe); + masterElement.shape_fcn(1, elementParametricCoords.data(), nodalShapeFunctions.data()); +} + +static ElementIntersectionPointFilter build_element_intersection_filter(const std::vector & nodes, + const IntersectionPointFilter & intersectionPointFilter) +{ + auto filter = + [&nodes, &intersectionPointFilter](const std::vector & intersectionPointSortedDomains) + { + return intersectionPointFilter(nodes, intersectionPointSortedDomains); + }; + return filter; +} + +static void append_intersection_points_from_interior(const MasterElement & masterElement, + const std::vector & intersectionPointNodes, + const std::vector & interiorIntersections, + std::vector & intersectionPoints) +{ + if (interiorIntersections.empty()) + return; + + const bool intersectionPointIsOwned = true; + + std::vector intersectionPointWeights; + for (auto & interiorIntersection : interiorIntersections) + { + fill_nodal_shape_functions(masterElement, interiorIntersection.parametricCoords, intersectionPointWeights); + intersectionPoints.emplace_back(intersectionPointIsOwned, intersectionPointNodes, intersectionPointWeights, interiorIntersection.sortedDomains); + } +} + +static void append_intersection_points_from_element_face(const MasterElement & elementMasterElement, + const std::vector & elementNodes, + const int iFace, + const ElementCutter & elementCutter, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) +{ + std::vector interiorIntersections; + + const std::vector interfaces = elementCutter.get_sorted_cutting_interfaces(); + + std::array faceNodeOrdinals; + elementMasterElement.get_topology().face_node_ordinals(iFace, faceNodeOrdinals.data()); + const std::vector faceNodes{elementNodes[faceNodeOrdinals[0]], elementNodes[faceNodeOrdinals[1]], elementNodes[faceNodeOrdinals[2]]}; + const double * elemNodeParamCoords = elementMasterElement.nodal_parametric_coordinates(); + const std::array faceNodeCoordinates = {{Vector3d(elemNodeParamCoords+3*faceNodeOrdinals[0]), Vector3d(elemNodeParamCoords+3*faceNodeOrdinals[1]), Vector3d(elemNodeParamCoords+3*faceNodeOrdinals[2])}}; + + const MasterElement & faceMasterElement = MasterElementDeterminer::getMasterElement(elementMasterElement.get_topology().face_topology(iFace)); + const ElementIntersectionPointFilter faceIntersectionPointFilter = build_element_intersection_filter(faceNodes, intersectionPointFilter); + + std::vector sortedDomains; + for (size_t i1=0; i1 & elementNodes, + const int iFace) +{ + stk::mesh::EntityId elementId = mesh.identifier(element); + std::vector faceNodes(elementTopology.face_topology(iFace).num_nodes()); + std::vector faceElements; + elementTopology.face_nodes(elementNodes, iFace, faceNodes.data()); + stk::mesh::get_entities_through_relations(mesh, faceNodes, stk::topology::ELEMENT_RANK, faceElements); + + for (auto faceElement : faceElements) + if (mesh.identifier(faceElement) < elementId && elementSelector(mesh.bucket(faceElement))) + return false; + return true; +} + +static void append_intersection_points_from_within_element_and_owned_faces(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & parentElementSelector, + const stk::mesh::Entity element, + const InterfaceGeometry & geometry, + const std::function &)> & diagonalPicker, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) +{ + stk::topology elementTopology = mesh.bucket(element).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + const std::vector elementNodes(mesh.begin_nodes(element), mesh.end_nodes(element)); + + std::unique_ptr elementCutter = geometry.build_element_cutter(mesh, element, diagonalPicker); + if (elementCutter->might_have_interior_or_face_intersections()) + { + append_intersection_points_from_element_interior(masterElement, elementNodes, *elementCutter, intersectionPointFilter, intersectionPoints); + + const int numFaces = masterElement.get_topology().num_faces(); + if (numFaces > 0) + { + for (int iFace=0; iFace &)> +temporary_build_always_true_diagonal_picker() +{ + auto diagonalPicker = + [](const std::array & faceNodes) + { + return true; + }; + return diagonalPicker; +} + +void append_intersection_points_from_within_elements_and_owned_faces(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & parentElementSelector, + const std::vector & elements, + const InterfaceGeometry & geometry, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) +{ + const auto diagonalPicker = temporary_build_always_true_diagonal_picker(); + + for (auto element : elements) + { + if (parentElementSelector(mesh.bucket(element))) + { + append_intersection_points_from_within_element_and_owned_faces(mesh, + parentElementSelector, + element, + geometry, + diagonalPicker, + intersectionPointFilter, + intersectionPoints); + } + } +} + +void append_intersection_points_from_element_interior(const MasterElement & masterElement, + const std::vector & nodes, + const ElementCutter & elementCutter, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) +{ + std::vector interiorIntersections; + const ElementIntersectionPointFilter elementIntersectionPointFilter = build_element_intersection_filter(nodes, intersectionPointFilter); + elementCutter.fill_interior_intersections(elementIntersectionPointFilter, interiorIntersections); + append_intersection_points_from_interior(masterElement, nodes, interiorIntersections, intersectionPoints); +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.hpp b/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.hpp new file mode 100644 index 000000000000..051f02e028fd --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ElementCutterUtils.hpp @@ -0,0 +1,37 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_ELEMENTCUTTERUTILS_H_ +#define KRINO_INCLUDE_AKRI_ELEMENTCUTTERUTILS_H_ +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +void append_intersection_points_from_element_interior(const MasterElement & masterElement, + const std::vector & nodes, + const ElementCutter & elementCutter, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints); + +void append_intersection_points_from_within_elements_and_owned_faces(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & parentElementSelector, + const std::vector & elements, + const InterfaceGeometry & geometry, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints); + +} + +#endif /* KRINO_INCLUDE_AKRI_ELEMENTCUTTERUTILS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_Element_Cutter.cpp b/packages/krino/krino/krino_lib/Akri_Element_Cutter.cpp new file mode 100644 index 000000000000..bea70cbe6fdb --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element_Cutter.cpp @@ -0,0 +1,1064 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Akri_MasterElementDeterminer.hpp" + +namespace krino { + +bool all_interfaces_have_single_level_set(const std::vector &interfaces) +{ + for (auto && interface : interfaces) + if (interface.first_ls() != interface.second_ls()) + return false; + return true; +} + +void fill_sorted_domains(const bool isOneLSPerPhase,const InterfaceID & interface0, const InterfaceID & interface1, std::vector & sortedDomains) +{ + sortedDomains.clear(); + if (isOneLSPerPhase) + { + + sortedDomains = {interface0.first_ls(), interface0.second_ls(), interface1.first_ls(), interface1.second_ls()}; + stk::util::sort_and_unique(sortedDomains); + } + else + { + ThrowAssert(all_interfaces_have_single_level_set({interface0, interface1})); + sortedDomains = {interface0.first_ls(), interface1.first_ls()}; + } +} + +void fill_sorted_domains(const bool isOneLSPerPhase,const InterfaceID & interface0, const InterfaceID & interface1, const InterfaceID & interface2, std::vector & sortedDomains) +{ + sortedDomains.clear(); + if (isOneLSPerPhase) + { + + sortedDomains = {interface0.first_ls(), interface0.second_ls(), interface1.first_ls(), interface1.second_ls(), interface2.first_ls(), interface2.second_ls()}; + stk::util::sort_and_unique(sortedDomains); + } + else + { + ThrowAssert(all_interfaces_have_single_level_set({interface0, interface1, interface2})); + sortedDomains = {interface0.first_ls(), interface1.first_ls(), interface2.first_ls()}; + } +} + +bool sorted_domains_form_triple_point(const bool is_one_interface_per_phase, const std::vector & sortedDomains) +{ + return !is_one_interface_per_phase || sortedDomains.size() == 3; +} + +bool sorted_domains_form_quadruple_point(const bool is_one_interface_per_phase, const std::vector & sortedDomains) +{ + return !is_one_interface_per_phase || sortedDomains.size() == 4; +} + +void fill_tetrahedron_face_surface_intersection_points(const int iFace, const Cutting_Surface * surf0, const Cutting_Surface * surf1, const std::vector & sortedDomains, std::vector & intersections) +{ + Vector3d intersectionPoint; + if (find_intersection_of_two_planes_and_side_of_tet(iFace, surf0->get_plane(), surf1->get_plane(), intersectionPoint)) + intersections.emplace_back(intersectionPoint, sortedDomains); +} + +void fill_tetrahedron_interior_surface_intersection_points(const Cutting_Surface * surf0, const Cutting_Surface * surf1, const Cutting_Surface * surf2, const std::vector & sortedDomains, std::vector & intersections) +{ + Vector3d intersectionPoint; + if (find_intersection_of_three_planes_within_tet(surf0->get_plane(), surf1->get_plane(), surf2->get_plane(), intersectionPoint)) + intersections.emplace_back(intersectionPoint, sortedDomains); +} + +std::string visualize_element(const stk::topology & topology, std::array & usedGeomIds) +{ + const auto & masterElem = MasterElementDeterminer::getMasterElement(topology); + const double * elemNodeParamCoords = masterElem.nodal_parametric_coordinates(); + + const unsigned numNodes = topology.num_nodes(); + const int dim = topology.dimension(); + + std::ostringstream os; + for (unsigned n=0; n usedGeomIds{0,0,0,0}; + std::string viz = visualize_element(topology, usedGeomIds); + for (auto && cuttingSurf : cuttingSurfaces) + { + std::ostringstream os; + os << cuttingSurf.first; + const std::string interfaceDesc = "on interface " + os.str(); + viz += cuttingSurf.second->print_visualization(usedGeomIds, interfaceDesc); + } + return viz; +} + + +void Element_Cutter::fill_triangle_interior_intersection_points(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const +{ + std::vector interfacesWithCuttingSurface; + fill_interfaces_with_cutting_surface(interfacesWithCuttingSurface); + + std::vector sortedDomains; + std::set> alreadyFound; + Vector3d intersectionPoint; + + intersections.clear(); + for (size_t index0=0; index0get_plane(); + const Plane3d & plane1 = cutting_surfaces.at(interfacesWithCuttingSurface[index1])->get_plane(); + if (find_intersection_of_two_2D_planes_within_tri(plane0, plane1, intersectionPoint) && + intersection_point_is_real(intersectionPoint, sortedDomains)) + { + intersections.emplace_back(intersectionPoint, sortedDomains); + } + } + } + } +} + +void Element_Cutter::fill_tetrahedron_face_interior_intersections(const std::array & faceNodes, + const InterfaceID & interface1, + const InterfaceID & interface2, + const ElementIntersectionPointFilter & intersectionPointFilter, + std::vector & intersections) const +{ + const Plane3d facePlane{faceNodes[0], faceNodes[1], faceNodes[2]}; + + std::vector sortedDomains; + Vector3d intersectionPoint; + + intersections.clear(); + fill_sorted_domains(is_one_ls_per_phase(), interface1, interface2, sortedDomains); + if (sorted_domains_form_triple_point(is_one_ls_per_phase(), sortedDomains)) + { + const Plane3d & plane0 = cutting_surfaces.at(interface1)->get_plane(); + const Plane3d & plane1 = cutting_surfaces.at(interface2)->get_plane(); + if (intersectionPointFilter(sortedDomains) && + find_intersection_of_three_planes(plane0, plane1, facePlane, intersectionPoint) && + intersection_point_is_real(intersectionPoint, sortedDomains)) + { + const Vector3d faceCoords = triangle_parametric_coordinates_of_projected_point(faceNodes, intersectionPoint); + if (within_tri_bounds(faceCoords)) + intersections.emplace_back(faceCoords, sortedDomains); + } + } +} + +void Element_Cutter::fill_tetrahedron_interior_intersection_points(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const +{ + std::vector interfacesWithCuttingSurface; + fill_interfaces_with_cutting_surface(interfacesWithCuttingSurface); + + std::vector sortedDomains; + std::set> alreadyFound; + Vector3d intersectionPoint; + + intersections.clear(); + for (size_t index0=0; index0get_plane(); + const Plane3d & plane1 = cutting_surfaces.at(interfacesWithCuttingSurface[index1])->get_plane(); + const Plane3d & plane2 = cutting_surfaces.at(interfacesWithCuttingSurface[index2])->get_plane(); + if (find_intersection_of_three_planes_within_tet(plane0, plane1, plane2, intersectionPoint) && + intersection_point_is_real(intersectionPoint, sortedDomains)) + { + intersections.emplace_back(intersectionPoint, sortedDomains); + } + } + } + } + } +} + +static ElementIntersectionPointFilter +keep_all_intersecion_points_filter() +{ + auto filter = + [](const std::vector & intersectionPointSortedDomains) + { + return true; + }; + return filter; +} + +void Element_Cutter::fill_interior_intersections(std::vector & intersections) const +{ + fill_interior_intersections(keep_all_intersecion_points_filter(), intersections); +} + +void Element_Cutter::fill_interior_intersections(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const +{ + if (myTopology.base() == stk::topology::TETRAHEDRON_4) + fill_tetrahedron_interior_intersection_points(intersectionPointFilter, intersections); + else if (myTopology.base() == stk::topology::TRIANGLE_3_2D || myTopology.base() == stk::topology::TRIANGLE_3) + fill_triangle_interior_intersection_points(intersectionPointFilter, intersections); + else + ThrowErrorMsg("Unexepected topology " << myTopology.name()); +} + +std::unique_ptr create_element_cutter(const bool oneLSPerPhase, + const MasterElement & masterElem, + const std::vector & elementParentEdges, + const std::vector & areParentEdgesAreOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker) +{ + std::unique_ptr cutter; + if(oneLSPerPhase) + cutter.reset(new One_LS_Per_Phase_Cutter(masterElem, elementParentEdges, areParentEdgesAreOrientedSameAsElementEdges, intersectingPlanesDiagonalPicker)); + else + cutter.reset(new LS_Per_Interface_Cutter(masterElem, elementParentEdges, areParentEdgesAreOrientedSameAsElementEdges, intersectingPlanesDiagonalPicker)); + + return cutter; +} + + +int +Element_Cutter::sign_at_position(const InterfaceID interface, const Vector3d & p_coords) const +{ + const auto iter = cutting_surfaces.find(interface); + if(iter == cutting_surfaces.end()) + { + // Right now, One_LS_Per_Phase_Cutter does not build up the cutting surfaces for the single_phase case. So + // we need a "default" answer. + return +1; + } + const Cutting_Surface & interface_surface = *(iter->second); + + return interface_surface.sign_at_position(p_coords); +} + +double +Element_Cutter::interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const +{ + ThrowErrorMsgIf(cutting_surfaces.find(interface) == cutting_surfaces.end(), + "No cutting surface found for interface " << interface); + const Cutting_Surface & interface_surface = *(cutting_surfaces.find(interface)->second); + return interface_surface.interface_crossing_position(edge); +} + +void +Element_Cutter::fill_interfaces_with_cutting_surface(std::vector & interfaces) const +{ + interfaces.clear(); + for (auto && entry : cutting_surfaces) + interfaces.push_back(entry.first); +} + +int +Element_Cutter::get_starting_phase_for_cutting_surfaces() const +{ + if (cutting_surfaces.empty()) + return -1; + return cutting_surfaces.begin()->first.first_ls(); +} + +bool +Element_Cutter::have_cutting_surface(const InterfaceID interface) const +{ + return cutting_surfaces.find(interface) != cutting_surfaces.end(); +} + +Cutting_Surface * +Element_Cutter::get_cutting_surface(const InterfaceID interface) const +{ + const auto iter = cutting_surfaces.find(interface); + if (iter != cutting_surfaces.end()) + return iter->second.get(); + return nullptr; +} + +static std::vector< std::array > get_element_edge_node_ordinals(const stk::topology baseTopology) +{ + const unsigned numEdges = baseTopology.num_edges(); + std::vector< std::array > elemEdgeNodeOrdinals(numEdges); + for(unsigned i=0; i < numEdges; ++i) + { + const unsigned * node_ordinals = get_edge_node_ordinals(baseTopology, i); + elemEdgeNodeOrdinals[i][0] = node_ordinals[0]; + elemEdgeNodeOrdinals[i][1] = node_ordinals[1]; + } + return elemEdgeNodeOrdinals; +} + +static std::vector +get_parametric_node_coords_on_element_nodes_and_cut_edges(const MasterElement & masterElem, + const std::vector & cutEdges, + const std::vector< std::array > elemEdgeNodeOrdinals) +{ + const stk::topology baseTopology = masterElem.get_topology().base(); + const double * elemNodeParamCoords = masterElem.nodal_parametric_coordinates(); + + const unsigned numNodes = baseTopology.num_nodes(); + const unsigned numEdges = baseTopology.num_edges(); + const int dim = baseTopology.dimension(); + + std::vector nodeParamCoords(numNodes+numEdges); + + for (unsigned n=0; n +get_node_signs_on_element_nodes(const stk::topology baseTopology, + const std::vector & cutEdges, + const std::vector< std::array > elemEdgeNodeOrdinals) +{ + const unsigned numNodes = baseTopology.num_nodes(); + std::vector nodeSigns(numNodes,-2); + + unsigned edge_error = 0; + for (auto && cut_edge : cutEdges) + { + const unsigned edge = cut_edge.edge; + const unsigned node0_ord = elemEdgeNodeOrdinals[edge][0]; + const unsigned node1_ord = elemEdgeNodeOrdinals[edge][1]; + + int node0_sign = -cut_edge.sign; + int node1_sign = cut_edge.sign; + + if (cut_edge.pos < Element_Cutter::theSnapToNodeTol) + node0_sign = 0; + else if (cut_edge.pos > 1.-Element_Cutter::theSnapToNodeTol) + node1_sign = 0; + + if ((nodeSigns[node0_ord]*node0_sign == -1) || + (nodeSigns[node1_ord]*node1_sign == -1)) + edge_error += 1< 0) + { + std::ostringstream err_msg; + err_msg << "Edge crossings are not consistent: " << std::endl; + for(auto && cut_edge : cutEdges) + { + const unsigned edge = cut_edge.edge; + const double pos = cut_edge.pos; + const int sign = cut_edge.sign; + const unsigned node0_ord = elemEdgeNodeOrdinals[edge][0]; + const unsigned node1_ord = elemEdgeNodeOrdinals[edge][1]; + err_msg << " Edge: " << edge << " error = " << ((edge_error & (1< 0) << " pos = " << pos << " sign = " << sign << " node0_ord = " << node0_ord << " node1_ord = " << node1_ord << std::endl; + } + krinolog << err_msg.str(); + throw std::runtime_error(err_msg.str()); + } + + return nodeSigns; +} + +static std::shared_ptr +build_triangle_cutting_surface(const std::vector & nodeSigns, const std::vector & nodeParamCoords) +{ + const int case_id = (nodeSigns[0]+1) + + (nodeSigns[1]+1)*3 + + (nodeSigns[2]+1)*9; + + static const unsigned case_permutations[] = + { 0, 0, 0, 2, 0, 0, 2, 1, 1, 1, // 0-9 + 1, 2, 2, 0, 2, 2, 1, 1, 1, 1, // 10-19 + 2, 0, 0, 2, 0, 0, 0 }; // 20-26 + + stk::topology topo = stk::topology::TRIANGLE_6_2D; + std::vector permute(6); + topo.permutation_node_ordinals(case_permutations[case_id], permute.begin()); + + const unsigned i0 = permute[0]; + const unsigned i1 = permute[1]; + const unsigned i2 = permute[2]; + const unsigned i3 = permute[3]; + const unsigned i5 = permute[5]; + + const int permute_case_id = + (nodeSigns[i0]+1) + + (nodeSigns[i1]+1)*3 + + (nodeSigns[i2]+1)*9; + + switch (permute_case_id) + { + case 1: // ls[0]==0 && ls[1]<0 && ls[2]<0 + case 25: // ls[0]==0 && ls[1]>0 && ls[2]>0 + { + ThrowAssert((nodeSigns[i0] == 0 && nodeSigns[i1] < 0 && nodeSigns[i2] < 0) || (nodeSigns[i0] == 0 && nodeSigns[i1] > 0 && nodeSigns[i2] > 0)); + return (permute_case_id==1) ? + (std::make_shared(nodeParamCoords[i0], (nodeParamCoords[i0] + nodeParamCoords[i1] - nodeParamCoords[i2]))) : + (std::make_shared(nodeParamCoords[i0], (nodeParamCoords[i0] + nodeParamCoords[i2] - nodeParamCoords[i1]))); + } + break; + + case 2: // ls[0]>0 && ls[1]<0 && ls[2]<0 + case 24: // ls[0]<0 && ls[1]>0 && ls[2]>0) + { + ThrowAssert((nodeSigns[i0] > 0 && nodeSigns[i1] < 0 && nodeSigns[i2] < 0) || (nodeSigns[i0] < 0 && nodeSigns[i1] > 0 && nodeSigns[i2] > 0)); + return (permute_case_id==2) ? + (std::make_shared(nodeParamCoords[i5], nodeParamCoords[i3])) : + (std::make_shared(nodeParamCoords[i3], nodeParamCoords[i5])); + } + break; + + case 5: // ls[0]>0 && ls[1]==0 && ls[2]<0 + case 21: // ls[0]<0 && ls[1]==0 && ls[2]>0 + { + ThrowAssert((nodeSigns[i0] > 0 && nodeSigns[i1] == 0 && nodeSigns[i2] < 0) || (nodeSigns[i0] < 0 && nodeSigns[i1] == 0 && nodeSigns[i2] > 0)); + return (permute_case_id==5) ? + (std::make_shared(nodeParamCoords[i5], nodeParamCoords[i1])) : + (std::make_shared(nodeParamCoords[i1], nodeParamCoords[i5])); + } + break; + + case 4: // ls[0]==0 && ls[1]==0 && ls[2]<0 + case 22: // ls[0]==0 && ls[1]==0 && ls[2]>0 + { + ThrowAssert((nodeSigns[i0] == 0 && nodeSigns[i1] == 0 && nodeSigns[i2] < 0) || (nodeSigns[i0] == 0 && nodeSigns[i1] == 0 && nodeSigns[i2] > 0)); + return (permute_case_id==4) ? + (std::make_shared(nodeParamCoords[i0], nodeParamCoords[i1])) : + (std::make_shared(nodeParamCoords[i1], nodeParamCoords[i0])); + } + break; + + default: + { + krinolog << "Case id " << case_id << " " << permute_case_id << stk::diag::dendl; + ThrowRuntimeError("Subelement decomposition error."); + } + } + + ThrowRuntimeError("Subelement decomposition error."); +} + +static std::shared_ptr +build_tetrahedral_cutting_surface(const std::vector & nodeSigns, + const std::vector & nodeParamCoords, + const std::function &)> & intersectingPlanesDiagonalPicker) +{ + const int case_id = (nodeSigns[0]+1) + + (nodeSigns[1]+1)*3 + + (nodeSigns[2]+1)*9 + + (nodeSigns[3]+1)*27; + + static const unsigned case_permutations[] = + { 0, 0, 0, 1, 0, 0, 1, 5, 0, 2, // 0-9 + 2, 6, 1, 0, 0, 1, 1,10, 2, 2, // 10-19 + 2,11, 2, 4, 1, 8, 4, 4, 3, 3, // 20-29 + 4, 3, 3, 9, 5, 7, 7, 6, 6, 9, // 30-39 + 0, 9, 9, 6, 7, 7, 7, 9,11, 3, // 40-49 + 4, 3, 3, 4, 4, 8, 3, 4, 4,11, // 50-59 + 4, 2, 2,10, 8, 1,10, 0, 1, 6, // 60-69 + 2, 2, 7, 5, 1, 0, 0, 1, 0, 0, // 70-79 + 0 }; + + stk::topology full_topology = stk::topology::TETRAHEDRON_10; + std::vector permute_node_ordinals(10); + full_topology.permutation_node_ordinals(case_permutations[case_id], permute_node_ordinals.begin()); + + const unsigned i0 = permute_node_ordinals[0]; + const unsigned i1 = permute_node_ordinals[1]; + const unsigned i2 = permute_node_ordinals[2]; + const unsigned i3 = permute_node_ordinals[3]; + const unsigned i4 = permute_node_ordinals[4]; + const unsigned i5 = permute_node_ordinals[5]; + const unsigned i6 = permute_node_ordinals[6]; + const unsigned i7 = permute_node_ordinals[7]; + const unsigned i8 = permute_node_ordinals[8]; + + const int permute_case_id = (nodeSigns[i0]+1) + + (nodeSigns[i1]+1)*3 + + (nodeSigns[i2]+1)*9 + + (nodeSigns[i3]+1)*27; + + switch (permute_case_id) + { + case 1: // ls[0]=0 && ls[1]<0 && ls[2]<0 && ls[3]<0 + case 79: // ls[0]=0 && ls[1]>0 && ls[2]>0 && ls[3]>0 + { + const Vector3d x0p13 = nodeParamCoords[i0] + nodeParamCoords[i3]-nodeParamCoords[i1]; + const Vector3d x0p12 = nodeParamCoords[i0] + nodeParamCoords[i2]-nodeParamCoords[i1]; + return (permute_case_id==1) ? + (std::make_shared(nodeParamCoords[i0],x0p13,x0p12)) : + (std::make_shared(nodeParamCoords[i0],x0p12,x0p13)); + } + break; + + case 4: // ls[0]=0 && ls[1]=0 && ls[2]<0 && ls[3]<0 + case 76: // ls[0]=0 && ls[1]=0 && ls[2]>0 && ls[3]>0 + { + const Vector3d x0p23 = nodeParamCoords[i0] + nodeParamCoords[i3]-nodeParamCoords[i2]; + return (permute_case_id==4) ? + (std::make_shared(nodeParamCoords[i0],nodeParamCoords[i1],x0p23)) : + (std::make_shared(nodeParamCoords[i1],nodeParamCoords[i0],x0p23)); + } + break; + + case 2: // ls[0]>0 && ls[1]<0 && ls[2]<0 && ls[3]<0 + case 78: // ls[0]<0 && ls[1]>0 && ls[2]>0 && ls[3]>0 + { + ThrowAssert((nodeSigns[i0] > 0 && nodeSigns[i1] < 0 && nodeSigns[i2] < 0 && nodeSigns[i3] < 0) || (nodeSigns[i0] < 0 && nodeSigns[i1] > 0 && nodeSigns[i2] > 0 && nodeSigns[i3] > 0)); + + return (permute_case_id==2) ? + (std::make_shared(nodeParamCoords[i4],nodeParamCoords[i7],nodeParamCoords[i6])) : + (std::make_shared(nodeParamCoords[i4],nodeParamCoords[i6],nodeParamCoords[i7])); + } + break; + + case 5: // ls[0]>0 && ls[1]=0 && ls[2]<0 && ls[3]<0 + case 75: // ls[0]<0 && ls[1]=0 && ls[2]>0 && ls[3]>0 + { + return (permute_case_id==5) ? + (std::make_shared(nodeParamCoords[i1],nodeParamCoords[i7],nodeParamCoords[i6])) : + (std::make_shared(nodeParamCoords[i1],nodeParamCoords[i6],nodeParamCoords[i7])); + } + break; + + case 8: // ls[0]>0 && ls[1]>0 && ls[2]<0 && ls[3]<0 + { + const bool face_diag = intersectingPlanesDiagonalPicker({{i0,i1,i2,i3}}); + return (face_diag) ? + (std::make_shared(nodeParamCoords[i8],nodeParamCoords[i7],nodeParamCoords[i6],nodeParamCoords[i5])) : + (std::make_shared(nodeParamCoords[i7],nodeParamCoords[i6],nodeParamCoords[i5],nodeParamCoords[i8])); + } + break; + + case 13: // ls[0]=0 && ls[1]=0 && ls[2]=0 && ls[3]<0 + case 67: // ls[0]=0 && ls[1]=0 && ls[2]=0 && ls[3]>0 + { + return (permute_case_id==13) ? + (std::make_shared(nodeParamCoords[i0],nodeParamCoords[i2],nodeParamCoords[i1])) : + (std::make_shared(nodeParamCoords[i0],nodeParamCoords[i1],nodeParamCoords[i2])); + } + break; + + case 14: // ls[0]>0 && ls[1]=0 && ls[2]=0 && ls[3]<0 + { + ThrowAssert(nodeSigns[i0] > 0 && nodeSigns[i1] == 0 && nodeSigns[i2] == 0 && nodeSigns[i3] < 0); + return std::make_shared(nodeParamCoords[i2],nodeParamCoords[i1],nodeParamCoords[i7]); + } + break; + + default: + { + krinolog << "Case id " << case_id << " " << permute_case_id << stk::diag::dendl; + ThrowRuntimeError("Subelement decomposition error."); + } + } + + ThrowRuntimeError("Subelement decomposition error."); +} + +static std::shared_ptr +build_cutting_surface(const MasterElement & masterElem, + const std::vector & cutEdges, + const std::function &)> & intersectingPlanesDiagonalPicker) +{ + const stk::topology baseTopology = masterElem.get_topology().base(); + const std::vector< std::array > elemEdgeNodeOrdinals = get_element_edge_node_ordinals(baseTopology); + + const auto nodeParamCoords = get_parametric_node_coords_on_element_nodes_and_cut_edges(masterElem, cutEdges, elemEdgeNodeOrdinals); + const auto nodeSigns = get_node_signs_on_element_nodes(baseTopology, cutEdges, elemEdgeNodeOrdinals); + + if (baseTopology == stk::topology::TRIANGLE_3_2D || baseTopology == stk::topology::TRIANGLE_3) + { + ThrowRequire(cutEdges.size() == 2); + return build_triangle_cutting_surface(nodeSigns, nodeParamCoords); + } + + ThrowRequireMsg(baseTopology == stk::topology::TETRAHEDRON_4, "Unsupported base topology: " << baseTopology.name()); + ThrowRequire(cutEdges.size() == 3 || cutEdges.size() == 4); + return build_tetrahedral_cutting_surface(nodeSigns, nodeParamCoords, intersectingPlanesDiagonalPicker); +} + +bool node_captures_intersection_point_domains(const std::vector & nodeDomains, const std::vector & intersectionPointDomains) +{ + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(nodeDomains, intersectionPointDomains); +} + +template +bool any_node_captures_intersection_point_domains(const NODEDOMAINS & nodesSnappedDomains, const std::vector & intersectionPointDomains) +{ + if (nodesSnappedDomains.empty()) + return false; + for (auto && nodeSnappedDomains : nodesSnappedDomains) + if (node_captures_intersection_point_domains(*nodeSnappedDomains, intersectionPointDomains)) + return true; + return false; +} + +bool intersection_is_already_captured(const std::vector*> & elementNodesSnappedDomains, const std::vector & nodes, const std::vector & intersectionPointDomains) +{ + if (elementNodesSnappedDomains.empty()) + return false; + for (auto && node : nodes) + if (node_captures_intersection_point_domains(*elementNodesSnappedDomains[node], intersectionPointDomains)) + return true; + return false; +} + +LS_Per_Interface_Cutter::LS_Per_Interface_Cutter(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker) + : Element_Cutter(masterElem) +{ + for(auto && interface : get_interfaces_present(parentEdges)) + { + const std::vector cutEdges = build_cut_edges(interface, parentEdges, areParentEdgesOrientedSameAsElementEdges); + ThrowRequire(!cutEdges.empty()); + + cutting_surfaces[interface] = build_cutting_surface(masterElem, cutEdges, intersectingPlanesDiagonalPicker); + } +} + +bool +LS_Per_Interface_Cutter::have_crossing(const InterfaceID interface, const Segment3d & edge) const +{ + const auto iter = cutting_surfaces.find(interface); + ThrowRequire(iter != cutting_surfaces.end()); + const Cutting_Surface & interface_surface = *(iter->second); + return interface_surface.sign_at_position(edge.GetNode(0)) == -interface_surface.sign_at_position(edge.GetNode(1)); +} + +int LS_Per_Interface_Cutter::get_ls_per_interface_phase_at_location(const Vector3d & pCoords) const +{ + ThrowRequireMsg(false, "Improper usage of LS_Per_Interface_Cutter."); + return -1; +} + +void LS_Per_Interface_Cutter::add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const +{ + // For LS_Per_Interface_Cutter, internal intersections only happen if there are edge intersections so nothing to do here. +} + +std::vector +LS_Per_Interface_Cutter::build_cut_edges(const InterfaceID & interface, + const std::vector & parentEdges, + const std::vector & parentEdgeIsOrientedSameAsElementEdge) +{ + std::vector cutEdges; + + for(unsigned i=0; i < parentEdges.size(); ++i) + { + const CDFEM_Parent_Edge * parent_edge = parentEdges[i]; + if(parent_edge) + { + const int crossing_sign = parent_edge->get_crossing_sign(interface); + const double crossing_pos = parent_edge->get_crossing_position(interface); + + if( crossing_pos >= 0. ) + { + const double pos = parentEdgeIsOrientedSameAsElementEdge[i] ? crossing_pos : (1 -crossing_pos); + const int sign = parentEdgeIsOrientedSameAsElementEdge[i] ? crossing_sign : (-crossing_sign); + cutEdges.push_back(Edge_Crossing(i,pos,sign)); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Crossing of edge " << i << " at position " << pos << "\n"; + } + } + } + return cutEdges; +} + +std::vector +One_LS_Per_Phase_Cutter::build_cut_edges(const InterfaceID & interface, + const std::vector & parentEdges, + const std::vector & parentEdgeIsOrientedSameAsElementEdge) +{ + std::vector cutEdges; + + for(unsigned i=0; i < parentEdges.size(); ++i) + { + const CDFEM_Parent_Edge * parent_edge = parentEdges[i]; + if(parent_edge) + { + double crossing_pos; + int crossing_sign; + bool is_fake; + std::tie(crossing_pos, crossing_sign, is_fake) = parent_edge->get_crossing_position_and_sign(interface); + + if( crossing_pos >= 0. ) + { + const double pos = parentEdgeIsOrientedSameAsElementEdge[i] ? crossing_pos : (1 -crossing_pos); + const int sign = parentEdgeIsOrientedSameAsElementEdge[i] ? crossing_sign : (-crossing_sign); + cutEdges.push_back(Edge_Crossing(i,pos,sign)); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Crossing of edge " << i << " for interface " << interface << " at position " << pos << " fake = " << std::boolalpha << is_fake << "\n"; + } + } + } + return cutEdges; +} + +std::shared_ptr One_LS_Per_Phase_Cutter::attempt_to_build_cutting_surface(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker, + const InterfaceID& interface) +{ + std::shared_ptr cuttingSurface; + try + { + const std::vector cutEdges = build_cut_edges(interface, parentEdges, areParentEdgesOrientedSameAsElementEdges); + ThrowRequire(!cutEdges.empty()); + cuttingSurface = build_cutting_surface(masterElem, cutEdges, intersectingPlanesDiagonalPicker); + } + catch (const std::exception & err) + { + std::stringstream err_msg; + err_msg << "Error while cutting element with interface " << interface << std::endl; + err_msg << err.what() << std::endl; + throw std::runtime_error(err_msg.str()); + } + return cuttingSurface; +} + +static std::set determine_optimal_phases_at_location(const Vector3d & location, + const InterfaceToSurface & allSurfaces) +{ + // optimal phases are phases those that are on the "right" side of at least one surface, + // and never on the "wrong" side of an interface + std::set toPhases; + std::set fromPhases; + + for (auto && surface : allSurfaces) + { + const int sign = surface.second->sign_at_position(location); + const int toPhase = (sign < 0) ? surface.first.first_ls() : surface.first.second_ls(); + const int fromPhase = (sign < 0) ? surface.first.second_ls() : surface.first.first_ls(); + toPhases.insert(toPhase); + fromPhases.insert(fromPhase); + } + + for (int phase : fromPhases) + toPhases.erase(phase); + + return toPhases; +} + +bool intersection_point_is_real(const Vector3d & intersectionPoint, + const InterfaceToSurface & allSurfaces, + const std::vector & sortedDomains) +{ + for (auto && surface : allSurfaces) + { + if (!surface.second->on_surface(intersectionPoint, Element_Cutter::theSnapToNodeTol)) + { + const int sign = surface.second->sign_at_position(intersectionPoint); + const int toPhase = (sign < 0) ? surface.first.first_ls() : surface.first.second_ls(); + const int fromPhase = (sign < 0) ? surface.first.second_ls() : surface.first.first_ls(); + const bool toPhaseIsInDomains = std::binary_search(sortedDomains.begin(), sortedDomains.end(), toPhase); + const bool fromPhaseIsInDomains = std::binary_search(sortedDomains.begin(), sortedDomains.end(), fromPhase); + if (!toPhaseIsInDomains && fromPhaseIsInDomains) + return false; + } + } + return true; +} + +static void add_triple_point_interfaces(const bool isOneLSPerPhase, const std::vector & triplePointDomains, std::set & interfaces) +{ + ThrowRequire(triplePointDomains.size() == 3); + if (isOneLSPerPhase) + { + interfaces.insert(InterfaceID(triplePointDomains[0],triplePointDomains[1])); + interfaces.insert(InterfaceID(triplePointDomains[1],triplePointDomains[2])); + interfaces.insert(InterfaceID(triplePointDomains[0],triplePointDomains[2])); + } + else + { + interfaces.insert(InterfaceID(triplePointDomains[0],triplePointDomains[0])); + interfaces.insert(InterfaceID(triplePointDomains[1],triplePointDomains[1])); + interfaces.insert(InterfaceID(triplePointDomains[2],triplePointDomains[2])); + } +} + +static void add_interfaces_that_have_uncaptured_intersection_within_sides_of_tet(const std::vector & elemNodesCoords, + const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface & allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + Vector3d intersectionPoint; + std::vector sortedDomains; + constexpr bool oneLSPerPhase(true); + + stk::topology topology = stk::topology::TETRAHEDRON_4; + std::vector faceNodes(3); + + for (auto && surface1 : allSurfaces) + { + for (auto && surface2 : allSurfaces) + { + if (surface1.first < surface2.first && + (interfacesWithUncapturedCrossings.count(surface1.first) == 0 || interfacesWithUncapturedCrossings.count(surface2.first))) + { + fill_sorted_domains(oneLSPerPhase, surface1.first, surface2.first, sortedDomains); + + if (sorted_domains_form_triple_point(oneLSPerPhase, sortedDomains)) + { + for (int iFace=0; iFace<4; ++iFace) + { + topology.face_node_ordinals(iFace, faceNodes); + const std::array faceNodeCoords{elemNodesCoords[faceNodes[0]], elemNodesCoords[faceNodes[1]], elemNodesCoords[faceNodes[2]]}; + const Plane3d facePlane{elemNodesCoords[faceNodes[0]], elemNodesCoords[faceNodes[1]], elemNodesCoords[faceNodes[2]]}; + if (!intersection_is_already_captured(nodesSnappedDomains, faceNodes, sortedDomains) && + find_intersection_of_three_planes(facePlane, surface1.second->get_plane(), surface2.second->get_plane(), intersectionPoint) && + intersection_point_is_real(intersectionPoint, allSurfaces, sortedDomains)) + { + const Vector3d faceCoords = triangle_parametric_coordinates_of_projected_point(faceNodeCoords, intersectionPoint); + if (within_tri_bounds(faceCoords)) + add_triple_point_interfaces(oneLSPerPhase, sortedDomains, interfacesWithUncapturedCrossings); + } + } + } + } + } + } +} + +static void add_interfaces_that_have_uncaptured_intersection_within_sides_of_tet(const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface & allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + Vector3d intersectionPoint; + std::vector sortedDomains; + constexpr bool oneLSPerPhase(true); + + stk::topology topology = stk::topology::TETRAHEDRON_4; + std::vector faceNodes(3); + + for (auto && surface1 : allSurfaces) + { + for (auto && surface2 : allSurfaces) + { + if (surface1.first < surface2.first && + (interfacesWithUncapturedCrossings.count(surface1.first) == 0 || interfacesWithUncapturedCrossings.count(surface2.first))) + { + fill_sorted_domains(oneLSPerPhase, surface1.first, surface2.first, sortedDomains); + if (sorted_domains_form_triple_point(oneLSPerPhase, sortedDomains)) + { + for (int iFace=0; iFace<4; ++iFace) + { + topology.face_node_ordinals(iFace, faceNodes); + if (!intersection_is_already_captured(nodesSnappedDomains, faceNodes, sortedDomains) && + find_intersection_of_two_planes_and_side_of_tet(iFace, surface1.second->get_plane(), surface2.second->get_plane(), intersectionPoint) && + intersection_point_is_real(intersectionPoint, allSurfaces, sortedDomains)) + add_triple_point_interfaces(oneLSPerPhase, sortedDomains, interfacesWithUncapturedCrossings); + } + } + } + } + } +} + +static void add_interfaces_that_have_uncaptured_intersection_within_tri(const std::vector & elemNodesCoords, + const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface & allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + Vector3d intersectionPoint; + std::vector sortedDomains; + constexpr bool oneLSPerPhase(true); + const std::vector triNodes = {0,1,2}; + + for (auto && surface1 : allSurfaces) + { + for (auto && surface2 : allSurfaces) + { + if (surface1.first < surface2.first && + (interfacesWithUncapturedCrossings.count(surface1.first) == 0 || interfacesWithUncapturedCrossings.count(surface2.first))) + { + fill_sorted_domains(oneLSPerPhase, surface1.first, surface2.first, sortedDomains); + if (sorted_domains_form_triple_point(oneLSPerPhase, sortedDomains) && + !intersection_is_already_captured(nodesSnappedDomains, triNodes, sortedDomains) && + find_intersection_of_two_2D_planes_within_tri(surface1.second->get_plane(), surface2.second->get_plane(), intersectionPoint) && // ASSUME THAT PROVIDED TRIANGLE CONTAINED WITHIN PARENT TRIANGLE + intersection_point_is_real(intersectionPoint, allSurfaces, sortedDomains)) + { + const std::array triNodeCoords{elemNodesCoords[0], elemNodesCoords[1], elemNodesCoords[2]}; + const Vector3d triCoords = triangle_parametric_coordinates_of_projected_point(triNodeCoords, intersectionPoint); + if (within_tri_bounds(triCoords)) + add_triple_point_interfaces(oneLSPerPhase, sortedDomains, interfacesWithUncapturedCrossings); + } + } + } + } +} + +static void add_interfaces_that_have_uncaptured_intersection_within_tri(const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface& allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + Vector3d intersectionPoint; + std::vector sortedDomains; + constexpr bool oneLSPerPhase(true); + const std::vector triNodes = {0,1,2}; + + for (auto && surface1 : allSurfaces) + { + for (auto && surface2 : allSurfaces) + { + if (surface1.first < surface2.first && + (interfacesWithUncapturedCrossings.count(surface1.first) == 0 || interfacesWithUncapturedCrossings.count(surface2.first))) + { + fill_sorted_domains(oneLSPerPhase, surface1.first, surface2.first, sortedDomains); + if (sorted_domains_form_triple_point(oneLSPerPhase, sortedDomains) && + !intersection_is_already_captured(nodesSnappedDomains, triNodes, sortedDomains) && + find_intersection_of_two_2D_planes_within_tri(surface1.second->get_plane(), surface2.second->get_plane(), intersectionPoint) && + intersection_point_is_real(intersectionPoint, allSurfaces, sortedDomains)) + add_triple_point_interfaces(oneLSPerPhase, sortedDomains, interfacesWithUncapturedCrossings); + } + } + } +} + +static void add_interfaces_that_have_uncaptured_intersection_within_element(const stk::topology & baseTopology, + const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface & allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + if (baseTopology == stk::topology::TETRAHEDRON_4) + add_interfaces_that_have_uncaptured_intersection_within_sides_of_tet(nodesSnappedDomains, allSurfaces, interfacesWithUncapturedCrossings); + else if (baseTopology == stk::topology::TRIANGLE_3 || baseTopology == stk::topology::TRIANGLE_3_2D) + add_interfaces_that_have_uncaptured_intersection_within_tri(nodesSnappedDomains, allSurfaces, interfacesWithUncapturedCrossings); + else + ThrowRequireMsg(false, "Unsupported topology " << baseTopology); +} + +static void add_interfaces_that_have_uncaptured_intersection_within_element(const stk::topology & baseTopology, + const std::vector & elemNodesCoords, + const std::vector*> & nodesSnappedDomains, + const InterfaceToSurface & allSurfaces, + std::set & interfacesWithUncapturedCrossings) +{ + if (baseTopology == stk::topology::TETRAHEDRON_4) + add_interfaces_that_have_uncaptured_intersection_within_sides_of_tet(elemNodesCoords, nodesSnappedDomains, allSurfaces, interfacesWithUncapturedCrossings); + else if (baseTopology == stk::topology::TRIANGLE_3 || baseTopology == stk::topology::TRIANGLE_3_2D) + add_interfaces_that_have_uncaptured_intersection_within_tri(elemNodesCoords, nodesSnappedDomains, allSurfaces, interfacesWithUncapturedCrossings); + else + ThrowRequireMsg(false, "Unsupported topology " << baseTopology); +} + +void One_LS_Per_Phase_Cutter::add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const +{ + // Does not consider uncaptured edge crossings, these should be considered already + add_interfaces_that_have_uncaptured_intersection_within_element(myTopology.base(), elemNodesCoords, elemNodesSnappedDomains, all_cutting_surfaces, interfacesWithUncapturedCrossings); +} + +bool +One_LS_Per_Phase_Cutter::have_crossing(const InterfaceID interface, const Segment3d & edge) const +{ + const auto iter = cutting_surfaces.find(interface); + ThrowRequire(iter != cutting_surfaces.end()); + const Cutting_Surface & interface_surface = *(iter->second); + if (interface_surface.sign_at_position(edge.GetNode(0)) == -interface_surface.sign_at_position(edge.GetNode(1))) + { + const double loc = interface_crossing_position(interface, edge); + const Vector3d intersectionPoint = (1.-loc)*edge.GetNode(0) + loc*edge.GetNode(1); + return krino::intersection_point_is_real(intersectionPoint, all_cutting_surfaces, {interface.first_ls(), interface.second_ls()}); + } + return false; +} + +int One_LS_Per_Phase_Cutter::get_ls_per_interface_phase_at_location(const Vector3d & pCoords) const +{ + const std::set optimalPhases = determine_optimal_phases_at_location(pCoords, all_cutting_surfaces); + ThrowRequireMsg(optimalPhases.size()==1, "Unexpected phase configuration with " << optimalPhases.size() << " optimal phases when evaluated phase at " << pCoords << "\n" << visualize()); + return *optimalPhases.begin(); +} + +bool One_LS_Per_Phase_Cutter::intersection_point_is_real(const Vector3d & intersectionPoint, + const std::vector & sortedDomains) const +{ + return krino::intersection_point_is_real(intersectionPoint, all_cutting_surfaces, sortedDomains); +} + +One_LS_Per_Phase_Cutter::One_LS_Per_Phase_Cutter(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker) + : Element_Cutter(masterElem) +{ + std::set edgePhases = get_phases_present_on_edges_and_interior(parentEdges); + for (int phase1 : edgePhases) + { + for (int phase2 : edgePhases) + { + if (phase2 > phase1) + { + const InterfaceID interface(phase1, phase2); + all_cutting_surfaces[interface] = attempt_to_build_cutting_surface(masterElem, parentEdges, areParentEdgesOrientedSameAsElementEdges, intersectingPlanesDiagonalPicker, interface); + } + } + } + + std::set interfacesWithRealCrossings; + for (auto && interface : get_interfaces_present(parentEdges)) + interfacesWithRealCrossings.insert(interface); + + const std::vector*> emptyNodesSnappedDomains; + add_interfaces_that_have_uncaptured_intersection_within_element(myTopology.base(), emptyNodesSnappedDomains, all_cutting_surfaces, interfacesWithRealCrossings); + + for (auto && interface : interfacesWithRealCrossings) + cutting_surfaces[interface] = all_cutting_surfaces.at(interface); +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_Element_Cutter.hpp b/packages/krino/krino/krino_lib/Akri_Element_Cutter.hpp new file mode 100644 index 000000000000..0d5a0c2e907f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element_Cutter.hpp @@ -0,0 +1,132 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_ELEMENT_CUTTER_H_ +#define KRINO_INCLUDE_AKRI_ELEMENT_CUTTER_H_ +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +class Cutting_Surface; +class CDFEM_Parent_Edge; +class ElementIntersection; + +typedef std::function &)> ElementIntersectionPointFilter; +typedef std::map> InterfaceToSurface; + +class Element_Cutter +{ +public: + Element_Cutter(const MasterElement & masterElement) : myTopology(masterElement.get_topology()) {} + virtual ~Element_Cutter() {} + double interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const; + int sign_at_position(const InterfaceID interface, const Vector3d & p_coords) const; + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const = 0; + virtual int get_ls_per_interface_phase_at_location(const Vector3d & pCoords) const = 0; + virtual void add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const = 0; + + int get_num_cutting_surfaces() const {return cutting_surfaces.size(); } + bool have_cutting_surface(const InterfaceID interface) const; + void fill_interfaces_with_cutting_surface(std::vector & interfaces) const; + Cutting_Surface * get_cutting_surface(const InterfaceID interface) const; + + virtual bool is_one_ls_per_phase() const = 0; + void fill_interior_intersections(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const; + void fill_interior_intersections(std::vector & intersections) const; + void fill_tetrahedron_face_interior_intersections(const std::array & faceNodes, const InterfaceID & interface1, const InterfaceID & interface2, const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const; + static std::string visualize_cutting_surfaces(const stk::topology & topology, const InterfaceToSurface & cuttingSurfaces); + virtual std::string visualize() const { return visualize_cutting_surfaces(myTopology, cutting_surfaces); } + + int get_starting_phase_for_cutting_surfaces() const; + + struct Edge_Crossing { + Edge_Crossing(unsigned e, double p, int s) : edge(e), pos(p), sign(s) {} + unsigned edge; + double pos; + int sign; + }; + + static constexpr double theSnapToNodeTol{1.e-12}; + +protected: + stk::topology myTopology; + InterfaceToSurface cutting_surfaces; + +private: + virtual bool intersection_point_is_real(const Vector3d & intersection, const std::vector & sortedDomains) const = 0; + void fill_triangle_interior_intersection_points(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const; + void fill_tetrahedron_interior_intersection_points(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const; +}; + +class LS_Per_Interface_Cutter : public Element_Cutter +{ +public: + LS_Per_Interface_Cutter(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker); + virtual bool is_one_ls_per_phase() const override { return false; } + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const override; + virtual int get_ls_per_interface_phase_at_location(const Vector3d & pCoords) const override; + virtual void add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const override; +private: + virtual bool intersection_point_is_real(const Vector3d & intersection, const std::vector & sortedDomains) const override { return true; } + static std::vector build_cut_edges(const InterfaceID & interface, + const std::vector & parentEdges, + const std::vector & parentEdgeIsOrientedSameAsElementEdge); +}; + +class One_LS_Per_Phase_Cutter : public Element_Cutter +{ +public: + One_LS_Per_Phase_Cutter(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker); + virtual bool is_one_ls_per_phase() const override { return true; } + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const override; + virtual int get_ls_per_interface_phase_at_location(const Vector3d & pCoords) const override; + virtual void add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const override; + virtual std::string visualize() const override { return visualize_cutting_surfaces(myTopology, all_cutting_surfaces); } + +private: + virtual bool intersection_point_is_real(const Vector3d & intersection, const std::vector & sortedDomains) const override; + static std::vector build_cut_edges(const InterfaceID & interface, + const std::vector & parentEdges, + const std::vector & parentEdgeIsOrientedSameAsElementEdge); + static std::shared_ptr attempt_to_build_cutting_surface(const MasterElement & masterElem, + const std::vector & parentEdges, + const std::vector & areParentEdgesOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker, + const InterfaceID& interface); + + InterfaceToSurface all_cutting_surfaces; +}; + +std::unique_ptr create_element_cutter(const bool oneLSPerPhase, + const MasterElement & masterElem, + const std::vector & elementParentEdges, + const std::vector & areParentEdgesAreOrientedSameAsElementEdges, + const std::function &)> & intersectingPlanesDiagonalPicker); + +} + +#endif /* KRINO_INCLUDE_AKRI_ELEMENT_CUTTER_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_Element_Intersections.cpp b/packages/krino/krino/krino_lib/Akri_Element_Intersections.cpp new file mode 100644 index 000000000000..04d59b4e3da8 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element_Intersections.cpp @@ -0,0 +1,28 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + + +namespace krino { + +std::ostream & operator<<(std::ostream & os, const ElementIntersection & elementIntersection) +{ + os << elementIntersection.parametricCoords << ", interfaces={ "; + for (int domain : elementIntersection.sortedDomains) + os << domain << " "; + os << "}"; + return os; +} + +} + diff --git a/packages/krino/krino/krino_lib/Akri_Element_Intersections.hpp b/packages/krino/krino/krino_lib/Akri_Element_Intersections.hpp new file mode 100644 index 000000000000..2931938ffc81 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Element_Intersections.hpp @@ -0,0 +1,34 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_ELEMENT_INTERSECTIONS_H_ +#define KRINO_INCLUDE_AKRI_ELEMENT_INTERSECTIONS_H_ + +#include +#include +#include + +namespace krino { + +class Element_Cutter; + +struct ElementIntersection +{ + ElementIntersection(const Vector3d & coords, const std::vector & domains) + : parametricCoords(coords), + sortedDomains(domains) {} + + Vector3d parametricCoords; + std::vector sortedDomains; +}; + +std::ostream & operator<<(std::ostream & os, const ElementIntersection& elementIntersection); + +} + +#endif /* KRINO_INCLUDE_AKRI_ELEMENT_INTERSECTIONS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_EntityIdPool.cpp b/packages/krino/krino/krino_lib/Akri_EntityIdPool.cpp new file mode 100644 index 000000000000..6fcebc0157f7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_EntityIdPool.cpp @@ -0,0 +1,92 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino{ + +EntityIdPool::EntityIdPool(stk::mesh::MetaData & meta_data) + : my_meta_data(meta_data), + my_entity_id_pool(meta_data.entity_rank_count()) +{ +} + +stk::mesh::EntityId +EntityIdPool::get_EntityId(stk::mesh::EntityRank rank) +{ + ThrowAssert(static_cast(rank) < my_entity_id_pool.size()); + ThrowRequireMsg(!my_entity_id_pool[rank].empty(), "EntityIdPool is empty for " << rank << "."); + + stk::mesh::EntityId entity_id = my_entity_id_pool[rank].back(); + my_entity_id_pool[rank].pop_back(); + return entity_id; +} + +void +EntityIdPool::reserve(stk::mesh::EntityRank rank, size_t count, bool assert_32bit_ids, bool make_64bit_ids) +{ + my_meta_data.mesh_bulk_data().generate_new_ids( rank, count, my_entity_id_pool[rank] ); + ThrowAssert(!make_64bit_ids || !assert_32bit_ids); + if (make_64bit_ids) + { + push_ids_to_64_bit(my_entity_id_pool[rank]); + } + if (assert_32bit_ids && (rank == stk::topology::NODE_RANK || rank == stk::topology::ELEMENT_RANK)) // Only worry about node and elements since they are output + { + check_ids_are_32_bit(rank, my_entity_id_pool[rank]); + } +} + +void +EntityIdPool::generate_new_ids(stk::mesh::BulkData & mesh, stk::mesh::EntityRank rank, size_t count, std::vector & ids, bool assert_32bit_ids, bool make_64bit_ids) +{ + mesh.generate_new_ids( rank, count, ids ); + ThrowAssert(!make_64bit_ids || !assert_32bit_ids); + if (make_64bit_ids) + { + push_ids_to_64_bit(ids); + } + if (assert_32bit_ids && (rank == stk::topology::NODE_RANK || rank == stk::topology::ELEMENT_RANK)) // Only worry about node and elements since they are output + { + check_ids_are_32_bit(rank, ids); + } +} + +void +EntityIdPool::push_ids_to_64_bit(std::vector & ids) +{ + const uint64_t max_32_bit_id = std::numeric_limits::max(); + const bool ids_are_32_bit = !ids.empty() && ids[0] <= max_32_bit_id; + if (ids_are_32_bit) + { + for (auto && id : ids) + { + ThrowRequireMsg(id <= max_32_bit_id, "Mixture of ids above and below 32 bit limit not allowed in push_ids_to_64_bit."); + id += max_32_bit_id; + } + } +} + +void +EntityIdPool::check_ids_are_32_bit(stk::mesh::EntityRank rank, std::vector & ids) +{ + static const uint64_t max_allowed_id = std::numeric_limits::max(); + bool have_bad_id = false; + for (auto && id : ids) + { + if (id > max_allowed_id) + { + have_bad_id = true; + break; + } + } + ThrowRequireMsg(!have_bad_id, "Exhausted valid ids for rank " << rank << "!"); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_EntityIdPool.hpp b/packages/krino/krino/krino_lib/Akri_EntityIdPool.hpp new file mode 100644 index 000000000000..4ecea3088548 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_EntityIdPool.hpp @@ -0,0 +1,39 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_EntityIdPool_h +#define Akri_EntityIdPool_h + +#include +#include + +namespace stk { namespace mesh { class BulkData; } } + +namespace krino { + +class EntityIdPool { +public: + EntityIdPool(stk::mesh::MetaData & meta_data); + ~EntityIdPool() {} + + static void generate_new_ids(stk::mesh::BulkData & mesh, stk::mesh::EntityRank rank, size_t count, std::vector & ids, bool assert_32bit_ids, bool make_64bit_ids); + + void reserve(stk::mesh::EntityRank rank, size_t count, bool assert_32bit_ids, bool make_64bit_ids); + stk::mesh::EntityId get_EntityId(stk::mesh::EntityRank rank); +private: + static void push_ids_to_64_bit(std::vector & ids); + static void check_ids_are_32_bit(stk::mesh::EntityRank rank, std::vector & ids); + +protected: + stk::mesh::MetaData & my_meta_data; + std::vector< std::vector > my_entity_id_pool; +}; + +} // namespace krino + +#endif // Akri_EntityIdPool_h diff --git a/packages/krino/krino/krino_lib/Akri_Facet.cpp b/packages/krino/krino/krino_lib/Akri_Facet.cpp new file mode 100644 index 000000000000..9744abd1fca0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Facet.cpp @@ -0,0 +1,197 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino{ + +// +//-------------------------------------------------------------------------------- + +std::unique_ptr +Facet::unpack_from_buffer( stk::CommBuffer & b ) +{ /* %TRACE% */ /* %TRACE% */ + std::unique_ptr facet; + + int dim = 0; + b.unpack(dim); + + switch(dim) + { + case 2: facet = Facet2d::unpack_from_buffer(b); break; + case 3: facet = Facet3d::unpack_from_buffer(b); break; + default: ThrowRuntimeError("Unrecognized facet dimension."); + } + + ThrowRequire(facet); + return facet; +} + +//-------------------------------------------------------------------------------- + +void +Facet2d::pack_into_buffer(stk::CommBuffer & b) const +{ + const int dim = 2; + b.pack(dim); + for (int n = 0; n < 2; ++n ) + { + const Vector3d & pt = facet_vertex(n); + b.pack(pt[0]); + b.pack(pt[1]); + } +} + +std::unique_ptr +Facet2d::unpack_from_buffer( stk::CommBuffer & b ) +{ /* %TRACE% */ /* %TRACE% */ + std::unique_ptr facet; + + double vx, vy; + b.unpack(vx); + b.unpack(vy); + Vector3d x0( vx, vy, 0.0 ); + b.unpack(vx); + b.unpack(vy); + Vector3d x1( vx, vy, 0.0 ); + + facet = std::make_unique( x0, x1 ); + return facet; +} + +void +Facet3d::pack_into_buffer(stk::CommBuffer & b) const +{ + const int dim = 3; + b.pack(dim); + for (int n = 0; n < 3; ++n ) + { + const Vector3d & pt = facet_vertex(n); + b.pack(pt[0]); + b.pack(pt[1]); + b.pack(pt[2]); + } +} + +std::unique_ptr +Facet3d::unpack_from_buffer( stk::CommBuffer & b ) +{ /* %TRACE% */ /* %TRACE% */ + std::unique_ptr facet; + + double vx, vy, vz; + b.unpack(vx); + b.unpack(vy); + b.unpack(vz); + Vector3d x0( vx, vy, vz ); + b.unpack(vx); + b.unpack(vy); + b.unpack(vz); + Vector3d x1( vx, vy, vz ); + b.unpack(vx); + b.unpack(vy); + b.unpack(vz); + Vector3d x2( vx, vy, vz ); + + facet = std::make_unique( x0, x1, x2 ); + return facet; +} + +std::ostream & Facet3d::put( std::ostream & os ) const +{ /* %TRACE% */ /* %TRACE% */ + // facet info + os << ": facet description: " << std::endl + << " facet point 0 = (" + << facet_vertex(0)[0] << "," + << facet_vertex(0)[1] << "," + << facet_vertex(0)[2] << ")" << std::endl + << " facet point 1 = (" + << facet_vertex(1)[0] << "," + << facet_vertex(1)[1] << "," + << facet_vertex(1)[2] << ")" << std::endl + << " facet point 2 = (" + << facet_vertex(2)[0] << "," + << facet_vertex(2)[1] << "," + << facet_vertex(2)[2] << ")" << std::endl + << " facet area = " << facet_area() << std::endl; + + return os ; +} + +void Facet3d::apply_transformation(const Transformation & transformation) +{ + Vector3d pt0 = facet_vertex(0); + Vector3d pt1 = facet_vertex(1); + Vector3d pt2 = facet_vertex(2); + + transformation.apply(pt0); + transformation.apply(pt1); + transformation.apply(pt2); + + my_facet_tri = Triangle3d( pt0, pt1 , pt2 ); + + my_bounding_box.clear(); + my_bounding_box.accommodate(pt0); + my_bounding_box.accommodate(pt1); + my_bounding_box.accommodate(pt2); +} + +void Facet2d::apply_transformation(const Transformation & transformation) +{ + Vector3d pt0 = facet_vertex(0); + Vector3d pt1 = facet_vertex(1); + + transformation.apply(pt0); + transformation.apply(pt1); + + // create facet segment + my_facet_segment = Segment3d( pt0, pt1 ); + + my_bounding_box.clear(); + my_bounding_box.accommodate(pt0); + my_bounding_box.accommodate(pt1); +} + +std::ostream & Facet2d::put( std::ostream & os ) const +{ /* %TRACE% */ /* %TRACE% */ + // facet info + os << ": facet description: " << std::endl + << " facet point 0 = (" + << facet_vertex(0)[0] << "," + << facet_vertex(0)[1] << ")" << std::endl + << " facet point 1 = (" + << facet_vertex(1)[0] << "," + << facet_vertex(1)[1] << ")" << std::endl + << " facet area = " << facet_area() << std::endl; + + return os ; +} + +Facet3d::Facet3d( const Vector3d & pt0, + const Vector3d & pt1, + const Vector3d & pt2 ) + : Facet(), + my_facet_tri( pt0, pt1, pt2 ) +{ /* %TRACE% */ /* %TRACE% */ + my_bounding_box.accommodate(pt0); + my_bounding_box.accommodate(pt1); + my_bounding_box.accommodate(pt2); +} + +Facet2d::Facet2d( const Vector3d & pt0, + const Vector3d & pt1 ) + : Facet(), + my_facet_segment(pt0, pt1) +{ /* %TRACE% */ /* %TRACE% */ + my_bounding_box.accommodate(pt0); + my_bounding_box.accommodate(pt1); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Facet.hpp b/packages/krino/krino/krino_lib/Akri_Facet.hpp new file mode 100644 index 000000000000..b9da02cdb513 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Facet.hpp @@ -0,0 +1,158 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Facet_h +#define Akri_Facet_h + +#include +#include +#include + +#include + +#include +#include +#include +#include + +namespace stk { class CommBuffer; } + +namespace krino { + +class Facet; +class Transformation; + +typedef std::vector< Facet * > FacetVec; +typedef std::vector< std::unique_ptr > FacetOwningVec; + +class Facet { +public: + Facet() {} + virtual ~Facet() {} + + // for debugging memory usage + virtual size_t storage_size() const = 0; + + virtual std::ostream & put( std::ostream& os ) const = 0; + friend std::ostream & operator << ( std::ostream &os , const Facet &f ) { return f.put(os); } + + // methods for off-processor communication + static std::unique_ptr unpack_from_buffer( stk::CommBuffer & b ); // static method that builds facet from data in buffer for off-processor communication + virtual void pack_into_buffer(stk::CommBuffer & b) const = 0; // pack into buffer for off-processor communication + + virtual Vector3d facet_vertex(const int i) const = 0; + virtual double facet_area() const = 0; + virtual Vector3d facet_normal() const = 0; + virtual bool degenerate() const = 0; + + virtual double point_distance_squared( const Vector3d & x ) const = 0; + virtual double point_distance_squared( const Vector3d & x, Vector2d & parametric_coords ) const = 0; + virtual int point_distance_sign( const Vector3d & x ) const = 0; + virtual Vector3d real_coordinates(const Vector2d & parametric_coords) const = 0; + virtual Vector3d weights(const Vector2d & parametric_coords) const = 0; + + virtual void apply_transformation(const Transformation & transformation) = 0; + + const BoundingBox & bounding_box() const { ThrowAssert (my_bounding_box.valid()); return my_bounding_box; } + static const BoundingBox & get_bounding_box(const Facet * facet) { return facet->bounding_box(); } + +protected: + BoundingBox my_bounding_box; +}; + +class Facet3d : public Facet { +public: + Facet3d( const Vector3d & x0, + const Vector3d & x1, + const Vector3d & x2 ); + Facet3d() = delete; + virtual ~Facet3d() {} + + virtual size_t storage_size() const { return sizeof(Facet3d); } + virtual std::ostream & put( std::ostream& os ) const; + + static std::unique_ptr unpack_from_buffer( stk::CommBuffer & b ); // static method that builds facet from data in buffer for off-processor communication + virtual void pack_into_buffer(stk::CommBuffer & b) const; + + virtual Vector3d facet_vertex(const int i) const { return my_facet_tri.GetNode(i); } + virtual double facet_area() const { return my_facet_tri.area(); } + virtual Vector3d facet_normal() const { return my_facet_tri.normal(); } + virtual bool degenerate() const { return my_facet_tri.normal_dir().zero_length(); } + virtual double point_distance_squared( const Vector3d & x ) const + { return my_facet_tri.DistanceSquared( x ); } + virtual double point_distance_squared( const Vector3d & x, Vector2d & parametric_coords ) const + { return my_facet_tri.DistanceSquared( x, parametric_coords ); } + virtual int point_distance_sign( const Vector3d & x ) const + { return (Dot(my_facet_tri.normal_dir(),x-facet_vertex(0)) < 0.0) ? -1 : 1; } + virtual Vector3d real_coordinates(const Vector2d & parametric_coords) const + { return my_facet_tri.ParametricToRealCoords(parametric_coords); } + virtual Vector3d weights(const Vector2d & parametric_coords) const + { return Vector3d(1.0-parametric_coords[0]-parametric_coords[1],parametric_coords[0],parametric_coords[1]); } + virtual void apply_transformation(const Transformation & transformation); +private: + Triangle3d my_facet_tri; +}; + +class Facet2d : public Facet { +public: + Facet2d( const Vector3d & x0, + const Vector3d & x1 ); + Facet2d() = delete; + virtual ~Facet2d() {} + + virtual size_t storage_size() const { return sizeof(Facet2d); } + virtual std::ostream & put( std::ostream& os ) const; + + static std::unique_ptr unpack_from_buffer( stk::CommBuffer & b ); // static method that builds facet from data in buffer for off-processor communication + virtual void pack_into_buffer(stk::CommBuffer & b) const; + + virtual Vector3d facet_vertex(const int i) const { return my_facet_segment.GetNode(i); } + virtual double facet_area() const { return my_facet_segment.Length(); } + virtual Vector3d facet_normal() const + { return (crossZ(facet_vertex(1)-facet_vertex(0))).unit_vector(); } + virtual bool degenerate() const { return (0.0 == my_facet_segment.Length()); } + virtual double point_distance_squared( const Vector3d & x ) const + { return my_facet_segment.DistanceSquared(x); } + virtual double point_distance_squared( const Vector3d & x, Vector2d & parametric_coords ) const + { return my_facet_segment.DistanceSquared(x, parametric_coords[0]); } + virtual int point_distance_sign( const Vector3d & x ) const + { return (Dot(crossZ(facet_vertex(1)-facet_vertex(0)), x-facet_vertex(0)) < 0.0) ? -1 : 1; } + virtual Vector3d real_coordinates(const Vector2d & parametric_coords) const + { return (1.0-parametric_coords[0])*my_facet_segment.GetNode(0) + parametric_coords[0]*my_facet_segment.GetNode(1); } + virtual Vector3d weights(const Vector2d & parametric_coords) const + { return Vector3d(1.0-parametric_coords[0],parametric_coords[0],0.0); } + virtual void apply_transformation(const Transformation & transformation); +private: + Segment3d my_facet_segment; +}; + +class FacetDistanceQuery { +public: + FacetDistanceQuery() : my_facet(nullptr), my_sqr_distance(0.0) {} + FacetDistanceQuery(const Facet & in_facet, const Vector3d & x) : my_facet(&in_facet), my_query_pt(x) + { + my_sqr_distance = my_facet->point_distance_squared(x, my_parametric_coords); + } + + bool empty() const { return my_facet == nullptr; } + const Facet & facet() const { return *my_facet; } + double distance_squared() const { return my_sqr_distance; } + Vector3d closest_point() const { return my_facet->real_coordinates(my_parametric_coords); } + double signed_distance() const { return std::sqrt(my_sqr_distance)*my_facet->point_distance_sign(my_query_pt); } + Vector3d closest_point_weights() const { return my_facet->weights(my_parametric_coords); } + +private: + const Facet* my_facet; + Vector3d my_query_pt; + double my_sqr_distance; + Vector2d my_parametric_coords; +}; + +} // namespace krino + +#endif // Akri_Facet_h diff --git a/packages/krino/krino/krino_lib/Akri_Faceted_Surface.cpp b/packages/krino/krino/krino_lib/Akri_Faceted_Surface.cpp new file mode 100644 index 000000000000..1c8eca3243f1 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Faceted_Surface.cpp @@ -0,0 +1,494 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include + +namespace krino{ + +Faceted_Surface::Faceted_Surface(const std::string & sn) + : SurfaceThatTakesAdvantageOfNarrowBandAndThereforeMightHaveWrongSign(), + my_name(sn) {} + +void +Faceted_Surface::parallel_distribute_facets(const size_t batch_size, const std::vector & proc_bboxes) +{ + const int num_procs = stk::EnvData::parallel_size(); + if ( num_procs == 1 ) return; + + const int me = stk::EnvData::parallel_rank(); + ThrowRequire(me != 0 || batch_size <= my_local_facets.size()); + + stk::CommSparse comm_sparse(stk::EnvData::parallel_comm()); + + std::vector dest_procs; + std::vector proc_facet_counts; + size_t start = 0; + if (me == 0) + { + dest_procs.resize(batch_size, 0); + proc_facet_counts.resize(num_procs, 0); + start = my_local_facets.size() - batch_size; + for ( size_t index = 0; index < batch_size; ++index ) + { + const Facet * facet = my_local_facets[start+index].get(); + for ( int dest_proc = 1; dest_proc < num_procs; ++dest_proc ) + { + if ( proc_bboxes[dest_proc].intersects(facet->bounding_box()) ) + { + dest_procs[index] = dest_proc; + ++(proc_facet_counts[dest_proc]); + break; + } + } + if (dest_procs[index] == 0) + { + ++(proc_facet_counts[0]); + } + } + } + + // Communication involves two steps, the first one sizes the messages, the second one actually packs and sends the messages + for ( int comm_step = 0; comm_step < 2; ++comm_step) + { + if (me == 0) + { + for ( int dest_proc = 0; dest_proc < num_procs; ++dest_proc ) + { + if (comm_step == 0 && krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "P" << me << ":" + << " Packaging " << proc_facet_counts[dest_proc] + << " facets for proc#" << dest_proc << stk::diag::dendl; + } + + stk::CommBuffer & b = comm_sparse.send_buffer(dest_proc); + b.pack(proc_facet_counts[dest_proc]); + + for ( size_t index = 0; index < batch_size; ++index ) + { + if (dest_procs[index] == dest_proc) + { + const Facet * facet = my_local_facets[start+index].get(); + facet->pack_into_buffer(b); + } + } + } + } + if (comm_step == 0) + { //allocation step + comm_sparse.allocate_buffers(); + } + else + { //communication step + comm_sparse.communicate(); + } + } + + if (me == 0) + { + // delete facets that have been sent away (even if they are headed back to 0) + my_local_facets.erase(my_local_facets.begin()+start, my_local_facets.end()); + } + + // unload, creating locally owned copy of facet + const int recv_proc = 0; + stk::CommBuffer & b = comm_sparse.recv_buffer(recv_proc); + + size_t proc_num_facets_recvd = 0; + b.unpack(proc_num_facets_recvd); + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "P" << stk::EnvData::parallel_rank() << ":" << " Receiving " << proc_num_facets_recvd << " facets from proc#" << recv_proc << stk::diag::dendl; + + for ( size_t n = 0; n < proc_num_facets_recvd; ++n ) + { + std::unique_ptr facet = Facet::unpack_from_buffer( b ); + my_local_facets.emplace_back( std::move(facet) ); + } + ThrowAssert( 0 == b.remaining() ); +} + +void +Faceted_Surface::pack_into_buffer(stk::CommBuffer & b) const +{ + ThrowRuntimeError("pack_into_buffer should not be called for a Faceted_Surface."); +} + +void +Faceted_Surface::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) +{ /* %TRACE[ON]% */ Trace trace__("krino::Faceted_Surface::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length)"); /* %TRACE% */ + + build_local_facets(point_bbox); + + if (my_transformation != nullptr) + { + for ( auto&& facet : my_local_facets ) + { + facet->apply_transformation(*my_transformation); + } + } + + my_bounding_box.clear(); + for (auto && facet : my_local_facets) + { + my_bounding_box.accommodate(facet->bounding_box()); + } + + my_all_facets.clear(); + for ( auto&& facet : my_local_facets ) + { + my_all_facets.push_back(facet.get()); + } + + // Get all remote facets that might be closest to this processors query points + gather_nonlocal_facets(point_bbox, truncation_length); + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "P" << stk::EnvData::parallel_rank() << ":" << " Building facet tree for " << my_all_facets.size() << " facets." << stk::diag::dendl; + + my_facet_tree = std::make_unique>( my_all_facets, Facet::get_bounding_box ); + + if ( krinolog.shouldPrint(LOG_DEBUG) ) + krinolog << "P" << stk::EnvData::parallel_rank() << ": After building search tree, storage size is " << storage_size()/(1024.*1024.) << " Mb." << stk::diag::dendl; +} + +void +Faceted_Surface::gather_nonlocal_facets(const BoundingBox & point_bbox, const double truncation_length) +{ /* %TRACE[ON]% */ Trace trace__("krino::Faceted_Surface::get_nonlocal_descendants(const BoundingBox & point_bbox, const double truncation_length)"); /* %TRACE% */ + + // If truncation length is specified, get all of the facets that are within + // our padded processor's bounding box. + // To do this, see if any local facets lie in the padded nodal bounding box + // of another proc. if so, send them a copy of those facets. + + my_nonlocal_facets.clear(); + + const int num_procs = stk::EnvData::parallel_size(); + if ( num_procs == 1) return; + + // We estimate the padding based on the uppoer bound of the distance from this processor's nodal bounding box + // to the other processors bounding box of facets. This calculation requires that that local + // descendants are already gathered. + + std::vector facet_bboxes; + BoundingBox::gather_bboxes( my_bounding_box, facet_bboxes ); + + double bbox_padding = std::numeric_limits::max(); + for ( int p = 0; p < num_procs; ++p ) + { + const BoundingBox & proc_facet_bbox = facet_bboxes[p]; + if (proc_facet_bbox.valid()) + { + const double upperBnd = std::sqrt(proc_facet_bbox.SqrDistUpperBnd(point_bbox)); + bbox_padding = std::min(bbox_padding,upperBnd); + } + } + if (std::numeric_limits::max() == bbox_padding) + { + bbox_padding = truncation_length; // only should happen for no facets anywhere + } + if (truncation_length > 0.0) + { + bbox_padding = std::min(bbox_padding, truncation_length); + } + + // gather the bounding box sizes for all procs + BoundingBox local_bbox = point_bbox; + std::vector bboxes; + local_bbox.pad(bbox_padding); + BoundingBox::gather_bboxes( local_bbox, bboxes ); + + // determine which facets will be sent to each processor and formulate message sizes + const int me = stk::EnvData::parallel_rank(); + size_t me_intersecting_facet_counts = 0; + std::vector intersecting_facets; + intersecting_facets.reserve(my_all_facets.size()); + + // Perform communication in stages. In the nth stage, processor, p, + // sends facets to processor p+n and receives from p-n. + // In the 0th stage, each processor count how many of its own facets are + // are within that processor's nodal bounding box. + for ( int comm_partner = 0; comm_partner < num_procs; ++comm_partner ) + { + stk::CommSparse comm_sparse(stk::EnvData::parallel_comm()); + + const int dest_proc = (me+comm_partner) % num_procs; + + // Communication involves two steps, the first one sizes the messages, the second one actually packs and sends the messages + for ( int comm_step = 0; comm_step < 2; ++comm_step) + { + if (comm_step == 0) + { + const BoundingBox & proc_bbox = bboxes[dest_proc]; + intersecting_facets.clear(); + if (proc_bbox.intersects(my_bounding_box)) + { + for ( auto&& facet : my_all_facets ) + { + if ( proc_bbox.intersects(facet->bounding_box()) ) + { + intersecting_facets.push_back(facet); + } + } + } + if (dest_proc == me) me_intersecting_facet_counts = intersecting_facets.size(); + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "P" << me << ":" << " Packaging " << intersecting_facets.size() << " facets for proc#" << dest_proc << stk::diag::dendl; + } + + stk::CommBuffer & b = comm_sparse.send_buffer(dest_proc); + if (dest_proc != me) // Don't talk to yourself, it's embarrassing + { + const size_t intersecting_facets_size = intersecting_facets.size(); + b.pack(intersecting_facets_size); + for ( auto&& facet : intersecting_facets ) + { + facet->pack_into_buffer(b); + } + } + + if (comm_step == 0) + { //allocation step + comm_sparse.allocate_buffers(); + } + else + { //communication step + comm_sparse.communicate(); + } + } + + // unload, creating local copies of nonlocal facets + + const int recv_proc = (me+num_procs-comm_partner) % num_procs; + + if (recv_proc != me) + { + stk::CommBuffer & b = comm_sparse.recv_buffer(recv_proc); + + size_t proc_num_facets_recvd = 0; + b.unpack(proc_num_facets_recvd); + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "P" << stk::EnvData::parallel_rank() << ":" << " Receiving " << proc_num_facets_recvd << " facets from proc#" << recv_proc << stk::diag::dendl; + + for ( size_t n = 0; n < proc_num_facets_recvd; ++n ) + { + std::unique_ptr facet = Facet::unpack_from_buffer( b ); + my_nonlocal_facets.emplace_back( std::move(facet) ); + } + ThrowAssert( 0 == b.remaining() ); + } + } + + // only retain intersecting local descendants + if (my_all_facets.size() != me_intersecting_facet_counts) + { + FacetVec local_descendants; + local_descendants.reserve(me_intersecting_facet_counts); + for ( auto&& facet : my_all_facets ) + { + if ( local_bbox.intersects(facet->bounding_box()) ) + { + local_descendants.push_back( facet ); + } + } + my_all_facets.swap(local_descendants); + } + + // copy nonlocal facets into my_descendants + my_all_facets.reserve(my_all_facets.size()+ my_nonlocal_facets.size()); + for (auto && nonlocal_descendant : my_nonlocal_facets) { my_all_facets.push_back(nonlocal_descendant.get()); } +} + +double +Faceted_Surface::point_distance(const Vector3d &x, const double narrow_band_size, const double far_field_value, const bool compute_signed_distance) const +{ /* %TRACE% */ /* %TRACE% */ + ThrowAssertMsg(my_facet_tree, "ERROR: Empty facet tree"); + + // get all facets we need to check + FacetVec facets; + my_facet_tree->find_closest_entities( x, facets, narrow_band_size ); + + if (facets.empty()) + { + ThrowRequire( 0.0 != narrow_band_size || my_facet_tree->empty() ); + return far_field_value; + } + + double dist = 0.0; + if (compute_signed_distance) + { + dist = compute_point_to_facets_distance_by_average_normal(x, facets); + if (0.0 != narrow_band_size && std::abs(dist) > narrow_band_size) + { + dist = far_field_value; + } + } + else + { + double min_sqr_dist = std::numeric_limits::max(); + for ( auto&& facet : facets ) + { + const double sqr_dist = facet->point_distance_squared(x); + if (sqr_dist < min_sqr_dist) + { + min_sqr_dist = sqr_dist; + } + } + if (0.0 != narrow_band_size && min_sqr_dist > narrow_band_size*narrow_band_size) + { + dist = far_field_value; + } + else + { + dist = std::sqrt(min_sqr_dist); + } + } + + return dist; +} + +double +Faceted_Surface::compute_point_to_facets_distance_by_average_normal(const Vector3d &x, const FacetVec & facets) const +{ /* %TRACE% */ /* %TRACE% */ + + // If the closest_point weights are all larger than this value, then the closest point + // is considered to be on the face of the closest facet rather than on the edges of the facet, and + // therefore only the closest facet is considered in the distance calculation. Otherwise, all of the + // facets are considered to compute an average normal in order to compute the distance. + const double edge_tol = 1.e-6; + + std::vector facet_queries; + facet_queries.reserve(facets.size()); + for ( auto&& facet : facets ) + { + if (facet->degenerate()) continue; // Skip zero-sized facets + facet_queries.emplace_back(*facet, x); + } + + ThrowRequireMsg(!facet_queries.empty(), "All facets are degenerate in compute_point_to_facets_distance_by_average_normal."); + + unsigned nearest = 0; + for ( unsigned index=0; index(facets[nearest]) ? 3 : 2; + + bool closest_point_on_edge = false; + for (int d=0; d 0) + { + return std::sqrt(min_sqr_dist); + } + else + { + return -std::sqrt(min_sqr_dist); + } + } +} + +Vector3d +Faceted_Surface::compute_pseudo_normal(const unsigned dim, const std::vector & facet_queries, const unsigned nearest) const +{ + const double tol = 1.e-6; + Vector3d pseudo_normal = Vector3d::ZERO; + Vector3d average_normal = Vector3d::ZERO; + + const Vector3d nearest_closest_point = facet_queries[nearest].closest_point(); + const double nearest_size2 = facet_queries[nearest].facet().bounding_box().SqrSize(); + unsigned close_count = 0; + for ( auto&& query : facet_queries ) + { + const Vector3d closest_point = query.closest_point(); + const double dist2_from_nearest = (closest_point-nearest_closest_point).length_squared(); + if (dist2_from_nearest < tol*tol*nearest_size2) + { + ++close_count; + const Facet & facet = query.facet(); + + average_normal += facet.facet_normal(); + + if (3 == dim) + { + const Vector3d closest_pt_wts = query.closest_point_weights(); + const int closest_node = (closest_pt_wts[0] > closest_pt_wts[1]) ? ((closest_pt_wts[0] > closest_pt_wts[2]) ? 0 : 2) : ((closest_pt_wts[1] > closest_pt_wts[2]) ? 1 : 2); + + const int n0 = closest_node; + const int n1 = (n0<2) ? (n0+1) : 0; + const int n2 = (n1<2) ? (n1+1) : 0; + const Vector3d edge0 = facet.facet_vertex(n1) - facet.facet_vertex(n0); + const Vector3d edge1 = facet.facet_vertex(n2) - facet.facet_vertex(n0); + const double facet_angle = std::acos(Dot(edge0, edge1)/(edge0.length()*edge1.length())); + + pseudo_normal += facet.facet_normal()*facet_angle; + } + } + } + ThrowRequireMsg(close_count>0,"Issue with tolerance in compute_pseudo_normal. No facet found within tolerance of closest point."); + + return (3 == dim && close_count > 2) ? pseudo_normal : average_normal; +} + +size_t +Faceted_Surface::storage_size() const +{ + size_t store_size = sizeof(Faceted_Surface); + if (my_facet_tree) + { + store_size += my_facet_tree->storage_size(); + } + + store_size += utility::storage_size(my_local_facets); + store_size += utility::storage_size(my_nonlocal_facets); + store_size += utility::storage_size(my_all_facets); + + return store_size; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Faceted_Surface.hpp b/packages/krino/krino/krino_lib/Akri_Faceted_Surface.hpp new file mode 100644 index 000000000000..9ff26e6f0142 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Faceted_Surface.hpp @@ -0,0 +1,69 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Faceted_Surface_h +#define Akri_Faceted_Surface_h + +#include +#include +#include + +namespace krino { + +class Faceted_Surface : public SurfaceThatTakesAdvantageOfNarrowBandAndThereforeMightHaveWrongSign { + +public: + Faceted_Surface(const std::string & sn); + + virtual Surface_Type type() const override { return FACETED_SURFACE; } + virtual size_t storage_size() const override; + virtual void pack_into_buffer(stk::CommBuffer & b) const; // pack into buffer for off-processor communication + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) override; + virtual double truncated_point_signed_distance(const Vector3d &x, const double narrow_band_size, const double far_field_value) const override + { + return point_distance(x, narrow_band_size, far_field_value, true); + } + + // query/modify facets + void add( std::unique_ptr facet ) { my_local_facets.emplace_back(std::move(facet)); } + void reserve(unsigned size_) { my_local_facets.reserve(size_); } + unsigned size() const { return my_local_facets.size(); } + unsigned nonlocal_size() const { return my_nonlocal_facets.size(); } + Facet * operator()( const unsigned index ) const { return my_local_facets[index].get(); } + void clear() { my_local_facets.clear(); } + void swap(Faceted_Surface & other) { my_local_facets.swap(other.my_local_facets); } + const FacetOwningVec & get_facets() const { return my_local_facets; } + void parallel_distribute_facets(const size_t batch_size, const std::vector & proc_bboxes); + +public: + void prepare_to_compute(const BoundingBox & point_bbox, const double truncation_length) + { ThrowAssert(nullptr == my_transformation); prepare_to_compute(0.0, point_bbox, truncation_length); } + double point_unsigned_distance(const Vector3d &x, const double narrow_band_size, const double far_field_value) const + { + return point_distance(x, narrow_band_size, far_field_value, false); + } + +private: + virtual void build_local_facets(const BoundingBox & proc_bbox) {} + double point_distance(const Vector3d &x, const double narrow_band_size, const double far_field_value, const bool compute_signed_distance) const; + double compute_point_to_facets_distance_by_average_normal(const Vector3d &x, const FacetVec & facets) const; + Vector3d compute_pseudo_normal(const unsigned dim, const std::vector & facet_queries, const unsigned nearest) const; + void gather_nonlocal_facets(const BoundingBox & local_bbox, const double truncation_length); + + std::string my_name; + FacetOwningVec my_local_facets; + + mutable std::unique_ptr> my_facet_tree; + mutable FacetOwningVec my_nonlocal_facets; + mutable FacetVec my_all_facets; + BoundingBox my_bounding_box; +}; + +} // namespace krino + +#endif // Akri_Faceted_Surface_h diff --git a/packages/krino/krino/krino_lib/Akri_Fast_Marching.cpp b/packages/krino/krino/krino_lib/Akri_Fast_Marching.cpp new file mode 100644 index 000000000000..2a09003eaf2c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Fast_Marching.cpp @@ -0,0 +1,726 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace krino{ + +Fast_Marching::Fast_Marching(LevelSet & ls, const stk::mesh::Selector & selector, stk::diag::Timer & parent_timer) + : my_ls(ls), + my_selector(selector), + my_timer("Fast Marching", parent_timer), + my_tri_timer("Update Triangle", my_timer), + my_tet_timer("Update Tetrahedron", my_timer), + my_fm_node_less(ls.mesh()), + trial_nodes(my_fm_node_less) +{ + ParallelErrorMessage err(mesh().parallel()); + stk::mesh::Selector fieldSelector(my_ls.get_distance_field()); + const stk::mesh::BucketVector& buckets = selector.get_buckets(stk::topology::ELEMENT_RANK); + for (auto && bucket : buckets) + { + if (fieldSelector(*bucket) && + bucket->topology() != stk::topology::TRIANGLE_3_2D && + bucket->topology() != stk::topology::TETRAHEDRON_4) + { + err << "Topology " << bucket->topology().name() << " is not supported in Fast_Marching.\n"; + } + } + check_error(err, "Checking topology"); +} + +void +Fast_Marching::check_error(const ParallelErrorMessage& err, const std::string & context) const +{ + auto globalError = err.gather_message(); + if (globalError.first) + { + krinolog<< "Error in " << context << ":" << stk::diag::dendl; + krinolog << globalError.second << stk::diag::dendl; + } + ThrowRequireMsg(!globalError.first, "Error in " << context << "."); +} + +void Fast_Marching::redistance() +{ + stk::diag::TimeBlock timer__(my_timer); + const FieldRef& dRef = my_ls.get_distance_field(); + const FieldRef& olddRef = my_ls.get_old_distance_field(); + + // make sure field is parallel consistent to start out + { + std::vector parallel_fields(1, &dRef.field()); + stk::mesh::copy_owned_to_shared(mesh(), parallel_fields); + } + + ParallelErrorMessage err(mesh().parallel()); + + initialize(err); + + // neighbors of initial nodes are trial nodes + for ( auto && fm_node : fm_nodes ) + { + if (fm_node.status() == STATUS_INITIAL) + { + update_neighbors(fm_node, err); + } + } + + check_error(err, "Fast Marching Initialization"); + + stk::mesh::Selector globally_shared_selector = my_selector & mesh().mesh_meta_data().globally_shared_part(); + std::vector< stk::mesh::Entity> shared_nodes; + stk::mesh::get_selected_entities( globally_shared_selector, mesh().buckets( stk::topology::NODE_RANK ), shared_nodes ); + + bool done = false; + + const size_t local_num_nodes = fm_nodes.size(); + size_t max_num_nodes = 0; + stk::all_reduce_max(mesh().parallel(), &local_num_nodes, &max_num_nodes, 1); + + const unsigned max_outer_steps = max_num_nodes; // should be overkill + unsigned num_outer_steps = 0; + while (!done) + { + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "num_trial nodes = " << trial_nodes.size() << "\n"; + + if (num_outer_steps++ > max_outer_steps) + { + err << "Error: Outer loop of Fast_Marching::redistance did not converge!\n"; + break; + } + + const unsigned max_inner_steps = 10*max_outer_steps; // should be overkill + unsigned num_inner_steps = 0; + while(!trial_nodes.empty()) + { + auto begin = trial_nodes.begin(); + Fast_Marching_Node & fm_node = **begin; + trial_nodes.erase(begin); + fm_node.set_status(STATUS_ACCEPTED); + update_neighbors(fm_node, err); + if (num_inner_steps++ > max_inner_steps) + { + err << "Error: Inner loop of Fast_Marching::redistance did not converge! Number of trial nodes = " << trial_nodes.size() << "\n"; + } + if (err.have_local_error()) break; + } + + check_error(err, "Fast Marching Iteration"); + + unsigned num_locally_updated = 0; + if (mesh().parallel_size() > 1) + { + for ( auto && shared_node : shared_nodes ) + { + Fast_Marching_Node * fm_node = get_fm_node(shared_node); + if (nullptr != fm_node && fm_node->status() != STATUS_UNUSED) + { + double & node_dist = *field_data(dRef, fm_node->node()); + node_dist = fm_node->signed_dist()*fm_node->sign(); + } + } + stk::mesh::parallel_min(mesh(), {&dRef.field()}); + + for ( auto && shared_node : shared_nodes ) + { + Fast_Marching_Node * fm_node = get_fm_node(shared_node); + if (nullptr != fm_node && fm_node->status() != STATUS_UNUSED) + { + stk::mesh::Entity node = fm_node->node(); + const double min_node_unsigned_dist = *field_data(dRef, node); + const double fm_node_unsigned_dist = fm_node->signed_dist()*fm_node->sign(); + if(min_node_unsigned_dist < fm_node_unsigned_dist) + { + ThrowAssertMsg(fm_node->status() != STATUS_INITIAL || fm_node->status() != STATUS_TRIAL, "Unexpected node to have INITIAL or TRIAL status."); + fm_node->set_signed_dist(min_node_unsigned_dist*fm_node->sign()); + add_trial_node(*fm_node); + ++num_locally_updated; + } + } + } + } + + unsigned num_globally_updated = 0; + stk::all_reduce_sum(mesh().parallel(), &num_locally_updated, &num_globally_updated, 1); + + done = (num_globally_updated == 0); + } + + for ( auto && fm_node : fm_nodes ) + { + if (fm_node.status() == STATUS_TRIAL || fm_node.status() == STATUS_FAR) + { + err << "Node " << mesh().identifier(fm_node.node()) << " with status " << fm_node.status() << " with distance " << fm_node.signed_dist() << " did not get updated!\n"; + } + if (fm_node.status() != STATUS_UNUSED) + { + double & node_dist = *field_data(dRef, fm_node.node()); + node_dist = fm_node.signed_dist(); + } + } + + check_error(err, "Fast Marching Update"); + stk::mesh::field_copy(dRef, olddRef); +} + +Fast_Marching_Node * Fast_Marching::get_fm_node(stk::mesh::Entity node) +{ + if (mesh().is_valid(node) && mesh().local_id(node) < fm_nodes.size()) + { + return &fm_nodes[mesh().local_id(node)]; + } + else + { + return nullptr; + } +} + +void Fast_Marching::initialize(ParallelErrorMessage& err) +{ + stk::mesh::BulkData& stk_mesh = mesh(); + const FieldRef xRef = my_ls.get_coordinates_field(); + const FieldRef dRef = my_ls.get_distance_field(); + + const int dim = mesh().mesh_meta_data().spatial_dimension(); + + fm_nodes.clear(); + fm_nodes.resize(stk::mesh::count_selected_entities(stk_mesh.mesh_meta_data().universal_part(), stk_mesh.buckets(stk::topology::NODE_RANK))); + + std::vector field_nodes; + stk::mesh::Selector field_not_ghost = aux_meta().active_not_ghost_selector() & my_selector & stk::mesh::selectField(dRef); + stk::mesh::get_selected_entities( field_not_ghost, stk_mesh.buckets( stk::topology::NODE_RANK ), field_nodes ); + + for ( auto&& node : field_nodes ) + { + const double * curr_node_dist = field_data(dRef, node); + ThrowAssert(nullptr != curr_node_dist); + + Vector3d coords = Vector3d::ZERO; + const double * xptr = field_data(xRef, node); + ThrowAssert(nullptr != xptr); + for ( int d = 0; d < dim; d++ ) + { + coords[d] = xptr[d]; + } + + Fast_Marching_Node * fm_node = get_fm_node(node); + ThrowAssert(nullptr != fm_node); + *fm_node = Fast_Marching_Node(node,STATUS_FAR,LevelSet::sign(*curr_node_dist) * std::numeric_limits::max(),LevelSet::sign(*curr_node_dist),coords); + } + + // To start the nodes of elements that have interfaces will be redistanced. + // I have tried a few different methods for this distance calculation with varying success. + // We can: + // 1. Use only local facets to redistance the nodes of the element. This appears to not work too + // well because the closest facet to a node might be in an element that does not support the node. + // 2. Use local facets, but use the normal distance instead of the facet distance. This seems to work + // better than (1) usually. However, it seems prone to pathalogical behavior when small facets run + // parallel to an element side, producing inaccurate distance measures on this side. + // 3. Use the standard parallel redistance calculation used in "normal" redistancing. This is susceptible + // to seeing through walls if the walls are thinner than the distance of the nodes of the cut element to + // the surface. + // 4. Start the redistancing from the subelement facets, progressing through the subelements. + // Somewhat surprisingly, this does not work too well. I think this may be due to the obtuse angles + // in the subelement decomposition. The results are very similar to that produced by local redistancing (#1). + // 5. Rescale each cut element so that it has a unit gradient (or prescribed gradient) and set the nodal + // distance to the minimum (magnitude) from all of the supporting elements. This seems to work pretty + // well in the test cases and is completely local, and is not susceptible to seeing through walls. + + { + // Initialize using method #5 (element rescaling) + std::vector field_elems; + stk::mesh::get_selected_entities( field_not_ghost, stk_mesh.buckets( stk::topology::ELEMENT_RANK ), field_elems ); + for (auto&& elem : field_elems) + { + if (have_crossing(elem)) + { + const double speed = my_ls.get_time_of_arrival_speed(elem, err); + initialize_element(elem, speed); + } + } + + if (mesh().parallel_size() > 1) + { + stk::mesh::Selector globally_shared_selector = my_selector & mesh().mesh_meta_data().globally_shared_part(); + std::vector< stk::mesh::Entity> shared_nodes; + stk::mesh::get_selected_entities( globally_shared_selector, stk_mesh.buckets( stk::topology::NODE_RANK ), shared_nodes ); + + for ( auto && shared_node : shared_nodes ) + { + Fast_Marching_Node * fm_node = get_fm_node(shared_node); + if (nullptr != fm_node && fm_node->status() != STATUS_UNUSED) + { + double & node_dist = *field_data(dRef, fm_node->node()); + node_dist = fm_node->signed_dist()*fm_node->sign(); + } + } + stk::mesh::parallel_min(mesh(), {&dRef.field()}); + + for ( auto && shared_node : shared_nodes ) + { + Fast_Marching_Node * fm_node = get_fm_node(shared_node); + if (nullptr != fm_node && fm_node->status() != STATUS_UNUSED) + { + stk::mesh::Entity node = fm_node->node(); + const double min_node_unsigned_dist = *field_data(dRef, node); + const double fm_node_unsigned_dist = fm_node->signed_dist()*fm_node->sign(); + fm_node->set_signed_dist(min_node_unsigned_dist*fm_node->sign()); + if (min_node_unsigned_dist < fm_node_unsigned_dist) + { + fm_node->set_status(STATUS_INITIAL); + } + } + } + } + } +} + +bool +Fast_Marching::have_crossing(const stk::mesh::Entity & elem) const +{ + const FieldRef dRef = my_ls.get_distance_field(); + const unsigned npe = mesh().bucket(elem).topology().num_nodes(); + ThrowAssert(npe > 0); + + const stk::mesh::Entity * elem_nodes = mesh().begin(elem, stk::topology::NODE_RANK); + const double * dist0 = field_data(dRef, elem_nodes[0]); + ThrowAssert(nullptr != dist0); + for (unsigned n=1; n(dRef, elem_nodes[n]); + ThrowAssert(nullptr != dist); + if (LevelSet::sign_change(*dist0, *dist)) + { + return true; + } + } + return false; +} + +static std::function build_get_fm_node_coordinates(Fast_Marching * fm) +{ + return [fm](stk::mesh::Entity node) -> const Vector3d & + { + Fast_Marching_Node * fm_node = fm->get_fm_node(node); + ThrowAssert(fm_node); + return fm_node->coords(); + }; +} + +static double calculate_gradient_magnitude(const int npe, + const stk::mesh::Entity * elem_nodes, + const FieldRef dRef, + const std::function & get_coordinates) +{ + double mag_grad = 1.0; + + if (3 == npe) + { + const double d0 = *field_data(dRef, elem_nodes[0]); + const double d10 = *field_data(dRef, elem_nodes[1])-d0; + const double d20 = *field_data(dRef, elem_nodes[2])-d0; + + const Vector3d x0 = get_coordinates(elem_nodes[0]); + const Vector3d x10 = get_coordinates(elem_nodes[1]) - x0; + const Vector3d x20 = get_coordinates(elem_nodes[2]) - x0; + + const double detJ = (x10[0]*x20[1]-x20[0]*x10[1]); + const Vector3d grad = d10*Vector3d(x20[1],-x20[0],0.0) + d20*Vector3d(-x10[1],x10[0],0.0); + mag_grad = grad.length()/detJ; + } + else + { + ThrowAssert(4 == npe); + + const double d0 = *field_data(dRef, elem_nodes[0]); + const double d10 = *field_data(dRef, elem_nodes[1])-d0; + const double d20 = *field_data(dRef, elem_nodes[2])-d0; + const double d30 = *field_data(dRef, elem_nodes[3])-d0; + + const Vector3d x0 = get_coordinates(elem_nodes[0]); + const Vector3d x10 = get_coordinates(elem_nodes[1]) - x0; + const Vector3d x20 = get_coordinates(elem_nodes[2]) - x0; + const Vector3d x30 = get_coordinates(elem_nodes[3]) - x0; + + const Vector3d x10_x_x20 = Cross(x10,x20); + const Vector3d x20_x_x30 = Cross(x20,x30); + const Vector3d x30_x_x10 = Cross(x30,x10); + + const double detJ = Dot(x30,x10_x_x20); + const Vector3d grad = d10*x20_x_x30 + d20*x30_x_x10 + d30*x10_x_x20; + mag_grad = grad.length()/detJ; + } + + return mag_grad; +} + +void +Fast_Marching::initialize_element(const stk::mesh::Entity & elem, const double speed) +{ + // Still another way to initialize fast marching. + // Here we go to each cut element and find the current distance gradient. + // By comparing this to the desired gradient, we rescale each element. The nodal + // distance is set to the minimum (magnitude) for each of the rescaled elements that + // support the node. + const FieldRef dRef = my_ls.get_distance_field(); + const stk::mesh::Entity * elem_nodes = mesh().begin(elem, stk::topology::NODE_RANK); + const int npe = mesh().bucket(elem).topology().num_nodes(); + + auto get_coordinates = build_get_fm_node_coordinates(this); + + const double mag_grad = calculate_gradient_magnitude(npe, elem_nodes, dRef, get_coordinates); + + for (int inode=0; inodestatus() != STATUS_UNUSED); + const double elem_node_dist = *field_data(dRef, elem_nodes[inode]) / (mag_grad * speed); + const int sign = LevelSet::sign(fm_node->signed_dist()); + fm_node->set_signed_dist(sign * std::min(std::abs(fm_node->signed_dist()), std::abs(elem_node_dist))); + fm_node->set_status(STATUS_INITIAL); + fm_node->set_sign(sign); + } +} + +void +Fast_Marching::update_neighbors(Fast_Marching_Node & accepted_node, ParallelErrorMessage& err) +{ + const FieldRef dRef = my_ls.get_distance_field(); + const stk::mesh::Selector active_field_not_aura = my_selector & aux_meta().active_not_ghost_selector() & stk::mesh::selectField(dRef); + + stk::mesh::Entity node = accepted_node.node(); + + ThrowAssertMsg(STATUS_ACCEPTED == accepted_node.status() || STATUS_INITIAL == accepted_node.status(), "Expected ACCEPTED OR INITIAL status"); + + const int dim = mesh().mesh_meta_data().spatial_dimension(); + ThrowAssert(2 == dim || 3 == dim); + const int npe_dist = (2==dim) ? 3 : 4; + std::vector elem_nodes(npe_dist); + + const unsigned num_node_elems = mesh().num_elements(node); + const stk::mesh::Entity* node_elems = mesh().begin_elements(node); + for (unsigned node_elem_index=0; node_elem_indexstatus() || STATUS_ACCEPTED == fm_nbr->status() || STATUS_FAR == fm_nbr->status() || STATUS_TRIAL == fm_nbr->status()), "Unexpected node status."); + elem_nodes[i] = fm_nbr; + bool do_add_trial_node = fm_nbr->status() == STATUS_FAR; + if (fm_nbr->status() == STATUS_ACCEPTED) + { + const double accepted_node_unsigned_dist = accepted_node.signed_dist()*accepted_node.sign(); + const double nbr_unsigned_dist = fm_nbr->signed_dist()*fm_nbr->sign(); + if(nbr_unsigned_dist > accepted_node_unsigned_dist) + { + do_add_trial_node = true; + } + } + if (do_add_trial_node) + { + add_trial_node(*fm_nbr); + } + if (fm_nbr->status() == STATUS_TRIAL) + { + ++num_trial; + node_to_update = i; + } + } + + if (1 == num_trial) + { + update_node(elem_nodes, node_to_update, speed); + } + } +} + +void +Fast_Marching::add_trial_node(Fast_Marching_Node & trial_node) +{ + ThrowAssertMsg(trial_node.status() == STATUS_ACCEPTED || trial_node.status() == STATUS_FAR, "Expected ACCEPTED or FAR when adding trial node"); + trial_nodes.insert(&trial_node); + trial_node.set_status(STATUS_TRIAL); +} + +void +Fast_Marching::update_trial_node(Fast_Marching_Node & trial_node, const double dist) +{ + ThrowAssertMsg(trial_node.status() == STATUS_TRIAL, "Unexpected node status when updating trial node"); + + auto it = trial_nodes.find(&trial_node); + ThrowAssertMsg(it != trial_nodes.end(), "Can't find trial node"); + + trial_nodes.erase(it); + + trial_node.set_signed_dist(dist); + trial_nodes.insert(&trial_node); +} + +void +Fast_Marching::update_node(std::vector & elem_nodes, int node_to_update, const double speed) +{ + // update distance + double dist = std::numeric_limits::max(); + const int npe_dist = elem_nodes.size(); + + if (3 == npe_dist) + { + dist = update_triangle(elem_nodes, node_to_update, speed); + } + else if (4 == npe_dist) + { + dist = update_tetrahedron(elem_nodes, node_to_update, speed); + } + else + { + ThrowAssertMsg(false, "Unexpected number of nodes per element: " << npe_dist); + } + + Fast_Marching_Node & fm_node = *elem_nodes[node_to_update]; + if (dist*fm_node.sign() < fm_node.signed_dist()*fm_node.sign()) + { + update_trial_node(fm_node, dist); + } +} + +double +Fast_Marching::update_triangle(std::vector & elem_nodes, int node_to_update, const double speed, int side_to_update) +{ + stk::diag::TimeBlock timer__(my_tri_timer); + const int dim = mesh().mesh_meta_data().spatial_dimension(); + ThrowAssert(2 == dim || 3 == dim); + + int lnn[3]; + if (2 == dim) + { + ThrowAssert(-1 == side_to_update); + lnn[0] = (node_to_update + 1) % 3; + lnn[1] = (node_to_update + 2) % 3; + lnn[2] = node_to_update; + } + else // (3 == dim) + { + const stk::topology tet4_topology = stk::topology::TETRAHEDRON_4; + const unsigned * side_node_ordinals = get_side_node_ordinals(tet4_topology, side_to_update); + lnn[0] = side_node_ordinals[(node_to_update + 1) % 3]; + lnn[1] = side_node_ordinals[(node_to_update + 2) % 3]; + lnn[2] = side_node_ordinals[node_to_update]; + } + + const double dist_0 = elem_nodes[lnn[0]]->signed_dist(); + const double dist_1 = elem_nodes[lnn[1]]->signed_dist(); + double dist_2 = elem_nodes[lnn[2]]->signed_dist(); + + const int sign = elem_nodes[lnn[2]]->sign(); + if (sign*(dist_2-dist_0) < 0 || sign*(dist_2-dist_1) < 0) + { + return dist_2; + } + + const Vector3d & coords_0 = elem_nodes[lnn[0]]->coords(); + const Vector3d & coords_1 = elem_nodes[lnn[1]]->coords(); + const Vector3d & coords_2 = elem_nodes[lnn[2]]->coords(); + + const double sqr_speed = speed*speed; + const double d10 = dist_1 - dist_0; + const Vector3d x10 = coords_1 - coords_0; + const Vector3d x20 = coords_2 - coords_0; + const double h10 = x10.length(); + const double h20 = x20.length(); + + double detJ = 0; + if (2 == dim) + { + detJ = (x10[0]*x20[1]-x20[0]*x10[1]); + } + else // (3 == dim) + { + detJ = Cross(x10,x20).length(); + } + ThrowAssert(detJ > 0.0); + + const double a = h10*h10; + const double b = -2.0 * sign*d10 * Dot(x10,x20); + const double c = d10*d10 * h20*h20 - detJ*detJ/sqr_speed; + + bool elem_is_defining = false; + + const double det = b*b-4.0*a*c; + if (det > 0.0) + { + // solve quadratic equation, roots are q/a and c/q + const int sign_b = ( b < 0.0 ) ? -1 : 1; + const double q = -0.5*(b + sign_b*std::sqrt(det)); + + const double d20 = sign*std::max(c/q,q/a); + + const bool causal = (sign*d20 > 0.0 && sign*(d20-d10) > 0.0); + + if (causal) + { + const double loc = (Dot(x10,x20) - sqr_speed*d10*d20) / (h10*h10 - sqr_speed*d10*d10); + elem_is_defining = (loc > 0.0 && loc < 1.0); + + if (elem_is_defining) + { + dist_2 = sign * std::min(sign*dist_2,sign*(dist_0 + d20)); + } + } + } + + if (!elem_is_defining) + { + const double h21 = (coords_2 - coords_1).length(); + dist_2 = sign * std::min(sign*dist_2,std::min(sign*dist_0+h20/speed,sign*dist_1+h21/speed)); + // Enforce causality - This is to catch the corner case (literally) where the characteristic is marching along the edges of the element + dist_2 = sign * std::max(sign*dist_2,std::max(sign*dist_0,sign*dist_1)); + } + + ThrowAssert(sign*(dist_2-dist_0)>=0 && sign*(dist_2-dist_1)>=0); + + return dist_2; +} + +double +Fast_Marching::update_tetrahedron(std::vector & elem_nodes, int node_to_update, const double speed) +{ + stk::diag::TimeBlock timer__(my_tet_timer); + static const unsigned node_permute_0[] = { 1,3,2,0 }; + static const unsigned node_permute_1[] = { 0,2,3,1 }; + static const unsigned node_permute_2[] = { 0,3,1,2 }; + static const unsigned node_permute_3[] = { 0,1,2,3 }; + static const unsigned * node_permute_table[] = { node_permute_0, node_permute_1, node_permute_2, node_permute_3 }; + + int lnn[4]; + lnn[0] = node_permute_table[node_to_update][0]; + lnn[1] = node_permute_table[node_to_update][1]; + lnn[2] = node_permute_table[node_to_update][2]; + lnn[3] = node_permute_table[node_to_update][3]; + + const double dist_0 = elem_nodes[lnn[0]]->signed_dist(); + const double dist_1 = elem_nodes[lnn[1]]->signed_dist(); + const double dist_2 = elem_nodes[lnn[2]]->signed_dist(); + double dist_3 = elem_nodes[lnn[3]]->signed_dist(); + + const int sign = elem_nodes[lnn[3]]->sign(); + if (sign*(dist_3-dist_0) < 0 || sign*(dist_3-dist_1) < 0 || sign*(dist_3-dist_2) < 0) + { + return dist_3; + } + + const Vector3d & coords_0 = elem_nodes[lnn[0]]->coords(); + const Vector3d & coords_1 = elem_nodes[lnn[1]]->coords(); + const Vector3d & coords_2 = elem_nodes[lnn[2]]->coords(); + const Vector3d & coords_3 = elem_nodes[lnn[3]]->coords(); + + const double sqr_speed = speed*speed; + const double d10 = dist_1-dist_0; + const double d20 = dist_2-dist_0; + + const Vector3d x10 = coords_1 - coords_0; + const Vector3d x20 = coords_2 - coords_0; + const Vector3d x30 = coords_3 - coords_0; + + const Vector3d x10_x_x20 = Cross(x10,x20); + const Vector3d x20_x_x30 = Cross(x20,x30); + const Vector3d x30_x_x10 = Cross(x30,x10); + + const double detJ = Dot(x30,x10_x_x20); + ThrowAssert(detJ > 0); + + const Vector3d contrib12 = sign * (d10*x20_x_x30 + d20*x30_x_x10); + + const double a = x10_x_x20.length_squared(); + const double b = 2.0 * Dot(x10_x_x20,contrib12); + const double c = contrib12.length_squared() - detJ*detJ/sqr_speed; + + bool elem_is_defining = false; + + const double det = b*b-4.0*a*c; + if (det > 0.0) + { + // solve quadratic equation, roots are q/a and c/q + const int sign_b = ( b < 0.0 ) ? -1 : 1; + const double q = -0.5*(b + sign_b*std::sqrt(det)); + + const double d30 = sign*std::max(c/q,q/a); + + const bool causal = (sign*d30 > 0.0 && sign*(d30-d10) > 0.0 && sign*(d30-d20) > 0.0); + + if (causal) + { + // Solve 2x2 system for parametric coords of intersection of gradient and 0-1-2 + // A1 r + B1 s == C1 + // A2 r + B2 s == C2 + const double A1 = x10.length_squared() - sqr_speed*d10*d10; + const double B1 = Dot(x10,x20) - sqr_speed*d10*d20; + const double C1 = Dot(x10,x30) - sqr_speed*d10*d30; + const double A2 = B1; + const double B2 = x20.length_squared() - sqr_speed*d20*d20; + const double C2 = Dot(x20,x30) - sqr_speed*d20*d30; + const double denom = A2*B1 - A1*B2; + const double loc_r = (C2*B1 - C1*B2)/denom; + const double loc_s = (A2*C1 - A1*C2)/denom; + const double loc_t = 1.0 - loc_r - loc_s; + elem_is_defining = (loc_r > 0.0 && loc_s > 0.0 && loc_t > 0.0); + + if (elem_is_defining) + { + dist_3 = sign * std::min(sign*dist_3,sign*(dist_0 + d30)); + } + } + } + + if (!elem_is_defining) + { + const stk::topology tet4_topology = stk::topology::TETRAHEDRON_4; + for (int iside=0; iside<4; ++iside) + { + const unsigned * side_node_lnn = get_side_node_ordinals(tet4_topology, iside); + for (int inode=0; inode<3; ++inode) + { + if (node_to_update == (int)side_node_lnn[inode]) + { + dist_3 = sign * std::min(sign*dist_3, sign*update_triangle(elem_nodes,inode,speed,iside)); + } + } + } + // Enforce causality - This is to catch the corner case (literally) where the characteristic is marching along the edges of the element + // This is not completely covered by the 2d check because 1 face might still predict a value that is less than the neighbors. + dist_3 = sign * std::max(sign*dist_3,std::max(sign*dist_2,std::max(sign*dist_1,sign*dist_0))); + } + + ThrowAssert(sign*(dist_3-dist_0)>=0 && sign*(dist_3-dist_1)>=0 && sign*(dist_3-dist_2)>=0); + + return dist_3; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Fast_Marching.hpp b/packages/krino/krino/krino_lib/Akri_Fast_Marching.hpp new file mode 100644 index 000000000000..233bec1d38a7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Fast_Marching.hpp @@ -0,0 +1,104 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Fast_Marching_h +#define Akri_Fast_Marching_h + +#include +#include +#include + +namespace krino { + +class SubElement; +class Mesh_Element; +class AuxMetaData; +class ParallelErrorMessage; + +enum Enum_Fast_Marching_Node_Status{STATUS_UNUSED=0, STATUS_INITIAL, STATUS_ACCEPTED, STATUS_TRIAL, STATUS_FAR}; + +class Fast_Marching_Node +{ +public: + Fast_Marching_Node() + : my_node(), my_status(STATUS_UNUSED), my_signed_dist(std::numeric_limits::max()), my_on_neg_side(false) {} + Fast_Marching_Node(stk::mesh::Entity in_node, Enum_Fast_Marching_Node_Status in_status, double in_dist, int in_sign, Vector3d in_coords) + : my_node(in_node), my_status(in_status), my_signed_dist(in_dist), my_on_neg_side(in_sign<0), my_coords(in_coords) {} + + int sign() const { return (my_on_neg_side ? (-1) : 1); } + void set_sign(const int in_sign) { my_on_neg_side = (in_sign<0); } + stk::mesh::Entity node() const { return my_node; } + Enum_Fast_Marching_Node_Status status() const { return my_status; } + const Vector3d & coords() const { return my_coords; } + double signed_dist() const { return my_signed_dist; } + void set_signed_dist(double dist) { my_signed_dist = dist; } + void set_status(Enum_Fast_Marching_Node_Status status) { my_status = status; } + +private: + stk::mesh::Entity my_node; + Enum_Fast_Marching_Node_Status my_status; + double my_signed_dist; + bool my_on_neg_side; + Vector3d my_coords; +}; + +class Fast_Marching_Node_Less +{ +public: + Fast_Marching_Node_Less(const stk::mesh::BulkData & mesh) : mMesh(mesh) {} + bool operator() (const Fast_Marching_Node *a, const Fast_Marching_Node *b) const + { + const double unsignedDistA = a->signed_dist()*a->sign(); + const double unsignedDistB = b->signed_dist()*b->sign(); + if (unsignedDistA < unsignedDistB) return true; + if (unsignedDistB < unsignedDistA) return false; + return mMesh.identifier(a->node()) < mMesh.identifier(b->node()); + } +private: + const stk::mesh::BulkData & mMesh; +}; + +class Fast_Marching { +public: + Fast_Marching(LevelSet & ls, const stk::mesh::Selector & selector, stk::diag::Timer & parent_timer); + + void redistance(); + void initialize(ParallelErrorMessage& err); + void update_neighbors(Fast_Marching_Node & accepted_node, ParallelErrorMessage & err); + void update_node(std::vector & elem_nodes, int node_to_update, const double speed); + + bool have_crossing(const stk::mesh::Entity & elem) const; + void initialize_subelement(const SubElement & subelem, const int side, const double speed); + void initialize_element(const stk::mesh::Entity & elem, const double speed); + double update_triangle(std::vector & elem_nodes, int node_to_update, const double speed, int side_to_update=-1); + double update_tetrahedron(std::vector & elem_nodes, int node_to_update, const double speed); + + void add_trial_node(Fast_Marching_Node & add_trial_node); + void update_trial_node(Fast_Marching_Node & add_trial_node, const double dist); + Fast_Marching_Node * get_fm_node(stk::mesh::Entity node); + + const AuxMetaData& aux_meta() const { return my_ls.aux_meta(); } + AuxMetaData& aux_meta() { return my_ls.aux_meta(); } + const stk::mesh::BulkData& mesh() const { return my_ls.mesh(); } + stk::mesh::BulkData& mesh() { return my_ls.mesh(); } +private: + LevelSet & my_ls; + stk::mesh::Selector my_selector; + stk::diag::Timer my_timer; + stk::diag::Timer my_tri_timer; + stk::diag::Timer my_tet_timer; + std::vector fm_nodes; + Fast_Marching_Node_Less my_fm_node_less; + std::set trial_nodes; //set sorted by distance, then by id to break "ties" + + void check_error(const ParallelErrorMessage& err, const std::string & context) const; +}; + +} // namespace krino + +#endif // Akri_Fast_Marching_h diff --git a/packages/krino/krino/krino_lib/Akri_FieldRef.cpp b/packages/krino/krino/krino_lib/Akri_FieldRef.cpp new file mode 100644 index 000000000000..c10c1dd8a22f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_FieldRef.cpp @@ -0,0 +1,54 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include // for operator<<, stringstream, etc + +namespace krino{ + +bool FieldRef::operator < ( const FieldRef & rhs ) const +{ + if ( my_field == rhs.my_field || rhs.my_field == NULL ) + { + return false; // identical + } + else if (my_field == NULL) + { + return true; + } + else if ( my_field->field_state(stk::mesh::StateNone) == rhs.field().field_state(stk::mesh::StateNone) ) + { + return my_field->state() < rhs.state(); + } + return name() < rhs.name(); +} + +std::string +state_string(stk::mesh::FieldState state) +{ + static const char * const local_state_name[] = { + "STATE_NONE/NEW/NP1", + "STATE_OLD/N", + "STATE_NM1", + "STATE_NM2", + "STATE_NM3", + "STATE_NM4" + }; + + if ((unsigned) state < (unsigned)sizeof(local_state_name)/(unsigned)sizeof(local_state_name[0])) + return local_state_name[state]; + else { + std::stringstream strout; + strout << "(" << (unsigned) state << ")"; + return strout.str().c_str(); + } +} + +//---------------------------------------------------------------------- + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_FieldRef.hpp b/packages/krino/krino/krino_lib/Akri_FieldRef.hpp new file mode 100644 index 000000000000..b64fcdf37f36 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_FieldRef.hpp @@ -0,0 +1,168 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_FieldRef_h +#define Akri_FieldRef_h + +#include // for NULL +#include // for string +#include "stk_mesh/base/DataTraits.hpp" // for DataTraits +#include "stk_mesh/base/Entity.hpp" // for Entity +#include "stk_mesh/base/Field.hpp" // for Field +#include "stk_mesh/base/FieldBase.hpp" // for FieldBase, etc +#include "stk_mesh/base/FieldState.hpp" // for FieldState, etc +#include "stk_mesh/base/Types.hpp" // for EntityRank +#include "stk_util/util/ReportHandler.hpp" // for ThrowAssertMsg, etc +namespace stk { namespace mesh { class Bucket; } } + +namespace krino{ + +std::string +state_string(stk::mesh::FieldState state); + +class FieldRef +{ +public: + // Only default constructed FieldRef (or copies of a default constructed FieldRef) should ever have my_field==NULL + FieldRef() : my_field(NULL) {} + + FieldRef(const FieldRef &) = default; + FieldRef & operator= (const FieldRef &) = default; + + FieldRef(const stk::mesh::FieldBase * in_field) + : my_field(in_field) + { + ThrowAssertMsg(NULL != in_field, "Cannot set FieldRef with NULL field."); + } + FieldRef(const stk::mesh::FieldBase * in_field, const stk::mesh::FieldState in_state) + : my_field(in_field) + { + ThrowAssertMsg(NULL != in_field, "Cannot set FieldRef with NULL field."); + my_field = in_field->field_state(in_state); + ThrowAssertMsg(NULL != my_field, "Invalid state."); + } + FieldRef(const stk::mesh::FieldBase & in_fieldref) + { + my_field = &in_fieldref; + } + FieldRef(const FieldRef in_fieldref, const stk::mesh::FieldState in_state) + { + ThrowAssertMsg(NULL != in_fieldref.my_field, "Cannot set FieldRef with NULL field."); + my_field = in_fieldref.my_field->field_state(in_state); + } + + FieldRef field_state(stk::mesh::FieldState in_state) const + { + return FieldRef(my_field, in_state); + } + + // assignment operators + FieldRef& operator=( const stk::mesh::FieldBase * in_field ) + { + ThrowAssertMsg(NULL != in_field, "Cannot set FieldRef with NULL field."); + my_field = in_field; + return *this; + } + FieldRef& operator=( const stk::mesh::FieldBase & in_field ) + { + my_field = &in_field; + return *this; + } + + bool valid() const { return NULL != my_field; } + bool valid_restriction_size() const { return NULL != my_field && 0 != my_field->restrictions().size(); } + void assert_valid() const { ThrowAssertMsg(NULL != my_field, "Attempt to access field of uninitialized FieldRef."); } + + // stk access + const stk::mesh::FieldBase & field() const { assert_valid(); return *my_field; } + stk::mesh::FieldBase & field() { assert_valid(); return const_cast(*my_field); } + operator const stk::mesh::FieldBase &() const { assert_valid(); return *my_field; } + + // pass through methods + unsigned number_of_states() const { assert_valid(); return my_field->number_of_states(); } + stk::mesh::FieldState state() const { assert_valid(); return my_field->state(); } + stk::mesh::EntityRank entity_rank() const { assert_valid(); return my_field->entity_rank(); } + + template bool type_is() const + { return my_field->type_is(); } + + // name_with_state() includes any suffix indicating the state, ie "_STKFS_OLD" + const std::string & name_with_state() const { assert_valid(); return my_field->name(); } + // name() is the basic field name without any suffix for state, regardless of the state of the field + std::string name() const { assert_valid(); return my_field->field_state(stk::mesh::StateNone)->name(); } + + unsigned length(const stk::mesh::Bucket& b) const + { + assert_valid(); + const unsigned type_stride = my_field->data_traits().stride_of; + const unsigned fieldSize = stk::mesh::field_bytes_per_entity(*my_field, b) / type_stride; + return fieldSize; + } + + unsigned length(stk::mesh::Entity e) const + { + assert_valid(); + const unsigned type_stride = my_field->data_traits().stride_of; + const unsigned fieldSize = stk::mesh::field_bytes_per_entity(*my_field, e) / type_stride; + return fieldSize; + } + + // Only safe if field has same length on all entities + unsigned length() const + { + ThrowAssert(valid()); + return my_field->max_size(my_field->entity_rank()); + } + + // testing + bool operator ==(const FieldRef & rhs) const { return my_field == rhs.my_field; } + bool operator !=(const FieldRef & rhs) const { return my_field != rhs.my_field; } + bool operator < (const FieldRef & rhs) const; + +private: + const stk::mesh::FieldBase * my_field; +}; + +typedef std::set FieldSet; + +inline std::ostream & operator << (std::ostream & os, const FieldRef & field_ref) +{ + const bool valid = field_ref.valid(); + os << "FieldRef valid = " << std::boolalpha << valid; + if(valid) + { + os << " field = " << field_ref.name_with_state(); + } + return os; +} + +template< class pod_type > +pod_type * field_data( const stk::mesh::FieldBase & field, stk::mesh::Entity entity ) +{ + return stk::mesh::field_data(static_cast< const stk::mesh::Field& >(field), entity); +} + +template< class pod_type > +pod_type * field_data( const stk::mesh::FieldBase & field, const stk::mesh::Bucket & bucket ) +{ + return stk::mesh::field_data(static_cast< const stk::mesh::Field& >(field), bucket); +} + +inline bool has_field_data( const FieldRef fieldref, stk::mesh::Entity entity ) +{ + return stk::mesh::field_is_allocated_for_bucket(fieldref.field(), fieldref.field().get_mesh().bucket(entity)); +} + +inline bool has_field_data( const FieldRef fieldref, const stk::mesh::Bucket & bucket ) +{ + return stk::mesh::field_is_allocated_for_bucket(fieldref.field(), bucket); +} + +} // namespace krino + +#endif // Akri_FieldRef_h diff --git a/packages/krino/krino/krino_lib/Akri_IC_Alg.cpp b/packages/krino/krino/krino_lib/Akri_IC_Alg.cpp new file mode 100644 index 000000000000..0050bcc786fc --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_IC_Alg.cpp @@ -0,0 +1,225 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +namespace krino{ + +namespace { +double relative_crossing_position(const double ls0, const double ls1) +{ + return LevelSet::sign_change(ls0, ls1) ? ls0 / ( ls0 - ls1 ) : -10.; +} +} + +//---------------------------------------------------------------- +void IC_Alg::execute(const double time, const bool requires_additional_initialization) +{ /* %TRACE[ON]% */ Trace trace__("krino::IC_Analytic_Alg::execute()"); /* %TRACE% */ + + if (surface_list.size() == 0 && my_calculators.empty()) + { + return; + } + + const stk::mesh::BulkData& mesh = levelSet.mesh(); + const stk::mesh::MetaData& meta = mesh.mesh_meta_data(); + const FieldRef xField = levelSet.get_coordinates_field(); + const FieldRef dField = levelSet.get_distance_field(); + const int spatial_dim = meta.spatial_dimension(); + + BoundingBox node_bbox; + levelSet.compute_nodal_bbox( mesh.mesh_meta_data().universal_part(), node_bbox ); + surface_list.prepare_to_compute(time, node_bbox, levelSet.narrow_band_size()); + + stk::mesh::BucketVector const& buckets = mesh.get_buckets( stk::topology::NODE_RANK, stk::mesh::selectField(dField) ); + + for ( auto && bucket_ptr : buckets ) + { + const stk::mesh::Bucket & b = *bucket_ptr; + const int length = b.size(); + double *dist = field_data(dField, b); + double * coord = field_data(xField, b); + + for (int n = 0; n < length; ++n) + { + ThrowAssert(&(dist[n]) != NULL); + + const Vector3d x(&coord[spatial_dim*n], spatial_dim); + + dist[n] = surface_list.point_signed_distance_with_narrow_band(x, levelSet.narrow_band_size()); + } + } + + stk::mesh::communicate_field_data(mesh, {&dField.field()}); + + if (levelSet.narrow_band_size() > 0. && surface_list.truncated_distance_may_have_wrong_sign()) + { + DistanceSweeper::fix_sign_by_sweeping(mesh, dField, surface_list.get_signed_narrow_band_size(levelSet.narrow_band_size())); + } + + if(CDFEM_Support::get(meta).get_nonconformal_adapt_target_count() > 0) + { + compute_IC_error_indicator(); + } + + for (auto && calc : my_calculators) + { + calc->compute_signed_distance(levelSet); + } + + if (!levelSet.get_keep_IC_surfaces() && !requires_additional_initialization) + { + clear(); + } +} + +void IC_Alg::compute_IC_error_indicator() +{ + const stk::mesh::BulkData& mesh = levelSet.mesh(); + const stk::mesh::MetaData& meta = mesh.mesh_meta_data(); + const FieldRef xField = levelSet.get_coordinates_field(); + const FieldRef dField = levelSet.get_distance_field(); + stk::mesh::Selector fieldSelector(dField); + const int spatial_dim = meta.spatial_dimension(); + const auto & cdfem_support = CDFEM_Support::get(meta); + + const auto & aux_meta = AuxMetaData::get(meta); + const auto & indicator_field_name = cdfem_support.get_nonconformal_adapt_indicator_name(); + auto indicator_field = + aux_meta.get_field(stk::topology::ELEMENT_RANK, indicator_field_name); + const auto & elem_buckets = + mesh.get_buckets(stk::topology::ELEMENT_RANK, meta.locally_owned_part() & fieldSelector); + + std::vector nodal_signed_distances; + std::vector nodal_coordinates; + std::vector edge_midpoints; + std::vector midpoint_signed_distances, midpoint_interp_signed_distances; + int edge_nodes[] = {0, 0}; + + for(auto && b_ptr : elem_buckets) + { + const auto & b = *b_ptr; + + const int size = b.size(); + double * indicator_data = field_data(indicator_field, b); + + const stk::topology & topo = b.topology(); + + const auto & master_elem = MasterElementDeterminer::getMasterElement(*b_ptr, xField); + const int num_nodes = master_elem.num_nodes(); + + nodal_signed_distances.resize(num_nodes); + nodal_coordinates.resize(num_nodes); + + for(int el=0; el < size; ++el) + { + const auto * nodes = mesh.begin_nodes(b[el]); + for(int n=0; n < num_nodes; ++n) + { + auto node = nodes[n]; + nodal_signed_distances[n] = *field_data(dField, node); + const double * coords_data = field_data(xField, node); + nodal_coordinates[n] = Vector3d(coords_data, spatial_dim); + } + + // Iterate edges, find location of crossing on the edge and compare to location of crossing + // if we add a node at the midpoint with the exact signed distance there. + const int num_edges = topo.num_edges(); + edge_midpoints.resize(num_edges); + midpoint_signed_distances.resize(num_edges); + midpoint_interp_signed_distances.resize(num_edges); + double err = 0.; + for (int e=0; e < num_edges; ++e) + { + ThrowAssert(topo.edge_topology(e).num_nodes() == 2); + topo.edge_node_ordinals(e, edge_nodes); + + const Vector3d & x0 = nodal_coordinates[edge_nodes[0]]; + const Vector3d & x1 = nodal_coordinates[edge_nodes[1]]; + edge_midpoints[e] = 0.5*(x0+x1); + const double edge_length_sqr = (x1-x0).length_squared(); + + double midpoint_signed_distance = + surface_list.point_signed_distance_with_narrow_band(edge_midpoints[e], levelSet.narrow_band_size()); + midpoint_signed_distances[e] = midpoint_signed_distance; + + const double ls0 = nodal_signed_distances[edge_nodes[0]]; + const double ls1 = nodal_signed_distances[edge_nodes[1]]; + midpoint_interp_signed_distances[e] = 0.5 * (ls0 + ls1); + const double orig_crossing_pos = relative_crossing_position(ls0, ls1); + const double left_half_crossing_pos = + 0.5 * relative_crossing_position(ls0, midpoint_signed_distance); + const double right_half_crossing_pos = + 0.5 * (1. + relative_crossing_position(midpoint_signed_distance, ls1)); + + if(orig_crossing_pos >= 0.) + { + if(left_half_crossing_pos >= 0.) + { + const double delta = orig_crossing_pos - left_half_crossing_pos; + err += edge_length_sqr * delta * delta; + } + if(right_half_crossing_pos >= 0.) + { + const double delta = orig_crossing_pos - right_half_crossing_pos; + err += edge_length_sqr * delta * delta; + } + } + else + { + if(left_half_crossing_pos >= 0. || right_half_crossing_pos >= 0.) + { + err += edge_length_sqr; + } + } + } + + for(int ei=0; ei < num_edges; ++ei) + { + for(int ej=ei+1; ej < num_edges; ++ej) + { + const double edge_length_sqr = (edge_midpoints[ei] - edge_midpoints[ej]).length_squared(); + const double interp_crossing_pos = + relative_crossing_position(midpoint_interp_signed_distances[ei], + midpoint_interp_signed_distances[ej]); + const double crossing_pos = + relative_crossing_position(midpoint_signed_distances[ei], + midpoint_signed_distances[ej]); + + const bool has_interp_crossing = interp_crossing_pos >= 0.; + const bool has_crossing = crossing_pos >= 0.; + if(has_interp_crossing != has_crossing) err += edge_length_sqr; + if(has_crossing && has_interp_crossing) + { + const double delta = crossing_pos - interp_crossing_pos; + err += edge_length_sqr * delta * delta; + } + } + } + indicator_data[el] += err; + } + } +} + +//---------------------------------------------------------------- +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_IC_Alg.hpp b/packages/krino/krino/krino_lib/Akri_IC_Alg.hpp new file mode 100644 index 000000000000..b74bb2ebf174 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_IC_Alg.hpp @@ -0,0 +1,55 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_IC_Alg_h +#define Akri_IC_Alg_h + +#include +#include +#include + +namespace krino { class LevelSet; } + +namespace krino { + +//---------------------------------------------------------------- +class IC_Alg { + +public: + IC_Alg( LevelSet & ls ) : levelSet( ls ), surface_list("IC Surface List") {} + ~IC_Alg() {} + + void set_composition_method(Composite_Surface::CompositionMethod composition_method) { + surface_list.set_composition_method(composition_method); + } + + // query number of surfaces + unsigned numberSurfaces() { return surface_list.size();} + + // push a surface onto our container + void addSurface(Surface * surf) { surface_list.add(surf); } + + // remove all surfaces and calculators + void clear() { surface_list.clear(); my_calculators.clear(); } + + void addCalculator(std::unique_ptr calc) { my_calculators.emplace_back(std::move(calc)); } + + BoundingBox get_surface_bounding_box() { return surface_list.get_bounding_box(); } + + void execute(const double time, const bool requires_additional_initialization); +private: + void compute_IC_error_indicator(); +private: + LevelSet & levelSet; + Composite_Surface surface_list; + std::vector> my_calculators; +}; +//---------------------------------------------------------------- +} // namespace krino + +#endif // Akri_IC_Alg_h diff --git a/packages/krino/krino/krino_lib/Akri_IC_Calculator.cpp b/packages/krino/krino/krino_lib/Akri_IC_Calculator.cpp new file mode 100644 index 000000000000..6ff101371964 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_IC_Calculator.cpp @@ -0,0 +1,100 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include + +#include + +namespace krino{ + +void IC_Binder::compute_signed_distance(const LevelSet &ls) const +{ + const stk::mesh::MetaData & meta = ls.meta(); + const stk::mesh::BulkData & mesh = ls.mesh(); + const FieldRef distRef = ls.get_distance_field(); + + const stk::mesh::Selector selector = stk::mesh::selectField(distRef); + + const LevelSetManager & region_ls = LevelSetManager::get(meta); + const unsigned num_ls = region_ls.numberLevelSets(); + + std::vector otherDistRefs; + for (unsigned i=0; i otherDist(num_other_dist, nullptr); + for ( auto && bucket : mesh.get_buckets( stk::topology::NODE_RANK, selector) ) + { + const stk::mesh::Bucket & b = *bucket; + const size_t length = b.size(); + + double * dist = field_data(distRef, b); + for (unsigned i=0; i(otherDistRefs[i], b); + } + + for ( size_t n = 0; n < length; ++n ) + { + dist[n] = std::numeric_limits::max(); + for (unsigned i=0; i<(num_other_dist-my_binder_type); ++i) + { + for (unsigned j=i+1; j<(num_other_dist-my_binder_type); ++j) + { + //ensure binder separates particles by a distance of my_interface_size + if (my_binder_type==0) + { + dist[n] = std::min(dist[n], std::max(otherDist[i][n]-my_interface_size, otherDist[j][n]-my_interface_size)); + } + + //create smooth connection between particles if bridge size specified + //take the product of two offset particle level sets and move the zero crossing by bridge_size + if (my_binder_type==1) + { + if (my_smooth_bridge_size > 0.0) + { + double bridge = (otherDist[i][n]+my_smooth_bridge_offset)*(otherDist[j][n]+my_smooth_bridge_offset)-my_smooth_bridge_size; + if (my_root_smooth_bridge) + { + //root the level set product to bring it back to distance function magnitudes + const int sign = (bridge >= 0.0) ? 1 : -1; + bridge = sign*std::sqrt(std::abs(bridge)); + } + dist[n] = std::min(dist[n], bridge); + } + } + } + } + for (unsigned i=0; i + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace krino{ + +Block_Surface_Connectivity::Block_Surface_Connectivity(const stk::mesh::MetaData & meta) +{ + /* %TRACE[ON]% */ + Trace trace__("Block_Surface_Connectivity::Block_Surface_Connectivity(const stk::mesh::MetaData & meta)"); /* %TRACE% */ + + std::vector surfacesInMap = meta.get_surfaces_in_surface_to_block_map(); + for(auto && surfaceInMap : surfacesInMap) + { + std::set touching_block_ordinals; + for (auto && touching_part : meta.get_blocks_touching_surface(surfaceInMap)) + { + touching_block_ordinals.insert(touching_part->mesh_meta_data_ordinal()); + } + add_surface(surfaceInMap->mesh_meta_data_ordinal(), touching_block_ordinals); + } +} + +Block_Surface_Connectivity::Block_Surface_Connectivity(const stk::mesh::MetaData & meta, const Ioss::Region & io_region) +{ + /* %TRACE[ON]% */ + Trace trace__("Block_Surface_Connectivity::Block_Surface_Connectivity(const Ioss::Region & reg)"); /* %TRACE% */ + + std::vector side_block_names; + std::vector side_block_ordinals; + + for(auto sideset : io_region.get_sidesets()) + { + side_block_names.clear(); + sideset->block_membership(side_block_names); + side_block_ordinals.clear(); + for (auto && block_name : side_block_names) + { + const stk::mesh::Part * side_block_part = meta.get_part(block_name); + ThrowRequire(nullptr != side_block_part); + side_block_ordinals.push_back(side_block_part->mesh_meta_data_ordinal()); + } + const stk::mesh::Part * side_part = meta.get_part(sideset->name()); + ThrowRequire(nullptr != side_part); + add_surface(side_part->mesh_meta_data_ordinal(), std::set(side_block_ordinals.begin(), side_block_ordinals.end())); + + if (!sideset->get_side_blocks().empty()) + { + for (auto&& side_subset : sideset->get_side_blocks()) + { + // Fmwk only creates subset if more than 1 sideblock, but stk always creates them, so just check. + const stk::mesh::Part * side_subset_part = meta.get_part(side_subset->name()); + if (nullptr == side_subset_part) continue; + side_block_names.clear(); + side_subset->block_membership(side_block_names); + side_block_ordinals.clear(); + for (auto && block_name : side_block_names) + { + const stk::mesh::Part * side_block_part = meta.get_part(block_name); + ThrowRequire(nullptr != side_block_part); + side_block_ordinals.push_back(side_block_part->mesh_meta_data_ordinal()); + } + add_surface(side_subset_part->mesh_meta_data_ordinal(), std::set(side_block_ordinals.begin(), side_block_ordinals.end())); + } + } + } +} + +std::vector +get_input_mesh_block_names( const Ioss::Region & io_region ) +{ + std::vector mesh_elem_blocks; + for(auto && elem_block : io_region.get_element_blocks()) + { + if (stk::io::include_entity(elem_block)) + { + mesh_elem_blocks.push_back(elem_block->name()); + } + } + return mesh_elem_blocks; +} + // namespace krino +} diff --git a/packages/krino/krino/krino_lib/Akri_IO_Helpers.hpp b/packages/krino/krino/krino_lib/Akri_IO_Helpers.hpp new file mode 100644 index 000000000000..2ec5005ffd08 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_IO_Helpers.hpp @@ -0,0 +1,66 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_IO_Helpers_h +#define Akri_IO_Helpers_h +// +#include +#include + +#include + +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace diag { class Timer; } } +namespace Ioss { class Region; } + +namespace krino { + +class AuxMetaData; + +class Block_Surface_Connectivity +{ +public: + Block_Surface_Connectivity() {} + Block_Surface_Connectivity(const stk::mesh::MetaData & meta); + Block_Surface_Connectivity(const stk::mesh::MetaData & meta, const Ioss::Region & io_region); + void get_surfaces_touching_block(const stk::mesh::PartOrdinal & block_ordinal, + std::set & surface_ordinals) const + { + auto it = block_to_surface_map.find(block_ordinal); + if(it == block_to_surface_map.end()) return; + surface_ordinals.insert(it->second.begin(), it->second.end()); + } + void get_blocks_touching_surface(const stk::mesh::PartOrdinal & surface_ordinal, + std::set & block_ordinals) const + { + block_ordinals.clear(); + auto it = surface_to_block_map.find(surface_ordinal); + if(it == surface_to_block_map.end()) return; + block_ordinals.insert(it->second.begin(), it->second.end()); + } + + void add_surface(const stk::mesh::PartOrdinal & surf_ordinal, const std::set touching_blocks) + { + surface_to_block_map[surf_ordinal].insert(touching_blocks.begin(), touching_blocks.end()); + for(auto && block : touching_blocks) + { + block_to_surface_map[block].insert(surf_ordinal); + } + } +private: + std::map< stk::mesh::PartOrdinal, std::set > block_to_surface_map; + std::map< stk::mesh::PartOrdinal, std::set > surface_to_block_map; +}; + +std::vector get_input_mesh_block_names( const Ioss::Region & io_region ); +} // namespace krino + +#endif // Akri_IO_Helpers_h diff --git a/packages/krino/krino/krino_lib/Akri_InterfaceID.hpp b/packages/krino/krino/krino_lib/Akri_InterfaceID.hpp new file mode 100644 index 000000000000..a72328ac6b8b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_InterfaceID.hpp @@ -0,0 +1,98 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_INTERFACEID_H_ +#define AKRI_INTERFACEID_H_ + +#include +#include +#include +#include + +#include + +namespace krino { + +class InterfaceID; +typedef std::map CrossingMap; +typedef std::map CrossingSignMap; + +class InterfaceID +{ +public: + InterfaceID() : ls_1(-1), ls_2(-1) {} + InterfaceID(const int first, const int second) : ls_1(std::min(first, second)), + ls_2(std::max(first, second)) {} + + bool is_single_ls() const { return ls_1 == ls_2; } + int first_ls() const { return ls_1; } + int second_ls() const {return ls_2; } + void fill_sorted_domains(std::vector & sortedDomains) const; + + static std::vector all_phase_pairs(const std::set & phases); +private: + int ls_1; + int ls_2; +}; + +inline bool operator<(const InterfaceID lhs, const InterfaceID rhs) +{ + if(lhs.first_ls() < rhs.first_ls()) return true; + if(rhs.first_ls() < lhs.first_ls()) return false; + if(lhs.second_ls() < rhs.second_ls()) return true; + return false; +} + +inline bool operator==(const InterfaceID lhs, const InterfaceID rhs) +{ + return (lhs.first_ls() == rhs.first_ls()) && (lhs.second_ls() == rhs.second_ls()); +} + +inline bool operator!=(const InterfaceID lhs, const InterfaceID rhs) +{ + return !(lhs == rhs); +} + +inline std::ostream & operator<<(std::ostream &os, const InterfaceID lhs) +{ + os << "InterfaceID(" << lhs.first_ls() << ", " << lhs.second_ls() << ")"; + return os; +} + +inline std::vector InterfaceID::all_phase_pairs(const std::set & phases) +{ + std::vector result; + std::set::const_iterator end_phase = phases.end(); + for(std::set::const_iterator it = phases.begin(); it != end_phase; ++it) + { + std::set::const_iterator it2 = it; + for(++it2; it2 != end_phase; ++it2) + { + result.push_back(InterfaceID(*it, *it2)); + } + } + return result; +} + +inline void InterfaceID::fill_sorted_domains(std::vector & sortedDomains) const +{ + sortedDomains.clear(); + if (first_ls() == second_ls()) + { + sortedDomains.push_back(first_ls()); + } + else + { + sortedDomains.push_back(first_ls()); + sortedDomains.push_back(second_ls()); + } +} + +} // namespace krino + +#endif /* AKRI_INTERFACEID_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_Interface_Name_Generator.hpp b/packages/krino/krino/krino_lib/Akri_Interface_Name_Generator.hpp new file mode 100644 index 000000000000..98e9bde5c0e7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Interface_Name_Generator.hpp @@ -0,0 +1,71 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Interface_Name_Generator_h +#define Akri_Interface_Name_Generator_h +// + +#include + +namespace krino { + +// Interface_Name_Generator are used in Phase_Support::decompose_blocks() to determine the name of the +// interface sideset within a block so that cdfem death and LS-like problems can have different naming conventions +// that are more user-friendly for each case. +class Interface_Name_Generator +{ +public: + virtual ~Interface_Name_Generator() {} + virtual std::string interface_name(const std::string & io_part_name, const std::string & phase_name) const = 0; + virtual std::string interface_superset_name(const std::string & phase_name) const = 0; + virtual std::string interface_subset_name(const std::string & io_part_name, const std::string & phase_name) const = 0; +}; + +class LS_Name_Generator : public Interface_Name_Generator +{ +public: + virtual ~LS_Name_Generator() {} + virtual std::string interface_name(const std::string & io_part_name, const std::string & phase_name) const + { + return "surface_"+io_part_name+"_"+phase_name; + } + virtual std::string interface_superset_name(const std::string & phase_name) const + { + return "surface_"+phase_name; + } + virtual std::string interface_subset_name(const std::string & io_part_name, const std::string & phase_name) const + { + return "surface_"+io_part_name+"_"+phase_name; + } +}; + +class Death_Name_Generator : public Interface_Name_Generator +{ +public: + Death_Name_Generator(std::string spec_name) : death_spec_name(spec_name) {} + virtual ~Death_Name_Generator() {} + virtual std::string interface_name(const std::string & io_part_name, const std::string & phase_name) const + { + return "surface_"+io_part_name+"_"+death_spec_name; + } + virtual std::string interface_superset_name(const std::string & phase_name) const + { + return "surface_"+death_spec_name; + } + virtual std::string interface_subset_name(const std::string & io_part_name, const std::string & phase_name) const + { + return "surface_"+io_part_name+"_"+death_spec_name; + } +private: + std::string death_spec_name; +}; + + +} // namespace krino + +#endif // Akri_Interface_Name_Generator_h diff --git a/packages/krino/krino/krino_lib/Akri_Intersection_Points.cpp b/packages/krino/krino/krino_lib/Akri_Intersection_Points.cpp new file mode 100644 index 000000000000..f75cfc998e3c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Intersection_Points.cpp @@ -0,0 +1,267 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include + +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +EdgeIntersection::EdgeIntersection(const IntersectionPoint & intersectionPt) +{ + const std::vector & intPtNodes = intersectionPt.get_nodes(); + ThrowAssert(intPtNodes.size() == 2); + nodes = {intPtNodes[0], intPtNodes[1]}; + crossingLocation = intersectionPt.get_weights()[1]; + const auto & domains = intersectionPt.get_sorted_domains(); + ThrowAssert(domains.size() == 1 || domains.size() == 2); + interface = (domains.size() == 1) ? InterfaceID(domains[0],domains[0]) : InterfaceID(domains[0], domains[1]); +} + +std::string debug_output(const stk::mesh::BulkData & mesh, const IntersectionPoint & intersectionPoint) +{ + const std::vector & nodes = intersectionPoint.get_nodes(); + const std::vector & weights = intersectionPoint.get_weights(); + const std::vector & domains = intersectionPoint.get_sorted_domains(); + std::ostringstream os; + os << "intersection point domains={ "; + for (int domain : domains) + os << domain << " "; + os << "} stencil={ "; + for (size_t i=0; i & firstVec, const std::vector & secondVec) +{ + for (int domain : secondVec) + if (!std::binary_search(firstVec.begin(), firstVec.end(), domain)) + return false; + return true; +} + +bool any_node_already_captures_intersection_point(const std::vector & nodes, + const std::vector & intersectionPointSortedDomains, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + for (auto node : nodes) + { + auto iter = nodesToCapturedDomains.find(node); + if (iter != nodesToCapturedDomains.end()) + { + const std::vector & nodeSortedDomains = iter->second; + if (first_sorted_vector_of_domains_contains_all_domains_in_second_vector(nodeSortedDomains, intersectionPointSortedDomains)) + return true; + } + } + return false; +} + +bool domains_already_snapped_to_node_are_also_at_intersection_point(const NodeToCapturedDomainsMap & nodesToCapturedDomains, stk::mesh::Entity node, const std::vector & intersectionPointDomains) +{ + const auto iter = nodesToCapturedDomains.find(node); + if (iter == nodesToCapturedDomains.end()) + return true; + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(intersectionPointDomains, iter->second); +} + +static bool any_entity_in_first_vector_is_contained_in_second_sorted_vector(const std::vector & firstVec, const std::vector & secondVec) +{ + for (auto && first : firstVec) + if (std::binary_search(secondVec.begin(), secondVec.end(), first)) + return true; + return false; +} + +IntersectionPointFilter +keep_all_intersection_points_filter() +{ + auto filter = + [](const std::vector & intersectionPointNodes, const std::vector & intersectionPointSortedDomains) + { + return true; + }; + return filter; +} + +static +void pack_intersection_points_for_owners_of_nodes(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + stk::CommSparse &commSparse) +{ + std::vector intersectionPointNodeOwners; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto && intersectionPoint : intersectionPoints) + { + intersectionPointNodeOwners.clear(); + for (auto && node : intersectionPoint.get_nodes()) + { + const int procId = mesh.parallel_owner_rank(node); + if (procId != commSparse.parallel_rank()) + intersectionPointNodeOwners.push_back(procId); + } + stk::util::sort_and_unique(intersectionPointNodeOwners); + for (int procId : intersectionPointNodeOwners) + { + commSparse.send_buffer(procId).pack(intersectionPoint.get_nodes().size()); + for (auto && node : intersectionPoint.get_nodes()) + commSparse.send_buffer(procId).pack(mesh.identifier(node)); + for (auto && weight : intersectionPoint.get_weights()) + commSparse.send_buffer(procId).pack(weight); + commSparse.send_buffer(procId).pack(intersectionPoint.get_sorted_domains().size()); + for (auto && domain : intersectionPoint.get_sorted_domains()) + commSparse.send_buffer(procId).pack(domain); + } + } + }); +} + +static +void unpack_intersection_points(const stk::mesh::BulkData & mesh, + std::vector & intersectionPoints, + stk::CommSparse &commSparse) +{ + std::vector intersectionPointNodes; + std::vector intersectionPointWeights; + std::vector intersectionPointDomains; + stk::mesh::EntityId nodeId; + const bool intersectionPointIsOwned = false; + + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + size_t numNodes; + commSparse.recv_buffer(procId).unpack(numNodes); + intersectionPointNodes.resize(numNodes); + for (auto && node : intersectionPointNodes) + { + commSparse.recv_buffer(procId).unpack(nodeId); + node = mesh.get_entity(stk::topology::NODE_RANK, nodeId); + } + intersectionPointWeights.resize(numNodes); + for (auto && weight : intersectionPointWeights) + commSparse.recv_buffer(procId).unpack(weight); + size_t numDomains; + commSparse.recv_buffer(procId).unpack(numDomains); + intersectionPointDomains.resize(numDomains); + for (auto && domain : intersectionPointDomains) + { + commSparse.recv_buffer(procId).unpack(domain); + } + intersectionPoints.emplace_back(intersectionPointIsOwned, intersectionPointNodes, intersectionPointWeights, intersectionPointDomains); + } + }); +} + +void communicate_intersection_points(const stk::mesh::BulkData & mesh, std::vector & intersectionPoints) +{ + stk::CommSparse commSparse(mesh.parallel()); + pack_intersection_points_for_owners_of_nodes(mesh, intersectionPoints, commSparse); + unpack_intersection_points(mesh, intersectionPoints, commSparse); +} + +static std::vector build_intersection_points(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const IntersectionPointFilter & intersectionPointFilter) +{ + std::vector elementsToIntersect; + stk::mesh::get_entities( mesh, stk::topology::ELEMENT_RANK, mesh.mesh_meta_data().locally_owned_part(), elementsToIntersect, false); + + std::vector intersectionPoints; + geometry.append_element_intersection_points(mesh, nodesToCapturedDomains, elementsToIntersect, intersectionPointFilter, intersectionPoints); + communicate_intersection_points(mesh, intersectionPoints); + + return intersectionPoints; +} + +std::vector build_all_intersection_points(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + const IntersectionPointFilter intersectionPointFilter = keep_all_intersection_points_filter(); + return build_intersection_points(mesh, geometry, nodesToCapturedDomains, intersectionPointFilter); +} + +static IntersectionPointFilter +filter_intersection_points_to_those_not_already_handled(const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + auto filter = + [&nodesToCapturedDomains](const std::vector & intersectionPointNodes, const std::vector & intersectionPointSortedDomains) + { + return !any_node_already_captures_intersection_point(intersectionPointNodes, intersectionPointSortedDomains, nodesToCapturedDomains); + }; + return filter; +} + +std::vector build_uncaptured_intersection_points(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + IntersectionPointFilter intersectionPointFilter = filter_intersection_points_to_those_not_already_handled(nodesToCapturedDomains); + + return build_intersection_points(mesh, geometry, nodesToCapturedDomains, intersectionPointFilter); +} + +static IntersectionPointFilter +filter_intersection_points_to_those_using_previous_iteration_snap_nodes_but_not_already_handled(const NodeToCapturedDomainsMap & nodesToCapturedDomains, const std::vector & iterationSortedSnapNodes) +{ + auto filter = + [&nodesToCapturedDomains, &iterationSortedSnapNodes](const std::vector & intersectionPointNodes, const std::vector & intersectionPointSortedDomains) + { + return any_entity_in_first_vector_is_contained_in_second_sorted_vector(intersectionPointNodes, iterationSortedSnapNodes) && + !any_node_already_captures_intersection_point(intersectionPointNodes, intersectionPointSortedDomains, nodesToCapturedDomains); + }; + return filter; +} + +std::vector get_owned_elements_using_nodes_knowing_that_nodes_dont_have_common_elements(const stk::mesh::BulkData & mesh, + const std::vector & nodes) +{ + std::vector nodeElements; + for (auto node : nodes) + for (auto element : StkMeshEntities{mesh.begin_elements(node), mesh.end_elements(node)}) + if (mesh.bucket(element).owned()) + nodeElements.push_back(element); + return nodeElements; +} + +void update_intersection_points_after_snap_iteration(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const std::vector & iterationSortedSnapNodes, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + std::vector & intersectionPoints) +{ + const auto intersectionPointFilter = filter_intersection_points_to_those_using_previous_iteration_snap_nodes_but_not_already_handled(nodesToCapturedDomains, iterationSortedSnapNodes); + + size_t newSize=0; + for (auto && intersectionPoint : intersectionPoints) + { + if (intersectionPoint.is_owned() && !any_entity_in_first_vector_is_contained_in_second_sorted_vector(intersectionPoint.get_nodes(), iterationSortedSnapNodes)) + intersectionPoints[newSize++] = intersectionPoint; // FIXME use custom swap? + } + intersectionPoints.erase(intersectionPoints.begin()+newSize, intersectionPoints.end()); + + const std::vector updateElements = get_owned_elements_using_nodes_knowing_that_nodes_dont_have_common_elements(mesh, iterationSortedSnapNodes); + geometry.append_element_intersection_points(mesh, nodesToCapturedDomains, updateElements, intersectionPointFilter, intersectionPoints); + communicate_intersection_points(mesh, intersectionPoints); +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_Intersection_Points.hpp b/packages/krino/krino/krino_lib/Akri_Intersection_Points.hpp new file mode 100644 index 000000000000..0f7c07da5832 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Intersection_Points.hpp @@ -0,0 +1,75 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_INTERSECTION_POINTS_H_ +#define KRINO_INCLUDE_AKRI_INTERSECTION_POINTS_H_ + +#include +#include +#include +#include +#include + +namespace krino { + +class CDFEM_Support; +class Phase_Support; +class CDFEM_Parent_Edge; +class InterfaceGeometry; + +class IntersectionPoint +{ +public: + IntersectionPoint(const bool owned, const std::vector & nodes, const std::vector & weights, const std::vector & sortedDomains) + : mOwned(owned), mNodes(nodes), mWeights(weights), mSortedDomains(sortedDomains) {ThrowAssert(mNodes.size() == mWeights.size());} + bool is_owned() const { return mOwned; } + const std::vector & get_nodes() const { return mNodes; } + const std::vector & get_weights() const { return mWeights; } + const std::vector & get_sorted_domains() const { return mSortedDomains; } +private: + bool mOwned; + std::vector mNodes; + std::vector mWeights; + std::vector mSortedDomains; +}; + +struct EdgeIntersection +{ + EdgeIntersection(const IntersectionPoint & intersectionPt); + std::array nodes; + double crossingLocation; + InterfaceID interface; +}; + +void communicate_intersection_points(const stk::mesh::BulkData & mesh, std::vector & intersectionPoints); + +typedef std::function &, const std::vector &)> IntersectionPointFilter; + +bool first_sorted_vector_of_domains_contains_all_domains_in_second_vector(const std::vector & firstVec, const std::vector & secondVec); +bool domains_already_snapped_to_node_are_also_at_intersection_point(const NodeToCapturedDomainsMap & nodesToCapturedDomains, stk::mesh::Entity node, const std::vector & intersectionPointDomains); +std::string debug_output(const stk::mesh::BulkData & mesh, const IntersectionPoint & intersectionPoint); + +IntersectionPointFilter keep_all_intersection_points_filter(); + +std::vector build_all_intersection_points(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const NodeToCapturedDomainsMap & nodesToCapturedDomains); + +std::vector build_uncaptured_intersection_points(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const NodeToCapturedDomainsMap & nodesToCapturedDomains); + +void update_intersection_points_after_snap_iteration(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & geometry, + const std::vector & iterationSortedSnapNodes, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + std::vector & intersectionPoints); + +} + +#endif /* KRINO_INCLUDE_AKRI_INTERSECTION_POINTS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_LevelSet.cpp b/packages/krino/krino/krino_lib/Akri_LevelSet.cpp new file mode 100644 index 000000000000..64dc628a7d55 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LevelSet.cpp @@ -0,0 +1,1822 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace krino { + +bool all_nodes_have_field_data(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, const stk::mesh::FieldBase& field) +{ + const unsigned nnodes = stk_bulk.num_nodes(entity); + const stk::mesh::Entity* nodes = stk_bulk.begin_nodes(entity); + for (unsigned i = 0; i < nnodes; ++i ) + { + if (field_bytes_per_entity(field, nodes[i]) == 0) + { + return false; + } + } + return true; +} + +std::vector LevelSet::the_levelSet_names; + +LevelSet_Identifier LevelSet::get_identifier(const std::string & name) +{ + std::string upper_name = name; + std::transform(upper_name.begin(), upper_name.end(), upper_name.begin(), ::toupper); + for (unsigned i=0; i 0; +} + +BoundingBox LevelSet::get_IC_surface_bounding_box() +{ + IC_Alg& ic_alg = get_IC_alg(); + return ic_alg.get_surface_bounding_box(); +} + +IC_Alg& LevelSet::get_IC_alg() +{ + if (!my_IC_alg) + { + my_IC_alg = std::make_unique(*this); + } + return *my_IC_alg; +} + +void LevelSet::set_current_coordinates(stk::mesh::MetaData & meta, const FieldRef ref) +{ + LevelSetManager & ls_manager = LevelSetManager::get(meta); + ls_manager.set_current_coordinates(ref); +} + +FieldRef LevelSet::get_current_coordinates(stk::mesh::MetaData & meta) +{ + LevelSetManager & ls_manager = LevelSetManager::get(meta); + FieldRef current_coords = ls_manager.get_current_coordinates(); + if (!current_coords.valid()) + { + const stk::mesh::FieldBase * meta_coords = meta.coordinate_field(); + ThrowRequireMsg(nullptr != meta_coords, "Coordinates must be defined before calling LevelSet::get_current_coordinates()."); + ls_manager.set_current_coordinates(meta_coords); + current_coords = ls_manager.get_current_coordinates(); + } + return current_coords; +} + +void LevelSet::setup(stk::mesh::MetaData & meta) +{ + const LevelSetManager & region_ls = LevelSetManager::get(meta); + for (auto&& ls : region_ls) + { + ls->setup(); + } +} + +void LevelSet::post_commit_setup(stk::mesh::MetaData & meta) +{ + const double max_elem_size = compute_maximum_element_size(meta.mesh_bulk_data()); + + const LevelSetManager & region_ls = LevelSetManager::get(meta); + for (auto&& ls : region_ls) + { + ls->setup(); + if (ls->my_narrow_band_multiplier > 0.) + { + ls->narrow_band_size(ls->my_narrow_band_multiplier * max_elem_size); + } + else if (ls->narrow_band_size() > 0.) + { + const double narrow_band = ls->narrow_band_size(); + ThrowErrorMsgIf(!(narrow_band > max_elem_size), + "Currently, narrow_band_size must be greater than the maximum element size of " << max_elem_size << std::endl + << "in order to avoid unintentional accuracy degradation. If this feature is needed, please contact krino developers."); + } + } +} + + +void LevelSet::setup(void) +{ + register_fields(); + + facets.reset(new Faceted_Surface("current_facets")); + facets_old.reset(new Faceted_Surface("old_facets")); + + // initializes CDFEM_Support + if (!meta().is_commit()) + { + CDFEM_Support::get(my_meta); + } +} +//-------------------------------------------------------------------------------- +void LevelSet::register_fields(void) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::register_fields(void)"); /* %TRACE% */ + + if (trackIsoSurface || aux_meta().has_field(stk::topology::NODE_RANK, my_distance_name)) + { + // non-krino region + if (trackIsoSurface) + { + if (aux_meta().has_field(stk::topology::NODE_RANK, my_isovar_name)) + { + set_isovar_field( aux_meta().get_field(stk::topology::NODE_RANK, my_isovar_name) ); + } + else if (aux_meta().has_field(stk::topology::ELEMENT_RANK, my_isovar_name)) + { + set_isovar_field( aux_meta().get_field(stk::topology::ELEMENT_RANK, my_isovar_name) ); + } + else + { + ThrowErrorMsgIf( + true, "Isosurface variable '" << my_isovar_name << "' should already be registered."); + } + } + else + { + const FieldRef distance_ref = aux_meta().get_field(stk::topology::NODE_RANK, my_distance_name); + if ( distance_ref.number_of_states() == 1 ) + { + set_distance_field( distance_ref ); + set_old_distance_field( distance_ref ); + } + else + { + set_distance_field( distance_ref.field_state(stk::mesh::StateNew) ); + set_old_distance_field( distance_ref.field_state(stk::mesh::StateOld) ); + } + + set_isovar_field( my_distance_field ); + } + } + else + { + if (aux_meta().using_fmwk()) + { + ThrowRuntimeError("ERROR: field " << my_distance_name << " is not registered for level set " << name() << ". " + << "This can be caused by an incorrect Distance Variable. " + << "Or, in aria, there could be a conflict between the specified subindex and the named species. " + << "If so, try using a subindex greater than the number of species for your level set."); + } + + // krino region + const FieldType & type_double = FieldType::REAL; + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "KRINO: Registering distance variable with name '" << my_distance_name << "'." << stk::diag::dendl; + + const bool cdfem_is_active = krino::CDFEM_Support::is_active(meta()); + if (cdfem_is_active) + { + Phase_Support phase_support = Phase_Support::get(meta()); + for (auto partPtr : meta().get_mesh_parts()) + { + if (partPtr->primary_entity_rank() == stk::topology::ELEMENT_RANK && + phase_support.level_set_is_used_by_nonconformal_part(this, phase_support.find_nonconformal_part(*partPtr))) + { + FieldRef distance_ref = aux_meta().register_field( my_distance_name, type_double, stk::topology::NODE_RANK, 1, 1, *partPtr ); + set_old_distance_field( distance_ref ); + set_distance_field( distance_ref ); + } + } + } + else + { + FieldRef distance_ref = aux_meta().register_field( my_distance_name, type_double, stk::topology::NODE_RANK, 2, 1, meta().universal_part() ); + set_old_distance_field( FieldRef( distance_ref, stk::mesh::StateOld ) ); + set_distance_field( FieldRef( distance_ref, stk::mesh::StateNew ) ); + } + + set_isovar_field( my_distance_field ); + } + + if (!myTimeOfArrivalBlockSpeedsByName.empty()) + { + myTimeOfArrivalBlockSpeeds.resize(my_meta.get_parts().size()); + for (auto entry : myTimeOfArrivalBlockSpeedsByName) + { + if (my_aux_meta.has_part(entry.first)) + { + myTimeOfArrivalBlockSpeeds[my_aux_meta.get_part(entry.first).mesh_meta_data_ordinal()] = entry.second; + } + else + { + ThrowErrorMsgIf(true, "Could not find block " << entry.first << " when setting speed for computing time-of-arrival."); + } + } + } + + if (!my_time_of_arrival_element_speed_field_name.empty()) + { + const bool hasSpeedField = aux_meta().has_field(stk::topology::ELEMENT_RANK, my_time_of_arrival_element_speed_field_name); + ThrowErrorMsgIf(!hasSpeedField, "Could not find element speed field " << my_time_of_arrival_element_speed_field_name << " for computing time-of-arrival."); + myTimeOfArrivalElementSpeedField = aux_meta().get_field(stk::topology::ELEMENT_RANK, my_time_of_arrival_element_speed_field_name); + ThrowRequireMsg(myTimeOfArrivalBlockSpeeds.empty(), "Speed for time-of-arrival calculation should be specified via element speed or block speed (not both)."); + } +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::set_time_of_arrival_block_speed(const std::string & blockName, const double blockSpeed) +{ + std::string lowerBlockName = blockName; + std::transform(lowerBlockName.begin(), lowerBlockName.end(), lowerBlockName.begin(), ::tolower); + auto entry = myTimeOfArrivalBlockSpeedsByName.find(lowerBlockName); + ThrowRequireMsg(entry == myTimeOfArrivalBlockSpeedsByName.end(), "Speed for block " << blockName << " specified more than once."); + myTimeOfArrivalBlockSpeedsByName[lowerBlockName] = blockSpeed; +} + +//----------------------------------------------------------------------------------- +void +LevelSet::facets_exoii(void) +{ + /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::facets_exoii(void)"); /* %TRACE% */ + Faceted_Surface & f = *facets; + facets_exoii(f); +} + + +void +LevelSet::facets_exoii(Faceted_Surface & cs) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::facets_exoii(Faceted_Surface & cs)"); /* %TRACE% */ + + int nfaces = cs.size(); + const int nodes_per_elem = spatial_dimension; + const int nnodes = nfaces * nodes_per_elem; + const int nelems = nfaces * 1; //writing out faces as elements + + // construct file name + ThrowAssert(my_facetFileIndex <= 99999); + char counterChar[6]; + std::sprintf(counterChar, "%.5d", my_facetFileIndex); + std::string fn = std::string("facets.") + name() + ".e-s" + std::string(counterChar); + + // Type (ExodusII) is hard-wired at this time. + Ioss::DatabaseIO *db = Ioss::IOFactory::create("exodusII", fn, Ioss::WRITE_RESULTS); + Ioss::Region io(db, "FacetRegion"); + + // find offsets for consistent global numbering + int elem_start = 0; + if ( mesh().parallel_size() > 1 ) { + std::vector< int > num_faces; + num_faces.resize( mesh().parallel_size() ); + + // Gather everyone's facet list sizes + // I don't think there is a framework call for this... + MPI_Allgather( &nfaces, 1, MPI_INT, + &(num_faces[0]), 1, MPI_INT, mesh().parallel() ); + for (int i = 0; i< mesh().parallel_rank(); ++i) { + elem_start += num_faces[i]; + } + } + + const std::string description = "level set interface facets"; + io.property_add(Ioss::Property("title", description)); + io.begin_mode(Ioss::STATE_DEFINE_MODEL); + + // if we have no elements bail now + if ( 0 == nelems ) { + io.end_mode(Ioss::STATE_DEFINE_MODEL); + my_facetFileIndex++; + return; + } + + Ioss::NodeBlock *nb = new Ioss::NodeBlock(db, "nodeblock_1", nnodes, spatial_dimension); + io.add(nb); + + std::string el_type; + if (spatial_dimension == 3) + el_type = "trishell3"; + else + el_type = "shellline2d2"; + + Ioss::ElementBlock *eb = new Ioss::ElementBlock(db, "block_1", el_type, nelems); + io.add(eb); + + io.end_mode(Ioss::STATE_DEFINE_MODEL); + io.begin_mode(Ioss::STATE_MODEL); + + const FacetOwningVec & cs_surfaces = cs.get_facets(); + + // loop over elements and node to create maps + { + std::vector< int > nmap, emap; + nmap.reserve(nnodes); + emap.reserve(nelems); + + for ( unsigned n=0, e=0; eput_field_data("ids", nmap); + eb->put_field_data("ids", emap); + } + + // generate coordinates + { + std::vector< double > xyz; + xyz.reserve(spatial_dimension*nnodes); + + for ( auto&& cs_surface : cs_surfaces ) { + for ( int j = 0; j < nodes_per_elem; ++j ) { + const Vector3d & vert = cs_surface->facet_vertex(j); + xyz.push_back(vert[0]); + xyz.push_back(vert[1]); + if (3 == spatial_dimension) xyz.push_back(vert[2]); + } + } + nb->put_field_data("mesh_model_coordinates", xyz); + } + + // generate connectivity + { + std::vector< int > conn; + conn.reserve(nnodes); + for ( int n = 0; n < nnodes; ++n ) { + conn.push_back(nodes_per_elem*elem_start + n+1); + } + eb->put_field_data("connectivity", conn); + } + + io.end_mode(Ioss::STATE_MODEL); + my_facetFileIndex++; +} + +//----------------------------------------------------------------------------------- +void +LevelSet::compute_surface_distance(const double narrowBandSize, const double farFieldValue) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::compute_surface_distance(void)"); /* %TRACE% */ + + stk::mesh::Selector surface_selector = selectUnion(my_compute_surface_distance_parts); + + if (narrowBandSize > 0.0) + { + my_narrow_band_size = narrowBandSize; + } + + const stk::mesh::Field& coords = reinterpret_cast&>(get_coordinates_field().field()); + const stk::mesh::Field& dist = reinterpret_cast&>(get_distance_field().field()); + + Compute_Surface_Distance::calculate( + mesh(), + get_timer(), + coords, + dist, + surface_selector, + my_narrow_band_size, + farFieldValue); + + // output for time 0 is from old + if (!(my_distance_field == my_old_distance_field)) + { + stk::mesh::field_copy(my_distance_field, my_old_distance_field); + } + +} + +//----------------------------------------------------------------------------------- +void +LevelSet::set_surface_distance(std::vector surfaces, const double in_distance) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::compute_surface_distance(void)"); /* %TRACE% */ + + const FieldRef dField = get_distance_field(); + + const stk::mesh::Selector selector = stk::mesh::selectField(dField) & selectUnion(surfaces); + stk::mesh::BucketVector const& buckets = mesh().get_buckets( stk::topology::NODE_RANK, selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const size_t length = b.size(); + double *dist = field_data(dField , b); + + for ( size_t n = 0; n < length; ++n ) + { + dist[n] = in_distance; + } + } +} + +//----------------------------------------------------------------------------------- +void +LevelSet::advance_semilagrangian(const double deltaTime) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::advance_semilagrangian(const double deltaTime)"); /* %TRACE% */ + + if(trackIsoSurface) + { + redistance(); + } + else + { + stk::mesh::Selector selector(my_meta.universal_part()); + + // store existing facets in facets_old + facets->swap( *facets_old ); + + // get non-local facets such that we have copies of all old facets + // within the range of this proc's nodes + prepare_to_compute_distance( deltaTime, selector ); + + // compute nodal distances with semi-lagrangian step + stk::mesh::field_copy(my_old_distance_field, my_distance_field); + compute_distance_semilagrangian( deltaTime, selector ); + + // build local facet list + build_facets_locally(my_meta.universal_part()); + + // debugging + if (krinolog.shouldPrint(LOG_FACETS)) + { + facets_exoii(); + } + } +} + +//----------------------------------------------------------------------------------- +void +LevelSet::initialize(stk::mesh::MetaData & meta, const bool requires_additional_initialization) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::initialize(void)"); /* %TRACE% */ + + const LevelSetManager & region_ls = LevelSetManager::get(meta); + for (auto&& ls : region_ls) + { + ls->initialize(0., requires_additional_initialization); + } +} + +//----------------------------------------------------------------------------------- +void +LevelSet::initialize(const double time, const bool requires_additional_initialization) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::initialize(void)"); /* %TRACE% */ + + if (trackIsoSurface) + { + return; + } + + if(get_isovar_field().valid()) get_isovar_field().field().sync_to_host(); + if(get_distance_field().valid()) get_distance_field().field().sync_to_host(); + if(get_old_distance_field().valid()) get_old_distance_field().field().sync_to_host(); + + if(get_isovar_field().valid()) get_isovar_field().field().modify_on_host(); + if(get_distance_field().valid()) get_distance_field().field().modify_on_host(); + if(get_old_distance_field().valid()) get_old_distance_field().field().modify_on_host(); + + if (!my_compute_surface_distance_parts.empty()) + { + compute_surface_distance(); + return; + } + + krinolog << "Initializing levelset " << name() << "..." << stk::diag::dendl; + + /* process analytic surfaces */ + if (my_IC_alg) + { + my_IC_alg->execute(time, requires_additional_initialization); + } + + if (compute_time_of_arrival()) + { + fast_marching_redistance(my_meta.universal_part(), true); + } + else if (my_perform_initial_redistance) + { + constrained_redistance(); + } + + // Offset initialized LS if requested + if (my_ic_offset != 0.0) increment_distance(my_ic_offset, false); + + // Scale initialized LS if requested + if (my_ic_scale != 1.0) scale_distance(my_ic_scale); + + stk::mesh::field_copy(get_distance_field(), get_old_distance_field()); +} + +double LevelSet::constrained_redistance(const bool use_initial_vol) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::constrained_redistance(const bool use_initial_vol)"); /* %TRACE% */ + + // Steps: + // 1. measure current volume + // 2. perform regular redistance + // 3. find offset needed to conserve volume + // 4. increment nodal distance by this amount + + if (get_isovar_field().valid()) get_isovar_field().field().sync_to_host(); + if (get_distance_field().valid()) get_distance_field().field().sync_to_host(); + if (get_old_distance_field().valid()) get_old_distance_field().field().sync_to_host(); + + if (get_isovar_field().valid()) get_isovar_field().field().modify_on_host(); + if (get_distance_field().valid()) get_distance_field().field().modify_on_host(); + if (get_old_distance_field().valid()) get_old_distance_field().field().modify_on_host(); + + // measure current area and volumes + double start_area, start_neg_vol, start_pos_vol; + compute_sizes( start_area,start_neg_vol, start_pos_vol, 0. ); + if ( 0. == start_neg_vol || 0. == start_area ) + { + krinolog << "Skipping redistancing operation. Volume and/or area have zero value. Area: " + << start_area << " Volume: " << start_neg_vol << stk::diag::dendl; + return 0.; + } + + if (use_initial_vol) + { + krinolog << "Performing conserved redistancing..." << stk::diag::dendl; + + if (my_initial_neg_vol <= 0.0) + { + my_initial_neg_vol = start_neg_vol; + } + start_pos_vol = start_neg_vol + start_pos_vol - my_initial_neg_vol; + start_neg_vol = my_initial_neg_vol; + } + else + { + krinolog << "Performing constrained redistancing..." << stk::diag::dendl; + } + + // perform regular redistance + redistance(); + + krinolog << "Correcting for volume change:" << stk::diag::dendl; + + // find correction needed to conserve volume + const double correction = find_redistance_correction( start_area, start_neg_vol, start_pos_vol ); + + // update nodal distance field + increment_distance( -correction, true ); + + return my_initial_neg_vol; +} + +//-------------------------------------------------------------------------------- + +static std::function(const double)> build_volume_error_function_with_derivative(LevelSet & ls, const double startingNegVol, const double startingPosVol) +{ + auto volume_error_function_with_derivative = [&ls, startingNegVol, startingPosVol](const double x) + { + double area, negVol, posVol; + ls.compute_sizes( area, negVol, posVol, x ); + const double totVol = startingNegVol+startingPosVol; + const double relativeError = (negVol - startingNegVol) / totVol; + krinolog << " Correction = " << x + << ", Current volume = " << negVol + << ", Target volume = " << startingNegVol + << ", Relative Error = " << std::abs(relativeError) + << stk::diag::dendl; + const double derivative = area/totVol; + return std::make_pair(relativeError, derivative); + }; + return volume_error_function_with_derivative; +} + +double +LevelSet::find_redistance_correction( const double start_area, + const double start_neg_vol, + const double start_pos_vol, + const int max_iterations, + const double tol ) +{ /* %TRACE% */ /* %TRACE% */ + auto volume_error_function_with_derivative = build_volume_error_function_with_derivative(*this, start_neg_vol, start_pos_vol); + const auto result = find_root_newton_raphson(volume_error_function_with_derivative, 0., max_iterations, tol); + + if (!result.first) + { + stk::RuntimeWarningAdHoc() << "\nConstrained renormalization failed to converge to root within " + << max_iterations << " iterations. Continuing with correction " << result.second << "\n"; + } + return result.second; +} + +void +LevelSet::redistance() +{ + redistance(my_meta.universal_part()); +} + +void +LevelSet::redistance(const stk::mesh::Selector & selector) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::redistance(void)"); /* %TRACE% */ + + ThrowErrorMsgIf(!my_time_of_arrival_element_speed_field_name.empty(), "Redistancing a time-of-arrival field will corrupt it."); + + if (get_isovar_field().valid()) get_isovar_field().field().sync_to_host(); + if (get_distance_field().valid()) get_distance_field().field().sync_to_host(); + if (get_old_distance_field().valid()) get_old_distance_field().field().sync_to_host(); + + if (get_isovar_field().valid()) get_isovar_field().field().modify_on_host(); + if (get_distance_field().valid()) get_distance_field().field().modify_on_host(); + if (get_old_distance_field().valid()) get_old_distance_field().field().modify_on_host(); + + if (FAST_MARCHING == my_redistance_method) + { + fast_marching_redistance(selector); + return; + } + ThrowRequire(CLOSEST_POINT == my_redistance_method); + + krinolog << "Redistancing the level set field..." << stk::diag::dendl; + + // our starting point is a nodal variable (like distance or temperature) + // that needs to be contoured to form the surface + // after forming the surface, the nodal distance needs to be calculated + // the newly formed surface should be remain in the vector facets + build_facets_locally(selector); + + // debugging + if (krinolog.shouldPrint(LOG_FACETS)) + { + facets_exoii(); + } + + // swap these facets into facet_old to take advantage of routines + // that are expecting the facets there + facets->swap( *facets_old ); + + // get non-local facets such that we have copies of all "old" facets + // within the range of this proc's nodes + prepare_to_compute_distance( 0., selector ); + + // compute nodal distances with semi-lagrangian step + compute_distance_semilagrangian( 0., selector ); + + // swap so that the facets that were formed remain in the vector facets + facets->swap( *facets_old ); + +} + +double +LevelSet::get_time_of_arrival_speed(stk::mesh::Entity elem, ParallelErrorMessage& err) const +{ + double speed = 1.0; + if (myTimeOfArrivalBlockSpeeds.empty()) + { + if (myTimeOfArrivalElementSpeedField.valid()) + { + const double * speedFieldData = field_data(myTimeOfArrivalElementSpeedField, elem); + if (!speedFieldData) err << "Missing element speed on element " << mesh().identifier(elem) << "\n"; + else speed = *speedFieldData; + + if (speed <= 0.0) + { + err << "Non positive-definite speed " << speed << " found on element " << mesh().identifier(elem) << "\n"; + } + } + } + else + { + const stk::mesh::Part & elemPart = find_element_part(mesh(), elem); + speed = myTimeOfArrivalBlockSpeeds[elemPart.mesh_meta_data_ordinal()]; + ThrowAssert(speed >= 0.0); // Negative speeds should have already been caught and generated error. + if (speed == 0.0) + err << "Speed not specified for block " << elemPart.name() << "\n"; + } + + return speed; +} + +void +LevelSet::fast_marching_redistance(const stk::mesh::Selector & selector, const bool compute_time_of_arrival) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::fast_marching_redistance(const stk::mesh::Selector & selector)"); /* %TRACE% */ + + // Unlike redistance() this method provides an approximate (not exact) distance to the isosurface. + // On the other hand, this method provide solve the Eikonal equation on the mesh. This is slightly + // different than a pure distance function because it provides the distance through domain. It can't see + // through walls like the redistance() method does. + + if (compute_time_of_arrival) krinolog << "Initializing the level set field to be the time-of-arrival using a fast marching method..." << stk::diag::dendl; + else krinolog << "Redistancing the level set field using a fast marching method..." << stk::diag::dendl; + Fast_Marching fm(*this, selector, get_timer()); + fm.redistance(); +} + +//-------------------------------------------------------------------------------- + +void +LevelSet::set_distance( const double & in_distance ) const +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::set_distance( const double & in_distance ) const"); /* %TRACE% */ + + stk::mesh::field_fill(in_distance, get_distance_field()); +} + +void +LevelSet::increment_distance( const double increment, const bool enforce_sign ) const +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::increment_distance( const double & increment ) const"); /* %TRACE% */ + // + // increment the distance everywhere by the given value + // + + const FieldRef dField = get_distance_field(); + + const stk::mesh::Selector active_field_selector = aux_meta().active_not_ghost_selector() & stk::mesh::selectField(dField); + stk::mesh::BucketVector const& buckets = mesh().get_buckets( stk::topology::NODE_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const size_t length = b.size(); + + double *d = field_data(dField , b); + + for (size_t i = 0; i < length; ++i) + { + const double change = (enforce_sign && sign_change(d[i],d[i]+increment)) ? -0.5*d[i] : increment; + d[i] += change; + } + } // end bucket loop +} + +void +LevelSet::scale_distance( const double scale) const +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::scale_distance( const double & scale ) const"); /* %TRACE% */ + // + // increment the distance everywhere by the given value + // + + const FieldRef dField = get_distance_field(); + + const stk::mesh::Selector active_field_selector = aux_meta().active_not_ghost_selector() & stk::mesh::selectField(dField); + stk::mesh::BucketVector const& buckets = mesh().get_buckets( stk::topology::NODE_RANK, active_field_selector); + + stk::mesh::BucketVector::const_iterator ib = buckets.begin(); + stk::mesh::BucketVector::const_iterator ib_end = buckets.end(); + + // iterate nodes, by buckets, and set distance + for ( ; ib != ib_end ; ++ib ) + { + const stk::mesh::Bucket & b = **ib; + + const size_t length = b.size(); + + double *d = field_data(dField , b); + + for (size_t i = 0; i < length; ++i) + { + d[i] *= scale; + } + } // end bucket loop +} + +void +LevelSet::negate_distance() const +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::increment_distance( const double & increment ) const"); /* %TRACE% */ + + const FieldRef dRef = get_distance_field(); + stk::mesh::field_scale(-1.0, dRef); +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::compute_continuous_gradient() const +{ /* %TRACE[ON]% */ /* %TRACE% */ + // + // Compute a mass-lumped continuous distance gradient + // + + const int dim = mesh().mesh_meta_data().spatial_dimension(); + + const FieldRef contGradRef = aux_meta().get_field(stk::topology::NODE_RANK, "CONT_GRAD"); + const FieldRef nodeAreaRef = aux_meta().get_field(stk::topology::NODE_RANK, "NODE_AREA"); + + + // initialize + stk::mesh::field_fill(0.0, contGradRef); + stk::mesh::field_fill(0.0, nodeAreaRef); + + // intg_pt_locations and intg_weights are just wrappers for framework data + // determinants and grad_distance are arrays containing data that are resized + // only as needed + sierra::Array intg_pt_locations; + sierra::Array intg_weights; + sierra::ArrayContainer determinants; + sierra::ArrayContainer grad_distance; + + // ************************** + // Not-covered-in-nightly RWH + // ************************** + + const FieldRef xField = get_coordinates_field(); + const FieldRef isoField = get_isovar_field(); + + stk::mesh::Selector active_field_selector = stk::mesh::selectField(contGradRef) & aux_meta().active_not_ghost_selector(); + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities( active_field_selector, mesh().buckets( stk::topology::ELEMENT_RANK ), objs ); + + for ( auto && elem : objs ) + { + // create element + ContourElement ls_elem( mesh(), elem, xField, isoField ); + + ls_elem.std_intg_pts( intg_pt_locations, intg_weights, determinants, + ls_elem.dist_master_elem() ); + ls_elem.compute_distance_gradient( intg_pt_locations, grad_distance ); + + const unsigned num_intg_pts = intg_pt_locations.dimension(); + const int npe = ls_elem.dist_topology().num_nodes(); + + const double * shape_fcn_ptr = ls_elem.dist_master_elem().shape_fcn(); + const sierra::Array shape_fcn(shape_fcn_ptr,npe,num_intg_pts); + + const stk::mesh::Entity* elem_nodes = mesh().begin_nodes(elem); + + for ( int i = 0; i < npe; ++i ) + { + double * cont_grad = field_data(contGradRef, elem_nodes[i]); + double * area_ptr = field_data(nodeAreaRef, elem_nodes[i]); + double & area = *area_ptr; + + for (unsigned ip = 0; ip < num_intg_pts; ++ip ) + { + const double NdV = shape_fcn(i,ip) * intg_weights(ip) * determinants(ip); + area += NdV; + + for ( int d = 0; d < dim; d++ ) + { + cont_grad[d] += grad_distance(d,ip) * NdV; + //krinolog << "grad_distance(" << d << "," << ip << ") = " << grad_distance(d,ip) << stk::diag::dendl; + } + } + } + } + + // iterate nodes, by buckets, and calculate average gradient + + stk::mesh::BucketVector const& buckets = mesh().get_buckets(stk::topology::NODE_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const size_t length = b.size(); + + double * cont_grad = field_data(contGradRef, b); + double * area = field_data(nodeAreaRef, b); + + for (size_t i = 0; i < length; ++i) + { + for ( int d = 0; d < dim; d++ ) + { + cont_grad[dim*i+d] = cont_grad[dim*i+d] / area[i]; + } + } + } +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::compute_nodal_bbox( const stk::mesh::Selector & selector, + BoundingBox & node_bbox, + const Vector3d & displacement ) const +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::compute_nodal_bbox( BoundingBox & node_bboxes, const double & deltaTime ) const"); /* %TRACE% */ + + // find the local nodal bounding box + + const FieldRef xField = get_coordinates_field(); + const FieldRef dField = get_distance_field(); + + const stk::mesh::Selector active_field_selector = aux_meta().active_not_ghost_selector() & selector & stk::mesh::selectField(dField); + stk::mesh::BucketVector const& buckets = mesh().get_buckets( stk::topology::NODE_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const size_t length = b.size(); + + double *x = field_data(xField, b); + + for (size_t i = 0; i < length; ++i) + { + + Vector3d x_bw(Vector3d::ZERO); + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) + { + int index = i*spatial_dimension+dim; + x_bw[dim] = x[index] - displacement[dim]; + } + + // incrementally size bounding box + node_bbox.accommodate( x_bw ); + } + } // end bucket loop +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::prepare_to_compute_distance( const double & deltaTime, const stk::mesh::Selector & selector ) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::get_nonlocal_facets( const double & deltaTime )"); /* %TRACE% */ + + // Get all of the facets that are within our processor's bounding box + // To do this, see if any local facets lie in the nodal bounding box + // of another proc. if so, send them a copy of those facets + + // First, find the bounding box for each proc that contains all of the + // nodes on that proc plus the narrow_band size + + BoundingBox node_bbox; + const Vector3d displacement = deltaTime * get_extension_velocity(); + compute_nodal_bbox( selector, node_bbox, displacement ); + + facets_old->prepare_to_compute(node_bbox, my_narrow_band_size); +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::compute_distance_semilagrangian( const double & deltaTime, const stk::mesh::Selector & selector ) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::compute_distance_semilagrangian( const double & deltaTime ) const"); /* %TRACE% */ + + const double h_avg = compute_average_edge_length(); + + const FieldRef xField = get_coordinates_field(); + const FieldRef dField = get_distance_field(); + const Vector3d extv = get_extension_velocity(); + + const stk::mesh::Selector active_field_selector = aux_meta().active_not_ghost_selector() & selector & stk::mesh::selectField(dField); + stk::mesh::BucketVector const& buckets = mesh().get_buckets(stk::topology::NODE_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const size_t length = b.size(); + + double *d = field_data( dField , b); + double *x = field_data( xField , b); + + // Handle special case of ( deltaTime == 0. ) so that we + // can handle situation where velocity is not defined at all + // nodes where distance is defined. (This is currently a requirement + // for regular semilagrangian advancement). + if ( deltaTime == 0. ) + { + for (size_t i = 0; i < length; ++i) + { + Vector3d x_node(Vector3d::ZERO); + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) + { + int index = i*spatial_dimension+dim; + x_node[dim] = x[index]; + } + + int previous_sign = LevelSet::sign(d[i]); + // If this is too large, then sharp edges can propagate incorrect signs + // (even through walls, etc). + // If this is too small, then a phase can't disappear because the sign + // preservation will prevent it even if the subelement contouring process + // neglects it. So this should be slightly larger than the tolerance in + // compute_subelement_decomposition. + bool enforce_sign = (std::abs(d[i]) > 5.e-4*h_avg); + + d[i] = distance( x_node, previous_sign, enforce_sign ); + } + } + else + { + for (size_t i = 0; i < length; ++i) + { + Vector3d x_bw(Vector3d::ZERO); + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) + { + int index = i*spatial_dimension+dim; + x_bw[dim] = x[index] - extv[dim] * deltaTime; + } + + int previous_sign = LevelSet::sign(d[i]); + + d[i] = distance( x_bw, previous_sign, false ); + } + } + } // end bucket loop +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::compute_distance( stk::mesh::Entity n, + const double & deltaTime ) const +{ /* %TRACE% */ /* %TRACE% */ + + // use the facet cell array to compute the distance to a node n + + const FieldRef xField = get_coordinates_field(); + const FieldRef dField = get_distance_field(); + const Vector3d extv = get_extension_velocity(); + + double *x = field_data( xField , n); + double *d = field_data( dField , n); + + // Handle special case of ( deltaTime == 0. ) so that we + // can handle situation where velocity is not defined at all + // nodes where distance is defined. (This is currently a requirement + // for regular semilagrangian advancement). + if ( deltaTime == 0. ) + { + Vector3d x_node(Vector3d::ZERO); + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) + { + x_node[dim] = x[dim]; + } + + int previous_sign = LevelSet::sign(*d); + *d = distance( x_node, previous_sign, true ); + } + else + { + Vector3d x_bw(Vector3d::ZERO); + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) + { + x_bw[dim] = x[dim] - extv[dim] * deltaTime; + } + + int previous_sign = LevelSet::sign(*d); + *d = distance( x_bw, previous_sign, false ); + } +} + +//----------------------------------------------------------------------------------- + +double +LevelSet::distance( const Vector3d & x, + const int previous_sign, + const bool enforce_sign ) const +{ /* %TRACE% */ /* %TRACE% */ + + if (enforce_sign) + { + return previous_sign * facets_old->point_unsigned_distance(x, my_narrow_band_size, my_narrow_band_size); + } + return facets_old->truncated_point_signed_distance(x, my_narrow_band_size, previous_sign*my_narrow_band_size); +} + +//----------------------------------------------------------------------------------- + +void +LevelSet::snap_to_mesh() const +{ /* %TRACE[ON]% */ Trace trace__("LevelSet::snap_to_mesh()"); /* %TRACE% */ + const double tol = 1.0e-2; + + // Remove sliver subelements by setting nodal values near zero to zero exactly. + // This should probably be an edge-based check. But this poses a problem for higher order + // elements, which we are going to decompose into lower order elements. So we make it + // simpler by compare ALL pairs of nodes within the element. If the crossing between any + // pair of nodes is is within a relative distance of tol, the distance at the nearest node + // is set to zero. + + // This seems like a great way to consistently handle degeneracies. + // One problem, however, is this only handles the near zero's on the original elements. + // We will generate others as we decompose into non-conformal subelements. This won't fix + // those degenerate situations. + + std::vector dist; + + const FieldRef dField = get_distance_field(); + + const stk::mesh::Selector active_field_selector = stk::mesh::selectField(dField) & aux_meta().active_locally_owned_selector(); + stk::mesh::BucketVector const& buckets = mesh().get_buckets(stk::topology::ELEMENT_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const stk::topology dist_topology = MasterElementDeterminer::get_field_topology(b, dField); + const int npe_dist = dist_topology.num_nodes(); + dist.resize( npe_dist ); + + const size_t length = b.size(); + for (size_t i = 0; i < length; ++i) + { + stk::mesh::Entity elem = b[i]; + + if (!elem_on_interface(elem)) continue; + + const stk::mesh::Entity* elem_nodes = mesh().begin_nodes(elem); + + for ( int n = 0; n < npe_dist; ++n ) + { + dist[n] = *field_data(dField, elem_nodes[n]); + } + + for ( int n = 0; n < npe_dist; ++n ) + { + for ( int np = n+1; np < npe_dist; ++np ) + { + if (sign_change(dist[n],dist[np])) + { + const double d0 = std::fabs(dist[n]); + const double d1 = std::fabs(dist[np]); + if (d0 < d1) + { + if (d0 / (d0+d1) < tol) + { + *field_data(dField, elem_nodes[n]) = 0.0; + } + } + else + { + if (d1 / (d1+d0) < tol) + { + *field_data(dField, elem_nodes[np]) = 0.0; + } + } + } + } + } + } + } +} + +//----------------------------------------------------------------------------------- + +bool +LevelSet::remove_wall_features() const +{ /* %TRACE[ON]% */ Trace trace__("LevelSet::remove_wall_features()"); /* %TRACE% */ + + std::vector dist; + std::vector coords; + int small_feature_removed = false; + + const FieldRef dField = get_distance_field(); + const FieldRef coordinates_field = get_coordinates_field(); + + stk::mesh::Selector surface_selector = selectUnion(my_surface_parts); + + const stk::mesh::Selector active_field_selector = stk::mesh::selectField(dField) & aux_meta().active_locally_owned_selector() & surface_selector; + stk::mesh::BucketVector const& buckets = mesh().get_buckets(meta().side_rank(), active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + + const stk::topology dist_topology = MasterElementDeterminer::get_field_topology(b, dField); + const int npe_dist = dist_topology.num_nodes(); + dist.resize( npe_dist ); + coords.resize( npe_dist ); + + const size_t length = b.size(); + for (size_t i = 0; i < length; ++i) + { + stk::mesh::Entity side = b[i]; + + const stk::mesh::Entity* side_nodes = mesh().begin_nodes(side); + + for ( int n = 0; n < npe_dist; ++n ) + { + dist[n] = *field_data(dField, side_nodes[n]); + + double *coord_data = field_data(coordinates_field,side_nodes[n]); + coords[n] = coord_data; + } + + for ( int n = 0; n < npe_dist; ++n ) + { + const stk::mesh::Entity *elems = mesh().begin_elements(side); //get the element + const int num_elems = mesh().num_elements(side); + + for (int l = 0; l < num_elems; ++l ) + { + const stk::mesh::Entity elem = elems[l]; + + //make sure we have the right element (active) and has the distance function + //at every point in the element (to take gradient) + + if(!aux_meta().active_locally_owned_selector()(mesh().bucket(elem))) continue; + if(!elem_has_field_data(dField, elem)) continue; + + //const double elem_len = calc_elem_len_normal(elem, side, coordinates_field); + + if(std::fabs(dist[n]) > my_max_feature_size) continue; + + ContourElement ls_elem( mesh(), elem, coordinates_field, dField ); + const Vector3d p_coords(1/3., 1/3., 1/3.); + const Vector3d grad_dist_vec = ls_elem.distance_gradient(p_coords); + + Vector3d face_normal; + + //assume linear tet or tri elements! + if(spatial_dimension == 2) + { + face_normal = {-coords[1][1]+coords[0][1], coords[1][0]-coords[0][0], 0}; //simple 90 deg rotation + const stk::mesh::Entity* elem_nodes = mesh().begin_nodes(elem); + + int num_elem_nodes = mesh().num_nodes(elem); + + for (int j = 0; j < num_elem_nodes; ++j) //find node in elem not part of side part, confirm normal points into elem + { + if(elem_nodes[j] != side_nodes[0] && elem_nodes[j] != side_nodes[spatial_dimension-1]) + { + double *coord = field_data(coordinates_field,elem_nodes[j]); + const Vector3d vec_check(coord[0]-coords[0][0], coord[1]-coords[0][1], 0); + + if(Dot(face_normal, vec_check) < 0) + { + face_normal *= -1; + break; + } + } + } + } + else + { + const Vector3d x1 (coords[1][0]-coords[0][0], coords[1][1]-coords[0][1],coords[1][2]-coords[0][2]); + const Vector3d x2 (coords[2][0]-coords[0][0], coords[2][1]-coords[0][1],coords[2][2]-coords[0][2]); + face_normal = -1.0*Cross(x1,x2); + } + + face_normal.unitize(); + const double eta = -dist[n]/(Dot(grad_dist_vec, face_normal)); + + if(eta < my_max_feature_size && eta > 0) + { + *field_data(dField, side_nodes[n]) = -1.0 * dist[n]; + small_feature_removed = true; + } + } + } + } + } + + int global_small_feature_removed = false; + stk::all_reduce_sum(mesh().parallel(), &small_feature_removed, &global_small_feature_removed, 1); + + if (global_small_feature_removed) + { + stk::mesh::communicate_field_data(mesh(), {&dField.field()}); + return true; + } + + return false; +} +//-------------------------------------------------------------------------------- + +bool +LevelSet::simple_remove_wall_features() const +{ /* %TRACE[ON]% */ Trace trace__("LevelSet::remove_wall_features()"); /* %TRACE% */ + + int small_feature_removed = false; + const FieldRef dField = get_distance_field(); + + stk::mesh::Selector surface_selector = selectUnion(my_surface_parts); + + const stk::mesh::Selector active_field_selector = stk::mesh::selectField(dField) & aux_meta().active_part() & surface_selector; + stk::mesh::BucketVector const& buckets = mesh().get_buckets(stk::topology::NODE_RANK, active_field_selector); + + for ( auto && bucket : buckets ) + { + const stk::mesh::Bucket & b = *bucket; + const size_t length = b.size(); + for (size_t i = 0; i < length; ++i) + { + stk::mesh::Entity node = b[i]; + double & dist = *field_data(dField, node); + + if(std::fabs(dist) < my_max_feature_size) + { + dist*=-1; + small_feature_removed = true; + } + } + } + + return small_feature_removed; +} +//-------------------------------------------------------------------------------- + +void +LevelSet::set_surface_parts_vector() +{ + Phase_Support my_phase_support = Phase_Support::get(meta()); + + std::vector conformal_parts = my_phase_support.get_conformal_parts(); + + krinolog << "Removing small features less than " << my_max_feature_size << " on surfaces: "; + for (auto && mypart : conformal_parts) + { + if(mypart->primary_entity_rank() == meta().side_rank() && !my_phase_support.is_interface(mypart)) + { + my_surface_parts.push_back(mypart); + krinolog << mypart->name() << " "; + } + } + + krinolog << stk::diag::dendl; +} + +//-------------------------------------------------------------------------------- + +bool +LevelSet::elem_has_field_data(const FieldRef &myField, const stk::mesh::Entity &elem) const +{ + const stk::mesh::Entity* elem_nodes = mesh().begin_nodes(elem); + int num_nodes = mesh().num_nodes(elem); + + for (int k = 0; k < num_nodes; ++k) + { + if(!has_field_data(myField, elem_nodes[k])) return false; + } + + return true; +} +//-------------------------------------------------------------------------------- + +bool +LevelSet::elem_on_interface(stk::mesh::Entity e) const +{ /* %TRACE% */ /* %TRACE% */ + + const FieldRef isoField = get_isovar_field(); + + const unsigned nnodes = mesh().num_nodes(e); + ThrowAssert( 0 < nnodes ); + const stk::mesh::Entity* nodes = mesh().begin_nodes(e); + + // guilty till proven innocent here + bool on_interface = false; + bool have_crossing = false; + + double *d = field_data(isoField, nodes[0]); + double first_value = *d - my_threshold; + bool inside_narrow_band = fabs(first_value) < 0.5*my_narrow_band_size; + + for (unsigned i = 1; i < nnodes; ++i ) + { + d = field_data(isoField, nodes[i]); + if ( NULL == d ) continue; // account for lower order interpolation + double value = *d - my_threshold; + + have_crossing |= sign_change(value, first_value); + inside_narrow_band |= (fabs(value) < 0.5*my_narrow_band_size); + } + + // It is the user's job to make sure that the narrow band is sufficiently + // large that we don't to test if this crossing is within the narrow band + if ( have_crossing ) + on_interface = true; + + return on_interface; +} + +//-------------------------------------------------------------------------------- +void +LevelSet::compute_sizes( double & area, double & neg_vol, double & pos_vol, const double iso_val ) +{ /* %TRACE[ON]% */ /* %TRACE% */ + + // initialize + area = 0.0; + neg_vol = 0.0; + pos_vol = 0.0; + + const double h_avg = compute_average_edge_length(); + + sierra::ArrayContainer intg_pt_locations; + sierra::ArrayContainer intg_weights; + sierra::ArrayContainer determinants; + + const FieldRef xField = get_coordinates_field(); + const FieldRef isoField = get_isovar_field(); + //const Vector3d extv = get_extension_velocity(); + + stk::mesh::Selector active_field_selector = stk::mesh::selectField(isoField) & aux_meta().active_locally_owned_selector(); + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities(active_field_selector, mesh().buckets( stk::topology::ELEMENT_RANK ), objs); + + for ( auto && elem : objs ) + { + // create element that is decomposed into subelements + ContourElement ls_elem( mesh(), elem, xField, isoField, iso_val ); + + ls_elem.compute_subelement_decomposition(h_avg); + + // get integration point locations, weights, and determinants for surface + int num_intg_pts = ls_elem.gather_intg_pts( 0, // interface + intg_pt_locations,// gauss pt locations + intg_weights, // integration wts at gauss pts + determinants, // determinant at gauss pts + true ); // map_to_real_coords + for ( int ip = 0; ip < num_intg_pts; ++ip ) + { + area += intg_weights(ip) * determinants(ip); + } + + // get integration point locations, weights, and determinants for negative volume + num_intg_pts = ls_elem.gather_intg_pts( -1, // negative side of interface + intg_pt_locations, // gauss pt locations + intg_weights, // integration wts at gauss pts + determinants, // determinant at gauss pts + true ); // map_to_real_coords + for ( int ip = 0; ip < num_intg_pts; ++ip ) + { + neg_vol += intg_weights(ip) * determinants(ip); + } + + // get integration point locations, weights, and determinants for positive volume + num_intg_pts = ls_elem.gather_intg_pts( 1, // positive side of interface + intg_pt_locations, // gauss pt locations + intg_weights, // integration wts at gauss pts + determinants, // determinant at gauss pts + true ); // map_to_real_coords + for ( int ip = 0; ip < num_intg_pts; ++ip ) + { + pos_vol += intg_weights(ip) * determinants(ip); + } + } + + // communicate global sums + const int vec_length = 3; + std::vector local_sum( vec_length ); + std::vector global_sum( vec_length ); + local_sum[0] = area; + local_sum[1] = neg_vol; + local_sum[2] = pos_vol; + + stk::all_reduce_sum(mesh().parallel(), &local_sum[0], &global_sum[0], vec_length); + + area = global_sum[0]; + neg_vol = global_sum[1]; + pos_vol = global_sum[2]; + +} +//-------------------------------------------------------------------------------- +double +LevelSet::gradient_magnitude_error(void) +{ /* %TRACE[ON]% */ /* %TRACE% */ + + double area = 0., sum_L2 = 0., global_L2 = 0., local_Loo = 0., global_Loo = 0.; + + sierra::ArrayContainer intg_pt_locations; + sierra::ArrayContainer intg_weights; + sierra::ArrayContainer determinants; + sierra::ArrayContainer grad_dist; + + const double h_avg = compute_average_edge_length(); + + const FieldRef xField = get_coordinates_field(); + const FieldRef isoField = get_isovar_field(); + //const Vector3d extv = get_extension_velocity(); + + stk::mesh::Selector active_field_selector = stk::mesh::selectField(isoField) & aux_meta().active_locally_owned_selector(); + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities( active_field_selector, mesh().buckets( stk::topology::ELEMENT_RANK ), objs ); + + for ( auto && elem : objs ) + { + // create element that is decomposed into subelements + ContourElement ls_elem( mesh(), elem, xField, isoField ); + + ls_elem.compute_subelement_decomposition(h_avg); + + // get integration point locations, weights, and determinants for surface + int num_intg_pts = ls_elem.gather_intg_pts( 0, // interface + intg_pt_locations,// gauss pt locations + intg_weights, // integration wts at gauss pts + determinants, // determinant at gauss pts + true ); // map_to_real_coords + + ls_elem.compute_distance_gradient( intg_pt_locations, grad_dist ); + for ( int ip = 0; ip < num_intg_pts; ++ip ) + { + double mag_grad_phi = 0.; + for ( unsigned dim = 0; dim < spatial_dimension; ++dim ) mag_grad_phi += grad_dist(dim,ip) * grad_dist(dim,ip); + mag_grad_phi = sqrt(mag_grad_phi); + + sum_L2 += (mag_grad_phi - 1.) * (mag_grad_phi - 1.) * intg_weights(ip) * determinants(ip); + area += intg_weights(ip) * determinants(ip); + + if ( fabs(mag_grad_phi - 1.) > local_Loo ) local_Loo = fabs(mag_grad_phi - 1.); + } + } + + // communicate global norms + const int vec_length = 2; + std::vector local_sum( vec_length ); + std::vector global_sum( vec_length ); + local_sum[0] = sum_L2; + local_sum[1] = area; + + stk::all_reduce_sum(mesh().parallel(), &local_sum[0], &global_sum[0], vec_length); + stk::all_reduce_max(mesh().parallel(), &local_Loo, &global_Loo, 1); + + if ( global_sum[1] > 0. ) + { + global_L2 = global_sum[0] / global_sum[1]; + } + + krinolog << "Gradient norm error for " << name() << ": L2 = " << global_L2 << ", Loo = " << global_Loo << stk::diag::dendl; + + // L2 is the standard now, maybe Loo would be better? + return global_L2; +} +//-------------------------------------------------------------------------------- +double +LevelSet::compute_average_edge_length() const +{ /* %TRACE[ON]% */ /* %TRACE% */ + + double sum_avg_edge_lengths = 0.0; + int num_elems = 0; + + const FieldRef xField = get_coordinates_field(); + const FieldRef isoField = get_isovar_field(); + + stk::mesh::Selector active_field_selector = stk::mesh::selectField(isoField) & aux_meta().active_locally_owned_selector(); + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities( active_field_selector, mesh().buckets( stk::topology::ELEMENT_RANK ), objs ); + + for ( auto && elem : objs ) + { + ++num_elems; + + // create element + ContourElement ls_elem( mesh(), elem, xField, isoField ); + + sum_avg_edge_lengths += ls_elem.average_edge_length(); + } + + // communicate global sums + const int vec_length = 2; + std::vector local_sum( vec_length ); + std::vector global_sum( vec_length ); + local_sum[0] = sum_avg_edge_lengths; + local_sum[1] = 1.0*num_elems; + + stk::all_reduce_sum(mesh().parallel(), &local_sum[0], &global_sum[0], vec_length); + + const double h_avg = ( global_sum[1] != 0.0 ) ? global_sum[0]/global_sum[1] : 0.0; + + return h_avg; +} + +//-------------------------------------------------------------------------------- + +void +LevelSet::build_facets_locally(const stk::mesh::Selector & selector) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::build_facets_locally(void)"); /* %TRACE% */ + + // clear vector of facets + facets->clear(); + + const double h_avg = compute_average_edge_length(); + + const FieldRef xField = get_coordinates_field(); + const FieldRef isoField = get_isovar_field(); + + stk::mesh::Selector active_field_selector = selector & stk::mesh::selectField(isoField) & aux_meta().active_locally_owned_selector(); + std::vector< stk::mesh::Entity> objs; + stk::mesh::get_selected_entities( active_field_selector, mesh().buckets( stk::topology::ELEMENT_RANK ), objs ); + + for ( auto && elem : objs ) + { + // create element that is decomposed into subelements + ContourElement ls_elem( mesh(), elem, xField, isoField ); + ls_elem.compute_subelement_decomposition(h_avg); + + ls_elem.build_subelement_facets( *facets ); + } +} + +LevelSet & +LevelSet::build( + stk::mesh::MetaData & in_meta, + const std::string & ls_name, + stk::diag::Timer & parent_timer ) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::build(stk::mesh::MetaData & in_meta, const std::string & ls_name, stk::diag::Timer & parent_timer)"); /* %TRACE% */ + LevelSetManager & region_ls = LevelSetManager::get(in_meta); + + ThrowRequire(!region_ls.has_levelSet(ls_name)); + LevelSet * ls = new LevelSet(in_meta, ls_name, parent_timer); + region_ls.add(ls); + return *ls; +} + +//-------------------------------------------------------------------------------- +LevelSet::LevelSet( + stk::mesh::MetaData & in_meta, + const std::string & in_name, + stk::diag::Timer & parent_timer ) : + my_meta(in_meta), + my_aux_meta(AuxMetaData::get(in_meta)), + my_identifier(LevelSet::get_identifier(in_name)), + my_name(LevelSet::get_name(my_identifier)), + my_parent_timer(parent_timer), + my_timer("LevelSet", parent_timer), + spatial_dimension(in_meta.spatial_dimension()), + my_narrow_band_multiplier(0.0), + my_narrow_band_size(0.0), + my_max_feature_size(-1.0), + my_ic_offset(0.0), + my_ic_scale(1.0), + my_perform_initial_redistance(false), + my_keep_IC_surfaces(false), + my_threshold(0.0), + my_redistance_method(CLOSEST_POINT), + epsilon(1.0e-16), + trackIsoSurface(false), + my_facetFileIndex(1), + my_initial_neg_vol(0.0), + my_needs_reinitialize_every_step(false) +{ /* %TRACE[ON]% */ Trace trace__("krino::LevelSet::LevelSet(stk::mesh::MetaData & in_meta, const std::string & ls_name, stk::diag::Timer & parent_timer)"); /* %TRACE% */ + my_coordinates_field = get_current_coordinates(in_meta); + + // default names for distance and velocity + // line commands are available for overriding these names + const std::string distName = "D_" + name(); + set_distance_name(distName); +} + +LevelSet::~LevelSet() +{ +} + +//----------------------------------------------------------------------------------- +void +LevelSet::gather_nodal_field( + const stk::mesh::BulkData& stk_mesh, + stk::mesh::Entity obj, + const FieldRef & field, + double * gathered_field_data ) +{ /* %TRACE% */ /* %TRACE% */ + + int ncomp_field = field.length(); + + // Gather obj's nodal field into a single flat array + // of dimension (ncomp_field,num_nodes) + + int j = 0; + const unsigned num_nodes = stk_mesh.num_nodes(obj); + const stk::mesh::Entity* nodes = stk_mesh.begin_nodes(obj); + for (unsigned node_index=0; node_index(field, node); + for ( int i = 0; i < ncomp_field; ++i ) + { + gathered_field_data[j++] = var[i]; + } + } + + ThrowAssert( (unsigned)j == ncomp_field * stk_mesh.num_nodes(obj)); +} +//-------------------------------------------------------------------------------- +LevelSetManager & +LevelSetManager::get(stk::mesh::MetaData & meta) +{ + LevelSetManager * mgr = const_cast(meta.get_attribute()); + if (nullptr == mgr) + { + mgr = new LevelSetManager; + meta.declare_attribute_with_delete(mgr); + } + return *mgr; +} +//-------------------------------------------------------------------------------- +LevelSetManager & +LevelSetManager::get(const stk::mesh::MetaData & meta) +{ + LevelSetManager * mgr = const_cast(meta.get_attribute()); + ThrowRequireMsg(nullptr != mgr, "No LevelSetManager found for MetaData."); + return *mgr; +} +//-------------------------------------------------------------------------------- +bool LevelSetManager::has_levelSet(const std::string & ls_name) const +{ + for (auto&& ls : my_level_sets) + { + if (ls->name() == ls_name || ls->get_composite_name() == ls_name) + { + return true; + } + } + return false; +} +//-------------------------------------------------------------------------------- +std::string +print_sizes(const LevelSet & ls) +{ /* %TRACE[ON]% */ Trace trace__("krino::print_sizes(const LevelSet & levelSet)"); /* %TRACE% */ + + // + // find sizes of facets stored in vector of facet descriptions + // + + const auto & ls_surfaces = ls.get_facets().get_facets(); + unsigned local_facet_num = ls_surfaces.size(); + unsigned global_facet_num = 0; + stk::all_reduce_sum(ls.mesh().parallel(), &local_facet_num , &global_facet_num, 1); + + // iterate local facets and calc area + + double local_facets_totalArea = 0.0; // total surface area of interface from facets + double local_facets_maxArea = -1.0; // area of largest facet on interface + double local_facets_minArea = std::numeric_limits::max(); // area of smallest facet on interface + + // loop over facets + for ( auto&& surface : ls_surfaces ) + { + double area = surface->facet_area(); + local_facets_totalArea += area; + + local_facets_maxArea = std::min(area, local_facets_maxArea); + local_facets_minArea = std::max(area, local_facets_maxArea); + } + + double global_facets_totalArea = 0.0; + double global_facets_maxArea = 0.0; + double global_facets_minArea = 0.0; + + stk::all_reduce_min(ls.mesh().parallel(), &local_facets_minArea, &global_facets_minArea, 1); + stk::all_reduce_max(ls.mesh().parallel(), &local_facets_maxArea, &global_facets_maxArea, 1); + stk::all_reduce_sum(ls.mesh().parallel(), &local_facets_totalArea, &global_facets_totalArea, 1); + + std::ostringstream out; + + // facet info + out << "P" << ls.mesh().parallel_rank() << ": facets for level set '" << ls.name() << "' " << std::endl ; + out << "\t " << "Global sizes: { " << global_facet_num << " facets on }" << std::endl; + out << "\t " << "Local sizes: { " << local_facet_num << " facets on }" << std::endl; + out << "\t Global areas: { Min = " << global_facets_minArea << ", Max = " << global_facets_maxArea + << ", Total = " << global_facets_totalArea << " }" << std::endl; + return out.str(); +} +//-------------------------------------------------------------------------------- + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_LevelSet.hpp b/packages/krino/krino/krino_lib/Akri_LevelSet.hpp new file mode 100644 index 000000000000..609e13728396 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LevelSet.hpp @@ -0,0 +1,339 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_LevelSet_h +#define Akri_LevelSet_h + +/** + + Create one of these for every interface you want to capture. + + */ +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class MetaData; } } +namespace sierra { namespace Sctl { class Event; } } +namespace krino { class AuxMetaData; } +namespace krino { class IC_Alg; } +namespace krino { class ParallelErrorMessage; } + +namespace krino { + +enum Redistance_Method +{ + CLOSEST_POINT=0, + FAST_MARCHING, + MAX_REDISTANCE_METHOD_TYPE +}; + +/// Return true if field-data exists for the specified meshobj and field. +bool all_nodes_have_field_data(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, const stk::mesh::FieldBase& field); + +class LevelSet { +friend class LevelSet_Size; +public: + stk::mesh::MetaData & meta(); + const stk::mesh::MetaData & meta() const; + stk::mesh::BulkData & mesh(); + const stk::mesh::BulkData & mesh() const; + AuxMetaData & aux_meta(); + const AuxMetaData & aux_meta() const; + + const std::string & name() const { return my_name; } + LevelSet_Identifier get_identifier() const {return my_identifier; } + stk::diag::Timer & get_timer() const { return my_timer; } + stk::diag::Timer & get_parent_timer() const { return my_parent_timer; } + + // finalize setup + static void setup(stk::mesh::MetaData & meta); + static void post_commit_setup(stk::mesh::MetaData & meta); + virtual void setup(); + + static void set_current_coordinates(stk::mesh::MetaData & meta, const FieldRef ref); + static FieldRef get_current_coordinates(stk::mesh::MetaData & meta); + + void register_fields(); + + void advance_semilagrangian(const double deltaTime); + + static void gather_nodal_field( + const stk::mesh::BulkData& stk_mesh, + stk::mesh::Entity obj, + const FieldRef & field_ref, + double * field); + + double compute_average_edge_length() const; + + void build_facets_locally(const stk::mesh::Selector & selector); + + void compute_sizes( double & area, double & neg_vol, double & pos_vol, const double distance = 0.0 ); + double gradient_magnitude_error(); + void compute_continuous_gradient() const; + + void compute_distance( stk::mesh::Entity n, + const double & deltaTime ) const; + void estimate_error(); + + // hack to dump facet list to exoii databse. + void facets_exoii(); + void facets_exoii(Faceted_Surface & cs); + + bool elem_on_interface(stk::mesh::Entity e) const; + + void snap_to_mesh() const; + bool remove_wall_features() const; + bool simple_remove_wall_features() const; + bool elem_has_field_data(const FieldRef &myField, const stk::mesh::Entity &elem) const; + double calc_elem_len_normal(const stk::mesh::Entity &elem, const stk::mesh::Entity &side, const FieldRef &coordinates_field) const; + + + //-------------------------------------------------------------------------------- + // queries + //-------------------------------------------------------------------------------- + + const std::string & get_distance_name() const { return my_distance_name; } + void set_distance_name( const std::string & distance_name ) { my_distance_name = distance_name; } + + const FieldRef & get_distance_field() const { return my_distance_field; } + void set_distance_field( const FieldRef & ref ) { my_distance_field = ref; } + + const FieldRef & get_old_distance_field() const { return my_old_distance_field; } + void set_old_distance_field( const FieldRef & ref ) { my_old_distance_field = ref; } + + void set_extension_velocity( const Vector3d & extension_velocity ) { my_extension_velocity = extension_velocity; } + const Vector3d & get_extension_velocity() const { return my_extension_velocity; } + + const FieldRef & get_coordinates_field() const { return my_coordinates_field; } + + const std::string & get_isovar_name() const { return my_isovar_name; } + + const std::string & get_composite_name() const { return my_composite_name; } + void set_composite_name( const std::string & composite_name ) { + my_composite_name = composite_name; + std::transform(my_composite_name.begin(), my_composite_name.end(), my_composite_name.begin(), ::toupper); + } + + const FieldRef & get_isovar_field() const { return my_isovar_field; } + void set_isovar_field( const FieldRef & ref ) { my_isovar_field = ref; } + + double get_time_of_arrival_speed(stk::mesh::Entity elem, ParallelErrorMessage& err) const; + + void set_isovar(const std::string & isovar_name, const double isoval) { my_isovar_name = isovar_name; my_threshold = isoval; trackIsoSurface = true; } + const double & get_isoval() const { return my_threshold; } + + bool get_reinitialize_every_step() const { return my_needs_reinitialize_every_step; } + void set_reinitialize_every_step(const bool reinit) { set_keep_IC_surfaces(); my_needs_reinitialize_every_step = true; } + + Redistance_Method get_redistance_method() const { return my_redistance_method; } + void set_redistance_method( const Redistance_Method type ) { my_redistance_method = type; } + void set_time_of_arrival_element_speed_field_name( const std::string & time_of_arrival_speed_field_name) { my_time_of_arrival_element_speed_field_name = time_of_arrival_speed_field_name; } + void set_time_of_arrival_block_speed(const std::string & blockName, const double blockSpeed); + Faceted_Surface & get_facets() { return *facets; } + const Faceted_Surface & get_facets() const { return *facets; } + + static std::vector the_levelSet_names; + static LevelSet_Identifier get_identifier(const std::string & name); + static std::string & get_name(const LevelSet_Identifier identifier) { ThrowAssert(identifier.get() < the_levelSet_names.size()); return the_levelSet_names[identifier.get()]; } + + void narrow_band_multiplier( double multiplier ) { my_narrow_band_multiplier = multiplier; } + const double & narrow_band_size() const { return my_narrow_band_size; } + void narrow_band_size( double size ) { my_narrow_band_size = size; } // publicly deprecated, make private + + void max_feature_size( double size ) { my_max_feature_size= size; } + void use_simple_remove_feature( bool is_simple ) {my_use_simple_remove_feature = is_simple; } + + double max_feature_size() { return my_max_feature_size; } + bool use_simple_remove_feature() { return my_use_simple_remove_feature; } + + void set_surface_parts_vector(); + + void set_ic_offset (const double offset) { + my_ic_offset = offset; + } + void set_ic_scale (const double scale) { + my_ic_scale = scale; + } + void perform_initial_redistance(const bool flag) { + my_perform_initial_redistance = flag; + } + + void set_keep_IC_surfaces() { my_keep_IC_surfaces = true; } + bool get_keep_IC_surfaces() const { return my_keep_IC_surfaces; } + + static bool sign_change( double f1, double f2 ) { + return ( (f1 < 0.) ? (f2 >= 0.) : (f2 < 0.) ); // GOMA sign convention + //return ( (f1 > 0.) ? (f2 <= 0.) : (f2 > 0.) ); // Marching cubes sign convention + } + + static int sign( double f ) { + return ( (f < 0.) ? -1 : 1 ); // GOMA sign convention + //return ( (f > 0.) ? 1 : -1 ); // Marching cubes sign convention + } + + const std::vector & get_compute_surface_distance_parts() const { return my_compute_surface_distance_parts; } + std::vector & get_compute_surface_distance_parts() { return my_compute_surface_distance_parts; } + void set_surface_distance(std::vector surfaces, const double in_distance); + void compute_surface_distance(const double narrowBandSize=0.0, const double farFieldValue=0.0); + static void initialize(stk::mesh::MetaData & meta, const bool requires_additional_initialization); + void initialize(const double time = 0.0, const bool requires_additional_initialization = false); + void redistance(); + void redistance(const stk::mesh::Selector & selector); + void fast_marching_redistance(const stk::mesh::Selector & selector, const bool compute_time_of_arrival = false); + + void set_initial_volume(const double v) { my_initial_neg_vol = v; } + double constrained_redistance(const bool use_initial_vol = false); + + void compute_nodal_bbox( const stk::mesh::Selector & selector, + BoundingBox & node_bbox, + const Vector3d & displacement = Vector3d::ZERO ) const; + + double find_redistance_correction( const double start_area, + const double start_neg_vol, + const double start_pos_vol, + const int max_iterations = 100, + const double tol = 1.e-6 ); + + bool has_IC_surfaces(); + BoundingBox get_IC_surface_bounding_box(); + IC_Alg& get_IC_alg(); + + static LevelSet & build(stk::mesh::MetaData & in_meta, const std::string & ls_name, stk::diag::Timer & parent_timer); + + virtual ~LevelSet(); + +private: + LevelSet(stk::mesh::MetaData & in_meta, const std::string & in_name, stk::diag::Timer & parent_timer); + +private: + stk::mesh::MetaData & my_meta; + AuxMetaData & my_aux_meta; + const LevelSet_Identifier my_identifier; + const std::string my_name; + mutable stk::diag::Timer my_parent_timer; + mutable stk::diag::Timer my_timer; + +public: + const unsigned spatial_dimension; + +private: + + FieldRef my_coordinates_field; + FieldRef my_distance_field; + FieldRef my_old_distance_field; + FieldRef my_isovar_field; + FieldRef myTimeOfArrivalElementSpeedField; + + std::string my_distance_name; + std::string my_isovar_name; + + std::string my_composite_name; + + double my_narrow_band_multiplier; + double my_narrow_band_size; + + double my_max_feature_size; + bool my_use_simple_remove_feature = false; + + + double my_ic_offset; + double my_ic_scale; + bool my_perform_initial_redistance; + bool my_keep_IC_surfaces; + + double my_threshold; + Redistance_Method my_redistance_method; + std::string my_time_of_arrival_element_speed_field_name; + std::map myTimeOfArrivalBlockSpeedsByName; + std::vector myTimeOfArrivalBlockSpeeds; + + std::unique_ptr my_IC_alg; + + // vector of previous facets + std::unique_ptr facets_old; + + // vector of current facets + std::unique_ptr facets; + + Vector3d my_extension_velocity; + const double epsilon; + + bool trackIsoSurface; + + // used to increment file name for facet exoii database hack + int my_facetFileIndex; + + double my_initial_neg_vol; + + bool my_needs_reinitialize_every_step; + + std::vector my_compute_surface_distance_parts; + std::vector my_surface_parts; + + + void set_distance(const double & distance) const; + void increment_distance(const double increment, const bool enforce_sign = false) const; + void scale_distance(const double scale) const; + void negate_distance() const; + + void time_integrate(const double deltaTime); + + void prepare_to_compute_distance( const double & deltaTime, const stk::mesh::Selector & selector ); + + void compute_distance_semilagrangian(const double & deltaTime, const stk::mesh::Selector & selector ); + + double distance( const Vector3d & x, + const int previous_sign, + const bool enforce_sign ) const; + + bool compute_time_of_arrival() const { return !my_time_of_arrival_element_speed_field_name.empty() || !myTimeOfArrivalBlockSpeeds.empty(); } +}; + +class LevelSetManager { +public: + LevelSetManager() {} + LevelSetManager(LevelSetManager const&) = delete; + LevelSetManager& operator=(LevelSetManager const&) = delete; + + static LevelSetManager & get(stk::mesh::MetaData & meta); + static LevelSetManager & get(const stk::mesh::MetaData & meta); + + int numberLevelSets() const { return my_level_sets.size(); } + LevelSet & levelSet(const unsigned ordinal) const { ThrowAssert(ordinal < my_level_sets.size()); return *my_level_sets[ordinal]; } + bool has_levelSet(const std::string & ls_name) const; + void add(LevelSet * ls) { my_level_sets.emplace_back(ls); } + + std::vector< std::unique_ptr >::const_iterator begin() const { return my_level_sets.begin(); } + std::vector< std::unique_ptr >::const_iterator end() const { return my_level_sets.end(); } + + void set_current_coordinates(FieldRef current_coords) { my_current_coordinates = current_coords; } + FieldRef get_current_coordinates() const { return my_current_coordinates; } +private: + std::vector< std::unique_ptr > my_level_sets; + FieldRef my_current_coordinates; +}; + +std::string print_sizes(const LevelSet & ls); + +} // namespace krino + +#endif // Akri_LevelSet_h diff --git a/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.cpp b/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.cpp new file mode 100644 index 000000000000..9f2cfdda6005 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.cpp @@ -0,0 +1,931 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +std::unique_ptr create_element_cutter_with_error_handling(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::vector & elementParentEdges, + const std::vector & areParentEdgesAreOrientedSameAsElementEdges, + const Phase_Support & phaseSupport, + const std::function &)> & intersectingPlanesDiagonalPicker) +{ + if (krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "Building cutting planes for element global_id=" << mesh.identifier(element) << "\n"; + + stk::topology elementTopology = mesh.bucket(element).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + const bool oneLSPerPhase = phaseSupport.has_one_levelset_per_phase(); + + std::unique_ptr cutter; + + try + { + cutter = create_element_cutter(oneLSPerPhase, masterElement, elementParentEdges, areParentEdgesAreOrientedSameAsElementEdges, intersectingPlanesDiagonalPicker); + } + catch(const std::exception & err) + { + krinolog << "Error constructing cutting surfaces for Mesh_Element " << mesh.identifier(element) << stk::diag::push << stk::diag::dendl; + for(unsigned i=0; i < elementParentEdges.size(); ++i) + { + krinolog << "Edge " << i; + if(elementParentEdges[i]) { + krinolog << " node ids = "; + for(auto && node : elementParentEdges[i]->get_nodes()) krinolog << mesh.identifier(node) << " "; + krinolog << stk::diag::push << stk::diag::dendl; + krinolog << *elementParentEdges[i] << stk::diag::pop << stk::diag::dendl; + } + else + { + krinolog << " No parent edge." << stk::diag::dendl; + } + } + krinolog << stk::diag::pop << stk::diag::dendl; + krinolog << err.what() << stk::diag::dendl; + throw err; + } + + return cutter; +} + +LevelSetElementCutter::LevelSetElementCutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const ParentEdgeMap & parentEdges, + const Phase_Support & phaseSupport, + const std::function &)> & intersectingPlanesDiagonalPicker) +{ + fill_element_parent_edges(mesh, element, parentEdges, myParentEdges, myParentEdgesAreOrientedSameAsElementEdges); + myElementInterfaceCutter = create_element_cutter_with_error_handling(mesh, element, myParentEdges, myParentEdgesAreOrientedSameAsElementEdges, phaseSupport, intersectingPlanesDiagonalPicker); +} + +std::string LevelSetElementCutter::visualize(const stk::mesh::BulkData & mesh) const +{ + std::ostringstream os; + + std::vector interiorIntersections; + myElementInterfaceCutter->fill_interior_intersections(interiorIntersections); + + os << "Interior intersections " << interiorIntersections.size() << ": \n"; + for (auto && intersection : interiorIntersections) + { + os << "Interior intersection at " << intersection.parametricCoords << " with domains { "; + for (int domain : intersection.sortedDomains) os<< domain << " "; + os << "}\n"; + } + + os << "Parent edges: \n"; + for (auto && edge : myParentEdges) + { + os << "Edge with nodes " << mesh.identifier(edge->get_parent_nodes().first) << " and " << mesh.identifier(edge->get_parent_nodes().second) << ":\n"; + if (edge) os << *edge; + } + + os << myElementInterfaceCutter->visualize() << "\n"; + + return os.str(); +} + +std::unique_ptr LevelSetInterfaceGeometry::build_element_cutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::function &)> & intersectingPlanesDiagonalPicker) const +{ + std::unique_ptr cutter; + cutter.reset( new LevelSetElementCutter(mesh, element, myParentEdges, myPhaseSupport, intersectingPlanesDiagonalPicker) ); + return cutter; +} + +PhaseTag LevelSetInterfaceGeometry::get_starting_phase(const ElementCutter * cutter) const +{ + const LevelSetElementCutter * LSCutter = dynamic_cast(cutter); + ThrowRequire(LSCutter); + return LSCutter->get_starting_phase(myCdfemSupport, myPhaseSupport); +} + +PhaseTag LevelSetElementCutter::get_starting_phase(const CDFEM_Support & cdfemSupport, const Phase_Support & phaseSupport) const +{ + PhaseTag phase; + + // For elements with no interfaces, this will be the uncrossed phase of the mesh element. + // For elements with interface, this is the starting phase that will be inherited by the + // subelements and then incrementally updated as we process the interfaces. + if (cdfemSupport.num_ls_fields() > 1 && Phase_Support::has_one_levelset_per_phase()) + { + int LSphase = myElementInterfaceCutter->get_starting_phase_for_cutting_surfaces(); + if (LSphase == -1) + { + const auto & phasesPresent = get_phases_present_on_edges(myParentEdges); + ThrowRequire(!phasesPresent.empty() && (myElementInterfaceCutter->get_num_cutting_surfaces() > 0 || 1 == phasesPresent.size())); + LSphase = *phasesPresent.begin(); + } + phase.add(cdfemSupport.ls_field(LSphase).identifier, -1); + } + else + { + const int num_ls = cdfemSupport.num_ls_fields(); + for(int ls_index=0; ls_index < num_ls; ++ls_index) + { + const InterfaceID interface(ls_index,ls_index); + int sign = 0; + bool shouldSetPhase = false; + for(auto && edge : myParentEdges) + { + if (edge) + { + shouldSetPhase = true; + if (edge->have_crossing(InterfaceID(ls_index,ls_index))) + { + shouldSetPhase = false; + break; + } + else + sign = edge->get_crossing_sign(interface); + } + } + if (shouldSetPhase) + phase.add(cdfemSupport.ls_field(ls_index).identifier, sign); + } + } + + return phase; +} + +static std::vector find_next_phase_candidates(const std::vector & interfaces, + const std::vector & pathSoFar) +{ + const int currentPhase = pathSoFar.back(); + std::vector nextPhaseCandidates; + for (auto && interface : interfaces) + { + if (interface.first_ls() == currentPhase) + { + if (std::find(pathSoFar.begin(), pathSoFar.end(), interface.second_ls()) == pathSoFar.end()) + nextPhaseCandidates.push_back(interface.second_ls()); + } + else if (interface.second_ls() == currentPhase) + { + if (std::find(pathSoFar.begin(), pathSoFar.end(), interface.first_ls()) == pathSoFar.end()) + nextPhaseCandidates.push_back(interface.first_ls()); + } + } + return nextPhaseCandidates; +} + +static std::vector shortest_path_to_end(const std::vector & pathSoFar, + const std::vector & interfaces, + const std::set & endPhases) +{ + if (endPhases.count(pathSoFar.back()) > 0) + return pathSoFar; + + const std::vector nextPhaseCandidates = find_next_phase_candidates(interfaces, pathSoFar); + if (nextPhaseCandidates.empty()) + { + return {}; + } + + std::vector shortestPath; + size_t shortestPathSize = std::numeric_limits::max(); + for (int nextPhase : nextPhaseCandidates) + { + std::vector path = pathSoFar; + path.push_back(nextPhase); + const auto fullPath = shortest_path_to_end(path, interfaces, endPhases); + if (!fullPath.empty() && fullPath.size() < shortestPathSize) + { + shortestPath = fullPath; + shortestPathSize = fullPath.size(); + } + } + return shortestPath; +} + +std::vector shortest_path_from_begin_to_end(const std::vector & interfaces, + const int beginPhase, + const std::set & endPhases) +{ + std::vector startPath; + startPath.push_back(beginPhase); + return shortest_path_to_end(startPath, interfaces, endPhases); +} + +static bool captures_interface(const std::vector * sortedDomains, const InterfaceID & interface) +{ + if (sortedDomains == nullptr) + return false; + if (interface.first_ls() == interface.second_ls()) + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(*sortedDomains, {interface.first_ls()}); + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(*sortedDomains, {interface.first_ls(),interface.second_ls()}); +} + +static bool interface_has_uncaptured_edge_intersection(const LevelSetElementCutter & cutter, + const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + const InterfaceID & interface) +{ + ThrowRequire(elemNodesCoords.size() == 4 || elemNodesCoords.size() == 3); + const stk::topology topology = (elemNodesCoords.size() == 4)? stk::topology::TETRAHEDRON_4 : stk::topology::TRIANGLE_3_2D; + + const unsigned numEdges = topology.num_edges(); + for(unsigned i=0; i < numEdges; ++i) + { + const unsigned * edgeNodeOrdinals = get_edge_node_ordinals(topology, i); + const int n0 = edgeNodeOrdinals[0]; + const int n1 = edgeNodeOrdinals[1]; + if (!captures_interface(elemNodesSnappedDomains[n0], interface) && !captures_interface(elemNodesSnappedDomains[n1], interface)) + { + const Segment3d edge(elemNodesCoords[n0], elemNodesCoords[n1]); + if (cutter.have_crossing(interface, edge)) + return true; + } + } + return false; +} + +static std::vector +get_sorted_cutting_interfaces_with_uncaptured_intersections(const LevelSetElementCutter & cutter, + const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains) +{ + std::set interfacesWithUncapturedCrossings; + for (auto && interface : cutter.get_sorted_cutting_interfaces()) + if (interface_has_uncaptured_edge_intersection(cutter, elemNodesCoords, elemNodesSnappedDomains, interface)) + interfacesWithUncapturedCrossings.insert(interface); + + cutter.add_interfaces_with_uncaptured_intersection_within_element(elemNodesCoords, elemNodesSnappedDomains, interfacesWithUncapturedCrossings); + + std::vector interfaces(interfacesWithUncapturedCrossings.begin(), interfacesWithUncapturedCrossings.end()); + return interfaces; +} + +static int get_interface_index(const std::vector & sortedInterfaces, const InterfaceID interface) +{ + const auto iter = std::lower_bound(sortedInterfaces.begin(), sortedInterfaces.end(), interface); + return std::distance(sortedInterfaces.begin(), iter); +} + +static Vector3d get_centroid(const std::vector & elemNodesCoords) +{ + Vector3d centroid = Vector3d::ZERO; + for(auto && nodeCoords : elemNodesCoords) + { + centroid += nodeCoords; + } + centroid *= 1./elemNodesCoords.size(); + return centroid; +} + +std::vector +LevelSetElementCutter::get_interface_signs_based_on_crossings(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains) const +{ + const auto allInterfaces = get_sorted_cutting_interfaces(); + std::vector interfaceSigns(allInterfaces.size(), 0); + + const auto intersectingInterfaces = get_sorted_cutting_interfaces_with_uncaptured_intersections(*this, elemNodesCoords, elemNodesSnappedDomains); + const Vector3d centroid = get_centroid(elemNodesCoords); + + const bool oneLSPerPhase = Phase_Support::has_one_levelset_per_phase(); + if (oneLSPerPhase) + { + std::set subPhases; + const int ownerStartPhase = get_starting_phase_for_cutting_surfaces(); + + for (auto && interface : allInterfaces) + { + if (std::binary_search(intersectingInterfaces.begin(), intersectingInterfaces.end(), interface)) + { + subPhases.insert(interface.first_ls()); + subPhases.insert(interface.second_ls()); + } + else + { + interfaceSigns[get_interface_index(allInterfaces, interface)] = -2; + } + } + if (subPhases.empty()) + { + subPhases.insert(myElementInterfaceCutter->get_ls_per_interface_phase_at_location(centroid)); + } + + if (subPhases.count(ownerStartPhase) == 0) + { + std::vector fixPath = shortest_path_from_begin_to_end(allInterfaces, ownerStartPhase, subPhases); + ThrowRequireMsg(!fixPath.empty(), "Cannot fix starting phase."); + for (unsigned i=1; i fixPath[i-1]) ? 1 : -1; + interfaceSigns[get_interface_index(allInterfaces, interface)] = sign; + } + } + } + else + { + for (auto && interface : allInterfaces) + if (!std::binary_search(intersectingInterfaces.begin(), intersectingInterfaces.end(), interface)) + interfaceSigns[get_interface_index(allInterfaces, interface)] = sign_at_position(interface, centroid); + } + + return interfaceSigns; +} + +void LevelSetElementCutter::update_edge_crossings(const unsigned iEdge, const std::vector> & nodesIsovar) +{ + ThrowRequire(iEdge < myParentEdges.size()); + CDFEM_Parent_Edge * parentEdge = const_cast(myParentEdges[iEdge]); + ThrowRequire(parentEdge); + if (myParentEdgesAreOrientedSameAsElementEdges[iEdge]) + { + parentEdge->find_crossings(nodesIsovar); + } + else + { + const std::vector> orientedIsovar = {nodesIsovar[1], nodesIsovar[0]}; + parentEdge->find_crossings(orientedIsovar); + } +} + +static std::function &)> +temporary_build_always_true_diagonal_picker() +{ + auto diagonalPicker = + [](const std::array & faceNodes) + { + return true; + }; + return diagonalPicker; +} + +typedef std::function ParentEdgeFilter; + +static ParentEdgeFilter keep_owned_edges_filter(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & parentElementSelector) +{ + const auto filter = [&mesh, &parentElementSelector](const CDFEM_Parent_Edge & edge) + { + const std::pair edgeNodes = edge.get_parent_nodes(); + std::vector edgeElems; + stk::mesh::get_entities_through_relations(mesh, {edgeNodes.first, edgeNodes.second}, stk::topology::ELEMENT_RANK, edgeElems); + { + bool foundOwnedElement = false; + for (auto && edgeElem : edgeElems) + if (parentElementSelector(mesh.bucket(edgeElem)) && mesh.parallel_owner_rank(edgeElem) == mesh.parallel_rank()) + foundOwnedElement = true; + ThrowRequire(foundOwnedElement); + } + const int parallelRank = mesh.parallel_rank(); // Assumes local proc owns at least one selected element of edge + for (auto && edgeElem : edgeElems) + if (mesh.parallel_owner_rank(edgeElem) < parallelRank && parentElementSelector(mesh.bucket(edgeElem))) + return false; + return true; + }; + return filter; +} + +static ParentEdgeFilter keep_all_edges_filter() +{ + const auto filter = [](const CDFEM_Parent_Edge & edge) + { + return true; + }; + return filter; +} + +static void append_intersection_points_from_filtered_parent_edges(std::vector & intersectionPoints, + const ParentEdgeMap & parentEdges, + const IntersectionPointFilter & intersectionPointFilter, + const ParentEdgeFilter edgeFilter) +{ + const bool intersectionPointIsOwned = true; + std::vector intersectionPointSortedDomains; + for (auto && mapEntry : parentEdges) + { + const CDFEM_Parent_Edge & edge = mapEntry.second; + const auto & edgeCrossings = edge.get_crossings(); + if (!edgeCrossings.empty() && edgeFilter(edge)) + { + const std::pair edgeNodes = edge.get_parent_nodes(); + for (auto & crossing : edgeCrossings) + { + const InterfaceID & interface = crossing.first; + const double location = crossing.second; + interface.fill_sorted_domains(intersectionPointSortedDomains); + std::vector intersectionPointNodes{edgeNodes.first, edgeNodes.second}; + if (intersectionPointFilter(intersectionPointNodes, intersectionPointSortedDomains)) + intersectionPoints.emplace_back(intersectionPointIsOwned, intersectionPointNodes, std::vector{1.-location, location}, intersectionPointSortedDomains); + } + } + } +} + +static void append_intersection_points_from_owned_parent_edges(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & parentElementSelector, + std::vector & intersectionPoints, + const ParentEdgeMap & parentEdges, + const IntersectionPointFilter & intersectionPointFilter) +{ + append_intersection_points_from_filtered_parent_edges(intersectionPoints, parentEdges, intersectionPointFilter, keep_owned_edges_filter(mesh, parentElementSelector)); +} + +static void append_intersection_points_from_all_parent_edges(std::vector & intersectionPoints, + const ParentEdgeMap & parentEdges, + const IntersectionPointFilter & intersectionPointFilter) +{ + append_intersection_points_from_filtered_parent_edges(intersectionPoints, parentEdges, intersectionPointFilter, keep_all_edges_filter()); +} + +LevelSetInterfaceGeometry::LevelSetInterfaceGeometry(const stk::mesh::MetaData & meta) +: LevelSetInterfaceGeometry(AuxMetaData::get(meta).active_part(), CDFEM_Support::get(meta), Phase_Support::get(meta)) {} + +void LevelSetInterfaceGeometry::prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + myParentsToChildMapper.build_map(mesh, myActivePart, myCdfemSupport, myPhaseSupport); + const auto should_build_linearized_edge = build_no_linearized_edges_function(); + myParentEdges = build_parent_edges(mesh, myParentsToChildMapper, should_build_linearized_edge, myActivePart, myCdfemSupport, myPhaseSupport); +} + +void LevelSetInterfaceGeometry::prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const std::vector & elementsToIntersect, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + myParentsToChildMapper.build_map(mesh, myActivePart, myCdfemSupport, myPhaseSupport); + const auto should_build_linearized_edge = build_no_linearized_edges_function(); + myParentEdges = build_parent_edges_using_elements(mesh, myParentsToChildMapper, should_build_linearized_edge, elementsToIntersect, myActivePart, myCdfemSupport, myPhaseSupport); +} + +std::vector LevelSetInterfaceGeometry::get_edge_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + std::vector intersectionPoints; + prepare_to_process_elements(mesh, nodesToCapturedDomains); + const IntersectionPointFilter intersectionPointFilter = keep_all_intersection_points_filter(); + append_intersection_points_from_all_parent_edges(intersectionPoints, myParentEdges, intersectionPointFilter); + return intersectionPoints; +} + +void LevelSetInterfaceGeometry::append_element_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const std::vector & elementsToIntersect, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) const +{ + const stk::mesh::Selector parentElementSelector = get_parent_element_selector(myActivePart, myCdfemSupport, myPhaseSupport); + prepare_to_process_elements(mesh, elementsToIntersect, nodesToCapturedDomains); + append_intersection_points_from_owned_parent_edges(mesh, parentElementSelector, intersectionPoints, myParentEdges, intersectionPointFilter); + append_intersection_points_from_within_elements_and_owned_faces(mesh, parentElementSelector, elementsToIntersect, *this, intersectionPointFilter, intersectionPoints); +} + +static int get_domain_for_uncut_element(const stk::mesh::BulkData & mesh, + const stk::mesh::Entity element, + const std::vector & elementParentEdges, + const bool oneLSPerPhase) +{ + if (oneLSPerPhase) + { + const auto edgePhases = get_phases_present_on_edges_and_interior(elementParentEdges); + if (edgePhases.size() == 1) + return *edgePhases.begin(); + } + return -1; +} + +void LevelSetInterfaceGeometry::store_phase_for_uncut_elements(const stk::mesh::BulkData & mesh) const +{ + std::vector elementsToIntersect; + stk::mesh::get_entities( mesh, stk::topology::ELEMENT_RANK, elementsToIntersect, false); + + myParentsToChildMapper.build_map(mesh, myActivePart, myCdfemSupport, myPhaseSupport); + const auto linearize_all_edges = build_all_linearized_edges_function(); + ParentEdgeMap parentEdges = build_parent_edges_using_elements(mesh, myParentsToChildMapper, linearize_all_edges, elementsToIntersect, myActivePart, myCdfemSupport, myPhaseSupport); + + const bool oneLSPerPhase = myCdfemSupport.num_ls_fields() > 1 && Phase_Support::has_one_levelset_per_phase(); + std::vector elementParentEdges; + std::vector areParentEdgesOrientedSameAsElementEdges; + + const std::vector parentElements = get_owned_parent_elements(mesh, myActivePart, myCdfemSupport, myPhaseSupport); + for (auto element : parentElements) + { + fill_element_parent_edges(mesh, element, parentEdges, elementParentEdges, areParentEdgesOrientedSameAsElementEdges); + const int elementDomain = get_domain_for_uncut_element(mesh, + element, + elementParentEdges, + oneLSPerPhase); + if (elementDomain >= 0) + myUncutElementPhases[element] = elementDomain; + } +} + +static NodeToCapturedDomainsMap store_and_communicate_new_snap_node_domains(const stk::mesh::BulkData & mesh, const std::vector & intersectionPoints, const std::vector & snapInfos) +{ + std::vector snapNodes; + NodeToCapturedDomainsMap newSnapnodesToCapturedDomains; + for (auto && snapInfo : snapInfos) + { + if (snapInfo.get_owner() == mesh.parallel_rank()) + { + const size_t intersectionPointIndex = snapInfo.get_intersection_point_index(); + stk::mesh::Entity snapNode = mesh.get_entity(stk::topology::NODE_RANK, snapInfo.get_node_global_id()); + snapNodes.push_back(snapNode); + const IntersectionPoint & intersectionPoint = intersectionPoints[intersectionPointIndex]; + + newSnapnodesToCapturedDomains[snapNode] = intersectionPoint.get_sorted_domains(); + } + } + + communicate_node_captured_domains_for_given_nodes(mesh, snapNodes, newSnapnodesToCapturedDomains); + + return newSnapnodesToCapturedDomains; +} + +static std::vector get_node_parametric_coords_after_snapping(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const Vector3d snapNodeLocation) +{ + stk::topology elementTopology = mesh.bucket(element).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + const double * elemNodeParamCoords = masterElement.nodal_parametric_coordinates(); + const int dim = mesh.mesh_meta_data().spatial_dimension(); + const StkMeshEntities elementNodes{mesh.begin_nodes(element), mesh.end_nodes(element)}; + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + + std::vector nodeLocations; + fill_element_node_coordinates(mesh, element, coordsField, nodeLocations); + + std::vector nodesCoords; + for (unsigned n=0; n= baseShapeFcn) + return 1.; + return baseShapeFcn/(baseShapeFcn-shapeFcn); +} + +static Vector3d find_point_within_deformed_and_undeformed_tet(const std::vector & deformedElementParamCoords, + const int lnn) +{ + stk::topology topology = stk::topology::TETRAHEDRON_4; + std::array permutations{0, 1, 2, 4}; + std::array permuteNodes; + topology.permutation_node_ordinals(permutations[lnn], permuteNodes.data()); + ThrowAssert(permuteNodes[0] == lnn); + const Vector3d & pt = deformedElementParamCoords[lnn]; + const Vector3d oppositePt = 1./3.*(deformedElementParamCoords[permuteNodes[1]] + deformedElementParamCoords[permuteNodes[2]] + deformedElementParamCoords[permuteNodes[3]]); + double fraction = 1.0; + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(pt[0], oppositePt[0])); + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(pt[1], oppositePt[1])); + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(pt[2], oppositePt[2])); + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(1.-pt[0]-pt[1]-pt[2], 1.-oppositePt[0]-oppositePt[1]-oppositePt[2])); + const double centroidWt = 0.25*fraction; + return centroidWt*pt + (1.-centroidWt)*oppositePt; +} + +static Vector3d find_point_within_deformed_and_undeformed_tri(const std::vector & deformedElementParamCoords, + const int lnn) +{ + stk::topology topology = stk::topology::TRIANGLE_3_2D; + std::array permutations{0, 2, 1}; + std::array permuteNodes; + topology.permutation_node_ordinals(permutations[lnn], permuteNodes.data()); + ThrowAssert(permuteNodes[0] == lnn); + const Vector3d & pt = deformedElementParamCoords[lnn]; + const Vector3d oppositePt = 0.5*(deformedElementParamCoords[permuteNodes[1]] + deformedElementParamCoords[permuteNodes[2]]); + double fraction = 1.0; + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(pt[0], oppositePt[0])); + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(pt[1], oppositePt[1])); + fraction = std::min(fraction, truncate_to_maintain_positive_shape_function(1.-pt[0]-pt[1], 1.-oppositePt[0]-oppositePt[1])); + const double centroidWt = 1./3.*fraction; + return centroidWt*pt + (1.-centroidWt)*oppositePt; +} + +static int get_node_of_element(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + stk::mesh::Entity node) +{ + const StkMeshEntities elementNodes{mesh.begin_nodes(element), mesh.end_nodes(element)}; + for (unsigned n=0; n & deformedElementParamCoords) +{ + const int lnn = get_node_of_element(mesh, element, snapNode); + + stk::topology elementTopology = mesh.bucket(element).topology(); + if (elementTopology.base() == stk::topology::TETRAHEDRON_4) + return find_point_within_deformed_and_undeformed_tet(deformedElementParamCoords, lnn); + ThrowRequire(elementTopology.base() == stk::topology::TRIANGLE_3_2D); + return find_point_within_deformed_and_undeformed_tri(deformedElementParamCoords, lnn); +} + +static std::vector*> get_node_snap_domains(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const std::vector & snapNodeDomains, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + const StkMeshEntities elementNodes{mesh.begin_nodes(element), mesh.end_nodes(element)}; + std::vector*> nodeDomains; + nodeDomains.reserve(elementNodes.size()); + for (auto node : StkMeshEntities{mesh.begin_nodes(element), mesh.end_nodes(element)}) + { + if (node == snapNode) + { + nodeDomains.push_back(&snapNodeDomains); + } + else + { + const auto iter = nodesToCapturedDomains.find(node); + if (iter == nodesToCapturedDomains.end()) + nodeDomains.push_back(nullptr); + else + nodeDomains.push_back(&(iter->second)); + } + } + + return nodeDomains; +} + +static bool domain_is_common_to_all_entities(const int domain, const std::vector*> & entitiesDomains) +{ + for (auto && domains : entitiesDomains) + if (!std::binary_search(domains->begin(), domains->end(), domain)) + return false; + return true; +} + +static std::set get_common_domains(std::vector*> entitiesDomains) +{ + std::set commonDomains; + + if (entitiesDomains.empty()) + return commonDomains; + + for (auto & entityDomains : entitiesDomains) + if (!entityDomains) + return commonDomains; + + for (int domain : *entitiesDomains[0]) + if (domain_is_common_to_all_entities(domain, entitiesDomains)) + commonDomains.insert(domain); + + return commonDomains; +} + +static bool will_have_uncaptured_edge_intersection_after_snapping(const Element_Cutter & cutter, stk::topology elementTopology, const std::vector nodeCoords, + const std::vector*> & nodeDomains) +{ + std::vector interfacesWithCuttingSurface; + cutter.fill_interfaces_with_cutting_surface(interfacesWithCuttingSurface); + + const unsigned numEdges = elementTopology.num_edges(); + for(unsigned i=0; i < numEdges; ++i) + { + const unsigned * edgeNodeOrdinals = get_edge_node_ordinals(elementTopology(), i); + const std::vector* node0Domains = nodeDomains[edgeNodeOrdinals[0]]; + const std::vector* node1Domains = nodeDomains[edgeNodeOrdinals[1]]; + + for (auto && interface : interfacesWithCuttingSurface) + { + if (!captures_interface(node0Domains, interface) && !captures_interface(node1Domains, interface)) + { + const Segment3d edge(nodeCoords[edgeNodeOrdinals[0]], nodeCoords[edgeNodeOrdinals[1]]); + if (cutter.have_crossing(interface, edge)) + return true; + } + } + } + return false; +} + +static int get_domain_of_element_if_it_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper parentsToChildMapper, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const Vector3d & snapNodeLocation, + const std::vector*> & elementNodeDomains) +{ + const auto diagonalPicker = temporary_build_always_true_diagonal_picker(); + const bool oneLSPerPhase = true; + + ParentEdgeMap parentEdges = build_parent_edges_using_elements(mesh, parentsToChildMapper, build_all_linearized_edges_function(), {element}, activePart, cdfemSupport, phaseSupport); + if (parentEdges.empty()) + return -1; // not parent element + + std::vector elementParentEdges; + std::vector areParentEdgesOrientedSameAsElementEdges; + fill_element_parent_edges(mesh, element, parentEdges, elementParentEdges, areParentEdgesOrientedSameAsElementEdges); + + const auto edgePhases = get_phases_present_on_edges_and_interior(elementParentEdges); + if (edgePhases.size() == 1) + return *edgePhases.begin(); + + stk::topology elementTopology = mesh.bucket(element).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + std::unique_ptr elementCutter = create_element_cutter(oneLSPerPhase, masterElement, elementParentEdges, areParentEdgesOrientedSameAsElementEdges, diagonalPicker); + + const std::vector nodeParamCoordsAfterSnapping = get_node_parametric_coords_after_snapping(mesh, element, snapNode, snapNodeLocation); + if (!will_have_uncaptured_edge_intersection_after_snapping(*elementCutter, elementTopology, nodeParamCoordsAfterSnapping, elementNodeDomains)) + { + const Vector3d evaluationPt = find_point_within_deformed_and_undeformed_element(mesh, element, snapNode, nodeParamCoordsAfterSnapping); + return elementCutter->get_ls_per_interface_phase_at_location(evaluationPt); + } + + return -1; +} + +static int get_sign_of_uncrossed_edges(const InterfaceID interface, const std::vector & elementParentEdges) +{ + int uncrossedSign = 0; + for (auto && edge : elementParentEdges) + { + if (edge->have_crossing(interface)) + { + return 0; + } + else + { + const int edgeSign = edge->get_crossing_sign(interface); + if (edgeSign == -uncrossedSign) + return 0; + uncrossedSign = edgeSign; + } + } + return uncrossedSign; +} + +static int get_sign_of_element_if_it_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper parentsToChildMapper, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const Vector3d & snapNodeLocation, + const InterfaceID & interface) +{ + const auto diagonalPicker = temporary_build_always_true_diagonal_picker(); + const bool oneLSPerPhase = false; + + ParentEdgeMap parentEdges = build_parent_edges_using_elements(mesh, parentsToChildMapper, build_all_linearized_edges_function(), {element}, activePart, cdfemSupport, phaseSupport); + if (parentEdges.empty()) + return -1; // not parent element + + std::vector elementParentEdges; + std::vector areParentEdgesOrientedSameAsElementEdges; + fill_element_parent_edges(mesh, element, parentEdges, elementParentEdges, areParentEdgesOrientedSameAsElementEdges); + + const int uncrossedSign = get_sign_of_uncrossed_edges(interface, elementParentEdges); + if (uncrossedSign != 0) + return uncrossedSign; + + stk::topology elementTopology = mesh.bucket(element).topology(); + const MasterElement & masterElement = MasterElementDeterminer::getMasterElement(elementTopology); + std::unique_ptr elementCutter = create_element_cutter(oneLSPerPhase, masterElement, elementParentEdges, areParentEdgesOrientedSameAsElementEdges, diagonalPicker); + + const std::vector nodeParamCoordsAfterSnapping = get_node_parametric_coords_after_snapping(mesh, element, snapNode, snapNodeLocation); + const Vector3d evaluationPt = find_point_within_deformed_and_undeformed_element(mesh, element, snapNode, nodeParamCoordsAfterSnapping); + return elementCutter->sign_at_position(interface, evaluationPt); +} + +static void set_domains_for_element_if_it_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper parentsToChildMapper, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const std::vector & snapNodeDomains, + const Vector3d & snapNodeLocation, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + ElementToDomainMap & elementsToDomain ) +{ + auto iter = elementsToDomain.lower_bound(element); + if (iter == elementsToDomain.end() || iter->first != element) + { + const std::vector*> nodeDomains = get_node_snap_domains(mesh, element, snapNode, snapNodeDomains, nodesToCapturedDomains); + + const std::set commonDomains = get_common_domains(nodeDomains); + + int elementDomain = -1; + if (commonDomains.size() == 1) + { + elementDomain = *commonDomains.begin(); + } + else if (commonDomains.size() > 1) + { + elementDomain = get_domain_of_element_if_it_will_be_uncut_after_snapping(mesh, parentsToChildMapper, activePart, cdfemSupport, phaseSupport, element, snapNode, snapNodeLocation, nodeDomains); + } + + if (elementDomain >= 0) + elementsToDomain.emplace_hint(iter, element, elementDomain); + } +} + +static void set_sign_for_element_if_it_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const ParentsToChildMapper parentsToChildMapper, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport, + stk::mesh::Entity element, + stk::mesh::Entity snapNode, + const std::vector & snapNodeDomains, + const Vector3d & snapNodeLocation, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + ElementToDomainMap & elementsToDomain ) +{ + auto iter = elementsToDomain.lower_bound(element); + if (iter == elementsToDomain.end() || iter->first != element) + { + const std::vector*> nodeDomains = get_node_snap_domains(mesh, element, snapNode, snapNodeDomains, nodesToCapturedDomains); + + const std::set commonDomains = get_common_domains(nodeDomains); + + int elementSign = 0; + if (commonDomains.size() == 1) + { + const int lsIndex = *commonDomains.begin(); + const InterfaceID interface(lsIndex,lsIndex); + elementSign = get_sign_of_element_if_it_will_be_uncut_after_snapping(mesh, parentsToChildMapper, activePart, cdfemSupport, phaseSupport, element, snapNode, snapNodeLocation, interface); + } + + if (elementSign != 0) + elementsToDomain.emplace_hint(iter, element, elementSign); + } +} + +void LevelSetInterfaceGeometry::store_phase_for_elements_that_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + const std::vector & snapInfos, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const +{ + const bool oneLSPerPhase = myCdfemSupport.num_ls_fields() > 1 && Phase_Support::has_one_levelset_per_phase(); + if (!oneLSPerPhase && myCdfemSupport.num_ls_fields() > 1) + return; //FIXME: Fix for more than one ls per interface + + const NodeToCapturedDomainsMap newSnapnodesToCapturedDomains = store_and_communicate_new_snap_node_domains(mesh, intersectionPoints, snapInfos); + + for (auto && snapInfo : snapInfos) + { + stk::mesh::Entity snapNode = mesh.get_entity(stk::topology::NODE_RANK, snapInfo.get_node_global_id()); + const stk::math::Vector3d snapLocation = snapInfo.get_snap_location(); + const auto & newSnapNodeDomains = newSnapnodesToCapturedDomains.at(snapNode); + for (auto elem : StkMeshEntities{mesh.begin_elements(snapNode), mesh.end_elements(snapNode)}) + { + if (mesh.bucket(elem).owned() && mesh.bucket(elem).member(myActivePart)) + { + if (oneLSPerPhase) + set_domains_for_element_if_it_will_be_uncut_after_snapping(mesh, myParentsToChildMapper, myActivePart, myCdfemSupport, myPhaseSupport, elem, snapNode, newSnapNodeDomains, snapLocation, nodesToCapturedDomains, myUncutElementPhases); + else + set_sign_for_element_if_it_will_be_uncut_after_snapping(mesh, myParentsToChildMapper, myActivePart, myCdfemSupport, myPhaseSupport, elem, snapNode, newSnapNodeDomains, snapLocation, nodesToCapturedDomains, myUncutElementPhases); + } + } + } +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.hpp b/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.hpp new file mode 100644 index 000000000000..393c97c3e622 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LevelSetInterfaceGeometry.hpp @@ -0,0 +1,122 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_LEVELSETINTERFACEGEOMETRY_H_ +#define KRINO_INCLUDE_AKRI_LEVELSETINTERFACEGEOMETRY_H_ +#include +#include +#include +#include +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +class CDFEM_Support; +class Phase_Support; + +class LevelSetElementCutter : public ElementCutter +{ +public: + LevelSetElementCutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const ParentEdgeMap & parentEdges, + const Phase_Support & phaseSupport, + const std::function &)> & intersectingPlanesDiagonalPicker); + virtual ~LevelSetElementCutter() {} + + virtual bool might_have_interior_or_face_intersections() const override + { return myElementInterfaceCutter->get_num_cutting_surfaces() > 1; } + virtual void fill_interior_intersections(const ElementIntersectionPointFilter & intersectionPointFilter, std::vector & intersections) const override + { myElementInterfaceCutter->fill_interior_intersections(intersectionPointFilter, intersections); } + virtual std::vector get_sorted_cutting_interfaces() const override + { std::vector interfaces; myElementInterfaceCutter->fill_interfaces_with_cutting_surface(interfaces); return interfaces; } + virtual std::vector get_interface_signs_based_on_crossings(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains) const override; + virtual void fill_tetrahedron_face_interior_intersections(const std::array & faceNodes, + const InterfaceID & interface1, + const InterfaceID & interface2, + const ElementIntersectionPointFilter & intersectionPointFilter, + std::vector & intersections) const override + { myElementInterfaceCutter->fill_tetrahedron_face_interior_intersections(faceNodes, interface1, interface2, intersectionPointFilter, intersections); } + virtual std::string visualize(const stk::mesh::BulkData & mesh) const override; + virtual bool have_crossing(const InterfaceID interface, const Segment3d & edge) const override + { return myElementInterfaceCutter->have_crossing(interface, edge); } + virtual double interface_crossing_position(const InterfaceID interface, const Segment3d & edge) const override + { return myElementInterfaceCutter->interface_crossing_position(interface, edge); } + virtual int sign_at_position(const InterfaceID interface, const Vector3d & paramCoords) const override + { return myElementInterfaceCutter->sign_at_position(interface, paramCoords); } + virtual int get_starting_phase_for_cutting_surfaces() const override + { return myElementInterfaceCutter->get_starting_phase_for_cutting_surfaces(); } + + PhaseTag get_starting_phase(const CDFEM_Support & cdfemSupport, const Phase_Support & phaseSupport) const; + void update_edge_crossings(const unsigned iEdge, const std::vector> & nodesIsovar); + void add_interfaces_with_uncaptured_intersection_within_element(const std::vector & elemNodesCoords, + const std::vector *> & elemNodesSnappedDomains, + std::set & interfacesWithUncapturedCrossings) const + { return myElementInterfaceCutter->add_interfaces_with_uncaptured_intersection_within_element(elemNodesCoords, elemNodesSnappedDomains, interfacesWithUncapturedCrossings); } + +private: + std::vector myParentEdges; + std::vector myParentEdgesAreOrientedSameAsElementEdges; + std::unique_ptr myElementInterfaceCutter; +}; + +class LevelSetInterfaceGeometry : public InterfaceGeometry { + +public: + LevelSetInterfaceGeometry(const stk::mesh::MetaData & meta); + LevelSetInterfaceGeometry(const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +: myActivePart(activePart), + myCdfemSupport(cdfemSupport), + myPhaseSupport(phaseSupport) {} + virtual ~LevelSetInterfaceGeometry() {} + + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const override; + virtual void prepare_to_process_elements(const stk::mesh::BulkData & mesh, + const std::vector & elementsToIntersect, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const override; + + virtual std::vector get_edge_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const override; + virtual void append_element_intersection_points(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const std::vector & elementsToIntersect, + const IntersectionPointFilter & intersectionPointFilter, + std::vector & intersectionPoints) const override; + + // FIXME: Temporary methods + virtual void store_phase_for_uncut_elements(const stk::mesh::BulkData & mesh) const override; + virtual void store_phase_for_elements_that_will_be_uncut_after_snapping(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + const std::vector & independentSnapInfos, + const NodeToCapturedDomainsMap & nodesToCapturedDomains) const override; + + virtual const ElementToDomainMap & get_phase_for_uncut_elements() const override { return myUncutElementPhases; } + + virtual std::unique_ptr build_element_cutter(const stk::mesh::BulkData & mesh, + stk::mesh::Entity element, + const std::function &)> & intersectingPlanesDiagonalPicker) const override; + + virtual PhaseTag get_starting_phase(const ElementCutter * cutter) const override; + +private: + const stk::mesh::Part & myActivePart; + const CDFEM_Support & myCdfemSupport; + const Phase_Support & myPhaseSupport; + mutable ParentEdgeMap myParentEdges; + mutable ParentsToChildMapper myParentsToChildMapper; + mutable ElementToDomainMap myUncutElementPhases; +}; + +} + + +#endif /* KRINO_INCLUDE_AKRI_LEVELSETINTERFACEGEOMETRY_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_LevelSet_Identifier.hpp b/packages/krino/krino/krino_lib/Akri_LevelSet_Identifier.hpp new file mode 100644 index 000000000000..4de543ea1156 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LevelSet_Identifier.hpp @@ -0,0 +1,37 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_LevelSet_Identifier_h +#define Akri_LevelSet_Identifier_h + +#include + +namespace krino { + +class LevelSet_Identifier { +public: + explicit LevelSet_Identifier(const unsigned id) : my_id(id) {} + + bool operator < ( const LevelSet_Identifier & RHS ) const { return my_id < RHS.my_id; } + bool operator == ( const LevelSet_Identifier & RHS ) const { return my_id == RHS.my_id; } + bool operator != ( const LevelSet_Identifier & RHS ) const { return my_id != RHS.my_id; } + + unsigned get() const { return my_id; } + + friend std::ostream& operator<<(std::ostream & os, const LevelSet_Identifier & id) + { + os << id.get(); + return os; + } +private: + unsigned my_id; +}; + +} // namespace krino + +#endif // Akri_LevelSet_Identifier_h diff --git a/packages/krino/krino/krino_lib/Akri_LowerEnvelope.cpp b/packages/krino/krino/krino_lib/Akri_LowerEnvelope.cpp new file mode 100644 index 000000000000..0f660042073a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LowerEnvelope.cpp @@ -0,0 +1,317 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include + +namespace krino{ + +LS_Segment::LS_Segment(const double xL, const double xR, int id_) +: x_left(xL), x_right(xR), LS_index(id_) +{ +} + +int +get_min(const std::vector & phi) +{ + double min_value = 0.0; + int min_index = -1; + for (unsigned i=0; i +find_crossing_position_and_sign(const InterfaceID key, const std::vector & pos, const std::vector> & phi) +{ + const int num_nodes = pos.size(); + std::vector key_isovar(num_nodes); + for ( int node = 0; node < num_nodes; ++node ) + { + key_isovar[node] = phi[node][key.first_ls()]-phi[node][key.second_ls()]; + } + + if ( LevelSet::sign_change(key_isovar[0], key_isovar[num_nodes-1]) ) + { + for ( int s = 0; s < num_nodes-1; ++s ) + { + const double ls0 = key_isovar[s]; + const double ls1 = key_isovar[s+1]; + if ( LevelSet::sign_change(ls0, ls1) ) + { + const double interval_position = ls0 / ( ls0 - ls1 ); + const double abs_position = (1.-interval_position)*pos[s] + interval_position*pos[s+1]; + return std::make_pair(abs_position, LevelSet::sign(ls1)); + } + } + } + + const int node0_sign = LevelSet::sign(key_isovar[0]); + const int node1_sign = LevelSet::sign(key_isovar[num_nodes-1]); + ThrowRequire(node0_sign == node1_sign); + return std::make_pair(-1., node0_sign); +} + +bool +find_lower_envelope_crossing_point( const std::array,2> & phi, double & x) +{ + const int id0 = get_min(phi[0]); + const int id1 = get_min(phi[1]); + + if ( id0 != id1 ) + { + const double ls0 = (phi[0][id0]-phi[0][id1]); + const double ls1 = (phi[1][id0]-phi[1][id1]); + + x = ls0 / ( ls0 - ls1 ); + return true; + } + + return false; +} + +bool +find_lower_envelope_crossing_point(const std::array,3> & phi, std::array & point) +{ + const int id0 = get_min(phi[0]); + const int id1 = get_min(phi[1]); + const int id2 = get_min(phi[2]); + + if (id0 != id1 && id1 != id2 && id0 != id2) + { + const double d10 = (phi[0][id1]-phi[0][id0]); + const double d11 = (phi[1][id1]-phi[1][id0]); + const double d12 = (phi[2][id1]-phi[2][id0]); + const double d20 = (phi[0][id2]-phi[0][id0]); + const double d21 = (phi[1][id2]-phi[1][id0]); + const double d22 = (phi[2][id2]-phi[2][id0]); + + const double a00 = d11-d10; + const double a01 = d12-d10; + const double a10 = d21-d20; + const double a11 = d22-d20; + + const double b0 = -d10; + const double b1 = -d20; + + const double det = a00*a11-a01*a10; + if (det == 0.) return false; + + const double x = (b0*a11-b1*a01)/det; + const double y = (-b0*a10+b1*a00)/det; + if (x < 0. || y < 0. || 1.-x-y < 0.) return false; + + point = {{x,y}}; + return true; + } + + return false; +} + +bool +find_lower_envelope_crossing_point(const std::array,4> & phi, std::array & point) +{ + const int id0 = get_min(phi[0]); + const int id1 = get_min(phi[1]); + const int id2 = get_min(phi[2]); + const int id3 = get_min(phi[3]); + + if (id0 != id1 && id0 != id2 && id0 != id3 && id1 != id2 && id1 != id3 && id2 != id3) + { + const double d10 = (phi[0][id1]-phi[0][id0]); + const double d11 = (phi[1][id1]-phi[1][id0]); + const double d12 = (phi[2][id1]-phi[2][id0]); + const double d13 = (phi[3][id1]-phi[3][id0]); + const double d20 = (phi[0][id2]-phi[0][id0]); + const double d21 = (phi[1][id2]-phi[1][id0]); + const double d22 = (phi[2][id2]-phi[2][id0]); + const double d23 = (phi[3][id2]-phi[3][id0]); + const double d30 = (phi[0][id3]-phi[0][id0]); + const double d31 = (phi[1][id3]-phi[1][id0]); + const double d32 = (phi[2][id3]-phi[2][id0]); + const double d33 = (phi[3][id3]-phi[3][id0]); + + const double a00 = d11-d10; + const double a01 = d12-d10; + const double a02 = d13-d10; + const double a10 = d21-d20; + const double a11 = d22-d20; + const double a12 = d23-d20; + const double a20 = d31-d30; + const double a21 = d32-d30; + const double a22 = d33-d30; + const double b0 = -d10; + const double b1 = -d20; + const double b2 = -d30; + const double det = a00*(a22*a11-a21*a12)-a10*(a22*a01-a21*a02)+a20*(a12*a01-a11*a02); + const double x =( b0*(a22*a11-a21*a12)-b1*(a22*a01-a21*a02)+b2*(a12*a01-a11*a02))/det; + const double y =(-b0*(a22*a10-a20*a12)+b1*(a22*a00-a20*a02)-b2*(a12*a00-a10*a02))/det; + const double z =( b0*(a21*a10-a20*a11)-b1*(a21*a00-a20*a01)+b2*(a11*a00-a10*a01))/det; + + point = {{x,y,z}}; + return true; + } + + return false; +} + +void +SegmentLowerEnvelope::adjust_piecewise_linear_positions(Segment_Vector & segments, const std::vector & pos, const std::vector> & phi) +{ + if (pos.size() > 2) + { + // Even for piecewise edges, the structure of the phases must be no more complicated than that + // given by the linear version of the edge. So adjust the linear locations and then remove + // the degenerate, inverted segements. + + // Use piecewise approximation to find actual transition locations + for(Segment_Vector::iterator it = segments.begin(); it != segments.end()-1; ++it) + { + LS_Segment & cur = *it; + LS_Segment & next = *(it+1); + if (cur.ls_index() == next.ls_index()) continue; + InterfaceID iface(cur.ls_index(), next.ls_index()); + + const double crossing_pos = (find_crossing_position_and_sign(iface, pos, phi)).first; + ThrowRequire(crossing_pos >= 0.); + cur = LS_Segment(cur.left_endpoint(), crossing_pos, cur.ls_index()); + next = LS_Segment(crossing_pos, next.right_endpoint(), next.ls_index()); + } + + // Now remove inverted segments + if (segments.size() > 2) + { + for(Segment_Vector::iterator it = segments.begin()+1; it != segments.end()-1; ++it) + { + LS_Segment & prev = *(it-1); + LS_Segment & cur = *it; + LS_Segment & next = *(it+1); + + if (cur.right_endpoint() < cur.left_endpoint()) + { + InterfaceID iface(prev.ls_index(), next.ls_index()); + + const double crossing_pos = (find_crossing_position_and_sign(iface, pos, phi)).first; + ThrowRequire(crossing_pos >= 0.); + prev = LS_Segment(prev.left_endpoint(), cur.right_endpoint(), prev.ls_index()); + cur = LS_Segment(cur.right_endpoint(), crossing_pos, prev.ls_index()); + next = LS_Segment(crossing_pos, next.right_endpoint(), next.ls_index()); + } + } + } + } +} + +void +SegmentLowerEnvelope::collapse_identical_segments(Segment_Vector & segments) +{ + if (segments.size() > 1) + { + Segment_Vector uncollapsed; + uncollapsed.swap(segments); + segments.push_back(uncollapsed.front()); + for(Segment_Vector::const_iterator it = uncollapsed.begin()+1; it != uncollapsed.end(); ++it) + { + const LS_Segment & prev = *(it-1); + const LS_Segment & curr = *it; + if (prev.ls_index() == curr.ls_index()) + { + segments.back() = LS_Segment(segments.back().left_endpoint(), curr.right_endpoint(), prev.ls_index()); + } + else + { + segments.push_back(curr); + } + } + } +} + +void +SegmentLowerEnvelope::add_segment(Segment_Vector & segments, + const double x0, const std::vector & phi0, const int min0, + const double x1, const std::vector & phi1, const int min1) +{ + if (min0 == min1) + { + const LS_Segment segment(x0, x1, min0); + segments.push_back(segment); + return; + } + else + { + InterfaceID key(min0, min1); + const double ls0 = (phi0[key.first_ls()]-phi0[key.second_ls()]); // ls >= 0 for phi2 >= phi1 + const double ls1 = (phi1[key.first_ls()]-phi1[key.second_ls()]); + ThrowRequire(ls0*ls1 <= 0.); + const double cut = ls0 / (ls0 - ls1); + + { + const double x_cut = (1.-cut)*x0 + cut*x1; + ThrowAssert(phi0.size() == phi1.size()); + std::vector phiAtCut(phi0.size()); + for (unsigned i=0; i 1.-tol; + + if (isInfinitesmalCutAt0) + { + if (segments.empty()) + segments.emplace_back(0., 0., min0); + if (minCutMatchesEndPoint) + segments.emplace_back(x0, x1, min1); + else + add_segment(segments, x0, phiAtCut, minAtCut, x1, phi1, min1); + } + else if (isInfinitesmalCutAt1) + { + if (minCutMatchesEndPoint) + segments.emplace_back(x0, x1, min0); + else + add_segment(segments, x0, phi0, min0, x1, phiAtCut, minAtCut); + if (x1 == 1.) + { + if (segments.back().left_endpoint() == 1.) + segments.pop_back(); + segments.emplace_back(1., 1., min1); + } + } + else + { + if (minCutMatchesEndPoint) + segments.emplace_back(x0, x_cut, min0); + else + add_segment(segments, x0, phi0, min0, x_cut, phiAtCut, minAtCut); + + if (minCutMatchesEndPoint) + segments.emplace_back(x_cut, x1, min1); + else + add_segment(segments, x_cut, phiAtCut, minAtCut, x1, phi1, min1); + } + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_LowerEnvelope.hpp b/packages/krino/krino/krino_lib/Akri_LowerEnvelope.hpp new file mode 100644 index 000000000000..88cd8f6e6210 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_LowerEnvelope.hpp @@ -0,0 +1,120 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_LowerEnvelope_h +#define Akri_LowerEnvelope_h + +#include +#include + +#include + +namespace krino { + +class LS_Segment +{ +public: + LS_Segment(const double xL, const double xR, int id); + + double length() const { return x_right - x_left; } + int ls_index() const { return LS_index; } + double left_endpoint() const { return x_left; } + double right_endpoint() const { return x_right; } + + friend bool operator==(const LS_Segment & lhs, const LS_Segment & rhs); + friend std::ostream & operator << (std::ostream &os, const LS_Segment & segment); + +private: + double x_left; + double x_right; + int LS_index; +}; +typedef std::vector Segment_Vector; + +inline std::ostream & operator << (std::ostream &os, const LS_Segment & segment) +{ + os << "segment LS id = " << segment.LS_index + << " left point = " << segment.x_left + << " right point = " << segment.x_right; + return os; +} + +inline std::ostream & operator << (std::ostream &os, const Segment_Vector & segmentVec) +{ + os << "Segments: "; + for (auto && segment : segmentVec) + os << "{" << segment << "} "; + return os; +} + +std::pair +find_crossing_position_and_sign(const InterfaceID key, const std::vector & pos, const std::vector> & phi); + +bool find_lower_envelope_crossing_point(const std::array,2> & phi, double & x); + +bool find_lower_envelope_crossing_point(const std::array,3> & phi, std::array & point); + +bool find_lower_envelope_crossing_point(const std::array,4> & phi, std::array & point); + +int get_min(const std::vector & phi); + +class SegmentLowerEnvelope +{ +public: + // Must be larger than machine epsilon, but puts limit on smallest effective snap tolerance + static constexpr double MinSize() {return 1.e-12;}; + + // linear (2 points) + static Segment_Vector find_lower_envelope(const std::vector & phi0, + const std::vector & phi1) { SegmentLowerEnvelope env(0., phi0, 1., phi1); return env.get_segments(); } + static Segment_Vector find_lower_envelope(const double x0, const std::vector & phi0, + const double x1, const std::vector & phi1) { SegmentLowerEnvelope env(x0, phi0, x1, phi1); return env.get_segments(); } + // piecewise linear (>2 points) + static Segment_Vector find_lower_envelope(const std::vector & pos, const std::vector> & phi) + { SegmentLowerEnvelope env(pos,phi); return env.get_segments(); } + + SegmentLowerEnvelope(const std::vector & phi0, const std::vector & phi1) : SegmentLowerEnvelope(0., phi0, 1., phi1) {} + SegmentLowerEnvelope(const double x0, const std::vector & phi0, + const double x1, const std::vector & phi1) + { + add_segment(mySegments, x0, phi0, x1, phi1); + collapse_identical_segments(mySegments); + } + SegmentLowerEnvelope(const std::vector & pos, const std::vector> & phi) + { + ThrowRequire(pos.size() == phi.size() && pos.size() > 1); + add_segment(mySegments, pos.front(), phi.front(), pos.back(), phi.back()); + collapse_identical_segments(mySegments); + adjust_piecewise_linear_positions(mySegments, pos, phi); + } + const Segment_Vector & get_segments() const { return mySegments; } + +private: + static void add_segment(Segment_Vector & segments, + const double x0, const std::vector & phi0, + const double x1, const std::vector & phi1) + { + const int min0 = get_min(phi0); + const int min1 = get_min(phi1); + return add_segment(segments, x0, phi0, min0, x1, phi1, min1); + } + + static void add_segment(Segment_Vector & segments, + const double x0, const std::vector & phi0, const int min0, + const double x1, const std::vector & phi1, const int min1); + + static void collapse_identical_segments(Segment_Vector & segments); + + static void adjust_piecewise_linear_positions(Segment_Vector & segments, const std::vector & pos, const std::vector> & phi); + + Segment_Vector mySegments; +}; + +} // namespace krino + +#endif // Akri_LowerEnvelope_h diff --git a/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.cpp b/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.cpp new file mode 100644 index 000000000000..dad407903149 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.cpp @@ -0,0 +1,105 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +#include +#include +#include +#include + +namespace krino { + +const MasterElement& +MasterElementDeterminer::getMasterElement(stk::mesh::Bucket & bucket, FieldRef field) +{ + stk::topology field_topology = get_field_topology(bucket, field); + return MasterElementDeterminer::getMasterElement(field_topology); +} + +stk::topology +MasterElementDeterminer::get_field_topology(const stk::mesh::Bucket & b, const FieldRef field) +{ + // As an optimization, assume there is only 1 field topology active for a given mesh topology and field + typedef std::map, stk::topology> FieldAndMeshTopoToFieldTopoMap; + static FieldAndMeshTopoToFieldTopoMap field_topo_map; + + const stk::topology mesh_topology = b.topology(); + const unsigned field_ordinal = field.field().mesh_meta_data_ordinal(); + FieldAndMeshTopoToFieldTopoMap::iterator it = field_topo_map.find(std::make_pair(field_ordinal, mesh_topology)); + if (it != field_topo_map.end()) + { + return it->second; + } + + stk::mesh::MetaData & meta = field.field().mesh_meta_data(); + stk::topology field_topology = AuxMetaData::get(meta).get_nodal_field_topology(field, b); + + field_topo_map.insert(FieldAndMeshTopoToFieldTopoMap::value_type(std::make_pair(field_ordinal, mesh_topology), field_topology)); + return field_topology; +} + +const MasterElement & +MasterElementDeterminer::getMasterElement(stk::topology t) +{ + static std::vector> all_master_elems(stk::topology::BEGIN_TOPOLOGY + stk::topology::NUM_TOPOLOGIES); + std::unique_ptr & master_elem = all_master_elems[t()]; + if (nullptr == master_elem.get()) + { + std::unique_ptr basis; + switch(t()) + { + case stk::topology::LINE_2: + basis = std::make_unique(); + break; + case stk::topology::LINE_3: + basis = std::make_unique(); + break; + case stk::topology::TRI_3: + case stk::topology::TRI_3_2D: + basis = std::make_unique(); + break; + case stk::topology::TRI_6: + case stk::topology::TRI_6_2D: + basis = std::make_unique(); + break; + case stk::topology::QUAD_4: + case stk::topology::QUAD_4_2D: + basis = std::make_unique(); + break; + case stk::topology::QUAD_9: + case stk::topology::QUAD_9_2D: + basis = std::make_unique(); + break; + case stk::topology::TET_4: + basis = std::make_unique(); + break; + case stk::topology::TET_10: + basis = std::make_unique(); + break; + case stk::topology::HEX_8: + basis = std::make_unique(); + break; + case stk::topology::HEX_27: + basis = std::make_unique(); + break; + case stk::topology::WEDGE_6: + basis = std::make_unique(); + break; + default: + ThrowRuntimeError("Element topology not found in MasterElementDeterminer::getMasterElement: " << t.name()); + break; + } + master_elem = std::make_unique(t, std::move(basis)); + } + return *master_elem; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.hpp b/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.hpp new file mode 100644 index 000000000000..af84aaea85f2 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MasterElementDeterminer.hpp @@ -0,0 +1,30 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElementDeterminer_h +#define Akri_MasterElementDeterminer_h + +#include + +namespace krino { class FieldRef; } +namespace stk { namespace mesh { class Bucket; } } +namespace stk { class topology; } + +namespace krino { + +class MasterElementDeterminer +{ +public: + static const MasterElement& getMasterElement(stk::mesh::Bucket & bucket, FieldRef field); + static const MasterElement& getMasterElement(stk::topology topology); + static stk::topology get_field_topology(const stk::mesh::Bucket & b, const FieldRef field); +}; + +} // end namespace krino + +#endif // Akri_MasterElementDeterminer_h diff --git a/packages/krino/krino/krino_lib/Akri_MathUtil.cpp b/packages/krino/krino/krino_lib/Akri_MathUtil.cpp new file mode 100644 index 000000000000..f2a7d53a2b6f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MathUtil.cpp @@ -0,0 +1,233 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +namespace krino { + +Vector3d +get_parametric_coordinates_of_point(const std::vector & nodeCoords, const Vector3d & pt) +{ + if (nodeCoords.size() == 3) + { + const Vector3d relativeCoords1 = nodeCoords[1] - nodeCoords[0]; + const Vector3d relativeCoords2 = nodeCoords[2] - nodeCoords[0]; + const Vector3d relativeCoords = pt - nodeCoords[0]; + + const double a00 = relativeCoords1[0]; + const double a01 = relativeCoords2[0]; + const double a10 = relativeCoords1[1]; + const double a11 = relativeCoords2[1]; + const double b0 = relativeCoords[0]; + const double b1 = relativeCoords[1]; + const double det = a00*a11-a01*a10; + const double x = (b0*a11-b1*a01)/det; + const double y = (-b0*a10+b1*a00)/det; + return Vector3d(x,y,0.); + } + else + { + const Vector3d relativeCoords1 = nodeCoords[1] - nodeCoords[0]; + const Vector3d relativeCoords2 = nodeCoords[2] - nodeCoords[0]; + const Vector3d relativeCoords3 = nodeCoords[3] - nodeCoords[0]; + const Vector3d relativeCoords = pt - nodeCoords[0]; + const double a00 = relativeCoords1[0]; + const double a01 = relativeCoords2[0]; + const double a02 = relativeCoords3[0]; + const double a10 = relativeCoords1[1]; + const double a11 = relativeCoords2[1]; + const double a12 = relativeCoords3[1]; + const double a20 = relativeCoords1[2]; + const double a21 = relativeCoords2[2]; + const double a22 = relativeCoords3[2]; + const double b0 = relativeCoords[0]; + const double b1 = relativeCoords[1]; + const double b2 = relativeCoords[2]; + const double det = a00*(a22*a11-a21*a12)-a10*(a22*a01-a21*a02)+a20*(a12*a01-a11*a02); + const double x =( b0*(a22*a11-a21*a12)-b1*(a22*a01-a21*a02)+b2*(a12*a01-a11*a02))/det; + const double y =(-b0*(a22*a10-a20*a12)+b1*(a22*a00-a20*a02)-b2*(a12*a00-a10*a02))/det; + const double z =( b0*(a21*a10-a20*a11)-b1*(a21*a00-a20*a01)+b2*(a11*a00-a10*a01))/det; + return Vector3d(x,y,z); + } +} + +std::pair find_root( const std::function & f, + const double xa, + const double xb, + const double fa, + const double fb, + const unsigned maxIters, + const double xTol) +{ + boost::uintmax_t iterCount = maxIters; + auto tol_function = [&xTol](const double a, const double b) { return std::abs(b-a) <= xTol; }; + auto result = boost::math::tools::toms748_solve(f, xa, xb, fa, fb, tol_function, iterCount); + const bool success = iterCount < maxIters; + return {success, 0.5*(result.first+result.second)}; +} + +std::pair find_bracketed_root_newton_raphson( const std::function(const double)> & f, + double x, + double fx, + double dfx, + double xa, + double xb, + double fa, + double fb, + const unsigned maxIters, + const double fTol) +{ + unsigned iter = 0; + while (iter++ < maxIters) + { + if (dfx == 0.) + { + x = 0.5*(xa+xb); // zero slope so use bisection + } + else + { + x -= fx / dfx; + if (x < xa || x > xb) + x = 0.5*(xa+xb); // Newton-Raphson step went out of bounds so use bisection + } + + std::tie(fx, dfx) = f(x); + + if (std::abs(fx) <= fTol) + return {true, x}; + + if (fx*fb < 0.) + { + xa = x; + fa = fx; + } + else + { + xb = x; + fb = fx; + } + + const double xTol = 4*std::numeric_limits::epsilon()*(fabs(xa)+fabs(xb)); + if (xb-xa < xTol) + return {false, x}; + } + return {true, x}; +} + +void attempt_to_bracket_root_newton_raphson( const std::function(const double)> & f, + const double guess, + double & x, + double & fx, + double & dfx, + double & xa, + double & xb, + double & fa, + double & fb, + bool & solnIsConvergedAtX, + bool & solnIsBracketed, + const unsigned maxIters, + const double fTol) +{ + x = guess; + std::tie(fx,dfx) = f(x); + + if (std::abs(fx) <= fTol) + { + solnIsConvergedAtX = true; + solnIsBracketed = false; + return; + } + + xa = x; + xb = x; + fa = fx; + fb = fx; + + unsigned iter = 0; + while (iter++ < maxIters) + { + if (dfx == 0.) + { + // FAILED: zero slope + solnIsConvergedAtX = false; + solnIsBracketed = false; + return; + } + + xa = x; + fa = fx; + + x -= fx / dfx; + std::tie(fx,dfx) = f(x); + + if (std::abs(fx) <= fTol) + { + solnIsConvergedAtX = true; + solnIsBracketed = false; + return; + } + + if (fa*fx > 0. && std::abs(fx) > std::abs(fa)) + { + // Jacobian is poor, try line search + const double tau = 0.5; + const int maxLineSearchIters = 5; + unsigned lineSearchIters = 0; + while (lineSearchIters++ < maxLineSearchIters && fa*fx > 0. && std::abs(fx) > std::abs(fa)) + { + x = xa + tau*(x-xa); + std::tie(fx,dfx) = f(x); + } + } + + if (fa*fx < 0.) + { + solnIsConvergedAtX = false; + solnIsBracketed = true; + xb = x; + fb = fx; + if (xa > xb) + { + std::swap(xa,xb); + std::swap(fa,fb); + } + return; + } + } + + //FAILED: did not bracket root + solnIsConvergedAtX = false; + solnIsBracketed = false; +} + +std::pair find_root_newton_raphson( const std::function(const double)> & f, + const double guess, + const unsigned maxIters, + const double fTol) +{ + double x, fx, dfx, xa, xb, fa, fb; + bool solnIsConvergedAtX, solnIsBracketed; + attempt_to_bracket_root_newton_raphson(f, guess, x, fx, dfx, xa, xb, fa, fb, solnIsConvergedAtX, solnIsBracketed, maxIters, fTol); + + if (solnIsConvergedAtX) + return {true, x}; + + if (!solnIsBracketed) + return {false, guess}; + + return find_bracketed_root_newton_raphson(f, x, fx, dfx, xa, xb, fa, fb, maxIters, fTol); +} + +} + + diff --git a/packages/krino/krino/krino_lib/Akri_MathUtil.hpp b/packages/krino/krino/krino_lib/Akri_MathUtil.hpp new file mode 100644 index 000000000000..6741d5bd9eac --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MathUtil.hpp @@ -0,0 +1,35 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_MATHUTIL_H_ +#define KRINO_INCLUDE_AKRI_MATHUTIL_H_ +#include +#include +#include + +namespace krino { + +Vector3d get_parametric_coordinates_of_point(const std::vector & nodeCoords, const Vector3d & pt); + +std::pair find_root( const std::function & f, + const double xa, + const double xb, + const double fa, + const double fb, + const unsigned maxIters = 100, + const double tol = 1.e-4); + +std::pair find_root_newton_raphson( const std::function(const double)> & f, + const double guess, + const unsigned maxIters = 100, + const double fTol = 1.e-4); + +} + + +#endif /* KRINO_INCLUDE_AKRI_MATHUTIL_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_MeshClone.cpp b/packages/krino/krino/krino_lib/Akri_MeshClone.cpp new file mode 100644 index 000000000000..49d9abaea644 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshClone.cpp @@ -0,0 +1,629 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace krino{ + +bool +MeshClone::stash_or_restore_mesh(stk::mesh::BulkData & mesh, const unsigned step_count) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::stash_or_restore_mesh(tftk::mesh::Mesh &mesh)"); /* %TRACE% */ + + const auto empty_function = []() {}; + return stash_or_restore_mesh(mesh, step_count, empty_function, empty_function); +} + +bool +MeshClone::stash_or_restore_mesh(stk::mesh::BulkData & mesh, const unsigned step_count, + const std::function & notify_of_pre_mesh_modification, + const std::function & notify_of_post_mesh_modification) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::stash_or_restore_mesh(tftk::mesh::Mesh &mesh)"); /* %TRACE% */ + bool restored_mesh = false; + MeshClone * clone = const_cast(mesh.mesh_meta_data().get_attribute()); + if (!clone) + { + clone = new MeshClone(mesh, sierra::Diag::sierraTimer(), step_count); + mesh.mesh_meta_data().declare_attribute_with_delete(clone); + } + else + { + if (step_count > clone->my_step_count) + { + if (!clone->mesh_is_up_to_date()) + { + clone->update(step_count); + } + } + else if (!clone->mesh_is_up_to_date()) + { + notify_of_pre_mesh_modification(); + clone->restore(step_count); + notify_of_post_mesh_modification(); + restored_mesh = true; + } + } + return restored_mesh; +} + +bool +MeshClone::exists(const stk::mesh::BulkData & mesh) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::exists(stk::mesh::BulkData & mesh)"); /* %TRACE% */ + MeshClone * clone = const_cast(mesh.mesh_meta_data().get_attribute()); + return (clone != nullptr); +} + +MeshClone & +MeshClone::get(const stk::mesh::BulkData & mesh) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::update_cloned_fields(stk::mesh::BulkData & mesh)"); /* %TRACE% */ + MeshClone * clone = const_cast(mesh.mesh_meta_data().get_attribute()); + ThrowRequireMsg(clone != nullptr, "Could not find MeshClone."); + return *clone; +} + +MeshClone::MeshClone( stk::mesh::BulkData & orig_mesh, stk::diag::Timer parent_timer, const unsigned step_count ) +: my_orig_mesh(&orig_mesh), + my_timer("Clone mesh", parent_timer), + my_step_count(step_count), + my_synchronized_count(orig_mesh.synchronized_count()) +{ + stk::diag::TimeBlock timer__(my_timer); + const stk::mesh::MetaData & in_meta = my_orig_mesh->mesh_meta_data(); + my_meta = std::make_unique(); + clone_meta_data_parts_and_fields(in_meta, *my_meta); + + my_mesh = std::make_unique(*my_meta, + my_orig_mesh->parallel(), + stk::mesh::BulkData::NO_AUTO_AURA +#ifdef SIERRA_MIGRATION + ,my_orig_mesh->add_fmwk_data() +#endif + ); + + my_meta->commit(); + + my_mesh->modification_begin(); + clone_bulk_data_entities(*my_orig_mesh, *my_mesh, false); + my_mesh->modification_end(); + + copy_field_data(*my_orig_mesh, *my_mesh); +} + +void MeshClone::update(const unsigned step_count) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::update(const unsigned step_count)"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer); + + const stk::mesh::BulkData & in_mesh = *my_orig_mesh; + stk::mesh::BulkData & out_mesh = *my_mesh; + + clone_mesh(in_mesh, out_mesh, false); + + my_step_count = step_count; + mark_mesh_as_up_to_date(); +} + +void MeshClone::restore(const unsigned step_count) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::restore(const unsigned step_count)"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer); + krinolog << "Restoring mesh from clone." << stk::diag::dendl; + + const stk::mesh::BulkData & in_mesh = *my_mesh; + stk::mesh::BulkData & out_mesh = *my_orig_mesh; + + clone_mesh(in_mesh, out_mesh, false); + + ThrowRequire(step_count == my_step_count); + mark_mesh_as_up_to_date(); +} + +void MeshClone::clone_mesh(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const bool full_overwrite) +{ /* %TRACE[ON]% */ Trace trace__("krino::MeshClone::clone_mesh(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const bool full_overwrite)"); /* %TRACE% */ + if (full_overwrite) + { + // Ugly, but legal and effective. + stk::mesh::MetaData & out_meta = out_mesh.mesh_meta_data(); + out_mesh.~BulkData(); + + const stk::mesh::BulkData::AutomaticAuraOption aura_option = + in_mesh.is_automatic_aura_on() ? + stk::mesh::BulkData::AUTO_AURA : + stk::mesh::BulkData::NO_AUTO_AURA; + + new (&out_mesh) stk::mesh::BulkData(out_meta, + in_mesh.parallel(), + aura_option +#ifdef SIERRA_MIGRATION + ,in_mesh.add_fmwk_data() +#endif + ); + + out_mesh.modification_begin(); + clone_bulk_data_entities(in_mesh, out_mesh, false); + out_mesh.modification_end(); + } + else + { + // I don't think you can start with clone_parallel because you can't know where something goes unless you know about it locally. + // Therefore I don't think that creation can go before deletion because you can't know if it already exists. + // Best to just delete everything wrong and then rebuild. + ThrowRequireMsg(out_mesh.modification_begin(), "MeshClone::restore must not be called within a modification cycle."); + delete_extraneous_entities(in_mesh, out_mesh); + // Occasionally, there is an issue with deleting and recreating the same entity within the same modification cycle, + // so we need to end here and begin again for the creation. + out_mesh.modification_end(); + + //Delete graph because the following mod cycle creates elements and faces in the same mode cycle. + out_mesh.delete_face_adjacent_element_graph(); + + out_mesh.modification_begin(); + clone_bulk_data_entities(in_mesh, out_mesh, true); + out_mesh.modification_end(); + } + + copy_field_data(in_mesh, out_mesh); +} + + +void +MeshClone::clone_meta_data_parts_and_fields(const stk::mesh::MetaData & in_meta, stk::mesh::MetaData & out_meta) +{ + /* %TRACE[ON]% */ Trace trace__("void MeshClone::clone_meta_data(stk::mesh::MetaData & in_meta)"); /* %TRACE% */ + + // This is pretty nasty. We want the part.mesh_meta_data_ordinal to be the same for the in_meta and out_meta. + // To accomplish this, we must be careful about the order of the part creation. + // Specifically, we must clone the parts that were created before in_meta.initialize() were called, then + // call out_meta.initialize(), then clone the rest. + + const stk::mesh::PartVector & in_parts = in_meta.get_parts(); + + unsigned ipart = 0; + bool more_to_do = ipart < in_parts.size(); + while (more_to_do) + { + stk::mesh::Part * in_part = in_parts[ipart++]; + if (stk::mesh::is_topology_root_part(*in_part)) + { + more_to_do = false; + } + else + { + more_to_do = ipart < in_parts.size(); + ThrowRequire(in_part->primary_entity_rank() == stk::topology::INVALID_RANK); + stk::mesh::Part & out_part = out_meta.declare_part(in_part->name()); + ThrowRequire(out_part.mesh_meta_data_ordinal() == in_part->mesh_meta_data_ordinal()); + } + } + + out_meta.initialize(in_meta.spatial_dimension(), in_meta.entity_rank_names()); + + for ( auto&& in_part : in_parts ) + { + stk::mesh::Part & out_part = + (in_part->primary_entity_rank() == stk::topology::INVALID_RANK) ? + out_meta.declare_part(in_part->name()) : + out_meta.declare_part(in_part->name(), in_part->primary_entity_rank(), in_part->force_no_induce()); + ThrowRequire(out_part.mesh_meta_data_ordinal() == in_part->mesh_meta_data_ordinal()); + if (stk::io::is_part_io_part(*in_part)) + { + stk::io::put_io_part_attribute(out_part); + } + } + + for ( auto&& in_part : in_parts ) + { + stk::mesh::Part & out_part = out_meta.get_part(in_part->mesh_meta_data_ordinal()); + const stk::mesh::PartVector & in_subsets = in_part->subsets(); + for (auto && in_subset : in_subsets) + { + stk::mesh::Part & out_subset = out_meta.get_part(in_subset->mesh_meta_data_ordinal()); + out_meta.declare_part_subset(out_part, out_subset); + } + } + + const stk::mesh::FieldVector & in_fields = in_meta.get_fields(); + for ( auto&& in_field : in_fields ) + { + if (in_field->state() == stk::mesh::StateNone) + { + stk::topology::rank_t entity_rank = static_cast(in_field->entity_rank()); + stk::mesh::FieldBase * out_field = out_meta.declare_field_base(in_field->name(), entity_rank, in_field->data_traits(), in_field->field_array_rank(), in_field->dimension_tags(), in_field->number_of_states()); + + for ( auto&& in_restriction : in_field->restrictions() ) + { + const stk::mesh::Selector out_selector = MeshClone::translate_selector(in_restriction.selector(), out_meta); + + out_meta.declare_field_restriction( *out_field, out_selector, in_restriction.num_scalars_per_entity(), in_restriction.dimension() ); + } + } + } +} + +void +MeshClone::delete_extraneous_entities(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh) +{ + /* %TRACE[ON]% */ Trace trace__("void MeshClone::delete_extraneous_entities(stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh)"); /* %TRACE% */ + + std::vector entities; + std::vector relatives; + std::vector relative_ordinals; + std::vector in_mesh_comm_procs; + std::vector out_mesh_comm_procs; + + const stk::mesh::EntityRank highest_entity_rank = static_cast(in_mesh.mesh_meta_data().entity_rank_count()-1); + for (stk::mesh::EntityRank entity_rank = highest_entity_rank; entity_rank >= stk::topology::NODE_RANK; --entity_rank) + { + stk::mesh::get_entities( out_mesh, entity_rank, entities ); + + for (auto&& out_entity : entities) + { + // Delete all entities for which any of the following are true: + // 1. There is no corresponding entity in in_mesh + // 2. The parallel owner changed. + // 3. The comm procs or comm shared procs differ. (Ugh. This is to work around strange corner case issues.) + // 4. The entity has invalid nodes (due to the nodes violating 1 or 2). + + stk::mesh::Entity in_entity = get_entity_on_other_mesh(out_mesh, out_entity, in_mesh); + bool delete_entity = !in_mesh.is_valid(in_entity); + + if (!delete_entity) + { + delete_entity = + in_mesh.parallel_owner_rank(in_entity) != out_mesh.parallel_owner_rank(out_entity); + } + + if (!delete_entity) + { + in_mesh.comm_procs(in_mesh.entity_key(in_entity), in_mesh_comm_procs); + out_mesh.comm_procs(out_mesh.entity_key(out_entity), out_mesh_comm_procs); + delete_entity = in_mesh_comm_procs != out_mesh_comm_procs; + } + + if (!delete_entity) + { + in_mesh.comm_shared_procs(in_entity, in_mesh_comm_procs); + out_mesh.comm_shared_procs(out_entity, out_mesh_comm_procs); + delete_entity = in_mesh_comm_procs != out_mesh_comm_procs; + } + + if (delete_entity) + { + ThrowRequireMsg(disconnect_and_destroy_entity(out_mesh, out_entity), "Could not destroy entity " << out_mesh.entity_key(out_entity) << debug_entity(out_mesh, out_entity)); + } + } + } + + for (stk::mesh::EntityRank entity_rank = stk::topology::ELEMENT_RANK; entity_rank > stk::topology::NODE_RANK; --entity_rank) + { + stk::mesh::get_entities( out_mesh, entity_rank, entities ); + + for (auto&& out_entity : entities) + { + const unsigned num_nodes = out_mesh.bucket(out_entity).topology().num_nodes(); + if (out_mesh.count_valid_connectivity(out_entity, stk::topology::NODE_RANK) != num_nodes) + { + ThrowRequireMsg(disconnect_and_destroy_entity(out_mesh, out_entity), "Could not destroy entity " << out_mesh.entity_key(out_entity)); + } + } + } +} + +void +MeshClone::delete_all_entities(stk::mesh::BulkData & mesh) +{ + /* %TRACE[ON]% */ Trace trace__("void MeshClone::delete_extraneous_entities(stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh)"); /* %TRACE% */ + + std::vector entities; + + const stk::mesh::EntityRank highest_entity_rank = static_cast(mesh.mesh_meta_data().entity_rank_count()-1); + for (stk::mesh::EntityRank entity_rank = highest_entity_rank; entity_rank >= stk::topology::NODE_RANK; --entity_rank) + { + stk::mesh::get_entities( mesh, entity_rank, entities ); + + for (auto && entity : entities) + { + ThrowRequireMsg(mesh.destroy_entity(entity), "Could not destroy entity " << mesh.entity_key(entity)); + } + } +} + +void +MeshClone::clone_bulk_data_entities(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const bool search_for_existing) +{ + /* %TRACE[ON]% */ Trace trace__("void MeshClone::clone_bulk_data(stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh)"); /* %TRACE% */ + + const bool debug = false; + + const stk::mesh::MetaData & in_meta = in_mesh.mesh_meta_data(); + const stk::mesh::MetaData & out_meta = out_mesh.mesh_meta_data(); + + std::vector sharing; + + const stk::mesh::EntityRank highest_entity_rank = static_cast(in_meta.entity_rank_count()-1); + for (stk::mesh::EntityRank entity_rank = stk::topology::NODE_RANK; entity_rank <= highest_entity_rank; ++entity_rank) + { + stk::mesh::Selector not_ghost = in_meta.locally_owned_part() | in_meta.globally_shared_part(); + const stk::mesh::BucketVector & buckets = in_mesh.get_buckets(entity_rank, not_ghost); + + for ( auto&& bucket_ptr : buckets ) + { + const stk::mesh::Bucket & b = *bucket_ptr; + + stk::mesh::PartVector in_bucket_parts, out_bucket_parts; + get_bucket_parts(b,in_bucket_parts); + + translate_parts(in_bucket_parts, out_meta, out_bucket_parts); + + const bool bucket_is_locally_owned = b.member(in_meta.locally_owned_part()); + + + const int length = b.size(); + for (int i = 0; i < length; ++i) + { + stk::mesh::Entity in_entity = b[i]; + + stk::mesh::Entity out_entity; + if (search_for_existing) + { + out_entity = out_mesh.get_entity( entity_rank, in_mesh.identifier(in_entity) ); + if (out_mesh.is_valid(out_entity) && + out_mesh.bucket(out_entity).member(out_meta.locally_owned_part())) + { + // make sure parts are right + stk::mesh::PartVector current_parts; + get_bucket_parts(out_mesh.bucket(out_entity), current_parts); + out_mesh.change_entity_parts(out_entity, out_bucket_parts, current_parts); + } + } + + // Unfortunately, there is a subtle bug that may be present in the input mesh that can cause a face to be present on + // this processor even when there are no locally owned elements using that face. We will skip these faces. + if (!bucket_is_locally_owned && entity_rank == in_meta.side_rank()) + { + bool found_locally_owned_elem = false; + const unsigned num_elems = in_mesh.num_elements(in_entity); + const stk::mesh::Entity* elems = in_mesh.begin_elements(in_entity); + for (unsigned ielem=0; ielem 1) + { + in_mesh.comm_shared_procs(in_entity,sharing); + for ( size_t k = 0 ; k < sharing.size() ; ++k ) + { + out_mesh.add_node_sharing(out_entity, sharing[k]); + } + } + + for (stk::mesh::EntityRank relative_rank = stk::topology::NODE_RANK; relative_rank < entity_rank; ++relative_rank) + { + const unsigned num_relatives = in_mesh.num_connectivity(in_entity, relative_rank); + const stk::mesh::Entity* in_relatives = in_mesh.begin(in_entity, relative_rank); + const stk::mesh::ConnectivityOrdinal * relative_ordinals = in_mesh.begin_ordinals(in_entity, relative_rank); + const stk::mesh::Permutation * relative_permutations = in_mesh.begin_permutations(in_entity, relative_rank); + + for (unsigned relative_index=0; relative_index( stk::mesh::field_data( out_field, b ) ); + + for (unsigned ib=0; ib( stk::mesh::field_data( in_field, in_entity ) ); + for ( unsigned i = 0; i < out_length; i++ ) out_data[i] = in_data[i]; + } + } +} + +void +MeshClone::copy_field_data(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh) +{ + /* %TRACE[ON]% */ Trace trace__("void MeshClone::copy_field_data(stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh)"); /* %TRACE% */ + + const stk::mesh::MetaData & in_meta = in_mesh.mesh_meta_data(); + stk::mesh::MetaData & out_meta = out_mesh.mesh_meta_data(); + + const stk::mesh::FieldVector & in_fields = in_meta.get_fields(); + const stk::mesh::FieldVector & out_fields = out_meta.get_fields(); + ThrowAssert(in_fields.size() == out_fields.size()); + + const bool out_mesh_aura_from_communication = out_mesh.is_automatic_aura_on() && !in_mesh.is_automatic_aura_on(); + + for ( unsigned field_index=0; field_index < in_fields.size(); ++field_index ) + { + const stk::mesh::FieldBase & in_field = *in_fields[field_index]; + const stk::mesh::FieldBase & out_field = *out_fields[field_index]; + copy_field_data(in_mesh, out_mesh, in_field, out_field, out_mesh_aura_from_communication); + } + + if (out_mesh_aura_from_communication) + { + const std::vector ghostings = out_mesh.ghostings(); + const std::vector const_fields(out_fields.begin(), out_fields.end()); + stk::mesh::communicate_field_data(*ghostings[stk::mesh::BulkData::AURA], const_fields); + } +} + +void +MeshClone::translate_parts(const stk::mesh::PartVector & in_parts, const stk::mesh::MetaData & out_meta, stk::mesh::PartVector & out_parts) +{ + out_parts.clear(); + for ( auto&& in_part : in_parts ) + { + stk::mesh::Part & out_part = out_meta.get_part(in_part->mesh_meta_data_ordinal()); + stk::mesh::insert(out_parts, out_part); + } +} + +stk::mesh::Selector +MeshClone::translate_selector(const stk::mesh::Selector & in_selector, const stk::mesh::MetaData & out_meta) +{ + if (in_selector == stk::mesh::Selector()) + { + return in_selector; + } + ThrowRequireMsg(in_selector.is_all_unions(), "Cannot translate selector " << in_selector); + stk::mesh::PartVector in_parts, out_parts; + in_selector.get_parts(in_parts); + translate_parts(in_parts, out_meta, out_parts); + return stk::mesh::selectUnion(out_parts); +} + +stk::mesh::Part * +MeshClone::translate_part(const stk::mesh::Part & in_part, const stk::mesh::MetaData & out_meta) +{ + return &out_meta.get_part(in_part.mesh_meta_data_ordinal()); +} + +void +MeshClone::get_bucket_parts(const stk::mesh::Bucket & bucket, stk::mesh::PartVector & parts) +{ + parts.clear(); + + stk::mesh::PartVector const& bucket_parts = bucket.supersets(); + for ( stk::mesh::PartVector::const_iterator ip = bucket_parts.begin(); ip != bucket_parts.end(); ++ip ) + { + stk::mesh::Part & bucket_part = **ip; + if (bucket_part.primary_entity_rank() != stk::topology::INVALID_RANK && bucket_part.primary_entity_rank() != bucket.entity_rank()) + { + continue; + } + if (stk::mesh::is_auto_declared_part(bucket_part) && !stk::mesh::is_topology_root_part(bucket_part)) + { + continue; + } + + parts.push_back(&bucket_part); + } + std::sort( parts.begin(), parts.end(), stk::mesh::PartLess() ); +} + +stk::mesh::Entity +MeshClone::get_entity_on_other_mesh(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const stk::mesh::BulkData & other_mesh) +{ + stk::mesh::EntityRank entity_rank = mesh.entity_rank(entity); + stk::mesh::Entity other_entity = other_mesh.get_entity( entity_rank, mesh.identifier(entity) ); + + if (other_mesh.is_valid(other_entity) && entity_rank != stk::topology::NODE_RANK) + { + // check if nodes are the same + const unsigned num_entity_nodes = mesh.num_nodes(entity); + const unsigned num_other_entity_nodes = other_mesh.num_nodes(other_entity); + if (num_entity_nodes != num_other_entity_nodes) + { + return stk::mesh::Entity(); + } + const stk::mesh::Entity* entity_nodes = mesh.begin_nodes(entity); + const stk::mesh::Entity* other_entity_nodes = other_mesh.begin_nodes(other_entity); + for (unsigned n=0; n +#include +#include +#include + +namespace krino { + +class MeshClone { +public: + + MeshClone( stk::mesh::BulkData & orig_mesh, stk::diag::Timer parent_timer, const unsigned step_count = 0 ); + + static bool exists(const stk::mesh::BulkData & mesh); + static MeshClone & get(const stk::mesh::BulkData & mesh); + static bool stash_or_restore_mesh(stk::mesh::BulkData & mesh, const unsigned step_count); + static bool stash_or_restore_mesh(stk::mesh::BulkData & mesh, + const unsigned step_count, + const std::function & notify_of_pre_mesh_modification, + const std::function & notify_of_post_mesh_modification); + bool mesh_is_up_to_date() const {return my_orig_mesh->synchronized_count() == my_synchronized_count;} + void mark_mesh_as_up_to_date() {my_synchronized_count = my_orig_mesh->synchronized_count();} + void mark_mesh_as_out_of_date() {--my_synchronized_count;} + +private: + void update(const unsigned step_count = 0); + void restore(const unsigned step_count = 0); + + static void clone_meta_data_parts_and_fields(const stk::mesh::MetaData & in_meta, stk::mesh::MetaData & out_meta); + static void translate_parts(const stk::mesh::PartVector & in_parts, const stk::mesh::MetaData & out_meta, stk::mesh::PartVector & out_parts); + static stk::mesh::Part * translate_part(const stk::mesh::Part & in_part, const stk::mesh::MetaData & out_meta); + static stk::mesh::Selector translate_selector(const stk::mesh::Selector & in_selector, const stk::mesh::MetaData & out_meta); + static void get_bucket_parts(const stk::mesh::Bucket & bucket, stk::mesh::PartVector & parts); + + static void clone_mesh(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const bool full_overwrite=false); + static void clone_bulk_data(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh); + static void copy_field_data(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const stk::mesh::FieldBase & in_field, const stk::mesh::FieldBase & out_field, const bool out_mesh_aura_from_communication); + static void copy_field_data(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh); + + static void delete_extraneous_entities(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh); + static void delete_all_entities(stk::mesh::BulkData & mesh); + static void clone_bulk_data_entities(const stk::mesh::BulkData & in_mesh, stk::mesh::BulkData & out_mesh, const bool search_for_existing); + + static stk::mesh::Entity get_entity_on_other_mesh(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const stk::mesh::BulkData & other_mesh); + + stk::mesh::BulkData* my_orig_mesh; + std::unique_ptr my_meta; + std::unique_ptr my_mesh; + + mutable stk::diag::Timer my_timer; + unsigned my_step_count; + size_t my_synchronized_count; +}; + +} // namespace krino + +#endif // Akri_MeshClone_h diff --git a/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.cpp b/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.cpp new file mode 100644 index 000000000000..e030340d2567 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.cpp @@ -0,0 +1,70 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace krino{ + +void print_volume_or_surface_area(const stk::mesh::BulkData& mesh, const stk::mesh::EntityRank entity_rank, const stk::mesh::Selector & active_selector, const stk::mesh::PartVector & parts) +{ + double overall_sum = 0.; + + const std::string label = (entity_rank == stk::topology::ELEMENT_RANK) ? "Volume" : "Surface Area"; + + krinolog << stk::diag::dendl; + + for (auto && part : parts) + { + const stk::mesh::Selector selector = mesh.mesh_meta_data().locally_owned_part() & active_selector & *part; + const double local_part_sum = compute_volume_or_surface_area(mesh, entity_rank, selector); + double global_part_sum = 0.; + + stk::all_reduce_sum(mesh.parallel(), &local_part_sum, &global_part_sum, 1); + overall_sum += global_part_sum; + + krinolog << label << " for part " << part->name() << " = " << global_part_sum << stk::diag::dendl; + } + + krinolog << "Sum of " << label << " for all parts (which may overlap) = " << overall_sum << stk::diag::dendl; +} + +double +compute_volume_or_surface_area(const stk::mesh::BulkData& mesh, const stk::mesh::EntityRank entity_rank, const stk::mesh::Selector & selector) +{ + const FieldRef coords_field(mesh.mesh_meta_data().coordinate_field()); + const unsigned dim = mesh.mesh_meta_data().spatial_dimension(); + + std::vector coords; + std::vector intg_weights; + + double volume_or_area = 0.; + for ( auto && bucket : mesh.get_buckets( entity_rank, selector ) ) + { + const krino::MasterElement& master_elem = MasterElementDeterminer::getMasterElement(bucket->topology()); + + for ( auto && entity : *bucket ) + { + ElementObj::gather_nodal_field(mesh, entity, coords_field, coords, dim); + ElementObj::integration_weights( intg_weights, dim, coords, master_elem ); + + for ( double intg_wt : intg_weights ) volume_or_area += intg_wt; + } + } + return volume_or_area; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.hpp b/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.hpp new file mode 100644 index 000000000000..668e904d417f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshDiagnostics.hpp @@ -0,0 +1,23 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MeshDiagnostics_h +#define Akri_MeshDiagnostics_h + +#include +#include +#include + +namespace krino { + +void print_volume_or_surface_area(const stk::mesh::BulkData& mesh, const stk::mesh::EntityRank entity_rank, const stk::mesh::Selector & active_selector, const stk::mesh::PartVector & parts); +double compute_volume_or_surface_area(const stk::mesh::BulkData& mesh, const stk::mesh::EntityRank entity_rank, const stk::mesh::Selector & selector); + +} // namespace krino + +#endif // Akri_MeshDiagnostics_h diff --git a/packages/krino/krino/krino_lib/Akri_MeshHelpers.cpp b/packages/krino/krino/krino_lib/Akri_MeshHelpers.cpp new file mode 100644 index 000000000000..f701face6949 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshHelpers.cpp @@ -0,0 +1,2560 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include // Needed for all_reduce_max +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino{ + +template +class ContainerResizer +{ +public: + ContainerResizer(CONTAINER & container) : myContainer(container) {} + void resize(size_t size) { myContainer.resize(size); } +private: + CONTAINER & myContainer; +}; + +template +class ContainerResizer> +{ +public: + ContainerResizer(std::array & container) : myContainer(container) {} + void resize(size_t size) { ThrowRequire(SIZE == size); } +private: + std::array & myContainer; +}; + +template +void resize_container(CONTAINER & container, size_t size) +{ + ContainerResizer resizer(container); + resizer.resize(size); +} + +void fill_procs_owning_or_sharing_or_ghosting_node(const stk::mesh::BulkData& bulkData, stk::mesh::Entity node, std::vector & procsOwningSharingOrGhostingNode) +{ + ThrowAssert(bulkData.parallel_owner_rank(node)==bulkData.parallel_rank()); + bulkData.comm_procs(bulkData.entity_key(node), procsOwningSharingOrGhostingNode); + procsOwningSharingOrGhostingNode.push_back(bulkData.parallel_rank()); +} + +//-------------------------------------------------------------------------------- + +template +void fill_element_node_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField, CONTAINER & elementNodeCoords) +{ + StkMeshEntities elementNodes{mesh.begin_nodes(element), mesh.end_nodes(element)}; + resize_container(elementNodeCoords, elementNodes.size()); + for (size_t n=0; n(coordsField, elementNodes[n]); + for ( int d = 0; d < DIM; ++d ) + elementNodeCoords[n][d] = coords[d]; + } +} + +void fill_element_node_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField, const int dim, std::vector & elementNodeCoords) +{ + ThrowAssert(dim == 3 || dim == 2); + if (dim == 2) + fill_element_node_coordinates<2>(mesh, element, coordsField, elementNodeCoords); + else + fill_element_node_coordinates<3>(mesh, element, coordsField, elementNodeCoords); +} + +void fill_element_node_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField, std::vector & elementNodeCoords) +{ + const int dim = mesh.mesh_meta_data().spatial_dimension(); + elementNodeCoords.clear(); + for (auto node : StkMeshEntities{mesh.begin_nodes(element), mesh.end_nodes(element)}) + elementNodeCoords.emplace_back(field_data(coordsField, node), dim); +} + +static std::array gather_tet_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField) +{ + ThrowAssert(mesh.bucket(element).topology() == stk::topology::TETRAHEDRON_4); + std::array elementNodeCoords; + fill_element_node_coordinates<3>(mesh, element, coordsField, elementNodeCoords); + return elementNodeCoords; +} + +static std::array gather_tri_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField) +{ + ThrowAssert(mesh.bucket(element).topology() == stk::topology::TRIANGLE_3_2D); + std::array elementNodeCoords; + fill_element_node_coordinates<2>(mesh, element, coordsField, elementNodeCoords); + return elementNodeCoords; +} + +static double compute_tri_volume(const std::array & elementNodeCoords) +{ + return 0.5*(Cross(elementNodeCoords[1]-elementNodeCoords[0], elementNodeCoords[2]-elementNodeCoords[0]).length()); +} + +static double compute_tet_volume(const std::array & elementNodeCoords) +{ + return Dot(elementNodeCoords[3]-elementNodeCoords[0],Cross(elementNodeCoords[1]-elementNodeCoords[0], elementNodeCoords[2]-elementNodeCoords[0]))/6.0; +} + +static double compute_tri_or_tet_volume(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField) +{ + stk::topology elemTopology = mesh.bucket(element).topology(); + + if (elemTopology == stk::topology::TETRAHEDRON_4) + { + const auto elementNodeCoords = gather_tet_coordinates(mesh, element, coordsField); + return compute_tet_volume(elementNodeCoords); + } + + ThrowRequireMsg(elemTopology == stk::topology::TRIANGLE_3_2D, "Topology " << elemTopology << " not supported in compute_tri_or_tet_volume."); + const auto elementNodeCoords = gather_tri_coordinates(mesh, element, coordsField); + return compute_tri_volume(elementNodeCoords); +} + +static void update_min_max_values(const double currentValue, double & minValue, double & maxValue) +{ + minValue = std::min(minValue, currentValue); + maxValue = std::max(maxValue, currentValue); +} + +template +void update_min_max_edge_lengths_squared(const CONTAINER & elementNodeCoords, double & minEdgeLengthSqr, double & maxEdgeLengthSqr) +{ + for ( size_t inode = 0; inode < elementNodeCoords.size(); ++inode ) + for ( size_t jnode = inode+1; jnode < elementNodeCoords.size(); ++jnode ) + update_min_max_values((elementNodeCoords[inode] - elementNodeCoords[jnode]).length_squared(), minEdgeLengthSqr, maxEdgeLengthSqr); +} + +template +void update_max_edge_lengths_squared(const CONTAINER & elementNodeCoords, double & maxEdgeLengthSqr) +{ + // This is a little strange for non-simplex elements since it goes from each node to every other node + for ( size_t inode = 0; inode < elementNodeCoords.size(); ++inode ) + for ( size_t jnode = inode+1; jnode < elementNodeCoords.size(); ++jnode ) + maxEdgeLengthSqr = std::max(maxEdgeLengthSqr, (elementNodeCoords[inode] - elementNodeCoords[jnode]).length_squared()); +} + +//-------------------------------------------------------------------------------- + +double +compute_maximum_element_size(stk::mesh::BulkData& mesh) +{ + const unsigned ndim = mesh.mesh_meta_data().spatial_dimension(); + double max_sqr_edge_length = 0.0; + + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + + stk::mesh::Selector locally_owned_selector = mesh.mesh_meta_data().locally_owned_part(); + + const stk::mesh::BucketVector & buckets = mesh.get_buckets( stk::topology::ELEMENT_RANK, locally_owned_selector ); + std::vector elementNodeCoords; + + for ( auto && bucket : buckets ) + { + for ( auto && elem : *bucket ) + { + fill_element_node_coordinates(mesh, elem, coordsField, ndim, elementNodeCoords); + update_max_edge_lengths_squared(elementNodeCoords, max_sqr_edge_length); + } + } + + const double local_max = max_sqr_edge_length; + stk::all_reduce_max(mesh.parallel(), &local_max, &max_sqr_edge_length, 1); + + return std::sqrt(max_sqr_edge_length); +} + +//-------------------------------------------------------------------------------- + +void compute_element_quality(const stk::mesh::BulkData & mesh, double & minEdgeLength, double & maxEdgeLength, double & minVolume, double & maxVolume) +{ + double minEdgeLengthSqr = std::numeric_limits::max(); + double maxEdgeLengthSqr = -std::numeric_limits::max(); + minVolume = std::numeric_limits::max(); + maxVolume = std::numeric_limits::lowest(); + + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + + stk::mesh::Selector locally_owned_selector = mesh.mesh_meta_data().locally_owned_part(); + + const stk::mesh::BucketVector & buckets = mesh.get_buckets( stk::topology::ELEMENT_RANK, locally_owned_selector ); + + for ( auto && bucket : buckets ) + { + stk::topology elem_topology = bucket->topology(); + const unsigned num_nodes = elem_topology.num_nodes(); + std::vector elem_node_coords(num_nodes); + + for ( auto && elem : *bucket ) + { + if (elem_topology == stk::topology::TETRAHEDRON_4) + { + const auto elementNodeCoords = gather_tet_coordinates(mesh, elem, coordsField); + update_min_max_values(compute_tet_volume(elementNodeCoords), minVolume, maxVolume); + update_min_max_edge_lengths_squared(elementNodeCoords, minEdgeLengthSqr, maxEdgeLengthSqr); + } + else if (elem_topology == stk::topology::TRIANGLE_3_2D) + { + const auto elementNodeCoords = gather_tri_coordinates(mesh, elem, coordsField); + update_min_max_values(compute_tri_volume(elementNodeCoords), minVolume, maxVolume); + update_min_max_edge_lengths_squared(elementNodeCoords, minEdgeLengthSqr, maxEdgeLengthSqr); + } + else + { + ThrowRuntimeError("Topology " << elem_topology << " not supported in compute_element_quality."); + } + } + } + + const double localMinEdgeLength = std::sqrt(minEdgeLengthSqr); + stk::all_reduce_min(mesh.parallel(), &localMinEdgeLength, &minEdgeLength, 1); + const double localMaxEdgeLength = std::sqrt(maxEdgeLengthSqr); + stk::all_reduce_max(mesh.parallel(), &localMaxEdgeLength, &maxEdgeLength, 1); + const double localMinVolume = minVolume; + stk::all_reduce_min(mesh.parallel(), &localMinVolume, &minVolume, 1); + const double localMaxVolume = maxVolume; + stk::all_reduce_max(mesh.parallel(), &localMaxVolume, &maxVolume, 1); +} + +static std::vector get_owned_nodes_with_nodal_volume_below_threshold(const stk::mesh::BulkData & mesh, const stk::mesh::Selector & blockSelector, const double threshold) +{ + ThrowRequireMsg(mesh.is_automatic_aura_on() || mesh.parallel_size() == 1, "Method requires automatic aura."); + + // This would be more efficient if a nodal field was used because it could compute the element volume only once. + std::vector ownedNodesWithNodalVolBelowThreshold; + + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + std::vector elementNodeCoords; + + stk::mesh::Selector ownedBlockSelector = mesh.mesh_meta_data().locally_owned_part() & blockSelector; + + const stk::mesh::BucketVector & buckets = mesh.get_buckets( stk::topology::NODE_RANK, ownedBlockSelector ); + + for ( auto && bucket : buckets ) + { + for ( auto && node : *bucket ) + { + double nodalVolume = 0.; + for (auto && element : StkMeshEntities{mesh.begin_elements(node), mesh.end_elements(node)}) + { + if (blockSelector(mesh.bucket(element))) + nodalVolume += compute_tri_or_tet_volume(mesh, element, coordsField); + + if (nodalVolume >= threshold) + break; + } + if (nodalVolume < threshold) + ownedNodesWithNodalVolBelowThreshold.push_back(node); + } + } + return ownedNodesWithNodalVolBelowThreshold; +} + +static std::vector get_nodes_with_no_attached_elements(const stk::mesh::BulkData & mesh) +{ + ThrowRequireMsg(mesh.is_automatic_aura_on() || mesh.parallel_size() == 1, "Method requires automatic aura."); + + std::vector nodesWithNoAttachedElements; + + for ( auto && bucket : mesh.buckets(stk::topology::NODE_RANK) ) + for ( auto && node : *bucket ) + if (mesh.num_elements(node) == 0) + nodesWithNoAttachedElements.push_back(node); + + return nodesWithNoAttachedElements; +} + +static +void pack_entities_for_sharing_procs(const stk::mesh::BulkData & mesh, + const std::vector & entities, + stk::CommSparse &commSparse) +{ + std::vector sharingProcs; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto entity : entities) + { + if (mesh.bucket(entity).shared()) + { + mesh.comm_shared_procs(entity, sharingProcs); + for (int procId : sharingProcs) + commSparse.send_buffer(procId).pack(mesh.entity_key(entity)); + } + } + }); +} + +static +void unpack_shared_entities(const stk::mesh::BulkData & mesh, + std::vector & sharedEntities, + stk::CommSparse &commSparse) +{ + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + stk::mesh::EntityKey entityKey; + commSparse.recv_buffer(procId).unpack(entityKey); + stk::mesh::Entity entity = mesh.get_entity(entityKey); + ThrowAssert(mesh.is_valid(entity)); + sharedEntities.push_back(entity); + } + }); +} + +static +void append_shared_entities_to_owned_ones(const stk::mesh::BulkData & mesh, + std::vector & entities) +{ + stk::CommSparse commSparse(mesh.parallel()); + pack_entities_for_sharing_procs(mesh, entities, commSparse); + + std::vector sharedEntities; + unpack_shared_entities(mesh, sharedEntities, commSparse); + entities.insert(entities.end(), sharedEntities.begin(), sharedEntities.end()); +} + +//-------------------------------------------------------------------------------- + +void delete_node_and_all_entities_using_it(stk::mesh::BulkData & mesh, const stk::mesh::Entity node) +{ + std::vector relatives; + + const stk::mesh::EntityRank highestEntityRank = static_cast(mesh.mesh_meta_data().entity_rank_count()-1); + for (stk::mesh::EntityRank irank = highestEntityRank; irank != stk::topology::NODE_RANK; --irank) + { + relatives.assign(mesh.begin(node, irank), mesh.end(node, irank)); + for (auto && relative : relatives) + ThrowRequire(mesh.destroy_entity(relative)); + } + ThrowRequire(mesh.destroy_entity(node)); +} + +static void delete_nodes_and_all_entities_using_them(stk::mesh::BulkData & mesh, const std::vector & nodesToDelete) +{ + mesh.modification_begin(); + for (auto && node : nodesToDelete) + delete_node_and_all_entities_using_it(mesh, node); + mesh.modification_end(); +} + +static size_t delete_nodes_with_nodal_volume_below_threshold_and_all_entities_using_them(stk::mesh::BulkData & mesh, const stk::mesh::Selector & blockSelector, const double threshold) +{ + std::vector nodesToDelete = get_owned_nodes_with_nodal_volume_below_threshold(mesh, blockSelector, threshold); + const size_t globalNumNodesToDelete = stk::get_global_sum(mesh.parallel(), nodesToDelete.size()); + + if (globalNumNodesToDelete > 0) + { + append_shared_entities_to_owned_ones(mesh, nodesToDelete); + delete_nodes_and_all_entities_using_them(mesh, nodesToDelete); + } + return globalNumNodesToDelete; +} + +static size_t delete_nodes_with_no_attached_elements(stk::mesh::BulkData & mesh) +{ + const std::vector nodesToDelete = get_nodes_with_no_attached_elements(mesh); + const size_t globalNumNodesToDelete = stk::get_global_sum(mesh.parallel(), nodesToDelete.size()); + + if (globalNumNodesToDelete > 0) + delete_nodes_and_all_entities_using_them(mesh, nodesToDelete); + + return globalNumNodesToDelete; +} + +void delete_all_entities_using_nodes_with_nodal_volume_below_threshold(stk::mesh::BulkData & mesh, const stk::mesh::Selector & blockSelector, const double threshold) +{ + const int maxIterations = 10; + int iteration = 0; + while (++iteration <= maxIterations) + { + const size_t numNodesDeletedWithSmallVolume = delete_nodes_with_nodal_volume_below_threshold_and_all_entities_using_them(mesh, blockSelector, threshold); + if (numNodesDeletedWithSmallVolume > 0) + { + sierra::Env::outputP0() << "Iteration " << iteration << ":" << std::endl; + sierra::Env::outputP0() << " Deleted " << numNodesDeletedWithSmallVolume << " node(s) with a nodal volume less than " << threshold << " (and all attached entities)." << std::endl; + const size_t numNodesDeletedWithNoElements = delete_nodes_with_no_attached_elements(mesh); + sierra::Env::outputP0() << " Deleted " << numNodesDeletedWithNoElements << " node(s) that have no attached elements." << std::endl; + } + else + break; + } + if (iteration < maxIterations) + sierra::Env::outputP0() << "Successfully deleted all nodes with a nodal volume less than " << threshold << "." << std::endl; + else + sierra::Env::outputP0() << "Terminating after performing max iterations. There still may be nodes with a nodal volume less than " << threshold << "." << std::endl; +} + +//-------------------------------------------------------------------------------- + +struct ActiveChildNodeRequest +{ + std::vector m_parents; + std::vector m_sharing_procs; + std::vector > m_id_proc_pairs_from_all_procs; + bool m_id_procs_pairs_have_been_sorted; + stk::mesh::Entity *m_node_entity; + + ActiveChildNodeRequest(const std::vector & parents, stk::mesh::Entity *entity_place_holder=NULL) + : m_parents(parents), m_sharing_procs(), m_id_proc_pairs_from_all_procs(), + m_id_procs_pairs_have_been_sorted(false), m_node_entity(entity_place_holder) + { + std::sort(m_parents.begin(), m_parents.end()); + } + + void add_proc_id_pair(int proc_id, stk::mesh::EntityId id) + { + m_id_proc_pairs_from_all_procs.push_back(std::make_pair(proc_id, id)); + } + + void calculate_sharing_procs(stk::mesh::BulkData& mesh) + { + ThrowRequire(!m_parents.empty()); + + stk::mesh::EntityKey key0(stk::topology::NODE_RANK, m_parents[0]); + mesh.comm_shared_procs(key0, m_sharing_procs); + std::sort(m_sharing_procs.begin(), m_sharing_procs.end()); + + std::vector sharingProcs; + for (unsigned i=1; i working_set; + m_sharing_procs.swap(working_set); + std::set_intersection(working_set.begin(),working_set.end(),sharingProcs.begin(),sharingProcs.end(),std::back_inserter(m_sharing_procs)); + } + } + + size_t num_sharing_procs() const + { + return m_sharing_procs.size(); + } + + int sharing_proc(int index) const + { + return m_sharing_procs[index]; + } + + stk::mesh::EntityId suggested_node_id() const + { + ThrowRequireMsg(!m_id_procs_pairs_have_been_sorted, "Invalid use of child node calculation. Contact sierra-help"); + return m_id_proc_pairs_from_all_procs[0].second; + } + + void sort_id_proc_pairs() + { + m_id_procs_pairs_have_been_sorted = true; + std::sort(m_id_proc_pairs_from_all_procs.begin(), m_id_proc_pairs_from_all_procs.end()); + } + + stk::mesh::EntityId get_id_for_child() const + { + ThrowRequireMsg(m_id_procs_pairs_have_been_sorted, "Invalid use of child node calculation. Contact sierra-help"); + return m_id_proc_pairs_from_all_procs[0].second; + } + + void set_node_entity_for_request(stk::mesh::BulkData& mesh, const stk::mesh::PartVector & node_parts) + { + this->sort_id_proc_pairs(); + stk::mesh::EntityId id_for_child = get_id_for_child(); + *m_node_entity = mesh.declare_node(id_for_child, node_parts); + for (size_t i=0;i & child_node_requests, const stk::mesh::PartVector & node_parts, bool assert_32bit_ids, bool make_64bit_ids) +{ + std::vector communicate_request(child_node_requests.size(), false); + + unsigned num_nodes_requested = child_node_requests.size(); + std::vector available_node_ids; + + EntityIdPool::generate_new_ids(mesh, stk::topology::NODE_RANK, num_nodes_requested, available_node_ids, assert_32bit_ids, make_64bit_ids); + + while ( true ) + { + int more_work_to_be_done = false; + + std::vector active_child_node_requests; + + for (unsigned it_req=0; it_req & request_parents = request.parents; + + bool request_is_ready = true; + for (auto && request_parent : request_parents) + { + if (!mesh.is_valid(*request_parent)) + { + request_is_ready = false; + } + } + + if (request_is_ready) + { + stk::mesh::Entity *request_child = request.child; + + communicate_request[it_req] = true; + more_work_to_be_done = true; + + std::vector parent_ids(request_parents.size()); + for (size_t parent_index=0; parent_index & request_parents = active_child_node_requests[request_index].m_parents; + const stk::mesh::EntityId this_procs_suggested_id = active_child_node_requests[request_index].suggested_node_id(); + const size_t num_parents = request_parents.size(); + comm_spec.send_buffer(other_proc).pack(num_parents); + for (size_t parent_index=0; parent_index request_parents(num_parents); + for (size_t parent_index=0; parent_index::iterator iter = std::lower_bound(active_child_node_requests.begin(), active_child_node_requests.end(), from_other_proc); + + if ( iter != active_child_node_requests.end() && *iter == from_other_proc) + { + iter->add_proc_id_pair(i, suggested_node_id); + } + } + } + } + + for (size_t request_index=0;request_index::iterator iter = std::find(communicate_request.begin(), communicate_request.end(), false); + ThrowRequireMsg(iter == communicate_request.end(), "Invalid child node request. Contact sierra-help."); +} + +//-------------------------------------------------------------------------------- + +void +batch_create_sides(stk::mesh::BulkData & mesh, const std::vector & side_requests) +{ + const stk::mesh::EntityRank side_rank = mesh.mesh_meta_data().side_rank(); + + if (!mesh.has_face_adjacent_element_graph()) + { + mesh.initialize_face_adjacent_element_graph(); + } + + mesh.modification_begin(); + for (auto && side_request : side_requests) + { + stk::mesh::Entity element = side_request.element; + const unsigned element_side_ord = side_request.element_side_ordinal; + + stk::mesh::Entity existing_element_side = find_entity_by_ordinal(mesh, element, side_rank, element_side_ord); + if (mesh.is_valid(existing_element_side)) + { + continue; + } + + mesh.declare_element_side(element, element_side_ord, side_request.side_parts); + } + mesh.modification_end(); + + ThrowAssert(check_face_and_edge_ownership(mesh)); + ThrowAssert(check_face_and_edge_relations(mesh)); +} + +//-------------------------------------------------------------------------------- + +void +make_side_ids_consistent_with_stk_convention(stk::mesh::BulkData & mesh) +{ + const stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + const stk::mesh::EntityRank side_rank = meta.side_rank(); + stk::mesh::Selector not_ghost_selector(meta.locally_owned_part() | meta.globally_shared_part()); + + std::vector sides; + stk::mesh::get_selected_entities( not_ghost_selector, mesh.buckets(side_rank), sides ); + + std::vector side_requests; + + mesh.modification_begin(); + for (auto&& side : sides) + { + const unsigned num_side_elems = mesh.num_elements(side); + const stk::mesh::Entity* side_elems = mesh.begin_elements(side); + const stk::mesh::ConnectivityOrdinal* side_elem_ordinals = mesh.begin_element_ordinals(side); + ThrowRequire(num_side_elems > 0); + stk::mesh::EntityId newId = 0; + for (unsigned i=0; i * const coordsField) +{ + stk::topology elem_topology = mesh.bucket(element).topology(); + if (elem_topology == stk::topology::TETRAHEDRON_4) + { + const std::array nodes = gather_tet_coordinates(mesh, element, coordsField); + const double vol = compute_tet_volume(nodes); + compute_tri_or_tet_volume(mesh, element, *coordsField); + const double edge_rms = std::sqrt( + ((nodes[1]-nodes[0]).length_squared() + + (nodes[2]-nodes[0]).length_squared() + + (nodes[3]-nodes[0]).length_squared() + + (nodes[3]-nodes[1]).length_squared() + + (nodes[3]-nodes[2]).length_squared() + + (nodes[2]-nodes[1]).length_squared())/6.); + return vol/(edge_rms*edge_rms*edge_rms); + } + ThrowRuntimeError("Topology " << elem_topology << " not supported in compute_element_volume_to_edge_ratio."); +} + +//-------------------------------------------------------------------------------- + +static void +debug_entity(std::ostream & output, const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const bool includeFields) +{ + if (!mesh.is_valid(entity)) + { + output << "Invalid entity: " << mesh.entity_key(entity) << std::endl; + return; + } + output << mesh.entity_key(entity) << ", parallel owner = " << mesh.parallel_owner_rank(entity) << " {" << std::endl; + output << " Connectivity:" << std::endl; + const stk::mesh::EntityRank end_rank = static_cast(mesh.mesh_meta_data().entity_rank_count()); + for (stk::mesh::EntityRank r = stk::topology::BEGIN_RANK; r < end_rank; ++r) { + unsigned num_rels = mesh.num_connectivity(entity, r); + stk::mesh::Entity const *rel_entities = mesh.begin(entity, r); + stk::mesh::ConnectivityOrdinal const *rel_ordinals = mesh.begin_ordinals(entity, r); + stk::mesh::Permutation const *rel_permutations = mesh.begin_permutations(entity, r); + for (unsigned i = 0; i < num_rels; ++i) { + output << " " << mesh.entity_key(rel_entities[i]) + << " @" << rel_ordinals[i]; + if (rel_permutations) output << ":" << (int)rel_permutations[i]; + output << std::endl; + } + } + output << " Parts: "; + const stk::mesh::PartVector & parts = mesh.bucket(entity).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = parts.begin(); part_iter != parts.end(); ++part_iter) + { + const stk::mesh::Part * const part = *part_iter; + output << part->name() << " "; + } + output << std::endl; + + if (includeFields) + { + const stk::mesh::FieldVector & all_fields = mesh.mesh_meta_data().get_fields(); + for ( stk::mesh::FieldVector::const_iterator it = all_fields.begin(); it != all_fields.end() ; ++it ) + { + const FieldRef field = (const FieldRef)(**it); + + if(field.entity_rank()!=mesh.entity_rank(entity)) continue; + + const unsigned field_length = field.length(); + + field.field().sync_to_host(); + if (field.type_is()) + { + const double * data = field_data(field, entity); + if (NULL != data) + { + if (1 == field_length) + { + output << " Field: field_name=" << field.name() << ", field_state=" << field.state() << ", value=" << *data << std::endl; + } + else + { + for (unsigned i = 0; i < field_length; ++i) + { + output << " Field: field_name=" << field.name() << ", field_state=" << field.state() << ", value[" << i << "]=" << data[i] << std::endl; + } + } + } + } + else if (field.type_is()) + { + const int * data = field_data(field, entity); + if (NULL != data) + { + if (1 == field_length) + { + output << " Field: field_name=" << field.name() << ", field_state=" << field.state() << ", value=" << *data << std::endl; + } + else + { + for (unsigned i = 0; i < field_length; ++i) + { + output << " Field: field_name=" << field.name() << ", field_state=" << field.state() << ", value[" << i << "]=" << data[i] << std::endl; + } + } + } + } + } + output << std::endl; + } +} + +std::string +debug_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const bool includeFields) +{ + std::ostringstream out; + debug_entity(out, mesh, entity, includeFields); + return out.str(); +} + +std::string +debug_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity) +{ + return debug_entity(mesh, entity, false); +} + +//-------------------------------------------------------------------------------- + +std::vector +get_side_permutation(stk::topology topology, stk::mesh::Permutation node_permutation) +{ + const unsigned perm = node_permutation; + switch (topology) + { + case stk::topology::TRIANGLE_3_2D: + case stk::topology::TRIANGLE_6_2D: + switch (perm) + { + case 0: return {0, 1, 2}; + case 1: return {2, 0, 1}; + case 2: return {1, 2, 0}; + default: ThrowRuntimeError("find_side_permutation error, invalid triangle permutation."); + } + break; + case stk::topology::TETRAHEDRON_4: + case stk::topology::TETRAHEDRON_10: + switch (perm) + { + case 0: return {0, 1, 2, 3}; + case 1: return {1, 2, 0, 3}; + case 2: return {2, 0, 1, 3}; + case 3: return {2, 1, 3, 0}; + case 4: return {1, 3, 2, 0}; + case 5: return {3, 2, 1, 0}; + case 6: return {3, 1, 0, 2}; + case 7: return {1, 0, 3, 2}; + case 8: return {0, 3, 1, 2}; + case 9: return {0, 2, 3, 1}; + case 10: return {2, 3, 0, 1}; + case 11: return {3, 0, 2, 1}; + default: ThrowRuntimeError("find_side_permutation error, invalid tetrahedron permutation."); + } + break; + default: ThrowRuntimeError("find_side_permutation error, unsupported topology."); + } +} + +//-------------------------------------------------------------------------------- + +const stk::mesh::Part & +find_element_part(const stk::mesh::BulkData& mesh, stk::mesh::Entity elem) +{ + ThrowAssert(mesh.entity_rank(elem) == stk::topology::ELEMENT_RANK); + const stk::mesh::Part * elem_io_part = nullptr; + + const stk::mesh::PartVector & elem_parts = mesh.bucket(elem).supersets(); + for(stk::mesh::PartVector::const_iterator part_iter = elem_parts.begin(); part_iter != elem_parts.end(); ++part_iter) + { + const stk::mesh::Part * const part = *part_iter; + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK && part->subsets().empty() && part->topology() != stk::topology::INVALID_TOPOLOGY) + { + // there should only be one element rank part without subsets with topology on the element + ThrowRequireMsg(nullptr == elem_io_part, "For element " << mesh.identifier(elem) << ", more than one element rank part was found: " << elem_io_part->name() << " " << part->name()); + elem_io_part = part; + } + } + ThrowRequire(NULL != elem_io_part); + + return *elem_io_part; +} + +//-------------------------------------------------------------------------------- + +void +disconnect_entity(stk::mesh::BulkData & mesh, stk::mesh::Entity entity) +{ + stk::mesh::EntityRank entity_rank = mesh.entity_rank(entity); + std::vector relatives; + std::vector relative_ordinals; + + const stk::mesh::EntityRank highest_entity_rank = static_cast(mesh.mesh_meta_data().entity_rank_count()-1); + for (stk::mesh::EntityRank irank = highest_entity_rank; irank != entity_rank; --irank) + { + // Previously this attempted to delete forward or backward and still the list got corrupted, + // so just copy into vector and delete from there. + relatives.assign(mesh.begin(entity, irank),mesh.end(entity, irank)); + relative_ordinals.assign(mesh.begin_ordinals(entity, irank), mesh.end_ordinals(entity, irank)); + + for (size_t irel = 0; irel < relatives.size(); ++irel) + { + mesh.destroy_relation( relatives[irel], entity, relative_ordinals[irel]); + } + } +} + +//-------------------------------------------------------------------------------- + +bool +disconnect_and_destroy_entity(stk::mesh::BulkData & mesh, stk::mesh::Entity entity) +{ + disconnect_entity(mesh, entity); + return mesh.destroy_entity(entity); +} + +//-------------------------------------------------------------------------------- + +bool +check_induced_parts(const stk::mesh::BulkData & mesh) +{ /* %TRACE[ON]% */ Trace trace__("krino::debug_induced_parts()"); /* %TRACE% */ + + // This method requires aura to work correctly. + if (!mesh.is_automatic_aura_on() && mesh.parallel_size() > 1) + { + // Skip check if we don't have aura + return true; + } + + bool success = true; + + const stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::mesh::Selector not_ghost_selector(meta.locally_owned_part() | meta.globally_shared_part()); + + std::vector< stk::mesh::Entity> entities; + + for (stk::mesh::EntityRank entity_rank = stk::topology::NODE_RANK; entity_rank <= stk::topology::ELEMENT_RANK; ++entity_rank) + { + stk::mesh::get_selected_entities( not_ghost_selector, mesh.buckets(entity_rank), entities ); + + for (unsigned i=0; iprimary_entity_rank() == entity_rank) + { + bool have_relative_missing_part = false; + const unsigned num_relatives = mesh.num_connectivity(entity, relative_rank); + const stk::mesh::Entity* relatives = mesh.begin(entity, relative_rank); + for (unsigned it_rel=0; it_relname() << " is found on " << mesh.entity_key(entity) << " but is missing from relatives: "; + for (unsigned it_rel=0; it_relprimary_entity_rank() == relative_rank) + { + bool found_relative_with_part = false; + const unsigned num_relatives = mesh.num_connectivity(entity, relative_rank); + const stk::mesh::Entity* relatives = mesh.begin(entity, relative_rank); + for (unsigned it_rel=0; it_relname() << " is found on " << mesh.entity_key(entity) << " but not on any of its relatives: "; + for (unsigned it_rel=0; it_rel & remote_entity_node_ids) +{ + stk::mesh::Entity entity = mesh.get_entity(remote_entity_key); + if (!mesh.is_valid(entity)) + { + krinolog << "Shared entity error, local entity does not exist, remote entity: " << remote_entity_key << stk::diag::dendl; + return false; + } + + std::vector entity_nodes(mesh.begin_nodes(entity), mesh.end_nodes(entity)); + if (entity_nodes.size() != remote_entity_node_ids.size()) + { + krinolog << "Shared entity error, number_of nodes don't match, number of remote nodes = " << remote_entity_node_ids.size() << stk::diag::dendl; + krinolog << "Local entity: " << debug_entity(mesh, entity) << stk::diag::dendl; + return false; + } + + bool nodes_match = true; + for (size_t node_index=0;node_index & entities) +{ + bool success = true; + + std::vector sharing_procs; + stk::CommSparse comm_spec(mesh.parallel()); + + for (int phase=0;phase<2;++phase) + { + for (std::vector::iterator it_entity = entities.begin(); it_entity != entities.end(); ++it_entity) + { + stk::mesh::Entity entity = *it_entity; + std::vector entity_nodes(mesh.begin_nodes(entity), mesh.end_nodes(entity)); + stk::mesh::EntityKey entity_key = mesh.entity_key(entity); + ThrowRequire(mesh.bucket(entity).shared()); + + mesh.shared_procs_intersection(entity_nodes, sharing_procs); + for (size_t proc_index=0;proc_index entity_node_ids(num_nodes); + for (size_t node_index=0; node_index sharing_procs; + stk::CommSparse comm_spec(mesh.parallel()); + + bool success = true; + stk::mesh::Selector shared_selector = meta.globally_shared_part(); + std::vector entities; + + for (stk::mesh::EntityRank entity_rank = stk::topology::EDGE_RANK; entity_rank < stk::topology::ELEMENT_RANK; ++entity_rank) + { + stk::mesh::get_selected_entities( shared_selector, mesh.buckets( entity_rank ), entities ); + + if (!check_shared_entity_nodes(mesh, entities)) success = false; + } + return success; +} + +//-------------------------------------------------------------------------------- + +bool +check_face_and_edge_relations(const stk::mesh::BulkData & mesh) +{ + const stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + + bool success = true; + stk::mesh::Selector not_ghost_selector = meta.locally_owned_part() | meta.globally_shared_part(); + + for (stk::mesh::EntityRank entity_rank = stk::topology::EDGE_RANK; entity_rank <= stk::topology::FACE_RANK; ++entity_rank) + { + const stk::mesh::BucketVector & buckets = mesh.get_buckets( entity_rank, not_ghost_selector ); + + stk::mesh::BucketVector::const_iterator ib = buckets.begin(); + stk::mesh::BucketVector::const_iterator ib_end = buckets.end(); + + for ( ; ib != ib_end; ++ib ) + { + const stk::mesh::Bucket & b = **ib; + const size_t length = b.size(); + for (size_t it_entity = 0; it_entity < length; ++it_entity) + { + stk::mesh::Entity entity = b[it_entity]; + stk::topology entity_topology = mesh.bucket(entity).topology(); + std::vector entity_nodes(mesh.begin_nodes(entity), mesh.end_nodes(entity)); + std::vector entity_elems; + stk::mesh::get_entities_through_relations(mesh, entity_nodes, stk::topology::ELEMENT_RANK, entity_elems); + + if (entity_elems.empty()) + { + krinolog << "Relation error, entity not attached to any elements: " << stk::diag::dendl; + krinolog << "Entity: " << debug_entity(mesh, entity) << stk::diag::dendl; + success = false; + } + + bool have_coincident_shell = false; + std::pair shell_relationship(stk::mesh::INVALID_CONNECTIVITY_ORDINAL, stk::mesh::INVALID_PERMUTATION); + for (auto&& elem : entity_elems) + { + stk::topology elem_topology = mesh.bucket(elem).topology(); + if (elem_topology.is_shell() && elem_topology.num_nodes() == entity_topology.num_nodes()) + { + have_coincident_shell = true; + shell_relationship = determine_shell_side_ordinal_and_permutation(mesh, elem, entity); + break; + } + } + + for (auto&& elem : entity_elems) + { + stk::topology elem_topology = mesh.bucket(elem).topology(); + const bool is_coincident_shell = (elem_topology.is_shell() && elem_topology.num_nodes() == entity_topology.num_nodes()); + bool should_be_attached = true; + if (have_coincident_shell && !is_coincident_shell) + { + // Volume elements should only be attached to inward pointing faces when the surface has a shell. + std::pair relationship = determine_ordinal_and_permutation(mesh, elem, entity); + const bool elem_polarity = entity_topology.is_positive_polarity(relationship.second); + const bool shell_polarity = entity_topology.is_positive_polarity(shell_relationship.second); + should_be_attached = elem_polarity != shell_polarity; + } + + const unsigned num_elem_entities = mesh.num_connectivity(elem, entity_rank); + const stk::mesh::Entity* elem_entities = mesh.begin(elem, entity_rank); + const stk::mesh::ConnectivityOrdinal * elem_ordinals = mesh.begin_ordinals(elem, entity_rank); + const stk::mesh::Permutation * elem_permutations = mesh.begin_permutations(elem, entity_rank); + bool already_attached = false; + for (unsigned it_s=0; it_s relationship = + is_coincident_shell ? + shell_relationship : + determine_ordinal_and_permutation(mesh, elem, entity); + if (relationship.first != elem_ordinals[it_s]) + { + krinolog << "Relation error, ordinal is incorrect: " << relationship.first << "!=" << elem_ordinals[it_s] << stk::diag::dendl; + krinolog << "Entity: " << debug_entity(mesh, entity) << stk::diag::dendl; + krinolog << "Element: " << debug_entity(mesh, elem) << stk::diag::dendl; + success = false; + } + if (relationship.second != elem_permutations[it_s]) + { + krinolog << "Relation error, permutation is incorrect: " << relationship.second << "!=" << elem_permutations[it_s] << stk::diag::dendl; + krinolog << "Entity: " << debug_entity(mesh, entity) << stk::diag::dendl; + krinolog << "Element: " << debug_entity(mesh, elem) << stk::diag::dendl; + success = false; + } + } + } + } + if (!already_attached && should_be_attached) + { + + krinolog << "Relation error, entity is not attached to element: " << stk::diag::dendl; + krinolog << "Entity: " << debug_entity(mesh, entity) << stk::diag::dendl; + krinolog << "Element: " << debug_entity(mesh, elem) << stk::diag::dendl; + std::pair relationship = determine_ordinal_and_permutation(mesh, elem, entity); + for (unsigned it_s=0; it_s entities; + stk::mesh::get_entities( mesh, meta.side_rank(), entities ); + + mesh.modification_begin(); + for (auto&& entity : entities) + { + attach_entity_to_elements(mesh, entity); + } + mesh.modification_end(); +} + +void +attach_entity_to_elements(stk::mesh::BulkData & mesh, stk::mesh::Entity entity) +{ + //Sorry! Passing these scratch vectors into stk's declare_relation function is + //a performance improvement (fewer allocations). But stk will try to clean up + //this ugliness soon. (i.e., find a better way to get the performance.) + stk::mesh::OrdinalVector scratch1, scratch2, scratch3; + + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::topology entity_topology = mesh.bucket(entity).topology(); + stk::mesh::EntityRank entity_rank = entity_topology.rank(); + std::vector entity_nodes(mesh.begin_nodes(entity), mesh.end_nodes(entity)); + std::vector entity_elems; + stk::mesh::get_entities_through_relations(mesh, entity_nodes, stk::topology::ELEMENT_RANK, entity_elems); + + bool have_coincident_shell = false; + std::pair shell_relationship(stk::mesh::INVALID_CONNECTIVITY_ORDINAL, stk::mesh::INVALID_PERMUTATION); + for (auto&& elem : entity_elems) + { + stk::topology elem_topology = mesh.bucket(elem).topology(); + if (elem_topology.is_shell() && elem_topology.num_nodes() == entity_topology.num_nodes()) + { + have_coincident_shell = true; + shell_relationship = determine_shell_side_ordinal_and_permutation(mesh, elem, entity); + break; + } + } + + for (auto&& elem : entity_elems) + { + if (!mesh.bucket(elem).member(meta.locally_owned_part())) + { + continue; + } + bool already_attached = false; + const unsigned num_elem_entities = mesh.num_connectivity(elem, entity_rank); + const stk::mesh::Entity* elem_entities = mesh.begin(elem, entity_rank); + for (unsigned it_s=0; it_s relationship(stk::mesh::INVALID_CONNECTIVITY_ORDINAL, stk::mesh::INVALID_PERMUTATION); + if (!have_coincident_shell) + { + relationship = determine_ordinal_and_permutation(mesh, elem, entity); + } + else + { + stk::topology elem_topology = mesh.bucket(elem).topology(); + if (elem_topology.is_shell() && elem_topology.num_nodes() == entity_topology.num_nodes()) + { + ThrowAssertMsg(shell_relationship.second == determine_permutation(mesh, elem, entity, shell_relationship.first), "All shells should have same permutation for side."); + relationship = shell_relationship; + } + else + { + relationship = determine_ordinal_and_permutation(mesh, elem, entity); + const bool elem_polarity = entity_topology.is_positive_polarity(relationship.second); + const bool shell_polarity = entity_topology.is_positive_polarity(shell_relationship.second); + if (elem_polarity == shell_polarity) + { + // Side does not touch volume element; + continue; + } + } + } + + mesh.declare_relation( elem, entity, relationship.first, relationship.second, scratch1, scratch2, scratch3 ); + const bool successfully_attached = (find_entity_by_ordinal(mesh, elem, entity_rank, relationship.first) == entity); + if (!successfully_attached) + { + krinolog << "Could not attach " << debug_entity(mesh,entity) << " to element " << debug_entity(mesh,elem) << stk::diag::dendl; + krinolog << "Existing attached entities:" << stk::diag::dendl; + for (unsigned it_s=0; it_s & entities, + stk::CommSparse &commSparse) +{ + entities.clear(); + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + stk::mesh::EntityKey entityKey; + commSparse.recv_buffer(procId).unpack(entityKey); + entities.insert(mesh.get_entity(entityKey)); + } + }); +} + +void +update_node_activation(stk::mesh::BulkData & mesh, stk::mesh::Part & active_part) +{ + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + + stk::mesh::PartVector active_part_vec(1, &active_part); + stk::mesh::PartVector inactive_part_vec; + + std::vector entities; + stk::mesh::Selector locally_owned(meta.locally_owned_part()); + stk::mesh::get_selected_entities( locally_owned, mesh.buckets( stk::topology::NODE_RANK ), entities ); + + for (std::vector::iterator i_node = entities.begin(); i_node != entities.end(); ++i_node) + { + stk::mesh::Entity node = *i_node; + + const unsigned num_node_elems = mesh.num_elements(node); + const stk::mesh::Entity* node_elems = mesh.begin_elements(node); + bool have_active_elems = false; + for (unsigned node_elem_index=0; node_elem_index add_parts; + std::vector remove_parts; + std::vector entities; + + stk::mesh::Selector inactive_locally_owned = mesh.mesh_meta_data().locally_owned_part() & !active_part; + + for (stk::mesh::EntityRank entity_rank = stk::topology::NODE_RANK; entity_rank <= stk::topology::ELEMENT_RANK; ++entity_rank) + { + const stk::mesh::BucketVector & buckets = mesh.get_buckets(entity_rank, inactive_locally_owned); + for (auto&& bucket_ptr : buckets) + { + entities.insert(entities.end(), bucket_ptr->begin(), bucket_ptr->end()); + } + } + add_parts.assign(entities.size(), {&active_part}); + remove_parts.resize(entities.size()); + + mesh.batch_change_entity_parts(entities, add_parts, remove_parts); +} + +//-------------------------------------------------------------------------------- + +void destroy_custom_ghostings(stk::mesh::BulkData & mesh) +{ + const std::vector & ghostings = mesh.ghostings(); + for(unsigned i = stk::mesh::BulkData::AURA+1; i < ghostings.size(); ++i) + { + mesh.destroy_ghosting(*ghostings[i]); + } +} + +//-------------------------------------------------------------------------------- + +void +delete_mesh_entities(stk::mesh::BulkData & mesh, std::vector & child_elems) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::delete_old_mesh_entities(void)"); /* %TRACE% */ + + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + + stk::mesh::Selector not_ghost_selector = meta.locally_owned_part() | meta.globally_shared_part(); + stk::mesh::Selector universal_selector = meta.universal_part(); + + std::vector child_sides; + std::vector child_edges; + std::vector child_nodes; + + for (unsigned i=0; i * const coords_field = reinterpret_cast*>(mesh.mesh_meta_data().coordinate_field()); + ThrowRequireMsg(nullptr != coords_field, "Coordinates must be defined."); + + double * child_coords = stk::mesh::field_data(*coords_field, child); + double * parent0_coords = stk::mesh::field_data(*coords_field, parent0); + double * parent1_coords = stk::mesh::field_data(*coords_field, parent1); + + const unsigned ndim = mesh.mesh_meta_data().spatial_dimension(); + unsigned best_dim = 0; + double best_extent = std::abs(parent1_coords[0] - parent0_coords[0]); + for (unsigned dim = 1; dim < ndim; ++dim) + { + const double extent = std::abs(parent1_coords[dim] - parent0_coords[dim]); + if (extent > best_extent) + { + best_dim = dim; + best_extent = extent; + } + } + return std::abs(child_coords[best_dim] - parent0_coords[best_dim])/best_extent; +} + +//-------------------------------------------------------------------------------- + +void +store_edge_node_parent_ids(const stk::mesh::BulkData & mesh, + const FieldRef & parent_id_field, + stk::mesh::Entity edge_node_entity, + stk::mesh::EntityId parent0_id, + stk::mesh::EntityId parent1_id) +{ + if (parent_id_field.type_is()) + { + auto * stored_parent_ids = field_data(parent_id_field, edge_node_entity); + ThrowAssertMsg(stored_parent_ids, "Node " << mesh.identifier(edge_node_entity) + << " does not have the parent_ids field suggesting it is a mesh node."); + stored_parent_ids[0] = parent0_id; + stored_parent_ids[1] = parent1_id; + } + else if (parent_id_field.type_is()) + { + auto * stored_parent_ids = field_data(parent_id_field, edge_node_entity); + ThrowAssertMsg(stored_parent_ids, "Node " << mesh.identifier(edge_node_entity) + << " does not have the parent_ids field suggesting it is a mesh node."); + stored_parent_ids[0] = parent0_id; + stored_parent_ids[1] = parent1_id; + } + else + { + ThrowRequireMsg(false, "Unsupported field type for parent_node_ids_field"); + } +} + +//-------------------------------------------------------------------------------- + +std::array +get_edge_node_parent_ids(const stk::mesh::BulkData & mesh, + const FieldRef & parent_id_field, + const stk::mesh::Entity edge_node_entity) +{ + std::array parent_ids; + + if (parent_id_field.type_is()) + { + const auto * stored_parent_ids = field_data(parent_id_field, edge_node_entity); + ThrowAssertMsg(stored_parent_ids, "No SubElementNode found for node " << mesh.identifier(edge_node_entity) + << ", but it does not have the parent_ids field suggesting it is a mesh node."); + parent_ids[0] = stored_parent_ids[0]; + parent_ids[1] = stored_parent_ids[1]; + } + else if (parent_id_field.type_is()) + { + const auto * stored_parent_ids = field_data(parent_id_field, edge_node_entity); + ThrowAssertMsg(stored_parent_ids, "No SubElementNode found for node " << mesh.identifier(edge_node_entity) + << ", but it does not have the parent_ids field suggesting it is a mesh node."); + parent_ids[0] = stored_parent_ids[0]; + parent_ids[1] = stored_parent_ids[1]; + } + else + { + ThrowRequireMsg(false, "Unsupported field type for parent_node_ids_field"); + } + return parent_ids; +} + +//-------------------------------------------------------------------------------- + +void get_parent_nodes_from_child(const stk::mesh::BulkData & mesh, + stk::mesh::Entity child, const FieldRef & parent_id_field, + std::set & parent_nodes) +{ + if (has_field_data(parent_id_field, child)) + { + auto parent_ids = get_edge_node_parent_ids(mesh, parent_id_field, child); + const stk::mesh::Entity parent0 = mesh.get_entity(stk::topology::NODE_RANK, parent_ids[0]); + const stk::mesh::Entity parent1 = mesh.get_entity(stk::topology::NODE_RANK, parent_ids[1]); + ThrowAssert(mesh.is_valid(parent0) && mesh.is_valid(parent1)); + get_parent_nodes_from_child(mesh, parent0, parent_id_field, parent_nodes); + get_parent_nodes_from_child(mesh, parent1, parent_id_field, parent_nodes); + } + else + { + parent_nodes.insert(child); + } +} + +//-------------------------------------------------------------------------------- + +void debug_print_selector_parts(const stk::mesh::Selector & selector) +{ + stk::mesh::PartVector parts; + selector.get_parts(parts); + krinolog << "Selector contains parts: " << stk::diag::push << stk::diag::dendl; + for(stk::mesh::PartVector::const_iterator it = parts.begin(); it != parts.end(); ++it) + { + krinolog << (*it)->name() << stk::diag::dendl; + } + krinolog << stk::diag::pop << stk::diag::dendl; +} + +//-------------------------------------------------------------------------------- + +stk::mesh::PartVector filter_non_io_parts(const stk::mesh::PartVector & all_parts) +{ + stk::mesh::PartVector io_parts; + + for(stk::mesh::PartVector::const_iterator it = all_parts.begin(); it != all_parts.end(); ++it) + { + if( stk::io::is_part_io_part(**it) ) + { + io_parts.push_back(*it); + } + } + + return io_parts; +} + +void +activate_selected_sides_touching_active_elements(stk::mesh::BulkData & mesh, const stk::mesh::Selector & side_selector, stk::mesh::Part & active_part) +{ + // This method requires AURA + ThrowRequire(mesh.is_automatic_aura_on()); + + mesh.modification_begin(); + stk::mesh::PartVector active_part_vec(1, &active_part); + stk::mesh::PartVector inactive_part_vec; + stk::mesh::Selector select_locally_owned = side_selector & mesh.mesh_meta_data().locally_owned_part(); + + std::vector sides; + stk::mesh::get_selected_entities( select_locally_owned, mesh.buckets( mesh.mesh_meta_data().side_rank() ), sides ); + for (auto && side : sides) + { + bool have_active_elem = false; + const stk::mesh::Entity* side_elems = mesh.begin_elements(side); + const unsigned num_side_elems = mesh.num_elements(side); + for (unsigned ielem=0; ielem & coincident_elems) +{ + stk::topology elem_topology = mesh.bucket(elem).topology(); + const stk::mesh::Entity* elem_nodes = mesh.begin_nodes(elem); + std::vector elem_side_nodes; + std::vector elem_nbrs; + std::vector nbr_side_nodes; + + coincident_elems.clear(); + const unsigned num_sides = elem_topology.num_sides(); + for (unsigned iside=0; iside sorted_elem_side_nodes = elem_side_nodes; + std::sort(sorted_elem_side_nodes.begin(), sorted_elem_side_nodes.end(), stk::mesh::EntityLess(mesh)); + const unsigned unique_len = std::distance(sorted_elem_side_nodes.begin(), std::unique( sorted_elem_side_nodes.begin(), sorted_elem_side_nodes.end() )); + const bool is_degenerate_side = unique_len < mesh.mesh_meta_data().spatial_dimension(); + if (is_degenerate_side) continue; + + stk::mesh::get_entities_through_relations(mesh, elem_side_nodes, stk::topology::ELEMENT_RANK, elem_nbrs); + ThrowRequire(!elem_nbrs.empty()); + + for (auto && nbr : elem_nbrs) + { + if (nbr == elem) continue; + + stk::topology nbr_topology = mesh.bucket(nbr).topology(); + const stk::mesh::Entity* nbr_nodes = mesh.begin_nodes(nbr); + const unsigned num_nbr_sides = nbr_topology.num_sides(); + for (unsigned inbr_side=0; inbr_side 1) + { + // Skip check if we don't have aura + return true; + } + + bool found_mismatched_side = false; + + std::vector element_nodes; + std::vector element_side_nodes; + std::vector side_elements; + std::vector active_side_elements; + + const stk::mesh::BucketVector & buckets = mesh.get_buckets( stk::topology::ELEMENT_RANK, active_part & mesh.mesh_meta_data().locally_owned_part() ); + + for ( auto && bucket : buckets ) + { + stk::topology element_topology = bucket->topology(); + if (element_topology.is_shell()) continue; + const unsigned num_sides = element_topology.num_sides(); + + for ( auto && element : *bucket ) + { + element_nodes.assign(mesh.begin_nodes(element), mesh.end_nodes(element)); + for (unsigned iside=0; iside elements; + std::vector< stk::mesh::Entity> coincident_elements; + std::vector< stk::mesh::Entity> element_nodes; + + ParallelErrorMessage err(mesh.parallel()); + + stk::mesh::get_entities( mesh, stk::topology::ELEMENT_RANK, elements ); + for (auto && element : elements) + { + element_nodes.assign(mesh.begin_nodes(element), mesh.end_nodes(element)); + stk::mesh::get_entities_through_relations(mesh, element_nodes, stk::topology::ELEMENT_RANK, coincident_elements); + ThrowRequire(!coincident_elements.empty()); + stk::topology element_topology = mesh.bucket(element).topology(); + + bool coincident_element_error = false; + for (auto && coincident : coincident_elements) + { + if (coincident == element || element_topology != mesh.bucket(coincident).topology()) continue; + if (!element_topology.is_shell()) + { + err << "Non-shell elements " << mesh.entity_key(element) << " and " + << mesh.entity_key(coincident) << " are fully coincident (overlapping).\n"; + coincident_element_error = true; + } + else + { + stk::EquivalentPermutation result = element_topology.is_equivalent(mesh.begin_nodes(coincident), element_nodes.data()); + ThrowRequire(result.is_equivalent); + if (result.permutation_number != stk::mesh::DEFAULT_PERMUTATION) + { + err << "Elements " << mesh.entity_key(element) << " and " << mesh.entity_key(coincident) + << " are fully coincident shell elements but have different node order.\n"; + coincident_element_error = true; + } + } + } + + // Detect partially coincident, non-shell elements that are both active + if (!coincident_element_error && mesh.bucket(element).member(active_part) && !element_topology.is_shell() && element_topology.base() != stk::topology::BEAM_2) + { + get_partially_and_fully_coincident_elements(mesh, element, coincident_elements); + + for (auto && coincident : coincident_elements) + { + if (mesh.bucket(coincident).member(active_part) && !mesh.bucket(coincident).topology().is_shell() && + mesh.bucket(coincident).topology().base() != stk::topology::BEAM_2) + { + err << "Non-shell elements " << mesh.entity_key(element) << " with topology " + << element_topology.name() << " and " << mesh.entity_key(coincident) + << " with topology " << mesh.bucket(coincident).topology().name() + << " are partially coincident (overlapping) and active.\n"; + coincident_element_error = true; + } + } + } + } + auto err_msg = err.gather_message(); + krinolog << err_msg.second; + return !err_msg.first; +} + +bool +fix_coincident_element_ownership(stk::mesh::BulkData & mesh) +{ + // This method exploits aura to choose which processor the faces and edges should be owned by + if (!mesh.is_automatic_aura_on()) + { + // Make no changes, hope for the best. + return false; + } + + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::mesh::Selector locally_owned_selector(meta.locally_owned_part()); + + std::vector elems; + std::vector coincident_elems; + + std::vector entities_to_move; + + stk::mesh::get_selected_entities( locally_owned_selector, mesh.buckets(stk::topology::ELEMENT_RANK), elems ); + + for (auto && elem : elems) + { + get_partially_and_fully_coincident_elements(mesh, elem, coincident_elems); + + int new_owner = mesh.parallel_owner_rank(elem); + for (auto && nbr : coincident_elems) + { + const int elem_owner = mesh.parallel_owner_rank(nbr); + if (elem_owner < new_owner) new_owner = elem_owner; + } + + if (new_owner != mesh.parallel_owner_rank(elem)) + { + entities_to_move.push_back(stk::mesh::EntityProc(elem, new_owner)); + } + } + + const int local_made_moves = !entities_to_move.empty(); + int global_made_moves = false; + stk::all_reduce_max(mesh.parallel(), &local_made_moves, &global_made_moves, 1); + + if (global_made_moves) + { + mesh.change_entity_owner(entities_to_move); + } + return global_made_moves; +} + +bool +fix_face_and_edge_ownership(stk::mesh::BulkData & mesh) +{ + // This method exploits aura to choose which processor the faces and edges should be owned by + if (!mesh.is_automatic_aura_on()) + { + // Make no changes, hope for the best. + return false; + } + + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::mesh::Selector locally_owned_selector(meta.locally_owned_part()); + + std::vector< stk::mesh::Entity> entities; + std::vector< stk::mesh::Entity> entity_elems; + + std::vector entities_to_move; + + for (stk::mesh::EntityRank entity_rank = stk::topology::EDGE_RANK; entity_rank <= stk::topology::FACE_RANK; ++entity_rank) + { + stk::mesh::get_selected_entities( locally_owned_selector, mesh.buckets(entity_rank), entities ); + + for (auto && entity : entities) + { + entity_elems.assign(mesh.begin_elements(entity), mesh.end_elements(entity)); + ThrowRequire(!entity_elems.empty()); + + int new_owner = mesh.parallel_size(); + for (auto && entity_elem : entity_elems) + { + const int elem_owner = mesh.parallel_owner_rank(entity_elem); + if (elem_owner < new_owner) new_owner = elem_owner; + } + + if (new_owner != mesh.parallel_owner_rank(entity)) + { + entities_to_move.push_back(stk::mesh::EntityProc(entity, new_owner)); + } + } + } + + const int local_made_moves = !entities_to_move.empty(); + int global_made_moves = false; + stk::all_reduce_max(mesh.parallel(), &local_made_moves, &global_made_moves, 1); + + if (global_made_moves) + { + mesh.change_entity_owner(entities_to_move); + } + return global_made_moves; +} + +bool +check_face_and_edge_ownership(const stk::mesh::BulkData & mesh) +{ + // This method exploits aura to choose which processor the faces and edges should be owned by + if (!mesh.is_automatic_aura_on()) + { + // Skip check if we don't have aura + return true; + } + + const stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + stk::mesh::Selector locally_owned_selector(meta.locally_owned_part()); + + std::vector< stk::mesh::Entity> entities; + std::vector< stk::mesh::Entity> entity_elems; + std::vector< stk::mesh::Entity> entity_nodes; + + for (stk::mesh::EntityRank entity_rank = stk::topology::EDGE_RANK; entity_rank <= stk::topology::FACE_RANK; ++entity_rank) + { + const stk::mesh::BucketVector & buckets = mesh.get_buckets( entity_rank, locally_owned_selector ); + + stk::mesh::BucketVector::const_iterator ib = buckets.begin(); + stk::mesh::BucketVector::const_iterator ib_end = buckets.end(); + + for ( ; ib != ib_end; ++ib ) + { + const stk::mesh::Bucket & b = **ib; + const size_t length = b.size(); + for (size_t it_entity = 0; it_entity < length; ++it_entity) + { + stk::mesh::Entity entity = b[it_entity]; + const int entity_owner = mesh.parallel_owner_rank(entity); + + entity_nodes.assign(mesh.begin_nodes(entity), mesh.end_nodes(entity)); + entity_elems.assign(mesh.begin_elements(entity), mesh.end_elements(entity)); + + bool have_element_on_owning_proc = false; + for (std::vector::iterator it_elem = entity_elems.begin(); it_elem != entity_elems.end(); ++it_elem) + { + if (mesh.parallel_owner_rank(*it_elem) == entity_owner) + { + have_element_on_owning_proc = true; + break; + } + } + ThrowRequireMsg(have_element_on_owning_proc, "Error: " << mesh.entity_key(entity) + << " is owned on processor " << entity_owner + << " but does not have any elements that are owned on this processor."); + } + } + } + const bool success = true; + return success; +} + +bool +set_region_id_on_unset_entity_and_neighbors(stk::mesh::BulkData & mesh, stk::mesh::Entity & entity, stk::mesh::EntityRank entity_rank, stk::mesh::FieldBase & region_id_field, const unsigned region_id) +{ + unsigned * region_id_data = stk::mesh::field_data(reinterpret_cast&>(region_id_field), entity); + ThrowAssert(NULL != region_id_data); + if (*region_id_data != 0) + { + ThrowAssert(*region_id_data == region_id); + return false; + } + + *region_id_data = region_id; + + // now visit neighbors + const stk::mesh::Entity* begin_nodes = mesh.begin_nodes(entity); + const stk::mesh::Entity* end_nodes = mesh.end_nodes(entity); + + for (const stk::mesh::Entity* it_node = begin_nodes; it_node != end_nodes; ++it_node) + { + stk::mesh::Entity node = *it_node; + + const stk::mesh::Entity* node_entities_begin = mesh.begin(node, entity_rank); + const stk::mesh::Entity* node_entities_end = mesh.end(node, entity_rank); + + for (const stk::mesh::Entity* it_nbr = node_entities_begin; it_nbr != node_entities_end; ++it_nbr) + { + stk::mesh::Entity neighbor = *it_nbr; + set_region_id_on_unset_entity_and_neighbors(mesh, neighbor, entity_rank, region_id_field, region_id); + } + } + + return true; +} + +void +identify_isolated_regions(stk::mesh::Part & part, stk::mesh::FieldBase & region_id_field) +{ /* %TRACE[ON]% */ Trace trace__("krino::Mesh::identify_isolated_portions_of_part(stk::mesh::Part & part)"); /* %TRACE% */ + stk::mesh::BulkData & mesh = part.mesh_bulk_data(); + stk::mesh::MetaData & meta = mesh.mesh_meta_data(); + + stk::mesh::EntityRank entity_rank = part.primary_entity_rank(); + stk::mesh::Selector selector = part & meta.locally_owned_part(); + + std::vector entities; + stk::mesh::get_selected_entities( selector, mesh.buckets(entity_rank), entities ); + + // initialize region id + const stk::mesh::BucketVector & buckets = mesh.get_buckets(entity_rank, selector); + for (stk::mesh::BucketVector::const_iterator ib = buckets.begin(); ib != buckets.end(); ++ib ) + { + const stk::mesh::Bucket & b = **ib; + const size_t length = b.size(); + unsigned * region_id = stk::mesh::field_data(reinterpret_cast&>(region_id_field), b); + ThrowAssert(NULL != region_id); + std::fill(region_id, region_id+length, 0); + } + + unsigned local_region_counter = 0; + unsigned region_id = 1 + local_region_counter*mesh.parallel_size() + mesh.parallel_rank(); + + for (std::vector::iterator it_entity=entities.begin(); it_entity!=entities.end(); ++it_entity) + { + stk::mesh::Entity entity = *it_entity; + + const bool made_changes = set_region_id_on_unset_entity_and_neighbors(mesh, entity, entity_rank, region_id_field, region_id); + if (made_changes) + { + ++local_region_counter; + region_id = 1 + local_region_counter*mesh.parallel_size() + mesh.parallel_rank(); + } + } +} + +const unsigned * get_side_node_ordinals(stk::topology topology, unsigned side_ordinal) +{ + static std::vector< std::vector< std::vector > > all_side_node_ordinals(stk::topology::BEGIN_TOPOLOGY + stk::topology::NUM_TOPOLOGIES); + std::vector< std::vector > & topology_side_node_ordinals = all_side_node_ordinals[topology.value()]; + if (topology_side_node_ordinals.empty()) + { + const size_t num_sides = topology.num_sides(); + topology_side_node_ordinals.resize(num_sides); + for (size_t side_index = 0; side_index < num_sides; ++side_index) + { + std::vector & side_node_ordinals = topology_side_node_ordinals[side_index]; + side_node_ordinals.resize(topology.side_topology(side_index).num_nodes()); + topology.side_node_ordinals(side_index, side_node_ordinals.begin()); + } + } + return &topology_side_node_ordinals[side_ordinal][0]; +} + +const unsigned * get_edge_node_ordinals(stk::topology topology, unsigned edge_ordinal) +{ + static std::vector< std::vector< std::vector > > all_edge_node_ordinals(stk::topology::BEGIN_TOPOLOGY + stk::topology::NUM_TOPOLOGIES); + std::vector< std::vector > & topology_edge_node_ordinals = all_edge_node_ordinals[topology.value()]; + if (topology_edge_node_ordinals.empty()) + { + const size_t num_edges = topology.num_edges(); + topology_edge_node_ordinals.resize(num_edges); + for (size_t edge_index = 0; edge_index < num_edges; ++edge_index) + { + std::vector & edge_node_ordinals = topology_edge_node_ordinals[edge_index]; + edge_node_ordinals.resize(topology.edge_topology(edge_index).num_nodes()); + topology.edge_node_ordinals(edge_index, edge_node_ordinals.begin()); + } + } + return &topology_edge_node_ordinals[edge_ordinal][0]; +} + +stk::mesh::PartVector get_common_io_parts(const stk::mesh::BulkData & mesh, const std::vector entities) +{ + stk::mesh::PartVector common_io_parts; + + bool first = true; + for (auto&& entity : entities) + { + stk::mesh::PartVector entity_io_parts = filter_non_io_parts(mesh.bucket(entity).supersets()); + std::sort(entity_io_parts.begin(), entity_io_parts.end()); + if (first) + { + first = false; + common_io_parts.swap(entity_io_parts); + } + else + { + stk::mesh::PartVector working_set; + working_set.swap(common_io_parts); + std::set_intersection(working_set.begin(),working_set.end(),entity_io_parts.begin(),entity_io_parts.end(),std::back_inserter(common_io_parts)); + } + } + return common_io_parts; +} + +stk::mesh::PartVector get_removable_parts(const stk::mesh::BulkData & mesh, const stk::mesh::Bucket & bucket) +{ + stk::mesh::PartVector removable_parts; + for ( auto&& part : bucket.supersets() ) + { + stk::mesh::EntityRank part_rank = part->primary_entity_rank(); + if ((part_rank == stk::topology::INVALID_RANK || part_rank == bucket.entity_rank()) && + (!stk::mesh::is_auto_declared_part(*part) || stk::mesh::is_topology_root_part(*part))) + { + removable_parts.push_back(part); + } + } + return removable_parts; +} + +stk::mesh::PartVector get_removable_parts(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity) +{ + return get_removable_parts(mesh, mesh.bucket(entity)); +} + +//-------------------------------------------------------------------------------- +bool is_refinement_child(const stk::mesh::BulkData & stk_bulk, const stk::mesh::Entity entity) +{ + const stk::mesh::EntityRank entity_rank = stk_bulk.entity_rank(entity); + const unsigned num_family_trees = stk_bulk.num_connectivity(entity, stk::topology::CONSTRAINT_RANK); + const stk::mesh::Entity* family_trees = stk_bulk.begin(entity, stk::topology::CONSTRAINT_RANK); + for (unsigned ifamily=0; ifamily < num_family_trees; ++ifamily) + { + const stk::mesh::Entity ft = family_trees[ifamily]; + const stk::mesh::Entity* family_tree_entities = stk_bulk.begin(ft, entity_rank); + if(family_tree_entities[0] != entity) return true; + } + return false; +} + +void +get_refinement_immediate_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity parent, std::vector & children) +{ + children.clear(); + stk::mesh::EntityRank entity_rank = stk_bulk.entity_rank(parent); + const unsigned num_family_trees = stk_bulk.num_connectivity(parent, stk::topology::CONSTRAINT_RANK); + const stk::mesh::Entity* family_trees = stk_bulk.begin(parent, stk::topology::CONSTRAINT_RANK); + for (unsigned ifamily=0; ifamily < num_family_trees; ++ifamily) + { + const stk::mesh::Entity* family_tree_entities = stk_bulk.begin(family_trees[ifamily], entity_rank); + const stk::mesh::Entity tree_parent = family_tree_entities[0]; // 0th entry in the family_tree is the parent + if (parent == tree_parent) // I am the parent + { + const unsigned num_family_tree_entities = stk_bulk.num_connectivity(family_trees[ifamily], entity_rank); + for (unsigned ichild=1; ichild < num_family_tree_entities; ++ichild) + { + children.push_back(family_tree_entities[ichild]); + } + } + } +} + +//-------------------------------------------------------------------------------- + +bool +has_refinement_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity parent) +{ + stk::mesh::EntityRank entity_rank = stk_bulk.entity_rank(parent); + const unsigned num_family_trees = stk_bulk.num_connectivity(parent, stk::topology::CONSTRAINT_RANK); + const stk::mesh::Entity* family_trees = stk_bulk.begin(parent, stk::topology::CONSTRAINT_RANK); + for (unsigned ifamily=0; ifamily < num_family_trees; ++ifamily) + { + const stk::mesh::Entity* family_tree_entities = stk_bulk.begin(family_trees[ifamily], entity_rank); + const stk::mesh::Entity tree_parent = family_tree_entities[0]; // 0th entry in the family_tree is the parent + if (parent == tree_parent) // I am the parent + { + return true; + } + } + return false; +} + +//-------------------------------------------------------------------------------- + +namespace { +void +get_refinement_leaf_children(const stk::mesh::BulkData& stk_bulk, const std::vector & children, std::vector & leaf_children) +{ + std::vector grand_children; + for (auto&& child : children) + { + get_refinement_immediate_children(stk_bulk, child, grand_children); + if (grand_children.empty()) + { + leaf_children.push_back(child); + } + else + { + get_refinement_leaf_children(stk_bulk, grand_children, leaf_children); + } + } +} + +void +get_refinement_all_children(const stk::mesh::BulkData& stk_bulk, const std::vector & children, std::vector & all_children) +{ + std::vector grand_children; + for (auto&& child : children) + { + get_refinement_immediate_children(stk_bulk, child, grand_children); + all_children.insert(all_children.end(), grand_children.begin(), grand_children.end()); + get_refinement_all_children(stk_bulk, grand_children, all_children); + } +} +} + +//-------------------------------------------------------------------------------- + +void +get_refinement_leaf_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, std::vector & leaf_children) +{ + leaf_children.clear(); + std::vector children; + get_refinement_immediate_children(stk_bulk, entity, children); + get_refinement_leaf_children(stk_bulk, children, leaf_children); +} + +void +get_refinement_all_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, std::vector & all_children) +{ + std::vector children; + get_refinement_immediate_children(stk_bulk, entity, children); + all_children = children; + get_refinement_all_children(stk_bulk, children, all_children); +} + +void set_relation_permutation(stk::mesh::BulkData & mesh, stk::mesh::Entity from, stk::mesh::Entity to, stk::mesh::ConnectivityOrdinal to_ord, stk::mesh::Permutation to_permutation) +{ + const stk::mesh::EntityRank from_rank = mesh.entity_rank(from); + const stk::mesh::EntityRank to_rank = mesh.entity_rank(to); + + stk::mesh::Entity const* fwd_rels = mesh.begin(from, to_rank); + stk::mesh::ConnectivityOrdinal const* fwd_ords = mesh.begin_ordinals(from, to_rank); + stk::mesh::Permutation * fwd_perms = const_cast(mesh.begin_permutations(from, to_rank)); + const int num_fwd = mesh.num_connectivity(from, to_rank); + + stk::mesh::Entity const* back_rels = mesh.begin(to, from_rank); + stk::mesh::ConnectivityOrdinal const* back_ords = mesh.begin_ordinals(to, from_rank); + stk::mesh::Permutation * back_perms = const_cast(mesh.begin_permutations(to, from_rank)); + const int num_back = mesh.num_connectivity(to,from_rank); + + // Find and change fwd connectivity + for (int i = 0; i < num_fwd; ++i, ++fwd_rels, ++fwd_ords, ++fwd_perms) { + // Allow clients to make changes to permutation + // Permutations do not affect Relation ordering, so this is safe. + if (*fwd_rels == to && *fwd_ords == to_ord) { + *fwd_perms = to_permutation; + } + } + + // Find and change back connectivity + for (int i = 0; i < num_back; ++i, ++back_rels, ++back_ords, ++back_perms) { + // Allow clients to make changes to permutation + // Permutations do not affect Relation ordering, so this is safe. + if (*back_rels == from && *back_ords == to_ord) { + *back_perms = to_permutation; + } + } +} + +std::pair +determine_shell_side_ordinal_and_permutation(const stk::mesh::BulkData & mesh, stk::mesh::Entity shell, stk::mesh::Entity side) +{ + // The input shell may or may not be attached to side, but should be coincident with the side. + // We will figure out what the ordinal for this shell-side relation based on the existing + // connectivity of the side. + const unsigned num_side_elems = mesh.num_elements(side); + ThrowRequireMsg(num_side_elems > 0, "Cannot determine shell_side_ordinal for completely disconnected side."); + + stk::mesh::EntityRank side_rank = mesh.mesh_meta_data().side_rank(); + stk::topology side_topology = mesh.bucket(side).topology(); + const stk::mesh::Entity * side_elems = mesh.begin_elements(side); + const stk::mesh::ConnectivityOrdinal * side_elem_ordinals = mesh.begin_element_ordinals(side); + const stk::mesh::Permutation * side_elem_permutations = mesh.begin_element_permutations(side); + + std::pair result(stk::mesh::INVALID_CONNECTIVITY_ORDINAL, stk::mesh::INVALID_PERMUTATION); + for (unsigned it = 0; it relative_rank); + + const stk::mesh::Entity * relative_nodes = mesh.begin_nodes(relative); + + const stk::EquivalentPermutation equiv = stk::mesh::sub_rank_equivalent(mesh, entity, ordinal, relative_rank, relative_nodes); + if(!equiv.is_equivalent) + { + ThrowErrorMsg("Could not find connection between " << mesh.entity_key(entity) <<" and " + << mesh.entity_key(relative) << " with ordinal " << ordinal + << debug_entity(mesh, entity) << debug_entity(mesh, relative)); + } + + return static_cast(equiv.permutation_number); +} + +std::pair +determine_ordinal_and_permutation(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity, const stk::mesh::Entity relative) +{ + const stk::mesh::EntityRank relative_rank = mesh.entity_rank(relative); + ThrowAssert(mesh.entity_rank(entity) > relative_rank); + stk::topology relative_topology = mesh.bucket(relative).topology(); + ThrowAssert(relative_topology.num_nodes() == mesh.num_nodes(relative)); + + const stk::mesh::Entity * relative_nodes = mesh.begin_nodes(relative); + + stk::topology entity_topology = mesh.bucket(entity).topology(); + const bool looking_for_shell_side = entity_topology.is_shell() && relative_rank == mesh.mesh_meta_data().side_rank(); + + for(size_t i = 0; i < entity_topology.num_sub_topology(relative_rank); ++i) + { + if (entity_topology.sub_topology(relative_rank, i) == relative_topology) + { + const stk::EquivalentPermutation equiv = stk::mesh::sub_rank_equivalent(mesh, entity, stk::mesh::ConnectivityOrdinal(i), relative_rank, relative_nodes); + const bool match = equiv.is_equivalent && (!looking_for_shell_side || equiv.permutation_number < relative_topology.num_positive_permutations()); + if(match) + { + return std::pair(static_cast(i), static_cast(equiv.permutation_number)); + } + } + } + ThrowRuntimeError("Could not find connection between " << mesh.entity_key(entity) << " and " << mesh.entity_key(relative) << debug_entity(mesh, entity) << debug_entity(mesh, relative)); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_MeshHelpers.hpp b/packages/krino/krino/krino_lib/Akri_MeshHelpers.hpp new file mode 100644 index 000000000000..563be698eaf4 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshHelpers.hpp @@ -0,0 +1,182 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MeshHelpers_h +#define Akri_MeshHelpers_h + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { class FieldRef; } + +namespace krino { + +typedef std::pair TopologyPartPair; +typedef std::vector TopologyPartVector; + +struct StkMeshEntities +{ + typedef stk::mesh::Entity value_type; + const value_type *mBegin; + const value_type *mEnd; + const value_type * begin() const { return mBegin; } + const value_type * end() const { return mEnd; } + size_t size() const { return mEnd - mBegin; } + bool empty() const { return mEnd == mBegin; } + value_type operator[](int i) const { return *(mBegin + i); } +}; + +void fill_element_node_coordinates(const stk::mesh::BulkData & mesh, stk::mesh::Entity element, const FieldRef coordsField, std::vector & elementNodeCoords); +void fill_procs_owning_or_sharing_or_ghosting_node(const stk::mesh::BulkData& bulkData, stk::mesh::Entity node, std::vector & procsOwningSharingOrGhostingNode); +double compute_maximum_element_size(stk::mesh::BulkData& mesh); +void compute_element_quality(const stk::mesh::BulkData & mesh, double & minEdgeLength, double & maxEdgeLength, double & minVolume, double & maxVolume); +void delete_all_entities_using_nodes_with_nodal_volume_below_threshold(stk::mesh::BulkData & mesh, const stk::mesh::Selector & blockSelector, const double threshold); +std::vector get_side_permutation(stk::topology topology, stk::mesh::Permutation node_permutation); +const stk::mesh::Part & find_element_part(const stk::mesh::BulkData& mesh, stk::mesh::Entity elem); +bool check_induced_parts(const stk::mesh::BulkData & mesh); +void attach_sides_to_elements(stk::mesh::BulkData & mesh); +void attach_entity_to_elements(stk::mesh::BulkData & mesh, stk::mesh::Entity entity); +void unpack_entities_from_other_procs(const stk::mesh::BulkData & mesh, std::set & entities, stk::CommSparse &commSparse); +void update_node_activation(stk::mesh::BulkData & mesh, stk::mesh::Part & active_part); +void activate_all_entities(stk::mesh::BulkData & mesh, stk::mesh::Part & active_part); +void destroy_custom_ghostings(stk::mesh::BulkData & mesh); +void delete_mesh_entities(stk::mesh::BulkData & mesh, std::vector & child_elems); +void debug_print_selector_parts(const stk::mesh::Selector & selector); +stk::mesh::PartVector filter_non_io_parts(const stk::mesh::PartVector & all_parts); +void activate_selected_sides_touching_active_elements(stk::mesh::BulkData & mesh, const stk::mesh::Selector & side_selector, stk::mesh::Part & active_part); +void get_partially_and_fully_coincident_elements(const stk::mesh::BulkData & mesh, stk::mesh::Entity elem, std::vector & coincident_elems); +bool check_element_side_connectivity(const stk::mesh::BulkData & mesh, const stk::mesh::Part & exterior_boundary_part, const stk::mesh::Part & active_part); +bool check_coincident_elements(const stk::mesh::BulkData & mesh, const stk::mesh::Part & active_part); +bool fix_coincident_element_ownership(stk::mesh::BulkData & mesh); +bool fix_face_and_edge_ownership(stk::mesh::BulkData & mesh); +bool check_face_and_edge_ownership(const stk::mesh::BulkData & mesh); +bool check_face_and_edge_relations(const stk::mesh::BulkData & mesh); +bool check_shared_entity_nodes(const stk::mesh::BulkData & mesh, stk::mesh::EntityKey remote_entity_key, std::vector & remote_entity_node_ids); +bool check_shared_entity_nodes(const stk::mesh::BulkData & mesh, std::vector & entities); +bool check_shared_entity_nodes(const stk::mesh::BulkData & mesh); +void disconnect_entity(stk::mesh::BulkData & mesh, stk::mesh::Entity entity); +bool disconnect_and_destroy_entity(stk::mesh::BulkData & mesh, stk::mesh::Entity entity); + +stk::mesh::PartVector get_common_io_parts(const stk::mesh::BulkData & mesh, const std::vector entities); +stk::mesh::PartVector get_removable_parts(const stk::mesh::BulkData & mesh, const stk::mesh::Bucket & bucket); +stk::mesh::PartVector get_removable_parts(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity); + +void +store_edge_node_parent_ids(const stk::mesh::BulkData & mesh, + const FieldRef & parent_id_field, + stk::mesh::Entity edge_node_entity, + stk::mesh::EntityId parent0_id, + stk::mesh::EntityId parent1_id); + +std::array +get_edge_node_parent_ids(const stk::mesh::BulkData & mesh, + const FieldRef & parent_id_field, + const stk::mesh::Entity edge_node_entity); + +void get_parent_nodes_from_child(const stk::mesh::BulkData & mesh, + stk::mesh::Entity child, const FieldRef & parent_id_field, + std::set & parent_nodes); + +double compute_child_position(const stk::mesh::BulkData & mesh, stk::mesh::Entity child, stk::mesh::Entity parent0, stk::mesh::Entity parent1); + +// topology helpers +// NOTE: These use static storage, but it does not depend on anything so it should be ok for nested or multithreaded usage. +const unsigned * get_side_node_ordinals(stk::topology topology, unsigned side_ordinal); +const unsigned * get_edge_node_ordinals(stk::topology topology, unsigned edge_ordinal); + +std::string debug_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity); +std::string debug_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity entity, const bool includeFields); + +struct ChildNodeRequest +{ + std::vector parents; + stk::mesh::Entity* child; + + ChildNodeRequest(const std::vector & in_parents, stk::mesh::Entity *in_child) + : parents(in_parents), child(in_child) {} +}; +struct SideRequest +{ + stk::mesh::Entity element; + unsigned element_side_ordinal; + stk::mesh::PartVector side_parts; + + SideRequest(stk::mesh::Entity in_element, unsigned in_element_side_ordinal, const stk::mesh::PartVector & in_side_parts) + : element(in_element), element_side_ordinal(in_element_side_ordinal), side_parts(in_side_parts) {} +}; + +void batch_create_child_nodes(stk::mesh::BulkData & mesh, const std::vector< ChildNodeRequest > & child_node_requests, const stk::mesh::PartVector & node_parts, bool assert_32bit_ids, bool make_64bit_ids); +void batch_create_sides(stk::mesh::BulkData & mesh, const std::vector< SideRequest > & side_requests); +void make_side_ids_consistent_with_stk_convention(stk::mesh::BulkData & mesh); + +double compute_element_volume_to_edge_ratio(stk::mesh::BulkData & mesh, stk::mesh::Entity element, const stk::mesh::Field * const coords_field); + +bool is_refinement_child(const stk::mesh::BulkData & stk_bulk, stk::mesh::Entity entity); +bool has_refinement_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity parent); +void get_refinement_immediate_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity parent, std::vector & children); +void get_refinement_leaf_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, std::vector & leaf_children); +void get_refinement_all_children(const stk::mesh::BulkData& stk_bulk, stk::mesh::Entity entity, std::vector & children); + +// Temporary method for manually correcting the relation permutation +void set_relation_permutation(stk::mesh::BulkData & mesh, stk::mesh::Entity from, stk::mesh::Entity to, stk::mesh::ConnectivityOrdinal to_ord, stk::mesh::Permutation to_permutation); + +std::pair +determine_shell_side_ordinal_and_permutation(const stk::mesh::BulkData & mesh, stk::mesh::Entity shell, stk::mesh::Entity side); + +stk::mesh::Permutation +determine_permutation(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity, const stk::mesh::Entity relative, const stk::mesh::ConnectivityOrdinal ordinal); + +std::pair +determine_ordinal_and_permutation(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity, const stk::mesh::Entity relative); + +inline stk::mesh::Entity find_entity_by_ordinal(const stk::mesh::BulkData &mesh, stk::mesh::Entity entity, stk::mesh::EntityRank rank, const unsigned ordinal) +{ + stk::mesh::ConnectivityOrdinal const* relative_ordinals = mesh.begin_ordinals(entity, rank); + stk::mesh::Entity const* relatives = mesh.begin(entity, rank); + const int num_relatives = mesh.num_connectivity(entity, rank); + for (int i = 0; i < num_relatives; ++i) + { + if (relative_ordinals[i] == ordinal) { + return relatives[i]; + } + } + return stk::mesh::Entity(); +} + +template +void pack_entities_for_owning_proc(const stk::mesh::BulkData & mesh, + const CONTAINER & entities, + stk::CommSparse &commSparse) +{ + stk::pack_and_communicate(commSparse,[&]() + { + for (auto entity : entities) + { + const int entityOwner = mesh.parallel_owner_rank(entity); + if (commSparse.parallel_rank() != entityOwner) + commSparse.send_buffer(entityOwner).pack(mesh.entity_key(entity)); + } + }); +} + +} // namespace krino + +#endif // Akri_MeshHelpers_h diff --git a/packages/krino/krino/krino_lib/Akri_MeshInputOptions.cpp b/packages/krino/krino/krino_lib/Akri_MeshInputOptions.cpp new file mode 100644 index 000000000000..aeda2c5e95eb --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshInputOptions.cpp @@ -0,0 +1,52 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino { + +MeshInputOptions::Registry MeshInputOptions::the_registry; + +std::shared_ptr +MeshInputOptions::get_or_create(const std::string & model_name) +{ + std::shared_ptr options = std::make_shared(model_name); + std::pair result = the_registry.insert(options); + + if ( ! result.second ) { + stk::RuntimeWarningAdHoc() << "A mesh database named '" << model_name + << "' has already been defined and will be reused"; + } + + return *result.first; +} + +MeshInputOptions * +MeshInputOptions::get(const std::string &model_name) +{ + MeshInputOptions *options = nullptr; + std::shared_ptr tmp = std::make_shared(model_name); + + Registry::iterator iter = the_registry.find(tmp); + + if ( iter != the_registry.end() ) + options = iter->get() ; + + return options; +} + +int MeshInputOptions::get_generated_mesh_spatial_dimension() const +{ + ThrowRequire(use_generated_mesh()); + return (my_generated_mesh_domain_type == GENERATED_2D_MESH_FOR_INTERFACE_BOUNDING_BOX || my_generated_mesh_domain.size() == 4) ? 2 : 3; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_MeshInputOptions.hpp b/packages/krino/krino/krino_lib/Akri_MeshInputOptions.hpp new file mode 100644 index 000000000000..203d4ee5d6bd --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshInputOptions.hpp @@ -0,0 +1,112 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MeshInputOptions_h +#define Akri_MeshInputOptions_h + +#include +#include +#include +#include +#include +#include + +namespace krino { + + class MeshInputOptions { + + public: + static std::shared_ptr get_or_create(const std::string & model_name); + static MeshInputOptions * get(const std::string & model_name); + + enum GeneratedMeshDomainType + { + NO_GENERATED_MESH=0, + GENERATED_MESH_FOR_SPECIFIED_DOMAIN, + GENERATED_2D_MESH_FOR_INTERFACE_BOUNDING_BOX, + GENERATED_3D_MESH_FOR_INTERFACE_BOUNDING_BOX + }; + + MeshInputOptions(const std::string & name) : + my_name(name), + my_filename("%B.g"), + my_filetype("exodusII"), + my_generated_mesh_domain_type(NO_GENERATED_MESH), + myGeneratedMeshStructureType(BoundingBoxMeshStructureType::CUBIC_BOUNDING_BOX_MESH), + my_generated_mesh_size(-1.0) {} + + const std::string & get_name() const { return my_name; } + bool is_valid() const + { + return !my_name.empty() && ((! my_filetype.empty() && ! my_filename.empty()) || use_generated_mesh()) ; + } + + void set_generated_mesh_structure_type(BoundingBoxMeshStructureType type) { myGeneratedMeshStructureType = type; } + BoundingBoxMeshStructureType get_generated_mesh_structure_type() const { return myGeneratedMeshStructureType; } + + bool use_generated_mesh() const { return my_generated_mesh_domain_type != NO_GENERATED_MESH; } + + void set_generated_mesh_domain_type(GeneratedMeshDomainType type) { my_generated_mesh_domain_type = type; } + GeneratedMeshDomainType get_generated_mesh_domain_type() const { return my_generated_mesh_domain_type; } + + int get_generated_mesh_spatial_dimension() const; + + void set_generated_mesh_size(double size) { my_generated_mesh_size = size; } + double get_generated_mesh_size() const { return my_generated_mesh_size; } + + void set_generated_mesh_element_type(stk::topology top) { my_generated_mesh_element_type = top; } + stk::topology get_generated_mesh_element_type() const { return my_generated_mesh_element_type; } + + void set_generated_mesh_domain(const std::vector & domain) { my_generated_mesh_domain = domain; } + const std::vector & get_generated_mesh_domain() const { return my_generated_mesh_domain; } + + void set_filename(std::string filename) { my_filename = filename; } + const std::string & get_filename() const { return my_filename; } + + void set_filetype(std::string type) { my_filetype = type; } + const std::string & get_filetype() const { return my_filetype; } + + void set_decomposition_method(std::string decomposition_method) { my_decomposition_method = decomposition_method; } + const std::string & get_decomposition_method() const { return my_decomposition_method; } + + void set_coordinate_system(std::string coordinate_system) { my_coordinate_system = coordinate_system; } + const std::string & get_coordinate_system() const { return my_coordinate_system; } + + void add_property(const Ioss::Property & property) { my_properties.add(property); } + Ioss::PropertyManager & get_properties() { return my_properties; } + + private: + struct compare_ptr { + bool operator()( std::shared_ptr const lhs , + std::shared_ptr const rhs ) const + { + return lhs.get() == nullptr ? rhs.get() != nullptr : + ( rhs.get() == nullptr ? false : lhs->get_name() < rhs->get_name() ); + } + }; + + typedef std::set, compare_ptr> Registry; + static Registry the_registry; + + private: + std::string my_name; + std::string my_filename; + std::string my_filetype; + GeneratedMeshDomainType my_generated_mesh_domain_type; + BoundingBoxMeshStructureType myGeneratedMeshStructureType; + std::vector my_generated_mesh_domain; + stk::topology my_generated_mesh_element_type = stk::topology::INVALID_TOPOLOGY; + double my_generated_mesh_size; + std::string my_decomposition_method; + std::string my_coordinate_system; + Ioss::PropertyManager my_properties; + }; + +} // namespace krino + +#endif /* Akri_MeshInputOptions_h */ diff --git a/packages/krino/krino/krino_lib/Akri_MeshSurface.cpp b/packages/krino/krino/krino_lib/Akri_MeshSurface.cpp new file mode 100644 index 000000000000..36a535fb3da4 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshSurface.cpp @@ -0,0 +1,1019 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace krino{ + +void Parallel_Facet_File_Reader::read(const std::string & read_description, const std::function & read_function) +{ + bool ok_locally = true; + + if (0 == stk::EnvData::parallel_rank() ) + { + my_input.exceptions(std::ifstream::failbit | std::ifstream::badbit); + try + { + read_function(); + } + catch (std::ifstream::failure & e) + { + ok_locally = false; + } + } + const bool ok_globally = stk::is_true_on_all_procs(stk::EnvData::parallel_comm(), ok_locally); + if (!ok_globally) + { + ThrowRuntimeError("Error " << read_description << " for file " << my_filename); + } +} + +void Parallel_Facet_File_Reader::open_file() +{ + read("opening file", [this](){my_input.open(my_filename.c_str());}); +} + +void Parallel_Facet_File_Reader::get_batch_size(const int local_num_facets, int & batch_size, int & num_batches) +{ + int num_facets = 0; + stk::all_reduce_sum( stk::EnvData::parallel_comm(), &local_num_facets, &num_facets, 1 ); + + const int min_batch_size = std::min(2048, num_facets); + batch_size = std::max(min_batch_size, 1+num_facets/stk::EnvData::parallel_size()); + num_batches = 1+num_facets/batch_size; + + if(krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "Reading " << num_facets << " facets, using " << num_batches << " batches of " << batch_size << "." << stk::diag::dendl; +} + +Faceted_Surface_From_File::Faceted_Surface_From_File(const std::string & surface_name, const stk::diag::Timer &parent_timer) +: Faceted_Surface(surface_name), + my_timer("Facet File Reader", parent_timer), + my_built_local_facets(false) +{ +} + +void Faceted_Surface_From_File::build_local_facets(const BoundingBox & proc_bbox) +{ + stk::diag::TimeBlock timer_(my_timer); + + if(my_built_local_facets) return; + + std::vector proc_bboxes; + BoundingBox::gather_bboxes( proc_bbox, proc_bboxes ); + + read_file(proc_bboxes); + my_built_local_facets = true; +} + +void Parallel_Facet_File_Reader::close_file() +{ + read("closing file", [this](){my_input.close();}); +} + +FACSurface::FACSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale) + : Faceted_Surface_From_File(surface_name, parent_timer), + my_reader(filename), + my_dist_sign(sign), + my_scale(scale) +{ + // Make sure the file is openable, but close it for now to avoid ulimit restrictions. + my_reader.open_file(); + my_reader.close_file(); +} + +BoundingBox +FACSurface::get_bounding_box() +{ + BoundingBox bbox; + + my_reader.open_file(); + + std::vector points; + my_reader.read("reading points", [this, &points](){read_points(points);}); + + for (auto && point : points) + { + bbox.accommodate(point); + } + + my_reader.close_file(); + + bbox.global_reduce(); + return bbox; +} + +void FACSurface::read_file(const std::vector & proc_bboxes) +{ + my_reader.open_file(); + + std::ifstream & input = my_reader.input(); + std::vector points; + my_reader.read("reading points", [this, &points](){read_points(points);}); + + int num_facets = 0; + my_reader.read("reading number of facets", [&input, &num_facets](){input >> num_facets; ThrowRequire(num_facets > 0);}); + + int batch_size = 0; + int num_batches = 0; + my_reader.get_batch_size(num_facets, batch_size, num_batches); + + for (int batch = 0; batch < num_batches; ++batch) + { + const int current_batch_size = std::min(batch_size, num_facets-batch*batch_size); + my_reader.read("reading facets", [this, &points, current_batch_size, num_facets](){read_facets(current_batch_size, num_facets, points);}); + parallel_distribute_facets(current_batch_size, proc_bboxes); + } + + my_reader.close_file(); +} + +void FACSurface::read_points(std::vector & points) +{ + std::ifstream & input = my_reader.input(); + int num_points; + input >> num_points; + ThrowRequire(num_points > 0); + points.reserve(num_points); + for ( int i = 0; i < num_points; i++ ) + { + int id; + double X, Y, Z; + input >> id; + ThrowRequire(id >= 0 && id < num_points); + input >> X >> Y >> Z; + points.emplace_back(X*my_scale[0], Y*my_scale[1], Z*my_scale[2]); + } +} + +void FACSurface::read_facets(const int batch_size, const int num_facets, const std::vector & points) +{ + std::ifstream & input = my_reader.input(); + const int num_points = points.size(); + for ( int i = 0; i < batch_size; ++i ) + { + int id; + int p1, p2, p3; + input >> id; + ThrowRequire(id >= 0 && id < num_facets); + input >> p1 >> p2 >> p3; + + ThrowRequire(p1 >= 0 && p1 < num_points); + ThrowRequire(p2 >= 0 && p2 < num_points); + ThrowRequire(p3 >= 0 && p3 < num_points); + + if (my_dist_sign == -1) + { + // permute to flip normal direction + int tmp = p1; + p1 = p2; + p2 = tmp; + } + std::unique_ptr facet = std::make_unique( points[p1], points[p2], points[p3] ); + add( std::move(facet) ); + } +} + +PLYSurface::PLYSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale) + : Faceted_Surface_From_File(surface_name, parent_timer), + my_reader(filename), + my_dist_sign(sign), + my_scale(scale) +{ + // Make sure the file is openable, but close it for now to avoid ulimit restrictions. + my_reader.open_file(); + my_reader.close_file(); +} + +BoundingBox PLYSurface::get_bounding_box() +{ + BoundingBox bbox; + + my_reader.open_file(); + + int num_points = 0; + int num_facets = 0; + + my_reader.read("reading file header", [this, &num_points, &num_facets](){read_header(num_points, num_facets);}); + + std::vector points; + my_reader.read("reading points", [this, num_points, &points](){read_points(num_points, points);}); + + for (auto && point : points) + { + bbox.accommodate(point); + } + + my_reader.close_file(); + + bbox.global_reduce(); + + return bbox; +} + +void PLYSurface::read_file(const std::vector & proc_bboxes) +{ + my_reader.open_file(); + + int num_points = 0; + int num_facets = 0; + + my_reader.read("reading file header", [this, &num_points, &num_facets](){read_header(num_points, num_facets);}); + + std::vector points; + my_reader.read("reading points", [this, num_points, &points](){read_points(num_points, points);}); + + int batch_size = 0; + int num_batches = 0; + my_reader.get_batch_size(num_facets, batch_size, num_batches); + + for (int batch = 0; batch < num_batches; ++batch) + { + const int current_batch_size = std::min(batch_size, num_facets-batch*batch_size); + my_reader.read("reading facets", + [this, &points, current_batch_size]() { read_facets(current_batch_size, points); }); + parallel_distribute_facets(current_batch_size, proc_bboxes); + } + + my_reader.close_file(); +} + +void PLYSurface::read_header(int & num_points, int & num_facets) +{ + std::ifstream & input = my_reader.input(); + num_points = 0; + num_facets = 0; + + // Read in the file identifier + std::string symbol; + input >> symbol; + ThrowRequire(symbol.compare("ply") == 0); + + while (symbol.compare("end_header") != 0) + { + ThrowErrorMsgIf(input.eof(), "Problem reading PLY file, reached end of file."); + input >> symbol; + if (symbol.compare("element") == 0) + { + input >> symbol; + if (symbol.compare("vertex") == 0) + { + input >> num_points; + } + else if (symbol.compare("face") == 0) + { + input >> num_facets; + } + } + } +} + +void PLYSurface::read_points(const int num_points, std::vector & points) +{ + std::ifstream & input = my_reader.input(); + points.clear(); + points.reserve(num_points); + for ( int i = 0; i < num_points; i++ ) + { + double X, Y, Z; + input >> X >> Y >> Z; + points.emplace_back(X*my_scale[0], Y*my_scale[1], Z*my_scale[2]); + } + // Move to start of next line to prepare for reading facets + std::string line; + std::getline(input,line); +} + +void PLYSurface::read_facets(const int batch_size, const std::vector & points) +{ + std::ifstream & input = my_reader.input(); + const unsigned num_points = points.size(); + std::string line; + for ( int i = 0; i < batch_size; ++i ) + { + unsigned num_facet_nodes; + unsigned p1, p2, p3; + std::getline(input,line); + std::stringstream linestream(line); + linestream >> num_facet_nodes; + ThrowRequireMsg(num_facet_nodes == 3, "Failed to read face connectivity correctly."); + linestream >> p1 >> p2 >> p3; + ThrowRequire(p1 < num_points); + ThrowRequire(p2 < num_points); + ThrowRequire(p3 < num_points); + + if (my_dist_sign == -1) + { + // permute to flip normal direction + int tmp = p1; + p1 = p2; + p2 = tmp; + } + std::unique_ptr facet = std::make_unique( points[p1], points[p2], points[p3] ); + add( std::move(facet) ); + } +} + +STLSurface::STLSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale) + : Faceted_Surface_From_File(surface_name, parent_timer), + my_is_ascii(true), + my_reader(filename), + my_dist_sign(sign), + my_scale(scale) +{ + // Make sure the file is openable, but close it for now to avoid ulimit restrictions. + my_reader.open_file(); + my_reader.close_file(); +} + +static std::unique_ptr build_facet(const std::array & pts, const int sign) +{ + unsigned p0 = 0; + unsigned p1 = 1; + unsigned p2 = 2; + if (sign == -1) + { + // permute to flip normal direction + p1 = 2; + p2 = 1; + } + + std::unique_ptr facet = std::make_unique( pts[p0], pts[p1], pts[p2] ); + return facet; +} + +static bool is_finite_normal(const Vector3d normal) +{ + bool finiteFlag = true; + if (!std::isfinite(normal[0]) || + !std::isfinite(normal[1]) || + !std::isfinite(normal[2]) ) + { + finiteFlag = false; + krinolog << "Krino::STLSurface found an invalid facet and is skipping." << std::endl; + krinolog << " facet normal " << normal[0] << " " << normal[1] << " " << normal[2] << std::endl; + } + return finiteFlag; +} + +static std::unique_ptr read_ascii_facet(std::ifstream & input, const Vector3d & scale, const int sign) +{ + std::string symbol, nx, ny, nz; + double X, Y, Z; + + // Read in the facet normal + input >> symbol; + ThrowRequire(symbol.compare("normal") == 0); + input >> nx >> ny >> nz; + const Vector3d normal(std::atof(nx.c_str()), std::atof(ny.c_str()), std::atof(nz.c_str())); + + // Read in the "outer loop" line + input >> symbol; + ThrowRequire(symbol.compare("outer") == 0); + input >> symbol; + ThrowRequire(symbol.compare("loop") == 0); + + // Read in the vertices + std::array pts; + for (int i=0; i<3; i++) { + input >> symbol; + ThrowRequire(symbol.compare("vertex") == 0); + input >> X >> Y >> Z; + + pts[i] = Vector3d(X*scale[0], Y*scale[1], Z*scale[2]); + } + + // Read in the "endloop" and "endfacet" lines + input >> symbol; + ThrowRequire(symbol.compare("endloop") == 0); + input >> symbol; + ThrowRequire(symbol.compare("endfacet") == 0); + + std::unique_ptr facet; + if (is_finite_normal(normal)) + { + facet = build_facet(pts, sign); + if (facet->degenerate()) + facet.reset(); + } + + return facet; +} + +static bool read_start_of_next_ascii_facet(std::ifstream & input) +{ + // Read the next line + std::string symbol; + input >> symbol; + return symbol.compare("facet") == 0; +} + +static float read_binary_float(std::ifstream& input) +{ + float val = 0; + input.read((char *) &val, sizeof(val)); + return val; +} + +static Vector3d read_binary_vector(std::ifstream& input) +{ + float x = read_binary_float(input); + float y = read_binary_float(input); + float z = read_binary_float(input); + return Vector3d(x, y, z); +} + +static std::unique_ptr read_binary_facet(std::ifstream & input, const Vector3d & scale, const int sign) +{ + const Vector3d normal = read_binary_vector(input); + + std::array pts; + for (auto && pt : pts) + { + const Vector3d vec = read_binary_vector(input); + pt = Vector3d(vec[0]*scale[0], vec[1]*scale[1], vec[2]*scale[2]); + } + + char dummy[2]; + input.read(dummy, 2); + + std::unique_ptr facet; + if (is_finite_normal(normal)) + { + facet = build_facet(pts, sign); + if (facet->degenerate()) + facet.reset(); + } + + return facet; +} + +BoundingBox +STLSurface::get_bounding_box() +{ + BoundingBox bbox; + + my_reader.open_file(); + + my_reader.read("reading file header", [this](){read_header();}); + my_is_ascii = stk::is_true_on_all_procs(stk::EnvData::parallel_comm(), my_is_ascii); + + if (my_is_ascii) + { + my_reader.read("reading facets", [this, &bbox](){bbox = get_ascii_facet_bounding_box();}); + } + else + { + unsigned numFacets = 0; + my_reader.read("reading num facets", [this, &numFacets](){numFacets = read_num_binary_facets();}); + my_reader.read("reading facets", [this, &bbox, numFacets](){bbox = get_binary_facet_bounding_box(numFacets);}); + } + + my_reader.close_file(); + + bbox.global_reduce(); + return bbox; +} + +void +STLSurface::read_file(const std::vector & proc_bboxes) +{ + my_reader.open_file(); + + my_reader.read("reading file header", [this](){read_header();}); + my_is_ascii = stk::is_true_on_all_procs(stk::EnvData::parallel_comm(), my_is_ascii); + + unsigned numBinaryFacets = 0; + if (!my_is_ascii) + my_reader.read("reading num facets", [this, &numBinaryFacets](){numBinaryFacets = read_num_binary_facets();}); + + const unsigned maxBatchSize = 8192; + + unsigned numValidFacetsRead = 0; + bool done = false; + while (!done) + { + unsigned batchSize = 0; + + if (my_is_ascii) + { + my_reader.read("reading facets", [this, &batchSize](){batchSize = read_ascii_facets(maxBatchSize);}); + } + else + { + my_reader.read("reading facets", [this, &batchSize, &numBinaryFacets](){batchSize = read_binary_facets(maxBatchSize, numBinaryFacets);}); + } + + const unsigned localBatchSize = batchSize; + stk::all_reduce_max( stk::EnvData::parallel_comm(), &localBatchSize, &batchSize, 1 ); + numValidFacetsRead += batchSize; + + parallel_distribute_facets(batchSize, proc_bboxes); + + done = batchSize < maxBatchSize; + } + + my_reader.close_file(); + + krinolog << "Read " << (my_is_ascii ? "ASCII" : "binary") << " STL file " << my_reader.filename() << " with " << numValidFacetsRead << " valid facets." << stk::diag::dendl; +} + +void +STLSurface::read_header() +{ + std::ifstream & input = my_reader.input(); + + std::string symbol; + input >> symbol; + my_is_ascii = symbol.compare("solid") == 0; + + if (my_is_ascii) + { + // Read in strings until you get to facet + while (symbol.compare("facet") != 0) + { + ThrowErrorMsgIf(input.eof(), "Problem reading STL file, no facets found."); + input >> symbol; + } + krinolog << "Reading ASCII STL file." << stk::diag::dendl; + } + else + { + char header_info[80] = ""; + input.clear(); + input.seekg(0); + input.read(header_info, 80); + ThrowErrorMsgIf(!input.good(), "Problem reading STL file, cannot read binary file header."); + } +} + +unsigned STLSurface::read_num_binary_facets() +{ + ThrowAssert(!my_is_ascii); + std::ifstream & input = my_reader.input(); + unsigned numFacets = 0; + input.read((char *) &numFacets, sizeof(numFacets)); + ThrowErrorMsgIf(!input.good(), "Problem reading STL file, cannot read number of facets."); + krinolog << "Reading binary STL file with " << numFacets << " facets." << stk::diag::dendl; + return numFacets; +} + +unsigned STLSurface::read_ascii_facets(const unsigned max_batch_size) +{ + std::ifstream & input = my_reader.input(); + + unsigned count = 0; + bool done = false; + while (!done) + { + std::unique_ptr facet = read_ascii_facet(input, my_scale, my_dist_sign); + if (facet) + { + add(std::move(facet)); + ++count; + } + done = (!read_start_of_next_ascii_facet(input) || count >= max_batch_size); + } + return count; +} + +unsigned STLSurface::read_binary_facets(const unsigned maxBatchSize, unsigned & numRemainingInFile) +{ + std::ifstream & input = my_reader.input(); + + unsigned count = 0; + bool done = numRemainingInFile == 0; + while (!done) + { + std::unique_ptr facet = read_binary_facet(input, my_scale, my_dist_sign); + if (facet) + { + add(std::move(facet)); + ++count; + } + done = (--numRemainingInFile == 0 || count >= maxBatchSize); + } + + return count; +} + +BoundingBox STLSurface::get_ascii_facet_bounding_box() +{ + std::ifstream & input = my_reader.input(); + + BoundingBox bbox; + + bool done = false; + while (!done) + { + std::unique_ptr facet = read_ascii_facet(input, my_scale, my_dist_sign); + if (facet) + bbox.accommodate(facet->bounding_box()); + done = !read_start_of_next_ascii_facet(input); + } + return bbox; +} + +BoundingBox STLSurface::get_binary_facet_bounding_box(const unsigned numFacets) +{ + std::ifstream & input = my_reader.input(); + + BoundingBox bbox; + + for (unsigned count=0; count facet = read_binary_facet(input, my_scale, my_dist_sign); + if (facet) + bbox.accommodate(facet->bounding_box()); + } + return bbox; +} + +EXOSurface::EXOSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale) + : Faceted_Surface_From_File(surface_name, parent_timer), + my_filename(filename), + my_dist_sign(sign), + my_scale(scale) +{ +} + +BoundingBox +EXOSurface::get_bounding_box() +{ + BoundingBox bbox; + + std::vector xyz; + std::unique_ptr io; + if ( 0 == stk::EnvData::parallel_rank() ) + { + /* open file */ + Ioss::DatabaseIO *db = Ioss::IOFactory::create("exodusII", my_filename.c_str(), Ioss::READ_MODEL, MPI_COMM_SELF); + if ( !db ) { + ThrowRuntimeError("error reading file " << my_filename); + } + io = std::make_unique(db, "EXOSurface IC Region"); + + /* exodus description */ + int num_dim = io->get_property("spatial_dimension").get_int(); + int num_nodes = io->get_property("node_count").get_int(); + + ThrowAssert( 3 == num_dim ); + + /* generate coordinates */ + xyz.resize(num_nodes*num_dim); + + Ioss::NodeBlock *nb = io->get_node_blocks()[0]; + nb->get_field_data("mesh_model_coordinates", xyz); + + for (int n = 0; n & proc_bboxes) +{ + const int nodes_per_elem = 3; + int num_elem_blk = 0; + std::vector xyz; + std::vector nmap; + std::unique_ptr io; + if ( 0 == stk::EnvData::parallel_rank() ) + { + /* open file */ + Ioss::DatabaseIO *db = Ioss::IOFactory::create("exodusII", my_filename.c_str(), Ioss::READ_MODEL, MPI_COMM_SELF); + if ( !db ) { + ThrowRuntimeError("error reading file " << my_filename); + } + io = std::make_unique(db, "EXOSurface IC Region"); + + krinolog << "opened file " << my_filename << " for reading..." << std::endl; + + /* exodus description */ + int num_dim = io->get_property("spatial_dimension").get_int(); + int num_nodes = io->get_property("node_count").get_int(); + int num_elem = io->get_property("element_count").get_int(); + num_elem_blk = io->get_property("element_block_count").get_int(); + + krinolog + << "num dim = " << num_dim + << ", num nodes = " << num_nodes + << ", num elems = " << num_elem + << ", num elem blks = " << num_elem_blk << std::endl; + + ThrowAssert( 3 == num_dim ); + + /* generate coordinates */ + xyz.resize(num_nodes*num_dim); + nmap.resize(num_nodes); + + Ioss::NodeBlock *nb = io->get_node_blocks()[0]; + nb->get_field_data("mesh_model_coordinates", xyz); + nb->get_field_data("ids", nmap); + } + + const int local_num_elem_blk = num_elem_blk; + stk::all_reduce_max( stk::EnvData::parallel_comm(), &local_num_elem_blk, &num_elem_blk, 1 ); + + + for (int blk = 0; blk < num_elem_blk; blk++ ) + { + int num_elem_in_blk = 0; + std::vector conn; + + if ( 0 == stk::EnvData::parallel_rank() ) + { + Ioss::ElementBlockContainer ebs = io->get_element_blocks(); + Ioss::ElementBlock *eb = ebs[blk]; + num_elem_in_blk = eb->get_property("entity_count").get_int(); + + std::string eb_name = eb->name(); + krinolog + << "Reading elem blk #" << blk+1 + << " with name " << eb_name << "..." << std::endl; + + int nodes_per_elem_in_blk = eb->get_property("topology_node_count").get_int(); + ThrowAssert( nodes_per_elem_in_blk == nodes_per_elem ); + + conn.resize(num_elem_in_blk*nodes_per_elem_in_blk); + + krinolog + << " num elem in blk = " << num_elem_in_blk + << ", nodes per elem in blk = " << nodes_per_elem_in_blk << std::endl; + + eb->get_field_data("connectivity", conn); + } + + int batch_size = 0; + int num_batches = 0; + Parallel_Facet_File_Reader::get_batch_size(num_elem_in_blk, batch_size, num_batches); + + for (int batch = 0; batch < num_batches; ++batch) + { + const int current_batch_size = std::min(batch_size, num_elem_in_blk-batch*batch_size); + if ( 0 == stk::EnvData::parallel_rank() ) + { + Vector3d pt[3]; + for ( int e = 0; e < current_batch_size; e++ ) + { + for ( int j = 0; j < nodes_per_elem; j++ ) + { + const int nodeid = conn[e*nodes_per_elem + j]; + const int n = std::distance(nmap.begin(), std::find(nmap.begin(), nmap.end(), nodeid)); + double nodeX = xyz[3*n+0]; + double nodeY = xyz[3*n+1]; + double nodeZ = xyz[3*n+2]; + pt[j] = Vector3d( nodeX*my_scale[0], nodeY*my_scale[1], nodeZ*my_scale[2] ); + } + + unsigned p0 = 0; + unsigned p1 = 1; + unsigned p2 = 2; + if (my_dist_sign == -1) + { + // permute to flip normal direction + p1 = 2; + p2 = 1; + } + + std::unique_ptr facet = std::make_unique( pt[p0], pt[p1], pt[p2] ); + add( std::move(facet) ); + } + } + parallel_distribute_facets(current_batch_size, proc_bboxes); + } + } +} + +MeshSurface::MeshSurface(const stk::mesh::MetaData & meta, + const stk::mesh::Field& coord_ref, + const stk::mesh::Selector & surface_selector, + const int sign) + : Faceted_Surface("Mesh surface"), + my_sign(sign), + my_mesh_meta(meta), + my_coord_ref(coord_ref), + my_surface_selector(surface_selector) +{ +} + +void +MeshSurface::build_local_facets(const BoundingBox & proc_bbox) +{ + /* %TRACE[ON]% */ Trace trace__("krino::MeshSurface::build_local_facets()"); /* %TRACE% */ + const stk::mesh::BulkData & mesh = my_mesh_meta.mesh_bulk_data(); + stk::mesh::Selector active_locally_owned_selector = + (NULL != my_mesh_meta.get_part("ACTIVE_CONTEXT_BIT")) ? + (*my_mesh_meta.get_part("ACTIVE_CONTEXT_BIT") & my_mesh_meta.locally_owned_part()) : + stk::mesh::Selector(my_mesh_meta.locally_owned_part()); + + stk::mesh::Selector active_locally_owned_part_selector = active_locally_owned_selector & my_surface_selector; + + stk::mesh::BucketVector const& buckets = mesh.get_buckets( my_mesh_meta.side_rank(), active_locally_owned_part_selector); + + clear(); + + stk::mesh::BucketVector::const_iterator ib = buckets.begin(); + stk::mesh::BucketVector::const_iterator ib_end = buckets.end(); + + for ( ; ib != ib_end ; ++ib ) + { + const stk::mesh::Bucket & b = **ib; + const unsigned length = b.size(); + + for ( unsigned iSide = 0; iSide < length; ++iSide ) + { + stk::mesh::Entity side = b[iSide]; + + stk::topology side_topology = mesh.bucket(side).topology(); + if (stk::topology::TRI_3 == side_topology) + { + add_facet3d(mesh,side,0,1,2); + } + else if (stk::topology::QUAD_4 == side_topology) + { + add_quad3d(mesh,side,0,1,2,3); + } + else if (stk::topology::TRI_6 == side_topology) + { + add_facet3d(mesh,side,0,3,5); + add_facet3d(mesh,side,1,4,3); + add_facet3d(mesh,side,2,5,4); + add_facet3d(mesh,side,3,4,5); + } + else if (stk::topology::LINE_2 == side_topology) + { + add_facet2d(mesh,side,0,1); + } + else if (stk::topology::LINE_3 == side_topology) + { + add_facet2d(mesh,side,0,2); + add_facet2d(mesh,side,2,1); + } + else + { + ThrowRuntimeError("Elements with side topology " << side_topology.name() << " not supported for mesh surface initialization."); + } + } + } +} + +void +MeshSurface::add_facet2d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1) +{ + ThrowAssert(2 == my_mesh_meta.spatial_dimension()); + Vector3d pt[2]; + + if (my_sign == -1) + { + // permute to flip normal direction + const unsigned tmp = p0; + p0 = p1; + p1 = tmp; + } + + const stk::mesh::Entity* side_nodes = mesh.begin_nodes(side); + + const double * pt0 = stk::mesh::field_data(my_coord_ref, side_nodes[p0]); + const double * pt1 = stk::mesh::field_data(my_coord_ref, side_nodes[p1]); + + pt[0][0] = pt0[0]; + pt[0][1] = pt0[1]; + pt[0][2] = 0.0; + pt[1][0] = pt1[0]; + pt[1][1] = pt1[1]; + pt[1][2] = 0.0; + + add_facet2d(pt[0], pt[1]); +} + +void +MeshSurface::add_facet3d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1, unsigned p2) +{ + ThrowAssert(3 == my_mesh_meta.spatial_dimension()); + Vector3d pt[3]; + + if (my_sign == -1) + { + // permute to flip normal direction + const unsigned tmp = p1; + p1 = p2; + p2 = tmp; + } + + const stk::mesh::Entity* side_nodes = mesh.begin_nodes(side); + + pt[0] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p0])); + pt[1] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p1])); + pt[2] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p2])); + + add_facet3d(pt[0], pt[1], pt[2]); +} + +void +MeshSurface::add_quad3d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1, unsigned p2, unsigned p3) +{ + ThrowAssert(3 == my_mesh_meta.spatial_dimension()); + Vector3d pt[5]; + + if (my_sign == -1) + { + // permute to flip normal direction + const unsigned tmp = p1; + p1 = p3; + p3 = tmp; + } + + const stk::mesh::Entity* side_nodes = mesh.begin_nodes(side); + + pt[0] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p0])); + pt[1] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p1])); + pt[2] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p2])); + pt[3] = Vector3d(stk::mesh::field_data(my_coord_ref, side_nodes[p3])); + + // scale is the RMS of the diagonal lengths, sqr_scale is scale*scale, or the average of the lengths squared + const double sqr_scale = 0.5*((pt[0]-pt[2]).length_squared()+(pt[1]-pt[3]).length_squared()); + // tol is 1e-4, sqr_tol is 1e-8 + const double sqr_tol = 1.e-8; + // Test is that the distance between the midpoints of the 2 diagonals is less than tol*scale + const bool is_planar = (0.5*(pt[0]+pt[2])-0.5*(pt[1]+pt[3])).length_squared() < sqr_tol*sqr_scale; + //const bool is_planar = false; // conservative approach, forces 4 facets per quad + + if (is_planar) + { + add_facet3d(pt[0], pt[1], pt[2]); + add_facet3d(pt[0], pt[2], pt[3]); + } + else + { + pt[4] = 0.25 * (pt[0]+pt[1]+pt[2]+pt[3]); + add_facet3d(pt[0], pt[1], pt[4]); + add_facet3d(pt[1], pt[2], pt[4]); + add_facet3d(pt[2], pt[3], pt[4]); + add_facet3d(pt[3], pt[0], pt[4]); + } +} + +void +MeshSurface::add_facet2d(Vector3d & p0, Vector3d & p1) +{ + ThrowAssert(2 == my_mesh_meta.spatial_dimension()); + + std::unique_ptr facet = std::make_unique( p0, p1 ); + add( std::move(facet) ); +} + +void +MeshSurface::add_facet3d(Vector3d & p0, Vector3d & p1, Vector3d & p2) +{ + ThrowAssert(3 == my_mesh_meta.spatial_dimension()); + + std::unique_ptr facet = std::make_unique( p0, p1, p2 ); + add( std::move(facet) ); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_MeshSurface.hpp b/packages/krino/krino/krino_lib/Akri_MeshSurface.hpp new file mode 100644 index 000000000000..7f2ec3c199c7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MeshSurface.hpp @@ -0,0 +1,177 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MeshSurface_h +#define Akri_MeshSurface_h + +#include + +#include +#include + +#include +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class Entity; } } +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace mesh { class Selector; } } + +namespace krino { + +class MeshSurface : public Faceted_Surface { +public: + MeshSurface(const stk::mesh::MetaData & meta, + const stk::mesh::Field& coord_ref, + const stk::mesh::Selector & surface_selector, + const int sign); + + virtual ~MeshSurface() {} + virtual void build_local_facets(const BoundingBox & proc_bbox) override; + +protected: + void add_facet2d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1); + void add_facet3d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1, unsigned p2); + void add_quad3d(const stk::mesh::BulkData& mesh, stk::mesh::Entity side, unsigned p0, unsigned p1, unsigned p2, unsigned p3); + void add_facet2d(Vector3d & p0, Vector3d & p1); + void add_facet3d(Vector3d & p0, Vector3d & p1, Vector3d & p2); + +private: + int my_sign; + const stk::mesh::MetaData & my_mesh_meta; + const stk::mesh::Field& my_coord_ref; + const stk::mesh::Selector my_surface_selector; +}; + +class Parallel_Facet_File_Reader { +public: + Parallel_Facet_File_Reader(const std::string & in_filename) : my_filename(in_filename) {} + + static void get_batch_size(const int local_num_facets, int & batch_size, int & num_batches); + + std::ifstream & input() { return my_input; } + const std::string & filename() const { return my_filename; } + + void open_file(); + void close_file(); + void read(const std::string & read_description, const std::function & read_function); + +private: + std::string my_filename; + std::ifstream my_input; +}; + +class Faceted_Surface_From_File : public Faceted_Surface { +public: + Faceted_Surface_From_File(const std::string & surface_name, const stk::diag::Timer &parent_timer); + virtual ~Faceted_Surface_From_File() {} + virtual void build_local_facets(const BoundingBox & proc_bbox) override; + virtual BoundingBox get_bounding_box() override = 0; + +protected: + virtual void read_file(const std::vector & proc_bboxes) = 0; +private: + stk::diag::Timer my_timer; + bool my_built_local_facets; +}; + +class STLSurface : public Faceted_Surface_From_File { +public: + STLSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale); + + virtual ~STLSurface() {} + virtual BoundingBox get_bounding_box() override; + +private: + virtual void read_file(const std::vector & proc_bboxes) override; + void read_header(); + unsigned read_num_binary_facets(); + unsigned read_ascii_facets(const unsigned max_batch_size); + unsigned read_binary_facets(const unsigned maxBatchSize, unsigned & numRemainingInFile); + BoundingBox get_ascii_facet_bounding_box(); + BoundingBox get_binary_facet_bounding_box(const unsigned numFacets); + +private: + bool my_is_ascii; + Parallel_Facet_File_Reader my_reader; + int my_dist_sign; + Vector3d my_scale; +}; + +class FACSurface : public Faceted_Surface_From_File { +public: + FACSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale); + + virtual ~FACSurface() {} + virtual BoundingBox get_bounding_box() override; + +private: + virtual void read_file(const std::vector & proc_bboxes) override; + void read_points(std::vector & points); + void read_facets(const int batch_size, const int num_facets, const std::vector & points); + +private: + Parallel_Facet_File_Reader my_reader; + int my_dist_sign; + Vector3d my_scale; +}; + +class PLYSurface : public Faceted_Surface_From_File { +public: + PLYSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale); + + virtual ~PLYSurface() {} + virtual BoundingBox get_bounding_box() override; + +private: + Parallel_Facet_File_Reader my_reader; + virtual void read_file(const std::vector & proc_bboxes) override; + void read_header(int & num_points, int & num_facets); + void read_points(const int num_points, std::vector & points); + void read_facets(const int batch_size, const std::vector & points); + +private: + int my_dist_sign; + Vector3d my_scale; +}; + +class EXOSurface : public Faceted_Surface_From_File { +public: + EXOSurface(const std::string & surface_name, + const stk::diag::Timer &parent_timer, + const std::string & filename, + const int sign, + const Vector3d & scale); + + virtual ~EXOSurface() {} + virtual BoundingBox get_bounding_box() override; + +private: + virtual void read_file(const std::vector & proc_bboxes) override; + +private: + std::string my_filename; + int my_dist_sign; + Vector3d my_scale; +}; + +} // namespace krino + +#endif // Akri_MeshSurface_h diff --git a/packages/krino/krino/krino_lib/Akri_MortonIndex.hpp b/packages/krino/krino/krino_lib/Akri_MortonIndex.hpp new file mode 100644 index 000000000000..4d811bbf1218 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_MortonIndex.hpp @@ -0,0 +1,58 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MortonIndex_h +#define Akri_MortonIndex_h + +#include +#include + +namespace krino { + +constexpr int MAX_VALID_MORTON3D_INDEX = 0x1fffff; + +uint64_t morton3d_encode_index(const int i) +{ + ThrowAssertMsg(i >= 0, "Index must be >= 0 to encode: " << i); + ThrowAssertMsg(i <= MAX_VALID_MORTON3D_INDEX, "Index must be <= " << MAX_VALID_MORTON3D_INDEX << " to encode: " << i); + uint64_t m = i & 0x1fffff; + m = (m | m << 32) & 0x001f00000000ffff; + m = (m | m << 16) & 0x001f0000ff0000ff; + m = (m | m << 8) & 0x100f00f00f00f00f; + m = (m | m << 4) & 0x10c30c30c30c30c3; + m = (m | m << 2) & 0x1249249249249249; + return m; +} + +int morton3d_decode_index(uint64_t m) +{ + m &= 0x1249249249249249; + m = (m ^ (m >> 2)) & 0x10c30c30c30c30c3; + m = (m ^ (m >> 4)) & 0x100f00f00f00f00f; + m = (m ^ (m >> 8)) & 0x001f0000ff0000ff; + m = (m ^ (m >> 16)) & 0x001f00000000ffff; + m = (m ^ (m >> 32)) & 0x1fffff; + return static_cast(m); +} + +uint64_t morton3d_encode_indices(const std::array & indices) +{ + return morton3d_encode_index(indices[2]) * 4 + morton3d_encode_index(indices[1]) * 2 + morton3d_encode_index(indices[0]); +} + +std::array morton3d_decode_indices(const uint64_t m) +{ + const int ix = morton3d_decode_index(m); + const int iy = morton3d_decode_index(m >> 1); + const int iz = morton3d_decode_index(m >> 2); + return {{ix,iy,iz}}; +} + +} // namespace krino + +#endif // Akri_MortonIndex_h diff --git a/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.cpp b/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.cpp new file mode 100644 index 000000000000..6f1f5d091d5c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.cpp @@ -0,0 +1,121 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino { + +static void pack_node_captured_domains_for_sharing_or_ghosting_procs(const stk::mesh::BulkData & mesh, + const stk::mesh::Entity node, + const std::vector & nodeCapturedDomains, + std::vector procsThatNeedToKnowAboutNode, + stk::CommSparse &commSparse) +{ + fill_procs_owning_or_sharing_or_ghosting_node(mesh, node, procsThatNeedToKnowAboutNode); + for (int procId : procsThatNeedToKnowAboutNode) + { + if (procId != mesh.parallel_rank()) + { + commSparse.send_buffer(procId).pack(mesh.identifier(node)); + commSparse.send_buffer(procId).pack(nodeCapturedDomains.size()); + for (int domain : nodeCapturedDomains) + commSparse.send_buffer(procId).pack(domain); + } + } +} + +static +void pack_all_node_captured_domains_for_sharing_or_ghosting_procs(const stk::mesh::BulkData & mesh, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + stk::CommSparse &commSparse) +{ + std::vector scratchVec; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto && entry : nodesToCapturedDomains) + { + stk::mesh::Entity node = entry.first; + if (mesh.parallel_owner_rank(node) == mesh.parallel_rank()) + { + const auto & nodeCapturedDomains = entry.second; + pack_node_captured_domains_for_sharing_or_ghosting_procs(mesh, node, nodeCapturedDomains, scratchVec, commSparse); + } + } + }); +} + +static +void pack_node_captured_domains_of_given_nodes_for_sharing_or_ghosting_procs(const stk::mesh::BulkData & mesh, + const std::vector & nodes, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + stk::CommSparse &commSparse) +{ + std::vector scratchVec; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto node : nodes) + { + if (mesh.parallel_owner_rank(node) == mesh.parallel_rank()) + { + const auto nodeCapturedDomains = nodesToCapturedDomains.at(node); + pack_node_captured_domains_for_sharing_or_ghosting_procs(mesh, node, nodeCapturedDomains, scratchVec, commSparse); + } + } + }); +} + +static +void unpack_snap_node_domains(const stk::mesh::BulkData & mesh, + NodeToCapturedDomainsMap & nodesToSnappedDomains, + stk::CommSparse &commSparse) +{ + std::vector nodeSnappedDomains; + + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + stk::mesh::EntityId nodeId; + commSparse.recv_buffer(procId).unpack(nodeId); + size_t numNodes; + commSparse.recv_buffer(procId).unpack(numNodes); + nodeSnappedDomains.resize(numNodes); + for (auto && domain : nodeSnappedDomains) + commSparse.recv_buffer(procId).unpack(domain); + + stk::mesh::Entity snapNode = mesh.get_entity(stk::topology::NODE_RANK, nodeId); + nodesToSnappedDomains[snapNode] = nodeSnappedDomains; + } + }); +} + +void communicate_node_captured_domains_for_given_nodes(const stk::mesh::BulkData & mesh, + const std::vector & nodes, + NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + stk::CommSparse commSparse(mesh.parallel()); + pack_node_captured_domains_of_given_nodes_for_sharing_or_ghosting_procs(mesh, nodes, nodesToCapturedDomains, commSparse); + unpack_snap_node_domains(mesh, nodesToCapturedDomains, commSparse); +} + +void communicate_node_captured_domains_for_all_nodes(const stk::mesh::BulkData & mesh, + NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + stk::CommSparse commSparse(mesh.parallel()); + pack_all_node_captured_domains_for_sharing_or_ghosting_procs(mesh, nodesToCapturedDomains, commSparse); + unpack_snap_node_domains(mesh, nodesToCapturedDomains, commSparse); +} + +} + + diff --git a/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.hpp b/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.hpp new file mode 100644 index 000000000000..7245a6e9398c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_NodeToCapturedDomains.hpp @@ -0,0 +1,31 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_NODETOCAPTUREDDOMAINS_H_ +#define KRINO_INCLUDE_AKRI_NODETOCAPTUREDDOMAINS_H_ +#include +#include +#include +#include + +namespace krino { + +typedef std::map> NodeToCapturedDomainsMap; + +void communicate_node_captured_domains_for_given_nodes(const stk::mesh::BulkData & mesh, + const std::vector & nodes, + NodeToCapturedDomainsMap & nodesToCapturedDomains); + +void communicate_node_captured_domains_for_all_nodes(const stk::mesh::BulkData & mesh, + NodeToCapturedDomainsMap & nodesToCapturedDomains); + +typedef std::map ElementToDomainMap; + +} + +#endif /* KRINO_INCLUDE_AKRI_NODETOCAPTUREDDOMAINS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_OrderedIdPair.hpp b/packages/krino/krino/krino_lib/Akri_OrderedIdPair.hpp new file mode 100644 index 000000000000..9f89f71a210a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_OrderedIdPair.hpp @@ -0,0 +1,50 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_ORDEREDIDPAIR_H_ +#define AKRI_ORDEREDIDPAIR_H_ + +#include +#include + +namespace krino { + +class OrderedIdPair { +public: + OrderedIdPair(stk::mesh::EntityId id0, stk::mesh::EntityId id1) + : my_ids(id0 < id1 ? id0 : id1, id0 < id1 ? id1 : id0) {} + + stk::mesh::EntityId first() const { return my_ids.first; } + stk::mesh::EntityId second() const { return my_ids.second; } + +private: + std::pair my_ids; +}; + +inline bool operator<(const OrderedIdPair lhs, const OrderedIdPair rhs) +{ + if(lhs.first() < rhs.first()) return true; + if(rhs.first() < lhs.first()) return false; + if(lhs.second() < rhs.second()) return true; + return false; +} + +inline bool operator==(const OrderedIdPair lhs, const OrderedIdPair rhs) +{ + return (lhs.first() == rhs.first()) && (lhs.second() == rhs.second()); +} + +inline bool operator!=(const OrderedIdPair lhs, const OrderedIdPair rhs) +{ + return !(lhs == rhs); +} + +} + + +#endif /* AKRI_ORDEREDIDPAIR_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_ParallelCommHelpers.hpp b/packages/krino/krino/krino_lib/Akri_ParallelCommHelpers.hpp new file mode 100644 index 000000000000..273e4ab441b7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ParallelCommHelpers.hpp @@ -0,0 +1,77 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_PARALLELCOMMHELPERS_H_ +#define KRINO_INCLUDE_AKRI_PARALLELCOMMHELPERS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +// PACK_OP shoudl have an operator()(stk::CommBuffer & buffer, const stk::mesh::EntityKey & entity_key) +// UNPACK_OP should have an operator()(CommBuffer & buffer) +template +void communicate_with_shared_procs(const stk::mesh::BulkData& mesh, + const std::vector & local_entities, + PACK_OP pack_op, + UNPACK_OP unpack_op) +{ + // The input vector, local_entities, must only contain entities that are locally_owned or globally_shared (or both). + + stk::CommSparse comm_spec(mesh.parallel()); + std::vector sharing_procs; + + for (int phase=0;phase<2;++phase) + { + for (auto&& local_entity : local_entities) + { + ThrowAssert(mesh.bucket(local_entity).owned() || mesh.bucket(local_entity).shared()); + mesh.comm_shared_procs(local_entity, sharing_procs); + for (auto&& sharing_proc : sharing_procs) + { + if (sharing_proc != mesh.parallel_rank()) + { + pack_op(comm_spec.send_buffer(sharing_proc), mesh.entity_key(local_entity)); + } + } + } + + if ( phase == 0 ) + { + comm_spec.allocate_buffers(); + } + else + { + comm_spec.communicate(); + } + } + + for(int i = 0; i < mesh.parallel_size(); ++i) + { + if(i != mesh.parallel_rank()) + { + auto & recv_buffer = comm_spec.recv_buffer(i); + while(recv_buffer.remaining()) + { + unpack_op(recv_buffer); + } + } + } +} + +} + +#endif /* KRINO_INCLUDE_AKRI_PARALLELCOMMHELPERS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.cpp b/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.cpp new file mode 100644 index 000000000000..4881453ec8a3 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.cpp @@ -0,0 +1,30 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino +{ + +ParallelErrorMessage::ParallelErrorMessage(const stk::Parallel & c) : comm(c) {} + +std::pair ParallelErrorMessage::gather_message() const +{ + const std::string & local_str = local_message.str(); + + std::ostringstream result; + stk::all_write_string(comm.parallel(), result, local_str); + + int err = result.str().size(); + int global_err; + stk::all_reduce_sum(comm.parallel(), &err, &global_err, 1); + + return make_pair(static_cast(global_err), result.str()); +} +} diff --git a/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.hpp b/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.hpp new file mode 100644 index 000000000000..b2b76e3a4ee0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ParallelErrorMessage.hpp @@ -0,0 +1,43 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_PARALLELERRORMESSAGE_H_ +#define KRINO_INCLUDE_AKRI_PARALLELERRORMESSAGE_H_ + +#include +#include +#include + +namespace krino +{ + +class ParallelErrorMessage +{ +public: + ParallelErrorMessage(const stk::Parallel & c); + + template ParallelErrorMessage & operator<<(const T & t) + { + local_message << t; + return *this; + } + + // This will gather the messages from all ranks to rank 0 where it can be output. + // and additionally return a parallel-consistent bool for whether or not any errors + // were logged. + std::pair gather_message() const; + + bool have_local_error() const { return !local_message.str().empty(); } + +private: + const stk::Parallel comm; + std::ostringstream local_message; +}; +} + +#endif /* KRINO_INCLUDE_AKRI_PARALLELERRORMESSAGE_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_ParentsToChildMapper.cpp b/packages/krino/krino/krino_lib/Akri_ParentsToChildMapper.cpp new file mode 100644 index 000000000000..6f217818262f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ParentsToChildMapper.cpp @@ -0,0 +1,188 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +static bool determine_if_mesh_has_higher_order_midside_nodes_with_level_set_locally(const stk::mesh::BulkData & mesh, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + // Assume we can check master element on one bucket and get the right answer + + for ( auto && bucket_ptr : mesh.get_buckets(stk::topology::ELEMENT_RANK, phaseSupport.get_all_decomposed_blocks_selector()) ) + { + if (bucket_ptr->topology() != bucket_ptr->topology().base()) + { + for (int ls_index = 0; ls_index < cdfemSupport.num_ls_fields(); ++ls_index) + { + stk::topology fieldTopology = MasterElementDeterminer::get_field_topology(*bucket_ptr, cdfemSupport.ls_field(ls_index).isovar); + if (fieldTopology != fieldTopology.base()) + return true; + } + } + } + return false; +} + +void fill_edge_nodes( + const stk::mesh::BulkData & mesh, + const stk::mesh::Entity node0, + const stk::mesh::Entity node1, + const ParentsToChildMapper & parentToChildMapper, + std::vector & edgeNodes) +{ + stk::mesh::Entity child = parentToChildMapper.get_child(mesh, node0, node1); + + if (mesh.is_valid(child)) + { + ThrowRequire(child != node0); + ThrowRequire(child != node1); + fill_edge_nodes(mesh, node0,child, parentToChildMapper, edgeNodes); + fill_edge_nodes(mesh, child,node1, parentToChildMapper, edgeNodes); + } + else + { + if (edgeNodes.empty()) + { + edgeNodes.push_back(node0); + } + edgeNodes.push_back(node1); + } +} + +static void fill_edge_nodes_and_positions( + const double pos0, stk::mesh::Entity node0, + const double pos1, stk::mesh::Entity node1, + std::vector & edgeNodes, + std::vector & edgeNodePositions) +{ + if (edgeNodePositions.empty()) + { + edgeNodePositions.push_back(pos0); + edgeNodes.push_back(node0); + } + edgeNodePositions.push_back(pos1); + edgeNodes.push_back(node1); +} + +static void fill_edge_nodes_and_positions( + const stk::mesh::BulkData & mesh, + const double pos0, stk::mesh::Entity node0, + const double pos1, stk::mesh::Entity node1, + const ParentsToChildMapper & parent_child_mapper, + std::vector & edgeNodes, + std::vector & edgeNodePositions) +{ + stk::mesh::Entity child = parent_child_mapper.get_child(mesh, node0, node1); + + if (mesh.is_valid(child)) + { + ThrowRequire(child != node0); + ThrowRequire(child != node1); + const double child_rel_pos = compute_child_position(mesh, child, node0, node1); + const double child_abs_pos = pos0 * (1.-child_rel_pos) + pos1 * child_rel_pos; + fill_edge_nodes_and_positions(mesh,pos0,node0,child_abs_pos,child, parent_child_mapper, edgeNodes, edgeNodePositions); + fill_edge_nodes_and_positions(mesh,child_abs_pos,child,pos1,node1, parent_child_mapper, edgeNodes, edgeNodePositions); + } + else + { + fill_edge_nodes_and_positions(pos0, node0, pos1, node1, edgeNodes, edgeNodePositions); + } +} + +void fill_edge_nodes_and_positions(const stk::mesh::BulkData & mesh, + stk::mesh::Entity node0, stk::mesh::Entity node1, + const ParentsToChildMapper & parent_child_mapper, + std::vector & edgeNodes, + std::vector & edgeNodePositions) +{ + edgeNodes.clear(); + edgeNodePositions.clear(); + fill_edge_nodes_and_positions(mesh, 0.0, node0, 1.0, node1, parent_child_mapper, edgeNodes, edgeNodePositions); +} + +void fill_linear_edge_nodes_and_positions(stk::mesh::Entity node0, stk::mesh::Entity node1, + std::vector & edgeNodes, + std::vector & edgeNodePositions) +{ + edgeNodes.clear(); + edgeNodePositions.clear(); + fill_edge_nodes_and_positions(0.0, node0, 1.0, node1, edgeNodes, edgeNodePositions); +} + + +void ParentsToChildMapper::build_map(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & activePart, + const CDFEM_Support & cdfemSupport, + const Phase_Support & phaseSupport) +{ + const bool addHigherOrderMidsideNodes = stk::is_true_on_any_proc(mesh.parallel(), determine_if_mesh_has_higher_order_midside_nodes_with_level_set_locally(mesh, cdfemSupport, phaseSupport)); + + stk::mesh::Selector elementSelectorForParentChildMapper = activePart & mesh.mesh_meta_data().locally_owned_part(); + + build_map(mesh, cdfemSupport.get_parent_node_ids_field(), elementSelectorForParentChildMapper, addHigherOrderMidsideNodes); +} + +void ParentsToChildMapper::build_map(const stk::mesh::BulkData & mesh, const FieldRef & parent_ids_field, const stk::mesh::Selector & elementSelector, bool add_higher_order_midside_nodes) +{ + my_parents_to_child_map.clear(); + + if (parent_ids_field.valid()) + { + const auto & field_selector = stk::mesh::selectField(parent_ids_field); + + ThrowRequire(!mesh.in_modifiable_state()); + + const auto & buckets = mesh.get_buckets(stk::topology::NODE_RANK, field_selector); + for(auto && b_ptr : buckets) + { + for(unsigned i=0; i < b_ptr->size(); ++i) + { + const stk::mesh::Entity child_node = (*b_ptr)[i]; + const auto parent_ids = get_edge_node_parent_ids(mesh, parent_ids_field, child_node); + my_parents_to_child_map[{parent_ids[0], parent_ids[1]}] = mesh.identifier(child_node); + } + } + } + + if (add_higher_order_midside_nodes) + { + // Add higher order edge "children" + for(auto && b_ptr : mesh.get_buckets(stk::topology::ELEMENT_RANK, elementSelector)) + { + const stk::topology elem_topology = b_ptr->topology(); + if (elem_topology == stk::topology::TRIANGLE_6_2D || elem_topology == stk::topology::TETRAHEDRON_10) + { + for (auto elem : *b_ptr) + { + const stk::mesh::Entity * elem_nodes = mesh.begin_nodes(elem); + for (unsigned edge_i=0; edge_i + +#include +#include +#include + +namespace krino { class FieldRef; } + +namespace krino { + +class CDFEM_Support; +class Phase_Support; + +class ParentsToChildMapper +{ +public: + ParentsToChildMapper() = default; + + void build_map(const stk::mesh::BulkData & mesh, const stk::mesh::Part & activePart, const CDFEM_Support & cdfemSupport, const Phase_Support & phaseSupport); + void build_map(const stk::mesh::BulkData & mesh, const FieldRef & parent_ids_field, const stk::mesh::Selector & elementSelector, bool add_higher_order_midside_nodes); + + bool get_child_id(const stk::mesh::EntityId parent0, + const stk::mesh::EntityId parent1, + stk::mesh::EntityId & child) const + { + const auto it = my_parents_to_child_map.find({parent0, parent1}); + if(it == my_parents_to_child_map.end()) return false; + child = it->second; + return true; + } + + stk::mesh::Entity get_child(const stk::mesh::BulkData & mesh, const stk::mesh::Entity parent0, + const stk::mesh::Entity parent1) const + { + const auto it = + my_parents_to_child_map.find({mesh.identifier(parent0), mesh.identifier(parent1)}); + if(it == my_parents_to_child_map.end()) return stk::mesh::Entity(); + return mesh.get_entity(stk::topology::NODE_RANK, it->second); + } + +private: + typedef OrderedIdPair ParentsToChildKey; + typedef std::map ParentsToChildMap; + ParentsToChildMap my_parents_to_child_map; +}; + +void fill_edge_nodes( + const stk::mesh::BulkData & mesh, + const stk::mesh::Entity node0, + const stk::mesh::Entity node1, + const ParentsToChildMapper & parentToChildMapper, + std::vector & edgeNodes); + +void fill_edge_nodes_and_positions(const stk::mesh::BulkData & mesh, + stk::mesh::Entity node0, stk::mesh::Entity node1, + const ParentsToChildMapper & parent_child_mapper, + std::vector & edgeNodes, + std::vector & edgeNodePositions); + +void fill_linear_edge_nodes_and_positions(stk::mesh::Entity node0, + stk::mesh::Entity node1, + std::vector & edgeNodes, + std::vector & edgeNodePositions); + +} // namespace krino + +#endif /* AKRI_PARENTSTOCHILDMAPPER_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_PhaseTag.cpp b/packages/krino/krino/krino_lib/Akri_PhaseTag.cpp new file mode 100644 index 000000000000..5f029c295be4 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_PhaseTag.cpp @@ -0,0 +1,112 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +namespace krino{ + +std::map LS_SideTag::the_composite_ls_map; + +void LS_SideTag::declare_composite(const LevelSet_Identifier constituent, const LevelSet_Identifier composite) +{ + LS_SideTag constituent_tag(constituent,0); + LS_SideTag composite_tag(composite,0); + + // verbose version of operator[] to avoid needing default constructor for LevelSet_Interface + auto existing_entry = the_composite_ls_map.find(constituent_tag.my_ls_identifier); + if (existing_entry != the_composite_ls_map.end()) + { + existing_entry->second = composite_tag.my_ls_identifier; + } + else + { + the_composite_ls_map.insert(std::make_pair(constituent_tag.my_ls_identifier, composite_tag.my_ls_identifier)); + } + +} + +std::ostream& +operator<<(std::ostream & os, const LS_SideTag & ls_side) +{ + /* %TRACE[NONE]% */ /* %TRACE% */ + os << "(" << ls_side.my_ls_identifier << "," << ls_side.my_ls_sign << ")"; + return os; +} + +std::ostream& +operator<<(std::ostream & os, const PhaseTag & phase) +{ + /* %TRACE[NONE]% */ /* %TRACE% */ + os << " with ls sides: "; + const std::set & ls_sides = phase.ls_sides(); + for (std::set::const_iterator it = ls_sides.begin(); it != ls_sides.end(); ++it) + { + os << *it << " "; + } + return os; +} + +bool PhaseTag::contain(const PhaseTag & phase) const +{ + // This phase is considered to contain "phase" if every phase in "phase" is contained. + // Example: "this": (LS1,-1), (LS2,-1) + // "phase": (LS1,-1) + // Then "this" contains "phase", but "phase" doesn't contain "this" + for (std::set::const_iterator it=phase.my_ls_sides.begin(); it != phase.my_ls_sides.end(); ++it) + { + if (!contain(*it)) return false; + } + return true; +} + +bool +PhaseTag::is_nonconformal() const +{ + for (std::set::const_iterator it=my_ls_sides.begin(); it != my_ls_sides.end(); ++it) + { + const LS_SideTag & ls_side = *it; + + if (ls_side.is_interface()) + { + return true; + } + } + return false; +} + +bool +PhaseTag::operator== (const PhaseTag & rhs) const +{ + if (my_ls_sides.size() != rhs.my_ls_sides.size()) return false; + for (std::set::const_iterator it=my_ls_sides.begin(); it != my_ls_sides.end(); ++it) + { + const LS_SideTag & ls_side = *it; + + if (!rhs.contain(ls_side)) return false; + } + return true; +} + +PhaseTag & +PhaseTag::operator &= ( const PhaseTag & rhs ) +{ + for (std::set::const_iterator it=my_ls_sides.begin(); it != my_ls_sides.end();) + { + if (!rhs.contain(*it)) + { + my_ls_sides.erase(it++); + } + else + { + ++it; + } + } + return *this; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_PhaseTag.hpp b/packages/krino/krino/krino_lib/Akri_PhaseTag.hpp new file mode 100644 index 000000000000..94fa63b58f18 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_PhaseTag.hpp @@ -0,0 +1,171 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_PhaseTag_h +#define Akri_PhaseTag_h + +#include +#include + +#include +#include +#include + +namespace krino { + +class LS_SideTag { +public: + LS_SideTag(const LevelSet_Identifier ls_identifier, const int ls_sign) : my_ls_identifier(ls_identifier), my_ls_sign(ls_sign) {} + LS_SideTag(const LS_SideTag & orig, const int ls_sign) : my_ls_identifier(orig.my_ls_identifier), my_ls_sign(ls_sign) {} + ~LS_SideTag() {} +public: + static void declare_composite(const LevelSet_Identifier constituent, const LevelSet_Identifier composite); + LS_SideTag opposite_side() const {return LS_SideTag(my_ls_identifier,-1*my_ls_sign);} + LS_SideTag composite() const + { + auto it = the_composite_ls_map.find(my_ls_identifier); + if (it != the_composite_ls_map.end()) + { + return LS_SideTag(it->second, my_ls_sign); + } + else + { + return *this; + } + } + bool is_interface() const {return (0 == my_ls_sign);} + int get_ls_sign() const {return my_ls_sign;} + LevelSet_Identifier get_ls_identifier() const {return my_ls_identifier;} + bool operator < ( const LS_SideTag & RHS ) const { return my_ls_identifier < RHS.my_ls_identifier || (my_ls_identifier == RHS.my_ls_identifier && my_ls_sign < RHS.my_ls_sign); } + bool operator == ( const LS_SideTag & RHS ) const { return (my_ls_identifier == RHS.my_ls_identifier && my_ls_sign == RHS.my_ls_sign); } + bool operator != ( const LS_SideTag & RHS ) const { return (my_ls_identifier != RHS.my_ls_identifier || my_ls_sign != RHS.my_ls_sign); } + friend std::ostream& operator<<(std::ostream & os, const LS_SideTag & phase); +protected: + const LevelSet_Identifier my_ls_identifier; + const int my_ls_sign; + static std::map the_composite_ls_map; +}; + +class PhaseTag { +public: + PhaseTag() {} + ~PhaseTag() {} +public: + bool empty() const { return my_ls_sides.empty(); } + void clear() { my_ls_sides.clear(); } + const std::set & ls_sides() const { return my_ls_sides; } + void add(const LevelSet_Identifier ls_identifier, const int ls_sign) { add(LS_SideTag(ls_identifier, ls_sign)); } + void add(const PhaseTag & phase) { for (auto && ls_side : phase.my_ls_sides) add(ls_side); } + void add_opposite_sides(const PhaseTag & phase) { for (auto && ls_side : phase.my_ls_sides) add(ls_side.opposite_side()); } + void add(const LS_SideTag & ls_side) + { + const LS_SideTag ls_side_composite = ls_side.composite(); + my_ls_sides.insert(ls_side_composite); + if (ls_side_composite != ls_side) + { + // Apply priority rule. -1 (inside) beats +1 (outside) + if (my_ls_sides.count(LS_SideTag(ls_side_composite.get_ls_identifier(),-1))) + { + my_ls_sides.erase(LS_SideTag(ls_side_composite.get_ls_identifier(),+1)); + } + } + } + void remove(const LevelSet_Identifier ls_identifier, const int ls_sign){ remove(LS_SideTag(ls_identifier,ls_sign)); } + void remove(const LS_SideTag & ls_side) { my_ls_sides.erase(ls_side.composite()); } + + bool contain(const PhaseTag & phase) const; + bool contain(const LevelSet_Identifier ls_identifier, const int ls_sign) const { return contain(LS_SideTag(ls_identifier,ls_sign)); } + bool contain(const LS_SideTag & ls_side) const { return my_ls_sides.count(ls_side.composite()); } + + bool is_nonconformal() const; + bool operator!= (const PhaseTag & rhs) const { return !operator==(rhs); } + bool operator== (const PhaseTag & rhs) const; + bool operator < ( const PhaseTag & RHS ) const { return (my_ls_sides < RHS.my_ls_sides); } + friend std::ostream& operator<<(std::ostream & os, const PhaseTag & phase); + /** \brief Intersection: this = this INTERSECT ( expression ) */ + PhaseTag & operator &= ( const PhaseTag & rhs); + + void get_data(std::vector & phase_data) const + { + for (std::set::const_iterator side_it = ls_sides().begin(); side_it != ls_sides().end(); ++side_it) + { + phase_data.push_back(side_it->get_ls_identifier().get()); + phase_data.push_back(side_it->get_ls_sign()); + } + } + void set_from_data(const std::vector & phase_data) + { + clear(); + ThrowAssert(phase_data.size() % 2 == 0); + const unsigned num_phases = phase_data.size() / 2; + for (unsigned phase_index=0; phase_index my_ls_sides; +}; + +class NamedPhase +{ +public: + NamedPhase(std::string in_name) : my_name(in_name) {} + NamedPhase(std::string in_name, const PhaseTag & in_tag) : my_name(in_name), my_tag(in_tag) {} + const std::string & name() const { return my_name; } + const PhaseTag & tag() const { return my_tag; } + PhaseTag & tag() { return my_tag; } +protected: + std::string my_name; + PhaseTag my_tag; +}; +typedef std::vector< NamedPhase > PhaseVec; + +class PhasePartTag { +public: + // For non-interface phase parts + PhasePartTag(const unsigned & conformal_part_ordinal, const unsigned & nonconformal_part_ordinal, const unsigned & original_part_ordinal, const PhaseTag & vol_phase) + : my_conformal_part_ordinal(conformal_part_ordinal), + my_nonconformal_part_ordinal(nonconformal_part_ordinal), + my_original_part_ordinal(original_part_ordinal), + my_touching_vol_phase(vol_phase) { ThrowRequire(!vol_phase.empty()); } + // For interface phase parts defined as intersection of touching_vol_phase and opposite_vol_phase + PhasePartTag(const unsigned & conformal_part_ordinal, const unsigned & nonconformal_part_ordinal, const unsigned & original_part_ordinal, const PhaseTag & touching_vol_phase, const PhaseTag & opposite_vol_phase) + : my_conformal_part_ordinal(conformal_part_ordinal), + my_nonconformal_part_ordinal(nonconformal_part_ordinal), + my_original_part_ordinal(original_part_ordinal), + my_touching_vol_phase(touching_vol_phase), + my_opposite_vol_phase(opposite_vol_phase) { ThrowRequire(!touching_vol_phase.empty() && !opposite_vol_phase.empty()); } + ~PhasePartTag() {} +public: + unsigned get_conformal_part_ordinal() const { return my_conformal_part_ordinal; } + unsigned get_nonconformal_part_ordinal() const { return my_nonconformal_part_ordinal; } + unsigned get_original_part_ordinal() const { return my_original_part_ordinal; } + bool is_interface() const { return !my_opposite_vol_phase.empty(); } + const PhaseTag & get_phase() const { ThrowRequire(!is_interface()); return my_touching_vol_phase; } + const PhaseTag & get_touching_phase() const { ThrowRequire(is_interface()); return my_touching_vol_phase; } + const PhaseTag & get_opposite_phase() const { ThrowRequire(is_interface()); return my_opposite_vol_phase; } + bool operator<(PhasePartTag rhs) const + { + // There must be a 1-1 mapping between conformal parts and PhasePartTags + // therefore the conformal part ordinal must be a unique identifier for the PhasePartTag and + // we can sort on just it. + return my_conformal_part_ordinal < rhs.my_conformal_part_ordinal; + } +protected: + unsigned my_conformal_part_ordinal; + unsigned my_nonconformal_part_ordinal; + unsigned my_original_part_ordinal; + PhaseTag my_touching_vol_phase; + PhaseTag my_opposite_vol_phase; +}; +typedef std::set< PhasePartTag > PhasePartSet; + +} // namespace krino + +#endif // Akri_PhaseTag_h diff --git a/packages/krino/krino/krino_lib/Akri_Phase_Support.cpp b/packages/krino/krino/krino_lib/Akri_Phase_Support.cpp new file mode 100644 index 000000000000..e611f2649c5e --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Phase_Support.cpp @@ -0,0 +1,961 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +namespace krino{ + +bool Phase_Support::oneLevelSetPerPhase = false; +std::map Phase_Support::the_mesh_phases; +std::map Phase_Support::the_mesh_block_phases_by_name; + +void Phase_Support::check_phase_parts() const +{ + const LevelSetManager & region_ls = LevelSetManager::get(my_meta); + bool error = false; + for (auto&& phase_part : my_phase_parts) + { + const PhaseTag & part_phase = (phase_part.is_interface()) ? phase_part.get_touching_phase() : phase_part.get_phase(); + const std::set & phase_ls_sides = part_phase.ls_sides(); + for (std::set::const_iterator side_it = phase_ls_sides.begin(); side_it != phase_ls_sides.end(); ++side_it) + { + const std::string phase_ls_name = LevelSet::get_name(side_it->get_ls_identifier()); + if (!region_ls.has_levelSet(phase_ls_name)) + { + error = true; + stk::mesh::Part & conformal_part = my_meta.get_part(phase_part.get_conformal_part_ordinal()); + krinolog << "Error: Phase \"" << conformal_part.name() << "\" uses level set \"" << phase_ls_name << "\" but no such level set exists." << stk::diag::dendl; + } + } + } + ThrowErrorMsgIf(error, "Error: Phases are not defined correctly."); +} + +Phase_Support::Phase_Support(stk::mesh::MetaData & meta) +: my_meta(meta), + my_aux_meta(AuxMetaData::get(meta)), + nonconformalLsMapsAreFilled_(false) {} + +Phase_Support & +Phase_Support::get(stk::mesh::MetaData & meta) +{ + Phase_Support * support = const_cast(meta.get_attribute()); + if (nullptr == support) + { + support = new Phase_Support(meta); + ThrowAssert(nullptr != support); + meta.declare_attribute_with_delete(support); + } + return *support; +} + +Phase_Support & +Phase_Support::get(const stk::mesh::MetaData & meta) +{ + Phase_Support * support = const_cast(meta.get_attribute()); + ThrowRequireMsg(nullptr != support, "No Phase_Support found for MetaData."); + return *support; +} + +bool +Phase_Support::exists_and_has_phases_defined(const stk::mesh::MetaData & meta) +{ + Phase_Support * support = const_cast(meta.get_attribute()); + return support != nullptr && support->phases_defined(); +} + +stk::mesh::Selector Phase_Support::get_all_conformal_surfaces_selector() const +{ + std::vector surfaceParts; + for (auto && part : get_conformal_parts()) + if(is_interface(part)) + surfaceParts.push_back(part); + return selectUnion(surfaceParts); +} + +void +Phase_Support::addPhasePart(stk::mesh::Part & io_part, PhasePartSet & phase_parts, const NamedPhase & ls_phase) +{ + const std::string & phase_name = ls_phase.name(); + std::string phase_part_name = io_part.name(); + if(phase_name != "") // The alive phase for death problems just uses the io part as the conformal part + { + phase_part_name += "_" + phase_name; + } + + stk::mesh::Part & conformal_io_part = my_aux_meta.declare_io_part(phase_part_name, io_part.primary_entity_rank()); + ThrowAssert(phase_name != "" || conformal_io_part.mesh_meta_data_ordinal() == io_part.mesh_meta_data_ordinal()); + std::string topology_name = "INVALID_TOPOLOGY"; + if (stk::topology::INVALID_TOPOLOGY != io_part.topology()) + { + stk::mesh::set_topology(conformal_io_part, io_part.topology()); + topology_name = conformal_io_part.topology().name(); + } + + const std::string nonconf_name = io_part.name() + "_nonconformal"; + if(krinolog.shouldPrint(LOG_PARTS)) + { + krinolog << "Created conformal IO part " << conformal_io_part.name() << " with topology " << topology_name << stk::diag::dendl; + krinolog << " Adding phase part: conformal_part_name=" << conformal_io_part.name() + << ", nonconformal_part_name=" << nonconf_name + << ", original_mesh_part_name=" << io_part.name(); + krinolog << " " << ls_phase.tag(); + krinolog << stk::diag::dendl; + } + + + stk::mesh::Part & nonconf_part = my_aux_meta.get_part(nonconf_name); + phase_parts.insert(PhasePartTag(conformal_io_part.mesh_meta_data_ordinal(), nonconf_part.mesh_meta_data_ordinal(), io_part.mesh_meta_data_ordinal(), ls_phase.tag())); + + all_decomposed_blocks_selector |= conformal_io_part; + part_is_conformal_map[&conformal_io_part] = true; + part_to_nonconformal_part_map[&conformal_io_part] = &nonconf_part; + part_to_phase_map[&conformal_io_part] = ls_phase.tag(); + PhaseTagToPartMap & phase_to_conformal_map = nonconformal_to_phase_conformal_map[&nonconf_part]; + phase_to_conformal_map[ls_phase.tag()] = &conformal_io_part; +} + +void +Phase_Support::create_nonconformal_parts(const PartSet & decomposed_ioparts) +{ + const std::string nonconformal_part_suffix = "_nonconformal"; + for(PartSet::const_iterator it = decomposed_ioparts.begin(); it != decomposed_ioparts.end(); ++it) + { + const stk::mesh::Part & iopart = my_aux_meta.get_part((*it)->name()); + const std::string nonconformal_part_name = iopart.name() + nonconformal_part_suffix; + + if(!my_aux_meta.has_part(nonconformal_part_name)) + { + const bool restartOnlyIOPart = true; + stk::mesh::Part & nonconformal_part = + (iopart.topology() == stk::topology::INVALID_TOPOLOGY) ? + my_aux_meta.declare_io_part(nonconformal_part_name, iopart.primary_entity_rank(), restartOnlyIOPart) : + my_aux_meta.declare_io_part_with_topology(nonconformal_part_name, iopart.topology(), restartOnlyIOPart); + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Created nonconformal part " << nonconformal_part_name << stk::diag::dendl; + + all_decomposed_blocks_selector |= iopart; + all_decomposed_blocks_selector |= nonconformal_part; + part_to_nonconformal_part_map[&iopart] = &nonconformal_part; + part_is_nonconformal_map[&nonconformal_part] = true; + } + } +} + +stk::mesh::PartVector +Phase_Support::get_nonconformal_parts() const +{ + stk::mesh::PartVector result; + for(const auto & entry : part_is_nonconformal_map) + { + if(entry.second) result.push_back(const_cast(entry.first)); + } + return result; +} + +stk::mesh::PartVector +Phase_Support::get_conformal_parts() const +{ + stk::mesh::PartVector result; + for(const auto & entry : part_is_conformal_map) + { + if(entry.second) result.push_back(const_cast(entry.first)); + } + return result; +} + +std::vector +Phase_Support::get_level_set_phases(const PhaseVec & mesh_phases, const LevelSet & levelSet) +{ + // gather up the set of phases that depend on this levelSet + PhaseTag ls_neg_phase; + PhaseTag ls_pos_phase; + ls_neg_phase.add(levelSet.get_identifier(),-1); + ls_pos_phase.add(levelSet.get_identifier(),+1); + std::vector ls_phases; + for(unsigned phase_index=0; phase_index touching_surface_ordinals; + get_input_surfaces_touching_block(input_block_surface_info, block_ptr->mesh_meta_data_ordinal(), touching_surface_ordinals); + for (auto && surf_ordinal : touching_surface_ordinals) + { + stk::mesh::Part & surf_part = mesh_meta.get_part(surf_ordinal); + blocks_and_touching_sides.insert(&surf_part); + + // Add all subset parts to the set of parts + if (!(surf_part.subsets().empty())) + { + for (stk::mesh::PartVector::const_iterator subset = surf_part.subsets().begin(); subset != surf_part.subsets().end(); ++subset) + { + blocks_and_touching_sides.insert(*subset); + } + } + } + } + return blocks_and_touching_sides; +} + +void +Phase_Support::create_phase_parts(const PhaseVec& ls_phases, const PartSet& decomposed_ioparts) +{ + for (auto && ls_phase : ls_phases) + { + for (auto && io_part : decomposed_ioparts) + { + addPhasePart(*io_part, my_phase_parts, ls_phase); + } + } +} + +void +Phase_Support::subset_and_alias_surface_phase_parts(const PhaseVec& ls_phases, + const PartSet& decomposed_ioparts) +{ + std::set touching_block_ordinals; + + for (auto && io_part : decomposed_ioparts) + { + if (!(io_part->subsets().empty())) + { + for (auto && ls_phase_entry : ls_phases) + { + const PhaseTag & ls_phase = ls_phase_entry.tag(); + //FIXME: remove const_cast's + stk::mesh::Part * conformal_iopart = const_cast(find_conformal_io_part(*io_part, ls_phase)); + ThrowRequire(NULL != conformal_iopart); + + stk::mesh::Part * nonconformal_iopart = const_cast(find_nonconformal_part(*io_part)); + ThrowRequire(NULL != nonconformal_iopart); + + for (stk::mesh::PartVector::const_iterator subset = io_part->subsets().begin(); + subset != io_part->subsets().end(); ++subset) + { + stk::mesh::Part * io_part_subset = *subset; + ThrowRequire(NULL != io_part_subset); + + stk::mesh::Part * conformal_iopart_subset = const_cast(find_conformal_io_part(*io_part_subset, ls_phase)); + ThrowRequire(NULL != conformal_iopart_subset); + + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Adding " << conformal_iopart_subset->name() << " as subset of " << conformal_iopart->name() << stk::diag::dendl; + my_meta.declare_part_subset(*conformal_iopart, *conformal_iopart_subset); + + stk::mesh::Part * nonconformal_iopart_subset = const_cast(find_nonconformal_part(*io_part_subset)); + ThrowRequire(NULL != nonconformal_iopart_subset); + + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Adding " << nonconformal_iopart_subset->name() << " as subset of " << nonconformal_iopart->name() << stk::diag::dendl; + my_meta.declare_part_subset(*nonconformal_iopart, *nonconformal_iopart_subset); + + get_input_blocks_touching_surface(my_input_block_surface_connectivity, io_part_subset->mesh_meta_data_ordinal(), touching_block_ordinals); + for (auto && touching_block_ordinal : touching_block_ordinals) + { + const std::string conformal_part_alias = conformal_iopart->name() + "_" + my_meta.get_part(touching_block_ordinal).name(); + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Adding alias " << conformal_part_alias << " for conformal part " << conformal_iopart_subset->name() << stk::diag::dendl; + my_aux_meta.define_part_alias(*conformal_iopart_subset, conformal_part_alias); + } + } + } + } + } +} + +void +Phase_Support::build_decomposed_block_surface_connectivity() +{ + for (auto && part : my_meta.get_mesh_parts()) + { + if (part->primary_entity_rank() != my_meta.side_rank()) continue; + const PhasePartTag * phase_part = find_conformal_phase_part(*part); + if (nullptr == phase_part) continue; + stk::mesh::Part & orig_part = my_meta.get_part(phase_part->get_original_part_ordinal()); + if (orig_part == my_meta.universal_part()) continue; + + if (phase_part->is_interface()) + { + const stk::mesh::Part * conformal_touching_block = find_conformal_io_part(orig_part, phase_part->get_touching_phase()); + ThrowRequire(conformal_touching_block); + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Surface " << part->name() << " touches block " << conformal_touching_block->name() << "\n"; + std::vector touching_blocks = my_meta.get_blocks_touching_surface(part); + if (std::find(touching_blocks.begin(), touching_blocks.end(), conformal_touching_block) == touching_blocks.end()) + { + touching_blocks.push_back(conformal_touching_block); + } + my_meta.set_surface_to_block_mapping(part, touching_blocks); + } + else + { + std::set touching_block_ordinals; + get_input_blocks_touching_surface(my_input_block_surface_connectivity, orig_part.mesh_meta_data_ordinal(), touching_block_ordinals); + + for (auto && touching_block_ordinal : touching_block_ordinals) + { + stk::mesh::Part & touching_block = my_meta.get_part(touching_block_ordinal); + const stk::mesh::Part * conformal_touching_block = find_conformal_io_part(touching_block, phase_part->get_phase()); + ThrowRequire(conformal_touching_block); + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Surface " << part->name() << " touches block " << conformal_touching_block->name() << "\n"; + std::vector touching_blocks = my_meta.get_blocks_touching_surface(part); + if (std::find(touching_blocks.begin(), touching_blocks.end(), conformal_touching_block) == touching_blocks.end()) + { + touching_blocks.push_back(conformal_touching_block); + } + my_meta.set_surface_to_block_mapping(part, touching_blocks); + } + } + } +} + +void +Phase_Support::create_interface_phase_parts( + const PhaseVec& ls_phases, + const PartSet& decomposed_ioparts, + const Interface_Name_Generator& interface_name_gen) +{ + const int num_ls_phases = ls_phases.size(); + if (num_ls_phases > 1) + { + const int num_interfaces = num_ls_phases * (num_ls_phases - 1) / 2; + std::vector > interface_phases; + interface_phases.reserve(num_interfaces); + for (int i = 0; i < num_ls_phases; ++i) + { + for (int j = i+1; j < num_ls_phases; ++j) + { + std::pair phase_pair(i, j); + interface_phases.push_back(phase_pair); + } + } + ThrowRequire((int) interface_phases.size() == num_interfaces); + + for (int i = 0; i < num_interfaces; ++i) + { + const int name_compare = ls_phases[interface_phases[i].first].name().compare(ls_phases[interface_phases[i].second].name()); + ThrowRequire(name_compare != 0); + // form phase intersection + const auto & phase0 = (name_compare < 0) ? ls_phases[interface_phases[i].first] : ls_phases[interface_phases[i].second]; + const auto & phase1 = (name_compare < 0) ? ls_phases[interface_phases[i].second] : ls_phases[interface_phases[i].first]; + std::string superset_interface_phase_name = phase0.name() + "_" + phase1.name(); + const std::string superset_phase_part_name = interface_name_gen.interface_superset_name(superset_interface_phase_name); + + // assumes all sides have same topology + stk::mesh::Part &superset_phase_part = my_aux_meta.declare_io_part(superset_phase_part_name, my_meta.side_rank()); + + if(krinolog.shouldPrint(LOG_PARTS)) krinolog << "Adding interfacial phase part: conformal_part_name=" << superset_phase_part.name() << "\n"; + + for (auto && phase_pair : {std::make_pair(phase0,phase1), std::make_pair(phase1,phase0)}) + { + const auto & touching_phase = phase_pair.first.tag(); + const auto & opposite_phase = phase_pair.second.tag(); + + my_phase_parts.insert(PhasePartTag( + superset_phase_part.mesh_meta_data_ordinal(), my_meta.universal_part().mesh_meta_data_ordinal(), + my_meta.universal_part().mesh_meta_data_ordinal(), touching_phase, + opposite_phase)); + + for (auto * io_part : decomposed_ioparts) + { + ThrowRequire(NULL != io_part); + // only handle blocks for now -> creating interfacial surface "phases" + if (io_part->primary_entity_rank() == stk::topology::ELEMENT_RANK) + { + std::string subset_interface_phase_name = phase_pair.first.name() + "_" + phase_pair.second.name(); + const std::string subset_phase_part_name = interface_name_gen.interface_subset_name(io_part->name(), subset_interface_phase_name); + const bool restartOnlyIOPart = true; // Subset part is only output for restart + stk::mesh::Part &subset_phase_part = my_aux_meta.declare_io_part_with_topology(subset_phase_part_name, io_part->topology().side_topology(), restartOnlyIOPart); + my_meta.declare_part_subset(superset_phase_part, subset_phase_part); + + const stk::mesh::Part * const nonconf_part = find_nonconformal_part(*io_part); + ThrowRequire(NULL != nonconf_part); + + if(krinolog.shouldPrint(LOG_PARTS)) + { + krinolog << " Adding subset interfacial phase part: conformal_part_name=" << subset_phase_part.name() + << ", nonconformal_part_name=" << nonconf_part->name(); + krinolog << ", touching_phase=" << touching_phase + << ", opposite_phase=" << opposite_phase; + krinolog << "\n"; + } + + my_phase_parts.insert(PhasePartTag( + subset_phase_part.mesh_meta_data_ordinal(), nonconf_part->mesh_meta_data_ordinal(), + io_part->mesh_meta_data_ordinal(), touching_phase, + opposite_phase)); + + all_decomposed_blocks_selector |= subset_phase_part; + part_is_conformal_map[&subset_phase_part] = true; + part_to_nonconformal_part_map[&subset_phase_part] = nonconf_part; + auto & phase_to_conformal_map = nonconformal_to_phase_conformal_map[nonconf_part]; + auto & touching_phase_part = phase_to_conformal_map[touching_phase]; + auto & opposite_phase_part = phase_to_conformal_map[opposite_phase]; + auto key = std::make_pair(touching_phase_part, opposite_phase_part); + volume_to_interface_parts_map[key] = &subset_phase_part; + } + } + } + } + } +} + +void +Phase_Support::decompose_blocks( + const stk::mesh::PartVector& blocks_decomposed_by_ls, + const PhaseVec & ls_phases, + const Interface_Name_Generator & interface_name_gen) +{ + if(ls_phases.empty()) return; + + stk::topology topo; + for(auto && decompose_block : blocks_decomposed_by_ls) + { + topo = decompose_block->topology(); + if(topo != stk::topology::TET_4 && topo != stk::topology::TET_10 + && topo != stk::topology::TRI_3_2D && topo != stk::topology::TRI_6_2D) + { + stk::RuntimeDoomedAdHoc() << "Currently only Tetrahedron 4 or 10 (in 3D) and Triangle 3 or 6 (in 2D) element types are supported when using CDFEM.\n"; + return; + } + } + + PartSet decomposed_ioparts = get_blocks_and_touching_surfaces(my_meta, blocks_decomposed_by_ls, my_input_block_surface_connectivity); + + create_nonconformal_parts(decomposed_ioparts); + + create_phase_parts(ls_phases, decomposed_ioparts); + + subset_and_alias_surface_phase_parts(ls_phases, decomposed_ioparts); + + create_interface_phase_parts(ls_phases, decomposed_ioparts, interface_name_gen); +} + +//-------------------------------------------------------------------------------- + +void +Phase_Support::determine_block_phases(const std::set & FEmodel_block_names, const krino::PhaseVec & FEmodel_phases) +{ + if (FEmodel_phases.empty()) return; + + ThrowAssertMsg(my_mesh_block_phases.empty(), "determine_block_phases should only be called once per mesh"); + + for (auto && part : my_meta.get_parts()) + { + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK) + { + auto & block_phases = my_mesh_block_phases[part->mesh_meta_data_ordinal()]; + for(unsigned phase_index=0; phase_indexname() + "_" + phase_name; + std::transform(phase_part_name.begin(), phase_part_name.end(), phase_part_name.begin(), ::tolower); + if (FEmodel_block_names.find(phase_part_name) != FEmodel_block_names.end() ) + { + block_phases.insert(phase_index); + } + } + } + } +} + +//-------------------------------------------------------------------------------- + +void +Phase_Support::determine_block_phases(const PhaseVec & FEmodel_phases, const PartnamePhasenameMap & FEmodel_block_phase_names) +{ + if (FEmodel_phases.empty()) return; + + ThrowAssertMsg(my_mesh_block_phases.empty(), "determine_block_phases should only be called once per mesh"); + + if (FEmodel_block_phase_names.empty()) + { + stk::RuntimeDoomedAdHoc() << "Failure in determine_block_phases. Were the subdomains specified for the decomposed blocks in the finite element model specification?\n"; + return; + } + + std::map phase_name_to_index_map; + for(unsigned phase_index=0; phase_indexsecond); + } + } + } + else + { + stk::RuntimeDoomedAdHoc() << "The block " << map_entry.first << " is listed in the finite element model specification, but is not in the input mesh.\n"; + } + } +} + +//-------------------------------------------------------------------------------- + +std::vector +Phase_Support::get_blocks_decomposed_by_levelset(const std::vector ls_phases) const +{ + std::vector blocks_decomposed_by_ls; + for (auto && map_it : my_mesh_block_phases) + { + stk::mesh::Part & FEmodel_block = my_meta.get_part(map_it.first); + const auto & block_phases = map_it.second; + for(auto ls_phase : ls_phases) + { + if (block_phases.find(ls_phase) != block_phases.end()) + { + blocks_decomposed_by_ls.push_back(&FEmodel_block); + break; + } + } + } + + return blocks_decomposed_by_ls; +} + +//-------------------------------------------------------------------------------- + +void +Phase_Support::setup_phases(const krino::PhaseVec & FEmodel_phases) +{ + for (auto && map_it : my_mesh_block_phases) + { + stk::mesh::Part & FEmodel_block = my_meta.get_part(map_it.first); + const auto & block_phase_ordinals = map_it.second; + + PhaseVec block_phases; + for(auto && block_phase_ordinal : block_phase_ordinals) + { + block_phases.push_back(FEmodel_phases[block_phase_ordinal]); + } + + LS_Name_Generator interface_name_gen; + decompose_blocks({&FEmodel_block}, block_phases, interface_name_gen); + } + + build_decomposed_block_surface_connectivity(); +} + +//-------------------------------------------------------------------------------- + +void +Phase_Support::get_iopart_roots(const stk::mesh::Part & iopart, std::vector & subsets) +{ /* %TRACE% */ /* %TRACE% */ + if ( iopart.subsets().empty() ) + { + subsets.push_back(&iopart); + } + else + { + for (stk::mesh::PartVector::const_iterator subset = iopart.subsets().begin(); subset != iopart.subsets().end() ; ++subset ) + { + ThrowRequire(stk::io::is_part_io_part(**subset)); + get_iopart_roots(**subset, subsets); + } + } +} +//-------------------------------------------------------------------------------- +void +Phase_Support::get_blocks_touching_surface(const std::string & surface_name, std::vector & block_names) +{ /* %TRACE% */ /* %TRACE% */ + + std::set block_ordinal_set; + for (auto&& block_ordinal : block_ordinal_set) + { + block_names.push_back(my_meta.get_part(block_ordinal).name()); + } +} +//-------------------------------------------------------------------------------- +void +Phase_Support::get_input_surfaces_touching_block(const Block_Surface_Connectivity & input_block_surface_connectivity, + const stk::mesh::PartOrdinal block_ordinal, std::set & surface_ordinals) +{ + input_block_surface_connectivity.get_surfaces_touching_block(block_ordinal, surface_ordinals); +} + +//-------------------------------------------------------------------------------- +void +Phase_Support::get_input_blocks_touching_surface(const Block_Surface_Connectivity & input_block_surface_connectivity, + const stk::mesh::PartOrdinal surfaceOrdinal, std::set & blockOrdinals) +{ + input_block_surface_connectivity.get_blocks_touching_surface(surfaceOrdinal, blockOrdinals); +} +//-------------------------------------------------------------------------------- +const stk::mesh::Part * +Phase_Support::find_conformal_io_part(const stk::mesh::Part & io_part, const PhaseTag & phase) const +{ + const stk::mesh::Part * const nonconf_part = find_nonconformal_part(io_part); + auto entry = nonconformal_to_phase_conformal_map.find(nonconf_part); + if(entry == nonconformal_to_phase_conformal_map.end()) return &io_part; + PhaseTagToPartMap & tag_to_conformal_map = (*entry).second; + + const auto find_part = tag_to_conformal_map.find(phase); + if(find_part != tag_to_conformal_map.end()) + { + auto & tag_part_pair = *find_part; + return tag_part_pair.second; + } + + // This search is to handle the case where the phase passed in contains additional LS side tags that the + // conformal part phase tag doesn't care about. For example if the conformal phase is defined as "where LS1 is negative" + // it should match a phase tag that has (0,1) (1,-1) even though the tags are not == + // TODO: If we knew about all the LS's in the problem when decompose_blocks was called we could populate all the necessary entries + // then and wouldn't need this search. + for(auto && tag_part_pair : tag_to_conformal_map) + { + if(phase.contain(tag_part_pair.first)) + { + tag_to_conformal_map[phase] = tag_part_pair.second; + return tag_part_pair.second; + } + } + + return &io_part; +} + +//-------------------------------------------------------------------------------- + +bool +Phase_Support::is_conformal(const stk::mesh::Part * io_part) const +{ + PartToBoolMap::const_iterator entry = part_is_conformal_map.find(io_part); + if (entry != part_is_conformal_map.end()) return (entry->second); + return false; +} + +//-------------------------------------------------------------------------------- + +bool +Phase_Support::is_nonconformal(const stk::mesh::Part * io_part) const +{ + PartToBoolMap::const_iterator entry = part_is_nonconformal_map.find(io_part); + if (entry != part_is_nonconformal_map.end()) return (entry->second); + return false; +} + +//-------------------------------------------------------------------------------- + +bool +Phase_Support::is_interface(const stk::mesh::Part * io_part) const +{ + ThrowAssert(io_part); + auto phase_part = find_conformal_phase_part(*io_part); + return phase_part && phase_part->is_interface(); +} + +//-------------------------------------------------------------------------------- + +const stk::mesh::Part * +Phase_Support::find_nonconformal_part(const stk::mesh::Part & io_part) const +{ + PartToPartMap::const_iterator entry = part_to_nonconformal_part_map.find(&io_part); + if (entry != part_to_nonconformal_part_map.end()) return (entry->second); + return &io_part; +} + +//-------------------------------------------------------------------------------- + +const stk::mesh::Part * +Phase_Support::find_interface_part(const stk::mesh::Part & vol0, const stk::mesh::Part & vol1) const +{ + auto key = std::make_pair(&vol0, &vol1); + auto find_it = volume_to_interface_parts_map.find(key); + if(find_it != volume_to_interface_parts_map.end()) return find_it->second; + + return nullptr; +} + +//-------------------------------------------------------------------------------- + +const PhaseTag & +Phase_Support::get_iopart_phase(const stk::mesh::Part & io_part) const +{ + PartToPhaseTagMap::const_iterator entry = part_to_phase_map.find(&io_part); + if (entry != part_to_phase_map.end()) return (entry->second); + + static const PhaseTag empty_phase; + return empty_phase; +} + +//-------------------------------------------------------------------------------- + +void Phase_Support::register_blocks_for_level_set(LevelSet * levelSet, + const std::vector & blocks_decomposed_by_ls) +{ + nonconformalLsMapsAreFilled_ = false; + + // Loop over block names + for (auto && block_ptr : blocks_decomposed_by_ls) + { + // Add direct relationship between this block and level set + lsUsedByParts_[levelSet].insert(block_ptr); + + // Now get surfaces touching this block + std::set surfaceOrdinals; + get_input_surfaces_touching_block(my_input_block_surface_connectivity, block_ptr->mesh_meta_data_ordinal(), surfaceOrdinals); + for (auto && surfaceOrdinal : surfaceOrdinals) + { + // For each surface, add IO Part/Level Set pairing to maps + stk::mesh::Part & surfaceIOPart = my_meta.get_part(surfaceOrdinal); + lsUsedByParts_[levelSet].insert(&surfaceIOPart); + } + } +} + + +//-------------------------------------------------------------------------------- +bool Phase_Support::level_set_is_used_by_nonconformal_part(const LevelSet * levelSet, + const stk::mesh::Part * const ioPart) const +{ + if (!nonconformalLsMapsAreFilled_) + fill_nonconformal_level_set_maps(); + + IOPartSet & ioPartSet = lsUsedByNonconformalParts_[levelSet]; + bool contains = (ioPartSet.find(ioPart) != ioPartSet.end()); + return contains; +} + +//-------------------------------------------------------------------------------- +void Phase_Support::fill_nonconformal_level_set_maps() const +{ + if (nonconformalLsMapsAreFilled_ == true) return; + nonconformalLsMapsAreFilled_ = true; + + // In this method we duplicate the level-set-to-part maps, but use + // the nonconformal versions of each IOPart instead + + // lsUsedByNonconformalParts_ + lsUsedByNonconformalParts_.clear(); + std::map::const_iterator iterLSMap; + for (iterLSMap = lsUsedByParts_.begin(); iterLSMap != lsUsedByParts_.end(); ++iterLSMap) + { + const LevelSet * levelSet = iterLSMap->first; + const IOPartSet & ioPartSet = iterLSMap->second; + IOPartSet::const_iterator iterPart; + for (iterPart = ioPartSet.begin(); iterPart != ioPartSet.end(); ++iterPart) + { + const stk::mesh::Part * ioPart = *iterPart; + const stk::mesh::Part * nonconformalIOPart = find_nonconformal_part(*ioPart); + lsUsedByNonconformalParts_[levelSet].insert(nonconformalIOPart); + } + } +} + +const PhasePartTag * Phase_Support::find_conformal_phase_part(const stk::mesh::Part & conformal_part) const +{ + const PhasePartTag * result = NULL; + + const unsigned conformal_part_ordinal = conformal_part.mesh_meta_data_ordinal(); + + // Take advantage of the fact that PhasePartTags are uniquely identified by the conformal_part_ordinal + // and therefore the set of phase parts is sorted only based on that to use the binary search + // my_phase_parts.find(). + PhaseTag dummy_tag; + dummy_tag.add(LevelSet_Identifier(0), 1); + PhasePartTag search_tag(conformal_part_ordinal, 0, 0, dummy_tag); + + auto it = my_phase_parts.find(search_tag); + if(it != my_phase_parts.end()) result = &(*it); + + return result; +} + +//-------------------------------------------------------------------------------- +CDFEM_Irreversible_Phase_Support & +CDFEM_Irreversible_Phase_Support::get(stk::mesh::MetaData & meta) +{ + CDFEM_Irreversible_Phase_Support * support = const_cast(meta.get_attribute()); + if (NULL == support) + { + support = new CDFEM_Irreversible_Phase_Support(); + meta.declare_attribute_with_delete(support); + } + return *support; +} +//-------------------------------------------------------------------------- +CDFEM_Inequality_Spec * CDFEM_Irreversible_Phase_Support::add_death_spec(const std::string & death_name, bool is_death) +{ + // CDFEM death needs the decomposition to occur at the end of the time step, irreversible phase change + // needs it to occur at the start of the time step. For now throw if the user tries to do both in the same problem. + if(is_death) + { + has_death = true; + } + else + { + has_irreversible_phase_change = true; + } + ThrowInvalidArgMsgIf(has_death && has_irreversible_phase_change, + "Cannot have both CDFEM death and CDFEM irreversible phase change in the same problem."); + + for (auto&& death_spec : my_death_specs) + { + ThrowInvalidArgMsgIf(death_spec.name() == death_name, + "Only one CDFEM death specification with the same name is allowed per mesh (" << death_name << "). "); + } + my_death_specs.push_back(CDFEM_Inequality_Spec(death_name)); + return &my_death_specs.back(); +} + +//-------------------------------------------------------------------------- + +CDFEM_Inequality_Spec::CDFEM_Inequality_Spec(const std::string & name_) + : my_name(name_), + my_criterion_compare_type(INEQUALITY_CRITERION_TYPE_UNDEFINED), + my_ls(NULL) +{} + +CDFEM_Inequality_Spec::InequalityCriterionType +CDFEM_Inequality_Spec::int_to_inequality_criterion_type(const int inequality_criterion) +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::int_to_death_criterion_compare_type(const int death_criterion_compare)"); /* %TRACE% */ + + switch (inequality_criterion) + { + case int(INEQUALITY_CRITERION_TYPE_UNDEFINED): + return INEQUALITY_CRITERION_TYPE_UNDEFINED ; + case int(LESS_THAN ): + return LESS_THAN ; + case int(GREATER_THAN ): + return GREATER_THAN ; + default: + ThrowRuntimeError("Bad integer passed. Could not convert passed in integer " + << "death_criterion_compare = " << inequality_criterion + << " into a CDFEM_Death_Spec::DeathCriterionCompareType enum. " + << "The code and the Sierra XML database may be out of sync." << std::endl + << StackTrace); + } +} + +void CDFEM_Inequality_Spec::add_element_volume_name (const std::string & a_element_volume_name) +{ + /* %TRACE[NONE]% */ /* %TRACE% */ + + // Note: It is ok to add multiple volume names to vector, thus no return status given + my_element_volume_names.push_back(a_element_volume_name); +} + +bool CDFEM_Inequality_Spec::set_threshold_variable_name (const std::string & a_threshold_variable_name) +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::set_death_variable_name(const std::string & a_death_variable_name)"); /* %TRACE% */ + + // Set return status to false if value has already been set + bool return_status = (0 == my_threshold_variable_name.length()); + + if (return_status) + my_threshold_variable_name = a_threshold_variable_name; + + return return_status; +} + +bool CDFEM_Inequality_Spec::set_threshold_value (const double a_threshold_value) +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::set_threshold_value(const double a_threshold_value)"); /* %TRACE% */ + + // Set return status to false if value has already been set + bool return_status = (std::numeric_limits::max() != a_threshold_value); + + if (return_status) + my_threshold_value = a_threshold_value; + + return return_status; +} + +bool CDFEM_Inequality_Spec::set_criterion_compare_type + (const CDFEM_Inequality_Spec::InequalityCriterionType & a_criterion_compare_type) +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::set_criterion_compare_type(const CDFEM_Death_Spec::DeathCriterionCompareType & a_criterion_compare_type)"); /* %TRACE% */ + + // Set return status to false if value has already been set + bool return_status = (CDFEM_Inequality_Spec::INEQUALITY_CRITERION_TYPE_UNDEFINED == my_criterion_compare_type); + + if (return_status) + my_criterion_compare_type = a_criterion_compare_type; + + return return_status; +} + +void CDFEM_Inequality_Spec::sanity_check(const std::vector mesh_elem_blocks) const +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::sanity_check()"); /* %TRACE% */ + + ThrowErrorMsgIf(CDFEM_Inequality_Spec::INEQUALITY_CRITERION_TYPE_UNDEFINED == my_criterion_compare_type, + "CDFEM Death is not properly setup. Was the death criterion specified?"); + + const std::vector & volume_names = get_element_volume_names(); + + for (auto && block_name : volume_names) + { + ThrowErrorMsgIf( + std::find(mesh_elem_blocks.begin(), mesh_elem_blocks.end(), block_name) == mesh_elem_blocks.end(), + "Could not find an element volume named '" + << block_name << "' that was specified in the " + << "cdfem death command block for the cdfem death named '" + << name() << "'."); + } +} + +void CDFEM_Inequality_Spec::create_levelset(stk::mesh::MetaData & meta, stk::diag::Timer & parent_timer) +{ + /* %TRACE[ON]% */ Trace trace__("krino::CDFEM_Death_Spec::create_levelset()"); /* %TRACE% */ + + ThrowInvalidArgMsgIf( + LevelSetManager::get(meta).has_levelSet(my_name), + "Region already has a LevelSet named " << my_name); + + my_ls = &LevelSet::build(meta, my_name, parent_timer); + my_ls->set_isovar(get_threshold_variable_name(), get_threshold_value()); + + int deactivated_phase_sign = ( get_criterion_compare_type() == CDFEM_Inequality_Spec::LESS_THAN ) ? -1 : 1; + my_deactivated_phase.add(my_ls->get_identifier(), deactivated_phase_sign); + my_active_phase.add(my_ls->get_identifier(), -1 * deactivated_phase_sign); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Phase_Support.hpp b/packages/krino/krino/krino_lib/Akri_Phase_Support.hpp new file mode 100644 index 000000000000..05eb9443e4bf --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Phase_Support.hpp @@ -0,0 +1,212 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Phase_Support_h +#define Akri_Phase_Support_h +// +#include +#include + +#include +#include +#include + +#include + +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace diag { class Timer; } } + +namespace krino { + +class AuxMetaData; +class LevelSet; +struct LS_Field; + +typedef std::set< const stk::mesh::Part * > IOPartSet; +typedef std::set< LevelSet * > LevelSetSet; +typedef std::map> PartPhaseMap; +typedef std::map> PartnamePhasenameMap; + +class Phase_Support { +public: + typedef std::set PartSet; + + static bool exists_and_has_phases_defined(const stk::mesh::MetaData & meta); + static Phase_Support & get(stk::mesh::MetaData & meta); + static Phase_Support & get(const stk::mesh::MetaData & meta); + + void get_blocks_touching_surface(const std::string & surface_name, std::vector & block_names); + static void get_input_surfaces_touching_block(const Block_Surface_Connectivity & input_block_surface_info, + const stk::mesh::PartOrdinal block_ordinal, std::set & surface_ordinals); + void get_input_blocks_touching_surface(const Block_Surface_Connectivity & input_block_surface_info, + const stk::mesh::PartOrdinal surfaceOrdinal, std::set & blockOrdinals); + + void check_phase_parts() const; + + bool phases_defined() const { return !my_phase_parts.empty(); } + + void decompose_blocks(const stk::mesh::PartVector& blocks_decomposed_by_ls, + const PhaseVec & ls_phases, const Interface_Name_Generator & interface_name_gen); + std::vector get_blocks_decomposed_by_levelset(const std::vector ls_phases) const; + void setup_phases(const krino::PhaseVec & FEmodel_phases); + void set_input_block_surface_connectivity(const Block_Surface_Connectivity & input_block_surface_info) { my_input_block_surface_connectivity = input_block_surface_info; } + void build_decomposed_block_surface_connectivity(); + + bool is_nonconformal(const stk::mesh::Part * io_part) const; + bool is_conformal(const stk::mesh::Part * io_part) const; + bool is_interface(const stk::mesh::Part * io_part) const; + const stk::mesh::Part * find_conformal_io_part(const stk::mesh::Part & io_part, const PhaseTag & phase) const; + const stk::mesh::Part * find_nonconformal_part(const stk::mesh::Part & io_part) const; + const stk::mesh::Part * find_interface_part(const stk::mesh::Part & vol0, const stk::mesh::Part & vol1) const; + const PhaseTag & get_iopart_phase(const stk::mesh::Part & io_part) const; + + void add_decomposed_part(const stk::mesh::Part & part) { all_decomposed_blocks_selector |= part; } + const stk::mesh::Selector & get_all_decomposed_blocks_selector() const { return all_decomposed_blocks_selector; } + + stk::mesh::Selector get_interface_part_selector(const LS_Field & ls_field); + void register_blocks_for_level_set(LevelSet * levelSet, + const std::vector & blocks_decomposed_by_ls); + stk::mesh::Selector get_all_conformal_surfaces_selector() const; + + bool level_set_is_used_by_nonconformal_part(const LevelSet * levelSet, const stk::mesh::Part * const ioPart) const; + + static bool has_one_levelset_per_phase() { return oneLevelSetPerPhase; } + static void set_one_levelset_per_phase(const bool val) { oneLevelSetPerPhase = val; } + + stk::mesh::PartVector get_nonconformal_parts() const; + stk::mesh::PartVector get_conformal_parts() const; + + void determine_block_phases(const std::set & FEmodel_block_names, const PhaseVec & FEmodel_phases); + void determine_block_phases(const PhaseVec & FEmodel_phases, const PartnamePhasenameMap & FEmodel_block_phase_names); + static PartSet get_blocks_and_touching_surfaces(const stk::mesh::MetaData & mesh_meta, const stk::mesh::PartVector& input_blocks, const Block_Surface_Connectivity & input_block_surface_info); + + static bool has_phases(const std::string & mesh_name) {std::map::const_iterator pos=the_mesh_phases.find(mesh_name); return (pos != the_mesh_phases.end());} + static PhaseVec & get_phases(const std::string & mesh_name) {return the_mesh_phases[mesh_name];} + static std::vector get_level_set_phases(const PhaseVec & mesh_phases, const LevelSet & levelSet); + static PartnamePhasenameMap & get_block_phases_by_name(const std::string & mesh_name) {return the_mesh_block_phases_by_name[mesh_name];} + +private: + Phase_Support(stk::mesh::MetaData & meta); + + const PhasePartTag * find_conformal_phase_part(const stk::mesh::Part & conformal_part) const; + void create_nonconformal_parts(const PartSet & decomposed_ioparts); + void addPhasePart(stk::mesh::Part & io_part, PhasePartSet & phase_parts, const NamedPhase & ls_phase); + void create_phase_parts(const PhaseVec& ls_phases, const PartSet& decomposed_ioparts); + void subset_and_alias_surface_phase_parts(const PhaseVec& ls_phases, const PartSet& decomposed_ioparts); + void create_interface_phase_parts(const PhaseVec& ls_phases, const PartSet& decomposed_ioparts, const Interface_Name_Generator& interface_name_gen); + void get_iopart_roots(const stk::mesh::Part & iopart, std::vector & subsets); + void fill_nonconformal_level_set_maps() const; + +private: + stk::mesh::MetaData & my_meta; + AuxMetaData & my_aux_meta; + PhasePartSet my_phase_parts; + Block_Surface_Connectivity my_input_block_surface_connectivity; + PartPhaseMap my_mesh_block_phases; + std::map lsUsedByParts_; + mutable bool nonconformalLsMapsAreFilled_; + + mutable std::map lsUsedByNonconformalParts_; + static bool oneLevelSetPerPhase; + static std::map the_mesh_phases; + static std::map the_mesh_block_phases_by_name; + + typedef std::map< const stk::mesh::Part *, bool, stk::mesh::PartLess> PartToBoolMap; + typedef std::map< const stk::mesh::Part *, const stk::mesh::Part *, stk::mesh::PartLess > PartToPartMap; + typedef std::map PhaseTagToPartMap; + typedef std::map PartToPhaseTagToPartMap; + typedef std::map PartToPhaseTagMap; + typedef std::map, + const stk::mesh::Part *> VolumePartsToInterfacePartMap; + mutable PartToPhaseTagToPartMap nonconformal_to_phase_conformal_map; + VolumePartsToInterfacePartMap volume_to_interface_parts_map; + PartToBoolMap part_is_conformal_map; + PartToBoolMap part_is_nonconformal_map; + PartToPartMap part_to_nonconformal_part_map; + PartToPhaseTagMap part_to_phase_map; + + stk::mesh::Selector all_decomposed_blocks_selector; +}; + +class CDFEM_Inequality_Spec { +public: + + CDFEM_Inequality_Spec(const std::string & name_); + ~CDFEM_Inequality_Spec() {} + const std::string & name() const {return my_name;} + + enum InequalityCriterionType + { + INEQUALITY_CRITERION_TYPE_UNDEFINED = 0, + LESS_THAN , + GREATER_THAN + }; + + static InequalityCriterionType int_to_inequality_criterion_type(const int inequality_criterion); + + void add_element_volume_name(const std::string & a_element_volue_name); + bool set_threshold_variable_name(const std::string & a_threshold_variable_name); + bool set_threshold_value(const double a_threshold_value); + bool set_criterion_compare_type(const InequalityCriterionType & a_criterion_compare_type); + + void sanity_check(const std::vector mesh_elem_blocks) const; + const std::vector & get_element_volume_names() const { return my_element_volume_names; } + const std::string & get_threshold_variable_name () const { return my_threshold_variable_name; } + double get_threshold_value () const { return my_threshold_value; } + InequalityCriterionType get_criterion_compare_type() const { return my_criterion_compare_type; } + const PhaseTag & get_deactivated_phase() const { return my_deactivated_phase; } + const PhaseTag & get_active_phase() const { return my_active_phase; } + void create_levelset(stk::mesh::MetaData & meta, stk::diag::Timer & parent_timer); + const LevelSet & get_levelset() const { ThrowRequire(my_ls != NULL); return *my_ls; } + LevelSet & get_levelset() { ThrowRequire(my_ls != NULL); return *my_ls; } + + // for unit testing + void set_phases(const PhaseTag & active_phase, const PhaseTag & inactive_phase) + { + my_active_phase = active_phase; + my_deactivated_phase = inactive_phase; + } +protected: + std::string my_name; + std::vector my_element_volume_names; + std::string my_threshold_variable_name; + double my_threshold_value; + InequalityCriterionType my_criterion_compare_type; + LevelSet * my_ls; + PhaseTag my_deactivated_phase; + PhaseTag my_active_phase; +}; +typedef std::vector< CDFEM_Inequality_Spec > CDFEM_Inequality_Spec_Vec; + +class CDFEM_Irreversible_Phase_Support { +public: + ~CDFEM_Irreversible_Phase_Support() {} + + static CDFEM_Irreversible_Phase_Support & get(stk::mesh::MetaData & meta); + + CDFEM_Inequality_Spec * add_death_spec(const std::string & death_name, bool is_death); + + bool is_active() const {return has_death || has_irreversible_phase_change;} + + const CDFEM_Inequality_Spec_Vec & get_death_specs() const {return my_death_specs;} + + // For irreversible phase changes we decompose at the start of the time step, for death at the end. + bool decompose_at_start_of_time_step() { ThrowAssert(has_irreversible_phase_change == !has_death); return has_irreversible_phase_change; } + +private: + CDFEM_Irreversible_Phase_Support() : has_death(false), has_irreversible_phase_change(false) {} +private: + bool has_death; + bool has_irreversible_phase_change; + CDFEM_Inequality_Spec_Vec my_death_specs; +}; + +} // namespace krino + +#endif // Akri_Phase_Support_h diff --git a/packages/krino/krino/krino_lib/Akri_Plane.hpp b/packages/krino/krino/krino_lib/Akri_Plane.hpp new file mode 100644 index 000000000000..b2c7773a50f6 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Plane.hpp @@ -0,0 +1,20 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Plane3d_h +#define Akri_Plane3d_h + +#include + +namespace krino { + +typedef stk::math::Plane3 Plane3d; + +} // namespace krino + +#endif // Akri_Plane3d_h diff --git a/packages/krino/krino/krino_lib/Akri_Plane_Intersections.cpp b/packages/krino/krino/krino_lib/Akri_Plane_Intersections.cpp new file mode 100644 index 000000000000..ce4e72be2807 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Plane_Intersections.cpp @@ -0,0 +1,144 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +namespace krino +{ + +bool +find_intersection_of_three_planes(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2, Vector3d & point) +{ + const Vector3d & normal0 = plane0.normal(); + const Vector3d & normal1 = plane1.normal(); + const Vector3d & normal2 = plane2.normal(); + + const double a00 = normal0[0]; + const double a01 = normal0[1]; + const double a02 = normal0[2]; + const double a10 = normal1[0]; + const double a11 = normal1[1]; + const double a12 = normal1[2]; + const double a20 = normal2[0]; + const double a21 = normal2[1]; + const double a22 = normal2[2]; + const double b0 = plane0.constant(); + const double b1 = plane1.constant(); + const double b2 = plane2.constant(); + const double det = a00*(a22*a11-a21*a12)-a10*(a22*a01-a21*a02)+a20*(a12*a01-a11*a02); + + if (det == 0) + return false; + + const double x =( b0*(a22*a11-a21*a12)-b1*(a22*a01-a21*a02)+b2*(a12*a01-a11*a02))/det; + const double y =(-b0*(a22*a10-a20*a12)+b1*(a22*a00-a20*a02)-b2*(a12*a00-a10*a02))/det; + const double z =( b0*(a21*a10-a20*a11)-b1*(a21*a00-a20*a01)+b2*(a11*a00-a10*a01))/det; + + point = Vector3d{x,y,z}; + return true; +} + +Vector3d +triangle_parametric_coordinates_of_projected_point(const std::array & triCoords, const Vector3d & pt) +{ + const Vector3d v1 = triCoords[1] - triCoords[0]; + const Vector3d v2 = triCoords[2] - triCoords[0]; + const Vector3d normal = Cross(v1,v2); + const double invNormalMag2 = 1./normal.length_squared(); + const Vector3d diff = pt - triCoords[0]; + Vector3d paramPt; + paramPt[0] = Dot(Cross(diff,v2),normal) * invNormalMag2; + paramPt[1] = Dot(Cross(v1,diff),normal) * invNormalMag2; + paramPt[2] = 0.; + return paramPt; +} + +static bool within_tet_bounds(const Vector3d & pt) +{ + const double tol = 1.e-13; + return (pt[0] > -tol) && + (pt[1] > -tol) && + (pt[2] > -tol) && + ((1.-pt[0]-pt[1]-pt[2]) > -tol); +} + +bool find_intersection_of_three_planes_within_tet(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2, Vector3d & intersectionPoint) +{ + return find_intersection_of_three_planes(plane0, plane1, plane2, intersectionPoint) && within_tet_bounds(intersectionPoint); +} + +static bool +find_intersection_of_two_planes_and_coordinate_plane(const int coordinatePlane, const Plane3d & plane0, const Plane3d & plane1, Vector3d & point) +{ + const Vector3d & normal0 = plane0.normal(); + const Vector3d & normal1 = plane1.normal(); + + const std::array,3> activeCoordsByPlane = {{ {{1,2}}, {{0,2}}, {{0,1}} }}; + const int i0 = activeCoordsByPlane[coordinatePlane][0]; + const int i1 = activeCoordsByPlane[coordinatePlane][1]; + + const double a00 = normal0[i0]; + const double a01 = normal0[i1]; + const double a10 = normal1[i0]; + const double a11 = normal1[i1]; + const double b0 = plane0.constant(); + const double b1 = plane1.constant(); + const double det = a00*a11-a10*a01; + + if (det == 0) + return false; + + point[i0] = (b0*a11-b1*a01)/det; + point[i1] = (b1*a00-b0*a10)/det; + point[coordinatePlane] = 0.; + + return true; +} + +bool find_intersection_of_two_planes_and_side_of_tet(const int side, const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint) +{ + bool intersectsPlaneThatCoincidesWithSideOfTet = false; + if (side == 1) + { + const Plane3d side1Plane{Vector3d{1.,0.,0.},Vector3d{0.,0.,1.},Vector3d{0.,1.,0.}}; + intersectsPlaneThatCoincidesWithSideOfTet = find_intersection_of_three_planes(plane0, plane1, side1Plane, intersectionPoint); + } + else + { + const int coordinatePlane = (side == 0) ? 1 : ((side == 2) ? 0 : 2); + intersectsPlaneThatCoincidesWithSideOfTet = find_intersection_of_two_planes_and_coordinate_plane(coordinatePlane, plane0, plane1, intersectionPoint); + } + + return intersectsPlaneThatCoincidesWithSideOfTet && within_tet_bounds(intersectionPoint); + +} + +bool find_intersection_of_two_2D_planes(const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint) +{ + return find_intersection_of_two_planes_and_coordinate_plane(2, plane0, plane1, intersectionPoint); +} + +bool within_tri_bounds(const Vector3d & triangleParamCoords) +{ + const double tol = 1.e-13; + return (triangleParamCoords[0] > -tol) && + (triangleParamCoords[1] > -tol) && + ((1.-triangleParamCoords[0]-triangleParamCoords[1]) > -tol); +} + +bool find_intersection_of_two_2D_planes_within_tri(const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint) +{ + return find_intersection_of_two_planes_and_coordinate_plane(2, plane0, plane1, intersectionPoint) && within_tri_bounds(intersectionPoint); +} + +} // namespace krino + + + diff --git a/packages/krino/krino/krino_lib/Akri_Plane_Intersections.hpp b/packages/krino/krino/krino_lib/Akri_Plane_Intersections.hpp new file mode 100644 index 000000000000..b7a20f805b00 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Plane_Intersections.hpp @@ -0,0 +1,31 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_PLANE_INTERSECTIONS_H_ +#define KRINO_INCLUDE_AKRI_PLANE_INTERSECTIONS_H_ +#include +#include + +namespace krino { + +bool find_intersection_of_three_planes(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2, Vector3d & point); + +bool find_intersection_of_three_planes_within_tet(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2, Vector3d & point); + +bool find_intersection_of_two_planes_and_side_of_tet(const int side, const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint); + +bool find_intersection_of_two_2D_planes(const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint); + +bool find_intersection_of_two_2D_planes_within_tri(const Plane3d & plane0, const Plane3d & plane1, Vector3d & intersectionPoint); + +Vector3d triangle_parametric_coordinates_of_projected_point(const std::array & triCoords, const Vector3d & pt); + +bool within_tri_bounds(const Vector3d & triangleParamCoords); +} + +#endif /* KRINO_INCLUDE_AKRI_PLANE_INTERSECTIONS_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_ProlongationData.cpp b/packages/krino/krino/krino_lib/Akri_ProlongationData.cpp new file mode 100644 index 000000000000..84a59e23926a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ProlongationData.cpp @@ -0,0 +1,659 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +namespace krino{ + +ProlongationElementData::ProlongationElementData(const stk::mesh::BulkData& stk_mesh, const std::vector & children_data, const std::vector< std::vector > & children_intg_wts) +{ + ThrowAssert(!children_data.empty() && children_data.size() == children_intg_wts.size()); + + const unsigned num_intg_pts = children_intg_wts[0].size(); + + // homogenize fields + const stk::mesh::FieldVector & all_fields = stk_mesh.mesh_meta_data().get_fields(); + my_field_indices.resize(all_fields.size(), -1); + for ( stk::mesh::FieldVector::const_iterator it = all_fields.begin(); it != all_fields.end() ; ++it ) + { + const FieldRef field = **it; + + if( field.entity_rank()!=stk::topology::ELEMENT_RANK || !field.type_is() ) continue; + + bool any_child_has_field = false; + for (auto && child_data : children_data) + { + if (NULL != child_data->get_field_data(field)) + { + any_child_has_field = true; + break; + } + } + + if (any_child_has_field) + { + const unsigned field_length = field.length(); + const unsigned field_data_index = my_field_data.size(); + my_field_indices[field.field().mesh_meta_data_ordinal()] = field_data_index; + my_field_data.resize(field_data_index+field_length, 0.0); + + // TODO: Add a method to distinguish between vector fields and gauss point fields. + const bool data_is_gauss_pt_field = (num_intg_pts == field_length); + + if (data_is_gauss_pt_field) + { + double tot_child_sum = 0.; + double tot_child_vol = 0.; + + for (unsigned n = 0; n < children_data.size(); ++n) + { + const double * subelem_field_data = children_data[n]->get_field_data(field); + if(NULL == subelem_field_data) + { + continue; + } + + const std::vector & child_intg_wts = children_intg_wts[n]; + ThrowAssertMsg(child_intg_wts.size() == num_intg_pts, "Children have different integration rules."); + + for (unsigned j=0; jget_field_data(field); + if(NULL == subelem_field_data) + { + continue; + } + + const std::vector & child_intg_wts = children_intg_wts[n]; + // We could relax this assertion if we had another way to distinguish gauss point fields from vector fields + ThrowAssertMsg(child_intg_wts.size() == num_intg_pts, "Children have different integration rules."); + + double child_vol = 0.; + for (unsigned j=0; j() ) continue; + + double * val = field_data(field, entity); + const bool has_field = (NULL != val); + + if (has_field) + { + const unsigned field_length = field.length(); + my_field_indices[field.field().mesh_meta_data_ordinal()] = my_field_data.size(); + for (unsigned i=0; i() ) continue; + const unsigned field_length = field.length(); + + double * val = field_data(field, entity); + const double * prolong_field = get_field_data(field); + + if (nullptr == val) continue; + if(nullptr == prolong_field) + { + std::stringstream err_msg; + err_msg << "Missing prolongation field data when restoring fields on entity:\n"; + err_msg << stk_mesh.identifier(entity) << " of rank " << stk_mesh.entity_rank(entity); + err_msg << " with parts:\n "; + for(auto && part : stk_mesh.bucket(entity).supersets()) + { + err_msg << part->name() << ", "; + } + err_msg << "\n"; + err_msg << "Missing field data for field " << field.name() << "\n"; + throw std::runtime_error(err_msg.str()); + } + + for (unsigned i=0; i +ProlongationNodeData::get_fields_on_node(const stk::mesh::BulkData& mesh, stk::mesh::Entity entity) +{ + const stk::mesh::FieldVector & all_fields = mesh.mesh_meta_data().get_fields(); + std::vector entity_fields; + entity_fields.reserve(all_fields.size()); + for ( auto && fieldPtr : all_fields ) + { + const FieldRef field = *fieldPtr; + if (field.field().entity_rank() == stk::topology::NODE_RANK && nullptr != field_data(field, entity)) + entity_fields.push_back(field.field().mesh_meta_data_ordinal()); + } + + std::sort(entity_fields.begin(), entity_fields.end()); + return entity_fields; +} + +Vector3d +ProlongationNodeData::get_node_coordinates(const CDMesh & mesh, stk::mesh::Entity node) +{ + const double * coordsPtr = field_data(mesh.get_coords_field(), node); + ThrowAssert(coordsPtr); + Vector3d coords(coordsPtr, mesh.spatial_dim()); + FieldRef cdfemSnapDispField = mesh.get_cdfem_support().get_cdfem_snap_displacements_field(); + if (cdfemSnapDispField.valid()) + { + FieldRef oldCdfemSnapDispField = cdfemSnapDispField.field_state(stk::mesh::StateOld); + double * cdfemSnapDispPtr = field_data(cdfemSnapDispField, node); + double * oldCdfemSnapDispPtr = field_data(oldCdfemSnapDispField, node); + if (nullptr != cdfemSnapDispPtr) + coords += Vector3d(oldCdfemSnapDispPtr, mesh.spatial_dim()) - Vector3d(cdfemSnapDispPtr, mesh.spatial_dim()); + } + return coords; +} + +std::vector +ProlongationNodeData::get_node_io_parts(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity entity) +{ + // This list of parts is used to determine if a node needs to be ALE prolonged + stk::mesh::PartVector node_parts = filter_non_io_parts(stk_mesh.bucket(entity).supersets()); + std::vector node_part_ids; + node_part_ids.reserve(node_parts.size()); + for (auto * node_part : node_parts) + node_part_ids.push_back(node_part->mesh_meta_data_ordinal()); + std::sort(node_part_ids.begin(), node_part_ids.end()); + return node_part_ids; +} + +ProlongationNodeData::ProlongationNodeData(const CDMesh & mesh, stk::mesh::Entity node, bool communicate_me_to_all_sharers) + : ProlongationPointData(get_node_coordinates(mesh, node)), + my_entityId(mesh.stk_bulk().identifier(node)), + myCommunicateMeToAllSharersFlag(communicate_me_to_all_sharers) +{ + const stk::mesh::BulkData& stk_mesh = mesh.stk_bulk(); + + my_fields = get_fields_on_node(stk_mesh, node); + my_ioparts = get_node_io_parts(stk_mesh, node); + + save_fields(stk_mesh, node); +} + +ProlongationPointData::ProlongationPointData(const CDMesh & mesh, const FacetDistanceQuery & facet_dist_query, + const std::vector & facet_nodes) + : my_coordinates(facet_dist_query.closest_point()) +{ + const Vector3d node_wts = facet_dist_query.closest_point_weights(); + + // interpolate fields + const stk::mesh::FieldVector & all_fields = mesh.stk_meta().get_fields(); + my_field_indices.resize(all_fields.size(), -1); + for ( stk::mesh::FieldVector::const_iterator it = all_fields.begin(); it != all_fields.end() ; ++it ) + { + const FieldRef field = **it; + + if( field.entity_rank()!=stk::topology::NODE_RANK || !field.type_is() ) continue; + + const unsigned field_length = field.length(); + + bool any_node_has_field = false; + for (auto && facet_node : facet_nodes) + { + if (NULL != facet_node->get_field_data(field)) + { + any_node_has_field = true; + break; + } + } + + if (any_node_has_field) + { + const unsigned field_data_index = my_field_data.size(); + my_field_indices[field.field().mesh_meta_data_ordinal()] = field_data_index; + my_field_data.resize(field_data_index+field_length, 0.0); + + double node_wt_sum = 0.0; + for (unsigned n = 0; n < facet_nodes.size(); ++n) + { + const double * node_field_data = facet_nodes[n]->get_field_data(field); + + if(node_field_data) + { + node_wt_sum += node_wts[n]; + for (unsigned i=0; i nodeSharedProcs; + stk::pack_and_communicate(commSparse,[&]() + { + for (auto entry : proc_prolong_nodes) + { + const ProlongationNodeData & prolongNode = *entry.second; + if (prolongNode.communicate_me_to_all_sharers()) + { + stk::mesh::Entity node = mesh.get_entity(stk::topology::NODE_RANK, prolongNode.entityId()); + mesh.comm_shared_procs(node, nodeSharedProcs); + for (int procId : nodeSharedProcs) + prolongNode.pack_into_buffer(commSparse.send_buffer(procId)); + } + } + }); +} + +static +void pack_facet_prolong_nodes(const stk::mesh::BulkData & mesh, const ProlongFacetVec & proc_prolong_facets, const std::vector & proc_target_bboxes, stk::CommSparse &commSparse) +{ + stk::pack_and_communicate(commSparse,[&]() + { + for ( int procId=0; procIdpack_into_buffer(buffer); + } + }); +} + +static +void receive_and_build_prolong_nodes(const CDMesh & mesh, EntityProlongationNodeMap & proc_prolong_nodes, stk::CommSparse &commSparse) +{ + stk::unpack_communications(commSparse, [&](int procId) + { + stk::CommBuffer & buffer = commSparse.recv_buffer(procId); + + while ( buffer.remaining() ) + { + ProlongationNodeData * node = ProlongationNodeData::unpack_from_buffer( buffer, mesh.stk_meta() ); // This calls new to create a new ProlongationNodeData + EntityProlongationNodeMap::iterator it = proc_prolong_nodes.find(node->entityId()); + if( it == proc_prolong_nodes.end() || it->second == nullptr ) + { + proc_prolong_nodes[node->entityId()] = node; + } + else + { + delete node; + } + } + }); +} + +void ProlongationFacet::communicate_shared_nodes( const CDMesh & mesh, EntityProlongationNodeMap & proc_prolong_nodes ) +{ + stk::CommSparse commSparse(mesh.stk_bulk().parallel()); + pack_nodes_that_need_to_be_communicated_to_sharers(mesh.stk_bulk(), proc_prolong_nodes, commSparse); + receive_and_build_prolong_nodes(mesh, proc_prolong_nodes, commSparse); +} + + +void +ProlongationFacet::communicate_facet_nodes( const CDMesh & mesh, const ProlongFacetVec & proc_prolong_facets, EntityProlongationNodeMap & proc_prolong_nodes, const std::vector & proc_target_bboxes ) +{ /* %TRACE[ON]% */ Trace trace__("krino:ProlongationFacet::communicate_facet_nodes()"); /* %TRACE% */ + const int num_procs = mesh.stk_bulk().parallel_size(); + if ( num_procs == 1 ) return; // Don't talk to yourself, it's embarrassing + + stk::CommSparse commSparse(mesh.stk_bulk().parallel()); + pack_facet_prolong_nodes(mesh.stk_bulk(), proc_prolong_facets, proc_target_bboxes, commSparse); + receive_and_build_prolong_nodes(mesh, proc_prolong_nodes, commSparse); +} + +void +ProlongationNodeData::pack_into_buffer(stk::CommBuffer & b) const +{ + b.pack(my_entityId); + + b.pack(my_coordinates.data(),3); + + const size_t num_fields = my_fields.size(); + b.pack(num_fields); + b.pack(my_fields.data(), my_fields.size()); + + const size_t num_parts = my_ioparts.size(); + b.pack(num_parts); + b.pack(my_ioparts.data(), my_ioparts.size()); + + b.pack(my_field_indices.data(),my_field_indices.size()); + + const size_t num_field_data = my_field_data.size(); + b.pack(num_field_data); + b.pack(my_field_data.data(),my_field_data.size()); +} + +ProlongationNodeData * +ProlongationNodeData::unpack_from_buffer( stk::CommBuffer & b, const stk::mesh::MetaData & stk_meta ) +{ + stk::mesh::EntityId global_id; + b.unpack(global_id); + + Vector3d coords; + b.unpack(coords.data(),3); + + size_t num_fields = 0; + b.unpack(num_fields); + std::vector node_fields(num_fields); + b.unpack(node_fields.data(), num_fields); + + size_t num_parts = 0; + b.unpack(num_parts); + std::vector node_ioparts(num_parts); + b.unpack(node_ioparts.data(), num_parts); + + ProlongationNodeData * node = new ProlongationNodeData(global_id, coords, node_fields, node_ioparts); + + const size_t len_field_indices = stk_meta.get_fields().size(); + std::vector & field_indices = node->get_field_indices(); + field_indices.resize(len_field_indices); + b.unpack(field_indices.data(), len_field_indices); + + size_t num_field_data = 0; + b.unpack(num_field_data); + std::vector & field_data = node->get_field_data(); + field_data.resize(num_field_data); + b.unpack(field_data.data(), num_field_data); + + return node; +} + +std::string +ProlongationData::missing_prolongation_fields_for_entity( const CDMesh & mesh, const stk::mesh::Entity dst ) const +{ + std::string missing_fields; + const FieldSet & ale_prolongation_fields = mesh.get_ale_prolongation_fields(); + for ( auto&& field : ale_prolongation_fields ) + { + if( !field.type_is() || field.entity_rank() != mesh.stk_bulk().entity_rank(dst) ) continue; + + double * val = field_data(field, dst); + if (NULL != val && NULL == get_field_data(field)) + { + missing_fields = missing_fields + " " + field.name(); + } + } + + return missing_fields; +} + +void ProlongationFacet::compute_common_fields() +{ + my_common_fields.clear(); + for (unsigned side_node_index=0; side_node_index & node_fields = my_prolong_nodes[side_node_index]->get_fields(); + if (0 == side_node_index) + { + my_common_fields = node_fields; + } + else + { + std::vector working_set; + working_set.swap(my_common_fields); + std::set_intersection(working_set.begin(),working_set.end(),node_fields.begin(),node_fields.end(),std::back_inserter(my_common_fields)); + } + } +} + +ProlongationFacet::ProlongationFacet(const CDMesh & mesh, stk::mesh::Entity side) +: my_mesh(mesh) +{ + const stk::mesh::BulkData & stk_mesh = my_mesh.stk_bulk(); + + ThrowAssert(stk_mesh.num_elements(side) > 0); + stk::mesh::Entity elem0 = stk_mesh.begin_elements(side)[0]; + const PhaseTag elem0_phase = mesh.determine_entity_phase(elem0); + + const unsigned num_side_nodes = stk_mesh.bucket(side).topology().base().num_nodes(); + const stk::mesh::Entity* side_nodes = stk_mesh.begin_nodes(side); + my_prolong_nodes.resize(num_side_nodes); + + for (unsigned side_node_index=0; side_node_index( my_prolong_nodes[0]->get_coordinates(), my_prolong_nodes[1]->get_coordinates()); + } + else + { + ThrowAssert(3 == my_prolong_nodes.size()); + my_facet = std::make_unique( my_prolong_nodes[0]->get_coordinates(), my_prolong_nodes[1]->get_coordinates(), my_prolong_nodes[2]->get_coordinates()); + } +} + +ProlongationFacet::ProlongationFacet(const CDMesh & mesh, const std::vector & prolong_nodes, const std::vector & common_fields) +: my_mesh (mesh), + my_prolong_nodes(prolong_nodes), + my_common_fields(common_fields) +{ + ThrowAssert((int)my_prolong_nodes.size() == my_mesh.spatial_dim()); + if (2 == my_prolong_nodes.size()) + { + my_facet = std::make_unique( my_prolong_nodes[0]->get_coordinates(), my_prolong_nodes[1]->get_coordinates()); + } + else + { + ThrowAssert(3 == my_prolong_nodes.size()); + my_facet = std::make_unique( my_prolong_nodes[0]->get_coordinates(), my_prolong_nodes[1]->get_coordinates(), my_prolong_nodes[2]->get_coordinates()); + } +} + +void ProlongationFacet::update_prolongation_point_data(const FacetDistanceQuery & dist_query) const +{ + ThrowAssert(&dist_query.facet() == my_facet.get()); + my_prolongation_point_data = std::make_unique(my_mesh, dist_query, my_prolong_nodes); +} + +bool ProlongationFacet::communicate_me(const BoundingBox & proc_target_bbox) const +{ + for(auto && prolong_node : my_prolong_nodes) + { + if (!proc_target_bbox.contains(prolong_node->get_coordinates())) + { + return false; + } + } + return true; +} + +std::set +ProlongationFacet::get_facet_nodes_to_communicate( const ProlongFacetVec & proc_prolong_facets, const BoundingBox & proc_target_bbox ) +{ + std::set procFacetNodes; + + for ( auto && facet : proc_prolong_facets ) + if (facet->communicate_me(proc_target_bbox)) + for (auto node : facet->my_prolong_nodes) + procFacetNodes.insert(node); + + return procFacetNodes; +} + +void +ProlongationFacet::communicate( const CDMesh & mesh, ProlongFacetVec & proc_prolong_facets, EntityProlongationNodeMap & proc_prolong_nodes, const std::vector & proc_target_bboxes ) +{ /* %TRACE[ON]% */ Trace trace__("krino:ProlongationFacet::communicate()"); /* %TRACE% */ + communicate_shared_nodes(mesh, proc_prolong_nodes); + communicate_facet_nodes(mesh, proc_prolong_facets, proc_prolong_nodes, proc_target_bboxes); + communicate_facets(mesh, proc_prolong_facets, proc_target_bboxes); +} + +static +void pack_facets_within_proc_bboxes(const stk::mesh::BulkData & mesh, const ProlongFacetVec & proc_prolong_facets, const std::vector & proc_target_bboxes, stk::CommSparse &commSparse) +{ + stk::pack_and_communicate(commSparse,[&]() + { + for ( int procId=0; procId & proc_target_bboxes ) +{ + stk::CommSparse commSparse(mesh.stk_bulk().parallel()); + pack_facets_within_proc_bboxes(mesh.stk_bulk(), proc_prolong_facets, proc_target_bboxes, commSparse); + receive_and_build_prolong_facets(mesh, proc_prolong_facets, commSparse); +} + +void +ProlongationFacet::pack_into_buffer(stk::CommBuffer & b) const +{ + const size_t num_prolong_nodes = my_prolong_nodes.size(); + b.pack(num_prolong_nodes); + for(auto && prolong_node : my_prolong_nodes) + { + b.pack(prolong_node->entityId()); + } + + b.pack(my_common_fields.size()); + for (unsigned field : my_common_fields) + b.pack(field); +} + +ProlongationFacet * +ProlongationFacet::unpack_from_buffer(const CDMesh & mesh, stk::CommBuffer & b ) +{ + size_t num_prolong_nodes = 0; + b.unpack(num_prolong_nodes); + std::vector prolong_nodes(num_prolong_nodes); + + for(auto && prolong_node : prolong_nodes) + { + stk::mesh::EntityId node_id; + b.unpack(node_id); + prolong_node = mesh.fetch_prolong_node(node_id); + ThrowRequireMsg(prolong_node, "Communication error, missing prolongation node " << node_id << " on processor " << mesh.stk_bulk().parallel_rank()); + } + + size_t num_common_fields = 0; + b.unpack(num_common_fields); + + std::vector common_fields(num_common_fields); + for (size_t ifield=0; ifield +#include +#include + +#include +#include +#include +#include + +namespace krino { + +class ProlongationData { +public: + ProlongationData() {} + ~ProlongationData() {} + + const double * get_field_data( const stk::mesh::FieldBase& state_field ) const { const int field_index = my_field_indices[state_field.mesh_meta_data_ordinal()]; return (field_index < 0) ? nullptr : &my_field_data[field_index]; } + std::string missing_prolongation_fields_for_entity( const CDMesh & mesh, const stk::mesh::Entity dst ) const; + void restore_fields(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity entity) const; + +protected: + void save_fields(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity entity); + const std::vector & get_field_data() const { return my_field_data; } + std::vector & get_field_data() { return my_field_data; } + const std::vector & get_field_indices() const { return my_field_indices; } + std::vector & get_field_indices() { return my_field_indices; } + +protected: + mutable std::vector my_field_indices; + mutable std::vector my_field_data; +}; + +class ProlongationPointData : public ProlongationData { +public: + ProlongationPointData(const Vector3d & coordinates) : my_coordinates(coordinates) {} + ProlongationPointData(const CDMesh & mesh, const FacetDistanceQuery & facet_dist_query, const std::vector & facet_nodes); + ~ProlongationPointData() {} + + const Vector3d & get_coordinates() const { return my_coordinates; } + Vector3d & get_coordinates() { return my_coordinates; } + +protected: + Vector3d my_coordinates; +}; + +class ProlongationElementData : public ProlongationData { +public: + ProlongationElementData(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity element) : ProlongationData() { save_fields(stk_mesh, element); } + ProlongationElementData(const stk::mesh::BulkData& stk_mesh, const std::vector & children_data, const std::vector< std::vector > & children_intg_wts); + ~ProlongationElementData() {} + +private: + //: copy constructor not allowed + ProlongationElementData(const ProlongationElementData & copy); +}; + +class ProlongationNodeData : public ProlongationPointData { +public: + ProlongationNodeData(const CDMesh & mesh, stk::mesh::Entity node, bool communicate_me_to_all_sharers); + ProlongationNodeData(const stk::mesh::EntityId in_entityId, const Vector3d & coordinates, const std::vector & fields, const std::vector & ioparts) + : ProlongationPointData(coordinates), my_entityId(in_entityId), myCommunicateMeToAllSharersFlag(false), my_fields(fields), my_ioparts(ioparts) {} + + ~ProlongationNodeData() {} + + static std::vector get_node_io_parts(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity entity); + static std::vector get_fields_on_node(const stk::mesh::BulkData& stk_mesh, stk::mesh::Entity entity); + static Vector3d get_node_coordinates(const CDMesh & mesh, stk::mesh::Entity node); + + static ProlongationNodeData * unpack_from_buffer( stk::CommBuffer & b, const stk::mesh::MetaData & stk_meta ); // static method that builds surface from data in buffer for off-processor communication + void pack_into_buffer(stk::CommBuffer & b) const; + bool communicate_me_to_all_sharers() const { return myCommunicateMeToAllSharersFlag; } + + const std::vector & get_fields() const { ThrowRequireMsg(!my_fields.empty(), "Fields not set for prolongation node."); return my_fields; } + const std::vector & get_io_parts() const { ThrowRequireMsg(!my_ioparts.empty(), "IO Parts not set for prolongation node."); return my_ioparts; } + stk::mesh::EntityId entityId() const { return my_entityId; } + +protected: + const stk::mesh::EntityId my_entityId; + const bool myCommunicateMeToAllSharersFlag; + mutable std::vector my_fields; + mutable std::vector my_ioparts; + +private: + //: copy constructor not allowed + ProlongationNodeData(const ProlongationNodeData & copy); +}; + +class ProlongationFacet { +public: + ProlongationFacet(const CDMesh & mesh, const std::vector & prolong_nodes, const std::vector & common_fields); + ProlongationFacet(const CDMesh & mesh, stk::mesh::Entity side); + + static void communicate( const CDMesh & mesh, ProlongFacetVec & proc_prolong_facets, EntityProlongationNodeMap & proc_prolong_nodes, const std::vector & proc_target_bboxes ); + static std::set get_facet_nodes_to_communicate( const ProlongFacetVec & proc_prolong_facets, const BoundingBox & proc_target_bbox ); + + void pack_into_buffer(stk::CommBuffer & b) const; + static ProlongationFacet * unpack_from_buffer( const CDMesh & mesh, stk::CommBuffer & b ); // static method that builds surface from data in buffer for off-processor communication + void compute_common_fields(); + + static const BoundingBox & get_bounding_box(const ProlongationFacet * prolong_facet) { return prolong_facet->get_facet()->bounding_box(); } + + Facet * get_facet() const { return my_facet.get(); } + const std::vector & get_common_fields() const { return my_common_fields; } + const ProlongationPointData * get_prolongation_point_data(const FacetDistanceQuery & dist_query) const { update_prolongation_point_data(dist_query); return my_prolongation_point_data.get(); } + const std::vector & get_prolongation_nodes() const { return my_prolong_nodes; } + bool communicate_me(const BoundingBox & proc_target_bbox) const; + +protected: + void update_prolongation_point_data(const FacetDistanceQuery & dist_query) const; + +protected: + const CDMesh & my_mesh; + std::unique_ptr my_facet; + mutable std::unique_ptr my_prolongation_point_data; + mutable std::vector my_prolong_nodes; + mutable std::vector my_common_fields; + +private: + //: copy constructor not allowed + ProlongationFacet(const ProlongationFacet & copy); + static void communicate_shared_nodes( const CDMesh & mesh, EntityProlongationNodeMap & proc_prolong_nodes ); + static void communicate_facets( const CDMesh & mesh, ProlongFacetVec & proc_prolong_facets, const std::vector & proc_target_bboxes ); + static void communicate_facet_nodes( const CDMesh & mesh, const ProlongFacetVec & proc_prolong_facets, EntityProlongationNodeMap & proc_prolong_nodes, const std::vector & proc_target_bboxes ); +}; + +} // namespace krino + +#endif // Akri_ProlongationData_h diff --git a/packages/krino/krino/krino_lib/Akri_QualityMetric.cpp b/packages/krino/krino/krino_lib/Akri_QualityMetric.cpp new file mode 100644 index 000000000000..fcc6a98472ce --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_QualityMetric.cpp @@ -0,0 +1,127 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino +{ + +double calculate_tet_volume_using_sides(const stk::math::Vector3d &side0, const stk::math::Vector3d &side2, const stk::math::Vector3d &side3) +{ + return Dot(side3, Cross(side2, side0))/6.0; +} + +double MeanRatioQualityMetric::tet_mean_ratio(const std::vector &nodeLocations) +{ + ThrowAssert(nodeLocations.size() == 4 || nodeLocations.size() == 10); + + const stk::math::Vector3d side0 = nodeLocations[1] - nodeLocations[0]; + const stk::math::Vector3d side2 = nodeLocations[0] - nodeLocations[2]; + const stk::math::Vector3d side3 = nodeLocations[3] - nodeLocations[0]; + + const double volumeMin = 1.0E-30; + const double tetVolume = calculate_tet_volume_using_sides(side0, side2, side3); + if( std::abs( tetVolume ) < volumeMin ) + return 0.0; + + const stk::math::Vector3d side1 = nodeLocations[2] - nodeLocations[1]; + const stk::math::Vector3d side4 = nodeLocations[3] - nodeLocations[1]; + const stk::math::Vector3d side5 = nodeLocations[3] - nodeLocations[2]; + + const double side0_length_squared = side0.length_squared(); + const double side1_length_squared = side1.length_squared(); + const double side2_length_squared = side2.length_squared(); + const double side3_length_squared = side3.length_squared(); + const double side4_length_squared = side4.length_squared(); + const double side5_length_squared = side5.length_squared(); + + const int sign = tetVolume < 0. ? -1 : 1; + return sign * 12. * std::pow(3.*std::abs(tetVolume), 2./3.) / (side0_length_squared + side1_length_squared + side2_length_squared + side3_length_squared + side4_length_squared + side5_length_squared); +} + +double ScaledJacobianQualityMetric::tet_scaled_jacobian(const std::vector &nodeLocations) +{ + ThrowAssert(nodeLocations.size() == 4 || nodeLocations.size() == 10); + + const stk::math::Vector3d side0 = nodeLocations[1] - nodeLocations[0]; + const stk::math::Vector3d side1 = nodeLocations[2] - nodeLocations[1]; + const stk::math::Vector3d side2 = nodeLocations[0] - nodeLocations[2]; + const stk::math::Vector3d side3 = nodeLocations[3] - nodeLocations[0]; + const stk::math::Vector3d side4 = nodeLocations[3] - nodeLocations[1]; + const stk::math::Vector3d side5 = nodeLocations[3] - nodeLocations[2]; + + const double jacobi = Dot(side3, Cross(side2, side0)); + + // products of lengths squared of each edge attached to a node. + const double side0_length_squared = side0.length_squared(); + const double side1_length_squared = side1.length_squared(); + const double side2_length_squared = side2.length_squared(); + const double side3_length_squared = side3.length_squared(); + const double side4_length_squared = side4.length_squared(); + const double side5_length_squared = side5.length_squared(); + + const double length_squared[4] = { + side0_length_squared * side2_length_squared * side3_length_squared, + side0_length_squared * side1_length_squared * side4_length_squared, + side1_length_squared * side2_length_squared * side5_length_squared, + side3_length_squared * side4_length_squared * side5_length_squared + }; + int which_node = 0; + if(length_squared[1] > length_squared[which_node]) + which_node = 1; + if(length_squared[2] > length_squared[which_node]) + which_node = 2; + if(length_squared[3] > length_squared[which_node]) + which_node = 3; + + double length_product = std::sqrt( length_squared[which_node] ); + if(length_product < std::abs(jacobi)) + length_product = std::abs(jacobi); + + const double lengthMin = 1.0E-30; + if( length_product < lengthMin ) + return 0.0; + + static const double root_of_2 = std::sqrt(2.0); + return root_of_2 * jacobi / length_product; +} + +double ScaledJacobianQualityMetric::tri2d_scaled_jacobian(const std::vector &nodeLocations) +{ + const double absScaledJacobian = tri3d_scaled_jacobian(nodeLocations); + const double normalZ = + (nodeLocations[1][0]-nodeLocations[0][0])*(nodeLocations[2][1]-nodeLocations[0][1]) - + (nodeLocations[1][1]-nodeLocations[0][1])*(nodeLocations[2][0]-nodeLocations[0][0]); + return (normalZ > 0.) ? absScaledJacobian : -absScaledJacobian; +} + +double ScaledJacobianQualityMetric::tri3d_scaled_jacobian(const std::vector &nodeLocations) +{ + ThrowAssert(nodeLocations.size() == 3 || nodeLocations.size() == 6); + + const stk::math::Vector3d edge0 = nodeLocations[1] - nodeLocations[0]; + const stk::math::Vector3d edge1 = nodeLocations[2] - nodeLocations[0]; + const stk::math::Vector3d edge2 = nodeLocations[2] - nodeLocations[1]; + + const double lenSqr0 = edge0.length_squared(); + const double lenSqr1 = edge1.length_squared(); + const double lenSqr2 = edge2.length_squared(); + + const double maxEdgeLengthProduct = std::sqrt( std::max(lenSqr0*lenSqr1, std::max(lenSqr1*lenSqr2, lenSqr0*lenSqr2)) ); + + const double lengthMin = 1.0E-30; + if( maxEdgeLengthProduct < lengthMin ) + return 0.0; + + static const double two_over_root_of_3 = 2./sqrt(3.0); + const double jacobian = Cross(edge0, edge1).length(); + return jacobian*two_over_root_of_3/maxEdgeLengthProduct; +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_QualityMetric.hpp b/packages/krino/krino/krino_lib/Akri_QualityMetric.hpp new file mode 100644 index 000000000000..02599303f86f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_QualityMetric.hpp @@ -0,0 +1,76 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_QUALITY_METRIC_H +#define AKRI_QUALITY_METRIC_H +#include +#include + +namespace krino +{ + +class QualityMetric +{ +public: + virtual ~QualityMetric() {} + + virtual bool is_first_quality_metric_better_than_second(const double firstValue, const double secondValue) const = 0; + virtual double get_element_quality_metric(const std::vector &nodeLocations) const = 0; + virtual double get_best_value_for_metric() const = 0; + virtual double get_acceptable_value_for_metric() const = 0; +}; + +class MeanRatioQualityMetric : public QualityMetric +{ +public: + virtual ~MeanRatioQualityMetric() {} + + virtual double get_best_value_for_metric() const override { return 1.0; } + virtual bool is_first_quality_metric_better_than_second(const double firstValue, const double secondValue) const override + { + return static_cast(firstValue) > static_cast(secondValue); + } + + double get_element_quality_metric(const std::vector &nodeLocations) const override + { + return tet_mean_ratio(nodeLocations); + } + + static double tet_mean_ratio(const std::vector &nodeLocations); + + virtual double get_acceptable_value_for_metric() const override { return 0.2; } +}; + +class ScaledJacobianQualityMetric : public QualityMetric +{ +public: + ScaledJacobianQualityMetric() = default; + virtual ~ScaledJacobianQualityMetric() {} + + virtual double get_best_value_for_metric() const override { return 1.0; } + virtual bool is_first_quality_metric_better_than_second( + const double firstValue, const double secondValue) const override + { + return static_cast(firstValue) > static_cast(secondValue); + } + + double get_element_quality_metric(const std::vector &nodeLocations) const override + { + return (nodeLocations.size() == 4 || nodeLocations.size() == 10) ? tet_scaled_jacobian(nodeLocations) : tri2d_scaled_jacobian(nodeLocations); + } + + static double tet_scaled_jacobian(const std::vector &nodeLocations); + static double tri2d_scaled_jacobian(const std::vector &nodeLocations); + static double tri3d_scaled_jacobian(const std::vector &nodeLocations); + + virtual double get_acceptable_value_for_metric() const override { return 0.1; } +}; + +} + +#endif diff --git a/packages/krino/krino/krino_lib/Akri_RegionInterface.cpp b/packages/krino/krino/krino_lib/Akri_RegionInterface.cpp new file mode 100644 index 000000000000..f04136783043 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_RegionInterface.cpp @@ -0,0 +1,15 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +namespace krino{ + +std::unique_ptr RegionInterface::the_currently_parsed_region; + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_RegionInterface.hpp b/packages/krino/krino/krino_lib/Akri_RegionInterface.hpp new file mode 100644 index 000000000000..09248bed11a0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_RegionInterface.hpp @@ -0,0 +1,65 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_RegionInterface_h +#define Akri_RegionInterface_h + +#include +#include + +namespace Ioss { class Region; } +namespace stk { namespace diag { class Timer; } } +namespace stk { namespace mesh { class MetaData; } } + +namespace krino { + +class RegionInterface { + + public: + static RegionInterface & set_currently_parsed_region(stk::mesh::MetaData & meta, + const std::string & region_name, + stk::diag::Timer & region_timer, + const std::string & name_of_input_mesh, + Ioss::Region * ioss_region) + { + the_currently_parsed_region = std::make_unique(meta, region_name, region_timer, name_of_input_mesh, ioss_region); + return *the_currently_parsed_region; + } + static void clear_currently_parsed_region() { the_currently_parsed_region.reset(); } + static RegionInterface & get_currently_parsed_region() { ThrowAssert(nullptr != the_currently_parsed_region); return *the_currently_parsed_region; } + + stk::mesh::MetaData & get_stk_mesh_meta_data() { return my_meta; } + const std::string & name() { return my_region_name; } + stk::diag::Timer & getRegionTimer() const { return my_region_timer; } + const std::string & name_of_input_mesh() const { return my_name_of_input_mesh; } + Ioss::Region * get_input_io_region() { return my_ioss_region; } + + // must be public to be used by make_unique + RegionInterface(stk::mesh::MetaData & meta, + const std::string & region_name, + stk::diag::Timer & region_timer, + const std::string & input_mesh, + Ioss::Region * ioss_region) + : my_meta(meta), + my_region_name(region_name), + my_region_timer(region_timer), + my_name_of_input_mesh(input_mesh), + my_ioss_region(ioss_region) {} + +private: + static std::unique_ptr the_currently_parsed_region; + stk::mesh::MetaData & my_meta; + const std::string my_region_name; + stk::diag::Timer & my_region_timer; + const std::string my_name_of_input_mesh; + Ioss::Region * my_ioss_region; +}; + +} // end krino namespace + +#endif /* Akri_RegionInterface_h */ diff --git a/packages/krino/krino/krino_lib/Akri_ReportHandler.hpp b/packages/krino/krino/krino_lib/Akri_ReportHandler.hpp new file mode 100644 index 000000000000..9c3c57c4f4d9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_ReportHandler.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_REPORTHANDLER_H_ +#define KRINO_INCLUDE_AKRI_REPORTHANDLER_H_ + +#include +#include + +#define ParallelThrowRequire(parallel,expr) ThrowRequire(stk::is_true_on_all_procs(parallel,expr)) +#define ParallelThrowRequireMsg(parallel,expr,message) ThrowRequireMsg(stk::is_true_on_all_procs(parallel,expr),message) +#define ParallelThrowAssert(parallel,expr) ThrowAssert(stk::is_true_on_all_procs(parallel,expr)) +#define ParallelThrowAssertMsg(parallel,expr,message) ThrowAssertMsg(stk::is_true_on_all_procs(parallel,expr),message) + + +#endif /* KRINO_INCLUDE_AKRI_REPORTHANDLER_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_SearchTree.cpp b/packages/krino/krino/krino_lib/Akri_SearchTree.cpp new file mode 100644 index 000000000000..ffd80f22bb40 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SearchTree.cpp @@ -0,0 +1,257 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include + +#include + +namespace krino{ + +template +SearchTree::SearchTree( std::vector & entities ) +{ /* %TRACE[ON]% */ Trace trace__("krino::SearchTree::SearchTree( std::vector & entities )"); /* %TRACE% */ + + if (!entities.empty()) + { + my_nodes.resize(2*entities.size() - 1); + const size_t tree_size = build( entities.begin(), entities.end() ); + ThrowRequire(tree_size == my_nodes.size()); + } +} + +template +SearchTree::SearchTree( const std::vector & entities, const std::function & get_bbox ) +{ /* %TRACE[ON]% */ Trace trace__("krino::SearchTree::SearchTree( EntityVec & entities, const std::function & get_bbox )"); /* %TRACE% */ + + if (!entities.empty()) + { + std::vector bbox_entities; + bbox_entities.reserve(entities.size()); + for (auto && entity : entities) + { + bbox_entities.emplace_back(get_bbox(entity), entity); + } + my_nodes.resize(2*entities.size() - 1); + const size_t tree_size = build( bbox_entities.begin(), bbox_entities.end() ); + ThrowRequire(tree_size == my_nodes.size()); + } +} + +template +void +SearchTree::find_closest_entities( const Vector3d & search_point, std::vector & return_vec, const Real max_search_radius ) +{ + return_vec.clear(); + + // Algorithm requires tol > std::numeric_limits::epsilon(), here just pick multiplier + const Real tol = 100.*std::numeric_limits::epsilon(); + + // if there are no entities at all return empty list + if ( empty() ) return; + + const VecType search_pt(search_point.data()); + + // first find upper bound for distance + // the very first estimate for this is the upper bound for the base of the tree + Real upperBnd2 = my_nodes[0].boxUpperBnd2( search_pt ); + Real max_search_radius2 = max_search_radius * max_search_radius; + + if ( upperBnd2 > max_search_radius2 && max_search_radius2 > 0.0 ) + { + upperBnd2 = max_search_radius2; + } + + // now descend relevant parts of tree updating the bounds as we go + Real lowerBnd2 = upperBnd2; + treeBounds(search_pt, lowerBnd2, upperBnd2); + + // exit now if no entities within narrow_band + if ( lowerBnd2 > max_search_radius2 && max_search_radius2 > 0.0 ) + { + return; + } + + // with the upper bound known, find all entities within the tolerance + find_closest_entities( search_pt, upperBnd2, tol, return_vec ); + + return; +} + +template +void +SearchTree::find_closest_entities( + const VecType & search_point, + const Real maxDist2, + const Real tol, + std::vector & nearest, + const size_t index) +{ /* %TRACE% */ /* %TRACE% */ + const SearchTreeNode & node = my_nodes[index]; + if ( node.have_children() ) + { + const size_t Lindex = index + 1; + const Real L_lowerBnd2 = my_nodes[Lindex].boxLowerBnd2( search_point ); + const Real L_eps = tol*(maxDist2+my_nodes[Lindex].boxSize2()); + if ( L_lowerBnd2 < maxDist2+L_eps ) + find_closest_entities( search_point, maxDist2, tol, nearest, Lindex ); + + const size_t Rindex = node.get_right_index(); + const Real R_lowerBnd2 = my_nodes[Rindex].boxLowerBnd2( search_point ); + const Real R_eps = tol*(maxDist2+my_nodes[Rindex].boxSize2()); + if ( R_lowerBnd2 < maxDist2+R_eps ) + find_closest_entities( search_point, maxDist2, tol, nearest, Rindex ); + } + else + { + EntityType entity = node.get_leaf_entity(); + nearest.push_back( entity ); + } +} + +template +void +SearchTree::treeBounds( const VecType & search_point, + Real & lowerBnd2, + Real & upperBnd2, + const size_t index) +{ /* %TRACE% */ /* %TRACE% */ + const SearchTreeNode & node = my_nodes[index]; + if (!node.have_children()) + { + if (0 == index) + { + // Special case of a single node. Otherwise, this node will already have been handled by parent. + compute_and_update_bounds(search_point, lowerBnd2, upperBnd2, index); + } + return; + } + + const size_t Lindex = index + 1; + const Real L_lowerBnd2 = compute_and_update_bounds(search_point, lowerBnd2, upperBnd2, Lindex); + + const size_t Rindex = node.get_right_index(); + const Real R_lowerBnd2 = compute_and_update_bounds(search_point, lowerBnd2, upperBnd2, Rindex); + + if ( L_lowerBnd2 < R_lowerBnd2 ) + { + if ( L_lowerBnd2 < upperBnd2 ) + treeBounds( search_point, lowerBnd2, upperBnd2, Lindex ); + if ( R_lowerBnd2 < upperBnd2 ) + treeBounds( search_point, lowerBnd2, upperBnd2, Rindex ); + } + else + { + if ( R_lowerBnd2 < upperBnd2 ) + treeBounds( search_point, lowerBnd2, upperBnd2, Rindex ); + if ( L_lowerBnd2 < upperBnd2 ) + treeBounds( search_point, lowerBnd2, upperBnd2, Lindex ); + } +} + +template +size_t +SearchTree::build( typename std::vector::iterator entity_begin, typename std::vector::iterator entity_end, const size_t index ) +{ + const size_t entity_size = std::distance(entity_begin, entity_end); + + // determine bounding box + BoundingBox & node_bbox = my_nodes[index].bounding_box(); + for ( auto entity_it = entity_begin; entity_it != entity_end; ++entity_it ) + { + const BoundingBox & entity_bbox = entity_it->first; + node_bbox.accommodate( entity_bbox ); + } + + if ( entity_size > 1 ) + { + // determine axis to split tree on + int max_spread_dim = node_bbox.max_span_direction(); + + auto compare = [max_spread_dim](const BoundingBoxEntity & lhs, const BoundingBoxEntity & rhs) { return lhs.first.center()[max_spread_dim] < rhs.first.center()[max_spread_dim]; }; + const size_t mid_pt = entity_size / 2; + + // This works around a bug in some versions of nth_element +#ifdef CRAY_LWK + std::partial_sort( entity_begin, entity_begin + mid_pt, entity_end, compare ); +#else + std::nth_element( entity_begin, entity_begin + mid_pt, entity_end, compare ); +#endif + + const size_t Lindex = index + 1; + const size_t Rindex = build( entity_begin, entity_begin + mid_pt, Lindex ); + my_nodes[index].set_right_index(Rindex); + const size_t next_index = build( entity_begin + mid_pt, entity_end, Rindex ); + return next_index; + } + else + { + ThrowAssert(1 == entity_size); + my_nodes[index].set_leaf_entity(entity_begin->second); + return index + 1; + } +} + +template +void +SearchTree::get_intersecting_entities( const BoundingBoxType& bbox, std::vector& return_vec, const size_t index ) +{ + const SearchTreeNode & node = my_nodes[index]; + if (!node.bounding_box().intersects(bbox)) return; + + if ( node.have_children() ) + { + if ( bbox.contains(node.bounding_box()) ) + { + add_descendants(return_vec, index); + } + else + { + const size_t Lindex = index + 1; + get_intersecting_entities( bbox, return_vec, Lindex ); + + const size_t Rindex = node.get_right_index(); + get_intersecting_entities( bbox, return_vec, Rindex ); + } + } + else + { + EntityType entity = node.get_leaf_entity(); + return_vec.push_back( entity ); + } +} + +template +void +SearchTree::add_descendants( std::vector& return_vec, const size_t index ) +{ + const SearchTreeNode & node = my_nodes[index]; + + if ( node.have_children() ) + { + const size_t Lindex = index + 1; + add_descendants( return_vec, Lindex ); + + const size_t Rindex = node.get_right_index(); + add_descendants( return_vec, Rindex ); + } + else + { + EntityType entity = node.get_leaf_entity(); + return_vec.push_back( entity ); + } +} + +// Explicit template instantiation +template class SearchTree; +template class SearchTree; + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_SearchTree.hpp b/packages/krino/krino/krino_lib/Akri_SearchTree.hpp new file mode 100644 index 000000000000..4e7b5cf3094f --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SearchTree.hpp @@ -0,0 +1,119 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_SearchTree_h +#define Akri_SearchTree_h + +#include + +#include +#include + +namespace krino { + +template +class SearchTreeNode { +public: + typedef ENTITY EntityType; + typedef BoundingBox BoundingBoxType; + typedef BoundingBoxType::Real Real; + typedef BoundingBoxType::VecType VecType; + + SearchTreeNode() : m_entity(0), m_right_index(0) {} + + const BoundingBoxType & bounding_box() const { return m_bbox; } + BoundingBoxType & bounding_box() { return m_bbox; } + Real boxLowerBnd2( const VecType & x ) const { return ( m_bbox.SqrDistLowerBnd(x) ); } + Real boxUpperBnd2( const VecType & x ) const { return ( m_bbox.SqrDistUpperBnd(x) ); } + Real boxSize2() const { return m_bbox.SqrSize(); } + + bool have_children() const { return (0 != m_right_index); } + void set_right_index(size_t right_index) { m_right_index = right_index; } + size_t get_right_index() const { return m_right_index; } + void set_leaf_entity(EntityType leaf_entity) { m_entity = leaf_entity; } + EntityType get_leaf_entity() const { return m_entity; } + +private: + BoundingBoxType m_bbox; + EntityType m_entity; + size_t m_right_index; +}; + +template +class SearchTree { +public: + typedef ENTITY EntityType; + typedef BoundingBox BoundingBoxType; + typedef std::pair BoundingBoxEntity; + typedef BoundingBoxType::Real Real; + typedef BoundingBoxType::VecType VecType; + + SearchTree( std::vector & entities ); // vector is modified by sorting + SearchTree( const std::vector & entities, const std::function & get_bbox ); + SearchTree() = delete; + + // All entities within the max_search_radius that may be the closest to the given point will be returned. + // If max_search_radius = 0, then all entities that may be the closest to the given point will be returned. + void find_closest_entities( const Vector3d& search_point, std::vector& return_vec, const Real max_search_radius = 0.0 ); + + void get_intersecting_entities( const BoundingBoxType& bbox, std::vector& return_vec) + { + return_vec.clear(); + if (!empty()) + { + get_intersecting_entities( bbox, return_vec, 0); + } + } + + bool empty() const { return my_nodes.empty(); } + size_t storage_size() const { return my_nodes.size() * sizeof(SearchTreeNode); } + +private: + size_t build( typename std::vector::iterator entity_begin, typename std::vector::iterator entity_end, const size_t index = 0 ); + double compute_and_update_bounds( const VecType & x, + Real & lowerBnd2, + Real & upperBnd2, + const size_t index = 0 ); + void treeBounds( const VecType & x, + Real & lowerBnd2, + Real & upperBnd2, + const size_t index = 0 ); + void find_closest_entities( const VecType & x, + const Real maxDist2, + const Real tol, + std::vector & nearest, + const size_t index = 0 ); + void get_intersecting_entities( const BoundingBoxType& bbox, std::vector& return_vec, const size_t index ); + void add_descendants( std::vector& return_vec, const size_t index ); +private: + std::vector> my_nodes; +}; + +template +inline double +SearchTree::compute_and_update_bounds( const VecType & search_point, + Real & lowerBnd2, + Real & upperBnd2, + const size_t index) +{ /* %TRACE% */ /* %TRACE% */ + const SearchTreeNode & node = my_nodes[index]; + const Real node_lowerBnd2 = node.boxLowerBnd2( search_point ); + if ( node_lowerBnd2 < upperBnd2 ) + { + const Real node_upperBnd2 = node.boxUpperBnd2( search_point ); + if ( node_upperBnd2 < upperBnd2 ) + upperBnd2 = node_upperBnd2; + if (!node.have_children() && node_lowerBnd2 < lowerBnd2) + lowerBnd2 = node_lowerBnd2; + } + return node_lowerBnd2; +} + +} // namespace krino + +#endif // Akri_SearchTree_h diff --git a/packages/krino/krino/krino_lib/Akri_Segment.hpp b/packages/krino/krino/krino_lib/Akri_Segment.hpp new file mode 100644 index 000000000000..df9a117e7c5d --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Segment.hpp @@ -0,0 +1,83 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Segment_h +#define Akri_Segment_h + +#include +#include +#include +#include + +namespace krino { + +template +class Segment3 { + public: + typedef REAL Real; + Segment3() : nodes{} {} ///< Default all coords zero + Segment3(const Vec& n0, const Vec& n1) : nodes{{n0, n1}} {} ///< Explicit set two end points + Segment3(MemberInit type) {/* type == NONE */} + + Real Length() const { return (nodes[1]-nodes[0]).length(); } + Real LengthSquared() const { return (nodes[1]-nodes[0]).length_squared(); } + + const Vec& GetNode(const int index) const { return nodes[index]; } + Vec& GetNode(const int index) { return nodes[index]; } + + const std::array,2>& GetNodes() const { return nodes; } + std::array,2>& GetNodes() { return nodes; } + + // + // Find the closest point projection between point and the face. + // + Real closest_projection(const Vec &point) const { + Vec edge_dir(nodes[1]-nodes[0]); + Real dotValA = Dot(edge_dir,(point-nodes[0])); + if(dotValA <= 0.0) { return 0.0; } + Real dotValB = Dot(edge_dir,(point-nodes[1])); + if(dotValB >= 0.0) { return 1.0; } + Real lenSquared = edge_dir.length_squared(); + if(lenSquared == 0.0) { return 0.0; } + return dotValA / lenSquared; + } + Real closest_projection(const Vec &point, Vec &proj_point) const { + const Real location = closest_projection(point); + proj_point = (1.0-location)*GetNode(0) + location*GetNode(1); + return location; + } + + Real DistanceSquared(const Vec& x, Real & parametric_coord) const { + Vector3d closest_pt(MemberInit::NONE); + parametric_coord = closest_projection(x, closest_pt); + return (x - closest_pt).length_squared(); + } + Real DistanceSquared(const Vec& x) const { + Vector3d closest_pt(MemberInit::NONE); + closest_projection(x, closest_pt); + return (x - closest_pt).length_squared(); + } + + friend std::ostream& operator<<( std::ostream& out, const Segment3& seg ) + { + out << "Segment3:" + << " Node0= " << seg.GetNode(0)[0] << ", " << seg.GetNode(0)[1] << ", " << seg.GetNode(0)[2] + << " Node1= " << seg.GetNode(1)[0] << ", " << seg.GetNode(1)[1] << ", " << seg.GetNode(1)[2] + << "\n"; + return out; + } + + private: + std::array,2> nodes; +}; + +typedef Segment3 Segment3d; + +} // namespace krino + +#endif // Akri_Segment_h diff --git a/packages/krino/krino/krino_lib/Akri_Snap.cpp b/packages/krino/krino/krino_lib/Akri_Snap.cpp new file mode 100644 index 000000000000..d182524bf69a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Snap.cpp @@ -0,0 +1,633 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino +{ + +static stk::math::Vector3d compute_snap_location(const std::vector & nodeLocations, const std::vector & weights) +{ + stk::math::Vector3d snapLocation{stk::math::Vector3d::ZERO}; + for (size_t i=0; i & nodes, std::vector & nodeLocations) +{ + nodeLocations.clear(); + for (auto node : nodes) + nodeLocations.emplace_back(field_data(coordsField, node), dim); +} + +static void fill_global_ids_of_elements_using_node(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + stk::mesh::Entity node, + std::vector & globalIdsOfSnapNodeElems) +{ + globalIdsOfSnapNodeElems.clear(); + for (auto elem : StkMeshEntities{mesh.begin_elements(node), mesh.end_elements(node)}) + if (elementSelector(mesh.bucket(elem))) + globalIdsOfSnapNodeElems.push_back(mesh.identifier(elem)); +} + +static double compute_quality_if_node_is_snapped_terminating_early_if_below_threshold(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const FieldRef coordsField, + stk::mesh::Entity node, + const stk::math::Vector3d & snapLocation, + const QualityMetric &qualityMetric, + const double qualityThreshold) +{ + const int dim = mesh.mesh_meta_data().spatial_dimension(); + + double qualityAfterSnap = qualityMetric.get_best_value_for_metric(); + std::vector nodeLocations; + + for (auto elem : StkMeshEntities{mesh.begin_elements(node), mesh.end_elements(node)}) + { + if (elementSelector(mesh.bucket(elem))) + { + nodeLocations.clear(); + for (auto elemNode : StkMeshEntities{mesh.begin_nodes(elem), mesh.end_nodes(elem)}) + { + if (elemNode == node) + nodeLocations.push_back(snapLocation); + else + nodeLocations.emplace_back(field_data(coordsField, elemNode), dim); + } + + const double elemQualityAfterSnap = qualityMetric.get_element_quality_metric(nodeLocations); + + if (qualityMetric.is_first_quality_metric_better_than_second(qualityAfterSnap, elemQualityAfterSnap)) + { + qualityAfterSnap = elemQualityAfterSnap; + if (qualityMetric.is_first_quality_metric_better_than_second(qualityThreshold, qualityAfterSnap)) + return qualityAfterSnap; + } + } + } + return qualityAfterSnap; +} + +static stk::math::Vector3d compute_intersection_point_location(const int dim, const FieldRef coordsField, const IntersectionPoint & intersectionPoint) +{ + std::vector intPtNodeLocations; + fill_node_locations(dim, coordsField, intersectionPoint.get_nodes(), intPtNodeLocations); + return compute_snap_location(intPtNodeLocations, intersectionPoint.get_weights()); +} + +static bool element_has_all_nodes(const std::vector & elemNodes, const std::vector & nodesToFind) +{ + for (auto && nodeToFind : nodesToFind) + if (std::find(elemNodes.begin(), elemNodes.end(), nodeToFind) == elemNodes.end()) + return false; + return true; +} + +static double estimate_quality_of_cutting_intersection_points(const stk::mesh::BulkData & mesh, + const FieldRef coordsField, + const std::vector & elemNodes, + const std::vector & elemNodeCoords, + const std::vector intersectionPointIndices, + const std::vector & intersectionPoints, + const QualityMetric &qualityMetric) +{ + if (intersectionPointIndices.empty()) + return std::max(0., qualityMetric.get_element_quality_metric(elemNodeCoords)); + + // apply the front intersection point to element and recursively call with remaining intersection points + const IntersectionPoint & intPtToApply = intersectionPoints[*intersectionPointIndices.begin()]; + const std::vector remainingIntersectionPointIndices(intersectionPointIndices.begin()+1, intersectionPointIndices.end()); + + const stk::math::Vector3d intPtLocation = compute_intersection_point_location(mesh.mesh_meta_data().spatial_dimension(), coordsField, intPtToApply); + + const auto & intPtNodes = intPtToApply.get_nodes(); + double qualityAfterCut = qualityMetric.get_best_value_for_metric(); + if (element_has_all_nodes(elemNodes, intPtNodes)) + { + std::vector cutElemNodes; + std::vector cutElemNodeCoords; + + for (auto intPtNode : intPtNodes) + { + cutElemNodes.clear(); + cutElemNodeCoords.clear(); + for (size_t nodeIndex=0; nodeIndex & interpNodes) +{ + for (auto && interpNode : interpNodes) + if (interpNode != node && !parts_are_compatible_for_snapping_when_ignoring_phase(mesh, auxMeta, phaseSupport, node, interpNode)) + return false; + return true; +} + +static double get_node_intersection_point_weight(const IntersectionPoint & intersectionPoint, stk::mesh::Entity node) +{ + const std::vector & nodes = intersectionPoint.get_nodes(); + const auto iter = std::find(nodes.begin(), nodes.end(), node); + ThrowRequire(iter != nodes.end()); + const auto index = std::distance(nodes.begin(), iter); + return intersectionPoint.get_weights()[index]; +} + +std::vector get_sorted_node_ids(const stk::mesh::BulkData & mesh, const std::vector & nodes) +{ + std::vector nodeIds; + nodeIds.reserve(nodes.size()); + for (auto && node : nodes) nodeIds.push_back(mesh.identifier(node)); + std::sort(nodeIds.begin(), nodeIds.end()); + return nodeIds; +} + +static void sort_intersection_points_for_cutting(const stk::mesh::BulkData & mesh, + const FieldRef coordsField, + const std::vector & intersectionPoints, + const stk::mesh::Entity node, + const bool globalIDsAreParallelConsistent, + std::vector & sortedIntersectionPointIndices) +{ + // This sorter is designed to match the priority used by the cutting algorithm with CUT_QUADS_BY_MINIMIZING_ANGLES, especially in 3D + auto sorter = [&intersectionPoints, &mesh, &coordsField, node, globalIDsAreParallelConsistent](const size_t intPtIndex0, const size_t intPtIndex1) + { + const IntersectionPoint & intPt0 = intersectionPoints[intPtIndex0]; + const IntersectionPoint & intPt1 = intersectionPoints[intPtIndex1]; + const size_t numDomains0 = intPt0.get_sorted_domains().size(); + const size_t numDomains1 = intPt1.get_sorted_domains().size(); + if (numDomains0 != numDomains1) + return numDomains0 > numDomains1; + // reduce precision to float to handle "ties" + const float wt0 = get_node_intersection_point_weight(intPt0, node); + const float wt1 = get_node_intersection_point_weight(intPt1, node); + if (wt0 != wt1) + return wt0 < wt1; + + if (globalIDsAreParallelConsistent) + { + const std::vector sortedNodes0 = get_sorted_node_ids(mesh, intPt0.get_nodes()); + const std::vector sortedNodes1 = get_sorted_node_ids(mesh, intPt1.get_nodes()); + return sortedNodes1 < sortedNodes0; + } + + const stk::math::Vector3d x0 = compute_intersection_point_location(mesh.mesh_meta_data().spatial_dimension(), coordsField, intPt0); + const stk::math::Vector3d x1 = compute_intersection_point_location(mesh.mesh_meta_data().spatial_dimension(), coordsField, intPt1); + return is_less_than_in_x_then_y_then_z(x0, x1); + }; + std::sort(sortedIntersectionPointIndices.begin(), sortedIntersectionPointIndices.end(), sorter); +} + +static void fill_sorted_intersection_point_indices_for_node_for_domains(const stk::mesh::BulkData & mesh, + const FieldRef coordsField, + const std::vector & intersectionPoints, + const std::vector & candidatesIntersectionPointIndices, + const stk::mesh::Entity node, + const std::vector & domains, + const bool globalIDsAreParallelConsistent, + std::vector & sortedIntersectionPointIndices) +{ + sortedIntersectionPointIndices.clear(); + for (auto && intPtIndex : candidatesIntersectionPointIndices) + { + if (first_sorted_vector_of_domains_contains_all_domains_in_second_vector(domains, intersectionPoints[intPtIndex].get_sorted_domains())) + sortedIntersectionPointIndices.push_back(intPtIndex); + } + + sort_intersection_points_for_cutting(mesh, coordsField, intersectionPoints, node, globalIDsAreParallelConsistent, sortedIntersectionPointIndices); +} + +static std::set get_intersected_elements(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const std::vector & intersectionPoints, + const std::vector & intersectionPointIndices) +{ + std::vector cutElems; + std::set intersectedElements; + for (size_t intPtIndex : intersectionPointIndices) + { + stk::mesh::get_entities_through_relations(mesh, intersectionPoints[intPtIndex].get_nodes(), stk::topology::ELEMENT_RANK, cutElems); + for (auto && cutElem : cutElems) + if (elementSelector(mesh.bucket(cutElem))) + intersectedElements.insert(cutElem); + } + return intersectedElements; +} + +static std::map> get_node_to_intersection_point_indices(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints) +{ + std::map> nodeToInsersectionPointIndices; + for (size_t intersectionPointIndex=0; intersectionPointIndex, std::map> determine_quality_per_node_per_domain(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const FieldRef coordsField, + const std::vector & intersectionPoints, + const QualityMetric &qualityMetric, + const bool globalIDsAreParallelConsistent) +{ + const int dim = mesh.mesh_meta_data().spatial_dimension(); + + const auto nodeToInsersectionPointIndices = get_node_to_intersection_point_indices(mesh, intersectionPoints); + + std::vector sortedIntersectionPointIndices; + std::vector elemNodes; + std::vector elemNodeCoords; + + std::map, std::map> domainsToNodesToQuality; + for (auto entry : nodeToInsersectionPointIndices) + { + stk::mesh::Entity node = entry.first; + const auto nodeIntersectionPointIndices = entry.second; + + std::set> nodeIntPtDomains; + for (auto && intPtIndex : nodeIntersectionPointIndices) + nodeIntPtDomains.insert(intersectionPoints[intPtIndex].get_sorted_domains()); + + for (auto && intPtDomains : nodeIntPtDomains) + { + fill_sorted_intersection_point_indices_for_node_for_domains(mesh, coordsField, intersectionPoints, nodeIntersectionPointIndices, node, intPtDomains, globalIDsAreParallelConsistent, sortedIntersectionPointIndices); + const std::set intersectedElements = get_intersected_elements(mesh, elementSelector, intersectionPoints, sortedIntersectionPointIndices); + + double qualityAfterCut = qualityMetric.get_best_value_for_metric(); + for (auto && elem : intersectedElements) + { + elemNodes.assign(mesh.begin_nodes(elem), mesh.end_nodes(elem)); + fill_node_locations(dim, coordsField, elemNodes, elemNodeCoords); + const double elemQualityAfterCuts = estimate_quality_of_cutting_intersection_points(mesh, coordsField, elemNodes, elemNodeCoords, sortedIntersectionPointIndices, intersectionPoints, qualityMetric); + + if (qualityMetric.is_first_quality_metric_better_than_second(qualityAfterCut, elemQualityAfterCuts)) + qualityAfterCut = elemQualityAfterCuts; + } + + domainsToNodesToQuality[intPtDomains][mesh.identifier(node)] = qualityAfterCut; + } + } + + return domainsToNodesToQuality; +} + +std::vector +build_snap_infos_from_intersection_points(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const NodeToCapturedDomainsMap & nodesToCapturedDomains, + const std::vector & intersectionPoints, + const QualityMetric &qualityMetric, + const bool globalIDsAreParallelConsistent) +{ + std::vector snapInfos; + + const AuxMetaData & auxMeta = AuxMetaData::get(mesh.mesh_meta_data()); + const Phase_Support phaseSupport = Phase_Support::get(mesh.mesh_meta_data()); + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + const int dim = mesh.mesh_meta_data().spatial_dimension(); + std::vector nodeLocations; + std::vector procsThatNeedToKnowAboutThisInfo; + std::vector globalIdsOfSnapNodeElems; + + int owner = mesh.parallel_rank(); + + const auto domainsToNodesToQuality = determine_quality_per_node_per_domain(mesh, elementSelector, coordsField, intersectionPoints, qualityMetric, globalIDsAreParallelConsistent); + + for (size_t intersectionPointIndex=0; intersectionPointIndexsecond; + const double cutQualityEstimate = nodesToQuality.at(mesh.identifier(node)); + + // For face and volume cuts, allow quality to go down to acceptable_value_for_metric because estimate is not that good + //const double minAcceptableQuality = (nodes.size() == 2) ? cutQualityEstimate : std::min(qualityMetric.get_acceptable_value_for_metric(), cutQualityEstimate); + const double minAcceptableQuality = cutQualityEstimate; + + const double postSnapQuality = compute_quality_if_node_is_snapped_terminating_early_if_below_threshold(mesh, elementSelector, coordsField, node, snapLocation, qualityMetric, minAcceptableQuality); + if (qualityMetric.is_first_quality_metric_better_than_second(postSnapQuality, minAcceptableQuality)) + { + const size_t nodeGlobalId = mesh.identifier(node); + + fill_global_ids_of_elements_using_node(mesh, elementSelector, node, globalIdsOfSnapNodeElems); + fill_procs_owning_or_sharing_or_ghosting_node(mesh, node, procsThatNeedToKnowAboutThisInfo); + + snapInfos.emplace_back(nodeGlobalId, intersectionPointIndex, nodeLocations[nodeIndex], owner, procsThatNeedToKnowAboutThisInfo, globalIdsOfSnapNodeElems, postSnapQuality, snapLocation, nodes.size()); + } + else if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Skipping snap of " << mesh.identifier(node) << " to " << snapLocation << " at " << debug_output(mesh, intersectionPoint) << " with snap quality at or below " << postSnapQuality << " and estimated cut quality " << cutQualityEstimate << stk::diag::dendl; + } + } + } + } + + return snapInfos; +} + +void interpolate_nodal_field(const stk::mesh::BulkData & mesh, + stk::mesh::Entity node, const FieldRef field, + const std::vector & interpNodes, + const std::vector & interpWeights, + std::vector & scratch) +{ + const unsigned fieldLength = field.length(); + + double * val = field_data(field, node); + if (nullptr == val) return; + + scratch.assign(fieldLength, 0.0); + + for (size_t iNode=0; iNode(field, interpNodes[iNode]); + if (nullptr == nodeVal) + { + krinolog << "When snapping node " << mesh.identifier(node) << ", the field " << field.name() << " is missing on interpolating node " << mesh.identifier(interpNodes[iNode]) << stk::diag::dendl; + krinolog << "Should the field " << field.name() << " be an interpolation field?" << stk::diag::dendl; + ThrowRequireMsg(false, "Interpolation field missing on interpolation node " << mesh.identifier(interpNodes[iNode])); + } + + for (unsigned i=0; i & intersectionPoints, + const std::vector & snapInfos, + NodeToCapturedDomainsMap & nodesToCapturedDomains ) +{ + ThrowRequire(mesh.parallel_size() == 1 || mesh.is_automatic_aura_on()); + + std::vector< const stk::mesh::FieldBase *> interpFieldVec; + for(auto && field : interpolationFieldSet) + interpFieldVec.push_back(&field.field()); + stk::mesh::communicate_field_data(mesh, interpFieldVec); + + std::vector scratch; + std::vector snapNodes; + snapNodes.reserve(snapInfos.size()); + + for (auto && snapInfo : snapInfos) + { + if (snapInfo.get_owner() == mesh.parallel_rank()) + { + const size_t intersectionPointIndex = snapInfo.get_intersection_point_index(); + stk::mesh::Entity snapNode = mesh.get_entity(stk::topology::NODE_RANK, snapInfo.get_node_global_id()); + snapNodes.push_back(snapNode); + const IntersectionPoint & intersectionPoint = intersectionPoints[intersectionPointIndex]; + + nodesToCapturedDomains[snapNode] = intersectionPoint.get_sorted_domains(); + + const auto & nodes = intersectionPoint.get_nodes(); + const auto & weights = intersectionPoint.get_weights(); + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Snapping node " << snapInfo.get_node_global_id() << " to " << debug_output(mesh, intersectionPoint) << stk::diag::dendl; + } + + for(auto && field : interpolationFieldSet) + interpolate_nodal_field(mesh, snapNode, field, nodes, weights, scratch); + } + } + + stk::mesh::communicate_field_data(mesh, interpFieldVec); + + communicate_node_captured_domains_for_given_nodes(mesh, snapNodes, nodesToCapturedDomains); +} + +template +size_t get_global_num_infos(const std::vector & infos, stk::ParallelMachine comm) +{ + size_t numInfos = 0; + int rank{stk::parallel_machine_rank(comm)}; + for (const auto &info : infos) + if (info.get_owner() == rank) + ++numInfos; + const size_t localNumInfos = numInfos; + stk::all_reduce_sum(comm, &localNumInfos, &numInfos, 1); + return numInfos; +} + +void pack_owned_snap_infos_that_other_procs_need_to_know_about(std::vector &snapInfos, stk::CommSparse &commSparse) +{ + stk::pack_and_communicate(commSparse,[&]() + { + for(const auto &snapInfo : snapInfos) + { + if ( snapInfo.get_owner() == commSparse.parallel_rank() ) + { + for ( const int procId : snapInfo.get_procs_that_need_to_know_about_this_info()) + { + if ( procId != commSparse.parallel_rank()) + { + commSparse.send_buffer(procId).pack(snapInfo.get_node_global_id()); + commSparse.send_buffer(procId).pack(snapInfo.get_intersection_point_index()); + stk::pack_vector_to_proc(commSparse, snapInfo.get_procs_that_need_to_know_about_this_info(), procId); + stk::pack_vector_to_proc(commSparse, snapInfo.get_conflicting_ids(), procId); + commSparse.send_buffer(procId).pack(snapInfo.get_post_worst_quality()); + commSparse.send_buffer(procId).pack(snapInfo.get_node_location()); + commSparse.send_buffer(procId).pack(snapInfo.get_snap_location()); + commSparse.send_buffer(procId).pack(snapInfo.get_snap_rank()); + } + } + } + } + }); +} + +void receive_snap_infos_that_this_proc_need_to_know_about_and_ghost(std::vector &snapInfos, stk::CommSparse &commSparse) +{ + stk::unpack_communications(commSparse, [&commSparse, &snapInfos](int procId) + { + size_t globalNodeId{0}; + commSparse.recv_buffer(procId).unpack(globalNodeId); + + size_t intersectionPointIndex{0}; + commSparse.recv_buffer(procId).unpack(intersectionPointIndex); + + std::vector procsThatNeedToKnowAboutThisInfo; + std::vector globalIdsOfSnapNodeElems; + stk::unpack_vector_from_proc(commSparse, procsThatNeedToKnowAboutThisInfo, procId); + stk::unpack_vector_from_proc(commSparse, globalIdsOfSnapNodeElems, procId); + + double postSnapQuality{0}; + commSparse.recv_buffer(procId).unpack(postSnapQuality); + + stk::math::Vector3d nodeLocation; + commSparse.recv_buffer(procId).unpack(nodeLocation); + + stk::math::Vector3d snapLocation; + commSparse.recv_buffer(procId).unpack(snapLocation); + + int snapRank; + commSparse.recv_buffer(procId).unpack(snapRank); + + snapInfos.emplace_back(globalNodeId, + intersectionPointIndex, + nodeLocation, + procId, + procsThatNeedToKnowAboutThisInfo, + globalIdsOfSnapNodeElems, + postSnapQuality, + snapLocation, + snapRank); + }); +} + +void communicate_snap_infos_that_other_procs_need_to_know_about(std::vector &snapInfos, stk::ParallelMachine comm) +{ + stk::CommSparse commSparse(comm); + + pack_owned_snap_infos_that_other_procs_need_to_know_about(snapInfos, commSparse); + receive_snap_infos_that_this_proc_need_to_know_about_and_ghost(snapInfos, commSparse); +} + +std::vector get_sorted_nodes_modified_in_current_snapping_iteration(const stk::mesh::BulkData & mesh, const std::vector & iterationSnapInfos) +{ + std::vector sortedSnappedNodes; + for (auto && snapInfo : iterationSnapInfos) + sortedSnappedNodes.push_back(mesh.get_entity(stk::topology::NODE_RANK, snapInfo.get_node_global_id())); + std::sort(sortedSnappedNodes.begin(), sortedSnappedNodes.end()); + return sortedSnappedNodes; +} + +double determine_quality(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const QualityMetric &qualityMetric) +{ + const FieldRef coordsField(mesh.mesh_meta_data().coordinate_field()); + std::vector nodeLocations; + + double quality = qualityMetric.get_best_value_for_metric(); + for (auto && bucket : mesh.get_buckets(stk::topology::ELEMENT_RANK, elementSelector)) + { + if (bucket->topology().base() == stk::topology::TETRAHEDRON_4 || bucket->topology().base() == stk::topology::TRIANGLE_3_2D) + { + for (auto && element : *bucket) + { + fill_element_node_coordinates(mesh, element, coordsField, nodeLocations); + const double elementQuality = qualityMetric.get_element_quality_metric(nodeLocations); + quality = std::min(quality, elementQuality); + } + } + } + + const double localQuality = quality; + stk::all_reduce_min(mesh.parallel(), &localQuality, &quality, 1); + + return quality; +} + +NodeToCapturedDomainsMap snap_as_much_as_possible_while_maintaining_quality(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const FieldSet & interpolationFields, + const InterfaceGeometry & geometry, + const bool globalIDsAreParallelConsistent) +{/* %TRACE[ON]% */ Trace trace__("krino::snap_as_much_as_possible_while_maintaining_quality()"); /* %TRACE% */ + + const ScaledJacobianQualityMetric qualityMetric; + size_t iteration{0}; + NodeToCapturedDomainsMap nodesToCapturedDomains; + stk::ParallelMachine comm = mesh.parallel(); + + std::vector intersectionPoints; + geometry.store_phase_for_uncut_elements(mesh); + intersectionPoints = build_all_intersection_points(mesh, geometry, nodesToCapturedDomains); + + while (true) + { + krinolog << "Snapping To Geometry Iteration " << std::to_string(++iteration) << stk::diag::dendl; + + std::vector snapInfos = build_snap_infos_from_intersection_points(mesh, elementSelector, nodesToCapturedDomains, intersectionPoints, qualityMetric, globalIDsAreParallelConsistent); + + bool done = stk::is_true_on_all_procs(comm, snapInfos.empty()); + if ( done ) + break; + + communicate_snap_infos_that_other_procs_need_to_know_about(snapInfos, comm); + + const std::vector independentSnapInfos = find_snap_info_independent_sets(snapInfos, qualityMetric, comm); + + krinolog << " Snapping " << get_global_num_infos(independentSnapInfos, comm) << " of " << get_global_num_infos(snapInfos, comm) << " snap candidates." << stk::diag::dendl; + + geometry.store_phase_for_elements_that_will_be_uncut_after_snapping(mesh, intersectionPoints, independentSnapInfos, nodesToCapturedDomains); + snap_nodes(mesh, interpolationFields, intersectionPoints, independentSnapInfos, nodesToCapturedDomains); + + const std::vector iterationSortedSnapNodes = get_sorted_nodes_modified_in_current_snapping_iteration(mesh, independentSnapInfos); + update_intersection_points_after_snap_iteration(mesh, geometry, iterationSortedSnapNodes, nodesToCapturedDomains, intersectionPoints); + } + + krinolog << "After snapping quality is " << determine_quality(mesh, elementSelector, qualityMetric) << stk::diag::dendl; + + return nodesToCapturedDomains; +} +} + + + diff --git a/packages/krino/krino/krino_lib/Akri_Snap.hpp b/packages/krino/krino/krino_lib/Akri_Snap.hpp new file mode 100644 index 000000000000..f56bc31ecd38 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Snap.hpp @@ -0,0 +1,35 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_SNAP_H_ +#define KRINO_INCLUDE_AKRI_SNAP_H_ +#include +#include +#include +#include + +namespace krino +{ +class InterfaceGeometry; +class QualityMetric; + +NodeToCapturedDomainsMap snap_as_much_as_possible_while_maintaining_quality(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const FieldSet & interpolationFields, + const InterfaceGeometry & geometry, + const bool globalIDsAreParallelConsistent); + +double determine_quality(const stk::mesh::BulkData & mesh, + const stk::mesh::Selector & elementSelector, + const QualityMetric &qualityMetric); + +} + + + +#endif /* KRINO_INCLUDE_AKRI_SNAP_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_SnapIndependentSetFinder.hpp b/packages/krino/krino/krino_lib/Akri_SnapIndependentSetFinder.hpp new file mode 100644 index 000000000000..4c2490eadee5 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SnapIndependentSetFinder.hpp @@ -0,0 +1,34 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_SNAPINDEPENDENTSETFINDER_H +#define AKRI_SNAPINDEPENDENTSETFINDER_H + +#include +#include +#include +#include + +namespace krino +{ + +typedef independent_set::IndependentSetFinder SnapInfoIndependentSetFinder; + +inline +std::vector find_snap_info_independent_sets(const std::vector &allSnapInfos, + const QualityMetric & qualityMetric, + stk::ParallelMachine comm) +{ + SnapInfo::Comparator comparator {qualityMetric}; + SnapInfo::ConflictFinder conflictFinder; + return SnapInfoIndependentSetFinder::find_independent_set(allSnapInfos, comparator, conflictFinder, false, comm); +} + +} + +#endif /* AKRI_SNAPINDEPENDENTSETFINDER_H */ diff --git a/packages/krino/krino/krino_lib/Akri_SnapInfo.cpp b/packages/krino/krino/krino_lib/Akri_SnapInfo.cpp new file mode 100644 index 000000000000..96d0abdefd56 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SnapInfo.cpp @@ -0,0 +1,71 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include + +namespace krino +{ + +template +std::string +to_string(const Container & container) +{ + std::ostringstream os; + os << " {"; + for(auto data : container) + os << " " << data; + os << " }"; + return os.str(); +} + +bool SnapInfo::Comparator::is_first_higher_priority_than_second(const SnapInfo& snapInfoA,const SnapInfo& snapInfoB) const +{ + if( snapInfoA.get_snap_rank() > snapInfoB.get_snap_rank() ) + return true; + else if ( snapInfoA.get_snap_rank() < snapInfoB.get_snap_rank() ) + return false; + + if(mQualityMetric.is_first_quality_metric_better_than_second(snapInfoA.get_post_worst_quality(),snapInfoB.get_post_worst_quality())) + return true; + else if(mQualityMetric.is_first_quality_metric_better_than_second(snapInfoB.get_post_worst_quality(),snapInfoA.get_post_worst_quality())) + return false; + + if (snapInfoA.get_node_global_id() != snapInfoB.get_node_global_id()) + { + if ( is_less_than_in_x_then_y_then_z(snapInfoA.get_node_location(), snapInfoB.get_node_location()) ) + return true; + else if ( is_less_than_in_x_then_y_then_z(snapInfoB.get_node_location(), snapInfoA.get_node_location()) ) + return false; + } + + if ( is_less_than_in_x_then_y_then_z(snapInfoA.get_snap_location(), snapInfoB.get_snap_location()) ) + return true; + else if ( is_less_than_in_x_then_y_then_z(snapInfoB.get_snap_location(), snapInfoA.get_snap_location()) ) + return false; + + return false; +} + +std::ostream & operator<<(std::ostream & os, const SnapInfo& snapInfo) +{ + os << " Owner: " << snapInfo.get_owner() << std::endl; + os << "Snap Node: " << snapInfo.get_node_global_id() << std::endl; + os << "ConflictingIds: " << to_string(snapInfo.get_conflicting_ids()) << std::endl; + os << "SnapLocation: " << snapInfo.get_snap_location().to_string(16) << std::endl; + os << "PostSnapWorstQuality: " << snapInfo.get_post_worst_quality() << std::endl; + os << "GetProcsThatNeedToKnow: " << to_string(snapInfo.get_procs_that_need_to_know_about_this_info()) << std::endl; + os << "Snap Rank: " << snapInfo.get_snap_rank() << std::endl; + return os; +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_SnapInfo.hpp b/packages/krino/krino/krino_lib/Akri_SnapInfo.hpp new file mode 100644 index 000000000000..889defbd38e9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SnapInfo.hpp @@ -0,0 +1,87 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_SNAPINFO_H +#define AKRI_SNAPINFO_H + +#include +#include +#include + +namespace krino +{ + +class SnapInfo +{ +public: + typedef size_t ExclusionIdentifierType; + typedef std::array GlobalId; + + SnapInfo(const size_t nodeGlobalId, + const size_t intersectionPointIndex, + const stk::math::Vector3d & nodeLocation, + const int owner, + const std::vector & procsThatNeedToKnowAboutThisInfo, + const std::vector & globalIdsOfSnapNodeElems, + const double& postSnapQuality, + const stk::math::Vector3d & snapLocation, + const int snapRank) + : mUniqueId(make_unique_id(nodeGlobalId, intersectionPointIndex)), + mOwner{owner}, + mProcsThatNeedToKnowAboutThisInfo{procsThatNeedToKnowAboutThisInfo}, + mGlobalIdsOfSnapNodeElems{globalIdsOfSnapNodeElems}, + mPostWorstQuality(postSnapQuality), // () for intel 17 + mNodeLocation(nodeLocation), + mSnapLocation(snapLocation), + mSnapRank{snapRank} + { + } + + static GlobalId make_unique_id(const size_t globalNodeId, const size_t intersectionPointIndex) { return GlobalId{globalNodeId, intersectionPointIndex}; } + const GlobalId &get_unique_id() const { return mUniqueId; } + size_t get_node_global_id() const { return mUniqueId[0]; } + size_t get_intersection_point_index() const { return mUniqueId[1]; } + int get_owner() const { return mOwner; } + const std::vector &get_procs_that_need_to_know_about_this_info() const { return mProcsThatNeedToKnowAboutThisInfo; } + double get_post_worst_quality() const { return mPostWorstQuality; } + const stk::math::Vector3d & get_snap_location() const { return mSnapLocation; }; + const stk::math::Vector3d & get_node_location() const { return mNodeLocation; }; + int get_snap_rank() const { return mSnapRank; } + const std::vector &get_conflicting_ids() const { return mGlobalIdsOfSnapNodeElems; } + + class ConflictFinder + { + public: + std::vector get_other_conflicting_infos(const SnapInfo& info) const {return {};} + }; + class Comparator + { + public: + Comparator(const QualityMetric &qualityMetric) : mQualityMetric{qualityMetric}{} + bool is_first_higher_priority_than_second(const SnapInfo& tetSnapInfoA,const SnapInfo& tetSnapInfoB) const; + + private: + const QualityMetric &mQualityMetric; + }; + +private: + const GlobalId mUniqueId; + const int mOwner{0u}; + const std::vector mProcsThatNeedToKnowAboutThisInfo; + const std::vector mGlobalIdsOfSnapNodeElems; + const double mPostWorstQuality{0.0}; + const stk::math::Vector3d mNodeLocation{}; + const stk::math::Vector3d mSnapLocation{}; + const int mSnapRank; +}; + +std::ostream & operator<<(std::ostream & os, const SnapInfo& snapInfo); + +} + +#endif /* AKRI_SNAPINFO_H */ diff --git a/packages/krino/krino/krino_lib/Akri_SnapToNode.cpp b/packages/krino/krino/krino_lib/Akri_SnapToNode.cpp new file mode 100644 index 000000000000..84b437bdd092 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SnapToNode.cpp @@ -0,0 +1,59 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include "../interface_geometry_interface/Akri_InterfaceGeometry.hpp" + +namespace krino { + +void determine_node_snapping_from_intersection_points(const stk::mesh::BulkData & mesh, + const std::vector & intersectionPoints, + const CDFEM_Snapper & snapper, + NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + const double snapTol = snapper.get_edge_tolerance(); + for (auto && intersectionPoint : intersectionPoints) + { + const auto & nodes = intersectionPoint.get_nodes(); + const auto & weights = intersectionPoint.get_weights(); + for (size_t nodeIndex=0; nodeIndex 1.-snapTol) + { + if (krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Snapping node " << debug_output(mesh, intersectionPoint) << " to " << mesh.identifier(nodes[nodeIndex]) << stk::diag::dendl; + } + + const auto & intersectionPointDomains = intersectionPoint.get_sorted_domains(); + auto & nodeCapturedDomains = nodesToCapturedDomains[nodes[nodeIndex]]; + nodeCapturedDomains.insert(nodeCapturedDomains.end(), intersectionPointDomains.begin(), intersectionPointDomains.end()); + } + } + } + + for (auto && nodeToCapturedDomains : nodesToCapturedDomains) + stk::util::sort_and_unique(nodeToCapturedDomains.second); +} + +void snap_to_node(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const CDFEM_Snapper & snapper, + NodeToCapturedDomainsMap & nodesToCapturedDomains) +{ + const std::vector intersectionPoints = build_uncaptured_intersection_points(mesh, interfaceGeometry, nodesToCapturedDomains); + + determine_node_snapping_from_intersection_points(mesh, intersectionPoints, snapper, nodesToCapturedDomains); + communicate_node_captured_domains_for_all_nodes(mesh, nodesToCapturedDomains); +} + +} + + diff --git a/packages/krino/krino/krino_lib/Akri_SnapToNode.hpp b/packages/krino/krino/krino_lib/Akri_SnapToNode.hpp new file mode 100644 index 000000000000..26fe17920793 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SnapToNode.hpp @@ -0,0 +1,26 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_INCLUDE_AKRI_SNAPTONODE_H_ +#define KRINO_INCLUDE_AKRI_SNAPTONODE_H_ + +#include +#include + +namespace krino { + +class CDFEM_Support; +class Phase_Support; + +void snap_to_node(const stk::mesh::BulkData & mesh, + const InterfaceGeometry & interfaceGeometry, + const CDFEM_Snapper & snapper, + NodeToCapturedDomainsMap & nodesToCapturedDomains); + +} +#endif /* KRINO_INCLUDE_AKRI_SNAPTONODE_H_ */ diff --git a/packages/krino/krino/krino_lib/Akri_SubElement.cpp b/packages/krino/krino/krino_lib/Akri_SubElement.cpp new file mode 100644 index 000000000000..6a531e1abab2 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElement.cpp @@ -0,0 +1,2833 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace krino{ + +bool +SubElementNode::on_common_edge(const SubElementNode * other) const +{ + NodeSet ancestors; + get_ancestors(ancestors); + if (ancestors.size() <= 2) + { + other->get_ancestors(ancestors); + } + if (ancestors.size() <= 2) + { + return true; + } + return false; +} + +SubElementMidSideNode::SubElementMidSideNode( const Mesh_Element * owner, + const SubElementNode *parent1, + const SubElementNode *parent2) + : SubElementNode(owner), + my_is_mesh_node(false), + my_parent1(parent1), + my_parent2(parent2) +{ + // fill base class data + my_cached_owner_coords = compute_owner_coords( owner ); + my_global_coords = 0.5*(my_parent1->coordinates()) + 0.5*(my_parent2->coordinates()); +} + +SubElementMidSideNode::SubElementMidSideNode( const Mesh_Element * owner, + const SubElementNode *parent1, + const SubElementNode *parent2, + stk::mesh::Entity meshNode, + stk::mesh::EntityId meshNodeId) + : SubElementMidSideNode(owner, parent1, parent2) +{ + my_is_mesh_node = true; + set_entity(meshNode, meshNodeId); +} + +SubElementChildNode::SubElementChildNode( const Mesh_Element * in_owner, + const NodeVec & parents, + const std::vector & weights ) + : SubElementNode(in_owner), + my_parents(parents), + my_weights(weights) +{ + // fill base class data + my_cached_owner_coords = compute_owner_coords( in_owner ); + my_global_coords = in_owner->coordinates( my_cached_owner_coords ); +} + +SubElementMeshNode::SubElementMeshNode( const Mesh_Element * in_owner, + stk::mesh::Entity nodeEntity, + stk::mesh::EntityId nodeEntityId, + const Vector3d & in_owner_coords, + const Vector3d & in_global_coords ) + : SubElementNode(in_owner) +{ + // fill base class data + set_entity(nodeEntity, nodeEntityId); + my_cached_owner_coords = in_owner_coords; + my_global_coords = in_global_coords; +} + +void +SubElementNode::get_parent_entities(std::vector & parent_entities) const +{ + NodeVec parents = get_parents(); + + const unsigned parent_size = parents.size(); + parent_entities.resize(parent_size); + + for (unsigned i=0; ientity(); + } +} + +static bool is_on_multiple_blocks(const stk::mesh::BulkData& mesh, stk::mesh::Entity node) +{ + bool foundVolumePart = false; + for (auto && part : mesh.bucket(node).supersets()) + { + if (part->primary_entity_rank() == stk::topology::ELEMENT_RANK && + !stk::mesh::is_auto_declared_part(*part) && + part->subsets().empty() && + part->name().compare(0,7,"refine_") != 0) + { + if (foundVolumePart) return true; + foundVolumePart = true; + } + } + return false; +} + +bool SubElementChildNode::needs_to_be_ale_prolonged(const CDMesh & mesh) const +{ + if (mesh.get_prolongation_model() == INTERPOLATION) + return false; + + const CDMesh* old_mesh = mesh.get_old_mesh(); + const bool is_initial_mesh = old_mesh->stash_step_count() < 0; + if (is_initial_mesh) + return false; + + if (is_on_multiple_blocks(mesh.stk_bulk(), entity())) + return true; + + // relatively unusual case of an edge node that is not on a block-block boundary. + // this is currently handled by using interpolation. This possibly needs further + // testing/development to treat these like mesh nodes where we see if they have + // changed phase. + return false; +} + +Vector3d SubElementChildNode::compute_owner_coords( const Mesh_Element * in_owner ) const +{ + Vector3d calcOwnerCoords{Vector3d::ZERO}; + ThrowAssert(my_parents.size() == my_weights.size()); + for (size_t i=0; iowner_coords(in_owner); + return calcOwnerCoords; +} + +void +SubElementChildNode::prolongate_fields(const CDMesh & mesh) const +{/* %TRACE[ON]% */ Trace trace__("SubElementEdgeNode::prolongate_fields() const"); /* %TRACE% */ + for (auto && parent : my_parents) + if (!parent->is_prolonged()) + parent->prolongate_fields(mesh); + + if (my_is_prolonged_flag) return; + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "SubElementEdgeNode::prolongate_fields for node#" << entityId() << "\n"; + my_is_prolonged_flag = true; + + const ProlongationPointData * prolong_node = needs_to_be_ale_prolonged(mesh) ? mesh.get_old_mesh()->find_prolongation_node(*this) : nullptr; + + prolong_cdfem_displacements(mesh, prolong_node); + + prolong_zeroed_fields(mesh, nullptr); + + prolong_ale_fields(mesh, prolong_node); + + prolong_interpolation_fields(mesh); +} + +bool SubElementMidSideNode::is_mesh_node_that_needs_to_be_prolonged(const CDMesh & mesh) const +{/* %TRACE[ON]% */ Trace trace__("SubElementMidSideNode::is_mesh_node_that_needs_to_be_prolonged() const"); /* %TRACE% */ + + ThrowRequire(my_is_mesh_node); + + const SubElementMeshNode * parent1 = dynamic_cast(my_parent1); + const SubElementMeshNode * parent2 = dynamic_cast(my_parent2); + const int num_ale_prolonged_parents = (parent1->needs_to_be_ale_prolonged(mesh) ? 1 : 0) + (parent2->needs_to_be_ale_prolonged(mesh) ? 1 : 0); + + if (num_ale_prolonged_parents == 0) return false; + if (num_ale_prolonged_parents == 2) return true; + + // 1 parent node needed to be ALE prolonged and this node is active (so the edge is not cut). + // This means the interface was cutting this edge, but now is not -> prolong OR + // the interface is passing through one of the parents of this uncut edge -> do not prolong. + + const bool have_or_did_have_interface = my_cached_owner->have_interface() || mesh.get_old_mesh()->find_mesh_element(my_cached_owner->entityId())->have_interface(); + + return have_or_did_have_interface && nullptr == mesh.get_old_mesh()->fetch_prolong_node(entityId()); +} + +void +SubElementMidSideNode::prolongate_fields(const CDMesh & mesh) const +{/* %TRACE[ON]% */ Trace trace__("SubElementMidSideNode::prolongate_fields() const"); /* %TRACE% */ + if (!my_parent1->is_prolonged()) + { + my_parent1->prolongate_fields(mesh); + } + if (!my_parent2->is_prolonged()) + { + my_parent2->prolongate_fields(mesh); + } + if (my_is_prolonged_flag) return; + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "SubElementMidSideNode::prolongate_fields for node#" << entityId() << "\n"; + my_is_prolonged_flag = true; + + const bool needs_to_be_prolonged = !my_is_mesh_node || is_mesh_node_that_needs_to_be_prolonged(mesh); + if (needs_to_be_prolonged) + { + // Note: CDFEM displacement is not present on midside nodes + prolong_zeroed_fields(mesh, nullptr); + + prolong_interpolation_fields(mesh); + + prolong_ale_fields(mesh); + } +} + +void +SubElementMidSideNode::prolong_interpolation_fields(const CDMesh & mesh) const +{ + const ElementObj * interp_elem = nullptr; + Vector3d interp_elem_p_coords; + const CDMesh* old_mesh = mesh.get_old_mesh(); + const Mesh_Element * old_owner = old_mesh->find_mesh_element(my_cached_owner->entityId()); + ThrowAssert(old_owner); + old_owner->find_child_coordinates_at_owner_coordinates(my_cached_owner_coords, interp_elem, interp_elem_p_coords); + + for(auto && field : mesh.get_interpolation_fields()) + { + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + interp_elem->evaluate_prolongation_field(*old_mesh, field, field_length, interp_elem_p_coords, val); + } +} + +void +SubElementMidSideNode::prolong_ale_fields(const CDMesh & mesh) const +{ + // simply average parent nodes + for(auto && field : mesh.get_ale_prolongation_fields()) + { + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (nullptr != val) + { + double * val1 = field_data(field, my_parent1->entity()); + double * val2 = field_data(field, my_parent2->entity()); + ThrowRequire(val1 && val2); + for (unsigned i=0; iis_prolonged()) + { + parent->prolongate_fields(mesh); + } + } + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "SubElementInternalNode::prolongate_fields for node#" << entityId() << "\n"; + my_is_prolonged_flag = true; + + const stk::mesh::BulkData& stk_mesh = mesh.stk_bulk(); + const stk::mesh::FieldVector & all_fields = stk_mesh.mesh_meta_data().get_fields(); + for ( stk::mesh::FieldVector::const_iterator it = all_fields.begin(); it != all_fields.end() ; ++it ) + { + const FieldRef field = (const FieldRef)(**it); + + // Do not try to prolong non-real variables + if( field.entity_rank()!=stk::topology::NODE_RANK || !field.type_is() ) continue; + + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + for (unsigned i=0; i(field, get_parents()[p]->entity()); + if (NULL == parent_val) + { + parent_error = true; + } + else + { + tot_wt += get_parent_weights()[p]; + for (unsigned i=0; ientity()) << stk::diag::dendl; + } + } + } +} + +bool on_interface_or_io_parts_have_changed(const stk::mesh::BulkData & mesh, const Phase_Support & phaseSupport, stk::mesh::Entity node, const ProlongationNodeData & oldProlongNode) +{ + const auto newParts = ProlongationNodeData::get_node_io_parts(mesh, node); + if (newParts != oldProlongNode.get_io_parts()) + return true; + for (auto && partOrdinal : newParts) + if (phaseSupport.is_interface(&mesh.mesh_meta_data().get_part(partOrdinal))) + return true; + return false; +} + +bool SubElementMeshNode::needs_to_be_ale_prolonged(const CDMesh & mesh) const +{/* %TRACE[ON]% */ Trace trace__("SubElementMeshNode::needs_to_be_ale_prolonged() const"); /* %TRACE% */ + const ProlongationNodeData * old_prolong_node = NULL; + const CDMesh* old_mesh = mesh.get_old_mesh(); + old_prolong_node = old_mesh->fetch_prolong_node(entityId()); + const bool is_initial_mesh = old_mesh->stash_step_count() < 0; + return !is_initial_mesh && nullptr != old_prolong_node && on_interface_or_io_parts_have_changed(mesh.stk_bulk(), mesh.get_phase_support(), entity(), *old_prolong_node); +} + +void +SubElementMeshNode::prolongate_fields(const CDMesh & mesh) const +{/* %TRACE[ON]% */ Trace trace__("SubElementMeshNode::prolongate_fields() const"); /* %TRACE% */ + + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "SubElementMeshNode::prolongate_fields for node#" << entityId() << "\n"; + my_is_prolonged_flag = true; + + const ProlongationPointData * prolong_data = NULL; + const ProlongationNodeData * old_prolong_node = NULL; + const CDMesh* old_mesh = mesh.get_old_mesh(); + old_prolong_node = old_mesh->fetch_prolong_node(entityId()); + + const bool needsToBeALEProlonged = needs_to_be_ale_prolonged(mesh); + if (mesh.get_prolongation_model() != INTERPOLATION && needsToBeALEProlonged) + { + prolong_data = old_mesh->find_prolongation_node(*this); + } + + if( !old_prolong_node && !prolong_data ) + { + return; + } + + prolong_cdfem_displacements(mesh, prolong_data, false); + + const ProlongationNodeData * nodeToExamineForPreExistingField = needsToBeALEProlonged ? nullptr : old_prolong_node; + prolong_zeroed_fields(mesh, nodeToExamineForPreExistingField); + + prolong_ale_fields(mesh, prolong_data, old_prolong_node); + + prolong_interpolation_fields(mesh, old_prolong_node); +} + +void +SubElementNode::prolong_zeroed_fields(const CDMesh & mesh, const ProlongationNodeData * nodeToExamineForPreExistingField) const +{ + const FieldSet & zeroed_fields = mesh.get_zeroed_fields(); + for(auto&& field : zeroed_fields) + { + if (!nodeToExamineForPreExistingField || !nodeToExamineForPreExistingField->get_field_data(field)) // If this node existed before and had this field, leave it alone + { + double * val = field_data(field, my_entity); + if (nullptr != val) std::fill(val, val+field.length(), 0.); + } + } +} + +void SubElementNode::prolong_cdfem_displacements(const CDMesh & mesh, + const ProlongationPointData * prolong_data, + const bool zero_if_no_prolong_data) const +{ + const FieldRef field = mesh.get_cdfem_displacements_field(); + if( !field.valid()) return; + + const unsigned field_length = field.length(); + for ( unsigned is = 0; is < field.number_of_states(); ++is ) + { + const stk::mesh::FieldState state = static_cast(is); + const FieldRef state_field = field.field_state(state); + + double * val = field_data(state_field, my_entity); + if(val == NULL) continue; + + if(!prolong_data) + { + if (zero_if_no_prolong_data) + { + std::fill(val, val+field_length, 0); + } + } + else + { + const double * prolong_field = prolong_data->get_field_data(state_field); + ThrowRequire(NULL != prolong_field); + std::copy(prolong_field, prolong_field+field_length, val); + + if (state == stk::mesh::StateNew) + { + const Vector3d & coords = coordinates(); + const Vector3d & old_coords = prolong_data->get_coordinates(); + for (unsigned i=0; i 0); + + for (auto && child : parents[0]->my_children) + { + if (child->get_num_parents() == numParents) + { + bool childOfAllParents = true; + for (size_t iParent=1; iParenthave_child(child)) + { + childOfAllParents = false; + break; + } + } + if (childOfAllParents) + return child; + } + } + return nullptr; +} + +bool SubElementNode::have_child() const +{ + return !my_children.empty(); +} + +bool SubElementNode::have_child(const SubElementNode* child) const +{ + return (std::find(my_children.begin(), my_children.end(), child) != my_children.end()); +} + +void +SubElementChildNode::prolong_ale_fields(const CDMesh & mesh, const ProlongationPointData * prolong_data) const +{ + const CDMesh* old_mesh = mesh.get_old_mesh(); + const ElementObj * interp_elem = nullptr; + Vector3d interp_elem_p_coords; + const FieldSet & ale_prolongation_fields = mesh.get_ale_prolongation_fields(); + for(FieldSet::const_iterator it = ale_prolongation_fields.begin(); it != ale_prolongation_fields.end(); ++it) + { + const FieldRef field = *it; + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + if(prolong_data) + { + // this node has changed phase + // prolong based on prolong_node + const double * prolong_field = prolong_data->get_field_data(field); + // We cannot yet handle the case where a prolongation field is not defined on the prolongation node that + // was found. Throw here to avoid the possibility of not prolonging a prolongation field that then + // has its time derivative screwed up because it has a mesh velocity associated with it. + // We think this should only occur in problems with multiple different level sets. + ThrowRequire(prolong_field); + std::copy(prolong_field, prolong_field+field_length, val); + } + else + { + if (nullptr == interp_elem) + { + const Mesh_Element * old_owner = old_mesh->find_mesh_element(my_cached_owner->entityId()); + ThrowAssert(old_owner); + old_owner->find_child_coordinates_at_owner_coordinates(my_cached_owner_coords, interp_elem, interp_elem_p_coords); + } + + interp_elem->evaluate_prolongation_field(*old_mesh, field, field_length, interp_elem_p_coords, val); + } + } +} + +void +SubElementMeshNode::prolong_ale_fields(const CDMesh & mesh, + const ProlongationPointData * prolong_data, + const ProlongationNodeData * old_node) const +{ + const FieldSet & ale_prolongation_fields = mesh.get_ale_prolongation_fields(); + for(FieldSet::const_iterator it = ale_prolongation_fields.begin(); it != ale_prolongation_fields.end(); ++it) + { + const FieldRef field = *it; + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + if(prolong_data) + { + // this node has changed phase + // prolong based on prolong_node + const double * prolong_field = prolong_data->get_field_data(field); + // We cannot yet handle the case where a prolongation field is not defined on the prolongation node that + // was found. Throw here to avoid the possibility of not prolonging a prolongation field that then + // has its time derivative screwed up because it has a mesh velocity associated with it. + // We think this should only occur in problems with multiple different level sets. + ThrowRequire(prolong_field); + std::copy(prolong_field, prolong_field+field_length, val); + } + else if(old_node) + { + const double * old_field = old_node->get_field_data(field); + if(!old_field) + { + const FieldRef initial_field = mesh.get_cdfem_support().get_initial_prolongation_field( field ); + if(initial_field.valid()) + { + const double * initial_data = old_node->get_field_data(initial_field); + std::copy(initial_data, initial_data+field_length, val); + } + else + { + std::fill(val, val+field_length, 0.); + } + } + } + } +} + +void +SubElementChildNode::prolong_interpolation_fields(const CDMesh & mesh) const +{ + const ElementObj * interp_elem = nullptr; + Vector3d interp_elem_p_coords; + const CDMesh* old_mesh = mesh.get_old_mesh(); + const Mesh_Element * old_owner = old_mesh->find_mesh_element(my_cached_owner->entityId()); + ThrowAssert(old_owner); + old_owner->find_child_coordinates_at_owner_coordinates(my_cached_owner_coords, interp_elem, interp_elem_p_coords); + + const FieldSet & interpolation_fields = mesh.get_interpolation_fields(); + for(FieldSet::const_iterator it = interpolation_fields.begin(); it != interpolation_fields.end(); ++it) + { + const FieldRef field = *it; + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + interp_elem->evaluate_prolongation_field(*old_mesh, field, field_length, interp_elem_p_coords, val); + } +} + +void +SubElementMeshNode::prolong_interpolation_fields(const CDMesh & mesh, const ProlongationNodeData * old_node) const +{ + const FieldSet & interpolation_fields = mesh.get_interpolation_fields(); + for(FieldSet::const_iterator it = interpolation_fields.begin(); it != interpolation_fields.end(); ++it) + { + const FieldRef field = *it; + const unsigned field_length = field.length(); + + double * val = field_data(field, my_entity); + if (NULL == val) continue; + + if(old_node) + { + const double * old_field = old_node->get_field_data(field); + if(!old_field) + { + const FieldRef initial_field = mesh.get_cdfem_support().get_initial_prolongation_field( field ); + if(initial_field.valid()) + { + const double * initial_data = old_node->get_field_data(initial_field); + std::copy(initial_data, initial_data+field_length, val); + } + else + { + std::fill(val, val+field_length, 0.); + } + } + } + } +} + +void removeParts(stk::mesh::PartVector & parts, const stk::mesh::PartVector & parts_to_remove) +{ + stk::mesh::PartVector::iterator parts_begin = parts.begin(); + stk::mesh::PartVector::iterator begin_parts_to_erase = parts.end(); + for(stk::mesh::PartVector::const_iterator it = parts_to_remove.begin(); it != parts_to_remove.end(); ++it) + { + begin_parts_to_erase = std::remove(parts_begin, begin_parts_to_erase, *it); + } + parts.erase(begin_parts_to_erase, parts.end()); +} + +std::vector SubElementNode::prolongation_node_fields(const CDMesh & mesh) const +{ + const FieldSet & ale_prolongation_fields = mesh.get_ale_prolongation_fields(); + + std::vector ale_prolongation_fields_on_node; + ale_prolongation_fields_on_node.reserve(ale_prolongation_fields.size()); + for(auto && field : ale_prolongation_fields) + if (nullptr != field_data(field, my_entity)) + ale_prolongation_fields_on_node.push_back(field.field().mesh_meta_data_ordinal()); + + std::sort(ale_prolongation_fields_on_node.begin(), ale_prolongation_fields_on_node.end()); + return ale_prolongation_fields_on_node; +} + +static bool float_less(double a, double b) +{ + return static_cast(a) < static_cast(b); +} + +bool SubElementNode::higher_priority_by_score_then_ancestry(const SubElementNode & a, const SubElementNode & b, const bool globalIDsAreParallelConsistent) +{ + // higher score wins + if (float_less(b.get_node_score(), a.get_node_score())) return true; + if (float_less(a.get_node_score(), b.get_node_score())) return false; + + if (globalIDsAreParallelConsistent) + return SubElementNodeAncestry::compare(a.get_ancestry(), b.get_ancestry(), SubElementNode::less_by_entity_id); + return SubElementNodeAncestry::compare(a.get_ancestry(), b.get_ancestry(), SubElementNode::less_by_coordinates_then_by_entity_id); +} + +bool SubElementNode::less_by_entity_id(const SubElementNode & a, const SubElementNode & b) +{ + // lower id wins (this can be an issue because it is sensitive to the global ids provided by percept, which are dependent on the number of procs) + return a.entityId() < b.entityId(); +} + +bool SubElementNode::less_by_coordinates_then_by_entity_id(const SubElementNode & a, const SubElementNode & b) +{ + const Vector3d & aCoord = a.coordinates(); + const Vector3d & bCoord = b.coordinates(); + if (float_less(aCoord[0], bCoord[0])) return true; + if (float_less(bCoord[0], aCoord[0])) return false; + if (float_less(aCoord[1], bCoord[1])) return true; + if (float_less(bCoord[1], aCoord[1])) return false; + if (float_less(aCoord[2], bCoord[2])) return true; + if (float_less(bCoord[2], aCoord[2])) return false; + + // as a last resort, lower id wins (this can be an issue because it is sensitive to the global ids provided by percept, which are dependent on the number of procs) + return a.entityId() < b.entityId(); +} + +bool SubElementNode::captures_intersection_point_domains(const std::vector & intersectionPointDomains) const +{ + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(my_sorted_node_domains, intersectionPointDomains); +} + +bool SubElementNode::captures_interface(const InterfaceID & interface) const +{ + if (interface.first_ls() == interface.second_ls()) + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(my_sorted_node_domains, {interface.first_ls()}); + return first_sorted_vector_of_domains_contains_all_domains_in_second_vector(my_sorted_node_domains, {interface.first_ls(),interface.second_ls()}); +} + +void SubElementNode::insert_node_domains(const std::vector & domainsToAdd) const +{ + my_sorted_node_domains.insert(my_sorted_node_domains.end(), domainsToAdd.begin(), domainsToAdd.end()); + stk::util::sort_and_unique(my_sorted_node_domains); +} + + +const SubElementNode * +SubElementNode::find_node_with_common_ancestry(const CDMesh & search_mesh) const +{ + // This only works with a lineage of edge nodes (not internal nodes). + if (is_mesh_node()) + { + return search_mesh.get_mesh_node(entityId()); + } + + const NodeVec parents = get_parents(); + const unsigned num_parents = parents.size(); + + if (num_parents == 2) + { + const SubElementNode * search_parent1 = search_mesh.find_node_with_common_ancestry(parents[0]); + const SubElementNode * search_parent2 = search_mesh.find_node_with_common_ancestry(parents[1]); + if (nullptr != search_parent1 && nullptr != search_parent2) + { + return SubElementNode::common_child({search_parent1, search_parent2}); + } + } + return nullptr; +} + +void +SubElementNode::get_ancestors(NodeSet & ancestors) const +{ + if (is_mesh_node()) + { + ancestors.insert(this); + return; + } + const NodeVec parents = get_parents(); + for(auto&& parent : parents) + { + parent->get_ancestors(ancestors); + } +} + +SubElementNodeAncestry +SubElementNode::get_ancestry() const +{ + return SubElementNodeAncestry(this); +} + +void +SubElementNode::build_stencil(std::map & stencil, const double self_weight) const +{ + if (is_mesh_node()) + { + stencil[this] += self_weight; + return; + } + const NodeVec parents = get_parents(); + const std::vector parent_weights = get_parent_weights(); + for(unsigned i=0; ibuild_stencil(stencil, self_weight * parent_weights[i]); + } +} + +void +SubElementNode::build_constraint_stencil(const FieldRef field, std::vector & entities, std::vector & weights) const +{ + ThrowRequire(!is_mesh_node()); + static const double wt_min = 1.e-9; + typedef std::tuple EntityAndWeight; + std::vector entitiesAndWeights; + + const MasterElement* master_elem = my_cached_owner->get_evaluation_master_element(field); + + const unsigned npe = master_elem->get_topology().num_nodes(); + std::vector shapefcn (npe,0.); + master_elem->shape_fcn(1, my_cached_owner_coords.data(), shapefcn.data()); + + const auto & nodes = my_cached_owner->get_nodes(); + for (unsigned n=0; n wt_min) + { + entitiesAndWeights.push_back(std::make_tuple(nodes[n]->entityId(), nodes[n]->entity(), shapefcn[n])); + } + } + + std::sort(entitiesAndWeights.begin(), entitiesAndWeights.end(), [](const EntityAndWeight & a, const EntityAndWeight & b) { return std::get<0>(a) > std::get<0>(b); }); + + entities.clear(); + weights.clear(); + + entities.push_back(entity()); + weights.push_back(-1.0); + + for (auto && entityAndWeight : entitiesAndWeights) + { + entities.push_back(std::get<1>(entityAndWeight)); + weights.push_back(std::get<2>(entityAndWeight)); + } +} + +// Notes on coordinate systems. +// (1) real coordinates +// This can be obtained using Element::coordinates( Vector3d of owner coordinates ). +// (2) owner coordinates +// This is the parametric coordinates of the finite element. +// This can be obtained using SubElement::owner_coordinates( Vector3d of subelement coordinates ). +// This is the type of coordinates stored in SubElement::my_coords, no matter what level of subelement. +// In places where both owner coordinates and subelement coordinates are used, this is kept in the var owner_coords. +// (3) subelement coordinates +// This is the parametric coordinates within the subelement. +// In places where both owner coordinates and subelement coordinates are used, this is kept in the var local_coords. + +SubElement::SubElement( const stk::topology topo, + const NodeVec & nodes, + const std::vector & side_ids, + const Mesh_Element * owner) + : ElementObj( topo, nodes), + my_parent_side_ids( side_ids ), + my_owner( owner ) +{ /* %TRACE% */ /* %TRACE% */ + ThrowAssert( nodes.size() == topology().num_nodes() ); + ThrowAssert( my_parent_side_ids.size() == topology().num_sides() ); + + set_permutation(); +} + +void +SubElement::set_permutation() +{ + // For true subelements (not just coincident with the owning mesh element), permute the element + // nodes and sides in a consistent way. This will produce consistent node and side ordering + // from decomposition to decomposition. In this way, repeated decompositions will produce identical results. + + bool coincident_with_owner = true; + for (size_t n=0; nget_nodes()[n]) + { + coincident_with_owner = false; + break; + } + } + if (coincident_with_owner) return; + + std::vector node_ancestries; + node_ancestries.reserve(my_nodes.size()); + for (auto&& node : my_nodes) + { + node_ancestries.emplace_back(node); + } + const unsigned permutation_index = topology().lexicographical_smallest_permutation(node_ancestries.data(), true); // only consider positive permutations (true means this) + + if (permutation_index == stk::mesh::DEFAULT_PERMUTATION) return; + + // permute nodes + NodeVec permuted_nodes(my_nodes.size()); + topology().permutation_nodes(my_nodes.data(), permutation_index, permuted_nodes.data()); + my_nodes = permuted_nodes; + + // permute sides + std::vector side_permutation = get_side_permutation(topology(), static_cast(permutation_index)); + + std::vector permuted_parent_side_ids(my_parent_side_ids.size()); + for (unsigned iside=0; isideentity()) return false; + } + return true; +} + +void +SubElement::get_owner_coord_transform(double * dOwnerdSub) const +{ +// const NodeVec & owner_nodes = my_owner->get_nodes(); +// for ( int n = 0; n < my_num_nodes; n++ ) +// { +// krinolog << "node " << n << ", owner node phys_coords = " << owner_nodes[n]->coordinates()[0] << "," << owner_nodes[n]->coordinates()[1] << stk::diag::dendl; +// } + + std::vector owner_coords; + fill_node_owner_coords(my_owner, owner_coords); + + // Hard coded for linear simplex elements with constant transformations + const unsigned nnodes = num_nodes(); + ThrowAssert(my_master_elem.num_intg_pts() == nnodes); + const double * d_shape = my_master_elem.shape_fcn_deriv(); + + const int dim = spatial_dim(); + for ( int i = 0; i < dim; i++ ) + { + for ( int j = 0; j < dim; j++ ) + { + double & dOwnerdSub_ij = dOwnerdSub[i*dim + j]; + + dOwnerdSub_ij = 0.0; + for ( unsigned n = 0; n < nnodes; n++ ) + { + dOwnerdSub_ij += owner_coords[n][i] * d_shape[n*dim + j]; + } + + //krinolog << "dOwnerdSub[" << i << "][" << j << "] = " << dOwnerdSub_ij << stk::diag::dendl; + } + } +} + +void +SubElement::determine_decomposed_elem_phase(const CDMesh & mesh) +{ + if(have_subelements()) + { + for(auto && subelem : my_subelements) + { + subelem->determine_decomposed_elem_phase(mesh); + } + // Phase for SubElement with subelements is left empty + return; + } + + if(!my_owner->have_interface()) + { + set_phase(my_owner->get_phase()); + } + else + { + const PhaseTag startPhase = my_phase.empty() ? my_owner->get_phase() : my_phase; + my_phase = update_phase(mesh, startPhase, my_owner->get_sorted_cutting_interfaces(), myInterfaceSigns); + } + + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "SubElement with nodes "; + for (auto && node : my_nodes) + krinolog << node->get_ancestry() << " "; + krinolog << "has phase " << my_phase << "\n"; + } +} + +std::vector SubElement::subelement_interface_signs(const InterfaceID interface, const int sign) const +{ + if (have_interface(interface) && sign != 0) + { + std::vector interfaceSigns = myInterfaceSigns; + interfaceSigns[my_owner->get_interface_index(interface)] = sign; + return interfaceSigns; + } + return myInterfaceSigns; +} + +void SubElement::initialize_interface_signs() +{ + myInterfaceSigns.assign(my_owner->get_num_interfaces(), 0); +} + +void SubElement::set_interface_signs(const std::vector & interfaceSigns) +{ + myInterfaceSigns = interfaceSigns; +} + +void SubElement::update_interface_signs(const InterfaceID interface, const int sign) +{ + set_interface_signs(subelement_interface_signs(interface, sign)); +} + +double +SubElement::relative_volume() const +{ /* %TRACE% */ /* %TRACE% */ + // This is a relative volume compared to the owner volume. + // Actually this is a relative volume if the "parametric" volume of the element is unity. + // Otherwise, it is off by a factor. + const int nelem = 1; + const int dim = spatial_dim(); + const int nint = my_master_elem.num_intg_pts(); + std::vector coords(my_nodes.size() * dim, 0.); + std::vector det_J(nint, 0.); + double error = 0.; + + // integration weights + const double * intg_weights = my_master_elem.intg_weights(); + + // load coords + int count = 0; + for ( auto && node : my_nodes ) + { + const Vector3d & owner_coords = node->owner_coords(my_owner); + for ( int j = 0; j < dim; j++ ) + { + coords[count++] = owner_coords[j]; + } + } + + // determinant at integration points + my_master_elem.determinant( dim, nelem, coords.data(), det_J.data(), &error ); + + double elem_volume = 0.; + for ( int ip = 0; ip < nint; ip++ ) + { + elem_volume += det_J[ip] * intg_weights[ip]; + } + + return elem_volume; +} + +double +SubElement::maximum_relative_angle() const +{ /* %TRACE% */ /* %TRACE% */ + // Find the maximum angle formed at the vertices in parametric coordinates. + // These are obviously differentt than that maximum angle in physical coordinates due to + // the shape of the owning element. + double max_angle = 0; + + const stk::topology topol = topology(); + const unsigned num_edges = topol.num_edges(); + for ( unsigned edge0 = 0; edge0 < num_edges; edge0++ ) + { + const unsigned * lnn0 = get_edge_node_ordinals(topol, edge0); + ThrowAssert( + 2 == topol.edge_topology(edge0).num_nodes() || 3 == topol.edge_topology(edge0).num_nodes()); + + for ( unsigned edge1 = edge0+1; edge1 < num_edges; edge1++ ) + { + const unsigned * lnn1 = get_edge_node_ordinals(topol, edge1); + ThrowAssert(2 == topol.edge_topology(edge1).num_nodes() || + 3 == topol.edge_topology(edge1).num_nodes()); + + int node0 = -1; + int node1 = -1; + if (lnn0[0] == lnn1[0]) + { + node0 = 0; node1 = 0; + } + else if (lnn0[0] == lnn1[1]) + { + node0 = 0; node1 = 1; + } + else if (lnn0[1] == lnn1[0]) + { + node0 = 1; node1 = 0; + } + else if (lnn0[1] == lnn1[1]) + { + node0 = 1; node1 = 1; + } + else + { + continue; + } + const Vector3d vec0 = my_nodes[lnn0[1-node0]]->owner_coords(my_owner) - my_nodes[lnn0[node0]]->owner_coords(my_owner); + const Vector3d vec1 = my_nodes[lnn1[1-node1]]->owner_coords(my_owner) - my_nodes[lnn1[node1]]->owner_coords(my_owner); + const double angle = std::acos( Dot(vec0.unit_vector(),vec1.unit_vector()) ); + + //if (angle > 2.4) + //{ + // krinolog << "DEBUG: bad angle = " << angle << " between edges=" << edge0 << "," << edge1 << " at node=" << lnn0[node0] << stk::diag::dendl; + //} + + if (angle > max_angle) + { + max_angle = angle; + } + } + } + + return max_angle; +} + +void +SubElement::decompose_edges(CDMesh & mesh, const InterfaceID interface_key) +{ /* %TRACE% */ /* %TRACE% */ + const std::string & owner_type = my_owner->topology().name(); + const std::string & sub_type = topology().name(); + ThrowRuntimeError("Subelement decomposition for subelement of type '" << sub_type + << "' which was generated from owning element of type '" << owner_type + << "' is missing the capability to generate conformal facets."); +} + +void +SubElement::find_refined_edges(std::vector & refined_edges) const +{ /* %TRACE% */ /* %TRACE% */ + + const stk::topology topol = topology(); + const unsigned num_edges = topol.num_edges(); + refined_edges.reserve(num_edges); + for ( unsigned edge = 0; edge < num_edges; edge++ ) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topol, edge); + + const int num_edge_nodes = topol.edge_topology(edge).num_nodes(); + ThrowRequire(2 == num_edge_nodes || 3 == num_edge_nodes); + + if ((2 == num_edge_nodes && + NULL != SubElementNode::common_child({my_nodes[edge_node_ordinals[0]], my_nodes[edge_node_ordinals[1]]})) || + (3 == num_edge_nodes && + (NULL != SubElementNode::common_child({my_nodes[edge_node_ordinals[0]], my_nodes[edge_node_ordinals[2]]}) || + NULL != SubElementNode::common_child({my_nodes[edge_node_ordinals[1]], my_nodes[edge_node_ordinals[2]]})))) + { + refined_edges.push_back(edge); + } + } +} + +int +SubElement::find_longest_bad_edge(std::vector & bad_edges) const +{ /* %TRACE% */ /* %TRACE% */ + + const stk::topology topol = topology(); + + const unsigned num_bad_edges = bad_edges.size(); + PointVec edge_midpt(num_bad_edges,Vector3d::ZERO); + + if (0 == num_bad_edges) return -1; + + double max_length = 0; + unsigned longest_bad_edge_index = 0; + for ( unsigned index = 0; index < num_bad_edges; index++ ) + { + const unsigned edge = bad_edges[index]; + + const unsigned * const lnn = get_edge_node_ordinals(topol, edge); + const int num_edge_nodes = topol.edge_topology(edge).num_nodes(); + + const SubElementNode * const node0 = my_nodes[lnn[0]]; + const SubElementNode * const node1 = my_nodes[lnn[1]]; + + const Vector3d & coord0 = node0->coordinates(); + const Vector3d & coord1 = node1->coordinates(); + + const double edge_straight_length = (coord0 - coord1).length(); + ThrowRequire(edge_straight_length > 0.0); + + if (2 == num_edge_nodes) + { + edge_midpt[index] = 0.5*(coord0 + coord1); + } + else + { + ThrowAssert (3 == num_edge_nodes); + edge_midpt[index] = my_nodes[lnn[0]]->coordinates(); + } + + // we need an absolute mechanism for selecting the edge to bisect so that all elements that share + // common edges will make the same decisions + if (utility::is_more(edge_straight_length,max_length)) + { + longest_bad_edge_index = index; + max_length = edge_straight_length; + } + else if (!utility::is_less(edge_straight_length,max_length)) // tie breaker + { + const Vector3d & edge_midside_coords = edge_midpt[index]; + // note that it is safe to assume that longest_bad_edge is already assigned if edge_length == max_length + const Vector3d longest_edge_midside_coords = edge_midpt[longest_bad_edge_index]; + + ThrowAssert((utility::is_not_equal(edge_midside_coords[0],longest_edge_midside_coords[0]) || + utility::is_not_equal(edge_midside_coords[1],longest_edge_midside_coords[1]))); + + if (utility::is_more(edge_midside_coords[0],longest_edge_midside_coords[0]) || + (!utility::is_less(edge_midside_coords[0],longest_edge_midside_coords[0]) && + (utility::is_more(edge_midside_coords[1],longest_edge_midside_coords[1])))) + { + longest_bad_edge_index = index; + max_length = edge_straight_length; + } + } + } + return bad_edges[longest_bad_edge_index]; +} + +int +SubElement::parent_side_id(const int iside) const +{ + return my_parent_side_ids[iside]; +} + +void +SubElement::debug_subelements(const NodeVec & lnodes, const InterfaceID & interface, const int case_id) const +{ /* %TRACE% */ /* %TRACE% */ + krinolog << "owner_id=" << my_owner->entityId() << ", after cutting with interface " << interface << ", case_id=" << case_id << stk::diag::dendl; + + for (unsigned n=0; nget_ancestry() << "]\n"; + } + } + krinolog << " interface signs = "; + const std::vector interfaces = my_owner->get_sorted_cutting_interfaces(); + ThrowRequire(interfaces.size() == myInterfaceSigns.size()); + for (unsigned i=0; idebug(); + } + krinolog << stk::diag::dendl; +} + +void +SubElement::debug() const +{ /* %TRACE% */ /* %TRACE% */ + const double sub_vol = relative_volume(); + krinolog << " owner_id=" << my_owner->entityId() << ", relative_volume=" << sub_vol << ", interface signs = "; + const std::vector interfaces = my_owner->get_sorted_cutting_interfaces(); + ThrowRequire(interfaces.size() == myInterfaceSigns.size()); + for (unsigned i=0; iget_ancestry() << "] with domains { "; + for (int domain : node->get_sorted_node_domains()) krinolog << domain << " "; + krinolog << "}\n"; + } + } + for (unsigned n=0; nhave_interface(interface) && (myInterfaceSigns[my_owner->get_interface_index(interface)] == 0); +} + +SubElement_Tri_6::SubElement_Tri_6( + const NodeVec & nodes, + const std::vector & parent_side_ids, + const Mesh_Element * owner) + : SubElement( stk::topology::TRIANGLE_6_2D, + nodes, + parent_side_ids, + owner) +{ /* %TRACE% */ /* %TRACE% */ +} + +SubElement_Tet_10::SubElement_Tet_10( + const NodeVec & nodes, + const std::vector & parent_side_ids, + const Mesh_Element * owner) + : SubElement( stk::topology::TETRAHEDRON_10, + nodes, + parent_side_ids, + owner) +{ /* %TRACE% */ /* %TRACE% */ +} + +SubElement_Tri_3::SubElement_Tri_3( + const NodeVec & nodes, + const std::vector & parent_side_ids, + const Mesh_Element * owner) + : SubElement( stk::topology::TRIANGLE_3_2D, + nodes, + parent_side_ids, + owner) +{ /* %TRACE% */ /* %TRACE% */ + +} + +void +SubElement_Tri_3::build_quadratic_subelements(CDMesh & mesh) +{ /* %TRACE% */ /* %TRACE% */ + + if ( my_subelements.size() > 0 ) + { + for ( auto && subelem : my_subelements ) + { + subelem->build_quadratic_subelements(mesh); + } + return; + } + + // create 1, 6-noded tri + NodeVec sub_nodes = my_nodes; + sub_nodes.resize(6,(SubElementNode *)NULL); + + sub_nodes[3] = mesh.create_midside_node(my_owner, my_nodes[0], my_nodes[1]); + sub_nodes[4] = mesh.create_midside_node(my_owner, my_nodes[1], my_nodes[2]); + sub_nodes[5] = mesh.create_midside_node(my_owner, my_nodes[2], my_nodes[0]); + + std::unique_ptr sub = std::make_unique( sub_nodes, my_parent_side_ids, my_owner ); + sub->set_interface_signs(get_interface_signs()); + add_subelement( std::move(sub) ); +} + +void SubElement_Tri_3::cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains) +{ + const std::vector weights{1.-pCoords[0]-pCoords[1], pCoords[0], pCoords[1]}; + + bool badCut = false; + for (auto && weight : weights) + { + if(weight < mesh.get_snapper().get_edge_tolerance()) + { + if (krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "Skipping cut of interior intersection point because of quality." << stk::diag::dendl; + badCut = true; + break; + } + } + + if (!badCut) + { + const SubElementNode * cutNode = mesh.create_child_internal_or_face_node( my_owner, my_nodes, weights ); + cutNode->set_node_domains(sortedDomains); + + NodeVec lnodes = my_nodes; + lnodes.push_back(cutNode); + + handle_tri(lnodes, get_interface_signs(), 0,1,3, 0,-1,-1, false,false,false); + handle_tri(lnodes, get_interface_signs(), 1,2,3, 1,-1,-1, false,false,false); + handle_tri(lnodes, get_interface_signs(), 2,0,3, 2,-1,-1, false,false,false); + } +} + +void +SubElement_Tri_3::determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) +{ + determine_node_signs_on_edge( mesh, interface_key, 0,1 ); + determine_node_signs_on_edge( mesh, interface_key, 1,2 ); + determine_node_signs_on_edge( mesh, interface_key, 2,0 ); +} + +void +SubElement_Tri_3::determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) +{ + // No-op, node scores are not used on tris +} + +void +SubElement_Tri_3::decompose_edges(CDMesh & mesh, const InterfaceID interface_key) +{ + process_edge( mesh, interface_key, 0,1 ); + process_edge( mesh, interface_key, 1,2 ); + process_edge( mesh, interface_key, 2,0 ); +} + +void +SubElement_Tri_3::fix_hanging_children(CDMesh & mesh, const InterfaceID & interface, const std::vector & edges_with_children) +{ + int edge_case_id = 0; + for (auto edge_with_children : edges_with_children) + { + edge_case_id += 1< node_signs = {{0, 0, 0}}; + + if (edge_case_id == 0) // uncut subelement + { + if (my_nodes[0]->node_sign_is_set()) node_signs[0] = my_nodes[0]->get_node_sign(); + if (my_nodes[1]->node_sign_is_set()) node_signs[1] = my_nodes[1]->get_node_sign(); + if (my_nodes[2]->node_sign_is_set()) node_signs[2] = my_nodes[2]->get_node_sign(); + + if (!(node_signs[0] >= 0 && node_signs[1] >= 0 && node_signs[2] >= 0) && + !(node_signs[0] <= 0 && node_signs[1] <= 0 && node_signs[2] <= 0)) + { + return; + } + } + else + { + for (auto && edge_with_child : edges_with_children) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topology(), edge_with_child); + const int i0 = edge_node_ordinals[0]; + const int i1 = edge_node_ordinals[1]; + node_signs[i0] = my_nodes[i0]->get_node_sign(); + node_signs[i1] = my_nodes[i1]->get_node_sign(); + } + } + + perform_decomposition(mesh, interface, node_signs); +} + +void +SubElement_Tri_3::perform_decomposition(CDMesh & mesh, const InterfaceID interface_key, const std::array & node_signs) +{ /* %TRACE% */ /* %TRACE% */ + + const int case_id = + (node_signs[0]+1) + + (node_signs[1]+1)*3 + + (node_signs[2]+1)*9; + + NodeVec lnodes = my_nodes; + lnodes.resize(6,(SubElementNode *)NULL); + + static const unsigned case_permutations[] = + { 0, 0, 0, 2, 0, 0, 2, 1, 1, 1, // 0-9 + 1, 2, 2, 0, 2, 2, 1, 1, 1, 1, // 10-19 + 2, 0, 0, 2, 0, 0, 0 }; // 20-26 + static const unsigned permute_case_ids[] = + { 0, 1, 2, 1, 4, 5, 2,21,24, 1, // 0-9 + 4,21, 4,13,22, 5,22,25, 2, 5, // 10-19 + 24,21,22,25,24,25,26 }; // 20-26 + + stk::topology topo = stk::topology::TRIANGLE_6_2D; + std::vector permute(6); + topo.permutation_node_ordinals(case_permutations[case_id], permute.begin()); + + const unsigned i0 = permute[0]; + const unsigned i1 = permute[1]; + const unsigned i2 = permute[2]; + const unsigned i3 = permute[3]; + const unsigned i5 = permute[5]; + + // nodes and sides permute the same way + const unsigned s0 = permute[0]; + const unsigned s1 = permute[1]; + const unsigned s2 = permute[2]; + + const int permute_case_id = permute_case_ids[case_id]; + + // FIXME: Remove this diagnostic + std::vector node_val(3); + node_val[2] = case_id/9; + node_val[1] = (case_id-9*node_val[2])/3; + node_val[0] = case_id-9*node_val[2]-3*node_val[1]; + ThrowRequire(permute_case_id == (node_val[i0] + node_val[i1]*3 + node_val[i2]*9)); + + const Simplex_Generation_Method simplexMethod = mesh.get_cdfem_support().get_simplex_generation_method(); + +// krinolog << "case_id, permute_case_id = " << case_id << ", " << permute_case_id << stk::diag::dendl; + + switch (permute_case_id) + { + case 0: // ls[0]<0 && ls[1]<0 && ls[2]<0 + case 1: // ls[0]=0 && ls[1]<0 && ls[2]<0 + { + update_interface_signs(interface_key, -1); + } + break; + + case 13: // ls[0]=0 && ls[1]=0 && ls[2]=0 + case 25: // ls[0]=0 && ls[1]>0 && ls[2]>0 + case 26: // ls[0]>0 && ls[1]>0 && ls[2]>0 + { + update_interface_signs(interface_key, +1); + } + break; + + case 2: // ls[0]>0 && ls[1]<0 && ls[2]<0 + case 24: // ls[0]<0 && ls[1]>0 && ls[2]>0 + { + lnodes[i3] = SubElementNode::common_child({lnodes[i0], lnodes[i1]}); + lnodes[i5] = SubElementNode::common_child({lnodes[i2], lnodes[i0]}); + ThrowRequire(nullptr != lnodes[i3] && nullptr != lnodes[i5]); + + const bool diag = determine_diagonal_for_cut_triangle(simplexMethod, lnodes, i0, i1, i2, i3, i5); + + const int sign = (permute_case_id==2) ? 1 : -1; + handle_tri(lnodes, subelement_interface_signs(interface_key, sign), i0,i3,i5, s0,-1,s2, false,true,false); + handle_quad(mesh, lnodes, subelement_interface_signs(interface_key, -sign), i3,i1,i2,i5, s0,s1,s2,-1, false,false,false,true, diag); + } + break; + + case 4: // ls[0]=0 && ls[1]=0 && ls[2]<0 + case 22: // ls[0]=0 && ls[1]=0 && ls[2]>0 + { + const int sign = (permute_case_id==4) ? -1 : 1; + update_interface_signs(interface_key, sign); + } + break; + + case 5: // ls[0]>0 && ls[1]=0 && ls[2]<0 + case 21: // ls[0]<0 && ls[1]=0 && ls[2]>0 + { + lnodes[i5] = SubElementNode::common_child({lnodes[i2], lnodes[i0]}); + ThrowRequire(nullptr != lnodes[i5]); + + const int sign = (permute_case_id==5) ? 1 : -1; + handle_tri(lnodes, subelement_interface_signs(interface_key, sign), i1,i5,i0, -1,s2,s0, true,false,false); + handle_tri(lnodes, subelement_interface_signs(interface_key, -sign), i5,i1,i2, -1,s1,s2, true,false,false); + } + break; + + default: ThrowRuntimeError("Subelement decomposition error. case_id,permute_case_id=" << case_id << "," << permute_case_id); + } + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + debug_subelements(lnodes, interface_key, case_id); + } +} + +bool +SubElement_Tri_3::determine_diagonal_for_cut_triangle(const Simplex_Generation_Method & simplexMethod, const NodeVec & lnodes, const int i0, const int i1, const int i2, const int i3, const int i5) +{ + /* + * 2 o + * / \ + * 5 o \ + * / \ \ + * o---o---o + * 0 3 1 + */ + + // true: connect nodes 3 and 2 + // false: connect nodes 5 and 1 + + if (simplexMethod == CUT_QUADS_BY_GLOBAL_IDENTIFIER) + { + SubElementNodeAncestry ancestry1 = lnodes[i1]->get_ancestry(); + SubElementNodeAncestry ancestry2 = lnodes[i2]->get_ancestry(); + + return ancestry2 < ancestry1; + } + else + { + ThrowRequire(simplexMethod == CUT_QUADS_BY_LARGEST_ANGLE); + + // Angle-based scheme + // Select diagonal that cuts largest angle in quad. Since there isn't an issue with + // conforming, this is always possible (unlike tet). + const int config = ElementObj::evaluate_quad(lnodes[i3],lnodes[i1],lnodes[i2],lnodes[i5]); + return (config == -1); + } +} + +void +SubElement_Tri_3::handle_tri( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, + const int s0, const int s1, const int s2, + const bool is_interface0, const bool is_interface1, const bool is_interface2) +{ + ThrowRequire(!is_degenerate(lnodes, i0,i1,i2)); + + NodeVec sub_nodes(3,(SubElementNode *)NULL); + std::vector sub_parent_ids(3); + + sub_nodes[0] = lnodes[i0]; + sub_nodes[1] = lnodes[i1]; + sub_nodes[2] = lnodes[i2]; + sub_parent_ids[0] = (s0>= 0) ? my_parent_side_ids[s0] : -1; + sub_parent_ids[1] = (s1>= 0) ? my_parent_side_ids[s1] : -1; + sub_parent_ids[2] = (s2>= 0) ? my_parent_side_ids[s2] : -1; + + std::unique_ptr sub = std::make_unique( sub_nodes, sub_parent_ids, my_owner); + sub->set_interface_signs(subInterfaceSigns); + add_subelement( std::move(sub) ); +} + +void +SubElement_Tri_3::handle_quad( CDMesh & mesh, + NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, + const int s0, const int s1, const int s2, const int s3, + const bool is_interface0, const bool is_interface1, const bool is_interface2, const bool is_interface3, + const bool face ) +{ +#if 1 + if (face) + { + handle_tri( lnodes, subInterfaceSigns, i0,i1,i2, s0,s1,-1, is_interface0,is_interface1,false ); + handle_tri( lnodes, subInterfaceSigns, i2,i3,i0, s2,s3,-1, is_interface2,is_interface3,false ); + } + else + { + handle_tri( lnodes, subInterfaceSigns, i0,i1,i3, s0,-1,s3, is_interface0,false,is_interface3 ); + handle_tri( lnodes, subInterfaceSigns, i2,i3,i1, s2,-1,s1, is_interface2,false,is_interface1 ); + } +#else + NodeVec quad_nodes; + std::vector weights; + const double x0 = 0; + const double y0 = 0; + + quad_nodes.push_back(lnodes[i0]); + weights.push_back(0.25*(1-x0)*(1-y0)); + quad_nodes.push_back(lnodes[i1]); + weights.push_back(0.25*(1+x0)*(1-y0)); + quad_nodes.push_back(lnodes[i2]); + weights.push_back(0.25*(1+x0)*(1+y0)); + quad_nodes.push_back(lnodes[i3]); + weights.push_back(0.25*(1-x0)*(1+y0)); + + lnodes[6] = mesh.create_internal_node( my_owner, quad_nodes, weights ); + + handle_tri(lnodes, ls_index, sign, i0,i1,6, s0,-1,-1); + handle_tri(lnodes, ls_index, sign, i1,i2,6, s1,-1,-1); + handle_tri(lnodes, ls_index, sign, i2,i3,6, s2,-1,-1); + handle_tri(lnodes, ls_index, sign, i3,i0,6, s3,-1,-1); +#endif +} + +bool +SubElement_Tri_3::is_degenerate( NodeVec & lnodes, + const int i0, const int i1, const int i2 ) +{ /* %TRACE% */ /* %TRACE% */ + + if ( lnodes[i0] == lnodes[i1] || + lnodes[i0] == lnodes[i2] || + lnodes[i1] == lnodes[i2] ) + { + // this tri is degenerate with two coincident nodes + return true; + } + + return false; +} + +SubElement_Tet_4::SubElement_Tet_4( + const NodeVec & nodes, + const std::vector & parent_side_ids, + const Mesh_Element * owner) + : SubElement( stk::topology::TETRAHEDRON_4, + nodes, + parent_side_ids, + owner) +{ /* %TRACE% */ /* %TRACE% */ +} + +void SubElement_Tet_4::cut_face_intersection_point_with_permutation(CDMesh & mesh, const std::array & permuteNodes, const std::array & permuteSides, const std::vector & faceNodeWeights, const std::vector & sortedDomains) +{ + const SubElementNode * cutNode = mesh.create_child_internal_or_face_node(my_owner, + {my_nodes[permuteNodes[0]], my_nodes[permuteNodes[1]], my_nodes[permuteNodes[2]]}, + {faceNodeWeights[0], faceNodeWeights[1], faceNodeWeights[2]}); + const auto & previousDomains = cutNode->get_sorted_node_domains(); + ThrowRequire(previousDomains.empty() || sortedDomains == previousDomains); + cutNode->set_node_domains(sortedDomains); + + NodeVec lnodes; + lnodes.reserve(5); + for (int i=0; i<4; ++i) + lnodes.push_back(my_nodes[permuteNodes[i]]); + lnodes.push_back(cutNode); + + handle_tet(lnodes, get_interface_signs(), 0,1,4,3, permuteSides[0],-1,-1,permuteSides[3]); + handle_tet(lnodes, get_interface_signs(), 1,2,4,3, permuteSides[1],-1,-1,permuteSides[3]); + handle_tet(lnodes, get_interface_signs(), 2,0,4,3, permuteSides[2],-1,-1,permuteSides[3]); +} + +void SubElement_Tet_4::cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains) +{ + const std::vector weights{1.-pCoords[0]-pCoords[1]-pCoords[2], pCoords[0], pCoords[1], pCoords[2]}; + + bool badCut = false; + for (auto && weight : weights) + { + if(weight < mesh.get_snapper().get_edge_tolerance()) + { + if (krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "Skipping cut of interior intersection point because of quality." << stk::diag::dendl; + badCut = true; + break; + } + } + + if (!badCut) + { + const SubElementNode * cutNode = mesh.create_child_internal_or_face_node( my_owner, my_nodes, weights ); + cutNode->set_node_domains(sortedDomains); + + NodeVec lnodes = my_nodes; + lnodes.push_back(cutNode); + + handle_tet(lnodes, get_interface_signs(), 0,3,1,4, -1,-1,-1,0); + handle_tet(lnodes, get_interface_signs(), 1,3,2,4, -1,-1,-1,1); + handle_tet(lnodes, get_interface_signs(), 0,2,3,4, -1,-1,-1,2); + handle_tet(lnodes, get_interface_signs(), 0,1,2,4, -1,-1,-1,3); + } +} + +void +SubElement_Tet_4::build_quadratic_subelements(CDMesh & mesh) +{ /* %TRACE% */ /* %TRACE% */ + + if ( my_subelements.size() > 0 ) + { + for ( auto && subelem : my_subelements ) + { + subelem->build_quadratic_subelements(mesh); + } + return; + } + + // create 1, 10-noded tet + NodeVec sub_nodes = my_nodes; + sub_nodes.resize(10,(SubElementNode *)NULL); + + const stk::topology tet10_topology = stk::topology::TETRAHEDRON_10; + + for (unsigned edge_i=0; edge_i sub = std::make_unique( sub_nodes, my_parent_side_ids, my_owner ); + sub->set_interface_signs(get_interface_signs()); + add_subelement( std::move(sub) ); +} + +struct FaceIntersection +{ + FaceIntersection(const int iFace, const Vector3d & coords, const std::vector & domains) + : face(iFace), + parametricCoords(coords), + sortedDomains(domains) {} + + int face; + Vector3d parametricCoords; + std::vector sortedDomains; +}; + +void +SubElement_Tet_4::cut_face_interior_intersection_points(CDMesh & mesh, const InterfaceID & interface1, const InterfaceID & interface2, int level) +{ /* %TRACE% */ /* %TRACE% */ + + if ( my_subelements.size() > 0 ) + { + for ( auto && subelem : my_subelements ) + { + subelem->cut_face_interior_intersection_points(mesh, interface1, interface2, level); + } + return; + } + + static constexpr std::array,4> permuteNodes{{ {{0,3,1,2}}, {{1,3,2,0}}, {{0,2,3,1}}, {{0,1,2,3}} }}; + static constexpr std::array,4> permuteSides{{ {{2,1,3,0}}, {{0,2,3,1}}, {{3,1,0,2}}, {{0,1,2,3}} }}; + + std::vector faceNodes(3); + // Note: this recursively cuts the first identified face interior intersection point + for (unsigned iFace=0; iFace faceIntersections; + my_owner->fill_face_interior_intersections(faceNodes, interface1, interface2, faceIntersections); + + for (auto && faceIntersection : faceIntersections) + { + const Vector3d & faceCoords = faceIntersection.parametricCoords; + const std::vector faceNodeWeights{1.-faceCoords[0]-faceCoords[1], faceCoords[0], faceCoords[1]}; + bool badCut = false; + for (auto && weight : faceNodeWeights) + { + if (weight < mesh.get_snapper().get_edge_tolerance()) + { + if (krinolog.shouldPrint(LOG_DEBUG)) + krinolog << "Skipping cut of interior face intersection point because of quality." << stk::diag::dendl; + badCut = true; + break; + } + } + if (!badCut) + { + ThrowRequireMsg(level < 8, "Face cut recursion level exceeded."); + cut_face_intersection_point_with_permutation(mesh, permuteNodes[iFace], permuteSides[iFace], faceNodeWeights, faceIntersection.sortedDomains); + cut_face_interior_intersection_points(mesh, interface1, interface2, ++level); + return; + } + } + } +} + +const unsigned ** +SubElement_Tet_4::get_permutation_side_ordinals() +{ + static const unsigned permutation_side_ordinals0[] = { 0, 1, 2, 3 }; + static const unsigned permutation_side_ordinals1[] = { 1, 2, 0, 3 }; + static const unsigned permutation_side_ordinals2[] = { 2, 0, 1, 3 }; + static const unsigned permutation_side_ordinals3[] = { 2, 1, 3, 0 }; + static const unsigned permutation_side_ordinals4[] = { 1, 3, 2, 0 }; + static const unsigned permutation_side_ordinals5[] = { 3, 2, 1, 0 }; + static const unsigned permutation_side_ordinals6[] = { 3, 1, 0, 2 }; + static const unsigned permutation_side_ordinals7[] = { 1, 0, 3, 2 }; + static const unsigned permutation_side_ordinals8[] = { 0, 3, 1, 2 }; + static const unsigned permutation_side_ordinals9[] = { 0, 2, 3, 1 }; + static const unsigned permutation_side_ordinals10[] = { 2, 3, 0, 1 }; + static const unsigned permutation_side_ordinals11[] = { 3, 0, 2, 1 }; + static const unsigned * permutation_side_ordinals[] = + { permutation_side_ordinals0 , permutation_side_ordinals1 , permutation_side_ordinals2, permutation_side_ordinals3 , permutation_side_ordinals4 , permutation_side_ordinals5 , + permutation_side_ordinals6 , permutation_side_ordinals7 , permutation_side_ordinals8, permutation_side_ordinals9, permutation_side_ordinals10, permutation_side_ordinals11 }; + return permutation_side_ordinals; +} + +double SubElement_Tet_4::tet_volume(const std::array & nodes) +{ + return Dot(nodes[3]-nodes[0],Cross(nodes[1]-nodes[0], nodes[2]-nodes[0]))/6.0; +} + +void +SubElement_Tet_4::fix_hanging_children(CDMesh & mesh, const InterfaceID & interface_key, const std::vector & edges_with_children) +{ + int edge_case_id = 0; + for (unsigned i=0; i node_signs = {{0, 0, 0, 0}}; + + if (edge_case_id == 0) // uncut subelement + { + if (my_nodes[0]->node_sign_is_set()) node_signs[0] = my_nodes[0]->get_node_sign(); + if (my_nodes[1]->node_sign_is_set()) node_signs[1] = my_nodes[1]->get_node_sign(); + if (my_nodes[2]->node_sign_is_set()) node_signs[2] = my_nodes[2]->get_node_sign(); + if (my_nodes[3]->node_sign_is_set()) node_signs[3] = my_nodes[3]->get_node_sign(); + + if (!(node_signs[0] >= 0 && node_signs[1] >= 0 && node_signs[2] >= 0 && node_signs[3] >= 0) && + !(node_signs[0] <= 0 && node_signs[1] <= 0 && node_signs[2] <= 0 && node_signs[3] <= 0)) + { + return; + } + } + else + { + for (auto && edge_with_child : edges_with_children) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(topology(), edge_with_child); + const int i0 = edge_node_ordinals[0]; + const int i1 = edge_node_ordinals[1]; + node_signs[i0] = my_nodes[i0]->get_node_sign(); + node_signs[i1] = my_nodes[i1]->get_node_sign(); + } + } + + perform_decomposition(mesh, interface_key, node_signs); + } + else + { + ThrowAssert(case_id == 2 || case_id == 3 || case_id == 4); + + static const int edge_case_permutations [] = + { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-9 + 2, 6, -1, -1, 5, -1, -1, -1, -1, -1, // 10-19 + 0, 8, 5, -1, -1, -1, 0, -1, 0, -1, // 20-29 + -1, -1, -1, 1, -1, 4, -1, 3, -1, -1, // 30-39 + -1, 2, 2, -1, -1, -1, -1, -1, -1, 1, // 40-49 + -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, // 50-59 + -1, -1, -1, -1 // 60-63 + }; + + const int permutation = edge_case_permutations[edge_case_id]; + ThrowRequire(permutation >= 0); + + stk::topology topo = stk::topology::TETRAHEDRON_10; + std::vector permute_nodes(10); + topo.permutation_node_ordinals(permutation, permute_nodes.begin()); + + const unsigned i0 = permute_nodes[0]; + const unsigned i1 = permute_nodes[1]; + const unsigned i2 = permute_nodes[2]; + const unsigned i3 = permute_nodes[3]; + const unsigned i5 = permute_nodes[5]; + const unsigned i6 = permute_nodes[6]; + const unsigned i7 = permute_nodes[7]; + const unsigned i8 = permute_nodes[8]; + + const unsigned ** permutation_side_ordinals = get_permutation_side_ordinals(); + const unsigned s0 = permutation_side_ordinals[permutation][0]; + const unsigned s1 = permutation_side_ordinals[permutation][1]; + const unsigned s2 = permutation_side_ordinals[permutation][2]; + const unsigned s3 = permutation_side_ordinals[permutation][3]; + + NodeVec lnodes = my_nodes; + lnodes.resize(10,(SubElementNode *)NULL); + + const int arbitrary_sign = 0; + const auto subInterfaceSigns = subelement_interface_signs(interface_key, arbitrary_sign); + const Simplex_Generation_Method simplexMethod = mesh.get_cdfem_support().get_simplex_generation_method(); + const bool globalIDsAreParallelConsistent = mesh.get_cdfem_support().get_global_ids_are_parallel_consistent(); + + if (case_id == 2) + { + lnodes[i6] = SubElementNode::common_child({lnodes[i0], lnodes[i2]}); + lnodes[i8] = SubElementNode::common_child({lnodes[i1], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i6] && nullptr != lnodes[i8]); + + + handle_tet( lnodes, subInterfaceSigns, i6,i2,i3,i8, -1,s1,-1,s2 ); + handle_tet( lnodes, subInterfaceSigns, i3,i0,i6,i8, s0,-1,-1,s2 ); + handle_tet( lnodes, subInterfaceSigns, i6,i0,i1,i8, -1,s0,-1,s3 ); + handle_tet( lnodes, subInterfaceSigns, i1,i2,i6,i8, s1,-1,-1,s3 ); + } + else if (case_id == 3) + { + lnodes[i6] = SubElementNode::common_child({lnodes[i0], lnodes[i2]}); + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + lnodes[i8] = SubElementNode::common_child({lnodes[i1], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i6] && nullptr != lnodes[i7] && nullptr != lnodes[i8]); + + const bool face0 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i3, i0, i1, i7, i8); + const bool face2 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i3, i2, i7, i6); + + // Connect 6-8 + handle_tet( lnodes, subInterfaceSigns, i1,i2,i6,i8, s1,-1,-1,s3 ); + handle_pyramid( lnodes, subInterfaceSigns, i1,i0,i7,i8,i6, s3,s2,-1,-1,s0, face0 ); + handle_pyramid( lnodes, subInterfaceSigns, i2,i3,i7,i6,i8, s1,s0,-1,-1,s2, face2 ); + } + else if (case_id == 4) + { + lnodes[i5] = SubElementNode::common_child({lnodes[i1], lnodes[i2]}); + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + lnodes[i8] = SubElementNode::common_child({lnodes[i1], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i5] && nullptr != lnodes[i7] && nullptr != lnodes[i8]); + + const bool face0 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i3, i0, i1, i7, i8); + const bool face1 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i1, i2, i3, i5, i8); + + // Connect 5-7 + handle_tet( lnodes, subInterfaceSigns, i0,i5,i2,i7, -1,-1,s2,s3 ); + handle_pyramid( lnodes, subInterfaceSigns, i1,i0,i7,i8,i5, s3,-1,-1,s1,s0, face0 ); + handle_pyramid( lnodes, subInterfaceSigns, i5,i8,i3,i2,i7, -1,s0,s2,-1,s1, face1 ); + } + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + debug_subelements(lnodes, interface_key, case_id); + } + } +} + +void +SubElement_Tet_4::determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) +{ + ThrowAssert(!have_subelements()); + determine_node_signs_on_edge( mesh, interface_key, 0,1 ); + determine_node_signs_on_edge( mesh, interface_key, 1,2 ); + determine_node_signs_on_edge( mesh, interface_key, 0,2 ); + determine_node_signs_on_edge( mesh, interface_key, 0,3 ); + determine_node_signs_on_edge( mesh, interface_key, 1,3 ); + determine_node_signs_on_edge( mesh, interface_key, 2,3 ); +} + +void +SubElement_Tet_4::determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) +{ + ThrowAssert(!have_subelements()); + + const Simplex_Generation_Method simplexMethod = mesh.get_cdfem_support().get_simplex_generation_method(); + if (simplexMethod == CUT_QUADS_BY_NEAREST_EDGE_CUT) + { + // nodal edge cut length based criterion + // Use globally consistent comparison at nodes based on the shortest relative edge length for the cut edges that use the node. + + // The general idea is to prefer edges that emanate away from nodes that have nearby cuts. This, for perfectly shaped elements, + // will cut the largest angles. + + determine_node_scores_on_edge( mesh, interface_key, 0,1 ); + determine_node_scores_on_edge( mesh, interface_key, 1,2 ); + determine_node_scores_on_edge( mesh, interface_key, 0,2 ); + determine_node_scores_on_edge( mesh, interface_key, 0,3 ); + determine_node_scores_on_edge( mesh, interface_key, 1,3 ); + determine_node_scores_on_edge( mesh, interface_key, 2,3 ); + } + else if (simplexMethod == CUT_QUADS_BY_LARGEST_ANGLE) + { + // nodal face angle criterion + // Use globally consistent comparison at nodes based on the largest angle for the cut faces that use the node. + // This does not rely on perfectly shaped elements to cut the larges angles. + + determine_node_scores_on_face( mesh, interface_key, 0,1,3 ); + determine_node_scores_on_face( mesh, interface_key, 1,2,3 ); + determine_node_scores_on_face( mesh, interface_key, 2,0,3 ); + determine_node_scores_on_face( mesh, interface_key, 2,0,3 ); + } +} + + +static std::pair get_quad_angle_measures(const Vector3d & x0, const Vector3d & x1, const Vector3d & x2, const Vector3d & x3) +{ + std::array sides{x1-x0, x2-x1, x3-x2, x0-x3}; + for (auto && side : sides) side.unitize(); + + // return measure02,measure13 where measureAB=std::max(-cos(A),-cos(B)) + return {std::max(Dot(sides[3],sides[0]), Dot(sides[1],sides[2])), std::max(Dot(sides[0],sides[1]), Dot(sides[2],sides[3]))}; +} + +static void determine_node_scores_on_triangle_face( const std::array & faceNodes ) +{ + /* + * 2 o + * / \ + * / o 4 + * / / \ + * o---o---o + * 0 3 1 + */ + + const std::pair measure23Andmeasure04 = get_quad_angle_measures(faceNodes[2]->coordinates(), faceNodes[0]->coordinates(), faceNodes[3]->coordinates(), faceNodes[4]->coordinates()); + faceNodes[2]->set_node_score(measure23Andmeasure04.first); + faceNodes[0]->set_node_score(measure23Andmeasure04.second); +} + +void +SubElement_Tet_4::determine_node_scores_on_face( const CDMesh & mesh, const InterfaceID interface, const int i0, const int i1, const int i2 ) +{ + + const SubElementNode * parent0 = my_nodes[i0]; + const SubElementNode * parent1 = my_nodes[i1]; + const SubElementNode * parent2 = my_nodes[i2]; + + if (parent0->get_node_on_interface() || parent1->get_node_on_interface() || parent2->get_node_on_interface()) return; + + const SubElementNode * child0 = SubElementNode::common_child({parent0, parent1}); + const SubElementNode * child1 = SubElementNode::common_child({parent1, parent2}); + const SubElementNode * child2 = SubElementNode::common_child({parent2, parent0}); + + const int caseId = + ((child0 == nullptr) ? 0 : 1) + + ((child1 == nullptr) ? 0 : 2) + + ((child2 == nullptr) ? 0 : 4); + + if (caseId == 3) + determine_node_scores_on_triangle_face({parent0, parent1, parent2, child0, child1}); + else if (caseId == 5) + determine_node_scores_on_triangle_face({parent2, parent0, parent1, child2, child0}); + else if (caseId == 6) + determine_node_scores_on_triangle_face({parent1, parent2, parent0, child1, child2}); +} + +void +SubElement_Tet_4::decompose_edges(CDMesh & mesh, const InterfaceID interface_key) +{ /* %TRACE% */ /* %TRACE% */ + + process_edge( mesh, interface_key, 0,1 ); + process_edge( mesh, interface_key, 1,2 ); + process_edge( mesh, interface_key, 0,2 ); + process_edge( mesh, interface_key, 0,3 ); + process_edge( mesh, interface_key, 1,3 ); + process_edge( mesh, interface_key, 2,3 ); +} + +void +SubElement_Tet_4::perform_decomposition(CDMesh & mesh, const InterfaceID interface_key, const std::array & node_signs) +{ /* %TRACE% */ /* %TRACE% */ + + // create between 4 to 6 conforming tetrahedral subelements + + const int case_id = + (node_signs[0]+1) + + (node_signs[1]+1)*3 + + (node_signs[2]+1)*9 + + (node_signs[3]+1)*27; + + NodeVec lnodes = my_nodes; + lnodes.resize(10,(SubElementNode *)NULL); + + static const unsigned case_permutations[] = + { 0, 0, 0, 1, 0, 0, 1, 5, 0, 2, // 0-9 + 2, 6, 1, 0, 0, 1, 1,10, 2, 2, // 10-19 + 2,11, 2, 4, 1, 8, 4, 4, 3, 3, // 20-29 + 4, 3, 3, 9, 5, 7, 7, 6, 6, 9, // 30-39 + 0, 9, 9, 6, 7, 7, 7, 9,11, 3, // 40-49 + 4, 3, 3, 4, 4, 8, 3, 4, 4,11, // 50-59 + 4, 2, 2,10, 8, 1,10, 0, 1, 6, // 60-69 + 2, 2, 7, 5, 1, 0, 0, 1, 0, 0, // 70-79 + 0 }; // 80 + + stk::topology topo = stk::topology::TETRAHEDRON_10; + std::vector permute_nodes(10); + topo.permutation_node_ordinals(case_permutations[case_id], permute_nodes.begin()); + + const unsigned i0 = permute_nodes[0]; + const unsigned i1 = permute_nodes[1]; + const unsigned i2 = permute_nodes[2]; + const unsigned i3 = permute_nodes[3]; + const unsigned i4 = permute_nodes[4]; + const unsigned i5 = permute_nodes[5]; + const unsigned i6 = permute_nodes[6]; + const unsigned i7 = permute_nodes[7]; + const unsigned i8 = permute_nodes[8]; + + const unsigned ** permutation_side_ordinals = get_permutation_side_ordinals(); + const unsigned s0 = permutation_side_ordinals[case_permutations[case_id]][0]; + const unsigned s1 = permutation_side_ordinals[case_permutations[case_id]][1]; + const unsigned s2 = permutation_side_ordinals[case_permutations[case_id]][2]; + const unsigned s3 = permutation_side_ordinals[case_permutations[case_id]][3]; + + static const unsigned permute_case_ids[] = + { 0, 1, 2, 1, 4, 5, 2, 5, 8, 1, // 0-9 + 4, 5, 4,13,14, 5,14,75, 2, 5, // 10-19 + 8, 5,14,75, 8,75,78, 1, 4, 5, // 20-29 + 4,13,14, 5,14,75, 4,13,14,13, // 30-39 + 40,67,14,67,76, 5,14,75,14,67, // 40-49 + 76,75,76,79, 2, 5, 8, 5,14,75, // 50-59 + 8,75,78, 5,14,75,14,67,76,75, // 60-69 + 76,79, 8,75,78,75,76,79,78,79, // 70-79 + 80 }; // 80 + + const int permute_case_id = permute_case_ids[case_id]; + + // FIXME: Remove this diagnostic + std::vector node_val(4); + node_val[3] = case_id/27; + node_val[2] = (case_id-27*node_val[3])/9; + node_val[1] = (case_id-27*node_val[3]-9*node_val[2])/3; + node_val[0] = case_id-27*node_val[3]-9*node_val[2]-3*node_val[1]; + ThrowRequire(permute_case_id == (node_val[i0] + node_val[i1]*3 + node_val[i2]*9 + node_val[i3]*27)); + + const Simplex_Generation_Method simplexMethod = mesh.get_cdfem_support().get_simplex_generation_method(); + const bool globalIDsAreParallelConsistent = mesh.get_cdfem_support().get_global_ids_are_parallel_consistent(); + + //krinolog << "permute_case_id " << permute_case_id << stk::diag::dendl; + + switch (permute_case_id) + { + case 0: // ls[0]<0 && ls[1]<0 && ls[2]<0 && ls[3]<0 + case 1: // ls[0]=0 && ls[1]<0 && ls[2]<0 && ls[3]<0 + case 4: // ls[0]=0 && ls[1]=0 && ls[2]<0 && ls[3]<0 + { + update_interface_signs(interface_key, -1); + } + break; + + case 40: // ls[0]=0 && ls[1]=0 && ls[2]=0 && ls[3]=0 + case 76: // ls[0]=0 && ls[1]=0 && ls[2]>0 && ls[3]>0 + case 79: // ls[0]=0 && ls[1]>0 && ls[2]>0 && ls[3]>0 + case 80: // ls[0]>0 && ls[1]>0 && ls[2]>0 && ls[3]>0 + { + update_interface_signs(interface_key, +1); + } + break; + + case 2: // ls[0]>0 && ls[1]<0 && ls[2]<0 && ls[3]<0 + case 78: // ls[0]<0 && ls[1]>0 && ls[2]>0 && ls[3]>0 + { + const int sign = (permute_case_id==2) ? -1 : 1; + + lnodes[i4] = SubElementNode::common_child({lnodes[i0], lnodes[i1]}); + lnodes[i6] = SubElementNode::common_child({lnodes[i0], lnodes[i2]}); + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i4] && nullptr != lnodes[i6] && nullptr != lnodes[i7]); + + // face0: true: connect 4 and 3, false: connect 7 and 1 + // face2: true: connect 7 and 2, false: connect 6 and 3 + // face3: true: connect 6 and 1, false: connect 4 and 2 + const bool face0 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i1, i3, i4, i7); + const bool face2 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i3, i2, i7, i6); + const bool face3 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i2, i1, i6, i4); + + handle_tet( lnodes, subelement_interface_signs(interface_key, -sign), i6,i4,i7,i0, s3,s0,s2,-1 ); + handle_wedge( mesh, lnodes, subelement_interface_signs(interface_key, sign), i4,i7,i6,i1,i3,i2, s0,s2,s3,-1,s1, face0,face2,!face3 ); + } + break; + + case 5: // ls[0]>0 && ls[1]=0 && ls[2]<0 && ls[3]<0 + case 75: // ls[0]<0 && ls[1]=0 && ls[2]>0 && ls[3]>0 + { + const int sign = (permute_case_id==5) ? -1 : 1; + + lnodes[i6] = SubElementNode::common_child({lnodes[i0], lnodes[i2]}); + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i6] && nullptr != lnodes[i7]); + + // face2: true: connect 7 and 2, false: connect 6 and 3 + const bool face2 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i3, i2, i7, i6); + + handle_tet( lnodes, subelement_interface_signs(interface_key, -sign), i6,i1,i7,i0, s3,s0,s2,-1 ); + handle_pyramid( lnodes, subelement_interface_signs(interface_key, sign), i7,i6,i2,i3,i1, -1,s3,s1,s0,s2, face2 ); + } + break; + + case 8: // ls[0]>0 && ls[1]>0 && ls[2]<0 && ls[3]<0 + { + lnodes[i5] = SubElementNode::common_child({lnodes[i1], lnodes[i2]}); + lnodes[i6] = SubElementNode::common_child({lnodes[i0], lnodes[i2]}); + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + lnodes[i8] = SubElementNode::common_child({lnodes[i1], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i5] && nullptr != lnodes[i6] && nullptr != lnodes[i7] && nullptr != lnodes[i8]); + + // face0: true: connect 7 and 1, false: connect 8 and 0 + // face1: true: connect 5 and 3, false: connect 8 and 2 + // face2: true: connect 7 and 2, false: connect 6 and 3 + // face3: true: connect 5 and 0, false: connect 6 and 1 + const bool face0 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i3, i0, i1, i7, i8); + const bool face1 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i1, i2, i3, i5, i8); + const bool face2 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i0, i3, i2, i7, i6); + const bool face3 = determine_diagonal_for_cut_triangular_face(simplexMethod, globalIDsAreParallelConsistent, lnodes, i2, i1, i0, i5, i6); + + // face 4: true: connect 6 and 8, false: connect 7 and 5 + const bool face4 = ElementObj::determine_diagonal_for_internal_quad_of_cut_tet_from_edge_nodes(simplexMethod, lnodes[i8], lnodes[i5], lnodes[i6], lnodes[i7], + face0, face1, face2, face3); + + ThrowAssert( mesh.num_ls_fields() > 1 || + simplexMethod != CUT_QUADS_BY_GLOBAL_IDENTIFIER || + face4 == ElementObj::determine_diagonal_for_internal_quad_of_cut_tet_from_owner_nodes(lnodes[i0], lnodes[i1], lnodes[i2], lnodes[i3]) ); + + handle_wedge( mesh, lnodes, subelement_interface_signs(interface_key, -1), i8,i3,i7,i5,i2,i6, s1,s2,-1,s0,s3, !face1,!face2,face4 ); + handle_wedge( mesh, lnodes, subelement_interface_signs(interface_key, 1), i8,i1,i5,i7,i0,i6, s0,s3,-1,s1,s2, !face0,!face3,face4 ); + } + break; + + case 13: // ls[0]=0 && ls[1]=0 && ls[2]=0 && ls[3]<0 + case 67: // ls[0]=0 && ls[1]=0 && ls[2]=0 && ls[3]>0 + { + const int sign = (permute_case_id==13) ? -1 : 1; + update_interface_signs(interface_key, sign); + } + break; + + case 14: // ls[0]>0 && ls[1]=0 && ls[2]=0 && ls[3]<0 + { + lnodes[i7] = SubElementNode::common_child({lnodes[i0], lnodes[i3]}); + ThrowRequire(nullptr != lnodes[i7]); + + handle_tet( lnodes, subelement_interface_signs(interface_key, 1), i1,i7,i2,i0, s0,s2,s3,-1 ); + handle_tet( lnodes, subelement_interface_signs(interface_key, -1), i2,i7,i1,i3, s2,s0,s1,-1 ); + } + break; + + default: ThrowRuntimeError("Subelement decomposition error."); + } + + if (krinolog.shouldPrint(LOG_DEBUG)) + { + debug_subelements(lnodes, interface_key, case_id); + } +} + +bool SubElement_Tet_4::determine_diagonal_for_cut_triangular_face(const Simplex_Generation_Method & simplexMethod, const bool globalIDsAreParallelConsistent, const NodeVec & lnodes, const int i0, const int i1, const int i2, const int i3, const int i5) +{ + /* + * 2 o + * / \ + * 5 o \ + * / \ \ + * o---o---o + * 0 3 1 + */ + + // true: connect nodes 3 and 2 + // false: connect nodes 5 and 1 + + if (simplexMethod == CUT_QUADS_BY_GLOBAL_IDENTIFIER) + { + return lnodes[i2]->get_ancestry() < lnodes[i1]->get_ancestry(); + } + else + { + ThrowRequire(simplexMethod == CUT_QUADS_BY_LARGEST_ANGLE || simplexMethod == CUT_QUADS_BY_NEAREST_EDGE_CUT); + return SubElementNode::higher_priority_by_score_then_ancestry(*lnodes[i2],*lnodes[i1], globalIDsAreParallelConsistent); + } +} + +void +SubElement::get_edge_position( + const SubElementNode * n0, + const SubElementNode * n1, + const SubElementNode * n2, + double & position ) +{ + const SubElementEdgeNode * edge_child = dynamic_cast( n2 ); + ThrowRequire(NULL != edge_child); + position = edge_child->get_position(n0,n1); +} + +void +SubElement_Tet_4::handle_pyramid( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, const int i4, + const int s0, const int s1, const int s2, const int s3, const int s4, + const bool face4 ) +{ + if (face4) + { + handle_tet( lnodes, subInterfaceSigns, i0,i1,i2,i4, s0,s1,-1,s4 ); + handle_tet( lnodes, subInterfaceSigns, i2,i3,i0,i4, s2,s3,-1,s4 ); + } + else + { + handle_tet( lnodes, subInterfaceSigns, i0,i1,i3,i4, s0,-1,s3,s4 ); + handle_tet( lnodes, subInterfaceSigns, i2,i3,i1,i4, s2,-1,s1,s4 ); + } +} + +void +SubElement_Tet_4::handle_tet( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, + const int s0, const int s1, const int s2, const int s3) +{ + ThrowRequire(!is_degenerate(lnodes, i0,i1,i2,i3)); + + NodeVec sub_nodes(4,(SubElementNode *)NULL); + std::vector sub_parent_ids(4); + + sub_nodes[0] = lnodes[i0]; + sub_nodes[1] = lnodes[i1]; + sub_nodes[2] = lnodes[i2]; + sub_nodes[3] = lnodes[i3]; + sub_parent_ids[0] = (s0>= 0) ? my_parent_side_ids[s0] : -1; + sub_parent_ids[1] = (s1>= 0) ? my_parent_side_ids[s1] : -1; + sub_parent_ids[2] = (s2>= 0) ? my_parent_side_ids[s2] : -1; + sub_parent_ids[3] = (s3>= 0) ? my_parent_side_ids[s3] : -1; + + std::unique_ptr sub = std::make_unique( sub_nodes, sub_parent_ids, my_owner); + sub->set_interface_signs(subInterfaceSigns); + add_subelement( std::move(sub) ); +} + +void +SubElement_Tet_4::handle_wedge( CDMesh & mesh, + NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, const int i4, const int i5, + const int s0, const int s1, const int s2, const int s3, const int s4, + const bool face0, const bool face1, const bool face2 ) +{ +/* + * PARENT Linear 6-Node Wedge Nodes + * 5 (SPACE_DIM=3!) + * . o + * . / \ + * . / \ Face_Quad_4_3D() 0-1-4-3 + * . / \ Face_Quad_4_3D() 1-2-5-4 + * . / \ Face_Quad_4_3D() 0-3-5-2 + * 2 . o---------o 4 Face_Tri_3_3D() 0-2-1 + * o . 3 . Face_Tri_3_3D() 3-4-5 + * /.\ . + * /. \ . + * /. \ . + * /. \ . + * o---------o + * 0 1 + * + */ + // face0: true: connect 0 and 4, false: connect 1 and 3 + // face1: true: connect 1 and 5, false: connect 2 and 4 + // face2: true: connect 0 and 5, false: connect 2 and 3 + + std::vector wedge_nodes(6); + wedge_nodes[0] = i0; + wedge_nodes[1] = i1; + wedge_nodes[2] = i2; + wedge_nodes[3] = i3; + wedge_nodes[4] = i4; + wedge_nodes[5] = i5; + + std::vector wedge_sides(5); + wedge_sides[0] = s0; + wedge_sides[1] = s1; + wedge_sides[2] = s2; + wedge_sides[3] = s3; + wedge_sides[4] = s4; + + // Each of the 3 quad faces can be subdivided in 2 ways, giving a total of 8 possible decompositions. + // 2 of these are illegal, however, since they don't result in tetrahedra. + + static const unsigned tet_nodes0[] = { 0,5,4,3, 0,2,1,5, 0,1,4,5 }; + static const unsigned tet_nodes1[] = { 1,3,5,4, 1,0,2,5, 1,0,5,3 }; + static const unsigned tet_nodes2[] = { 0,5,4,3, 0,2,1,4, 0,2,4,5 }; + static const unsigned tet_nodes3[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0 }; // illegal + static const unsigned tet_nodes4[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0 }; // illegal + static const unsigned tet_nodes5[] = { 1,3,5,4, 1,0,2,3, 1,2,5,3 }; + static const unsigned tet_nodes6[] = { 2,4,3,5, 2,1,0,4, 2,0,3,4 }; + static const unsigned tet_nodes7[] = { 2,4,3,5, 2,1,0,3, 2,1,3,4 }; + static const unsigned * tet_node_map[] = { tet_nodes0 , tet_nodes1 , tet_nodes2, tet_nodes3 , tet_nodes4 , tet_nodes5, tet_nodes6, tet_nodes7 }; + + static const int tet_sides0[] = { 2, 4, 0,-1, 2, 1,-1, 3, -1, 1,-1, 0 }; + static const int tet_sides1[] = { 0, 4, 1,-1, -1, 2, 1, 3, 0, 2,-1,-1 }; + static const int tet_sides2[] = { 2, 4, 0,-1, -1, 1, 0, 3, 2, 1,-1,-1 }; + static const int tet_sides3[] = {-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 }; // illegal + static const int tet_sides4[] = {-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 }; // illegal + static const int tet_sides5[] = { 0, 4, 1,-1, 0, 2,-1, 3, -1, 2,-1, 1 }; + static const int tet_sides6[] = { 1, 4, 2,-1, 1, 0,-1, 3, -1, 0,-1, 2 }; + static const int tet_sides7[] = { 1, 4, 2,-1, -1, 0, 2, 3, 1, 0,-1,-1 }; + static const int * tet_side_map[] = { tet_sides0 , tet_sides1 , tet_sides2 , tet_sides3 , tet_sides4 , tet_sides5, tet_sides6, tet_sides7 }; + + const unsigned case_id = + (face0 ? 0 : 1) + + (face1 ? 0 : 2) + + (face2 ? 0 : 4); + + //krinolog << "Wedge case_id = " << case_id << stk::diag::dendl; + + if (case_id < 3 || case_id > 4) + { + const unsigned * tet_nodes = tet_node_map[case_id]; + const int * tet_sides = tet_side_map[case_id]; + + unsigned lnn[12]; + int lsn[12]; + + for (int n=0; n<12; ++n) + { + lnn[n] = wedge_nodes[tet_nodes[n]]; + lsn[n] = (tet_sides[n]<0) ? -1 : wedge_sides[tet_sides[n]]; + } + + handle_tet(lnodes, subInterfaceSigns, lnn[0], lnn[1], lnn[2], lnn[3], lsn[0], lsn[1], lsn[2], lsn[3]); + handle_tet(lnodes, subInterfaceSigns, lnn[4], lnn[5], lnn[6], lnn[7], lsn[4], lsn[5], lsn[6], lsn[7]); + handle_tet(lnodes, subInterfaceSigns, lnn[8], lnn[9], lnn[10], lnn[11], lsn[8], lsn[9], lsn[10], lsn[11]); + } + else + { + ThrowRequire(case_id == 3 || case_id == 4); + if(krinolog.shouldPrint(LOG_DEBUG)) krinolog << "Schonhardt's polyhedron formed, Adding Steiner point." << "\n"; + + // Schonhardt's polyhedra should never be forced now that diagonals are cut using a globally consistent nodal criterion + ThrowRequireMsg(false, "Schonhardt polyhedron found. This should not happen."); + + NodeVec wedge_nodevec(6); + wedge_nodevec[0] = lnodes[i0]; + wedge_nodevec[1] = lnodes[i1]; + wedge_nodevec[2] = lnodes[i2]; + wedge_nodevec[3] = lnodes[i3]; + wedge_nodevec[4] = lnodes[i4]; + wedge_nodevec[5] = lnodes[i5]; + + const Vector3d & v0 = lnodes[i0]->owner_coords(my_owner); + const Vector3d & v1 = lnodes[i1]->owner_coords(my_owner); + const Vector3d & v2 = lnodes[i2]->owner_coords(my_owner); + const Vector3d & v3 = lnodes[i3]->owner_coords(my_owner); + const Vector3d & v4 = lnodes[i4]->owner_coords(my_owner); + const Vector3d & v5 = lnodes[i5]->owner_coords(my_owner); + + std::vector weights(6); + + // Use the centroid of 1 of the elements that will be within the volume of the wedge depending + // on which way that face2 is cut (which is on the internal quad, which may be non-planar). + // This is not guaranteed, however, to always produce tets that stay within the deformed wedge. + if (face2) + { + weights[0] = 1./4.; + weights[1] = 1./4.; + weights[4] = 1./4.; + weights[5] = 1./4.; + } + else + { + weights[1] = 1./4.; + weights[2] = 1./4.; + weights[3] = 1./4.; + weights[4] = 1./4.; + } + + const SubElementNode * centroid = mesh.create_steiner_node( my_owner, wedge_nodevec, weights ); + + const int i6 = lnodes.size(); + lnodes.push_back(centroid); + const Vector3d & v6 = lnodes[i6]->owner_coords(my_owner); + + // create 8 tets + handle_tet(lnodes, subInterfaceSigns, i0, i2, i1, i6, -1, -1, -1, s3); + handle_tet(lnodes, subInterfaceSigns, i3, i4, i5, i6, -1, -1, -1, s4); + + if (tet_volume({{v0, v2, v1, v6}}) < 0. || tet_volume({{v3, v4, v5, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + + if (face0) + { + handle_tet(lnodes, subInterfaceSigns, i0, i1, i4, i6, -1, -1, -1, s0); + handle_tet(lnodes, subInterfaceSigns, i0, i4, i3, i6, -1, -1, -1, s0); + + if (tet_volume({{v0, v1, v4, v6}}) < 0. || tet_volume({{v0, v4, v3, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + else + { + handle_tet(lnodes, subInterfaceSigns, i0, i1, i3, i6, -1, -1, -1, s0); + handle_tet(lnodes, subInterfaceSigns, i1, i4, i3, i6, -1, -1, -1, s0); + + if (tet_volume({{v0, v1, v3, v6}}) < 0. || tet_volume({{v1, v4, v3, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + + if (face1) + { + handle_tet(lnodes, subInterfaceSigns, i1, i2, i5, i6, -1, -1, -1, s1); + handle_tet(lnodes, subInterfaceSigns, i1, i5, i4, i6, -1, -1, -1, s1); + + if (tet_volume({{v1, v2, v5, v6}}) < 0. || tet_volume({{v1, v5, v4, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + else + { + handle_tet(lnodes, subInterfaceSigns, i1, i2, i4, i6, -1, -1, -1, s1); + handle_tet(lnodes, subInterfaceSigns, i2, i5, i4, i6, -1, -1, -1, s1); + + if (tet_volume({{v1, v2, v4, v6}}) < 0. || tet_volume({{v2, v5, v4, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + + if (face2) + { + handle_tet(lnodes, subInterfaceSigns, i0, i3, i5, i6, -1, -1, -1, s2); + handle_tet(lnodes, subInterfaceSigns, i0, i5, i2, i6, -1, -1, -1, s2); + + if (tet_volume({{v0, v3, v5, v6}}) < 0. || tet_volume({{v0, v5, v2, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + else + { + handle_tet(lnodes, subInterfaceSigns, i0, i3, i2, i6, -1, -1, -1, s2); + handle_tet(lnodes, subInterfaceSigns, i3, i5, i2, i6, -1, -1, -1, s2); + + if (tet_volume({{v0, v3, v2, v6}}) < 0. || tet_volume({{v3, v5, v2, v6}}) < 0.) + { + krinolog << "Error: Schonhard polyhedron decomposition includes inverted tets." << stk::diag::dendl; + } + } + } +} + +double +SubElement::parametric_distance( const SubElementNode * node0, const SubElementNode * node1 ) +{ + if (node0->is_mesh_node() && node1->is_mesh_node()) + return 1.0; + + std::map node0_stencil; + std::map node1_stencil; + node0->build_stencil(node0_stencil); + node1->build_stencil(node1_stencil); + + // parametric distance = sqrt(0.5*sum(dx_i^2)) + + double sum_sqr_dist = 0.; + for (auto && entry : node0_stencil) + { + const SubElementNode * parent = entry.first; + const double wt0 = entry.second; + + auto it = node1_stencil.find(parent); + const double wt1 = (it == node1_stencil.end()) ? 0.0 : (it->second); + + sum_sqr_dist += (wt0 - wt1)*(wt0 - wt1); + } + for (auto && entry : node1_stencil) + { + const SubElementNode * parent = entry.first; + const double wt1 = entry.second; + + auto it = node0_stencil.find(parent); + if (it == node0_stencil.end()) + { + sum_sqr_dist += wt1*wt1; + } + } + + return std::sqrt(0.5*sum_sqr_dist); +} + +void set_node_signs_for_edge(const InterfaceID interface, const SubElementNode * node1, const SubElementNode * node2, const int node1Sign, const int node2Sign, const double crossingLocation, const CDFEM_Snapper & snapper) +{ + if (node1Sign != node2Sign) + { + // determine tolerance for this edge that may have already been cut + const bool always_snap = snapper.always_snap(); + const double edge_tol = always_snap ? 0.0 : snapper.get_edge_tolerance()/SubElement::parametric_distance(node1, node2); + + if (always_snap || edge_tol > 0.5) + { + if (crossingLocation < 0.5) + { + node1->set_node_sign(0); + } + else + { + node2->set_node_sign(0); + } + } + else + { + if (crossingLocation < edge_tol) + { + node1->set_node_sign(0); + } + else if (crossingLocation > 1.-edge_tol) + { + node2->set_node_sign(0); + } + } + } + + node1->set_node_sign(node1Sign); + node2->set_node_sign(node2Sign); +} + +void +SubElement::determine_node_signs_on_edge( const CDMesh & mesh, const InterfaceID interface, const int i0, const int i1 ) +{ /* %TRACE% */ /* %TRACE% */ + + if (my_owner->have_interface(interface)) + { + const SubElementNode * parent1 = my_nodes[i0]; + const SubElementNode * parent2 = my_nodes[i1]; + + if (parent1->captures_interface(interface)) + parent1->set_node_sign(0); + if (parent2->captures_interface(interface)) + parent2->set_node_sign(0); + + const int sign = myInterfaceSigns[my_owner->get_interface_index(interface)]; + if (sign == 0) + { + const int sign1 = my_owner->interface_node_sign(interface, parent1); + const int sign2 = my_owner->interface_node_sign(interface, parent2); + + const double position = (sign1 == sign2) ? (-1.0) : my_owner->interface_crossing_position(interface, parent1, parent2); + set_node_signs_for_edge(interface, parent1, parent2, sign1, sign2, position, mesh.get_snapper()); + } + } +} + +void +SubElement::determine_node_scores_on_edge( const CDMesh & mesh, const InterfaceID interface, const int i0, const int i1 ) +{ /* %TRACE% */ /* %TRACE% */ + + const SubElementNode * parent1 = my_nodes[i0]; + const SubElementNode * parent2 = my_nodes[i1]; + + if (parent1->get_node_on_interface() || parent2->get_node_on_interface()) return; + + const SubElementNode * child = SubElementNode::common_child({parent1, parent2}); + + if (child) + { + const NodeVec & parents = child->get_parents(); + const std::vector parent_weights = child->get_parent_weights(); + for (size_t i=0; iset_node_score(1.-parent_weights[i]); + } +} + +void +SubElement::process_edge( CDMesh & mesh, const InterfaceID interface, const int i0, const int i1 ) +{ /* %TRACE% */ /* %TRACE% */ + const SubElementNode * parent1 = my_nodes[i0]; + const SubElementNode * parent2 = my_nodes[i1]; + + if (parent1->get_node_on_interface() || parent2->get_node_on_interface()) return; + + const SubElementNode * subnode = SubElementNode::common_child({parent1, parent2}); + + if (subnode == nullptr && + parent1->node_sign_is_set() && + parent2->node_sign_is_set() && + parent1->get_node_sign() == -parent2->get_node_sign() && + have_interface(interface)) + { + const double position = my_owner->interface_crossing_position(interface, parent1, parent2); + ThrowRequireMsg(position > 0. && position < 1., "Error process_edge " << position << " " << parent1->get_node_sign() << " " << parent2->get_node_sign()); + + std::unique_ptr newNode = std::make_unique(my_owner, position, parent1, parent2); + subnode = mesh.add_managed_node(std::move(newNode)); + + // add subnode as child to parents + parent1->add_child(subnode); + parent2->add_child(subnode); + } +} + +void +SubElement::determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) +{ + if(have_subelements()) + { + for ( auto && subelem : my_subelements ) + { + subelem->SubElement::determine_node_signs(mesh, interface_key); + } + return; + } + + determine_node_signs(mesh, interface_key); +} + +void +SubElement::determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) +{ + if(have_subelements()) + { + for ( auto && subelem : my_subelements ) + { + subelem->SubElement::determine_node_scores(mesh, interface_key); + } + return; + } + + determine_node_scores(mesh, interface_key); +} + +void +SubElement::decompose(CDMesh & mesh, const InterfaceID interface_key) +{ + if(have_subelements()) + { + for ( auto && subelem : my_subelements ) + { + subelem->decompose(mesh, interface_key); + } + return; + } + + decompose_edges(mesh, interface_key); +} + +std::vector +SubElement::get_edges_with_children(const InterfaceID & interface) const +{ + // Iterate edges looking for any common children of the edge nodes + const stk::topology Top = topology(); + const int num_edges = Top.num_edges(); + + std::vector edgesWithChildren; + for ( int edge = 0; edge < num_edges; ++edge ) + { + const unsigned * edge_node_ordinals = get_edge_node_ordinals(Top, edge); + + const SubElementNode * node0 = my_nodes[edge_node_ordinals[0]]; + const SubElementNode * node1 = my_nodes[edge_node_ordinals[1]]; + const SubElementNode * child = SubElementNode::common_child({node0, node1}); + if( child ) + { + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krinolog << "Found hanging node on edge " << edge << " of element id=" << entityId() << "\n"; + krinolog << " Ancestry: " << child->get_ancestry() << "\n"; + } + edgesWithChildren.push_back(edge); + } + } + return edgesWithChildren; +} + +void +SubElement::handle_hanging_children(CDMesh & mesh, const InterfaceID & interface) +{ + if(have_subelements()) + { + for ( auto && subelem : my_subelements ) + { + subelem->handle_hanging_children(mesh, interface); + } + return; + } + + const std::vector edgesWithChildren = get_edges_with_children(interface); + + fix_hanging_children(mesh, interface, edgesWithChildren); + + for ( auto && subelem : my_subelements ) + { + ThrowRequire(!subelem->have_edges_with_children()); + } +} + +void +SubElement::build_quadratic_subelements(CDMesh & mesh) +{ + ThrowRequireMsg(have_subelements(), "This subelement type does not support quadratic subelements."); + for ( auto && subelem : my_subelements ) + { + subelem->build_quadratic_subelements(mesh); + } +} + +void +SubElement::cut_face_interior_intersection_points(CDMesh & mesh, const InterfaceID & interface1, const InterfaceID & interface2, int level) +{ /* %TRACE% */ /* %TRACE% */ + + if (topology().num_faces() == 0) + return; + + ThrowRequireMsg(false, "This subelement type does not support cut_face_interior_intersection_points: " << topology()); +} + +bool +SubElement_Tet_4::is_degenerate( NodeVec & lnodes, + const int i0, const int i1, const int i2, const int i3 ) +{ /* %TRACE% */ /* %TRACE% */ + + if ( lnodes[i0] == lnodes[i1] || + lnodes[i0] == lnodes[i2] || + lnodes[i0] == lnodes[i3] || + lnodes[i1] == lnodes[i2] || + lnodes[i1] == lnodes[i3] || + lnodes[i2] == lnodes[i3] ) + { + // this tet is degenerate with two coincident nodes + return true; + } + + return false; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_SubElement.hpp b/packages/krino/krino/krino_lib/Akri_SubElement.hpp new file mode 100644 index 000000000000..cb6e086b947c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElement.hpp @@ -0,0 +1,431 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_SubElement_h +#define Akri_SubElement_h + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace krino { + +class ProlongationNodeData; +class ProlongationPointData; +class SubElementNodeAncestry; + +bool node_on_negative_side_of_interface(const SubElementNode * node, const InterfaceID key); + +class SubElement : public ElementObj { +public: + SubElement( const stk::topology topo, + const NodeVec & nodes, + const std::vector & side_ids, + const Mesh_Element * owner); + virtual ~SubElement() {} + + static double coordinate_relative_tol() { return 1.e-6; } + static double parametric_distance( const SubElementNode * node0, const SubElementNode * node1 ); + + void set_permutation(); + double relative_volume() const; + double maximum_relative_angle() const; + + void decompose(CDMesh & mesh, const InterfaceID interface_key); + virtual void decompose_edges(CDMesh & mesh, const InterfaceID interface_key); + virtual void determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key); + virtual void determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key); + + void handle_hanging_children(CDMesh & mesh, const InterfaceID & interface); + virtual void fix_hanging_children(CDMesh & mesh, const InterfaceID & interface, const std::vector & edges_with_children) {} + + virtual void build_quadratic_subelements(CDMesh & mesh); + virtual void cut_face_interior_intersection_points(CDMesh & mesh, const InterfaceID & interface1, const InterfaceID & interface2, int level = 0); + + static void get_edge_position(const SubElementNode * n0, const SubElementNode * n1, const SubElementNode * n2, double & position ); + + bool check_entity_nodes(const stk::mesh::BulkData & stkMesh) const; + void get_owner_coord_transform(double * dOwnerdSub) const; + const Mesh_Element & get_owner() const { return *my_owner; } + + int parent_side_id(const int iside) const; + virtual void determine_decomposed_elem_phase(const CDMesh & mesh) override final; + std::vector subelement_interface_signs(const InterfaceID interface, const int sign) const; + const std::vector & get_interface_signs() const { return myInterfaceSigns; } + void initialize_interface_signs(); + void set_interface_signs(const std::vector & interfaceSigns); + void update_interface_signs(const InterfaceID interface_key, const int sign); + unsigned num_sides() const { return my_parent_side_ids.size(); } + void debug_subelements(const NodeVec & lnodes, const InterfaceID & interface, const int case_id) const; + void debug() const; + bool have_interface(const InterfaceID& interface) const; + void determine_if_cut_by_interface(const InterfaceID & interface, bool & haveAnyCrossing, bool & haveRealCrossing) const; + +protected: + std::vector get_edges_with_children(const InterfaceID & interface) const; + void determine_node_signs_on_edge( const CDMesh & mesh, const InterfaceID interface_key, const int i0, const int i1 ); + void determine_node_scores_on_edge( const CDMesh & mesh, const InterfaceID interface_key, const int i0, const int i1 ); + void process_edge( CDMesh & mesh, const InterfaceID interface_key, const int i0, const int i1 ); + void find_refined_edges(std::vector & refined_edges) const; + int find_longest_bad_edge(std::vector & bad_edges) const; + +protected: + std::vector my_parent_side_ids; + const Mesh_Element * my_owner; + std::vector myInterfaceSigns; + +private: + //: Default constructor not allowed + SubElement(); +}; + +class SubElement_Tri_3 : public SubElement { +public: + SubElement_Tri_3( const NodeVec & nodes, + const std::vector & parent_side_ids, + const Mesh_Element * owner); + virtual ~SubElement_Tri_3() {} + + virtual void decompose_edges(CDMesh & mesh, const InterfaceID interface_key) override; + virtual void fix_hanging_children(CDMesh & mesh, const InterfaceID & interface, const std::vector & edges_with_children) override; + virtual void build_quadratic_subelements(CDMesh & mesh) override; + + virtual void determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) override; + virtual void determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) override; + virtual void cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains) override; + +protected: + void perform_decomposition(CDMesh & mesh, const InterfaceID interface_key, const std::array & node_signs); + bool determine_diagonal_for_cut_triangle(const Simplex_Generation_Method & simplexMethod, const NodeVec & lnodes, const int i0, const int i1, const int i2, const int i3, const int i5); + bool is_degenerate( NodeVec & lnodes, + const int i0, const int i1, const int i2 ); + void handle_tri( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, + const int s0, const int s1, const int s2, + const bool is_interface0, const bool is_interface1, const bool is_interface2); + void handle_quad( CDMesh & mesh, + NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, + const int s0, const int s1, const int s2, const int s3, + const bool is_interface0, const bool is_interface1, const bool is_interface2, const bool is_interface3, + const bool face ); +private: + //: Default constructor not allowed + SubElement_Tri_3(); + +}; + +class SubElement_Tri_6 : public SubElement { +public: + SubElement_Tri_6( const NodeVec & nodes, + const std::vector & side_ids, + const Mesh_Element * owner); + virtual ~SubElement_Tri_6() {} + +private: + //: Default constructor not allowed + SubElement_Tri_6(); + +}; + +class SubElement_Tet_4 : public SubElement { +public: + SubElement_Tet_4( const NodeVec & nodes, + const std::vector & side_ids, + const Mesh_Element * owner); + virtual ~SubElement_Tet_4() {} + + virtual void decompose_edges(CDMesh & mesh, const InterfaceID interface_key) override; + virtual void fix_hanging_children(CDMesh & mesh, const InterfaceID & interface, const std::vector & edges_with_children) override; + virtual void build_quadratic_subelements(CDMesh & mesh) override; + virtual void cut_face_interior_intersection_points(CDMesh & mesh, const InterfaceID & interface1, const InterfaceID & interface2, int level = 0) override; + + virtual void determine_node_signs(const CDMesh & mesh, const InterfaceID interface_key) override; + virtual void determine_node_scores(const CDMesh & mesh, const InterfaceID interface_key) override; + virtual void cut_interior_intersection_point(CDMesh & mesh, const Vector3d & pCoords, const std::vector & sortedDomains) override; + +protected: + void perform_decomposition(CDMesh & mesh, const InterfaceID interface_key, const std::array & node_signs); + void determine_node_scores_on_face( const CDMesh & mesh, const InterfaceID interface, const int i0, const int i1, const int i2 ); + static const unsigned ** get_permutation_side_ordinals(); + static double tet_volume(const std::array & nodes); + + bool is_degenerate( NodeVec & lnodes, + const int i0, const int i1, const int i2, const int i3 ); + void handle_tet( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, + const int s0, const int s1, const int s2, const int s3); + void handle_pyramid( NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, const int i4, + const int s0, const int s1, const int s2, const int s3, const int s4, + const bool face4 ); + void handle_wedge( CDMesh & mesh, + NodeVec & lnodes, + const std::vector & subInterfaceSigns, + const int i0, const int i1, const int i2, const int i3, const int i4, const int i5, + const int s0, const int s1, const int s2, const int s3, const int s4, + const bool face0, const bool face1, const bool face2 ); +private: + //: Default constructor not allowed + SubElement_Tet_4(); + + bool determine_diagonal_for_cut_triangular_face(const Simplex_Generation_Method & simplexMethod, const bool globalIDsAreParallelConsistent, const NodeVec & lnodes, const int i0, const int i1, const int i2, const int i3, const int i5); + void cut_face_intersection_point_with_permutation(CDMesh & mesh, const std::array & permuteNodes, const std::array & permuteSides, const std::vector & faceNodeWeights, const std::vector & sortedDomains); +}; + +class SubElement_Tet_10 : public SubElement { +public: + SubElement_Tet_10( const NodeVec & nodes, + const std::vector & side_ids, + const Mesh_Element * owner); + virtual ~SubElement_Tet_10() {} + +private: + //: Default constructor not allowed + SubElement_Tet_10(); + +}; + +class SubElementNode { +public: + SubElementNode(const Mesh_Element * in_owner) + : my_entity(), + my_entityId(0), + my_is_prolonged_flag(false), + my_cached_owner(in_owner) + {} + + virtual ~SubElementNode() {} + virtual bool is_mesh_node() const { return false; } + virtual NodeVec get_parents() const { throw std::runtime_error("Incorrect usage of SubElementNode. The type of node does not have parents."); } + virtual size_t get_num_parents() const { throw std::runtime_error("Incorrect usage of SubElementNode. The type of node does not have parents."); } + virtual std::vector get_parent_weights() const { throw std::runtime_error("Incorrect usage of SubElementNode. The type of node does not have parents."); } + virtual void prolongate_fields(const CDMesh & mesh) const = 0; + + void get_parent_entities(std::vector & parent_entities) const; + + void set_entity(const stk::mesh::BulkData & mesh, stk::mesh::Entity in_node_obj) const { my_entity = in_node_obj; my_entityId = mesh.identifier(my_entity); } + void set_entity(stk::mesh::Entity nodeEntity, stk::mesh::EntityId nodeEntityId) const { my_entity = nodeEntity; my_entityId = nodeEntityId; } + const Mesh_Element * get_active_element() const { return my_cached_owner; } + bool is_prolonged() const { return my_is_prolonged_flag; } + void set_prolonged_flag(const bool val) const { my_is_prolonged_flag = val; } // this is dangerous, know what you are doing + bool on_common_edge(const SubElementNode * other) const; + + bool entity_is_valid(const stk::mesh::BulkData & mesh) const { return mesh.is_valid(my_entity); } + bool check_entity(const stk::mesh::BulkData & mesh) const { return (my_entityId == 0) ? (my_entity == stk::mesh::Entity()) : (my_entityId == mesh.identifier(my_entity)); } + stk::mesh::Entity & entity() const { return my_entity; } + stk::mesh::EntityId entityId() const { return my_entityId; } + void set_entityId_from_entity(const stk::mesh::BulkData & mesh) const { ThrowAssert(mesh.is_valid(my_entity)); my_entityId = mesh.identifier(my_entity); } + + const Vector3d & owner_coords( const Mesh_Element * in_owner ) const { + if ( in_owner != my_cached_owner ) { + // call derived types function for recomputing owner_coords + my_cached_owner = in_owner; + my_cached_owner_coords = compute_owner_coords( in_owner ); + } + return my_cached_owner_coords; + } + bool get_node_on_interface() const { return my_node_sign == 0; } + + void set_node_domains(const std::vector & nodeDomains) const { my_sorted_node_domains = nodeDomains; } + const std::vector & get_sorted_node_domains() const { return my_sorted_node_domains; } + void insert_node_domains(const std::vector & domainsToAdd) const; + bool captures_intersection_point_domains(const std::vector & intersectionPointDomains) const; + bool captures_interface(const InterfaceID & interface) const; + bool captures_intersection_point_domains(const InterfaceID & interface) const; + static bool higher_priority_by_score_then_ancestry(const SubElementNode & a, const SubElementNode & b, const bool globalIDsAreParallelConsistent); + static bool less_by_entity_id(const SubElementNode & a, const SubElementNode & b); + static bool less_by_coordinates_then_by_entity_id(const SubElementNode & a, const SubElementNode & b); + bool node_sign_is_set() const { return my_node_sign != -2; } + void set_node_sign(const int sign) const { my_node_sign = (my_node_sign == 0 || my_node_sign == -sign) ? 0 : sign; } + int get_node_sign() const { ThrowRequire(node_sign_is_set()); return my_node_sign; } + void clear_node_sign() const { my_node_sign = -2; } + void clear_node_score() const { my_node_score = 1.; } + bool node_score_is_set() const { return my_node_score != 1.; } + void set_node_score(const double score) const { my_node_score = std::min(my_node_score, score); } + double get_node_score() const { ThrowRequire(node_sign_is_set()); return my_node_score; } + + // pure virtual function for recomputing local coordinates + virtual Vector3d compute_owner_coords( const Mesh_Element * in_owner ) const = 0; + + const Vector3d & coordinates() const { return my_global_coords; } + + void add_child(const SubElementNode* child) const { my_children.push_back(child); } + static const SubElementNode * common_child( const NodeVec & parents ); + bool have_child() const; + bool have_child(const SubElementNode* child) const; + + // This is called from Mesh::find_prolongation_node to determine the set of candidate prolongation nodes. + std::vector prolongation_node_fields(const CDMesh & mesh) const; + + const SubElementNode * find_node_with_common_ancestry(const CDMesh & search_mesh) const; + + void get_ancestors(NodeSet & ancestors) const; + SubElementNodeAncestry get_ancestry() const; + void build_stencil(std::map & stencil, const double self_weight = 1.0) const; + void build_constraint_stencil(const FieldRef field, std::vector & entities, std::vector & weights) const; + +protected: + void prolong_cdfem_displacements(const CDMesh & mesh, + const ProlongationPointData * prolong_data, + const bool zero_if_no_prolong_data = true) const; + void prolong_zeroed_fields(const CDMesh & mesh, const ProlongationNodeData * nodeToExamineForExistingField) const; + + mutable stk::mesh::Entity my_entity; + mutable stk::mesh::EntityId my_entityId; + mutable bool my_is_prolonged_flag; + Vector3d my_global_coords; + mutable signed char my_node_sign; + mutable double my_node_score; + + mutable const Mesh_Element * my_cached_owner; + mutable Vector3d my_cached_owner_coords; + + mutable std::vector my_children; + mutable std::vector my_sorted_node_domains; + +private: + //: copy constructor not allowed + SubElementNode(SubElementNode const & copy); +}; + +class SubElementChildNode : public SubElementNode { +public: + SubElementChildNode( const Mesh_Element * owner, + const NodeVec & parents, + const std::vector & weights ); + + virtual ~SubElementChildNode() {} + virtual void prolongate_fields(const CDMesh & mesh) const override; + virtual Vector3d compute_owner_coords( const Mesh_Element * in_owner ) const override; + + virtual NodeVec get_parents() const override { return my_parents; } + virtual size_t get_num_parents() const override { return my_parents.size(); } + virtual std::vector get_parent_weights() const override { return my_weights; } + bool needs_to_be_ale_prolonged(const CDMesh & mesh) const; + +private: + void prolong_ale_fields(const CDMesh & mesh, const ProlongationPointData * prolong_data) const; + void prolong_interpolation_fields(const CDMesh & mesh) const; + + NodeVec my_parents; + std::vector my_weights; +}; + +class SubElementSteinerNode : public SubElementChildNode { +public: + + SubElementSteinerNode( const Mesh_Element * in_owner, + const NodeVec & parents, + const std::vector & weights ) + : SubElementChildNode(in_owner, parents, weights) {} + + virtual ~SubElementSteinerNode() {} + virtual void prolongate_fields(const CDMesh & mesh) const override; + virtual Vector3d compute_owner_coords( const Mesh_Element * owner ) const override { + throw std::runtime_error("Incorrect usage of SubElementSteinerNode. The type of node only has one owner."); + } +}; + +class SubElementEdgeNode : public SubElementChildNode { +public: + SubElementEdgeNode( const Mesh_Element * owner, + const double & position, + const SubElementNode *parent1, + const SubElementNode *parent2) + : SubElementChildNode( owner, {parent1, parent2}, {1.-position, position}) {} + + virtual ~SubElementEdgeNode() {} + + double get_position() const { ThrowAssert(get_num_parents() == 2); return get_parent_weights()[1]; } + double get_position(const SubElementNode *parent1, const SubElementNode *parent2) const { ThrowAssert(check_parents(parent1,parent2)); return ((parent1==get_parents()[0]) ? get_parent_weights()[1] : get_parent_weights()[0]); } + +private: + bool check_parents(const SubElementNode *parent1, const SubElementNode *parent2) const { + return (get_num_parents() == 2 && ((parent1==get_parents()[0] && parent2==get_parents()[1]) || (parent2==get_parents()[0] && parent1==get_parents()[1]))); + } +}; + + class SubElementMidSideNode : public SubElementNode { +public: + SubElementMidSideNode() = delete; + SubElementMidSideNode( const Mesh_Element * owner, + const SubElementNode *parent1, + const SubElementNode *parent2); + SubElementMidSideNode( const Mesh_Element * owner, + const SubElementNode *parent1, + const SubElementNode *parent2, + stk::mesh::Entity meshNode, + stk::mesh::EntityId meshNodeId); + + virtual ~SubElementMidSideNode() {} + virtual void prolongate_fields(const CDMesh & mesh) const override; + virtual Vector3d compute_owner_coords( const Mesh_Element * in_owner ) const override { + return 0.5 * my_parent1->owner_coords(in_owner) + 0.5 * my_parent2->owner_coords(in_owner); + } + virtual bool is_mesh_node() const override { return my_is_mesh_node; } + + virtual NodeVec get_parents() const override { ThrowRequire(!my_is_mesh_node); return NodeVec{my_parent1,my_parent2}; } + virtual size_t get_num_parents() const override { return 2; } + virtual std::vector get_parent_weights() const override { ThrowRequire(!my_is_mesh_node); return std::vector{0.5,0.5}; } + +protected: + bool my_is_mesh_node; + const SubElementNode *my_parent1; + const SubElementNode *my_parent2; + +private: + void prolong_ale_fields(const CDMesh & mesh) const; + void prolong_interpolation_fields(const CDMesh & mesh) const; + bool is_mesh_node_that_needs_to_be_prolonged(const CDMesh & mesh) const; +}; + + +class SubElementMeshNode : public SubElementNode { +public: + + SubElementMeshNode( const Mesh_Element * owner, + stk::mesh::Entity nodeEntity, + stk::mesh::EntityId nodeEntityId, + const Vector3d & owner_coords, + const Vector3d & global_coords ); + + virtual ~SubElementMeshNode() {} + + virtual void prolongate_fields(const CDMesh & mesh) const override; + virtual Vector3d compute_owner_coords( const Mesh_Element * owner ) const override { return owner->get_node_parametric_coords(this); } + virtual bool is_mesh_node() const override { return true; } + bool needs_to_be_ale_prolonged(const CDMesh & mesh) const; +protected: + +private: + void prolong_ale_fields(const CDMesh & mesh, + const ProlongationPointData * prolong_data, + const ProlongationNodeData * old_node) const; + void prolong_interpolation_fields(const CDMesh & mesh, const ProlongationNodeData * old_node) const; + //: Default constructor not allowed + SubElementMeshNode(); +}; + +} // namespace krino + +#endif // Akri_SubElement_h diff --git a/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.cpp b/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.cpp new file mode 100644 index 000000000000..b592e297f5a9 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.cpp @@ -0,0 +1,246 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +namespace krino { + +SubElementChildNodeAncestry::SubElementChildNodeAncestry( stk::CommBuffer & b ) +{ + size_t ancestrySize = 0; + b.unpack(ancestrySize); + ThrowAssert(ancestrySize > 0); + + myAncestry.reserve(ancestrySize); + + size_t numParents = 0; + std::vector parentIDs; + std::vector parentWeights; + + for(unsigned index=0; indexis_mesh_node()) + { + myAncestry.emplace_back(std::vector{node->entityId()}, std::vector{0.}); + return; + } + + const NodeVec & parents = node->get_parents(); + const auto & parentWeights = node->get_parent_weights(); + std::vector parentIDs; + parentIDs.reserve(parents.size()); + + for (auto && parent : node->get_parents()) + { + if (parent->is_mesh_node()) + parentIDs.push_back(parent->entityId()); + else + parentIDs.push_back(0); + } + + myAncestry.emplace_back(parentIDs, parentWeights); + + for (auto && parent : node->get_parents()) + if (!parent->is_mesh_node()) + build_ancestry(parent); +} + +void +SubElementChildNodeAncestry::get_parent_node_keys(std::vector & parentNodeKeys) const +{ + parentNodeKeys.clear(); + for (auto&& cut : myAncestry) + for (auto && parentID : cut.myParentIDs) + if (parentID != 0) + parentNodeKeys.emplace_back(stk::topology::NODE_RANK, parentID); +} + +bool +SubElementChildNodeAncestry::is_shared(const stk::mesh::BulkData & mesh, const SubElementNode * node) +{ + if (node->is_mesh_node()) + { + return mesh.bucket(node->entity()).shared(); + } + for (auto && parent : node->get_parents()) + { + if (!is_shared(mesh, parent)) + { + return false; + } + } + return true; +} + +void +SubElementChildNodeAncestry::pack_into_buffer(stk::CommBuffer & b) const +{ + ThrowAssert(!myAncestry.empty()); + const size_t ancestrySize = myAncestry.size(); + b.pack(ancestrySize); + for (auto&& cut : myAncestry) + { + const size_t numParents = cut.myParentIDs.size(); + b.pack(numParents); + for (size_t i=0; i parents(numParents, nullptr); + + for (size_t i=0; i +SubElementChildNodeAncestry::get_constrained_node_ancestries(const std::unordered_map > & constrainedNodeMap) const +{ + std::set parentNodeIDs; + for (auto&& cut : myAncestry) + for (auto && parentID : cut.myParentIDs) + if (parentID != 0) + parentNodeIDs.insert(parentID); + + std::vector constrainedNodeAncestries; + constrainedNodeAncestries.push_back(*this); + for (auto&& parentNodeID : parentNodeIDs) + { + std::vector toBeConverted; + toBeConverted.swap(constrainedNodeAncestries); + auto it = constrainedNodeMap.find(parentNodeID); + if (it == constrainedNodeMap.end()) break; + constrainedNodeAncestries.reserve(it->second.size() * toBeConverted.size()); + for (auto&& constrainedParentNodeID : it->second) + { + for (auto&& unconverted : toBeConverted) + { + SubElementChildNodeAncestry converted = unconverted; + for (auto&& cut : converted.myAncestry) + { + for (auto && cutParentNodeID : cut.myParentIDs) + if (cutParentNodeID == parentNodeID) + cutParentNodeID = constrainedParentNodeID; + } + constrainedNodeAncestries.push_back(converted); + } + } + } + return constrainedNodeAncestries; +} + +const SubElementNode * +SubElementChildNodeAncestry::build_missing_child_nodes(CDMesh & mesh, unsigned & ancestryIndex) const +{ + ThrowAssert(ancestryIndex < myAncestry.size()); + const Cut & cut = myAncestry[ancestryIndex]; + const size_t numParents = cut.myParentIDs.size(); + std::vector parents(numParents, nullptr); + + for (size_t i=0; iget_ancestors(ancestors); + + std::vector ancestorNodes; + ancestorNodes.reserve(ancestors.size()); + for (auto&& ancestor : ancestors) + { + ThrowAssert(ancestor->entity_is_valid(mesh.stk_bulk())); + ancestorNodes.push_back(ancestor->entity()); + } + + std::vector elems; + stk::mesh::get_entities_through_relations(mesh.stk_bulk(), ancestorNodes, stk::topology::ELEMENT_RANK, elems); + + const Mesh_Element * owner = nullptr; + for(auto && elem : elems) + { + owner = mesh.find_mesh_element(mesh.stk_bulk().identifier(elem)); + if(owner != nullptr) break; + } + if(!owner) + { + // It is possible in parallel for both nodes of a parent edge to be shared with a processor, + // but that processor does not own any of the elements connected to that edge. In that case + // we do not need to build the missing edge node. + return nullptr; + } + + if (parents.size() == 2) + return mesh.create_edge_node(owner, parents[0], parents[1], cut.myParentWeights[1]); + + return mesh.create_child_internal_or_face_node(owner, parents, cut.myParentWeights); +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.hpp b/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.hpp new file mode 100644 index 000000000000..55c73d64a243 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElementChildNodeAncestry.hpp @@ -0,0 +1,49 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_SubElementChildNodeAncestry_h +#define Akri_SubElementChildNodeAncestry_h + +#include +#include +#include +#include + +namespace krino +{ +class CDMesh; +class SubElementNode; + +class SubElementChildNodeAncestry { +public: + SubElementChildNodeAncestry(const SubElementNode * node) { build_ancestry(node); } + SubElementChildNodeAncestry( stk::CommBuffer & b ); + + static bool is_shared(const stk::mesh::BulkData & mesh, const SubElementNode * node); + void pack_into_buffer(stk::CommBuffer & b) const; + const SubElementNode * find_subelement_node(CDMesh & mesh) const; + const SubElementNode * find_subelement_node(CDMesh & mesh, unsigned & ancestry_index) const; + void get_parent_node_keys(std::vector & parent_node_keys) const; + void build_missing_child_nodes(CDMesh & mesh) const; + std::vector get_constrained_node_ancestries(const std::unordered_map > & constrained_node_map) const; + +private: + struct Cut { + Cut(const std::vector & parentIDs, const std::vector & parentWeights) : myParentIDs(parentIDs), myParentWeights(parentWeights) {} + std::vector myParentIDs; + std::vector myParentWeights; + }; + void build_ancestry(const SubElementNode * in_node); + const SubElementNode * build_missing_child_nodes(CDMesh & mesh, unsigned & ancestry_index) const; + + std::vector myAncestry; +}; + +} + +#endif // Akri_SubElementChildNodeAncestry_h diff --git a/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.cpp b/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.cpp new file mode 100644 index 000000000000..9dad99d5cf55 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.cpp @@ -0,0 +1,32 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino { + +void SubElementNodeAncestry::print(std::ostream & os) const +{ + if (my_node->is_mesh_node()) + { + os << my_node->entityId(); + } + else + { + os << "{ "; + for (auto&& parent : get_parents()) + { + parent.print(os); + os << " "; + } + os << "}"; + } +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.hpp b/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.hpp new file mode 100644 index 000000000000..b36fc35423e0 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_SubElementNodeAncestry.hpp @@ -0,0 +1,65 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_SubElementNodeAncestry_h +#define Akri_SubElementNodeAncestry_h + +#include + +namespace krino { + +class SubElementNodeAncestry { +public: + SubElementNodeAncestry() = default; + SubElementNodeAncestry(const SubElementNodeAncestry & rhs) = default; + SubElementNodeAncestry(const SubElementNode * node) : my_node(node) {} + + template + static bool compare(const SubElementNodeAncestry & x, const SubElementNodeAncestry & y, const LESS & compare) + { + const std::vector xParents = x.get_parents(); + const std::vector yParents = y.get_parents(); + if (xParents.empty()) + { + if (yParents.empty()) return compare(*(x.my_node), *(y.my_node)); + else return true; + } + else if (yParents.empty()) return false; + else return xParents < yParents; + } + + void print(std::ostream & os) const; + +private: + std::vector get_parents() const + { + std::vector parents; + if (!my_node->is_mesh_node()) + { + const NodeVec nodeParents = my_node->get_parents(); + parents.reserve(nodeParents.size()); + for (auto && nodeParent : nodeParents) + parents.emplace_back(nodeParent); + std::sort(parents.begin(), parents.end()); + } + return parents; + } + + const SubElementNode * my_node = nullptr; +}; + +inline bool operator<(const SubElementNodeAncestry & x, const SubElementNodeAncestry & y) +{ + return SubElementNodeAncestry::compare(x,y,SubElementNode::less_by_entity_id); +} + +inline std::ostream & operator << (std::ostream & os, const SubElementNodeAncestry & ancestry) { ancestry.print(os); return os; } + +} + +#endif // Akri_SubElementNodeAncestry_h diff --git a/packages/krino/krino/krino_lib/Akri_Surface.cpp b/packages/krino/krino/krino_lib/Akri_Surface.cpp new file mode 100644 index 000000000000..6fc43d1f8dd7 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Surface.cpp @@ -0,0 +1,28 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino{ + +void +Surface::prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length) +{ + ThrowErrorMsgIf(NULL != my_transformation, + "This surface with type (" << type() + << ") has motion specified, but the prepare_to_compute() method has not been implemented yet to support motion."); +} + +BoundingBox +Surface::get_bounding_box() +{ + ThrowRuntimeError("This surface with type (" << type() << ") has not implemented get_bounding_box()."); +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Surface.hpp b/packages/krino/krino/krino_lib/Akri_Surface.hpp new file mode 100644 index 000000000000..78019bafe845 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Surface.hpp @@ -0,0 +1,98 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Surface_h +#define Akri_Surface_h + +#include +#include +#include +#include + +namespace krino { + +class Transformation; + +enum Surface_Type +{ + POINT=0, + SPHERE, + ELLIPSOID, + CYLINDER, + COMPOSITE_SURFACE, + PLANE, + RANDOM, + FACETED_SURFACE, + // Never, ever, ever add an entry after MAX_SURFACE_TYPE. Never. + MAX_SURFACE_TYPE +}; + +class Surface; +typedef std::vector SurfaceVec; +typedef std::vector< std::unique_ptr > SurfaceAutoVec; + +// abstract class used to define a surface. + +class Surface { + +public: + Surface() { Surface::set_transformation(nullptr); } + virtual ~Surface() {} + + virtual BoundingBox get_bounding_box(); + + // pre-calculations needed to compute distance + virtual void prepare_to_compute(const double time, const BoundingBox & point_bbox, const double truncation_length); + + // compute signed distance from specific point to surface + virtual double point_signed_distance(const Vector3d &x) const = 0; + + // compute signed distance from specific point to surface + // For distances larger than truncation_length (if truncation_length > 0.), the surface is allowed to return + // far_field_value instead of the actual signed distance. + virtual double truncated_point_signed_distance(const Vector3d &x, const double truncation_length, const double far_field_value) const = 0; + // If surface does return far_field_value instead of actual signed distance, the sign may be wrong. + virtual bool truncated_distance_may_have_wrong_sign() const = 0; + + // for debugging memory usage + virtual size_t storage_size() const = 0; + + // methods related to moving surfaces (transformations) + virtual void set_transformation(Transformation * trans) { my_transformation = trans; } + Transformation * get_transformation() { return my_transformation; } + const Transformation * get_transformation() const { return my_transformation; } + + // queries + virtual Surface_Type type() const = 0; + +protected: + Transformation * my_transformation; +}; + +class SurfaceThatTakesAdvantageOfNarrowBandAndThereforeMightHaveWrongSign : public Surface { +public: + virtual bool truncated_distance_may_have_wrong_sign() const override { return true; } + virtual double point_signed_distance(const Vector3d &x) const override + { + return truncated_point_signed_distance(x, 0., 0.); + } + virtual double truncated_point_signed_distance(const Vector3d &x, const double truncation_length, const double far_field_value) const override = 0; +}; + +class SurfaceThatDoesntTakeAdvantageOfNarrowBandAndThereforeHasCorrectSign : public Surface { +public: + virtual bool truncated_distance_may_have_wrong_sign() const override { return false; } + virtual double point_signed_distance(const Vector3d &x) const override = 0; + virtual double truncated_point_signed_distance(const Vector3d &x, const double truncation_length, const double far_field_value) const override + { + return point_signed_distance(x); + } +}; +} // namespace krino + +#endif // Akri_Surface_h diff --git a/packages/krino/krino/krino_lib/Akri_Transformation.cpp b/packages/krino/krino/krino_lib/Akri_Transformation.cpp new file mode 100644 index 000000000000..d7c563f2a588 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Transformation.cpp @@ -0,0 +1,112 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include + +namespace krino{ + +void +Quaternion::set_from_rotation_vector(const Vector3d & v) +{ + // the angle theta is the length of the rotation vector omega + const double theta = v.length(); + const double real_min = 10.0*std::numeric_limits::min(); + + double coef; + if ( theta > real_min ) { + coef = std::sin(0.5*theta)/theta; + } else { + coef = 0.5; + } + + q[0] = std::cos( 0.5*theta ); + q[1] = coef*v[0]; + q[2] = coef*v[1]; + q[3] = coef*v[2]; + + const double inv_length = 1.0/std::sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); + for (auto && val : q) val *= inv_length; +} + +Vector3d use_quaternion_to_rotate_3d_vector(const std::array & q, const Vector3d & v) +{ + return Vector3d( + ((2. * ( q[0] * q[0] + q[1] * q[1] ) - 1.) * v[0] + + (2. * ( q[1] * q[2] - q[0] * q[3] ) ) * v[1] + + (2. * ( q[1] * q[3] + q[0] * q[2] ) ) * v[2]), + ((2. * ( q[1] * q[2] + q[0] * q[3] ) ) * v[0] + + (2. * ( q[0] * q[0] + q[2] * q[2] ) - 1.) * v[1] + + (2. * ( q[2] * q[3] - q[0] * q[1] ) ) * v[2]), + ((2. * ( q[1] * q[3] - q[0] * q[2] ) ) * v[0] + + (2. * ( q[2] * q[3] + q[0] * q[1] ) ) * v[1] + + (2. * ( q[0] * q[0] + q[3] * q[3] ) - 1.) * v[2])); +} + + +Vector3d +Quaternion::rotate_3d_vector(const Vector3d & v) const +{ + return use_quaternion_to_rotate_3d_vector(q, v); +} + +Vector3d +Quaternion::reverse_rotate_3d_vector(const Vector3d & v) const +{ + return use_quaternion_to_rotate_3d_vector(std::array{q[0],-q[1],-q[2],-q[3]}, v); +} + +void +Transformation::initialize( const Vector3d & initial_displacement, const Vector3d & initial_rotation, const Vector3d & reference_point ) +{ + my_reference_point = reference_point; + my_update_orientation.set_from_rotation_vector(initial_rotation); + my_update_offset = initial_displacement - my_update_orientation.rotate_3d_vector(my_reference_point); + my_reference_point += initial_displacement; +} + +void +Transformation::initialize() +{ + // this form of initialization assumes that set_initial_displacement() and set_initial_rotation() have been called or are zero + const Vector3d initial_displacement = my_update_offset; + my_update_offset = initial_displacement - my_update_orientation.rotate_3d_vector(my_reference_point); + my_reference_point += initial_displacement; +} + +void +Transformation::update( const double time ) const +{ + if (time == my_last_update) + { + return; + } + if (my_last_update < 0.0) + { + my_last_update = time; + return; + } + + const double dt = time - my_last_update; + const Vector3d update_rotation_angle = dt*my_rotational_velocity; + my_update_orientation.set_from_rotation_vector(update_rotation_angle); + my_update_offset = my_reference_point - my_update_orientation.rotate_3d_vector(my_reference_point) + my_translational_velocity * dt; + my_reference_point += my_translational_velocity * dt; + + my_last_update = time; +} + +void +Transformation::apply( Vector3d & x0 ) const +{ + x0 = my_update_orientation.rotate_3d_vector(x0) + my_update_offset; +} + +} // namespace krino diff --git a/packages/krino/krino/krino_lib/Akri_Transformation.hpp b/packages/krino/krino/krino_lib/Akri_Transformation.hpp new file mode 100644 index 000000000000..602d3510af9a --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Transformation.hpp @@ -0,0 +1,65 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Transformation_h +#define Akri_Transformation_h + +#include +#include + +namespace krino { + +class Quaternion { + public: + Quaternion() : q{{ 1.0, 0.0, 0.0, 0.0 }} {} + + void set_from_rotation_vector(const Vector3d & v); + Vector3d rotate_3d_vector(const Vector3d & v) const; + Vector3d reverse_rotate_3d_vector(const Vector3d & v) const; + + private: + std::array q; ///< q[0] stores angle, (q[1],q[2],a[3]) stores axis. +}; + +class Transformation { +public: + Transformation() + : my_translational_velocity(Vector3d::ZERO), my_rotational_velocity(Vector3d::ZERO), + my_reference_point(Vector3d::ZERO), my_last_update(-1.0), my_update_orientation(), my_update_offset(Vector3d::ZERO) {} + virtual ~Transformation() {} + + void set_translational_velocity(const Vector3d & v) { my_translational_velocity = v; } + void set_rotational_velocity(const Vector3d & v) { my_rotational_velocity = v; } + void set_reference_point(const Vector3d & v) { my_reference_point = v; } + + // temporary storage until initialize() + void set_initial_displacement(const Vector3d & v) { my_update_offset = v; } + void set_initial_rotation(const Vector3d & v) { my_update_orientation.set_from_rotation_vector(v); } + + const Vector3d & get_translational_velocity() const { return my_translational_velocity; } + const Vector3d & get_rotational_velocity() const { return my_rotational_velocity; } + const Vector3d & get_reference_point() const { return my_reference_point; } + + void initialize( const Vector3d & initial_displacement, const Vector3d & initial_rotation, const Vector3d & reference_point ); + void initialize(); // this form assumes that set_initial_displacement() and set_initial_rotation() have been called or are zero + void update( const double time ) const; + void apply( Vector3d & x0 ) const; + +protected: + Vector3d my_translational_velocity; + Vector3d my_rotational_velocity; + mutable Vector3d my_reference_point; + mutable double my_last_update; + mutable Quaternion my_update_orientation; + mutable Vector3d my_update_offset; +}; + + +} // namespace krino + +#endif // Akri_Transformation_h diff --git a/packages/krino/krino/krino_lib/Akri_Triangle.hpp b/packages/krino/krino/krino_lib/Akri_Triangle.hpp new file mode 100644 index 000000000000..868fbe2b0a1e --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Triangle.hpp @@ -0,0 +1,169 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Triangle_h +#define Akri_Triangle_h + +#include +#include +#include +#include + +#include + +namespace krino { + +enum class ProjectionType{NODE, EDGE, FACE, NUM_PROJ_TYPE}; + +template +class Triangle3 { + public: + typedef REAL Real; + + + Triangle3() {} /// Default, all coords zero + Triangle3(const Vec &n0, const Vec &n1, const Vec &n2) : nodes{{n0, n1, n2}} {} /// Explicit set three coordinates + explicit Triangle3(const MemberInit) {/* MemberInit::NONE */} /// Special non-initialize constructor (for performance) + + Vec normal() const { return normal_dir().unit_vector(); } /// Unit vector + Vec normal_dir() const {return Cross(GetNode(1)-GetNode(0),GetNode(2)-GetNode(0)); } /// Non-unit normal (faster) + Real area() const { return 0.5*normal_dir().length(); } + + Vec ParametricToRealCoords(const Vec & Param) const { + // Avoids temporary constructions + return Vec( + GetNode(0)[0]*(1.0-Param[0]-Param[1]) + GetNode(1)[0]*Param[0] + GetNode(2)[0]*Param[1], + GetNode(0)[1]*(1.0-Param[0]-Param[1]) + GetNode(1)[1]*Param[0] + GetNode(2)[1]*Param[1], + GetNode(0)[2]*(1.0-Param[0]-Param[1]) + GetNode(1)[2]*Param[0] + GetNode(2)[2]*Param[1] + ); + } + + /// Compute the closest point on the triangle to an input point. Return the type of projection, i.e., + /// is the projected point on a node, edge, surface of the triangle. Optionally calculate parametric coordinates. + template ProjectionType ClosestPoint(const Vec& p, Vec& ClosestPt, T ParamPt = nullptr) const; + + Real DistanceSquared(const Vec& P, Vec& ParamPt) const; + Real DistanceSquared(const Vec& P) const; + + const Vec& GetNode(const int index) const { assert(index >= 0 && index < 3); return nodes[index]; } + Vec& GetNode(const int index) { assert(index >= 0 && index < 3); return nodes[index]; } + + void SetNodes(const Vec& n0, const Vec& n1, const Vec& n2) { nodes = {{n0, n1, n2}}; } // Change triangle coordinates +private: + std::array,3> nodes; +}; + +namespace detail { +template +struct assign_parametric_coords { + static void apply(const REAL & x, const REAL & y, T parametric_coords) + { + static_assert(std::is_pointer::value, "Expecting pointer"); + parametric_coords[0] = x; + parametric_coords[1] = y; + } +}; +template +struct assign_parametric_coords { + static void apply(const REAL, const REAL, std::nullptr_t) {} +}; +} + +template +inline REAL Triangle3::DistanceSquared(const Vec& P, Vec& ParamPt) const +{ + Vec ClosestPt(MemberInit::NONE); + ClosestPoint(P, ClosestPt, ParamPt.data()); + return (P-ClosestPt).length_squared(); +} + +template +inline REAL Triangle3::DistanceSquared(const Vec& P) const +{ + Vec ClosestPt(MemberInit::NONE); + ClosestPoint(P, ClosestPt); + return (P-ClosestPt).length_squared(); +} + +// Adapted from closest face projection from "Real time Collision Detection" text, highly optimized +template +template +ProjectionType Triangle3::ClosestPoint(const Vec& p, Vec& ClosestPt, T ParamPt) const +{ + const Vec& a = GetNode(0); + const Vec& b = GetNode(1); + const Vec& c = GetNode(2); + + Vec ab(b-a); + Vec ac(c-a); + Vec ap(p-a); + + Real d1(Dot(ab,ap)); + Real d2(Dot(ac,ap)); + + if(d1 <= 0.0 && d2 <= 0.0) { + ClosestPt = a; + detail::assign_parametric_coords::apply(0.0, 0.0, ParamPt); + return ProjectionType::NODE; + } + + Vec bp(p-b); + Real d3(Dot(ab,bp)); + Real d4(Dot(ac,bp)); + + if(d3 >= 0.0 && d4 <= d3) { + ClosestPt = b; + detail::assign_parametric_coords::apply(1.0, 0.0, ParamPt); + return ProjectionType::NODE; + } + + Real vc(d1*d4-d3*d2); + if(vc <= 0.0 && d1 >= 0.0 && d3 <= 0.0) { + Real v = d1/(d1-d3); + ClosestPt = a + v * ab; + detail::assign_parametric_coords::apply(v, 0.0, ParamPt); + return ProjectionType::EDGE; + } + + Vec cp(p-c); + Real d5(Dot(ab,cp)); + Real d6(Dot(ac,cp)); + if(d6 >= 0.0 && d5 <= d6) { + ClosestPt = c; + detail::assign_parametric_coords::apply(0.0, 1.0, ParamPt); + return ProjectionType::NODE; + } + + Real vb(d5*d2 - d1*d6); + if(vb <= 0.0 && d2 >= 0.0 && d6 <= 0.0) { + Real w(d2/(d2-d6)); + ClosestPt = a + w * ac; + detail::assign_parametric_coords::apply(0.0, w, ParamPt); + return ProjectionType::EDGE; + } + + Real va(d3*d6 - d5*d4); + if(va <= 0.0 && (d4-d3) >= 0.0 && (d5-d6) >= 0.0) { + Real w((d4-d3)/((d4-d3) + (d5-d6))); + ClosestPt = b + w * (c-b); + detail::assign_parametric_coords::apply(1.0-w, w, ParamPt); + return ProjectionType::EDGE; + } + + Real denom(1.0/(va+vb+vc)); + Real v(vb*denom); + Real w(vc*denom); + ClosestPt = a + ab*v + ac*w; + detail::assign_parametric_coords::apply(v, w, ParamPt); + return ProjectionType::FACE; +} + +typedef Triangle3 Triangle3d; + +} +#endif // Akri_Triangle_h diff --git a/packages/krino/krino/krino_lib/Akri_TypeDefs.hpp b/packages/krino/krino/krino_lib/Akri_TypeDefs.hpp new file mode 100644 index 000000000000..3a949159289b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_TypeDefs.hpp @@ -0,0 +1,27 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef SIERRA_Akri_TypeDefs_h +#define SIERRA_Akri_TypeDefs_h + +#include +#include +#include + +namespace krino { + + class NINT{}; + class NPE_VAR{}; + class NPE_COORD{}; + class DIM{}; + + typedef std::vector< Vector3d > PointVec; + +} + +#endif // SIERRA_Akri_TypeDefs_h diff --git a/packages/krino/krino/krino_lib/Akri_Utility.hpp b/packages/krino/krino/krino_lib/Akri_Utility.hpp new file mode 100644 index 000000000000..a8a7e7b69aa2 --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Utility.hpp @@ -0,0 +1,66 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef SIERRA_Akri_Utility_h +#define SIERRA_Akri_Utility_h + +#include +#include +#include +#include + +namespace krino { +namespace utility { + + inline bool sign_change( double f1, double f2 ) { + return ( (f1 < 0.) ? (f2 >= 0.) : (f2 < 0.) ); // GOMA sign convention + //return ( (f1 > 0.) ? (f2 <= 0.) : (f2 > 0.) ); // Marching cubes sign convention + } + + inline int sign( double f ) { + return ( (f < 0.) ? -1 : 1 ); // GOMA sign convention + //return ( (f > 0.) ? 1 : -1 ); // Marching cubes sign convention + } + + inline bool is_less(double f1, double f2, double tol) { return (f2-f1 > tol*(std::fabs(f1)+std::fabs(f2))); } + inline bool is_more(double f1, double f2, double tol) { return (is_less(f2,f1,tol)); } + inline bool is_not_equal(double f1, double f2, double tol) { return (is_less(f1,f2,tol) || is_less(f2,f1,tol)); } + inline bool is_equal(double f1, double f2, double tol) { return (!is_less(f1,f2,tol) && !is_less(f2,f1,tol)); } + + inline bool is_less(double f1, double f2) { return is_less(f1,f2,100.0*std::numeric_limits::epsilon()); } + inline bool is_more(double f1, double f2) { return is_more(f1,f2,100.0*std::numeric_limits::epsilon()); } + inline bool is_not_equal(double f1, double f2) { return is_not_equal(f1,f2,100.0*std::numeric_limits::epsilon()); } + inline bool is_equal(double f1, double f2) { return is_equal(f1,f2,100.0*std::numeric_limits::epsilon()); } + + inline bool is_less(double f1, int i1, double f2, int i2, double tol) { return is_less(f1,f2,tol) ? true : (is_more(f1,f2,tol) ? false : (i1::epsilon()); } + inline bool is_more(double f1, int i1, double f2, int i2) { return is_more(f1,i1,f2,i2,100.0*std::numeric_limits::epsilon()); } + + template + inline void + free_all(std::vector & vec) {std::vector empty_vec; vec.swap(empty_vec);} + + template + inline size_t + storage_size(const std::vector & vec) {return (sizeof(std::vector) + vec.size()*sizeof(T*)); } + + // linear cost, requires T::storage_size + template + inline size_t + storage_size(const std::vector> & autovec) + { + size_t store_size = sizeof(std::vector>) + autovec.size()*sizeof(std::unique_ptr); + for (auto && entry : autovec) store_size += entry->storage_size(); + return store_size; + } + +} // namespace utility +} // namespace krino + +#endif // SIERRA_Akri_Utility_h diff --git a/packages/krino/krino/krino_lib/Akri_Vec.cpp b/packages/krino/krino/krino_lib/Akri_Vec.cpp new file mode 100644 index 000000000000..fa4faa7d9e1c --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Vec.cpp @@ -0,0 +1,38 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +namespace krino { + +static bool float_less(double a, double b) +{ + return static_cast(a) < static_cast(b); +} + +bool is_less_than_in_x_then_y_then_z(const Vector3d& A, const Vector3d &B) +{ + if (float_less(A[0], B[0])) + return true; + else if (float_less(B[0], A[0])) + return false; + + if (float_less(A[1], B[1])) + return true; + else if (float_less(B[1], A[1])) + return false; + + if (float_less(A[2], B[2])) + return true; + else if (float_less(B[2], A[2])) + return false; + + return false; +} + +} diff --git a/packages/krino/krino/krino_lib/Akri_Vec.hpp b/packages/krino/krino/krino_lib/Akri_Vec.hpp new file mode 100644 index 000000000000..e1213d9bb77b --- /dev/null +++ b/packages/krino/krino/krino_lib/Akri_Vec.hpp @@ -0,0 +1,26 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Vec_h +#define Akri_Vec_h + +#include + +namespace krino { + +using stk::math::MemberInit; +using stk::math::Vec; +typedef stk::math::Vec Vector3d; +typedef stk::math::Vec Vector2d; +typedef stk::math::Vec Float3d; + +bool is_less_than_in_x_then_y_then_z(const Vector3d& A, const Vector3d &B); + +} // namespace krino + +#endif // Akri_Vec_h diff --git a/packages/krino/krino/krino_lib/CMakeLists.txt b/packages/krino/krino/krino_lib/CMakeLists.txt new file mode 100644 index 000000000000..ac224f4eba62 --- /dev/null +++ b/packages/krino/krino/krino_lib/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + DEPLIBS krino_master_element_lib) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_lib) + diff --git a/packages/krino/krino/master_element/Akri_MasterElement.hpp b/packages/krino/krino/master_element/Akri_MasterElement.hpp new file mode 100644 index 000000000000..5749c4a6ca5d --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElement.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElement_h +#define Akri_MasterElement_h + +#include + +namespace krino { + +// Set actual MasterElement type we will use +typedef MasterElementHybrid MasterElement; + +} // end namespace krino + +#endif // Akri_MasterElement_h diff --git a/packages/krino/krino/master_element/Akri_MasterElementBasis.hpp b/packages/krino/krino/master_element/Akri_MasterElementBasis.hpp new file mode 100644 index 000000000000..39cb2743a920 --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementBasis.hpp @@ -0,0 +1,701 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElementBasis_h +#define Akri_MasterElementBasis_h + +#define ATTR_RESTRICT __restrict__ + +namespace krino { + +class Basis +{ +public: + Basis(unsigned deg) : my_degree(deg) {} + + virtual ~Basis() {} + virtual void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const = 0; + virtual void shape_fcn(const int nint, const double* p_coords, double* result) const = 0; + virtual void shape_fcn_deriv(const int nint, const double* p_coords, double* result ) const = 0; + unsigned degree() const { return my_degree; } + +private: + unsigned my_degree; +}; + +class Basis_LINE_2 : public Basis +{ +public: + Basis_LINE_2() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[0] = -1.0; + p_coords[1] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[ip]; + result[ip*2 + 0] = ( 1.0 - x ) * 0.5; + result[ip*2 + 1] = ( 1.0 + x ) * 0.5; + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + result[ip*2 + 0] = -0.5; + result[ip*2 + 1] = 0.5; + } + } +}; + +class Basis_LINE_3 : public Basis +{ +public: + Basis_LINE_3() : Basis(2) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[0] = -1.0; + p_coords[1] = 1.0; + p_coords[2] = 0.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[ip]; + result[ip*3 + 0] = -x * ( 1.0 - x ) * 0.5; + result[ip*3 + 1] = x * ( 1.0 + x ) * 0.5; + result[ip*3 + 2] = ( 1.0 - x ) * ( 1.0 + x ); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[ip]; + result[ip*3 + 0] = x; + result[ip*3 + 1] = x; + result[ip*3 + 2] = -2.0*x; + } + } +}; + +class Basis_TRI_3 : public Basis +{ +public: + Basis_TRI_3() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[0] = 0.0; p_coords[1] = 0.0; + p_coords[2] = 1.0; p_coords[3] = 0.0; + p_coords[4] = 0.0; p_coords[5] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*3 + 0] = 1.0 - x - y; + result[ip*3 + 1] = x; + result[ip*3 + 2] = y; + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + result[ip*6 + 0] = -1.0; + result[ip*6 + 1] = -1.0; + result[ip*6 + 2] = 1.0; + result[ip*6 + 3] = 0.0; + result[ip*6 + 4] = 0.0; + result[ip*6 + 5] = 1.0; + } + } +}; + +class Basis_TRI_6 : public Basis +{ +public: + Basis_TRI_6() : Basis(2) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = 0.0; p_coords[ 1] = 0.0; + p_coords[ 2] = 1.0; p_coords[ 3] = 0.0; + p_coords[ 4] = 0.0; p_coords[ 5] = 1.0; + p_coords[ 6] = 0.5; p_coords[ 7] = 0.0; + p_coords[ 8] = 0.5; p_coords[ 9] = 0.5; + p_coords[10] = 0.0; p_coords[11] = 0.5; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*6 + 0] = (x + y - 1.0)*(2.0*x + 2.0*y - 1.0); + result[ip*6 + 1] = x*(2.0*x - 1.0); + result[ip*6 + 2] = y*(2.0*y - 1.0); + result[ip*6 + 3] = -4.0*x*(x + y - 1.0); + result[ip*6 + 4] = 4.0*x*y; + result[ip*6 + 5] = -4.0*y*(x + y - 1.0); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*12 + 0] = 4.0*x + 4.0*y - 3.0; + result[ip*12 + 1] = 4.0*x + 4.0*y - 3.0; + result[ip*12 + 2] = 4.0*x - 1.0; + result[ip*12 + 3] = 0.0; + result[ip*12 + 4] = 0.0; + result[ip*12 + 5] = 4.0*y - 1.0; + result[ip*12 + 6] = -4.0*(2.0*x + y - 1.0); + result[ip*12 + 7] = -4.0*x; + result[ip*12 + 8] = 4.0*y; + result[ip*12 + 9] = 4.0*x; + result[ip*12 + 10] = -4.0*y; + result[ip*12 + 11] = -4.0*(x + 2.0*y - 1.0); + } + } +}; + +class Basis_QUAD_4 : public Basis +{ +public: + Basis_QUAD_4() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = -1.0; p_coords[ 1] = -1.0; + p_coords[ 2] = 1.0; p_coords[ 3] = -1.0; + p_coords[ 4] = 1.0; p_coords[ 5] = 1.0; + p_coords[ 6] = -1.0; p_coords[ 7] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*4 + 0] = 0.25*(1.0 - x)*(1.0 - y); + result[ip*4 + 1] = 0.25*(1.0 + x)*(1.0 - y); + result[ip*4 + 2] = 0.25*(1.0 + x)*(1.0 + y); + result[ip*4 + 3] = 0.25*(1.0 - x)*(1.0 + y); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*8 + 0] = -0.25*(1.0 - y); + result[ip*8 + 1] = -0.25*(1.0 - x); + result[ip*8 + 2] = 0.25*(1.0 - y); + result[ip*8 + 3] = -0.25*(1.0 + x); + result[ip*8 + 4] = 0.25*(1.0 + y); + result[ip*8 + 5] = 0.25*(1.0 + x); + result[ip*8 + 6] = -0.25*(1.0 + y); + result[ip*8 + 7] = 0.25*(1.0 - x); + } + } +}; + +class Basis_QUAD_9 : public Basis +{ +public: + Basis_QUAD_9() : Basis(2) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = -1.0; p_coords[ 1] = -1.0; + p_coords[ 2] = 1.0; p_coords[ 3] = -1.0; + p_coords[ 4] = 1.0; p_coords[ 5] = 1.0; + p_coords[ 6] = -1.0; p_coords[ 7] = 1.0; + p_coords[ 8] = 0.0; p_coords[ 9] = -1.0; + p_coords[10] = 1.0; p_coords[11] = 0.0; + p_coords[12] = 0.0; p_coords[13] = 1.0; + p_coords[14] = -1.0; p_coords[15] = 0.0; + p_coords[16] = 0.0; p_coords[17] = 0.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*9 + 0] = 0.25*x*(x - 1.0)*y*(y - 1.0); + result[ip*9 + 1] = 0.25*x*(x + 1.0)*y*(y - 1.0); + result[ip*9 + 2] = 0.25*x*(x + 1.0)*y*(y + 1.0); + result[ip*9 + 3] = 0.25*x*(x - 1.0)*y*(y + 1.0); + result[ip*9 + 4] = 0.5*(1.0 - x)*(1.0 + x)*y*(y - 1.0); + result[ip*9 + 5] = 0.5*x*(x + 1.0)*(1.0 - y)*(1.0 + y); + result[ip*9 + 6] = 0.5*(1.0 - x)*(1.0 + x)*y*(y + 1.0); + result[ip*9 + 7] = 0.5*x*(x - 1.0)*(1.0 - y)*(1.0 + y); + result[ip*9 + 8] = (1.0 - x)*(1.0 + x)*(1.0 - y)*(1.0 + y); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[2*ip + 0]; + const double y = p_coords[2*ip + 1]; + result[ip*18 + 0] = (-0.25 + 0.5*x)*(-1. + y)*y; + result[ip*18 + 1] = (-1.0 + x)*x*(-0.25 + 0.5*y); + result[ip*18 + 2] = (0.25 + 0.5*x)*(-1. + y)*y; + result[ip*18 + 3] = x*(1. + x)*(-0.25 + 0.5*y); + result[ip*18 + 4] = (0.25 + 0.5*x)*y*(1. + y); + result[ip*18 + 5] = x*(1. + x)*(0.25 + 0.5*y); + result[ip*18 + 6] = (-0.25 + 0.5*x)*y*(1. + y); + result[ip*18 + 7] = (-1. + x)*x*(0.25 + 0.5*y); + result[ip*18 + 8] = x*(1.0 - y)*y; + result[ip*18 + 9] = 0.5*(1.0 - x)*(1.0 + x)*(-1.0 + 2.0*y); + result[ip*18 + 10] = 0.5*(1.0 - y)*(1.0 + y)*(1.0 + 2.0*x); + result[ip*18 + 11] = -x*(1.0 + x)*y; + result[ip*18 + 12] = -y*(1.0 + y)*x; + result[ip*18 + 13] = 0.5*(1.0 - x)*(1.0 + x)*(1.0 + 2.0*y); + result[ip*18 + 14] = 0.5*(1.0 - y)*(1.0+ y)*(-1.0 + 2.0*x); + result[ip*18 + 15] = (1.0 - x)*x*y; + result[ip*18 + 16] = -2.0*(1.0 - y)*(1.0 + y)*x; + result[ip*18 + 17] = -2.0*(1.0 - x)*(1.0 + x)*y; + } + } +}; + +class Basis_TET_4 : public Basis +{ +public: + Basis_TET_4() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = 0.0; p_coords[ 1] = 0.0; p_coords[ 2] = 0.0; + p_coords[ 3] = 1.0; p_coords[ 4] = 0.0; p_coords[ 5] = 0.0; + p_coords[ 6] = 0.0; p_coords[ 7] = 1.0; p_coords[ 8] = 0.0; + p_coords[ 9] = 0.0; p_coords[10] = 0.0; p_coords[11] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*4 + 0] = 1.0 - x - y - z; + result[ip*4 + 1] = x; + result[ip*4 + 2] = y; + result[ip*4 + 3] = z; + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + result[ip*12 + 0] = -1.0; + result[ip*12 + 1] = -1.0; + result[ip*12 + 2] = -1.0; + result[ip*12 + 3] = 1.0; + result[ip*12 + 4] = 0.0; + result[ip*12 + 5] = 0.0; + result[ip*12 + 6] = 0.0; + result[ip*12 + 7] = 1.0; + result[ip*12 + 8] = 0.0; + result[ip*12 + 9] = 0.0; + result[ip*12 + 10] = 0.0; + result[ip*12 + 11] = 1.0; + } + } +}; + +class Basis_TET_10 : public Basis +{ +public: + Basis_TET_10() : Basis(2) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = 0.0; p_coords[ 1] = 0.0; p_coords[ 2] = 0.0; + p_coords[ 3] = 1.0; p_coords[ 4] = 0.0; p_coords[ 5] = 0.0; + p_coords[ 6] = 0.0; p_coords[ 7] = 1.0; p_coords[ 8] = 0.0; + p_coords[ 9] = 0.0; p_coords[10] = 0.0; p_coords[11] = 1.0; + p_coords[12] = 0.5; p_coords[13] = 0.0; p_coords[14] = 0.0; + p_coords[15] = 0.5; p_coords[16] = 0.5; p_coords[17] = 0.0; + p_coords[18] = 0.0; p_coords[19] = 0.5; p_coords[20] = 0.0; + p_coords[21] = 0.0; p_coords[22] = 0.0; p_coords[23] = 0.5; + p_coords[24] = 0.5; p_coords[25] = 0.0; p_coords[26] = 0.5; + p_coords[27] = 0.0; p_coords[28] = 0.5; p_coords[29] = 0.5; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*10 + 0] = (-1. + x + y + z)*(-1. + 2.*x + 2.*y + 2.*z); + result[ip*10 + 1] = x*(-1. + 2.*x); + result[ip*10 + 2] = y*(-1. + 2.*y); + result[ip*10 + 3] = z*(-1. + 2.*z); + result[ip*10 + 4] = -4.*x*(-1. + x + y + z); + result[ip*10 + 5] = 4.*x*y; + result[ip*10 + 6] = -4.*y*(-1. + x + y + z); + result[ip*10 + 7] = -4.*z*(-1. + x + y + z); + result[ip*10 + 8] = 4.*x*z; + result[ip*10 + 9] = 4.*y*z; + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*30 + 0] = -3.+ 4.*x + 4.*y + 4.*z; + result[ip*30 + 1] = -3.+ 4.*x + 4.*y + 4.*z; + result[ip*30 + 2] = -3.+ 4.*x + 4.*y + 4.*z; + result[ip*30 + 3] = -1.+ 4.*x; + result[ip*30 + 4] = 0.; + result[ip*30 + 5] = 0.; + result[ip*30 + 6] = 0.; + result[ip*30 + 7] = -1.+ 4.*y; + result[ip*30 + 8] = 0.; + result[ip*30 + 9] = 0.; + result[ip*30 + 10] = 0.; + result[ip*30 + 11] = -1.+ 4.*z; + result[ip*30 + 12] = -4.*(-1.+ 2*x + y + z); + result[ip*30 + 13] = -4.*x; + result[ip*30 + 14] = -4.*x; + result[ip*30 + 15] = 4.*y; + result[ip*30 + 16] = 4.*x; + result[ip*30 + 17] = 0.; + result[ip*30 + 18] = -4.*y; + result[ip*30 + 19] = -4.*(-1.+ x + 2*y + z); + result[ip*30 + 20] = -4.*y; + result[ip*30 + 21] = -4.*z; + result[ip*30 + 22] = -4.*z; + result[ip*30 + 23] = -4.*(-1.+ x + y + 2*z); + result[ip*30 + 24] = 4.*z; + result[ip*30 + 25] = 0.; + result[ip*30 + 26] = 4.*x; + result[ip*30 + 27] = 0.; + result[ip*30 + 28] = 4.*z; + result[ip*30 + 29] = 4.*y; + } + } +}; + +class Basis_HEX_8 : public Basis +{ +public: + Basis_HEX_8() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = -1.0; p_coords[ 1] = -1.0; p_coords[ 2] = -1.0; + p_coords[ 3] = 1.0; p_coords[ 4] = -1.0; p_coords[ 5] = -1.0; + p_coords[ 6] = 1.0; p_coords[ 7] = 1.0; p_coords[ 8] = -1.0; + p_coords[ 9] = -1.0; p_coords[10] = 1.0; p_coords[11] = -1.0; + p_coords[12] = -1.0; p_coords[13] = -1.0; p_coords[14] = 1.0; + p_coords[15] = 1.0; p_coords[16] = -1.0; p_coords[17] = 1.0; + p_coords[18] = 1.0; p_coords[19] = 1.0; p_coords[20] = 1.0; + p_coords[21] = -1.0; p_coords[22] = 1.0; p_coords[23] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*8 + 0] = 0.125*(1.0 - x)*(1.0 - y)*(1.0 - z); + result[ip*8 + 1] = 0.125*(1.0 + x)*(1.0 - y)*(1.0 - z); + result[ip*8 + 2] = 0.125*(1.0 + x)*(1.0 + y)*(1.0 - z); + result[ip*8 + 3] = 0.125*(1.0 - x)*(1.0 + y)*(1.0 - z); + result[ip*8 + 4] = 0.125*(1.0 - x)*(1.0 - y)*(1.0 + z); + result[ip*8 + 5] = 0.125*(1.0 + x)*(1.0 - y)*(1.0 + z); + result[ip*8 + 6] = 0.125*(1.0 + x)*(1.0 + y)*(1.0 + z); + result[ip*8 + 7] = 0.125*(1.0 - x)*(1.0 + y)*(1.0 + z); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*24 + 0] = -(1.0 - y)*(1.0 - z)*0.125; + result[ip*24 + 1] = -(1.0 - x)*(1.0 - z)*0.125; + result[ip*24 + 2] = -(1.0 - x)*(1.0 - y)*0.125; + result[ip*24 + 3] = (1.0 - y)*(1.0 - z)*0.125; + result[ip*24 + 4] = -(1.0 + x)*(1.0 - z)*0.125; + result[ip*24 + 5] = -(1.0 + x)*(1.0 - y)*0.125; + result[ip*24 + 6] = (1.0 + y)*(1.0 - z)*0.125; + result[ip*24 + 7] = (1.0 + x)*(1.0 - z)*0.125; + result[ip*24 + 8] = -(1.0 + x)*(1.0 + y)*0.125; + result[ip*24 + 9] = -(1.0 + y)*(1.0 - z)*0.125; + result[ip*24 + 10] = (1.0 - x)*(1.0 - z)*0.125; + result[ip*24 + 11] = -(1.0 - x)*(1.0 + y)*0.125; + result[ip*24 + 12] = -(1.0 - y)*(1.0 + z)*0.125; + result[ip*24 + 13] = -(1.0 - x)*(1.0 + z)*0.125; + result[ip*24 + 14] = (1.0 - x)*(1.0 - y)*0.125; + result[ip*24 + 15] = (1.0 - y)*(1.0 + z)*0.125; + result[ip*24 + 16] = -(1.0 + x)*(1.0 + z)*0.125; + result[ip*24 + 17] = (1.0 + x)*(1.0 - y)*0.125; + result[ip*24 + 18] = (1.0 + y)*(1.0 + z)*0.125; + result[ip*24 + 19] = (1.0 + x)*(1.0 + z)*0.125; + result[ip*24 + 20] = (1.0 + x)*(1.0 + y)*0.125; + result[ip*24 + 21] = -(1.0 + y)*(1.0 + z)*0.125; + result[ip*24 + 22] = (1.0 - x)*(1.0 + z)*0.125; + result[ip*24 + 23] = (1.0 - x)*(1.0 + y)*0.125; + } + } +}; + +class Basis_HEX_27 : public Basis +{ +public: + Basis_HEX_27() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = -1.0; p_coords[ 1] = -1.0; p_coords[ 2] = -1.0; + p_coords[ 3] = 1.0; p_coords[ 4] = -1.0; p_coords[ 5] = -1.0; + p_coords[ 6] = 1.0; p_coords[ 7] = 1.0; p_coords[ 8] = -1.0; + p_coords[ 9] = -1.0; p_coords[10] = 1.0; p_coords[11] = -1.0; + p_coords[12] = -1.0; p_coords[13] = -1.0; p_coords[14] = 1.0; + p_coords[15] = 1.0; p_coords[16] = -1.0; p_coords[17] = 1.0; + p_coords[18] = 1.0; p_coords[19] = 1.0; p_coords[20] = 1.0; + p_coords[21] = -1.0; p_coords[22] = 1.0; p_coords[23] = 1.0; + p_coords[24] = 0.0; p_coords[25] = -1.0; p_coords[26] = -1.0; + p_coords[27] = 1.0; p_coords[28] = 0.0; p_coords[29] = -1.0; + p_coords[30] = 0.0; p_coords[31] = 1.0; p_coords[32] = -1.0; + p_coords[33] = -1.0; p_coords[34] = 0.0; p_coords[35] = -1.0; + p_coords[36] = -1.0; p_coords[37] = -1.0; p_coords[38] = 0.0; + p_coords[39] = 1.0; p_coords[40] = -1.0; p_coords[41] = 0.0; + p_coords[42] = 1.0; p_coords[43] = 1.0; p_coords[44] = 0.0; + p_coords[45] = -1.0; p_coords[46] = 1.0; p_coords[47] = 0.0; + p_coords[48] = 0.0; p_coords[49] = -1.0; p_coords[50] = 1.0; + p_coords[51] = 1.0; p_coords[52] = 0.0; p_coords[53] = 1.0; + p_coords[54] = 0.0; p_coords[55] = 1.0; p_coords[56] = 1.0; + p_coords[57] = -1.0; p_coords[58] = 0.0; p_coords[59] = 1.0; + p_coords[60] = 0.0; p_coords[61] = 0.0; p_coords[62] = 0.0; + p_coords[63] = 0.0; p_coords[64] = 0.0; p_coords[65] = -1.0; + p_coords[66] = 0.0; p_coords[67] = 0.0; p_coords[68] = 1.0; + p_coords[69] = -1.0; p_coords[70] = 0.0; p_coords[71] = 0.0; + p_coords[72] = 1.0; p_coords[73] = 0.0; p_coords[74] = 0.0; + p_coords[75] = 0.0; p_coords[76] = -1.0; p_coords[77] = 0.0; + p_coords[78] = 0.0; p_coords[79] = 1.0; p_coords[80] = 0.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*27 + 0] = 0.125*(-1. + x)*x*(-1. + y)*y*(-1. + z)*z; + result[ip*27 + 1] = 0.125*x*(1.+ x)*(-1. + y)*y*(-1. + z)*z; + result[ip*27 + 2] = 0.125*x*(1.+ x)*y*(1.+ y)*(-1. + z)*z; + result[ip*27 + 3] = 0.125*(-1. + x)*x*y*(1.+ y)*(-1. + z)*z; + result[ip*27 + 4] = 0.125*(-1. + x)*x*(-1. + y)*y*z*(1.+ z); + result[ip*27 + 5] = 0.125*x*(1.+ x)*(-1. + y)*y*z*(1.+ z); + result[ip*27 + 6] = 0.125*x*(1.+ x)*y*(1.+ y)*z*(1.+ z); + result[ip*27 + 7] = 0.125*(-1. + x)*x*y*(1.+ y)*z*(1.+ z); + result[ip*27 + 8] = 0.25*(1. - x)*(1. + x)*(-1. + y)*y*(-1. + z)*z; + result[ip*27 + 9] = 0.25*x*(1.+ x)*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*27 + 10] = 0.25*(1. - x)*(1. + x)*y*(1.+ y)*(-1. + z)*z; + result[ip*27 + 11] = 0.25*(-1. + x)*x*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*27 + 12] = 0.25*(-1. + x)*x*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*27 + 13] = 0.25*x*(1.+ x)*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*27 + 14] = 0.25*x*(1.+ x)*y*(1.+ y)*(1. - z)*(1. + z); + result[ip*27 + 15] = 0.25*(-1. + x)*x*y*(1.+ y)*(1. - z)*(1. + z); + result[ip*27 + 16] = 0.25*(1. - x)*(1. + x)*(-1. + y)*y*z*(1.+ z); + result[ip*27 + 17] = 0.25*x*(1.+ x)*(1. - y)*(1. + y)*z*(1.+ z); + result[ip*27 + 18] = 0.25*(1. - x)*(1. + x)*y*(1.+ y)*z*(1.+ z); + result[ip*27 + 19] = 0.25*(-1. + x)*x*(1. - y)*(1. + y)*z*(1.+ z); + result[ip*27 + 20] = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*27 + 21] = 0.5*(1. - x)*(1. + x)*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*27 + 22] = 0.5*(1. - x)*(1. + x)*(1. - y)*(1. + y)*z*(1.+ z); + result[ip*27 + 23] = 0.5*(-1. + x)*x*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*27 + 24] = 0.5*x*(1.+ x)*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*27 + 25] = 0.5*(1. - x)*(1. + x)*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*27 + 26] = 0.5*(1. - x)*(1. + x)*y*(1.+ y)*(1. - z)*(1. + z); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + result[ip*81 + 0] = (-0.125 + 0.25*x)*(-1. + y)*y*(-1. + z)*z; + result[ip*81 + 1] = (-1. + x)*x*(-0.125 + 0.25*y)*(-1. + z)*z; + result[ip*81 + 2] = (-1. + x)*x*(-1. + y)*y*(-0.125 + 0.25*z); + result[ip*81 + 3] = (0.125 + 0.25*x)*(-1. + y)*y*(-1. + z)*z; + result[ip*81 + 4] = x*(1. + x)*(-0.125 + 0.25*y)*(-1. + z)*z; + result[ip*81 + 5] = x*(1. + x)*(-1. + y)*y*(-0.125 + 0.25*z); + result[ip*81 + 6] = (0.125 + 0.25*x)*y*(1. + y)*(-1. + z)*z; + result[ip*81 + 7] = x*(1. + x)*(0.125 + 0.25*y)*(-1. + z)*z; + result[ip*81 + 8] = x*(1. + x)*y*(1. + y)*(-0.125 + 0.25*z); + result[ip*81 + 9] = (-0.125 + 0.25*x)*y*(1. + y)*(-1. + z)*z; + result[ip*81 + 10] = (-1. + x)*x*(0.125 + 0.25*y)*(-1. + z)*z; + result[ip*81 + 11] = (-1. + x)*x*y*(1. + y)*(-0.125 + 0.25*z); + result[ip*81 + 12] = (-0.125 + 0.25*x)*(-1. + y)*y*z*(1. + z); + result[ip*81 + 13] = (-1. + x)*x*(-0.125 + 0.25*y)*z*(1. + z); + result[ip*81 + 14] = (-1. + x)*x*(-1. + y)*y*(0.125 + 0.25*z); + result[ip*81 + 15] = (0.125 + 0.25*x)*(-1. + y)*y*z*(1. + z); + result[ip*81 + 16] = x*(1. + x)*(-0.125 + 0.25*y)*z*(1. + z); + result[ip*81 + 17] = x*(1. + x)*(-1. + y)*y*(0.125 + 0.25*z); + result[ip*81 + 18] = (0.125 + 0.25*x)*y*(1. + y)*z*(1. + z); + result[ip*81 + 19] = x*(1. + x)*(0.125 + 0.25*y)*z*(1. + z); + result[ip*81 + 20] = x*(1. + x)*y*(1. + y)*(0.125 + 0.25*z); + result[ip*81 + 21] = (-0.125 + 0.25*x)*y*(1. + y)*z*(1. + z); + result[ip*81 + 22] = (-1. + x)*x*(0.125 + 0.25*y)*z*(1. + z); + result[ip*81 + 23] = (-1. + x)*x*y*(1. + y)*(0.125 + 0.25*z); + result[ip*81 + 24] = -0.5*x*(-1. + y)*y*(-1. + z)*z; + result[ip*81 + 25] = (1. - x)*(1. + x)*(-0.25 + 0.5*y)*(-1. + z)*z; + result[ip*81 + 26] = (1. - x)*(1. + x)*(-1. + y)*y*(-0.25 + 0.5*z); + result[ip*81 + 27] = (0.25 + 0.5*x)*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*81 + 28] = x*(1. + x)*(-0.5*y)*(-1. + z)*z; + result[ip*81 + 29] = x*(1. + x)*(1. - y)*(1. + y)*(-0.25 + 0.5*z); + result[ip*81 + 30] = -0.5*x*y*(1. + y)*(-1. + z)*z; + result[ip*81 + 31] = (1. - x)*(1. + x)*(0.25 + 0.5*y)*(-1. + z)*z; + result[ip*81 + 32] = (1. - x)*(1. + x)*y*(1. + y)*(-0.25 + 0.5*z); + result[ip*81 + 33] = (-0.25 + 0.5*x)*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*81 + 34] = (-1. + x)*x*(-0.5*y)*(-1. + z)*z; + result[ip*81 + 35] = (-1. + x)*x*(1. - y)*(1. + y)*(-0.25 + 0.5*z); + result[ip*81 + 36] = (-0.25 + 0.5*x)*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*81 + 37] = (-1. + x)*x*(-0.25 + 0.5*y)*(1. - z)*(1. + z); + result[ip*81 + 38] = (-1. + x)*x*(-1. + y)*y*(-0.5*z); + result[ip*81 + 39] = (0.25 + 0.5*x)*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*81 + 40] = x*(1. + x)*(-0.25 + 0.5*y)*(1. - z)*(1. + z); + result[ip*81 + 41] = x*(1. + x)*(-1. + y)*y*(-0.5*z); + result[ip*81 + 42] = (0.25 + 0.5*x)*y*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 43] = x*(1. + x)*(0.25 + 0.5*y)*(1. - z)*(1. + z); + result[ip*81 + 44] = x*(1. + x)*y*(1. + y)*(-0.5*z); + result[ip*81 + 45] = (-0.25 + 0.5*x)*y*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 46] = (-1. + x)*x*(0.25 + 0.5*y)*(1. - z)*(1. + z); + result[ip*81 + 47] = (-1. + x)*x*y*(1. + y)*(-0.5*z); + result[ip*81 + 48] = -0.5*x*(-1. + y)*y*z*(1. + z); + result[ip*81 + 49] = (1. - x)*(1. + x)*(-0.25 + 0.5*y)*z*(1. + z); + result[ip*81 + 50] = (1. - x)*(1. + x)*(-1. + y)*y*(0.25 + 0.5*z); + result[ip*81 + 51] = (0.25 + 0.5*x)*(1. - y)*(1. + y)*z*(1. + z); + result[ip*81 + 52] = x*(1. + x)*(-0.5*y)*z*(1. + z); + result[ip*81 + 53] = x*(1. + x)*(1. - y)*(1. + y)*(0.25 + 0.5*z); + result[ip*81 + 54] = -0.5*x*y*(1. + y)*z*(1. + z); + result[ip*81 + 55] = (1. - x)*(1. + x)*(0.25 + 0.5*y)*z*(1. + z); + result[ip*81 + 56] = (1. - x)*(1. + x)*y*(1. + y)*(0.25 + 0.5*z); + result[ip*81 + 57] = (-0.25 + 0.5*x)*(1. - y)*(1. + y)*z*(1. + z); + result[ip*81 + 58] = (-1. + x)*x*(-0.5*y)*z*(1. + z); + result[ip*81 + 59] = (-1. + x)*x*(1. - y)*(1. + y)*(0.25 + 0.5*z); + result[ip*81 + 60] = -2.*x*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 61] = (1. - x)*(1. + x)*(-2.*y)*(1. - z)*(1. + z); + result[ip*81 + 62] = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(-2.*z); + result[ip*81 + 63] = -x*(1. - y)*(1. + y)*(-1. + z)*z; + result[ip*81 + 64] = (1. - x)*(1. + x)*(-y)*(-1. + z)*z; + result[ip*81 + 65] = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(-0.5 + z); + result[ip*81 + 66] = -x*(1. - y)*(1. + y)*z*(1. + z); + result[ip*81 + 67] = (1. - x)*(1. + x)*(-y)*z*(1. + z); + result[ip*81 + 68] = (1. - x)*(1. + x)*(1. - y)*(1. + y)*(0.5 + z); + result[ip*81 + 69] = (-0.5 + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 70] = (-1. + x)*x*(-y)*(1. - z)*(1. + z); + result[ip*81 + 71] = (-1. + x)*x*(1. - y)*(1. + y)*(-z); + result[ip*81 + 72] = (0.5 + x)*(1. - y)*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 73] = x*(1. + x)*(-y)*(1. - z)*(1. + z); + result[ip*81 + 74] = x*(1. + x)*(1. - y)*(1. + y)*(-z); + result[ip*81 + 75] = -x*(-1. + y)*y*(1. - z)*(1. + z); + result[ip*81 + 76] = (1. - x)*(1. + x)*(-0.5 + y)*(1. - z)*(1. + z); + result[ip*81 + 77] = (1. - x)*(1. + x)*(-1. + y)*y*(-z); + result[ip*81 + 78] = -x*y*(1. + y)*(1. - z)*(1. + z); + result[ip*81 + 79] = (1. - x)*(1. + x)*(0.5 + y)*(1. - z)*(1. + z); + result[ip*81 + 80] = (1. - x)*(1. + x)*y*(1. + y)*(-z); + } + } +}; + +class Basis_WEDGE_6 : public Basis +{ +public: + Basis_WEDGE_6() : Basis(1) {} + + void nodal_parametric_coordinates(double* ATTR_RESTRICT p_coords) const + { + p_coords[ 0] = 0.0; p_coords[ 1] = 0.0; p_coords[ 2] = -1.0; + p_coords[ 3] = 1.0; p_coords[ 4] = 0.0; p_coords[ 5] = -1.0; + p_coords[ 6] = 0.0; p_coords[ 7] = 1.0; p_coords[ 8] = -1.0; + p_coords[ 9] = 0.0; p_coords[10] = 0.0; p_coords[11] = 1.0; + p_coords[12] = 1.0; p_coords[13] = 0.0; p_coords[14] = 1.0; + p_coords[15] = 0.0; p_coords[16] = 1.0; p_coords[17] = 1.0; + } + void shape_fcn(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for (int ip(0); ip < nint; ++ip) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + const double t = 1. - x - y; + + result[ip*6 + 0] = 0.5 * t * (1.0 - z); + result[ip*6 + 1] = 0.5 * x * (1.0 - z); + result[ip*6 + 2] = 0.5 * y * (1.0 - z); + result[ip*6 + 3] = 0.5 * t * (1.0 + z); + result[ip*6 + 4] = 0.5 * x * (1.0 + z); + result[ip*6 + 5] = 0.5 * y * (1.0 + z); + } + } + void shape_fcn_deriv(const int nint, const double* ATTR_RESTRICT p_coords, double* ATTR_RESTRICT result) const + { + for ( int ip(0); ip < nint; ++ip ) + { + const double x = p_coords[3*ip + 0]; + const double y = p_coords[3*ip + 1]; + const double z = p_coords[3*ip + 2]; + const double t = 1. - x - y; + + result[ip*18 + 0] = -0.5 * (1.0 - z); + result[ip*18 + 1] = -0.5 * (1.0 - z); + result[ip*18 + 2] = -0.5 * t; + result[ip*18 + 3] = 0.5 * (1.0 - z); + result[ip*18 + 4] = 0.; + result[ip*18 + 5] = -0.5 * x; + result[ip*18 + 6] = 0.; + result[ip*18 + 7] = 0.5 * (1.0 - z); + result[ip*18 + 8] = -0.5 * y; + result[ip*18 + 9] = -0.5 * (1.0 + z); + result[ip*18 + 10] = -0.5 * (1.0 + z); + result[ip*18 + 11] = 0.5 * t; + result[ip*18 + 12] = 0.5 * (1.0 + z); + result[ip*18 + 13] = 0.; + result[ip*18 + 14] = 0.5 * x; + result[ip*18 + 15] = 0.; + result[ip*18 + 16] = 0.5 * (1.0 + z); + result[ip*18 + 17] = 0.5 * y; + } + } +}; + +} // end namespace krino + +#endif // Akri_MasterElementBasis_h diff --git a/packages/krino/krino/master_element/Akri_MasterElementCalc.cpp b/packages/krino/krino/master_element/Akri_MasterElementCalc.cpp new file mode 100644 index 000000000000..fa29448343ac --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementCalc.cpp @@ -0,0 +1,456 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +namespace krino { + +void +MasterElementCalc::scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const int ndims, + const int nnodes, + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) //: (nvec,nelem,nint) +{ + for ( int ip(0); ip < nint; ++ip ) { + for ( int elem(0); elem < nelem; ++elem) { + for ( int dim(0); dim < ndims; ++dim ) { + double & val = vector[ip*ndims + dim]; + val = 0.0; + for ( int node(0); node < nnodes; ++node ) { + val += gradop[( (ip*nelem + elem)*nnodes + node)*ndims + dim] * sfield[ node ]; + } + } + } + } +} + +void +MasterElementCalc::determinant( + const int num_elem_dims, + const int num_coord_dims, + const int nint, + const int npe_g, + const double* deriv_g, // (num_elem_dims,npe_g,nint) + const int nelem, + const double* coords, // (num_coord_dims,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) // (nelem) +{ + if (num_elem_dims != num_coord_dims) + { + if (2 == num_elem_dims) + { + ThrowAssert(3 == num_coord_dims); + MasterElementCalc::determinant_element2d_in_3d(nint, npe_g, deriv_g, nelem, coords, det_J, error); + } + else + { + ThrowAssert(1 == num_elem_dims); + if (2 == num_coord_dims) + { + MasterElementCalc::determinant_element1d_in_2d(nint, npe_g, deriv_g, nelem, coords, det_J, error); + } + else + { + MasterElementCalc::determinant_element1d_in_3d(nint, npe_g, deriv_g, nelem, coords, det_J, error); + } + } + } + else + { + ThrowAssert(num_elem_dims >= 2 && num_elem_dims <= 3); + if (2 == num_elem_dims) MasterElementCalc::determinant_2d(nint, npe_g, deriv_g, nelem, coords, det_J, error); + else MasterElementCalc::determinant_3d(nint, npe_g, deriv_g, nelem, coords, det_J, error); + } +} + +void +MasterElementCalc::gradient_operator( + const int num_elem_dims, + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) +{ + ThrowAssert(num_elem_dims >= 2 && num_elem_dims <= 3); + if (2 == num_elem_dims) gradient_operator_2d(nint, npe_g, deriv_g, npe_f, deriv_f, nelem, coords, gradop, det_J, error); + else gradient_operator_3d(nint, npe_g, deriv_g, npe_f, deriv_f, nelem, coords, gradop, det_J, error); +} + +void +MasterElementCalc::determinant_2d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error) +{ + auto c2d = [coords,npe](int d, int i, int e) { return coords[d + 2*(i + npe*e)]; }; + auto d2d = [deriv,npe](int d, int n, int q) { return deriv[d + 2*(n + npe*q)]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds0 = 0.; + double dx_ds1 = 0.; + double dy_ds0 = 0.; + double dy_ds1 = 0.; + + for ( int kn(0); kn < npe; ++kn ) { + dx_ds0 += d2d(0,kn,ki)*c2d(0,kn,ke); + dx_ds1 += d2d(1,kn,ki)*c2d(0,kn,ke); + + dy_ds0 += d2d(0,kn,ki)*c2d(1,kn,ke); + dy_ds1 += d2d(1,kn,ki)*c2d(1,kn,ke); + } + + detj(ke,ki) = dx_ds0*dy_ds1 - dy_ds0*dx_ds1; + + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + } + } +} + +void +MasterElementCalc::determinant_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error) +{ + auto c3d = [coords,npe](int d, int i, int e) { return coords[d + 3*(i + npe*e)]; }; + auto d3d = [deriv,npe](int d, int n, int q) { return deriv[d + 3*(n + npe*q)]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds0 = 0.; + double dx_ds1 = 0.; + double dx_ds2 = 0.; + double dy_ds0 = 0.; + double dy_ds1 = 0.; + double dy_ds2 = 0.; + double dz_ds0 = 0.; + double dz_ds1 = 0.; + double dz_ds2 = 0.; + + for ( int kn(0); kn < npe; ++kn ) { + dx_ds0 += d3d(0,kn,ki)*c3d(0,kn,ke); + dx_ds1 += d3d(1,kn,ki)*c3d(0,kn,ke); + dx_ds2 += d3d(2,kn,ki)*c3d(0,kn,ke); + + dy_ds0 += d3d(0,kn,ki)*c3d(1,kn,ke); + dy_ds1 += d3d(1,kn,ki)*c3d(1,kn,ke); + dy_ds2 += d3d(2,kn,ki)*c3d(1,kn,ke); + + dz_ds0 += d3d(0,kn,ki)*c3d(2,kn,ke); + dz_ds1 += d3d(1,kn,ki)*c3d(2,kn,ke); + dz_ds2 += d3d(2,kn,ki)*c3d(2,kn,ke); + } + + detj(ke,ki) = dx_ds0*( dy_ds1*dz_ds2 - dz_ds1*dy_ds2 ) + + dy_ds0*( dz_ds1*dx_ds2 - dx_ds1*dz_ds2 ) + + dz_ds0*( dx_ds1*dy_ds2 - dy_ds1*dx_ds2 ); + + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + } + } +} + +void +MasterElementCalc::determinant_element2d_in_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error) +{ + auto c3d = [coords,npe](int d, int i, int e) { return coords[d + 3*(i + npe*e)]; }; + auto d2d = [deriv,npe](int d, int n, int q) { return deriv[d + 2*(n + npe*q)]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds0 = 0.; + double dx_ds1 = 0.; + double dy_ds0 = 0.; + double dy_ds1 = 0.; + double dz_ds0 = 0.; + double dz_ds1 = 0.; + + for ( int kn(0); kn < npe; ++kn ) { + dx_ds0 += d2d(0,kn,ki)*c3d(0,kn,ke); + dx_ds1 += d2d(1,kn,ki)*c3d(0,kn,ke); + + dy_ds0 += d2d(0,kn,ki)*c3d(1,kn,ke); + dy_ds1 += d2d(1,kn,ki)*c3d(1,kn,ke); + + dz_ds0 += d2d(0,kn,ki)*c3d(2,kn,ke); + dz_ds1 += d2d(1,kn,ki)*c3d(2,kn,ke); + } + + const double detXY = dx_ds0*dy_ds1 - dx_ds1*dy_ds0; + const double detYZ = dy_ds0*dz_ds1 - dy_ds1*dz_ds0; + const double detXZ =-dx_ds0*dz_ds1 + dx_ds1*dz_ds0; + + detj(ke,ki) = std::sqrt(detXY*detXY + detYZ*detYZ + detXZ*detXZ); + + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + } + } +} + +void +MasterElementCalc::determinant_element1d_in_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error) +{ + auto c3d = [coords,npe](int d, int i, int e) { return coords[d + 3*(i + npe*e)]; }; + auto d1d = [deriv,npe](int d, int n, int q) { return deriv[d + n + npe*q]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds = 0.; + double dy_ds = 0.; + double dz_ds = 0.; + + for ( int kn(0); kn < npe; ++kn ) { + dx_ds += d1d(0,kn,ki)*c3d(0,kn,ke); + dy_ds += d1d(0,kn,ki)*c3d(1,kn,ke); + dz_ds += d1d(0,kn,ki)*c3d(2,kn,ke); + } + + detj(ke,ki) = std::sqrt(dx_ds*dx_ds + dy_ds*dy_ds + dz_ds*dz_ds); + + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + } + } +} + +void +MasterElementCalc::determinant_element1d_in_2d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error) +{ + auto c2d = [coords,npe](int d, int i, int e) { return coords[d + 2*(i + npe*e)]; }; + auto d1d = [deriv,npe](int d, int n, int q) { return deriv[d + n + npe*q]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds = 0.; + double dy_ds = 0.; + + for ( int kn(0); kn < npe; ++kn ) { + dx_ds += d1d(0,kn,ki)*c2d(0,kn,ke); + dy_ds += d1d(0,kn,ki)*c2d(1,kn,ke); + } + + detj(ke,ki) = std::sqrt(dx_ds*dx_ds + dy_ds*dy_ds); + + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + } + } +} + +void +MasterElementCalc::gradient_operator_2d( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) +{ + auto c2d = [coords,npe_g](int d, int i, int e) { return coords[d + 2*(i + npe_g*e)]; }; + auto d2d = [deriv_g,npe_g](int d, int n, int q) { return deriv_g[d + 2*(n + npe_g*q)]; }; + auto d2df = [deriv_f,npe_f](int d, int n, int q) { return deriv_f[d + 2*(n + npe_f*q)]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + auto g2d = [gradop,npe_f,nelem](int d, int n, int e, int q) -> double& { return gradop[d + 2*(n + npe_f*(e+nelem*q))]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds0 = 0.; + double dx_ds1 = 0.; + double dy_ds0 = 0.; + double dy_ds1 = 0.; + + for ( int kn(0); kn < npe_g; ++kn ) { + dx_ds0 = dx_ds0+d2d(0,kn,ki)*c2d(0,kn,ke); + dx_ds1 = dx_ds1+d2d(1,kn,ki)*c2d(0,kn,ke); + + dy_ds0 = dy_ds0+d2d(0,kn,ki)*c2d(1,kn,ke); + dy_ds1 = dy_ds1+d2d(1,kn,ki)*c2d(1,kn,ke); + } + + detj(ke,ki) = dx_ds0*dy_ds1 - dy_ds0*dx_ds1; + + double denom = 0.0; + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + else + { + denom = 1./detj(ke,ki); + } + + // compute the gradient operators at the integration station - + for ( int kn(0); kn < npe_f; ++kn ) { + g2d(0,kn,ki,ke) = denom * ( d2df(0,kn,ki)*dy_ds1 - d2df(1,kn,ki)*dy_ds0 ); + g2d(1,kn,ki,ke) = denom * ( d2df(1,kn,ki)*dx_ds0 - d2df(0,kn,ki)*dx_ds1 ); + } + } + } +} + +void +MasterElementCalc::gradient_operator_3d( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) +{ + auto c3d = [coords,npe_g](int d, int i, int e) { return coords[d + 3*(i + npe_g*e)]; }; + auto d3d = [deriv_g,npe_g](int d, int n, int q) { return deriv_g[d + 3*(n + npe_g*q)]; }; + auto d3df = [deriv_f,npe_f](int d, int n, int q) { return deriv_f[d + 3*(n + npe_f*q)]; }; + auto detj = [det_J,nelem](int e, int q) -> double& { return det_J[e+nelem*q]; }; + auto g3d = [gradop,npe_f,nelem](int d, int n, int e, int q) -> double& { return gradop[d + 3*(n + npe_f*(e+nelem*q))]; }; + + for (int elem(0); elem < nelem; ++elem) error[elem] = 0.; + + for (int ke(0); ke < nelem; ++ke) { + for ( int ki(0); ki < nint; ++ki ) { + double dx_ds0 = 0.; + double dx_ds1 = 0.; + double dx_ds2 = 0.; + double dy_ds0 = 0.; + double dy_ds1 = 0.; + double dy_ds2 = 0.; + double dz_ds0 = 0.; + double dz_ds1 = 0.; + double dz_ds2 = 0.; + + for ( int kn(0); kn < npe_g; ++kn ) { + dx_ds0 = dx_ds0+d3d(0,kn,ki)*c3d(0,kn,ke); + dx_ds1 = dx_ds1+d3d(1,kn,ki)*c3d(0,kn,ke); + dx_ds2 = dx_ds2+d3d(2,kn,ki)*c3d(0,kn,ke); + + dy_ds0 = dy_ds0+d3d(0,kn,ki)*c3d(1,kn,ke); + dy_ds1 = dy_ds1+d3d(1,kn,ki)*c3d(1,kn,ke); + dy_ds2 = dy_ds2+d3d(2,kn,ki)*c3d(1,kn,ke); + + dz_ds0 = dz_ds0+d3d(0,kn,ki)*c3d(2,kn,ke); + dz_ds1 = dz_ds1+d3d(1,kn,ki)*c3d(2,kn,ke); + dz_ds2 = dz_ds2+d3d(2,kn,ki)*c3d(2,kn,ke); + } + + detj(ke,ki) = dx_ds0*( dy_ds1*dz_ds2 - dz_ds1*dy_ds2 ) + + dy_ds0*( dz_ds1*dx_ds2 - dx_ds1*dz_ds2 ) + + dz_ds0*( dx_ds1*dy_ds2 - dy_ds1*dx_ds2 ); + + double denom = 0.0; + if ( detj(ke,ki) <= 0. ) + { + error[ke] = 1.; + } + else + { + denom = 1./detj(ke,ki); + } + + // compute the gradient operators at the integration station - + for ( int kn(0); kn < npe_f; ++kn ) { + g3d(0,kn,ki,ke) = denom * + ( d3df(0,kn,ki)*(dy_ds1*dz_ds2 - dz_ds1*dy_ds2) + + d3df(1,kn,ki)*(dz_ds0*dy_ds2 - dy_ds0*dz_ds2) + + d3df(2,kn,ki)*(dy_ds0*dz_ds1 - dz_ds0*dy_ds1) ); + + g3d(1,kn,ki,ke) = denom * + ( d3df(0,kn,ki)*(dz_ds1*dx_ds2 - dx_ds1*dz_ds2) + + d3df(1,kn,ki)*(dx_ds0*dz_ds2 - dz_ds0*dx_ds2) + + d3df(2,kn,ki)*(dz_ds0*dx_ds1 - dx_ds0*dz_ds1) ); + + g3d(2,kn,ki,ke) = denom * + ( d3df(0,kn,ki)*(dx_ds1*dy_ds2 - dy_ds1*dx_ds2) + + d3df(1,kn,ki)*(dy_ds0*dx_ds2 - dx_ds0*dy_ds2) + + d3df(2,kn,ki)*(dx_ds0*dy_ds1 - dy_ds0*dx_ds1) ); + } + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/master_element/Akri_MasterElementCalc.hpp b/packages/krino/krino/master_element/Akri_MasterElementCalc.hpp new file mode 100644 index 000000000000..f5d99e687f9f --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementCalc.hpp @@ -0,0 +1,122 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElementCalc_h +#define Akri_MasterElementCalc_h + +namespace krino { + +class MasterElementCalc +{ +public: + static void scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const int ndims, + const int nnodes, + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ); //: (nvec,nelem,nint) + + static void determinant( + const int num_elem_dims, + const int num_coord_dims, + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error ); // (nelem) + + static void gradient_operator( + const int num_elem_dims, + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void determinant_2d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error); // (nelem) + static void determinant_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void determinant_element2d_in_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void determinant_element1d_in_3d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void determinant_element1d_in_2d( + const int nint, + const int npe, + const double* deriv, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void gradient_operator_2d( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error); // (nelem) + + static void gradient_operator_3d( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error); // (nelem) +}; + +} // end namespace krino + +#endif // Akri_MasterElementCalc_h diff --git a/packages/krino/krino/master_element/Akri_MasterElementHybrid.cpp b/packages/krino/krino/master_element/Akri_MasterElementHybrid.cpp new file mode 100644 index 000000000000..d8b7f86c13b7 --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementHybrid.cpp @@ -0,0 +1,181 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include // for get_cell_topology +#include + +#ifdef __INTEL_COMPILER +#include +#else +//FieldContainer has shadowed variables +//this disables the checking on GCC only +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop +#endif +#include +#include +#include +#include +#include +#include + +namespace krino { + +MasterElementHybrid::MasterElementHybrid( + stk::topology topology, + std::unique_ptr basis) +: m_topology(topology), + m_Basis(std::move(basis)) +{ + // set the cubature + Intrepid::DefaultCubatureFactory cubatureFactory; + Teuchos::RCP> intrepidCubature = cubatureFactory.create(stk::mesh::get_cell_topology(topology), 2*m_Basis->degree()); + m_numIntgPts = intrepidCubature->getNumPoints(); + + m_numNodes = topology.num_nodes(); + m_numElemDims = intrepidCubature->getDimension(); + + // Allocate reference data + m_shapeFuncs.resize(m_numIntgPts*m_numNodes); + m_pointGrads.resize(m_numIntgPts*m_numNodes*m_numElemDims ); + m_refPoints.resize(m_numIntgPts*m_numElemDims); + m_refWeights.resize(m_numIntgPts); + m_refCoords.resize(m_numNodes*m_numElemDims); + + // retrieve the cubature points and weights + std::vector refPointsDims = {m_numIntgPts, m_numElemDims}; + Intrepid::FieldContainer refPointsFC( refPointsDims, m_refPoints.data() ); + std::vector refWeightsDims = {m_numIntgPts}; + Intrepid::FieldContainer refWeightsFC( refWeightsDims, m_refWeights.data() ); + intrepidCubature->getCubature(refPointsFC, refWeightsFC); + + // compute the reference values and gradients at the integration points + m_Basis->shape_fcn(m_numIntgPts, m_refPoints.data(), m_shapeFuncs.data()); + m_Basis->shape_fcn_deriv(m_numIntgPts, m_refPoints.data(), m_pointGrads.data()); + m_Basis->nodal_parametric_coordinates(m_refCoords.data()); + + m_centroidParCoords.resize(m_numElemDims, 0.); + for(int n=0; n < m_numNodes; ++n) + { + for(int d=0; d < m_numElemDims; ++d) + { + m_centroidParCoords[d] += m_refCoords[n*m_numElemDims + d]; + } + } +} + +void +MasterElementHybrid::determinant( + const int numCoordDims, + const int nelem, + const double* coords, // (numCoordDims,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const // (nelem) +{ + MasterElementCalc::determinant(m_numElemDims, numCoordDims, m_numIntgPts, m_numNodes, m_pointGrads.data(), nelem, coords, det_J, error); +} + +void +MasterElementHybrid::shape_fcn( + const int nint, // returns array(npe,nint) + const double* p_coords, + double* result) const +{ + m_Basis->shape_fcn(nint, p_coords, result); +} + +void +MasterElementHybrid::shape_fcn_deriv( + const int nint, + const double* p_coords, + double* result ) const +{ + m_Basis->shape_fcn_deriv(nint, p_coords, result); +} + + +void +MasterElementHybrid::interpolate_point( + const int npar_coord, + const double * par_coord, // (npar_coord) + const int ncomp_field, + const double * field, // (ncomp_field,num_nodes) + double * result ) const // (ncomp_field) +{ + std::vector shape(m_numNodes); + shape_fcn(1, par_coord, shape.data()); + for ( int comp(0); comp < ncomp_field; ++comp ) { + result[ comp ] = 0.0; + for ( int node(0); node < m_numNodes; ++node ) { + result[ comp ] += shape[node] * field[ ncomp_field * node + comp ]; + } + } +} + +void +MasterElementHybrid::scalar_gradient( + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const //: (nvec,nelem,nint) +{ + MasterElementCalc::scalar_gradient(m_numIntgPts, nelem, m_numElemDims, m_numNodes, gradop, det_J, sfield, vector); +} + +void +MasterElementHybrid::scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const //: (nvec,nelem,nint) +{ + MasterElementCalc::scalar_gradient(nint, nelem, m_numElemDims, m_numNodes, gradop, det_J, sfield, vector); +} + +void +MasterElementHybrid::determinant( + const int numCoordDims, + const int nint, + const int npe_g, + const double* deriv_g, // (m_numElemDims,npe_g,nint) + const int nelem, + const double* coords, // (numCoordDims,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const // (nelem) +{ + MasterElementCalc::determinant(m_numElemDims, numCoordDims, nint, npe_g, deriv_g, nelem, coords, det_J, error); +} + +void +MasterElementHybrid::gradient_operator( + const int numCoordDims, + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) const +{ + ThrowRequireMsg(m_numElemDims == numCoordDims, "MasterElementHybrid::gradient_operator does not support lower rank elements in higher dimensions (e.g. BAR,QUAD,TRI in 3D)."); + MasterElementCalc::gradient_operator(m_numElemDims, nint, npe_g, deriv_g, npe_f, deriv_f, nelem, coords, gradop, det_J, error); +} + +} // namespace krino diff --git a/packages/krino/krino/master_element/Akri_MasterElementHybrid.hpp b/packages/krino/krino/master_element/Akri_MasterElementHybrid.hpp new file mode 100644 index 000000000000..e0bac17fb04b --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementHybrid.hpp @@ -0,0 +1,137 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElementHybrid_h +#define Akri_MasterElementHybrid_h + +#include +#include +#include + +namespace krino { class Basis; } + +namespace krino { + +class MasterElementHybrid +{ +public: + static const MasterElementHybrid & getMasterElement(stk::topology t); + + MasterElementHybrid( + stk::topology topology, + std::unique_ptr basis); + + // Copy and assignment are not allowed + MasterElementHybrid( const MasterElementHybrid & ) = delete; + MasterElementHybrid & operator=( const MasterElementHybrid & ) = delete; + + stk::topology get_topology() const { return m_topology; } + unsigned topology_dimension() const { return m_topology.dimension(); } + + // returns the number of integration points + unsigned num_intg_pts() const { return m_numIntgPts; } + + // returns the number of nodes + unsigned num_nodes() const { return m_numNodes; } + + //: Query the integration weights + const double* intg_weights() const { return m_refWeights.data(); } + + //: Query the integration points/stations + const double* intg_pt_locations() const { return m_refPoints.data(); } + + const double * nodal_parametric_coordinates() const { return m_refCoords.data(); } + const double * centroid_parametric_coordinates() const { return m_centroidParCoords.data(); } + + void determinant( + const int numCoordDims, + const int nelem, + const double* coords, // (numCoordDims,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const; // (nelem) + void determinant( + const int numCoordDims, + const int nint, + const int npe_g, + const double* deriv_g, // (m_numElemDims,npe_g,nint) + const int nelem, + const double* coords, // (numCoordDims,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const ; // (nelem) + + //: Returns the values of the nodal interpolation shape functions + //: at the integration stations. + const double* shape_fcn() const { return m_shapeFuncs.data(); } + void shape_fcn( + const int nint, // returns array(npe,nint) + const double* p_coords, + double* result) const; + + //: Returns the derivatives of the nodal interpolation shape functions + //: with respect to the local parametric coordinates at the integration + //: stations. + const double* shape_fcn_deriv() const { return m_pointGrads.data(); } + void shape_fcn_deriv( + const int nint, + const double* p_coords, + double* result ) const; + + void interpolate_point( + const int npar_coord, + const double * par_coord, // (npar_coord) + const int ncomp_field, + const double * field, // (ncomp_field,num_nodes) + double * result ) const; // (ncomp_field) + + void gradient_operator( + const int numCoordDims, + const int nint, + const int npe_g, + const double* deriv_g, // (numElemDims,npe_g,nint) + const int npe_f, + const double* deriv_f, // (numElemDims,npe_f,nint) + const int nelem, + const double* coords, // (numElemDims,npe,nelem) + double* gradop, // (numElemDims,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) const ; + + void scalar_gradient( + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const ; //: (nvec,nelem,nint) + void scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const ; //: (nvec,nelem,nint) + +private: + stk::topology m_topology; + int m_numNodes; + int m_numElemDims; + int m_numIntgPts; + + std::unique_ptr m_Basis; + + // Local FieldContainers + std::vector m_shapeFuncs; + std::vector m_pointGrads; + std::vector m_refPoints; + std::vector m_refWeights; + std::vector m_refCoords; + std::vector m_centroidParCoords; +}; + +} // end namespace krino + +#endif // Akri_MasterElementHybrid_h diff --git a/packages/krino/krino/master_element/Akri_MasterElementIntrepid.cpp b/packages/krino/krino/master_element/Akri_MasterElementIntrepid.cpp new file mode 100644 index 000000000000..3b026bb7189c --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementIntrepid.cpp @@ -0,0 +1,287 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include "Akri_MasterElementCalc.hpp" + +#ifdef __INTEL_COMPILER +#include +#else +//FieldContainer has shadowed variables +//this disables the checking on GCC only +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include // for get_cell_topology + +namespace krino { + +const MasterElementIntrepid & +MasterElementIntrepid::getMasterElement(stk::topology t, const unsigned spatial_dimension) +{ + static std::vector> all_master_elems(stk::topology::BEGIN_TOPOLOGY + stk::topology::NUM_TOPOLOGIES); + std::unique_ptr & master_elem = all_master_elems[t()]; + if (nullptr == master_elem.get()) + { + std::unique_ptr>> basis; + switch(t()) + { + case stk::topology::LINE_2: + basis = std::make_unique>>(); + break; + case stk::topology::LINE_3: + basis = std::make_unique>>(2, Intrepid::POINTTYPE_SPECTRAL); + break; + case stk::topology::TRI_3: + basis = std::make_unique>>(); + break; + case stk::topology::TRI_6: + basis = std::make_unique>>(); + break; + case stk::topology::QUAD_4: + basis = std::make_unique>>(); + break; + case stk::topology::QUAD_9: + basis = std::make_unique>>(); + break; + case stk::topology::TRI_3_2D: + basis = std::make_unique>>(); + break; + case stk::topology::TRI_6_2D: + basis = std::make_unique>>(); + break; + case stk::topology::QUAD_4_2D: + basis = std::make_unique>>(); + break; + case stk::topology::QUAD_9_2D: + basis = std::make_unique>>(); + break; + case stk::topology::TET_4: + basis = std::make_unique>>(); + break; + case stk::topology::TET_10: + basis = std::make_unique>>(); + break; + case stk::topology::HEX_8: + basis = std::make_unique>>(); + break; + case stk::topology::HEX_27: + basis = std::make_unique>>(); + break; + default: + throw std::runtime_error("Element topology not found in MasterElementIntrepid::build: " + t.name()); + break; + } + master_elem = std::make_unique(t, std::move(basis), spatial_dimension); + } + return *master_elem; +} + +MasterElementIntrepid::MasterElementIntrepid( + stk::topology topology, + std::unique_ptr > > basis, + unsigned spatial_dimension) +: m_topology(topology), + m_numCoordDims(spatial_dimension), + m_intrepidBasis(std::move(basis)) +{ + shards::CellTopology cellType = stk::mesh::get_cell_topology(topology); + + // set the cubature + Intrepid::DefaultCubatureFactory cubatureFactory; + Teuchos::RCP> intrepidCubature = cubatureFactory.create(cellType, 2*m_intrepidBasis->getDegree()); + m_numIntgPts = intrepidCubature->getNumPoints(); + + m_numNodes = topology.num_nodes(); + m_numElemDims = intrepidCubature->getDimension(); + + // Allocate reference data + m_shapeFuncs.resize(m_numIntgPts*m_numNodes); + m_pointGrads.resize(m_numIntgPts*m_numNodes*m_numElemDims ); + m_refPoints.resize(m_numIntgPts*m_numElemDims); + m_refWeights.resize(m_numIntgPts); + m_refCoords.resize(m_numNodes*m_numElemDims); + + // retrieve the cubature points and weights + std::vector refPointsDims = {m_numIntgPts, m_numElemDims}; + Intrepid::FieldContainer refPointsFC( refPointsDims, m_refPoints.data() ); + std::vector refWeightsDims = {m_numIntgPts}; + Intrepid::FieldContainer refWeightsFC( refWeightsDims, m_refWeights.data() ); + intrepidCubature->getCubature(refPointsFC, refWeightsFC); + + // compute the refernce values and gradients at the integration points + Intrepid::FieldContainer pointVals(m_numNodes, m_numIntgPts); + Intrepid::FieldContainer pointGrads(m_numNodes, m_numIntgPts, m_numElemDims); + m_intrepidBasis->getValues(pointVals, refPointsFC, Intrepid::OPERATOR_VALUE); + m_intrepidBasis->getValues(pointGrads, refPointsFC, Intrepid::OPERATOR_GRAD); + + // re-order shape functions for consistency with other master elements + for ( int ip(0); ip < m_numIntgPts; ++ip ) { + for ( int node(0); node < m_numNodes; ++node ) { + m_shapeFuncs[ip*m_numNodes + node] = pointVals(node, ip); + } + } + for ( int ip(0); ip < m_numIntgPts; ++ip ) { + for ( int node(0); node < m_numNodes; ++node ) { + for ( int dim(0); dim < m_numElemDims; ++dim ) { + m_pointGrads[(ip*m_numNodes + node)*m_numElemDims + dim] = pointGrads(node, ip, dim); + } + } + } + + for ( int node(0); node < m_numNodes; ++node ) { + const double * node_coords = Intrepid::CellTools::getReferenceNode( cellType, node ); + for ( int dim(0); dim < m_numElemDims; ++dim ) { + m_refCoords[node*m_numElemDims + dim] = node_coords[dim]; + } + } +} + +void +MasterElementIntrepid::determinant( + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const // (nelem) +{ + determinant(m_numIntgPts, m_numNodes, m_pointGrads.data(), nelem, coords, det_J, error); +} + +void +MasterElementIntrepid::shape_fcn( + const int nint, // returns array(npe,nint) + const double* p_coords, + double* result) const +{ + Intrepid::FieldContainer pointVals(m_numNodes, nint); + + // create the pcoordVec FC from the p_coords ptr and it's dimensions + std::vector pcoordDims = { nint, m_numElemDims }; + Intrepid::FieldContainer pcoordVec( pcoordDims, const_cast< double * >(p_coords) ); + + // compute the shape function values at the integration points + m_intrepidBasis->getValues(pointVals, pcoordVec, Intrepid::OPERATOR_VALUE); + + // re-order shape functions for consistency with other master elements + for ( int ip(0); ip < nint; ++ip ) { + for ( int node(0); node < m_numNodes; ++node ) { + result[ip*m_numNodes + node] = pointVals(node,ip); + } + } +} + +void +MasterElementIntrepid::shape_fcn_deriv( + const int nint, + const double* p_coords, + double* result ) const +{ + Intrepid::FieldContainer resultVec(m_numNodes, nint, m_numElemDims); + + // create the pcoordVec FC from the p_coords ptr and it's dimensions + std::vector pcoordDims = { nint, m_numElemDims }; + Intrepid::FieldContainer pcoordVec( pcoordDims, const_cast< double * >(p_coords) ); + + m_intrepidBasis->getValues(resultVec, pcoordVec, Intrepid::OPERATOR_GRAD); + + // re-order shape functions for consistency with other master elements + for ( int ip(0); ip < nint; ++ip ) { + for ( int node(0); node < m_numNodes; ++node ) { + for ( int dim(0); dim < m_numElemDims; ++dim ) { + result[(ip*m_numNodes + node)*m_numElemDims + dim] = resultVec(node,ip,dim); + } + } + } +} + +void +MasterElementIntrepid::interpolate_point( + const int npar_coord, + const double * par_coord, // (npar_coord) + const int ncomp_field, + const double * field, // (num_nodes,ncomp_field) + double * result ) const // (ncomp_field) +{ + std::vector shape(m_numNodes); + shape_fcn(1, par_coord, shape.data()); + for ( int comp(0); comp < ncomp_field; ++comp ) { + result[ comp ] = 0.0; + for ( int node(0); node < m_numNodes; ++node ) { + result[ comp ] += shape[node] * field[ m_numNodes * comp + node ]; + } + } +} + +void +MasterElementIntrepid::scalar_gradient( + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const //: (nvec,nelem,nint) +{ + MasterElementCalc::scalar_gradient(m_numIntgPts, nelem, m_numElemDims, m_numNodes, gradop, det_J, sfield, vector); +} + +void +MasterElementIntrepid::scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const //: (nvec,nelem,nint) +{ + MasterElementCalc::scalar_gradient(nint, nelem, m_numElemDims, m_numNodes, gradop, det_J, sfield, vector); +} + +void +MasterElementIntrepid::determinant( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const // (nelem) +{ + MasterElementCalc::determinant(m_numElemDims, m_numCoordDims, nint, npe_g, deriv_g, nelem, coords, det_J, error); +} + +void +MasterElementIntrepid::gradient_operator( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) const +{ + ThrowRequireMsg(m_numElemDims == m_numCoordDims, "MasterElementHybrid::gradient_operator does not support lower rank elements in higher dimensions (e.g. BAR,QUAD,TRI in 3D)."); + MasterElementCalc::gradient_operator(m_numElemDims, nint, npe_g, deriv_g, npe_f, deriv_f, nelem, coords, gradop, det_J, error); +} + +} // namespace krino diff --git a/packages/krino/krino/master_element/Akri_MasterElementIntrepid.hpp b/packages/krino/krino/master_element/Akri_MasterElementIntrepid.hpp new file mode 100644 index 000000000000..c35933b1d337 --- /dev/null +++ b/packages/krino/krino/master_element/Akri_MasterElementIntrepid.hpp @@ -0,0 +1,135 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MasterElementIntrepid_h +#define Akri_MasterElementIntrepid_h + +#include +#include + +namespace Intrepid { template class FieldContainer; } +namespace Intrepid { template class Basis; } + +namespace krino { + +class MasterElementIntrepid +{ +public: + MasterElementIntrepid( + stk::topology topology, + std::unique_ptr > > basis, + unsigned spatial_dimension); + + // Copy and assignment are not allowed + MasterElementIntrepid( const MasterElementIntrepid & ) = delete; + MasterElementIntrepid & operator=( const MasterElementIntrepid & ) = delete; + + static const MasterElementIntrepid & getMasterElement(stk::topology t, const unsigned spatial_dimension); + + stk::topology get_topology() const { return m_topology; } + unsigned dimension() const { return m_topology.dimension(); } + + // returns the number of integration points + unsigned num_intg_pts() const { return m_numIntgPts; } + + // returns the number of nodes + unsigned num_nodes() const { return m_numNodes; } + + //: Query the integration weights + const double* intg_weights() const { return m_refWeights.data(); } + + //: Query the integration points/stations + const double* intg_pt_locations() const { return m_refPoints.data(); } + + const double * nodal_parametric_coordinates() const { return m_refCoords.data(); } + + void determinant( + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const; // (nelem) + void determinant( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* det_J, // (nelem,nint) + double* error ) const ; // (nelem) + + //: Returns the values of the nodal interpolation shape functions + //: at the integration stations. + const double* shape_fcn() const { return m_shapeFuncs.data(); } + void shape_fcn( + const int nint, // returns array(npe,nint) + const double* p_coords, + double* result) const; + + //: Returns the derivatives of the nodal interpolation shape functions + //: with respect to the local parametric coordinates at the integration + //: stations. + const double* shape_fcn_deriv() const { return m_pointGrads.data(); } + void shape_fcn_deriv( + const int nint, + const double* p_coords, + double* result ) const; + + void interpolate_point( + const int npar_coord, + const double * par_coord, // (npar_coord) + const int ncomp_field, + const double * field, // (num_nodes,ncomp_field) + double * result ) const; // (ncomp_field) + + void gradient_operator( + const int nint, + const int npe_g, + const double* deriv_g, // (nvec,npe_g,nint) + const int npe_f, + const double* deriv_f, // (nvec,npe_f,nint) + const int nelem, + const double* coords, // (nvec,npe,nelem) + double* gradop, // (nvec,npe,nelem,nint) + double* det_J, // (nelem,nint) + double* error) const ; + + void scalar_gradient( + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const ; //: (nvec,nelem,nint) + void scalar_gradient( + const int nint, //: number of intg points + const int nelem, //: number of elements to process + const double* gradop, //: (nvec,npe,nelem,nint) + const double* det_J, //: (nelem,nint) + const double* sfield, //: (npe,nelem) + double* vector ) const ; //: (nvec,nelem,nint) + +private: + stk::topology m_topology; + int m_numNodes; + int m_numElemDims; + int m_numCoordDims; + int m_numIntgPts; + + // the Intrepid Basis + std::unique_ptr>> m_intrepidBasis; + + // Local FieldContainers + std::vector m_shapeFuncs; + std::vector m_pointGrads; + std::vector m_refPoints; + std::vector m_refWeights; + std::vector m_refCoords; +}; + +} // end namespace krino + +#endif // Akri_MasterElementIntrepid_h diff --git a/packages/krino/krino/master_element/CMakeLists.txt b/packages/krino/krino/master_element/CMakeLists.txt new file mode 100644 index 000000000000..da7d6357181c --- /dev/null +++ b/packages/krino/krino/master_element/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_master_element_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + ) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_master_element_lib) + diff --git a/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.cpp b/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.cpp new file mode 100644 index 000000000000..f1eb515d80bf --- /dev/null +++ b/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.cpp @@ -0,0 +1,139 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include + +namespace krino { + +void +CDFEM_Options_Parser::parse(const YAML::Node & region_node, RegionInterface & region) +{ + const YAML::Node cdfem_node = YAML_Parser::get_map_if_present(region_node, "cdfem_options"); + if ( cdfem_node ) + { + CDFEM_Support & cdfem_support = CDFEM_Support::get(region.get_stk_mesh_meta_data()); + + std::string cdfem_edge_degeneracy_handling_string; + if (YAML_Parser::get_if_present(cdfem_node, "cdfem_edge_degeneracy_handling", cdfem_edge_degeneracy_handling_string)) + { + std::transform(cdfem_edge_degeneracy_handling_string.begin(), cdfem_edge_degeneracy_handling_string.end(), cdfem_edge_degeneracy_handling_string.begin(), ::toupper); + static std::map valid_entries = + { {"SNAP_TO_NODE", SNAP_TO_NODE}, {"SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS", SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE} }; + auto it = valid_entries.find(cdfem_edge_degeneracy_handling_string); + if (it == valid_entries.end()) + { + stk::RuntimeDoomedAdHoc() << "Invalid cdfem_edge_degeneracy_handling type: " << YAML_Parser::info(cdfem_node); + } + else + { + cdfem_support.set_cdfem_edge_degeneracy_handling( it->second ); + } + } + + double cdfem_edge_tol = 0.0; + if (YAML_Parser::get_if_present(cdfem_node, "cdfem_edge_tolerance", cdfem_edge_tol)) + { + const double minimum_edge_tol = 1.e-12; + if (cdfem_edge_tol < minimum_edge_tol) + { + krinolog << "Using minimum edge tolerance of " << minimum_edge_tol << " instead of specified tolerance of " << cdfem_edge_tol << stk::diag::dendl; + cdfem_edge_tol = minimum_edge_tol; + } + cdfem_support.set_cdfem_edge_tol( cdfem_edge_tol ); + } + + std::string cdfem_simplex_generation_method_string; + if (YAML_Parser::get_if_present(cdfem_node, "cdfem_simplex_generation_method", cdfem_simplex_generation_method_string)) + { + std::transform(cdfem_simplex_generation_method_string.begin(), cdfem_simplex_generation_method_string.end(), cdfem_simplex_generation_method_string.begin(), ::toupper); + static std::map valid_entries = { + {"CUT_QUADS_BY_GLOBAL_IDENTIFIER", CUT_QUADS_BY_GLOBAL_IDENTIFIER}, + {"CUT_QUADS_BY_LARGEST_ANGLE", CUT_QUADS_BY_LARGEST_ANGLE}, + {"CUT_QUADS_BY_NEAREST_EDGE_CUT", CUT_QUADS_BY_NEAREST_EDGE_CUT} + }; + auto it = valid_entries.find(cdfem_simplex_generation_method_string); + if (it == valid_entries.end()) + { + stk::RuntimeDoomedAdHoc() << "Invalid cdfem_simplex_generation_method type: " << YAML_Parser::info(cdfem_node); + } + else + { + cdfem_support.set_simplex_generation_method( it->second ); + } + } + + int num_init_decomp_cycles = 0; + if (YAML_Parser::get_if_present(cdfem_node, "number_of_initial_decomposition_cycles", num_init_decomp_cycles)) + { + cdfem_support.set_num_initial_decomposition_cycles( num_init_decomp_cycles ); + } + + bool interface_refinement_specified = false; + int interface_minimum_refinement_level = 0; + if(YAML_Parser::get_if_present(cdfem_node, "cdfem_interface_minimum_refinement_level", interface_minimum_refinement_level)) + { + interface_refinement_specified = true; + } + + int interface_maximum_refinement_level = 0; + if(YAML_Parser::get_if_present(cdfem_node, "cdfem_interface_maximum_refinement_level", interface_maximum_refinement_level)) + { + interface_refinement_specified = true; + } + + if (interface_refinement_specified) + { + cdfem_support.activate_interface_refinement( interface_minimum_refinement_level, interface_maximum_refinement_level ); + } + + int nonconformal_adapt_levels = 0; + if (YAML_Parser::get_if_present(cdfem_node, "cdfem_nonconformal_adaptivity_levels", nonconformal_adapt_levels)) + { + cdfem_support.activate_nonconformal_adaptivity( nonconformal_adapt_levels ); + } + + int post_adapt_refine_levels = 0; + if (YAML_Parser::get_if_present(cdfem_node, "post_adaptivity_uniform_refinement_levels", post_adapt_refine_levels)) + { + cdfem_support.set_post_adapt_refinement_levels( post_adapt_refine_levels ); + } + + uint64_t nonconformal_adapt_target_element_count = 0; + if (YAML_Parser::get_if_present(cdfem_node, "nonconformal_adaptivity_target_element_count", nonconformal_adapt_target_element_count)) + { + cdfem_support.activate_nonconformal_adapt_target_count( nonconformal_adapt_target_element_count ); + } + + int post_cdfem_refinement_levels = 0; + if (YAML_Parser::get_if_present(cdfem_node, "post_cdfem_refinement_levels", post_cdfem_refinement_levels)) + { + cdfem_support.set_post_cdfem_refinement_levels( post_cdfem_refinement_levels ); + } + + const YAML::Node post_cdfem_refinement_blocks_seq = YAML_Parser::get_sequence_if_present(cdfem_node, "post_cdfem_refinement_blocks"); + if (post_cdfem_refinement_blocks_seq) + { + std::vector post_cdfem_refinement_blocks; + for ( auto && post_cdfem_refinement_block_node : post_cdfem_refinement_blocks_seq ) + { + const std::string post_cdfem_refinement_block = post_cdfem_refinement_block_node.as(); + post_cdfem_refinement_blocks.push_back(post_cdfem_refinement_block); + } + cdfem_support.set_post_cdfem_refinement_blocks( post_cdfem_refinement_blocks ); + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.hpp b/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.hpp new file mode 100644 index 000000000000..dfdf2a05e559 --- /dev/null +++ b/packages/krino/krino/parser/Akri_CDFEM_Options_Parser.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_CDFEM_Options_Parser_h +#define Akri_CDFEM_Options_Parser_h + +namespace YAML { class Node; } +namespace krino { class RegionInterface; } + +namespace krino { +namespace CDFEM_Options_Parser { + void parse(const YAML::Node & node, RegionInterface & region); +} +} + +#endif // Akri_CDFEM_Options_Parser_h diff --git a/packages/krino/krino/parser/Akri_IC_Parser.cpp b/packages/krino/krino/parser/Akri_IC_Parser.cpp new file mode 100644 index 000000000000..f8199ab14a45 --- /dev/null +++ b/packages/krino/krino/parser/Akri_IC_Parser.cpp @@ -0,0 +1,457 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace krino { + +namespace { + +Sphere * +parse_sphere(const YAML::Node & ic_node) +{ + std::string name; + YAML_Parser::get_if_present(ic_node, "name", name); + + std::vector center; + if (YAML_Parser::get_if_present(ic_node, "center", center)) + { + if (center.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for center for IC sphere.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing center for IC sphere.\n"; + } + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for sphere must be -1 or 1.\n"; + } + } + + double radius = 0.0; + if (!YAML_Parser::get_if_present(ic_node, "radius", radius)) + { + stk::RuntimeDoomedAdHoc() << "Missing radius for IC sphere.\n"; + } + + return new Sphere(name, Vector3d(center.data()), radius, sign); +} + +Ellipsoid * +parse_ellipsoid(const YAML::Node & ic_node) +{ + std::string name; + YAML_Parser::get_if_present(ic_node, "name", name); + + std::vector center; + if (YAML_Parser::get_if_present(ic_node, "center", center)) + { + if (center.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for center for IC sphere.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing center for IC sphere.\n"; + } + + std::vector semiaxes; + if (YAML_Parser::get_if_present(ic_node, "semiaxes", semiaxes)) + { + if (semiaxes.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for semiaxes for IC ellipsoid.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing semiaxes for IC ellipsoid.\n"; + } + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for ellipsoid must be -1 or 1.\n"; + } + } + + std::vector rotationVec; + if (YAML_Parser::get_if_present(ic_node, "rotation", rotationVec)) + { + if (semiaxes.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for rotation for IC ellipsoid.\n"; + } + } + + return new Ellipsoid(name, center, semiaxes, rotationVec, sign); +} + +Plane * +parse_plane(const YAML::Node & ic_node) +{ + std::string name; + YAML_Parser::get_if_present(ic_node, "name", name); + + std::vector normal; + if (YAML_Parser::get_if_present(ic_node, "normal", normal)) + { + if (normal.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for center for IC plane.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing normal for IC plane.\n"; + } + + double multiplier = 1.0; + YAML_Parser::get_if_present(ic_node, "multiplier", multiplier); + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for IC plane must be -1 or 1.\n"; + } + } + multiplier *= sign; + + double offset = 0.0; + if (!YAML_Parser::get_if_present(ic_node, "offset", offset)) + { + stk::RuntimeDoomedAdHoc() << "Missing offset for IC plane.\n"; + } + + return new Plane(name, normal.data(), offset, multiplier); +} + +Cylinder * +parse_cylinder(const YAML::Node & ic_node) +{ + std::string name; + YAML_Parser::get_if_present(ic_node, "name", name); + + std::vector p1; + if (YAML_Parser::get_if_present(ic_node, "p1", p1)) + { + if (p1.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for p1 for IC cylinder.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing normal for IC cylinder.\n"; + } + + std::vector p2; + if (YAML_Parser::get_if_present(ic_node, "p2", p2)) + { + if (p2.size() != 3) + { + stk::RuntimeDoomedAdHoc() << "Expecting 3 real values for center for IC cylinder.\n"; + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing p2 for IC cylinder.\n"; + } + + double radius = 0.0; + if (!YAML_Parser::get_if_present(ic_node, "radius", radius)) + { + stk::RuntimeDoomedAdHoc() << "Missing radius for IC cylinder.\n"; + } + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for IC cylinder must be -1 or 1.\n"; + } + } + + return new Cylinder(name, p1.data(), p2.data(), radius, sign); +} + +std::unique_ptr +parse_binder(const YAML::Node & ic_node) +{ + std::string binder_type; + if (!YAML_Parser::get_if_present(ic_node, "type", binder_type)) + { + stk::RuntimeDoomedAdHoc() << "Missing type for Binder IC.\n"; + } + + double interface_size = 0.0; + double smooth_bridge_size = 0.0; + double smooth_bridge_offset = 0.0; + double other_ls_scale_factor = 0.0; + int ibinder_type = 0; + bool root_smooth_bridge = false; + + if (binder_type == "interface") + { + ibinder_type = 0; + if (!YAML_Parser::get_if_present(ic_node, "interface_size", interface_size)) + { + stk::RuntimeDoomedAdHoc() << "Missing interface_size for IC binder.\n"; + } + } + else if (binder_type == "smooth_bridge") + { + ibinder_type = 1; + YAML_Parser::get_if_present(ic_node, "smooth_bridge_size", smooth_bridge_size); + YAML_Parser::get_if_present(ic_node, "smooth_bridge_offset", smooth_bridge_offset); + YAML_Parser::get_if_present(ic_node, "other_ls_scale_factor", other_ls_scale_factor); + YAML_Parser::get_if_present(ic_node, "root_smooth_bridge", root_smooth_bridge); + + if (smooth_bridge_size < 0.0) + { + stk::RuntimeDoomedAdHoc() << "IC binder: Smooth bridge size should not be negative.\n"; + } + + if (smooth_bridge_size != 0.0) + { + if (smooth_bridge_offset <= 0.0) + { + stk::RuntimeDoomedAdHoc() << "IC binder: Smooth bridge offset should be greater than zero when a bridge size is specified.\n"; + } + if (other_ls_scale_factor <= 0.0) + { + stk::RuntimeDoomedAdHoc() << "IC binder: Scaling of other level sets should be greater than zero when a bridge size is specified. Typical values are O(1e2).\n"; + } + } + } + else + { + stk::RuntimeDoomedAdHoc() << "Binder IC type should be either interface or smooth_bridge. \n"; + } + + return std::make_unique(interface_size, smooth_bridge_size, smooth_bridge_offset, other_ls_scale_factor, ibinder_type, root_smooth_bridge); +} + +Faceted_Surface * +parse_facets(const YAML::Node & ic_node, const stk::diag::Timer &parent_timer) +{ + std::string surface_name; + YAML_Parser::get_if_present(ic_node, "name", surface_name); + + std::string facet_filename; + if (!YAML_Parser::get_if_present(ic_node, "filename", facet_filename)) + { + stk::RuntimeDoomedAdHoc() << "Missing filename for IC facets.\n"; + } + + std::string facet_format; + if (!YAML_Parser::get_if_present(ic_node, "format", facet_format)) + { + stk::RuntimeDoomedAdHoc() << "Missing format for IC facets.\n"; + } + + bool scaleSpecified = false; + double scale = 1.0; + if (YAML_Parser::get_if_present(ic_node, "scale", scale)) + { + scaleSpecified = true; + if (scale <= 0.0) + { + stk::RuntimeDoomedAdHoc() << "Scale for IC facets must be >= 0.\n"; + } + } + + Vector3d scaleVec{scale, scale, scale}; + std::vector scaleComponents = {"scaleX","scaleY","scaleZ"}; + for (int i=0; i<3; i++) + { + if (YAML_Parser::get_if_present(ic_node, scaleComponents[i], scaleVec[i])) + { + if (scaleSpecified) + stk::RuntimeDoomedAdHoc() << "Cannot specify both scale and " << scaleComponents[i] << "\n"; + if (scaleVec[i] <= 0.0) + stk::RuntimeDoomedAdHoc() << scaleComponents[i] << " for IC facets must be >= 0.\n"; + } + } + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for IC facets must be -1 or 1.\n"; + } + } + + std::transform(facet_format.begin(), facet_format.end(), facet_format.begin(), ::toupper); + Faceted_Surface_From_File * surface = nullptr; + + if (facet_format == "STL") + surface = new STLSurface(surface_name, parent_timer, facet_filename, sign, scaleVec); + else if (facet_format == "FAC") + surface = new FACSurface(surface_name, parent_timer, facet_filename, sign, scaleVec); + else if (facet_format == "PLY") + surface = new PLYSurface(surface_name, parent_timer, facet_filename, sign, scaleVec); + else if (facet_format == "EXO") + surface = new EXOSurface(surface_name, parent_timer, facet_filename, sign, scaleVec); + else + stk::RuntimeDoomedAdHoc() << "Unrecognized facet format: " << facet_format; + + return surface; +} + +MeshSurface * +parse_mesh_surface(const YAML::Node & ic_node, LevelSet & ls) +{ + std::string surface_name; + ThrowRequire(YAML_Parser::get_if_present(ic_node, "mesh", surface_name)); + + double sign = 1.0; + if (YAML_Parser::get_if_present(ic_node, "sign", sign)) + { + if (sign != -1.0 && sign == 1.0) + { + stk::RuntimeDoomedAdHoc() << "Sign for IC facets must be -1 or 1.\n"; + } + } + + ThrowErrorMsgIf(!ls.aux_meta().has_part(surface_name), "Could not locate a surface named " << surface_name); + const stk::mesh::Part & io_part = ls.aux_meta().get_part(surface_name); + + const stk::mesh::Field* coords = reinterpret_cast*>(&LevelSet::get_current_coordinates(ls.meta()).field()); + ThrowRequire(nullptr != coords); + + const stk::mesh::Selector surface_selector = stk::mesh::Selector(io_part); + return new MeshSurface(ls.meta(), *coords, surface_selector, sign); +} + +void +parse_composition_method(const YAML::Node & ic_node, IC_Alg& ic_alg) +{ + // This is a little strange because composition looks like an IC, but really sets a flag + std::string composition_method; + ThrowRequire(YAML_Parser::get_if_present(ic_node, "composition_method", composition_method)); + + std::transform(composition_method.begin(), composition_method.end(), composition_method.begin(), ::toupper); + + if (composition_method == "MINIMUM_SIGNED_DISTANCE") + ic_alg.set_composition_method(Composite_Surface::MINIMUM_SIGNED_DISTANCE); + else if (composition_method == "MAXIMUM_SIGNED_DISTANCE") + ic_alg.set_composition_method(Composite_Surface::MAXIMUM_SIGNED_DISTANCE); + else + stk::RuntimeDoomedAdHoc() << "Unrecognized composition_method: " << composition_method; +} + +void +parse_IC(const YAML::Node & ic_node, LevelSet &ls) +{ + if (ic_node.Type() == YAML::NodeType::Scalar) + { + // support random specified as Scalar (no :) + std::string ic_type = ic_node.as(); + if (ic_type == "random") + { + Random * random = new Random(0); + ls.get_IC_alg().addSurface(random); + } + else if (ic_type == "analytic_isosurface") + { + Analytic_Isosurface * surf = new Analytic_Isosurface(); + ls.get_IC_alg().addSurface(surf); + } + else + { + stk::RuntimeDoomedAdHoc() << "Unrecognized Levelset IC type: " << YAML_Parser::info(ic_node); + } + return; + } + + if ( YAML_Parser::get_null_if_present(ic_node, "sphere") ) + { + ls.get_IC_alg().addSurface(parse_sphere(ic_node)); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "ellipsoid") ) + { + ls.get_IC_alg().addSurface(parse_ellipsoid(ic_node)); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "plane") ) + { + ls.get_IC_alg().addSurface(parse_plane(ic_node)); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "cylinder") ) + { + ls.get_IC_alg().addSurface(parse_cylinder(ic_node)); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "facets") ) + { + ls.get_IC_alg().addSurface(parse_facets(ic_node, ls.get_timer())); + } + else if ( YAML_Parser::get_scalar_if_present(ic_node, "mesh") ) + { + ls.get_IC_alg().addSurface(parse_mesh_surface(ic_node, ls)); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "random") ) + { + int seed = 0; + YAML_Parser::get_if_present(ic_node, "seed", seed); + Random * random = new Random(seed); + ls.get_IC_alg().addSurface(random); + } + else if ( YAML_Parser::get_null_if_present(ic_node, "binder") ) + { + ls.get_IC_alg().addCalculator(parse_binder(ic_node)); + } + else if ( YAML_Parser::get_scalar_if_present(ic_node, "composition_method") ) + { + parse_composition_method(ic_node, ls.get_IC_alg()); + } + else + { + stk::RuntimeDoomedAdHoc() << "Unrecognized Levelset IC type: " << YAML_Parser::info(ic_node); + } +} + +} + +void +IC_Parser::parse(const YAML::Node & node, LevelSet & ls) +{ + const YAML::Node ic_nodes = YAML_Parser::get_sequence_if_present(node, "initial_conditions"); + if ( ic_nodes ) + { + for ( auto && ic_node : ic_nodes ) + { + parse_IC(ic_node, ls); + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_IC_Parser.hpp b/packages/krino/krino/parser/Akri_IC_Parser.hpp new file mode 100644 index 000000000000..833d49664d92 --- /dev/null +++ b/packages/krino/krino/parser/Akri_IC_Parser.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_IC_Parser_h +#define Akri_IC_Parser_h + +namespace YAML { class Node; } +namespace krino { class LevelSet; } + +namespace krino { +namespace IC_Parser { + void parse(const YAML::Node & node, LevelSet & ls); +} +} + +#endif // Akri_IC_Parser_h diff --git a/packages/krino/krino/parser/Akri_LevelSet_Parser.cpp b/packages/krino/krino/parser/Akri_LevelSet_Parser.cpp new file mode 100644 index 000000000000..8196db1a77e1 --- /dev/null +++ b/packages/krino/krino/parser/Akri_LevelSet_Parser.cpp @@ -0,0 +1,167 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace krino { + +namespace { + +void +register_blocks_for_level_set(RegionInterface & reg, LevelSet & ls) +{ + const std::string composite_name = ls.get_composite_name(); + if (!composite_name.empty()) + { + LS_SideTag::declare_composite(ls.get_identifier(), LevelSet::get_identifier(composite_name)); + } + + Phase_Support & phase_support = Phase_Support::get(reg.get_stk_mesh_meta_data()); + const PhaseVec & mesh_phases = Phase_Support::get_phases(reg.name_of_input_mesh()); + const std::vector ls_phases = Phase_Support::get_level_set_phases(mesh_phases, ls); + const std::vector decomposed_blocks = phase_support.get_blocks_decomposed_by_levelset(ls_phases); + phase_support.register_blocks_for_level_set(&ls, decomposed_blocks); +} + +} + +void +LevelSet_Parser::parse(const YAML::Node & region_node, RegionInterface & region) +{ + const YAML::Node ls_nodes = YAML_Parser::get_sequence_if_present(region_node, "level_set_interfaces"); + if ( ls_nodes ) + { + for ( auto && ls_node : ls_nodes ) + { + std::string ls_name; + YAML_Parser::get_if_present(ls_node, "name", ls_name); + if (ls_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Blank or missing levelset name.\n"; + } + LevelSet & ls = LevelSet::build(region.get_stk_mesh_meta_data(), ls_name, region.getRegionTimer()); + + std::string distance_name; + if (krino::YAML_Parser::get_if_present(ls_node, "distance_variable", distance_name)) + { + ls.set_distance_name(distance_name); + } + + std::vector extension_velocity; + if (krino::YAML_Parser::get_if_present(ls_node, "extension_velocity", extension_velocity)) + { + if (extension_velocity.size() != ls.spatial_dimension) + { + stk::RuntimeDoomedAdHoc() << "Expecting " << ls.spatial_dimension << " real values for extension_velocity for level set " << ls_name << ".\n"; + } + ls.set_extension_velocity(Vector3d(extension_velocity.data(), extension_velocity.size())); + } + + double narrow_band_multiplier = 0.0; + if (YAML_Parser::get_if_present(ls_node, "narrow_band_element_size_multiplier", narrow_band_multiplier)) + { + if( narrow_band_multiplier < 0. ) + { + stk::RuntimeDoomedAdHoc() << "Error: Narrow band element size multiplier must be >= 0.\n"; + } + else if ( narrow_band_multiplier < 1. ) + { + stk::RuntimeWarningAdHoc() << "Narrow band element size multiplier is less than 1. " + << "Except in certain cases of adaptive refinement around the interface, this will produce errors in the distance field." + << std::endl; + } + ls.narrow_band_multiplier(narrow_band_multiplier); + } + + std::string redistance_method_name; + if (YAML_Parser::get_if_present(ls_node, "redistance_method", redistance_method_name)) + { + std::transform(redistance_method_name.begin(), redistance_method_name.end(), redistance_method_name.begin(), ::toupper); + Redistance_Method redistance_method = CLOSEST_POINT; + if (redistance_method_name == "CLOSEST_POINT") + redistance_method = CLOSEST_POINT; + else if (redistance_method_name == "FAST_MARCHING") + redistance_method = FAST_MARCHING; + else + stk::RuntimeWarningAdHoc() << "Unrecognized redistance method: " << redistance_method_name << std::endl; + + ls.set_redistance_method(redistance_method); + } + + bool perform_initial_redistance; + if (YAML_Parser::get_if_present(ls_node, "perform_initial_redistance", perform_initial_redistance)) + { + ls.perform_initial_redistance(perform_initial_redistance); + } + + double initial_offset_distance = 0.0; + if (YAML_Parser::get_if_present(ls_node, "initial_offset_distance", initial_offset_distance)) + { + ls.set_ic_offset(initial_offset_distance); + } + + double initial_scale_factor = 1.0; + if (YAML_Parser::get_if_present(ls_node, "initial_scale_factor", initial_scale_factor)) + { + ls.set_ic_scale(initial_scale_factor); + } + + double narrow_band_size = 0.0; + if (YAML_Parser::get_if_present(ls_node, "narrow_band_size", narrow_band_size)) + { + if( narrow_band_size < 0. ) + { + stk::RuntimeDoomedAdHoc() << "Error: Narrow band size must be >= 0.\n"; + } + ls.narrow_band_size(narrow_band_size); + } + + const YAML::Node comp_dist_surfs = YAML_Parser::get_sequence_if_present(ls_node, "compute_surface_distance"); + if ( comp_dist_surfs ) + { + std::vector compute_distance_surfaces; + for ( auto && comp_dist_surf : comp_dist_surfs ) + { + const std::string surface_name = comp_dist_surf.as(); + + ThrowErrorMsgIf( !ls.aux_meta().has_part(surface_name), + "Could not locate a surface named " << surface_name); + + stk::mesh::Part & io_part = ls.aux_meta().get_part(surface_name); + ThrowErrorMsgIf( ls.meta().side_rank() != io_part.primary_entity_rank(), + "Part " << surface_name << " is not a side-rank part."); + + ls.get_compute_surface_distance_parts().push_back(&io_part); + compute_distance_surfaces.push_back(surface_name); + } + ThrowErrorMsgIf( ls.get_compute_surface_distance_parts().empty(), + "Please specify surfaces for compute surface distance."); + } + + IC_Parser::parse(ls_node, ls); + + register_blocks_for_level_set(region, ls); + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_LevelSet_Parser.hpp b/packages/krino/krino/parser/Akri_LevelSet_Parser.hpp new file mode 100644 index 000000000000..8016393f28f7 --- /dev/null +++ b/packages/krino/krino/parser/Akri_LevelSet_Parser.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_LevelSet_Parser_h +#define Akri_LevelSet_Parser_h + +namespace YAML { class Node; } +namespace krino { class RegionInterface; } + +namespace krino { +namespace LevelSet_Parser { + void parse(const YAML::Node & node, RegionInterface & region); +} +} + +#endif // Akri_LevelSet_Parser_h diff --git a/packages/krino/krino/parser/Akri_MeshInput_Parser.cpp b/packages/krino/krino/parser/Akri_MeshInput_Parser.cpp new file mode 100644 index 000000000000..d455924ffa11 --- /dev/null +++ b/packages/krino/krino/parser/Akri_MeshInput_Parser.cpp @@ -0,0 +1,181 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +#include +#include +#include +#include + +#include + +namespace krino { + +void +MeshInput_Parser::parse(const YAML::Node & base_node) +{ + const YAML::Node fem_nodes = YAML_Parser::get_sequence_if_present(base_node, "finite_element_models"); + if (!fem_nodes) return; + + for ( auto && fem_node : fem_nodes ) + { + std::string model_name; + YAML_Parser::get_if_present(fem_node, "name", model_name); + if (model_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Missing finite element model name.\n"; + } + std::shared_ptr options = MeshInputOptions::get_or_create(model_name); + + const bool has_generated_mesh = parse_generated_mesh(fem_node, *options); + + std::string mesh_name; + YAML_Parser::get_if_present(fem_node, "mesh", mesh_name); + if (!mesh_name.empty() && !has_generated_mesh) + { + options->set_filename(mesh_name); + } + else if (!has_generated_mesh) + { + stk::RuntimeDoomedAdHoc() << "Must specify input mesh name or generated mesh options.\n"; + } + + std::string decomposition_method; + if (YAML_Parser::get_if_present(fem_node, "decomposition_method", decomposition_method)) + { + // no checking here for validity + std::transform(decomposition_method.begin(), decomposition_method.end(), decomposition_method.begin(), ::toupper); + options->set_decomposition_method(decomposition_method); + } + + Phase_Parser::parse(fem_node, model_name); + } +} + +bool +MeshInput_Parser::parse_generated_mesh(const YAML::Node & fem_node, MeshInputOptions & options) +{ + const YAML::Node generated_mesh_node = YAML_Parser::get_map_if_present(fem_node, "generated_mesh"); + if (!generated_mesh_node) return false; + + double mesh_size = 0.0; + if (!YAML_Parser::get_if_present(generated_mesh_node, "mesh_size", mesh_size) || mesh_size < 0.0) + { + stk::RuntimeDoomedAdHoc() << "Missing or invalid mesh_size for generated_mesh.\n"; + } + options.set_generated_mesh_size(mesh_size); + + std::vector domain; + if (YAML_Parser::get_if_present(generated_mesh_node, "domain", domain)) + { + if (options.get_generated_mesh_domain_type() != MeshInputOptions::NO_GENERATED_MESH) + { + stk::RuntimeDoomedAdHoc() << "Must only specify domain or interface_bounding_box_with_dimension options.\n"; + } + options.set_generated_mesh_domain_type(MeshInputOptions::GENERATED_MESH_FOR_SPECIFIED_DOMAIN); + if (domain.size() != 4 && domain.size() != 6) + { + stk::RuntimeDoomedAdHoc() << "Domain must be a vector of length 4 for 2D or 6 for 3D (xmin,ymin,zmin, xmax,ymax,zmax).\n"; + } + options.set_generated_mesh_domain(domain); + } + + int interface_spatial_dim = 0; + if (YAML_Parser::get_if_present(generated_mesh_node, "interface_bounding_box_with_dimension", interface_spatial_dim)) + { + if (options.get_generated_mesh_domain_type() != MeshInputOptions::NO_GENERATED_MESH) + { + stk::RuntimeDoomedAdHoc() << "Must only specify domain or interface_bounding_box options.\n"; + } + if (interface_spatial_dim != 2 && interface_spatial_dim != 3) + { + stk::RuntimeDoomedAdHoc() << "interface_bounding_box_with_dimension only support 2 or 3 dimensions.\n"; + } + const MeshInputOptions::GeneratedMeshDomainType mesh_type = + interface_spatial_dim == 2 ? + MeshInputOptions::GENERATED_2D_MESH_FOR_INTERFACE_BOUNDING_BOX : + MeshInputOptions::GENERATED_3D_MESH_FOR_INTERFACE_BOUNDING_BOX; + options.set_generated_mesh_domain_type(mesh_type); + } + + std::string generated_mesh_element_type_string; + if (YAML_Parser::get_if_present(generated_mesh_node, "element_type", generated_mesh_element_type_string)) + { + std::transform(generated_mesh_element_type_string.begin(), generated_mesh_element_type_string.end(), generated_mesh_element_type_string.begin(), ::toupper); + static std::map valid_entries = + { {"TRIANGLE", stk::topology::TRIANGLE_3_2D}, + {"TRI", stk::topology::TRIANGLE_3_2D}, + {"QUADRILATERAL", stk::topology::QUADRILATERAL_4_2D}, + {"QUAD", stk::topology::QUADRILATERAL_4_2D}, + {"HEXAHEDRON", stk::topology::HEXAHEDRON_8}, + {"HEX", stk::topology::HEXAHEDRON_8}, + {"TETRAHEDRON", stk::topology::TETRAHEDRON_4}, + {"TET", stk::topology::TETRAHEDRON_4} }; + auto it = valid_entries.find(generated_mesh_element_type_string); + if (it == valid_entries.end()) + { + stk::RuntimeDoomedAdHoc() << "Invalid cdfem_simplex_generation_method type: " << YAML_Parser::info(generated_mesh_node); + } + else + { + options.set_generated_mesh_element_type( it->second ); + if (options.get_generated_mesh_spatial_dimension() != (int)options.get_generated_mesh_element_type().dimension()) + { + stk::RuntimeDoomedAdHoc() << "Mismatch in spatial dimension for generated mesh element type and domain specification. "; + } + } + } + else + { + stk::topology default_topology = + (options.get_generated_mesh_spatial_dimension() == 2) ? + stk::topology::TRIANGLE_3_2D : + stk::topology::TETRAHEDRON_4; + options.set_generated_mesh_element_type( default_topology ); + } + + std::string generated_mesh_type_string; + if (YAML_Parser::get_if_present(generated_mesh_node, "mesh_type", generated_mesh_type_string)) + { + std::transform(generated_mesh_type_string.begin(), generated_mesh_type_string.end(), generated_mesh_type_string.begin(), ::toupper); + static std::map valid_entries = + { {"CUBIC", BoundingBoxMeshStructureType::CUBIC_BOUNDING_BOX_MESH}, + {"BCC", BoundingBoxMeshStructureType::BCC_BOUNDING_BOX_MESH}, + {"FLAT_WALLED_BCC", BoundingBoxMeshStructureType::FLAT_WALLED_BCC_BOUNDING_BOX_MESH}, + {"TRIANGULAR_LATTICE", BoundingBoxMeshStructureType::TRIANGULAR_LATTICE_BOUNDING_BOX_MESH}, + {"FLAT_WALLED_TRIANGULAR_LATTICE", BoundingBoxMeshStructureType::FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH}}; + auto it = valid_entries.find(generated_mesh_type_string); + if (it == valid_entries.end()) + { + stk::RuntimeDoomedAdHoc() << "Invalid mesh_type: " << YAML_Parser::info(generated_mesh_node); + } + else + { + options.set_generated_mesh_structure_type(it->second); + if ((BoundingBoxMeshStructureType::BCC_BOUNDING_BOX_MESH == it->second || BoundingBoxMeshStructureType::FLAT_WALLED_BCC_BOUNDING_BOX_MESH == it->second) && options.get_generated_mesh_spatial_dimension() != 3) + { + stk::RuntimeDoomedAdHoc() << "BCC meshes only supported in 3D"; + } + if ((BoundingBoxMeshStructureType::TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == it->second || BoundingBoxMeshStructureType::FLAT_WALLED_TRIANGULAR_LATTICE_BOUNDING_BOX_MESH == it->second) && options.get_generated_mesh_spatial_dimension() != 2) + { + stk::RuntimeDoomedAdHoc() << "BCC meshes only supported in 2D"; + } + } + } + + if (options.get_generated_mesh_domain_type() == MeshInputOptions::NO_GENERATED_MESH) + { + stk::RuntimeDoomedAdHoc() << "Must specify domain or interface_bounding_box_with_dimension for generated_mesh.\n"; + } + return true; +} + + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_MeshInput_Parser.hpp b/packages/krino/krino/parser/Akri_MeshInput_Parser.hpp new file mode 100644 index 000000000000..1dcd2342aa5d --- /dev/null +++ b/packages/krino/krino/parser/Akri_MeshInput_Parser.hpp @@ -0,0 +1,22 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_MeshInput_Parser_h +#define Akri_MeshInput_Parser_h + +namespace YAML { class Node; } +namespace krino { class MeshInputOptions; } + +namespace krino { +namespace MeshInput_Parser { + void parse(const YAML::Node & node); + bool parse_generated_mesh(const YAML::Node & fem_node, MeshInputOptions & options); +} +} + +#endif // Akri_MeshInput_Parser_h diff --git a/packages/krino/krino/parser/Akri_Phase_Parser.cpp b/packages/krino/krino/parser/Akri_Phase_Parser.cpp new file mode 100644 index 000000000000..64f74ac76a99 --- /dev/null +++ b/packages/krino/krino/parser/Akri_Phase_Parser.cpp @@ -0,0 +1,101 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include + +namespace krino { + +void +Phase_Parser::parse(const YAML::Node & fem_node, const std::string & fem_model_name) +{ + PhaseVec & mesh_phases = Phase_Support::get_phases(fem_model_name); + + const YAML::Node subdom_nodes = YAML_Parser::get_sequence_if_present(fem_node, "subdomains"); + + if (subdom_nodes) + { + for ( auto && subdom_node : subdom_nodes ) + { + std::string subdom_name; + YAML_Parser::get_if_present(subdom_node, "name", subdom_name); + if (subdom_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Missing subdomain name in finite element model " << fem_model_name; + } + mesh_phases.push_back(NamedPhase(subdom_name)); + + const YAML::Node where_nodes = YAML_Parser::get_sequence_if_present(subdom_node, "level_set_regions"); + + if (where_nodes) + { + for ( auto && where_node : where_nodes ) + { + std::string negative_ls_name; + if (YAML_Parser::get_if_present(where_node, "negative_level_set", negative_ls_name)) + { + mesh_phases.back().tag().add(LevelSet::get_identifier(negative_ls_name),-1); + } + + std::string positive_ls_name; + if (YAML_Parser::get_if_present(where_node, "positive_level_set", positive_ls_name)) + { + mesh_phases.back().tag().add(LevelSet::get_identifier(positive_ls_name),+1); + } + } + } + + std::string smallest_ls_name; + if (YAML_Parser::get_if_present(subdom_node, "smallest_level_set", smallest_ls_name)) + { + if ( where_nodes ) + { + stk::RuntimeDoomedAdHoc() << "Cannot combine \"negative_level_set|positive_level_set\" syntax with \"smallest_level_set\" syntax."; + } + Phase_Support::set_one_levelset_per_phase(true); + mesh_phases.back().tag().add(LevelSet::get_identifier(smallest_ls_name),-1); + } + } + } + + const YAML::Node part_nodes = YAML_Parser::get_sequence_if_present(fem_node, "parts"); + + if (part_nodes) + { + std::map> & FEmodel_block_phase_names = Phase_Support::get_block_phases_by_name(fem_model_name); + + for ( auto && part_node : part_nodes ) + { + std::string part_name; + YAML_Parser::get_if_present(part_node, "name", part_name); + if (part_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Missing part name in finite element model " << fem_model_name; + } + + const YAML::Node part_subdom_nodes = YAML_Parser::get_sequence_if_present(part_node, "subdomains"); + if (part_subdom_nodes) + { + std::vector & block_phase_names = FEmodel_block_phase_names[part_name]; + for ( auto && subdom_node : part_subdom_nodes ) + { + const std::string subdom_name = subdom_node.as(); + block_phase_names.push_back(subdom_name); + } + } + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_Phase_Parser.hpp b/packages/krino/krino/parser/Akri_Phase_Parser.hpp new file mode 100644 index 000000000000..53c0f08b7c0f --- /dev/null +++ b/packages/krino/krino/parser/Akri_Phase_Parser.hpp @@ -0,0 +1,22 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Phase_Parser_h +#define Akri_Phase_Parser_h + +#include + +namespace YAML { class Node; } + +namespace krino { +namespace Phase_Parser { + void parse(const YAML::Node & fem_node, const std::string & fem_model_name); +} +} + +#endif // Akri_Phase_Parser_h diff --git a/packages/krino/krino/parser/Akri_Region_Parser.cpp b/packages/krino/krino/parser/Akri_Region_Parser.cpp new file mode 100644 index 000000000000..56310b64bade --- /dev/null +++ b/packages/krino/krino/parser/Akri_Region_Parser.cpp @@ -0,0 +1,84 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace krino { + +void +Region_Parser::parse(const YAML::Node & simulation_node, Simulation & simulation) +{ + const YAML::Node region_nodes = YAML_Parser::get_sequence_if_present(simulation_node, "regions"); + if ( !region_nodes ) return; + + for ( auto && region_node : region_nodes ) + { + std::string region_name; + YAML_Parser::get_if_present(region_node, "name", region_name); + if (region_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Blank or missing region name.\n"; + } + Region * region = new Region(simulation, region_name ); + + int initial_refinement_levels = 0; + if (YAML_Parser::get_if_present(region_node, "initial_uniform_refinement_levels", initial_refinement_levels)) + { + region->set_initial_refinement_levels(initial_refinement_levels); + } + + bool use_32bit_ids = false; + YAML_Parser::get_if_present(region_node, "use_32bit_ids", use_32bit_ids); + + bool force_64bit_ids = !use_32bit_ids; + YAML_Parser::get_if_present(region_node, "force_64bit_ids", force_64bit_ids); + + if (use_32bit_ids && force_64bit_ids) + { + stk::RuntimeDoomedAdHoc() << "Can't specify options use_32bit_ids=true and force_64bit_ids=true together in region " << region_name << "\n"; + } + + std::string fem_model_name; + YAML_Parser::get_if_present(region_node, "finite_element_model", fem_model_name); + if (fem_model_name.empty()) + { + stk::RuntimeDoomedAdHoc() << "Blank or missing finite element model for region " << region_name << "\n"; + } + region->associate_input_mesh(fem_model_name, use_32bit_ids, force_64bit_ids); + + RegionInterface::set_currently_parsed_region(region->get_stk_mesh_meta_data(), region->name(), region->getRegionTimer(), region->name_of_input_mesh(), region->get_input_io_region()); + + Phase_Support & phase_support = krino::Phase_Support::get(region->get_stk_mesh_meta_data()); + const PhaseVec & mesh_phases = Phase_Support::get_phases(region->name_of_input_mesh()); + const PartnamePhasenameMap & mesh_block_phase_names = Phase_Support::get_block_phases_by_name(region->name_of_input_mesh()); + phase_support.determine_block_phases(mesh_phases, mesh_block_phase_names); + + + const Block_Surface_Connectivity block_surf_info(region->get_stk_mesh_meta_data()); + phase_support.set_input_block_surface_connectivity(block_surf_info); + phase_support.setup_phases(mesh_phases); + + LevelSet_Parser::parse(region_node, RegionInterface::get_currently_parsed_region()); + CDFEM_Options_Parser::parse(region_node, RegionInterface::get_currently_parsed_region()); + ResultsOutput_Parser::parse(region_node, *region); + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_Region_Parser.hpp b/packages/krino/krino/parser/Akri_Region_Parser.hpp new file mode 100644 index 000000000000..a860592c7b53 --- /dev/null +++ b/packages/krino/krino/parser/Akri_Region_Parser.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Region_Parser_h +#define Akri_Region_Parser_h + +namespace YAML { class Node; } +namespace krino { class Simulation; } + +namespace krino { +namespace Region_Parser { + void parse(const YAML::Node & node, Simulation & simulation); +} +} + +#endif // Akri_Region_Parser_h diff --git a/packages/krino/krino/parser/Akri_ResultsOutput_Parser.cpp b/packages/krino/krino/parser/Akri_ResultsOutput_Parser.cpp new file mode 100644 index 000000000000..a94751ac5e60 --- /dev/null +++ b/packages/krino/krino/parser/Akri_ResultsOutput_Parser.cpp @@ -0,0 +1,72 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include + +namespace krino { + +void +ResultsOutput_Parser::parse(const YAML::Node & region_node, Region & region) +{ + const YAML::Node results_node = YAML_Parser::get_map_if_present(region_node, "output"); + if ( results_node ) + { + ResultsOutputOptions * options = region.get_results_options(); + + std::string results_database_name; + if (YAML_Parser::get_if_present(results_node, "database_name", results_database_name)) + { + options->set_filename(results_database_name); + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing results database_name for region " << region.name() << ".\n"; + } + + std::string results_title; + if (YAML_Parser::get_if_present(results_node, "title", results_title)) + { + options->set_title(results_title); + } + + bool compose_results; + if (YAML_Parser::get_if_present(results_node, "compose_results", compose_results)) + { + if (compose_results) options->add_property(Ioss::Property("COMPOSE_RESULTS", 1)); + } + + int output_frequency = 1; + if (YAML_Parser::get_if_present(results_node, "output_frequency", output_frequency)) + { + options->add_step_increment(0, output_frequency); + } + + const YAML::Node nodal_variable_nodes = YAML_Parser::get_sequence_if_present(results_node, "nodal_variables"); + for ( auto && variable_node : nodal_variable_nodes ) + { + const std::string field_name = variable_node.as(); + options->add_nodal_field(field_name, field_name); + } + + const YAML::Node element_variable_nodes = YAML_Parser::get_sequence_if_present(results_node, "element_variables"); + for ( auto && variable_node : element_variable_nodes ) + { + const std::string field_name = variable_node.as(); + options->add_element_field(field_name, field_name); + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_ResultsOutput_Parser.hpp b/packages/krino/krino/parser/Akri_ResultsOutput_Parser.hpp new file mode 100644 index 000000000000..352a0947d673 --- /dev/null +++ b/packages/krino/krino/parser/Akri_ResultsOutput_Parser.hpp @@ -0,0 +1,21 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_ResultsOutput_Parser_h +#define Akri_ResultsOutput_Parser_h + +namespace YAML { class Node; } +namespace krino { class Region; } + +namespace krino { +namespace ResultsOutput_Parser { + void parse(const YAML::Node & node, Region & region); +} +} + +#endif // Akri_ResultsOutput_Parser_h diff --git a/packages/krino/krino/parser/Akri_Simulation_Parser.cpp b/packages/krino/krino/parser/Akri_Simulation_Parser.cpp new file mode 100644 index 000000000000..be02d91cbf15 --- /dev/null +++ b/packages/krino/krino/parser/Akri_Simulation_Parser.cpp @@ -0,0 +1,54 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include + +#include + +namespace krino { + +void +Simulation_Parser::parse(const YAML::Node & node) +{ + const YAML::Node sim_node = YAML_Parser::get_map_if_present(node, "simulation"); + if ( sim_node ) + { + Simulation & simulation = Simulation::build("krino simulation"); + + double start_time = 0.0; + if (YAML_Parser::get_if_present(sim_node, "start_time", start_time)) + { + simulation.set_current_time(start_time); + } + + double stop_time = 0.0; + if (YAML_Parser::get_if_present(sim_node, "stop_time", stop_time)) + { + simulation.set_stop_time(stop_time); + } + + double time_step = 0.0; + if (YAML_Parser::get_if_present(sim_node, "time_step", time_step)) + { + simulation.set_time_step(time_step); + } + + Region_Parser::parse(sim_node, simulation); + } + else + { + stk::RuntimeDoomedAdHoc() << "Missing simulation.\n"; + } +} + +} // namespace krino diff --git a/packages/krino/krino/parser/Akri_Simulation_Parser.hpp b/packages/krino/krino/parser/Akri_Simulation_Parser.hpp new file mode 100644 index 000000000000..45c02b36ca47 --- /dev/null +++ b/packages/krino/krino/parser/Akri_Simulation_Parser.hpp @@ -0,0 +1,20 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Simulation_Parser_h +#define Akri_Simulation_Parser_h + +namespace YAML { class Node; } + +namespace krino { +namespace Simulation_Parser { + void parse(const YAML::Node & node); +} +} + +#endif // Akri_Simulation_Parser_h diff --git a/packages/krino/krino/parser/Akri_YAML.hpp b/packages/krino/krino/parser/Akri_YAML.hpp new file mode 100644 index 000000000000..1a5de9994874 --- /dev/null +++ b/packages/krino/krino/parser/Akri_YAML.hpp @@ -0,0 +1,48 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_KRINO_PARSER_AKRI_YAML_HPP_ +#define KRINO_KRINO_PARSER_AKRI_YAML_HPP_ +#include + +#ifdef KRINO_HAVE_YAML + +#ifdef __INTEL_COMPILER +#include +#else +//YAML has shadowed variables +//this disables the checking on GCC only +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop +#endif + +#else +// Fake struct to mimic YAML Node if we don't have YAML +namespace YAML { + struct NodeType { + enum value { Undefined, Null, Scalar, Sequence, Map }; + }; + + struct Node { + NodeType::value Type() const { return NodeType::Null; } + + template const T as() const { return T(); } + + explicit operator bool() const { return false; } + + Node * begin() const { return nullptr; } + Node * end() const { return nullptr; } + + Node operator[](std::string) const { return Node(); } + }; +} +#endif + +#endif /* KRINO_KRINO_PARSER_AKRI_YAML_HPP_ */ diff --git a/packages/krino/krino/parser/Akri_YAML_Parser.cpp b/packages/krino/krino/parser/Akri_YAML_Parser.cpp new file mode 100644 index 000000000000..9f1e4df98276 --- /dev/null +++ b/packages/krino/krino/parser/Akri_YAML_Parser.cpp @@ -0,0 +1,235 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#ifdef KRINO_HAVE_YAML + +static void emit(YAML::Emitter& emout, const YAML::Node & node) { + // recursive depth first + YAML::NodeType::value type = node.Type(); + std::string out; + switch (type) + { + case YAML::NodeType::Scalar: + out = node.as(); + emout << out; + break; + case YAML::NodeType::Sequence: + emout << YAML::BeginSeq; + for (unsigned int i = 0; i < node.size(); ++i) { + const YAML::Node & subnode = node[i]; + emit(emout, subnode); + } + emout << YAML::EndSeq; + break; + case YAML::NodeType::Map: + emout << YAML::BeginMap ; + for (auto && entry : node) { + const YAML::Node & key = entry.first; + const YAML::Node & value = entry.second; + out = key.as(); + emout << YAML::Key << out; + emout << YAML::Value; + emit(emout, value); + } + emout << YAML::EndMap ; + break; + case YAML::NodeType::Null: + emout << " (empty) "; + break; + default: + std::cerr << "Warning: emit: unknown/unsupported node type" << std::endl; + break; + } +} + +/// uses Emitter to print node to stream +static void emit(std::ostream& sout, const YAML::Node & node) { + YAML::Emitter out; + emit(out,node); + sout << out.c_str() << std::endl; +} + +static YAML::Node parse_yaml(std::istream & input_stream) +{ + return YAML::Load(input_stream); + YAML::Node doc; + + try { + doc = YAML::Load(input_stream); + } + catch (YAML::ParserException &e) { + throw std::runtime_error(e.what()); + } + + return doc; +} + +static std::string line_info(const YAML::Node & node) { + std::ostringstream sout; + sout << "(line,column) = (" + << node.Mark().line+1 << ", " + << node.Mark().column+1 << ")"; + return sout.str(); +} + +#else + +static YAML::Node parse_yaml(std::istream & input_stream) { throw std::runtime_error("YAML parser not enabled in krino build."); } +static void emit(std::ostream& sout, const YAML::Node & node) {} +static std::string line_info(const YAML::Node & node) { return std::string(); } + +#endif + +namespace krino{ +namespace YAML_Parser { + +std::string info(const YAML::Node & node) { + std::ostringstream sout; + sout << "Node at " << line_info(node) << " => \n" ; + emit(sout, node); + return sout.str(); +} + +const YAML::Node +get_if_present(const YAML::Node& node, const std::string& key) +{ + static std::string types[] = {"Null", "Scalar", "Sequence", "Map"}; + std::ostringstream err_msg; + + if (node.Type() == YAML::NodeType::Null || node.Type() == YAML::NodeType::Scalar) + { + emit(err_msg, node); + err_msg << "Check structure of input file."; + stk::RuntimeDoomedAdHoc() + << "parsing within non-searchable node of type = " << types[node.Type()] + << " for key= " << key + << " at " << line_info(node) + << " node= " << err_msg.str() << std::endl; + YAML::Node empty; + return empty; + } + return node[key]; +} + +const YAML::Node +get_type_if_present(const YAML::Node& node, const std::string& key, YAML::NodeType::value type) +{ + static std::string types[] = {"Null", "Scalar", "Sequence", "Map"}; + std::ostringstream err_msg; + + const YAML::Node value = get_if_present(node, key); + if (value && (value.Type() != type)) + { + emit(err_msg, node); + err_msg << "Check indentation of input file."; + stk::RuntimeDoomedAdHoc() + << "parsing expected type " << types[type] << " got type = " << types[value.Type()] + << " for key= " << key + << " at " << line_info(node) + << " node= " << err_msg.str() << std::endl; + } + return value; +} + +// template specialization +template<> +bool get_if_present(const YAML::Node & node, const std::string& key, bool& result) +{ + std::string resultString; + const bool haveNode = get_if_present(node, key, resultString); + + if (haveNode) + { + result = false; + std::transform(resultString.begin(), resultString.end(), resultString.begin(), ::toupper); + if (resultString == "TRUE" || resultString == "YES" || resultString == "1") + result = true; + else if (resultString == "FALSE" || resultString == "NO" || resultString == "0") + result = false; + else + { + std::ostringstream err_msg; + emit(err_msg, node); + stk::RuntimeDoomedAdHoc() << "Failed to parse boolean " + << " for key= " << key + << " at " << line_info(node) + << " node= " << err_msg.str() << std::endl; + } + return true; + } + return false; +} + + +void parse() +{/* %TRACE% */ Trace trace__("krino::YAML_Parser::parse()"); /* %TRACE% */ + const std::string inputFileName = stk::EnvData::getInputFileName(); + const std::string &aprepro = sierra::Env::get_param("aprepro"); + const bool use_aprepro = aprepro.empty() || aprepro != "off"; + const std::string &aprepro_defines = sierra::Env::get_param("define"); + + // parallel version of input file + mpi_filebuf input_parallel_file(use_aprepro, aprepro_defines); + if (!input_parallel_file.open(stk::EnvData::parallel_comm(), 0, std::ios::in, inputFileName.c_str())) { + throw std::runtime_error("failed to open input file"); + } + if(use_aprepro) { + sierra::Env::outputP0()< +#include +#include + +namespace krino{ +namespace YAML_Parser { + +void parse(); +std::string info(const YAML::Node & node); + +const YAML::Node +get_if_present(const YAML::Node& node, const std::string& key); + +/// these can be used to check and ensure a type of yaml node is as expected +const YAML::Node +get_type_if_present(const YAML::Node& node, const std::string& key, YAML::NodeType::value type); + +inline const YAML::Node +get_null_if_present(const YAML::Node& node, const std::string& key) {return get_type_if_present(node, key, YAML::NodeType::Null); } + +inline const YAML::Node +get_scalar_if_present(const YAML::Node& node, const std::string& key) {return get_type_if_present(node, key, YAML::NodeType::Scalar); } + +inline const YAML::Node +get_sequence_if_present(const YAML::Node& node, const std::string& key) {return get_type_if_present(node, key, YAML::NodeType::Sequence); } + +inline const YAML::Node +get_map_if_present(const YAML::Node& node, const std::string& key) {return get_type_if_present(node, key, YAML::NodeType::Map); } + +/// Doesn't change @param result unless the @param key is present in the @param node +template +bool get_if_present(const YAML::Node & node, const std::string& key, T& result) +{ + const YAML::Node value = get_if_present(node, key); + if (value) + { + result = value.as(); + return true; + } + return false; +} + +template<> +bool get_if_present(const YAML::Node & node, const std::string& key, bool& result); + +} // namespace parser +} // namespace krino + +#endif // Akri_YAML_Parser_h diff --git a/packages/krino/krino/parser/CMakeLists.txt b/packages/krino/krino/parser/CMakeLists.txt new file mode 100644 index 000000000000..66cbc42a19c1 --- /dev/null +++ b/packages/krino/krino/parser/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_parser_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + DEPLIBS krino_lib krino_region_lib) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_parser_lib) + diff --git a/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.cpp b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.cpp new file mode 100644 index 000000000000..432c925d4a24 --- /dev/null +++ b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.cpp @@ -0,0 +1,230 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include + +namespace krino { +namespace rebalance_utils { + +namespace { + +class MultipleCriteriaSettings : public stk::balance::GraphCreationSettings +{ +public: + MultipleCriteriaSettings(stk::mesh::BulkData & stkMeshBulkData, + const std::vector *> critFields, + const double default_weight = 0.0) + : m_stkMeshBulkData(stkMeshBulkData), + m_critFields(critFields), + m_defaultWeight(default_weight) + { + method = "rcb"; + setUseNodeBalancer(true); + setNodeBalancerTargetLoadBalance(getImbalanceTolerance()); + setNodeBalancerMaxIterations(10); + } + virtual ~MultipleCriteriaSettings() = default; + + virtual double + getGraphEdgeWeight(stk::topology element1Topology, stk::topology element2Topology) const override + { + return 1.0; + } + virtual bool areVertexWeightsProvidedViaFields() const override { return true; } + virtual bool includeSearchResultsInGraph() const override { return false; } + virtual int getGraphVertexWeight(stk::topology type) const override { return 1; } + virtual double getImbalanceTolerance() const override { return 1.05; } + virtual void setDecompMethod(const std::string & input_method) override { method = input_method; } + virtual std::string getDecompMethod() const override { return method; } + virtual int getNumCriteria() const override { return m_critFields.size(); } + virtual bool isMultiCriteriaRebalance() const override { return true; } + virtual bool shouldFixMechanisms() const override { return false; } + + virtual double getGraphVertexWeight(stk::mesh::Entity entity, int criteria_index) const override + { + ThrowRequireWithSierraHelpMsg( + criteria_index >= 0 && static_cast(criteria_index) < m_critFields.size()); + const double * weight = stk::mesh::field_data(*m_critFields[criteria_index], entity); + if (weight != nullptr) + { + ThrowRequireWithSierraHelpMsg(*weight >= 0); + return *weight; + } + else + { + return m_defaultWeight; + } + } + +protected: + MultipleCriteriaSettings() = delete; + MultipleCriteriaSettings(const MultipleCriteriaSettings &) = delete; + MultipleCriteriaSettings & operator=(const MultipleCriteriaSettings &) = delete; + + const stk::mesh::BulkData & m_stkMeshBulkData; + const std::vector *> m_critFields; + const double m_defaultWeight; +}; + +class CDFEMRebalance final : public MultipleCriteriaSettings +{ +public: + CDFEMRebalance(stk::mesh::BulkData & bulk_data, + CDMesh * cdmesh, + const std::string & coordinates_field_name, + const std::vector *> & weights_fields, + const double imbalance_threshold, + const double default_weight = 0.) + : MultipleCriteriaSettings(bulk_data, weights_fields, default_weight), + my_cdmesh(cdmesh), + my_bulk_data(bulk_data), + my_coordinates_field_name(coordinates_field_name), + my_imbalance_threshold(imbalance_threshold) + {} + + ~CDFEMRebalance() = default; + + double getImbalanceTolerance() const override { return my_imbalance_threshold; } + std::string getCoordinateFieldName() const override { return my_coordinates_field_name; } + + void modifyDecomposition(stk::balance::DecompositionChangeList & decomp_changes) const override; + bool shouldPrintMetrics() const override { return true; } + bool isIncrementalRebalance() const override { return true; } + + virtual double getGraphVertexWeight(stk::mesh::Entity entity, int criteria_index) const override + { + double scaleVertexWeightForTestingDueToSmallMesh = 12; + return scaleVertexWeightForTestingDueToSmallMesh*MultipleCriteriaSettings::getGraphVertexWeight(entity, criteria_index); + } + +private: + CDMesh * my_cdmesh; + stk::mesh::BulkData & my_bulk_data; + std::string my_coordinates_field_name; + double my_imbalance_threshold; +}; + +void CDFEMRebalance::modifyDecomposition(stk::balance::DecompositionChangeList & decomp_changes) const +{ + /* Algorithm: + * 1) Go through change list and update destinations of all adaptivity children to match their + * root parent. Also move family trees with the parent+child entities. + * 2) Go through change list and remove any CDFEM child elements whose parents aren't being moved, + * as well as update the destination of all CDFEM children with parents that are being moved to + * the parent destination. + */ + + impl::update_rebalance_for_adaptivity(decomp_changes, my_bulk_data); + + if(my_cdmesh) + { + impl::update_rebalance_for_cdfem(decomp_changes, my_bulk_data, *my_cdmesh); + } +} + +} // anonymous namespace + +void +update_parent_child_rebalance_weights(const stk::mesh::BulkData & bulk_data, + stk::mesh::Field & element_weights_field, + const CDMesh * cdmesh) +{ + // First sum CDFEM child weights to their CDFEM parents, then adaptivity children to + // their parents. Adaptivity intermediate parents should not have their weights + // summed, they should be 0. + if(cdmesh) + { + impl::accumulate_cdfem_child_weights_to_parents(bulk_data, element_weights_field, *cdmesh); + } + + impl::accumulate_adaptivity_child_weights_to_parents(bulk_data, element_weights_field); +} + +bool rebalance_mesh(stk::mesh::BulkData & bulk_data, + CDMesh * cdmesh, + const std::string & element_weights_field_name, + const std::string & coordinates_field_name, + const std::vector & selections_to_rebalance_separately, + const std::string & decomp_method, + const double imbalance_threshold) +{ + const auto & meta = bulk_data.mesh_meta_data(); + auto weights_base = meta.get_field(stk::topology::ELEMENT_RANK, element_weights_field_name); + ThrowRequireMsg(weights_base, + "Failed to find element rank field " << element_weights_field_name + << " to use for rebalance weights."); + const auto element_weights_field = static_cast *>(weights_base); + + update_parent_child_rebalance_weights(bulk_data, *element_weights_field, cdmesh); + + ThrowAssert(impl::check_family_tree_element_and_side_ownership(bulk_data)); + + CDFEMRebalance balancer( + bulk_data, cdmesh, coordinates_field_name, {element_weights_field}, imbalance_threshold); + balancer.setDecompMethod(decomp_method); + const bool rebalanced = + stk::balance::balanceStkMesh(balancer, bulk_data, selections_to_rebalance_separately); + + ThrowAssert(impl::check_family_tree_element_and_side_ownership(bulk_data)); + + if(cdmesh) + { + cdmesh->rebuild_after_rebalance(); + } + + return rebalanced; +} + +bool rebalance_mesh(stk::mesh::BulkData & bulk_data, + CDMesh * cdmesh, + const std::vector & element_weights_field_names, + const std::string & coordinates_field_name, + const std::string & decomp_method, + const double imbalance_threshold) +{ + const auto & meta = bulk_data.mesh_meta_data(); + + std::vector *> weights_fields; + for (auto && field_name : element_weights_field_names) + { + auto weights_base = meta.get_field(stk::topology::ELEMENT_RANK, field_name); + ThrowRequireMsg(weights_base, + "Failed to find element rank field " << field_name << " to use for rebalance weights."); + const auto element_weights_field = static_cast *>(weights_base); + + update_parent_child_rebalance_weights(bulk_data, *element_weights_field, cdmesh); + weights_fields.push_back(element_weights_field); + } + + ThrowAssert(impl::check_family_tree_element_and_side_ownership(bulk_data)); + + CDFEMRebalance balancer( + bulk_data, cdmesh, coordinates_field_name, weights_fields, imbalance_threshold); + balancer.setDecompMethod(decomp_method); + const bool rebalanced = stk::balance::balanceStkMesh(balancer, bulk_data); + if (rebalanced) + stk::balance::balanceStkMeshNodes(balancer, bulk_data); + + ThrowAssert(impl::check_family_tree_element_and_side_ownership(bulk_data)); + + if (cdmesh) + { + cdmesh->rebuild_after_rebalance(); + } + + return rebalanced; +} +} +} + diff --git a/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.hpp b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.hpp new file mode 100644 index 000000000000..dc77cc83328f --- /dev/null +++ b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils.hpp @@ -0,0 +1,46 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_H_ +#define KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_H_ + +#include +#include +#include + +namespace krino { class CDMesh; } + +namespace krino { +namespace rebalance_utils { + +// This function will call STK rebalance to rebalance the specified selections of the +// mesh based on the ELEMENT_RANK field element_weights_field. If cdmesh != nullptr the +// rebalance operation will ensure that all CDFEM child elements are moved to the same +// processor as their parent elements. The weights field will be adjusted +// such that the parent elements are weighted with the sum of their child +// weights, and the child weights are 0 for both CDFEM and adaptivity parents/children. +bool rebalance_mesh(stk::mesh::BulkData & bulk_data, + CDMesh * cdmesh, + const std::string & element_weights_field_name, + const std::string & coordinates_field_name, + const std::vector & selections_to_rebalance_separately, + const std::string & decomp_method = "parmetis", + const double imbalance_threshold = 1.05); + +// This version handles multiple criteria rebalancing with different weights for each +// criterion. +bool rebalance_mesh(stk::mesh::BulkData & bulk_data, + CDMesh * cdmesh, + const std::vector & element_weights_field_names, + const std::string & coordinates_field_name, + const std::string & decomp_method = "parmetis", + const double imbalance_threshold = 1.05); +} +} + +#endif /* KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_H_ */ diff --git a/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.cpp b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.cpp new file mode 100644 index 000000000000..2b6f450d3546 --- /dev/null +++ b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.cpp @@ -0,0 +1,348 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { +namespace rebalance_utils { +namespace impl { + +void set_family_tree_destinations(stk::balance::DecompositionChangeList & decomp_changes, const stk::mesh::BulkData & bulk_data) +{ + // At this point decomp_changes has all adaptivity parent + child elements that are moving + // and their dest procs match. + // First iterate the element family trees and set their destinations. + auto changes = decomp_changes.get_all_partition_changes(); + for (auto && change : changes) + { + const auto elem = change.first; + const auto dest_proc = change.second; + + const auto * fts = bulk_data.begin(elem, stk::topology::CONSTRAINT_RANK); + const int num_fts = bulk_data.num_connectivity(elem, stk::topology::CONSTRAINT_RANK); + for (int i = 0; i < num_fts; ++i) + { + if (bulk_data.bucket(elem).owned()) + { + ThrowRequire(!decomp_changes.has_entity(fts[i]) || + decomp_changes.get_entity_destination(fts[i]) == dest_proc); + decomp_changes.set_entity_destination(fts[i], dest_proc); + } + } + } + + std::vector child_sides; + const auto side_rank = bulk_data.mesh_meta_data().side_rank(); + changes = decomp_changes.get_all_partition_changes(); + for (auto && change : changes) + { + const auto elem = change.first; + const auto dest_proc = change.second; + + if (bulk_data.entity_rank(elem) != stk::topology::ELEMENT_RANK || + is_refinement_child(bulk_data, elem) || !has_refinement_children(bulk_data, elem)) + continue; + + const auto * root_sides = bulk_data.begin(elem, side_rank); + const int num_root_sides = bulk_data.num_connectivity(elem, side_rank); + for (int i = 0; i < num_root_sides; ++i) + { + if (!bulk_data.bucket(root_sides[i]).owned()) continue; + + get_refinement_all_children(bulk_data, root_sides[i], child_sides); + child_sides.push_back(root_sides[i]); + + for (auto && child_side : child_sides) + { + ThrowRequire(bulk_data.bucket(child_side).owned()); + const auto * fts = bulk_data.begin(child_side, stk::topology::CONSTRAINT_RANK); + const int num_fts = bulk_data.num_connectivity(child_side, stk::topology::CONSTRAINT_RANK); + for (int j = 0; j < num_fts; ++j) + { + const auto ft = fts[j]; + if (!decomp_changes.has_entity(ft) || + decomp_changes.get_entity_destination(ft) > dest_proc) + { + decomp_changes.set_entity_destination(ft, dest_proc); + } + } + } + } + } +} + +void +update_rebalance_for_adaptivity(stk::balance::DecompositionChangeList & decomp_changes, + const stk::mesh::BulkData & bulk_data) +{ + auto all_changes = decomp_changes.get_all_partition_changes(); + + // First pass remove all refinement children from the list of changes. + // Second pass will set their destinations all to the destination of their root parent + // if it is moving. + for(auto && change : all_changes) + { + stk::mesh::Entity entity = change.first; + if(is_refinement_child(bulk_data, entity)) + { + decomp_changes.delete_entity(entity); + } + } + + all_changes = decomp_changes.get_all_partition_changes(); + stk::mesh::EntityVector adapt_children; + for(auto && change : all_changes) + { + stk::mesh::Entity entity = change.first; + const auto dest = change.second; + + get_refinement_all_children(bulk_data, entity, adapt_children); + for(auto && child : adapt_children) + { + decomp_changes.set_entity_destination(child, dest); + } + } + + set_family_tree_destinations(decomp_changes, bulk_data); + + all_changes = decomp_changes.get_all_partition_changes(); + for(auto && change : all_changes) + { + stk::mesh::Entity entity = change.first; + const auto dest = change.second; + + if (bulk_data.entity_rank(entity) == stk::topology::CONSTRAINT_RANK) + { + auto side_rank = bulk_data.mesh_meta_data().side_rank(); + const auto * conn_sides = bulk_data.begin(entity, side_rank); + const int num_sides = bulk_data.num_connectivity(entity, side_rank); + for (int i = 0; i < num_sides; ++i) + { + ThrowRequire(!decomp_changes.has_entity(conn_sides[i])); + const auto * conn_fts = bulk_data.begin(conn_sides[i], stk::topology::CONSTRAINT_RANK); + const int num_fts = + bulk_data.num_connectivity(conn_sides[i], stk::topology::CONSTRAINT_RANK); + for (int j = 0; j < num_fts; ++j) + { + ThrowErrorMsgIf(decomp_changes.get_entity_destination(conn_fts[j]) != dest, + "Family Tree:\n" << debug_entity(bulk_data, conn_fts[j]) + << "\nHas destination proc = " + << decomp_changes.get_entity_destination(conn_fts[j]) + << ", which is different than " << dest + << " the destination for family tree:\n" + << debug_entity(bulk_data, entity) << "\n\n"); + } + } + } + } +} + +void +update_rebalance_for_cdfem(stk::balance::DecompositionChangeList & decomp_changes, + const stk::mesh::BulkData & bulk_data, + const CDMesh & cdmesh) +{ + auto all_changes = decomp_changes.get_all_partition_changes(); + std::vector subelements; + const auto & cdfem_parent_part = cdmesh.get_parent_part(); + const auto & cdfem_child_part = cdmesh.get_child_part(); + for(auto && change : all_changes) + { + stk::mesh::Entity entity = change.first; + const auto dest = change.second; + + if(bulk_data.bucket(entity).member(cdfem_parent_part)) + { + const auto * mesh_elem = cdmesh.find_mesh_element(bulk_data.identifier(entity)); + ThrowRequire(mesh_elem); + + subelements.clear(); + mesh_elem->get_subelements(subelements); + + for(auto && subelem : subelements) + { + auto subelem_entity = subelem->entity(); + ThrowRequire(bulk_data.is_valid(subelem_entity)); + + decomp_changes.set_entity_destination(subelem_entity, dest); + } + } + else if(bulk_data.bucket(entity).member(cdfem_child_part)) + { + const auto parent_elem = cdmesh.get_parent_element(entity); + if(!decomp_changes.has_entity(parent_elem)) decomp_changes.delete_entity(entity); + } + } +} + +void +accumulate_cdfem_child_weights_to_parents(const stk::mesh::BulkData & bulk_data, + stk::mesh::Field & element_weights_field, + const CDMesh & cdmesh) +{ + auto selector = + stk::mesh::selectField(element_weights_field) & cdmesh.get_child_part() & + bulk_data.mesh_meta_data().locally_owned_part(); + const auto & buckets = bulk_data.get_buckets(stk::topology::ELEMENT_RANK, selector); + for(auto && b_ptr : buckets) + { + double * weight_data = stk::mesh::field_data(element_weights_field, *b_ptr); + const int b_size = b_ptr->size(); + for(int i=0; i < b_size; ++i) + { + const auto child_elem = (*b_ptr)[i]; + const auto parent = cdmesh.get_parent_element(child_elem); + double * parent_weight_data = stk::mesh::field_data(element_weights_field, parent); + ThrowRequire(parent_weight_data); + *parent_weight_data += weight_data[i]; + weight_data[i] = 0.; + } + } +} + +void accumulate_adaptivity_child_weights_to_parents( + const stk::mesh::BulkData & bulk_data, stk::mesh::Field & element_weights_field) +{ + auto selector = stk::mesh::selectField(element_weights_field) & + bulk_data.mesh_meta_data().locally_owned_part(); + std::vector all_children; + const auto & buckets = bulk_data.get_buckets(stk::topology::ELEMENT_RANK, selector); + for (auto && b_ptr : buckets) + { + for (auto && elem : *b_ptr) + { + if (is_refinement_child(bulk_data, elem)) continue; + + all_children.clear(); + get_refinement_all_children(bulk_data, elem, all_children); + + double child_weights_sum = 0.; + for (auto && child : all_children) + { + double & child_weight = *stk::mesh::field_data(element_weights_field, child); + child_weights_sum += child_weight; + child_weight = 0.; + } + double & parent_weight = *stk::mesh::field_data(element_weights_field, elem); + parent_weight += child_weights_sum; + } + } +} + +namespace +{ +bool is_owned(const stk::mesh::BulkData & mesh, const stk::mesh::Entity entity) +{ + const bool owned_part = mesh.bucket(entity).member(mesh.mesh_meta_data().locally_owned_part()); + const bool owner_rank = mesh.parallel_rank() == mesh.parallel_owner_rank(entity); + ThrowErrorMsgIf(owned_part != owner_rank, + "Mismatch between parallel_owner_rank and locally_owned_part membership for:\n" + << debug_entity(mesh, entity) << "\n"); + return owner_rank; +} +} + +bool check_family_tree_element_and_side_ownership(const stk::mesh::BulkData & bulk_data) +{ + const auto & meta = bulk_data.mesh_meta_data(); + bool passed = true; + + const auto & locally_owned_part = meta.locally_owned_part(); + const auto & elem_buckets = bulk_data.get_buckets(stk::topology::ELEMENT_RANK, locally_owned_part); + for(auto && b_ptr : elem_buckets) + { + for(auto && elem : *b_ptr) + { + const auto * fts = bulk_data.begin(elem, stk::topology::CONSTRAINT_RANK); + const int num_fts = bulk_data.num_connectivity(elem, stk::topology::CONSTRAINT_RANK); + for(int i=0; i < num_fts; ++i) + { + if(!is_owned(bulk_data, fts[i])) + { + krinolog << "Found non-owned family tree connected to owned element.\n"; + krinolog << "Family tree:\n" << debug_entity(bulk_data, fts[i]) << "\n"; + passed = false; + } + } + } + } + const auto side_rank = meta.side_rank(); + const auto & side_buckets = bulk_data.get_buckets(side_rank, locally_owned_part); + for(auto && b_ptr : side_buckets) + { + for(auto && side : *b_ptr) + { + const auto * fts = bulk_data.begin(side, stk::topology::CONSTRAINT_RANK); + const int num_fts = bulk_data.num_connectivity(side, stk::topology::CONSTRAINT_RANK); + for(int i=0; i < num_fts; ++i) + { + if(!is_owned(bulk_data, fts[i])) + { + krinolog << "Found non-owned family tree connected to owned side.\n"; + krinolog << "Family tree:\n" << debug_entity(bulk_data, fts[i]) << "\n"; + passed = false; + } + } + } + } + + const auto & ft_buckets = bulk_data.get_buckets(stk::topology::CONSTRAINT_RANK, locally_owned_part); + for(auto && b_ptr : ft_buckets) + { + for(auto && ft : *b_ptr) + { + const auto * elems = bulk_data.begin(ft, stk::topology::ELEMENT_RANK); + const int num_elems = bulk_data.num_connectivity(ft, stk::topology::ELEMENT_RANK); + for(int i=0; i < num_elems; ++i) + { + if(!is_owned(bulk_data, elems[i])) + { + krinolog << "Found non-owned element connected to owned family tree.\n"; + krinolog << "Element ID:\n" << bulk_data.identifier(elems[i]) << "\n"; + krinolog << "Family tree:\n" << debug_entity(bulk_data, ft) << "\n"; + passed = false; + } + } + const auto * sides = bulk_data.begin(ft, side_rank); + const int num_sides = bulk_data.num_connectivity(ft, side_rank); + for(int i=0; i < num_sides; ++i) + { + if(!is_owned(bulk_data, sides[i])) + { + krinolog << "Found non-owned side connected to owned family tree.\n"; + krinolog << "Element ID:\n" << bulk_data.identifier(sides[i]) << "\n"; + krinolog << "Family tree:\n" << debug_entity(bulk_data, ft) << "\n"; + passed = false; + } + } + } + } + + return passed; +} + +} +} +} diff --git a/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.hpp b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.hpp new file mode 100644 index 000000000000..85865baa15a4 --- /dev/null +++ b/packages/krino/krino/rebalance_utils/Akri_RebalanceUtils_Impl.hpp @@ -0,0 +1,44 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_IMPL_H_ +#define KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_IMPL_H_ + +#include + +namespace stk { namespace balance { class DecompositionChangeList; } } +namespace stk { namespace mesh { class BulkData; } } +namespace krino { class CDMesh; } + +namespace krino { +namespace rebalance_utils { +namespace impl { + +void +update_rebalance_for_adaptivity(stk::balance::DecompositionChangeList & decomp, + const stk::mesh::BulkData & bulk_data); + +void +update_rebalance_for_cdfem(stk::balance::DecompositionChangeList & decomp, + const stk::mesh::BulkData & bulk_data, + const CDMesh & cdmesh); + +void +accumulate_cdfem_child_weights_to_parents(const stk::mesh::BulkData & bulk_data, + stk::mesh::Field & element_weights_field, + const CDMesh & cdmesh); + +void accumulate_adaptivity_child_weights_to_parents( + const stk::mesh::BulkData & bulk_data, stk::mesh::Field & element_weights_field); + +bool check_family_tree_element_and_side_ownership(const stk::mesh::BulkData & bulk_data); +} +} +} + +#endif /* KRINO_REBALANCE_UTILS_INCLUDE_AKRI_REBALANCEUTILS_IMPL_H_ */ diff --git a/packages/krino/krino/rebalance_utils/CMakeLists.txt b/packages/krino/krino/rebalance_utils/CMakeLists.txt new file mode 100644 index 000000000000..b2820a96ae3b --- /dev/null +++ b/packages/krino/krino/rebalance_utils/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_rebalance_utils_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + DEPLIBS krino_lib) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_rebalance_utils_lib) + diff --git a/packages/krino/krino/region/Akri_Region.cpp b/packages/krino/krino/region/Akri_Region.cpp new file mode 100644 index 000000000000..ebf7ac13eade --- /dev/null +++ b/packages/krino/krino/region/Akri_Region.cpp @@ -0,0 +1,664 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino{ + +//-------------------------------------------------------------------------------- + +Region::Region(Simulation & owning_simulation, const std::string & regionName) +: my_simulation(owning_simulation), + my_meta(nullptr), + my_bulk(nullptr), + my_name(regionName), + my_timerRegion(std::string("Region ") + regionName, sierra::Diag::TIMER_REGION, my_simulation.get_timer()), + my_timerInitialize("Initialize", my_timerRegion), + my_timerExecute("Execute", my_timerRegion), + my_timerMeshInput("Mesh input", my_timerRegion), + my_timerMeshOutput("Mesh output", my_timerRegion), + my_output_file_index(0), + my_output_file_created(false), + my_initial_refinement_levels(0) +{ /* %TRACE[ON]% */ Trace trace__("krino::Region::Region()"); /* %TRACE% */ + my_simulation.add_region(this); + myIOBroker = std::make_unique(stk::EnvData::parallel_comm()); + + std::vector entity_rank_names = stk::mesh::entity_rank_names(); + entity_rank_names.push_back("FAMILY_TREE"); + stk_IO().set_rank_name_vector(entity_rank_names); + + my_results_options = std::make_unique(); +} +//-------------------------------------------------------------------------------- +Region::~Region() +{ +} + +static bool locally_has_64bit_ids_in_use_for_nodes_or_elements(const stk::mesh::BulkData & mesh) +{ + const uint64_t max32bitId = ~0U; + for (auto entityRank : {stk::topology::NODE_RANK, stk::topology::ELEMENT_RANK}) + for (auto && bucketPtr : mesh.buckets(entityRank)) + for (auto && entity : *bucketPtr) + if (mesh.identifier(entity) > max32bitId) + return true; + + return false; +} + +static bool cdfem_mesh_displacements_requested_in_results_fields(const std::string & cdfemMeshDisplacementsFieldName, const std::set & resultsFields) +{ + for (auto && resultsField : resultsFields) + if (stk::equal_case(resultsField.first, cdfemMeshDisplacementsFieldName)) + return true; + return false; +} + +//-------------------------------------------------------------------------------- +void Region::commit() +{ /* %TRACE[ON]% */ Trace trace__("krino::Region::commit()"); /* %TRACE% */ + + auto & meta = get_stk_mesh_meta_data(); + LevelSet::setup(meta); + krino::CDFEM_Support & cdfem_support = krino::CDFEM_Support::get(meta); + + if (krino::CDFEM_Support::is_active(meta)) + { + if (cdfem_mesh_displacements_requested_in_results_fields(CDFEM_Support::cdfem_mesh_displacements_field_name(), my_results_options->get_nodal_fields())) + cdfem_support.register_cdfem_mesh_displacements_field(); + + if (cdfem_support.get_num_initial_decomposition_cycles() > 1) + cdfem_support.register_parent_node_ids_field(); // Needed to use piecewise linear location on previously cut edges + + cdfem_support.setup_fields(); + } + + auto & active_part = AuxMetaData::get(meta).active_part(); + stk::mesh::BulkData::AutomaticAuraOption auto_aura_option = stk::mesh::BulkData::NO_AUTO_AURA; + + if (my_initial_refinement_levels > 0 || (krino::CDFEM_Support::is_active(meta) && cdfem_support.get_interface_maximum_refinement_level() > 0) || + (krino::CDFEM_Support::is_active(meta) && cdfem_support.get_post_cdfem_refinement_levels() > 0)) + { + auto_aura_option = stk::mesh::BulkData::AUTO_AURA; + HAdapt::setup(meta, active_part, my_timerExecute); + } + + if (cdfem_support.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + { + auto_aura_option = stk::mesh::BulkData::AUTO_AURA; + } + + if (krino::CDFEM_Support::is_active(meta)) + { + cdfem_support.add_interpolation_field(cdfem_support.get_coords_field()); + const LevelSetManager & region_ls = LevelSetManager::get(meta); + for(auto&& ls : region_ls) + { + cdfem_support.add_interpolation_field(ls->get_distance_field()); + } + cdfem_support.finalize_fields(); + + if(cdfem_support.get_interface_maximum_refinement_level() > 0 || + cdfem_support.get_post_cdfem_refinement_levels() > 0) + { + cdfem_support.set_nonconformal_hadapt( + [&meta](const std::string & marker_field, int debug_level) + { + HAdapt::do_adaptive_refinement(meta, marker_field); + }); + } + } + + if (nullptr != my_generated_mesh.get()) + { + set_generated_mesh_domain(); + my_generated_mesh->populate_mesh(stk::EnvData::parallel_comm(), auto_aura_option); + my_bulk = &my_generated_mesh->bulk_data(); + stk_IO().set_bulk_data( Teuchos::rcpFromRef( *my_bulk ) ); + if (my_generated_mesh->has_flat_boundaries()) + my_generated_mesh->create_domain_sides(); + } + else + { + my_bulk = new stk::mesh::BulkData(meta,stk::EnvData::parallel_comm(),auto_aura_option); + stk_IO().set_bulk_data( Teuchos::rcp( my_bulk ) ); + stk_IO().populate_bulk_data(); + } + + if (AuxMetaData::get(get_stk_mesh_meta_data()).get_assert_32bit_flag()) + { + const bool has_64bit_ids_in_use = stk::is_true_on_any_proc(my_bulk->parallel(), locally_has_64bit_ids_in_use_for_nodes_or_elements(*my_bulk)); + ThrowErrorMsgIf(has_64bit_ids_in_use, "Option use_32_bit ids is active, but input file uses 64 bit ids."); + } + else + { + my_bulk->set_large_ids_flag(true); + } + + if (my_bulk->is_automatic_aura_on() || my_bulk->parallel_size() == 1) + { + // Used for element side connectivty checks + stk::mesh::create_exposed_block_boundary_sides(*my_bulk, meta.universal_part(), {&AuxMetaData::get(meta).exposed_boundary_part()}); + } + + + + activate_all_entities(*my_bulk, active_part); + + LevelSet::post_commit_setup(meta); +} + +namespace { + +void zero_error_indicator(const LevelSetManager & region_ls, stk::mesh::BulkData & mesh) +{ + auto & meta = mesh.mesh_meta_data(); + const auto & cdfem_support = CDFEM_Support::get(meta); + const auto & aux_meta = AuxMetaData::get(meta); + auto indicator_field = + aux_meta.get_field(stk::topology::ELEMENT_RANK, + cdfem_support.get_nonconformal_adapt_indicator_name()); + + const auto & buckets = mesh.get_buckets(stk::topology::ELEMENT_RANK, + meta.locally_owned_part()); + for(auto && b_ptr : buckets) + { + auto * data = field_data(indicator_field, *b_ptr); + auto length = b_ptr->size(); + std::fill(data, data + length, 0.); + } +} + +void mark_selected_elements(const std::string & marker_field_name, const int current_refinement_level, const AuxMetaData & auxMeta, const int max_refinement_levels, const stk::mesh::Selector & selector) +{ + FieldRef marker_field = auxMeta.get_field(stk::topology::ELEMENT_RANK, marker_field_name); + const bool do_adapt = current_refinement_level < max_refinement_levels; + if (do_adapt) + { + stk::mesh::field_fill(1, marker_field, selector); + } +} + +void do_adaptive_refinement(const krino::CDFEM_Support & cdfemSupport, const LevelSetManager & region_ls, stk::mesh::BulkData & mesh) +{ + const auto target_count = cdfemSupport.get_nonconformal_adapt_target_count(); + if(target_count > 0) zero_error_indicator(region_ls, mesh); + { + stk::diag::TimeBlock adapt_timer__(cdfemSupport.get_timer_adapt()); + + const std::string & marker_name = "refine_field"; //cdfemSupport.get_nonconformal_adapt_marker_name(); + auto & h_adapt = cdfemSupport.get_nonconformal_hadapt(); + + const int num_refinement_levels = cdfemSupport.get_interface_maximum_refinement_level(); + const int num_refinement_steps = (target_count > 0) ? num_refinement_levels : 2*num_refinement_levels; + + const auto & indicator_field_name = cdfemSupport.get_nonconformal_adapt_indicator_name(); + + const bool do_post_adapt_refinement = cdfemSupport.get_post_adapt_refinement_levels() > 0; + std::function marker_function = + [&mesh, ®ion_ls, num_refinement_steps, do_post_adapt_refinement, target_count, indicator_field_name] + (const std::string & marker_field_name, int num_refinements) + { + const bool do_adapt = num_refinements < num_refinement_steps; + const bool more_to_do = do_adapt || do_post_adapt_refinement; + if(target_count > 0) zero_error_indicator(region_ls, mesh); + LevelSet::initialize(mesh.mesh_meta_data(), more_to_do); + if(!do_adapt) return; + + if(target_count == 0) + { + const LevelSetInterfaceGeometry interfaceGeometry(mesh.mesh_meta_data()); + CDMesh::mark_interface_elements_for_adaptivity(mesh, interfaceGeometry, marker_field_name, num_refinements); + } + else + { + HAdapt::mark_based_on_indicator_field(mesh, + marker_field_name, + indicator_field_name, + num_refinement_steps, + num_refinements, + target_count); + } + }; + + perform_multilevel_adaptivity(mesh, marker_name, marker_function, h_adapt, cdfem_do_not_refine_or_unrefine_selector(cdfemSupport)); + } +} + +void do_post_adapt_uniform_refinement(const Simulation & simulation, const krino::CDFEM_Support & cdfemSupport, const AuxMetaData & auxMeta, stk::mesh::BulkData & mesh) +{ + if ( cdfemSupport.get_post_adapt_refinement_levels() > 0 ) + { + if ( simulation.is_transient() ) + { + krinolog << "Can not do post-adaptivity uniform mesh refinement for transient problems..."; + } + else + { + krinolog << "Performing " << cdfemSupport.get_post_adapt_refinement_levels() << " levels of post-adaptivity uniform mesh refinement..." << std::endl; + + // Doing adaptive refinement with a uniform marker is better than doing uniform refinement here because of how + // the transition elements are handled. + const std::string & marker_name = "refine_field"; + auto & h_adapt = cdfemSupport.get_nonconformal_hadapt(); + const int num_levels = cdfemSupport.get_post_adapt_refinement_levels(); + FieldRef marker_field = auxMeta.get_field(stk::topology::ELEMENT_RANK, marker_name); + + std::function marker_function = + [&mesh, marker_field, num_levels] + (const std::string & marker_field_name, int num_refinements) + { + const bool do_adapt = num_refinements < num_levels; + LevelSet::initialize(mesh.mesh_meta_data(), do_adapt); + if (do_adapt) + { + stk::mesh::field_fill(1, marker_field); + } + }; + + perform_multilevel_adaptivity(mesh, marker_name, marker_function, h_adapt, cdfem_do_not_refine_or_unrefine_selector(cdfemSupport)); + } + } +} + +void do_post_cdfem_uniform_refinement(const Simulation & simulation, const krino::CDFEM_Support & cdfemSupport, const AuxMetaData & auxMeta, stk::mesh::BulkData & mesh) +{ + if ( cdfemSupport.get_post_cdfem_refinement_levels() > 0 ) + { + const int num_levels = cdfemSupport.get_post_cdfem_refinement_levels(); + if ( simulation.is_transient() ) + { + krinolog << "Can not do post-cdfem mesh refinement for transient problems..."; + } + else + { + krinolog << "Performing " << num_levels << " levels of post-cdfem mesh refinement..." << std::endl; + + // Doing adaptive refinement with a uniform marker is better than doing uniform refinement here because of how + // the transition elements are handled. + const std::string & marker_name = "refine_field"; + auto & h_adapt = cdfemSupport.get_nonconformal_hadapt(); + const stk::mesh::Selector & refinement_selector = cdfemSupport.get_post_cdfem_refinement_selector(); + std::function marker_function = + [&auxMeta, num_levels, &refinement_selector] + (const std::string & marker_field_name, int num_refinements) + { + mark_selected_elements(marker_field_name, num_refinements, auxMeta, num_levels, refinement_selector); + }; + + CDMesh::get_new_mesh()->delete_cdfem_parent_elements(); // Extreme work-around for the way percept messes up the active part on cdfem parents. + perform_multilevel_adaptivity(mesh, marker_name, marker_function, h_adapt); + } + } +} + +} + +//-------------------------------------------------------------------------------- +void Region::initialize() +{ /* %TRACE[ON]% */ Trace trace__("krino::Region::initialize()"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timerInitialize); + + const bool cdfem_is_active = krino::CDFEM_Support::is_active(get_stk_mesh_meta_data()); + krino::CDFEM_Support & cdfem_support = krino::CDFEM_Support::get(get_stk_mesh_meta_data()); + const bool adapt_is_active = cdfem_support.get_interface_maximum_refinement_level() > 0 || + cdfem_support.get_post_cdfem_refinement_levels() > 0; + + const LevelSetManager & region_ls = LevelSetManager::get(get_stk_mesh_meta_data()); + + if (my_initial_refinement_levels > 0) + { + cdfem_support.set_global_ids_are_NOT_parallel_consistent(); + HAdapt::do_uniform_refinement(get_stk_mesh_meta_data(), my_initial_refinement_levels); + } + + if (cdfem_is_active) + { + auto & bulk = get_stk_mesh_bulk_data(); + if(adapt_is_active) + { + do_adaptive_refinement(cdfem_support, region_ls, bulk); + + const auto & auxMeta = AuxMetaData::get(get_stk_mesh_meta_data()); + do_post_adapt_uniform_refinement(my_simulation, cdfem_support, auxMeta, bulk); + + const LevelSetInterfaceGeometry interfaceGeometry(get_stk_mesh_meta_data()); + krino::CDMesh::decompose_mesh(bulk, interfaceGeometry, my_simulation.get_time_step_count(), {}); + + do_post_cdfem_uniform_refinement(my_simulation, cdfem_support, auxMeta, bulk); + } + else + { + if ( cdfem_support.get_post_adapt_refinement_levels() > 0 ) + { + krinolog << "Post-adaptivity uniform refinement levels selected without any adaptivity levels. Not performing additional uniform refinement." << std::endl; + } + + const int num_init_decomp_cycles = cdfem_support.get_num_initial_decomposition_cycles(); + for (int icycle=0; icycleinitialize(0.); + + if (my_simulation.is_transient()) + { + // initialize does not end with the facets constructed so manually construct them now + ls->build_facets_locally(get_stk_mesh_meta_data().universal_part()); + + // debugging + if (krinolog.shouldPrint(LOG_FACETS)) + { + ls->facets_exoii(); + } + } + } + } + + // Skip output of empty parts + for (auto && part : get_stk_mesh_meta_data().get_parts()) + { + if (stk::io::is_part_io_part(*part)) + { + uint64_t local_num_entities = stk::mesh::count_selected_entities( + *part, get_stk_mesh_bulk_data().buckets(part->primary_entity_rank())); + uint64_t global_num_entities = 0; + stk::all_reduce_sum( + get_stk_mesh_bulk_data().parallel(), &local_num_entities, &global_num_entities, 1); + if(global_num_entities == 0) + { + stk::io::remove_io_part_attribute(*part); + } + } + } +} +//-------------------------------------------------------------------------------- + +void Region::execute() +{ /* %TRACE[ON]% */ Trace trace__("krino::Region::execute()"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timerExecute); + + // This is a hack for now to exit immediately when CDFEM is active + if (krino::CDFEM_Support::is_active(get_stk_mesh_meta_data())) + { + return; + } + + double deltaTime = time_step(); + + const LevelSetManager & region_ls = LevelSetManager::get(get_stk_mesh_meta_data()); + for(auto&& ls : region_ls) + { + ls->advance_semilagrangian(deltaTime); + } +} + +unsigned Region::spatial_dimension() const { return my_meta->spatial_dimension(); } +const stk::mesh::BulkData& Region::get_stk_mesh_bulk_data() const { ThrowRequire(my_bulk); return *my_bulk; } +stk::mesh::BulkData& Region::get_stk_mesh_bulk_data() { ThrowRequire(my_bulk); return *my_bulk; } +const stk::mesh::MetaData& Region::get_stk_mesh_meta_data() const { ThrowRequire(my_meta); return *my_meta; } +stk::mesh::MetaData& Region::get_stk_mesh_meta_data() { ThrowRequire(my_meta); return *my_meta; } +double Region::time_step() const { return my_simulation.get_time_step(); } + +stk::io::StkMeshIoBroker & Region::stk_IO() +{ + ThrowRequire(myIOBroker); + return *myIOBroker; +} + +Ioss::Region * Region::get_input_io_region() +{ + return stk_IO().get_input_io_region().get(); +} + +std::string Region::name_of_input_mesh() const +{ + return my_input_model_name; +} + +void Region::create_output_mesh() +{ + bool output_mesh = my_results_options->get_num_step_increments() != 0; + + if(!output_mesh) return; + + my_results_options->get_scheduler().set_termination_time(my_simulation.get_stop_time()); + + my_output_file_index = stk_IO().create_output_mesh(my_results_options->get_filename(), stk::io::WRITE_RESULTS, my_results_options->get_properties()); + + Teuchos::RCP active_selector = Teuchos::rcp(new stk::mesh::Selector(AuxMetaData::get(get_stk_mesh_meta_data()).active_part())); + stk_IO().set_subset_selector(my_output_file_index, active_selector); + + stk_IO().write_output_mesh(my_output_file_index); + + declare_output_variables(my_output_file_index); + + my_output_file_created = true; +} + +void +Region::declare_output_variables(size_t result_output_index) +{ + for (auto && outField : my_results_options->get_nodal_fields()) + { + const std::string & varName = outField.first; + const std::string & newName = outField.second; + stk::mesh::FieldBase *theField = get_stk_mesh_meta_data().get_field(stk::topology::NODE_RANK, varName); + if ( nullptr == theField ) + { + krinolog << "Sorry, no nodal field by the name " << varName << std::endl; + krinolog << "Available fields: " << std::endl; + for (auto && field : get_stk_mesh_meta_data().get_fields(stk::topology::NODE_RANK)) + { + krinolog << " " << field->name() << std::endl; + } + } + else + { + stk_IO().add_field(result_output_index, *theField, newName); + } + } + + for (auto && outField : my_results_options->get_element_fields()) + { + const std::string & varName = outField.first; + const std::string & newName = outField.second; + stk::mesh::FieldBase *theField = get_stk_mesh_meta_data().get_field(stk::topology::ELEMENT_RANK, varName); + if ( nullptr == theField ) + { + krinolog << "Sorry, no element field by the name " << varName << std::endl; + krinolog << "Available fields: " << std::endl; + for (auto && field : get_stk_mesh_meta_data().get_fields(stk::topology::ELEMENT_RANK)) + { + krinolog << " " << field->name() << std::endl; + } + } + else + { + stk_IO().add_field(result_output_index, *theField, newName); + } + } +} + +void Region::process_output(bool forceOutput) +{ + stk::diag::TimeBlock mesh_output_timeblock(my_timerMeshOutput); + + if(my_results_options->get_num_step_increments() == 0) return; + + stk::util::Scheduler & scheduler = my_results_options->get_scheduler(); + + if(forceOutput) scheduler.set_force_schedule(); + + const int stepCounter = my_simulation.get_time_step_count(); + const double currentTime = my_simulation.get_current_time(); + + const bool doOutput = scheduler.is_it_time(currentTime, stepCounter); + + if(!doOutput) return; + + // A couple of krino tests that just compute surface distances never call Region::initialize() + // where we normally create the output mesh. + if(!my_output_file_created) create_output_mesh(); + + stk_IO().begin_output_step(my_output_file_index, currentTime); + stk_IO().write_defined_output_fields(my_output_file_index); + stk_IO().end_output_step(my_output_file_index); +} + +void +Region::associate_input_mesh(const std::string & model_name, bool assert_32bit_ids, bool force_64bit_ids) +{ + stk::diag::TimeBlock mesh_input_timeblock(my_timerMeshInput); + + MeshInputOptions * db_options = MeshInputOptions::get(model_name); + ThrowRequireMsg(db_options != nullptr, "No finite element model found with name " << model_name); + my_input_model_name = model_name; + + ThrowRequire(db_options->is_valid()); + if (db_options->use_generated_mesh()) + { + stk::topology generated_mesh_element_type = db_options->get_generated_mesh_element_type(); + std::vector entity_rank_names = stk::mesh::entity_rank_names(); + entity_rank_names.push_back("FAMILY_TREE"); + my_generated_mesh = std::make_unique(generated_mesh_element_type,entity_rank_names); + my_meta = &my_generated_mesh->meta_data(); + stk::mesh::Field & coords_field = my_meta->declare_field>(stk::topology::NODE_RANK, "coordinates", 1); + stk::mesh::put_field_on_mesh(coords_field, my_meta->universal_part(), generated_mesh_element_type.dimension(), nullptr); + } + else + { + const std::string directory = sierra::Env::working_directory().c_str(); + const std::string filename(Ioss::Utils::local_filename(db_options->get_filename(), db_options->get_filetype(), directory)); + + stk::io::StkMeshIoBroker & stk_io = stk_IO(); + + stk_io.property_add(Ioss::Property("MAXIMUM_NAME_LENGTH", 180)); + + if (!db_options->get_decomposition_method().empty()) + { + stk_io.property_add(Ioss::Property("DECOMPOSITION_METHOD", Ioss::Utils::uppercase(db_options->get_decomposition_method()))); + } + + stk_io.add_mesh_database(db_options->get_filename(), stk::io::READ_MESH); + stk_io.create_input_mesh(); + my_meta = &stk_io.meta_data(); + AuxMetaData::create(*my_meta); + auto & active_part = AuxMetaData::get(*my_meta).active_part(); + stk::mesh::Selector activeSelector = active_part; + stk_io.set_active_selector(activeSelector); + } + + if (assert_32bit_ids) + { + AuxMetaData::get(*my_meta).set_assert_32bit_flag(); + } + if (!force_64bit_ids) + { + AuxMetaData::get(*my_meta).clear_force_64bit_flag(); + } +} + +void +Region::set_generated_mesh_domain() +{ + MeshInputOptions * db_options = MeshInputOptions::get(my_input_model_name); + ThrowRequire(db_options != nullptr); + my_generated_mesh->set_mesh_structure_type(db_options->get_generated_mesh_structure_type()); + const double mesh_size = db_options->get_generated_mesh_size(); + if (db_options->get_generated_mesh_domain_type() == MeshInputOptions::GENERATED_MESH_FOR_SPECIFIED_DOMAIN) + { + typename BoundingBoxMesh::BoundingBoxType bbox; + const std::vector & domain = db_options->get_generated_mesh_domain(); + if (db_options->get_generated_mesh_spatial_dimension() == 2) + { + ThrowRequire(domain.size() == 4); + const Vector3d min(domain[0], domain[1], 0.); + const Vector3d max(domain[2], domain[3], 0.); + ThrowRequireMsg(max[0]>min[0] && max[1]>min[1], "Invalid domain specified."); + bbox = BoundingBoxMesh::BoundingBoxType(min, max); + } + else + { + ThrowRequire(domain.size() == 6); + const Vector3d min(domain[0], domain[1], domain[2]); + const Vector3d max(domain[3], domain[4], domain[5]); + ThrowRequireMsg(max[0]>min[0] && max[1]>min[1] && max[2]>min[2], "Invalid domain specified."); + bbox = BoundingBoxMesh::BoundingBoxType(min, max); + } + my_generated_mesh->set_domain(bbox, mesh_size); + } + else + { + typename BoundingBoxMesh::BoundingBoxType domain_bbox; + const LevelSetManager & region_ls = LevelSetManager::get(get_stk_mesh_meta_data()); + for(auto&& ls : region_ls) + { + if (ls->has_IC_surfaces()) + { + BoundingBox ls_IC_surf_bbox = ls->get_IC_surface_bounding_box(); + domain_bbox.accommodate(ls_IC_surf_bbox); + } + } + + if (db_options->get_generated_mesh_spatial_dimension() == 2) + { + Vector3d min = domain_bbox.get_min(); + Vector3d max = domain_bbox.get_max(); + min[2] = 0.; + max[2] = 0.; + domain_bbox = typename BoundingBoxMesh::BoundingBoxType(min, max); + } + my_generated_mesh->set_domain(domain_bbox, mesh_size, 1); + } +} + +} // namespace krino + diff --git a/packages/krino/krino/region/Akri_Region.hpp b/packages/krino/krino/region/Akri_Region.hpp new file mode 100644 index 000000000000..7b175775ae6b --- /dev/null +++ b/packages/krino/krino/region/Akri_Region.hpp @@ -0,0 +1,81 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Region_h +#define Akri_Region_h + +#include +#include +#include + +namespace stk { namespace mesh { class MetaData; } } +namespace stk { namespace mesh { class BulkData; } } +namespace stk { namespace mesh { class Part; } } +namespace stk { namespace io { class StkMeshIoBroker; } } +namespace krino { class BoundingBoxMesh; } +namespace krino { class RegionForwarder; } +namespace krino { class ResultsOutputOptions; } +namespace krino { class Simulation; } +namespace Ioss { class Region; } + +namespace krino{ + +class Region { +public: + Region(Simulation & owning_simulation, const std::string & regionName); + virtual ~Region(); + + virtual void commit(); + virtual void initialize(); + virtual void execute(); + + double time_step() const; + const std::string & name() const { return my_name; } + unsigned spatial_dimension() const; + const stk::mesh::BulkData& get_stk_mesh_bulk_data() const; + stk::mesh::BulkData& get_stk_mesh_bulk_data(); + const stk::mesh::MetaData& get_stk_mesh_meta_data() const; + stk::mesh::MetaData& get_stk_mesh_meta_data(); + stk::diag::Timer & getRegionTimer() const { return my_timerRegion; } + stk::diag::Timer & getMeshInputTimer() const { return my_timerMeshInput; } + stk::diag::Timer & getMeshOutputTimer() const { return my_timerMeshOutput; } + + stk::io::StkMeshIoBroker & stk_IO(); + std::string name_of_input_mesh() const; + Ioss::Region * get_input_io_region(); + void associate_input_mesh(const std::string & model_name, bool assert_32bit_ids, bool force_64bit_ids); + void set_generated_mesh_domain(); + void create_output_mesh(); + void declare_output_variables(size_t result_output_index); + void process_output(bool forceOutput); + ResultsOutputOptions * get_results_options() { return my_results_options.get(); } + void set_initial_refinement_levels(int levels) { my_initial_refinement_levels = levels; } + +private: + Simulation & my_simulation; + stk::mesh::MetaData * my_meta; + stk::mesh::BulkData * my_bulk; + std::unique_ptr myIOBroker; + std::unique_ptr my_generated_mesh; + std::unique_ptr my_results_options; + std::string my_name; + std::string my_input_model_name; + + mutable stk::diag::Timer my_timerRegion; ///< Region's root timer + mutable stk::diag::Timer my_timerInitialize; ///< Initialize timer + mutable stk::diag::Timer my_timerExecute; ///< Execute timer + mutable stk::diag::Timer my_timerMeshInput; ///< Mesh input timer + mutable stk::diag::Timer my_timerMeshOutput; ///< Mesh output timer + size_t my_output_file_index; + bool my_output_file_created; + int my_initial_refinement_levels; +}; + +} // namespace krino + +#endif // Akri_Region_h diff --git a/packages/krino/krino/region/Akri_RegisterProduct.cpp b/packages/krino/krino/region/Akri_RegisterProduct.cpp new file mode 100644 index 000000000000..891ad313cb77 --- /dev/null +++ b/packages/krino/krino/region/Akri_RegisterProduct.cpp @@ -0,0 +1,30 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include + +namespace krino { + +const char * +get_product_name() +{ /* %TRACE% */ /* %TRACE% */ + return "Krino"; +} + + +void +register_product() +{ /* %TRACE% */ /* %TRACE% */ + // Register krino + stk::ProductRegistry::instance().addRegion(get_product_name()); +} + +} // namespace krino + diff --git a/packages/krino/krino/region/Akri_RegisterProduct.hpp b/packages/krino/krino/region/Akri_RegisterProduct.hpp new file mode 100644 index 000000000000..ab4d53824791 --- /dev/null +++ b/packages/krino/krino/region/Akri_RegisterProduct.hpp @@ -0,0 +1,20 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_RegisterProduct_h +#define Akri_RegisterProduct_h + +namespace krino { + +const char *get_product_name(); + +void register_product(); + +} // namespace krino + +#endif // Akri_RegisterProduct_h diff --git a/packages/krino/krino/region/Akri_ResultsOutputOptions.hpp b/packages/krino/krino/region/Akri_ResultsOutputOptions.hpp new file mode 100644 index 000000000000..2a0b1796bd2c --- /dev/null +++ b/packages/krino/krino/region/Akri_ResultsOutputOptions.hpp @@ -0,0 +1,88 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_ResultsOutputOptions_h +#define Akri_ResultsOutputOptions_h + +#include +#include +#include +#include +#include // for String +#include "stk_topology/topology.hpp" // for topology, etc +#include + +namespace stk { namespace mesh { class Part; } } +namespace stk { namespace mesh { class MetaData; } } + +namespace krino { + + typedef std::pair StepIncrement; + typedef std::pair FieldName_OutputName_Pair; + + class ResultsOutputOptions { + + public: + + ResultsOutputOptions() : + my_scheduler(), + my_numStepIncrements(0) + { + my_scheduler.set_lookahead(1); + my_filename = "default_filename"; + } + + stk::util::Scheduler & get_scheduler() { return my_scheduler; } + + void set_title(std::string title) { my_title = title; } + const std::string & get_title() const { return my_title; } + + void set_name(std::string theName) { my_name = theName; } + const std::string & get_name() const { return my_name; } + + void set_filename(std::string filename) { my_filename = filename; } + const std::string & get_filename() const { return my_filename; } + + void add_step_increment(int start, int increment) { + StepIncrement aStep(start, increment); + my_scheduler.add_interval(start, increment); + my_numStepIncrements++; + } + unsigned get_num_step_increments() const { return my_numStepIncrements; } + + void add_nodal_field(const std::string & internalName, const std::string & newName) + { + FieldName_OutputName_Pair aPair(internalName, newName); + my_nodal_fields.insert(aPair); + } + const std::set & get_nodal_fields() const { return my_nodal_fields; } + + void add_element_field(const std::string & internalName, const std::string & newName) + { + FieldName_OutputName_Pair aPair(internalName, newName); + my_element_fields.insert(aPair); + } + const std::set & get_element_fields() const { return my_element_fields; } + + void add_property(const Ioss::Property & property) { my_properties.add(property); } + Ioss::PropertyManager & get_properties() { return my_properties; } + + private: + stk::util::Scheduler my_scheduler; + unsigned my_numStepIncrements; + std::string my_name; + std::string my_title; + std::string my_filename; + std::set my_nodal_fields; + std::set my_element_fields; + Ioss::PropertyManager my_properties; + }; + +} // namespace krino + +#endif /* Akri_ResultsOutputOptions_h */ diff --git a/packages/krino/krino/region/Akri_Simulation.cpp b/packages/krino/krino/region/Akri_Simulation.cpp new file mode 100644 index 000000000000..313f6c1e4842 --- /dev/null +++ b/packages/krino/krino/region/Akri_Simulation.cpp @@ -0,0 +1,179 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace krino{ + +std::unique_ptr Simulation::the_simulation; + +Simulation & Simulation::build(const std::string & in_name) +{ + ThrowRequireMsg(!the_simulation, "Simulation already set."); + the_simulation = std::make_unique(in_name); + return *the_simulation; +} + +Simulation & Simulation::get() +{ + ThrowRequireMsg(the_simulation, "Simulation should already be set."); + return *the_simulation; +} + +Simulation::Simulation(const std::string & in_name) + : my_name(in_name), + my_timer("krino", sierra::Diag::sierraTimer()), + my_is_transient(false), + my_stop_time(0.0), + my_step_count(0), + my_current_time(0.0), + my_time_step_size(0.0) +{ + stk::diag::setEnabledTimerMetricsMask(stk::diag::METRICS_CPU_TIME | stk::diag::METRICS_WALL_TIME); +} + +Simulation::~Simulation() {} + +void Simulation::add_region(Region * region) +{ + my_regions.emplace_back(region); +} + +void Simulation::commit() +{/* %TRACE% */ Trace trace__("krino::Simulation::commit()"); /* %TRACE% */ + for (auto && region : my_regions) + { + region->commit(); + } +} + +void Simulation::execute() +{/* %TRACE% */ Trace trace__("krino::Simulation::execute()"); /* %TRACE% */ + stk::diag::TimeBlock timer__(my_timer); + + //===================================== + // start-up procedure + //===================================== + + // initial conditions + for (auto && region : my_regions) + { + region->initialize(); + } + + for (auto && region : my_regions) + { + region->process_output(false); + } + + //===================================== + // time integration + //===================================== + + while ( my_current_time < my_stop_time ) + { + static const double sqrt_epsilon = std::sqrt(std::numeric_limits::epsilon()); + if (my_current_time+my_time_step_size > my_stop_time*(1.-sqrt_epsilon)) + { + my_time_step_size = my_stop_time - my_current_time; + my_current_time = my_stop_time; + } + else + { + my_current_time += my_time_step_size; + } + ++my_step_count; + + const double percentComplete = 100.0*my_current_time/my_stop_time; + + krinolog << "Krino Simulation " << my_name + << ", step " << my_step_count + << ", time " << my_current_time + << ", time step " << my_time_step_size + << ", " << percentComplete << "% complete" + << stk::diag::dendl; + + for (auto && region : my_regions) + { + region->execute(); + } + + for (auto && region : my_regions) + { + region->process_output(false); + } + + for (auto && region : my_regions) + { + region->get_stk_mesh_bulk_data().update_field_data_states(); + } + } + + timer__.stop(); + print_performance_info(); +} + +void +Simulation::print_performance_info() const +{ + /* %TRACE% */ Trace trace__("krino::Simulation::print_timer_information()"); /* %TRACE% */ + + sierra::Env::outputP0() << sierra::Env::section_separator() << std::endl + << "Timing summary running on " << sierra::Env::parallel_size() << " processor" << (sierra::Env::parallel_size() == 1 ? "" : "s") << std::endl; + stk::diag::printTimersTable(sierra::Env::outputP0(), sierra::Diag::sierraTimer(), stk::diag::METRICS_CPU_TIME | stk::diag::METRICS_WALL_TIME, false, sierra::Env::parallel_comm()); + sierra::Env::outputP0() << std::endl << std::endl; + + { + size_t now, hwm; + stk::get_memory_usage(now, hwm); + // min, max, sum + size_t global_now[3] = {now,now,now}; + size_t global_hwm[3] = {hwm,hwm,hwm}; + + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceSum<1>( &global_now[2] ) ); + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceMin<1>( &global_now[0] ) ); + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceMax<1>( &global_now[1] ) ); + + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceSum<1>( &global_hwm[2] ) ); + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceMin<1>( &global_hwm[0] ) ); + stk::all_reduce(sierra::Env::parallel_comm(), stk::ReduceMax<1>( &global_hwm[1] ) ); + + sierra::Env::outputP0() << "Memory Overview: " << std::endl; + + sierra::Env::outputP0() << " total (over all cores) current/high-water mark = " + << std::setw(15) << stk::human_bytes(global_now[2]) + << std::setw(15) << stk::human_bytes(global_hwm[2]) + << std::endl; + + sierra::Env::outputP0() << " min (over all cores) current/high-water mark = " + << std::setw(15) << stk::human_bytes(global_now[0]) + << std::setw(15) << stk::human_bytes(global_hwm[0]) + << std::endl; + + sierra::Env::outputP0() << " max (over all cores) current/high-water mark = " + << std::setw(15) << stk::human_bytes(global_now[1]) + << std::setw(15) << stk::human_bytes(global_hwm[1]) + << std::endl; + } +} + +} // namespace krino diff --git a/packages/krino/krino/region/Akri_Simulation.hpp b/packages/krino/krino/region/Akri_Simulation.hpp new file mode 100644 index 000000000000..62a0c300e12b --- /dev/null +++ b/packages/krino/krino/region/Akri_Simulation.hpp @@ -0,0 +1,68 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef Akri_Simulation_h +#define Akri_Simulation_h + +#include +#include +#include +#include +#include + +namespace krino{ + +class Region; + +class Simulation { +public: + static Simulation & build(const std::string & in_name); + Simulation(const std::string & in_name); // public to allow make_unique, but should be created using build() + ~Simulation(); + + void commit(); + void initialize() {} + void execute(); + + void add_region(Region * region); + + const std::string & get_name() const { return my_name; } + bool is_transient() const { return my_is_transient; } + double get_time_step() const { return my_time_step_size; } + double get_current_time() const { return my_current_time; } + double get_stop_time() const { return my_stop_time; } + int get_time_step_count() const { return my_step_count; } + + void set_time_step(const double in_time_step) { my_time_step_size = in_time_step; } + void set_current_time(const double in_time) { my_current_time = in_time; } + void set_stop_time(const double in_time) { my_is_transient = true; my_stop_time = in_time; } + + stk::diag::Timer & get_timer() const { return my_timer; } + void print_performance_info() const; + + static Simulation & get(); + static void reset() { the_simulation.reset(); } + +private: + static std::unique_ptr the_simulation; + +private: + std::string my_name; + mutable stk::diag::Timer my_timer; + bool my_is_transient; + double my_stop_time; + unsigned my_step_count; + double my_current_time; + double my_time_step_size; + std::vector> my_regions; +}; + +} // namespace krino + +#endif // Akri_Simulation_h + diff --git a/packages/krino/krino/region/Akri_Startup.cpp b/packages/krino/krino/region/Akri_Startup.cpp new file mode 100644 index 000000000000..2496ae35d651 --- /dev/null +++ b/packages/krino/krino/region/Akri_Startup.cpp @@ -0,0 +1,306 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino{ + +namespace { + +std::string +get_program_path(const char *program) +{ + // If we already have the full path, just return it + if (program[0] == '/') + return program; + + char full_path[PATH_MAX]; + if (strchr(program, '/') != nullptr) { + realpath(program, full_path); + return full_path; + } + + char *PATH = getenv("PATH"); + while (PATH && *PATH) { + // Get the character past the end of the next directory in PATH, i.e. + // either the '/' or the '\0' + char *end = strchr(PATH, ':'); + if (!end) { + end = PATH+strlen(PATH); + } + + // Set current = directory + '/' + program + strncpy(full_path, PATH, end-PATH); + full_path[end-PATH] = '/'; + strcpy(&full_path[end-PATH+1], program); + + // Check whether possible exists + if (access(full_path, X_OK) == 0) + return full_path; + + // Advance to the next directory + PATH = *end ? end+1 : end; + } + + // Not found; this shouldn't happen, but maybe the executable got deleted + // after it was invoked before we got here -- or we have some crazy + // parallel machine where the executable is inaccessible on the compute + // nodes despite it somehow having been loaded. No big deal, just return + // the non-absolute path. + return program; +} + +} // namespace + +Startup::Startup(int argc, char ** argv) + : my_flag_exit_early(false) +{ + if ( MPI_SUCCESS != MPI_Init( &argc , &argv ) ) { + throw std::runtime_error("MPI_Init failed"); + } + + stk::EnvData::instance().m_parallelComm = MPI_COMM_WORLD; + MPI_Comm_size(stk::EnvData::parallel_comm(), &stk::EnvData::instance().m_parallelSize); + MPI_Comm_rank(stk::EnvData::parallel_comm(), &stk::EnvData::instance().m_parallelRank); + + stk::register_message_type(stk::MSG_WARNING, 10000000, "Warning"); + stk::register_message_type(stk::MSG_DOOMED, 10000000, "Parser error"); + stk::register_message_type(stk::MSG_EXCEPTION, 1000000, "Exception"); + sierra::Diag::registerWriter("krinolog", krinolog, theDiagWriterParser()); + + // Register this so that -version will know this region is used. + register_product(); + + stk::set_report_handler(report_handler); + + setup_commandline_options(); + + // parse command line options + const stk::OptionsSpecification &desc = stk::get_options_specification(); + stk::ParsedOptions &parsedOptions = stk::get_parsed_options(); + stk::parse_command_line_args(argc, const_cast(argv), desc, parsedOptions); + + for (auto && writer : sierra::Diag::getWriterRegistry()) + { + if (parsedOptions.count(writer.first)) + { + writer.second.first->setPrintMask(writer.second.second->parse(parsedOptions[writer.first].as().c_str())); + } + } + + if ( parsedOptions.count("help") ) { + if (0 == stk::EnvData::parallel_rank()) + { + std::cerr << desc << std::endl; + } + my_flag_exit_early = true; + } + + if (parsedOptions.count("version")) { + if (0 == stk::EnvData::parallel_rank()) + { + std::cerr << "Version: Krino1.0" << std::endl; + } + my_flag_exit_early = true; + } + + int local_flag_exit_early = my_flag_exit_early; + MPI_Allreduce(&local_flag_exit_early, &my_flag_exit_early, 1, MPI_INT, MPI_MAX, stk::EnvData::parallel_comm()); + if (my_flag_exit_early) return; + + const std::string inputFileName = sierra::Env::get_param("input-deck"); + if (stk::EnvData::instance().m_inputFileRequired) + { + if(inputFileName == "") + { + throw std::runtime_error("No input file specified. An input file must be specified with the '-i' option"); + } + + stk::EnvData::setInputFileName(inputFileName); + } + + // setup logfile as inputFileName.log + std::string logFileName = parsedOptions["output-log"].as(); + if (logFileName == "") + { + int dotPos = inputFileName.rfind("."); + if ( -1 == dotPos ) { + // lacking extension + logFileName = inputFileName + ".log"; + } + else { + // with extension; swap with .log + logFileName = inputFileName.substr(0, dotPos) + ".log"; + } + } + + // set up output streams + const std::string output_description = + (0 == stk::EnvData::parallel_rank()) ? + "outfile=" + logFileName + " out>outfile+pout dout>out" : + "out>pout dout>out"; + std::string parallel_output_description = " pout>null"; + if (parsedOptions.count("pout")) + { + std::ostringstream s; + s << " poutfile=" << logFileName << "." << stk::EnvData::parallel_size() << "." << stk::EnvData::parallel_rank() << " pout>poutfile"; + parallel_output_description = s.str(); + } + stk::bind_output_streams(output_description+parallel_output_description); + stk::EnvData::instance().m_outputP0 = &sierra::out(); + + // output run info + const std::string program_path = get_program_path(argv[0]); + const char * build_date_time = __DATE__ " " __TIME__; + stk::EnvData::instance().m_executablePath = program_path; + + stk::EnvData::instance().m_productName = krino::get_product_name(); + stk::ProductRegistry::AttributeMap &product_attributes = stk::ProductRegistry::instance().getProductAttributeMap(sierra::Env::product_name()); + product_attributes[stk::ProductRegistry::BUILD_TIME] = build_date_time; + product_attributes[stk::ProductRegistry::EXECUTABLE] = program_path; + + sierra::Env::outputP0() + << sierra::Env::subsection_separator() + << std::endl + << "Executable Name = " << sierra::Env::product_name() << std::endl + << "Executable Version= " << stk::ProductRegistry::version() << std::endl + << "Executable Date = " << stk::ProductRegistry::instance().getProductAttribute(sierra::Env::product_name(), stk::ProductRegistry::BUILD_TIME) << std::endl + << "Executable File = " << sierra::Env::executable_file() << std::endl + << "Run Start Date = " << sierra::Env::startup_date() << std::endl << std::endl + << "Working Directory = " << sierra::Env::working_directory() << std::endl + << "Parsed Input File = " << sierra::Env::getInputFileName() << std::endl + << sierra::Env::subsection_separator() + << std::endl << std::endl ; +} + +void Startup::setup_commandline_options() +{ + stk::OptionsSpecification desc("Allowed options"); + desc.add_options() + ("help,h", "produce help message") + ("input-deck,i", "Analysis input file", stk::DefaultValue("")) + ("output-log,o", "Output log file path, one of : 'cout', 'cerr', or a file path", stk::DefaultValue("")) + ("aprepro,a", "Process (on) or don't process (off) input with aprepro. Default=on.", stk::ImplicitValue("on")) + ("define,D", "Define symbols for use in aprepro processing of input file", stk::ValueType()) + ("pout", "use separate output log file for each MPI process"); + + for (auto && writer : sierra::Diag::getWriterRegistry()) + { + std::ostringstream str; + str << "Diagnostic writer " << writer.first << std::endl; + writer.second.second->describe(str); + desc.add_options()(writer.first.c_str(), str.str().c_str(), stk::ValueType()); + } + + stk::get_options_specification().add(desc); +} + +Startup::~Startup() +{ + MPI_Finalize(); +} + +void Startup::handle_exception(const char * what, const bool is_parsing) +{ + krinolog << stk::diag::dendl; + krinolog << "Exception: " << what << stk::diag::dendl; + krinolog << stk::diag::Traceback::printTraceback(stk::diag::Traceback::snapshot()) << stk::diag::dendl; + if (is_parsing) + { + if (0 == stk::EnvData::parallel_rank()) + { + std::cerr << "*** Parser Error ***\n*** check log file for more information ***" << std::endl; + } + std::cout << std::flush; + std::cerr << std::flush; + + ::sleep(1); // Give the other processors a chance at + // catching up, seems to help hanging problems. + + MPI_Finalize(); + std::exit(1); + } + + if (0 == stk::EnvData::parallel_rank()) + { + std::cerr << "*** ABORT on P0 ***\n*** check log file for more information ***" << std::endl; + } + else + { + // give root proc chance to die first + ::sleep(2); + std::cerr << "*** ABORT on P" < +#include + +namespace krino{ + +class Startup +{ + public: + + Startup(int argc, char ** argv); + ~Startup(); + + bool exit_early() const { return my_flag_exit_early; } + void handle_exception(const char * what, const bool is_parsing); + + static void setup_commandline_options(); + static void report_handler(const char *message, int type); + +private: + int my_flag_exit_early; +}; + +} // namespace krino + +#endif // Akri_Startup_h diff --git a/packages/krino/krino/region/CMakeLists.txt b/packages/krino/krino/region/CMakeLists.txt new file mode 100644 index 000000000000..35b1a27d73b2 --- /dev/null +++ b/packages/krino/krino/region/CMakeLists.txt @@ -0,0 +1,19 @@ +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + krino_region_lib + HEADERS ${HEADERS} + SOURCES ${SOURCES} + DEPLIBS krino_lib krino_adaptivity_interface_lib) + +INSTALL(FILES ${HEADERS} DESTINATION + ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/krino_region_lib) + diff --git a/packages/krino/krino/unit_tests/Akri_UnitMathUtils.cpp b/packages/krino/krino/unit_tests/Akri_UnitMathUtils.cpp new file mode 100644 index 000000000000..8df8c1a1f209 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_UnitMathUtils.cpp @@ -0,0 +1,64 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino { + +void expect_root(const double goldRoot, const double xTol, const std::function & f) +{ + const unsigned maxIters = 100; + const auto result = find_root(f, 0., 1., f(0.), f(1.), maxIters, xTol); + ASSERT_TRUE(result.first); + EXPECT_NEAR(goldRoot, result.second, xTol); +} + +void expect_root_newton_raphson(const double goldRoot, const double guess, const double fTol, const std::function(const double)> & f) +{ + const unsigned maxIters = 100; + const auto result = find_root_newton_raphson(f, guess, maxIters, fTol); + ASSERT_TRUE(result.first); + const auto valueAndDeriv = f(result.second); + const double xTol = fTol / std::abs(valueAndDeriv.second); + EXPECT_NEAR(0., valueAndDeriv.first, fTol); + EXPECT_NEAR(goldRoot, result.second, xTol); +} + +TEST(find_root, givenPolynomialFunction_findRootWithinTolerance) +{ + const double tol = 1.e-5; + expect_root(0.25, tol, [](const double x){ return x-0.25; }); + expect_root(0.25, tol, [](const double x){ return x*x-0.25*0.25; }); + expect_root(0.25, tol, [](const double x){ return x*x*x-0.25*0.25*0.25; }); +} + + +TEST(find_root_newton_raphson, givenPolynomialFunctionWithCorrectJacobian_findRootWithinTolerance) +{ + const double tol = 1.e-5; + const double guess = 1.; + expect_root_newton_raphson(0.25, guess, tol, [](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x-0.25, 1.); }); + expect_root_newton_raphson(0.25, guess, tol, [](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x*x-0.25*0.25, 2.*x); }); + expect_root_newton_raphson(0.25, guess, tol, [](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x*x*x-0.25*0.25*0.25, 3.*x*x); }); +} + +TEST(find_root_newton_raphson, givenPolynomialFunctionWithWRONGJacobian_findRootWithinTolerance) +{ + const double tol = 1.e-5; + const double guess = 1.; + const double error = 0.1; // Less than 1 to make function overshoot + expect_root_newton_raphson(0.25, guess, tol, [error](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x-0.25, 1.*error); }); + expect_root_newton_raphson(0.25, guess, tol, [error](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x*x-0.25*0.25, 2.*x*error); }); + expect_root_newton_raphson(0.25, guess, tol, [error](const double x){ std::cout << "Eval at " << x << std::endl; return std::make_pair(x*x*x-0.25*0.25*0.25, 3.*x*x*error); }); +} + +} + diff --git a/packages/krino/krino/unit_tests/Akri_UnitTestUtils.cpp b/packages/krino/krino/unit_tests/Akri_UnitTestUtils.cpp new file mode 100644 index 000000000000..fbb85740d585 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_UnitTestUtils.cpp @@ -0,0 +1,23 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +namespace krino { + +void expect_eq(const Vector3d & gold, const Vector3d & result, const double relativeTol=1.e-6) +{ + const double absoluteTol = relativeTol * (gold.length() + result.length()); + for (int i=0; i<3; ++i) + EXPECT_NEAR(gold[i], result[i], absoluteTol) <<"gold: " << gold << " actual:" << result; +} + +} + + diff --git a/packages/krino/krino/unit_tests/Akri_UnitTestUtils.hpp b/packages/krino/krino/unit_tests/Akri_UnitTestUtils.hpp new file mode 100644 index 000000000000..ebb0e3b7dbe0 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_UnitTestUtils.hpp @@ -0,0 +1,19 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_UNIT_TESTS_INCLUDE_AKRI_UNITTESTUTILS_H_ +#define KRINO_UNIT_TESTS_INCLUDE_AKRI_UNITTESTUTILS_H_ +#include + +namespace krino { + +void expect_eq(const Vector3d & gold, const Vector3d & result, const double relativeTol=1.e-6); + +} + +#endif /* KRINO_UNIT_TESTS_INCLUDE_AKRI_UNITTESTUTILS_H_ */ diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Analytic_CDMesh.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Analytic_CDMesh.cpp new file mode 100644 index 000000000000..59ac23793422 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Analytic_CDMesh.cpp @@ -0,0 +1,276 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +static void expect_good_mesh(const stk::mesh::BulkData & mesh, const CDMesh & cdmesh) +{ + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(cdmesh.check_element_side_parts()); +} + +template +class AnalyticDecompositionFixture : public ::testing::Test +{ +public: + AnalyticDecompositionFixture() + : fixture(), cdfemSupport(CDFEM_Support::get(fixture.meta_data())) + { + AuxMetaData & aux_meta = AuxMetaData::get(fixture.meta_data()); + auto & vec_type = fixture.meta_data().spatial_dimension() == 2 ? FieldType::VECTOR_2D : FieldType::VECTOR_3D; + coord_field = aux_meta.register_field("coordinates", vec_type, stk::topology::NODE_RANK, 1u, 1u, fixture.meta_data().universal_part()); + cdfemSupport.set_coords_field(coord_field); + cdfemSupport.add_interpolation_field(coord_field); + + cdfemSupport.set_prolongation_model(INTERPOLATION); + } + + void setup_phase_support(const stk::mesh::PartVector & blocks) + { + PhaseTag p, n; + const LevelSet_Identifier id0(0); + p.add(id0, 1); + n.add(id0, -1); + PhaseVec named_phases{{"A", p}, {"B", n}}; + + Phase_Support & phase_support = Phase_Support::get(fixture.meta_data()); + Block_Surface_Connectivity block_surface_info; + phase_support.set_input_block_surface_connectivity(block_surface_info); + LevelSet * ls_ptr = nullptr; + phase_support.register_blocks_for_level_set(ls_ptr, blocks); + phase_support.decompose_blocks(blocks, named_phases, LS_Name_Generator()); + LS_Field lsField("LS", id0); + cdfemSupport.add_ls_field(lsField, nullptr); + } + + stk::mesh::Part & declare_input_block(const std::string & name, const stk::topology topo) + { + auto & block_part = fixture.meta_data().declare_part_with_topology(name, topo); + stk::io::put_io_part_attribute(block_part); + return block_part; + } + + void decompose_mesh(const InterfaceGeometry & interfaceGeometry) + { + NodeToCapturedDomainsMap nodesToCapturedDomains; + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + nodesToCapturedDomains = snap_as_much_as_possible_while_maintaining_quality(krino_mesh->stk_bulk(), krino_mesh->get_active_part(), cdfemSupport.get_interpolation_fields(), interfaceGeometry, cdfemSupport.get_global_ids_are_parallel_consistent()); + interfaceGeometry.prepare_to_process_elements(krino_mesh->stk_bulk(), nodesToCapturedDomains); + + if(!krino_mesh->my_old_mesh) + { + krino_mesh->my_old_mesh = std::make_shared(fixture.bulk_data(), std::shared_ptr()); + krino_mesh->my_old_mesh->generate_nonconformal_elements(); + } + + krino_mesh->generate_nonconformal_elements(); + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + krino_mesh->snap_nearby_intersections_to_nodes(interfaceGeometry, nodesToCapturedDomains); + krino_mesh->set_phase_of_uncut_elements(interfaceGeometry); + krino_mesh->triangulate(interfaceGeometry); + krino_mesh->my_old_mesh->stash_field_data(-1, *krino_mesh); + + + krino_mesh->decompose(); + krino_mesh->modify_mesh(); + krino_mesh->prolongation(); + } + + void commit() + { + krino_mesh = std::make_shared(fixture.bulk_data(), std::shared_ptr()); + } + + void write_results(const std::string & filename) + { + stk::io::write_mesh(filename, fixture.bulk_data()); + } + + void test_build_good_mesh(const bool doSnapping, + const InterfaceGeometry & interfaceGeometry, + const typename BoundingBoxMesh::BoundingBoxType & domain, + const double meshSize, + const std::string & filename = "") + { + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size > 2) return; + + if (doSnapping) + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + else + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_NODE); + + auto & block1_part = aux_meta.get_part("block_1"); + setup_phase_support({&block1_part}); + + fixture.set_domain(domain, meshSize); + fixture.populate_mesh(); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part(),&aux_meta.active_part()}); + + commit(); + + try + { + decompose_mesh(interfaceGeometry); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + expect_good_mesh(mesh, *krino_mesh); + + std::cout << log.get_log() << std::endl; + if (!filename.empty()) + write_results(filename); + } + + MESH_FIXTURE fixture; + FieldRef coord_field; + CDFEM_Support & cdfemSupport; + std::shared_ptr krino_mesh; + LogRedirecter log; +}; + +template +class SphereDecompositionFixture : public AnalyticDecompositionFixture +{ +public: + SphereDecompositionFixture() + { + mySphereGeometry.reset(new AnalyticSurfaceInterfaceGeometry(mySphere, AuxMetaData::get(this->fixture.meta_data()).active_part(), this->cdfemSupport, Phase_Support::get(this->fixture.meta_data()))); + } +protected: + const InterfaceGeometry & get_interface_geometry() const { return *mySphereGeometry; } + typename BoundingBoxMesh::BoundingBoxType get_domain() const + { + const Vector3d extents = (2 == this->fixture.meta_data().spatial_dimension()) ? Vector3d(1.,1.,0.) : Vector3d(1.,1.,1.); + typename BoundingBoxMesh::BoundingBoxType domain(-0.5*extents, 0.5*extents); + return domain; + } + double get_mesh_size() const { return 1./6.; } + Sphere mySphere{"test sphere", Vector3d::ZERO, 0.35}; + std::unique_ptr mySphereGeometry; +}; + +typedef SphereDecompositionFixture CDMeshSphereTestsBboxMesh2D; +TEST_F(CDMeshSphereTestsBboxMesh2D, Sphere_SnapMesh) +{ + const bool doSnap = true; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "2DSnapSphere.e"); +} + +TEST_F(CDMeshSphereTestsBboxMesh2D, Sphere_CutMesh) +{ + const bool doSnap = false; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "2DCutSphere.e"); +} + +typedef SphereDecompositionFixture CDMeshSphereTestsBboxMesh3D; +TEST_F(CDMeshSphereTestsBboxMesh3D, Sphere_SnapMesh) +{ + const bool doSnap = true; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "3DSnapSphere.e"); +} + +TEST_F(CDMeshSphereTestsBboxMesh3D, Sphere_CutMesh) +{ + const bool doSnap = false; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "3DCutSphere.e"); +} + +template +class CubeDecompositionFixture : public AnalyticDecompositionFixture +{ +public: + CubeDecompositionFixture() + { + const double x = 0.25; + const std::array cubeVerts = + {{ + {-x,-x,-x}, {+x,-x,-x}, {+x,+x,-x}, {-x,+x,-x}, + {-x,-x,+x}, {+x,-x,+x}, {+x,+x,+x}, {-x,+x,+x} + }}; + + const std::array,12> facetsVerts + {{ + {{0,4,7}}, {{0,7,3}}, + {{1,2,6}}, {{1,6,5}}, + {{0,1,5}}, {{0,5,4}}, + {{2,3,7}}, {{2,7,6}}, + {{0,3,2}}, {{0,2,1}}, + {{4,5,6}}, {{4,6,7}} + }}; + for (auto && facetVerts : facetsVerts) + { + std::unique_ptr facet = std::make_unique( cubeVerts[facetVerts[0]], cubeVerts[facetVerts[1]], cubeVerts[facetVerts[2]] ); + myCube.add( std::move(facet) ); + } + + myCubeGeometry.reset(new AnalyticSurfaceInterfaceGeometry(myCube, AuxMetaData::get(this->fixture.meta_data()).active_part(), this->cdfemSupport, Phase_Support::get(this->fixture.meta_data()))); + } +protected: + const InterfaceGeometry & get_interface_geometry() const { return *myCubeGeometry; } + typename BoundingBoxMesh::BoundingBoxType get_domain() const + { + const Vector3d extents = (2 == this->fixture.meta_data().spatial_dimension()) ? Vector3d(1.,1.,0.) : Vector3d(1.,1.,1.); + typename BoundingBoxMesh::BoundingBoxType domain(-0.5*extents, 0.5*extents); + return domain; + } + double get_mesh_size() const { return 1./6.; } + Faceted_Surface myCube{"test cube"}; + std::unique_ptr myCubeGeometry; +}; + +typedef CubeDecompositionFixture CDMeshCubeTestsBboxMesh2D; +TEST_F(CDMeshCubeTestsBboxMesh2D, Cube_SnapMesh) +{ + const bool doSnap = true; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "2DSnapCube.e"); +} + +typedef CubeDecompositionFixture CDMeshCubeTestsBboxMesh3D; +TEST_F(CDMeshCubeTestsBboxMesh3D, Sphere_SnapMesh) +{ + const bool doSnap = true; + test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size()); //test_build_good_mesh(doSnap, get_interface_geometry(), get_domain(), get_mesh_size(), "3DSnapCube.e"); +} + +} // namespace krino + diff --git a/packages/krino/krino/unit_tests/Akri_Unit_CDFEM_Parent_Edge.cpp b/packages/krino/krino/unit_tests/Akri_Unit_CDFEM_Parent_Edge.cpp new file mode 100644 index 000000000000..5b912bda3b65 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_CDFEM_Parent_Edge.cpp @@ -0,0 +1,782 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include + +namespace krino +{ + +TEST(CDFEM_Parent_Edge_One_LS, Two_Nodes_No_Snapping) +{ + const InterfaceID iface(0,0); + std::vector > nodes_isovar(2); + nodes_isovar[0].resize(1); + nodes_isovar[1].resize(1); + nodes_isovar[0][0] = 1; + nodes_isovar[1][0] = 1; + + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = -1; + edge.find_crossings(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = 2; + edge.find_crossings(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_DOUBLE_EQ(1./3., edge.get_crossing_position(iface)); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); +} + +TEST(CDFEM_Parent_Edge_One_LS, Three_Nodes_No_Snapping) +{ + std::vector > nodes_isovar(3); + nodes_isovar[0].resize(1); + nodes_isovar[1].resize(1); + nodes_isovar[2].resize(1); + nodes_isovar[0][0] = 1; + nodes_isovar[1][0] = 1; + nodes_isovar[2][0] = 1; + const InterfaceID iface(0,0); + + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = -1; + nodes_isovar[2][0] = -1; + edge.find_crossings(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = 1; + nodes_isovar[2][0] = -1; + edge.find_crossings(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = 1; + nodes_isovar[1][0] = -1; + nodes_isovar[2][0] = 1; + edge.find_crossings(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = 2; + nodes_isovar[2][0] = 4; + edge.find_crossings(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + const InterfaceID interface_id(0,0); + EXPECT_TRUE(edge.have_crossing(interface_id)); + EXPECT_DOUBLE_EQ(1./6., edge.get_crossing_position(interface_id)); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + + nodes_isovar[0][0] = -1; + nodes_isovar[1][0] = -1; + nodes_isovar[2][0] = 1; + edge.find_crossings(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(interface_id)); + EXPECT_DOUBLE_EQ(3./4., edge.get_crossing_position(interface_id)); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); +} + +TEST(CDFEM_Parent_Edge_Two_LS, Two_Nodes_No_Snapping) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const InterfaceID iface(0,1); + + std::vector > nodes_isovar(2); + nodes_isovar[0].resize(2); + nodes_isovar[1].resize(2); + + // crossing_sign convention, iface.first phase corresponds to (-) for one LS=one interface case + // iface.first lower everywhere + { + nodes_isovar[0][0] = 0; + nodes_isovar[0][1] = 1; + nodes_isovar[1][0] = 0; + nodes_isovar[1][1] = 1; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(0, edge.get_uncrossed_phase()); + } + + // iface.second lower everywhere + { + nodes_isovar[0][0] = 2; + nodes_isovar[0][1] = 1; + nodes_isovar[1][0] = 2; + nodes_isovar[1][1] = 1; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_EQ(1, edge.get_uncrossed_phase()); + } + + // first lower at node 0, second lower at node 1 + { + nodes_isovar[0][0] = 0.5; + nodes_isovar[0][1] = 1; + nodes_isovar[1][0] = 1.5; + nodes_isovar[1][1] = 1; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_DOUBLE_EQ(0.5, edge.get_crossing_position(iface)); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + } + + // second lower at node 0, first lower at node 1 + { + nodes_isovar[0][0] = 1.5; + nodes_isovar[0][1] = 1; + nodes_isovar[1][0] = 0.5; + nodes_isovar[1][1] = 1; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_DOUBLE_EQ(0.5, edge.get_crossing_position(iface)); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + } + + // Equal at node 0, first lower at node 1 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = 0.; + nodes_isovar[1][0] = 0; + nodes_isovar[1][1] = 1.; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_DOUBLE_EQ(0., edge.get_crossing_position(iface)); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + } + + // Equal at node 0, second lower at node 1 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = 0.; + nodes_isovar[1][0] = 0; + nodes_isovar[1][1] = -1.; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface)); + } + // Equal at node 0, first lower at node 1 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = 1.; + nodes_isovar[1][0] = 0; + nodes_isovar[1][1] = 0.; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_DOUBLE_EQ(1., edge.get_crossing_position(iface)); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + } + + // Equal at node 1, second lower at node 0 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = -1.; + nodes_isovar[1][0] = 0.; + nodes_isovar[1][1] = 0.; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface)); + } + + // (0, +delta) at node 0, (0, -) at node 1 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = 1.e-16; + nodes_isovar[1][0] = 0.; + nodes_isovar[1][1] = -1.; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_NEAR(0., edge.get_crossing_position(iface), 1.e-15); + EXPECT_EQ(1, edge.get_crossing_sign(iface)); + } + + // (0, -) at node 0, (0, +delta) at node 1 + { + nodes_isovar[0][0] = 0.; + nodes_isovar[0][1] = -1.; + nodes_isovar[1][0] = 0.; + nodes_isovar[1][1] = 1.e-16; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_NEAR(1., edge.get_crossing_position(iface), 1.e-15); + EXPECT_EQ(-1, edge.get_crossing_sign(iface)); + } +} + +TEST(CDFEM_Parent_Edge_Three_LS, Two_Nodes_No_Snapping) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + + std::vector > nodes_isovar(2); + nodes_isovar[0].resize(3); + nodes_isovar[1].resize(3); + + { + nodes_isovar[0][0] = -0.01288; + nodes_isovar[0][1] = 0.021996; + nodes_isovar[0][2] = 0.01; + nodes_isovar[1][0] = 0.038335; + nodes_isovar[1][1] = 0.037250; + nodes_isovar[1][2] = 0.01; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + EXPECT_FALSE(edge.have_crossing(iface12)); + EXPECT_TRUE(edge.have_crossing(iface02)); + const double crossing_pos = (nodes_isovar[0][0] - nodes_isovar[0][2]) / + (nodes_isovar[0][0] - nodes_isovar[1][0] + nodes_isovar[1][2] - nodes_isovar[0][2]); + EXPECT_DOUBLE_EQ(crossing_pos, edge.get_crossing_position(iface02)); + EXPECT_EQ(1, edge.get_crossing_sign(iface02)); + } + + { + nodes_isovar[0][0] = 0.038335; + nodes_isovar[0][1] = 0.037250; + nodes_isovar[0][2] = 0.01; + nodes_isovar[1][0] = -0.01288; + nodes_isovar[1][1] = 0.021996; + nodes_isovar[1][2] = 0.01; + CDFEM_Parent_Edge edge(nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + EXPECT_FALSE(edge.have_crossing(iface12)); + EXPECT_TRUE(edge.have_crossing(iface02)); + const double crossing_pos = (nodes_isovar[0][0] - nodes_isovar[0][2]) / + (nodes_isovar[0][0] - nodes_isovar[1][0] + nodes_isovar[1][2] - nodes_isovar[0][2]); + EXPECT_DOUBLE_EQ(crossing_pos, edge.get_crossing_position(iface02)); + EXPECT_EQ(-1, edge.get_crossing_sign(iface02)); + } +} + +TEST(CDFEM_Parent_Edge_Three_LS, Three_Nodes_No_Snapping) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + + std::vector > nodes_isovar(3); + nodes_isovar[0].resize(3); + nodes_isovar[1].resize(3); + nodes_isovar[2].resize(3); + + { + nodes_isovar[0][0] = 0.2; + nodes_isovar[0][1] = 0.0025391738062501383; + nodes_isovar[0][2] = 0.01; + nodes_isovar[1][0] = 0.19; + nodes_isovar[1][1] = -0.00048874386459929649; + nodes_isovar[1][2] = 0.01; + nodes_isovar[2][0] = 0.17; + nodes_isovar[2][1] = -0.0052539980592431739; + nodes_isovar[2][2] = 0.01; + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + EXPECT_FALSE(edge.have_crossing(iface12)); + EXPECT_FALSE(edge.have_crossing(iface02)); + } + + // Check that uncrossed phase is correct for 3 node problem with 2 crossings on the edge. + { + nodes_isovar[0][0] = 0.015; + nodes_isovar[0][1] = 1.; + nodes_isovar[0][2] = 0.01; + nodes_isovar[1][0] = 0.0095; + nodes_isovar[1][1] = 1.; + nodes_isovar[1][2] = 0.01; + nodes_isovar[2][0] = 0.015; + nodes_isovar[2][1] = 1.; + nodes_isovar[2][2] = 0.01; + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + EXPECT_FALSE(edge.have_crossing(iface12)); + EXPECT_FALSE(edge.have_crossing(iface02)); + EXPECT_EQ(2, edge.get_uncrossed_phase()); + } + + // Test edge that goes from phase 1-0-2 in the piecewise approximation, but there is no 0-2 in the linear version, + // so result is just 1-2. + { + nodes_isovar[0][0] = 0.72535; + nodes_isovar[0][1] = -0.844886; + nodes_isovar[0][2] = 0.10576; + nodes_isovar[1][0] = -0.58386; + nodes_isovar[1][1] = -0.931365; + nodes_isovar[1][2] = 0.7754522; + nodes_isovar[2][0] = -0.28731; + nodes_isovar[2][1] = 0.711750; + nodes_isovar[2][2] = -0.5794; + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + EXPECT_TRUE(edge.have_crossing(iface12)); + EXPECT_FALSE(edge.have_crossing(iface02)); + } + + // Test edge that goes from phase 1-0-2 in the piecewise approximation, with different locations than those + // given by a simple linear approximation. + { + nodes_isovar[0][0] = 0.25; + nodes_isovar[0][1] = 1.0; + nodes_isovar[0][2] = 0.0; + nodes_isovar[1][0] = 0.25; + nodes_isovar[1][1] = 1.0; + nodes_isovar[1][2] = 0.0; + nodes_isovar[2][0] = 0.25; + nodes_isovar[2][1] = 0.0; + nodes_isovar[2][2] = 1.0; + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_TRUE(edge.have_any_crossings()); + EXPECT_TRUE(edge.have_crossing(iface01)); + EXPECT_FALSE(edge.have_crossing(iface12)); + EXPECT_TRUE(edge.have_crossing(iface02)); + EXPECT_DOUBLE_EQ(0.625, edge.get_crossing_position(iface02)); + EXPECT_DOUBLE_EQ(0.875, edge.get_crossing_position(iface01)); + } + +} + +TEST(CDFEM_Parent_Edge_Two_LS, Two_Crossings_Same_Edge) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const InterfaceID iface01(0,1); + + std::vector > nodes_isovar(3); + nodes_isovar[0].resize(2); + nodes_isovar[1].resize(2); + nodes_isovar[2].resize(2); + + // Interface (0,1) has 2 crossings, one between each parent and the mid node. + // We will treat this as an uncrossed edge regardless of snapping. + nodes_isovar[0][0] = 0.02; + nodes_isovar[0][1] = 0.01; + nodes_isovar[1][0] = 0.; + nodes_isovar[1][1] = 0.01; + nodes_isovar[2][0] = 0.02; + nodes_isovar[2][1] = 0.01; + + // No snapping + { + CDFEM_Parent_Edge edge({0.0,0.5,1.0}, nodes_isovar); + EXPECT_FALSE(edge.have_any_crossings()); + EXPECT_FALSE(edge.have_crossing(iface01)); + } +} + +void expect_all_edge_segments_have_finite_or_zero_length(const CDFEM_Parent_Edge & edge, const double snapTol) +{ + std::vector crossingLocations; + for (auto && crossing : edge.get_crossings()) + { + crossingLocations.push_back(crossing.second); + } + std::sort(crossingLocations.begin(), crossingLocations.end()); + double previousCrossingLocation = 0.0; + for (auto && crossingLocation : crossingLocations) + { + const double intervalSize = crossingLocation- previousCrossingLocation; + EXPECT_TRUE(intervalSize == 0.0 || intervalSize >= snapTol) << "Found infinitesmal interval " << intervalSize << " on edge " << edge; + previousCrossingLocation = crossingLocation; + } + const double lastIntervalSize = 1.0 - previousCrossingLocation; + EXPECT_TRUE(lastIntervalSize == 0.0 || lastIntervalSize >= snapTol) << "Found infinitesmal interval " << lastIntervalSize << " on edge " << edge; +} + +TEST(CDFEM_Parent_Edge_Two_LS, LSPerPhaseInfinitesimalSnapTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{-CDFEM_Parent_Edge::MinSize(),0.0},{1.0,0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + EXPECT_TRUE(edge.have_any_crossings()); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); +} + +TEST(CDFEM_Parent_Edge_Two_LS, LSPerPhaseInfinitesimalSnapTo1) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{1.0,0.0},{-CDFEM_Parent_Edge::MinSize(),0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + EXPECT_TRUE(edge.have_any_crossings()); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); +} + +void expect_all_fake_crossings_are_really_fake(const CDFEM_Parent_Edge & edge) +{ + EXPECT_TRUE(edge.all_fake_crossings_are_really_fake()); +} + +TEST(CDFEM_Parent_Edge_Three_LS, LSPerPhaseInfinitesimalSnapInMiddle) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{-1.0,1.+CDFEM_Parent_Edge::MinSize(),0.0},{1.+CDFEM_Parent_Edge::MinSize(),-1.0,0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + EXPECT_EQ(1u,edge.get_crossings().size()); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); + expect_all_fake_crossings_are_really_fake(edge); +} + +TEST(CDFEM_Parent_Edge_Three_LS, LSPerPhaseTieInMiddle) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{0.,-1.,1.},{0.,1.,-1.}}; + CDFEM_Parent_Edge edge(nodesIsovar); + EXPECT_EQ(1u,edge.get_crossings().size()); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); + expect_all_fake_crossings_are_really_fake(edge); +} + +TEST(CDFEM_Parent_Edge_Three_LS, UnderflowAtEndStillResultsInCorrectFakeCrossing) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{ -0.6, -0.6, 0.6 },{ -6e-16, -5.9e-16, -7e-16 }}; + CDFEM_Parent_Edge edge(nodesIsovar); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); + expect_all_fake_crossings_are_really_fake(edge); +} + +TEST(CDFEM_Parent_Edge_Three_LS, WithScaling_UnderflowAtEndStillResultsInCorrectFakeCrossing) +{ + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{ -0.6e8, -0.6e8, 0.6e8 },{ -6e-8, -5.9e-8, -7e-8 }}; + CDFEM_Parent_Edge edge(nodesIsovar); + + expect_all_edge_segments_have_finite_or_zero_length(edge, CDFEM_Parent_Edge::MinSize()); + expect_all_fake_crossings_are_really_fake(edge); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +TEST(CDFEM_Parent_Edge_Two_LS, SnapTo0) +{ + const double snapTol = 0.1; + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{-0.01,0.0},{1.0,0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + EXPECT_TRUE(edge.have_any_crossings()); + + edge.collapse_small_segments_while_preserving_topology(snapTol); + expect_all_edge_segments_have_finite_or_zero_length(edge, snapTol); +} + +TEST(CDFEM_Parent_Edge_Two_LS, SnapTo1) +{ + const double snapTol = 0.1; + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{1.0,0.0},{-0.01,0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.collapse_small_segments_while_preserving_topology(snapTol); + expect_all_edge_segments_have_finite_or_zero_length(edge, snapTol); +} + +TEST(CDFEM_Parent_Edge_Three_LS, SnapInMiddle) +{ + const double snapTol = 0.1; + Phase_Support::set_one_levelset_per_phase(true); + + const std::vector > nodesIsovar = {{-1.0,1.1,0.0},{1.1,-1.0,0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.collapse_small_segments_while_preserving_topology(snapTol); + expect_all_edge_segments_have_finite_or_zero_length(edge, snapTol); +} + +TEST(CDFEM_Parent_Edge_Three_LS, OneSnapInMiddleMakesOtherSnapUnnecessary) +{ + const double snapTol = 0.1; + Phase_Support::set_one_levelset_per_phase(true); + std::vector locs = {0.4,0.44,0.53}; + const double phi0At0 = -1.0; + const double phi0At1 = (0.-(1.-locs[0])*phi0At0)/locs[0]; + const double phi1At1 = -0.1; + const double phi1At0 = (0.-locs[1]*phi1At1)/(1.-locs[1]); + const double phi1AtLocs2 = (1.-locs[2])*phi1At0 + locs[2]*phi1At1; + const double phi2At1 = -1.0; + const double phi2At0 = (phi1AtLocs2-locs[2]*phi2At1)/(1.-locs[2]); + + const std::vector > nodesIsovar = {{phi0At0, phi1At0, phi2At0, 0.0}, {phi0At1, phi1At1, phi2At1, 0.0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.collapse_small_segments_while_preserving_topology(snapTol); + expect_all_edge_segments_have_finite_or_zero_length(edge, snapTol); + + const std::vector > oppositeNodesIsovar = {{phi0At1, phi1At1, phi2At1, 0.0}, {phi0At0, phi1At0, phi2At0, 0.0}}; + CDFEM_Parent_Edge oppositeEdge(oppositeNodesIsovar); + + oppositeEdge.collapse_small_segments_while_preserving_topology(snapTol); + expect_all_edge_segments_have_finite_or_zero_length(oppositeEdge, snapTol); + + for (auto && crossing : edge.get_crossings()) + EXPECT_DOUBLE_EQ(crossing.second, 1.-oppositeEdge.get_crossing_position(crossing.first)) << "Snapping opposite edges give different results " << edge << " compared to " << oppositeEdge; +} + +void expect_crossing_at_position_with_sign(const CDFEM_Parent_Edge & edge, const InterfaceID & iface, const double pos, const int sign) +{ + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_EQ(pos, edge.get_crossing_position(iface)); + EXPECT_EQ(sign, edge.get_crossing_sign(iface)); +} + +void expect_crossing_at_position_with_sign(const CDFEM_Parent_Edge & edge, const int ls, const double pos, const int sign) +{ + const InterfaceID iface(ls,ls); + EXPECT_TRUE(edge.have_crossing(iface)); + EXPECT_EQ(pos, edge.get_crossing_position(iface)); + EXPECT_EQ(sign, edge.get_crossing_sign(iface)); +} + +void expect_fake_crossing_at_position_with_sign(const CDFEM_Parent_Edge & edge, const InterfaceID & iface, const double pos, const int sign) +{ + const auto result = edge.get_crossing_position_and_sign(iface); + EXPECT_LE(0, std::get<0>(result)) << "Did not find expected fake crossing " << iface << " on edge " << edge; + EXPECT_EQ(pos, std::get<0>(result)); + EXPECT_EQ(sign, std::get<1>(result)); + EXPECT_TRUE(std::get<2>(result)) << "Found real crossing when fake one was expected for " << iface << " on edge " << edge; +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAt0MovesNegCrossingTo0) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{1}, {-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0}, {}); + + expect_crossing_at_position_with_sign(edge, 0, 0., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAt0MovesPosCrossingTo0) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{-1}, {1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0}, {}); + + expect_crossing_at_position_with_sign(edge, 0, 0., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAt1MovesNegCrossingTo1) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{1}, {-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({}, {0}); + + expect_crossing_at_position_with_sign(edge, 0, 1., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAt1MovesPosCrossingTo1) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{-1}, {1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({}, {0}); + + expect_crossing_at_position_with_sign(edge, 0, 1., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAtBothEndsMovesNegCrossingToClosestAt0) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{0.9}, {-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0}, {0}); + + expect_crossing_at_position_with_sign(edge, 0, 0., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAtBothEndsMovesNegCrossingToClosestAt1) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{1}, {-0.9}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0}, {0}); + + expect_crossing_at_position_with_sign(edge, 0, 1., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_One_LS, nodeDomainsAtBothEndsMovesPosCrossingToClosestAt0) +{ + Phase_Support::set_one_levelset_per_phase(false); + const std::vector > nodesIsovar = {{-0.9}, {1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0}, {0}); + + expect_crossing_at_position_with_sign(edge, 0, 0., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAt0MovesNegCrossingTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{1,-1}, {-1,1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1}, {}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAt0MovesPosCrossingTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-1,1}, {1,-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1}, {}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAt1MovesNegCrossingTo1) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{1,-1}, {-1,1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({}, {0,1}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 1., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAt1MovesPosCrossingTo1) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-1,1}, {1,-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({}, {0,1}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 1., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAtBothEndsMovesNegCrossingToClosestAt0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{0.9,-0.9}, {-1,1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1}, {0,1}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAtBothEndsMovesNegCrossingToClosestAt1) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{1,-1}, {-0.9,0.9}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1}, {0,1}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 1., -1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Two_LS_Per_Phase, nodeDomainsAtBothEndsMovesPosCrossingToClosestAt0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-0.9,0.9}, {1,-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1}, {0,1}); + + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Three_LS_Per_Phase, nodeDomainsMoveAllCrossingsTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-1,0,2}, {2,0,-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1,2}, {}); + + expect_fake_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., 1); + expect_fake_crossing_at_position_with_sign(edge, InterfaceID(1,2), 0., 1); + expect_crossing_at_position_with_sign(edge, InterfaceID(0,2), 0., 1); +} + +TEST(CDFEM_Parent_Edge_Snapping_Three_LS_Per_Phase, nodeDomainsWithMiddlePhase2MoveAllCrossingsTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-1,2,0}, {2,-1,0}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,1,2}, {}); + + expect_fake_crossing_at_position_with_sign(edge, InterfaceID(0,2), 0., 1); + expect_fake_crossing_at_position_with_sign(edge, InterfaceID(1,2), 0., -1); + expect_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., 1); +} + + +TEST(CDFEM_Parent_Edge_Snapping_Three_LS_Per_Phase, nodeDomainsCenterPhaseMoveAllCrossingsTo0) +{ + Phase_Support::set_one_levelset_per_phase(true); + const std::vector > nodesIsovar = {{-1,0,2}, {2,0,-1}}; + CDFEM_Parent_Edge edge(nodesIsovar); + + edge.adjust_crossing_locations_based_on_node_captured_domains({0,2}, {}); + + expect_fake_crossing_at_position_with_sign(edge, InterfaceID(0,1), 0., 1); + expect_crossing_at_position_with_sign(edge, InterfaceID(0,2), 0., 1); +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_CDMesh.cpp b/packages/krino/krino/unit_tests/Akri_Unit_CDMesh.cpp new file mode 100644 index 000000000000..efff1945a32a --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_CDMesh.cpp @@ -0,0 +1,3092 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace krino { + +class LevelSet; + +namespace { + template +void build_one_tet4_mesh(DECOMP_FIXTURE & fixture, + stk::mesh::Part & elem_part, + const int parallel_rank, const int parallel_size) +{ + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + ASSERT_TRUE(parallel_size == 1 || parallel_size == 2); + ThrowRequire(elem_part.topology() == stk::topology::TETRAHEDRON_4); + ASSERT_EQ(stk::topology::ELEMENT_RANK, elem_part.primary_entity_rank()); + + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts(2); + elem_parts[1] = &aux_meta.active_part(); + + std::vector elem_nodes = {1, 2, 3, 4}; + + stk::mesh::Entity element; + if(parallel_rank == 0) + { + elem_parts[0] = &elem_part; + element = fixture.create_element(elem_parts, 1, elem_nodes); + } + } + mesh.modification_end(); + + if(parallel_rank == 0) + { + EXPECT_EQ(1u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::ELEMENT_RANK))); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + ASSERT_TRUE(mesh.is_valid(node1)); + ASSERT_TRUE(mesh.is_valid(node2)); + ASSERT_TRUE(mesh.is_valid(node3)); + ASSERT_TRUE(mesh.is_valid(node4)); + + double * node1_coords = field_data(fixture.coord_field, node1); + double * node2_coords = field_data(fixture.coord_field, node2); + double * node3_coords = field_data(fixture.coord_field, node3); + double * node4_coords = field_data(fixture.coord_field, node4); + + node1_coords[0] = 1.; + node1_coords[1] = 1.; + node1_coords[2] = 1.; + + node2_coords[0] = -1.; + node2_coords[1] = 1.; + node2_coords[2] = -1.; + + node3_coords[0] = 1.; + node3_coords[1] = -1.; + node3_coords[2] = -1.; + + node4_coords[0] = -1.; + node4_coords[1] = -1.; + node4_coords[2] = 1.; + } +} + +template +void build_two_tet4_mesh_np2(DECOMP_FIXTURE & fixture, + stk::mesh::Part & elem1_part, stk::mesh::Part & elem2_part, stk::mesh::Part & surface_part, + const int parallel_rank, const int parallel_size, const bool add_side = true, + const bool build_all_on_P0 = false) +{ + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + ASSERT_TRUE(parallel_size == 1 || parallel_size == 2); + ThrowRequire(elem1_part.topology() == stk::topology::TETRAHEDRON_4); + ASSERT_EQ(meta.side_rank(), surface_part.primary_entity_rank()); + ASSERT_EQ(stk::topology::ELEMENT_RANK, elem1_part.primary_entity_rank()); + ASSERT_EQ(stk::topology::ELEMENT_RANK, elem2_part.primary_entity_rank()); + + stk::mesh::Entity sideEntity; + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts(2); + elem_parts[1] = &aux_meta.active_part(); + + std::vector elem1_nodes = {1, 3, 2, 4}; + std::vector elem2_nodes = {1, 2, 3, 5}; + + stk::mesh::Entity element; + if(parallel_rank == 0) + { + elem_parts[0] = &elem1_part; + element = fixture.create_element(elem_parts, 1, elem1_nodes); + } + if((parallel_rank == 1 && !build_all_on_P0) || (parallel_rank == 0 && build_all_on_P0) || + parallel_size == 1) + { + elem_parts[0] = &elem2_part; + element = fixture.create_element(elem_parts, 2, elem2_nodes); + } + + if(parallel_size > 1 && !build_all_on_P0) + { + const int opp_rank = parallel_rank == 0 ? 1 : 0; + for(auto i=1; i <= 3; ++i) + { + const auto node = mesh.get_entity(stk::topology::NODE_RANK, i); + mesh.add_node_sharing(node, opp_rank); + } + } + + if(add_side && (parallel_rank == 0 || !build_all_on_P0)) + { + sideEntity = mesh.declare_solo_side(7, {&surface_part}); + for(auto i=1; i <= 3; ++i) + { + auto side_node = mesh.get_entity(stk::topology::NODE_RANK, i); + mesh.declare_relation(sideEntity, side_node, i-1); + } + attach_entity_to_elements(mesh, sideEntity); + } + } + mesh.modification_end(); + + if(parallel_rank == 0 || !build_all_on_P0) + { + EXPECT_EQ(2u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::ELEMENT_RANK))); + if(add_side) + { + EXPECT_EQ(1u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(meta.side_rank()))); + EXPECT_EQ(1u, stk::mesh::count_selected_entities(surface_part, mesh.buckets(meta.side_rank()))); + + EXPECT_EQ(2u, mesh.num_connectivity(sideEntity, stk::topology::ELEMENT_RANK)); + } + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + const auto node5 = mesh.get_entity(stk::topology::NODE_RANK, 5); + + ASSERT_TRUE(mesh.is_valid(node1)); + ASSERT_TRUE(mesh.is_valid(node2)); + ASSERT_TRUE(mesh.is_valid(node3)); + ASSERT_TRUE(mesh.is_valid(node4)); + ASSERT_TRUE(mesh.is_valid(node5)); + + double * node1_coords = field_data(fixture.coord_field, node1); + double * node2_coords = field_data(fixture.coord_field, node2); + double * node3_coords = field_data(fixture.coord_field, node3); + double * node4_coords = field_data(fixture.coord_field, node4); + double * node5_coords = field_data(fixture.coord_field, node5); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + node1_coords[2] = 0.; + + node2_coords[0] = 0.; + node2_coords[1] = 0.; + node2_coords[2] = 1.; + + node3_coords[0] = 0.; + node3_coords[1] = 1.; + node3_coords[2] = 0.; + + node4_coords[0] = -1.; + node4_coords[1] = 0.; + node4_coords[2] = 0.; + + node5_coords[0] = 1.; + node5_coords[1] = 0.; + node5_coords[2] = 0.; + } +} + +template +void build_two_tri3_mesh_np2(DECOMP_FIXTURE & fixture, + stk::mesh::Part & elem1_part, stk::mesh::Part & elem2_part, stk::mesh::Part & surface_part, + const int parallel_rank, const int parallel_size, const bool add_side = true, + const bool build_all_on_P0 = false) +{ + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + ASSERT_TRUE(parallel_size == 1 || parallel_size == 2); + ThrowRequire(elem1_part.topology() == stk::topology::TRIANGLE_3_2D); + ASSERT_EQ(meta.side_rank(), surface_part.primary_entity_rank()); + ASSERT_EQ(stk::topology::ELEMENT_RANK, elem1_part.primary_entity_rank()); + ASSERT_EQ(stk::topology::ELEMENT_RANK, elem2_part.primary_entity_rank()); + + stk::mesh::Entity sideEntity; + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts(2); + elem_parts[1] = &aux_meta.active_part(); + + std::vector elem1_nodes = {2, 1, 3}; + std::vector elem2_nodes = {1, 2, 4}; + + stk::mesh::Entity element; + if(parallel_rank == 0) + { + elem_parts[0] = &elem1_part; + element = fixture.create_element(elem_parts, 1, elem1_nodes); + } + if((parallel_rank == 1 && !build_all_on_P0) || (parallel_rank == 0 && build_all_on_P0) || + parallel_size == 1) + { + elem_parts[0] = &elem2_part; + element = fixture.create_element(elem_parts, 2, elem2_nodes); + } + + if(parallel_size > 1 && !build_all_on_P0) + { + const int opp_rank = parallel_rank == 0 ? 1 : 0; + for(auto i=1; i <= 2; ++i) + { + const auto node = mesh.get_entity(stk::topology::NODE_RANK, i); + mesh.add_node_sharing(node, opp_rank); + } + } + + if(add_side && (parallel_rank == 0 || !build_all_on_P0)) + { + sideEntity = mesh.declare_solo_side(7, {&surface_part}); + for(auto i=1; i <= 2; ++i) + { + auto side_node = mesh.get_entity(stk::topology::NODE_RANK, i); + mesh.declare_relation(sideEntity, side_node, i-1); + } + attach_entity_to_elements(mesh, sideEntity); + } + } + mesh.modification_end(); + + if(parallel_rank == 0 || !build_all_on_P0) + { + EXPECT_EQ(2u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::ELEMENT_RANK))); + if(add_side) + { + EXPECT_EQ(1u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(meta.side_rank()))); + EXPECT_EQ(1u, stk::mesh::count_selected_entities(surface_part, mesh.buckets(meta.side_rank()))); + + EXPECT_EQ(2u, mesh.num_connectivity(sideEntity, stk::topology::ELEMENT_RANK)); + } + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + ASSERT_TRUE(mesh.is_valid(node1)); + ASSERT_TRUE(mesh.is_valid(node2)); + ASSERT_TRUE(mesh.is_valid(node3)); + ASSERT_TRUE(mesh.is_valid(node4)); + + double * node1_coords = field_data(fixture.coord_field, node1); + double * node2_coords = field_data(fixture.coord_field, node2); + double * node3_coords = field_data(fixture.coord_field, node3); + double * node4_coords = field_data(fixture.coord_field, node4); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + + node2_coords[0] = 0.; + node2_coords[1] = 1.; + + node3_coords[0] = 1.; + node3_coords[1] = 0.; + + node4_coords[0] = -1.; + node4_coords[1] = 0.; + } +} +} + +struct SingleLSPolicy +{ + void setup_ls_field(const bool is_death, stk::mesh::MetaData & meta, CDFEM_Support & cdfem_support) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + Phase_Support::set_one_levelset_per_phase(false); + ls_isovar = aux_meta.declare_field("LS", FieldType::REAL, stk::topology::NODE_RANK, 1u); + cdfem_support.add_interpolation_field(ls_isovar); + + LevelSet * ls_ptr = nullptr; + ls_field = std::make_shared("LS", LevelSet_Identifier(0), ls_isovar, 0., ls_ptr); + if(is_death) + { + death_spec = std::unique_ptr(new CDFEM_Inequality_Spec("death_spec")); + } + cdfem_support.add_ls_field(*ls_field, death_spec.get()); + } + + void register_ls_on_blocks(const stk::mesh::PartVector & blocks, stk::mesh::MetaData & meta, + Block_Surface_Connectivity & block_surface_info, const bool register_fields) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + PhaseTag p, n; + const LevelSet_Identifier id0(0); + p.add(id0, 1); + n.add(id0, -1); + PhaseVec named_phases{{"A", p}, {"B", n}}; + + if(death_spec) + { + death_spec->set_phases(p, n); + } + + Phase_Support & phase_support = Phase_Support::get(meta); + phase_support.set_input_block_surface_connectivity(block_surface_info); + LevelSet * ls_ptr = nullptr; + phase_support.register_blocks_for_level_set(ls_ptr, blocks); + phase_support.decompose_blocks(blocks, named_phases, LS_Name_Generator()); + + for(auto && b : blocks) + { + auto conformal_A = phase_support.find_conformal_io_part(*b, p); + auto conformal_B = phase_support.find_conformal_io_part(*b, n); + ThrowRequire(conformal_A != nullptr); + ThrowRequire(conformal_B != nullptr); + if(register_fields) + { + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *b); + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *conformal_A); + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *conformal_B); + } + } + } + + FieldRef ls_isovar; + std::shared_ptr ls_field; + std::unique_ptr death_spec; +}; + +template +struct LSPerPhasePolicy +{ + void setup_ls_field(const bool is_death, stk::mesh::MetaData & meta, CDFEM_Support & cdfem_support) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + Phase_Support::set_one_levelset_per_phase(true); + ThrowRequire(!is_death); + for(unsigned i=0; i < NUM_LS; ++i) + { + const std::string isovar_name = "LS" + std::to_string(i); + FieldRef ls_isovar = aux_meta.declare_field(isovar_name, FieldType::REAL, stk::topology::NODE_RANK, 1u); + ls_isovars.push_back(ls_isovar); + cdfem_support.add_interpolation_field(ls_isovar); + + LevelSet * ls_ptr = nullptr; + auto ls_field = std::make_shared(isovar_name, LevelSet_Identifier(i), ls_isovar, 0., ls_ptr); + ls_fields.push_back(ls_field); + cdfem_support.add_ls_field(*ls_field, nullptr); + } + } + + void register_ls_on_blocks(const stk::mesh::PartVector & blocks, stk::mesh::MetaData & meta, + Block_Surface_Connectivity & block_surface_info, const bool register_fields) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + PhaseVec named_phases; + for(unsigned ls=0; ls < NUM_LS; ++ls) + { + PhaseTag tag; + tag.add(LevelSet_Identifier(ls), -1); + named_phases.push_back(NamedPhase("P" + std::to_string(ls), tag)); + } + + Phase_Support & phase_support = Phase_Support::get(meta); + phase_support.set_input_block_surface_connectivity(block_surface_info); + LevelSet * ls_ptr = nullptr; + phase_support.register_blocks_for_level_set(ls_ptr, blocks); + phase_support.decompose_blocks(blocks, named_phases, LS_Name_Generator()); + + for(auto && b : blocks) + { + for( unsigned ls=0; ls < NUM_LS; ++ls ) + { + auto conformal_part = phase_support.find_conformal_io_part(*b, named_phases[ls].tag()); + ThrowRequire(conformal_part != nullptr); + if(register_fields) + { + // Need to register every LS on every conformal part + for( unsigned ls2=0; ls2 < NUM_LS; ++ls2 ) + { + aux_meta.register_field(ls_isovars[ls2].name(), FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *conformal_part); + } + aux_meta.register_field(ls_isovars[ls].name(), FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *b); + } + } + } + } + + std::vector ls_isovars; + std::vector > ls_fields; +}; + +template +struct LSPerInterfacePolicy +{ + void setup_ls_field(const bool is_death, stk::mesh::MetaData & meta, CDFEM_Support & cdfem_support) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + Phase_Support::set_one_levelset_per_phase(false); + ThrowRequire(!is_death); + for(unsigned i=0; i < NUM_LS; ++i) + { + const std::string isovar_name = "LS" + std::to_string(i); + FieldRef ls_isovar = aux_meta.declare_field(isovar_name, FieldType::REAL, stk::topology::NODE_RANK, 1u); + ls_isovars.push_back(ls_isovar); + cdfem_support.add_interpolation_field(ls_isovar); + + LevelSet * ls_ptr = nullptr; + auto ls_field = std::make_shared(isovar_name, LevelSet_Identifier(i), ls_isovar, 0., ls_ptr); + ls_fields.push_back(ls_field); + cdfem_support.add_ls_field(*ls_field, nullptr); + } + } + + void register_ls_on_blocks(const stk::mesh::PartVector & blocks, stk::mesh::MetaData & meta, + Block_Surface_Connectivity & block_surface_info, const bool register_fields) + { + AuxMetaData & aux_meta = AuxMetaData::get(meta); + PhaseVec named_phases; + const unsigned numPhases = 1<>ls)%2 == 0; + const int lsSign = lsIsNeg ? -1 : 1; + tag.add(LevelSet_Identifier(ls), lsSign); + phaseName += (lsIsNeg ? "-" : "+"); + } + named_phases.push_back(NamedPhase(phaseName, tag)); + } + + Phase_Support & phase_support = Phase_Support::get(meta); + phase_support.set_input_block_surface_connectivity(block_surface_info); + LevelSet * ls_ptr = nullptr; + phase_support.register_blocks_for_level_set(ls_ptr, blocks); + phase_support.decompose_blocks(blocks, named_phases, LS_Name_Generator()); + + if(register_fields) + { + for(auto && b : blocks) + { + for( unsigned ls=0; ls < NUM_LS; ++ls ) + { + aux_meta.register_field(ls_isovars[ls].name(), FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *b); + + for (unsigned phase=0; phase ls_isovars; + std::vector > ls_fields; +}; + +template +class CompleteDecompositionFixture : public ::testing::Test +{ +public: + CompleteDecompositionFixture() + : fixture(), cdfemSupport(CDFEM_Support::get(fixture.meta_data())) + { + AuxMetaData & aux_meta = AuxMetaData::get(fixture.meta_data()); + auto & vec_type = fixture.meta_data().spatial_dimension() == 2 ? FieldType::VECTOR_2D : FieldType::VECTOR_3D; + coord_field = aux_meta.register_field("coordinates", vec_type, stk::topology::NODE_RANK, 1u, 1u, fixture.meta_data().universal_part()); + cdfemSupport.set_coords_field(coord_field); + cdfemSupport.add_interpolation_field(coord_field); + cdfemSupport.register_parent_node_ids_field(); + + cdfemSupport.set_prolongation_model(INTERPOLATION); + } + + void setup_ls_field(const bool is_death = false) + { + ls_policy.setup_ls_field(is_death, fixture.meta_data(), cdfemSupport); + } + + void register_ls_on_blocks(const stk::mesh::PartVector & blocks, const bool register_fields = true) + { + ls_policy.register_ls_on_blocks(blocks, fixture.meta_data(), block_surface_info, register_fields); + } + + stk::mesh::Part & declare_input_block(const std::string & name, const stk::topology topo) + { + auto & block_part = fixture.meta_data().declare_part_with_topology(name, topo); + stk::io::put_io_part_attribute(block_part); + return block_part; + } + + stk::mesh::Part & declare_input_surface(const std::string & name, const stk::topology topo, const std::set & touching_blocks) + { + auto & surface_part = fixture.meta_data().declare_part_with_topology(name, topo); + stk::io::put_io_part_attribute(surface_part); + + block_surface_info.add_surface(surface_part.mesh_meta_data_ordinal(), touching_blocks); + return surface_part; + } + + stk::mesh::PartVector declare_input_surfaces_touching_block(const unsigned numSurfaces, const stk::mesh::Part & touchingBlock) + { + const stk::topology topo = touchingBlock.topology().side_topology(); + stk::mesh::PartVector surfaces; + for (unsigned i=0; iget_active_part(), cdfemSupport, Phase_Support::get(fixture.meta_data())); + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + nodesToSnappedDomains = snap_as_much_as_possible_while_maintaining_quality(krino_mesh->stk_bulk(), krino_mesh->get_active_part(), cdfemSupport.get_interpolation_fields(), interfaceGeometry, cdfemSupport.get_global_ids_are_parallel_consistent()); + interfaceGeometry.prepare_to_process_elements(krino_mesh->stk_bulk(), nodesToSnappedDomains); + + if(!krino_mesh->my_old_mesh) + { + krino_mesh->my_old_mesh = std::make_shared(fixture.bulk_data(), std::shared_ptr()); + krino_mesh->my_old_mesh->generate_nonconformal_elements(); + } + + krino_mesh->generate_nonconformal_elements(); + if (cdfemSupport.get_cdfem_edge_degeneracy_handling() == SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE) + krino_mesh->snap_nearby_intersections_to_nodes(interfaceGeometry, nodesToSnappedDomains); + krino_mesh->set_phase_of_uncut_elements(interfaceGeometry); + krino_mesh->triangulate(interfaceGeometry); + krino_mesh->my_old_mesh->stash_field_data(-1, *krino_mesh); + + + krino_mesh->decompose(); + krino_mesh->modify_mesh(); + krino_mesh->prolongation(); + + if(krinolog.shouldPrint(LOG_DEBUG)) + { + krino_mesh->debug_output(); + } + } + + void debug_output() + { + krino_mesh->debug_output(); + } + + void commit() + { + krino_mesh = std::make_shared(fixture.bulk_data(), std::shared_ptr()); + } + + stk::mesh::Entity create_element(stk::mesh::PartVector & elem_parts, stk::mesh::EntityId elem_id, + std::vector elem_nodes) + { + auto elem = stk::mesh::declare_element( fixture.bulk_data(), elem_parts, elem_id, elem_nodes ); + { + const stk::mesh::Entity * const nodes = fixture.bulk_data().begin_nodes(elem); + for(unsigned i=0; i < elem_nodes.size(); ++i) + { + EXPECT_EQ(elem_nodes[i], fixture.bulk_data().identifier(nodes[i])); + if (!fixture.bulk_data().bucket(nodes[i]).member(cdfemSupport.get_active_part())) + fixture.bulk_data().change_entity_parts(nodes[i], stk::mesh::ConstPartVector{&cdfemSupport.get_active_part()}, {}); + } + } + return elem; + } + + void run_rebalance_with(const std::string& decomp_method) + { + /* This is a 2 processor test to confirm that we can rebalance a mesh with CDFEM cut elements, + * and then successfully cut the mesh again. We create an initial mesh with 2 tets both owned + * by P0, do a decomposition, rebalance so that 1 parent element should end up on each of P0 and + * P1, and then do a second decomposition. + */ + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size != 2) return; + + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + FieldRef elem_weight_field = + aux_meta.register_field("element_weight", FieldType::REAL, stk::topology::ELEMENT_RANK, + 1u, 1, fixture.meta_data().universal_part()); + + commit(); + + const bool build_all_on_P0 = true; + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, + parallel_size, true, build_all_on_P0); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + if(parallel_rank == 0) + { + auto & node_buckets = mesh.buckets(stk::topology::NODE_RANK); + for(auto && b_ptr : node_buckets) + { + for(auto && node : *b_ptr) + { + const double * coords = field_data(coord_field, node); + double * ls_data = field_data(ls_policy.ls_isovar, node); + if(ls_data) *ls_data = coords[1]-0.5; + } + } + } + stk::mesh::communicate_field_data(mesh, {&ls_policy.ls_isovar.field(), &coord_field.field()}); + + ASSERT_NO_THROW(decompose_mesh()); + + if(parallel_rank == 1) + { + EXPECT_EQ(0u, stk::mesh::get_num_entities(mesh)); + } + + const stk::mesh::Selector parent_selector = krino_mesh->get_parent_part(); + if(parallel_rank == 0) + { + auto & elem_buckets = mesh.buckets(stk::topology::ELEMENT_RANK); + for(auto && b_ptr : elem_buckets) + { + const bool is_parent = parent_selector(*b_ptr); + for(auto && elem : *b_ptr) + { + double * weight = field_data(elem_weight_field, elem); + *weight = is_parent ? 1. : 0.; + } + } + } + + rebalance_utils::rebalance_mesh(mesh, + krino_mesh.get(), + elem_weight_field.name(), + coord_field.name(), + {fixture.meta_data().universal_part()}, + decomp_method); + + // Both procs should now own 1 parent element and 4 children + EXPECT_EQ(1u, stk::mesh::count_selected_entities( + fixture.meta_data().locally_owned_part() & parent_selector, + mesh.buckets(stk::topology::ELEMENT_RANK))); + EXPECT_EQ(4u, stk::mesh::count_selected_entities( + fixture.meta_data().locally_owned_part() & krino_mesh->get_child_part(), + mesh.buckets(stk::topology::ELEMENT_RANK))); + + krino_mesh = std::make_shared(mesh, krino_mesh); + + auto & node_buckets = mesh.buckets(stk::topology::NODE_RANK); + for(auto && b_ptr : node_buckets) + { + for(auto && node : *b_ptr) + { + const double * coords = field_data(coord_field, node); + double * ls_data = field_data(ls_policy.ls_isovar, node); + if(ls_data) *ls_data = coords[2]-0.5; + } + } + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + } + + MESH_FIXTURE fixture; + FieldRef coord_field; + CDFEM_Support & cdfemSupport; + std::shared_ptr krino_mesh; + Block_Surface_Connectivity block_surface_info; + LS_FIELD_POLICY ls_policy; + LogRedirecter log; +}; + +namespace { +template +void build_two_tri3_mesh_on_one_or_two_procs(CompleteDecompositionFixture & fixture, + stk::mesh::Part & block_part, const int parallel_rank) +{ + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.fixture.meta_data(); + const int parallel_size = mesh.parallel_size(); + mesh.modification_begin(); + { + /* + * 4---3 + * |\ 2| + * | \ | + * |1 \| + * 1---2 + */ + stk::mesh::PartVector elem_parts; + elem_parts.push_back(&block_part); + elem_parts.push_back(&fixture.cdfemSupport.get_active_part()); + + std::vector elem1_nodes = {1, 2, 4}; + std::vector elem2_nodes = {2, 3, 4}; + + if(parallel_rank == 0) fixture.create_element(elem_parts, 1, elem1_nodes); + if(parallel_rank == 1 || parallel_size == 1) fixture.create_element(elem_parts, 2, elem2_nodes); + + if(parallel_size > 1) + { + const int opp_rank = parallel_rank == 0 ? 1 : 0; + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + mesh.add_node_sharing(node2, opp_rank); + mesh.add_node_sharing(node4, opp_rank); + } + } + mesh.modification_end(); + + EXPECT_EQ(2u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::ELEMENT_RANK))); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + ASSERT_TRUE(mesh.is_valid(node1)); + ASSERT_TRUE(mesh.is_valid(node2)); + ASSERT_TRUE(mesh.is_valid(node3)); + ASSERT_TRUE(mesh.is_valid(node4)); + + double * node1_coords = field_data(fixture.coord_field, node1); + double * node2_coords = field_data(fixture.coord_field, node2); + double * node3_coords = field_data(fixture.coord_field, node3); + double * node4_coords = field_data(fixture.coord_field, node4); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + + node2_coords[0] = 1.; + node2_coords[1] = 0.; + + node3_coords[0] = 1.; + node3_coords[1] = 1.; + + node4_coords[0] = 0.; + node4_coords[1] = 1.; +} + +template +void build_two_tri3_mesh_on_one_or_two_procs_with_sides(CompleteDecompositionFixture & fixture, + stk::mesh::Part & blockPart, const stk::mesh::PartVector & sideParts, const int parallel_rank) +{ + build_two_tri3_mesh_on_one_or_two_procs(fixture, blockPart, parallel_rank); + + ThrowRequire(sideParts.size() == 4); + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + const int parallel_size = mesh.parallel_size(); + + mesh.modification_begin(); + if(parallel_rank == 0) + { + const auto element1 = mesh.get_entity(stk::topology::ELEMENT_RANK,1); + mesh.declare_element_side(element1, 0, stk::mesh::PartVector{sideParts[0]}); + mesh.declare_element_side(element1, 2, stk::mesh::PartVector{sideParts[3]}); + } + if(parallel_rank == 1 || parallel_size == 1) + { + const auto element2 = mesh.get_entity(stk::topology::ELEMENT_RANK,2); + mesh.declare_element_side(element2, 0, stk::mesh::PartVector{sideParts[1]}); + mesh.declare_element_side(element2, 1, stk::mesh::PartVector{sideParts[2]}); + } + mesh.modification_end(); +} + +void check_two_tri3_snapped_mesh_np2(CompleteDecompositionFixture & fixture, const int parallel_rank) +{ + stk::mesh::BulkData & mesh = fixture.fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + std::vector entities; + + // Should be no new nodes because of snapped interface, 3 nodes owned by P0, 1 by P1 + mesh.get_entities(stk::topology::NODE_RANK, meta.universal_part(), entities); + EXPECT_EQ(4u, entities.size()); + mesh.get_entities(stk::topology::NODE_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(4u, entities.size()); + mesh.get_entities(stk::topology::NODE_RANK, aux_meta.active_part() & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_EQ(3u, entities.size()); + } + else + { + EXPECT_EQ(1u, entities.size()); + } + + // Should be 1 interface edge + mesh.get_entities(stk::topology::EDGE_RANK, aux_meta.active_part() & + aux_meta.get_part("surface_block_1_A_B") & aux_meta.get_part("surface_block_1_B_A"), entities); + EXPECT_EQ(1u, entities.size()); + + // Should be 2 coincident subelements, no parents + mesh.get_entities(stk::topology::ELEMENT_RANK, meta.universal_part(), entities); + EXPECT_EQ(2u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(2u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, !aux_meta.active_part(), entities); + EXPECT_EQ(0u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B"), entities); + EXPECT_EQ(1u, entities.size()); +} + +} + +typedef CompleteDecompositionFixture CDMeshTests2D; +TEST_F(CDMeshTests2D, IsovariableNotDefinedOnDecomposedBlock) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}, false); + + commit(); + + EXPECT_ANY_THROW(krino_mesh->check_isovariable_field_existence_on_decomposed_blocks(true)); +} + +TEST_F(CDMeshTests2D, IsovariableNotDefinedOnBlock1) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}, false); + + auto & meta = fixture.meta_data(); + auto & aux_meta = AuxMetaData::get(meta); + + auto * A_part = meta.get_part("block_1_A"); + ASSERT_TRUE(A_part != nullptr); + auto * B_part = meta.get_part("block_1_B"); + ASSERT_TRUE(B_part != nullptr); + + // Catch the case where the field exists on both conformal parts, but not + // the initial un-decomposed part so we can't do the initial decomposition. + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, + 1u, 1u, *A_part); + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, + 1u, 1u, *B_part); + + commit(); + + EXPECT_ANY_THROW(krino_mesh->check_isovariable_field_existence_on_decomposed_blocks(true)); +} + +TEST_F(CDMeshTests2D, IsovariableOnlyOnBlock1SteadyState) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}, false); + + auto & meta = fixture.meta_data(); + auto & aux_meta = AuxMetaData::get(meta); + + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, + 1u, 1u, block_part); + + commit(); + + EXPECT_NO_THROW(krino_mesh->check_isovariable_field_existence_on_decomposed_blocks(false)); +} + +TEST_F(CDMeshTests2D, DeathIsovariableNotDefinedOnDecomposedBlock) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + const bool is_death = true; + setup_ls_field(is_death); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}, false); + + commit(); + + EXPECT_ANY_THROW(krino_mesh->check_isovariable_field_existence_on_decomposed_blocks(true)); +} + +TEST_F(CDMeshTests2D, DeathIsovariableNotDefinedOnDeadBlock) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + const bool is_death = true; + setup_ls_field(is_death); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}, false); + + auto & meta = fixture.meta_data(); + auto & aux_meta = AuxMetaData::get(meta); + auto * alive_part = meta.get_part("block_1_A"); + ASSERT_TRUE(alive_part != nullptr); + + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, + 1u, 1u, block_part); + aux_meta.register_field("LS", FieldType::REAL, stk::topology::NODE_RANK, + 1u, 1u, *alive_part); + + commit(); + + EXPECT_NO_THROW(krino_mesh->check_isovariable_field_existence_on_decomposed_blocks(true)); +} + +typedef CompleteDecompositionFixture CDMeshTests2D; +TEST_F(CDMeshTests2D, Single_Tri3_Decomposition) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts; + elem_parts.push_back(&block_part); + elem_parts.push_back(&aux_meta.active_part()); + std::vector node_ids = {1, 2, 3}; + + create_element(elem_parts, 1, node_ids); + } + mesh.modification_end(); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + + double * node1_coords = field_data(coord_field, node1); + double * node2_coords = field_data(coord_field, node2); + double * node3_coords = field_data(coord_field, node3); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + + node2_coords[0] = 1.; + node2_coords[1] = 0.; + + node3_coords[0] = 0.; + node3_coords[1] = 1.; + + *field_data(ls_policy.ls_isovar, node1) = -1; + *field_data(ls_policy.ls_isovar, node2) = 1; + *field_data(ls_policy.ls_isovar, node3) = -1; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + std::vector entities; + + // Should have added 2 nodes at the cutting locations + mesh.get_entities(stk::topology::NODE_RANK, meta.universal_part(), entities); + EXPECT_EQ(5u, entities.size()); + mesh.get_entities(stk::topology::NODE_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(5u, entities.size()); + + // Should be 1 interface edge + mesh.get_entities(stk::topology::EDGE_RANK, aux_meta.active_part() & + aux_meta.get_part("surface_block_1_A_B") & aux_meta.get_part("surface_block_1_B_A"), entities); + EXPECT_EQ(1u, entities.size()); + + // Should be 3 conformal elements plus the parent element + mesh.get_entities(stk::topology::ELEMENT_RANK, meta.universal_part(), entities); + EXPECT_EQ(4u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(3u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, !aux_meta.active_part(), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B"), entities); + EXPECT_EQ(2u, entities.size()); +} + +TEST_F(CDMeshTests2D, Two_Tri3_Snapped_Interface_Decomposition_NP2) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size != 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs(*this, block_part, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + { + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + *field_data(ls_policy.ls_isovar, node1) = -1; + *field_data(ls_policy.ls_isovar, node2) = 0; + *field_data(ls_policy.ls_isovar, node3) = 1; + *field_data(ls_policy.ls_isovar, node4) = 0; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + check_two_tri3_snapped_mesh_np2(*this, parallel_rank); + + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_TRUE(entities.empty()); + } + else + { + EXPECT_EQ(1u, entities.size()); + } + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_EQ(1u, entities.size()); + } + else + { + EXPECT_TRUE(entities.empty()); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } + + // Swap the A and B elements + { + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + *field_data(ls_policy.ls_isovar, node1) = 1; + *field_data(ls_policy.ls_isovar, node2) = 0; + *field_data(ls_policy.ls_isovar, node3) = -1; + *field_data(ls_policy.ls_isovar, node4) = 0; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + check_two_tri3_snapped_mesh_np2(*this, parallel_rank); + + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_EQ(1u, entities.size()); + } + else + { + EXPECT_TRUE(entities.empty()); + } + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_TRUE(entities.empty()); + } + else + { + EXPECT_EQ(1u, entities.size()); + } + } +} + +TEST_F(CDMeshTests2D, Two_Tri3_Death_Snapped_Interface_Decomposition_NP2) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size != 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + setup_ls_field(true); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs(*this, block_part, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + { + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + *field_data(ls_policy.ls_isovar, node1) = -1; + *field_data(ls_policy.ls_isovar, node2) = 0; + *field_data(ls_policy.ls_isovar, node3) = 1; + *field_data(ls_policy.ls_isovar, node4) = 0; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + check_two_tri3_snapped_mesh_np2(*this, parallel_rank); + + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_TRUE(entities.empty()); + } + else + { + EXPECT_EQ(1u, entities.size()); + } + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_EQ(1u, entities.size()); + } + else + { + EXPECT_TRUE(entities.empty()); + } + } +} + +TEST_F(CDMeshTests2D, Two_Tri3_Death_Snapped_Interface_Decomposition_NP2_Opposite_Ownership) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size != 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + setup_ls_field(true); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs(*this, block_part, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + { + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + *field_data(ls_policy.ls_isovar, node1) = 1; + *field_data(ls_policy.ls_isovar, node2) = 0; + *field_data(ls_policy.ls_isovar, node3) = -1; + *field_data(ls_policy.ls_isovar, node4) = 0; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + check_two_tri3_snapped_mesh_np2(*this, parallel_rank); + + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_EQ(1u, entities.size()); + } + else + { + EXPECT_TRUE(entities.empty()); + } + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B") & meta.locally_owned_part(), entities); + if(parallel_rank == 0) + { + EXPECT_TRUE(entities.empty()); + } + else + { + EXPECT_EQ(1u, entities.size()); + } + } +} + +TEST_F(CDMeshTests2D, Two_Tri3_Periodic) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_tol(0.1); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + AuxMetaData & aux_meta = AuxMetaData::get(fixture.meta_data()); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs(*this, block_part, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, fixture.meta_data().universal_part(), {&aux_meta.exposed_boundary_part()}); + + { + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + const auto node4 = mesh.get_entity(stk::topology::NODE_RANK, 4); + + *field_data(ls_policy.ls_isovar, node1) = -0.99; + *field_data(ls_policy.ls_isovar, node2) = -0.8; + *field_data(ls_policy.ls_isovar, node3) = 0.2; + *field_data(ls_policy.ls_isovar, node4) = 0.01; + + krino_mesh->add_periodic_node_pair(node3, node4); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + // Periodic constraint should cause interface to snap to both 3 and 4 so no elements + // get cut. + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A"), entities); + EXPECT_EQ(0u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B"), entities); + EXPECT_EQ(2u, entities.size()); + } +} + +TEST_F(CDMeshTests2D, Two_Tri3_PeriodicParallelNonSharedNode) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size == 1 || (parallel_size % 2) != 0) return; + + cdfemSupport.set_cdfem_edge_tol(0.1); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + const stk::mesh::EntityId starting_id = 1 + 3*parallel_rank; + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts; + elem_parts.push_back(&block_part); + elem_parts.push_back(&cdfemSupport.get_active_part()); + + std::vector elem_nodes = {starting_id, starting_id + 1, starting_id + 2}; + + create_element(elem_parts, parallel_rank + 1, elem_nodes); + } + mesh.modification_end(); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + EXPECT_EQ(1u, stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::ELEMENT_RANK))); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, starting_id); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, starting_id + 1); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, starting_id + 2); + + ASSERT_TRUE(mesh.is_valid(node1)); + ASSERT_TRUE(mesh.is_valid(node2)); + ASSERT_TRUE(mesh.is_valid(node3)); + + double * node1_coords = field_data(coord_field, node1); + double * node2_coords = field_data(coord_field, node2); + double * node3_coords = field_data(coord_field, node3); + + const double x0 = 1.1 * parallel_rank; + node1_coords[0] = x0; + node1_coords[1] = 0.; + + node2_coords[0] = x0 + 1.; + node2_coords[1] = 0.; + + node3_coords[0] = x0 + 1.; + node3_coords[1] = 1.; + + // Going to add "periodic" constraint between node1 on P0 and P1, so ghost those nodes appropriately + mesh.modification_begin(); + auto & ghosting = mesh.create_ghosting("test_ghosting"); + mesh.modification_end(); + stk::mesh::EntityProcVec add_send; + const int mod = parallel_rank % 2; + if(mod == 0) + { + add_send.push_back(std::make_pair(node1, parallel_rank + 1)); + } + else + { + add_send.push_back(std::make_pair(node1, parallel_rank - 1)); + } + mesh.modification_begin(); + mesh.change_ghosting(ghosting, add_send); + mesh.modification_end(); + + ASSERT_EQ(4u, + stk::mesh::count_selected_entities(meta.universal_part(), mesh.buckets(stk::topology::NODE_RANK))); + { + // Procs with mod == 0 will setup isovars so that the 1-2 edge has a crossing within the snap tolerance + // of node 1. Procs with mod == 1 will have the crossing outside the snap tolerance + *field_data(ls_policy.ls_isovar, node1) = (mod == 0) ? -0.01 : -1.; + *field_data(ls_policy.ls_isovar, node2) = 1.; + *field_data(ls_policy.ls_isovar, node3) = 1.; + + auto other_node1 = mesh.get_entity(stk::topology::NODE_RANK, + (mod == 0) ? starting_id + 3 : starting_id - 3); + krino_mesh->add_periodic_node_pair(node1, other_node1); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + // Periodic constraint should cause interface to snap to node1 so the element is entirely in the + // A phase. + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B"), entities); + EXPECT_EQ(0u, entities.size()); + } +} + +void set_level_set(const stk::mesh::BulkData & mesh, FieldRef lsField, const std::vector & nodeIds, const std::vector & nodeLS) +{ + ThrowRequire(nodeIds.size() == nodeLS.size()); + for (size_t i=0; i(lsField, node) = nodeLS[i]; + } +} + +TEST_F(CDMeshTests2D, Two_Tri3_Check_Compatibility_When_Snapping) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + AuxMetaData & aux_meta = AuxMetaData::get(fixture.meta_data()); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs(*this, block_part, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, fixture.meta_data().universal_part(), {&aux_meta.exposed_boundary_part()}); + + set_level_set(mesh, ls_policy.ls_isovar, {1,2,3,4} , {-1., -1., 1.e20, 1.}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + std::vector entities; + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_A"), entities); + EXPECT_EQ(2u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_B"), entities); + EXPECT_EQ(1u, entities.size()); + + //fixture.write_results("Two_Tri3_Check_Compatibility_When_Snapping.e"); +} + +void set_level_sets(const stk::mesh::BulkData & mesh, std::vector & lsFields, const std::vector & nodeIds, const std::vector> & nodeLS) +{ + ThrowRequire(nodeIds.size() == nodeLS.size()); + const size_t numFields = lsFields.size(); + for (size_t i=0; i(lsFields[j], node) = nodeLS[i][j]; + } +} + +typedef CompleteDecompositionFixture > CDMeshTests2DLSPerPhase; +TEST_F(CDMeshTests2DLSPerPhase, Two_Tri3_Check_Compatibility_When_Snapping) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + AuxMetaData & aux_meta = AuxMetaData::get(fixture.meta_data()); + + aux_meta.set_assert_32bit_flag(); + aux_meta.clear_force_64bit_flag(); + + setup_ls_field(); + + auto & blockPart = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&blockPart}); + const auto & sideParts = declare_input_surfaces_touching_block(4, blockPart); + + commit(); + + build_two_tri3_mesh_on_one_or_two_procs_with_sides(*this, blockPart, sideParts, parallel_rank); + + stk::mesh::create_exposed_block_boundary_sides(mesh, fixture.meta_data().universal_part(), {&aux_meta.exposed_boundary_part()}); + + const double eps = 1.e-13; + set_level_sets(mesh, ls_policy.ls_isovars, {1,2,3,4} , {{-1.,1.,1.+eps}, {-1.,1.,1.+eps}, {1.e2,1.,-1.}, {1.,-1.,-1.+eps}}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + //std::cout << log.get_log() << std::endl; + + std::vector entities; + mesh.get_entities(stk::topology::NODE_RANK, fixture.meta_data().universal_part(), entities); + EXPECT_EQ(7u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P0"), entities); + EXPECT_EQ(3u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P1"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P2"), entities); + EXPECT_EQ(2u, entities.size()); + + //fixture.write_results("Two_Tri3_Check_Compatibility_When_Snapping_LSPerPhase.e"); +} + +typedef CompleteDecompositionFixture CDMeshTests3D; +TEST_F(CDMeshTests3D, Write_Results_No_Side) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size, false); + + fixture.write_results("Write_Results_No_Side.e"); +} + +TEST_F(CDMeshTests3D, Write_Results_With_Side) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + fixture.write_results("Write_Results_With_Side.e"); +} + +namespace +{ +void randomize_ls_field(const stk::mesh::BulkData & mesh, + const FieldRef & field, + std::mt19937 & mt, + std::uniform_real_distribution & dist) +{ + auto & node_buckets = mesh.buckets(stk::topology::NODE_RANK); + for(auto && b_ptr : node_buckets) + { + for(auto && node : *b_ptr) + { + double * ls_data = field_data(field, node); + if(ls_data) *ls_data = dist(mt); + } + } +} +void set_ls_field_on_part(const stk::mesh::BulkData & mesh, + const stk::mesh::Part & part, + const FieldRef & ls_field, + const double ls_value) +{ + auto & node_buckets = mesh.get_buckets(stk::topology::NODE_RANK, part); + for(auto && b_ptr : node_buckets) + { + for(auto && node : *b_ptr) + { + double * ls_data = field_data(ls_field, node); + if(ls_data) *ls_data = ls_value; + } + } +} + +} + +TEST_F(CDMeshTests3D, Random_TwoTet4_InternalSideset) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + + if (parallel_size > 2) return; + + // Use a large snap tolerance to make snapping more common since it is a frequent source + // of parallel bugs + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + randomize_ls_field(mesh, ls_policy.ls_isovar, mt, dist); + stk::mesh::communicate_field_data(mesh, {&ls_policy.ls_isovar.field(), &coord_field.field()}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + if(HasNonfatalFailure()) + { + std::cout << "Failure on iteration " << i << std::endl; + krino_mesh->debug_output(); + std::cout << log.get_log() << std::endl; + std::ostringstream fname; + fname << "Random_TwoTet4_InternalSideset_iter_" << i << ".e"; + fixture.write_results(fname.str()); + ASSERT_TRUE(false); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +typedef CompleteDecompositionFixture CDMeshTestsBboxMesh2D; +TEST_F(CDMeshTestsBboxMesh2D, Random_SnapMesh) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + const double approxMinRelativeSize = 0.25; + + setup_ls_field(); + + auto & block1_part = aux_meta.get_part("block_1"); + + register_ls_on_blocks({&block1_part}); + + typename BoundingBoxMesh::BoundingBoxType domain(Vector3d::ZERO, Vector3d(1.,1.,0.)); + const double mesh_size = 1./3.; + fixture.set_domain(domain, mesh_size); + fixture.populate_mesh(); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part(),&aux_meta.active_part()}); + + double overallMinEdgeLength = std::numeric_limits::max(); + double overallMaxEdgeLength = -std::numeric_limits::max(); + double overallMinVolume = std::numeric_limits::max(); + double overallMaxVolume = -std::numeric_limits::max(); + const double expectedMinLength = mesh_size*approxMinRelativeSize; + const double expectedMinVol = std::pow(mesh_size*approxMinRelativeSize, 2.) / 2.; + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + randomize_ls_field(mesh, ls_policy.ls_isovar, mt, dist); + set_ls_field_on_part(mesh, aux_meta.exposed_boundary_part(), ls_policy.ls_isovar, 1.); + stk::mesh::communicate_field_data(mesh, {&ls_policy.ls_isovar.field(), &coord_field.field()}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + double minEdgeLength, maxEdgeLength, minVolume, maxVolume; + compute_element_quality(mesh, minEdgeLength, maxEdgeLength, minVolume, maxVolume); + overallMinEdgeLength = std::min(overallMinEdgeLength, minEdgeLength); + overallMaxEdgeLength = std::max(overallMaxEdgeLength, maxEdgeLength); + overallMinVolume = std::min(overallMinVolume, minVolume); + overallMaxVolume = std::max(overallMaxVolume, maxVolume); + + bool failedQuality = false; + if (minVolume < 0.5*expectedMinVol) + { + failedQuality = true; + std::cout << "Failed quality requirements: minEdgeLength=" << minEdgeLength + << ", maxEdgeLength=" << maxEdgeLength + << ", minVolume=" << minVolume + << ", maxVolume=" << maxVolume << std::endl; + } + + if(HasNonfatalFailure() || failedQuality) + { + std::cout << "Failure on iteration " << i << std::endl; + krino_mesh->debug_output(); + std::cout << log.get_log() << std::endl; + std::ostringstream fname; + fname << "Random_SnapTri3_iter_" << i << ".e"; + SimpleStkFixture::write_results(fname.str(), mesh); + ASSERT_TRUE(false); + } + } + std::cout << "Expected quality: minEdgeLength~=" << expectedMinLength << ", minVolume~=" << expectedMinVol << std::endl; + std::cout << "Quality results: minEdgeLength=" << overallMinEdgeLength + << ", maxEdgeLength=" << overallMaxEdgeLength + << ", minVolume=" << overallMinVolume + << ", maxVolume=" << overallMaxVolume << std::endl; +} + +typedef CompleteDecompositionFixture> CDMeshTestsBboxMesh2DLSPerPhase; +TEST_F(CDMeshTestsBboxMesh2DLSPerPhase, Random_SnapMesh) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + const double approxMinRelativeSize = 0.25; + + setup_ls_field(); + + auto & block1_part = aux_meta.get_part("block_1"); + + register_ls_on_blocks({&block1_part}); + + typename BoundingBoxMesh::BoundingBoxType domain(Vector3d::ZERO, Vector3d(1.,1.,0.)); + const double mesh_size = 1./3.; + fixture.set_domain(domain, mesh_size); + fixture.populate_mesh(); + fixture.create_domain_sides(); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part(),&aux_meta.active_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for(auto && isovar : ls_isovars) sync_fields.push_back(&isovar.field()); + + double overallMinEdgeLength = std::numeric_limits::max(); + double overallMaxEdgeLength = -std::numeric_limits::max(); + double overallMinVolume = std::numeric_limits::max(); + double overallMaxVolume = -std::numeric_limits::max(); + const double expectedMinLength = mesh_size*approxMinRelativeSize; + const double expectedMinVol = std::pow(mesh_size*approxMinRelativeSize, 2.) / 2.; + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + for(auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + double minEdgeLength, maxEdgeLength, minVolume, maxVolume; + compute_element_quality(mesh, minEdgeLength, maxEdgeLength, minVolume, maxVolume); + overallMinEdgeLength = std::min(overallMinEdgeLength, minEdgeLength); + overallMaxEdgeLength = std::max(overallMaxEdgeLength, maxEdgeLength); + overallMinVolume = std::min(overallMinVolume, minVolume); + overallMaxVolume = std::max(overallMaxVolume, maxVolume); + + if(HasNonfatalFailure()) + { + std::cout << "Failure on iteration " << i << std::endl; + krino_mesh->debug_output(); + std::cout << log.get_log() << std::endl; + std::ostringstream fname; + fname << "Random_SnapTri3_iter_" << i << ".e"; + SimpleStkFixture::write_results(fname.str(), mesh); + ASSERT_TRUE(false); + } + } + std::cout << "Expected quality: minEdgeLength~=" << expectedMinLength << ", minVolume~=" << expectedMinVol << std::endl; + std::cout << "Quality results: minEdgeLength=" << overallMinEdgeLength + << ", maxEdgeLength=" << overallMaxEdgeLength + << ", minVolume=" << overallMinVolume + << ", maxVolume=" << overallMaxVolume << std::endl; +} + +typedef CompleteDecompositionFixture CDMeshTestsBboxMesh3D; +TEST_F(CDMeshTestsBboxMesh3D, Random_SnapMesh) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + const double approxMinRelativeSize = 0.25; + + setup_ls_field(); + + auto & block1_part = aux_meta.get_part("block_1"); + + register_ls_on_blocks({&block1_part}); + + typename BoundingBoxMesh::BoundingBoxType domain(Vector3d::ZERO, Vector3d(1.,1.,1.)); + const double mesh_size = 1./3.; + fixture.set_domain(domain, mesh_size); + fixture.populate_mesh(); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part(),&aux_meta.active_part()}); + + double overallMinEdgeLength = std::numeric_limits::max(); + double overallMaxEdgeLength = -std::numeric_limits::max(); + double overallMinVolume = std::numeric_limits::max(); + double overallMaxVolume = -std::numeric_limits::max(); + const double expectedMinLength = mesh_size*approxMinRelativeSize; + const double expectedMinVol = std::pow(mesh_size*approxMinRelativeSize, 3.) / 6.; + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 1000; +#else + const int num_cases = 250; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%250 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + randomize_ls_field(mesh, ls_policy.ls_isovar, mt, dist); + set_ls_field_on_part(mesh, aux_meta.exposed_boundary_part(), ls_policy.ls_isovar, 1.); + stk::mesh::communicate_field_data(mesh, {&ls_policy.ls_isovar.field(), &coord_field.field()}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + double minEdgeLength, maxEdgeLength, minVolume, maxVolume; + compute_element_quality(mesh, minEdgeLength, maxEdgeLength, minVolume, maxVolume); + overallMinEdgeLength = std::min(overallMinEdgeLength, minEdgeLength); + overallMaxEdgeLength = std::max(overallMaxEdgeLength, maxEdgeLength); + overallMinVolume = std::min(overallMinVolume, minVolume); + overallMaxVolume = std::max(overallMaxVolume, maxVolume); + + bool failedQuality = false; + if (minVolume < 0.5*expectedMinVol) + { + failedQuality = true; + std::cout << "Failed quality requirements: minEdgeLength=" << minEdgeLength + << ", maxEdgeLength=" << maxEdgeLength + << ", minVolume=" << minVolume + << ", maxVolume=" << maxVolume << std::endl; + } + + if(HasNonfatalFailure() || failedQuality) + { + std::cout << "Failure on iteration " << i << std::endl; + krino_mesh->debug_output(); + std::cout << log.get_log() << std::endl; + std::ostringstream fname; + fname << "Random_SnapTet4_iter_" << i << ".e"; + SimpleStkFixture::write_results(fname.str(), mesh); + ASSERT_TRUE(false); + } + } + std::cout << "Expected quality: minEdgeLength~=" << expectedMinLength << ", minVolume~=" << expectedMinVol << std::endl; + std::cout << "Actual quality results: minEdgeLength=" << overallMinEdgeLength + << ", maxEdgeLength=" << overallMaxEdgeLength + << ", minVolume=" << overallMinVolume + << ", maxVolume=" << overallMaxVolume << std::endl; +} + +typedef CompleteDecompositionFixture CDMeshTestsBboxMesh3DBCC; +TEST_F(CDMeshTestsBboxMesh3DBCC, Random_SnapMesh) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + const double approxMinRelativeSize = 0.25; + + setup_ls_field(); + + auto & block1_part = aux_meta.get_part("block_1"); + + register_ls_on_blocks({&block1_part}); + + typename BoundingBoxMesh::BoundingBoxType domain(Vector3d::ZERO, Vector3d(1.,1.,1.)); + const double mesh_size = 1./3.; + fixture.set_domain(domain, mesh_size); + fixture.set_mesh_structure_type(BCC_BOUNDING_BOX_MESH); + fixture.populate_mesh(); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part(),&aux_meta.active_part()}); + + const double BCCsize = std::sqrt(3.)/2.*mesh_size; + double overallMinEdgeLength = std::numeric_limits::max(); + double overallMaxEdgeLength = -std::numeric_limits::max(); + double overallMinVolume = std::numeric_limits::max(); + double overallMaxVolume = -std::numeric_limits::max(); + const double expectedMinLength = BCCsize*approxMinRelativeSize; + const double expectedMinVol = std::pow(BCCsize*approxMinRelativeSize, 3.) / (6.*std::sqrt(2.)); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 1000; +#else + const int num_cases = 250; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%250 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + randomize_ls_field(mesh, ls_policy.ls_isovar, mt, dist); + set_ls_field_on_part(mesh, aux_meta.exposed_boundary_part(), ls_policy.ls_isovar, 1.); + stk::mesh::communicate_field_data(mesh, {&ls_policy.ls_isovar.field(), &coord_field.field()}); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + double minEdgeLength, maxEdgeLength, minVolume, maxVolume; + compute_element_quality(mesh, minEdgeLength, maxEdgeLength, minVolume, maxVolume); + overallMinEdgeLength = std::min(overallMinEdgeLength, minEdgeLength); + overallMaxEdgeLength = std::max(overallMaxEdgeLength, maxEdgeLength); + overallMinVolume = std::min(overallMinVolume, minVolume); + overallMaxVolume = std::max(overallMaxVolume, maxVolume); + + bool failedQuality = false; + if (minVolume < 0.5*expectedMinVol) + { + failedQuality = true; + std::cout << "Failed quality requirements: minEdgeLength=" << minEdgeLength + << ", maxEdgeLength=" << maxEdgeLength + << ", minVolume=" << minVolume + << ", maxVolume=" << maxVolume << std::endl; + } + + if(HasNonfatalFailure() || failedQuality) + { + std::cout << "Failure on iteration " << i << std::endl; + krino_mesh->debug_output(); + std::cout << log.get_log() << std::endl; + std::ostringstream fname; + fname << "Random_SnapTet4_iter_" << i << ".e"; + SimpleStkFixture::write_results(fname.str(), mesh); + ASSERT_TRUE(false); + } + } + std::cout << "Expected quality: minEdgeLength~=" << expectedMinLength << ", minVolume~=" << expectedMinVol << std::endl; + std::cout << "Actual quality results: minEdgeLength=" << overallMinEdgeLength + << ", maxEdgeLength=" << overallMaxEdgeLength + << ", minVolume=" << overallMinVolume + << ", maxVolume=" << overallMaxVolume << std::endl; +} + +TEST_F(CDMeshTests2DLSPerPhase, Tri3_3LS_SnappedTriplePoint) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + cdfemSupport.set_cdfem_edge_tol(0.15); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts; + elem_parts.push_back(&block_part); + elem_parts.push_back(&aux_meta.active_part()); + std::vector node_ids = {1, 2, 3}; + + create_element(elem_parts, 1, node_ids); + } + mesh.modification_end(); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + + double * node1_coords = field_data(coord_field, node1); + double * node2_coords = field_data(coord_field, node2); + double * node3_coords = field_data(coord_field, node3); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + + node2_coords[0] = 1.; + node2_coords[1] = 0.; + + node3_coords[0] = 0.; + node3_coords[1] = 1.; + + const auto & ls_isovars = ls_policy.ls_isovars; + *field_data(ls_isovars[0], node1) = 0.; + *field_data(ls_isovars[0], node2) = 0.; + *field_data(ls_isovars[0], node3) = 0.; + + *field_data(ls_isovars[1], node1) = 0.1; + *field_data(ls_isovars[1], node2) = -0.2; + *field_data(ls_isovars[1], node3) = -0.01; + + *field_data(ls_isovars[2], node1) = 0.2; + *field_data(ls_isovars[2], node2) = -0.25; + *field_data(ls_isovars[2], node3) = -0.005; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + std::vector entities; + + // This assumes that the element is cut first by the (0,1) interface, + // then the (0, 2) virtual interface, and then the (1, 2) interface. + // THere are other valid decompositions if the element is cut in a different order. + // Should have added 3 nodes at the cutting locations + mesh.get_entities(stk::topology::NODE_RANK, meta.universal_part(), entities); + EXPECT_EQ(5u, entities.size()); + mesh.get_entities(stk::topology::NODE_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(5u, entities.size()); + + mesh.get_entities(stk::topology::EDGE_RANK, aux_meta.active_part() & + aux_meta.get_part("surface_block_1_P0_P1") & aux_meta.get_part("surface_block_1_P1_P0"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::EDGE_RANK, aux_meta.active_part() & + aux_meta.get_part("surface_block_1_P1_P2") & aux_meta.get_part("surface_block_1_P2_P1"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::EDGE_RANK, aux_meta.active_part() & + aux_meta.get_part("surface_block_1_P0_P2") & aux_meta.get_part("surface_block_1_P2_P0"), entities); + EXPECT_EQ(0u, entities.size()); + + // Should be 3 conformal elements plus the parent element + mesh.get_entities(stk::topology::ELEMENT_RANK, meta.universal_part(), entities); + EXPECT_EQ(4u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.active_part(), entities); + EXPECT_EQ(3u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, !aux_meta.active_part(), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P0"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P1"), entities); + EXPECT_EQ(1u, entities.size()); + mesh.get_entities(stk::topology::ELEMENT_RANK, aux_meta.get_part("block_1_P2"), entities); + EXPECT_EQ(1u, entities.size()); +} + +TEST_F(CDMeshTests2DLSPerPhase, Tri3_3LS_TriplePointDebug) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + + if (parallel_size > 1) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + cdfemSupport.set_cdfem_edge_tol(0.01); + + setup_ls_field(); + + auto & block_part = declare_input_block("block_1", stk::topology::TRIANGLE_3_2D); + register_ls_on_blocks({&block_part}); + + commit(); + + mesh.modification_begin(); + { + stk::mesh::PartVector elem_parts; + elem_parts.push_back(&block_part); + elem_parts.push_back(&aux_meta.active_part()); + std::vector node_ids = {1, 2, 3}; + + create_element(elem_parts, 1, node_ids); + } + mesh.modification_end(); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto node1 = mesh.get_entity(stk::topology::NODE_RANK, 1); + const auto node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + const auto node3 = mesh.get_entity(stk::topology::NODE_RANK, 3); + + double * node1_coords = field_data(coord_field, node1); + double * node2_coords = field_data(coord_field, node2); + double * node3_coords = field_data(coord_field, node3); + + node1_coords[0] = 0.; + node1_coords[1] = 0.; + + node2_coords[0] = 1.; + node2_coords[1] = 0.; + + node3_coords[0] = 0.; + node3_coords[1] = 1.; + + const auto & ls_isovars = ls_policy.ls_isovars; + *field_data(ls_isovars[0], node1) = -0.2; + *field_data(ls_isovars[1], node1) = 0.1; + *field_data(ls_isovars[2], node1) = 0.6; + + *field_data(ls_isovars[0], node2) = 0.7; + *field_data(ls_isovars[1], node2) = -0.5; + *field_data(ls_isovars[2], node2) = 0.4; + + *field_data(ls_isovars[0], node3) = 0.1; + *field_data(ls_isovars[1], node3) = 0.3; + *field_data(ls_isovars[2], node3) = -0.5; + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + // Test output, but remove output unless actually debugging. + fixture.write_results("debug_2d.e"); + std::remove("debug_2d.e"); +} + +typedef CompleteDecompositionFixture > CDMeshTests2DLSPerPhase; +TEST_F(CDMeshTests2DLSPerPhase, Random_TwoTri3_InternalSideset_Snap) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + + setup_ls_field(); + + const stk::topology tri3 = stk::topology::TRIANGLE_3_2D; + auto & block1_part = declare_input_block("block_1", tri3); + auto & block2_part = declare_input_block("block_2", tri3); + auto & surface_part = declare_input_surface("surface_1", tri3.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + commit(); + + build_two_tri3_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for(auto && isovar : ls_isovars) sync_fields.push_back(&isovar.field()); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + for(auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + if (false) + { + std::ostringstream fname; + fname << "Random_TwoTri3_InternalSideset_Snap_iter_" << i << ".e"; + fixture.write_results(fname.str()); + } + + if(HasNonfatalFailure()) + { + std::cout << "Failure on iteration " << i << std::endl; + std::ostringstream fname; + fname << "Random_TwoTri3_InternalSideset_Snap_iter_" << i << ".e"; + fixture.write_results(fname.str()); + ASSERT_TRUE(false); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +typedef CompleteDecompositionFixture > CDMeshTests3DLSPerInterface; +TEST_F(CDMeshTests3DLSPerInterface, Random_OneTet4) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + aux_meta.set_assert_32bit_flag(); + aux_meta.clear_force_64bit_flag(); + + // Use a large snap tolerance to make snapping more common since it is a frequent source + // of parallel bugs + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + + register_ls_on_blocks({&block1_part}); + + commit(); + + build_one_tet4_mesh(*this, block1_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for(auto && isovar : ls_isovars) sync_fields.push_back(&isovar.field()); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + for(auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + if(HasNonfatalFailure()) + { + std::cout << log.get_log() << std::endl; + std::cout << "Failure on iteration " << i << std::endl; + std::ostringstream fname; + fname << "Random_TwoTet4_InternalSideset_iter_" << i << ".e"; + fixture.write_results(fname.str()); + ASSERT_TRUE(false); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +typedef CompleteDecompositionFixture > CDMeshTests3DLSPerInterface; +TEST_F(CDMeshTests3DLSPerInterface, OneTet4_CutBasedOnNearestEdgeCut) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 1) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + aux_meta.set_assert_32bit_flag(); + aux_meta.clear_force_64bit_flag(); + + // Use a large snap tolerance to make snapping more common since it is a frequent source + // of parallel bugs + cdfemSupport.set_cdfem_edge_tol(0.001); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_NEAREST_EDGE_CUT); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + + register_ls_on_blocks({&block1_part}); + + commit(); + + build_one_tet4_mesh(*this, block1_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const std::array nodes = {{ mesh.get_entity(stk::topology::NODE_RANK, 1), mesh.get_entity(stk::topology::NODE_RANK, 2), mesh.get_entity(stk::topology::NODE_RANK, 3), mesh.get_entity(stk::topology::NODE_RANK, 4) }}; + const auto & ls_isovars = ls_policy.ls_isovars; + *field_data(ls_isovars[0], nodes[0]) = -1; + *field_data(ls_isovars[0], nodes[1]) = 1.; + *field_data(ls_isovars[0], nodes[2]) = 2.; + *field_data(ls_isovars[0], nodes[3]) = 3.; + + commit(); + decompose_mesh(); + + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + EXPECT_EQ(1u+1u, mesh.num_elements(nodes[0])); + EXPECT_EQ(1u+1u, mesh.num_elements(nodes[1])); + EXPECT_EQ(2u+1u, mesh.num_elements(nodes[2])); + EXPECT_EQ(3u+1u, mesh.num_elements(nodes[3])); + + // regression test + const ScaledJacobianQualityMetric qualityMetric; + const double quality = determine_quality(mesh, krino_mesh->get_active_part(), qualityMetric); + const double goldQuality = 0.21; + EXPECT_GT(quality, goldQuality); +} + +typedef CompleteDecompositionFixture > CDMeshTests3DLSPerPhase; +TEST_F(CDMeshTests3DLSPerPhase, Random_TwoTet4_InternalSideset) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + // Use a large snap tolerance to make snapping more common since it is a frequent source + // of parallel bugs + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for(auto && isovar : ls_isovars) sync_fields.push_back(&isovar.field()); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + for(auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + if(HasNonfatalFailure()) + { + std::cout << "Failure on iteration " << i << std::endl; + std::ostringstream fname; + fname << "Random_TwoTet4_InternalSideset_iter_" << i << ".e"; + fixture.write_results(fname.str()); + ASSERT_TRUE(false); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +TEST_F(CDMeshTests3DLSPerPhase, Random_TwoTet4_InternalSideset_Snap) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + cdfemSupport.set_cdfem_edge_degeneracy_handling(SNAP_TO_INTERFACE_WHEN_QUALITY_ALLOWS_THEN_SNAP_TO_NODE); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides(mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for(auto && isovar : ls_isovars) sync_fields.push_back(&isovar.field()); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); +#ifdef NDEBUG + const int num_cases = 5000; +#else + const int num_cases = 1000; +#endif + for(int i=0; i < num_cases; ++i) + { + if (i%1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + MeshClone::stash_or_restore_mesh(mesh, 0); // restore original uncut mesh + commit(); // new krino_mesh each time + + for(auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + EXPECT_TRUE(check_induced_parts(mesh)); + EXPECT_TRUE(check_face_and_edge_ownership(mesh)); + EXPECT_TRUE(check_face_and_edge_relations(mesh)); + EXPECT_TRUE(check_shared_entity_nodes(mesh)); + EXPECT_TRUE(krino_mesh->check_element_side_parts()); + + if(HasNonfatalFailure()) + { + std::cout << "Failure on iteration " << i << std::endl; + std::ostringstream fname; + fname << "Random_TwoTet4_InternalSideset_iter_" << i << ".e"; + fixture.write_results(fname.str()); + ASSERT_TRUE(false); + } + + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +TEST_F(CDMeshTests3DLSPerPhase, RestoreAfterFailedStep) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + + if (parallel_size > 2) return; + + stk::mesh::BulkData & mesh = fixture.bulk_data(); + stk::mesh::MetaData & meta = fixture.meta_data(); + AuxMetaData & aux_meta = AuxMetaData::get(meta); + + // Use a large snap tolerance to make snapping more common since it is a frequent source + // of parallel bugs + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", + tet4.side_topology(), + {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + commit(); + + build_two_tet4_mesh_np2( + *this, block1_part, block2_part, surface_part, parallel_rank, parallel_size); + + stk::mesh::create_exposed_block_boundary_sides( + mesh, meta.universal_part(), {&aux_meta.exposed_boundary_part()}); + + const auto & ls_isovars = ls_policy.ls_isovars; + std::vector sync_fields = {&coord_field.field()}; + for (auto && isovar : ls_isovars) + sync_fields.push_back(&isovar.field()); + + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution dist(-1., 1.); + for (int i = 0; i < 100; ++i) + { + if (i % 1000 == 0) std::cout << "Testing random configuration " << i << std::endl; + + // We want to test restoring the mesh after failed time steps for a variety of + // random decompositions: + // 1) Do a random decomposition and stash the mesh to act like a successful time + // step. + // 2) Do a second random decomposition to simulate the changes of a time step that + // will fail. + // 3) Restore the mesh to the stashed mesh, and rebuild the CDMesh, confirm that + // does not fail. + + auto randomize_all_fields = [&]() + { + for (auto && isovar : ls_isovars) + { + randomize_ls_field(mesh, isovar, mt, dist); + } + stk::mesh::communicate_field_data(mesh, sync_fields); + }; + + auto run_decomp = [&]() + { + try + { + decompose_mesh(); + } + catch (const std::exception & exception) + { + std::cout << log.get_log() << std::endl; + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + }; + // Step 1. + randomize_all_fields(); + run_decomp(); + krino::MeshClone::stash_or_restore_mesh(mesh, i); + krino_mesh = std::make_shared(mesh, krino_mesh); + + // Step 2. + randomize_all_fields(); + run_decomp(); + krino::MeshClone::stash_or_restore_mesh(mesh, i); + + // Step 3. + ASSERT_NO_THROW(krino_mesh->rebuild_after_rebalance()); + krino_mesh = std::make_shared(mesh, krino_mesh); + } +} + +TEST_F(CDMeshTests3D, Rebalance_with_rcb) +{ + run_rebalance_with("rcb"); +} + +TEST_F(CDMeshTests3D, Rebalance_with_parmetis) +{ + run_rebalance_with("parmetis"); +} + +typedef CompleteDecompositionFixture NonconformalAdaptivityTest; +TEST_F(NonconformalAdaptivityTest, InternalSidePositivePermutationNonOwnedElement) +{ + /* This tests that percept can correctly handle an internal side where the element + * with the same owning proc as the side has a negative permutation and the second + * connected element (with a different owning processor) has a positive permutation. + * In serial it just tests use of the adaptivity interface. + */ + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + + if (parallel_size > 2) return; + + cdfemSupport.set_cdfem_edge_tol(0.1); + cdfemSupport.set_simplex_generation_method(CUT_QUADS_BY_GLOBAL_IDENTIFIER); + + setup_ls_field(); + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + register_ls_on_blocks({&block1_part, &block2_part}); + + auto & aux_meta = AuxMetaData::get(fixture.meta_data()); + FieldRef marker_field = + aux_meta.register_field("refine_marker", FieldType::INTEGER, stk::topology::ELEMENT_RANK, + 1u, 1, fixture.meta_data().universal_part()); + + auto & meta = fixture.meta_data(); + auto & active_part = aux_meta.active_part(); + stk::diag::TimerSet enabledTimerSet(0); + stk::diag::Timer root_timer = createRootTimer("test", enabledTimerSet); + HAdapt::setup(meta, active_part, root_timer); + + commit(); + + const bool build_all_on_P0 = false; + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_part, parallel_rank, + parallel_size, true, build_all_on_P0); + + auto elem_1 = mesh.get_entity(stk::topology::ELEMENT_RANK, 1u); + int & elem_1_marker = *field_data(marker_field, elem_1); + elem_1_marker = 1; + + if(parallel_size == 2) + { + stk::mesh::EntityProcVec changes; + if(parallel_rank == 0) + { + changes.push_back(std::make_pair(mesh.get_entity(stk::topology::FACE_RANK, 7), 1)); + } + mesh.change_entity_owner(changes); + } + + EXPECT_NO_THROW(HAdapt::do_adaptive_refinement(meta, marker_field.name())); +} + +typedef CompleteDecompositionFixture MeshCloneTest; +TEST_F(MeshCloneTest, FaceOwnershipAndPartChangeBetweenClones) +{ + /* + * This test regression tests a bug where a shared face both changed parts and + * parallel owners between calls to MeshClone::stash_or_restore_mesh(), leading to a + * throw when copying field data to the clone mesh because the parts of the face were not + * updated on the clone. + */ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + const int parallel_rank = stk::parallel_machine_rank(pm); + stk::mesh::BulkData & mesh = fixture.bulk_data(); + + if (parallel_size != 2) return; + + const stk::topology tet4 = stk::topology::TETRAHEDRON_4; + auto & block1_part = declare_input_block("block_1", tet4); + auto & block2_part = declare_input_block("block_2", tet4); + auto & surface_1_part = declare_input_surface("surface_1", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + auto & surface_2_part = declare_input_surface("surface_2", tet4.side_topology(), {block1_part.mesh_meta_data_ordinal(), block2_part.mesh_meta_data_ordinal()}); + + auto & aux_meta = AuxMetaData::get(fixture.meta_data()); + aux_meta.register_field("side_field", FieldType::REAL, stk::topology::FACE_RANK, + 1u, 1u, surface_1_part); + + commit(); + + build_two_tet4_mesh_np2(*this, block1_part, block2_part, surface_1_part, parallel_rank, parallel_size); + + // Stash the initial mesh. + ASSERT_NO_THROW(MeshClone::stash_or_restore_mesh(mesh, 0)); + + // Change the parallel owner of the shared face, then change its surface part from surface_1 to + // surface_2. + const auto side_1 = mesh.get_entity(stk::topology::FACE_RANK, 7); + const auto current_owner = mesh.parallel_owner_rank(side_1); + stk::mesh::EntityProcVec owner_changes; + if(parallel_rank == current_owner) + { + owner_changes.emplace_back(side_1, (current_owner + 1) % 2); + } + mesh.change_entity_owner(owner_changes); + ASSERT_TRUE(mesh.is_valid(side_1)); + const auto new_owner = mesh.parallel_owner_rank(side_1); + ASSERT_NE(new_owner, current_owner); + + mesh.modification_begin(); + if(new_owner == parallel_rank) + { + mesh.change_entity_parts(side_1, stk::mesh::ConstPartVector{&surface_2_part}, stk::mesh::ConstPartVector{&surface_1_part}); + } + mesh.modification_end(); + + // Confirm that updating the stash mesh succeeds + try + { + MeshClone::stash_or_restore_mesh(mesh, 1); + } + catch (const std::exception & exception) + { + std::cout << "Decomposing mesh failed with exception:\n"; + std::cout << exception.what() << "\n"; + ASSERT_TRUE(false); + } + + // Change the shared face part back to surface_1, then restore from the stash and + // confirm that the parts of the face are correct. + mesh.modification_begin(); + if(new_owner == parallel_rank) + { + mesh.change_entity_parts(side_1, stk::mesh::ConstPartVector{&surface_1_part}, stk::mesh::ConstPartVector{&surface_2_part}); + } + mesh.modification_end(); + ASSERT_TRUE(mesh.bucket(side_1).member(surface_1_part)); + MeshClone::stash_or_restore_mesh(mesh, 1); + const auto side_1_new = mesh.get_entity(stk::topology::FACE_RANK, 7); + EXPECT_TRUE(mesh.bucket(side_1_new).member(surface_2_part)); + EXPECT_FALSE(mesh.bucket(side_1_new).member(surface_1_part)); +} + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_ContourElement.cpp b/packages/krino/krino/unit_tests/Akri_Unit_ContourElement.cpp new file mode 100644 index 000000000000..372f6cdbb820 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_ContourElement.cpp @@ -0,0 +1,83 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + +#include + +namespace krino { + +TEST(SingleElementFixture, LS_Element_Tet4) +{ + stk::topology tet4 = stk::topology::TETRAHEDRON_4; + SingleElementFixture test_fixture(tet4); + + test_fixture.generate_mesh(); + stk::mesh::MetaData & meta = test_fixture.stk_fixture.meta_data(); + stk::mesh::BulkData & bulk = test_fixture.stk_fixture.bulk_data(); + + const unsigned ndim = meta.spatial_dimension(); + const stk::mesh::FieldBase & coords_field = test_fixture.coord_field.field(); + const stk::mesh::FieldBase & scalar_field = test_fixture.scalar_field.field(); + + stk::mesh::Entity elem = test_fixture.my_elem; + const stk::mesh::Entity* elem_nodes = bulk.begin_nodes(elem); + const unsigned npe = bulk.num_nodes(elem); + + // Set coordinates + const double coords[4][3] = {{0.,0.,0.},{1.,0.,0.},{0.,1.,0.},{0.,0.,4.}}; + for (unsigned node=0; node(stk::mesh::field_data(coords_field, elem_nodes[node])); + for (unsigned dim=0; dim(stk::mesh::field_data(scalar_field, elem_nodes[node])); + *scalar_data = isovar[node]; + } + + // + // Create facets on 0 isosurface + // + + const double isoval = 0.0; + krino::ContourElement ls_elem( bulk, elem, coords_field, scalar_field, isoval ); + const double length_scale = 1.0; // Used for snapping facets to vertices of element when distance is small compared to length_scale + ls_elem.compute_subelement_decomposition(length_scale); + + Faceted_Surface faceted_surface("tmp"); + ls_elem.build_subelement_facets(faceted_surface); + const auto & facets = faceted_surface.get_facets(); + + ASSERT_EQ(1u, facets.size()); + + Facet & facet = *facets[0]; + + EXPECT_EQ(2.0, facet.facet_vertex(0)[2]); + EXPECT_EQ(2.0, facet.facet_vertex(1)[2]); + EXPECT_EQ(2.0, facet.facet_vertex(2)[2]); + + const Vector3d normal = facet.facet_normal(); + const double area = facet.facet_area(); + + EXPECT_EQ(0.0, normal[0]); + EXPECT_EQ(0.0, normal[1]); + EXPECT_EQ(1.0, normal[2]); + + EXPECT_EQ(0.125, area); +} + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Element.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Element.cpp new file mode 100644 index 000000000000..d799a4402563 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Element.cpp @@ -0,0 +1,718 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +template +class Mesh_Element_Fixture : public ::testing::Test +{ +public: + Mesh_Element_Fixture() : + elem_fixture(static_cast(TOPO)), + krino_mesh(elem_fixture.stk_fixture.bulk_data(), std::shared_ptr()), + interfaceGeometry(krino_mesh.get_active_part(),krino_mesh.get_cdfem_support(), krino_mesh.get_phase_support()) + { + elem_fixture.generate_mesh(); + check_entity_counts(); + Phase_Support::get(stk_meta()).add_decomposed_part(stk_meta().universal_part()); + Phase_Support::set_one_levelset_per_phase(false); + const NodeToCapturedDomainsMap nodesToCapturedDomains; + interfaceGeometry.prepare_to_process_elements(krino_mesh.stk_bulk(), nodesToCapturedDomains); + } + virtual ~Mesh_Element_Fixture() {}; + void check_entity_counts() + { + std::vector entities; + stk::mesh::get_entities(stk_bulk(), stk::topology::ELEMENT_RANK, entities); + ASSERT_EQ(1u, entities.size()); + stk::mesh::get_entities(stk_bulk(), stk::topology::NODE_RANK, entities); + ASSERT_EQ(elem_fixture.my_topology.num_nodes(), entities.size()); + } + stk::mesh::BulkData & stk_bulk() { return elem_fixture.stk_fixture.bulk_data(); } + stk::mesh::MetaData & stk_meta() { return elem_fixture.stk_fixture.meta_data(); } + stk::mesh::Entity elem() { return elem_fixture.my_elem; } + + unsigned node_ordinal(const stk::mesh::Entity node) + { + const stk::mesh::Entity * const elem_nodes = stk_bulk().begin_nodes(elem()); + const unsigned num_nodes = stk_bulk().num_nodes(elem()); + const stk::mesh::Entity * found = std::find(elem_nodes, elem_nodes+num_nodes, node); + return found - elem_nodes; + } + + void generate_nonconformal_elements() { + krino_mesh.generate_nonconformal_elements(); + } + void triangulate() + { + Mesh_Element & meshElem = get_mesh_element(); + meshElem.create_cutter(krino_mesh, interfaceGeometry); // update cutter with for edges that now have crossings found + get_mesh_element().create_cutter(krino_mesh, interfaceGeometry); + krino_mesh.triangulate(interfaceGeometry); + } + + LevelSetElementCutter & get_cutter() + { + Mesh_Element & meshElem = get_mesh_element(); + meshElem.create_cutter(krino_mesh, interfaceGeometry); + LevelSetElementCutter * cutter = dynamic_cast(meshElem.get_cutter()); + ThrowRequire(cutter); + return *cutter; + } + + void find_edge_crossings(const std::vector & node_LS_values) + { + std::vector > nodesIsovar(2); + LevelSetElementCutter & cutter = get_cutter(); + for (unsigned iEdge=0; iEdge > & node_LS_values) + { + std::vector > nodesIsovar(2); + LevelSetElementCutter & cutter = get_cutter(); + for (unsigned iEdge=0; iEdge & node_LS_values) + { + generate_nonconformal_elements(); + find_edge_crossings(node_LS_values); + triangulate(); + } + + void generate_mesh_element_and_cutter(const std::vector > & node_LS_values) + { + generate_nonconformal_elements(); + find_edge_crossings(node_LS_values); + triangulate(); + } + + Mesh_Element & get_mesh_element() { + return *krino_mesh.elements.front(); + } + + std::array get_edge_nodes(const unsigned edgeOrdinal) + { + const auto & nodes = get_mesh_element().get_nodes(); + const unsigned * edge_node_ordinals = get_edge_node_ordinals(elem_fixture.my_topology, edgeOrdinal); + return {{nodes[edge_node_ordinals[0]], nodes[edge_node_ordinals[1]]}}; + } + + Segment3d get_edge_segment(const unsigned edge_ord) + { + const auto & edgeNodes = get_edge_nodes(edge_ord); + return Segment3d(get_mesh_element().get_node_parametric_coords(edgeNodes[0]), + get_mesh_element().get_node_parametric_coords(edgeNodes[1])); + } + + SingleElementFixture elem_fixture; + CDMesh krino_mesh; + LevelSetInterfaceGeometry interfaceGeometry; +}; + +typedef Mesh_Element_Fixture Mesh_Element_Tri3; +TEST_F(Mesh_Element_Tri3, generate) +{ + generate_nonconformal_elements(); + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_EQ(elem(), mesh_elem.entity()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + ASSERT_EQ(3u, mesh_nodes.size()); + const stk::mesh::Entity * const elem_nodes = stk_bulk().begin_nodes(elem()); + for(unsigned i=0; i < mesh_nodes.size(); ++i) + { + EXPECT_EQ(mesh_nodes[i]->entity(), elem_nodes[i]); + } +} + +typedef Mesh_Element_Tri3 Mesh_Element_Tri3_One_LS; +TEST_F(Mesh_Element_Tri3_One_LS, All_Nodes_Positive) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + const std::vector node_LS_values(3, 1.); + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); + + for(unsigned i=0; i < mesh_elem.topology().num_edges(); ++i) + { + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(InterfaceID(0,0), get_edge_segment(i))); + } +} + +TEST_F(Mesh_Element_Tri3_One_LS, All_Nodes_Negative) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + const std::vector node_LS_values(3, -1.); + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); + + for(unsigned i=0; i < mesh_elem.topology().num_edges(); ++i) + { + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(InterfaceID(0,0), get_edge_segment(i))); + } +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_Pos_Node1_2_Neg) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 1.; + node_LS_values[1] = -0.5; + node_LS_values[2] = -0.5; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + EXPECT_DOUBLE_EQ(2./3., mesh_elem.interface_crossing_position(iface, get_edge_segment(0))); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(1))); + EXPECT_DOUBLE_EQ(1./3., mesh_elem.interface_crossing_position(iface, get_edge_segment(2))); +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_Snapped_Node1_2_Pos) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 0; + node_LS_values[1] = 1.; + node_LS_values[2] = 1.; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(0))); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(1))); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(2))); +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_Snapped_Node1_2_Neg) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 0; + node_LS_values[1] = -1.; + node_LS_values[2] = -1.; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + EXPECT_EQ( 0, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + // NOTE: Because we snap-away from nodes, crossing will be epsilon away from nodes. + EXPECT_NEAR(0., mesh_elem.interface_crossing_position(iface, get_edge_segment(0)), std::numeric_limits::epsilon()); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(1))); + EXPECT_NEAR(1., mesh_elem.interface_crossing_position(iface, get_edge_segment(2)), std::numeric_limits::epsilon()); +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_Snapped_Node1_Pos_Node_2_Neg) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 0; + // Crossing position 0.608351703529745 for edge 1 + // gives a test case that fails to intersect exactly with node 0 + node_LS_values[1] = 1.; + node_LS_values[2] = -(1/0.60835170352974499152765019971412 - 1.); + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + EXPECT_EQ( 0, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + // NOTE: Because we snap-away from nodes, crossing will be epsilon away from nodes. + EXPECT_DOUBLE_EQ(node_LS_values[1]/(node_LS_values[1] - node_LS_values[2]), mesh_elem.interface_crossing_position(iface, get_edge_segment(1))); + EXPECT_NEAR(1., mesh_elem.interface_crossing_position(iface, get_edge_segment(2)), std::numeric_limits::epsilon()); +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_1_Snapped_Node2_Pos) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 0; + node_LS_values[1] = 0; + node_LS_values[2] = 1.; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(0))); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(1))); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface, get_edge_segment(2))); +} + +TEST_F(Mesh_Element_Tri3_One_LS, Node0_1_Snapped_Node2_Neg) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + + std::vector node_LS_values(3); + node_LS_values[0] = 0; + node_LS_values[1] = 0; + node_LS_values[2] = -1.; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + EXPECT_EQ( 0, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ( 0, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + + // NOTE: Edge 0 is from nodes 0->1, Edge 1 is 1->2, Edge 2 is 2->0 + // TODO: What should intersections be for snapped edge? + // I don't think we should ever be looking for the interface crossing position of it + // NOTE: Because we snap-away from nodes, crossing will be epsilon away from nodes. + EXPECT_NEAR(0., mesh_elem.interface_crossing_position(iface, get_edge_segment(1)), std::numeric_limits::epsilon()); + EXPECT_NEAR(1., mesh_elem.interface_crossing_position(iface, get_edge_segment(2)), std::numeric_limits::epsilon()); +} + +typedef Mesh_Element_Tri3 Mesh_Element_Tri3_Three_LS; +TEST_F(Mesh_Element_Tri3_Three_LS, All_Phase2_Unsnapped) +{ + const LS_Field ls1("LS1", LevelSet_Identifier(1)); + const LS_Field ls2("LS2", LevelSet_Identifier(2)); + const LS_Field ls3("LS3", LevelSet_Identifier(3)); + CDFEM_Support & cdfem_supp = CDFEM_Support::get(elem_fixture.stk_fixture.meta_data()); + cdfem_supp.add_ls_field(ls1); + cdfem_supp.add_ls_field(ls2); + cdfem_supp.add_ls_field(ls3); + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + krino_mesh.add_interface_id(iface01); + krino_mesh.add_interface_id(iface02); + krino_mesh.add_interface_id(iface12); + Phase_Support::set_one_levelset_per_phase(true); + + std::vector > node_LS_values(3); + node_LS_values[0].resize(3); + node_LS_values[1].resize(3); + node_LS_values[2].resize(3); + // LS 0 + node_LS_values[0][0] = 1; + node_LS_values[1][0] = 1; + node_LS_values[2][0] = 1; + // LS 1 + node_LS_values[0][1] = 1; + node_LS_values[1][1] = 1; + node_LS_values[2][1] = 1; + // LS 2 + node_LS_values[0][2] = -1; + node_LS_values[1][2] = -1; + node_LS_values[2][2] = -1; + + generate_mesh_element_and_cutter(node_LS_values); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); +} + +TEST_F(Mesh_Element_Tri3_Three_LS, One_Interface) +{ + const LS_Field ls1("LS1", LevelSet_Identifier(1)); + const LS_Field ls2("LS2", LevelSet_Identifier(2)); + const LS_Field ls3("LS3", LevelSet_Identifier(3)); + CDFEM_Support & cdfem_supp = CDFEM_Support::get(elem_fixture.stk_fixture.meta_data()); + cdfem_supp.add_ls_field(ls1); + cdfem_supp.add_ls_field(ls2); + cdfem_supp.add_ls_field(ls3); + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + krino_mesh.add_interface_id(iface01); + krino_mesh.add_interface_id(iface02); + krino_mesh.add_interface_id(iface12); + Phase_Support::set_one_levelset_per_phase(true); + + std::vector > node_LS_values(3); + node_LS_values[0].resize(3); + node_LS_values[1].resize(3); + node_LS_values[2].resize(3); + // LS 0 + node_LS_values[0][0] = 0.038335; + node_LS_values[1][0] = 0.014437; + node_LS_values[2][0] = -0.01288; + // LS 1 + node_LS_values[0][1] = 0.037250; + node_LS_values[1][1] = 0.070753; + node_LS_values[2][1] = 0.021996; + // LS 2 + node_LS_values[0][2] = 0.01; + node_LS_values[1][2] = 0.01; + node_LS_values[2][2] = 0.01; + + generate_mesh_element_and_cutter(node_LS_values); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + + const Vector3d node0_coords = mesh_nodes[0]->owner_coords(&mesh_elem); + const Vector3d node1_coords = mesh_nodes[1]->owner_coords(&mesh_elem); + const Vector3d node2_coords = mesh_nodes[2]->owner_coords(&mesh_elem); + const Segment3d edge0(node0_coords, node1_coords); + const Segment3d edge1(node1_coords, node2_coords); + const Segment3d edge2(node2_coords, node0_coords); + + krino_mesh.determine_node_signs(iface01); + + if (mesh_elem.have_interface(iface01)) + { + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[2]->get_node_sign()); + } + + krino_mesh.determine_node_signs(iface02); + + EXPECT_TRUE(mesh_elem.have_interface(iface02)); + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + + krino_mesh.determine_node_signs(iface12); + + if (mesh_elem.have_interface(iface12)) + { + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[2]->get_node_sign()); + } + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge2)); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge2)); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge0)); +} + +TEST_F(Mesh_Element_Tri3_Three_LS, Handle_Hanging_Child) +{ + const LS_Field ls1("LS1", LevelSet_Identifier(1)); + const LS_Field ls2("LS2", LevelSet_Identifier(2)); + const LS_Field ls3("LS3", LevelSet_Identifier(3)); + CDFEM_Support & cdfem_supp = CDFEM_Support::get(elem_fixture.stk_fixture.meta_data()); + cdfem_supp.add_ls_field(ls1); + cdfem_supp.add_ls_field(ls2); + cdfem_supp.add_ls_field(ls3); + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + krino_mesh.add_interface_id(iface01); + krino_mesh.add_interface_id(iface02); + krino_mesh.add_interface_id(iface12); + Phase_Support::set_one_levelset_per_phase(true); + + std::vector > node_LS_values(3); + node_LS_values[0].resize(3); + node_LS_values[1].resize(3); + node_LS_values[2].resize(3); + // LS 0 + node_LS_values[0][0] = 0.04; + node_LS_values[1][0] = 0.015; + node_LS_values[2][0] = 0.025; + // LS 1 + node_LS_values[0][1] = 0.; + node_LS_values[1][1] = 0.02; + node_LS_values[2][1] = 0.02; + // LS 2 + node_LS_values[0][2] = 0.01; + node_LS_values[1][2] = 0.01; + node_LS_values[2][2] = 0.01; + + generate_mesh_element_and_cutter(node_LS_values); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + + const Vector3d node0_coords = mesh_nodes[0]->owner_coords(&mesh_elem); + const Vector3d node1_coords = mesh_nodes[1]->owner_coords(&mesh_elem); + const Vector3d node2_coords = mesh_nodes[2]->owner_coords(&mesh_elem); + const Segment3d edge0(node0_coords, node1_coords); + const Segment3d edge1(node1_coords, node2_coords); + const Segment3d edge2(node2_coords, node0_coords); + + krino_mesh.determine_node_signs(iface01); + + if (mesh_elem.have_interface(iface01)) + { + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[2]->get_node_sign()); + } + + krino_mesh.determine_node_signs(iface02); + + if (mesh_elem.have_interface(iface02)) + { + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[2]->get_node_sign()); + }; + + krino_mesh.determine_node_signs(iface12); + + EXPECT_TRUE(mesh_elem.have_interface(iface12)); + EXPECT_EQ(-1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[2]->get_node_sign()); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge2)); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge2)); + + EXPECT_DOUBLE_EQ(0.5, mesh_elem.interface_crossing_position(iface12, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge1)); + EXPECT_DOUBLE_EQ(0.5, mesh_elem.interface_crossing_position(iface12, edge2)); +} + +TEST_F(Mesh_Element_Tri3_Three_LS, Zero_Crossings_For_Phases_Present_Bug) +{ + const LS_Field ls1("LS1", LevelSet_Identifier(1)); + const LS_Field ls2("LS2", LevelSet_Identifier(2)); + const LS_Field ls3("LS3", LevelSet_Identifier(3)); + CDFEM_Support & cdfem_supp = CDFEM_Support::get(elem_fixture.stk_fixture.meta_data()); + cdfem_supp.add_ls_field(ls1); + cdfem_supp.add_ls_field(ls2); + cdfem_supp.add_ls_field(ls3); + const InterfaceID iface01(0,1); + const InterfaceID iface02(0,2); + const InterfaceID iface12(1,2); + krino_mesh.add_interface_id(iface01); + krino_mesh.add_interface_id(iface02); + krino_mesh.add_interface_id(iface12); + Phase_Support::set_one_levelset_per_phase(true); + + std::vector > node_LS_values(4); + node_LS_values[0].resize(3); + node_LS_values[1].resize(3); + node_LS_values[2].resize(3); + node_LS_values[3].resize(3); + // Node 0 + node_LS_values[0][0] = -0.00765969; + node_LS_values[0][1] = 0.532721; + node_LS_values[0][2] = 0.; + // Node 1 + node_LS_values[1][0] = -0.000100754; + node_LS_values[1][1] = 0.; + node_LS_values[1][2] = 0.; + // Node 2 + node_LS_values[2][0] = -0.00666939; + node_LS_values[2][1] = 0.337202; + node_LS_values[2][2] = 0.; + // Node 3 (Mid-node for edge 1) + node_LS_values[3][0] = -2.76e-6; + node_LS_values[3][1] = -0.00614775; + node_LS_values[3][2] = 0.; + + generate_mesh_element_and_cutter(node_LS_values); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_FALSE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + EXPECT_EQ(3u, mesh_nodes.size()); + + const Vector3d node0_coords = mesh_nodes[0]->owner_coords(&mesh_elem); + const Vector3d node1_coords = mesh_nodes[1]->owner_coords(&mesh_elem); + const Vector3d node2_coords = mesh_nodes[2]->owner_coords(&mesh_elem); + const Segment3d edge0(node0_coords, node1_coords); + const Segment3d edge1(node1_coords, node2_coords); + const Segment3d edge2(node2_coords, node0_coords); + + krino_mesh.determine_node_signs(iface01); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface01, edge2)); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface02, edge2)); + + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge0)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge1)); + EXPECT_ANY_THROW(mesh_elem.interface_crossing_position(iface12, edge2)); +} + +typedef Mesh_Element_Fixture Mesh_Element_Tet4; +TEST_F(Mesh_Element_Tet4, generate) +{ + generate_nonconformal_elements(); + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_EQ(elem(), mesh_elem.entity()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + ASSERT_EQ(4u, mesh_nodes.size()); + const stk::mesh::Entity * const elem_nodes = stk_bulk().begin_nodes(elem()); + for(unsigned i=0; i < mesh_nodes.size(); ++i) + { + EXPECT_EQ(mesh_nodes[i]->entity(), elem_nodes[i]); + } +} + +TEST_F(Mesh_Element_Tet4, OneInterfaceCheckNodeScore) +{ + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + Phase_Support::set_one_levelset_per_phase(false); + + std::vector node_LS_values(4); + node_LS_values[0] = 1.; + node_LS_values[1] = -0.2; + node_LS_values[2] = -0.5; + node_LS_values[3] = -0.8; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + ASSERT_EQ(4u, mesh_nodes.size()); + EXPECT_EQ(+1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[3]->get_node_sign()); + + krino_mesh.decompose_edges(iface); + krino_mesh.determine_node_scores(iface); + + EXPECT_GT(mesh_nodes[0]->get_node_score(), mesh_nodes[3]->get_node_score()); + EXPECT_GT(mesh_nodes[3]->get_node_score(), mesh_nodes[2]->get_node_score()); + EXPECT_GT(mesh_nodes[2]->get_node_score(), mesh_nodes[1]->get_node_score()); +} + +TEST_F(Mesh_Element_Tet4, OneInterfaceCheckNodeScore_ScoreBasedOnAngleNotPosition) +{ + krino_mesh.get_cdfem_support().set_simplex_generation_method(CUT_QUADS_BY_LARGEST_ANGLE); + + const InterfaceID iface(0,0); + krino_mesh.add_interface_id(iface); + Phase_Support::set_one_levelset_per_phase(false); + + std::vector node_LS_values(4); + node_LS_values[0] = -1.0; + node_LS_values[1] = -1.01; + node_LS_values[2] = -1.02; + node_LS_values[3] = 1.0; + + generate_mesh_element_and_cutter(node_LS_values); + krino_mesh.determine_node_signs(iface); + + Mesh_Element & mesh_elem = get_mesh_element(); + EXPECT_TRUE(mesh_elem.have_interface()); + const NodeVec & mesh_nodes = mesh_elem.get_nodes(); + ASSERT_EQ(4u, mesh_nodes.size()); + EXPECT_EQ(-1, mesh_nodes[0]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[1]->get_node_sign()); + EXPECT_EQ(-1, mesh_nodes[2]->get_node_sign()); + EXPECT_EQ(+1, mesh_nodes[3]->get_node_sign()); + + krino_mesh.decompose_edges(iface); + krino_mesh.determine_node_scores(iface); + + EXPECT_GT(mesh_nodes[0]->get_node_score(), mesh_nodes[1]->get_node_score()); + EXPECT_GT(mesh_nodes[0]->get_node_score(), mesh_nodes[2]->get_node_score()); + EXPECT_GT(mesh_nodes[2]->get_node_score(), mesh_nodes[1]->get_node_score()); +} + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Element_Cutter.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Element_Cutter.cpp new file mode 100644 index 000000000000..b44c1914a3c8 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Element_Cutter.cpp @@ -0,0 +1,188 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace krino +{ + +static std::function &)> +build_always_false_diagonal_picker() +{ + auto diagonalPicker = + [](const std::array & faceNodes) + { + return false; + }; + return diagonalPicker; +} + +static void build_simple_parent_edges(const stk::topology topology, + const std::vector & nodeIds, + const std::vector> & nodalIsovars, + ParentEdgeMap & parentEdges, + std::vector & elementParentEdges, + std::vector & areParentEdgesAreOrientedSameAsElementEdges) +{ + const unsigned numEdges = topology.num_edges(); + + elementParentEdges.clear(); + for(unsigned i=0; i < numEdges; ++i) + { + const unsigned * edgeLNN = get_edge_node_ordinals(topology, i); + const unsigned i0 = edgeLNN[0]; + const unsigned i1 = edgeLNN[1]; + const ParentEdgeKey edge_key(nodeIds[i0], nodeIds[i1]); + CDFEM_Parent_Edge & parentEdge = parentEdges[edge_key]; + + if(!parentEdge.valid()) + parentEdge = CDFEM_Parent_Edge({nodalIsovars[i0], nodalIsovars[i1]}); + + elementParentEdges.push_back(&parentEdge); + } + + areParentEdgesAreOrientedSameAsElementEdges.clear(); + areParentEdgesAreOrientedSameAsElementEdges.resize(numEdges, true); +} + +struct ElementWithCutter : public ::testing::Test +{ + ElementWithCutter() {} + + void build_parent_edges_and_cutter(const stk::topology topology, + const std::vector & nodeIds, + const std::vector > & nodalIsovars) + { + Phase_Support::set_one_levelset_per_phase(true); + const auto diagonalPicker = build_always_false_diagonal_picker(); + + const MasterElement & masterElem = MasterElementDeterminer::getMasterElement(topology); + + std::vector elementParentEdges; + std::vector areParentEdgesAreOrientedSameAsElementEdges; + + build_simple_parent_edges(topology, nodeIds, nodalIsovars, parentEdges, elementParentEdges, areParentEdgesAreOrientedSameAsElementEdges); + + cutter.reset( new One_LS_Per_Phase_Cutter(masterElem, elementParentEdges, areParentEdgesAreOrientedSameAsElementEdges, diagonalPicker) ); + } + + ParentEdgeMap parentEdges; + CDFEM_Snapper snapper; + std::unique_ptr cutter; +}; + +struct TriangleWithTriplePoint : public ElementWithCutter +{ + const stk::topology topology{stk::topology::TRIANGLE_3_2D}; + const std::vector > nodalIsovars{ {-1., 0., 0.}, {0., -1., 0.}, {1.,1.,0.} }; + const std::vector nodeIds{1,2,3}; + + const InterfaceID iface01{0,1}; + const InterfaceID iface02{0,2}; + const InterfaceID iface12{1,2}; +}; + +struct TriangleWithFakeTriplePoint : public ElementWithCutter +{ + const stk::topology topology{stk::topology::TRIANGLE_3_2D}; + const std::vector > nodalIsovars{ {2., 2.,-1., 0.}, {-1.,0.5, 2., 0.}, {0.5, -1., 2., 0.} }; + const std::vector nodeIds{1,2,3}; +}; + +TEST_F(TriangleWithTriplePoint, givenCutter_haveExpectedInterfaces) +{ + build_parent_edges_and_cutter(topology, nodeIds, nodalIsovars); + + std::vector interfacesWithCuttingSurface; + cutter->fill_interfaces_with_cutting_surface(interfacesWithCuttingSurface); + EXPECT_EQ(3u, interfacesWithCuttingSurface.size()); + + EXPECT_TRUE(cutter->have_cutting_surface(iface01)); + EXPECT_TRUE(cutter->have_cutting_surface(iface02)); + EXPECT_TRUE(cutter->have_cutting_surface(iface12)); +} + +static bool is_nearly_eq(const Vector3d & v0, const Vector3d & v1, const double relativeTol=1.e-6) +{ + const double absoluteTol = relativeTol * (v0.length() + v1.length()); + for (int i=0; i<3; ++i) + if (std::abs(v0[i]-v1[i]) > absoluteTol) return false; + return true; +} + +void expect_to_find_all_first_in_second(const std::vector & vec0, const std::vector & vec1, const std::string & errorMsg) +{ + for (auto && val0 : vec0) + { + bool found = false; + for (auto && val1 : vec1) + { + if (is_nearly_eq(val0.parametricCoords, val1.parametricCoords) && val0.sortedDomains == val1.sortedDomains) + { + found = true; + break; + } + } + EXPECT_TRUE(found) << errorMsg << val0; + } +} + +void expect_num_interfaces_with_cutting_surface(size_t goldNumInterfacesWithCuttingSurfaces, const Element_Cutter & cutter) +{ + std::vector interfacesWithCuttingSurface; + cutter.fill_interfaces_with_cutting_surface(interfacesWithCuttingSurface); + EXPECT_EQ(goldNumInterfacesWithCuttingSurfaces, interfacesWithCuttingSurface.size()); +} + +void expect_intersections(const std::vector & goldIntersections, const std::vector & actualIntersections) +{ + EXPECT_EQ(goldIntersections.empty(), actualIntersections.empty()); + expect_to_find_all_first_in_second(actualIntersections, goldIntersections, "Actual intersection not found in gold intersections: "); + expect_to_find_all_first_in_second(goldIntersections, actualIntersections, "Gold intersection not found in actual intersections: "); +} + +TEST_F(TriangleWithTriplePoint, whenFindingIntersectionPoints_findPointAtCentroid) +{ + build_parent_edges_and_cutter(topology, nodeIds, nodalIsovars); + + std::vector triangleIntersections; + cutter->fill_interior_intersections(triangleIntersections); + + const std::vector goldIntersections{ {Vector3d{1./3.,1./3.,0.}, std::vector{0,1,2}} }; + expect_intersections(goldIntersections, triangleIntersections); +} + +TEST_F(TriangleWithFakeTriplePoint, whenFindingIntersectionPoints_findCorrectPoints) +{ + build_parent_edges_and_cutter(topology, nodeIds, nodalIsovars); + + std::vector triangleIntersections; + cutter->fill_interior_intersections(triangleIntersections); + + expect_num_interfaces_with_cutting_surface(4u, *cutter); + + const std::vector goldIntersections{ {Vector3d{4./9., 4./9., 0.}, std::vector{0,1,3}} }; + expect_intersections(goldIntersections, triangleIntersections); +} + + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Explicit_Hamilton_Jacobi.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Explicit_Hamilton_Jacobi.cpp new file mode 100644 index 000000000000..33e73c71a2e4 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Explicit_Hamilton_Jacobi.cpp @@ -0,0 +1,903 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace krino { + +struct ProblemFields +{ + stk::mesh::Field * levelSetField = nullptr; + stk::mesh::Field * coordsField = nullptr; + stk::mesh::Field * RHS = nullptr; + stk::mesh::Field * RHSNorm = nullptr; + stk::mesh::Field * speedField = nullptr; +}; + +void associate_input_mesh(stk::io::StkMeshIoBroker & stkIo, const std::string & meshName) +{ + stkIo.property_add(Ioss::Property("DECOMPOSITION_METHOD", "RIB")); + stkIo.add_mesh_database(meshName, stk::io::READ_MESH); + stkIo.create_input_mesh(); +} + +stk::mesh::BulkData & read_mesh(stk::io::StkMeshIoBroker & stkIo) +{ + stkIo.populate_bulk_data(); + return stkIo.bulk_data(); +} + +void declare_fields(stk::mesh::MetaData & meta, ProblemFields & fields) +{ + fields.levelSetField = &meta.declare_field>(stk::topology::NODE_RANK, "LevelSet", 2); + stk::mesh::put_field_on_mesh(*fields.levelSetField, meta.universal_part(), nullptr); + fields.RHS = &meta.declare_field>(stk::topology::NODE_RANK, "RHS", 1); + stk::mesh::put_field_on_mesh(*fields.RHS, meta.universal_part(), nullptr); + fields.RHSNorm = &meta.declare_field>(stk::topology::NODE_RANK, "RHSNorm", 1); + stk::mesh::put_field_on_mesh(*fields.RHSNorm, meta.universal_part(), nullptr); + auto constCoordsField = static_cast*>(meta.coordinate_field()); + fields.coordsField = const_cast*>(constCoordsField); + + if (true) + { + fields.speedField = &meta.declare_field>(stk::topology::ELEMENT_RANK, "Speed", 1); + stk::mesh::put_field_on_mesh(*fields.speedField, meta.universal_part(), nullptr); + } +} + +const int TetFaceTable[4][3] = { {0, 1, 2}, + {1, 2, 3}, + {0, 2, 3}, + {0, 1, 3} }; + +const int TetEdgeNodeOrder[6][2] = // [edge][edge_node] + { {0,1}, {1,2}, {2,0}, {0,3}, {1,3}, {2,3} }; + +void initialize_level_set(const stk::mesh::BulkData & mesh, const ProblemFields & fields, std::function initial_level_set, const double multiplier = 1.0) +{ + for (auto & bptr : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto & node : *bptr) + { + const double * x = stk::mesh::field_data(*fields.coordsField, node); + double* LS = stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateNP1), node); + *LS = initial_level_set(x) * multiplier; + } + } +} + +double initialize_constant_speed(const stk::mesh::BulkData & mesh, const ProblemFields & fields, const double speed) +{ + stk::mesh::field_fill(speed, *fields.speedField); + return speed; +} + +double compute_tet_vol(const stk::mesh::Entity * elemNodes, const stk::mesh::Field & coordsField) +{ + std::array xNode; + for (int n=0; n<4; ++n) xNode[n] = Vector3d(stk::mesh::field_data(coordsField, elemNodes[n])); + + return Dot(xNode[1]-xNode[0],Cross(xNode[2]-xNode[0],xNode[3]-xNode[0]))/6.; +} + +double compute_tri_vol(const stk::mesh::Entity * elemNodes, const stk::mesh::Field & coordsField) +{ + std::array xNode; + for (int n=0; n<3; ++n) xNode[n] = Vector3d(stk::mesh::field_data(coordsField, elemNodes[n]),2); + + return 0.5*Cross(xNode[1]-xNode[0],xNode[2]-xNode[0]).length(); +} + +double compute_vol(const stk::mesh::Entity * elemNodes, const unsigned numElemNodes, const stk::mesh::Field & coordsField) +{ + if (numElemNodes == 3) + return compute_tri_vol(elemNodes, coordsField); + else + return compute_tet_vol(elemNodes, coordsField); +} + +void compute_tet_gradOP_and_vol(const stk::mesh::Entity * elemNodes, const stk::mesh::Field & coordsField, std::vector & gradOP, double & vol) +{ + std::array xNode; + for (int n=0; n<4; ++n) xNode[n] = Vector3d(stk::mesh::field_data(coordsField, elemNodes[n])); + + std::array xFace; + for (int f=0; f<4; ++f) xFace[f] = (xNode[TetFaceTable[f][0]]+xNode[TetFaceTable[f][1]]+xNode[TetFaceTable[f][2]])/3.; + + std::array xEdge; + for (int e=0; e<6; ++e) xEdge[e] = 0.5*(xNode[TetEdgeNodeOrder[e][0]]+xNode[TetEdgeNodeOrder[e][1]]); + + vol = Dot(xNode[1]-xNode[0],Cross(xNode[2]-xNode[0],xNode[3]-xNode[0]))/6.; + const double norm = 0.5/vol; + + gradOP[0] = (Cross(xEdge[3]-xEdge[0],xNode[0]-xFace[3])+ + Cross(xEdge[2]-xEdge[3],xNode[0]-xFace[2])+ + Cross(xEdge[0]-xEdge[2],xNode[0]-xFace[0]))*norm; + gradOP[1] = (Cross(xEdge[0]-xEdge[4],xNode[1]-xFace[3])+ + Cross(xEdge[1]-xEdge[0],xNode[1]-xFace[0])+ + Cross(xEdge[4]-xEdge[1],xNode[1]-xFace[1]))*norm; + gradOP[2] = (Cross(xEdge[2]-xEdge[1],xNode[2]-xFace[0])+ + Cross(xEdge[5]-xEdge[2],xNode[2]-xFace[2])+ + Cross(xEdge[1]-xEdge[5],xNode[2]-xFace[1]))*norm; + gradOP[3] = (Cross(xEdge[5]-xEdge[4],xNode[3]-xFace[1])+ + Cross(xEdge[3]-xEdge[5],xNode[3]-xFace[2])+ + Cross(xEdge[4]-xEdge[3],xNode[3]-xFace[3]))*norm; +} + +void compute_tri_gradOP_and_vol(const stk::mesh::Entity * elemNodes, const stk::mesh::Field & coordsField, std::vector & gradOP, double & vol) +{ + std::array xNode; + for (int n=0; n<3; ++n) xNode[n] = Vector3d(stk::mesh::field_data(coordsField, elemNodes[n]),2); + + vol = 0.5*Cross(xNode[1]-xNode[0],xNode[2]-xNode[0]).length(); + const double norm = 0.5/vol; + + gradOP[0] = (crossZ(xNode[0]-xNode[2])+crossZ(xNode[1]-xNode[0]))*norm; + gradOP[1] = (crossZ(xNode[1]-xNode[0])+crossZ(xNode[2]-xNode[1]))*norm; + gradOP[2] = (crossZ(xNode[2]-xNode[1])+crossZ(xNode[0]-xNode[2]))*norm; +} + +void compute_gradOP_and_vol(const stk::mesh::Entity * elemNodes, const stk::mesh::Field & coordsField, std::vector & gradOP, double &vol) +{ + if (gradOP.size() == 3) + compute_tri_gradOP_and_vol(elemNodes, coordsField, gradOP, vol); + else + compute_tet_gradOP_and_vol(elemNodes, coordsField, gradOP, vol); +} + +Vector3d compute_scalar_gradient(const std::vector & nodalAreaVectors, const stk::mesh::Entity * elemNodes, const stk::mesh::Field & levelSetField) +{ + Vector3d grad(Vector3d::ZERO); + for (unsigned i=0; i & coordsField) +{ + const unsigned nodesPerElem = mesh.mesh_meta_data().spatial_dimension() + 1; + + double minVol = std::numeric_limits::max(); + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + minVol = std::min(minVol, compute_vol(elemNodes, nodesPerElem, coordsField)); + } + } + + return std::pow(minVol, 1./mesh.mesh_meta_data().spatial_dimension()); +} + +double mesh_minimum_length_scale(const stk::mesh::BulkData & mesh, const stk::mesh::Field & coordsField) +{ + const unsigned dim = mesh.mesh_meta_data().spatial_dimension(); + std::vector gradOP(dim+1); + + double vol = 0.; + double maxGradLength = 0.; + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + compute_gradOP_and_vol(elemNodes, coordsField, gradOP, vol); + for (unsigned n=0; n gradOP(dim+1); + + stk::mesh::field_fill(0.0, *fields.RHS); + stk::mesh::field_fill(0.0, *fields.RHSNorm); + + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const unsigned numElemNodes = mesh.num_nodes(elem); + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + double vol = 0.; + compute_gradOP_and_vol(elemNodes, *fields.coordsField, gradOP, vol); + const Vector3d normalDir = compute_scalar_gradient(gradOP, elemNodes, fields.levelSetField->field_of_state(stk::mesh::StateN)).unit_vector(); + + const double elementSpeed = *stk::mesh::field_data(*fields.speedField, elem); + + std::vector volHamiltonianCoeffs(dim+1); // K_i in Barth-Sethian + double sumNegCoeffs = 0.; + double sumPosCoeffs = 0.; + double sumNegContrib = 0.; + double volHamiltonian = 0.; + for (unsigned n=0; nfield_of_state(stk::mesh::StateN), node); + volHamiltonianCoeffs[n] = elementSpeed*vol*Dot(normalDir, gradOP[n]); + volHamiltonian += volHamiltonianCoeffs[n] * LSOld; + + if (volHamiltonianCoeffs[n] < 0.) + { + sumNegCoeffs += volHamiltonianCoeffs[n]; + sumNegContrib += volHamiltonianCoeffs[n] * LSOld; + } + else + { + sumPosCoeffs += volHamiltonianCoeffs[n]; + } + } + + std::vector alpha(dim+1, 0.); // delta phi_i in Barth-Sethian + double sumPosAlpha = 0.; + for (unsigned n=0; nfield_of_state(stk::mesh::StateN), node); + if (volHamiltonianCoeffs[n] > 0.) + { + alpha[n] = volHamiltonianCoeffs[n]/sumPosCoeffs*(sumNegContrib-sumNegCoeffs*LSOld)/volHamiltonian; + if (alpha[n] > 0.) sumPosAlpha += alpha[n]; + } + } + + for (unsigned n=0; n 0.) + { + const double wt = alpha[n]/sumPosAlpha; + residual += wt * volHamiltonian; + residualNorm += wt*vol; + } + } + } + } +} + +void assemble_residual_for_nodal_speed(const stk::mesh::BulkData & mesh, const ProblemFields & fields, const double eps) +{ + // Not extensively tested. This is an adaptation of Barth-Sethian positive coefficient scheme for nodal speed fields + + const unsigned dim = mesh.mesh_meta_data().spatial_dimension(); + std::vector gradOP(dim+1); + + stk::mesh::field_fill(0.0, *fields.RHS); + stk::mesh::field_fill(0.0, *fields.RHSNorm); + + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const unsigned numElemNodes = mesh.num_nodes(elem); + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + double vol = 0.; + compute_gradOP_and_vol(elemNodes, *fields.coordsField, gradOP, vol); + const Vector3d normalDir = compute_scalar_gradient(gradOP, elemNodes, fields.levelSetField->field_of_state(stk::mesh::StateN)).unit_vector(); + + for (unsigned n=0; nfield_of_state(stk::mesh::StateN), elemNodes[n]); + + //const double nodalSpeed = *stk::mesh::field_data(fields.speed, node); + const double nodalSpeed = 1.0; + + const double volHamiltonianCoeffs_n = vol*nodalSpeed*Dot(normalDir, gradOP[n]); // K_n in Barth-Sethian, probably should use nodal volume not elem volume + + if (volHamiltonianCoeffs_n > 0.) + { + double sumNegCoeffs = 0.; + double sumPosCoeffs = 0.; + double sumNegContrib = 0.; + double volHamiltonian = 0.; + for (unsigned j=0; jfield_of_state(stk::mesh::StateN), elemNodes[j]); + const double volHamiltonianCoeffs_j = vol*nodalSpeed*Dot(normalDir, gradOP[j]); + volHamiltonian += volHamiltonianCoeffs_j * LSOldj; + + if (volHamiltonianCoeffs_j < 0.) + { + sumNegCoeffs += volHamiltonianCoeffs_j; + sumNegContrib += volHamiltonianCoeffs_j * LSOldj; + } + else + { + sumPosCoeffs += volHamiltonianCoeffs_j; + } + } + + const double wt = volHamiltonianCoeffs_n/sumPosCoeffs*(sumNegContrib-sumNegCoeffs*LSOld)/volHamiltonian; + if (wt > 0.) + { + double & residual = *stk::mesh::field_data(*fields.RHS, node); + double & residualNorm = *stk::mesh::field_data(*fields.RHSNorm, node); + residual += wt * volHamiltonian; + residualNorm += wt*vol; + } + } + } + } + } +} + +double assemble_and_update_Eikonal(const stk::mesh::BulkData & mesh, const ProblemFields & fields, const double eps, const double dt, const bool computeArrivalTime) +{ + // This is a hybrid between the Barth-Sethian positive coefficient scheme and the Morgan-Waltz scheme for reinitialization. + // Uses element based speed and nodal sign function to assemble nodal contributions for Hamiltonian. + // The assembled nodal Hamiltonian is then used with nodal source term to explicitly update signed distance + // (or arrival time for non-unit speed). + // Unlike the elemental algorithm developed by Barth-Sethian, this algorithm converges to the exact solution + // for the "Distance Function Test" described in Morgan-Waltz. Unlike the Morgan-Waltz algorithm, this + // form converges much faster and is tolerant of meshes with obtuse angles because it uses the positive coefficient + // form in Barth-Sethian. + assert(!computeArrivalTime || nullptr != fields.speedField); + + const unsigned dim = mesh.mesh_meta_data().spatial_dimension(); + std::vector gradOP(dim+1); + + stk::mesh::field_fill(0.0, *fields.RHS); + stk::mesh::field_fill(0.0, *fields.RHSNorm); + + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const unsigned numElemNodes = mesh.num_nodes(elem); + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + double vol = 0.; + compute_gradOP_and_vol(elemNodes, *fields.coordsField, gradOP, vol); + const Vector3d normalDir = compute_scalar_gradient(gradOP, elemNodes, fields.levelSetField->field_of_state(stk::mesh::StateN)).unit_vector(); + + double elementSpeed = 1.0; + if (computeArrivalTime) + { + elementSpeed = *stk::mesh::field_data(*fields.speedField, elem); + } + + for (unsigned n=0; nfield_of_state(stk::mesh::StateN), elemNodes[n]); + + double nodalSpeed = 0.; + + const double sign = LSOld/sqrt(LSOld*LSOld + eps*eps); + nodalSpeed = sign*elementSpeed; + + const double volHamiltonianCoeffs_n = vol*nodalSpeed*Dot(normalDir, gradOP[n]); // K_n in Barth-Sethian, probably should use nodal volume not elem volume + + if (volHamiltonianCoeffs_n > 0.) + { + double sumNegCoeffs = 0.; + double sumPosCoeffs = 0.; + double sumNegContrib = 0.; + double volHamiltonian = 0.; + for (unsigned j=0; jfield_of_state(stk::mesh::StateN), elemNodes[j]); + const double volHamiltonianCoeffs_j = vol*nodalSpeed*Dot(normalDir, gradOP[j]); + volHamiltonian += volHamiltonianCoeffs_j * LSOldj; + + if (volHamiltonianCoeffs_j < 0.) + { + sumNegCoeffs += volHamiltonianCoeffs_j; + sumNegContrib += volHamiltonianCoeffs_j * LSOldj; + } + else + { + sumPosCoeffs += volHamiltonianCoeffs_j; + } + } + + const double wt = volHamiltonianCoeffs_n/sumPosCoeffs*(sumNegContrib-sumNegCoeffs*LSOld)/volHamiltonian; + if (wt > 0.) + { + double & residual = *stk::mesh::field_data(*fields.RHS, node); + double & residualNorm = *stk::mesh::field_data(*fields.RHSNorm, node); + residual += wt * volHamiltonian; + residualNorm += wt*vol; + } + } + } + } + } + + double sumSqrResid = 0.; + size_t sumCount = 0; + + for (auto & bptr : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto & node : *bptr) + { + const double residField = *stk::mesh::field_data(*fields.RHS, node); + const double residNormField = *stk::mesh::field_data(*fields.RHSNorm, node); + + const double Hamiltonian = (residNormField > 0.) ? (residField/residNormField) : 0.; + + const double LSOld = *stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateN), node); + double & LS = *stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateNP1), node); + const double sign = LSOld/sqrt(LSOld*LSOld + eps*eps); + + LS = LSOld - dt * (Hamiltonian - sign); + + if (computeArrivalTime || std::abs(LSOld) < eps) + { + sumSqrResid += (Hamiltonian - sign)*(Hamiltonian - sign); + sumCount++; + } + } + } + return std::sqrt(sumSqrResid/sumCount); +} + + +double apply_level_set_update(const stk::mesh::BulkData & mesh, const ProblemFields & fields, const double eps, const double dt) +{ + double sumResid = 0.; + size_t sumCount = 0; + + for (auto & bptr : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto & node : *bptr) + { + const double residField = *stk::mesh::field_data(*fields.RHS, node); + const double residNormField = *stk::mesh::field_data(*fields.RHSNorm, node); + + const double resid = (residNormField > 0.) ? (residField/residNormField) : 0.; + + const double LSOld = *stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateN), node); + double & LS = *stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateNP1), node); + + LS = LSOld - dt * resid; + + if (std::abs(LSOld) < eps) + { + sumResid += std::abs(resid); + sumCount++; + } + } + } + return sumResid/sumCount; +} + +bool domain_contains_interface(const stk::mesh::BulkData & mesh, const stk::mesh::Field & levelSetField) +{ + bool hasNeg = false; + bool hasPos = false; + + for (auto & bptr : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto & node : *bptr) + { + const double LS = *stk::mesh::field_data(levelSetField, node); + + if (LS < 0.) hasNeg = true; + if (LS > 0.) hasPos = true; + + if (hasNeg && hasPos) return true; + } + } + return false; +} + +void evolve_level_set(const stk::mesh::BulkData & mesh, const ProblemFields & fields, const double eps, const double dt) +{ + assemble_residual_for_element_speed(mesh, fields, eps); + apply_level_set_update(mesh, fields, eps, dt); +} + +void reinitialize_level_set( + stk::mesh::BulkData & mesh, + const ProblemFields & fields, + const double eps, + const double dtau, + stk::io::StkMeshIoBroker * stkIo = nullptr, + const double outputStartTime = 0., + const double outputStopTime = 0., + const size_t outputFileIndex = 0) +{ + if (!domain_contains_interface(mesh, fields.levelSetField->field_of_state(stk::mesh::StateNP1))) + { + return; + } + + const double convergedTol = 0.01; + bool converged = false; + const int maxIters = 1000; + const int printFreq = 50; + const double dOutputTime = (outputStopTime-outputStartTime)/(maxIters+1); + for (int iter = 0; iterfield_of_state(stk::mesh::StateNP1))) + { + std::cout << "Error, input level set field does not contain zero level set for initializing arrival time calculation." << std::endl; + return; + } + + bool converged = false; + const int maxIters = 5000; + const int printFreq = 50; + for (int iter = 0; iter eps) return 1.; + + static const double pi = std::atan(1)*4; + return 0.5*(1+ signedDist/eps + std::sin(pi*signedDist/eps)/pi); +} + +double delta(const double signedDist, const double eps) +{ + if (signedDist < -eps || signedDist > eps) return 0.; + + static const double pi = std::atan(1)*4; + return 0.5/eps * (1. + std::cos(pi*signedDist/eps)); +} + +double compute_level_set_volume(stk::mesh::BulkData & mesh, const ProblemFields & fields, const double eps) +{ + double vol = 0.; + for (auto & bptr : mesh.buckets(stk::topology::ELEMENT_RANK)) + { + for (auto & elem : *bptr) + { + const unsigned numElemNodes = mesh.num_nodes(elem); + const stk::mesh::Entity * elemNodes = mesh.begin_nodes(elem); + + double avgLS = 0.; + for (unsigned n=0; nfield_of_state(stk::mesh::StateNP1), elemNodes[n]); + avgLS += LS/numElemNodes; + } + + vol += Heaviside(avgLS, eps) * compute_vol(elemNodes, numElemNodes, *fields.coordsField); + } + } + return vol; +} + +double compute_unit_radius_error_norm(stk::mesh::BulkData & mesh, const ProblemFields & fields) +{ + double norm = 0.; + unsigned normCount = 0; + for (auto & bptr : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto & node : *bptr) + { + double & LS = *stk::mesh::field_data(fields.levelSetField->field_of_state(stk::mesh::StateNP1), node); + const Vector3d x(stk::mesh::field_data(*fields.coordsField, node), mesh.mesh_meta_data().spatial_dimension()); + + const double error = LS - (x.length() - 1.0); + norm += std::abs(error); + ++normCount; + } + } + return norm/normCount; +} + +double poor_initial_condition_for_unit_circle(const double * x) +{ + return ((x[0]-1.)*(x[0]-1.)+(x[1]-1.)*(x[1]-1.)+0.1)*(std::sqrt(x[0]*x[0]+x[1]*x[1])-1.); +} + +double poor_initial_condition_for_unit_sphere(const double * x) +{ + return ((x[0]-1.)*(x[0]-1.)+(x[1]-1.)*(x[1]-1.)+(x[2]-1.)*(x[2]-1.)+0.1)*(std::sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2])-1.); +} + +double flower_2D(const double * x) +{ + const int Nlobes = 3; + const double r = std::sqrt(x[0]*x[0]+x[1]*x[1]); + const double theta = std::atan2(x[1],x[0]); + const double rSurf = 0.2 + 0.1*std::sin(Nlobes*theta); + return r-rSurf; +} + +TEST(HamiltonJacobi, 2DPoorInitialCondition_ComputingArrivalTimeProducesLowErrorEverywhere) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 1) return; + + stk::io::StkMeshIoBroker stkIo(pm); + ProblemFields fields; + + associate_input_mesh(stkIo, "square.g"); + declare_fields(stkIo.meta_data(),fields); + stk::mesh::BulkData & mesh = read_mesh(stkIo); + + initialize_level_set(mesh, fields, poor_initial_condition_for_unit_circle); + initialize_constant_speed(mesh, fields, 1.0); + + const double dx = mesh_minimum_length_scale(mesh, *fields.coordsField); + const double eps = 1.5*dx; // Should have same units as level set + const double dtau = 0.2*dx; // Reinitialization time step, based on unit advection speed used in reinitialization + + compute_arrival_time(mesh, fields, eps, dtau); + + const double errorNorm = compute_unit_radius_error_norm(mesh, fields); + std::cout << "Error norm " << errorNorm << std::endl; + EXPECT_LT(errorNorm, 0.001); +} + +TEST(HamiltonJacobi, 3DPoorInitialCondition_ComputingArrivalTimeProducesLowErrorEverywhere) +{ +#ifdef NDEBUG +#else + return; // Optimized only due to length +#endif + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 1) return; + + stk::io::StkMeshIoBroker stkIo(pm); + ProblemFields fields; + + associate_input_mesh(stkIo, "cube_coarse.g"); + declare_fields(stkIo.meta_data(),fields); + stk::mesh::BulkData & mesh = read_mesh(stkIo); + + initialize_level_set(mesh, fields, poor_initial_condition_for_unit_sphere); + initialize_constant_speed(mesh, fields, 1.0); + + const double dx = mesh_minimum_length_scale(mesh, *fields.coordsField); + const double eps = 1.5*dx; // Should have same units as level set + const double dtau = 0.2*dx; // Reinitialization time step, based on unit advection speed used in reinitialization + + compute_arrival_time(mesh, fields, eps, dtau); + + const double errorNorm = compute_unit_radius_error_norm(mesh, fields); + std::cout << "Error norm " << errorNorm << std::endl; + EXPECT_LT(errorNorm, 0.01); +} + +void test_circle_with_flower(const double speed) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 1) return; + + stk::io::StkMeshIoBroker stkIo(pm); + ProblemFields fields; + + associate_input_mesh(stkIo, "circle.g"); + declare_fields(stkIo.meta_data(),fields); + stk::mesh::BulkData & mesh = read_mesh(stkIo); + + const double maxSpeed = initialize_constant_speed(mesh, fields, speed); + initialize_level_set(mesh, fields, flower_2D, 1./maxSpeed); + + const double dx = mesh_minimum_length_scale(mesh, *fields.coordsField); + const double eps = 1.5*dx / maxSpeed; // Should have same units as level set + const double dtau = 0.2*dx / maxSpeed; // Units of time + + compute_arrival_time(mesh, fields, eps, dtau); +} + +TEST(HamiltonJacobi, CircleWithFlowerIC_ArrivalTimeConvergesForAnySpeed) +{ + // Probably would be better to test that these converge in exactly the same number of steps + test_circle_with_flower(1.0); + test_circle_with_flower(10.0); +} + +TEST(HamiltonJacobi, CircleWithFlowerIC_ReinitializationThenEvolveRuns) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 1) return; + + stk::io::StkMeshIoBroker stkIo(pm); + ProblemFields fields; + + associate_input_mesh(stkIo, "circle.g"); + declare_fields(stkIo.meta_data(), fields); + stk::mesh::BulkData & mesh = read_mesh(stkIo); + + std::string outputFileName = "circle_flower.e"; + auto outputFileIndex = create_mesh(outputFileName, stkIo); + + const double maxSpeed = initialize_constant_speed(mesh, fields, 5.0); + initialize_level_set(mesh, fields, flower_2D); + + const double Courant = 0.25; + const double Ttotal = 0.1; + const double dx = mesh_minimum_length_scale(mesh, *fields.coordsField); + const unsigned Nt = (Ttotal+0.5*(Courant*dx/maxSpeed))/(Courant*dx/maxSpeed); + const double dt = Ttotal/Nt; + const double eps = 1.5*dx; + const double dtau = 0.2*dx; // Reinitialization time step, based on unit advection speed used in reinitialization + + write_fields(stkIo, outputFileIndex, 0.0); + reinitialize_level_set(mesh, fields, eps, dtau, &stkIo, 0.0, dt, outputFileIndex); + + std::cout << "Evolving to time " << Ttotal << " with " << Nt << " steps with Courant number " << Courant << std::endl; + + double time = 0.0; + for (unsigned n=0; n 1) return; + + stk::io::StkMeshIoBroker stkIo(pm); + ProblemFields fields; + + associate_input_mesh(stkIo, "cylinder_coarse.g"); + declare_fields(stkIo.meta_data(), fields); + stk::mesh::BulkData & mesh = read_mesh(stkIo); + + std::string outputFileName = "cylinder_flower.e"; + auto outputFileIndex = create_mesh(outputFileName, stkIo); + + const double maxSpeed = initialize_constant_speed(mesh, fields, 5.0); + initialize_level_set(mesh, fields, flower_2D); + + const double Courant = 0.25; + const double Ttotal = 0.01; + const double dx = mesh_minimum_length_scale(mesh, *fields.coordsField); + const unsigned Nt = (Ttotal+0.5*(Courant*dx/maxSpeed))/(Courant*dx/maxSpeed); + const double dt = Ttotal/Nt; + const double eps = 1.5*dx; + const double dtau = 0.2*dx; // Reinitialization time step, based on unit advection speed used in reinitialization + + write_fields(stkIo, outputFileIndex, 0.0); + reinitialize_level_set(mesh, fields, eps, dtau, &stkIo, 0.0, dt, outputFileIndex); + + std::cout << "Evolving to time " << Ttotal << " with " << Nt << " steps with Courant number " << Courant << std::endl; + + double time = 0.0; + for (unsigned n=0; n + +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace krino +{ + +namespace { + int num_random_cases() { return 10000; } + double clip(const double in) { return std::floor(1000*in)/1000.; } +} // namespace + +TEST(Plane_Cutting_Surface, random_edge_cuts) +{ + const bool debug_output = false; + const Vector3d plane_pt0(0., 0., 0.); + const Vector3d plane_pt1(1., 0., 0.); + const Vector3d plane_pt2(0., 1., 0.); + Plane_Cutting_Surface surf(plane_pt0, plane_pt1, plane_pt2); + + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_rank = stk::parallel_machine_rank(pm); + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution coord(-1., 1.); + + const int num_cases = num_random_cases(); + for (int icase=0; icase::epsilon()); + } + else + { + EXPECT_ANY_THROW(surf.interface_crossing_position(segment)); + } + } +} + +TEST(Intersecting_Planes_Cutting_Surface, planar_with_random_edge_cuts) +{ + const Vector3d plane_pt0(0., 0., 0.); + const Vector3d plane_pt1(1., 0., 0.); + const Vector3d plane_pt2(1., 1., 0.); + const Vector3d plane_pt3(0., 1., 0.); + Intersecting_Planes_Cutting_Surface surf(plane_pt0, plane_pt1, plane_pt2, plane_pt3); + + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_rank = stk::parallel_machine_rank(pm); + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution coord(-1., 1.); + + const int num_cases = num_random_cases(); + for (int icase=0; icase::epsilon()); + } + else + { + EXPECT_ANY_THROW(surf.interface_crossing_position(segment)); + } + } +} + +TEST(Intersecting_Planes_Cutting_Surface, positive_dihedral_with_random_edge_cuts) +{ + const bool debug_output = false; + const Vector3d plane_pt0(0., 0., 0.); + const Vector3d plane_pt1(0., 1., 1.); + const Vector3d plane_pt2(1., 0., 0.); + const Vector3d plane_pt3(0., 1., 0.); + Intersecting_Planes_Cutting_Surface surf(plane_pt0, plane_pt1, plane_pt2, plane_pt3); + + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_rank = stk::parallel_machine_rank(pm); + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution coord(-1., 1.); + + const int num_cases = num_random_cases(); + for (int icase=0; icase 0.5*pt0[1]) ? 1 : 0) + ((pt1[2] > 0.5*pt1[1]) ? 2 : 0); + switch (case_id) + { + case 0: EXPECT_NEAR(position, pos1, std::numeric_limits::epsilon()); break; + case 3: EXPECT_NEAR(position, pos0, std::numeric_limits::epsilon()); break; + } + } + else + { + EXPECT_ANY_THROW(surf.interface_crossing_position(segment)); + } + } +} + +TEST(Intersecting_Planes_Cutting_Surface, negative_dihedral_with_random_edge_cuts) +{ + const bool debug_output = false; + const Vector3d plane_pt0(0., 0., 0.); + const Vector3d plane_pt1(0., 1., 0.); + const Vector3d plane_pt2(1., 0., 0.); + const Vector3d plane_pt3(0., 1., 1.); + Intersecting_Planes_Cutting_Surface surf(plane_pt0, plane_pt1, plane_pt2, plane_pt3); + + + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_rank = stk::parallel_machine_rank(pm); + std::mt19937 mt(std::mt19937::default_seed + parallel_rank); + std::uniform_real_distribution coord(-1., 1.); + + const int num_cases = num_random_cases(); + for (int icase=0; icase 0.5*pt0[1]) ? 1 : 0) + ((pt1[2] > 0.5*pt1[1]) ? 2 : 0); + switch (case_id) + { + case 0: EXPECT_NEAR(position, pos1, std::numeric_limits::epsilon()); break; + case 3: EXPECT_NEAR(position, pos0, std::numeric_limits::epsilon()); break; + } + } + else + { + EXPECT_ANY_THROW(surf.interface_crossing_position(segment)); + } + } +} + +TEST(Intersecting_Planes_Cutting_Surface, infinitesimal_triangle_that_requires_robust_dihedral_angle) +{ + const double goldPosition = 0.5181038869168293; + const double otherCrossing = 0.4818961330726974; + const Vector3d plane_pt0(otherCrossing, 0., 1.-otherCrossing); + const Vector3d plane_pt1(0., 0., goldPosition); + const Vector3d plane_pt2(0., (1.-1.e-10), 0.); + const Vector3d plane_pt3(1.e-10, (1.-1.e-10), 0.); + Intersecting_Planes_Cutting_Surface surf(plane_pt0, plane_pt1, plane_pt2, plane_pt3); + + const Vector3d node0(0., 0., 0.); + const Vector3d node3(0., 0., 1.); + const double position = surf.interface_crossing_position(Segment3d(node0,node3)); + EXPECT_DOUBLE_EQ(position, goldPosition); +} + +void expect_intersection(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2, const Vector3d & goldIntersection) +{ + Vector3d intersectionPoint; + EXPECT_TRUE(find_intersection_of_three_planes(plane0, plane1, plane2, intersectionPoint)); + expect_eq(goldIntersection, intersectionPoint); +} + +void expect_intersection_with_side_of_tet(const int side, const Plane3d & plane0, const Plane3d & plane1, const Vector3d & goldIntersection) +{ + Vector3d intersectionPoint; + EXPECT_TRUE(find_intersection_of_two_planes_and_side_of_tet(side, plane0, plane1, intersectionPoint)); + expect_eq(goldIntersection, intersectionPoint); +} + +void expect_no_intersection(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2) +{ + Vector3d intersectionPoint; + EXPECT_FALSE(find_intersection_of_three_planes(plane0, plane1, plane2, intersectionPoint)); +} + +void expect_no_intersection_within_tet(const Plane3d & plane0, const Plane3d & plane1, const Plane3d & plane2) +{ + Vector3d intersectionPoint; + EXPECT_FALSE(find_intersection_of_three_planes_within_tet(plane0, plane1, plane2, intersectionPoint)); +} + +void expect_no_intersection_with_side_of_tet(const int side, const Plane3d & plane0, const Plane3d & plane1) +{ + Vector3d intersectionPoint; + EXPECT_FALSE(find_intersection_of_two_planes_and_side_of_tet(side, plane0, plane1, intersectionPoint)); +} + +struct IntersectPlanes : public ::testing::Test +{ + const Vector3d pt0{0., 0., 0.}; + const Vector3d pt1{1., 0., 0.}; + const Vector3d pt2{0., 1., 0.}; + const Vector3d pt3{0., 0., 1.}; + const Plane3d plane0{pt0, pt1, pt3}; + const Plane3d plane1{pt1, pt2, pt3}; + const Plane3d plane2{pt2, pt0, pt3}; + const Plane3d plane3{pt0, pt2, pt1}; + + const Vector3d offsetPt0{-0.1, -0.1, -0.1}; + const Vector3d offsetPt1{1.1, -0.1, -0.1}; + const Vector3d offsetPt2{-0.1, 1.1, -0.1}; + const Vector3d offsetPt3{-0.1, -0.1, 1.1}; + const Plane3d offsetPlane0{offsetPt0, offsetPt1, offsetPt3}; + const Plane3d offsetPlane1{offsetPt1, offsetPt2, offsetPt3}; + const Plane3d offsetPlane2{offsetPt2, offsetPt0, offsetPt3}; + const Plane3d offsetPlane3{offsetPt0, offsetPt2, offsetPt1}; + +}; + +TEST_F(IntersectPlanes, given3Planes_FindCorrectIntersection) +{ + expect_intersection(plane0, plane1, plane2, Vector3d{0., 0., 1.}); + expect_intersection(plane0, plane1, plane3, Vector3d{1., 0., 0.}); + expect_intersection(plane1, plane2, plane3, Vector3d{0., 1., 0.}); + expect_intersection(plane0, plane2, plane3, Vector3d{0., 0., 0.}); + + expect_no_intersection(plane0, plane0, plane1); +} + +TEST_F(IntersectPlanes, given3PlanesThatDoNotIntersectWithinTetBounds_FindNoIntersection) +{ + expect_no_intersection_within_tet(offsetPlane0, offsetPlane1, offsetPlane2); + expect_no_intersection_within_tet(offsetPlane0, offsetPlane1, offsetPlane3); + expect_no_intersection_within_tet(offsetPlane1, offsetPlane2, offsetPlane3); + expect_no_intersection_within_tet(offsetPlane0, offsetPlane2, offsetPlane3); +} + +TEST_F(IntersectPlanes, given2PlanesThatIntersectSideOfTet_FindCorrectIntersection) +{ + expect_intersection_with_side_of_tet(0, plane1, plane2, Vector3d{0., 0., 1.}); + expect_intersection_with_side_of_tet(0, plane1, plane3, Vector3d{1., 0., 0.}); + expect_intersection_with_side_of_tet(0, plane2, plane3, Vector3d{0., 0., 0.}); + + expect_intersection_with_side_of_tet(1, plane2, plane3, Vector3d{0., 1., 0.}); + expect_intersection_with_side_of_tet(1, plane0, plane2, Vector3d{0., 0., 1.}); + expect_intersection_with_side_of_tet(1, plane0, plane3, Vector3d{1., 0., 0.}); + + expect_intersection_with_side_of_tet(2, plane0, plane1, Vector3d{0., 0., 1.}); + expect_intersection_with_side_of_tet(2, plane0, plane3, Vector3d{0., 0., 0.}); + expect_intersection_with_side_of_tet(2, plane1, plane3, Vector3d{0., 1., 0.}); + + expect_intersection_with_side_of_tet(3, plane0, plane1, Vector3d{1., 0., 0.}); + expect_intersection_with_side_of_tet(3, plane0, plane2, Vector3d{0., 0., 0.}); + expect_intersection_with_side_of_tet(3, plane1, plane2, Vector3d{0., 1., 0.}); +} + +TEST_F(IntersectPlanes, given2PlanesThatDoNotIntersectSideOfTetAtAll_FindNoIntersection) +{ + expect_no_intersection_with_side_of_tet(0, plane0, plane2); + expect_no_intersection_with_side_of_tet(1, plane1, plane2); + expect_no_intersection_with_side_of_tet(2, plane2, plane1); + expect_no_intersection_with_side_of_tet(3, plane3, plane2); +} + +TEST_F(IntersectPlanes, given2PlanesThatDoNotIntersectSideOfTetWithinTetBounds_FindNoIntersection) +{ + expect_no_intersection_with_side_of_tet(0, offsetPlane1, offsetPlane2); + expect_no_intersection_with_side_of_tet(0, offsetPlane1, offsetPlane3); + expect_no_intersection_with_side_of_tet(0, offsetPlane2, offsetPlane3); + + expect_no_intersection_with_side_of_tet(1, offsetPlane2, offsetPlane3); + expect_no_intersection_with_side_of_tet(1, offsetPlane0, offsetPlane2); + expect_no_intersection_with_side_of_tet(1, offsetPlane0, offsetPlane3); + + expect_no_intersection_with_side_of_tet(2, offsetPlane0, offsetPlane1); + expect_no_intersection_with_side_of_tet(2, offsetPlane0, offsetPlane3); + expect_no_intersection_with_side_of_tet(2, offsetPlane1, offsetPlane3); + + expect_no_intersection_with_side_of_tet(3, offsetPlane0, offsetPlane1); + expect_no_intersection_with_side_of_tet(3, offsetPlane0, offsetPlane2); + expect_no_intersection_with_side_of_tet(3, offsetPlane1, offsetPlane2); +} + +static Vector3d compute_2d_plane_direction(const Vector3d & pt0, const Vector3d & pt1) +{ + return Vector3d(pt1[1]-pt0[1],pt0[0]-pt1[0],0.); +} + +static Plane3d build_2d_plane(const Vector3d & pt0, const Vector3d & pt1) +{ + return Plane3d(compute_2d_plane_direction(pt0,pt1),pt0); +} + +struct Intersect2DPlanes : public ::testing::Test +{ + Intersect2DPlanes() + : plane0{build_2d_plane(pt0, pt1)}, + plane1{build_2d_plane(pt1, pt2)}, + plane2{build_2d_plane(pt0, pt2)}, + offsetPlane0{build_2d_plane(offsetPt0, offsetPt1)}, + offsetPlane1{build_2d_plane(offsetPt1, offsetPt2)}, + offsetPlane2{build_2d_plane(offsetPt0, offsetPt2)} + { + } + + const Vector3d pt0{0., 0., 0.}; + const Vector3d pt1{1., 0., 0.}; + const Vector3d pt2{0., 1., 0.}; + + const Vector3d offsetPt0{-0.1, -0.1, 0.}; + const Vector3d offsetPt1{1.1, -0.1, 0.}; + const Vector3d offsetPt2{-0.1, 1.1, 0.}; + + Plane3d plane0; + Plane3d plane1; + Plane3d plane2; + + Plane3d offsetPlane0; + Plane3d offsetPlane1; + Plane3d offsetPlane2; +}; + +void expect_2d_intersection(const Plane3d & plane0, const Plane3d & plane1, const Vector3d & goldIntersection) +{ + Vector3d intersectionPoint; + EXPECT_TRUE(find_intersection_of_two_2D_planes(plane0, plane1, intersectionPoint)); + expect_eq(goldIntersection, intersectionPoint); +} + +void expect_no_2d_intersection_within_tri(const Plane3d & plane0, const Plane3d & plane1) +{ + Vector3d intersectionPoint; + EXPECT_FALSE(find_intersection_of_two_2D_planes_within_tri(plane0, plane1, intersectionPoint)); +} + +void expect_no_2d_intersection(const Plane3d & plane0, const Plane3d & plane1) +{ + Vector3d intersectionPoint; + EXPECT_FALSE(find_intersection_of_two_2D_planes(plane0, plane1, intersectionPoint)); +} + +TEST_F(Intersect2DPlanes, given2Plane2Ds_FindCorrectIntersection) +{ + expect_2d_intersection(plane0, plane1, Vector3d{1., 0., 0.}); + expect_2d_intersection(plane1, plane2, Vector3d{0., 1., 0.}); + expect_2d_intersection(plane0, plane2, Vector3d{0., 0., 0.}); + + expect_no_2d_intersection(plane0, plane0); +} + +TEST_F(Intersect2DPlanes, given2Plane2DsThatDoNotIntersectWithinTriBounds_FindNoIntersection) +{ + expect_no_2d_intersection_within_tri(offsetPlane0, offsetPlane1); + expect_no_2d_intersection_within_tri(offsetPlane1, offsetPlane2); + expect_no_2d_intersection_within_tri(offsetPlane0, offsetPlane2); +} + +TEST(ProjectionOf3DPointsIntoTriangle, givenTriangleCheckProjectionOfPointOnAndOffPlane) +{ + const Vector3d pt0{0., 0., 0.}; + const Vector3d pt1{1., 0., 0.}; + const Vector3d pt2{0., 1., 1.}; + const std::array triCoords{{ pt0, pt1, pt2 }}; + + expect_eq(Vector3d{0.,0.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt0)); + expect_eq(Vector3d{1.,0.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt1)); + expect_eq(Vector3d{0.,1.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt2)); + + const Vector3d normal = Cross(pt1-pt0, pt2-pt0).unit_vector(); + expect_eq(Vector3d{0.,0.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt0+normal)); + expect_eq(Vector3d{1.,0.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt1+normal)); + expect_eq(Vector3d{0.,1.,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, pt2+normal)); + + const double oneThird = 1./3.; + const Vector3d midPt = oneThird*(pt0+pt1+pt2); + expect_eq(Vector3d{oneThird,oneThird,0.}, triangle_parametric_coordinates_of_projected_point(triCoords, midPt+normal)); +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.cpp b/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.cpp new file mode 100644 index 000000000000..bf1aa985a09b --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.cpp @@ -0,0 +1,27 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include + +namespace krino { + +LogRedirecter::LogRedirecter() +: myOriginalBuffer(krinolog.getStream().rdbuf()) +{ + krinolog.getStream().rdbuf(&myBuffer); +} + +LogRedirecter::~LogRedirecter() +{ + krinolog.getStream().rdbuf(myOriginalBuffer); +} + +} + diff --git a/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.hpp b/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.hpp new file mode 100644 index 000000000000..9b26c01006fc --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_LogRedirecter.hpp @@ -0,0 +1,32 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_UNIT_LOGREDIRECTER_H_ +#define AKRI_UNIT_LOGREDIRECTER_H_ + +#include + +namespace krino { + +class LogRedirecter +{ +public: + LogRedirecter(); + ~LogRedirecter(); + + void clear() { myBuffer.str(""); } + std::string get_log() const { return myBuffer.str(); } +private: + std::stringbuf myBuffer; + std::streambuf * myOriginalBuffer; +}; + +} + + +#endif diff --git a/packages/krino/krino/unit_tests/Akri_Unit_LowerEnvelope.cpp b/packages/krino/krino/unit_tests/Akri_Unit_LowerEnvelope.cpp new file mode 100644 index 000000000000..de5b17ccc7d5 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_LowerEnvelope.cpp @@ -0,0 +1,260 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include + + +namespace krino +{ + +TEST(Lower_Envelope, Find_Crossing_Segment) +{ + double s = 0.0; + + ASSERT_TRUE(find_lower_envelope_crossing_point({{{0., 1.}, {0., 0.}}}, s)); + EXPECT_DOUBLE_EQ(1.0, s); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{{0., 1.}, {1., 0.}}}, s)); + EXPECT_DOUBLE_EQ(0.5, s); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{{0., 1.}, {0.5, 0.}}}, s)); + EXPECT_DOUBLE_EQ(2./3., s); +} + +TEST(Lower_Envelope, Find_Crossing_Triangle) +{ + std::array pt = {{0., 0.}}; + + const std::vector phi000 = {0., 0., 0.}; + const std::vector phi011 = {0., 1., 1.}; + const std::vector phi101 = {1., 0., 1.}; + const std::vector phi110 = {1., 1., 0.}; + + EXPECT_FALSE(find_lower_envelope_crossing_point({{phi110, phi110, phi101}}, pt)); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi110, phi011, phi101}}, pt)); + std::array goldPt = {{1./3., 1./3.}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{{1., 1., 0.75}, {0., 1., 0.75}, {1., 0., 0.75}}}, pt)); + goldPt = {{0.25, 0.25}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi000, phi011, phi101}}, pt)); + goldPt = {{0., 0.}}; + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi011, phi000, phi101}}, pt)); + goldPt = {{1., 0.}}; + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi011, phi101, phi000}}, pt)); + goldPt = {{0., 1.}}; + EXPECT_EQ(goldPt, pt); +} + +TEST(Lower_Envelope, Find_Crossing_Tetrahedron) +{ + std::array pt = {{0., 0., 0.}}; + + const std::vector phi0000 = {0., 0., 0., 0.}; + const std::vector phi1110 = {1., 1., 1., 0.}; + const std::vector phi1101 = {1., 1., 0., 1.}; + const std::vector phi1011 = {1., 0., 1., 1.}; + const std::vector phi0111 = {0., 1., 1., 1.}; + + EXPECT_FALSE(find_lower_envelope_crossing_point({{phi1110, phi1110, phi1011, phi0111}}, pt)); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi1110, phi1101, phi1011, phi0111}}, pt)); + std::array goldPt = {{0.25, 0.25, 0.25}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi0000, phi0111, phi1011, phi1101}}, pt)); + goldPt = {{0., 0., 0.}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi0111, phi0000, phi1011, phi1101}}, pt)); + goldPt = {{1., 0., 0.}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi0111, phi1011, phi0000, phi1101}}, pt)); + goldPt = {{0., 1., 0.}}; + EXPECT_EQ(goldPt, pt); + + ASSERT_TRUE(find_lower_envelope_crossing_point({{phi0111, phi1011, phi1101, phi0000}}, pt)); + goldPt = {{0., 0., 1.}}; + EXPECT_EQ(goldPt, pt); +} + + +TEST(Lower_Envelope, Two_LS_Bug) +{ + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope({0., 0.}, {1., 0.}); + ASSERT_EQ(1u, envelope.size()); + EXPECT_EQ(1, envelope[0].ls_index()); + EXPECT_DOUBLE_EQ(0.0, envelope[0].left_endpoint()); + EXPECT_DOUBLE_EQ(1., envelope[0].right_endpoint()); +} + +TEST(Lower_Envelope, Two_LS_Lower_Envelope) +{ + { + // 2 level sets, infinitesimal crossing on left by convention that highest level set index wins + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope({0., 0.}, {0.25, 1.}); + ASSERT_EQ(2u, envelope.size()); + const LS_Segment & env1 = envelope[0]; + const LS_Segment & env2 = envelope[1]; + EXPECT_EQ(1, env1.ls_index()); + EXPECT_EQ(0, env2.ls_index()); + EXPECT_DOUBLE_EQ(0.0, env1.left_endpoint()); + EXPECT_DOUBLE_EQ(0.0, env1.right_endpoint()); + EXPECT_DOUBLE_EQ(0.0, env2.left_endpoint()); + EXPECT_DOUBLE_EQ(1.0, env2.right_endpoint()); + } + + { + // 2 level sets, infinitesimal crossing on right by convention that highest level set index wins + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope({0.3, 0.6}, {0., 0.}); + ASSERT_EQ(2u, envelope.size()); + const LS_Segment & env1 = envelope[0]; + const LS_Segment & env2 = envelope[1]; + EXPECT_EQ(0, env1.ls_index()); + EXPECT_EQ(1, env2.ls_index()); + EXPECT_DOUBLE_EQ(0.0, env1.left_endpoint()); + EXPECT_DOUBLE_EQ(1.0, env1.right_endpoint()); + EXPECT_DOUBLE_EQ(1.0, env2.left_endpoint()); + EXPECT_DOUBLE_EQ(1.0, env2.right_endpoint()); + } +} + +void expect_good_edge(const Segment_Vector & envelope) +{ + for (size_t i=0; i= SegmentLowerEnvelope::MinSize()) << "Unexpected infinitesimal, non-zero segment at end of edge " << envelope; + } + else + { + EXPECT_GE(envelope[i].length(), SegmentLowerEnvelope::MinSize()) << "Unexpected internal infinitesimal internal segment on edge " << envelope; + } + + if (i & phi0, const std::vector & phi1) +{ + ASSERT_FALSE(envelope.empty()); + EXPECT_EQ(get_min(phi0), envelope.front().ls_index()) << "Front segment of edge does not match phase at node on edge " << envelope; + EXPECT_EQ(get_min(phi1), envelope.back().ls_index()) << "Back segment of edge does not match phase at node on edge " << envelope; +} + +TEST(Lower_Envelope, Three_LS_Lower_Envelope) +{ + { + // 3 level sets, edge is B from 0 to 0.5, C from 0.5 to 1.0 and + // 1st level set intersects both others at 0.5 but is never the lowest + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope({0.5, 0., 1.}, {0.5, 1., 0.}); + ASSERT_EQ(2u, envelope.size()); + const LS_Segment & env1 = envelope[0]; + const LS_Segment & env2 = envelope[1]; + EXPECT_EQ(1, env1.ls_index()); + EXPECT_EQ(2, env2.ls_index()); + EXPECT_DOUBLE_EQ(0.0, env1.left_endpoint()); + EXPECT_DOUBLE_EQ(0.5, env1.right_endpoint()); + EXPECT_DOUBLE_EQ(0.5, env2.left_endpoint()); + EXPECT_DOUBLE_EQ(1., env2.right_endpoint()); + + expect_good_edge(envelope); + } + + { + // 3 level sets, left is A, middle C, right B + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope({0., 1., 0.25}, {1., 0., 0.25}); + ASSERT_EQ(3u, envelope.size()); + const LS_Segment & env1 = envelope[0]; + const LS_Segment & env2 = envelope[1]; + const LS_Segment & env3 = envelope[2]; + EXPECT_EQ(0, env1.ls_index()); + EXPECT_EQ(2, env2.ls_index()); + EXPECT_EQ(1, env3.ls_index()); + EXPECT_DOUBLE_EQ(0.0, env1.left_endpoint()); + EXPECT_DOUBLE_EQ(0.25, env1.right_endpoint()); + EXPECT_DOUBLE_EQ(0.25, env2.left_endpoint()); + EXPECT_DOUBLE_EQ(0.75, env2.right_endpoint()); + EXPECT_DOUBLE_EQ(0.75, env3.left_endpoint()); + EXPECT_DOUBLE_EQ(1.0, env3.right_endpoint()); + + expect_good_edge(envelope); + } + + { + // 3 level sets with infinitesmal transitions near ends + const std::vector phi0 = {1.56125e-17, -4.77049e-18, 0.}; + const std::vector phi1 = {-0.0417425, 0.0477226, 0.}; + + { + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope(phi0, phi1); + + expect_good_edge(envelope); + expect_end_segments_to_match_end_phases(envelope, phi0, phi1); + } + { + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope(phi1, phi0); + + expect_good_edge(envelope); + expect_end_segments_to_match_end_phases(envelope, phi1, phi0); + } + } + + { + // 3 level sets with infinitesmal transitions near middle + const std::vector phi0 = {-1., (1.+1.e-12), 0.}; + const std::vector phi1 = {(1.+1.e-12), -1., 0.}; + + { + Segment_Vector envelope01 = SegmentLowerEnvelope::find_lower_envelope(phi0, phi1); + expect_good_edge(envelope01); + expect_end_segments_to_match_end_phases(envelope01, phi0, phi1); + EXPECT_EQ(2u, envelope01.size()); + + Segment_Vector envelope10 = SegmentLowerEnvelope::find_lower_envelope(phi1, phi0); + expect_good_edge(envelope10); + expect_end_segments_to_match_end_phases(envelope10, phi1, phi0); + EXPECT_EQ(2u, envelope10.size()); + + EXPECT_DOUBLE_EQ(envelope01[0].right_endpoint(), envelope10[0].right_endpoint()); + } + } +} + +void expect_segments_lengths(const Segment_Vector & segments, const std::vector goldSegmentLengthsByLS) +{ + for (auto && segment : segments) + { + ASSERT_TRUE(segment.ls_index() < (int)goldSegmentLengthsByLS.size()); + EXPECT_DOUBLE_EQ(goldSegmentLengthsByLS[segment.ls_index()], segment.length()); + } +} + +TEST(Lower_Envelope,Sensitive_LS) +{ + std::array,2> phi = {{ {-1.e-17,-2.e-17,1.0,0}, {2.e-17,1.0,-2.e-17,0} }}; + const double goldSegmentLengthForPhi0 = phi[0][0]/(phi[0][0]-phi[1][0]); + const std::vector goldSegmentLengthsByLS = { goldSegmentLengthForPhi0, 0., 0., 1.-goldSegmentLengthForPhi0 }; + + Segment_Vector envelope = SegmentLowerEnvelope::find_lower_envelope(phi[0], phi[1]); + expect_segments_lengths(envelope, goldSegmentLengthsByLS); +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.cpp b/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.cpp new file mode 100644 index 000000000000..a7a04758b117 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.cpp @@ -0,0 +1,278 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include +#include // for declare_element +#include + +#include + +namespace krino { + +void build_mesh(stk::mesh::BulkData & mesh, const std::vector & elem_nodes, const std::vector & elem_procs, std::vector & elem_parts) +{ + if (elem_nodes.empty()) return; + + const size_t numElem = elem_nodes.size(); + EXPECT_TRUE(elem_procs.size() == numElem); + EXPECT_TRUE(elem_parts.size() == numElem); + const size_t nodesPerElem = elem_nodes[0].size(); + const int parallel_size = mesh.parallel_size(); + const int parallel_rank = mesh.parallel_rank(); + + mesh.modification_begin(); + + // Create nodes and elements + std::set nodes_I_declared; + for (size_t e=0; e 1) + { + for (size_t e=0; e sides; + stk::mesh::get_entities( mesh, mesh.mesh_meta_data().side_rank(), sides ); + + EXPECT_TRUE(1 == sides.size()); + + for (auto && side : sides) + { + EXPECT_TRUE(mesh.bucket(side).member(block_1)); + EXPECT_TRUE(mesh.bucket(side).member(block_2)); + } + + // cleanup + mesh.modification_begin(); + for (auto && side : sides) + { + EXPECT_TRUE(disconnect_and_destroy_entity(mesh, side)); + } + mesh.modification_end(); +} +} + +TEST(MeshHelpers, DeclareElementSide) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 2) return; + + // This test will create a two element mesh (quad4 elements) on 1 or 2 processors. + + /* Mesh + * 4---5---6 P0 owns nodes 1,2,4,5; P, elem 1 + * | 1 | 2 | P1 : 3,6, elem 2 + * 1---2---3 + */ + + unsigned spatialDim = 2; + stk::mesh::MetaData meta(spatialDim); + stk::mesh::BulkData mesh(meta, pm); + + stk::mesh::Part& block_1 = meta.declare_part_with_topology("block_1", stk::topology::QUAD_4_2D); + stk::mesh::Part& block_2 = meta.declare_part_with_topology("block_2", stk::topology::QUAD_4_2D); + stk::mesh::Part& surface_1 = meta.declare_part_with_topology("surface_1", stk::topology::LINE_2); + + meta.commit(); + + const std::vector elem_nodes{ {1, 2, 5, 4}, {2, 3, 6, 5} }; + const std::vector elem_procs{0, 1}; + std::vector elem_parts{{&block_1}, {&block_2}}; + + build_mesh(mesh, elem_nodes, elem_procs, elem_parts); + + // All elements and nodes appear everywhere via aura + stk::mesh::Entity element1 = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + stk::mesh::Entity element2 = mesh.get_entity(stk::topology::ELEMENT_RANK, 2); + stk::mesh::Entity node2 = mesh.get_entity(stk::topology::NODE_RANK, 2); + stk::mesh::Entity node5 = mesh.get_entity(stk::topology::NODE_RANK, 5); + + std::vector side_nodes; + side_nodes.push_back(node2); + side_nodes.push_back(node5); + + mesh.initialize_face_adjacent_element_graph(); + + { + // Case 1: Declare side on owning processor for both elements + mesh.modification_begin(); + + if (mesh.bucket(element1).owned()) + { + const unsigned elem1_local_side_id = stk::mesh::get_entity_subcell_id(mesh, element1, meta.side_rank(), surface_1.topology(), side_nodes); + mesh.declare_element_side(element1, elem1_local_side_id, stk::mesh::ConstPartVector{&surface_1}); + } + if (mesh.bucket(element2).owned()) + { + const unsigned elem2_local_side_id = stk::mesh::get_entity_subcell_id(mesh, element2, meta.side_rank(), surface_1.topology(), side_nodes); + mesh.declare_element_side(element2, elem2_local_side_id, stk::mesh::ConstPartVector{&surface_1}); + } + + mesh.modification_end(); + + test_and_cleanup_internal_side(mesh, block_1, block_2); + } + + { + // Case 2: Declare side of element1 on processor that owns element1 + mesh.modification_begin(); + + if (mesh.bucket(element1).owned()) + { + const unsigned elem1_local_side_id = stk::mesh::get_entity_subcell_id(mesh, element1, meta.side_rank(), surface_1.topology(), side_nodes); + mesh.declare_element_side(element1, elem1_local_side_id, stk::mesh::ConstPartVector{&surface_1}); + } + + mesh.modification_end(); + + test_and_cleanup_internal_side(mesh, block_1, block_2); + } + + { + // Case 3: Declare side of element2 on processor that owns element2 + mesh.modification_begin(); + + if (mesh.bucket(element2).owned()) + { + const unsigned elem2_local_side_id = stk::mesh::get_entity_subcell_id(mesh, element2, meta.side_rank(), surface_1.topology(), side_nodes); + mesh.declare_element_side(element2, elem2_local_side_id, stk::mesh::ConstPartVector{&surface_1}); + } + + mesh.modification_end(); + + test_and_cleanup_internal_side(mesh, block_1, block_2); + } +} + +TEST(MeshHelpers, FullyCoincidentVolumeElements) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + + // This test will create a two element mesh (quad4 elements), on more than 2 processors only + // ranks 0 and 1 will have any elements. We test larger number of processors to ensure that + // we get a parallel-consistent result to avoid potential parallel hangs in the full app. + + unsigned spatialDim = 2; + stk::mesh::MetaData meta(spatialDim); + stk::mesh::BulkData mesh(meta, pm); + + stk::mesh::Part& block_1 = meta.declare_part_with_topology("block_1", stk::topology::QUAD_4_2D); + stk::mesh::Part& active_part = meta.declare_part("active"); + meta.commit(); + + const std::vector elem_nodes{ {1, 2, 3, 4}, {2, 3, 4, 1} }; + const std::vector elem_procs{0, 1}; + std::vector elem_parts{{&block_1}, {&block_1}}; + + build_mesh(mesh, elem_nodes, elem_procs, elem_parts); + + const bool ok = check_coincident_elements(mesh, active_part); + EXPECT_FALSE(ok); +} + +TEST(MeshHelpers, PartiallyCoincidentActiveVolumeElements) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 2) return; + + // This test will create a two element mesh (quad4 elements) on 1 or 2 processors. + + unsigned spatialDim = 2; + stk::mesh::MetaData meta(spatialDim); + stk::mesh::BulkData mesh(meta, pm); + + stk::mesh::Part& block_1 = meta.declare_part_with_topology("block_1", stk::topology::QUAD_4_2D); + stk::mesh::Part& active_part = meta.declare_part("active"); + meta.commit(); + + const std::vector elem_nodes{ {1, 2, 3, 4}, {1, 2, 5, 6} }; + const std::vector elem_procs{0, 1}; + std::vector elem_parts{{&block_1, &active_part}, {&block_1, &active_part}}; + + build_mesh(mesh, elem_nodes, elem_procs, elem_parts); + + const bool ok = check_coincident_elements(mesh, active_part); + EXPECT_FALSE(ok); +} + +TEST(MeshHelpers, NotCoincidentActiveDegenerateVolumeElements) +{ + stk::ParallelMachine pm = MPI_COMM_WORLD; + const int parallel_size = stk::parallel_machine_size(pm); + if (parallel_size > 2) return; + + // This test will create a two element mesh (quad4 elements) on 1 or 2 processors. + + unsigned spatialDim = 2; + stk::mesh::MetaData meta(spatialDim); + stk::mesh::BulkData mesh(meta, pm); + + stk::mesh::Part& block_1 = meta.declare_part_with_topology("block_1", stk::topology::QUAD_4_2D); + stk::mesh::Part& active_part = meta.declare_part("active"); + meta.commit(); + + const std::vector elem_nodes{ {1, 2, 2, 3}, {3, 2, 2, 4} }; + const std::vector elem_procs{0, 1}; + std::vector elem_parts{{&block_1, &active_part}, {&block_1, &active_part}}; + + build_mesh(mesh, elem_nodes, elem_procs, elem_parts); + + const bool ok = check_coincident_elements(mesh, active_part); + EXPECT_TRUE(ok); +} + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.hpp b/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.hpp new file mode 100644 index 000000000000..976a24bacbcd --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_MeshHelpers.hpp @@ -0,0 +1,24 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef KRINO_UNIT_TESTS_INCLUDE_AKRI_UNIT_MESHHELPERS_H_ +#define KRINO_UNIT_TESTS_INCLUDE_AKRI_UNIT_MESHHELPERS_H_ + +#include +#include + +namespace krino +{ + +void build_mesh(stk::mesh::BulkData & mesh, + const std::vector & elem_nodes, + const std::vector & elem_procs, + std::vector & elem_parts); +} + +#endif /* KRINO_UNIT_TESTS_INCLUDE_AKRI_UNIT_MESHHELPERS_H_ */ diff --git a/packages/krino/krino/unit_tests/Akri_Unit_MortonIndex.cpp b/packages/krino/krino/unit_tests/Akri_Unit_MortonIndex.cpp new file mode 100644 index 000000000000..805731063269 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_MortonIndex.cpp @@ -0,0 +1,52 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include +#include +#include + +namespace krino +{ + +TEST(MortonIndex, specified_index) +{ + const std::vector valid_indices {0, 1, 2, 4, 3434, 23, 1414415, 76285, MAX_VALID_MORTON3D_INDEX}; + for (int valid_index : valid_indices) + { + EXPECT_EQ(valid_index, morton3d_decode_index(morton3d_encode_index(valid_index))); + } +#ifndef NDEBUG + const std::vector invalid_indices {MAX_VALID_MORTON3D_INDEX+1, 3000000, 2147483647}; + for (int invalid_index : invalid_indices) + { + EXPECT_ANY_THROW(morton3d_encode_index(invalid_index)); + } +#endif +} + +TEST(MortonIndex, specified_indices) +{ + const std::vector valid_indices {0, 1, 2, 4, 3434, 23, 1414415, 76285, MAX_VALID_MORTON3D_INDEX}; + for (int ix : valid_indices) + { + for (int iy : valid_indices) + { + for (int iz : valid_indices) + { + std::array out_indices = morton3d_decode_indices(morton3d_encode_indices({{ix,iy,iz}})); + EXPECT_EQ(ix, out_indices[0]); + EXPECT_EQ(iy, out_indices[1]); + EXPECT_EQ(iz, out_indices[2]); + } + } + } +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_ParallelErrorMessage.cpp b/packages/krino/krino/unit_tests/Akri_Unit_ParallelErrorMessage.cpp new file mode 100644 index 000000000000..99d3c4f1a609 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_ParallelErrorMessage.cpp @@ -0,0 +1,42 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino +{ + +template void write_rank_message(T & os, const int rank) +{ + os << "Rank " << rank << " message.\n"; +} + +TEST(ParallelErrorMessage, ConcatenateErrors) +{ + stk::Parallel world_comm(MPI_COMM_WORLD); + ParallelErrorMessage err(world_comm); + + write_rank_message(err, world_comm.parallel_rank()); + auto global_message = err.gather_message(); + EXPECT_TRUE(global_message.first); + + if (world_comm.parallel_rank() == 0) + { + std::ostringstream expected; + for (int i = 0; i < world_comm.parallel_size(); ++i) + { + write_rank_message(expected, i); + expected << std::endl; + } + EXPECT_EQ(expected.str(), global_message.second); + } +} +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.cpp new file mode 100644 index 000000000000..4d56eb46bd9f --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.cpp @@ -0,0 +1,197 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +namespace krino +{ + +Part_Decomposition_Fixture::Part_Decomposition_Fixture() +: fixture(3) +{ + AuxMetaData & aux_meta = AuxMetaData::get(get_meta_data()); + aux_meta.declare_io_part_with_topology("block_1", stk::topology::TETRAHEDRON_4); + aux_meta.declare_io_part_with_topology("block_2", stk::topology::TETRAHEDRON_4); + aux_meta.declare_io_part_with_topology("surface_1", stk::topology::TRIANGLE_3); +} + +Part_Decomposition_Fixture::~Part_Decomposition_Fixture() +{ +} + +Block_Surface_Connectivity Part_Decomposition_Fixture::addOneSidedSideset() +{ + Block_Surface_Connectivity block_surface_info; + stk::mesh::PartOrdinal surface_1_ordinal = get_meta_data().get_part("surface_1")->mesh_meta_data_ordinal(); + stk::mesh::PartOrdinal block_1_ordinal = get_meta_data().get_part("block_1")->mesh_meta_data_ordinal(); + block_surface_info.add_surface(surface_1_ordinal, {block_1_ordinal}); + return block_surface_info; +} + +Block_Surface_Connectivity Part_Decomposition_Fixture::addTwoSidedSideset() +{ + Block_Surface_Connectivity block_surface_info; + stk::mesh::PartOrdinal block_1_ordinal = get_meta_data().get_part("block_1")->mesh_meta_data_ordinal(); + stk::mesh::PartOrdinal block_2_ordinal = get_meta_data().get_part("block_2")->mesh_meta_data_ordinal(); + + stk::mesh::Part & surface_1 = *get_meta_data().get_part("surface_1"); + stk::mesh::Part & surface_1_block_1 = get_meta_data().declare_part_with_topology("surface_block_1_tri3_1", stk::topology::TRIANGLE_3); + stk::mesh::Part & surface_1_block_2 = get_meta_data().declare_part_with_topology("surface_block_2_tri3_1", stk::topology::TRIANGLE_3); + get_meta_data().declare_part_subset(surface_1, surface_1_block_1); + get_meta_data().declare_part_subset(surface_1, surface_1_block_2); + block_surface_info.add_surface(surface_1.mesh_meta_data_ordinal(), {block_1_ordinal, block_2_ordinal}); + block_surface_info.add_surface(surface_1_block_1.mesh_meta_data_ordinal(), {block_1_ordinal}); + block_surface_info.add_surface(surface_1_block_2.mesh_meta_data_ordinal(), {block_2_ordinal}); + return block_surface_info; +} + +stk::mesh::MetaData & Part_Decomposition_Fixture::get_meta_data() +{ + return fixture.meta_data(); +} + +stk::mesh::Part * Part_Decomposition_Fixture::findPart(const std::string & part_name) +{ + stk::mesh::Part * result = nullptr; + const stk::mesh::PartVector & mesh_parts = fixture.meta_data().get_parts(); + stk::mesh::PartVector::const_iterator found; + found = std::find_if(mesh_parts.begin(), mesh_parts.end(), PartNameIs(part_name)); + if( found != mesh_parts.end() ) + { + result = *found; + } + return result; +} + +stk::mesh::Part * Part_Decomposition_Fixture::findSuperset(const std::string & superset_name, const stk::mesh::Part * const part) +{ + stk::mesh::Part * result = nullptr; + stk::mesh::PartVector::const_iterator found; + found = std::find_if(part->supersets().begin(), part->supersets().end(), PartNameIs(superset_name)); + if( found != part->supersets().end() ) + { + result = *found; + } + return result; +} + +PhaseVec Part_Decomposition_Fixture::ls_phases(int num_ls, bool one_phase_per_ls) +{ + static bool init = false; + static std::vector phase_tags; + static std::vector named_phases; + if(!init) + { + const LevelSet_Identifier id0(0); + const LevelSet_Identifier id1(1); + const LevelSet_Identifier id2(2); + const LevelSet_Identifier id3(3); + PhaseTag pp, nn, pn, np; + pp.add(id0,1); pp.add(id1,1); + nn.add(id0,-1); nn.add(id1,-1); + pn.add(id0,1); pn.add(id1,-1); + np.add(id0,-1); np.add(id1,1); + + phase_tags.push_back(pp); + phase_tags.push_back(nn); + phase_tags.push_back(pn); + phase_tags.push_back(np); + + named_phases.push_back(NamedPhase("A", pp)); + named_phases.push_back(NamedPhase("B", nn)); + named_phases.push_back(NamedPhase("C", pn)); + named_phases.push_back(NamedPhase("D", np)); + + PhaseTag ls1, ls2, ls3, ls4; + ls1.add(id0,-1); + ls2.add(id1,-1); + ls3.add(id2,-1); + ls4.add(id3,-1); + named_phases.push_back(NamedPhase("LS1", ls1)); + named_phases.push_back(NamedPhase("LS2", ls2)); + named_phases.push_back(NamedPhase("LS3", ls3)); + named_phases.push_back(NamedPhase("LS4", ls4)); + + init = true; + } + + PhaseVec result; + if(!one_phase_per_ls) + { + result.push_back(named_phases[0]); + result.push_back(named_phases[1]); + if(num_ls == 2) + { + result.push_back(named_phases[2]); + result.push_back(named_phases[3]); + } + } + else + { + for(int i=0; i < num_ls; ++i) + { + result.push_back(named_phases[4+i]); + } + } + return result; +} + +PhaseVec Part_Decomposition_Fixture::death_phases() +{ + static bool init = false; + const LevelSet_Identifier id0(0); + static PhaseTag pos, neg; + pos.add(id0,1); neg.add(id0,-1); + static NamedPhase dead("dead", pos), alive("", neg); + static PhaseVec named_phases; + if(!init) + { + named_phases.push_back(alive); + named_phases.push_back(dead); + init = true; + } + + return named_phases; +} + +const Interface_Name_Generator & Part_Decomposition_Fixture::ls_name_generator() +{ + static LS_Name_Generator name_gen; + return name_gen; +} + +const Interface_Name_Generator & Part_Decomposition_Fixture::death_name_generator() +{ + static Death_Name_Generator name_gen("test"); + return name_gen; +} + +void Part_Decomposition_Fixture::performDecomposition(const stk::mesh::PartVector & used_blocks, + const Block_Surface_Connectivity & input_block_surface_info, + bool cdfem_death, int num_ls, bool one_ls_per_phase) +{ + Phase_Support & phase_support = Phase_Support::get(get_meta_data()); + phase_support.set_input_block_surface_connectivity(input_block_surface_info); + if(cdfem_death) + { + phase_support.decompose_blocks(used_blocks, + Part_Decomposition_Fixture::death_phases(), Part_Decomposition_Fixture::death_name_generator()); + phase_support.build_decomposed_block_surface_connectivity(); + } + else + { + phase_support.decompose_blocks(used_blocks, + Part_Decomposition_Fixture::ls_phases(num_ls, one_ls_per_phase), Part_Decomposition_Fixture::ls_name_generator()); + phase_support.build_decomposed_block_surface_connectivity(); + } +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.hpp b/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.hpp new file mode 100644 index 000000000000..5239d8f69a28 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Part_Decomposition_Fixture.hpp @@ -0,0 +1,75 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_UNIT_PHASE_SUPPORT_H_ +#define AKRI_UNIT_PHASE_SUPPORT_H_ + +#include + +#include +#include +#include +#include + +namespace stk { namespace mesh { class Part; } } +namespace stk { namespace mesh { class MetaData; } } +namespace krino { class Block_Surface_Connectivity; } +namespace krino { class Interface_Name_Generator; } +namespace krino { class NamedPhase; } + +namespace krino +{ + +struct PartNameIs +{ + PartNameIs(const std::string & name) : match_name(name) {} + bool operator()(const stk::mesh::Part * part) { + return part->name() == match_name; + } + std::string match_name; +}; + +class Part_Decomposition_Fixture : public ::testing::Test +{ +public: + Part_Decomposition_Fixture(); + virtual ~Part_Decomposition_Fixture(); + + void performDecomposition(const std::vector & used_blocks, const Block_Surface_Connectivity & input_block_surface_info, bool cdfem_death, int num_ls = 1, bool one_ls_per_phase=false); + + stk::mesh::MetaData & get_meta_data(); + + Block_Surface_Connectivity addOneSidedSideset(); + Block_Surface_Connectivity addTwoSidedSideset(); + +protected: + stk::mesh::Part * findPart(const std::string & part_name); + stk::mesh::Part * findSuperset(const std::string & superset_name, const stk::mesh::Part * const part); + void assert_conformal_part_exists(const std::string & conformal_part_name, const std::string & nonconformal_part_name) + { + const stk::mesh::Part * conformal_part = findPart(conformal_part_name); + Phase_Support & phase_support = Phase_Support::get(get_meta_data()); + ASSERT_TRUE( conformal_part != NULL ); + EXPECT_TRUE( phase_support.is_conformal(conformal_part) ); + EXPECT_EQ(nonconformal_part_name, phase_support.find_nonconformal_part(*conformal_part)->name() ); + } + +private: + static PhaseVec ls_phases(int num_ls, bool one_ls_per_phase=false); + static PhaseVec death_phases(); + + static const Interface_Name_Generator & ls_name_generator(); + static const Interface_Name_Generator & death_name_generator(); + + SimpleStkFixture fixture; + LogRedirecter log; +}; + +} // namespace krino + +#endif /* AKRI_UNIT_PHASE_SUPPORT_H_ */ diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Phase_Support.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Phase_Support.cpp new file mode 100644 index 000000000000..f6b66c10a291 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Phase_Support.cpp @@ -0,0 +1,231 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include + +#include + +namespace krino +{ + +TEST_F(Part_Decomposition_Fixture, One_Block_LS) +{ + Block_Surface_Connectivity block_surface_info; + performDecomposition({findPart("block_1")}, block_surface_info, false); + + assert_conformal_part_exists("block_1_A", "block_1_nonconformal"); + assert_conformal_part_exists("block_1_B", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_A_B", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_B_A", "block_1_nonconformal"); +} + +TEST_F(Part_Decomposition_Fixture, One_Block_Death) +{ + Block_Surface_Connectivity block_surface_info; + performDecomposition({findPart("block_1")}, block_surface_info, true); + + assert_conformal_part_exists("block_1", "block_1_nonconformal"); + assert_conformal_part_exists("block_1_dead", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_test", "block_1_nonconformal"); +} + +TEST_F(Part_Decomposition_Fixture, OneSidedSideset_LS) +{ + Block_Surface_Connectivity block_surface_info = addOneSidedSideset(); + performDecomposition({findPart("block_1")}, block_surface_info, false); + + assert_conformal_part_exists("surface_1_A", "surface_1_nonconformal"); + assert_conformal_part_exists("surface_1_B", "surface_1_nonconformal"); +} + +TEST_F(Part_Decomposition_Fixture, OneSidedSideset_Death) +{ + Block_Surface_Connectivity block_surface_info = addOneSidedSideset(); + performDecomposition({findPart("block_1")}, block_surface_info, true); + + assert_conformal_part_exists("surface_1", "surface_1_nonconformal"); + assert_conformal_part_exists("surface_1_dead", "surface_1_nonconformal"); +} + +TEST_F(Part_Decomposition_Fixture, TwoSidedSideset_LS) +{ + Block_Surface_Connectivity block_surface_info = addTwoSidedSideset(); + performDecomposition({findPart("block_1")}, block_surface_info, false); + + //const stk::mesh::Part * surf_1_A_block_1 = findPart("surface_1_A_block_1"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_A_block_1 = findPart("surface_block_1_tri3_1_A"); + ASSERT_TRUE( surf_1_A_block_1 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_A", surf_1_A_block_1) != NULL ); + + //const stk::mesh::Part * surf_1_B_block_1 = findPart("surface_1_B_block_1"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_B_block_1 = findPart("surface_block_1_tri3_1_B"); + ASSERT_TRUE( surf_1_B_block_1 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_B", surf_1_B_block_1) != NULL ); + + //const stk::mesh::Part * surf_1_A_block_2 = findPart("surface_1_A_block_2"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_A_block_2 = findPart("surface_block_2_tri3_1_A"); + ASSERT_TRUE( surf_1_A_block_2 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_A", surf_1_A_block_2) != NULL ); + + //const stk::mesh::Part * surf_1_B_block_2 = findPart("surface_1_B_block_2"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_B_block_2 = findPart("surface_block_2_tri3_1_B"); + ASSERT_TRUE( surf_1_B_block_2 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_B", surf_1_B_block_2) != NULL ); +} + +TEST_F(Part_Decomposition_Fixture, TwoSidedSideset_Death) +{ + Block_Surface_Connectivity block_surface_info = addTwoSidedSideset(); + performDecomposition({findPart("block_1")}, block_surface_info, true); + + //const stk::mesh::Part * surf_1_block_1 = findPart("surface_1_block_1"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_block_1 = findPart("surface_block_1_tri3_1"); + ASSERT_TRUE( surf_1_block_1 != NULL ); + EXPECT_TRUE( findSuperset("surface_1", surf_1_block_1) != NULL ); + + //const stk::mesh::Part * surf_1_dead_block_1 = findPart("surface_1_dead_block_1"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_dead_block_1 = findPart("surface_block_1_tri3_1_dead"); + ASSERT_TRUE( surf_1_dead_block_1 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_dead", surf_1_dead_block_1) != NULL ); + + //const stk::mesh::Part * surf_1_block_2 = findPart("surface_1_block_2"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_block_2 = findPart("surface_block_2_tri3_1"); + ASSERT_TRUE( surf_1_block_2 != NULL ); + EXPECT_TRUE( findSuperset("surface_1", surf_1_block_2) != NULL ); + + //const stk::mesh::Part * surf_1_dead_block_2 = findPart("surface_1_dead_block_2"); // No support for aliases in stk yet + const stk::mesh::Part * surf_1_dead_block_2 = findPart("surface_block_2_tri3_1_dead"); + ASSERT_TRUE( surf_1_dead_block_2 != NULL ); + EXPECT_TRUE( findSuperset("surface_1_dead", surf_1_dead_block_2) != NULL ); +} + +TEST_F(Part_Decomposition_Fixture, Multiple_LS_Decomposition) +{ + Block_Surface_Connectivity block_surface_info; + performDecomposition({findPart("block_1")}, block_surface_info, false, 2); + + assert_conformal_part_exists("block_1_A", "block_1_nonconformal"); + assert_conformal_part_exists("block_1_B", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_A_B", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_B_A", "block_1_nonconformal"); + + assert_conformal_part_exists("block_1_C", "block_1_nonconformal"); + assert_conformal_part_exists("block_1_D", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_C_D", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_D_C", "block_1_nonconformal"); + + assert_conformal_part_exists("surface_block_1_A_C", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_C_A", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_A_D", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_D_A", "block_1_nonconformal"); + + assert_conformal_part_exists("surface_block_1_B_C", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_C_B", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_B_D", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_D_B", "block_1_nonconformal"); +} + +TEST_F(Part_Decomposition_Fixture, find_conformal_io_part) +{ + std::vector decomposed_blocks; + decomposed_blocks.push_back("block_1"); + Block_Surface_Connectivity block_surface_info; + + stk::mesh::Part * block_1 = findPart("block_1"); + performDecomposition({block_1}, block_surface_info, false, 2); + const LevelSet_Identifier id0(0); + const LevelSet_Identifier id1(1); + LS_SideTag p0(id0,1); + LS_SideTag p1(id1,1); + LS_SideTag n0(id0,-1); + LS_SideTag n1(id1,-1); + PhaseTag pp, nn, pn, np; + pp.add(p0); pp.add(p1); // "A" + nn.add(n0); nn.add(n1); // "B" + pn.add(p0); pn.add(n1); // "C" + np.add(n0); np.add(p1); // "D" + + // Test volume conformal io part lookup + Phase_Support & phase_support = Phase_Support::get(get_meta_data()); + const stk::mesh::Part * block_1_A = phase_support.find_conformal_io_part(*block_1, pp); + ASSERT_TRUE( block_1_A != NULL ); + EXPECT_EQ( "block_1_A", block_1_A->name() ); + + const stk::mesh::Part * block_1_B = phase_support.find_conformal_io_part(*block_1, nn); + ASSERT_TRUE( block_1_B != NULL ); + EXPECT_EQ( "block_1_B", block_1_B->name() ); + + const stk::mesh::Part * block_1_C = phase_support.find_conformal_io_part(*block_1, pn); + ASSERT_TRUE( block_1_C != NULL ); + EXPECT_EQ( "block_1_C", block_1_C->name() ); + + const stk::mesh::Part * block_1_D = phase_support.find_conformal_io_part(*block_1, np); + ASSERT_TRUE( block_1_D != NULL ); + EXPECT_EQ( "block_1_D", block_1_D->name() ); + + const stk::mesh::Part * surface_block_1_A_B = phase_support.find_interface_part(*block_1_A, *block_1_B); + ASSERT_TRUE( surface_block_1_A_B != NULL ); + EXPECT_EQ( "surface_block_1_A_B", surface_block_1_A_B->name() ); + + const stk::mesh::Part * surface_block_1_A_C = phase_support.find_interface_part(*block_1_A, *block_1_C); + ASSERT_TRUE( surface_block_1_A_C != NULL ); + EXPECT_EQ( "surface_block_1_A_C", surface_block_1_A_C->name() ); + + const stk::mesh::Part * surface_block_1_A_D = phase_support.find_interface_part(*block_1_A, *block_1_D); + ASSERT_TRUE( surface_block_1_A_D != NULL ); + EXPECT_EQ( "surface_block_1_A_D", surface_block_1_A_D->name() ); + + const stk::mesh::Part * surface_block_1_C_D = phase_support.find_interface_part(*block_1_C, *block_1_D); + ASSERT_TRUE( surface_block_1_C_D != NULL ); + EXPECT_EQ( "surface_block_1_C_D", surface_block_1_C_D->name() ); +} + +TEST_F(Part_Decomposition_Fixture, get_blocks_touching_surface) +{ + Block_Surface_Connectivity block_surface_info = addTwoSidedSideset(); + performDecomposition({findPart("block_1")}, block_surface_info, false); + + std::vector blocks; + + blocks = get_meta_data().get_blocks_touching_surface(get_meta_data().get_part("surface_1_A")); + EXPECT_EQ( 2u, blocks.size() ); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_1_A"))); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_2"))); + + blocks = get_meta_data().get_blocks_touching_surface(get_meta_data().get_part("surface_block_1_tri3_1_A")); + EXPECT_EQ( 1u, blocks.size() ); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_1_A"))); + + blocks = get_meta_data().get_blocks_touching_surface(get_meta_data().get_part("surface_block_2_tri3_1_A")); + EXPECT_EQ( 1u, blocks.size() ); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_2"))); + + blocks = get_meta_data().get_blocks_touching_surface(get_meta_data().get_part("surface_block_1_A_B")); + EXPECT_EQ( 1u, blocks.size() ); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_1_A"))); + + blocks = get_meta_data().get_blocks_touching_surface(get_meta_data().get_part("surface_block_1_B_A")); + EXPECT_EQ( 1u, blocks.size() ); + EXPECT_TRUE( blocks.end() != std::find(blocks.begin(), blocks.end(), get_meta_data().get_part("block_1_B"))); + +} + +TEST_F(Part_Decomposition_Fixture, One_Block_Two_LS_One_LS_Per_Phase) +{ + Block_Surface_Connectivity block_surface_info; + performDecomposition({findPart("block_1")}, block_surface_info, false, 2, true); + + assert_conformal_part_exists("block_1_LS1", "block_1_nonconformal"); + assert_conformal_part_exists("block_1_LS2", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_LS1_LS2", "block_1_nonconformal"); + assert_conformal_part_exists("surface_block_1_LS2_LS1", "block_1_nonconformal"); +} + +} // namespace krino diff --git a/packages/krino/krino/unit_tests/Akri_Unit_RebalanceUtils.cpp b/packages/krino/krino/unit_tests/Akri_Unit_RebalanceUtils.cpp new file mode 100644 index 000000000000..388ddd4a5c9b --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_RebalanceUtils.cpp @@ -0,0 +1,446 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace krino { +namespace rebalance_utils { + +namespace { + +/* + * Builds a single tri mesh with 1 level of adaptivity. Parent element is ID 1, + * Child elem and node IDs are in the ascii art below + * + * 3 + * / \ + * / 5 \ + * 6 /_____\ 5 + * /\ /\ + * / \ 3 / \ + * / 2 \ / 4 \ + * /______\/_____\ + * 1 4 2 + */ + +void create_block_and_register_fields(SimpleStkFixture & fixture) +{ + auto & meta = fixture.meta_data(); + meta.declare_part_with_topology("block_1", stk::topology::TRIANGLE_3_2D); + + meta.declare_field > + (stk::topology::NODE_RANK, "coordinates"); + auto & load_field = + meta.declare_field>(stk::topology::ELEMENT_RANK, "element_weights"); + stk::mesh::put_field_on_mesh(load_field, meta.universal_part(), nullptr); + + fixture.commit(); +} + +void build_unadapted_single_tri_mesh(SimpleStkFixture & fixture) +{ + auto & bulk_data = fixture.bulk_data(); + auto & block_1 = *fixture.meta_data().get_part("block_1"); + + bulk_data.modification_begin(); + if(bulk_data.parallel_rank() == 0) + { + stk::mesh::declare_element(bulk_data, block_1, 1, {1, 2, 3}); + } + bulk_data.modification_end(); +} + +void build_one_level_adapted_single_tri_mesh(SimpleStkFixture & fixture) +{ + auto & bulk_data = fixture.bulk_data(); + auto & block_1 = *fixture.meta_data().get_part("block_1"); + + bulk_data.modification_begin(); + if(bulk_data.parallel_rank() == 0) + { + auto parent_elem = stk::mesh::declare_element(bulk_data, block_1, 1, {1, 2, 3}); + auto child1 = stk::mesh::declare_element(bulk_data, block_1, 2, {1, 4, 6}); + auto child2 = stk::mesh::declare_element(bulk_data, block_1, 3, {4, 5, 6}); + auto child3 = stk::mesh::declare_element(bulk_data, block_1, 4, {4, 2, 5}); + auto child4 = stk::mesh::declare_element(bulk_data, block_1, 5, {6, 5, 3}); + auto family_tree = bulk_data.declare_constraint(1); + bulk_data.declare_relation(family_tree, parent_elem, 0); + bulk_data.declare_relation(family_tree, child1, 1); + bulk_data.declare_relation(family_tree, child2, 2); + bulk_data.declare_relation(family_tree, child3, 3); + bulk_data.declare_relation(family_tree, child4, 4); + } + bulk_data.modification_end(); +} + +void build_two_level_adapted_single_tri_mesh(SimpleStkFixture & fixture) +{ + build_one_level_adapted_single_tri_mesh(fixture); + + auto & bulk_data = fixture.bulk_data(); + auto & block_1 = *fixture.meta_data().get_part("block_1"); + + // Refine child elem 3 an additional time and make others into transition elements + bulk_data.modification_begin(); + if(bulk_data.parallel_rank() == 0) + { + { + auto parent = bulk_data.get_entity(stk::topology::ELEMENT_RANK, 3); + auto child1 = stk::mesh::declare_element(bulk_data, block_1, 6, {4, 8, 7}); + auto child2 = stk::mesh::declare_element(bulk_data, block_1, 7, {7, 8, 9}); + auto child3 = stk::mesh::declare_element(bulk_data, block_1, 8, {8, 5, 9}); + auto child4 = stk::mesh::declare_element(bulk_data, block_1, 9, {9, 6, 7}); + + auto family_tree = bulk_data.declare_constraint(2); + bulk_data.declare_relation(family_tree, parent, 0); + bulk_data.declare_relation(family_tree, child1, 1); + bulk_data.declare_relation(family_tree, child2, 2); + bulk_data.declare_relation(family_tree, child3, 3); + bulk_data.declare_relation(family_tree, child4, 4); + } + + { + auto parent = bulk_data.get_entity(stk::topology::ELEMENT_RANK, 2); + auto child1 = stk::mesh::declare_element(bulk_data, block_1, 10, {1, 4, 7}); + auto child2 = stk::mesh::declare_element(bulk_data, block_1, 11, {1, 7, 6}); + + auto family_tree = bulk_data.declare_constraint(3); + bulk_data.declare_relation(family_tree, parent, 0); + bulk_data.declare_relation(family_tree, child1, 1); + bulk_data.declare_relation(family_tree, child2, 2); + } + { + auto parent = bulk_data.get_entity(stk::topology::ELEMENT_RANK, 4); + auto child1 = stk::mesh::declare_element(bulk_data, block_1, 12, {4, 2, 8}); + auto child2 = stk::mesh::declare_element(bulk_data, block_1, 13, {2, 5, 8}); + + auto family_tree = bulk_data.declare_constraint(4); + bulk_data.declare_relation(family_tree, parent, 0); + bulk_data.declare_relation(family_tree, child1, 1); + bulk_data.declare_relation(family_tree, child2, 2); + } + { + auto parent = bulk_data.get_entity(stk::topology::ELEMENT_RANK, 4); + auto child1 = stk::mesh::declare_element(bulk_data, block_1, 14, {9, 5, 3}); + auto child2 = stk::mesh::declare_element(bulk_data, block_1, 15, {9, 3, 6}); + + auto family_tree = bulk_data.declare_constraint(5); + bulk_data.declare_relation(family_tree, parent, 0); + bulk_data.declare_relation(family_tree, child1, 1); + bulk_data.declare_relation(family_tree, child2, 2); + } + } + bulk_data.modification_end(); +} + +} + +TEST(UpdateRebalanceForAdaptivity, OneLevel) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_one_level_adapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::balance::DecompositionChangeList change_list(fixture.bulk_data(), {}); + auto parent_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + + stk::mesh::EntityVector child_elems; + for(int child_id=2; child_id < 6; ++child_id) + { + auto child_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, child_id); + ASSERT_TRUE(mesh.is_valid(child_elem)); + child_elems.push_back(child_elem); + } + + const int dest_proc = 2; + change_list.set_entity_destination(parent_elem, dest_proc); + + for(auto && child_elem : child_elems) + { + ASSERT_FALSE(change_list.has_entity(child_elem)); + } + + impl::update_rebalance_for_adaptivity(change_list, mesh); + + for(auto && child_elem : child_elems) + { + EXPECT_TRUE(change_list.has_entity(child_elem)); + EXPECT_EQ(dest_proc, change_list.get_entity_destination(child_elem)); + } +} + +TEST(UpdateRebalanceForAdaptivity, OneLevelChildMovedWithoutParent) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_one_level_adapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::balance::DecompositionChangeList change_list(fixture.bulk_data(), {}); + + stk::mesh::EntityVector child_elems; + for(int child_id=2; child_id < 6; ++child_id) + { + auto child_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, child_id); + ASSERT_TRUE(mesh.is_valid(child_elem)); + child_elems.push_back(child_elem); + change_list.set_entity_destination(child_elem, child_id); + } + + impl::update_rebalance_for_adaptivity(change_list, mesh); + + for(auto && child_elem : child_elems) + { + EXPECT_FALSE(change_list.has_entity(child_elem)); + } +} + +TEST(UpdateRebalanceForAdaptivity, TwoLevels) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_two_level_adapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::balance::DecompositionChangeList change_list(fixture.bulk_data(), {}); + auto parent_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + + stk::mesh::EntityVector child_elems; + for(int child_id=2; child_id < 15; ++child_id) + { + auto child_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, child_id); + ASSERT_TRUE(mesh.is_valid(child_elem)); + child_elems.push_back(child_elem); + } + + const int dest_proc = 2; + change_list.set_entity_destination(parent_elem, dest_proc); + + impl::update_rebalance_for_adaptivity(change_list, mesh); + + for(auto && child_elem : child_elems) + { + EXPECT_TRUE(change_list.has_entity(child_elem)); + EXPECT_EQ(dest_proc, change_list.get_entity_destination(child_elem)); + } + + stk::mesh::EntityVector family_trees; + mesh.get_entities( + stk::topology::CONSTRAINT_RANK, mesh.mesh_meta_data().locally_owned_part(), family_trees); + for(auto && ft : family_trees) + { + EXPECT_TRUE(change_list.has_entity(ft)); + EXPECT_EQ(dest_proc, change_list.get_entity_destination(ft)); + } +} + +TEST(UpdateRebalanceForAdaptivity, TwoLevelsFirstLevelChildInitialDifferentProc) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_two_level_adapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::balance::DecompositionChangeList change_list(fixture.bulk_data(), {}); + auto parent_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + + stk::mesh::EntityVector child_elems; + for(int child_id=2; child_id < 15; ++child_id) + { + auto child_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, child_id); + ASSERT_TRUE(mesh.is_valid(child_elem)); + child_elems.push_back(child_elem); + } + + const int dest_proc = 2; + change_list.set_entity_destination(parent_elem, dest_proc); + change_list.set_entity_destination(mesh.get_entity(stk::topology::ELEMENT_RANK, 3), 5); + + impl::update_rebalance_for_adaptivity(change_list, mesh); + + for(auto && child_elem : child_elems) + { + EXPECT_TRUE(change_list.has_entity(child_elem)); + EXPECT_EQ(dest_proc, change_list.get_entity_destination(child_elem)); + } +} + +TEST(AccumulateAdaptivityChildWeights, TwoLevelAdaptedTri) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_two_level_adapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::mesh::Field & weights_field = static_cast &>( + *fixture.meta_data().get_field(stk::topology::ELEMENT_RANK, "element_weights")); + + auto parent_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + double & parent_weight = *stk::mesh::field_data(weights_field, parent_elem); + parent_weight = 10.; + stk::mesh::EntityVector child_elems; + for (int child_id = 2; child_id < 15; ++child_id) + { + auto child_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, child_id); + ASSERT_TRUE(mesh.is_valid(child_elem)); + child_elems.push_back(child_elem); + + double & weight = *stk::mesh::field_data(weights_field, child_elem); + weight = 1.; + } + + impl::accumulate_adaptivity_child_weights_to_parents(mesh, weights_field); + + for (auto && child_elem : child_elems) + { + const double & weight = *stk::mesh::field_data(weights_field, child_elem); + EXPECT_DOUBLE_EQ(0., weight); + } + EXPECT_DOUBLE_EQ(23., parent_weight); +} + +TEST(AccumulateAdaptivityChildWeights, UnadaptedElement) +{ + SimpleStkFixture fixture(2, MPI_COMM_SELF); + create_block_and_register_fields(fixture); + build_unadapted_single_tri_mesh(fixture); + + const auto & mesh = fixture.bulk_data(); + + stk::mesh::Field & weights_field = static_cast &>( + *fixture.meta_data().get_field(stk::topology::ELEMENT_RANK, "element_weights")); + + auto parent_elem = mesh.get_entity(stk::topology::ELEMENT_RANK, 1); + double & parent_weight = *stk::mesh::field_data(weights_field, parent_elem); + parent_weight = 10.; + + impl::accumulate_adaptivity_child_weights_to_parents(mesh, weights_field); + + EXPECT_DOUBLE_EQ(10., parent_weight); +} + +TEST(Rebalance, MultipleWeightFields) +{ + SimpleStkFixture fixture(2, MPI_COMM_WORLD); + + auto & mesh = fixture.bulk_data(); + auto & meta = fixture.meta_data(); + + if (mesh.parallel_size() != 2) return; + + stk::mesh::Part & block_1 = meta.declare_part_with_topology("block_1", stk::topology::QUAD_4_2D); + stk::mesh::Part & block_2 = meta.declare_part_with_topology("block_2", stk::topology::QUAD_4_2D); + + auto & coords_field = meta.declare_field>( + stk::topology::NODE_RANK, "coordinates"); + stk::mesh::put_field_on_mesh(coords_field, meta.universal_part(), nullptr); + + auto & weights_field_1 = meta.declare_field>( + stk::topology::ELEMENT_RANK, "element_weights_1"); + stk::mesh::put_field_on_mesh(weights_field_1, block_1, nullptr); + + auto & weights_field_2 = meta.declare_field>( + stk::topology::ELEMENT_RANK, "element_weights_2"); + stk::mesh::put_field_on_mesh(weights_field_2, block_2, nullptr); + + meta.commit(); + + // Create mesh with two disconnected blocks each containing two elements. Initially block_1 will + // be + // all owned by P0 and block_2 all by P1. Each element gets a weight of 1 in the weight field for + // its + // block, rebalance should put one element from each block on each proc. + const std::vector elem_nodes{ + {1, 2, 5, 4}, {2, 3, 6, 5}, {7, 8, 11, 12}, {8, 9, 10, 11}}; + const std::vector elem_procs{0, 0, 1, 1}; + std::vector elem_parts{{&block_1}, {&block_1}, {&block_2}, {&block_2}}; + std::vector> node_coords{{0, 0}, + {1, 0}, + {2, 0}, + {2, 1}, + {1, 1}, + {0, 1}, + {3, 0}, + {4, 0}, + {5, 0}, + {3, 1}, + {4, 1}, + {5, 1}}; + + build_mesh(mesh, elem_nodes, elem_procs, elem_parts); + + for (auto && b : mesh.buckets(stk::topology::NODE_RANK)) + { + for (auto && node : *b) + { + double * coords = stk::mesh::field_data(coords_field, node); + coords[0] = node_coords[mesh.identifier(node) - 1][0]; + coords[1] = node_coords[mesh.identifier(node) - 1][1]; + } + } + + stk::mesh::field_fill(1., weights_field_1); + stk::mesh::field_fill(1., weights_field_2); + + const auto parallel_rank = mesh.parallel_rank(); + const auto & owned_part = meta.locally_owned_part(); + if (parallel_rank == 0) + { + EXPECT_EQ(2u, + stk::mesh::count_selected_entities( + owned_part & block_1, mesh.buckets(stk::topology::ELEMENT_RANK))); + EXPECT_EQ(0u, + stk::mesh::count_selected_entities( + owned_part & block_2, mesh.buckets(stk::topology::ELEMENT_RANK))); + } + if (parallel_rank == 1) + { + EXPECT_EQ(0u, + stk::mesh::count_selected_entities( + owned_part & block_1, mesh.buckets(stk::topology::ELEMENT_RANK))); + EXPECT_EQ(2u, + stk::mesh::count_selected_entities( + owned_part & block_2, mesh.buckets(stk::topology::ELEMENT_RANK))); + } + + rebalance_utils::rebalance_mesh( + mesh, nullptr, {weights_field_1.name(), weights_field_2.name()}, "coordinates", "parmetis"); + + EXPECT_EQ(1u, + stk::mesh::count_selected_entities( + owned_part & block_1, mesh.buckets(stk::topology::ELEMENT_RANK))); + EXPECT_EQ(1u, + stk::mesh::count_selected_entities( + owned_part & block_2, mesh.buckets(stk::topology::ELEMENT_RANK))); +} +} +} + diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.cpp b/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.cpp new file mode 100644 index 000000000000..6db2f2adce90 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.cpp @@ -0,0 +1,136 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace krino { + +void SimpleStkFixture::write_results(const std::string & filename, stk::mesh::BulkData & mesh, const bool use64bitIds) +{ + stk::io::StkMeshIoBroker io(mesh.parallel()); + io.set_bulk_data(mesh); + + Ioss::PropertyManager properties; + if (use64bitIds) + { + properties.add(Ioss::Property("INTEGER_SIZE_API", 8)); + properties.add(Ioss::Property("INTEGER_SIZE_DB", 8)); + } + + auto index = io.create_output_mesh(filename, stk::io::WRITE_RESULTS, properties); + io.write_output_mesh(index); + + for(auto && field : mesh.mesh_meta_data().get_fields()) + { + io.add_field(index, *field); + } + + io.begin_output_step(index, 0.); + io.write_defined_output_fields(index); + io.end_output_step(index); +} + +SingleElementFixture::SingleElementFixture(const stk::topology & topology) + : my_topology(topology), + stk_fixture(my_topology.dimension()) +{ + AuxMetaData & aux_meta = AuxMetaData::get(stk_fixture.meta_data()); + block_part = &stk_fixture.meta_data().declare_part_with_topology("block_1", my_topology); + const FieldType & vec_type = (my_topology.dimension() == 3) ? FieldType::VECTOR_3D : FieldType::VECTOR_2D; + coord_field = aux_meta.register_field("coordinates", vec_type, stk::topology::NODE_RANK, 1u, 1u, *block_part); + CDFEM_Support::get(stk_fixture.meta_data()).set_coords_field( coord_field ); + scalar_field = aux_meta.register_field("scalar_field", FieldType::REAL, stk::topology::NODE_RANK, 1u, 1u, *block_part); + stk_fixture.commit(); +} + +void +SingleElementFixture::generate_mesh() +{ + const AuxMetaData & aux_meta = AuxMetaData::get(stk_fixture.meta_data()); + stk_fixture.bulk_data().modification_begin(); + { + stk::mesh::PartVector elem_parts; + elem_parts.push_back(block_part); + elem_parts.push_back(&aux_meta.active_part()); + elem_parts.push_back(&stk_fixture.meta_data().locally_owned_part()); + stk::mesh::EntityIdVector node_ids(my_topology.num_nodes()); + for(unsigned i=0; i < node_ids.size(); ++i) + { + node_ids[i] = i+1; + } + const stk::mesh::EntityId elem_id = 1; + my_elem = stk::mesh::declare_element( stk_fixture.bulk_data(), elem_parts, elem_id, node_ids ); + const stk::mesh::Entity * const nodes = stk_fixture.bulk_data().begin_nodes(my_elem); + for(unsigned i=0; i < node_ids.size(); ++i) + { + EXPECT_EQ(node_ids[i], stk_fixture.bulk_data().identifier(nodes[i])); + } + } + stk_fixture.bulk_data().modification_end(); + + // set node coordinates + stk::mesh::field_fill(0., coord_field); + const stk::mesh::Entity * const nodes = stk_fixture.bulk_data().begin_nodes(my_elem); + for(unsigned i=0; i < my_topology.num_nodes(); ++i) + { + if (i > 0) + { + double * node_coords = field_data(coord_field, nodes[i]); + node_coords[i-1] = 1.0; + } + } +} + +TEST(SingleElementFixture, tri3) +{ + stk::topology tri3 = stk::topology::TRIANGLE_3_2D; + SingleElementFixture test_fixture(tri3); + + test_fixture.generate_mesh(); + + EXPECT_EQ(2u, test_fixture.stk_fixture.meta_data().spatial_dimension()); + + const stk::mesh::BucketVector & elem_buckets = test_fixture.stk_fixture.bulk_data().buckets(stk::topology::ELEMENT_RANK); + ASSERT_EQ(1u, elem_buckets.size()); + EXPECT_EQ(1u, (*elem_buckets.begin())->size()); + EXPECT_EQ(3u, test_fixture.stk_fixture.bulk_data().num_nodes((*elem_buckets[0])[0])); + const stk::mesh::BucketVector & node_buckets = test_fixture.stk_fixture.bulk_data().buckets(stk::topology::NODE_RANK); + ASSERT_EQ(1u, node_buckets.size()); + EXPECT_EQ(3u, (*node_buckets.begin())->size()); +} + +TEST(SingleElementFixture, tet4) +{ + stk::topology tet4 = stk::topology::TETRAHEDRON_4; + SingleElementFixture test_fixture(tet4); + + test_fixture.generate_mesh(); + + EXPECT_EQ(3u, test_fixture.stk_fixture.meta_data().spatial_dimension()); + + const stk::mesh::BucketVector & elem_buckets = test_fixture.stk_fixture.bulk_data().buckets(stk::topology::ELEMENT_RANK); + ASSERT_EQ(1u, elem_buckets.size()); + EXPECT_EQ(1u, (*elem_buckets.begin())->size()); + EXPECT_EQ(4u, test_fixture.stk_fixture.bulk_data().num_nodes((*elem_buckets[0])[0])); + const stk::mesh::BucketVector & node_buckets = test_fixture.stk_fixture.bulk_data().buckets(stk::topology::NODE_RANK); + ASSERT_EQ(1u, node_buckets.size()); + EXPECT_EQ(4u, (*node_buckets.begin())->size()); +} + +} diff --git a/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.hpp b/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.hpp new file mode 100644 index 000000000000..f3d969b484ba --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_Single_Element_Fixtures.hpp @@ -0,0 +1,79 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef AKRI_UNIT_SINGLE_ELEMENT_FIXTURES_H_ +#define AKRI_UNIT_SINGLE_ELEMENT_FIXTURES_H_ + +#include // for BulkData +#include // for MetaData + +#include "Akri_AuxMetaData.hpp" +#include "Akri_FieldRef.hpp" + +namespace krino { + +inline std::vector entity_rank_names_with_ft() +{ + auto entity_rank_names = stk::mesh::entity_rank_names(); + entity_rank_names.push_back("FAMILY_TREE"); + return entity_rank_names; +} + +class SimpleStkFixture +{ +public: + SimpleStkFixture(unsigned dimension, MPI_Comm comm = MPI_COMM_WORLD) + : meta(dimension, entity_rank_names_with_ft()), + bulk(meta, comm) + { + meta.set_mesh_bulk_data(&bulk); + AuxMetaData::create(meta); + } + void commit() { meta.commit(); } + void write_results(const std::string & filename) { write_results(filename, bulk); } + static void write_results(const std::string & filename, stk::mesh::BulkData & mesh, const bool use64bitIds = true); + stk::mesh::MetaData & meta_data() { return meta; } + stk::mesh::BulkData & bulk_data() { return bulk; } + +private: + stk::mesh::MetaData meta; + stk::mesh::BulkData bulk; +}; + +class SimpleStkFixture2d : public SimpleStkFixture +{ +public: + SimpleStkFixture2d(MPI_Comm comm = MPI_COMM_WORLD) : SimpleStkFixture(2) {} +}; + +class SimpleStkFixture3d : public SimpleStkFixture +{ +public: + SimpleStkFixture3d(MPI_Comm comm = MPI_COMM_WORLD) : SimpleStkFixture(3) {} +}; + +// Fixture to create a single element stk mesh of the given topology. +class SingleElementFixture +{ +public: + SingleElementFixture(const stk::topology & topology); + + void generate_mesh(); + + stk::topology my_topology; + SimpleStkFixture stk_fixture; + stk::mesh::Part * block_part; + FieldRef coord_field; + FieldRef scalar_field; + stk::mesh::Entity my_elem; +}; + + +} + +#endif /* AKRI_UNIT_SINGLE_ELEMENT_FIXTURES_H_ */ diff --git a/packages/krino/krino/unit_tests/Akri_Unit_main.cpp b/packages/krino/krino/unit_tests/Akri_Unit_main.cpp new file mode 100644 index 000000000000..d079d13ad299 --- /dev/null +++ b/packages/krino/krino/unit_tests/Akri_Unit_main.cpp @@ -0,0 +1,32 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include +#include + +#include +#include +#include + +#include + +int main(int argc, char **argv) { + Kokkos::ScopeGuard guard(argc, argv); + + sierra::Env::set_input_file_required(false); + + testing::InitGoogleTest(&argc, argv); + + krino::Startup startup__(argc, argv); + + stk::unit_test_util::create_parallel_output(sierra::Env::parallel_rank()); + + return RUN_ALL_TESTS(); +} diff --git a/packages/krino/krino/unit_tests/CMakeLists.txt b/packages/krino/krino/unit_tests/CMakeLists.txt new file mode 100644 index 000000000000..3d92207e1423 --- /dev/null +++ b/packages/krino/krino/unit_tests/CMakeLists.txt @@ -0,0 +1,14 @@ + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_EXECUTABLE_AND_TEST( + krino_unit + SOURCES ${SOURCES} + COMM serial mpi + NUM_MPI_PROCS 1-4 + NOEXEPREFIX NOEXESUFFIX + ) diff --git a/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt b/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt index 65456ef38091..961a9218c3b9 100644 --- a/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt +++ b/packages/stk/stk_emend/stk_emend/independent_set/CMakeLists.txt @@ -46,8 +46,18 @@ # SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${${PACKAGE_NAME}_SOURCE_DIR}) FILE(GLOB HEADERS *.hpp) +FILE(GLOB SOURCES *.cpp) + +TRIBITS_ADD_LIBRARY( + stk_emend + HEADERS ${HEADERS} + SOURCES ${SOURCES} + ) INSTALL(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}/stk_emend/independent_set) diff --git a/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp b/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp new file mode 100644 index 000000000000..b2ef6c6c65a0 --- /dev/null +++ b/packages/stk/stk_emend/stk_emend/independent_set/IndependentSetDummy.cpp @@ -0,0 +1,3 @@ +namespace independent_set { +void IndependentSetDummy() {} +} From 7723a6a81a50b66f2a3b660427a8c08356721648 Mon Sep 17 00:00:00 2001 From: rstumin Date: Wed, 20 Oct 2021 13:37:58 -0600 Subject: [PATCH 52/98] fixed some scalar traits type compile errors --- .../Smoothed-Aggregation/MueLu_SaPFactory_def.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp index 9a6bc42eb819..7abe736f3ce6 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp @@ -546,8 +546,8 @@ namespace MueLu { notFlippedLeftBound = leftBound; notFlippedRghtBound = rghtBound; - if ((Teuchos::ScalarTraits::real(rsumTarget) >= Teuchos::ScalarTraits::real(leftBound*nEntries)) && - (Teuchos::ScalarTraits::real(rsumTarget) <= Teuchos::ScalarTraits::real(rghtBound*nEntries))) + if ((Teuchos::ScalarTraits::real(rsumTarget) >= Teuchos::ScalarTraits::real(leftBound*as(nEntries))) && + (Teuchos::ScalarTraits::real(rsumTarget) <= Teuchos::ScalarTraits::real(rghtBound*as(nEntries)))) hasFeasibleSol = true; else { hasFeasibleSol=false; @@ -558,7 +558,7 @@ namespace MueLu { // something large so that an if statement will be false aBigNumber = Teuchos::ScalarTraits::zero(); for (LocalOrdinal i = 0; i < nEntries; i++) { - if ( Teuchos::ScalarTraits::magnitude(orig[i]) > aBigNumber) + if ( Teuchos::ScalarTraits::magnitude(orig[i]) > Teuchos::ScalarTraits::magnitude(aBigNumber)) aBigNumber = Teuchos::ScalarTraits::magnitude(orig[i]); } aBigNumber = aBigNumber+ (Teuchos::ScalarTraits::magnitude(leftBound) + Teuchos::ScalarTraits::magnitude(rghtBound))*as(100.0); @@ -594,13 +594,13 @@ namespace MueLu { // compute how far the rowSum is off from the target row sum taking into account // numbers that have been shifted to satisfy bound constraint - rowSumDeviation = leftBound*closestToLeftBound + (nEntries-closestToRghtBound)*rghtBound - rsumTarget; + rowSumDeviation = leftBound*as(closestToLeftBound) + as((nEntries-closestToRghtBound))*rghtBound - rsumTarget; for (LocalOrdinal i=closestToLeftBound; i < closestToRghtBound; i++) rowSumDeviation += origSorted[i]; // the code that follow after this if statement assumes that rowSumDeviation is positive. If this // is not the case, flip the signs of everything so that rowSumDeviation is now positive. // Later we will flip the data back to its original form. - if (rowSumDeviation < Teuchos::ScalarTraits::zero()) { + if (Teuchos::ScalarTraits::real(rowSumDeviation) < Teuchos::ScalarTraits::zero()) { flipped = true; temp = leftBound; leftBound = -rghtBound; rghtBound = temp; From 01871501b3ac49bd4cf48c324bc7af0c39bccc64 Mon Sep 17 00:00:00 2001 From: Evan Harvey Date: Wed, 20 Oct 2021 16:47:24 -0600 Subject: [PATCH 53/98] packages/framework: Point to top-level ini files --- packages/framework/pr_tools/trilinos_pr.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/framework/pr_tools/trilinos_pr.ini b/packages/framework/pr_tools/trilinos_pr.ini index cd4e817353a5..570296de3400 100644 --- a/packages/framework/pr_tools/trilinos_pr.ini +++ b/packages/framework/pr_tools/trilinos_pr.ini @@ -76,7 +76,7 @@ # ===================================================================================================================== [load-env] -supported-systems : ../../../../GenConfig/LoadEnv/examples/trilinos/supported-systems.ini -supported-envs : ../../../../GenConfig/LoadEnv/examples/trilinos/supported-envs.ini -environment-specs : ../../../../GenConfig/LoadEnv/examples/trilinos/environment-specs.ini +supported-systems : ../../../../GenConfig/LoadEnv/examples/supported-systems.ini +supported-envs : ../../../../GenConfig/LoadEnv/examples/supported-envs.ini +environment-specs : ../../../../GenConfig/LoadEnv/examples/environment-specs.ini pullrequest-specs : ./pullrequest-specs.ini From 6870a3e9862c2b4ecd7ba9b3ab3ced074e0079eb Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 20 Oct 2021 21:00:50 -0600 Subject: [PATCH 54/98] Tpetra: Fixing stride bug --- packages/tpetra/core/src/Tpetra_MultiVector_def.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp b/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp index deb9a3d2617b..f13ca22e662d 100644 --- a/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp +++ b/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp @@ -322,7 +322,9 @@ namespace { // (anonymous) { // FIXME (mfh 15 Mar 2019) DualView doesn't have a stride // method yet, but its Views do. - size_t strides[WrappedOrNotDualViewType::t_dev::Rank]; + // NOTE: dv.stride() returns a vector of length one + // more than its rank + size_t strides[WrappedOrNotDualViewType::t_dev::Rank+1]; dv.stride(strides); const size_t LDA = strides[1]; const size_t numRows = dv.extent (0); From 3d18a538f99523c61475b6475428eade9452b86f Mon Sep 17 00:00:00 2001 From: rstumin Date: Thu, 21 Oct 2021 08:51:45 -0600 Subject: [PATCH 55/98] fixed one more comparison that needed a teuchos scalar traits cast to a real. --- .../Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp index 7abe736f3ce6..264e165d9983 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp @@ -400,7 +400,7 @@ namespace MueLu { if (nnz != 0) { vals = ArrayView(const_cast(vals1.getRawPtr()), nnz); - Scalar rsumTarget = Teuchos::ScalarTraits::zero(); + Scalar rsumTarget = zero; for (size_t j = 0; j < nnz; j++) rsumTarget += vals[j]; if (nnz > as(maxEntriesPerRow)) { @@ -600,7 +600,7 @@ namespace MueLu { // the code that follow after this if statement assumes that rowSumDeviation is positive. If this // is not the case, flip the signs of everything so that rowSumDeviation is now positive. // Later we will flip the data back to its original form. - if (Teuchos::ScalarTraits::real(rowSumDeviation) < Teuchos::ScalarTraits::zero()) { + if (Teuchos::ScalarTraits::real(rowSumDeviation) < Teuchos::ScalarTraits::real(Teuchos::ScalarTraits::zero())) { flipped = true; temp = leftBound; leftBound = -rghtBound; rghtBound = temp; From c96aeed141bdfa1cf59d8bcbe5e16cc6c7cd59b4 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Thu, 21 Oct 2021 11:21:25 -0600 Subject: [PATCH 56/98] STK: Updated snapshot 10-21-21 11:21 --- packages/stk/.clang-format | 12 ++ .../stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp | 28 ++- .../stk_mesh/stk_mesh/base/SideSetHelper.cpp | 2 +- .../stk_mesh/stk_mesh/base/SideSetUtil.cpp | 2 +- .../stk_mesh/stk_mesh/base/SkinMeshUtil.cpp | 2 +- .../baseImpl/elementGraph/ElemElemGraph.cpp | 201 +++++++++++------- .../baseImpl/elementGraph/ElemElemGraph.hpp | 21 +- .../elementGraph/ElemElemGraphImpl.cpp | 3 - .../elementGraph/ElemElemGraphImpl.hpp | 42 +++- .../ElemGraphShellConnections.cpp | 8 +- .../baseImpl/elementGraph/GraphEdgeData.cpp | 109 +++++++--- .../baseImpl/elementGraph/GraphEdgeData.hpp | 67 +----- .../stk_mesh/UnitTestConnectivity.cpp | 1 - .../UnitTestGraphWithShellConnections.cpp | 4 +- .../element_graph/UnitTestElemElemGraph.cpp | 12 +- .../ngp/UnitTestNgpVirtualFunction.cpp | 3 + .../stk_util/registry/ProductRegistry.cpp | 2 +- 17 files changed, 305 insertions(+), 214 deletions(-) create mode 100644 packages/stk/.clang-format diff --git a/packages/stk/.clang-format b/packages/stk/.clang-format new file mode 100644 index 000000000000..737390ac5373 --- /dev/null +++ b/packages/stk/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: Google +AlignAfterOpenBracket: DontAlign +AlignConsecutiveAssignments: 'false' +AlignConsecutiveDeclarations: 'false' +AllowShortFunctionsOnASingleLine: 'Inline' +BreakBeforeBraces: Linux +ColumnLimit: '120' +IndentWidth: '2' +ReflowComments: 'true' +SpaceAfterCStyleCast: 'true' +BinPackParameters: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true diff --git a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp index 6481f55e257c..55fe6152a797 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp @@ -330,25 +330,31 @@ void DeviceMesh::fill_sparse_connectivities(const stk::mesh::BulkData& bulk_in) for(stk::mesh::EntityRank connectedRank=stk::topology::EDGE_RANK; connectedRank 0; for(unsigned iEntity=0; iEntity 0) { + const stk::mesh::Entity* connectedEntities = stkBucket.begin(iEntity, connectedRank); + const stk::mesh::ConnectivityOrdinal* connectedOrdinals = stkBucket.begin_ordinals(iEntity, connectedRank); + const stk::mesh::Permutation* permutations = hasPermutation ? stkBucket.begin_permutations(iEntity, connectedRank) : nullptr; + for(unsigned i=0; i areAllConnectedElemsAir(eeGraph.get_mesh().bucket(element).topology().num_sides(), true); - const GraphEdgesForElement& graphEdges = eeGraph.get_edges_for_element(local_id); + GraphEdgesForElement graphEdges = eeGraph.get_edges_for_element(local_id); for(const GraphEdge & graphEdge : graphEdges) { if(is_connected_element_air(graphEdge)) diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraph.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraph.cpp index 8ecc85a202eb..6d899c2ed603 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraph.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraph.cpp @@ -136,9 +136,24 @@ void ElemElemGraph::fill_from_mesh() SideNodeToReceivedElementDataMap elementSidesReceived = communicate_shared_sides(elementSideIdsToSend); fill_parallel_graph(elementSideIdsToSend, elementSidesReceived); + stk::util::sort_and_unique(m_edgesToAdd, GraphEdgeLessByElem1()); + m_graph.add_sorted_edges(m_edgesToAdd); + + { + std::vector emptyAdd; + m_edgesToAdd.swap(emptyAdd); + } + GraphInfo graphInfo(m_graph, m_parallelInfoForGraphEdges, m_element_topologies); remove_graph_edges_blocked_by_shell(graphInfo); + m_graph.delete_sorted_edges(m_edgesToDelete); + + { + std::vector emptyDelete; + m_edgesToDelete.swap(emptyDelete); + } + m_modCycleWhenGraphModified = m_bulk_data.synchronized_count(); } @@ -146,7 +161,7 @@ size_t ElemElemGraph::num_parallel_edges() const { size_t numParallelEdges = 0; for (size_t i = 0; i < m_graph.get_num_elements_in_graph(); ++i) { - const GraphEdgesForElement& graphEdges = m_graph.get_edges_for_element(i); + const GraphEdgesForElement graphEdges = m_graph.get_edges_for_element(i); for (const GraphEdge& graphEdge : graphEdges) { if (!graphEdge.is_elem2_local()) { ++numParallelEdges; @@ -251,6 +266,8 @@ int ElemElemGraph::size_data_members() void ElemElemGraph::clear_data_members() { m_graph.clear(); + m_edgesToAdd.clear(); + m_edgesToDelete.clear(); m_idMapper.clear(); m_element_topologies.clear(); m_any_shell_elements_exist = false; @@ -264,21 +281,19 @@ void ElemElemGraph::clear_data_members() void ElemElemGraph::fill_elements_attached_to_local_nodes(const stk::mesh::EntityVector& sideNodesOfReceivedElement, stk::mesh::EntityId elementId, stk::topology elementTopology, - stk::mesh::EntityVector& scratchEntityVector, impl::SerialElementDataVector& connectedElementDataVector) const { connectedElementDataVector.clear(); impl::get_elements_with_larger_ids_connected_via_sidenodes(m_bulk_data, elementId, elementTopology, m_idMapper, sideNodesOfReceivedElement, - scratchEntityVector, connectedElementDataVector); + m_scratchEntityVector, connectedElementDataVector); } void ElemElemGraph::get_elements_attached_to_remote_nodes(const stk::mesh::EntityVector& sideNodesOfReceivedElement, stk::mesh::EntityId elementId, stk::topology elementTopology, - stk::mesh::EntityVector& scratchEntityVector, impl::ParallelElementDataVector& connectedElementDataVector) const { connectedElementDataVector.clear(); impl::get_elements_connected_via_sidenodes(m_bulk_data, elementId, elementTopology, m_idMapper, - sideNodesOfReceivedElement, scratchEntityVector, connectedElementDataVector); + sideNodesOfReceivedElement, m_scratchEntityVector, connectedElementDataVector); } bool is_coincident(const stk::mesh::impl::TopologyChecker& topoChecker, @@ -310,7 +325,6 @@ void ElemElemGraph::add_local_graph_edges_for_elem(const stk::mesh::MeshIndex &m impl::LocalId local_elem_id, std::vector &graphEdges, std::vector &coincidentGraphEdges, - stk::mesh::EntityVector& scratchEntityVector, stk::mesh::EntityVector& side_nodes, impl::SerialElementDataVector& connectedElementDataVector, bool only_consider_upper_symmetry) const @@ -325,7 +339,7 @@ void ElemElemGraph::add_local_graph_edges_for_elem(const stk::mesh::MeshIndex &m for(int side_index=0; side_index(0); for (const impl::SerialElementData & otherElem: connectedElementDataVector) { @@ -345,38 +359,39 @@ void ElemElemGraph::add_local_graph_edges_for_elem(const stk::mesh::MeshIndex &m stk::util::sort_and_unique(graphEdges, GraphEdgeLessByElem2()); } -template -void add_edges_to_graph(const std::vector &newGraphEdges, GraphType &graph) +class GraphEdgeAdder { - if (!newGraphEdges.empty()) - { - for(const stk::mesh::GraphEdge &graphEdge : newGraphEdges) - { - graph.add_edge(graphEdge); - graph.add_edge(create_symmetric_edge(graphEdge)); - } - } -} +public: + GraphEdgeAdder(std::vector& edges) : m_edges(edges) {} + void add_edge(const GraphEdge& edge) { m_edges.emplace_back(edge); } +private: + std::vector& m_edges; +}; void ElemElemGraph::fill_graph() { + m_edgesToAdd.clear(); + const stk::mesh::BucketVector& elemBuckets = m_bulk_data.get_buckets(stk::topology::ELEM_RANK, m_bulk_data.mesh_meta_data().locally_owned_part()); - std::vector newGraphEdges; - std::vector coincidentGraphEdges; - stk::mesh::EntityVector scratchEntityVector; stk::mesh::EntityVector side_nodes; impl::SerialElementDataVector connectedElementDataVector; + const bool only_consider_upper_symmetry = true; for(size_t i=0; i newlySharedEdges; - stk::mesh::EntityVector scratchEntityVector; impl::ParallelElementDataVector localElementsAttachedToReceivedNodes; for (SideNodeToReceivedElementDataMap::value_type & receivedElementDataForNodes: elementSidesReceived) { for(const stk::mesh::impl::ParallelElementData &remoteElementData : receivedElementDataForNodes.second) { get_elements_attached_to_remote_nodes(remoteElementData.get_side_nodes(), remoteElementData.get_element_identifier(), - remoteElementData.get_element_topology(), scratchEntityVector, localElementsAttachedToReceivedNodes); + remoteElementData.get_element_topology(), localElementsAttachedToReceivedNodes); for(const impl::ParallelElementData &localElemAttachedToNodes : localElementsAttachedToReceivedNodes) create_parallel_graph_edge(localElemAttachedToNodes, remoteElementData, elementSidesToSend, newlySharedEdges); } @@ -603,7 +617,7 @@ void ElemElemGraph::connect_remote_element_to_existing_graph( const impl::Shared impl::LocalId negSgnRemoteElemId = -1 * static_cast(receivedSharedEdge.get_remote_element_global_id()); GraphEdge graphEdge(local_elem_id, side_index, negSgnRemoteElemId, receivedSharedEdge.get_remote_element_side_index()); - m_graph.add_edge(graphEdge); + m_edgesToAdd.push_back(graphEdge); impl::ParallelInfo parInfo(receivedSharedEdge.get_remote_processor_rank(), permutationIfConnected.permutation_number, @@ -1052,9 +1066,16 @@ void ElemElemGraph::collect_local_shell_connectivity_data(const stk::mesh::impl: } } -void ElemElemGraph::communicate_shell_connectivity(std::vector& shellConnectivityList, +bool ElemElemGraph::communicate_if_shell_connectivity(std::vector& shellConnectivityList, const std::vector &deletedShells) { + unsigned localNumShells = shellConnectivityList.size(); + unsigned globalMaxShells = 0; + stk::all_reduce_max(m_bulk_data.parallel(), &localNumShells, &globalMaxShells, 1); + if (globalMaxShells == 0) { + return false; + } + stk::CommSparse shellComm(m_bulk_data.parallel()); pack_shell_connectivity(shellComm, shellConnectivityList, deletedShells); shellComm.allocate_buffers(); @@ -1075,6 +1096,8 @@ void ElemElemGraph::communicate_shell_connectivity(std::vector 0; } void ElemElemGraph::delete_local_connections_and_collect_remote(const stk::mesh::impl::DeletedElementInfoVector &elements_to_delete, @@ -1091,7 +1114,7 @@ void ElemElemGraph::delete_local_connections_and_collect_remote(const stk::mesh: bool local_connection = connected_elem_id >= 0; if (local_connection) { - m_graph.delete_edge(create_symmetric_edge(graphEdge)); + m_edgesToDelete.push_back(create_symmetric_edge(graphEdge)); } else { impl::ParallelInfo& parallelInfo = m_parallelInfoForGraphEdges.get_parallel_info_for_graph_edge(graphEdge); int remote_proc = parallelInfo.get_proc_rank_of_neighbor(); @@ -1109,9 +1132,12 @@ void ElemElemGraph::delete_local_connections_and_collect_remote(const stk::mesh: { m_coincidentGraph.delete_edge(create_symmetric_edge(graphEdge)); } - - m_graph.delete_all_edges(elem_to_delete_id); m_coincidentGraph.delete_all_edges(elem_to_delete_id); + + GraphEdgesForElement graphEdgesForElement = m_graph.get_edges_for_element(elem_to_delete_id); + for(const GraphEdge& edge : graphEdgesForElement) { + m_edgesToDelete.push_back(edge); + } } } @@ -1156,7 +1182,7 @@ void ElemElemGraph::delete_remote_connection(stk::mesh::Entity connected_elem, s const GraphEdge & graphEdge = m_graph.get_edge_for_element(connected_elem_id, conn_elem_index); if (graphEdge.elem2() == static_cast(-deleted_elem_global_id)) { m_parallelInfoForGraphEdges.erase_parallel_info_for_graph_edge(graphEdge); - m_graph.delete_edge_from_graph(connected_elem_id, conn_elem_index); + m_edgesToDelete.push_back(graphEdge); found_deleted_elem = true; break; } @@ -1213,7 +1239,7 @@ void ElemElemGraph::reconnect_volume_elements_across_deleted_shells(std::vector< stk::mesh::Entity remoteElement = m_bulk_data.get_entity(stk::topology::ELEM_RANK, data.m_farElementId); if (m_bulk_data.is_valid(remoteElement)) { impl::LocalId remoteElementId = get_local_element_id(remoteElement); - m_graph.add_edge(stk::mesh::GraphEdge(localElementId, data.m_nearElementSide, remoteElementId, data.m_farElementSide)); + m_edgesToAdd.push_back(stk::mesh::GraphEdge(localElementId, data.m_nearElementSide, remoteElementId, data.m_farElementSide)); } } else { @@ -1244,13 +1270,15 @@ stk::mesh::impl::DeletedElementInfoVector ElemElemGraph::filter_delete_elements_ void ElemElemGraph::delete_elements(const stk::mesh::impl::DeletedElementInfoVector &elements_to_delete_argument) { + m_edgesToAdd.clear(); + m_edgesToDelete.clear(); stk::mesh::impl::DeletedElementInfoVector elements_to_delete = filter_delete_elements_argument(elements_to_delete_argument); std::vector shellConnectivityList; std::vector deletedNonCoincidentShells; collect_local_shell_connectivity_data(elements_to_delete, shellConnectivityList, deletedNonCoincidentShells); - communicate_shell_connectivity(shellConnectivityList, deletedNonCoincidentShells); + const bool shellsExist = communicate_if_shell_connectivity(shellConnectivityList, deletedNonCoincidentShells); std::vector local_elem_and_remote_connected_elem; delete_local_connections_and_collect_remote(elements_to_delete, local_elem_and_remote_connected_elem); @@ -1262,21 +1290,25 @@ void ElemElemGraph::delete_elements(const stk::mesh::impl::DeletedElementInfoVec delete_remote_connections(remote_edges); - unsigned localNumShells = shellConnectivityList.size(); - unsigned globalMaxShells = 0; - stk::all_reduce_max(m_bulk_data.parallel(), &localNumShells, &globalMaxShells, 1); - if (globalMaxShells > 0) { + stk::util::sort_and_unique(m_edgesToDelete, GraphEdgeLessByElem1()); + m_graph.delete_sorted_edges(m_edgesToDelete); + { + std::vector emptyDelete; + m_edgesToDelete.swap(emptyDelete); + } + + if (shellsExist) { reconnect_volume_elements_across_deleted_shells(shellConnectivityList); } - m_modCycleWhenGraphModified = m_bulk_data.synchronized_count(); -} + stk::util::sort_and_unique(m_edgesToAdd, GraphEdgeLessByElem1()); + m_graph.add_sorted_edges(m_edgesToAdd); + { + std::vector emptyAdd; + m_edgesToAdd.swap(emptyAdd); + } -template -void add_both_edges_between_local_elements(const GraphEdge& graphEdge, GraphType &graph) -{ - graph.add_edge(graphEdge); - graph.add_edge(create_symmetric_edge(graphEdge)); + m_modCycleWhenGraphModified = m_bulk_data.synchronized_count(); } template @@ -1285,24 +1317,13 @@ void ElemElemGraph::add_new_local_edges_to_graph(GraphType &graph, const std::ve for (const stk::mesh::GraphEdge& graphEdge : newGraphEdges) { stk::mesh::Entity neighbor = m_idMapper.local_to_entity(graphEdge.elem2()); - if (is_valid_graph_element(neighbor)) - add_both_edges_between_local_elements(graphEdge, graph); + if (is_valid_graph_element(neighbor)) { + graph.add_edge(graphEdge); + graph.add_edge(create_symmetric_edge(graphEdge)); + } } } -void ElemElemGraph::add_local_edges(stk::mesh::Entity elem_to_add, impl::LocalId new_elem_id, - stk::mesh::EntityVector& scratchEntityVector, - stk::mesh::EntityVector& side_nodes, - impl::SerialElementDataVector& connectedElementDataVector) -{ - std::vector newGraphEdges; - std::vector coincidentGraphEdges; - bool only_consider_upper_symmetry = false; - add_local_graph_edges_for_elem(m_bulk_data.mesh_index(elem_to_add), new_elem_id, newGraphEdges, coincidentGraphEdges, scratchEntityVector, side_nodes, connectedElementDataVector, only_consider_upper_symmetry); - add_new_local_edges_to_graph(m_graph, newGraphEdges); - add_new_local_edges_to_graph(m_coincidentGraph, coincidentGraphEdges); -} - void ElemElemGraph::add_vertex(impl::LocalId newElemLocalId, stk::mesh::Entity elem) { m_idMapper.add_new_entity_with_local_id(elem, newElemLocalId); @@ -1332,14 +1353,17 @@ stk::mesh::EntityVector ElemElemGraph::filter_add_elements_arguments(const stk:: void ElemElemGraph::add_elements_locally(const stk::mesh::EntityVector& allElementsNotAlreadyInGraph) { m_idMapper.make_space_for_new_elements(allElementsNotAlreadyInGraph); - stk::mesh::EntityVector scratchEntityVector; stk::mesh::EntityVector side_nodes; impl::SerialElementDataVector connectedElementDataVector; + const bool only_consider_upper_symmetry = false; for(stk::mesh::Entity newElem : allElementsNotAlreadyInGraph) { impl::LocalId newElemLocalId = get_new_local_element_id_from_pool(); add_vertex(newElemLocalId, newElem); - add_local_edges(newElem, newElemLocalId, scratchEntityVector, side_nodes, connectedElementDataVector); + add_local_graph_edges_for_elem(m_bulk_data.mesh_index(newElem), newElemLocalId, m_newGraphEdges, m_coincidentGraphEdges, side_nodes, connectedElementDataVector, only_consider_upper_symmetry); + GraphEdgeAdder graphEdgeAdder(m_edgesToAdd); + add_new_local_edges_to_graph(graphEdgeAdder, m_newGraphEdges); + add_new_local_edges_to_graph(m_coincidentGraph, m_coincidentGraphEdges); } } @@ -1372,7 +1396,7 @@ void ElemElemGraph::add_elements(const stk::mesh::EntityVector &allUnfilteredEle { addedShells.insert(element); } - } else { + } else if (m_any_shell_elements_exist) { stk::mesh::EntityVector connectedShells = impl::gather_shells_connected_to_solid_element_on_given_side(m_bulk_data, element, side); bool shouldAddThisElementSide = false; @@ -1394,12 +1418,21 @@ void ElemElemGraph::add_elements(const stk::mesh::EntityVector &allUnfilteredEle SideNodeToReceivedElementDataMap elementSidesReceived = communicate_shared_sides(only_added_elements); fill_parallel_graph(only_added_elements, elementSidesReceived); + stk::util::sort_and_unique(m_edgesToAdd, GraphEdgeLessByElem1()); + m_graph.add_sorted_edges(m_edgesToAdd); + + { + std::vector emptyAdd; + m_edgesToAdd.swap(emptyAdd); + } + bool anyShellsExist = m_any_shell_elements_exist; if (m_bulk_data.parallel_size() > 1) { anyShellsExist = stk::is_true_on_any_proc(m_bulk_data.parallel(), m_any_shell_elements_exist); } if (anyShellsExist) { + ThrowRequire(m_edgesToDelete.empty()); stk::mesh::EntityVector addedShellsVector; GraphInfo graphInfo(m_graph, m_parallelInfoForGraphEdges, m_element_topologies); remove_graph_edges_blocked_by_shell(graphInfo); @@ -1426,6 +1459,14 @@ void ElemElemGraph::add_elements(const stk::mesh::EntityVector &allUnfilteredEle unpack_remote_edge_across_shell(comm); } + stk::util::sort_and_unique(m_edgesToDelete, GraphEdgeLessByElem1()); + m_graph.delete_sorted_edges(m_edgesToDelete); + + { + std::vector emptyDelete; + m_edgesToDelete.swap(emptyDelete); + } + m_modCycleWhenGraphModified = m_bulk_data.synchronized_count(); } @@ -1442,7 +1483,7 @@ void ElemElemGraph::break_remote_shell_connectivity_and_pack(stk::CommSparse &co int sharingProc = get_owning_proc_id_of_remote_element(localElem, index); if (phase == 1) { - m_graph.delete_edge_from_graph(leftId, index); + m_edgesToDelete.push_back(graphEdge); } else { @@ -1500,12 +1541,13 @@ void ElemElemGraph::pack_remote_edge_across_shell(stk::CommSparse &comm, stk::me for(size_t i=0; i(remoteElemId))) { - delete_graph_edge(graphEdge); + m_edgesToDelete.push_back(graphEdge); break; } else @@ -1675,13 +1717,6 @@ bool ElemElemGraph::is_valid_graph_edge(const GraphEdge &graphEdge) const return true; } -void ElemElemGraph::delete_graph_edge(const GraphEdge &graphEdge) -{ - m_parallelInfoForGraphEdges.erase_parallel_info_for_graph_edge(graphEdge); - m_coincidentGraph.delete_edge(graphEdge); - m_graph.delete_edge(graphEdge); -} - namespace impl { impl::ElemSideToProcAndFaceId gather_element_side_ids_to_send(const stk::mesh::BulkData& bulkData) @@ -1699,11 +1734,11 @@ impl::ElemSideToProcAndFaceId gather_element_side_ids_to_send(const stk::mesh::B const unsigned num_elements = bulkData.num_elements(node); for(unsigned elemIdx=0; elemIdx &graphEdges, std::vector &coincidentGraphEdges, - stk::mesh::EntityVector& scratchEntityVector, stk::mesh::EntityVector& side_nodes, impl::SerialElementDataVector& connectedElementDataVector, bool only_consider_upper_symmetry = true) const; @@ -245,12 +244,10 @@ class ElemElemGraph void fill_elements_attached_to_local_nodes(const stk::mesh::EntityVector& sideNodesOfReceivedElement, stk::mesh::EntityId elementId, stk::topology elementTopology, - stk::mesh::EntityVector& scratchNodeVector, impl::SerialElementDataVector& connectedElementDataVector) const; void get_elements_attached_to_remote_nodes(const stk::mesh::EntityVector& sideNodesOfReceivedElement, stk::mesh::EntityId elementId, stk::topology elementTopology, - stk::mesh::EntityVector& scratchEntityVector, impl::ParallelElementDataVector& connectedElementDataVector) const; impl::LocalId get_new_local_element_id_from_pool(); @@ -273,8 +270,8 @@ class ElemElemGraph std::vector& shellConnectivityList, std::vector &deletedShells); - void communicate_shell_connectivity(std::vector& shellConnectivityList, - const std::vector &deletedShells); + bool communicate_if_shell_connectivity(std::vector& shellConnectivityList, + const std::vector &deletedShells); void delete_local_connections_and_collect_remote(const stk::mesh::impl::DeletedElementInfoVector &elements_to_delete, std::vector& local_elem_and_remote_connected_elem); @@ -300,16 +297,19 @@ class ElemElemGraph bool is_valid_graph_edge(const GraphEdge &graphEdge) const; - void delete_graph_edge(const GraphEdge &graphEdge); - stk::mesh::BulkData &m_bulk_data; Graph m_graph; + std::vector m_edgesToAdd; + std::vector m_edgesToDelete; + std::vector m_newGraphEdges; + std::vector m_coincidentGraphEdges; ParallelInfoForGraphEdges m_parallelInfoForGraphEdges; unsigned m_modCycleWhenGraphModified; std::vector m_deleted_element_local_id_pool; std::vector m_element_topologies; bool m_any_shell_elements_exist; std::vector m_deleted_elem_pool; + mutable stk::mesh::EntityVector m_scratchEntityVector; impl::SparseGraph m_coincidentGraph; impl::ElementLocalIdMapper m_idMapper; SideConnector m_sideConnector; @@ -321,11 +321,6 @@ class ElemElemGraph const stk::mesh::PartVector& skin_parts, std::vector &shared_modified); - void add_local_edges(stk::mesh::Entity elem_to_add, impl::LocalId new_elem_id, - stk::mesh::EntityVector& scratchEntityVector, - stk::mesh::EntityVector& side_nodes, - impl::SerialElementDataVector& connectedElementDataVector); - template void add_new_local_edges_to_graph(GraphType &graph, const std::vector &newGraphEdges); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.cpp index 38dccc89a949..cd95704217c7 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.cpp @@ -37,7 +37,6 @@ bool fill_topologies(stk::mesh::ElemElemGraph& eeGraph, std::vector& element_topologies) { const stk::mesh::BulkData& bulkData = eeGraph.get_mesh(); - stk::mesh::Graph& graph = eeGraph.get_graph(); bool areAnyElementsShells = false; const stk::mesh::BucketVector & elemBuckets = bulkData.get_buckets(stk::topology::ELEM_RANK, bulkData.mesh_meta_data().locally_owned_part()); @@ -45,11 +44,9 @@ bool fill_topologies(stk::mesh::ElemElemGraph& eeGraph, areAnyElementsShells |= bucket->topology().is_shell(); stk::topology elemTopology = bucket->topology(); - unsigned numSides = elemTopology.num_sides(); for(stk::mesh::Entity element : *bucket) { impl::LocalId elemLocalId = localMapper.entity_to_local(element); element_topologies[elemLocalId] = elemTopology; - graph.reserve_edges(elemLocalId, numSides); } } return areAnyElementsShells; diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.hpp index 9f6f9fb86e78..a0ec6ec7f9f4 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemElemGraphImpl.hpp @@ -297,7 +297,7 @@ struct GraphEdge {} GraphEdge(const GraphEdge&& rhs) - : vertex1(std::move(rhs.vertex1)), vertex2(std::move(rhs.vertex2)) + : vertex1(rhs.vertex1), vertex2(rhs.vertex2) {} GraphEdge& operator=(const GraphEdge&) = default; @@ -350,7 +350,45 @@ struct GraphEdge impl::LocalId vertex2; }; -typedef GraphEdge CoincidentElementConnection; +using CoincidentElementConnection = GraphEdge; + +struct GraphEdgeLessByElem1 { + bool operator()(const GraphEdge& a, const GraphEdge& b) const + { + impl::LocalId a_elem1 = a.elem1(); + impl::LocalId b_elem1 = b.elem1(); + + if (a_elem1 != b_elem1) + { + return a_elem1 < b_elem1; + } + + impl::LocalId a_elem2 = std::abs(a.elem2()); + impl::LocalId b_elem2 = std::abs(b.elem2()); + if (a_elem2 != b_elem2) + { + return a_elem2 < b_elem2; + } + + int a_side2 = a.side2(); + int b_side2 = b.side2(); + if (a_side2 != b_side2) + { + return a_side2 < b_side2; + } + else + { + return a.side1() < b.side1(); + } + } +}; + +inline +bool operator<(const GraphEdge& a, const GraphEdge& b) +{ + GraphEdgeLessByElem1 lessByElem1; + return lessByElem1(a, b); +} struct GraphEdgeLessByElem2 { bool operator()(const GraphEdge& a, const GraphEdge& b) const diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemGraphShellConnections.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemGraphShellConnections.cpp index 66f636901104..e8578433b975 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemGraphShellConnections.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/ElemGraphShellConnections.cpp @@ -96,7 +96,7 @@ bool SideConnections::does_side_have_both_connection_to_shell_and_to_nonshell(in } -void delete_non_shell_graph_edges(GraphInfo &graphInfo, const stk::mesh::impl::ElementSidePair &elementSidePair) +void fill_non_shell_graph_edges_to_delete(GraphInfo &graphInfo, const stk::mesh::impl::ElementSidePair &elementSidePair, std::vector& edgesToDelete) { for(const stk::mesh::GraphEdge& graphEdge : graphInfo.graph.get_edges_for_element_side(elementSidePair.first, elementSidePair.second)) { @@ -107,19 +107,21 @@ void delete_non_shell_graph_edges(GraphInfo &graphInfo, const stk::mesh::impl::E { if(!impl::is_local_element(graphEdge.elem2())) graphInfo.parGraphInfo.erase_parallel_info_for_graph_edge(graphEdge); - graphInfo.graph.delete_edge(graphEdge); + edgesToDelete.push_back(graphEdge); } } } void remove_graph_edges_blocked_by_shell(GraphInfo &graphInfo) { + std::vector edgesToDelete; for(size_t localId = 0; localId < graphInfo.graph.get_num_elements_in_graph(); localId++) { SideConnections sideConnectionsForElement(graphInfo.elementTopologies[localId].num_sides()); for(int side : sideConnectionsForElement.get_sides_connected_to_shell_and_nonshell(graphInfo, localId)) - delete_non_shell_graph_edges(graphInfo, stk::mesh::impl::ElementSidePair(localId, side)); + fill_non_shell_graph_edges_to_delete(graphInfo, stk::mesh::impl::ElementSidePair(localId, side), edgesToDelete); } + graphInfo.graph.delete_sorted_edges(edgesToDelete); } } diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.cpp index 2de58d56c3ee..aa3ea37716bb 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.cpp @@ -1,5 +1,6 @@ #include "GraphEdgeData.hpp" #include "ElemElemGraphImpl.hpp" +#include #include namespace stk @@ -9,43 +10,44 @@ namespace mesh void Graph::set_num_local_elements(size_t n) { - m_graphEdges.resize(n); + m_elemOffsets.resize(n+1); } void Graph::add_new_element() { - m_graphEdges.push_back(GraphEdgesForElement()); - constexpr unsigned maxNumSides = 6; - m_graphEdges.back().reserve(maxNumSides); + if (m_elemOffsets.empty()) { + m_elemOffsets.assign(1, 0); + } + m_elemOffsets.push_back(m_graphEdges.size()); } size_t Graph::get_num_elements_in_graph() const { - return m_graphEdges.size(); + return m_elemOffsets.size() - 1; } size_t Graph::get_num_edges() const { - return m_numEdges; + return m_graphEdges.size(); } size_t Graph::get_num_edges_for_element(impl::LocalId elem) const { - return m_graphEdges[elem].size(); + return m_elemOffsets[elem+1] - m_elemOffsets[elem]; } const GraphEdge & Graph::get_edge_for_element(impl::LocalId elem1, size_t index) const { - return m_graphEdges[elem1].get_edge_at_index(index); + return m_graphEdges[m_elemOffsets[elem1]+index]; } void fill_graph_edges_for_elem_side(const GraphEdgesForElement &graphEdgesForElement, int side, std::vector& edges) { for(size_t i = 0; i < graphEdgesForElement.size(); ++i) { - if(graphEdgesForElement.get_edge_at_index(i).side1() == side) + if(graphEdgesForElement[i].side1() == side) { - edges.push_back(graphEdgesForElement.get_edge_at_index(i)); + edges.push_back(graphEdgesForElement[i]); } } } @@ -53,50 +55,93 @@ void fill_graph_edges_for_elem_side(const GraphEdgesForElement &graphEdgesForEle std::vector Graph::get_edges_for_element_side(impl::LocalId elem, int side) const { std::vector edges; - fill_graph_edges_for_elem_side(m_graphEdges[elem], side, edges); + fill_graph_edges_for_elem_side(get_edges_for_element(elem), side, edges); return edges; } -const GraphEdgesForElement& Graph::get_edges_for_element(impl::LocalId elem) const +GraphEdgesForElement Graph::get_edges_for_element(impl::LocalId elem) const { - return m_graphEdges[elem]; + const unsigned begin = m_elemOffsets[elem]; + const unsigned end = m_elemOffsets[elem+1]; + return GraphEdgesForElement(&m_graphEdges[begin], &m_graphEdges[end]); } -void Graph::reserve_edges(impl::LocalId localElemId, size_t numEdges) +void Graph::set_offsets() { - m_graphEdges[localElemId].reserve(numEdges); -} + const unsigned numOffsets = m_elemOffsets.size(); + m_elemOffsets.assign(std::max(1u, numOffsets), 0); -void Graph::add_edge(const GraphEdge &graphEdge) -{ - m_graphEdges[graphEdge.elem1()].emplace_back(graphEdge); - ++m_numEdges; + impl::LocalId prevElem = impl::INVALID_LOCAL_ID; + unsigned edgeCounter = 0; + for(const GraphEdge& edge : m_graphEdges) { + impl::LocalId elem1 = edge.elem1(); + if (elem1 != prevElem) { + if (prevElem != impl::INVALID_LOCAL_ID) { + m_elemOffsets[prevElem] = edgeCounter; + } + edgeCounter = 0; + prevElem = elem1; + } + ++edgeCounter; + } + + if (prevElem != impl::INVALID_LOCAL_ID) { + m_elemOffsets[prevElem] = edgeCounter; + } + + unsigned edgeOffset = 0; + size_t numElems = m_elemOffsets.size()-1; + for(size_t i=0; i::iterator; + +void Graph::add_sorted_edges(const std::vector& graphEdges) { - m_graphEdges[elem].erase_at_index(offset); - --m_numEdges; + ThrowAssertMsg(stk::util::is_sorted_and_unique(graphEdges, GraphEdgeLessByElem1()),"Input vector 'graphEdges' is expected to be sorted-and-unique"); + if (!graphEdges.empty()) { + stk::util::insert_keep_sorted(graphEdges, m_graphEdges, GraphEdgeLessByElem1()); + set_offsets(); + } } -void Graph::delete_edge(const GraphEdge &graphEdge) +void Graph::replace_sorted_edges(std::vector& graphEdges) { - const size_t numConnected = m_graphEdges[graphEdge.elem1()].size(); - for(size_t i=0; i& edgesToDelete) { - m_numEdges -= m_graphEdges[elem].size(); - m_graphEdges[elem].clear(); + for(const GraphEdge& edgeToDelete : edgesToDelete) { + impl::LocalId elem1 = edgeToDelete.elem1(); + for(unsigned offset = m_elemOffsets[elem1]; offset < m_elemOffsets[elem1+1]; ++offset) { + GraphEdge& thisEdge = m_graphEdges[offset]; + if (thisEdge == edgeToDelete) { + thisEdge.vertex1 = impl::INVALID_LOCAL_ID; + } + } + } + + if (!edgesToDelete.empty()) { + const unsigned offset = m_elemOffsets[edgesToDelete[0].elem1()]; + m_graphEdges.erase(std::remove_if(m_graphEdges.begin()+offset, m_graphEdges.end(), + [](const GraphEdge& edge) + { return edge.vertex1 == impl::INVALID_LOCAL_ID; }), + m_graphEdges.end()); + set_offsets(); + } } void Graph::clear() { - m_numEdges = 0; m_graphEdges.clear(); + m_elemOffsets.clear(); } impl::ParallelInfo& ParallelInfoForGraphEdges::get_parallel_info_for_graph_edge(const GraphEdge& graphEdge) diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.hpp index eb3a0a4b0661..c6640523b300 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/elementGraph/GraphEdgeData.hpp @@ -35,6 +35,8 @@ #define GRAPHEDGEDATA_HPP_ #include "ElemElemGraphImpl.hpp" +#include +#include namespace stk { @@ -43,51 +45,7 @@ namespace mesh struct GraphEdge; -class GraphEdgesForElement -{ -public: - typedef std::vector::const_iterator const_iterator; - - const_iterator begin() const - { - return graphEdges.begin(); - } - const_iterator end() const - { - return graphEdges.end(); - } - - size_t size() const - { - return graphEdges.size(); - } - size_t capacity() const - { - return graphEdges.capacity(); - } - void reserve(size_t size) - { - graphEdges.reserve(size); - } - const GraphEdge & get_edge_at_index(impl::LocalId elem) const - { - return graphEdges[elem]; - } - void emplace_back(const GraphEdge &graphEdge) - { - graphEdges.push_back(graphEdge); - } - void erase_at_index(impl::LocalId elem) - { - graphEdges.erase(graphEdges.begin() + elem); - } - void clear() - { - graphEdges.clear(); - } -private: - std::vector graphEdges; -}; +using GraphEdgesForElement = PairIter; class Graph { @@ -98,23 +56,18 @@ class Graph size_t get_num_edges() const; size_t get_num_edges_for_element(impl::LocalId elem) const; const GraphEdge & get_edge_for_element(impl::LocalId elem1, size_t index) const; - const GraphEdgesForElement& get_edges_for_element(impl::LocalId elem) const; + GraphEdgesForElement get_edges_for_element(impl::LocalId elem) const; std::vector get_edges_for_element_side(impl::LocalId elem, int side) const; - void reserve_edges(impl::LocalId localElemId, size_t numEdges); - void add_edge(const GraphEdge &graphEdge); - void delete_edge_from_graph(impl::LocalId local_elem_id, int offset); - void delete_edge(const GraphEdge &graphEdge); - void delete_all_edges(impl::LocalId elem); + void add_sorted_edges(const std::vector& graphEdge); + void replace_sorted_edges(std::vector& graphEdge); + void delete_sorted_edges(const std::vector& graphEdge); void clear(); - void delete_vertex(stk::mesh::impl::LocalId id) - { - m_graphEdges.erase(m_graphEdges.begin()+id); - } private: - std::vector m_graphEdges; - size_t m_numEdges = 0; + void set_offsets(); + std::vector m_graphEdges; + std::vector m_elemOffsets; }; class ParallelInfoForGraphEdges diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp index 2939e67a3119..30bc3a86673d 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp @@ -40,7 +40,6 @@ namespace { const stk::mesh::EntityRank nodeRank = stk::topology::NODE_RANK; -const stk::mesh::EntityRank edgeRank = stk::topology::EDGE_RANK; const stk::mesh::EntityRank faceRank = stk::topology::FACE_RANK; const stk::mesh::EntityRank elemRank = stk::topology::ELEM_RANK; const stk::mesh::EntityRank constraintRank = stk::topology::CONSTRAINT_RANK; diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestGraphWithShellConnections.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestGraphWithShellConnections.cpp index 9b44890d0ab4..72901b331b4c 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestGraphWithShellConnections.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestGraphWithShellConnections.cpp @@ -59,8 +59,8 @@ class GraphWithShells : public ::testing::Test void add_two_edges(const stk::mesh::GraphEdge& graphEdge1, const stk::mesh::GraphEdge& graphEdge2) { graph.add_new_element(); - graph.add_edge(graphEdge1); - graph.add_edge(graphEdge2); + std::vector edges = {graphEdge1, graphEdge2}; + graph.add_sorted_edges(edges); } void expect_graph_has_edges_for_element(ProcAndId procAndId, const std::vector &expectedEdges) { diff --git a/packages/stk/stk_unit_tests/stk_mesh/face_creation/element_graph/UnitTestElemElemGraph.cpp b/packages/stk/stk_unit_tests/stk_mesh/face_creation/element_graph/UnitTestElemElemGraph.cpp index d978c36d0b52..2c90eb94812f 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/face_creation/element_graph/UnitTestElemElemGraph.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/face_creation/element_graph/UnitTestElemElemGraph.cpp @@ -1020,10 +1020,12 @@ TEST(ElementGraph, test_parallel_graph_info_data_structure) stk::mesh::Graph graph; graph.set_num_local_elements(2); - graph.add_edge(stk::mesh::GraphEdge(0, 4, 1, 1)); - graph.add_edge(stk::mesh::GraphEdge(1, 1, 0, 4)); stk::mesh::GraphEdge graphEdge(1, 5, -3, other_side_ord); - graph.add_edge(graphEdge); + std::vector edges = + { stk::mesh::GraphEdge(0, 4, 1, 1), + stk::mesh::GraphEdge(1, 1, 0, 4), + graphEdge }; + graph.add_sorted_edges(edges); stk::mesh::ParallelInfoForGraphEdges parallel_graph(stk::parallel_machine_rank(MPI_COMM_WORLD)); int other_proc = 1; @@ -3973,8 +3975,8 @@ TEST( ElementGraph, Hex0AddShell1Hex0Parallel ) } else if (p_rank == 1) { // Connectivity for Shell Element 3 - unsigned hex1Index = 1; - unsigned hex2Index = 0; + unsigned hex1Index = 0; + unsigned hex2Index = 1; EXPECT_EQ(2u, elemElemGraph.get_num_connected_elems(shell3)); EXPECT_EQ(1, elemElemGraph.get_connected_remote_id_and_via_side(shell3, hex1Index).side); EXPECT_EQ(0, elemElemGraph.get_connected_remote_id_and_via_side(shell3, hex2Index).side); diff --git a/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp b/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp index 62e284586ce3..f0f771ba7ece 100644 --- a/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp +++ b/packages/stk/stk_unit_tests/stk_util/ngp/UnitTestNgpVirtualFunction.cpp @@ -34,6 +34,7 @@ #include "gtest/gtest.h" #include +#include #include namespace ngp { @@ -78,6 +79,8 @@ void test_device_class() TEST(NgpDevice, virtualFunction) { + if (stk::parallel_machine_size(MPI_COMM_WORLD) > 1) GTEST_SKIP(); + test_device_class(); } diff --git a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp index 6f3012616b9b..ff1fe46cbdfb 100644 --- a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp +++ b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp @@ -42,7 +42,7 @@ //In Sierra, STK_VERSION_STRING is provided on the compile line by bake. //For Trilinos stk snapshots, the following macro definition gets populated with //the real version string by the trilinos_snapshot.sh script. -#define STK_VERSION_STRING "5.3.1-48-ga8ff7841" +#define STK_VERSION_STRING "stk_version_not_set" #endif namespace stk { From b690724b1c2fb3694fa968af40e37c792b00c43c Mon Sep 17 00:00:00 2001 From: rstumin Date: Thu, 21 Oct 2021 12:44:58 -0600 Subject: [PATCH 57/98] introduced new variable with LocalOrdinal type to remove a casting error. --- .../Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp index 264e165d9983..4d2d1d67fb9d 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp @@ -615,9 +615,9 @@ namespace MueLu { /* reverse bounds */ - temp = closestToLeftBound; + LocalOrdinal itemp = closestToLeftBound; closestToLeftBound = nEntries-closestToRghtBound; - closestToRghtBound = nEntries-temp; + closestToRghtBound = nEntries-itemp; closestToLeftBoundDist = origSorted[closestToLeftBound] - leftBound; if (closestToRghtBound==nEntries) closestToRghtBoundDist= aBigNumber; else closestToRghtBoundDist= origSorted[closestToRghtBound] - rghtBound; From aacae8b0aedeec0b8f01bb97ed5a62d66f532322 Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Thu, 21 Oct 2021 14:37:12 -0600 Subject: [PATCH 58/98] MueLu: Add test driver for hierarchical matrices --- packages/muelu/research/CMakeLists.txt | 3 +- packages/muelu/research/caglusa/Anear.mtx | 48580 ++++++++++++++++ .../muelu/research/caglusa/CMakeLists.txt | 29 + packages/muelu/research/caglusa/RHS.mtx | 1026 + packages/muelu/research/caglusa/X_ex.mtx | 1026 + packages/muelu/research/caglusa/aux.mtx | 3070 + packages/muelu/research/caglusa/aux.xml | 53 + .../muelu/research/caglusa/basismatrix.mtx | 9210 +++ packages/muelu/research/caglusa/coeffmap.mtx | 4539 ++ packages/muelu/research/caglusa/coords.mtx | 1026 + .../research/caglusa/ghosted_coeffmap.mtx | 5511 ++ .../muelu/research/caglusa/hierarchical.xml | 24 + .../research/caglusa/kernelApproximations.mtx | 27705 +++++++++ packages/muelu/research/caglusa/main.cpp | 438 + packages/muelu/research/caglusa/rowmap.mtx | 2049 + packages/muelu/research/caglusa/transfer0.mtx | 651 + packages/muelu/research/caglusa/transfer1.mtx | 1299 + packages/muelu/research/caglusa/transfer2.mtx | 2595 + packages/muelu/research/caglusa/transfer3.mtx | 5187 ++ packages/muelu/research/caglusa/transfer4.mtx | 10371 ++++ 20 files changed, 124390 insertions(+), 2 deletions(-) create mode 100644 packages/muelu/research/caglusa/Anear.mtx create mode 100644 packages/muelu/research/caglusa/CMakeLists.txt create mode 100644 packages/muelu/research/caglusa/RHS.mtx create mode 100644 packages/muelu/research/caglusa/X_ex.mtx create mode 100644 packages/muelu/research/caglusa/aux.mtx create mode 100644 packages/muelu/research/caglusa/aux.xml create mode 100644 packages/muelu/research/caglusa/basismatrix.mtx create mode 100644 packages/muelu/research/caglusa/coeffmap.mtx create mode 100644 packages/muelu/research/caglusa/coords.mtx create mode 100644 packages/muelu/research/caglusa/ghosted_coeffmap.mtx create mode 100644 packages/muelu/research/caglusa/hierarchical.xml create mode 100644 packages/muelu/research/caglusa/kernelApproximations.mtx create mode 100644 packages/muelu/research/caglusa/main.cpp create mode 100644 packages/muelu/research/caglusa/rowmap.mtx create mode 100644 packages/muelu/research/caglusa/transfer0.mtx create mode 100644 packages/muelu/research/caglusa/transfer1.mtx create mode 100644 packages/muelu/research/caglusa/transfer2.mtx create mode 100644 packages/muelu/research/caglusa/transfer3.mtx create mode 100644 packages/muelu/research/caglusa/transfer4.mtx diff --git a/packages/muelu/research/CMakeLists.txt b/packages/muelu/research/CMakeLists.txt index 92767a1dbbbd..8174bf4c973b 100644 --- a/packages/muelu/research/CMakeLists.txt +++ b/packages/muelu/research/CMakeLists.txt @@ -14,6 +14,5 @@ IF (${PACKAGE_NAME}_ENABLE_Experimental) TRIBITS_ADD_EXAMPLE_DIRECTORIES(semicoarsening) TRIBITS_ADD_EXAMPLE_DIRECTORIES(tawiesn/crada) TRIBITS_ADD_EXAMPLE_DIRECTORIES(tawiesn/aria) + TRIBITS_ADD_EXAMPLE_DIRECTORIES(caglusa) ENDIF() - - diff --git a/packages/muelu/research/caglusa/Anear.mtx b/packages/muelu/research/caglusa/Anear.mtx new file mode 100644 index 000000000000..e2ecbff7353a --- /dev/null +++ b/packages/muelu/research/caglusa/Anear.mtx @@ -0,0 +1,48580 @@ +%%MatrixMarket matrix coordinate real general +% +1023 1023 48577 +1 1 3.988394278170838e+01 +1 2 -1.502055215866627e+01 +1 3 -3.165206906282872e+00 +1 4 -7.412185823610195e-01 +1 5 -3.301555353436759e-01 +1 6 -1.820810586422650e-01 +1 7 -1.132183869282764e-01 +1 8 -7.613960933881161e-02 +1 9 -5.413421453123172e-02 +1 10 -4.012781031912996e-02 +1 11 -3.072751892616544e-02 +1 12 -2.415034675252896e-02 +1 13 -1.939104886145111e-02 +1 14 -1.585023865775526e-02 +1 15 -1.315380302376546e-02 +1 16 -1.105916272470025e-02 +1 17 -9.403863770832832e-03 +1 18 -8.076052134892597e-03 +1 19 -6.996835383339674e-03 +1 20 -6.109381318875750e-03 +1 21 -5.371977266379805e-03 +1 22 -4.753493624956896e-03 +1 23 -4.230349322908531e-03 +1 24 -3.784439171232927e-03 +1 25 -3.401691470521394e-03 +1 26 -3.071047067257393e-03 +1 27 -2.783725492315673e-03 +1 28 -2.532689975072679e-03 +1 29 -2.312252367280536e-03 +1 30 -2.117777896667794e-03 +1 31 -1.945462087124853e-03 +2 2 3.988394278165418e+01 +2 1 -1.502055215866627e+01 +2 3 -1.502055215864776e+01 +2 4 -3.165206906282872e+00 +2 5 -7.412185823610193e-01 +2 6 -3.301555353436759e-01 +2 7 -1.820810586422650e-01 +2 8 -1.132183869282764e-01 +2 9 -7.613960933881163e-02 +2 10 -5.413421453123172e-02 +2 11 -4.012781031912996e-02 +2 12 -3.072751892616543e-02 +2 13 -2.415034675252897e-02 +2 14 -1.939104886145111e-02 +2 15 -1.585023865775526e-02 +2 16 -1.315380302376546e-02 +2 17 -1.105916272470025e-02 +2 18 -9.403863770832832e-03 +2 19 -8.076052134892599e-03 +2 20 -6.996835383339674e-03 +2 21 -6.109381318875749e-03 +2 22 -5.371977266379805e-03 +2 23 -4.753493624956896e-03 +2 24 -4.230349322908531e-03 +2 25 -3.784439171232927e-03 +2 26 -3.401691470521394e-03 +2 27 -3.071047067257393e-03 +2 28 -2.783725492315672e-03 +2 29 -2.532689975072680e-03 +2 30 -2.312252367280536e-03 +2 31 -2.117777896667794e-03 +3 3 3.988394278155667e+01 +3 1 -3.165206906282872e+00 +3 2 -1.502055215864776e+01 +3 4 -1.502055215859769e+01 +3 5 -3.165206906282872e+00 +3 6 -7.412185823610195e-01 +3 7 -3.301555353436759e-01 +3 8 -1.820810586422650e-01 +3 9 -1.132183869282765e-01 +3 10 -7.613960933881161e-02 +3 11 -5.413421453123172e-02 +3 12 -4.012781031912996e-02 +3 13 -3.072751892616543e-02 +3 14 -2.415034675252897e-02 +3 15 -1.939104886145111e-02 +3 16 -1.585023865775526e-02 +3 17 -1.315380302376546e-02 +3 18 -1.105916272470025e-02 +3 19 -9.403863770832832e-03 +3 20 -8.076052134892601e-03 +3 21 -6.996835383339672e-03 +3 22 -6.109381318875749e-03 +3 23 -5.371977266379805e-03 +3 24 -4.753493624956896e-03 +3 25 -4.230349322908531e-03 +3 26 -3.784439171232927e-03 +3 27 -3.401691470521394e-03 +3 28 -3.071047067257393e-03 +3 29 -2.783725492315672e-03 +3 30 -2.532689975072680e-03 +3 31 -2.312252367280536e-03 +4 4 3.988394278153613e+01 +4 1 -7.412185823610195e-01 +4 2 -3.165206906282872e+00 +4 3 -1.502055215859769e+01 +4 5 -1.502055215860867e+01 +4 6 -3.165206906282872e+00 +4 7 -7.412185823610195e-01 +4 8 -3.301555353436759e-01 +4 9 -1.820810586422650e-01 +4 10 -1.132183869282765e-01 +4 11 -7.613960933881161e-02 +4 12 -5.413421453123170e-02 +4 13 -4.012781031912996e-02 +4 14 -3.072751892616543e-02 +4 15 -2.415034675252897e-02 +4 16 -1.939104886145111e-02 +4 17 -1.585023865775526e-02 +4 18 -1.315380302376546e-02 +4 19 -1.105916272470025e-02 +4 20 -9.403863770832832e-03 +4 21 -8.076052134892597e-03 +4 22 -6.996835383339673e-03 +4 23 -6.109381318875749e-03 +4 24 -5.371977266379805e-03 +4 25 -4.753493624956896e-03 +4 26 -4.230349322908531e-03 +4 27 -3.784439171232928e-03 +4 28 -3.401691470521393e-03 +4 29 -3.071047067257393e-03 +4 30 -2.783725492315672e-03 +4 31 -2.532689975072680e-03 +5 5 3.988394278154096e+01 +5 1 -3.301555353436759e-01 +5 2 -7.412185823610193e-01 +5 3 -3.165206906282872e+00 +5 4 -1.502055215860867e+01 +5 6 -1.502055215860759e+01 +5 7 -3.165206906282871e+00 +5 8 -7.412185823610193e-01 +5 9 -3.301555353436760e-01 +5 10 -1.820810586422650e-01 +5 11 -1.132183869282764e-01 +5 12 -7.613960933881161e-02 +5 13 -5.413421453123172e-02 +5 14 -4.012781031912996e-02 +5 15 -3.072751892616543e-02 +5 16 -2.415034675252897e-02 +5 17 -1.939104886145111e-02 +5 18 -1.585023865775526e-02 +5 19 -1.315380302376546e-02 +5 20 -1.105916272470025e-02 +5 21 -9.403863770832832e-03 +5 22 -8.076052134892597e-03 +5 23 -6.996835383339673e-03 +5 24 -6.109381318875749e-03 +5 25 -5.371977266379805e-03 +5 26 -4.753493624956896e-03 +5 27 -4.230349322908533e-03 +5 28 -3.784439171232927e-03 +5 29 -3.401691470521393e-03 +5 30 -3.071047067257393e-03 +5 31 -2.783725492315672e-03 +6 6 3.988394278155982e+01 +6 1 -1.820810586422650e-01 +6 2 -3.301555353436759e-01 +6 3 -7.412185823610195e-01 +6 4 -3.165206906282872e+00 +6 5 -1.502055215860759e+01 +6 7 -1.502055215862497e+01 +6 8 -3.165206906282873e+00 +6 9 -7.412185823610197e-01 +6 10 -3.301555353436760e-01 +6 11 -1.820810586422650e-01 +6 12 -1.132183869282765e-01 +6 13 -7.613960933881161e-02 +6 14 -5.413421453123172e-02 +6 15 -4.012781031912996e-02 +6 16 -3.072751892616543e-02 +6 17 -2.415034675252897e-02 +6 18 -1.939104886145111e-02 +6 19 -1.585023865775526e-02 +6 20 -1.315380302376547e-02 +6 21 -1.105916272470025e-02 +6 22 -9.403863770832832e-03 +6 23 -8.076052134892597e-03 +6 24 -6.996835383339673e-03 +6 25 -6.109381318875749e-03 +6 26 -5.371977266379805e-03 +6 27 -4.753493624956896e-03 +6 28 -4.230349322908531e-03 +6 29 -3.784439171232927e-03 +6 30 -3.401691470521394e-03 +6 31 -3.071047067257393e-03 +7 7 3.988394278133043e+01 +7 1 -1.132183869282764e-01 +7 2 -1.820810586422650e-01 +7 3 -3.301555353436759e-01 +7 4 -7.412185823610195e-01 +7 5 -3.165206906282871e+00 +7 6 -1.502055215862497e+01 +7 8 -1.502055215842584e+01 +7 9 -3.165206906282873e+00 +7 10 -7.412185823610196e-01 +7 11 -3.301555353436760e-01 +7 12 -1.820810586422650e-01 +7 13 -1.132183869282765e-01 +7 14 -7.613960933881161e-02 +7 15 -5.413421453123172e-02 +7 16 -4.012781031912996e-02 +7 17 -3.072751892616543e-02 +7 18 -2.415034675252897e-02 +7 19 -1.939104886145111e-02 +7 20 -1.585023865775526e-02 +7 21 -1.315380302376547e-02 +7 22 -1.105916272470025e-02 +7 23 -9.403863770832832e-03 +7 24 -8.076052134892597e-03 +7 25 -6.996835383339673e-03 +7 26 -6.109381318875749e-03 +7 27 -5.371977266379806e-03 +7 28 -4.753493624956895e-03 +7 29 -4.230349322908531e-03 +7 30 -3.784439171232927e-03 +7 31 -3.401691470521394e-03 +8 8 3.988394278111428e+01 +8 1 -7.613960933881161e-02 +8 2 -1.132183869282764e-01 +8 3 -1.820810586422650e-01 +8 4 -3.301555353436759e-01 +8 5 -7.412185823610193e-01 +8 6 -3.165206906282873e+00 +8 7 -1.502055215842584e+01 +8 9 -1.502055215838798e+01 +8 10 -3.165206906282871e+00 +8 11 -7.412185823610192e-01 +8 12 -3.301555353436759e-01 +8 13 -1.820810586422650e-01 +8 14 -1.132183869282764e-01 +8 15 -7.613960933881161e-02 +8 16 -5.413421453123172e-02 +8 17 -4.012781031912996e-02 +8 18 -3.072751892616543e-02 +8 19 -2.415034675252897e-02 +8 20 -1.939104886145111e-02 +8 21 -1.585023865775526e-02 +8 22 -1.315380302376547e-02 +8 23 -1.105916272470025e-02 +8 24 -9.403863770832832e-03 +8 25 -8.076052134892597e-03 +8 26 -6.996835383339673e-03 +8 27 -6.109381318875750e-03 +8 28 -5.371977266379805e-03 +8 29 -4.753493624956895e-03 +8 30 -4.230349322908531e-03 +8 31 -3.784439171232927e-03 +9 9 3.988394278109931e+01 +9 1 -5.413421453123172e-02 +9 2 -7.613960933881163e-02 +9 3 -1.132183869282765e-01 +9 4 -1.820810586422650e-01 +9 5 -3.301555353436760e-01 +9 6 -7.412185823610197e-01 +9 7 -3.165206906282873e+00 +9 8 -1.502055215838798e+01 +9 10 -1.502055215840585e+01 +9 11 -3.165206906282872e+00 +9 12 -7.412185823610193e-01 +9 13 -3.301555353436760e-01 +9 14 -1.820810586422649e-01 +9 15 -1.132183869282764e-01 +9 16 -7.613960933881161e-02 +9 17 -5.413421453123171e-02 +9 18 -4.012781031912996e-02 +9 19 -3.072751892616544e-02 +9 20 -2.415034675252897e-02 +9 21 -1.939104886145111e-02 +9 22 -1.585023865775526e-02 +9 23 -1.315380302376546e-02 +9 24 -1.105916272470025e-02 +9 25 -9.403863770832832e-03 +9 26 -8.076052134892597e-03 +9 27 -6.996835383339674e-03 +9 28 -6.109381318875749e-03 +9 29 -5.371977266379805e-03 +9 30 -4.753493624956896e-03 +9 31 -4.230349322908531e-03 +10 10 3.988394278116603e+01 +10 1 -4.012781031912996e-02 +10 2 -5.413421453123172e-02 +10 3 -7.613960933881161e-02 +10 4 -1.132183869282765e-01 +10 5 -1.820810586422650e-01 +10 6 -3.301555353436760e-01 +10 7 -7.412185823610196e-01 +10 8 -3.165206906282871e+00 +10 9 -1.502055215840585e+01 +10 11 -1.502055215845368e+01 +10 12 -3.165206906282872e+00 +10 13 -7.412185823610192e-01 +10 14 -3.301555353436759e-01 +10 15 -1.820810586422649e-01 +10 16 -1.132183869282764e-01 +10 17 -7.613960933881160e-02 +10 18 -5.413421453123171e-02 +10 19 -4.012781031912996e-02 +10 20 -3.072751892616544e-02 +10 21 -2.415034675252897e-02 +10 22 -1.939104886145111e-02 +10 23 -1.585023865775526e-02 +10 24 -1.315380302376546e-02 +10 25 -1.105916272470025e-02 +10 26 -9.403863770832832e-03 +10 27 -8.076052134892599e-03 +10 28 -6.996835383339672e-03 +10 29 -6.109381318875748e-03 +10 30 -5.371977266379805e-03 +10 31 -4.753493624956895e-03 +11 11 3.988394278128772e+01 +11 1 -3.072751892616544e-02 +11 2 -4.012781031912996e-02 +11 3 -5.413421453123172e-02 +11 4 -7.613960933881161e-02 +11 5 -1.132183869282764e-01 +11 6 -1.820810586422650e-01 +11 7 -3.301555353436760e-01 +11 8 -7.412185823610192e-01 +11 9 -3.165206906282872e+00 +11 10 -1.502055215845368e+01 +11 12 -1.502055215852794e+01 +11 13 -3.165206906282872e+00 +11 14 -7.412185823610193e-01 +11 15 -3.301555353436760e-01 +11 16 -1.820810586422650e-01 +11 17 -1.132183869282764e-01 +11 18 -7.613960933881161e-02 +11 19 -5.413421453123172e-02 +11 20 -4.012781031912996e-02 +11 21 -3.072751892616544e-02 +11 22 -2.415034675252897e-02 +11 23 -1.939104886145111e-02 +11 24 -1.585023865775526e-02 +11 25 -1.315380302376546e-02 +11 26 -1.105916272470025e-02 +11 27 -9.403863770832832e-03 +11 28 -8.076052134892597e-03 +11 29 -6.996835383339672e-03 +11 30 -6.109381318875749e-03 +11 31 -5.371977266379805e-03 +12 12 3.988394278146693e+01 +12 1 -2.415034675252896e-02 +12 2 -3.072751892616543e-02 +12 3 -4.012781031912996e-02 +12 4 -5.413421453123170e-02 +12 5 -7.613960933881161e-02 +12 6 -1.132183869282765e-01 +12 7 -1.820810586422650e-01 +12 8 -3.301555353436759e-01 +12 9 -7.412185823610193e-01 +12 10 -3.165206906282872e+00 +12 11 -1.502055215852794e+01 +12 13 -1.502055215863411e+01 +12 14 -3.165206906282872e+00 +12 15 -7.412185823610196e-01 +12 16 -3.301555353436759e-01 +12 17 -1.820810586422649e-01 +12 18 -1.132183869282765e-01 +12 19 -7.613960933881163e-02 +12 20 -5.413421453123174e-02 +12 21 -4.012781031912997e-02 +12 22 -3.072751892616544e-02 +12 23 -2.415034675252897e-02 +12 24 -1.939104886145111e-02 +12 25 -1.585023865775526e-02 +12 26 -1.315380302376546e-02 +12 27 -1.105916272470025e-02 +12 28 -9.403863770832832e-03 +12 29 -8.076052134892597e-03 +12 30 -6.996835383339673e-03 +12 31 -6.109381318875749e-03 +13 13 3.988394278172120e+01 +13 1 -1.939104886145111e-02 +13 2 -2.415034675252897e-02 +13 3 -3.072751892616543e-02 +13 4 -4.012781031912996e-02 +13 5 -5.413421453123172e-02 +13 6 -7.613960933881161e-02 +13 7 -1.132183869282765e-01 +13 8 -1.820810586422650e-01 +13 9 -3.301555353436760e-01 +13 10 -7.412185823610192e-01 +13 11 -3.165206906282872e+00 +13 12 -1.502055215863411e+01 +13 14 -1.502055215878433e+01 +13 15 -3.165206906282873e+00 +13 16 -7.412185823610193e-01 +13 17 -3.301555353436759e-01 +13 18 -1.820810586422650e-01 +13 19 -1.132183869282764e-01 +13 20 -7.613960933881163e-02 +13 21 -5.413421453123173e-02 +13 22 -4.012781031912996e-02 +13 23 -3.072751892616544e-02 +13 24 -2.415034675252896e-02 +13 25 -1.939104886145111e-02 +13 26 -1.585023865775526e-02 +13 27 -1.315380302376546e-02 +13 28 -1.105916272470025e-02 +13 29 -9.403863770832832e-03 +13 30 -8.076052134892597e-03 +13 31 -6.996835383339673e-03 +14 14 3.988394278208258e+01 +14 1 -1.585023865775526e-02 +14 2 -1.939104886145111e-02 +14 3 -2.415034675252897e-02 +14 4 -3.072751892616543e-02 +14 5 -4.012781031912996e-02 +14 6 -5.413421453123172e-02 +14 7 -7.613960933881161e-02 +14 8 -1.132183869282764e-01 +14 9 -1.820810586422649e-01 +14 10 -3.301555353436759e-01 +14 11 -7.412185823610193e-01 +14 12 -3.165206906282872e+00 +14 13 -1.502055215878433e+01 +14 15 -1.502055215899893e+01 +14 16 -3.165206906282872e+00 +14 17 -7.412185823610189e-01 +14 18 -3.301555353436758e-01 +14 19 -1.820810586422649e-01 +14 20 -1.132183869282765e-01 +14 21 -7.613960933881163e-02 +14 22 -5.413421453123173e-02 +14 23 -4.012781031912996e-02 +14 24 -3.072751892616543e-02 +14 25 -2.415034675252897e-02 +14 26 -1.939104886145111e-02 +14 27 -1.585023865775526e-02 +14 28 -1.315380302376546e-02 +14 29 -1.105916272470025e-02 +14 30 -9.403863770832832e-03 +14 31 -8.076052134892597e-03 +15 15 3.988394278260357e+01 +15 1 -1.315380302376546e-02 +15 2 -1.585023865775526e-02 +15 3 -1.939104886145111e-02 +15 4 -2.415034675252897e-02 +15 5 -3.072751892616543e-02 +15 6 -4.012781031912996e-02 +15 7 -5.413421453123172e-02 +15 8 -7.613960933881161e-02 +15 9 -1.132183869282764e-01 +15 10 -1.820810586422649e-01 +15 11 -3.301555353436760e-01 +15 12 -7.412185823610196e-01 +15 13 -3.165206906282873e+00 +15 14 -1.502055215899893e+01 +15 16 -1.502055215931085e+01 +15 17 -3.165206906282870e+00 +15 18 -7.412185823610189e-01 +15 19 -3.301555353436758e-01 +15 20 -1.820810586422650e-01 +15 21 -1.132183869282765e-01 +15 22 -7.613960933881163e-02 +15 23 -5.413421453123172e-02 +15 24 -4.012781031912995e-02 +15 25 -3.072751892616543e-02 +15 26 -2.415034675252897e-02 +15 27 -1.939104886145111e-02 +15 28 -1.585023865775526e-02 +15 29 -1.315380302376546e-02 +15 30 -1.105916272470025e-02 +15 31 -9.403863770832832e-03 +16 16 3.988394278294130e+01 +16 1 -1.105916272470025e-02 +16 2 -1.315380302376546e-02 +16 3 -1.585023865775526e-02 +16 4 -1.939104886145111e-02 +16 5 -2.415034675252897e-02 +16 6 -3.072751892616543e-02 +16 7 -4.012781031912996e-02 +16 8 -5.413421453123172e-02 +16 9 -7.613960933881161e-02 +16 10 -1.132183869282764e-01 +16 11 -1.820810586422650e-01 +16 12 -3.301555353436759e-01 +16 13 -7.412185823610193e-01 +16 14 -3.165206906282872e+00 +16 15 -1.502055215931085e+01 +16 17 -1.502055215931085e+01 +16 18 -3.165206906282873e+00 +16 19 -7.412185823610189e-01 +16 20 -3.301555353436760e-01 +16 21 -1.820810586422650e-01 +16 22 -1.132183869282765e-01 +16 23 -7.613960933881164e-02 +16 24 -5.413421453123170e-02 +16 25 -4.012781031912996e-02 +16 26 -3.072751892616543e-02 +16 27 -2.415034675252897e-02 +16 28 -1.939104886145111e-02 +16 29 -1.585023865775526e-02 +16 30 -1.315380302376546e-02 +16 31 -1.105916272470025e-02 +16 32 -9.403863770832832e-03 +16 33 -8.076052134892601e-03 +16 34 -6.996835383339676e-03 +16 35 -6.109381318875751e-03 +16 36 -5.371977266379807e-03 +16 37 -4.753493624956895e-03 +16 38 -4.230349322908533e-03 +16 39 -3.784439171232926e-03 +16 40 -3.401691470521394e-03 +16 41 -3.071047067257394e-03 +16 42 -2.783725492315672e-03 +16 43 -2.532689975072680e-03 +16 44 -2.312252367280535e-03 +16 45 -2.117777896667794e-03 +16 46 -1.945462087124853e-03 +16 47 -1.792160480940038e-03 +17 17 3.988394278260356e+01 +17 1 -9.403863770832832e-03 +17 2 -1.105916272470025e-02 +17 3 -1.315380302376546e-02 +17 4 -1.585023865775526e-02 +17 5 -1.939104886145111e-02 +17 6 -2.415034675252897e-02 +17 7 -3.072751892616543e-02 +17 8 -4.012781031912996e-02 +17 9 -5.413421453123171e-02 +17 10 -7.613960933881160e-02 +17 11 -1.132183869282764e-01 +17 12 -1.820810586422649e-01 +17 13 -3.301555353436759e-01 +17 14 -7.412185823610189e-01 +17 15 -3.165206906282870e+00 +17 16 -1.502055215931085e+01 +17 18 -1.502055215899893e+01 +17 19 -3.165206906282872e+00 +17 20 -7.412185823610202e-01 +17 21 -3.301555353436758e-01 +17 22 -1.820810586422650e-01 +17 23 -1.132183869282765e-01 +17 24 -7.613960933881161e-02 +17 25 -5.413421453123172e-02 +17 26 -4.012781031912996e-02 +17 27 -3.072751892616543e-02 +17 28 -2.415034675252897e-02 +17 29 -1.939104886145111e-02 +17 30 -1.585023865775526e-02 +17 31 -1.315380302376546e-02 +17 32 -1.105916272470025e-02 +17 33 -9.403863770832832e-03 +17 34 -8.076052134892601e-03 +17 35 -6.996835383339676e-03 +17 36 -6.109381318875751e-03 +17 37 -5.371977266379805e-03 +17 38 -4.753493624956896e-03 +17 39 -4.230349322908531e-03 +17 40 -3.784439171232928e-03 +17 41 -3.401691470521394e-03 +17 42 -3.071047067257393e-03 +17 43 -2.783725492315673e-03 +17 44 -2.532689975072679e-03 +17 45 -2.312252367280536e-03 +17 46 -2.117777896667793e-03 +17 47 -1.945462087124853e-03 +18 18 3.988394278208258e+01 +18 1 -8.076052134892597e-03 +18 2 -9.403863770832832e-03 +18 3 -1.105916272470025e-02 +18 4 -1.315380302376546e-02 +18 5 -1.585023865775526e-02 +18 6 -1.939104886145111e-02 +18 7 -2.415034675252897e-02 +18 8 -3.072751892616543e-02 +18 9 -4.012781031912996e-02 +18 10 -5.413421453123171e-02 +18 11 -7.613960933881161e-02 +18 12 -1.132183869282765e-01 +18 13 -1.820810586422650e-01 +18 14 -3.301555353436758e-01 +18 15 -7.412185823610189e-01 +18 16 -3.165206906282873e+00 +18 17 -1.502055215899893e+01 +18 19 -1.502055215878433e+01 +18 20 -3.165206906282874e+00 +18 21 -7.412185823610192e-01 +18 22 -3.301555353436761e-01 +18 23 -1.820810586422650e-01 +18 24 -1.132183869282764e-01 +18 25 -7.613960933881161e-02 +18 26 -5.413421453123172e-02 +18 27 -4.012781031912996e-02 +18 28 -3.072751892616543e-02 +18 29 -2.415034675252897e-02 +18 30 -1.939104886145111e-02 +18 31 -1.585023865775526e-02 +18 32 -1.315380302376546e-02 +18 33 -1.105916272470025e-02 +18 34 -9.403863770832832e-03 +18 35 -8.076052134892601e-03 +18 36 -6.996835383339676e-03 +18 37 -6.109381318875748e-03 +18 38 -5.371977266379806e-03 +18 39 -4.753493624956895e-03 +18 40 -4.230349322908533e-03 +18 41 -3.784439171232928e-03 +18 42 -3.401691470521393e-03 +18 43 -3.071047067257393e-03 +18 44 -2.783725492315672e-03 +18 45 -2.532689975072680e-03 +18 46 -2.312252367280535e-03 +18 47 -2.117777896667794e-03 +19 19 3.988394278172120e+01 +19 1 -6.996835383339674e-03 +19 2 -8.076052134892599e-03 +19 3 -9.403863770832832e-03 +19 4 -1.105916272470025e-02 +19 5 -1.315380302376546e-02 +19 6 -1.585023865775526e-02 +19 7 -1.939104886145111e-02 +19 8 -2.415034675252897e-02 +19 9 -3.072751892616544e-02 +19 10 -4.012781031912996e-02 +19 11 -5.413421453123172e-02 +19 12 -7.613960933881163e-02 +19 13 -1.132183869282764e-01 +19 14 -1.820810586422649e-01 +19 15 -3.301555353436758e-01 +19 16 -7.412185823610189e-01 +19 17 -3.165206906282872e+00 +19 18 -1.502055215878433e+01 +19 20 -1.502055215863412e+01 +19 21 -3.165206906282872e+00 +19 22 -7.412185823610196e-01 +19 23 -3.301555353436759e-01 +19 24 -1.820810586422650e-01 +19 25 -1.132183869282764e-01 +19 26 -7.613960933881161e-02 +19 27 -5.413421453123171e-02 +19 28 -4.012781031912995e-02 +19 29 -3.072751892616543e-02 +19 30 -2.415034675252896e-02 +19 31 -1.939104886145111e-02 +19 32 -1.585023865775526e-02 +19 33 -1.315380302376546e-02 +19 34 -1.105916272470025e-02 +19 35 -9.403863770832830e-03 +19 36 -8.076052134892599e-03 +19 37 -6.996835383339671e-03 +19 38 -6.109381318875751e-03 +19 39 -5.371977266379805e-03 +19 40 -4.753493624956896e-03 +19 41 -4.230349322908533e-03 +19 42 -3.784439171232926e-03 +19 43 -3.401691470521394e-03 +19 44 -3.071047067257392e-03 +19 45 -2.783725492315672e-03 +19 46 -2.532689975072679e-03 +19 47 -2.312252367280536e-03 +20 20 3.988394278146693e+01 +20 1 -6.109381318875750e-03 +20 2 -6.996835383339674e-03 +20 3 -8.076052134892601e-03 +20 4 -9.403863770832832e-03 +20 5 -1.105916272470025e-02 +20 6 -1.315380302376547e-02 +20 7 -1.585023865775526e-02 +20 8 -1.939104886145111e-02 +20 9 -2.415034675252897e-02 +20 10 -3.072751892616544e-02 +20 11 -4.012781031912996e-02 +20 12 -5.413421453123174e-02 +20 13 -7.613960933881163e-02 +20 14 -1.132183869282765e-01 +20 15 -1.820810586422650e-01 +20 16 -3.301555353436760e-01 +20 17 -7.412185823610202e-01 +20 18 -3.165206906282874e+00 +20 19 -1.502055215863412e+01 +20 21 -1.502055215852794e+01 +20 22 -3.165206906282871e+00 +20 23 -7.412185823610187e-01 +20 24 -3.301555353436759e-01 +20 25 -1.820810586422648e-01 +20 26 -1.132183869282764e-01 +20 27 -7.613960933881159e-02 +20 28 -5.413421453123170e-02 +20 29 -4.012781031912995e-02 +20 30 -3.072751892616543e-02 +20 31 -2.415034675252896e-02 +20 32 -1.939104886145111e-02 +20 33 -1.585023865775526e-02 +20 34 -1.315380302376546e-02 +20 35 -1.105916272470025e-02 +20 36 -9.403863770832830e-03 +20 37 -8.076052134892596e-03 +20 38 -6.996835383339675e-03 +20 39 -6.109381318875748e-03 +20 40 -5.371977266379806e-03 +20 41 -4.753493624956896e-03 +20 42 -4.230349322908530e-03 +20 43 -3.784439171232927e-03 +20 44 -3.401691470521393e-03 +20 45 -3.071047067257393e-03 +20 46 -2.783725492315672e-03 +20 47 -2.532689975072680e-03 +21 21 3.988394278128772e+01 +21 1 -5.371977266379805e-03 +21 2 -6.109381318875749e-03 +21 3 -6.996835383339672e-03 +21 4 -8.076052134892597e-03 +21 5 -9.403863770832832e-03 +21 6 -1.105916272470025e-02 +21 7 -1.315380302376547e-02 +21 8 -1.585023865775526e-02 +21 9 -1.939104886145111e-02 +21 10 -2.415034675252897e-02 +21 11 -3.072751892616544e-02 +21 12 -4.012781031912997e-02 +21 13 -5.413421453123173e-02 +21 14 -7.613960933881163e-02 +21 15 -1.132183869282765e-01 +21 16 -1.820810586422650e-01 +21 17 -3.301555353436758e-01 +21 18 -7.412185823610192e-01 +21 19 -3.165206906282872e+00 +21 20 -1.502055215852794e+01 +21 22 -1.502055215845369e+01 +21 23 -3.165206906282872e+00 +21 24 -7.412185823610196e-01 +21 25 -3.301555353436759e-01 +21 26 -1.820810586422650e-01 +21 27 -1.132183869282764e-01 +21 28 -7.613960933881159e-02 +21 29 -5.413421453123170e-02 +21 30 -4.012781031912995e-02 +21 31 -3.072751892616543e-02 +21 32 -2.415034675252896e-02 +21 33 -1.939104886145111e-02 +21 34 -1.585023865775526e-02 +21 35 -1.315380302376546e-02 +21 36 -1.105916272470025e-02 +21 37 -9.403863770832833e-03 +21 38 -8.076052134892601e-03 +21 39 -6.996835383339673e-03 +21 40 -6.109381318875752e-03 +21 41 -5.371977266379807e-03 +21 42 -4.753493624956895e-03 +21 43 -4.230349322908533e-03 +21 44 -3.784439171232927e-03 +21 45 -3.401691470521395e-03 +21 46 -3.071047067257393e-03 +21 47 -2.783725492315673e-03 +22 22 3.988394278116602e+01 +22 1 -4.753493624956896e-03 +22 2 -5.371977266379805e-03 +22 3 -6.109381318875749e-03 +22 4 -6.996835383339673e-03 +22 5 -8.076052134892597e-03 +22 6 -9.403863770832832e-03 +22 7 -1.105916272470025e-02 +22 8 -1.315380302376547e-02 +22 9 -1.585023865775526e-02 +22 10 -1.939104886145111e-02 +22 11 -2.415034675252897e-02 +22 12 -3.072751892616544e-02 +22 13 -4.012781031912996e-02 +22 14 -5.413421453123173e-02 +22 15 -7.613960933881163e-02 +22 16 -1.132183869282765e-01 +22 17 -1.820810586422650e-01 +22 18 -3.301555353436761e-01 +22 19 -7.412185823610196e-01 +22 20 -3.165206906282871e+00 +22 21 -1.502055215845369e+01 +22 23 -1.502055215840585e+01 +22 24 -3.165206906282871e+00 +22 25 -7.412185823610186e-01 +22 26 -3.301555353436759e-01 +22 27 -1.820810586422649e-01 +22 28 -1.132183869282764e-01 +22 29 -7.613960933881159e-02 +22 30 -5.413421453123170e-02 +22 31 -4.012781031912995e-02 +22 32 -3.072751892616543e-02 +22 33 -2.415034675252896e-02 +22 34 -1.939104886145111e-02 +22 35 -1.585023865775526e-02 +22 36 -1.315380302376546e-02 +22 37 -1.105916272470026e-02 +22 38 -9.403863770832833e-03 +22 39 -8.076052134892597e-03 +22 40 -6.996835383339676e-03 +22 41 -6.109381318875751e-03 +22 42 -5.371977266379805e-03 +22 43 -4.753493624956896e-03 +22 44 -4.230349322908531e-03 +22 45 -3.784439171232928e-03 +22 46 -3.401691470521393e-03 +22 47 -3.071047067257393e-03 +23 23 3.988394278109931e+01 +23 1 -4.230349322908531e-03 +23 2 -4.753493624956896e-03 +23 3 -5.371977266379805e-03 +23 4 -6.109381318875749e-03 +23 5 -6.996835383339673e-03 +23 6 -8.076052134892597e-03 +23 7 -9.403863770832832e-03 +23 8 -1.105916272470025e-02 +23 9 -1.315380302376546e-02 +23 10 -1.585023865775526e-02 +23 11 -1.939104886145111e-02 +23 12 -2.415034675252897e-02 +23 13 -3.072751892616544e-02 +23 14 -4.012781031912996e-02 +23 15 -5.413421453123172e-02 +23 16 -7.613960933881164e-02 +23 17 -1.132183869282765e-01 +23 18 -1.820810586422650e-01 +23 19 -3.301555353436759e-01 +23 20 -7.412185823610187e-01 +23 21 -3.165206906282872e+00 +23 22 -1.502055215840585e+01 +23 24 -1.502055215838798e+01 +23 25 -3.165206906282873e+00 +23 26 -7.412185823610200e-01 +23 27 -3.301555353436758e-01 +23 28 -1.820810586422649e-01 +23 29 -1.132183869282764e-01 +23 30 -7.613960933881159e-02 +23 31 -5.413421453123170e-02 +23 32 -4.012781031912995e-02 +23 33 -3.072751892616543e-02 +23 34 -2.415034675252896e-02 +23 35 -1.939104886145111e-02 +23 36 -1.585023865775526e-02 +23 37 -1.315380302376546e-02 +23 38 -1.105916272470026e-02 +23 39 -9.403863770832833e-03 +23 40 -8.076052134892601e-03 +23 41 -6.996835383339676e-03 +23 42 -6.109381318875748e-03 +23 43 -5.371977266379806e-03 +23 44 -4.753493624956895e-03 +23 45 -4.230349322908533e-03 +23 46 -3.784439171232926e-03 +23 47 -3.401691470521394e-03 +24 24 3.988394278111428e+01 +24 1 -3.784439171232927e-03 +24 2 -4.230349322908531e-03 +24 3 -4.753493624956896e-03 +24 4 -5.371977266379805e-03 +24 5 -6.109381318875749e-03 +24 6 -6.996835383339673e-03 +24 7 -8.076052134892597e-03 +24 8 -9.403863770832832e-03 +24 9 -1.105916272470025e-02 +24 10 -1.315380302376546e-02 +24 11 -1.585023865775526e-02 +24 12 -1.939104886145111e-02 +24 13 -2.415034675252896e-02 +24 14 -3.072751892616543e-02 +24 15 -4.012781031912995e-02 +24 16 -5.413421453123170e-02 +24 17 -7.613960933881161e-02 +24 18 -1.132183869282764e-01 +24 19 -1.820810586422650e-01 +24 20 -3.301555353436759e-01 +24 21 -7.412185823610196e-01 +24 22 -3.165206906282871e+00 +24 23 -1.502055215838798e+01 +24 25 -1.502055215842584e+01 +24 26 -3.165206906282873e+00 +24 27 -7.412185823610188e-01 +24 28 -3.301555353436759e-01 +24 29 -1.820810586422649e-01 +24 30 -1.132183869282764e-01 +24 31 -7.613960933881164e-02 +24 32 -5.413421453123173e-02 +24 33 -4.012781031912997e-02 +24 34 -3.072751892616544e-02 +24 35 -2.415034675252897e-02 +24 36 -1.939104886145111e-02 +24 37 -1.585023865775526e-02 +24 38 -1.315380302376547e-02 +24 39 -1.105916272470026e-02 +24 40 -9.403863770832833e-03 +24 41 -8.076052134892601e-03 +24 42 -6.996835383339672e-03 +24 43 -6.109381318875751e-03 +24 44 -5.371977266379805e-03 +24 45 -4.753493624956896e-03 +24 46 -4.230349322908531e-03 +24 47 -3.784439171232928e-03 +25 25 3.988394278133044e+01 +25 1 -3.401691470521394e-03 +25 2 -3.784439171232927e-03 +25 3 -4.230349322908531e-03 +25 4 -4.753493624956896e-03 +25 5 -5.371977266379805e-03 +25 6 -6.109381318875749e-03 +25 7 -6.996835383339673e-03 +25 8 -8.076052134892597e-03 +25 9 -9.403863770832832e-03 +25 10 -1.105916272470025e-02 +25 11 -1.315380302376546e-02 +25 12 -1.585023865775526e-02 +25 13 -1.939104886145111e-02 +25 14 -2.415034675252897e-02 +25 15 -3.072751892616543e-02 +25 16 -4.012781031912996e-02 +25 17 -5.413421453123172e-02 +25 18 -7.613960933881161e-02 +25 19 -1.132183869282764e-01 +25 20 -1.820810586422648e-01 +25 21 -3.301555353436759e-01 +25 22 -7.412185823610186e-01 +25 23 -3.165206906282873e+00 +25 24 -1.502055215842584e+01 +25 26 -1.502055215862497e+01 +25 27 -3.165206906282872e+00 +25 28 -7.412185823610198e-01 +25 29 -3.301555353436759e-01 +25 30 -1.820810586422650e-01 +25 31 -1.132183869282765e-01 +25 32 -7.613960933881161e-02 +25 33 -5.413421453123172e-02 +25 34 -4.012781031912996e-02 +25 35 -3.072751892616543e-02 +25 36 -2.415034675252897e-02 +25 37 -1.939104886145111e-02 +25 38 -1.585023865775526e-02 +25 39 -1.315380302376547e-02 +25 40 -1.105916272470026e-02 +25 41 -9.403863770832833e-03 +25 42 -8.076052134892597e-03 +25 43 -6.996835383339676e-03 +25 44 -6.109381318875748e-03 +25 45 -5.371977266379806e-03 +25 46 -4.753493624956895e-03 +25 47 -4.230349322908533e-03 +26 26 3.988394278155981e+01 +26 1 -3.071047067257393e-03 +26 2 -3.401691470521394e-03 +26 3 -3.784439171232927e-03 +26 4 -4.230349322908531e-03 +26 5 -4.753493624956896e-03 +26 6 -5.371977266379805e-03 +26 7 -6.109381318875749e-03 +26 8 -6.996835383339673e-03 +26 9 -8.076052134892597e-03 +26 10 -9.403863770832832e-03 +26 11 -1.105916272470025e-02 +26 12 -1.315380302376546e-02 +26 13 -1.585023865775526e-02 +26 14 -1.939104886145111e-02 +26 15 -2.415034675252897e-02 +26 16 -3.072751892616543e-02 +26 17 -4.012781031912996e-02 +26 18 -5.413421453123172e-02 +26 19 -7.613960933881161e-02 +26 20 -1.132183869282764e-01 +26 21 -1.820810586422650e-01 +26 22 -3.301555353436759e-01 +26 23 -7.412185823610200e-01 +26 24 -3.165206906282873e+00 +26 25 -1.502055215862497e+01 +26 27 -1.502055215860759e+01 +26 28 -3.165206906282871e+00 +26 29 -7.412185823610186e-01 +26 30 -3.301555353436757e-01 +26 31 -1.820810586422649e-01 +26 32 -1.132183869282764e-01 +26 33 -7.613960933881161e-02 +26 34 -5.413421453123172e-02 +26 35 -4.012781031912996e-02 +26 36 -3.072751892616543e-02 +26 37 -2.415034675252897e-02 +26 38 -1.939104886145111e-02 +26 39 -1.585023865775526e-02 +26 40 -1.315380302376547e-02 +26 41 -1.105916272470026e-02 +26 42 -9.403863770832833e-03 +26 43 -8.076052134892601e-03 +26 44 -6.996835383339672e-03 +26 45 -6.109381318875751e-03 +26 46 -5.371977266379805e-03 +26 47 -4.753493624956896e-03 +27 27 3.988394278154095e+01 +27 1 -2.783725492315673e-03 +27 2 -3.071047067257393e-03 +27 3 -3.401691470521394e-03 +27 4 -3.784439171232928e-03 +27 5 -4.230349322908533e-03 +27 6 -4.753493624956896e-03 +27 7 -5.371977266379806e-03 +27 8 -6.109381318875750e-03 +27 9 -6.996835383339674e-03 +27 10 -8.076052134892599e-03 +27 11 -9.403863770832832e-03 +27 12 -1.105916272470025e-02 +27 13 -1.315380302376546e-02 +27 14 -1.585023865775526e-02 +27 15 -1.939104886145111e-02 +27 16 -2.415034675252897e-02 +27 17 -3.072751892616543e-02 +27 18 -4.012781031912996e-02 +27 19 -5.413421453123171e-02 +27 20 -7.613960933881159e-02 +27 21 -1.132183869282764e-01 +27 22 -1.820810586422649e-01 +27 23 -3.301555353436758e-01 +27 24 -7.412185823610188e-01 +27 25 -3.165206906282872e+00 +27 26 -1.502055215860759e+01 +27 28 -1.502055215860867e+01 +27 29 -3.165206906282872e+00 +27 30 -7.412185823610200e-01 +27 31 -3.301555353436759e-01 +27 32 -1.820810586422650e-01 +27 33 -1.132183869282764e-01 +27 34 -7.613960933881161e-02 +27 35 -5.413421453123172e-02 +27 36 -4.012781031912996e-02 +27 37 -3.072751892616545e-02 +27 38 -2.415034675252897e-02 +27 39 -1.939104886145111e-02 +27 40 -1.585023865775526e-02 +27 41 -1.315380302376547e-02 +27 42 -1.105916272470026e-02 +27 43 -9.403863770832833e-03 +27 44 -8.076052134892597e-03 +27 45 -6.996835383339675e-03 +27 46 -6.109381318875748e-03 +27 47 -5.371977266379806e-03 +28 28 3.988394278153613e+01 +28 1 -2.532689975072679e-03 +28 2 -2.783725492315672e-03 +28 3 -3.071047067257393e-03 +28 4 -3.401691470521393e-03 +28 5 -3.784439171232927e-03 +28 6 -4.230349322908531e-03 +28 7 -4.753493624956895e-03 +28 8 -5.371977266379805e-03 +28 9 -6.109381318875749e-03 +28 10 -6.996835383339672e-03 +28 11 -8.076052134892597e-03 +28 12 -9.403863770832832e-03 +28 13 -1.105916272470025e-02 +28 14 -1.315380302376546e-02 +28 15 -1.585023865775526e-02 +28 16 -1.939104886145111e-02 +28 17 -2.415034675252897e-02 +28 18 -3.072751892616543e-02 +28 19 -4.012781031912995e-02 +28 20 -5.413421453123170e-02 +28 21 -7.613960933881159e-02 +28 22 -1.132183869282764e-01 +28 23 -1.820810586422649e-01 +28 24 -3.301555353436759e-01 +28 25 -7.412185823610198e-01 +28 26 -3.165206906282871e+00 +28 27 -1.502055215860867e+01 +28 29 -1.502055215859769e+01 +28 30 -3.165206906282873e+00 +28 31 -7.412185823610190e-01 +28 32 -3.301555353436758e-01 +28 33 -1.820810586422650e-01 +28 34 -1.132183869282764e-01 +28 35 -7.613960933881161e-02 +28 36 -5.413421453123172e-02 +28 37 -4.012781031912997e-02 +28 38 -3.072751892616545e-02 +28 39 -2.415034675252897e-02 +28 40 -1.939104886145111e-02 +28 41 -1.585023865775526e-02 +28 42 -1.315380302376547e-02 +28 43 -1.105916272470026e-02 +28 44 -9.403863770832833e-03 +28 45 -8.076052134892601e-03 +28 46 -6.996835383339674e-03 +28 47 -6.109381318875752e-03 +29 29 3.988394278155666e+01 +29 1 -2.312252367280536e-03 +29 2 -2.532689975072680e-03 +29 3 -2.783725492315672e-03 +29 4 -3.071047067257393e-03 +29 5 -3.401691470521393e-03 +29 6 -3.784439171232927e-03 +29 7 -4.230349322908531e-03 +29 8 -4.753493624956895e-03 +29 9 -5.371977266379805e-03 +29 10 -6.109381318875748e-03 +29 11 -6.996835383339672e-03 +29 12 -8.076052134892597e-03 +29 13 -9.403863770832832e-03 +29 14 -1.105916272470025e-02 +29 15 -1.315380302376546e-02 +29 16 -1.585023865775526e-02 +29 17 -1.939104886145111e-02 +29 18 -2.415034675252897e-02 +29 19 -3.072751892616543e-02 +29 20 -4.012781031912995e-02 +29 21 -5.413421453123170e-02 +29 22 -7.613960933881159e-02 +29 23 -1.132183869282764e-01 +29 24 -1.820810586422649e-01 +29 25 -3.301555353436759e-01 +29 26 -7.412185823610186e-01 +29 27 -3.165206906282872e+00 +29 28 -1.502055215859769e+01 +29 30 -1.502055215864776e+01 +29 31 -3.165206906282872e+00 +29 32 -7.412185823610191e-01 +29 33 -3.301555353436763e-01 +29 34 -1.820810586422650e-01 +29 35 -1.132183869282765e-01 +29 36 -7.613960933881161e-02 +29 37 -5.413421453123174e-02 +29 38 -4.012781031912997e-02 +29 39 -3.072751892616545e-02 +29 40 -2.415034675252897e-02 +29 41 -1.939104886145111e-02 +29 42 -1.585023865775526e-02 +29 43 -1.315380302376547e-02 +29 44 -1.105916272470026e-02 +29 45 -9.403863770832833e-03 +29 46 -8.076052134892597e-03 +29 47 -6.996835383339677e-03 +30 30 3.988394278165416e+01 +30 1 -2.117777896667794e-03 +30 2 -2.312252367280536e-03 +30 3 -2.532689975072680e-03 +30 4 -2.783725492315672e-03 +30 5 -3.071047067257393e-03 +30 6 -3.401691470521394e-03 +30 7 -3.784439171232927e-03 +30 8 -4.230349322908531e-03 +30 9 -4.753493624956896e-03 +30 10 -5.371977266379805e-03 +30 11 -6.109381318875749e-03 +30 12 -6.996835383339673e-03 +30 13 -8.076052134892597e-03 +30 14 -9.403863770832832e-03 +30 15 -1.105916272470025e-02 +30 16 -1.315380302376546e-02 +30 17 -1.585023865775526e-02 +30 18 -1.939104886145111e-02 +30 19 -2.415034675252896e-02 +30 20 -3.072751892616543e-02 +30 21 -4.012781031912995e-02 +30 22 -5.413421453123170e-02 +30 23 -7.613960933881159e-02 +30 24 -1.132183869282764e-01 +30 25 -1.820810586422650e-01 +30 26 -3.301555353436757e-01 +30 27 -7.412185823610200e-01 +30 28 -3.165206906282873e+00 +30 29 -1.502055215864776e+01 +30 31 -1.502055215866627e+01 +30 32 -3.165206906282870e+00 +30 33 -7.412185823610191e-01 +30 34 -3.301555353436759e-01 +30 35 -1.820810586422651e-01 +30 36 -1.132183869282764e-01 +30 37 -7.613960933881164e-02 +30 38 -5.413421453123174e-02 +30 39 -4.012781031912997e-02 +30 40 -3.072751892616545e-02 +30 41 -2.415034675252897e-02 +30 42 -1.939104886145111e-02 +30 43 -1.585023865775526e-02 +30 44 -1.315380302376547e-02 +30 45 -1.105916272470026e-02 +30 46 -9.403863770832833e-03 +30 47 -8.076052134892601e-03 +31 31 3.988394278170837e+01 +31 1 -1.945462087124853e-03 +31 2 -2.117777896667794e-03 +31 3 -2.312252367280536e-03 +31 4 -2.532689975072680e-03 +31 5 -2.783725492315672e-03 +31 6 -3.071047067257393e-03 +31 7 -3.401691470521394e-03 +31 8 -3.784439171232927e-03 +31 9 -4.230349322908531e-03 +31 10 -4.753493624956895e-03 +31 11 -5.371977266379805e-03 +31 12 -6.109381318875749e-03 +31 13 -6.996835383339673e-03 +31 14 -8.076052134892597e-03 +31 15 -9.403863770832832e-03 +31 16 -1.105916272470025e-02 +31 17 -1.315380302376546e-02 +31 18 -1.585023865775526e-02 +31 19 -1.939104886145111e-02 +31 20 -2.415034675252896e-02 +31 21 -3.072751892616543e-02 +31 22 -4.012781031912995e-02 +31 23 -5.413421453123170e-02 +31 24 -7.613960933881164e-02 +31 25 -1.132183869282765e-01 +31 26 -1.820810586422649e-01 +31 27 -3.301555353436759e-01 +31 28 -7.412185823610190e-01 +31 29 -3.165206906282872e+00 +31 30 -1.502055215866627e+01 +31 32 -1.502055215931066e+01 +31 33 -3.165206906282870e+00 +31 34 -7.412185823610196e-01 +31 35 -3.301555353436763e-01 +31 36 -1.820810586422649e-01 +31 37 -1.132183869282764e-01 +31 38 -7.613960933881164e-02 +31 39 -5.413421453123174e-02 +31 40 -4.012781031912997e-02 +31 41 -3.072751892616545e-02 +31 42 -2.415034675252897e-02 +31 43 -1.939104886145111e-02 +31 44 -1.585023865775526e-02 +31 45 -1.315380302376547e-02 +31 46 -1.105916272470026e-02 +31 47 -9.403863770832833e-03 +32 32 3.988394278169707e+01 +32 16 -9.403863770832832e-03 +32 17 -1.105916272470025e-02 +32 18 -1.315380302376546e-02 +32 19 -1.585023865775526e-02 +32 20 -1.939104886145111e-02 +32 21 -2.415034675252896e-02 +32 22 -3.072751892616543e-02 +32 23 -4.012781031912995e-02 +32 24 -5.413421453123173e-02 +32 25 -7.613960933881161e-02 +32 26 -1.132183869282764e-01 +32 27 -1.820810586422650e-01 +32 28 -3.301555353436758e-01 +32 29 -7.412185823610191e-01 +32 30 -3.165206906282870e+00 +32 31 -1.502055215931066e+01 +32 33 -1.502055215866001e+01 +32 34 -3.165206906282871e+00 +32 35 -7.412185823610201e-01 +32 36 -3.301555353436759e-01 +32 37 -1.820810586422650e-01 +32 38 -1.132183869282765e-01 +32 39 -7.613960933881164e-02 +32 40 -5.413421453123174e-02 +32 41 -4.012781031912997e-02 +32 42 -3.072751892616545e-02 +32 43 -2.415034675252897e-02 +32 44 -1.939104886145111e-02 +32 45 -1.585023865775526e-02 +32 46 -1.315380302376547e-02 +32 47 -1.105916272470026e-02 +32 48 -9.403863770832830e-03 +32 49 -8.076052134892596e-03 +32 50 -6.996835383339675e-03 +32 51 -6.109381318875748e-03 +32 52 -5.371977266379806e-03 +32 53 -4.753493624956895e-03 +32 54 -4.230349322908533e-03 +32 55 -3.784439171232926e-03 +32 56 -3.401691470521393e-03 +32 57 -3.071047067257393e-03 +32 58 -2.783725492315671e-03 +32 59 -2.532689975072680e-03 +32 60 -2.312252367280535e-03 +32 61 -2.117777896667794e-03 +32 62 -1.945462087124853e-03 +32 63 -1.792160480940038e-03 +33 33 3.988394278164022e+01 +33 16 -8.076052134892601e-03 +33 17 -9.403863770832832e-03 +33 18 -1.105916272470025e-02 +33 19 -1.315380302376546e-02 +33 20 -1.585023865775526e-02 +33 21 -1.939104886145111e-02 +33 22 -2.415034675252896e-02 +33 23 -3.072751892616543e-02 +33 24 -4.012781031912997e-02 +33 25 -5.413421453123172e-02 +33 26 -7.613960933881161e-02 +33 27 -1.132183869282764e-01 +33 28 -1.820810586422650e-01 +33 29 -3.301555353436763e-01 +33 30 -7.412185823610191e-01 +33 31 -3.165206906282870e+00 +33 32 -1.502055215866001e+01 +33 34 -1.502055215864001e+01 +33 35 -3.165206906282874e+00 +33 36 -7.412185823610202e-01 +33 37 -3.301555353436759e-01 +33 38 -1.820810586422649e-01 +33 39 -1.132183869282765e-01 +33 40 -7.613960933881164e-02 +33 41 -5.413421453123174e-02 +33 42 -4.012781031912997e-02 +33 43 -3.072751892616545e-02 +33 44 -2.415034675252897e-02 +33 45 -1.939104886145111e-02 +33 46 -1.585023865775526e-02 +33 47 -1.315380302376547e-02 +33 48 -1.105916272470025e-02 +33 49 -9.403863770832830e-03 +33 50 -8.076052134892597e-03 +33 51 -6.996835383339671e-03 +33 52 -6.109381318875749e-03 +33 53 -5.371977266379804e-03 +33 54 -4.753493624956895e-03 +33 55 -4.230349322908529e-03 +33 56 -3.784439171232926e-03 +33 57 -3.401691470521393e-03 +33 58 -3.071047067257391e-03 +33 59 -2.783725492315672e-03 +33 60 -2.532689975072679e-03 +33 61 -2.312252367280536e-03 +33 62 -2.117777896667793e-03 +33 63 -1.945462087124853e-03 +34 34 3.988394278153934e+01 +34 16 -6.996835383339676e-03 +34 17 -8.076052134892601e-03 +34 18 -9.403863770832832e-03 +34 19 -1.105916272470025e-02 +34 20 -1.315380302376546e-02 +34 21 -1.585023865775526e-02 +34 22 -1.939104886145111e-02 +34 23 -2.415034675252896e-02 +34 24 -3.072751892616544e-02 +34 25 -4.012781031912996e-02 +34 26 -5.413421453123172e-02 +34 27 -7.613960933881161e-02 +34 28 -1.132183869282764e-01 +34 29 -1.820810586422650e-01 +34 30 -3.301555353436759e-01 +34 31 -7.412185823610196e-01 +34 32 -3.165206906282871e+00 +34 33 -1.502055215864001e+01 +34 35 -1.502055215858804e+01 +34 36 -3.165206906282877e+00 +34 37 -7.412185823610192e-01 +34 38 -3.301555353436758e-01 +34 39 -1.820810586422649e-01 +34 40 -1.132183869282765e-01 +34 41 -7.613960933881164e-02 +34 42 -5.413421453123174e-02 +34 43 -4.012781031912997e-02 +34 44 -3.072751892616545e-02 +34 45 -2.415034675252897e-02 +34 46 -1.939104886145111e-02 +34 47 -1.585023865775526e-02 +34 48 -1.315380302376546e-02 +34 49 -1.105916272470025e-02 +34 50 -9.403863770832830e-03 +34 51 -8.076052134892596e-03 +34 52 -6.996835383339674e-03 +34 53 -6.109381318875746e-03 +34 54 -5.371977266379806e-03 +34 55 -4.753493624956894e-03 +34 56 -4.230349322908529e-03 +34 57 -3.784439171232926e-03 +34 58 -3.401691470521392e-03 +34 59 -3.071047067257393e-03 +34 60 -2.783725492315671e-03 +34 61 -2.532689975072679e-03 +34 62 -2.312252367280535e-03 +34 63 -2.117777896667793e-03 +35 35 3.988394278151443e+01 +35 16 -6.109381318875751e-03 +35 17 -6.996835383339676e-03 +35 18 -8.076052134892601e-03 +35 19 -9.403863770832830e-03 +35 20 -1.105916272470025e-02 +35 21 -1.315380302376546e-02 +35 22 -1.585023865775526e-02 +35 23 -1.939104886145111e-02 +35 24 -2.415034675252897e-02 +35 25 -3.072751892616543e-02 +35 26 -4.012781031912996e-02 +35 27 -5.413421453123172e-02 +35 28 -7.613960933881161e-02 +35 29 -1.132183869282765e-01 +35 30 -1.820810586422651e-01 +35 31 -3.301555353436763e-01 +35 32 -7.412185823610201e-01 +35 33 -3.165206906282874e+00 +35 34 -1.502055215858804e+01 +35 36 -1.502055215859654e+01 +35 37 -3.165206906282870e+00 +35 38 -7.412185823610183e-01 +35 39 -3.301555353436756e-01 +35 40 -1.820810586422650e-01 +35 41 -1.132183869282764e-01 +35 42 -7.613960933881161e-02 +35 43 -5.413421453123174e-02 +35 44 -4.012781031912997e-02 +35 45 -3.072751892616545e-02 +35 46 -2.415034675252897e-02 +35 47 -1.939104886145111e-02 +35 48 -1.585023865775526e-02 +35 49 -1.315380302376546e-02 +35 50 -1.105916272470025e-02 +35 51 -9.403863770832830e-03 +35 52 -8.076052134892597e-03 +35 53 -6.996835383339671e-03 +35 54 -6.109381318875749e-03 +35 55 -5.371977266379804e-03 +35 56 -4.753493624956894e-03 +35 57 -4.230349322908531e-03 +35 58 -3.784439171232926e-03 +35 59 -3.401691470521393e-03 +35 60 -3.071047067257391e-03 +35 61 -2.783725492315672e-03 +35 62 -2.532689975072679e-03 +35 63 -2.312252367280536e-03 +36 36 3.988394278151358e+01 +36 16 -5.371977266379807e-03 +36 17 -6.109381318875751e-03 +36 18 -6.996835383339676e-03 +36 19 -8.076052134892599e-03 +36 20 -9.403863770832830e-03 +36 21 -1.105916272470025e-02 +36 22 -1.315380302376546e-02 +36 23 -1.585023865775526e-02 +36 24 -1.939104886145111e-02 +36 25 -2.415034675252897e-02 +36 26 -3.072751892616543e-02 +36 27 -4.012781031912996e-02 +36 28 -5.413421453123172e-02 +36 29 -7.613960933881161e-02 +36 30 -1.132183869282764e-01 +36 31 -1.820810586422649e-01 +36 32 -3.301555353436759e-01 +36 33 -7.412185823610202e-01 +36 34 -3.165206906282877e+00 +36 35 -1.502055215859654e+01 +36 37 -1.502055215859222e+01 +36 38 -3.165206906282870e+00 +36 39 -7.412185823610178e-01 +36 40 -3.301555353436760e-01 +36 41 -1.820810586422649e-01 +36 42 -1.132183869282765e-01 +36 43 -7.613960933881164e-02 +36 44 -5.413421453123174e-02 +36 45 -4.012781031912997e-02 +36 46 -3.072751892616545e-02 +36 47 -2.415034675252897e-02 +36 48 -1.939104886145111e-02 +36 49 -1.585023865775526e-02 +36 50 -1.315380302376546e-02 +36 51 -1.105916272470025e-02 +36 52 -9.403863770832832e-03 +36 53 -8.076052134892596e-03 +36 54 -6.996835383339674e-03 +36 55 -6.109381318875746e-03 +36 56 -5.371977266379804e-03 +36 57 -4.753493624956895e-03 +36 58 -4.230349322908529e-03 +36 59 -3.784439171232926e-03 +36 60 -3.401691470521392e-03 +36 61 -3.071047067257393e-03 +36 62 -2.783725492315671e-03 +36 63 -2.532689975072680e-03 +37 37 3.988394278152496e+01 +37 16 -4.753493624956895e-03 +37 17 -5.371977266379805e-03 +37 18 -6.109381318875748e-03 +37 19 -6.996835383339671e-03 +37 20 -8.076052134892596e-03 +37 21 -9.403863770832833e-03 +37 22 -1.105916272470026e-02 +37 23 -1.315380302376546e-02 +37 24 -1.585023865775526e-02 +37 25 -1.939104886145111e-02 +37 26 -2.415034675252897e-02 +37 27 -3.072751892616545e-02 +37 28 -4.012781031912997e-02 +37 29 -5.413421453123174e-02 +37 30 -7.613960933881164e-02 +37 31 -1.132183869282764e-01 +37 32 -1.820810586422650e-01 +37 33 -3.301555353436759e-01 +37 34 -7.412185823610192e-01 +37 35 -3.165206906282870e+00 +37 36 -1.502055215859222e+01 +37 38 -1.502055215860532e+01 +37 39 -3.165206906282871e+00 +37 40 -7.412185823610197e-01 +37 41 -3.301555353436758e-01 +37 42 -1.820810586422650e-01 +37 43 -1.132183869282765e-01 +37 44 -7.613960933881164e-02 +37 45 -5.413421453123172e-02 +37 46 -4.012781031912996e-02 +37 47 -3.072751892616543e-02 +37 48 -2.415034675252895e-02 +37 49 -1.939104886145110e-02 +37 50 -1.585023865775525e-02 +37 51 -1.315380302376546e-02 +37 52 -1.105916272470025e-02 +37 53 -9.403863770832830e-03 +37 54 -8.076052134892601e-03 +37 55 -6.996835383339674e-03 +37 56 -6.109381318875749e-03 +37 57 -5.371977266379808e-03 +37 58 -4.753493624956895e-03 +37 59 -4.230349322908533e-03 +37 60 -3.784439171232927e-03 +37 61 -3.401691470521395e-03 +37 62 -3.071047067257393e-03 +37 63 -2.783725492315673e-03 +38 38 3.988394278128566e+01 +38 16 -4.230349322908533e-03 +38 17 -4.753493624956896e-03 +38 18 -5.371977266379806e-03 +38 19 -6.109381318875751e-03 +38 20 -6.996835383339675e-03 +38 21 -8.076052134892601e-03 +38 22 -9.403863770832833e-03 +38 23 -1.105916272470026e-02 +38 24 -1.315380302376547e-02 +38 25 -1.585023865775526e-02 +38 26 -1.939104886145111e-02 +38 27 -2.415034675252897e-02 +38 28 -3.072751892616545e-02 +38 29 -4.012781031912997e-02 +38 30 -5.413421453123174e-02 +38 31 -7.613960933881164e-02 +38 32 -1.132183869282765e-01 +38 33 -1.820810586422649e-01 +38 34 -3.301555353436758e-01 +38 35 -7.412185823610183e-01 +38 36 -3.165206906282870e+00 +38 37 -1.502055215860532e+01 +38 39 -1.502055215840048e+01 +38 40 -3.165206906282876e+00 +38 41 -7.412185823610201e-01 +38 42 -3.301555353436760e-01 +38 43 -1.820810586422650e-01 +38 44 -1.132183869282765e-01 +38 45 -7.613960933881164e-02 +38 46 -5.413421453123172e-02 +38 47 -4.012781031912996e-02 +38 48 -3.072751892616542e-02 +38 49 -2.415034675252895e-02 +38 50 -1.939104886145110e-02 +38 51 -1.585023865775525e-02 +38 52 -1.315380302376546e-02 +38 53 -1.105916272470025e-02 +38 54 -9.403863770832830e-03 +38 55 -8.076052134892594e-03 +38 56 -6.996835383339671e-03 +38 57 -6.109381318875749e-03 +38 58 -5.371977266379805e-03 +38 59 -4.753493624956896e-03 +38 60 -4.230349322908529e-03 +38 61 -3.784439171232927e-03 +38 62 -3.401691470521392e-03 +38 63 -3.071047067257393e-03 +39 39 3.988394278105616e+01 +39 16 -3.784439171232926e-03 +39 17 -4.230349322908531e-03 +39 18 -4.753493624956895e-03 +39 19 -5.371977266379805e-03 +39 20 -6.109381318875748e-03 +39 21 -6.996835383339673e-03 +39 22 -8.076052134892597e-03 +39 23 -9.403863770832833e-03 +39 24 -1.105916272470026e-02 +39 25 -1.315380302376547e-02 +39 26 -1.585023865775526e-02 +39 27 -1.939104886145111e-02 +39 28 -2.415034675252897e-02 +39 29 -3.072751892616545e-02 +39 30 -4.012781031912997e-02 +39 31 -5.413421453123174e-02 +39 32 -7.613960933881164e-02 +39 33 -1.132183869282765e-01 +39 34 -1.820810586422649e-01 +39 35 -3.301555353436756e-01 +39 36 -7.412185823610178e-01 +39 37 -3.165206906282871e+00 +39 38 -1.502055215840048e+01 +39 40 -1.502055215835491e+01 +39 41 -3.165206906282874e+00 +39 42 -7.412185823610201e-01 +39 43 -3.301555353436760e-01 +39 44 -1.820810586422652e-01 +39 45 -1.132183869282765e-01 +39 46 -7.613960933881164e-02 +39 47 -5.413421453123172e-02 +39 48 -4.012781031912993e-02 +39 49 -3.072751892616542e-02 +39 50 -2.415034675252895e-02 +39 51 -1.939104886145110e-02 +39 52 -1.585023865775525e-02 +39 53 -1.315380302376546e-02 +39 54 -1.105916272470025e-02 +39 55 -9.403863770832830e-03 +39 56 -8.076052134892597e-03 +39 57 -6.996835383339678e-03 +39 58 -6.109381318875749e-03 +39 59 -5.371977266379808e-03 +39 60 -4.753493624956895e-03 +39 61 -4.230349322908533e-03 +39 62 -3.784439171232927e-03 +39 63 -3.401691470521395e-03 +40 40 3.988394278102306e+01 +40 16 -3.401691470521394e-03 +40 17 -3.784439171232928e-03 +40 18 -4.230349322908533e-03 +40 19 -4.753493624956896e-03 +40 20 -5.371977266379806e-03 +40 21 -6.109381318875752e-03 +40 22 -6.996835383339676e-03 +40 23 -8.076052134892601e-03 +40 24 -9.403863770832833e-03 +40 25 -1.105916272470026e-02 +40 26 -1.315380302376547e-02 +40 27 -1.585023865775526e-02 +40 28 -1.939104886145111e-02 +40 29 -2.415034675252897e-02 +40 30 -3.072751892616545e-02 +40 31 -4.012781031912997e-02 +40 32 -5.413421453123174e-02 +40 33 -7.613960933881164e-02 +40 34 -1.132183869282765e-01 +40 35 -1.820810586422650e-01 +40 36 -3.301555353436760e-01 +40 37 -7.412185823610197e-01 +40 38 -3.165206906282876e+00 +40 39 -1.502055215835491e+01 +40 41 -1.502055215836222e+01 +40 42 -3.165206906282871e+00 +40 43 -7.412185823610179e-01 +40 44 -3.301555353436760e-01 +40 45 -1.820810586422649e-01 +40 46 -1.132183869282765e-01 +40 47 -7.613960933881161e-02 +40 48 -5.413421453123166e-02 +40 49 -4.012781031912993e-02 +40 50 -3.072751892616542e-02 +40 51 -2.415034675252896e-02 +40 52 -1.939104886145110e-02 +40 53 -1.585023865775525e-02 +40 54 -1.315380302376546e-02 +40 55 -1.105916272470025e-02 +40 56 -9.403863770832828e-03 +40 57 -8.076052134892597e-03 +40 58 -6.996835383339671e-03 +40 59 -6.109381318875749e-03 +40 60 -5.371977266379805e-03 +40 61 -4.753493624956896e-03 +40 62 -4.230349322908529e-03 +40 63 -3.784439171232928e-03 +41 41 3.988394278106478e+01 +41 16 -3.071047067257394e-03 +41 17 -3.401691470521394e-03 +41 18 -3.784439171232928e-03 +41 19 -4.230349322908533e-03 +41 20 -4.753493624956896e-03 +41 21 -5.371977266379807e-03 +41 22 -6.109381318875751e-03 +41 23 -6.996835383339676e-03 +41 24 -8.076052134892601e-03 +41 25 -9.403863770832833e-03 +41 26 -1.105916272470026e-02 +41 27 -1.315380302376547e-02 +41 28 -1.585023865775526e-02 +41 29 -1.939104886145111e-02 +41 30 -2.415034675252897e-02 +41 31 -3.072751892616545e-02 +41 32 -4.012781031912997e-02 +41 33 -5.413421453123174e-02 +41 34 -7.613960933881164e-02 +41 35 -1.132183869282764e-01 +41 36 -1.820810586422649e-01 +41 37 -3.301555353436758e-01 +41 38 -7.412185823610201e-01 +41 39 -3.165206906282874e+00 +41 40 -1.502055215836222e+01 +41 42 -1.502055215839542e+01 +41 43 -3.165206906282871e+00 +41 44 -7.412185823610197e-01 +41 45 -3.301555353436759e-01 +41 46 -1.820810586422651e-01 +41 47 -1.132183869282765e-01 +41 48 -7.613960933881159e-02 +41 49 -5.413421453123166e-02 +41 50 -4.012781031912993e-02 +41 51 -3.072751892616543e-02 +41 52 -2.415034675252896e-02 +41 53 -1.939104886145110e-02 +41 54 -1.585023865775525e-02 +41 55 -1.315380302376546e-02 +41 56 -1.105916272470025e-02 +41 57 -9.403863770832830e-03 +41 58 -8.076052134892596e-03 +41 59 -6.996835383339674e-03 +41 60 -6.109381318875747e-03 +41 61 -5.371977266379806e-03 +41 62 -4.753493624956894e-03 +41 63 -4.230349322908531e-03 +42 42 3.988394278115155e+01 +42 16 -2.783725492315672e-03 +42 17 -3.071047067257393e-03 +42 18 -3.401691470521393e-03 +42 19 -3.784439171232926e-03 +42 20 -4.230349322908530e-03 +42 21 -4.753493624956895e-03 +42 22 -5.371977266379805e-03 +42 23 -6.109381318875748e-03 +42 24 -6.996835383339672e-03 +42 25 -8.076052134892597e-03 +42 26 -9.403863770832833e-03 +42 27 -1.105916272470026e-02 +42 28 -1.315380302376547e-02 +42 29 -1.585023865775526e-02 +42 30 -1.939104886145111e-02 +42 31 -2.415034675252897e-02 +42 32 -3.072751892616545e-02 +42 33 -4.012781031912997e-02 +42 34 -5.413421453123174e-02 +42 35 -7.613960933881161e-02 +42 36 -1.132183869282765e-01 +42 37 -1.820810586422650e-01 +42 38 -3.301555353436760e-01 +42 39 -7.412185823610201e-01 +42 40 -3.165206906282871e+00 +42 41 -1.502055215839542e+01 +42 43 -1.502055215844907e+01 +42 44 -3.165206906282870e+00 +42 45 -7.412185823610186e-01 +42 46 -3.301555353436759e-01 +42 47 -1.820810586422650e-01 +42 48 -1.132183869282764e-01 +42 49 -7.613960933881156e-02 +42 50 -5.413421453123166e-02 +42 51 -4.012781031912994e-02 +42 52 -3.072751892616543e-02 +42 53 -2.415034675252896e-02 +42 54 -1.939104886145110e-02 +42 55 -1.585023865775525e-02 +42 56 -1.315380302376546e-02 +42 57 -1.105916272470025e-02 +42 58 -9.403863770832830e-03 +42 59 -8.076052134892601e-03 +42 60 -6.996835383339674e-03 +42 61 -6.109381318875753e-03 +42 62 -5.371977266379806e-03 +42 63 -4.753493624956897e-03 +43 43 3.988394278128114e+01 +43 16 -2.532689975072680e-03 +43 17 -2.783725492315673e-03 +43 18 -3.071047067257393e-03 +43 19 -3.401691470521394e-03 +43 20 -3.784439171232927e-03 +43 21 -4.230349322908533e-03 +43 22 -4.753493624956896e-03 +43 23 -5.371977266379806e-03 +43 24 -6.109381318875751e-03 +43 25 -6.996835383339676e-03 +43 26 -8.076052134892601e-03 +43 27 -9.403863770832833e-03 +43 28 -1.105916272470026e-02 +43 29 -1.315380302376547e-02 +43 30 -1.585023865775526e-02 +43 31 -1.939104886145111e-02 +43 32 -2.415034675252897e-02 +43 33 -3.072751892616545e-02 +43 34 -4.012781031912997e-02 +43 35 -5.413421453123174e-02 +43 36 -7.613960933881164e-02 +43 37 -1.132183869282765e-01 +43 38 -1.820810586422650e-01 +43 39 -3.301555353436760e-01 +43 40 -7.412185823610179e-01 +43 41 -3.165206906282871e+00 +43 42 -1.502055215844907e+01 +43 44 -1.502055215852575e+01 +43 45 -3.165206906282871e+00 +43 46 -7.412185823610191e-01 +43 47 -3.301555353436760e-01 +43 48 -1.820810586422650e-01 +43 49 -1.132183869282763e-01 +43 50 -7.613960933881156e-02 +43 51 -5.413421453123169e-02 +43 52 -4.012781031912994e-02 +43 53 -3.072751892616543e-02 +43 54 -2.415034675252896e-02 +43 55 -1.939104886145110e-02 +43 56 -1.585023865775525e-02 +43 57 -1.315380302376546e-02 +43 58 -1.105916272470025e-02 +43 59 -9.403863770832830e-03 +43 60 -8.076052134892596e-03 +43 61 -6.996835383339674e-03 +43 62 -6.109381318875747e-03 +43 63 -5.371977266379806e-03 +44 44 3.988394278146372e+01 +44 16 -2.312252367280535e-03 +44 17 -2.532689975072679e-03 +44 18 -2.783725492315672e-03 +44 19 -3.071047067257392e-03 +44 20 -3.401691470521393e-03 +44 21 -3.784439171232927e-03 +44 22 -4.230349322908531e-03 +44 23 -4.753493624956895e-03 +44 24 -5.371977266379805e-03 +44 25 -6.109381318875748e-03 +44 26 -6.996835383339672e-03 +44 27 -8.076052134892597e-03 +44 28 -9.403863770832833e-03 +44 29 -1.105916272470026e-02 +44 30 -1.315380302376547e-02 +44 31 -1.585023865775526e-02 +44 32 -1.939104886145111e-02 +44 33 -2.415034675252897e-02 +44 34 -3.072751892616545e-02 +44 35 -4.012781031912997e-02 +44 36 -5.413421453123174e-02 +44 37 -7.613960933881164e-02 +44 38 -1.132183869282765e-01 +44 39 -1.820810586422652e-01 +44 40 -3.301555353436760e-01 +44 41 -7.412185823610197e-01 +44 42 -3.165206906282870e+00 +44 43 -1.502055215852575e+01 +44 45 -1.502055215863301e+01 +44 46 -3.165206906282872e+00 +44 47 -7.412185823610183e-01 +44 48 -3.301555353436757e-01 +44 49 -1.820810586422648e-01 +44 50 -1.132183869282764e-01 +44 51 -7.613960933881159e-02 +44 52 -5.413421453123169e-02 +44 53 -4.012781031912994e-02 +44 54 -3.072751892616543e-02 +44 55 -2.415034675252896e-02 +44 56 -1.939104886145110e-02 +44 57 -1.585023865775525e-02 +44 58 -1.315380302376546e-02 +44 59 -1.105916272470025e-02 +44 60 -9.403863770832830e-03 +44 61 -8.076052134892601e-03 +44 62 -6.996835383339674e-03 +44 63 -6.109381318875753e-03 +45 45 3.988394278171954e+01 +45 16 -2.117777896667794e-03 +45 17 -2.312252367280536e-03 +45 18 -2.532689975072680e-03 +45 19 -2.783725492315672e-03 +45 20 -3.071047067257393e-03 +45 21 -3.401691470521395e-03 +45 22 -3.784439171232928e-03 +45 23 -4.230349322908533e-03 +45 24 -4.753493624956896e-03 +45 25 -5.371977266379806e-03 +45 26 -6.109381318875751e-03 +45 27 -6.996835383339675e-03 +45 28 -8.076052134892601e-03 +45 29 -9.403863770832833e-03 +45 30 -1.105916272470026e-02 +45 31 -1.315380302376547e-02 +45 32 -1.585023865775526e-02 +45 33 -1.939104886145111e-02 +45 34 -2.415034675252897e-02 +45 35 -3.072751892616545e-02 +45 36 -4.012781031912997e-02 +45 37 -5.413421453123172e-02 +45 38 -7.613960933881164e-02 +45 39 -1.132183869282765e-01 +45 40 -1.820810586422649e-01 +45 41 -3.301555353436759e-01 +45 42 -7.412185823610186e-01 +45 43 -3.165206906282871e+00 +45 44 -1.502055215863301e+01 +45 46 -1.502055215878374e+01 +45 47 -3.165206906282874e+00 +45 48 -7.412185823610196e-01 +45 49 -3.301555353436761e-01 +45 50 -1.820810586422648e-01 +45 51 -1.132183869282764e-01 +45 52 -7.613960933881156e-02 +45 53 -5.413421453123169e-02 +45 54 -4.012781031912994e-02 +45 55 -3.072751892616543e-02 +45 56 -2.415034675252896e-02 +45 57 -1.939104886145110e-02 +45 58 -1.585023865775525e-02 +45 59 -1.315380302376546e-02 +45 60 -1.105916272470025e-02 +45 61 -9.403863770832830e-03 +45 62 -8.076052134892596e-03 +45 63 -6.996835383339674e-03 +46 46 3.988394278208170e+01 +46 16 -1.945462087124853e-03 +46 17 -2.117777896667793e-03 +46 18 -2.312252367280535e-03 +46 19 -2.532689975072679e-03 +46 20 -2.783725492315672e-03 +46 21 -3.071047067257393e-03 +46 22 -3.401691470521393e-03 +46 23 -3.784439171232926e-03 +46 24 -4.230349322908531e-03 +46 25 -4.753493624956895e-03 +46 26 -5.371977266379805e-03 +46 27 -6.109381318875748e-03 +46 28 -6.996835383339674e-03 +46 29 -8.076052134892597e-03 +46 30 -9.403863770832833e-03 +46 31 -1.105916272470026e-02 +46 32 -1.315380302376547e-02 +46 33 -1.585023865775526e-02 +46 34 -1.939104886145111e-02 +46 35 -2.415034675252897e-02 +46 36 -3.072751892616545e-02 +46 37 -4.012781031912996e-02 +46 38 -5.413421453123172e-02 +46 39 -7.613960933881164e-02 +46 40 -1.132183869282765e-01 +46 41 -1.820810586422651e-01 +46 42 -3.301555353436759e-01 +46 43 -7.412185823610191e-01 +46 44 -3.165206906282872e+00 +46 45 -1.502055215878374e+01 +46 47 -1.502055215899861e+01 +46 48 -3.165206906282870e+00 +46 49 -7.412185823610196e-01 +46 50 -3.301555353436759e-01 +46 51 -1.820810586422650e-01 +46 52 -1.132183869282763e-01 +46 53 -7.613960933881156e-02 +46 54 -5.413421453123169e-02 +46 55 -4.012781031912994e-02 +46 56 -3.072751892616543e-02 +46 57 -2.415034675252896e-02 +46 58 -1.939104886145110e-02 +46 59 -1.585023865775525e-02 +46 60 -1.315380302376546e-02 +46 61 -1.105916272470025e-02 +46 62 -9.403863770832830e-03 +46 63 -8.076052134892601e-03 +47 47 3.988394278260306e+01 +47 16 -1.792160480940038e-03 +47 17 -1.945462087124853e-03 +47 18 -2.117777896667794e-03 +47 19 -2.312252367280536e-03 +47 20 -2.532689975072680e-03 +47 21 -2.783725492315673e-03 +47 22 -3.071047067257393e-03 +47 23 -3.401691470521394e-03 +47 24 -3.784439171232928e-03 +47 25 -4.230349322908533e-03 +47 26 -4.753493624956896e-03 +47 27 -5.371977266379806e-03 +47 28 -6.109381318875752e-03 +47 29 -6.996835383339677e-03 +47 30 -8.076052134892601e-03 +47 31 -9.403863770832833e-03 +47 32 -1.105916272470026e-02 +47 33 -1.315380302376547e-02 +47 34 -1.585023865775526e-02 +47 35 -1.939104886145111e-02 +47 36 -2.415034675252897e-02 +47 37 -3.072751892616543e-02 +47 38 -4.012781031912996e-02 +47 39 -5.413421453123172e-02 +47 40 -7.613960933881161e-02 +47 41 -1.132183869282765e-01 +47 42 -1.820810586422650e-01 +47 43 -3.301555353436760e-01 +47 44 -7.412185823610183e-01 +47 45 -3.165206906282874e+00 +47 46 -1.502055215899861e+01 +47 48 -1.502055215931066e+01 +47 49 -3.165206906282871e+00 +47 50 -7.412185823610193e-01 +47 51 -3.301555353436763e-01 +47 52 -1.820810586422651e-01 +47 53 -1.132183869282764e-01 +47 54 -7.613960933881156e-02 +47 55 -5.413421453123170e-02 +47 56 -4.012781031912994e-02 +47 57 -3.072751892616543e-02 +47 58 -2.415034675252896e-02 +47 59 -1.939104886145111e-02 +47 60 -1.585023865775525e-02 +47 61 -1.315380302376546e-02 +47 62 -1.105916272470025e-02 +47 63 -9.403863770832830e-03 +48 48 3.988394278260306e+01 +48 32 -9.403863770832830e-03 +48 33 -1.105916272470025e-02 +48 34 -1.315380302376546e-02 +48 35 -1.585023865775526e-02 +48 36 -1.939104886145111e-02 +48 37 -2.415034675252895e-02 +48 38 -3.072751892616542e-02 +48 39 -4.012781031912993e-02 +48 40 -5.413421453123166e-02 +48 41 -7.613960933881159e-02 +48 42 -1.132183869282764e-01 +48 43 -1.820810586422650e-01 +48 44 -3.301555353436757e-01 +48 45 -7.412185823610196e-01 +48 46 -3.165206906282870e+00 +48 47 -1.502055215931066e+01 +48 49 -1.502055215899861e+01 +48 50 -3.165206906282873e+00 +48 51 -7.412185823610199e-01 +48 52 -3.301555353436765e-01 +48 53 -1.820810586422650e-01 +48 54 -1.132183869282764e-01 +48 55 -7.613960933881164e-02 +48 56 -5.413421453123173e-02 +48 57 -4.012781031912997e-02 +48 58 -3.072751892616545e-02 +48 59 -2.415034675252897e-02 +48 60 -1.939104886145111e-02 +48 61 -1.585023865775526e-02 +48 62 -1.315380302376547e-02 +48 63 -1.105916272470026e-02 +48 64 -9.403863770832833e-03 +48 65 -8.076052134892597e-03 +48 66 -6.996835383339674e-03 +48 67 -6.109381318875750e-03 +48 68 -5.371977266379806e-03 +48 69 -4.753493624956896e-03 +48 70 -4.230349322908531e-03 +48 71 -3.784439171232927e-03 +48 72 -3.401691470521393e-03 +48 73 -3.071047067257392e-03 +48 74 -2.783725492315672e-03 +48 75 -2.532689975072680e-03 +48 76 -2.312252367280537e-03 +48 77 -2.117777896667793e-03 +48 78 -1.945462087124853e-03 +48 79 -1.792160480940038e-03 +49 49 3.988394278208170e+01 +49 32 -8.076052134892596e-03 +49 33 -9.403863770832830e-03 +49 34 -1.105916272470025e-02 +49 35 -1.315380302376546e-02 +49 36 -1.585023865775526e-02 +49 37 -1.939104886145110e-02 +49 38 -2.415034675252895e-02 +49 39 -3.072751892616542e-02 +49 40 -4.012781031912993e-02 +49 41 -5.413421453123166e-02 +49 42 -7.613960933881156e-02 +49 43 -1.132183869282763e-01 +49 44 -1.820810586422648e-01 +49 45 -3.301555353436761e-01 +49 46 -7.412185823610196e-01 +49 47 -3.165206906282871e+00 +49 48 -1.502055215899861e+01 +49 50 -1.502055215878374e+01 +49 51 -3.165206906282873e+00 +49 52 -7.412185823610198e-01 +49 53 -3.301555353436761e-01 +49 54 -1.820810586422648e-01 +49 55 -1.132183869282765e-01 +49 56 -7.613960933881164e-02 +49 57 -5.413421453123174e-02 +49 58 -4.012781031912997e-02 +49 59 -3.072751892616545e-02 +49 60 -2.415034675252897e-02 +49 61 -1.939104886145111e-02 +49 62 -1.585023865775526e-02 +49 63 -1.315380302376547e-02 +49 64 -1.105916272470026e-02 +49 65 -9.403863770832833e-03 +49 66 -8.076052134892601e-03 +49 67 -6.996835383339676e-03 +49 68 -6.109381318875751e-03 +49 69 -5.371977266379807e-03 +49 70 -4.753493624956896e-03 +49 71 -4.230349322908533e-03 +49 72 -3.784439171232927e-03 +49 73 -3.401691470521393e-03 +49 74 -3.071047067257394e-03 +49 75 -2.783725492315672e-03 +49 76 -2.532689975072681e-03 +49 77 -2.312252367280536e-03 +49 78 -2.117777896667794e-03 +49 79 -1.945462087124854e-03 +50 50 3.988394278171953e+01 +50 32 -6.996835383339675e-03 +50 33 -8.076052134892597e-03 +50 34 -9.403863770832830e-03 +50 35 -1.105916272470025e-02 +50 36 -1.315380302376546e-02 +50 37 -1.585023865775525e-02 +50 38 -1.939104886145110e-02 +50 39 -2.415034675252895e-02 +50 40 -3.072751892616542e-02 +50 41 -4.012781031912993e-02 +50 42 -5.413421453123166e-02 +50 43 -7.613960933881156e-02 +50 44 -1.132183869282764e-01 +50 45 -1.820810586422648e-01 +50 46 -3.301555353436759e-01 +50 47 -7.412185823610193e-01 +50 48 -3.165206906282873e+00 +50 49 -1.502055215878374e+01 +50 51 -1.502055215863301e+01 +50 52 -3.165206906282872e+00 +50 53 -7.412185823610200e-01 +50 54 -3.301555353436758e-01 +50 55 -1.820810586422650e-01 +50 56 -1.132183869282765e-01 +50 57 -7.613960933881167e-02 +50 58 -5.413421453123174e-02 +50 59 -4.012781031912997e-02 +50 60 -3.072751892616545e-02 +50 61 -2.415034675252897e-02 +50 62 -1.939104886145112e-02 +50 63 -1.585023865775526e-02 +50 64 -1.315380302376547e-02 +50 65 -1.105916272470026e-02 +50 66 -9.403863770832830e-03 +50 67 -8.076052134892596e-03 +50 68 -6.996835383339672e-03 +50 69 -6.109381318875748e-03 +50 70 -5.371977266379805e-03 +50 71 -4.753493624956895e-03 +50 72 -4.230349322908531e-03 +50 73 -3.784439171232925e-03 +50 74 -3.401691470521393e-03 +50 75 -3.071047067257392e-03 +50 76 -2.783725492315673e-03 +50 77 -2.532689975072678e-03 +50 78 -2.312252367280536e-03 +50 79 -2.117777896667793e-03 +51 51 3.988394278146372e+01 +51 32 -6.109381318875748e-03 +51 33 -6.996835383339671e-03 +51 34 -8.076052134892596e-03 +51 35 -9.403863770832830e-03 +51 36 -1.105916272470025e-02 +51 37 -1.315380302376546e-02 +51 38 -1.585023865775525e-02 +51 39 -1.939104886145110e-02 +51 40 -2.415034675252896e-02 +51 41 -3.072751892616543e-02 +51 42 -4.012781031912994e-02 +51 43 -5.413421453123169e-02 +51 44 -7.613960933881159e-02 +51 45 -1.132183869282764e-01 +51 46 -1.820810586422650e-01 +51 47 -3.301555353436763e-01 +51 48 -7.412185823610199e-01 +51 49 -3.165206906282873e+00 +51 50 -1.502055215863301e+01 +51 52 -1.502055215852576e+01 +51 53 -3.165206906282872e+00 +51 54 -7.412185823610172e-01 +51 55 -3.301555353436755e-01 +51 56 -1.820810586422648e-01 +51 57 -1.132183869282764e-01 +51 58 -7.613960933881159e-02 +51 59 -5.413421453123172e-02 +51 60 -4.012781031912996e-02 +51 61 -3.072751892616543e-02 +51 62 -2.415034675252897e-02 +51 63 -1.939104886145111e-02 +51 64 -1.585023865775526e-02 +51 65 -1.315380302376546e-02 +51 66 -1.105916272470025e-02 +51 67 -9.403863770832830e-03 +51 68 -8.076052134892601e-03 +51 69 -6.996835383339676e-03 +51 70 -6.109381318875751e-03 +51 71 -5.371977266379807e-03 +51 72 -4.753493624956896e-03 +51 73 -4.230349322908531e-03 +51 74 -3.784439171232928e-03 +51 75 -3.401691470521394e-03 +51 76 -3.071047067257394e-03 +51 77 -2.783725492315672e-03 +51 78 -2.532689975072680e-03 +51 79 -2.312252367280536e-03 +52 52 3.988394278128114e+01 +52 32 -5.371977266379806e-03 +52 33 -6.109381318875749e-03 +52 34 -6.996835383339674e-03 +52 35 -8.076052134892597e-03 +52 36 -9.403863770832832e-03 +52 37 -1.105916272470025e-02 +52 38 -1.315380302376546e-02 +52 39 -1.585023865775525e-02 +52 40 -1.939104886145110e-02 +52 41 -2.415034675252896e-02 +52 42 -3.072751892616543e-02 +52 43 -4.012781031912994e-02 +52 44 -5.413421453123169e-02 +52 45 -7.613960933881156e-02 +52 46 -1.132183869282763e-01 +52 47 -1.820810586422651e-01 +52 48 -3.301555353436765e-01 +52 49 -7.412185823610198e-01 +52 50 -3.165206906282872e+00 +52 51 -1.502055215852576e+01 +52 53 -1.502055215844907e+01 +52 54 -3.165206906282868e+00 +52 55 -7.412185823610183e-01 +52 56 -3.301555353436757e-01 +52 57 -1.820810586422650e-01 +52 58 -1.132183869282764e-01 +52 59 -7.613960933881159e-02 +52 60 -5.413421453123172e-02 +52 61 -4.012781031912996e-02 +52 62 -3.072751892616545e-02 +52 63 -2.415034675252897e-02 +52 64 -1.939104886145111e-02 +52 65 -1.585023865775526e-02 +52 66 -1.315380302376546e-02 +52 67 -1.105916272470025e-02 +52 68 -9.403863770832833e-03 +52 69 -8.076052134892596e-03 +52 70 -6.996835383339672e-03 +52 71 -6.109381318875748e-03 +52 72 -5.371977266379805e-03 +52 73 -4.753493624956893e-03 +52 74 -4.230349322908531e-03 +52 75 -3.784439171232926e-03 +52 76 -3.401691470521394e-03 +52 77 -3.071047067257391e-03 +52 78 -2.783725492315672e-03 +52 79 -2.532689975072679e-03 +53 53 3.988394278115155e+01 +53 32 -4.753493624956895e-03 +53 33 -5.371977266379804e-03 +53 34 -6.109381318875746e-03 +53 35 -6.996835383339671e-03 +53 36 -8.076052134892596e-03 +53 37 -9.403863770832830e-03 +53 38 -1.105916272470025e-02 +53 39 -1.315380302376546e-02 +53 40 -1.585023865775525e-02 +53 41 -1.939104886145110e-02 +53 42 -2.415034675252896e-02 +53 43 -3.072751892616543e-02 +53 44 -4.012781031912994e-02 +53 45 -5.413421453123169e-02 +53 46 -7.613960933881156e-02 +53 47 -1.132183869282764e-01 +53 48 -1.820810586422650e-01 +53 49 -3.301555353436761e-01 +53 50 -7.412185823610200e-01 +53 51 -3.165206906282872e+00 +53 52 -1.502055215844907e+01 +53 54 -1.502055215839541e+01 +53 55 -3.165206906282873e+00 +53 56 -7.412185823610193e-01 +53 57 -3.301555353436756e-01 +53 58 -1.820810586422648e-01 +53 59 -1.132183869282764e-01 +53 60 -7.613960933881161e-02 +53 61 -5.413421453123172e-02 +53 62 -4.012781031912997e-02 +53 63 -3.072751892616545e-02 +53 64 -2.415034675252897e-02 +53 65 -1.939104886145111e-02 +53 66 -1.585023865775526e-02 +53 67 -1.315380302376546e-02 +53 68 -1.105916272470026e-02 +53 69 -9.403863770832828e-03 +53 70 -8.076052134892601e-03 +53 71 -6.996835383339676e-03 +53 72 -6.109381318875750e-03 +53 73 -5.371977266379805e-03 +53 74 -4.753493624956896e-03 +53 75 -4.230349322908533e-03 +53 76 -3.784439171232929e-03 +53 77 -3.401691470521393e-03 +53 78 -3.071047067257394e-03 +53 79 -2.783725492315672e-03 +54 54 3.988394278106477e+01 +54 32 -4.230349322908533e-03 +54 33 -4.753493624956895e-03 +54 34 -5.371977266379806e-03 +54 35 -6.109381318875749e-03 +54 36 -6.996835383339674e-03 +54 37 -8.076052134892601e-03 +54 38 -9.403863770832830e-03 +54 39 -1.105916272470025e-02 +54 40 -1.315380302376546e-02 +54 41 -1.585023865775525e-02 +54 42 -1.939104886145110e-02 +54 43 -2.415034675252896e-02 +54 44 -3.072751892616543e-02 +54 45 -4.012781031912994e-02 +54 46 -5.413421453123169e-02 +54 47 -7.613960933881156e-02 +54 48 -1.132183869282764e-01 +54 49 -1.820810586422648e-01 +54 50 -3.301555353436758e-01 +54 51 -7.412185823610172e-01 +54 52 -3.165206906282868e+00 +54 53 -1.502055215839541e+01 +54 55 -1.502055215836222e+01 +54 56 -3.165206906282874e+00 +54 57 -7.412185823610198e-01 +54 58 -3.301555353436754e-01 +54 59 -1.820810586422649e-01 +54 60 -1.132183869282764e-01 +54 61 -7.613960933881161e-02 +54 62 -5.413421453123174e-02 +54 63 -4.012781031912997e-02 +54 64 -3.072751892616545e-02 +54 65 -2.415034675252897e-02 +54 66 -1.939104886145111e-02 +54 67 -1.585023865775526e-02 +54 68 -1.315380302376547e-02 +54 69 -1.105916272470025e-02 +54 70 -9.403863770832833e-03 +54 71 -8.076052134892596e-03 +54 72 -6.996835383339671e-03 +54 73 -6.109381318875746e-03 +54 74 -5.371977266379805e-03 +54 75 -4.753493624956895e-03 +54 76 -4.230349322908533e-03 +54 77 -3.784439171232925e-03 +54 78 -3.401691470521393e-03 +54 79 -3.071047067257392e-03 +55 55 3.988394278102304e+01 +55 32 -3.784439171232926e-03 +55 33 -4.230349322908529e-03 +55 34 -4.753493624956894e-03 +55 35 -5.371977266379804e-03 +55 36 -6.109381318875746e-03 +55 37 -6.996835383339674e-03 +55 38 -8.076052134892594e-03 +55 39 -9.403863770832830e-03 +55 40 -1.105916272470025e-02 +55 41 -1.315380302376546e-02 +55 42 -1.585023865775525e-02 +55 43 -1.939104886145110e-02 +55 44 -2.415034675252896e-02 +55 45 -3.072751892616543e-02 +55 46 -4.012781031912994e-02 +55 47 -5.413421453123170e-02 +55 48 -7.613960933881164e-02 +55 49 -1.132183869282765e-01 +55 50 -1.820810586422650e-01 +55 51 -3.301555353436755e-01 +55 52 -7.412185823610183e-01 +55 53 -3.165206906282873e+00 +55 54 -1.502055215836222e+01 +55 56 -1.502055215835490e+01 +55 57 -3.165206906282872e+00 +55 58 -7.412185823610165e-01 +55 59 -3.301555353436753e-01 +55 60 -1.820810586422650e-01 +55 61 -1.132183869282764e-01 +55 62 -7.613960933881164e-02 +55 63 -5.413421453123174e-02 +55 64 -4.012781031912997e-02 +55 65 -3.072751892616544e-02 +55 66 -2.415034675252897e-02 +55 67 -1.939104886145111e-02 +55 68 -1.585023865775526e-02 +55 69 -1.315380302376546e-02 +55 70 -1.105916272470026e-02 +55 71 -9.403863770832828e-03 +55 72 -8.076052134892599e-03 +55 73 -6.996835383339672e-03 +55 74 -6.109381318875752e-03 +55 75 -5.371977266379807e-03 +55 76 -4.753493624956898e-03 +55 77 -4.230349322908531e-03 +55 78 -3.784439171232928e-03 +55 79 -3.401691470521394e-03 +56 56 3.988394278105615e+01 +56 32 -3.401691470521393e-03 +56 33 -3.784439171232926e-03 +56 34 -4.230349322908529e-03 +56 35 -4.753493624956894e-03 +56 36 -5.371977266379804e-03 +56 37 -6.109381318875749e-03 +56 38 -6.996835383339671e-03 +56 39 -8.076052134892597e-03 +56 40 -9.403863770832828e-03 +56 41 -1.105916272470025e-02 +56 42 -1.315380302376546e-02 +56 43 -1.585023865775525e-02 +56 44 -1.939104886145110e-02 +56 45 -2.415034675252896e-02 +56 46 -3.072751892616543e-02 +56 47 -4.012781031912994e-02 +56 48 -5.413421453123173e-02 +56 49 -7.613960933881164e-02 +56 50 -1.132183869282765e-01 +56 51 -1.820810586422648e-01 +56 52 -3.301555353436757e-01 +56 53 -7.412185823610193e-01 +56 54 -3.165206906282874e+00 +56 55 -1.502055215835490e+01 +56 57 -1.502055215840049e+01 +56 58 -3.165206906282869e+00 +56 59 -7.412185823610180e-01 +56 60 -3.301555353436759e-01 +56 61 -1.820810586422651e-01 +56 62 -1.132183869282765e-01 +56 63 -7.613960933881164e-02 +56 64 -5.413421453123173e-02 +56 65 -4.012781031912996e-02 +56 66 -3.072751892616544e-02 +56 67 -2.415034675252897e-02 +56 68 -1.939104886145112e-02 +56 69 -1.585023865775525e-02 +56 70 -1.315380302376547e-02 +56 71 -1.105916272470025e-02 +56 72 -9.403863770832833e-03 +56 73 -8.076052134892597e-03 +56 74 -6.996835383339676e-03 +56 75 -6.109381318875751e-03 +56 76 -5.371977266379809e-03 +56 77 -4.753493624956895e-03 +56 78 -4.230349322908533e-03 +56 79 -3.784439171232928e-03 +57 57 3.988394278128565e+01 +57 32 -3.071047067257393e-03 +57 33 -3.401691470521393e-03 +57 34 -3.784439171232926e-03 +57 35 -4.230349322908531e-03 +57 36 -4.753493624956895e-03 +57 37 -5.371977266379808e-03 +57 38 -6.109381318875749e-03 +57 39 -6.996835383339678e-03 +57 40 -8.076052134892597e-03 +57 41 -9.403863770832830e-03 +57 42 -1.105916272470025e-02 +57 43 -1.315380302376546e-02 +57 44 -1.585023865775525e-02 +57 45 -1.939104886145110e-02 +57 46 -2.415034675252896e-02 +57 47 -3.072751892616543e-02 +57 48 -4.012781031912997e-02 +57 49 -5.413421453123174e-02 +57 50 -7.613960933881167e-02 +57 51 -1.132183869282764e-01 +57 52 -1.820810586422650e-01 +57 53 -3.301555353436756e-01 +57 54 -7.412185823610198e-01 +57 55 -3.165206906282872e+00 +57 56 -1.502055215840049e+01 +57 58 -1.502055215860531e+01 +57 59 -3.165206906282871e+00 +57 60 -7.412185823610218e-01 +57 61 -3.301555353436767e-01 +57 62 -1.820810586422651e-01 +57 63 -1.132183869282764e-01 +57 64 -7.613960933881161e-02 +57 65 -5.413421453123170e-02 +57 66 -4.012781031912996e-02 +57 67 -3.072751892616544e-02 +57 68 -2.415034675252898e-02 +57 69 -1.939104886145110e-02 +57 70 -1.585023865775526e-02 +57 71 -1.315380302376546e-02 +57 72 -1.105916272470026e-02 +57 73 -9.403863770832828e-03 +57 74 -8.076052134892597e-03 +57 75 -6.996835383339672e-03 +57 76 -6.109381318875750e-03 +57 77 -5.371977266379803e-03 +57 78 -4.753493624956895e-03 +57 79 -4.230349322908531e-03 +58 58 3.988394278152496e+01 +58 32 -2.783725492315671e-03 +58 33 -3.071047067257391e-03 +58 34 -3.401691470521392e-03 +58 35 -3.784439171232926e-03 +58 36 -4.230349322908529e-03 +58 37 -4.753493624956895e-03 +58 38 -5.371977266379805e-03 +58 39 -6.109381318875749e-03 +58 40 -6.996835383339671e-03 +58 41 -8.076052134892596e-03 +58 42 -9.403863770832830e-03 +58 43 -1.105916272470025e-02 +58 44 -1.315380302376546e-02 +58 45 -1.585023865775525e-02 +58 46 -1.939104886145110e-02 +58 47 -2.415034675252896e-02 +58 48 -3.072751892616545e-02 +58 49 -4.012781031912997e-02 +58 50 -5.413421453123174e-02 +58 51 -7.613960933881159e-02 +58 52 -1.132183869282764e-01 +58 53 -1.820810586422648e-01 +58 54 -3.301555353436754e-01 +58 55 -7.412185823610165e-01 +58 56 -3.165206906282869e+00 +58 57 -1.502055215860531e+01 +58 59 -1.502055215859223e+01 +58 60 -3.165206906282878e+00 +58 61 -7.412185823610212e-01 +58 62 -3.301555353436768e-01 +58 63 -1.820810586422652e-01 +58 64 -1.132183869282765e-01 +58 65 -7.613960933881164e-02 +58 66 -5.413421453123170e-02 +58 67 -4.012781031912996e-02 +58 68 -3.072751892616545e-02 +58 69 -2.415034675252895e-02 +58 70 -1.939104886145112e-02 +58 71 -1.585023865775525e-02 +58 72 -1.315380302376547e-02 +58 73 -1.105916272470025e-02 +58 74 -9.403863770832833e-03 +58 75 -8.076052134892601e-03 +58 76 -6.996835383339678e-03 +58 77 -6.109381318875749e-03 +58 78 -5.371977266379807e-03 +58 79 -4.753493624956896e-03 +59 59 3.988394278151357e+01 +59 32 -2.532689975072680e-03 +59 33 -2.783725492315672e-03 +59 34 -3.071047067257393e-03 +59 35 -3.401691470521393e-03 +59 36 -3.784439171232926e-03 +59 37 -4.230349322908533e-03 +59 38 -4.753493624956896e-03 +59 39 -5.371977266379808e-03 +59 40 -6.109381318875749e-03 +59 41 -6.996835383339674e-03 +59 42 -8.076052134892601e-03 +59 43 -9.403863770832830e-03 +59 44 -1.105916272470025e-02 +59 45 -1.315380302376546e-02 +59 46 -1.585023865775525e-02 +59 47 -1.939104886145111e-02 +59 48 -2.415034675252897e-02 +59 49 -3.072751892616545e-02 +59 50 -4.012781031912997e-02 +59 51 -5.413421453123172e-02 +59 52 -7.613960933881159e-02 +59 53 -1.132183869282764e-01 +59 54 -1.820810586422649e-01 +59 55 -3.301555353436753e-01 +59 56 -7.412185823610180e-01 +59 57 -3.165206906282871e+00 +59 58 -1.502055215859223e+01 +59 60 -1.502055215859653e+01 +59 61 -3.165206906282870e+00 +59 62 -7.412185823610182e-01 +59 63 -3.301555353436761e-01 +59 64 -1.820810586422650e-01 +59 65 -1.132183869282765e-01 +59 66 -7.613960933881161e-02 +59 67 -5.413421453123171e-02 +59 68 -4.012781031912999e-02 +59 69 -3.072751892616542e-02 +59 70 -2.415034675252898e-02 +59 71 -1.939104886145110e-02 +59 72 -1.585023865775526e-02 +59 73 -1.315380302376546e-02 +59 74 -1.105916272470026e-02 +59 75 -9.403863770832830e-03 +59 76 -8.076052134892601e-03 +59 77 -6.996835383339670e-03 +59 78 -6.109381318875748e-03 +59 79 -5.371977266379805e-03 +60 60 3.988394278151443e+01 +60 32 -2.312252367280535e-03 +60 33 -2.532689975072679e-03 +60 34 -2.783725492315671e-03 +60 35 -3.071047067257391e-03 +60 36 -3.401691470521392e-03 +60 37 -3.784439171232927e-03 +60 38 -4.230349322908529e-03 +60 39 -4.753493624956895e-03 +60 40 -5.371977266379805e-03 +60 41 -6.109381318875747e-03 +60 42 -6.996835383339674e-03 +60 43 -8.076052134892596e-03 +60 44 -9.403863770832830e-03 +60 45 -1.105916272470025e-02 +60 46 -1.315380302376546e-02 +60 47 -1.585023865775525e-02 +60 48 -1.939104886145111e-02 +60 49 -2.415034675252897e-02 +60 50 -3.072751892616545e-02 +60 51 -4.012781031912996e-02 +60 52 -5.413421453123172e-02 +60 53 -7.613960933881161e-02 +60 54 -1.132183869282764e-01 +60 55 -1.820810586422650e-01 +60 56 -3.301555353436759e-01 +60 57 -7.412185823610218e-01 +60 58 -3.165206906282878e+00 +60 59 -1.502055215859653e+01 +60 61 -1.502055215858802e+01 +60 62 -3.165206906282870e+00 +60 63 -7.412185823610187e-01 +60 64 -3.301555353436753e-01 +60 65 -1.820810586422648e-01 +60 66 -1.132183869282764e-01 +60 67 -7.613960933881164e-02 +60 68 -5.413421453123175e-02 +60 69 -4.012781031912994e-02 +60 70 -3.072751892616545e-02 +60 71 -2.415034675252895e-02 +60 72 -1.939104886145112e-02 +60 73 -1.585023865775525e-02 +60 74 -1.315380302376547e-02 +60 75 -1.105916272470025e-02 +60 76 -9.403863770832837e-03 +60 77 -8.076052134892597e-03 +60 78 -6.996835383339676e-03 +60 79 -6.109381318875751e-03 +61 61 3.988394278153932e+01 +61 32 -2.117777896667794e-03 +61 33 -2.312252367280536e-03 +61 34 -2.532689975072679e-03 +61 35 -2.783725492315672e-03 +61 36 -3.071047067257393e-03 +61 37 -3.401691470521395e-03 +61 38 -3.784439171232927e-03 +61 39 -4.230349322908533e-03 +61 40 -4.753493624956896e-03 +61 41 -5.371977266379806e-03 +61 42 -6.109381318875753e-03 +61 43 -6.996835383339674e-03 +61 44 -8.076052134892601e-03 +61 45 -9.403863770832830e-03 +61 46 -1.105916272470025e-02 +61 47 -1.315380302376546e-02 +61 48 -1.585023865775526e-02 +61 49 -1.939104886145111e-02 +61 50 -2.415034675252897e-02 +61 51 -3.072751892616543e-02 +61 52 -4.012781031912996e-02 +61 53 -5.413421453123172e-02 +61 54 -7.613960933881161e-02 +61 55 -1.132183869282764e-01 +61 56 -1.820810586422651e-01 +61 57 -3.301555353436767e-01 +61 58 -7.412185823610212e-01 +61 59 -3.165206906282870e+00 +61 60 -1.502055215858802e+01 +61 62 -1.502055215864002e+01 +61 63 -3.165206906282872e+00 +61 64 -7.412185823610183e-01 +61 65 -3.301555353436754e-01 +61 66 -1.820810586422649e-01 +61 67 -1.132183869282765e-01 +61 68 -7.613960933881164e-02 +61 69 -5.413421453123167e-02 +61 70 -4.012781031912998e-02 +61 71 -3.072751892616542e-02 +61 72 -2.415034675252898e-02 +61 73 -1.939104886145110e-02 +61 74 -1.585023865775526e-02 +61 75 -1.315380302376546e-02 +61 76 -1.105916272470026e-02 +61 77 -9.403863770832830e-03 +61 78 -8.076052134892597e-03 +61 79 -6.996835383339672e-03 +62 62 3.988394278164021e+01 +62 32 -1.945462087124853e-03 +62 33 -2.117777896667793e-03 +62 34 -2.312252367280535e-03 +62 35 -2.532689975072679e-03 +62 36 -2.783725492315671e-03 +62 37 -3.071047067257393e-03 +62 38 -3.401691470521392e-03 +62 39 -3.784439171232927e-03 +62 40 -4.230349322908529e-03 +62 41 -4.753493624956894e-03 +62 42 -5.371977266379806e-03 +62 43 -6.109381318875747e-03 +62 44 -6.996835383339674e-03 +62 45 -8.076052134892596e-03 +62 46 -9.403863770832830e-03 +62 47 -1.105916272470025e-02 +62 48 -1.315380302376547e-02 +62 49 -1.585023865775526e-02 +62 50 -1.939104886145112e-02 +62 51 -2.415034675252897e-02 +62 52 -3.072751892616545e-02 +62 53 -4.012781031912997e-02 +62 54 -5.413421453123174e-02 +62 55 -7.613960933881164e-02 +62 56 -1.132183869282765e-01 +62 57 -1.820810586422651e-01 +62 58 -3.301555353436768e-01 +62 59 -7.412185823610182e-01 +62 60 -3.165206906282870e+00 +62 61 -1.502055215864002e+01 +62 63 -1.502055215866001e+01 +62 64 -3.165206906282871e+00 +62 65 -7.412185823610198e-01 +62 66 -3.301555353436760e-01 +62 67 -1.820810586422649e-01 +62 68 -1.132183869282763e-01 +62 69 -7.613960933881156e-02 +62 70 -5.413421453123173e-02 +62 71 -4.012781031912992e-02 +62 72 -3.072751892616544e-02 +62 73 -2.415034675252895e-02 +62 74 -1.939104886145111e-02 +62 75 -1.585023865775526e-02 +62 76 -1.315380302376547e-02 +62 77 -1.105916272470025e-02 +62 78 -9.403863770832832e-03 +62 79 -8.076052134892597e-03 +63 63 3.988394278169705e+01 +63 32 -1.792160480940038e-03 +63 33 -1.945462087124853e-03 +63 34 -2.117777896667793e-03 +63 35 -2.312252367280536e-03 +63 36 -2.532689975072680e-03 +63 37 -2.783725492315673e-03 +63 38 -3.071047067257393e-03 +63 39 -3.401691470521395e-03 +63 40 -3.784439171232928e-03 +63 41 -4.230349322908531e-03 +63 42 -4.753493624956897e-03 +63 43 -5.371977266379806e-03 +63 44 -6.109381318875753e-03 +63 45 -6.996835383339674e-03 +63 46 -8.076052134892601e-03 +63 47 -9.403863770832830e-03 +63 48 -1.105916272470026e-02 +63 49 -1.315380302376547e-02 +63 50 -1.585023865775526e-02 +63 51 -1.939104886145111e-02 +63 52 -2.415034675252897e-02 +63 53 -3.072751892616545e-02 +63 54 -4.012781031912997e-02 +63 55 -5.413421453123174e-02 +63 56 -7.613960933881164e-02 +63 57 -1.132183869282764e-01 +63 58 -1.820810586422652e-01 +63 59 -3.301555353436761e-01 +63 60 -7.412185823610187e-01 +63 61 -3.165206906282872e+00 +63 62 -1.502055215866001e+01 +63 64 -1.502055215931066e+01 +63 65 -3.165206906282875e+00 +63 66 -7.412185823610193e-01 +63 67 -3.301555353436756e-01 +63 68 -1.820810586422647e-01 +63 69 -1.132183869282764e-01 +63 70 -7.613960933881164e-02 +63 71 -5.413421453123166e-02 +63 72 -4.012781031912997e-02 +63 73 -3.072751892616541e-02 +63 74 -2.415034675252897e-02 +63 75 -1.939104886145111e-02 +63 76 -1.585023865775526e-02 +63 77 -1.315380302376546e-02 +63 78 -1.105916272470026e-02 +63 79 -9.403863770832828e-03 +64 64 3.988394278169706e+01 +64 48 -9.403863770832833e-03 +64 49 -1.105916272470026e-02 +64 50 -1.315380302376547e-02 +64 51 -1.585023865775526e-02 +64 52 -1.939104886145111e-02 +64 53 -2.415034675252897e-02 +64 54 -3.072751892616545e-02 +64 55 -4.012781031912997e-02 +64 56 -5.413421453123173e-02 +64 57 -7.613960933881161e-02 +64 58 -1.132183869282765e-01 +64 59 -1.820810586422650e-01 +64 60 -3.301555353436753e-01 +64 61 -7.412185823610183e-01 +64 62 -3.165206906282871e+00 +64 63 -1.502055215931066e+01 +64 65 -1.502055215866002e+01 +64 66 -3.165206906282871e+00 +64 67 -7.412185823610188e-01 +64 68 -3.301555353436758e-01 +64 69 -1.820810586422650e-01 +64 70 -1.132183869282765e-01 +64 71 -7.613960933881156e-02 +64 72 -5.413421453123173e-02 +64 73 -4.012781031912992e-02 +64 74 -3.072751892616545e-02 +64 75 -2.415034675252896e-02 +64 76 -1.939104886145111e-02 +64 77 -1.585023865775526e-02 +64 78 -1.315380302376547e-02 +64 79 -1.105916272470025e-02 +64 80 -9.403863770832833e-03 +64 81 -8.076052134892597e-03 +64 82 -6.996835383339674e-03 +64 83 -6.109381318875752e-03 +64 84 -5.371977266379804e-03 +64 85 -4.753493624956896e-03 +64 86 -4.230349322908531e-03 +64 87 -3.784439171232929e-03 +64 88 -3.401691470521394e-03 +64 89 -3.071047067257393e-03 +64 90 -2.783725492315673e-03 +64 91 -2.532689975072679e-03 +64 92 -2.312252367280536e-03 +64 93 -2.117777896667794e-03 +64 94 -1.945462087124854e-03 +64 95 -1.792160480940038e-03 +65 65 3.988394278164022e+01 +65 48 -8.076052134892597e-03 +65 49 -9.403863770832833e-03 +65 50 -1.105916272470026e-02 +65 51 -1.315380302376546e-02 +65 52 -1.585023865775526e-02 +65 53 -1.939104886145111e-02 +65 54 -2.415034675252897e-02 +65 55 -3.072751892616544e-02 +65 56 -4.012781031912996e-02 +65 57 -5.413421453123170e-02 +65 58 -7.613960933881164e-02 +65 59 -1.132183869282765e-01 +65 60 -1.820810586422648e-01 +65 61 -3.301555353436754e-01 +65 62 -7.412185823610198e-01 +65 63 -3.165206906282875e+00 +65 64 -1.502055215866002e+01 +65 66 -1.502055215864001e+01 +65 67 -3.165206906282870e+00 +65 68 -7.412185823610191e-01 +65 69 -3.301555353436759e-01 +65 70 -1.820810586422653e-01 +65 71 -1.132183869282765e-01 +65 72 -7.613960933881168e-02 +65 73 -5.413421453123168e-02 +65 74 -4.012781031912998e-02 +65 75 -3.072751892616544e-02 +65 76 -2.415034675252898e-02 +65 77 -1.939104886145111e-02 +65 78 -1.585023865775526e-02 +65 79 -1.315380302376546e-02 +65 80 -1.105916272470026e-02 +65 81 -9.403863770832830e-03 +65 82 -8.076052134892597e-03 +65 83 -6.996835383339677e-03 +65 84 -6.109381318875748e-03 +65 85 -5.371977266379806e-03 +65 86 -4.753493624956896e-03 +65 87 -4.230349322908533e-03 +65 88 -3.784439171232928e-03 +65 89 -3.401691470521393e-03 +65 90 -3.071047067257394e-03 +65 91 -2.783725492315671e-03 +65 92 -2.532689975072680e-03 +65 93 -2.312252367280536e-03 +65 94 -2.117777896667794e-03 +65 95 -1.945462087124853e-03 +66 66 3.988394278153933e+01 +66 48 -6.996835383339674e-03 +66 49 -8.076052134892601e-03 +66 50 -9.403863770832830e-03 +66 51 -1.105916272470025e-02 +66 52 -1.315380302376546e-02 +66 53 -1.585023865775526e-02 +66 54 -1.939104886145111e-02 +66 55 -2.415034675252897e-02 +66 56 -3.072751892616544e-02 +66 57 -4.012781031912996e-02 +66 58 -5.413421453123170e-02 +66 59 -7.613960933881161e-02 +66 60 -1.132183869282764e-01 +66 61 -1.820810586422649e-01 +66 62 -3.301555353436760e-01 +66 63 -7.412185823610193e-01 +66 64 -3.165206906282871e+00 +66 65 -1.502055215864001e+01 +66 67 -1.502055215858804e+01 +66 68 -3.165206906282868e+00 +66 69 -7.412185823610172e-01 +66 70 -3.301555353436773e-01 +66 71 -1.820810586422656e-01 +66 72 -1.132183869282767e-01 +66 73 -7.613960933881161e-02 +66 74 -5.413421453123175e-02 +66 75 -4.012781031912996e-02 +66 76 -3.072751892616546e-02 +66 77 -2.415034675252897e-02 +66 78 -1.939104886145112e-02 +66 79 -1.585023865775526e-02 +66 80 -1.315380302376547e-02 +66 81 -1.105916272470025e-02 +66 82 -9.403863770832833e-03 +66 83 -8.076052134892599e-03 +66 84 -6.996835383339671e-03 +66 85 -6.109381318875749e-03 +66 86 -5.371977266379806e-03 +66 87 -4.753493624956898e-03 +66 88 -4.230349322908531e-03 +66 89 -3.784439171232927e-03 +66 90 -3.401691470521395e-03 +66 91 -3.071047067257392e-03 +66 92 -2.783725492315672e-03 +66 93 -2.532689975072680e-03 +66 94 -2.312252367280537e-03 +66 95 -2.117777896667794e-03 +67 67 3.988394278151444e+01 +67 48 -6.109381318875750e-03 +67 49 -6.996835383339676e-03 +67 50 -8.076052134892596e-03 +67 51 -9.403863770832830e-03 +67 52 -1.105916272470025e-02 +67 53 -1.315380302376546e-02 +67 54 -1.585023865775526e-02 +67 55 -1.939104886145111e-02 +67 56 -2.415034675252897e-02 +67 57 -3.072751892616544e-02 +67 58 -4.012781031912996e-02 +67 59 -5.413421453123171e-02 +67 60 -7.613960933881164e-02 +67 61 -1.132183869282765e-01 +67 62 -1.820810586422649e-01 +67 63 -3.301555353436756e-01 +67 64 -7.412185823610188e-01 +67 65 -3.165206906282870e+00 +67 66 -1.502055215858804e+01 +67 68 -1.502055215859652e+01 +67 69 -3.165206906282869e+00 +67 70 -7.412185823610224e-01 +67 71 -3.301555353436773e-01 +67 72 -1.820810586422653e-01 +67 73 -1.132183869282765e-01 +67 74 -7.613960933881167e-02 +67 75 -5.413421453123172e-02 +67 76 -4.012781031912998e-02 +67 77 -3.072751892616543e-02 +67 78 -2.415034675252897e-02 +67 79 -1.939104886145111e-02 +67 80 -1.585023865775526e-02 +67 81 -1.315380302376546e-02 +67 82 -1.105916272470026e-02 +67 83 -9.403863770832832e-03 +67 84 -8.076052134892596e-03 +67 85 -6.996835383339674e-03 +67 86 -6.109381318875749e-03 +67 87 -5.371977266379808e-03 +67 88 -4.753493624956896e-03 +67 89 -4.230349322908531e-03 +67 90 -3.784439171232928e-03 +67 91 -3.401691470521393e-03 +67 92 -3.071047067257393e-03 +67 93 -2.783725492315672e-03 +67 94 -2.532689975072680e-03 +67 95 -2.312252367280536e-03 +68 68 3.988394278151359e+01 +68 48 -5.371977266379806e-03 +68 49 -6.109381318875751e-03 +68 50 -6.996835383339672e-03 +68 51 -8.076052134892601e-03 +68 52 -9.403863770832833e-03 +68 53 -1.105916272470026e-02 +68 54 -1.315380302376547e-02 +68 55 -1.585023865775526e-02 +68 56 -1.939104886145112e-02 +68 57 -2.415034675252898e-02 +68 58 -3.072751892616545e-02 +68 59 -4.012781031912999e-02 +68 60 -5.413421453123175e-02 +68 61 -7.613960933881164e-02 +68 62 -1.132183869282763e-01 +68 63 -1.820810586422647e-01 +68 64 -3.301555353436758e-01 +68 65 -7.412185823610191e-01 +68 66 -3.165206906282868e+00 +68 67 -1.502055215859652e+01 +68 69 -1.502055215859223e+01 +68 70 -3.165206906282882e+00 +68 71 -7.412185823610246e-01 +68 72 -3.301555353436769e-01 +68 73 -1.820810586422651e-01 +68 74 -1.132183869282767e-01 +68 75 -7.613960933881163e-02 +68 76 -5.413421453123171e-02 +68 77 -4.012781031912993e-02 +68 78 -3.072751892616544e-02 +68 79 -2.415034675252895e-02 +68 80 -1.939104886145111e-02 +68 81 -1.585023865775525e-02 +68 82 -1.315380302376546e-02 +68 83 -1.105916272470025e-02 +68 84 -9.403863770832830e-03 +68 85 -8.076052134892597e-03 +68 86 -6.996835383339674e-03 +68 87 -6.109381318875752e-03 +68 88 -5.371977266379806e-03 +68 89 -4.753493624956896e-03 +68 90 -4.230349322908533e-03 +68 91 -3.784439171232926e-03 +68 92 -3.401691470521393e-03 +68 93 -3.071047067257393e-03 +68 94 -2.783725492315673e-03 +68 95 -2.532689975072680e-03 +69 69 3.988394278152498e+01 +69 48 -4.753493624956896e-03 +69 49 -5.371977266379807e-03 +69 50 -6.109381318875748e-03 +69 51 -6.996835383339676e-03 +69 52 -8.076052134892596e-03 +69 53 -9.403863770832828e-03 +69 54 -1.105916272470025e-02 +69 55 -1.315380302376546e-02 +69 56 -1.585023865775525e-02 +69 57 -1.939104886145110e-02 +69 58 -2.415034675252895e-02 +69 59 -3.072751892616542e-02 +69 60 -4.012781031912994e-02 +69 61 -5.413421453123167e-02 +69 62 -7.613960933881156e-02 +69 63 -1.132183869282764e-01 +69 64 -1.820810586422650e-01 +69 65 -3.301555353436759e-01 +69 66 -7.412185823610172e-01 +69 67 -3.165206906282869e+00 +69 68 -1.502055215859223e+01 +69 70 -1.502055215860533e+01 +69 71 -3.165206906282872e+00 +69 72 -7.412185823610195e-01 +69 73 -3.301555353436750e-01 +69 74 -1.820810586422651e-01 +69 75 -1.132183869282766e-01 +69 76 -7.613960933881170e-02 +69 77 -5.413421453123175e-02 +69 78 -4.012781031913001e-02 +69 79 -3.072751892616545e-02 +69 80 -2.415034675252899e-02 +69 81 -1.939104886145112e-02 +69 82 -1.585023865775527e-02 +69 83 -1.315380302376547e-02 +69 84 -1.105916272470026e-02 +69 85 -9.403863770832833e-03 +69 86 -8.076052134892599e-03 +69 87 -6.996835383339678e-03 +69 88 -6.109381318875751e-03 +69 89 -5.371977266379806e-03 +69 90 -4.753493624956898e-03 +69 91 -4.230349322908529e-03 +69 92 -3.784439171232927e-03 +69 93 -3.401691470521393e-03 +69 94 -3.071047067257394e-03 +69 95 -2.783725492315672e-03 +70 70 3.988394278128565e+01 +70 48 -4.230349322908531e-03 +70 49 -4.753493624956896e-03 +70 50 -5.371977266379805e-03 +70 51 -6.109381318875751e-03 +70 52 -6.996835383339672e-03 +70 53 -8.076052134892601e-03 +70 54 -9.403863770832833e-03 +70 55 -1.105916272470026e-02 +70 56 -1.315380302376547e-02 +70 57 -1.585023865775526e-02 +70 58 -1.939104886145112e-02 +70 59 -2.415034675252898e-02 +70 60 -3.072751892616545e-02 +70 61 -4.012781031912998e-02 +70 62 -5.413421453123173e-02 +70 63 -7.613960933881164e-02 +70 64 -1.132183869282765e-01 +70 65 -1.820810586422653e-01 +70 66 -3.301555353436773e-01 +70 67 -7.412185823610224e-01 +70 68 -3.165206906282882e+00 +70 69 -1.502055215860533e+01 +70 71 -1.502055215840047e+01 +70 72 -3.165206906282869e+00 +70 73 -7.412185823610146e-01 +70 74 -3.301555353436751e-01 +70 75 -1.820810586422649e-01 +70 76 -1.132183869282763e-01 +70 77 -7.613960933881156e-02 +70 78 -5.413421453123172e-02 +70 79 -4.012781031912993e-02 +70 80 -3.072751892616544e-02 +70 81 -2.415034675252895e-02 +70 82 -1.939104886145111e-02 +70 83 -1.585023865775525e-02 +70 84 -1.315380302376546e-02 +70 85 -1.105916272470025e-02 +70 86 -9.403863770832830e-03 +70 87 -8.076052134892601e-03 +70 88 -6.996835383339676e-03 +70 89 -6.109381318875749e-03 +70 90 -5.371977266379808e-03 +70 91 -4.753493624956894e-03 +70 92 -4.230349322908531e-03 +70 93 -3.784439171232927e-03 +70 94 -3.401691470521395e-03 +70 95 -3.071047067257393e-03 +71 71 3.988394278105616e+01 +71 48 -3.784439171232927e-03 +71 49 -4.230349322908533e-03 +71 50 -4.753493624956895e-03 +71 51 -5.371977266379807e-03 +71 52 -6.109381318875748e-03 +71 53 -6.996835383339676e-03 +71 54 -8.076052134892596e-03 +71 55 -9.403863770832828e-03 +71 56 -1.105916272470025e-02 +71 57 -1.315380302376546e-02 +71 58 -1.585023865775525e-02 +71 59 -1.939104886145110e-02 +71 60 -2.415034675252895e-02 +71 61 -3.072751892616542e-02 +71 62 -4.012781031912992e-02 +71 63 -5.413421453123166e-02 +71 64 -7.613960933881156e-02 +71 65 -1.132183869282765e-01 +71 66 -1.820810586422656e-01 +71 67 -3.301555353436773e-01 +71 68 -7.412185823610246e-01 +71 69 -3.165206906282872e+00 +71 70 -1.502055215840047e+01 +71 72 -1.502055215835492e+01 +71 73 -3.165206906282868e+00 +71 74 -7.412185823610193e-01 +71 75 -3.301555353436754e-01 +71 76 -1.820810586422648e-01 +71 77 -1.132183869282765e-01 +71 78 -7.613960933881164e-02 +71 79 -5.413421453123175e-02 +71 80 -4.012781031913001e-02 +71 81 -3.072751892616545e-02 +71 82 -2.415034675252899e-02 +71 83 -1.939104886145112e-02 +71 84 -1.585023865775527e-02 +71 85 -1.315380302376547e-02 +71 86 -1.105916272470026e-02 +71 87 -9.403863770832835e-03 +71 88 -8.076052134892601e-03 +71 89 -6.996835383339674e-03 +71 90 -6.109381318875752e-03 +71 91 -5.371977266379804e-03 +71 92 -4.753493624956896e-03 +71 93 -4.230349322908531e-03 +71 94 -3.784439171232929e-03 +71 95 -3.401691470521394e-03 +72 72 3.988394278102305e+01 +72 48 -3.401691470521393e-03 +72 49 -3.784439171232927e-03 +72 50 -4.230349322908531e-03 +72 51 -4.753493624956896e-03 +72 52 -5.371977266379805e-03 +72 53 -6.109381318875750e-03 +72 54 -6.996835383339671e-03 +72 55 -8.076052134892599e-03 +72 56 -9.403863770832833e-03 +72 57 -1.105916272470026e-02 +72 58 -1.315380302376547e-02 +72 59 -1.585023865775526e-02 +72 60 -1.939104886145112e-02 +72 61 -2.415034675252898e-02 +72 62 -3.072751892616544e-02 +72 63 -4.012781031912997e-02 +72 64 -5.413421453123173e-02 +72 65 -7.613960933881168e-02 +72 66 -1.132183869282767e-01 +72 67 -1.820810586422653e-01 +72 68 -3.301555353436769e-01 +72 69 -7.412185823610195e-01 +72 70 -3.165206906282869e+00 +72 71 -1.502055215835492e+01 +72 73 -1.502055215836221e+01 +72 74 -3.165206906282870e+00 +72 75 -7.412185823610189e-01 +72 76 -3.301555353436748e-01 +72 77 -1.820810586422648e-01 +72 78 -1.132183869282763e-01 +72 79 -7.613960933881156e-02 +72 80 -5.413421453123172e-02 +72 81 -4.012781031912993e-02 +72 82 -3.072751892616544e-02 +72 83 -2.415034675252895e-02 +72 84 -1.939104886145111e-02 +72 85 -1.585023865775525e-02 +72 86 -1.315380302376546e-02 +72 87 -1.105916272470025e-02 +72 88 -9.403863770832830e-03 +72 89 -8.076052134892597e-03 +72 90 -6.996835383339678e-03 +72 91 -6.109381318875748e-03 +72 92 -5.371977266379806e-03 +72 93 -4.753493624956896e-03 +72 94 -4.230349322908534e-03 +72 95 -3.784439171232928e-03 +73 73 3.988394278106478e+01 +73 48 -3.071047067257392e-03 +73 49 -3.401691470521393e-03 +73 50 -3.784439171232925e-03 +73 51 -4.230349322908531e-03 +73 52 -4.753493624956893e-03 +73 53 -5.371977266379805e-03 +73 54 -6.109381318875746e-03 +73 55 -6.996835383339672e-03 +73 56 -8.076052134892597e-03 +73 57 -9.403863770832828e-03 +73 58 -1.105916272470025e-02 +73 59 -1.315380302376546e-02 +73 60 -1.585023865775525e-02 +73 61 -1.939104886145110e-02 +73 62 -2.415034675252895e-02 +73 63 -3.072751892616541e-02 +73 64 -4.012781031912992e-02 +73 65 -5.413421453123168e-02 +73 66 -7.613960933881161e-02 +73 67 -1.132183869282765e-01 +73 68 -1.820810586422651e-01 +73 69 -3.301555353436750e-01 +73 70 -7.412185823610146e-01 +73 71 -3.165206906282868e+00 +73 72 -1.502055215836221e+01 +73 74 -1.502055215839543e+01 +73 75 -3.165206906282880e+00 +73 76 -7.412185823610186e-01 +73 77 -3.301555353436755e-01 +73 78 -1.820810586422650e-01 +73 79 -1.132183869282766e-01 +73 80 -7.613960933881170e-02 +73 81 -5.413421453123175e-02 +73 82 -4.012781031913001e-02 +73 83 -3.072751892616545e-02 +73 84 -2.415034675252899e-02 +73 85 -1.939104886145112e-02 +73 86 -1.585023865775527e-02 +73 87 -1.315380302376547e-02 +73 88 -1.105916272470026e-02 +73 89 -9.403863770832835e-03 +73 90 -8.076052134892606e-03 +73 91 -6.996835383339675e-03 +73 92 -6.109381318875753e-03 +73 93 -5.371977266379809e-03 +73 94 -4.753493624956900e-03 +73 95 -4.230349322908533e-03 +74 74 3.988394278115155e+01 +74 48 -2.783725492315672e-03 +74 49 -3.071047067257394e-03 +74 50 -3.401691470521393e-03 +74 51 -3.784439171232928e-03 +74 52 -4.230349322908531e-03 +74 53 -4.753493624956896e-03 +74 54 -5.371977266379805e-03 +74 55 -6.109381318875752e-03 +74 56 -6.996835383339676e-03 +74 57 -8.076052134892597e-03 +74 58 -9.403863770832833e-03 +74 59 -1.105916272470026e-02 +74 60 -1.315380302376547e-02 +74 61 -1.585023865775526e-02 +74 62 -1.939104886145111e-02 +74 63 -2.415034675252897e-02 +74 64 -3.072751892616545e-02 +74 65 -4.012781031912998e-02 +74 66 -5.413421453123175e-02 +74 67 -7.613960933881167e-02 +74 68 -1.132183869282767e-01 +74 69 -1.820810586422651e-01 +74 70 -3.301555353436751e-01 +74 71 -7.412185823610193e-01 +74 72 -3.165206906282870e+00 +74 73 -1.502055215839543e+01 +74 75 -1.502055215844907e+01 +74 76 -3.165206906282868e+00 +74 77 -7.412185823610175e-01 +74 78 -3.301555353436752e-01 +74 79 -1.820810586422651e-01 +74 80 -1.132183869282764e-01 +74 81 -7.613960933881156e-02 +74 82 -5.413421453123172e-02 +74 83 -4.012781031912993e-02 +74 84 -3.072751892616544e-02 +74 85 -2.415034675252895e-02 +74 86 -1.939104886145111e-02 +74 87 -1.585023865775525e-02 +74 88 -1.315380302376546e-02 +74 89 -1.105916272470025e-02 +74 90 -9.403863770832833e-03 +74 91 -8.076052134892594e-03 +74 92 -6.996835383339674e-03 +74 93 -6.109381318875749e-03 +74 94 -5.371977266379808e-03 +74 95 -4.753493624956896e-03 +75 75 3.988394278128114e+01 +75 48 -2.532689975072680e-03 +75 49 -2.783725492315672e-03 +75 50 -3.071047067257392e-03 +75 51 -3.401691470521394e-03 +75 52 -3.784439171232926e-03 +75 53 -4.230349322908533e-03 +75 54 -4.753493624956895e-03 +75 55 -5.371977266379807e-03 +75 56 -6.109381318875751e-03 +75 57 -6.996835383339672e-03 +75 58 -8.076052134892601e-03 +75 59 -9.403863770832830e-03 +75 60 -1.105916272470025e-02 +75 61 -1.315380302376546e-02 +75 62 -1.585023865775526e-02 +75 63 -1.939104886145111e-02 +75 64 -2.415034675252896e-02 +75 65 -3.072751892616544e-02 +75 66 -4.012781031912996e-02 +75 67 -5.413421453123172e-02 +75 68 -7.613960933881163e-02 +75 69 -1.132183869282766e-01 +75 70 -1.820810586422649e-01 +75 71 -3.301555353436754e-01 +75 72 -7.412185823610189e-01 +75 73 -3.165206906282880e+00 +75 74 -1.502055215844907e+01 +75 76 -1.502055215852575e+01 +75 77 -3.165206906282870e+00 +75 78 -7.412185823610192e-01 +75 79 -3.301555353436776e-01 +75 80 -1.820810586422655e-01 +75 81 -1.132183869282764e-01 +75 82 -7.613960933881163e-02 +75 83 -5.413421453123172e-02 +75 84 -4.012781031912998e-02 +75 85 -3.072751892616543e-02 +75 86 -2.415034675252897e-02 +75 87 -1.939104886145111e-02 +75 88 -1.585023865775526e-02 +75 89 -1.315380302376546e-02 +75 90 -1.105916272470026e-02 +75 91 -9.403863770832830e-03 +75 92 -8.076052134892597e-03 +75 93 -6.996835383339674e-03 +75 94 -6.109381318875752e-03 +75 95 -5.371977266379806e-03 +76 76 3.988394278146372e+01 +76 48 -2.312252367280537e-03 +76 49 -2.532689975072681e-03 +76 50 -2.783725492315673e-03 +76 51 -3.071047067257394e-03 +76 52 -3.401691470521394e-03 +76 53 -3.784439171232929e-03 +76 54 -4.230349322908533e-03 +76 55 -4.753493624956898e-03 +76 56 -5.371977266379809e-03 +76 57 -6.109381318875750e-03 +76 58 -6.996835383339678e-03 +76 59 -8.076052134892601e-03 +76 60 -9.403863770832837e-03 +76 61 -1.105916272470026e-02 +76 62 -1.315380302376547e-02 +76 63 -1.585023865775526e-02 +76 64 -1.939104886145111e-02 +76 65 -2.415034675252898e-02 +76 66 -3.072751892616546e-02 +76 67 -4.012781031912998e-02 +76 68 -5.413421453123171e-02 +76 69 -7.613960933881170e-02 +76 70 -1.132183869282763e-01 +76 71 -1.820810586422648e-01 +76 72 -3.301555353436748e-01 +76 73 -7.412185823610186e-01 +76 74 -3.165206906282868e+00 +76 75 -1.502055215852575e+01 +76 77 -1.502055215863302e+01 +76 78 -3.165206906282870e+00 +76 79 -7.412185823610206e-01 +76 80 -3.301555353436782e-01 +76 81 -1.820810586422651e-01 +76 82 -1.132183869282763e-01 +76 83 -7.613960933881152e-02 +76 84 -5.413421453123171e-02 +76 85 -4.012781031912993e-02 +76 86 -3.072751892616544e-02 +76 87 -2.415034675252895e-02 +76 88 -1.939104886145111e-02 +76 89 -1.585023865775525e-02 +76 90 -1.315380302376546e-02 +76 91 -1.105916272470025e-02 +76 92 -9.403863770832830e-03 +76 93 -8.076052134892594e-03 +76 94 -6.996835383339674e-03 +76 95 -6.109381318875748e-03 +77 77 3.988394278171953e+01 +77 48 -2.117777896667793e-03 +77 49 -2.312252367280536e-03 +77 50 -2.532689975072678e-03 +77 51 -2.783725492315672e-03 +77 52 -3.071047067257391e-03 +77 53 -3.401691470521393e-03 +77 54 -3.784439171232925e-03 +77 55 -4.230349322908531e-03 +77 56 -4.753493624956895e-03 +77 57 -5.371977266379803e-03 +77 58 -6.109381318875749e-03 +77 59 -6.996835383339670e-03 +77 60 -8.076052134892597e-03 +77 61 -9.403863770832830e-03 +77 62 -1.105916272470025e-02 +77 63 -1.315380302376546e-02 +77 64 -1.585023865775526e-02 +77 65 -1.939104886145111e-02 +77 66 -2.415034675252897e-02 +77 67 -3.072751892616543e-02 +77 68 -4.012781031912993e-02 +77 69 -5.413421453123175e-02 +77 70 -7.613960933881156e-02 +77 71 -1.132183869282765e-01 +77 72 -1.820810586422648e-01 +77 73 -3.301555353436755e-01 +77 74 -7.412185823610175e-01 +77 75 -3.165206906282870e+00 +77 76 -1.502055215863302e+01 +77 78 -1.502055215878373e+01 +77 79 -3.165206906282869e+00 +77 80 -7.412185823610234e-01 +77 81 -3.301555353436764e-01 +77 82 -1.820810586422649e-01 +77 83 -1.132183869282762e-01 +77 84 -7.613960933881161e-02 +77 85 -5.413421453123172e-02 +77 86 -4.012781031912998e-02 +77 87 -3.072751892616543e-02 +77 88 -2.415034675252897e-02 +77 89 -1.939104886145111e-02 +77 90 -1.585023865775526e-02 +77 91 -1.315380302376546e-02 +77 92 -1.105916272470026e-02 +77 93 -9.403863770832832e-03 +77 94 -8.076052134892606e-03 +77 95 -6.996835383339678e-03 +78 78 3.988394278208170e+01 +78 48 -1.945462087124853e-03 +78 49 -2.117777896667794e-03 +78 50 -2.312252367280536e-03 +78 51 -2.532689975072680e-03 +78 52 -2.783725492315672e-03 +78 53 -3.071047067257394e-03 +78 54 -3.401691470521393e-03 +78 55 -3.784439171232928e-03 +78 56 -4.230349322908533e-03 +78 57 -4.753493624956895e-03 +78 58 -5.371977266379807e-03 +78 59 -6.109381318875748e-03 +78 60 -6.996835383339676e-03 +78 61 -8.076052134892597e-03 +78 62 -9.403863770832832e-03 +78 63 -1.105916272470026e-02 +78 64 -1.315380302376547e-02 +78 65 -1.585023865775526e-02 +78 66 -1.939104886145112e-02 +78 67 -2.415034675252897e-02 +78 68 -3.072751892616544e-02 +78 69 -4.012781031913001e-02 +78 70 -5.413421453123172e-02 +78 71 -7.613960933881164e-02 +78 72 -1.132183869282763e-01 +78 73 -1.820810586422650e-01 +78 74 -3.301555353436752e-01 +78 75 -7.412185823610192e-01 +78 76 -3.165206906282870e+00 +78 77 -1.502055215878373e+01 +78 79 -1.502055215899861e+01 +78 80 -3.165206906282880e+00 +78 81 -7.412185823610207e-01 +78 82 -3.301555353436760e-01 +78 83 -1.820810586422648e-01 +78 84 -1.132183869282764e-01 +78 85 -7.613960933881156e-02 +78 86 -5.413421453123171e-02 +78 87 -4.012781031912993e-02 +78 88 -3.072751892616544e-02 +78 89 -2.415034675252895e-02 +78 90 -1.939104886145111e-02 +78 91 -1.585023865775525e-02 +78 92 -1.315380302376546e-02 +78 93 -1.105916272470025e-02 +78 94 -9.403863770832833e-03 +78 95 -8.076052134892597e-03 +79 79 3.988394278260306e+01 +79 48 -1.792160480940038e-03 +79 49 -1.945462087124854e-03 +79 50 -2.117777896667793e-03 +79 51 -2.312252367280536e-03 +79 52 -2.532689975072679e-03 +79 53 -2.783725492315672e-03 +79 54 -3.071047067257392e-03 +79 55 -3.401691470521394e-03 +79 56 -3.784439171232928e-03 +79 57 -4.230349322908531e-03 +79 58 -4.753493624956896e-03 +79 59 -5.371977266379805e-03 +79 60 -6.109381318875751e-03 +79 61 -6.996835383339672e-03 +79 62 -8.076052134892597e-03 +79 63 -9.403863770832828e-03 +79 64 -1.105916272470025e-02 +79 65 -1.315380302376546e-02 +79 66 -1.585023865775526e-02 +79 67 -1.939104886145111e-02 +79 68 -2.415034675252895e-02 +79 69 -3.072751892616545e-02 +79 70 -4.012781031912993e-02 +79 71 -5.413421453123175e-02 +79 72 -7.613960933881156e-02 +79 73 -1.132183869282766e-01 +79 74 -1.820810586422651e-01 +79 75 -3.301555353436776e-01 +79 76 -7.412185823610206e-01 +79 77 -3.165206906282869e+00 +79 78 -1.502055215899861e+01 +79 80 -1.502055215931066e+01 +79 81 -3.165206906282874e+00 +79 82 -7.412185823610196e-01 +79 83 -3.301555353436755e-01 +79 84 -1.820810586422648e-01 +79 85 -1.132183869282763e-01 +79 86 -7.613960933881164e-02 +79 87 -5.413421453123172e-02 +79 88 -4.012781031912998e-02 +79 89 -3.072751892616543e-02 +79 90 -2.415034675252897e-02 +79 91 -1.939104886145111e-02 +79 92 -1.585023865775526e-02 +79 93 -1.315380302376546e-02 +79 94 -1.105916272470026e-02 +79 95 -9.403863770832830e-03 +80 80 3.988394278260306e+01 +80 64 -9.403863770832833e-03 +80 65 -1.105916272470026e-02 +80 66 -1.315380302376547e-02 +80 67 -1.585023865775526e-02 +80 68 -1.939104886145111e-02 +80 69 -2.415034675252899e-02 +80 70 -3.072751892616544e-02 +80 71 -4.012781031913001e-02 +80 72 -5.413421453123172e-02 +80 73 -7.613960933881170e-02 +80 74 -1.132183869282764e-01 +80 75 -1.820810586422655e-01 +80 76 -3.301555353436782e-01 +80 77 -7.412185823610234e-01 +80 78 -3.165206906282880e+00 +80 79 -1.502055215931066e+01 +80 81 -1.502055215899860e+01 +80 82 -3.165206906282869e+00 +80 83 -7.412185823610187e-01 +80 84 -3.301555353436753e-01 +80 85 -1.820810586422648e-01 +80 86 -1.132183869282764e-01 +80 87 -7.613960933881156e-02 +80 88 -5.413421453123171e-02 +80 89 -4.012781031912993e-02 +80 90 -3.072751892616544e-02 +80 91 -2.415034675252895e-02 +80 92 -1.939104886145111e-02 +80 93 -1.585023865775525e-02 +80 94 -1.315380302376546e-02 +80 95 -1.105916272470025e-02 +80 96 -9.403863770832827e-03 +80 97 -8.076052134892594e-03 +80 98 -6.996835383339667e-03 +80 99 -6.109381318875747e-03 +80 100 -5.371977266379804e-03 +80 101 -4.753493624956895e-03 +80 102 -4.230349322908528e-03 +80 103 -3.784439171232926e-03 +80 104 -3.401691470521392e-03 +80 105 -3.071047067257391e-03 +80 106 -2.783725492315671e-03 +80 107 -2.532689975072679e-03 +80 108 -2.312252367280536e-03 +80 109 -2.117777896667792e-03 +80 110 -1.945462087124852e-03 +80 111 -1.792160480940037e-03 +81 81 3.988394278208169e+01 +81 64 -8.076052134892597e-03 +81 65 -9.403863770832830e-03 +81 66 -1.105916272470025e-02 +81 67 -1.315380302376546e-02 +81 68 -1.585023865775525e-02 +81 69 -1.939104886145112e-02 +81 70 -2.415034675252895e-02 +81 71 -3.072751892616545e-02 +81 72 -4.012781031912993e-02 +81 73 -5.413421453123175e-02 +81 74 -7.613960933881156e-02 +81 75 -1.132183869282764e-01 +81 76 -1.820810586422651e-01 +81 77 -3.301555353436764e-01 +81 78 -7.412185823610207e-01 +81 79 -3.165206906282874e+00 +81 80 -1.502055215899860e+01 +81 82 -1.502055215878375e+01 +81 83 -3.165206906282868e+00 +81 84 -7.412185823610173e-01 +81 85 -3.301555353436761e-01 +81 86 -1.820810586422650e-01 +81 87 -1.132183869282766e-01 +81 88 -7.613960933881167e-02 +81 89 -5.413421453123172e-02 +81 90 -4.012781031912998e-02 +81 91 -3.072751892616543e-02 +81 92 -2.415034675252897e-02 +81 93 -1.939104886145111e-02 +81 94 -1.585023865775526e-02 +81 95 -1.315380302376546e-02 +81 96 -1.105916272470025e-02 +81 97 -9.403863770832828e-03 +81 98 -8.076052134892594e-03 +81 99 -6.996835383339674e-03 +81 100 -6.109381318875749e-03 +81 101 -5.371977266379808e-03 +81 102 -4.753493624956894e-03 +81 103 -4.230349322908531e-03 +81 104 -3.784439171232926e-03 +81 105 -3.401691470521392e-03 +81 106 -3.071047067257393e-03 +81 107 -2.783725492315672e-03 +81 108 -2.532689975072680e-03 +81 109 -2.312252367280535e-03 +81 110 -2.117777896667794e-03 +81 111 -1.945462087124853e-03 +82 82 3.988394278171951e+01 +82 64 -6.996835383339674e-03 +82 65 -8.076052134892597e-03 +82 66 -9.403863770832833e-03 +82 67 -1.105916272470026e-02 +82 68 -1.315380302376546e-02 +82 69 -1.585023865775527e-02 +82 70 -1.939104886145111e-02 +82 71 -2.415034675252899e-02 +82 72 -3.072751892616544e-02 +82 73 -4.012781031913001e-02 +82 74 -5.413421453123172e-02 +82 75 -7.613960933881163e-02 +82 76 -1.132183869282763e-01 +82 77 -1.820810586422649e-01 +82 78 -3.301555353436760e-01 +82 79 -7.412185823610196e-01 +82 80 -3.165206906282869e+00 +82 81 -1.502055215878375e+01 +82 83 -1.502055215863300e+01 +82 84 -3.165206906282866e+00 +82 85 -7.412185823610195e-01 +82 86 -3.301555353436753e-01 +82 87 -1.820810586422651e-01 +82 88 -1.132183869282765e-01 +82 89 -7.613960933881166e-02 +82 90 -5.413421453123171e-02 +82 91 -4.012781031912993e-02 +82 92 -3.072751892616544e-02 +82 93 -2.415034675252895e-02 +82 94 -1.939104886145111e-02 +82 95 -1.585023865775525e-02 +82 96 -1.315380302376545e-02 +82 97 -1.105916272470025e-02 +82 98 -9.403863770832827e-03 +82 99 -8.076052134892596e-03 +82 100 -6.996835383339674e-03 +82 101 -6.109381318875752e-03 +82 102 -5.371977266379804e-03 +82 103 -4.753493624956896e-03 +82 104 -4.230349322908531e-03 +82 105 -3.784439171232925e-03 +82 106 -3.401691470521393e-03 +82 107 -3.071047067257393e-03 +82 108 -2.783725492315673e-03 +82 109 -2.532689975072679e-03 +82 110 -2.312252367280536e-03 +82 111 -2.117777896667793e-03 +83 83 3.988394278146372e+01 +83 64 -6.109381318875752e-03 +83 65 -6.996835383339677e-03 +83 66 -8.076052134892599e-03 +83 67 -9.403863770832832e-03 +83 68 -1.105916272470025e-02 +83 69 -1.315380302376547e-02 +83 70 -1.585023865775525e-02 +83 71 -1.939104886145112e-02 +83 72 -2.415034675252895e-02 +83 73 -3.072751892616545e-02 +83 74 -4.012781031912993e-02 +83 75 -5.413421453123172e-02 +83 76 -7.613960933881152e-02 +83 77 -1.132183869282762e-01 +83 78 -1.820810586422648e-01 +83 79 -3.301555353436755e-01 +83 80 -7.412185823610187e-01 +83 81 -3.165206906282868e+00 +83 82 -1.502055215863300e+01 +83 84 -1.502055215852576e+01 +83 85 -3.165206906282873e+00 +83 86 -7.412185823610193e-01 +83 87 -3.301555353436760e-01 +83 88 -1.820810586422652e-01 +83 89 -1.132183869282769e-01 +83 90 -7.613960933881175e-02 +83 91 -5.413421453123172e-02 +83 92 -4.012781031912998e-02 +83 93 -3.072751892616543e-02 +83 94 -2.415034675252897e-02 +83 95 -1.939104886145111e-02 +83 96 -1.585023865775525e-02 +83 97 -1.315380302376546e-02 +83 98 -1.105916272470025e-02 +83 99 -9.403863770832828e-03 +83 100 -8.076052134892594e-03 +83 101 -6.996835383339673e-03 +83 102 -6.109381318875744e-03 +83 103 -5.371977266379805e-03 +83 104 -4.753493624956894e-03 +83 105 -4.230349322908528e-03 +83 106 -3.784439171232926e-03 +83 107 -3.401691470521392e-03 +83 108 -3.071047067257393e-03 +83 109 -2.783725492315670e-03 +83 110 -2.532689975072679e-03 +83 111 -2.312252367280535e-03 +84 84 3.988394278128114e+01 +84 64 -5.371977266379804e-03 +84 65 -6.109381318875748e-03 +84 66 -6.996835383339671e-03 +84 67 -8.076052134892596e-03 +84 68 -9.403863770832830e-03 +84 69 -1.105916272470026e-02 +84 70 -1.315380302376546e-02 +84 71 -1.585023865775527e-02 +84 72 -1.939104886145111e-02 +84 73 -2.415034675252899e-02 +84 74 -3.072751892616544e-02 +84 75 -4.012781031912998e-02 +84 76 -5.413421453123171e-02 +84 77 -7.613960933881161e-02 +84 78 -1.132183869282764e-01 +84 79 -1.820810586422648e-01 +84 80 -3.301555353436753e-01 +84 81 -7.412185823610173e-01 +84 82 -3.165206906282866e+00 +84 83 -1.502055215852576e+01 +84 85 -1.502055215844907e+01 +84 86 -3.165206906282873e+00 +84 87 -7.412185823610211e-01 +84 88 -3.301555353436765e-01 +84 89 -1.820810586422652e-01 +84 90 -1.132183869282765e-01 +84 91 -7.613960933881160e-02 +84 92 -5.413421453123171e-02 +84 93 -4.012781031912993e-02 +84 94 -3.072751892616544e-02 +84 95 -2.415034675252895e-02 +84 96 -1.939104886145109e-02 +84 97 -1.585023865775525e-02 +84 98 -1.315380302376545e-02 +84 99 -1.105916272470025e-02 +84 100 -9.403863770832830e-03 +84 101 -8.076052134892604e-03 +84 102 -6.996835383339674e-03 +84 103 -6.109381318875753e-03 +84 104 -5.371977266379808e-03 +84 105 -4.753493624956895e-03 +84 106 -4.230349322908533e-03 +84 107 -3.784439171232929e-03 +84 108 -3.401691470521395e-03 +84 109 -3.071047067257393e-03 +84 110 -2.783725492315673e-03 +84 111 -2.532689975072680e-03 +85 85 3.988394278115155e+01 +85 64 -4.753493624956896e-03 +85 65 -5.371977266379806e-03 +85 66 -6.109381318875749e-03 +85 67 -6.996835383339674e-03 +85 68 -8.076052134892597e-03 +85 69 -9.403863770832833e-03 +85 70 -1.105916272470025e-02 +85 71 -1.315380302376547e-02 +85 72 -1.585023865775525e-02 +85 73 -1.939104886145112e-02 +85 74 -2.415034675252895e-02 +85 75 -3.072751892616543e-02 +85 76 -4.012781031912993e-02 +85 77 -5.413421453123172e-02 +85 78 -7.613960933881156e-02 +85 79 -1.132183869282763e-01 +85 80 -1.820810586422648e-01 +85 81 -3.301555353436761e-01 +85 82 -7.412185823610195e-01 +85 83 -3.165206906282873e+00 +85 84 -1.502055215844907e+01 +85 86 -1.502055215839542e+01 +85 87 -3.165206906282874e+00 +85 88 -7.412185823610198e-01 +85 89 -3.301555353436758e-01 +85 90 -1.820810586422651e-01 +85 91 -1.132183869282767e-01 +85 92 -7.613960933881173e-02 +85 93 -5.413421453123172e-02 +85 94 -4.012781031912998e-02 +85 95 -3.072751892616543e-02 +85 96 -2.415034675252895e-02 +85 97 -1.939104886145111e-02 +85 98 -1.585023865775525e-02 +85 99 -1.315380302376546e-02 +85 100 -1.105916272470025e-02 +85 101 -9.403863770832835e-03 +85 102 -8.076052134892594e-03 +85 103 -6.996835383339674e-03 +85 104 -6.109381318875749e-03 +85 105 -5.371977266379804e-03 +85 106 -4.753493624956896e-03 +85 107 -4.230349322908531e-03 +85 108 -3.784439171232928e-03 +85 109 -3.401691470521393e-03 +85 110 -3.071047067257393e-03 +85 111 -2.783725492315672e-03 +86 86 3.988394278106477e+01 +86 64 -4.230349322908531e-03 +86 65 -4.753493624956896e-03 +86 66 -5.371977266379806e-03 +86 67 -6.109381318875749e-03 +86 68 -6.996835383339674e-03 +86 69 -8.076052134892599e-03 +86 70 -9.403863770832830e-03 +86 71 -1.105916272470026e-02 +86 72 -1.315380302376546e-02 +86 73 -1.585023865775527e-02 +86 74 -1.939104886145111e-02 +86 75 -2.415034675252897e-02 +86 76 -3.072751892616544e-02 +86 77 -4.012781031912998e-02 +86 78 -5.413421453123171e-02 +86 79 -7.613960933881164e-02 +86 80 -1.132183869282764e-01 +86 81 -1.820810586422650e-01 +86 82 -3.301555353436753e-01 +86 83 -7.412185823610193e-01 +86 84 -3.165206906282873e+00 +86 85 -1.502055215839542e+01 +86 87 -1.502055215836221e+01 +86 88 -3.165206906282867e+00 +86 89 -7.412185823610190e-01 +86 90 -3.301555353436761e-01 +86 91 -1.820810586422653e-01 +86 92 -1.132183869282766e-01 +86 93 -7.613960933881157e-02 +86 94 -5.413421453123171e-02 +86 95 -4.012781031912993e-02 +86 96 -3.072751892616540e-02 +86 97 -2.415034675252895e-02 +86 98 -1.939104886145109e-02 +86 99 -1.585023865775525e-02 +86 100 -1.315380302376546e-02 +86 101 -1.105916272470025e-02 +86 102 -9.403863770832828e-03 +86 103 -8.076052134892597e-03 +86 104 -6.996835383339674e-03 +86 105 -6.109381318875748e-03 +86 106 -5.371977266379806e-03 +86 107 -4.753493624956896e-03 +86 108 -4.230349322908533e-03 +86 109 -3.784439171232926e-03 +86 110 -3.401691470521393e-03 +86 111 -3.071047067257393e-03 +87 87 3.988394278102304e+01 +87 64 -3.784439171232929e-03 +87 65 -4.230349322908533e-03 +87 66 -4.753493624956898e-03 +87 67 -5.371977266379808e-03 +87 68 -6.109381318875752e-03 +87 69 -6.996835383339678e-03 +87 70 -8.076052134892601e-03 +87 71 -9.403863770832835e-03 +87 72 -1.105916272470025e-02 +87 73 -1.315380302376547e-02 +87 74 -1.585023865775525e-02 +87 75 -1.939104886145111e-02 +87 76 -2.415034675252895e-02 +87 77 -3.072751892616543e-02 +87 78 -4.012781031912993e-02 +87 79 -5.413421453123172e-02 +87 80 -7.613960933881156e-02 +87 81 -1.132183869282766e-01 +87 82 -1.820810586422651e-01 +87 83 -3.301555353436760e-01 +87 84 -7.412185823610211e-01 +87 85 -3.165206906282874e+00 +87 86 -1.502055215836221e+01 +87 88 -1.502055215835490e+01 +87 89 -3.165206906282866e+00 +87 90 -7.412185823610178e-01 +87 91 -3.301555353436763e-01 +87 92 -1.820810586422651e-01 +87 93 -1.132183869282765e-01 +87 94 -7.613960933881170e-02 +87 95 -5.413421453123171e-02 +87 96 -4.012781031912993e-02 +87 97 -3.072751892616543e-02 +87 98 -2.415034675252895e-02 +87 99 -1.939104886145111e-02 +87 100 -1.585023865775526e-02 +87 101 -1.315380302376547e-02 +87 102 -1.105916272470025e-02 +87 103 -9.403863770832832e-03 +87 104 -8.076052134892594e-03 +87 105 -6.996835383339667e-03 +87 106 -6.109381318875747e-03 +87 107 -5.371977266379804e-03 +87 108 -4.753493624956895e-03 +87 109 -4.230349322908528e-03 +87 110 -3.784439171232926e-03 +87 111 -3.401691470521392e-03 +88 88 3.988394278105614e+01 +88 64 -3.401691470521394e-03 +88 65 -3.784439171232928e-03 +88 66 -4.230349322908531e-03 +88 67 -4.753493624956896e-03 +88 68 -5.371977266379806e-03 +88 69 -6.109381318875751e-03 +88 70 -6.996835383339676e-03 +88 71 -8.076052134892601e-03 +88 72 -9.403863770832830e-03 +88 73 -1.105916272470026e-02 +88 74 -1.315380302376546e-02 +88 75 -1.585023865775526e-02 +88 76 -1.939104886145111e-02 +88 77 -2.415034675252897e-02 +88 78 -3.072751892616544e-02 +88 79 -4.012781031912998e-02 +88 80 -5.413421453123171e-02 +88 81 -7.613960933881167e-02 +88 82 -1.132183869282765e-01 +88 83 -1.820810586422652e-01 +88 84 -3.301555353436765e-01 +88 85 -7.412185823610198e-01 +88 86 -3.165206906282867e+00 +88 87 -1.502055215835490e+01 +88 89 -1.502055215840048e+01 +88 90 -3.165206906282871e+00 +88 91 -7.412185823610209e-01 +88 92 -3.301555353436756e-01 +88 93 -1.820810586422652e-01 +88 94 -1.132183869282766e-01 +88 95 -7.613960933881159e-02 +88 96 -5.413421453123164e-02 +88 97 -4.012781031912993e-02 +88 98 -3.072751892616540e-02 +88 99 -2.415034675252895e-02 +88 100 -1.939104886145110e-02 +88 101 -1.585023865775526e-02 +88 102 -1.315380302376546e-02 +88 103 -1.105916272470025e-02 +88 104 -9.403863770832827e-03 +88 105 -8.076052134892596e-03 +88 106 -6.996835383339674e-03 +88 107 -6.109381318875749e-03 +88 108 -5.371977266379808e-03 +88 109 -4.753493624956894e-03 +88 110 -4.230349322908531e-03 +88 111 -3.784439171232926e-03 +89 89 3.988394278128565e+01 +89 64 -3.071047067257393e-03 +89 65 -3.401691470521393e-03 +89 66 -3.784439171232927e-03 +89 67 -4.230349322908531e-03 +89 68 -4.753493624956896e-03 +89 69 -5.371977266379806e-03 +89 70 -6.109381318875749e-03 +89 71 -6.996835383339674e-03 +89 72 -8.076052134892597e-03 +89 73 -9.403863770832835e-03 +89 74 -1.105916272470025e-02 +89 75 -1.315380302376546e-02 +89 76 -1.585023865775525e-02 +89 77 -1.939104886145111e-02 +89 78 -2.415034675252895e-02 +89 79 -3.072751892616543e-02 +89 80 -4.012781031912993e-02 +89 81 -5.413421453123172e-02 +89 82 -7.613960933881166e-02 +89 83 -1.132183869282769e-01 +89 84 -1.820810586422652e-01 +89 85 -3.301555353436758e-01 +89 86 -7.412185823610190e-01 +89 87 -3.165206906282866e+00 +89 88 -1.502055215840048e+01 +89 90 -1.502055215860532e+01 +89 91 -3.165206906282875e+00 +89 92 -7.412185823610200e-01 +89 93 -3.301555353436761e-01 +89 94 -1.820810586422648e-01 +89 95 -1.132183869282763e-01 +89 96 -7.613960933881149e-02 +89 97 -5.413421453123170e-02 +89 98 -4.012781031912993e-02 +89 99 -3.072751892616543e-02 +89 100 -2.415034675252896e-02 +89 101 -1.939104886145112e-02 +89 102 -1.585023865775526e-02 +89 103 -1.315380302376547e-02 +89 104 -1.105916272470025e-02 +89 105 -9.403863770832832e-03 +89 106 -8.076052134892596e-03 +89 107 -6.996835383339674e-03 +89 108 -6.109381318875752e-03 +89 109 -5.371977266379804e-03 +89 110 -4.753493624956896e-03 +89 111 -4.230349322908531e-03 +90 90 3.988394278152497e+01 +90 64 -2.783725492315673e-03 +90 65 -3.071047067257394e-03 +90 66 -3.401691470521395e-03 +90 67 -3.784439171232928e-03 +90 68 -4.230349322908533e-03 +90 69 -4.753493624956898e-03 +90 70 -5.371977266379808e-03 +90 71 -6.109381318875752e-03 +90 72 -6.996835383339678e-03 +90 73 -8.076052134892606e-03 +90 74 -9.403863770832833e-03 +90 75 -1.105916272470026e-02 +90 76 -1.315380302376546e-02 +90 77 -1.585023865775526e-02 +90 78 -1.939104886145111e-02 +90 79 -2.415034675252897e-02 +90 80 -3.072751892616544e-02 +90 81 -4.012781031912998e-02 +90 82 -5.413421453123171e-02 +90 83 -7.613960933881175e-02 +90 84 -1.132183869282765e-01 +90 85 -1.820810586422651e-01 +90 86 -3.301555353436761e-01 +90 87 -7.412185823610178e-01 +90 88 -3.165206906282871e+00 +90 89 -1.502055215860532e+01 +90 91 -1.502055215859223e+01 +90 92 -3.165206906282872e+00 +90 93 -7.412185823610207e-01 +90 94 -3.301555353436759e-01 +90 95 -1.820810586422648e-01 +90 96 -1.132183869282761e-01 +90 97 -7.613960933881150e-02 +90 98 -5.413421453123164e-02 +90 99 -4.012781031912993e-02 +90 100 -3.072751892616542e-02 +90 101 -2.415034675252897e-02 +90 102 -1.939104886145110e-02 +90 103 -1.585023865775526e-02 +90 104 -1.315380302376546e-02 +90 105 -1.105916272470025e-02 +90 106 -9.403863770832828e-03 +90 107 -8.076052134892596e-03 +90 108 -6.996835383339673e-03 +90 109 -6.109381318875744e-03 +90 110 -5.371977266379805e-03 +90 111 -4.753493624956894e-03 +91 91 3.988394278151357e+01 +91 64 -2.532689975072679e-03 +91 65 -2.783725492315671e-03 +91 66 -3.071047067257392e-03 +91 67 -3.401691470521393e-03 +91 68 -3.784439171232926e-03 +91 69 -4.230349322908529e-03 +91 70 -4.753493624956894e-03 +91 71 -5.371977266379804e-03 +91 72 -6.109381318875748e-03 +91 73 -6.996835383339675e-03 +91 74 -8.076052134892594e-03 +91 75 -9.403863770832830e-03 +91 76 -1.105916272470025e-02 +91 77 -1.315380302376546e-02 +91 78 -1.585023865775525e-02 +91 79 -1.939104886145111e-02 +91 80 -2.415034675252895e-02 +91 81 -3.072751892616543e-02 +91 82 -4.012781031912993e-02 +91 83 -5.413421453123172e-02 +91 84 -7.613960933881160e-02 +91 85 -1.132183869282767e-01 +91 86 -1.820810586422653e-01 +91 87 -3.301555353436763e-01 +91 88 -7.412185823610209e-01 +91 89 -3.165206906282875e+00 +91 90 -1.502055215859223e+01 +91 92 -1.502055215859652e+01 +91 93 -3.165206906282871e+00 +91 94 -7.412185823610195e-01 +91 95 -3.301555353436750e-01 +91 96 -1.820810586422644e-01 +91 97 -1.132183869282760e-01 +91 98 -7.613960933881145e-02 +91 99 -5.413421453123170e-02 +91 100 -4.012781031912996e-02 +91 101 -3.072751892616545e-02 +91 102 -2.415034675252896e-02 +91 103 -1.939104886145112e-02 +91 104 -1.585023865775526e-02 +91 105 -1.315380302376547e-02 +91 106 -1.105916272470025e-02 +91 107 -9.403863770832835e-03 +91 108 -8.076052134892603e-03 +91 109 -6.996835383339674e-03 +91 110 -6.109381318875753e-03 +91 111 -5.371977266379808e-03 +92 92 3.988394278151443e+01 +92 64 -2.312252367280536e-03 +92 65 -2.532689975072680e-03 +92 66 -2.783725492315672e-03 +92 67 -3.071047067257393e-03 +92 68 -3.401691470521393e-03 +92 69 -3.784439171232927e-03 +92 70 -4.230349322908531e-03 +92 71 -4.753493624956896e-03 +92 72 -5.371977266379806e-03 +92 73 -6.109381318875753e-03 +92 74 -6.996835383339674e-03 +92 75 -8.076052134892597e-03 +92 76 -9.403863770832830e-03 +92 77 -1.105916272470026e-02 +92 78 -1.315380302376546e-02 +92 79 -1.585023865775526e-02 +92 80 -1.939104886145111e-02 +92 81 -2.415034675252897e-02 +92 82 -3.072751892616544e-02 +92 83 -4.012781031912998e-02 +92 84 -5.413421453123171e-02 +92 85 -7.613960933881173e-02 +92 86 -1.132183869282766e-01 +92 87 -1.820810586422651e-01 +92 88 -3.301555353436756e-01 +92 89 -7.412185823610200e-01 +92 90 -3.165206906282872e+00 +92 91 -1.502055215859652e+01 +92 93 -1.502055215858803e+01 +92 94 -3.165206906282874e+00 +92 95 -7.412185823610195e-01 +92 96 -3.301555353436761e-01 +92 97 -1.820810586422644e-01 +92 98 -1.132183869282759e-01 +92 99 -7.613960933881148e-02 +92 100 -5.413421453123168e-02 +92 101 -4.012781031912996e-02 +92 102 -3.072751892616542e-02 +92 103 -2.415034675252897e-02 +92 104 -1.939104886145110e-02 +92 105 -1.585023865775526e-02 +92 106 -1.315380302376546e-02 +92 107 -1.105916272470025e-02 +92 108 -9.403863770832830e-03 +92 109 -8.076052134892596e-03 +92 110 -6.996835383339674e-03 +92 111 -6.109381318875749e-03 +93 93 3.988394278153933e+01 +93 64 -2.117777896667794e-03 +93 65 -2.312252367280536e-03 +93 66 -2.532689975072680e-03 +93 67 -2.783725492315672e-03 +93 68 -3.071047067257393e-03 +93 69 -3.401691470521393e-03 +93 70 -3.784439171232927e-03 +93 71 -4.230349322908531e-03 +93 72 -4.753493624956896e-03 +93 73 -5.371977266379809e-03 +93 74 -6.109381318875749e-03 +93 75 -6.996835383339674e-03 +93 76 -8.076052134892594e-03 +93 77 -9.403863770832832e-03 +93 78 -1.105916272470025e-02 +93 79 -1.315380302376546e-02 +93 80 -1.585023865775525e-02 +93 81 -1.939104886145111e-02 +93 82 -2.415034675252895e-02 +93 83 -3.072751892616543e-02 +93 84 -4.012781031912993e-02 +93 85 -5.413421453123172e-02 +93 86 -7.613960933881157e-02 +93 87 -1.132183869282765e-01 +93 88 -1.820810586422652e-01 +93 89 -3.301555353436761e-01 +93 90 -7.412185823610207e-01 +93 91 -3.165206906282871e+00 +93 92 -1.502055215858803e+01 +93 94 -1.502055215864002e+01 +93 95 -3.165206906282866e+00 +93 96 -7.412185823610180e-01 +93 97 -3.301555353436754e-01 +93 98 -1.820810586422643e-01 +93 99 -1.132183869282761e-01 +93 100 -7.613960933881150e-02 +93 101 -5.413421453123175e-02 +93 102 -4.012781031912996e-02 +93 103 -3.072751892616545e-02 +93 104 -2.415034675252896e-02 +93 105 -1.939104886145112e-02 +93 106 -1.585023865775526e-02 +93 107 -1.315380302376547e-02 +93 108 -1.105916272470025e-02 +93 109 -9.403863770832832e-03 +93 110 -8.076052134892596e-03 +93 111 -6.996835383339674e-03 +94 94 3.988394278164019e+01 +94 64 -1.945462087124854e-03 +94 65 -2.117777896667794e-03 +94 66 -2.312252367280537e-03 +94 67 -2.532689975072680e-03 +94 68 -2.783725492315673e-03 +94 69 -3.071047067257394e-03 +94 70 -3.401691470521395e-03 +94 71 -3.784439171232929e-03 +94 72 -4.230349322908534e-03 +94 73 -4.753493624956900e-03 +94 74 -5.371977266379808e-03 +94 75 -6.109381318875752e-03 +94 76 -6.996835383339674e-03 +94 77 -8.076052134892606e-03 +94 78 -9.403863770832833e-03 +94 79 -1.105916272470026e-02 +94 80 -1.315380302376546e-02 +94 81 -1.585023865775526e-02 +94 82 -1.939104886145111e-02 +94 83 -2.415034675252897e-02 +94 84 -3.072751892616544e-02 +94 85 -4.012781031912998e-02 +94 86 -5.413421453123171e-02 +94 87 -7.613960933881170e-02 +94 88 -1.132183869282766e-01 +94 89 -1.820810586422648e-01 +94 90 -3.301555353436759e-01 +94 91 -7.412185823610195e-01 +94 92 -3.165206906282874e+00 +94 93 -1.502055215864002e+01 +94 95 -1.502055215866000e+01 +94 96 -3.165206906282865e+00 +94 97 -7.412185823610202e-01 +94 98 -3.301555353436758e-01 +94 99 -1.820810586422645e-01 +94 100 -1.132183869282759e-01 +94 101 -7.613960933881149e-02 +94 102 -5.413421453123168e-02 +94 103 -4.012781031912996e-02 +94 104 -3.072751892616542e-02 +94 105 -2.415034675252897e-02 +94 106 -1.939104886145110e-02 +94 107 -1.585023865775526e-02 +94 108 -1.315380302376546e-02 +94 109 -1.105916272470025e-02 +94 110 -9.403863770832828e-03 +94 111 -8.076052134892594e-03 +95 95 3.988394278169704e+01 +95 64 -1.792160480940038e-03 +95 65 -1.945462087124853e-03 +95 66 -2.117777896667794e-03 +95 67 -2.312252367280536e-03 +95 68 -2.532689975072680e-03 +95 69 -2.783725492315672e-03 +95 70 -3.071047067257393e-03 +95 71 -3.401691470521394e-03 +95 72 -3.784439171232928e-03 +95 73 -4.230349322908533e-03 +95 74 -4.753493624956896e-03 +95 75 -5.371977266379806e-03 +95 76 -6.109381318875748e-03 +95 77 -6.996835383339678e-03 +95 78 -8.076052134892597e-03 +95 79 -9.403863770832830e-03 +95 80 -1.105916272470025e-02 +95 81 -1.315380302376546e-02 +95 82 -1.585023865775525e-02 +95 83 -1.939104886145111e-02 +95 84 -2.415034675252895e-02 +95 85 -3.072751892616543e-02 +95 86 -4.012781031912993e-02 +95 87 -5.413421453123171e-02 +95 88 -7.613960933881159e-02 +95 89 -1.132183869282763e-01 +95 90 -1.820810586422648e-01 +95 91 -3.301555353436750e-01 +95 92 -7.412185823610195e-01 +95 93 -3.165206906282866e+00 +95 94 -1.502055215866000e+01 +95 96 -1.502055215931066e+01 +95 97 -3.165206906282876e+00 +95 98 -7.412185823610211e-01 +95 99 -3.301555353436764e-01 +95 100 -1.820810586422644e-01 +95 101 -1.132183869282763e-01 +95 102 -7.613960933881160e-02 +95 103 -5.413421453123175e-02 +95 104 -4.012781031912996e-02 +95 105 -3.072751892616546e-02 +95 106 -2.415034675252897e-02 +95 107 -1.939104886145112e-02 +95 108 -1.585023865775526e-02 +95 109 -1.315380302376547e-02 +95 110 -1.105916272470025e-02 +95 111 -9.403863770832832e-03 +96 96 3.988394278169706e+01 +96 80 -9.403863770832827e-03 +96 81 -1.105916272470025e-02 +96 82 -1.315380302376545e-02 +96 83 -1.585023865775525e-02 +96 84 -1.939104886145109e-02 +96 85 -2.415034675252895e-02 +96 86 -3.072751892616540e-02 +96 87 -4.012781031912993e-02 +96 88 -5.413421453123164e-02 +96 89 -7.613960933881149e-02 +96 90 -1.132183869282761e-01 +96 91 -1.820810586422644e-01 +96 92 -3.301555353436761e-01 +96 93 -7.412185823610180e-01 +96 94 -3.165206906282865e+00 +96 95 -1.502055215931066e+01 +96 97 -1.502055215866002e+01 +96 98 -3.165206906282871e+00 +96 99 -7.412185823610199e-01 +96 100 -3.301555353436755e-01 +96 101 -1.820810586422650e-01 +96 102 -1.132183869282764e-01 +96 103 -7.613960933881166e-02 +96 104 -5.413421453123176e-02 +96 105 -4.012781031913001e-02 +96 106 -3.072751892616546e-02 +96 107 -2.415034675252899e-02 +96 108 -1.939104886145112e-02 +96 109 -1.585023865775527e-02 +96 110 -1.315380302376547e-02 +96 111 -1.105916272470026e-02 +96 112 -9.403863770832833e-03 +96 113 -8.076052134892599e-03 +96 114 -6.996835383339674e-03 +96 115 -6.109381318875752e-03 +96 116 -5.371977266379804e-03 +96 117 -4.753493624956896e-03 +96 118 -4.230349322908531e-03 +96 119 -3.784439171232929e-03 +96 120 -3.401691470521394e-03 +96 121 -3.071047067257393e-03 +96 122 -2.783725492315673e-03 +96 123 -2.532689975072679e-03 +96 124 -2.312252367280536e-03 +96 125 -2.117777896667794e-03 +96 126 -1.945462087124854e-03 +96 127 -1.792160480940038e-03 +97 97 3.988394278164021e+01 +97 80 -8.076052134892594e-03 +97 81 -9.403863770832828e-03 +97 82 -1.105916272470025e-02 +97 83 -1.315380302376546e-02 +97 84 -1.585023865775525e-02 +97 85 -1.939104886145111e-02 +97 86 -2.415034675252895e-02 +97 87 -3.072751892616543e-02 +97 88 -4.012781031912993e-02 +97 89 -5.413421453123170e-02 +97 90 -7.613960933881150e-02 +97 91 -1.132183869282760e-01 +97 92 -1.820810586422644e-01 +97 93 -3.301555353436754e-01 +97 94 -7.412185823610202e-01 +97 95 -3.165206906282876e+00 +97 96 -1.502055215866002e+01 +97 98 -1.502055215864001e+01 +97 99 -3.165206906282867e+00 +97 100 -7.412185823610196e-01 +97 101 -3.301555353436767e-01 +97 102 -1.820810586422651e-01 +97 103 -1.132183869282764e-01 +97 104 -7.613960933881163e-02 +97 105 -5.413421453123175e-02 +97 106 -4.012781031912996e-02 +97 107 -3.072751892616546e-02 +97 108 -2.415034675252897e-02 +97 109 -1.939104886145112e-02 +97 110 -1.585023865775526e-02 +97 111 -1.315380302376547e-02 +97 112 -1.105916272470025e-02 +97 113 -9.403863770832833e-03 +97 114 -8.076052134892597e-03 +97 115 -6.996835383339678e-03 +97 116 -6.109381318875748e-03 +97 117 -5.371977266379806e-03 +97 118 -4.753493624956896e-03 +97 119 -4.230349322908534e-03 +97 120 -3.784439171232928e-03 +97 121 -3.401691470521394e-03 +97 122 -3.071047067257394e-03 +97 123 -2.783725492315671e-03 +97 124 -2.532689975072680e-03 +97 125 -2.312252367280536e-03 +97 126 -2.117777896667794e-03 +97 127 -1.945462087124853e-03 +98 98 3.988394278153934e+01 +98 80 -6.996835383339667e-03 +98 81 -8.076052134892594e-03 +98 82 -9.403863770832827e-03 +98 83 -1.105916272470025e-02 +98 84 -1.315380302376545e-02 +98 85 -1.585023865775525e-02 +98 86 -1.939104886145109e-02 +98 87 -2.415034675252895e-02 +98 88 -3.072751892616540e-02 +98 89 -4.012781031912993e-02 +98 90 -5.413421453123164e-02 +98 91 -7.613960933881145e-02 +98 92 -1.132183869282759e-01 +98 93 -1.820810586422643e-01 +98 94 -3.301555353436758e-01 +98 95 -7.412185823610211e-01 +98 96 -3.165206906282871e+00 +98 97 -1.502055215864001e+01 +98 99 -1.502055215858804e+01 +98 100 -3.165206906282874e+00 +98 101 -7.412185823610213e-01 +98 102 -3.301555353436766e-01 +98 103 -1.820810586422650e-01 +98 104 -1.132183869282765e-01 +98 105 -7.613960933881166e-02 +98 106 -5.413421453123176e-02 +98 107 -4.012781031913001e-02 +98 108 -3.072751892616546e-02 +98 109 -2.415034675252899e-02 +98 110 -1.939104886145112e-02 +98 111 -1.585023865775527e-02 +98 112 -1.315380302376547e-02 +98 113 -1.105916272470026e-02 +98 114 -9.403863770832835e-03 +98 115 -8.076052134892606e-03 +98 116 -6.996835383339675e-03 +98 117 -6.109381318875753e-03 +98 118 -5.371977266379809e-03 +98 119 -4.753493624956900e-03 +98 120 -4.230349322908533e-03 +98 121 -3.784439171232929e-03 +98 122 -3.401691470521395e-03 +98 123 -3.071047067257393e-03 +98 124 -2.783725492315673e-03 +98 125 -2.532689975072680e-03 +98 126 -2.312252367280537e-03 +98 127 -2.117777896667795e-03 +99 99 3.988394278151444e+01 +99 80 -6.109381318875747e-03 +99 81 -6.996835383339674e-03 +99 82 -8.076052134892596e-03 +99 83 -9.403863770832828e-03 +99 84 -1.105916272470025e-02 +99 85 -1.315380302376546e-02 +99 86 -1.585023865775525e-02 +99 87 -1.939104886145111e-02 +99 88 -2.415034675252895e-02 +99 89 -3.072751892616543e-02 +99 90 -4.012781031912993e-02 +99 91 -5.413421453123170e-02 +99 92 -7.613960933881148e-02 +99 93 -1.132183869282761e-01 +99 94 -1.820810586422645e-01 +99 95 -3.301555353436764e-01 +99 96 -7.412185823610199e-01 +99 97 -3.165206906282867e+00 +99 98 -1.502055215858804e+01 +99 100 -1.502055215859654e+01 +99 101 -3.165206906282871e+00 +99 102 -7.412185823610203e-01 +99 103 -3.301555353436756e-01 +99 104 -1.820810586422651e-01 +99 105 -1.132183869282763e-01 +99 106 -7.613960933881167e-02 +99 107 -5.413421453123175e-02 +99 108 -4.012781031912996e-02 +99 109 -3.072751892616546e-02 +99 110 -2.415034675252897e-02 +99 111 -1.939104886145112e-02 +99 112 -1.585023865775526e-02 +99 113 -1.315380302376547e-02 +99 114 -1.105916272470025e-02 +99 115 -9.403863770832835e-03 +99 116 -8.076052134892594e-03 +99 117 -6.996835383339674e-03 +99 118 -6.109381318875749e-03 +99 119 -5.371977266379808e-03 +99 120 -4.753493624956896e-03 +99 121 -4.230349322908531e-03 +99 122 -3.784439171232928e-03 +99 123 -3.401691470521393e-03 +99 124 -3.071047067257393e-03 +99 125 -2.783725492315672e-03 +99 126 -2.532689975072680e-03 +99 127 -2.312252367280536e-03 +100 100 3.988394278151358e+01 +100 80 -5.371977266379804e-03 +100 81 -6.109381318875749e-03 +100 82 -6.996835383339674e-03 +100 83 -8.076052134892594e-03 +100 84 -9.403863770832830e-03 +100 85 -1.105916272470025e-02 +100 86 -1.315380302376546e-02 +100 87 -1.585023865775526e-02 +100 88 -1.939104886145110e-02 +100 89 -2.415034675252896e-02 +100 90 -3.072751892616542e-02 +100 91 -4.012781031912996e-02 +100 92 -5.413421453123168e-02 +100 93 -7.613960933881150e-02 +100 94 -1.132183869282759e-01 +100 95 -1.820810586422644e-01 +100 96 -3.301555353436755e-01 +100 97 -7.412185823610196e-01 +100 98 -3.165206906282874e+00 +100 99 -1.502055215859654e+01 +100 101 -1.502055215859222e+01 +100 102 -3.165206906282871e+00 +100 103 -7.412185823610201e-01 +100 104 -3.301555353436773e-01 +100 105 -1.820810586422650e-01 +100 106 -1.132183869282767e-01 +100 107 -7.613960933881173e-02 +100 108 -5.413421453123172e-02 +100 109 -4.012781031912998e-02 +100 110 -3.072751892616543e-02 +100 111 -2.415034675252897e-02 +100 112 -1.939104886145111e-02 +100 113 -1.585023865775526e-02 +100 114 -1.315380302376546e-02 +100 115 -1.105916272470026e-02 +100 116 -9.403863770832830e-03 +100 117 -8.076052134892597e-03 +100 118 -6.996835383339674e-03 +100 119 -6.109381318875752e-03 +100 120 -5.371977266379806e-03 +100 121 -4.753493624956896e-03 +100 122 -4.230349322908533e-03 +100 123 -3.784439171232926e-03 +100 124 -3.401691470521393e-03 +100 125 -3.071047067257393e-03 +100 126 -2.783725492315673e-03 +100 127 -2.532689975072680e-03 +101 101 3.988394278152497e+01 +101 80 -4.753493624956895e-03 +101 81 -5.371977266379808e-03 +101 82 -6.109381318875752e-03 +101 83 -6.996835383339673e-03 +101 84 -8.076052134892604e-03 +101 85 -9.403863770832835e-03 +101 86 -1.105916272470025e-02 +101 87 -1.315380302376547e-02 +101 88 -1.585023865775526e-02 +101 89 -1.939104886145112e-02 +101 90 -2.415034675252897e-02 +101 91 -3.072751892616545e-02 +101 92 -4.012781031912996e-02 +101 93 -5.413421453123175e-02 +101 94 -7.613960933881149e-02 +101 95 -1.132183869282763e-01 +101 96 -1.820810586422650e-01 +101 97 -3.301555353436767e-01 +101 98 -7.412185823610213e-01 +101 99 -3.165206906282871e+00 +101 100 -1.502055215859222e+01 +101 102 -1.502055215860531e+01 +101 103 -3.165206906282872e+00 +101 104 -7.412185823610212e-01 +101 105 -3.301555353436751e-01 +101 106 -1.820810586422650e-01 +101 107 -1.132183869282766e-01 +101 108 -7.613960933881160e-02 +101 109 -5.413421453123171e-02 +101 110 -4.012781031912993e-02 +101 111 -3.072751892616544e-02 +101 112 -2.415034675252895e-02 +101 113 -1.939104886145111e-02 +101 114 -1.585023865775525e-02 +101 115 -1.315380302376546e-02 +101 116 -1.105916272470025e-02 +101 117 -9.403863770832830e-03 +101 118 -8.076052134892594e-03 +101 119 -6.996835383339674e-03 +101 120 -6.109381318875748e-03 +101 121 -5.371977266379805e-03 +101 122 -4.753493624956895e-03 +101 123 -4.230349322908528e-03 +101 124 -3.784439171232926e-03 +101 125 -3.401691470521392e-03 +101 126 -3.071047067257393e-03 +101 127 -2.783725492315671e-03 +102 102 3.988394278128565e+01 +102 80 -4.230349322908528e-03 +102 81 -4.753493624956894e-03 +102 82 -5.371977266379804e-03 +102 83 -6.109381318875744e-03 +102 84 -6.996835383339674e-03 +102 85 -8.076052134892594e-03 +102 86 -9.403863770832828e-03 +102 87 -1.105916272470025e-02 +102 88 -1.315380302376546e-02 +102 89 -1.585023865775526e-02 +102 90 -1.939104886145110e-02 +102 91 -2.415034675252896e-02 +102 92 -3.072751892616542e-02 +102 93 -4.012781031912996e-02 +102 94 -5.413421453123168e-02 +102 95 -7.613960933881160e-02 +102 96 -1.132183869282764e-01 +102 97 -1.820810586422651e-01 +102 98 -3.301555353436766e-01 +102 99 -7.412185823610203e-01 +102 100 -3.165206906282871e+00 +102 101 -1.502055215860531e+01 +102 103 -1.502055215840048e+01 +102 104 -3.165206906282873e+00 +102 105 -7.412185823610180e-01 +102 106 -3.301555353436756e-01 +102 107 -1.820810586422651e-01 +102 108 -1.132183869282766e-01 +102 109 -7.613960933881170e-02 +102 110 -5.413421453123172e-02 +102 111 -4.012781031912998e-02 +102 112 -3.072751892616543e-02 +102 113 -2.415034675252897e-02 +102 114 -1.939104886145111e-02 +102 115 -1.585023865775526e-02 +102 116 -1.315380302376546e-02 +102 117 -1.105916272470026e-02 +102 118 -9.403863770832832e-03 +102 119 -8.076052134892606e-03 +102 120 -6.996835383339678e-03 +102 121 -6.109381318875753e-03 +102 122 -5.371977266379810e-03 +102 123 -4.753493624956895e-03 +102 124 -4.230349322908533e-03 +102 125 -3.784439171232929e-03 +102 126 -3.401691470521395e-03 +102 127 -3.071047067257394e-03 +103 103 3.988394278105615e+01 +103 80 -3.784439171232926e-03 +103 81 -4.230349322908531e-03 +103 82 -4.753493624956896e-03 +103 83 -5.371977266379805e-03 +103 84 -6.109381318875753e-03 +103 85 -6.996835383339674e-03 +103 86 -8.076052134892597e-03 +103 87 -9.403863770832832e-03 +103 88 -1.105916272470025e-02 +103 89 -1.315380302376547e-02 +103 90 -1.585023865775526e-02 +103 91 -1.939104886145112e-02 +103 92 -2.415034675252897e-02 +103 93 -3.072751892616545e-02 +103 94 -4.012781031912996e-02 +103 95 -5.413421453123175e-02 +103 96 -7.613960933881166e-02 +103 97 -1.132183869282764e-01 +103 98 -1.820810586422650e-01 +103 99 -3.301555353436756e-01 +103 100 -7.412185823610201e-01 +103 101 -3.165206906282872e+00 +103 102 -1.502055215840048e+01 +103 104 -1.502055215835490e+01 +103 105 -3.165206906282867e+00 +103 106 -7.412185823610182e-01 +103 107 -3.301555353436758e-01 +103 108 -1.820810586422650e-01 +103 109 -1.132183869282766e-01 +103 110 -7.613960933881159e-02 +103 111 -5.413421453123171e-02 +103 112 -4.012781031912993e-02 +103 113 -3.072751892616544e-02 +103 114 -2.415034675252895e-02 +103 115 -1.939104886145111e-02 +103 116 -1.585023865775525e-02 +103 117 -1.315380302376546e-02 +103 118 -1.105916272470025e-02 +103 119 -9.403863770832833e-03 +103 120 -8.076052134892597e-03 +103 121 -6.996835383339674e-03 +103 122 -6.109381318875752e-03 +103 123 -5.371977266379804e-03 +103 124 -4.753493624956896e-03 +103 125 -4.230349322908531e-03 +103 126 -3.784439171232929e-03 +103 127 -3.401691470521394e-03 +104 104 3.988394278102304e+01 +104 80 -3.401691470521392e-03 +104 81 -3.784439171232926e-03 +104 82 -4.230349322908531e-03 +104 83 -4.753493624956894e-03 +104 84 -5.371977266379808e-03 +104 85 -6.109381318875749e-03 +104 86 -6.996835383339674e-03 +104 87 -8.076052134892594e-03 +104 88 -9.403863770832827e-03 +104 89 -1.105916272470025e-02 +104 90 -1.315380302376546e-02 +104 91 -1.585023865775526e-02 +104 92 -1.939104886145110e-02 +104 93 -2.415034675252896e-02 +104 94 -3.072751892616542e-02 +104 95 -4.012781031912996e-02 +104 96 -5.413421453123176e-02 +104 97 -7.613960933881163e-02 +104 98 -1.132183869282765e-01 +104 99 -1.820810586422651e-01 +104 100 -3.301555353436773e-01 +104 101 -7.412185823610212e-01 +104 102 -3.165206906282873e+00 +104 103 -1.502055215835490e+01 +104 105 -1.502055215836221e+01 +104 106 -3.165206906282866e+00 +104 107 -7.412185823610177e-01 +104 108 -3.301555353436748e-01 +104 109 -1.820810586422651e-01 +104 110 -1.132183869282765e-01 +104 111 -7.613960933881170e-02 +104 112 -5.413421453123172e-02 +104 113 -4.012781031912998e-02 +104 114 -3.072751892616543e-02 +104 115 -2.415034675252897e-02 +104 116 -1.939104886145111e-02 +104 117 -1.585023865775526e-02 +104 118 -1.315380302376546e-02 +104 119 -1.105916272470026e-02 +104 120 -9.403863770832830e-03 +104 121 -8.076052134892597e-03 +104 122 -6.996835383339678e-03 +104 123 -6.109381318875748e-03 +104 124 -5.371977266379806e-03 +104 125 -4.753493624956896e-03 +104 126 -4.230349322908534e-03 +104 127 -3.784439171232928e-03 +105 105 3.988394278106477e+01 +105 80 -3.071047067257391e-03 +105 81 -3.401691470521392e-03 +105 82 -3.784439171232925e-03 +105 83 -4.230349322908528e-03 +105 84 -4.753493624956895e-03 +105 85 -5.371977266379804e-03 +105 86 -6.109381318875748e-03 +105 87 -6.996835383339667e-03 +105 88 -8.076052134892596e-03 +105 89 -9.403863770832832e-03 +105 90 -1.105916272470025e-02 +105 91 -1.315380302376547e-02 +105 92 -1.585023865775526e-02 +105 93 -1.939104886145112e-02 +105 94 -2.415034675252897e-02 +105 95 -3.072751892616546e-02 +105 96 -4.012781031913001e-02 +105 97 -5.413421453123175e-02 +105 98 -7.613960933881166e-02 +105 99 -1.132183869282763e-01 +105 100 -1.820810586422650e-01 +105 101 -3.301555353436751e-01 +105 102 -7.412185823610180e-01 +105 103 -3.165206906282867e+00 +105 104 -1.502055215836221e+01 +105 106 -1.502055215839542e+01 +105 107 -3.165206906282873e+00 +105 108 -7.412185823610203e-01 +105 109 -3.301555353436768e-01 +105 110 -1.820810586422652e-01 +105 111 -1.132183869282766e-01 +105 112 -7.613960933881159e-02 +105 113 -5.413421453123171e-02 +105 114 -4.012781031912993e-02 +105 115 -3.072751892616544e-02 +105 116 -2.415034675252895e-02 +105 117 -1.939104886145111e-02 +105 118 -1.585023865775525e-02 +105 119 -1.315380302376546e-02 +105 120 -1.105916272470025e-02 +105 121 -9.403863770832833e-03 +105 122 -8.076052134892603e-03 +105 123 -6.996835383339675e-03 +105 124 -6.109381318875753e-03 +105 125 -5.371977266379809e-03 +105 126 -4.753493624956900e-03 +105 127 -4.230349322908533e-03 +106 106 3.988394278115155e+01 +106 80 -2.783725492315671e-03 +106 81 -3.071047067257393e-03 +106 82 -3.401691470521393e-03 +106 83 -3.784439171232926e-03 +106 84 -4.230349322908533e-03 +106 85 -4.753493624956896e-03 +106 86 -5.371977266379806e-03 +106 87 -6.109381318875747e-03 +106 88 -6.996835383339674e-03 +106 89 -8.076052134892596e-03 +106 90 -9.403863770832828e-03 +106 91 -1.105916272470025e-02 +106 92 -1.315380302376546e-02 +106 93 -1.585023865775526e-02 +106 94 -1.939104886145110e-02 +106 95 -2.415034675252897e-02 +106 96 -3.072751892616546e-02 +106 97 -4.012781031912996e-02 +106 98 -5.413421453123176e-02 +106 99 -7.613960933881167e-02 +106 100 -1.132183869282767e-01 +106 101 -1.820810586422650e-01 +106 102 -3.301555353436756e-01 +106 103 -7.412185823610182e-01 +106 104 -3.165206906282866e+00 +106 105 -1.502055215839542e+01 +106 107 -1.502055215844907e+01 +106 108 -3.165206906282874e+00 +106 109 -7.412185823610213e-01 +106 110 -3.301555353436758e-01 +106 111 -1.820810586422650e-01 +106 112 -1.132183869282764e-01 +106 113 -7.613960933881167e-02 +106 114 -5.413421453123172e-02 +106 115 -4.012781031912998e-02 +106 116 -3.072751892616543e-02 +106 117 -2.415034675252897e-02 +106 118 -1.939104886145111e-02 +106 119 -1.585023865775526e-02 +106 120 -1.315380302376546e-02 +106 121 -1.105916272470026e-02 +106 122 -9.403863770832832e-03 +106 123 -8.076052134892596e-03 +106 124 -6.996835383339674e-03 +106 125 -6.109381318875749e-03 +106 126 -5.371977266379808e-03 +106 127 -4.753493624956896e-03 +107 107 3.988394278128115e+01 +107 80 -2.532689975072679e-03 +107 81 -2.783725492315672e-03 +107 82 -3.071047067257393e-03 +107 83 -3.401691470521392e-03 +107 84 -3.784439171232929e-03 +107 85 -4.230349322908531e-03 +107 86 -4.753493624956896e-03 +107 87 -5.371977266379804e-03 +107 88 -6.109381318875749e-03 +107 89 -6.996835383339674e-03 +107 90 -8.076052134892596e-03 +107 91 -9.403863770832835e-03 +107 92 -1.105916272470025e-02 +107 93 -1.315380302376547e-02 +107 94 -1.585023865775526e-02 +107 95 -1.939104886145112e-02 +107 96 -2.415034675252899e-02 +107 97 -3.072751892616546e-02 +107 98 -4.012781031913001e-02 +107 99 -5.413421453123175e-02 +107 100 -7.613960933881173e-02 +107 101 -1.132183869282766e-01 +107 102 -1.820810586422651e-01 +107 103 -3.301555353436758e-01 +107 104 -7.412185823610177e-01 +107 105 -3.165206906282873e+00 +107 106 -1.502055215844907e+01 +107 108 -1.502055215852576e+01 +107 109 -3.165206906282874e+00 +107 110 -7.412185823610223e-01 +107 111 -3.301555353436767e-01 +107 112 -1.820810586422648e-01 +107 113 -1.132183869282764e-01 +107 114 -7.613960933881159e-02 +107 115 -5.413421453123171e-02 +107 116 -4.012781031912993e-02 +107 117 -3.072751892616544e-02 +107 118 -2.415034675252895e-02 +107 119 -1.939104886145111e-02 +107 120 -1.585023865775525e-02 +107 121 -1.315380302376546e-02 +107 122 -1.105916272470025e-02 +107 123 -9.403863770832830e-03 +107 124 -8.076052134892597e-03 +107 125 -6.996835383339674e-03 +107 126 -6.109381318875752e-03 +107 127 -5.371977266379806e-03 +108 108 3.988394278146373e+01 +108 80 -2.312252367280536e-03 +108 81 -2.532689975072680e-03 +108 82 -2.783725492315673e-03 +108 83 -3.071047067257393e-03 +108 84 -3.401691470521395e-03 +108 85 -3.784439171232928e-03 +108 86 -4.230349322908533e-03 +108 87 -4.753493624956895e-03 +108 88 -5.371977266379808e-03 +108 89 -6.109381318875752e-03 +108 90 -6.996835383339673e-03 +108 91 -8.076052134892603e-03 +108 92 -9.403863770832830e-03 +108 93 -1.105916272470025e-02 +108 94 -1.315380302376546e-02 +108 95 -1.585023865775526e-02 +108 96 -1.939104886145112e-02 +108 97 -2.415034675252897e-02 +108 98 -3.072751892616546e-02 +108 99 -4.012781031912996e-02 +108 100 -5.413421453123172e-02 +108 101 -7.613960933881160e-02 +108 102 -1.132183869282766e-01 +108 103 -1.820810586422650e-01 +108 104 -3.301555353436748e-01 +108 105 -7.412185823610203e-01 +108 106 -3.165206906282874e+00 +108 107 -1.502055215852576e+01 +108 109 -1.502055215863301e+01 +108 110 -3.165206906282875e+00 +108 111 -7.412185823610196e-01 +108 112 -3.301555353436765e-01 +108 113 -1.820810586422652e-01 +108 114 -1.132183869282765e-01 +108 115 -7.613960933881164e-02 +108 116 -5.413421453123172e-02 +108 117 -4.012781031912998e-02 +108 118 -3.072751892616543e-02 +108 119 -2.415034675252897e-02 +108 120 -1.939104886145111e-02 +108 121 -1.585023865775526e-02 +108 122 -1.315380302376546e-02 +108 123 -1.105916272470026e-02 +108 124 -9.403863770832830e-03 +108 125 -8.076052134892596e-03 +108 126 -6.996835383339674e-03 +108 127 -6.109381318875748e-03 +109 109 3.988394278171953e+01 +109 80 -2.117777896667792e-03 +109 81 -2.312252367280535e-03 +109 82 -2.532689975072679e-03 +109 83 -2.783725492315670e-03 +109 84 -3.071047067257393e-03 +109 85 -3.401691470521393e-03 +109 86 -3.784439171232926e-03 +109 87 -4.230349322908528e-03 +109 88 -4.753493624956894e-03 +109 89 -5.371977266379804e-03 +109 90 -6.109381318875744e-03 +109 91 -6.996835383339674e-03 +109 92 -8.076052134892596e-03 +109 93 -9.403863770832832e-03 +109 94 -1.105916272470025e-02 +109 95 -1.315380302376547e-02 +109 96 -1.585023865775527e-02 +109 97 -1.939104886145112e-02 +109 98 -2.415034675252899e-02 +109 99 -3.072751892616546e-02 +109 100 -4.012781031912998e-02 +109 101 -5.413421453123171e-02 +109 102 -7.613960933881170e-02 +109 103 -1.132183869282766e-01 +109 104 -1.820810586422651e-01 +109 105 -3.301555353436768e-01 +109 106 -7.412185823610213e-01 +109 107 -3.165206906282874e+00 +109 108 -1.502055215863301e+01 +109 110 -1.502055215878374e+01 +109 111 -3.165206906282868e+00 +109 112 -7.412185823610196e-01 +109 113 -3.301555353436771e-01 +109 114 -1.820810586422649e-01 +109 115 -1.132183869282764e-01 +109 116 -7.613960933881159e-02 +109 117 -5.413421453123171e-02 +109 118 -4.012781031912993e-02 +109 119 -3.072751892616544e-02 +109 120 -2.415034675252895e-02 +109 121 -1.939104886145111e-02 +109 122 -1.585023865775525e-02 +109 123 -1.315380302376546e-02 +109 124 -1.105916272470025e-02 +109 125 -9.403863770832833e-03 +109 126 -8.076052134892604e-03 +109 127 -6.996835383339678e-03 +110 110 3.988394278208170e+01 +110 80 -1.945462087124852e-03 +110 81 -2.117777896667794e-03 +110 82 -2.312252367280536e-03 +110 83 -2.532689975072679e-03 +110 84 -2.783725492315673e-03 +110 85 -3.071047067257393e-03 +110 86 -3.401691470521393e-03 +110 87 -3.784439171232926e-03 +110 88 -4.230349322908531e-03 +110 89 -4.753493624956896e-03 +110 90 -5.371977266379805e-03 +110 91 -6.109381318875753e-03 +110 92 -6.996835383339674e-03 +110 93 -8.076052134892596e-03 +110 94 -9.403863770832828e-03 +110 95 -1.105916272470025e-02 +110 96 -1.315380302376547e-02 +110 97 -1.585023865775526e-02 +110 98 -1.939104886145112e-02 +110 99 -2.415034675252897e-02 +110 100 -3.072751892616543e-02 +110 101 -4.012781031912993e-02 +110 102 -5.413421453123172e-02 +110 103 -7.613960933881159e-02 +110 104 -1.132183869282765e-01 +110 105 -1.820810586422652e-01 +110 106 -3.301555353436758e-01 +110 107 -7.412185823610223e-01 +110 108 -3.165206906282875e+00 +110 109 -1.502055215878374e+01 +110 111 -1.502055215899860e+01 +110 112 -3.165206906282865e+00 +110 113 -7.412185823610196e-01 +110 114 -3.301555353436750e-01 +110 115 -1.820810586422650e-01 +110 116 -1.132183869282766e-01 +110 117 -7.613960933881167e-02 +110 118 -5.413421453123172e-02 +110 119 -4.012781031912998e-02 +110 120 -3.072751892616543e-02 +110 121 -2.415034675252897e-02 +110 122 -1.939104886145111e-02 +110 123 -1.585023865775526e-02 +110 124 -1.315380302376546e-02 +110 125 -1.105916272470026e-02 +110 126 -9.403863770832832e-03 +110 127 -8.076052134892597e-03 +111 111 3.988394278260304e+01 +111 80 -1.792160480940037e-03 +111 81 -1.945462087124853e-03 +111 82 -2.117777896667793e-03 +111 83 -2.312252367280535e-03 +111 84 -2.532689975072680e-03 +111 85 -2.783725492315672e-03 +111 86 -3.071047067257393e-03 +111 87 -3.401691470521392e-03 +111 88 -3.784439171232926e-03 +111 89 -4.230349322908531e-03 +111 90 -4.753493624956894e-03 +111 91 -5.371977266379808e-03 +111 92 -6.109381318875749e-03 +111 93 -6.996835383339674e-03 +111 94 -8.076052134892594e-03 +111 95 -9.403863770832832e-03 +111 96 -1.105916272470026e-02 +111 97 -1.315380302376547e-02 +111 98 -1.585023865775527e-02 +111 99 -1.939104886145112e-02 +111 100 -2.415034675252897e-02 +111 101 -3.072751892616544e-02 +111 102 -4.012781031912998e-02 +111 103 -5.413421453123171e-02 +111 104 -7.613960933881170e-02 +111 105 -1.132183869282766e-01 +111 106 -1.820810586422650e-01 +111 107 -3.301555353436767e-01 +111 108 -7.412185823610196e-01 +111 109 -3.165206906282868e+00 +111 110 -1.502055215899860e+01 +111 112 -1.502055215931065e+01 +111 113 -3.165206906282869e+00 +111 114 -7.412185823610175e-01 +111 115 -3.301555353436765e-01 +111 116 -1.820810586422648e-01 +111 117 -1.132183869282763e-01 +111 118 -7.613960933881159e-02 +111 119 -5.413421453123171e-02 +111 120 -4.012781031912993e-02 +111 121 -3.072751892616544e-02 +111 122 -2.415034675252895e-02 +111 123 -1.939104886145111e-02 +111 124 -1.585023865775525e-02 +111 125 -1.315380302376546e-02 +111 126 -1.105916272470025e-02 +111 127 -9.403863770832830e-03 +112 112 3.988394278260305e+01 +112 96 -9.403863770832833e-03 +112 97 -1.105916272470025e-02 +112 98 -1.315380302376547e-02 +112 99 -1.585023865775526e-02 +112 100 -1.939104886145111e-02 +112 101 -2.415034675252895e-02 +112 102 -3.072751892616543e-02 +112 103 -4.012781031912993e-02 +112 104 -5.413421453123172e-02 +112 105 -7.613960933881159e-02 +112 106 -1.132183869282764e-01 +112 107 -1.820810586422648e-01 +112 108 -3.301555353436765e-01 +112 109 -7.412185823610196e-01 +112 110 -3.165206906282865e+00 +112 111 -1.502055215931065e+01 +112 113 -1.502055215899860e+01 +112 114 -3.165206906282872e+00 +112 115 -7.412185823610213e-01 +112 116 -3.301555353436744e-01 +112 117 -1.820810586422645e-01 +112 118 -1.132183869282766e-01 +112 119 -7.613960933881170e-02 +112 120 -5.413421453123172e-02 +112 121 -4.012781031912998e-02 +112 122 -3.072751892616543e-02 +112 123 -2.415034675252897e-02 +112 124 -1.939104886145111e-02 +112 125 -1.585023865775526e-02 +112 126 -1.315380302376546e-02 +112 127 -1.105916272470026e-02 +112 128 -9.403863770832833e-03 +112 129 -8.076052134892597e-03 +112 130 -6.996835383339678e-03 +112 131 -6.109381318875753e-03 +112 132 -5.371977266379809e-03 +112 133 -4.753493624956898e-03 +112 134 -4.230349322908533e-03 +112 135 -3.784439171232929e-03 +112 136 -3.401691470521395e-03 +112 137 -3.071047067257394e-03 +112 138 -2.783725492315673e-03 +112 139 -2.532689975072680e-03 +112 140 -2.312252367280536e-03 +112 141 -2.117777896667795e-03 +112 142 -1.945462087124854e-03 +112 143 -1.792160480940039e-03 +113 113 3.988394278208168e+01 +113 96 -8.076052134892599e-03 +113 97 -9.403863770832833e-03 +113 98 -1.105916272470026e-02 +113 99 -1.315380302376547e-02 +113 100 -1.585023865775526e-02 +113 101 -1.939104886145111e-02 +113 102 -2.415034675252897e-02 +113 103 -3.072751892616544e-02 +113 104 -4.012781031912998e-02 +113 105 -5.413421453123171e-02 +113 106 -7.613960933881167e-02 +113 107 -1.132183869282764e-01 +113 108 -1.820810586422652e-01 +113 109 -3.301555353436771e-01 +113 110 -7.412185823610196e-01 +113 111 -3.165206906282869e+00 +113 112 -1.502055215899860e+01 +113 114 -1.502055215878374e+01 +113 115 -3.165206906282874e+00 +113 116 -7.412185823610187e-01 +113 117 -3.301555353436744e-01 +113 118 -1.820810586422649e-01 +113 119 -1.132183869282764e-01 +113 120 -7.613960933881156e-02 +113 121 -5.413421453123171e-02 +113 122 -4.012781031912993e-02 +113 123 -3.072751892616544e-02 +113 124 -2.415034675252895e-02 +113 125 -1.939104886145111e-02 +113 126 -1.585023865775525e-02 +113 127 -1.315380302376546e-02 +113 128 -1.105916272470025e-02 +113 129 -9.403863770832827e-03 +113 130 -8.076052134892594e-03 +113 131 -6.996835383339674e-03 +113 132 -6.109381318875749e-03 +113 133 -5.371977266379806e-03 +113 134 -4.753493624956896e-03 +113 135 -4.230349322908531e-03 +113 136 -3.784439171232927e-03 +113 137 -3.401691470521393e-03 +113 138 -3.071047067257393e-03 +113 139 -2.783725492315672e-03 +113 140 -2.532689975072680e-03 +113 141 -2.312252367280536e-03 +113 142 -2.117777896667794e-03 +113 143 -1.945462087124853e-03 +114 114 3.988394278171953e+01 +114 96 -6.996835383339674e-03 +114 97 -8.076052134892597e-03 +114 98 -9.403863770832835e-03 +114 99 -1.105916272470025e-02 +114 100 -1.315380302376546e-02 +114 101 -1.585023865775525e-02 +114 102 -1.939104886145111e-02 +114 103 -2.415034675252895e-02 +114 104 -3.072751892616543e-02 +114 105 -4.012781031912993e-02 +114 106 -5.413421453123172e-02 +114 107 -7.613960933881159e-02 +114 108 -1.132183869282765e-01 +114 109 -1.820810586422649e-01 +114 110 -3.301555353436750e-01 +114 111 -7.412185823610175e-01 +114 112 -3.165206906282872e+00 +114 113 -1.502055215878374e+01 +114 115 -1.502055215863301e+01 +114 116 -3.165206906282870e+00 +114 117 -7.412185823610192e-01 +114 118 -3.301555353436764e-01 +114 119 -1.820810586422648e-01 +114 120 -1.132183869282764e-01 +114 121 -7.613960933881167e-02 +114 122 -5.413421453123172e-02 +114 123 -4.012781031912998e-02 +114 124 -3.072751892616543e-02 +114 125 -2.415034675252897e-02 +114 126 -1.939104886145111e-02 +114 127 -1.585023865775526e-02 +114 128 -1.315380302376547e-02 +114 129 -1.105916272470025e-02 +114 130 -9.403863770832827e-03 +114 131 -8.076052134892594e-03 +114 132 -6.996835383339674e-03 +114 133 -6.109381318875749e-03 +114 134 -5.371977266379806e-03 +114 135 -4.753493624956896e-03 +114 136 -4.230349322908531e-03 +114 137 -3.784439171232927e-03 +114 138 -3.401691470521393e-03 +114 139 -3.071047067257393e-03 +114 140 -2.783725492315672e-03 +114 141 -2.532689975072680e-03 +114 142 -2.312252367280536e-03 +114 143 -2.117777896667794e-03 +115 115 3.988394278146372e+01 +115 96 -6.109381318875752e-03 +115 97 -6.996835383339678e-03 +115 98 -8.076052134892606e-03 +115 99 -9.403863770832835e-03 +115 100 -1.105916272470026e-02 +115 101 -1.315380302376546e-02 +115 102 -1.585023865775526e-02 +115 103 -1.939104886145111e-02 +115 104 -2.415034675252897e-02 +115 105 -3.072751892616544e-02 +115 106 -4.012781031912998e-02 +115 107 -5.413421453123171e-02 +115 108 -7.613960933881164e-02 +115 109 -1.132183869282764e-01 +115 110 -1.820810586422650e-01 +115 111 -3.301555353436765e-01 +115 112 -7.412185823610213e-01 +115 113 -3.165206906282874e+00 +115 114 -1.502055215863301e+01 +115 116 -1.502055215852575e+01 +115 117 -3.165206906282868e+00 +115 118 -7.412185823610176e-01 +115 119 -3.301555353436747e-01 +115 120 -1.820810586422651e-01 +115 121 -1.132183869282765e-01 +115 122 -7.613960933881157e-02 +115 123 -5.413421453123171e-02 +115 124 -4.012781031912993e-02 +115 125 -3.072751892616544e-02 +115 126 -2.415034675252895e-02 +115 127 -1.939104886145111e-02 +115 128 -1.585023865775525e-02 +115 129 -1.315380302376546e-02 +115 130 -1.105916272470025e-02 +115 131 -9.403863770832827e-03 +115 132 -8.076052134892592e-03 +115 133 -6.996835383339671e-03 +115 134 -6.109381318875747e-03 +115 135 -5.371977266379805e-03 +115 136 -4.753493624956894e-03 +115 137 -4.230349322908529e-03 +115 138 -3.784439171232926e-03 +115 139 -3.401691470521392e-03 +115 140 -3.071047067257392e-03 +115 141 -2.783725492315671e-03 +115 142 -2.532689975072679e-03 +115 143 -2.312252367280535e-03 +116 116 3.988394278128114e+01 +116 96 -5.371977266379804e-03 +116 97 -6.109381318875748e-03 +116 98 -6.996835383339675e-03 +116 99 -8.076052134892594e-03 +116 100 -9.403863770832830e-03 +116 101 -1.105916272470025e-02 +116 102 -1.315380302376546e-02 +116 103 -1.585023865775525e-02 +116 104 -1.939104886145111e-02 +116 105 -2.415034675252895e-02 +116 106 -3.072751892616543e-02 +116 107 -4.012781031912993e-02 +116 108 -5.413421453123172e-02 +116 109 -7.613960933881159e-02 +116 110 -1.132183869282766e-01 +116 111 -1.820810586422648e-01 +116 112 -3.301555353436744e-01 +116 113 -7.412185823610187e-01 +116 114 -3.165206906282870e+00 +116 115 -1.502055215852575e+01 +116 117 -1.502055215844907e+01 +116 118 -3.165206906282870e+00 +116 119 -7.412185823610202e-01 +116 120 -3.301555353436780e-01 +116 121 -1.820810586422654e-01 +116 122 -1.132183869282765e-01 +116 123 -7.613960933881170e-02 +116 124 -5.413421453123172e-02 +116 125 -4.012781031912998e-02 +116 126 -3.072751892616543e-02 +116 127 -2.415034675252897e-02 +116 128 -1.939104886145111e-02 +116 129 -1.585023865775526e-02 +116 130 -1.315380302376546e-02 +116 131 -1.105916272470025e-02 +116 132 -9.403863770832830e-03 +116 133 -8.076052134892597e-03 +116 134 -6.996835383339678e-03 +116 135 -6.109381318875753e-03 +116 136 -5.371977266379808e-03 +116 137 -4.753493624956898e-03 +116 138 -4.230349322908533e-03 +116 139 -3.784439171232929e-03 +116 140 -3.401691470521395e-03 +116 141 -3.071047067257394e-03 +116 142 -2.783725492315673e-03 +116 143 -2.532689975072680e-03 +117 117 3.988394278115153e+01 +117 96 -4.753493624956896e-03 +117 97 -5.371977266379806e-03 +117 98 -6.109381318875753e-03 +117 99 -6.996835383339674e-03 +117 100 -8.076052134892597e-03 +117 101 -9.403863770832830e-03 +117 102 -1.105916272470026e-02 +117 103 -1.315380302376546e-02 +117 104 -1.585023865775526e-02 +117 105 -1.939104886145111e-02 +117 106 -2.415034675252897e-02 +117 107 -3.072751892616544e-02 +117 108 -4.012781031912998e-02 +117 109 -5.413421453123171e-02 +117 110 -7.613960933881167e-02 +117 111 -1.132183869282763e-01 +117 112 -1.820810586422645e-01 +117 113 -3.301555353436744e-01 +117 114 -7.412185823610192e-01 +117 115 -3.165206906282868e+00 +117 116 -1.502055215844907e+01 +117 118 -1.502055215839541e+01 +117 119 -3.165206906282868e+00 +117 120 -7.412185823610224e-01 +117 121 -3.301555353436771e-01 +117 122 -1.820810586422653e-01 +117 123 -1.132183869282767e-01 +117 124 -7.613960933881163e-02 +117 125 -5.413421453123171e-02 +117 126 -4.012781031912993e-02 +117 127 -3.072751892616544e-02 +117 128 -2.415034675252896e-02 +117 129 -1.939104886145110e-02 +117 130 -1.585023865775525e-02 +117 131 -1.315380302376546e-02 +117 132 -1.105916272470025e-02 +117 133 -9.403863770832827e-03 +117 134 -8.076052134892594e-03 +117 135 -6.996835383339674e-03 +117 136 -6.109381318875749e-03 +117 137 -5.371977266379806e-03 +117 138 -4.753493624956896e-03 +117 139 -4.230349322908531e-03 +117 140 -3.784439171232927e-03 +117 141 -3.401691470521393e-03 +117 142 -3.071047067257393e-03 +117 143 -2.783725492315672e-03 +118 118 3.988394278106477e+01 +118 96 -4.230349322908531e-03 +118 97 -4.753493624956896e-03 +118 98 -5.371977266379809e-03 +118 99 -6.109381318875749e-03 +118 100 -6.996835383339674e-03 +118 101 -8.076052134892594e-03 +118 102 -9.403863770832832e-03 +118 103 -1.105916272470025e-02 +118 104 -1.315380302376546e-02 +118 105 -1.585023865775525e-02 +118 106 -1.939104886145111e-02 +118 107 -2.415034675252895e-02 +118 108 -3.072751892616543e-02 +118 109 -4.012781031912993e-02 +118 110 -5.413421453123172e-02 +118 111 -7.613960933881159e-02 +118 112 -1.132183869282766e-01 +118 113 -1.820810586422649e-01 +118 114 -3.301555353436764e-01 +118 115 -7.412185823610176e-01 +118 116 -3.165206906282870e+00 +118 117 -1.502055215839541e+01 +118 119 -1.502055215836221e+01 +118 120 -3.165206906282877e+00 +118 121 -7.412185823610254e-01 +118 122 -3.301555353436766e-01 +118 123 -1.820810586422653e-01 +118 124 -1.132183869282766e-01 +118 125 -7.613960933881167e-02 +118 126 -5.413421453123172e-02 +118 127 -4.012781031912998e-02 +118 128 -3.072751892616544e-02 +118 129 -2.415034675252897e-02 +118 130 -1.939104886145111e-02 +118 131 -1.585023865775526e-02 +118 132 -1.315380302376546e-02 +118 133 -1.105916272470025e-02 +118 134 -9.403863770832827e-03 +118 135 -8.076052134892594e-03 +118 136 -6.996835383339674e-03 +118 137 -6.109381318875749e-03 +118 138 -5.371977266379806e-03 +118 139 -4.753493624956896e-03 +118 140 -4.230349322908531e-03 +118 141 -3.784439171232927e-03 +118 142 -3.401691470521393e-03 +118 143 -3.071047067257393e-03 +119 119 3.988394278102307e+01 +119 96 -3.784439171232929e-03 +119 97 -4.230349322908534e-03 +119 98 -4.753493624956900e-03 +119 99 -5.371977266379808e-03 +119 100 -6.109381318875752e-03 +119 101 -6.996835383339674e-03 +119 102 -8.076052134892606e-03 +119 103 -9.403863770832833e-03 +119 104 -1.105916272470026e-02 +119 105 -1.315380302376546e-02 +119 106 -1.585023865775526e-02 +119 107 -1.939104886145111e-02 +119 108 -2.415034675252897e-02 +119 109 -3.072751892616544e-02 +119 110 -4.012781031912998e-02 +119 111 -5.413421453123171e-02 +119 112 -7.613960933881170e-02 +119 113 -1.132183869282764e-01 +119 114 -1.820810586422648e-01 +119 115 -3.301555353436747e-01 +119 116 -7.412185823610202e-01 +119 117 -3.165206906282868e+00 +119 118 -1.502055215836221e+01 +119 120 -1.502055215835491e+01 +119 121 -3.165206906282882e+00 +119 122 -7.412185823610213e-01 +119 123 -3.301555353436760e-01 +119 124 -1.820810586422650e-01 +119 125 -1.132183869282765e-01 +119 126 -7.613960933881160e-02 +119 127 -5.413421453123171e-02 +119 128 -4.012781031912994e-02 +119 129 -3.072751892616542e-02 +119 130 -2.415034675252895e-02 +119 131 -1.939104886145110e-02 +119 132 -1.585023865775525e-02 +119 133 -1.315380302376546e-02 +119 134 -1.105916272470025e-02 +119 135 -9.403863770832827e-03 +119 136 -8.076052134892592e-03 +119 137 -6.996835383339671e-03 +119 138 -6.109381318875747e-03 +119 139 -5.371977266379804e-03 +119 140 -4.753493624956894e-03 +119 141 -4.230349322908529e-03 +119 142 -3.784439171232926e-03 +119 143 -3.401691470521392e-03 +120 120 3.988394278105616e+01 +120 96 -3.401691470521394e-03 +120 97 -3.784439171232928e-03 +120 98 -4.230349322908533e-03 +120 99 -4.753493624956896e-03 +120 100 -5.371977266379806e-03 +120 101 -6.109381318875748e-03 +120 102 -6.996835383339678e-03 +120 103 -8.076052134892597e-03 +120 104 -9.403863770832830e-03 +120 105 -1.105916272470025e-02 +120 106 -1.315380302376546e-02 +120 107 -1.585023865775525e-02 +120 108 -1.939104886145111e-02 +120 109 -2.415034675252895e-02 +120 110 -3.072751892616543e-02 +120 111 -4.012781031912993e-02 +120 112 -5.413421453123172e-02 +120 113 -7.613960933881156e-02 +120 114 -1.132183869282764e-01 +120 115 -1.820810586422651e-01 +120 116 -3.301555353436780e-01 +120 117 -7.412185823610224e-01 +120 118 -3.165206906282877e+00 +120 119 -1.502055215835491e+01 +120 121 -1.502055215840048e+01 +120 122 -3.165206906282863e+00 +120 123 -7.412185823610158e-01 +120 124 -3.301555353436750e-01 +120 125 -1.820810586422650e-01 +120 126 -1.132183869282767e-01 +120 127 -7.613960933881167e-02 +120 128 -5.413421453123173e-02 +120 129 -4.012781031912995e-02 +120 130 -3.072751892616543e-02 +120 131 -2.415034675252897e-02 +120 132 -1.939104886145111e-02 +120 133 -1.585023865775526e-02 +120 134 -1.315380302376546e-02 +120 135 -1.105916272470025e-02 +120 136 -9.403863770832827e-03 +120 137 -8.076052134892594e-03 +120 138 -6.996835383339674e-03 +120 139 -6.109381318875749e-03 +120 140 -5.371977266379806e-03 +120 141 -4.753493624956896e-03 +120 142 -4.230349322908531e-03 +120 143 -3.784439171232927e-03 +121 121 3.988394278128564e+01 +121 96 -3.071047067257393e-03 +121 97 -3.401691470521394e-03 +121 98 -3.784439171232929e-03 +121 99 -4.230349322908531e-03 +121 100 -4.753493624956896e-03 +121 101 -5.371977266379805e-03 +121 102 -6.109381318875753e-03 +121 103 -6.996835383339674e-03 +121 104 -8.076052134892597e-03 +121 105 -9.403863770832833e-03 +121 106 -1.105916272470026e-02 +121 107 -1.315380302376546e-02 +121 108 -1.585023865775526e-02 +121 109 -1.939104886145111e-02 +121 110 -2.415034675252897e-02 +121 111 -3.072751892616544e-02 +121 112 -4.012781031912998e-02 +121 113 -5.413421453123171e-02 +121 114 -7.613960933881167e-02 +121 115 -1.132183869282765e-01 +121 116 -1.820810586422654e-01 +121 117 -3.301555353436771e-01 +121 118 -7.412185823610254e-01 +121 119 -3.165206906282882e+00 +121 120 -1.502055215840048e+01 +121 122 -1.502055215860530e+01 +121 123 -3.165206906282864e+00 +121 124 -7.412185823610159e-01 +121 125 -3.301555353436746e-01 +121 126 -1.820810586422648e-01 +121 127 -1.132183869282763e-01 +121 128 -7.613960933881159e-02 +121 129 -5.413421453123168e-02 +121 130 -4.012781031912993e-02 +121 131 -3.072751892616542e-02 +121 132 -2.415034675252895e-02 +121 133 -1.939104886145110e-02 +121 134 -1.585023865775525e-02 +121 135 -1.315380302376546e-02 +121 136 -1.105916272470025e-02 +121 137 -9.403863770832827e-03 +121 138 -8.076052134892594e-03 +121 139 -6.996835383339674e-03 +121 140 -6.109381318875749e-03 +121 141 -5.371977266379806e-03 +121 142 -4.753493624956896e-03 +121 143 -4.230349322908531e-03 +122 122 3.988394278152494e+01 +122 96 -2.783725492315673e-03 +122 97 -3.071047067257394e-03 +122 98 -3.401691470521395e-03 +122 99 -3.784439171232928e-03 +122 100 -4.230349322908533e-03 +122 101 -4.753493624956895e-03 +122 102 -5.371977266379810e-03 +122 103 -6.109381318875752e-03 +122 104 -6.996835383339678e-03 +122 105 -8.076052134892603e-03 +122 106 -9.403863770832832e-03 +122 107 -1.105916272470025e-02 +122 108 -1.315380302376546e-02 +122 109 -1.585023865775525e-02 +122 110 -1.939104886145111e-02 +122 111 -2.415034675252895e-02 +122 112 -3.072751892616543e-02 +122 113 -4.012781031912993e-02 +122 114 -5.413421453123172e-02 +122 115 -7.613960933881157e-02 +122 116 -1.132183869282765e-01 +122 117 -1.820810586422653e-01 +122 118 -3.301555353436766e-01 +122 119 -7.412185823610213e-01 +122 120 -3.165206906282863e+00 +122 121 -1.502055215860530e+01 +122 123 -1.502055215859223e+01 +122 124 -3.165206906282868e+00 +122 125 -7.412185823610158e-01 +122 126 -3.301555353436760e-01 +122 127 -1.820810586422650e-01 +122 128 -1.132183869282765e-01 +122 129 -7.613960933881161e-02 +122 130 -5.413421453123170e-02 +122 131 -4.012781031912995e-02 +122 132 -3.072751892616543e-02 +122 133 -2.415034675252897e-02 +122 134 -1.939104886145111e-02 +122 135 -1.585023865775526e-02 +122 136 -1.315380302376546e-02 +122 137 -1.105916272470025e-02 +122 138 -9.403863770832827e-03 +122 139 -8.076052134892596e-03 +122 140 -6.996835383339671e-03 +122 141 -6.109381318875747e-03 +122 142 -5.371977266379805e-03 +122 143 -4.753493624956894e-03 +123 123 3.988394278151355e+01 +123 96 -2.532689975072679e-03 +123 97 -2.783725492315671e-03 +123 98 -3.071047067257393e-03 +123 99 -3.401691470521393e-03 +123 100 -3.784439171232926e-03 +123 101 -4.230349322908528e-03 +123 102 -4.753493624956895e-03 +123 103 -5.371977266379804e-03 +123 104 -6.109381318875748e-03 +123 105 -6.996835383339675e-03 +123 106 -8.076052134892596e-03 +123 107 -9.403863770832830e-03 +123 108 -1.105916272470026e-02 +123 109 -1.315380302376546e-02 +123 110 -1.585023865775526e-02 +123 111 -1.939104886145111e-02 +123 112 -2.415034675252897e-02 +123 113 -3.072751892616544e-02 +123 114 -4.012781031912998e-02 +123 115 -5.413421453123171e-02 +123 116 -7.613960933881170e-02 +123 117 -1.132183869282767e-01 +123 118 -1.820810586422653e-01 +123 119 -3.301555353436760e-01 +123 120 -7.412185823610158e-01 +123 121 -3.165206906282864e+00 +123 122 -1.502055215859223e+01 +123 124 -1.502055215859653e+01 +123 125 -3.165206906282862e+00 +123 126 -7.412185823610195e-01 +123 127 -3.301555353436754e-01 +123 128 -1.820810586422648e-01 +123 129 -1.132183869282763e-01 +123 130 -7.613960933881155e-02 +123 131 -5.413421453123168e-02 +123 132 -4.012781031912993e-02 +123 133 -3.072751892616542e-02 +123 134 -2.415034675252895e-02 +123 135 -1.939104886145110e-02 +123 136 -1.585023865775525e-02 +123 137 -1.315380302376546e-02 +123 138 -1.105916272470025e-02 +123 139 -9.403863770832835e-03 +123 140 -8.076052134892599e-03 +123 141 -6.996835383339678e-03 +123 142 -6.109381318875753e-03 +123 143 -5.371977266379808e-03 +124 124 3.988394278151442e+01 +124 96 -2.312252367280536e-03 +124 97 -2.532689975072680e-03 +124 98 -2.783725492315673e-03 +124 99 -3.071047067257393e-03 +124 100 -3.401691470521393e-03 +124 101 -3.784439171232926e-03 +124 102 -4.230349322908533e-03 +124 103 -4.753493624956896e-03 +124 104 -5.371977266379806e-03 +124 105 -6.109381318875753e-03 +124 106 -6.996835383339674e-03 +124 107 -8.076052134892597e-03 +124 108 -9.403863770832830e-03 +124 109 -1.105916272470025e-02 +124 110 -1.315380302376546e-02 +124 111 -1.585023865775525e-02 +124 112 -1.939104886145111e-02 +124 113 -2.415034675252895e-02 +124 114 -3.072751892616543e-02 +124 115 -4.012781031912993e-02 +124 116 -5.413421453123172e-02 +124 117 -7.613960933881163e-02 +124 118 -1.132183869282766e-01 +124 119 -1.820810586422650e-01 +124 120 -3.301555353436750e-01 +124 121 -7.412185823610159e-01 +124 122 -3.165206906282868e+00 +124 123 -1.502055215859653e+01 +124 125 -1.502055215858803e+01 +124 126 -3.165206906282876e+00 +124 127 -7.412185823610229e-01 +124 128 -3.301555353436764e-01 +124 129 -1.820810586422656e-01 +124 130 -1.132183869282763e-01 +124 131 -7.613960933881159e-02 +124 132 -5.413421453123170e-02 +124 133 -4.012781031912995e-02 +124 134 -3.072751892616543e-02 +124 135 -2.415034675252897e-02 +124 136 -1.939104886145111e-02 +124 137 -1.585023865775526e-02 +124 138 -1.315380302376546e-02 +124 139 -1.105916272470026e-02 +124 140 -9.403863770832827e-03 +124 141 -8.076052134892594e-03 +124 142 -6.996835383339674e-03 +124 143 -6.109381318875749e-03 +125 125 3.988394278153933e+01 +125 96 -2.117777896667794e-03 +125 97 -2.312252367280536e-03 +125 98 -2.532689975072680e-03 +125 99 -2.783725492315672e-03 +125 100 -3.071047067257393e-03 +125 101 -3.401691470521392e-03 +125 102 -3.784439171232929e-03 +125 103 -4.230349322908531e-03 +125 104 -4.753493624956896e-03 +125 105 -5.371977266379809e-03 +125 106 -6.109381318875749e-03 +125 107 -6.996835383339674e-03 +125 108 -8.076052134892596e-03 +125 109 -9.403863770832833e-03 +125 110 -1.105916272470026e-02 +125 111 -1.315380302376546e-02 +125 112 -1.585023865775526e-02 +125 113 -1.939104886145111e-02 +125 114 -2.415034675252897e-02 +125 115 -3.072751892616544e-02 +125 116 -4.012781031912998e-02 +125 117 -5.413421453123171e-02 +125 118 -7.613960933881167e-02 +125 119 -1.132183869282765e-01 +125 120 -1.820810586422650e-01 +125 121 -3.301555353436746e-01 +125 122 -7.412185823610158e-01 +125 123 -3.165206906282862e+00 +125 124 -1.502055215858803e+01 +125 126 -1.502055215864002e+01 +125 127 -3.165206906282879e+00 +125 128 -7.412185823610232e-01 +125 129 -3.301555353436793e-01 +125 130 -1.820810586422650e-01 +125 131 -1.132183869282764e-01 +125 132 -7.613960933881155e-02 +125 133 -5.413421453123168e-02 +125 134 -4.012781031912993e-02 +125 135 -3.072751892616542e-02 +125 136 -2.415034675252895e-02 +125 137 -1.939104886145110e-02 +125 138 -1.585023865775525e-02 +125 139 -1.315380302376547e-02 +125 140 -1.105916272470025e-02 +125 141 -9.403863770832827e-03 +125 142 -8.076052134892594e-03 +125 143 -6.996835383339674e-03 +126 126 3.988394278164021e+01 +126 96 -1.945462087124854e-03 +126 97 -2.117777896667794e-03 +126 98 -2.312252367280537e-03 +126 99 -2.532689975072680e-03 +126 100 -2.783725492315673e-03 +126 101 -3.071047067257393e-03 +126 102 -3.401691470521395e-03 +126 103 -3.784439171232929e-03 +126 104 -4.230349322908534e-03 +126 105 -4.753493624956900e-03 +126 106 -5.371977266379808e-03 +126 107 -6.109381318875752e-03 +126 108 -6.996835383339674e-03 +126 109 -8.076052134892604e-03 +126 110 -9.403863770832832e-03 +126 111 -1.105916272470025e-02 +126 112 -1.315380302376546e-02 +126 113 -1.585023865775525e-02 +126 114 -1.939104886145111e-02 +126 115 -2.415034675252895e-02 +126 116 -3.072751892616543e-02 +126 117 -4.012781031912993e-02 +126 118 -5.413421453123172e-02 +126 119 -7.613960933881160e-02 +126 120 -1.132183869282767e-01 +126 121 -1.820810586422648e-01 +126 122 -3.301555353436760e-01 +126 123 -7.412185823610195e-01 +126 124 -3.165206906282876e+00 +126 125 -1.502055215864002e+01 +126 127 -1.502055215866000e+01 +126 128 -3.165206906282869e+00 +126 129 -7.412185823610216e-01 +126 130 -3.301555353436754e-01 +126 131 -1.820810586422651e-01 +126 132 -1.132183869282763e-01 +126 133 -7.613960933881159e-02 +126 134 -5.413421453123170e-02 +126 135 -4.012781031912995e-02 +126 136 -3.072751892616543e-02 +126 137 -2.415034675252897e-02 +126 138 -1.939104886145111e-02 +126 139 -1.585023865775527e-02 +126 140 -1.315380302376546e-02 +126 141 -1.105916272470025e-02 +126 142 -9.403863770832827e-03 +126 143 -8.076052134892596e-03 +127 127 3.988394278169707e+01 +127 96 -1.792160480940038e-03 +127 97 -1.945462087124853e-03 +127 98 -2.117777896667795e-03 +127 99 -2.312252367280536e-03 +127 100 -2.532689975072680e-03 +127 101 -2.783725492315671e-03 +127 102 -3.071047067257394e-03 +127 103 -3.401691470521394e-03 +127 104 -3.784439171232928e-03 +127 105 -4.230349322908533e-03 +127 106 -4.753493624956896e-03 +127 107 -5.371977266379806e-03 +127 108 -6.109381318875748e-03 +127 109 -6.996835383339678e-03 +127 110 -8.076052134892597e-03 +127 111 -9.403863770832830e-03 +127 112 -1.105916272470026e-02 +127 113 -1.315380302376546e-02 +127 114 -1.585023865775526e-02 +127 115 -1.939104886145111e-02 +127 116 -2.415034675252897e-02 +127 117 -3.072751892616544e-02 +127 118 -4.012781031912998e-02 +127 119 -5.413421453123171e-02 +127 120 -7.613960933881167e-02 +127 121 -1.132183869282763e-01 +127 122 -1.820810586422650e-01 +127 123 -3.301555353436754e-01 +127 124 -7.412185823610229e-01 +127 125 -3.165206906282879e+00 +127 126 -1.502055215866000e+01 +127 128 -1.502055215931065e+01 +127 129 -3.165206906282869e+00 +127 130 -7.412185823610202e-01 +127 131 -3.301555353436779e-01 +127 132 -1.820810586422653e-01 +127 133 -1.132183869282763e-01 +127 134 -7.613960933881156e-02 +127 135 -5.413421453123168e-02 +127 136 -4.012781031912993e-02 +127 137 -3.072751892616542e-02 +127 138 -2.415034675252896e-02 +127 139 -1.939104886145112e-02 +127 140 -1.585023865775525e-02 +127 141 -1.315380302376546e-02 +127 142 -1.105916272470025e-02 +127 143 -9.403863770832832e-03 +128 128 3.988394278169704e+01 +128 112 -9.403863770832833e-03 +128 113 -1.105916272470025e-02 +128 114 -1.315380302376547e-02 +128 115 -1.585023865775525e-02 +128 116 -1.939104886145111e-02 +128 117 -2.415034675252896e-02 +128 118 -3.072751892616544e-02 +128 119 -4.012781031912994e-02 +128 120 -5.413421453123173e-02 +128 121 -7.613960933881159e-02 +128 122 -1.132183869282765e-01 +128 123 -1.820810586422648e-01 +128 124 -3.301555353436764e-01 +128 125 -7.412185823610232e-01 +128 126 -3.165206906282869e+00 +128 127 -1.502055215931065e+01 +128 129 -1.502055215866001e+01 +128 130 -3.165206906282869e+00 +128 131 -7.412185823610193e-01 +128 132 -3.301555353436751e-01 +128 133 -1.820810586422645e-01 +128 134 -1.132183869282765e-01 +128 135 -7.613960933881164e-02 +128 136 -5.413421453123169e-02 +128 137 -4.012781031912994e-02 +128 138 -3.072751892616542e-02 +128 139 -2.415034675252898e-02 +128 140 -1.939104886145110e-02 +128 141 -1.585023865775525e-02 +128 142 -1.315380302376546e-02 +128 143 -1.105916272470026e-02 +128 144 -9.403863770832827e-03 +128 145 -8.076052134892601e-03 +128 146 -6.996835383339666e-03 +128 147 -6.109381318875744e-03 +128 148 -5.371977266379806e-03 +128 149 -4.753493624956896e-03 +128 150 -4.230349322908531e-03 +128 151 -3.784439171232927e-03 +128 152 -3.401691470521395e-03 +128 153 -3.071047067257391e-03 +128 154 -2.783725492315670e-03 +128 155 -2.532689975072680e-03 +128 156 -2.312252367280536e-03 +128 157 -2.117777896667794e-03 +128 158 -1.945462087124853e-03 +128 159 -1.792160480940039e-03 +129 129 3.988394278164020e+01 +129 112 -8.076052134892597e-03 +129 113 -9.403863770832827e-03 +129 114 -1.105916272470025e-02 +129 115 -1.315380302376546e-02 +129 116 -1.585023865775526e-02 +129 117 -1.939104886145110e-02 +129 118 -2.415034675252897e-02 +129 119 -3.072751892616542e-02 +129 120 -4.012781031912995e-02 +129 121 -5.413421453123168e-02 +129 122 -7.613960933881161e-02 +129 123 -1.132183869282763e-01 +129 124 -1.820810586422656e-01 +129 125 -3.301555353436793e-01 +129 126 -7.412185823610216e-01 +129 127 -3.165206906282869e+00 +129 128 -1.502055215866001e+01 +129 130 -1.502055215864000e+01 +129 131 -3.165206906282867e+00 +129 132 -7.412185823610199e-01 +129 133 -3.301555353436754e-01 +129 134 -1.820810586422651e-01 +129 135 -1.132183869282765e-01 +129 136 -7.613960933881157e-02 +129 137 -5.413421453123172e-02 +129 138 -4.012781031912996e-02 +129 139 -3.072751892616547e-02 +129 140 -2.415034675252897e-02 +129 141 -1.939104886145111e-02 +129 142 -1.585023865775526e-02 +129 143 -1.315380302376547e-02 +129 144 -1.105916272470025e-02 +129 145 -9.403863770832832e-03 +129 146 -8.076052134892590e-03 +129 147 -6.996835383339667e-03 +129 148 -6.109381318875749e-03 +129 149 -5.371977266379806e-03 +129 150 -4.753493624956896e-03 +129 151 -4.230349322908531e-03 +129 152 -3.784439171232929e-03 +129 153 -3.401691470521391e-03 +129 154 -3.071047067257390e-03 +129 155 -2.783725492315672e-03 +129 156 -2.532689975072680e-03 +129 157 -2.312252367280536e-03 +129 158 -2.117777896667794e-03 +129 159 -1.945462087124854e-03 +130 130 3.988394278153932e+01 +130 112 -6.996835383339678e-03 +130 113 -8.076052134892594e-03 +130 114 -9.403863770832827e-03 +130 115 -1.105916272470025e-02 +130 116 -1.315380302376546e-02 +130 117 -1.585023865775525e-02 +130 118 -1.939104886145111e-02 +130 119 -2.415034675252895e-02 +130 120 -3.072751892616543e-02 +130 121 -4.012781031912993e-02 +130 122 -5.413421453123170e-02 +130 123 -7.613960933881155e-02 +130 124 -1.132183869282763e-01 +130 125 -1.820810586422650e-01 +130 126 -3.301555353436754e-01 +130 127 -7.412185823610202e-01 +130 128 -3.165206906282869e+00 +130 129 -1.502055215864000e+01 +130 131 -1.502055215858804e+01 +130 132 -3.165206906282870e+00 +130 133 -7.412185823610192e-01 +130 134 -3.301555353436758e-01 +130 135 -1.820810586422650e-01 +130 136 -1.132183869282763e-01 +130 137 -7.613960933881167e-02 +130 138 -5.413421453123172e-02 +130 139 -4.012781031913001e-02 +130 140 -3.072751892616543e-02 +130 141 -2.415034675252897e-02 +130 142 -1.939104886145111e-02 +130 143 -1.585023865775527e-02 +130 144 -1.315380302376546e-02 +130 145 -1.105916272470025e-02 +130 146 -9.403863770832827e-03 +130 147 -8.076052134892594e-03 +130 148 -6.996835383339674e-03 +130 149 -6.109381318875749e-03 +130 150 -5.371977266379806e-03 +130 151 -4.753493624956896e-03 +130 152 -4.230349322908535e-03 +130 153 -3.784439171232924e-03 +130 154 -3.401691470521391e-03 +130 155 -3.071047067257393e-03 +130 156 -2.783725492315672e-03 +130 157 -2.532689975072680e-03 +130 158 -2.312252367280536e-03 +130 159 -2.117777896667795e-03 +131 131 3.988394278151441e+01 +131 112 -6.109381318875753e-03 +131 113 -6.996835383339674e-03 +131 114 -8.076052134892594e-03 +131 115 -9.403863770832827e-03 +131 116 -1.105916272470025e-02 +131 117 -1.315380302376546e-02 +131 118 -1.585023865775526e-02 +131 119 -1.939104886145110e-02 +131 120 -2.415034675252897e-02 +131 121 -3.072751892616542e-02 +131 122 -4.012781031912995e-02 +131 123 -5.413421453123168e-02 +131 124 -7.613960933881159e-02 +131 125 -1.132183869282764e-01 +131 126 -1.820810586422651e-01 +131 127 -3.301555353436779e-01 +131 128 -7.412185823610193e-01 +131 129 -3.165206906282867e+00 +131 130 -1.502055215858804e+01 +131 132 -1.502055215859654e+01 +131 133 -3.165206906282862e+00 +131 134 -7.412185823610153e-01 +131 135 -3.301555353436740e-01 +131 136 -1.820810586422645e-01 +131 137 -1.132183869282764e-01 +131 138 -7.613960933881171e-02 +131 139 -5.413421453123179e-02 +131 140 -4.012781031912996e-02 +131 141 -3.072751892616543e-02 +131 142 -2.415034675252897e-02 +131 143 -1.939104886145112e-02 +131 144 -1.585023865775526e-02 +131 145 -1.315380302376546e-02 +131 146 -1.105916272470025e-02 +131 147 -9.403863770832833e-03 +131 148 -8.076052134892594e-03 +131 149 -6.996835383339674e-03 +131 150 -6.109381318875749e-03 +131 151 -5.371977266379806e-03 +131 152 -4.753493624956900e-03 +131 153 -4.230349322908528e-03 +131 154 -3.784439171232924e-03 +131 155 -3.401691470521393e-03 +131 156 -3.071047067257393e-03 +131 157 -2.783725492315672e-03 +131 158 -2.532689975072680e-03 +131 159 -2.312252367280537e-03 +132 132 3.988394278151356e+01 +132 112 -5.371977266379809e-03 +132 113 -6.109381318875749e-03 +132 114 -6.996835383339674e-03 +132 115 -8.076052134892592e-03 +132 116 -9.403863770832830e-03 +132 117 -1.105916272470025e-02 +132 118 -1.315380302376546e-02 +132 119 -1.585023865775525e-02 +132 120 -1.939104886145111e-02 +132 121 -2.415034675252895e-02 +132 122 -3.072751892616543e-02 +132 123 -4.012781031912993e-02 +132 124 -5.413421453123170e-02 +132 125 -7.613960933881155e-02 +132 126 -1.132183869282763e-01 +132 127 -1.820810586422653e-01 +132 128 -3.301555353436751e-01 +132 129 -7.412185823610199e-01 +132 130 -3.165206906282870e+00 +132 131 -1.502055215859654e+01 +132 133 -1.502055215859221e+01 +132 134 -3.165206906282866e+00 +132 135 -7.412185823610178e-01 +132 136 -3.301555353436750e-01 +132 137 -1.820810586422651e-01 +132 138 -1.132183869282769e-01 +132 139 -7.613960933881182e-02 +132 140 -5.413421453123172e-02 +132 141 -4.012781031912996e-02 +132 142 -3.072751892616543e-02 +132 143 -2.415034675252899e-02 +132 144 -1.939104886145111e-02 +132 145 -1.585023865775526e-02 +132 146 -1.315380302376546e-02 +132 147 -1.105916272470026e-02 +132 148 -9.403863770832827e-03 +132 149 -8.076052134892594e-03 +132 150 -6.996835383339674e-03 +132 151 -6.109381318875749e-03 +132 152 -5.371977266379811e-03 +132 153 -4.753493624956892e-03 +132 154 -4.230349322908528e-03 +132 155 -3.784439171232927e-03 +132 156 -3.401691470521393e-03 +132 157 -3.071047067257393e-03 +132 158 -2.783725492315672e-03 +132 159 -2.532689975072681e-03 +133 133 3.988394278152494e+01 +133 112 -4.753493624956898e-03 +133 113 -5.371977266379806e-03 +133 114 -6.109381318875749e-03 +133 115 -6.996835383339671e-03 +133 116 -8.076052134892597e-03 +133 117 -9.403863770832827e-03 +133 118 -1.105916272470025e-02 +133 119 -1.315380302376546e-02 +133 120 -1.585023865775526e-02 +133 121 -1.939104886145110e-02 +133 122 -2.415034675252897e-02 +133 123 -3.072751892616542e-02 +133 124 -4.012781031912995e-02 +133 125 -5.413421453123168e-02 +133 126 -7.613960933881159e-02 +133 127 -1.132183869282763e-01 +133 128 -1.820810586422645e-01 +133 129 -3.301555353436754e-01 +133 130 -7.412185823610192e-01 +133 131 -3.165206906282862e+00 +133 132 -1.502055215859221e+01 +133 134 -1.502055215860532e+01 +133 135 -3.165206906282868e+00 +133 136 -7.412185823610156e-01 +133 137 -3.301555353436761e-01 +133 138 -1.820810586422658e-01 +133 139 -1.132183869282769e-01 +133 140 -7.613960933881167e-02 +133 141 -5.413421453123172e-02 +133 142 -4.012781031912996e-02 +133 143 -3.072751892616547e-02 +133 144 -2.415034675252897e-02 +133 145 -1.939104886145111e-02 +133 146 -1.585023865775526e-02 +133 147 -1.315380302376547e-02 +133 148 -1.105916272470025e-02 +133 149 -9.403863770832827e-03 +133 150 -8.076052134892594e-03 +133 151 -6.996835383339674e-03 +133 152 -6.109381318875754e-03 +133 153 -5.371977266379802e-03 +133 154 -4.753493624956891e-03 +133 155 -4.230349322908531e-03 +133 156 -3.784439171232927e-03 +133 157 -3.401691470521393e-03 +133 158 -3.071047067257393e-03 +133 159 -2.783725492315673e-03 +134 134 3.988394278128563e+01 +134 112 -4.230349322908533e-03 +134 113 -4.753493624956896e-03 +134 114 -5.371977266379806e-03 +134 115 -6.109381318875747e-03 +134 116 -6.996835383339678e-03 +134 117 -8.076052134892594e-03 +134 118 -9.403863770832827e-03 +134 119 -1.105916272470025e-02 +134 120 -1.315380302376546e-02 +134 121 -1.585023865775525e-02 +134 122 -1.939104886145111e-02 +134 123 -2.415034675252895e-02 +134 124 -3.072751892616543e-02 +134 125 -4.012781031912993e-02 +134 126 -5.413421453123170e-02 +134 127 -7.613960933881156e-02 +134 128 -1.132183869282765e-01 +134 129 -1.820810586422651e-01 +134 130 -3.301555353436758e-01 +134 131 -7.412185823610153e-01 +134 132 -3.165206906282866e+00 +134 133 -1.502055215860532e+01 +134 135 -1.502055215840047e+01 +134 136 -3.165206906282861e+00 +134 137 -7.412185823610231e-01 +134 138 -3.301555353436782e-01 +134 139 -1.820810586422655e-01 +134 140 -1.132183869282765e-01 +134 141 -7.613960933881157e-02 +134 142 -5.413421453123172e-02 +134 143 -4.012781031913001e-02 +134 144 -3.072751892616543e-02 +134 145 -2.415034675252897e-02 +134 146 -1.939104886145111e-02 +134 147 -1.585023865775527e-02 +134 148 -1.315380302376546e-02 +134 149 -1.105916272470025e-02 +134 150 -9.403863770832827e-03 +134 151 -8.076052134892597e-03 +134 152 -6.996835383339680e-03 +134 153 -6.109381318875744e-03 +134 154 -5.371977266379801e-03 +134 155 -4.753493624956896e-03 +134 156 -4.230349322908531e-03 +134 157 -3.784439171232927e-03 +134 158 -3.401691470521393e-03 +134 159 -3.071047067257394e-03 +135 135 3.988394278105613e+01 +135 112 -3.784439171232929e-03 +135 113 -4.230349322908531e-03 +135 114 -4.753493624956896e-03 +135 115 -5.371977266379805e-03 +135 116 -6.109381318875753e-03 +135 117 -6.996835383339674e-03 +135 118 -8.076052134892594e-03 +135 119 -9.403863770832827e-03 +135 120 -1.105916272470025e-02 +135 121 -1.315380302376546e-02 +135 122 -1.585023865775526e-02 +135 123 -1.939104886145110e-02 +135 124 -2.415034675252897e-02 +135 125 -3.072751892616542e-02 +135 126 -4.012781031912995e-02 +135 127 -5.413421453123168e-02 +135 128 -7.613960933881164e-02 +135 129 -1.132183869282765e-01 +135 130 -1.820810586422650e-01 +135 131 -3.301555353436740e-01 +135 132 -7.412185823610178e-01 +135 133 -3.165206906282868e+00 +135 134 -1.502055215840047e+01 +135 136 -1.502055215835490e+01 +135 137 -3.165206906282873e+00 +135 138 -7.412185823610241e-01 +135 139 -3.301555353436772e-01 +135 140 -1.820810586422660e-01 +135 141 -1.132183869282762e-01 +135 142 -7.613960933881163e-02 +135 143 -5.413421453123179e-02 +135 144 -4.012781031912996e-02 +135 145 -3.072751892616543e-02 +135 146 -2.415034675252897e-02 +135 147 -1.939104886145112e-02 +135 148 -1.585023865775526e-02 +135 149 -1.315380302376546e-02 +135 150 -1.105916272470025e-02 +135 151 -9.403863770832837e-03 +135 152 -8.076052134892601e-03 +135 153 -6.996835383339666e-03 +135 154 -6.109381318875744e-03 +135 155 -5.371977266379806e-03 +135 156 -4.753493624956896e-03 +135 157 -4.230349322908531e-03 +135 158 -3.784439171232927e-03 +135 159 -3.401691470521396e-03 +136 136 3.988394278102305e+01 +136 112 -3.401691470521395e-03 +136 113 -3.784439171232927e-03 +136 114 -4.230349322908531e-03 +136 115 -4.753493624956894e-03 +136 116 -5.371977266379808e-03 +136 117 -6.109381318875749e-03 +136 118 -6.996835383339674e-03 +136 119 -8.076052134892592e-03 +136 120 -9.403863770832827e-03 +136 121 -1.105916272470025e-02 +136 122 -1.315380302376546e-02 +136 123 -1.585023865775525e-02 +136 124 -1.939104886145111e-02 +136 125 -2.415034675252895e-02 +136 126 -3.072751892616543e-02 +136 127 -4.012781031912993e-02 +136 128 -5.413421453123169e-02 +136 129 -7.613960933881157e-02 +136 130 -1.132183869282763e-01 +136 131 -1.820810586422645e-01 +136 132 -3.301555353436750e-01 +136 133 -7.412185823610156e-01 +136 134 -3.165206906282861e+00 +136 135 -1.502055215835490e+01 +136 137 -1.502055215836222e+01 +136 138 -3.165206906282872e+00 +136 139 -7.412185823610226e-01 +136 140 -3.301555353436795e-01 +136 141 -1.820810586422653e-01 +136 142 -1.132183869282766e-01 +136 143 -7.613960933881173e-02 +136 144 -5.413421453123172e-02 +136 145 -4.012781031912996e-02 +136 146 -3.072751892616543e-02 +136 147 -2.415034675252899e-02 +136 148 -1.939104886145111e-02 +136 149 -1.585023865775526e-02 +136 150 -1.315380302376546e-02 +136 151 -1.105916272470027e-02 +136 152 -9.403863770832832e-03 +136 153 -8.076052134892590e-03 +136 154 -6.996835383339667e-03 +136 155 -6.109381318875749e-03 +136 156 -5.371977266379806e-03 +136 157 -4.753493624956896e-03 +136 158 -4.230349322908531e-03 +136 159 -3.784439171232930e-03 +137 137 3.988394278106477e+01 +137 112 -3.071047067257394e-03 +137 113 -3.401691470521393e-03 +137 114 -3.784439171232927e-03 +137 115 -4.230349322908529e-03 +137 116 -4.753493624956898e-03 +137 117 -5.371977266379806e-03 +137 118 -6.109381318875749e-03 +137 119 -6.996835383339671e-03 +137 120 -8.076052134892594e-03 +137 121 -9.403863770832827e-03 +137 122 -1.105916272470025e-02 +137 123 -1.315380302376546e-02 +137 124 -1.585023865775526e-02 +137 125 -1.939104886145110e-02 +137 126 -2.415034675252897e-02 +137 127 -3.072751892616542e-02 +137 128 -4.012781031912994e-02 +137 129 -5.413421453123172e-02 +137 130 -7.613960933881167e-02 +137 131 -1.132183869282764e-01 +137 132 -1.820810586422651e-01 +137 133 -3.301555353436761e-01 +137 134 -7.412185823610231e-01 +137 135 -3.165206906282873e+00 +137 136 -1.502055215836222e+01 +137 138 -1.502055215839541e+01 +137 139 -3.165206906282867e+00 +137 140 -7.412185823610210e-01 +137 141 -3.301555353436745e-01 +137 142 -1.820810586422646e-01 +137 143 -1.132183869282764e-01 +137 144 -7.613960933881164e-02 +137 145 -5.413421453123172e-02 +137 146 -4.012781031912996e-02 +137 147 -3.072751892616547e-02 +137 148 -2.415034675252897e-02 +137 149 -1.939104886145111e-02 +137 150 -1.585023865775526e-02 +137 151 -1.315380302376548e-02 +137 152 -1.105916272470025e-02 +137 153 -9.403863770832827e-03 +137 154 -8.076052134892590e-03 +137 155 -6.996835383339674e-03 +137 156 -6.109381318875749e-03 +137 157 -5.371977266379806e-03 +137 158 -4.753493624956896e-03 +137 159 -4.230349322908535e-03 +138 138 3.988394278115153e+01 +138 112 -2.783725492315673e-03 +138 113 -3.071047067257393e-03 +138 114 -3.401691470521393e-03 +138 115 -3.784439171232926e-03 +138 116 -4.230349322908533e-03 +138 117 -4.753493624956896e-03 +138 118 -5.371977266379806e-03 +138 119 -6.109381318875747e-03 +138 120 -6.996835383339674e-03 +138 121 -8.076052134892594e-03 +138 122 -9.403863770832827e-03 +138 123 -1.105916272470025e-02 +138 124 -1.315380302376546e-02 +138 125 -1.585023865775525e-02 +138 126 -1.939104886145111e-02 +138 127 -2.415034675252896e-02 +138 128 -3.072751892616542e-02 +138 129 -4.012781031912996e-02 +138 130 -5.413421453123172e-02 +138 131 -7.613960933881171e-02 +138 132 -1.132183869282769e-01 +138 133 -1.820810586422658e-01 +138 134 -3.301555353436782e-01 +138 135 -7.412185823610241e-01 +138 136 -3.165206906282872e+00 +138 137 -1.502055215839541e+01 +138 139 -1.502055215844907e+01 +138 140 -3.165206906282866e+00 +138 141 -7.412185823610190e-01 +138 142 -3.301555353436765e-01 +138 143 -1.820810586422649e-01 +138 144 -1.132183869282762e-01 +138 145 -7.613960933881157e-02 +138 146 -5.413421453123170e-02 +138 147 -4.012781031913000e-02 +138 148 -3.072751892616543e-02 +138 149 -2.415034675252896e-02 +138 150 -1.939104886145111e-02 +138 151 -1.585023865775528e-02 +138 152 -1.315380302376546e-02 +138 153 -1.105916272470025e-02 +138 154 -9.403863770832827e-03 +138 155 -8.076052134892597e-03 +138 156 -6.996835383339674e-03 +138 157 -6.109381318875749e-03 +138 158 -5.371977266379806e-03 +138 159 -4.753493624956900e-03 +139 139 3.988394278128114e+01 +139 112 -2.532689975072680e-03 +139 113 -2.783725492315672e-03 +139 114 -3.071047067257393e-03 +139 115 -3.401691470521392e-03 +139 116 -3.784439171232929e-03 +139 117 -4.230349322908531e-03 +139 118 -4.753493624956896e-03 +139 119 -5.371977266379804e-03 +139 120 -6.109381318875749e-03 +139 121 -6.996835383339674e-03 +139 122 -8.076052134892596e-03 +139 123 -9.403863770832835e-03 +139 124 -1.105916272470026e-02 +139 125 -1.315380302376547e-02 +139 126 -1.585023865775527e-02 +139 127 -1.939104886145112e-02 +139 128 -2.415034675252898e-02 +139 129 -3.072751892616547e-02 +139 130 -4.012781031913001e-02 +139 131 -5.413421453123179e-02 +139 132 -7.613960933881182e-02 +139 133 -1.132183869282769e-01 +139 134 -1.820810586422655e-01 +139 135 -3.301555353436772e-01 +139 136 -7.412185823610226e-01 +139 137 -3.165206906282867e+00 +139 138 -1.502055215844907e+01 +139 140 -1.502055215852575e+01 +139 141 -3.165206906282866e+00 +139 142 -7.412185823610201e-01 +139 143 -3.301555353436736e-01 +139 144 -1.820810586422640e-01 +139 145 -1.132183869282763e-01 +139 146 -7.613960933881155e-02 +139 147 -5.413421453123173e-02 +139 148 -4.012781031912990e-02 +139 149 -3.072751892616540e-02 +139 150 -2.415034675252894e-02 +139 151 -1.939104886145113e-02 +139 152 -1.585023865775524e-02 +139 153 -1.315380302376545e-02 +139 154 -1.105916272470025e-02 +139 155 -9.403863770832833e-03 +139 156 -8.076052134892594e-03 +139 157 -6.996835383339674e-03 +139 158 -6.109381318875749e-03 +139 159 -5.371977266379811e-03 +140 140 3.988394278146370e+01 +140 112 -2.312252367280536e-03 +140 113 -2.532689975072680e-03 +140 114 -2.783725492315672e-03 +140 115 -3.071047067257392e-03 +140 116 -3.401691470521395e-03 +140 117 -3.784439171232927e-03 +140 118 -4.230349322908531e-03 +140 119 -4.753493624956894e-03 +140 120 -5.371977266379806e-03 +140 121 -6.109381318875749e-03 +140 122 -6.996835383339671e-03 +140 123 -8.076052134892599e-03 +140 124 -9.403863770832827e-03 +140 125 -1.105916272470025e-02 +140 126 -1.315380302376546e-02 +140 127 -1.585023865775525e-02 +140 128 -1.939104886145110e-02 +140 129 -2.415034675252897e-02 +140 130 -3.072751892616543e-02 +140 131 -4.012781031912996e-02 +140 132 -5.413421453123172e-02 +140 133 -7.613960933881167e-02 +140 134 -1.132183869282765e-01 +140 135 -1.820810586422660e-01 +140 136 -3.301555353436795e-01 +140 137 -7.412185823610210e-01 +140 138 -3.165206906282866e+00 +140 139 -1.502055215852575e+01 +140 141 -1.502055215863300e+01 +140 142 -3.165206906282867e+00 +140 143 -7.412185823610162e-01 +140 144 -3.301555353436740e-01 +140 145 -1.820810586422654e-01 +140 146 -1.132183869282765e-01 +140 147 -7.613960933881177e-02 +140 148 -5.413421453123172e-02 +140 149 -4.012781031912996e-02 +140 150 -3.072751892616543e-02 +140 151 -2.415034675252901e-02 +140 152 -1.939104886145111e-02 +140 153 -1.585023865775526e-02 +140 154 -1.315380302376546e-02 +140 155 -1.105916272470027e-02 +140 156 -9.403863770832828e-03 +140 157 -8.076052134892594e-03 +140 158 -6.996835383339674e-03 +140 159 -6.109381318875755e-03 +141 141 3.988394278171953e+01 +141 112 -2.117777896667795e-03 +141 113 -2.312252367280536e-03 +141 114 -2.532689975072680e-03 +141 115 -2.783725492315671e-03 +141 116 -3.071047067257394e-03 +141 117 -3.401691470521393e-03 +141 118 -3.784439171232927e-03 +141 119 -4.230349322908529e-03 +141 120 -4.753493624956896e-03 +141 121 -5.371977266379806e-03 +141 122 -6.109381318875747e-03 +141 123 -6.996835383339678e-03 +141 124 -8.076052134892594e-03 +141 125 -9.403863770832827e-03 +141 126 -1.105916272470025e-02 +141 127 -1.315380302376546e-02 +141 128 -1.585023865775525e-02 +141 129 -1.939104886145111e-02 +141 130 -2.415034675252897e-02 +141 131 -3.072751892616543e-02 +141 132 -4.012781031912996e-02 +141 133 -5.413421453123172e-02 +141 134 -7.613960933881157e-02 +141 135 -1.132183869282762e-01 +141 136 -1.820810586422653e-01 +141 137 -3.301555353436745e-01 +141 138 -7.412185823610190e-01 +141 139 -3.165206906282866e+00 +141 140 -1.502055215863300e+01 +141 142 -1.502055215878375e+01 +141 143 -3.165206906282871e+00 +141 144 -7.412185823610201e-01 +141 145 -3.301555353436776e-01 +141 146 -1.820810586422653e-01 +141 147 -1.132183869282769e-01 +141 148 -7.613960933881177e-02 +141 149 -5.413421453123172e-02 +141 150 -4.012781031912996e-02 +141 151 -3.072751892616551e-02 +141 152 -2.415034675252897e-02 +141 153 -1.939104886145111e-02 +141 154 -1.585023865775526e-02 +141 155 -1.315380302376548e-02 +141 156 -1.105916272470025e-02 +141 157 -9.403863770832827e-03 +141 158 -8.076052134892594e-03 +141 159 -6.996835383339681e-03 +142 142 3.988394278208168e+01 +142 112 -1.945462087124854e-03 +142 113 -2.117777896667794e-03 +142 114 -2.312252367280536e-03 +142 115 -2.532689975072679e-03 +142 116 -2.783725492315673e-03 +142 117 -3.071047067257393e-03 +142 118 -3.401691470521393e-03 +142 119 -3.784439171232926e-03 +142 120 -4.230349322908531e-03 +142 121 -4.753493624956896e-03 +142 122 -5.371977266379805e-03 +142 123 -6.109381318875753e-03 +142 124 -6.996835383339674e-03 +142 125 -8.076052134892594e-03 +142 126 -9.403863770832827e-03 +142 127 -1.105916272470025e-02 +142 128 -1.315380302376546e-02 +142 129 -1.585023865775526e-02 +142 130 -1.939104886145111e-02 +142 131 -2.415034675252897e-02 +142 132 -3.072751892616543e-02 +142 133 -4.012781031912996e-02 +142 134 -5.413421453123172e-02 +142 135 -7.613960933881163e-02 +142 136 -1.132183869282766e-01 +142 137 -1.820810586422646e-01 +142 138 -3.301555353436765e-01 +142 139 -7.412185823610201e-01 +142 140 -3.165206906282867e+00 +142 141 -1.502055215878375e+01 +142 143 -1.502055215899860e+01 +142 144 -3.165206906282863e+00 +142 145 -7.412185823610188e-01 +142 146 -3.301555353436746e-01 +142 147 -1.820810586422655e-01 +142 148 -1.132183869282769e-01 +142 149 -7.613960933881175e-02 +142 150 -5.413421453123170e-02 +142 151 -4.012781031913006e-02 +142 152 -3.072751892616543e-02 +142 153 -2.415034675252896e-02 +142 154 -1.939104886145111e-02 +142 155 -1.585023865775528e-02 +142 156 -1.315380302376546e-02 +142 157 -1.105916272470025e-02 +142 158 -9.403863770832827e-03 +142 159 -8.076052134892606e-03 +143 143 3.988394278260304e+01 +143 112 -1.792160480940039e-03 +143 113 -1.945462087124853e-03 +143 114 -2.117777896667794e-03 +143 115 -2.312252367280535e-03 +143 116 -2.532689975072680e-03 +143 117 -2.783725492315672e-03 +143 118 -3.071047067257393e-03 +143 119 -3.401691470521392e-03 +143 120 -3.784439171232927e-03 +143 121 -4.230349322908531e-03 +143 122 -4.753493624956894e-03 +143 123 -5.371977266379808e-03 +143 124 -6.109381318875749e-03 +143 125 -6.996835383339674e-03 +143 126 -8.076052134892596e-03 +143 127 -9.403863770832832e-03 +143 128 -1.105916272470026e-02 +143 129 -1.315380302376547e-02 +143 130 -1.585023865775527e-02 +143 131 -1.939104886145112e-02 +143 132 -2.415034675252899e-02 +143 133 -3.072751892616547e-02 +143 134 -4.012781031913001e-02 +143 135 -5.413421453123179e-02 +143 136 -7.613960933881173e-02 +143 137 -1.132183869282764e-01 +143 138 -1.820810586422649e-01 +143 139 -3.301555353436736e-01 +143 140 -7.412185823610162e-01 +143 141 -3.165206906282871e+00 +143 142 -1.502055215899860e+01 +143 144 -1.502055215931065e+01 +143 145 -3.165206906282871e+00 +143 146 -7.412185823610209e-01 +143 147 -3.301555353436791e-01 +143 148 -1.820810586422662e-01 +143 149 -1.132183869282767e-01 +143 150 -7.613960933881160e-02 +143 151 -5.413421453123179e-02 +143 152 -4.012781031912991e-02 +143 153 -3.072751892616540e-02 +143 154 -2.415034675252894e-02 +143 155 -1.939104886145113e-02 +143 156 -1.585023865775524e-02 +143 157 -1.315380302376545e-02 +143 158 -1.105916272470025e-02 +143 159 -9.403863770832839e-03 +144 144 3.988394278260304e+01 +144 128 -9.403863770832827e-03 +144 129 -1.105916272470025e-02 +144 130 -1.315380302376546e-02 +144 131 -1.585023865775526e-02 +144 132 -1.939104886145111e-02 +144 133 -2.415034675252897e-02 +144 134 -3.072751892616543e-02 +144 135 -4.012781031912996e-02 +144 136 -5.413421453123172e-02 +144 137 -7.613960933881164e-02 +144 138 -1.132183869282762e-01 +144 139 -1.820810586422640e-01 +144 140 -3.301555353436740e-01 +144 141 -7.412185823610201e-01 +144 142 -3.165206906282863e+00 +144 143 -1.502055215931065e+01 +144 145 -1.502055215899861e+01 +144 146 -3.165206906282868e+00 +144 147 -7.412185823610226e-01 +144 148 -3.301555353436773e-01 +144 149 -1.820810586422656e-01 +144 150 -1.132183869282768e-01 +144 151 -7.613960933881184e-02 +144 152 -5.413421453123173e-02 +144 153 -4.012781031912996e-02 +144 154 -3.072751892616543e-02 +144 155 -2.415034675252901e-02 +144 156 -1.939104886145111e-02 +144 157 -1.585023865775526e-02 +144 158 -1.315380302376546e-02 +144 159 -1.105916272470027e-02 +144 160 -9.403863770832833e-03 +144 161 -8.076052134892587e-03 +144 162 -6.996835383339674e-03 +144 163 -6.109381318875749e-03 +144 164 -5.371977266379806e-03 +144 165 -4.753493624956896e-03 +144 166 -4.230349322908535e-03 +144 167 -3.784439171232930e-03 +144 168 -3.401691470521391e-03 +144 169 -3.071047067257393e-03 +144 170 -2.783725492315672e-03 +144 171 -2.532689975072680e-03 +144 172 -2.312252367280536e-03 +144 173 -2.117777896667795e-03 +144 174 -1.945462087124854e-03 +144 175 -1.792160480940037e-03 +145 145 3.988394278208168e+01 +145 128 -8.076052134892601e-03 +145 129 -9.403863770832832e-03 +145 130 -1.105916272470025e-02 +145 131 -1.315380302376546e-02 +145 132 -1.585023865775526e-02 +145 133 -1.939104886145111e-02 +145 134 -2.415034675252897e-02 +145 135 -3.072751892616543e-02 +145 136 -4.012781031912996e-02 +145 137 -5.413421453123172e-02 +145 138 -7.613960933881157e-02 +145 139 -1.132183869282763e-01 +145 140 -1.820810586422654e-01 +145 141 -3.301555353436776e-01 +145 142 -7.412185823610188e-01 +145 143 -3.165206906282871e+00 +145 144 -1.502055215899861e+01 +145 146 -1.502055215878373e+01 +145 147 -3.165206906282863e+00 +145 148 -7.412185823610203e-01 +145 149 -3.301555353436771e-01 +145 150 -1.820810586422654e-01 +145 151 -1.132183869282765e-01 +145 152 -7.613960933881168e-02 +145 153 -5.413421453123172e-02 +145 154 -4.012781031912996e-02 +145 155 -3.072751892616551e-02 +145 156 -2.415034675252897e-02 +145 157 -1.939104886145111e-02 +145 158 -1.585023865775526e-02 +145 159 -1.315380302376548e-02 +145 160 -1.105916272470025e-02 +145 161 -9.403863770832818e-03 +145 162 -8.076052134892587e-03 +145 163 -6.996835383339667e-03 +145 164 -6.109381318875745e-03 +145 165 -5.371977266379802e-03 +145 166 -4.753493624956896e-03 +145 167 -4.230349322908533e-03 +145 168 -3.784439171232922e-03 +145 169 -3.401691470521391e-03 +145 170 -3.071047067257391e-03 +145 171 -2.783725492315670e-03 +145 172 -2.532689975072678e-03 +145 173 -2.312252367280536e-03 +145 174 -2.117777896667794e-03 +145 175 -1.945462087124851e-03 +146 146 3.988394278171952e+01 +146 128 -6.996835383339666e-03 +146 129 -8.076052134892590e-03 +146 130 -9.403863770832827e-03 +146 131 -1.105916272470025e-02 +146 132 -1.315380302376546e-02 +146 133 -1.585023865775526e-02 +146 134 -1.939104886145111e-02 +146 135 -2.415034675252897e-02 +146 136 -3.072751892616543e-02 +146 137 -4.012781031912996e-02 +146 138 -5.413421453123170e-02 +146 139 -7.613960933881155e-02 +146 140 -1.132183869282765e-01 +146 141 -1.820810586422653e-01 +146 142 -3.301555353436746e-01 +146 143 -7.412185823610209e-01 +146 144 -3.165206906282868e+00 +146 145 -1.502055215878373e+01 +146 147 -1.502055215863301e+01 +146 148 -3.165206906282872e+00 +146 149 -7.412185823610209e-01 +146 150 -3.301555353436758e-01 +146 151 -1.820810586422653e-01 +146 152 -1.132183869282766e-01 +146 153 -7.613960933881171e-02 +146 154 -5.413421453123170e-02 +146 155 -4.012781031913006e-02 +146 156 -3.072751892616543e-02 +146 157 -2.415034675252896e-02 +146 158 -1.939104886145111e-02 +146 159 -1.585023865775528e-02 +146 160 -1.315380302376546e-02 +146 161 -1.105916272470023e-02 +146 162 -9.403863770832821e-03 +146 163 -8.076052134892599e-03 +146 164 -6.996835383339681e-03 +146 165 -6.109381318875755e-03 +146 166 -5.371977266379815e-03 +146 167 -4.753493624956904e-03 +146 168 -4.230349322908532e-03 +146 169 -3.784439171232930e-03 +146 170 -3.401691470521396e-03 +146 171 -3.071047067257395e-03 +146 172 -2.783725492315674e-03 +146 173 -2.532689975072683e-03 +146 174 -2.312252367280539e-03 +146 175 -2.117777896667794e-03 +147 147 3.988394278146370e+01 +147 128 -6.109381318875744e-03 +147 129 -6.996835383339667e-03 +147 130 -8.076052134892594e-03 +147 131 -9.403863770832833e-03 +147 132 -1.105916272470026e-02 +147 133 -1.315380302376547e-02 +147 134 -1.585023865775527e-02 +147 135 -1.939104886145112e-02 +147 136 -2.415034675252899e-02 +147 137 -3.072751892616547e-02 +147 138 -4.012781031913000e-02 +147 139 -5.413421453123173e-02 +147 140 -7.613960933881177e-02 +147 141 -1.132183869282769e-01 +147 142 -1.820810586422655e-01 +147 143 -3.301555353436791e-01 +147 144 -7.412185823610226e-01 +147 145 -3.165206906282863e+00 +147 146 -1.502055215863301e+01 +147 148 -1.502055215852575e+01 +147 149 -3.165206906282864e+00 +147 150 -7.412185823610182e-01 +147 151 -3.301555353436763e-01 +147 152 -1.820810586422646e-01 +147 153 -1.132183869282766e-01 +147 154 -7.613960933881161e-02 +147 155 -5.413421453123179e-02 +147 156 -4.012781031912991e-02 +147 157 -3.072751892616540e-02 +147 158 -2.415034675252894e-02 +147 159 -1.939104886145113e-02 +147 160 -1.585023865775524e-02 +147 161 -1.315380302376543e-02 +147 162 -1.105916272470023e-02 +147 163 -9.403863770832820e-03 +147 164 -8.076052134892604e-03 +147 165 -6.996835383339681e-03 +147 166 -6.109381318875761e-03 +147 167 -5.371977266379816e-03 +147 168 -4.753493624956896e-03 +147 169 -4.230349322908535e-03 +147 170 -3.784439171232930e-03 +147 171 -3.401691470521395e-03 +147 172 -3.071047067257394e-03 +147 173 -2.783725492315676e-03 +147 174 -2.532689975072683e-03 +147 175 -2.312252367280536e-03 +148 148 3.988394278128112e+01 +148 128 -5.371977266379806e-03 +148 129 -6.109381318875749e-03 +148 130 -6.996835383339674e-03 +148 131 -8.076052134892594e-03 +148 132 -9.403863770832827e-03 +148 133 -1.105916272470025e-02 +148 134 -1.315380302376546e-02 +148 135 -1.585023865775526e-02 +148 136 -1.939104886145111e-02 +148 137 -2.415034675252897e-02 +148 138 -3.072751892616543e-02 +148 139 -4.012781031912990e-02 +148 140 -5.413421453123172e-02 +148 141 -7.613960933881177e-02 +148 142 -1.132183869282769e-01 +148 143 -1.820810586422662e-01 +148 144 -3.301555353436773e-01 +148 145 -7.412185823610203e-01 +148 146 -3.165206906282872e+00 +148 147 -1.502055215852575e+01 +148 149 -1.502055215844907e+01 +148 150 -3.165206906282865e+00 +148 151 -7.412185823610186e-01 +148 152 -3.301555353436738e-01 +148 153 -1.820810586422644e-01 +148 154 -1.132183869282765e-01 +148 155 -7.613960933881185e-02 +148 156 -5.413421453123173e-02 +148 157 -4.012781031912996e-02 +148 158 -3.072751892616543e-02 +148 159 -2.415034675252902e-02 +148 160 -1.939104886145111e-02 +148 161 -1.585023865775523e-02 +148 162 -1.315380302376544e-02 +148 163 -1.105916272470023e-02 +148 164 -9.403863770832827e-03 +148 165 -8.076052134892590e-03 +148 166 -6.996835383339681e-03 +148 167 -6.109381318875754e-03 +148 168 -5.371977266379802e-03 +148 169 -4.753493624956896e-03 +148 170 -4.230349322908531e-03 +148 171 -3.784439171232927e-03 +148 172 -3.401691470521393e-03 +148 173 -3.071047067257394e-03 +148 174 -2.783725492315674e-03 +148 175 -2.532689975072678e-03 +149 149 3.988394278115153e+01 +149 128 -4.753493624956896e-03 +149 129 -5.371977266379806e-03 +149 130 -6.109381318875749e-03 +149 131 -6.996835383339674e-03 +149 132 -8.076052134892594e-03 +149 133 -9.403863770832827e-03 +149 134 -1.105916272470025e-02 +149 135 -1.315380302376546e-02 +149 136 -1.585023865775526e-02 +149 137 -1.939104886145111e-02 +149 138 -2.415034675252896e-02 +149 139 -3.072751892616540e-02 +149 140 -4.012781031912996e-02 +149 141 -5.413421453123172e-02 +149 142 -7.613960933881175e-02 +149 143 -1.132183869282767e-01 +149 144 -1.820810586422656e-01 +149 145 -3.301555353436771e-01 +149 146 -7.412185823610209e-01 +149 147 -3.165206906282864e+00 +149 148 -1.502055215844907e+01 +149 150 -1.502055215839541e+01 +149 151 -3.165206906282865e+00 +149 152 -7.412185823610190e-01 +149 153 -3.301555353436755e-01 +149 154 -1.820810586422651e-01 +149 155 -1.132183869282766e-01 +149 156 -7.613960933881163e-02 +149 157 -5.413421453123172e-02 +149 158 -4.012781031912996e-02 +149 159 -3.072751892616551e-02 +149 160 -2.415034675252897e-02 +149 161 -1.939104886145107e-02 +149 162 -1.585023865775523e-02 +149 163 -1.315380302376544e-02 +149 164 -1.105916272470024e-02 +149 165 -9.403863770832818e-03 +149 166 -8.076052134892601e-03 +149 167 -6.996835383339681e-03 +149 168 -6.109381318875744e-03 +149 169 -5.371977266379806e-03 +149 170 -4.753493624956896e-03 +149 171 -4.230349322908531e-03 +149 172 -3.784439171232927e-03 +149 173 -3.401691470521396e-03 +149 174 -3.071047067257395e-03 +149 175 -2.783725492315670e-03 +150 150 3.988394278106475e+01 +150 128 -4.230349322908531e-03 +150 129 -4.753493624956896e-03 +150 130 -5.371977266379806e-03 +150 131 -6.109381318875749e-03 +150 132 -6.996835383339674e-03 +150 133 -8.076052134892594e-03 +150 134 -9.403863770832827e-03 +150 135 -1.105916272470025e-02 +150 136 -1.315380302376546e-02 +150 137 -1.585023865775526e-02 +150 138 -1.939104886145111e-02 +150 139 -2.415034675252894e-02 +150 140 -3.072751892616543e-02 +150 141 -4.012781031912996e-02 +150 142 -5.413421453123170e-02 +150 143 -7.613960933881160e-02 +150 144 -1.132183869282768e-01 +150 145 -1.820810586422654e-01 +150 146 -3.301555353436758e-01 +150 147 -7.412185823610182e-01 +150 148 -3.165206906282865e+00 +150 149 -1.502055215839541e+01 +150 151 -1.502055215836221e+01 +150 152 -3.165206906282865e+00 +150 153 -7.412185823610179e-01 +150 154 -3.301555353436749e-01 +150 155 -1.820810586422645e-01 +150 156 -1.132183869282763e-01 +150 157 -7.613960933881167e-02 +150 158 -5.413421453123170e-02 +150 159 -4.012781031913006e-02 +150 160 -3.072751892616543e-02 +150 161 -2.415034675252891e-02 +150 162 -1.939104886145107e-02 +150 163 -1.585023865775523e-02 +150 164 -1.315380302376545e-02 +150 165 -1.105916272470023e-02 +150 166 -9.403863770832821e-03 +150 167 -8.076052134892599e-03 +150 168 -6.996835383339669e-03 +150 169 -6.109381318875749e-03 +150 170 -5.371977266379806e-03 +150 171 -4.753493624956896e-03 +150 172 -4.230349322908531e-03 +150 173 -3.784439171232930e-03 +150 174 -3.401691470521396e-03 +150 175 -3.071047067257391e-03 +151 151 3.988394278102303e+01 +151 128 -3.784439171232927e-03 +151 129 -4.230349322908531e-03 +151 130 -4.753493624956896e-03 +151 131 -5.371977266379806e-03 +151 132 -6.109381318875749e-03 +151 133 -6.996835383339674e-03 +151 134 -8.076052134892597e-03 +151 135 -9.403863770832837e-03 +151 136 -1.105916272470027e-02 +151 137 -1.315380302376548e-02 +151 138 -1.585023865775528e-02 +151 139 -1.939104886145113e-02 +151 140 -2.415034675252901e-02 +151 141 -3.072751892616551e-02 +151 142 -4.012781031913006e-02 +151 143 -5.413421453123179e-02 +151 144 -7.613960933881184e-02 +151 145 -1.132183869282765e-01 +151 146 -1.820810586422653e-01 +151 147 -3.301555353436763e-01 +151 148 -7.412185823610186e-01 +151 149 -3.165206906282865e+00 +151 150 -1.502055215836221e+01 +151 152 -1.502055215835490e+01 +151 153 -3.165206906282864e+00 +151 154 -7.412185823610147e-01 +151 155 -3.301555353436743e-01 +151 156 -1.820810586422652e-01 +151 157 -1.132183869282766e-01 +151 158 -7.613960933881156e-02 +151 159 -5.413421453123173e-02 +151 160 -4.012781031912985e-02 +151 161 -3.072751892616529e-02 +151 162 -2.415034675252886e-02 +151 163 -1.939104886145104e-02 +151 164 -1.585023865775521e-02 +151 165 -1.315380302376542e-02 +151 166 -1.105916272470022e-02 +151 167 -9.403863770832813e-03 +151 168 -8.076052134892587e-03 +151 169 -6.996835383339674e-03 +151 170 -6.109381318875749e-03 +151 171 -5.371977266379806e-03 +151 172 -4.753493624956896e-03 +151 173 -4.230349322908535e-03 +151 174 -3.784439171232930e-03 +151 175 -3.401691470521391e-03 +152 152 3.988394278105613e+01 +152 128 -3.401691470521395e-03 +152 129 -3.784439171232929e-03 +152 130 -4.230349322908535e-03 +152 131 -4.753493624956900e-03 +152 132 -5.371977266379811e-03 +152 133 -6.109381318875754e-03 +152 134 -6.996835383339680e-03 +152 135 -8.076052134892601e-03 +152 136 -9.403863770832832e-03 +152 137 -1.105916272470025e-02 +152 138 -1.315380302376546e-02 +152 139 -1.585023865775524e-02 +152 140 -1.939104886145111e-02 +152 141 -2.415034675252897e-02 +152 142 -3.072751892616543e-02 +152 143 -4.012781031912991e-02 +152 144 -5.413421453123173e-02 +152 145 -7.613960933881168e-02 +152 146 -1.132183869282766e-01 +152 147 -1.820810586422646e-01 +152 148 -3.301555353436738e-01 +152 149 -7.412185823610190e-01 +152 150 -3.165206906282865e+00 +152 151 -1.502055215835490e+01 +152 153 -1.502055215840047e+01 +152 154 -3.165206906282868e+00 +152 155 -7.412185823610238e-01 +152 156 -3.301555353436777e-01 +152 157 -1.820810586422652e-01 +152 158 -1.132183869282766e-01 +152 159 -7.613960933881189e-02 +152 160 -5.413421453123171e-02 +152 161 -4.012781031912985e-02 +152 162 -3.072751892616536e-02 +152 163 -2.415034675252891e-02 +152 164 -1.939104886145109e-02 +152 165 -1.585023865775522e-02 +152 166 -1.315380302376544e-02 +152 167 -1.105916272470023e-02 +152 168 -9.403863770832827e-03 +152 169 -8.076052134892587e-03 +152 170 -6.996835383339667e-03 +152 171 -6.109381318875745e-03 +152 172 -5.371977266379802e-03 +152 173 -4.753493624956896e-03 +152 174 -4.230349322908533e-03 +152 175 -3.784439171232922e-03 +153 153 3.988394278128563e+01 +153 128 -3.071047067257391e-03 +153 129 -3.401691470521391e-03 +153 130 -3.784439171232924e-03 +153 131 -4.230349322908528e-03 +153 132 -4.753493624956892e-03 +153 133 -5.371977266379802e-03 +153 134 -6.109381318875744e-03 +153 135 -6.996835383339666e-03 +153 136 -8.076052134892590e-03 +153 137 -9.403863770832827e-03 +153 138 -1.105916272470025e-02 +153 139 -1.315380302376545e-02 +153 140 -1.585023865775526e-02 +153 141 -1.939104886145111e-02 +153 142 -2.415034675252896e-02 +153 143 -3.072751892616540e-02 +153 144 -4.012781031912996e-02 +153 145 -5.413421453123172e-02 +153 146 -7.613960933881171e-02 +153 147 -1.132183869282766e-01 +153 148 -1.820810586422644e-01 +153 149 -3.301555353436755e-01 +153 150 -7.412185823610179e-01 +153 151 -3.165206906282864e+00 +153 152 -1.502055215840047e+01 +153 154 -1.502055215860532e+01 +153 155 -3.165206906282872e+00 +153 156 -7.412185823610205e-01 +153 157 -3.301555353436766e-01 +153 158 -1.820810586422652e-01 +153 159 -1.132183869282766e-01 +153 160 -7.613960933881159e-02 +153 161 -5.413421453123156e-02 +153 162 -4.012781031912985e-02 +153 163 -3.072751892616537e-02 +153 164 -2.415034675252894e-02 +153 165 -1.939104886145107e-02 +153 166 -1.585023865775523e-02 +153 167 -1.315380302376544e-02 +153 168 -1.105916272470024e-02 +153 169 -9.403863770832823e-03 +153 170 -8.076052134892599e-03 +153 171 -6.996835383339681e-03 +153 172 -6.109381318875755e-03 +153 173 -5.371977266379815e-03 +153 174 -4.753493624956904e-03 +153 175 -4.230349322908532e-03 +154 154 3.988394278152495e+01 +154 128 -2.783725492315670e-03 +154 129 -3.071047067257390e-03 +154 130 -3.401691470521391e-03 +154 131 -3.784439171232924e-03 +154 132 -4.230349322908528e-03 +154 133 -4.753493624956891e-03 +154 134 -5.371977266379801e-03 +154 135 -6.109381318875744e-03 +154 136 -6.996835383339667e-03 +154 137 -8.076052134892590e-03 +154 138 -9.403863770832827e-03 +154 139 -1.105916272470025e-02 +154 140 -1.315380302376546e-02 +154 141 -1.585023865775526e-02 +154 142 -1.939104886145111e-02 +154 143 -2.415034675252894e-02 +154 144 -3.072751892616543e-02 +154 145 -4.012781031912996e-02 +154 146 -5.413421453123170e-02 +154 147 -7.613960933881161e-02 +154 148 -1.132183869282765e-01 +154 149 -1.820810586422651e-01 +154 150 -3.301555353436749e-01 +154 151 -7.412185823610147e-01 +154 152 -3.165206906282868e+00 +154 153 -1.502055215860532e+01 +154 155 -1.502055215859221e+01 +154 156 -3.165206906282865e+00 +154 157 -7.412185823610244e-01 +154 158 -3.301555353436794e-01 +154 159 -1.820810586422654e-01 +154 160 -1.132183869282764e-01 +154 161 -7.613960933881132e-02 +154 162 -5.413421453123154e-02 +154 163 -4.012781031912985e-02 +154 164 -3.072751892616540e-02 +154 165 -2.415034675252891e-02 +154 166 -1.939104886145107e-02 +154 167 -1.585023865775523e-02 +154 168 -1.315380302376545e-02 +154 169 -1.105916272470023e-02 +154 170 -9.403863770832821e-03 +154 171 -8.076052134892601e-03 +154 172 -6.996835383339681e-03 +154 173 -6.109381318875761e-03 +154 174 -5.371977266379816e-03 +154 175 -4.753493624956896e-03 +155 155 3.988394278151357e+01 +155 128 -2.532689975072680e-03 +155 129 -2.783725492315672e-03 +155 130 -3.071047067257393e-03 +155 131 -3.401691470521393e-03 +155 132 -3.784439171232927e-03 +155 133 -4.230349322908531e-03 +155 134 -4.753493624956896e-03 +155 135 -5.371977266379806e-03 +155 136 -6.109381318875749e-03 +155 137 -6.996835383339674e-03 +155 138 -8.076052134892597e-03 +155 139 -9.403863770832833e-03 +155 140 -1.105916272470027e-02 +155 141 -1.315380302376548e-02 +155 142 -1.585023865775528e-02 +155 143 -1.939104886145113e-02 +155 144 -2.415034675252901e-02 +155 145 -3.072751892616551e-02 +155 146 -4.012781031913006e-02 +155 147 -5.413421453123179e-02 +155 148 -7.613960933881185e-02 +155 149 -1.132183869282766e-01 +155 150 -1.820810586422645e-01 +155 151 -3.301555353436743e-01 +155 152 -7.412185823610238e-01 +155 153 -3.165206906282872e+00 +155 154 -1.502055215859221e+01 +155 156 -1.502055215859652e+01 +155 157 -3.165206906282870e+00 +155 158 -7.412185823610223e-01 +155 159 -3.301555353436746e-01 +155 160 -1.820810586422648e-01 +155 161 -1.132183869282758e-01 +155 162 -7.613960933881121e-02 +155 163 -5.413421453123141e-02 +155 164 -4.012781031912980e-02 +155 165 -3.072751892616529e-02 +155 166 -2.415034675252886e-02 +155 167 -1.939104886145104e-02 +155 168 -1.585023865775521e-02 +155 169 -1.315380302376542e-02 +155 170 -1.105916272470022e-02 +155 171 -9.403863770832807e-03 +155 172 -8.076052134892590e-03 +155 173 -6.996835383339681e-03 +155 174 -6.109381318875754e-03 +155 175 -5.371977266379802e-03 +156 156 3.988394278151442e+01 +156 128 -2.312252367280536e-03 +156 129 -2.532689975072680e-03 +156 130 -2.783725492315672e-03 +156 131 -3.071047067257393e-03 +156 132 -3.401691470521393e-03 +156 133 -3.784439171232927e-03 +156 134 -4.230349322908531e-03 +156 135 -4.753493624956896e-03 +156 136 -5.371977266379806e-03 +156 137 -6.109381318875749e-03 +156 138 -6.996835383339674e-03 +156 139 -8.076052134892594e-03 +156 140 -9.403863770832828e-03 +156 141 -1.105916272470025e-02 +156 142 -1.315380302376546e-02 +156 143 -1.585023865775524e-02 +156 144 -1.939104886145111e-02 +156 145 -2.415034675252897e-02 +156 146 -3.072751892616543e-02 +156 147 -4.012781031912991e-02 +156 148 -5.413421453123173e-02 +156 149 -7.613960933881163e-02 +156 150 -1.132183869282763e-01 +156 151 -1.820810586422652e-01 +156 152 -3.301555353436777e-01 +156 153 -7.412185823610205e-01 +156 154 -3.165206906282865e+00 +156 155 -1.502055215859652e+01 +156 157 -1.502055215858804e+01 +156 158 -3.165206906282870e+00 +156 159 -7.412185823610173e-01 +156 160 -3.301555353436771e-01 +156 161 -1.820810586422648e-01 +156 162 -1.132183869282762e-01 +156 163 -7.613960933881143e-02 +156 164 -5.413421453123163e-02 +156 165 -4.012781031912985e-02 +156 166 -3.072751892616536e-02 +156 167 -2.415034675252891e-02 +156 168 -1.939104886145109e-02 +156 169 -1.585023865775522e-02 +156 170 -1.315380302376544e-02 +156 171 -1.105916272470023e-02 +156 172 -9.403863770832827e-03 +156 173 -8.076052134892601e-03 +156 174 -6.996835383339681e-03 +156 175 -6.109381318875744e-03 +157 157 3.988394278153932e+01 +157 128 -2.117777896667794e-03 +157 129 -2.312252367280536e-03 +157 130 -2.532689975072680e-03 +157 131 -2.783725492315672e-03 +157 132 -3.071047067257393e-03 +157 133 -3.401691470521393e-03 +157 134 -3.784439171232927e-03 +157 135 -4.230349322908531e-03 +157 136 -4.753493624956896e-03 +157 137 -5.371977266379806e-03 +157 138 -6.109381318875749e-03 +157 139 -6.996835383339674e-03 +157 140 -8.076052134892594e-03 +157 141 -9.403863770832827e-03 +157 142 -1.105916272470025e-02 +157 143 -1.315380302376545e-02 +157 144 -1.585023865775526e-02 +157 145 -1.939104886145111e-02 +157 146 -2.415034675252896e-02 +157 147 -3.072751892616540e-02 +157 148 -4.012781031912996e-02 +157 149 -5.413421453123172e-02 +157 150 -7.613960933881167e-02 +157 151 -1.132183869282766e-01 +157 152 -1.820810586422652e-01 +157 153 -3.301555353436766e-01 +157 154 -7.412185823610244e-01 +157 155 -3.165206906282870e+00 +157 156 -1.502055215858804e+01 +157 158 -1.502055215864000e+01 +157 159 -3.165206906282863e+00 +157 160 -7.412185823610190e-01 +157 161 -3.301555353436738e-01 +157 162 -1.820810586422639e-01 +157 163 -1.132183869282762e-01 +157 164 -7.613960933881150e-02 +157 165 -5.413421453123156e-02 +157 166 -4.012781031912985e-02 +157 167 -3.072751892616537e-02 +157 168 -2.415034675252894e-02 +157 169 -1.939104886145107e-02 +157 170 -1.585023865775523e-02 +157 171 -1.315380302376544e-02 +157 172 -1.105916272470024e-02 +157 173 -9.403863770832823e-03 +157 174 -8.076052134892601e-03 +157 175 -6.996835383339669e-03 +158 158 3.988394278164019e+01 +158 128 -1.945462087124853e-03 +158 129 -2.117777896667794e-03 +158 130 -2.312252367280536e-03 +158 131 -2.532689975072680e-03 +158 132 -2.783725492315672e-03 +158 133 -3.071047067257393e-03 +158 134 -3.401691470521393e-03 +158 135 -3.784439171232927e-03 +158 136 -4.230349322908531e-03 +158 137 -4.753493624956896e-03 +158 138 -5.371977266379806e-03 +158 139 -6.109381318875749e-03 +158 140 -6.996835383339674e-03 +158 141 -8.076052134892594e-03 +158 142 -9.403863770832827e-03 +158 143 -1.105916272470025e-02 +158 144 -1.315380302376546e-02 +158 145 -1.585023865775526e-02 +158 146 -1.939104886145111e-02 +158 147 -2.415034675252894e-02 +158 148 -3.072751892616543e-02 +158 149 -4.012781031912996e-02 +158 150 -5.413421453123170e-02 +158 151 -7.613960933881156e-02 +158 152 -1.132183869282766e-01 +158 153 -1.820810586422652e-01 +158 154 -3.301555353436794e-01 +158 155 -7.412185823610223e-01 +158 156 -3.165206906282870e+00 +158 157 -1.502055215864000e+01 +158 159 -1.502055215866000e+01 +158 160 -3.165206906282866e+00 +158 161 -7.412185823610180e-01 +158 162 -3.301555353436741e-01 +158 163 -1.820810586422648e-01 +158 164 -1.132183869282761e-01 +158 165 -7.613960933881132e-02 +158 166 -5.413421453123154e-02 +158 167 -4.012781031912985e-02 +158 168 -3.072751892616540e-02 +158 169 -2.415034675252891e-02 +158 170 -1.939104886145107e-02 +158 171 -1.585023865775523e-02 +158 172 -1.315380302376545e-02 +158 173 -1.105916272470023e-02 +158 174 -9.403863770832821e-03 +158 175 -8.076052134892587e-03 +159 159 3.988394278169703e+01 +159 128 -1.792160480940039e-03 +159 129 -1.945462087124854e-03 +159 130 -2.117777896667795e-03 +159 131 -2.312252367280537e-03 +159 132 -2.532689975072681e-03 +159 133 -2.783725492315673e-03 +159 134 -3.071047067257394e-03 +159 135 -3.401691470521396e-03 +159 136 -3.784439171232930e-03 +159 137 -4.230349322908535e-03 +159 138 -4.753493624956900e-03 +159 139 -5.371977266379811e-03 +159 140 -6.109381318875755e-03 +159 141 -6.996835383339681e-03 +159 142 -8.076052134892606e-03 +159 143 -9.403863770832839e-03 +159 144 -1.105916272470027e-02 +159 145 -1.315380302376548e-02 +159 146 -1.585023865775528e-02 +159 147 -1.939104886145113e-02 +159 148 -2.415034675252902e-02 +159 149 -3.072751892616551e-02 +159 150 -4.012781031913006e-02 +159 151 -5.413421453123173e-02 +159 152 -7.613960933881189e-02 +159 153 -1.132183869282766e-01 +159 154 -1.820810586422654e-01 +159 155 -3.301555353436746e-01 +159 156 -7.412185823610173e-01 +159 157 -3.165206906282863e+00 +159 158 -1.502055215866000e+01 +159 160 -1.502055215931066e+01 +159 161 -3.165206906282866e+00 +159 162 -7.412185823610203e-01 +159 163 -3.301555353436770e-01 +159 164 -1.820810586422646e-01 +159 165 -1.132183869282758e-01 +159 166 -7.613960933881114e-02 +159 167 -5.413421453123139e-02 +159 168 -4.012781031912979e-02 +159 169 -3.072751892616529e-02 +159 170 -2.415034675252886e-02 +159 171 -1.939104886145103e-02 +159 172 -1.585023865775521e-02 +159 173 -1.315380302376542e-02 +159 174 -1.105916272470022e-02 +159 175 -9.403863770832806e-03 +160 160 3.988394278169705e+01 +160 144 -9.403863770832833e-03 +160 145 -1.105916272470025e-02 +160 146 -1.315380302376546e-02 +160 147 -1.585023865775524e-02 +160 148 -1.939104886145111e-02 +160 149 -2.415034675252897e-02 +160 150 -3.072751892616543e-02 +160 151 -4.012781031912985e-02 +160 152 -5.413421453123171e-02 +160 153 -7.613960933881159e-02 +160 154 -1.132183869282764e-01 +160 155 -1.820810586422648e-01 +160 156 -3.301555353436771e-01 +160 157 -7.412185823610190e-01 +160 158 -3.165206906282866e+00 +160 159 -1.502055215931066e+01 +160 161 -1.502055215866000e+01 +160 162 -3.165206906282864e+00 +160 163 -7.412185823610176e-01 +160 164 -3.301555353436744e-01 +160 165 -1.820810586422646e-01 +160 166 -1.132183869282759e-01 +160 167 -7.613960933881138e-02 +160 168 -5.413421453123168e-02 +160 169 -4.012781031912988e-02 +160 170 -3.072751892616538e-02 +160 171 -2.415034675252893e-02 +160 172 -1.939104886145110e-02 +160 173 -1.585023865775523e-02 +160 174 -1.315380302376544e-02 +160 175 -1.105916272470024e-02 +160 176 -9.403863770832833e-03 +160 177 -8.076052134892590e-03 +160 178 -6.996835383339667e-03 +160 179 -6.109381318875745e-03 +160 180 -5.371977266379805e-03 +160 181 -4.753493624956895e-03 +160 182 -4.230349322908526e-03 +160 183 -3.784439171232924e-03 +160 184 -3.401691470521391e-03 +160 185 -3.071047067257390e-03 +160 186 -2.783725492315670e-03 +160 187 -2.532689975072680e-03 +160 188 -2.312252367280536e-03 +160 189 -2.117777896667791e-03 +160 190 -1.945462087124852e-03 +160 191 -1.792160480940037e-03 +161 161 3.988394278164021e+01 +161 144 -8.076052134892587e-03 +161 145 -9.403863770832818e-03 +161 146 -1.105916272470023e-02 +161 147 -1.315380302376543e-02 +161 148 -1.585023865775523e-02 +161 149 -1.939104886145107e-02 +161 150 -2.415034675252891e-02 +161 151 -3.072751892616529e-02 +161 152 -4.012781031912985e-02 +161 153 -5.413421453123156e-02 +161 154 -7.613960933881132e-02 +161 155 -1.132183869282758e-01 +161 156 -1.820810586422648e-01 +161 157 -3.301555353436738e-01 +161 158 -7.412185823610180e-01 +161 159 -3.165206906282866e+00 +161 160 -1.502055215866000e+01 +161 162 -1.502055215864001e+01 +161 163 -3.165206906282866e+00 +161 164 -7.412185823610221e-01 +161 165 -3.301555353436781e-01 +161 166 -1.820810586422656e-01 +161 167 -1.132183869282766e-01 +161 168 -7.613960933881175e-02 +161 169 -5.413421453123172e-02 +161 170 -4.012781031912996e-02 +161 171 -3.072751892616544e-02 +161 172 -2.415034675252899e-02 +161 173 -1.939104886145111e-02 +161 174 -1.585023865775526e-02 +161 175 -1.315380302376546e-02 +161 176 -1.105916272470027e-02 +161 177 -9.403863770832833e-03 +161 178 -8.076052134892604e-03 +161 179 -6.996835383339681e-03 +161 180 -6.109381318875761e-03 +161 181 -5.371977266379814e-03 +161 182 -4.753493624956896e-03 +161 183 -4.230349322908535e-03 +161 184 -3.784439171232929e-03 +161 185 -3.401691470521395e-03 +161 186 -3.071047067257394e-03 +161 187 -2.783725492315675e-03 +161 188 -2.532689975072683e-03 +161 189 -2.312252367280536e-03 +161 190 -2.117777896667795e-03 +161 191 -1.945462087124854e-03 +162 162 3.988394278153931e+01 +162 144 -6.996835383339674e-03 +162 145 -8.076052134892587e-03 +162 146 -9.403863770832821e-03 +162 147 -1.105916272470023e-02 +162 148 -1.315380302376544e-02 +162 149 -1.585023865775523e-02 +162 150 -1.939104886145107e-02 +162 151 -2.415034675252886e-02 +162 152 -3.072751892616536e-02 +162 153 -4.012781031912985e-02 +162 154 -5.413421453123154e-02 +162 155 -7.613960933881121e-02 +162 156 -1.132183869282762e-01 +162 157 -1.820810586422639e-01 +162 158 -3.301555353436741e-01 +162 159 -7.412185823610203e-01 +162 160 -3.165206906282864e+00 +162 161 -1.502055215864001e+01 +162 163 -1.502055215858803e+01 +162 164 -3.165206906282869e+00 +162 165 -7.412185823610205e-01 +162 166 -3.301555353436771e-01 +162 167 -1.820810586422656e-01 +162 168 -1.132183869282768e-01 +162 169 -7.613960933881161e-02 +162 170 -5.413421453123172e-02 +162 171 -4.012781031912996e-02 +162 172 -3.072751892616548e-02 +162 173 -2.415034675252896e-02 +162 174 -1.939104886145111e-02 +162 175 -1.585023865775526e-02 +162 176 -1.315380302376548e-02 +162 177 -1.105916272470025e-02 +162 178 -9.403863770832830e-03 +162 179 -8.076052134892597e-03 +162 180 -6.996835383339681e-03 +162 181 -6.109381318875754e-03 +162 182 -5.371977266379802e-03 +162 183 -4.753493624956896e-03 +162 184 -4.230349322908531e-03 +162 185 -3.784439171232927e-03 +162 186 -3.401691470521393e-03 +162 187 -3.071047067257394e-03 +162 188 -2.783725492315674e-03 +162 189 -2.532689975072678e-03 +162 190 -2.312252367280536e-03 +162 191 -2.117777896667794e-03 +163 163 3.988394278151441e+01 +163 144 -6.109381318875749e-03 +163 145 -6.996835383339667e-03 +163 146 -8.076052134892599e-03 +163 147 -9.403863770832820e-03 +163 148 -1.105916272470023e-02 +163 149 -1.315380302376544e-02 +163 150 -1.585023865775523e-02 +163 151 -1.939104886145104e-02 +163 152 -2.415034675252891e-02 +163 153 -3.072751892616537e-02 +163 154 -4.012781031912985e-02 +163 155 -5.413421453123141e-02 +163 156 -7.613960933881143e-02 +163 157 -1.132183869282762e-01 +163 158 -1.820810586422648e-01 +163 159 -3.301555353436770e-01 +163 160 -7.412185823610176e-01 +163 161 -3.165206906282866e+00 +163 162 -1.502055215858803e+01 +163 164 -1.502055215859653e+01 +163 165 -3.165206906282860e+00 +163 166 -7.412185823610219e-01 +163 167 -3.301555353436790e-01 +163 168 -1.820810586422656e-01 +163 169 -1.132183869282764e-01 +163 170 -7.613960933881160e-02 +163 171 -5.413421453123171e-02 +163 172 -4.012781031913000e-02 +163 173 -3.072751892616544e-02 +163 174 -2.415034675252896e-02 +163 175 -1.939104886145111e-02 +163 176 -1.585023865775528e-02 +163 177 -1.315380302376546e-02 +163 178 -1.105916272470025e-02 +163 179 -9.403863770832827e-03 +163 180 -8.076052134892608e-03 +163 181 -6.996835383339681e-03 +163 182 -6.109381318875744e-03 +163 183 -5.371977266379806e-03 +163 184 -4.753493624956896e-03 +163 185 -4.230349322908531e-03 +163 186 -3.784439171232927e-03 +163 187 -3.401691470521396e-03 +163 188 -3.071047067257395e-03 +163 189 -2.783725492315670e-03 +163 190 -2.532689975072680e-03 +163 191 -2.312252367280536e-03 +164 164 3.988394278151356e+01 +164 144 -5.371977266379806e-03 +164 145 -6.109381318875745e-03 +164 146 -6.996835383339681e-03 +164 147 -8.076052134892604e-03 +164 148 -9.403863770832827e-03 +164 149 -1.105916272470024e-02 +164 150 -1.315380302376545e-02 +164 151 -1.585023865775521e-02 +164 152 -1.939104886145109e-02 +164 153 -2.415034675252894e-02 +164 154 -3.072751892616540e-02 +164 155 -4.012781031912980e-02 +164 156 -5.413421453123163e-02 +164 157 -7.613960933881150e-02 +164 158 -1.132183869282761e-01 +164 159 -1.820810586422646e-01 +164 160 -3.301555353436744e-01 +164 161 -7.412185823610221e-01 +164 162 -3.165206906282869e+00 +164 163 -1.502055215859653e+01 +164 165 -1.502055215859220e+01 +164 166 -3.165206906282870e+00 +164 167 -7.412185823610230e-01 +164 168 -3.301555353436747e-01 +164 169 -1.820810586422649e-01 +164 170 -1.132183869282764e-01 +164 171 -7.613960933881145e-02 +164 172 -5.413421453123173e-02 +164 173 -4.012781031912990e-02 +164 174 -3.072751892616540e-02 +164 175 -2.415034675252894e-02 +164 176 -1.939104886145113e-02 +164 177 -1.585023865775525e-02 +164 178 -1.315380302376545e-02 +164 179 -1.105916272470025e-02 +164 180 -9.403863770832842e-03 +164 181 -8.076052134892604e-03 +164 182 -6.996835383339669e-03 +164 183 -6.109381318875749e-03 +164 184 -5.371977266379806e-03 +164 185 -4.753493624956896e-03 +164 186 -4.230349322908531e-03 +164 187 -3.784439171232930e-03 +164 188 -3.401691470521396e-03 +164 189 -3.071047067257391e-03 +164 190 -2.783725492315672e-03 +164 191 -2.532689975072680e-03 +165 165 3.988394278152494e+01 +165 144 -4.753493624956896e-03 +165 145 -5.371977266379802e-03 +165 146 -6.109381318875755e-03 +165 147 -6.996835383339681e-03 +165 148 -8.076052134892590e-03 +165 149 -9.403863770832818e-03 +165 150 -1.105916272470023e-02 +165 151 -1.315380302376542e-02 +165 152 -1.585023865775522e-02 +165 153 -1.939104886145107e-02 +165 154 -2.415034675252891e-02 +165 155 -3.072751892616529e-02 +165 156 -4.012781031912985e-02 +165 157 -5.413421453123156e-02 +165 158 -7.613960933881132e-02 +165 159 -1.132183869282758e-01 +165 160 -1.820810586422646e-01 +165 161 -3.301555353436781e-01 +165 162 -7.412185823610205e-01 +165 163 -3.165206906282860e+00 +165 164 -1.502055215859220e+01 +165 166 -1.502055215860532e+01 +165 167 -3.165206906282870e+00 +165 168 -7.412185823610178e-01 +165 169 -3.301555353436761e-01 +165 170 -1.820810586422656e-01 +165 171 -1.132183869282766e-01 +165 172 -7.613960933881177e-02 +165 173 -5.413421453123172e-02 +165 174 -4.012781031912996e-02 +165 175 -3.072751892616544e-02 +165 176 -2.415034675252901e-02 +165 177 -1.939104886145111e-02 +165 178 -1.585023865775526e-02 +165 179 -1.315380302376546e-02 +165 180 -1.105916272470027e-02 +165 181 -9.403863770832833e-03 +165 182 -8.076052134892594e-03 +165 183 -6.996835383339674e-03 +165 184 -6.109381318875749e-03 +165 185 -5.371977266379806e-03 +165 186 -4.753493624956896e-03 +165 187 -4.230349322908535e-03 +165 188 -3.784439171232930e-03 +165 189 -3.401691470521391e-03 +165 190 -3.071047067257393e-03 +165 191 -2.783725492315672e-03 +166 166 3.988394278128563e+01 +166 144 -4.230349322908535e-03 +166 145 -4.753493624956896e-03 +166 146 -5.371977266379815e-03 +166 147 -6.109381318875761e-03 +166 148 -6.996835383339681e-03 +166 149 -8.076052134892601e-03 +166 150 -9.403863770832821e-03 +166 151 -1.105916272470022e-02 +166 152 -1.315380302376544e-02 +166 153 -1.585023865775523e-02 +166 154 -1.939104886145107e-02 +166 155 -2.415034675252886e-02 +166 156 -3.072751892616536e-02 +166 157 -4.012781031912985e-02 +166 158 -5.413421453123154e-02 +166 159 -7.613960933881114e-02 +166 160 -1.132183869282759e-01 +166 161 -1.820810586422656e-01 +166 162 -3.301555353436771e-01 +166 163 -7.412185823610219e-01 +166 164 -3.165206906282870e+00 +166 165 -1.502055215860532e+01 +166 167 -1.502055215840047e+01 +166 168 -3.165206906282862e+00 +166 169 -7.412185823610157e-01 +166 170 -3.301555353436748e-01 +166 171 -1.820810586422650e-01 +166 172 -1.132183869282769e-01 +166 173 -7.613960933881161e-02 +166 174 -5.413421453123172e-02 +166 175 -4.012781031912996e-02 +166 176 -3.072751892616551e-02 +166 177 -2.415034675252897e-02 +166 178 -1.939104886145111e-02 +166 179 -1.585023865775526e-02 +166 180 -1.315380302376548e-02 +166 181 -1.105916272470025e-02 +166 182 -9.403863770832830e-03 +166 183 -8.076052134892592e-03 +166 184 -6.996835383339667e-03 +166 185 -6.109381318875744e-03 +166 186 -5.371977266379801e-03 +166 187 -4.753493624956895e-03 +166 188 -4.230349322908533e-03 +166 189 -3.784439171232922e-03 +166 190 -3.401691470521391e-03 +166 191 -3.071047067257391e-03 +167 167 3.988394278105613e+01 +167 144 -3.784439171232930e-03 +167 145 -4.230349322908533e-03 +167 146 -4.753493624956904e-03 +167 147 -5.371977266379816e-03 +167 148 -6.109381318875754e-03 +167 149 -6.996835383339681e-03 +167 150 -8.076052134892599e-03 +167 151 -9.403863770832813e-03 +167 152 -1.105916272470023e-02 +167 153 -1.315380302376544e-02 +167 154 -1.585023865775523e-02 +167 155 -1.939104886145104e-02 +167 156 -2.415034675252891e-02 +167 157 -3.072751892616537e-02 +167 158 -4.012781031912985e-02 +167 159 -5.413421453123139e-02 +167 160 -7.613960933881138e-02 +167 161 -1.132183869282766e-01 +167 162 -1.820810586422656e-01 +167 163 -3.301555353436790e-01 +167 164 -7.412185823610230e-01 +167 165 -3.165206906282870e+00 +167 166 -1.502055215840047e+01 +167 168 -1.502055215835490e+01 +167 169 -3.165206906282867e+00 +167 170 -7.412185823610180e-01 +167 171 -3.301555353436754e-01 +167 172 -1.820810586422653e-01 +167 173 -1.132183869282764e-01 +167 174 -7.613960933881167e-02 +167 175 -5.413421453123171e-02 +167 176 -4.012781031913006e-02 +167 177 -3.072751892616544e-02 +167 178 -2.415034675252896e-02 +167 179 -1.939104886145111e-02 +167 180 -1.585023865775528e-02 +167 181 -1.315380302376546e-02 +167 182 -1.105916272470025e-02 +167 183 -9.403863770832827e-03 +167 184 -8.076052134892594e-03 +167 185 -6.996835383339667e-03 +167 186 -6.109381318875745e-03 +167 187 -5.371977266379805e-03 +167 188 -4.753493624956895e-03 +167 189 -4.230349322908526e-03 +167 190 -3.784439171232924e-03 +167 191 -3.401691470521391e-03 +168 168 3.988394278102304e+01 +168 144 -3.401691470521391e-03 +168 145 -3.784439171232922e-03 +168 146 -4.230349322908532e-03 +168 147 -4.753493624956896e-03 +168 148 -5.371977266379802e-03 +168 149 -6.109381318875744e-03 +168 150 -6.996835383339669e-03 +168 151 -8.076052134892587e-03 +168 152 -9.403863770832827e-03 +168 153 -1.105916272470024e-02 +168 154 -1.315380302376545e-02 +168 155 -1.585023865775521e-02 +168 156 -1.939104886145109e-02 +168 157 -2.415034675252894e-02 +168 158 -3.072751892616540e-02 +168 159 -4.012781031912979e-02 +168 160 -5.413421453123168e-02 +168 161 -7.613960933881175e-02 +168 162 -1.132183869282768e-01 +168 163 -1.820810586422656e-01 +168 164 -3.301555353436747e-01 +168 165 -7.412185823610178e-01 +168 166 -3.165206906282862e+00 +168 167 -1.502055215835490e+01 +168 169 -1.502055215836222e+01 +168 170 -3.165206906282866e+00 +168 171 -7.412185823610224e-01 +168 172 -3.301555353436765e-01 +168 173 -1.820810586422654e-01 +168 174 -1.132183869282765e-01 +168 175 -7.613960933881139e-02 +168 176 -5.413421453123179e-02 +168 177 -4.012781031912992e-02 +168 178 -3.072751892616540e-02 +168 179 -2.415034675252894e-02 +168 180 -1.939104886145113e-02 +168 181 -1.585023865775525e-02 +168 182 -1.315380302376545e-02 +168 183 -1.105916272470025e-02 +168 184 -9.403863770832840e-03 +168 185 -8.076052134892604e-03 +168 186 -6.996835383339681e-03 +168 187 -6.109381318875761e-03 +168 188 -5.371977266379814e-03 +168 189 -4.753493624956896e-03 +168 190 -4.230349322908535e-03 +168 191 -3.784439171232929e-03 +169 169 3.988394278106475e+01 +169 144 -3.071047067257393e-03 +169 145 -3.401691470521391e-03 +169 146 -3.784439171232930e-03 +169 147 -4.230349322908535e-03 +169 148 -4.753493624956896e-03 +169 149 -5.371977266379806e-03 +169 150 -6.109381318875749e-03 +169 151 -6.996835383339674e-03 +169 152 -8.076052134892587e-03 +169 153 -9.403863770832823e-03 +169 154 -1.105916272470023e-02 +169 155 -1.315380302376542e-02 +169 156 -1.585023865775522e-02 +169 157 -1.939104886145107e-02 +169 158 -2.415034675252891e-02 +169 159 -3.072751892616529e-02 +169 160 -4.012781031912988e-02 +169 161 -5.413421453123172e-02 +169 162 -7.613960933881161e-02 +169 163 -1.132183869282764e-01 +169 164 -1.820810586422649e-01 +169 165 -3.301555353436761e-01 +169 166 -7.412185823610157e-01 +169 167 -3.165206906282867e+00 +169 168 -1.502055215836222e+01 +169 170 -1.502055215839540e+01 +169 171 -3.165206906282864e+00 +169 172 -7.412185823610165e-01 +169 173 -3.301555353436774e-01 +169 174 -1.820810586422655e-01 +169 175 -1.132183869282761e-01 +169 176 -7.613960933881180e-02 +169 177 -5.413421453123173e-02 +169 178 -4.012781031912996e-02 +169 179 -3.072751892616544e-02 +169 180 -2.415034675252901e-02 +169 181 -1.939104886145111e-02 +169 182 -1.585023865775526e-02 +169 183 -1.315380302376546e-02 +169 184 -1.105916272470027e-02 +169 185 -9.403863770832830e-03 +169 186 -8.076052134892597e-03 +169 187 -6.996835383339681e-03 +169 188 -6.109381318875754e-03 +169 189 -5.371977266379802e-03 +169 190 -4.753493624956896e-03 +169 191 -4.230349322908531e-03 +170 170 3.988394278115153e+01 +170 144 -2.783725492315672e-03 +170 145 -3.071047067257391e-03 +170 146 -3.401691470521396e-03 +170 147 -3.784439171232930e-03 +170 148 -4.230349322908531e-03 +170 149 -4.753493624956896e-03 +170 150 -5.371977266379806e-03 +170 151 -6.109381318875749e-03 +170 152 -6.996835383339667e-03 +170 153 -8.076052134892599e-03 +170 154 -9.403863770832821e-03 +170 155 -1.105916272470022e-02 +170 156 -1.315380302376544e-02 +170 157 -1.585023865775523e-02 +170 158 -1.939104886145107e-02 +170 159 -2.415034675252886e-02 +170 160 -3.072751892616538e-02 +170 161 -4.012781031912996e-02 +170 162 -5.413421453123172e-02 +170 163 -7.613960933881160e-02 +170 164 -1.132183869282764e-01 +170 165 -1.820810586422656e-01 +170 166 -3.301555353436748e-01 +170 167 -7.412185823610180e-01 +170 168 -3.165206906282866e+00 +170 169 -1.502055215839540e+01 +170 171 -1.502055215844907e+01 +170 172 -3.165206906282871e+00 +170 173 -7.412185823610216e-01 +170 174 -3.301555353436761e-01 +170 175 -1.820810586422649e-01 +170 176 -1.132183869282768e-01 +170 177 -7.613960933881161e-02 +170 178 -5.413421453123172e-02 +170 179 -4.012781031912996e-02 +170 180 -3.072751892616551e-02 +170 181 -2.415034675252897e-02 +170 182 -1.939104886145111e-02 +170 183 -1.585023865775526e-02 +170 184 -1.315380302376548e-02 +170 185 -1.105916272470025e-02 +170 186 -9.403863770832830e-03 +170 187 -8.076052134892604e-03 +170 188 -6.996835383339681e-03 +170 189 -6.109381318875744e-03 +170 190 -5.371977266379806e-03 +170 191 -4.753493624956896e-03 +171 171 3.988394278128114e+01 +171 144 -2.532689975072680e-03 +171 145 -2.783725492315670e-03 +171 146 -3.071047067257395e-03 +171 147 -3.401691470521395e-03 +171 148 -3.784439171232927e-03 +171 149 -4.230349322908531e-03 +171 150 -4.753493624956896e-03 +171 151 -5.371977266379806e-03 +171 152 -6.109381318875745e-03 +171 153 -6.996835383339681e-03 +171 154 -8.076052134892601e-03 +171 155 -9.403863770832807e-03 +171 156 -1.105916272470023e-02 +171 157 -1.315380302376544e-02 +171 158 -1.585023865775523e-02 +171 159 -1.939104886145103e-02 +171 160 -2.415034675252893e-02 +171 161 -3.072751892616544e-02 +171 162 -4.012781031912996e-02 +171 163 -5.413421453123171e-02 +171 164 -7.613960933881145e-02 +171 165 -1.132183869282766e-01 +171 166 -1.820810586422650e-01 +171 167 -3.301555353436754e-01 +171 168 -7.412185823610224e-01 +171 169 -3.165206906282864e+00 +171 170 -1.502055215844907e+01 +171 172 -1.502055215852575e+01 +171 173 -3.165206906282869e+00 +171 174 -7.412185823610206e-01 +171 175 -3.301555353436752e-01 +171 176 -1.820810586422653e-01 +171 177 -1.132183869282764e-01 +171 178 -7.613960933881167e-02 +171 179 -5.413421453123171e-02 +171 180 -4.012781031913006e-02 +171 181 -3.072751892616544e-02 +171 182 -2.415034675252896e-02 +171 183 -1.939104886145111e-02 +171 184 -1.585023865775528e-02 +171 185 -1.315380302376546e-02 +171 186 -1.105916272470025e-02 +171 187 -9.403863770832833e-03 +171 188 -8.076052134892608e-03 +171 189 -6.996835383339669e-03 +171 190 -6.109381318875749e-03 +171 191 -5.371977266379806e-03 +172 172 3.988394278146370e+01 +172 144 -2.312252367280536e-03 +172 145 -2.532689975072678e-03 +172 146 -2.783725492315674e-03 +172 147 -3.071047067257394e-03 +172 148 -3.401691470521393e-03 +172 149 -3.784439171232927e-03 +172 150 -4.230349322908531e-03 +172 151 -4.753493624956896e-03 +172 152 -5.371977266379802e-03 +172 153 -6.109381318875755e-03 +172 154 -6.996835383339681e-03 +172 155 -8.076052134892590e-03 +172 156 -9.403863770832827e-03 +172 157 -1.105916272470024e-02 +172 158 -1.315380302376545e-02 +172 159 -1.585023865775521e-02 +172 160 -1.939104886145110e-02 +172 161 -2.415034675252899e-02 +172 162 -3.072751892616548e-02 +172 163 -4.012781031913000e-02 +172 164 -5.413421453123173e-02 +172 165 -7.613960933881177e-02 +172 166 -1.132183869282769e-01 +172 167 -1.820810586422653e-01 +172 168 -3.301555353436765e-01 +172 169 -7.412185823610165e-01 +172 170 -3.165206906282871e+00 +172 171 -1.502055215852575e+01 +172 173 -1.502055215863300e+01 +172 174 -3.165206906282864e+00 +172 175 -7.412185823610143e-01 +172 176 -3.301555353436774e-01 +172 177 -1.820810586422650e-01 +172 178 -1.132183869282765e-01 +172 179 -7.613960933881145e-02 +172 180 -5.413421453123179e-02 +172 181 -4.012781031912992e-02 +172 182 -3.072751892616540e-02 +172 183 -2.415034675252894e-02 +172 184 -1.939104886145113e-02 +172 185 -1.585023865775525e-02 +172 186 -1.315380302376545e-02 +172 187 -1.105916272470025e-02 +172 188 -9.403863770832840e-03 +172 189 -8.076052134892596e-03 +172 190 -6.996835383339674e-03 +172 191 -6.109381318875749e-03 +173 173 3.988394278171950e+01 +173 144 -2.117777896667795e-03 +173 145 -2.312252367280536e-03 +173 146 -2.532689975072683e-03 +173 147 -2.783725492315676e-03 +173 148 -3.071047067257394e-03 +173 149 -3.401691470521396e-03 +173 150 -3.784439171232930e-03 +173 151 -4.230349322908535e-03 +173 152 -4.753493624956896e-03 +173 153 -5.371977266379815e-03 +173 154 -6.109381318875761e-03 +173 155 -6.996835383339681e-03 +173 156 -8.076052134892601e-03 +173 157 -9.403863770832823e-03 +173 158 -1.105916272470023e-02 +173 159 -1.315380302376542e-02 +173 160 -1.585023865775523e-02 +173 161 -1.939104886145111e-02 +173 162 -2.415034675252896e-02 +173 163 -3.072751892616544e-02 +173 164 -4.012781031912990e-02 +173 165 -5.413421453123172e-02 +173 166 -7.613960933881161e-02 +173 167 -1.132183869282764e-01 +173 168 -1.820810586422654e-01 +173 169 -3.301555353436774e-01 +173 170 -7.412185823610216e-01 +173 171 -3.165206906282869e+00 +173 172 -1.502055215863300e+01 +173 174 -1.502055215878373e+01 +173 175 -3.165206906282854e+00 +173 176 -7.412185823610193e-01 +173 177 -3.301555353436757e-01 +173 178 -1.820810586422654e-01 +173 179 -1.132183869282763e-01 +173 180 -7.613960933881175e-02 +173 181 -5.413421453123173e-02 +173 182 -4.012781031912996e-02 +173 183 -3.072751892616544e-02 +173 184 -2.415034675252901e-02 +173 185 -1.939104886145111e-02 +173 186 -1.585023865775526e-02 +173 187 -1.315380302376546e-02 +173 188 -1.105916272470027e-02 +173 189 -9.403863770832837e-03 +173 190 -8.076052134892592e-03 +173 191 -6.996835383339667e-03 +174 174 3.988394278208168e+01 +174 144 -1.945462087124854e-03 +174 145 -2.117777896667794e-03 +174 146 -2.312252367280539e-03 +174 147 -2.532689975072683e-03 +174 148 -2.783725492315674e-03 +174 149 -3.071047067257395e-03 +174 150 -3.401691470521396e-03 +174 151 -3.784439171232930e-03 +174 152 -4.230349322908533e-03 +174 153 -4.753493624956904e-03 +174 154 -5.371977266379816e-03 +174 155 -6.109381318875754e-03 +174 156 -6.996835383339681e-03 +174 157 -8.076052134892601e-03 +174 158 -9.403863770832821e-03 +174 159 -1.105916272470022e-02 +174 160 -1.315380302376544e-02 +174 161 -1.585023865775526e-02 +174 162 -1.939104886145111e-02 +174 163 -2.415034675252896e-02 +174 164 -3.072751892616540e-02 +174 165 -4.012781031912996e-02 +174 166 -5.413421453123172e-02 +174 167 -7.613960933881167e-02 +174 168 -1.132183869282765e-01 +174 169 -1.820810586422655e-01 +174 170 -3.301555353436761e-01 +174 171 -7.412185823610206e-01 +174 172 -3.165206906282864e+00 +174 173 -1.502055215878373e+01 +174 175 -1.502055215899859e+01 +174 176 -3.165206906282870e+00 +174 177 -7.412185823610212e-01 +174 178 -3.301555353436755e-01 +174 179 -1.820810586422650e-01 +174 180 -1.132183869282764e-01 +174 181 -7.613960933881157e-02 +174 182 -5.413421453123172e-02 +174 183 -4.012781031912996e-02 +174 184 -3.072751892616551e-02 +174 185 -2.415034675252897e-02 +174 186 -1.939104886145111e-02 +174 187 -1.585023865775526e-02 +174 188 -1.315380302376548e-02 +174 189 -1.105916272470026e-02 +174 190 -9.403863770832830e-03 +174 191 -8.076052134892590e-03 +175 175 3.988394278260304e+01 +175 144 -1.792160480940037e-03 +175 145 -1.945462087124851e-03 +175 146 -2.117777896667794e-03 +175 147 -2.312252367280536e-03 +175 148 -2.532689975072678e-03 +175 149 -2.783725492315670e-03 +175 150 -3.071047067257391e-03 +175 151 -3.401691470521391e-03 +175 152 -3.784439171232922e-03 +175 153 -4.230349322908532e-03 +175 154 -4.753493624956896e-03 +175 155 -5.371977266379802e-03 +175 156 -6.109381318875744e-03 +175 157 -6.996835383339669e-03 +175 158 -8.076052134892587e-03 +175 159 -9.403863770832806e-03 +175 160 -1.105916272470024e-02 +175 161 -1.315380302376546e-02 +175 162 -1.585023865775526e-02 +175 163 -1.939104886145111e-02 +175 164 -2.415034675252894e-02 +175 165 -3.072751892616544e-02 +175 166 -4.012781031912996e-02 +175 167 -5.413421453123171e-02 +175 168 -7.613960933881139e-02 +175 169 -1.132183869282761e-01 +175 170 -1.820810586422649e-01 +175 171 -3.301555353436752e-01 +175 172 -7.412185823610143e-01 +175 173 -3.165206906282854e+00 +175 174 -1.502055215899859e+01 +175 176 -1.502055215931068e+01 +175 177 -3.165206906282875e+00 +175 178 -7.412185823610187e-01 +175 179 -3.301555353436780e-01 +175 180 -1.820810586422655e-01 +175 181 -1.132183869282764e-01 +175 182 -7.613960933881166e-02 +175 183 -5.413421453123171e-02 +175 184 -4.012781031913006e-02 +175 185 -3.072751892616544e-02 +175 186 -2.415034675252896e-02 +175 187 -1.939104886145111e-02 +175 188 -1.585023865775528e-02 +175 189 -1.315380302376547e-02 +175 190 -1.105916272470025e-02 +175 191 -9.403863770832835e-03 +176 176 3.988394278260305e+01 +176 160 -9.403863770832833e-03 +176 161 -1.105916272470027e-02 +176 162 -1.315380302376548e-02 +176 163 -1.585023865775528e-02 +176 164 -1.939104886145113e-02 +176 165 -2.415034675252901e-02 +176 166 -3.072751892616551e-02 +176 167 -4.012781031913006e-02 +176 168 -5.413421453123179e-02 +176 169 -7.613960933881180e-02 +176 170 -1.132183869282768e-01 +176 171 -1.820810586422653e-01 +176 172 -3.301555353436774e-01 +176 173 -7.412185823610193e-01 +176 174 -3.165206906282870e+00 +176 175 -1.502055215931068e+01 +176 177 -1.502055215899859e+01 +176 178 -3.165206906282859e+00 +176 179 -7.412185823610195e-01 +176 180 -3.301555353436753e-01 +176 181 -1.820810586422646e-01 +176 182 -1.132183869282766e-01 +176 183 -7.613960933881145e-02 +176 184 -5.413421453123172e-02 +176 185 -4.012781031912986e-02 +176 186 -3.072751892616537e-02 +176 187 -2.415034675252892e-02 +176 188 -1.939104886145111e-02 +176 189 -1.585023865775525e-02 +176 190 -1.315380302376544e-02 +176 191 -1.105916272470024e-02 +176 192 -9.403863770832833e-03 +176 193 -8.076052134892597e-03 +176 194 -6.996835383339674e-03 +176 195 -6.109381318875754e-03 +176 196 -5.371977266379802e-03 +176 197 -4.753493624956891e-03 +176 198 -4.230349322908531e-03 +176 199 -3.784439171232927e-03 +176 200 -3.401691470521393e-03 +176 201 -3.071047067257393e-03 +176 202 -2.783725492315673e-03 +176 203 -2.532689975072678e-03 +176 204 -2.312252367280534e-03 +176 205 -2.117777896667794e-03 +176 206 -1.945462087124853e-03 +176 207 -1.792160480940038e-03 +177 177 3.988394278208168e+01 +177 160 -8.076052134892590e-03 +177 161 -9.403863770832833e-03 +177 162 -1.105916272470025e-02 +177 163 -1.315380302376546e-02 +177 164 -1.585023865775525e-02 +177 165 -1.939104886145111e-02 +177 166 -2.415034675252897e-02 +177 167 -3.072751892616544e-02 +177 168 -4.012781031912992e-02 +177 169 -5.413421453123173e-02 +177 170 -7.613960933881161e-02 +177 171 -1.132183869282764e-01 +177 172 -1.820810586422650e-01 +177 173 -3.301555353436757e-01 +177 174 -7.412185823610212e-01 +177 175 -3.165206906282875e+00 +177 176 -1.502055215899859e+01 +177 178 -1.502055215878373e+01 +177 179 -3.165206906282871e+00 +177 180 -7.412185823610224e-01 +177 181 -3.301555353436756e-01 +177 182 -1.820810586422655e-01 +177 183 -1.132183869282763e-01 +177 184 -7.613960933881178e-02 +177 185 -5.413421453123173e-02 +177 186 -4.012781031912995e-02 +177 187 -3.072751892616543e-02 +177 188 -2.415034675252901e-02 +177 189 -1.939104886145113e-02 +177 190 -1.585023865775526e-02 +177 191 -1.315380302376547e-02 +177 192 -1.105916272470028e-02 +177 193 -9.403863770832844e-03 +177 194 -8.076052134892601e-03 +177 195 -6.996835383339680e-03 +177 196 -6.109381318875744e-03 +177 197 -5.371977266379801e-03 +177 198 -4.753493624956896e-03 +177 199 -4.230349322908531e-03 +177 200 -3.784439171232927e-03 +177 201 -3.401691470521393e-03 +177 202 -3.071047067257394e-03 +177 203 -2.783725492315670e-03 +177 204 -2.532689975072678e-03 +177 205 -2.312252367280536e-03 +177 206 -2.117777896667794e-03 +177 207 -1.945462087124853e-03 +178 178 3.988394278171952e+01 +178 160 -6.996835383339667e-03 +178 161 -8.076052134892604e-03 +178 162 -9.403863770832830e-03 +178 163 -1.105916272470025e-02 +178 164 -1.315380302376545e-02 +178 165 -1.585023865775526e-02 +178 166 -1.939104886145111e-02 +178 167 -2.415034675252896e-02 +178 168 -3.072751892616540e-02 +178 169 -4.012781031912996e-02 +178 170 -5.413421453123172e-02 +178 171 -7.613960933881167e-02 +178 172 -1.132183869282765e-01 +178 173 -1.820810586422654e-01 +178 174 -3.301555353436755e-01 +178 175 -7.412185823610187e-01 +178 176 -3.165206906282859e+00 +178 177 -1.502055215878373e+01 +178 179 -1.502055215863301e+01 +178 180 -3.165206906282872e+00 +178 181 -7.412185823610176e-01 +178 182 -3.301555353436770e-01 +178 183 -1.820810586422650e-01 +178 184 -1.132183869282766e-01 +178 185 -7.613960933881153e-02 +178 186 -5.413421453123172e-02 +178 187 -4.012781031912996e-02 +178 188 -3.072751892616551e-02 +178 189 -2.415034675252899e-02 +178 190 -1.939104886145111e-02 +178 191 -1.585023865775526e-02 +178 192 -1.315380302376549e-02 +178 193 -1.105916272470027e-02 +178 194 -9.403863770832844e-03 +178 195 -8.076052134892606e-03 +178 196 -6.996835383339666e-03 +178 197 -6.109381318875744e-03 +178 198 -5.371977266379806e-03 +178 199 -4.753493624956896e-03 +178 200 -4.230349322908531e-03 +178 201 -3.784439171232927e-03 +178 202 -3.401691470521395e-03 +178 203 -3.071047067257391e-03 +178 204 -2.783725492315670e-03 +178 205 -2.532689975072680e-03 +178 206 -2.312252367280536e-03 +178 207 -2.117777896667794e-03 +179 179 3.988394278146372e+01 +179 160 -6.109381318875745e-03 +179 161 -6.996835383339681e-03 +179 162 -8.076052134892597e-03 +179 163 -9.403863770832827e-03 +179 164 -1.105916272470025e-02 +179 165 -1.315380302376546e-02 +179 166 -1.585023865775526e-02 +179 167 -1.939104886145111e-02 +179 168 -2.415034675252894e-02 +179 169 -3.072751892616544e-02 +179 170 -4.012781031912996e-02 +179 171 -5.413421453123171e-02 +179 172 -7.613960933881145e-02 +179 173 -1.132183869282763e-01 +179 174 -1.820810586422650e-01 +179 175 -3.301555353436780e-01 +179 176 -7.412185823610195e-01 +179 177 -3.165206906282871e+00 +179 178 -1.502055215863301e+01 +179 180 -1.502055215852575e+01 +179 181 -3.165206906282862e+00 +179 182 -7.412185823610190e-01 +179 183 -3.301555353436758e-01 +179 184 -1.820810586422652e-01 +179 185 -1.132183869282761e-01 +179 186 -7.613960933881161e-02 +179 187 -5.413421453123171e-02 +179 188 -4.012781031913006e-02 +179 189 -3.072751892616548e-02 +179 190 -2.415034675252896e-02 +179 191 -1.939104886145111e-02 +179 192 -1.585023865775529e-02 +179 193 -1.315380302376548e-02 +179 194 -1.105916272470027e-02 +179 195 -9.403863770832837e-03 +179 196 -8.076052134892590e-03 +179 197 -6.996835383339667e-03 +179 198 -6.109381318875749e-03 +179 199 -5.371977266379806e-03 +179 200 -4.753493624956896e-03 +179 201 -4.230349322908531e-03 +179 202 -3.784439171232929e-03 +179 203 -3.401691470521391e-03 +179 204 -3.071047067257390e-03 +179 205 -2.783725492315672e-03 +179 206 -2.532689975072680e-03 +179 207 -2.312252367280536e-03 +180 180 3.988394278128114e+01 +180 160 -5.371977266379805e-03 +180 161 -6.109381318875761e-03 +180 162 -6.996835383339681e-03 +180 163 -8.076052134892608e-03 +180 164 -9.403863770832842e-03 +180 165 -1.105916272470027e-02 +180 166 -1.315380302376548e-02 +180 167 -1.585023865775528e-02 +180 168 -1.939104886145113e-02 +180 169 -2.415034675252901e-02 +180 170 -3.072751892616551e-02 +180 171 -4.012781031913006e-02 +180 172 -5.413421453123179e-02 +180 173 -7.613960933881175e-02 +180 174 -1.132183869282764e-01 +180 175 -1.820810586422655e-01 +180 176 -3.301555353436753e-01 +180 177 -7.412185823610224e-01 +180 178 -3.165206906282872e+00 +180 179 -1.502055215852575e+01 +180 181 -1.502055215844907e+01 +180 182 -3.165206906282870e+00 +180 183 -7.412185823610208e-01 +180 184 -3.301555353436752e-01 +180 185 -1.820810586422650e-01 +180 186 -1.132183869282766e-01 +180 187 -7.613960933881143e-02 +180 188 -5.413421453123173e-02 +180 189 -4.012781031912992e-02 +180 190 -3.072751892616537e-02 +180 191 -2.415034675252893e-02 +180 192 -1.939104886145112e-02 +180 193 -1.585023865775526e-02 +180 194 -1.315380302376547e-02 +180 195 -1.105916272470024e-02 +180 196 -9.403863770832823e-03 +180 197 -8.076052134892590e-03 +180 198 -6.996835383339667e-03 +180 199 -6.109381318875744e-03 +180 200 -5.371977266379801e-03 +180 201 -4.753493624956892e-03 +180 202 -4.230349322908531e-03 +180 203 -3.784439171232922e-03 +180 204 -3.401691470521388e-03 +180 205 -3.071047067257391e-03 +180 206 -2.783725492315670e-03 +180 207 -2.532689975072678e-03 +181 181 3.988394278115153e+01 +181 160 -4.753493624956895e-03 +181 161 -5.371977266379814e-03 +181 162 -6.109381318875754e-03 +181 163 -6.996835383339681e-03 +181 164 -8.076052134892604e-03 +181 165 -9.403863770832833e-03 +181 166 -1.105916272470025e-02 +181 167 -1.315380302376546e-02 +181 168 -1.585023865775525e-02 +181 169 -1.939104886145111e-02 +181 170 -2.415034675252897e-02 +181 171 -3.072751892616544e-02 +181 172 -4.012781031912992e-02 +181 173 -5.413421453123173e-02 +181 174 -7.613960933881157e-02 +181 175 -1.132183869282764e-01 +181 176 -1.820810586422646e-01 +181 177 -3.301555353436756e-01 +181 178 -7.412185823610176e-01 +181 179 -3.165206906282862e+00 +181 180 -1.502055215844907e+01 +181 182 -1.502055215839542e+01 +181 183 -3.165206906282877e+00 +181 184 -7.412185823610186e-01 +181 185 -3.301555353436778e-01 +181 186 -1.820810586422655e-01 +181 187 -1.132183869282764e-01 +181 188 -7.613960933881185e-02 +181 189 -5.413421453123179e-02 +181 190 -4.012781031912995e-02 +181 191 -3.072751892616545e-02 +181 192 -2.415034675252904e-02 +181 193 -1.939104886145115e-02 +181 194 -1.585023865775529e-02 +181 195 -1.315380302376547e-02 +181 196 -1.105916272470026e-02 +181 197 -9.403863770832840e-03 +181 198 -8.076052134892590e-03 +181 199 -6.996835383339667e-03 +181 200 -6.109381318875745e-03 +181 201 -5.371977266379802e-03 +181 202 -4.753493624956895e-03 +181 203 -4.230349322908526e-03 +181 204 -3.784439171232921e-03 +181 205 -3.401691470521391e-03 +181 206 -3.071047067257390e-03 +181 207 -2.783725492315670e-03 +182 182 3.988394278106476e+01 +182 160 -4.230349322908526e-03 +182 161 -4.753493624956896e-03 +182 162 -5.371977266379802e-03 +182 163 -6.109381318875744e-03 +182 164 -6.996835383339669e-03 +182 165 -8.076052134892594e-03 +182 166 -9.403863770832830e-03 +182 167 -1.105916272470025e-02 +182 168 -1.315380302376545e-02 +182 169 -1.585023865775526e-02 +182 170 -1.939104886145111e-02 +182 171 -2.415034675252896e-02 +182 172 -3.072751892616540e-02 +182 173 -4.012781031912996e-02 +182 174 -5.413421453123172e-02 +182 175 -7.613960933881166e-02 +182 176 -1.132183869282766e-01 +182 177 -1.820810586422655e-01 +182 178 -3.301555353436770e-01 +182 179 -7.412185823610190e-01 +182 180 -3.165206906282870e+00 +182 181 -1.502055215839542e+01 +182 183 -1.502055215836222e+01 +182 184 -3.165206906282862e+00 +182 185 -7.412185823610189e-01 +182 186 -3.301555353436761e-01 +182 187 -1.820810586422649e-01 +182 188 -1.132183869282766e-01 +182 189 -7.613960933881163e-02 +182 190 -5.413421453123172e-02 +182 191 -4.012781031912999e-02 +182 192 -3.072751892616553e-02 +182 193 -2.415034675252902e-02 +182 194 -1.939104886145116e-02 +182 195 -1.585023865775527e-02 +182 196 -1.315380302376547e-02 +182 197 -1.105916272470027e-02 +182 198 -9.403863770832839e-03 +182 199 -8.076052134892604e-03 +182 200 -6.996835383339681e-03 +182 201 -6.109381318875754e-03 +182 202 -5.371977266379814e-03 +182 203 -4.753493624956895e-03 +182 204 -4.230349322908531e-03 +182 205 -3.784439171232929e-03 +182 206 -3.401691470521395e-03 +182 207 -3.071047067257394e-03 +183 183 3.988394278102304e+01 +183 160 -3.784439171232924e-03 +183 161 -4.230349322908535e-03 +183 162 -4.753493624956896e-03 +183 163 -5.371977266379806e-03 +183 164 -6.109381318875749e-03 +183 165 -6.996835383339674e-03 +183 166 -8.076052134892592e-03 +183 167 -9.403863770832827e-03 +183 168 -1.105916272470025e-02 +183 169 -1.315380302376546e-02 +183 170 -1.585023865775526e-02 +183 171 -1.939104886145111e-02 +183 172 -2.415034675252894e-02 +183 173 -3.072751892616544e-02 +183 174 -4.012781031912996e-02 +183 175 -5.413421453123171e-02 +183 176 -7.613960933881145e-02 +183 177 -1.132183869282763e-01 +183 178 -1.820810586422650e-01 +183 179 -3.301555353436758e-01 +183 180 -7.412185823610208e-01 +183 181 -3.165206906282877e+00 +183 182 -1.502055215836222e+01 +183 184 -1.502055215835489e+01 +183 185 -3.165206906282862e+00 +183 186 -7.412185823610201e-01 +183 187 -3.301555353436758e-01 +183 188 -1.820810586422651e-01 +183 189 -1.132183869282763e-01 +183 190 -7.613960933881156e-02 +183 191 -5.413421453123174e-02 +183 192 -4.012781031913009e-02 +183 193 -3.072751892616552e-02 +183 194 -2.415034675252903e-02 +183 195 -1.939104886145112e-02 +183 196 -1.585023865775527e-02 +183 197 -1.315380302376548e-02 +183 198 -1.105916272470026e-02 +183 199 -9.403863770832833e-03 +183 200 -8.076052134892596e-03 +183 201 -6.996835383339674e-03 +183 202 -6.109381318875754e-03 +183 203 -5.371977266379802e-03 +183 204 -4.753493624956891e-03 +183 205 -4.230349322908531e-03 +183 206 -3.784439171232927e-03 +183 207 -3.401691470521393e-03 +184 184 3.988394278105613e+01 +184 160 -3.401691470521391e-03 +184 161 -3.784439171232929e-03 +184 162 -4.230349322908531e-03 +184 163 -4.753493624956896e-03 +184 164 -5.371977266379806e-03 +184 165 -6.109381318875749e-03 +184 166 -6.996835383339667e-03 +184 167 -8.076052134892594e-03 +184 168 -9.403863770832840e-03 +184 169 -1.105916272470027e-02 +184 170 -1.315380302376548e-02 +184 171 -1.585023865775528e-02 +184 172 -1.939104886145113e-02 +184 173 -2.415034675252901e-02 +184 174 -3.072751892616551e-02 +184 175 -4.012781031913006e-02 +184 176 -5.413421453123172e-02 +184 177 -7.613960933881178e-02 +184 178 -1.132183869282766e-01 +184 179 -1.820810586422652e-01 +184 180 -3.301555353436752e-01 +184 181 -7.412185823610186e-01 +184 182 -3.165206906282862e+00 +184 183 -1.502055215835489e+01 +184 185 -1.502055215840047e+01 +184 186 -3.165206906282877e+00 +184 187 -7.412185823610216e-01 +184 188 -3.301555353436757e-01 +184 189 -1.820810586422653e-01 +184 190 -1.132183869282762e-01 +184 191 -7.613960933881145e-02 +184 192 -5.413421453123177e-02 +184 193 -4.012781031912998e-02 +184 194 -3.072751892616547e-02 +184 195 -2.415034675252893e-02 +184 196 -1.939104886145110e-02 +184 197 -1.585023865775525e-02 +184 198 -1.315380302376545e-02 +184 199 -1.105916272470024e-02 +184 200 -9.403863770832823e-03 +184 201 -8.076052134892597e-03 +184 202 -6.996835383339680e-03 +184 203 -6.109381318875744e-03 +184 204 -5.371977266379801e-03 +184 205 -4.753493624956896e-03 +184 206 -4.230349322908531e-03 +184 207 -3.784439171232927e-03 +185 185 3.988394278128563e+01 +185 160 -3.071047067257390e-03 +185 161 -3.401691470521395e-03 +185 162 -3.784439171232927e-03 +185 163 -4.230349322908531e-03 +185 164 -4.753493624956896e-03 +185 165 -5.371977266379806e-03 +185 166 -6.109381318875744e-03 +185 167 -6.996835383339667e-03 +185 168 -8.076052134892604e-03 +185 169 -9.403863770832830e-03 +185 170 -1.105916272470025e-02 +185 171 -1.315380302376546e-02 +185 172 -1.585023865775525e-02 +185 173 -1.939104886145111e-02 +185 174 -2.415034675252897e-02 +185 175 -3.072751892616544e-02 +185 176 -4.012781031912986e-02 +185 177 -5.413421453123173e-02 +185 178 -7.613960933881153e-02 +185 179 -1.132183869282761e-01 +185 180 -1.820810586422650e-01 +185 181 -3.301555353436778e-01 +185 182 -7.412185823610189e-01 +185 183 -3.165206906282862e+00 +185 184 -1.502055215840047e+01 +185 186 -1.502055215860533e+01 +185 187 -3.165206906282870e+00 +185 188 -7.412185823610155e-01 +185 189 -3.301555353436763e-01 +185 190 -1.820810586422651e-01 +185 191 -1.132183869282764e-01 +185 192 -7.613960933881181e-02 +185 193 -5.413421453123190e-02 +185 194 -4.012781031913010e-02 +185 195 -3.072751892616547e-02 +185 196 -2.415034675252899e-02 +185 197 -1.939104886145114e-02 +185 198 -1.585023865775527e-02 +185 199 -1.315380302376547e-02 +185 200 -1.105916272470026e-02 +185 201 -9.403863770832844e-03 +185 202 -8.076052134892604e-03 +185 203 -6.996835383339666e-03 +185 204 -6.109381318875744e-03 +185 205 -5.371977266379806e-03 +185 206 -4.753493624956896e-03 +185 207 -4.230349322908531e-03 +186 186 3.988394278152495e+01 +186 160 -2.783725492315670e-03 +186 161 -3.071047067257394e-03 +186 162 -3.401691470521393e-03 +186 163 -3.784439171232927e-03 +186 164 -4.230349322908531e-03 +186 165 -4.753493624956896e-03 +186 166 -5.371977266379801e-03 +186 167 -6.109381318875745e-03 +186 168 -6.996835383339681e-03 +186 169 -8.076052134892597e-03 +186 170 -9.403863770832830e-03 +186 171 -1.105916272470025e-02 +186 172 -1.315380302376545e-02 +186 173 -1.585023865775526e-02 +186 174 -1.939104886145111e-02 +186 175 -2.415034675252896e-02 +186 176 -3.072751892616537e-02 +186 177 -4.012781031912995e-02 +186 178 -5.413421453123172e-02 +186 179 -7.613960933881161e-02 +186 180 -1.132183869282766e-01 +186 181 -1.820810586422655e-01 +186 182 -3.301555353436761e-01 +186 183 -7.412185823610201e-01 +186 184 -3.165206906282877e+00 +186 185 -1.502055215860533e+01 +186 187 -1.502055215859221e+01 +186 188 -3.165206906282859e+00 +186 189 -7.412185823610180e-01 +186 190 -3.301555353436747e-01 +186 191 -1.820810586422646e-01 +186 192 -1.132183869282765e-01 +186 193 -7.613960933881178e-02 +186 194 -5.413421453123193e-02 +186 195 -4.012781031913000e-02 +186 196 -3.072751892616548e-02 +186 197 -2.415034675252901e-02 +186 198 -1.939104886145113e-02 +186 199 -1.585023865775527e-02 +186 200 -1.315380302376547e-02 +186 201 -1.105916272470028e-02 +186 202 -9.403863770832839e-03 +186 203 -8.076052134892594e-03 +186 204 -6.996835383339667e-03 +186 205 -6.109381318875749e-03 +186 206 -5.371977266379806e-03 +186 207 -4.753493624956896e-03 +187 187 3.988394278151355e+01 +187 160 -2.532689975072680e-03 +187 161 -2.783725492315675e-03 +187 162 -3.071047067257394e-03 +187 163 -3.401691470521396e-03 +187 164 -3.784439171232930e-03 +187 165 -4.230349322908535e-03 +187 166 -4.753493624956895e-03 +187 167 -5.371977266379805e-03 +187 168 -6.109381318875761e-03 +187 169 -6.996835383339681e-03 +187 170 -8.076052134892604e-03 +187 171 -9.403863770832833e-03 +187 172 -1.105916272470025e-02 +187 173 -1.315380302376546e-02 +187 174 -1.585023865775526e-02 +187 175 -1.939104886145111e-02 +187 176 -2.415034675252892e-02 +187 177 -3.072751892616543e-02 +187 178 -4.012781031912996e-02 +187 179 -5.413421453123171e-02 +187 180 -7.613960933881143e-02 +187 181 -1.132183869282764e-01 +187 182 -1.820810586422649e-01 +187 183 -3.301555353436758e-01 +187 184 -7.412185823610216e-01 +187 185 -3.165206906282870e+00 +187 186 -1.502055215859221e+01 +187 188 -1.502055215859652e+01 +187 189 -3.165206906282871e+00 +187 190 -7.412185823610191e-01 +187 191 -3.301555353436762e-01 +187 192 -1.820810586422654e-01 +187 193 -1.132183869282763e-01 +187 194 -7.613960933881175e-02 +187 195 -5.413421453123177e-02 +187 196 -4.012781031913001e-02 +187 197 -3.072751892616550e-02 +187 198 -2.415034675252899e-02 +187 199 -1.939104886145112e-02 +187 200 -1.585023865775527e-02 +187 201 -1.315380302376549e-02 +187 202 -1.105916272470026e-02 +187 203 -9.403863770832833e-03 +187 204 -8.076052134892589e-03 +187 205 -6.996835383339667e-03 +187 206 -6.109381318875744e-03 +187 207 -5.371977266379801e-03 +188 188 3.988394278151440e+01 +188 160 -2.312252367280536e-03 +188 161 -2.532689975072683e-03 +188 162 -2.783725492315674e-03 +188 163 -3.071047067257395e-03 +188 164 -3.401691470521396e-03 +188 165 -3.784439171232930e-03 +188 166 -4.230349322908533e-03 +188 167 -4.753493624956895e-03 +188 168 -5.371977266379814e-03 +188 169 -6.109381318875754e-03 +188 170 -6.996835383339681e-03 +188 171 -8.076052134892608e-03 +188 172 -9.403863770832840e-03 +188 173 -1.105916272470027e-02 +188 174 -1.315380302376548e-02 +188 175 -1.585023865775528e-02 +188 176 -1.939104886145111e-02 +188 177 -2.415034675252901e-02 +188 178 -3.072751892616551e-02 +188 179 -4.012781031913006e-02 +188 180 -5.413421453123173e-02 +188 181 -7.613960933881185e-02 +188 182 -1.132183869282766e-01 +188 183 -1.820810586422651e-01 +188 184 -3.301555353436757e-01 +188 185 -7.412185823610155e-01 +188 186 -3.165206906282859e+00 +188 187 -1.502055215859652e+01 +188 189 -1.502055215858804e+01 +188 190 -3.165206906282864e+00 +188 191 -7.412185823610198e-01 +188 192 -3.301555353436772e-01 +188 193 -1.820810586422650e-01 +188 194 -1.132183869282763e-01 +188 195 -7.613960933881138e-02 +188 196 -5.413421453123164e-02 +188 197 -4.012781031912994e-02 +188 198 -3.072751892616541e-02 +188 199 -2.415034675252893e-02 +188 200 -1.939104886145109e-02 +188 201 -1.585023865775527e-02 +188 202 -1.315380302376545e-02 +188 203 -1.105916272470024e-02 +188 204 -9.403863770832823e-03 +188 205 -8.076052134892594e-03 +188 206 -6.996835383339667e-03 +188 207 -6.109381318875745e-03 +189 189 3.988394278153930e+01 +189 160 -2.117777896667791e-03 +189 161 -2.312252367280536e-03 +189 162 -2.532689975072678e-03 +189 163 -2.783725492315670e-03 +189 164 -3.071047067257391e-03 +189 165 -3.401691470521391e-03 +189 166 -3.784439171232922e-03 +189 167 -4.230349322908526e-03 +189 168 -4.753493624956896e-03 +189 169 -5.371977266379802e-03 +189 170 -6.109381318875744e-03 +189 171 -6.996835383339669e-03 +189 172 -8.076052134892596e-03 +189 173 -9.403863770832837e-03 +189 174 -1.105916272470026e-02 +189 175 -1.315380302376547e-02 +189 176 -1.585023865775525e-02 +189 177 -1.939104886145113e-02 +189 178 -2.415034675252899e-02 +189 179 -3.072751892616548e-02 +189 180 -4.012781031912992e-02 +189 181 -5.413421453123179e-02 +189 182 -7.613960933881163e-02 +189 183 -1.132183869282763e-01 +189 184 -1.820810586422653e-01 +189 185 -3.301555353436763e-01 +189 186 -7.412185823610180e-01 +189 187 -3.165206906282871e+00 +189 188 -1.502055215858804e+01 +189 190 -1.502055215864000e+01 +189 191 -3.165206906282859e+00 +189 192 -7.412185823610143e-01 +189 193 -3.301555353436751e-01 +189 194 -1.820810586422650e-01 +189 195 -1.132183869282759e-01 +189 196 -7.613960933881155e-02 +189 197 -5.413421453123179e-02 +189 198 -4.012781031912997e-02 +189 199 -3.072751892616543e-02 +189 200 -2.415034675252897e-02 +189 201 -1.939104886145114e-02 +189 202 -1.585023865775526e-02 +189 203 -1.315380302376546e-02 +189 204 -1.105916272470026e-02 +189 205 -9.403863770832846e-03 +189 206 -8.076052134892604e-03 +189 207 -6.996835383339681e-03 +190 190 3.988394278164017e+01 +190 160 -1.945462087124852e-03 +190 161 -2.117777896667795e-03 +190 162 -2.312252367280536e-03 +190 163 -2.532689975072680e-03 +190 164 -2.783725492315672e-03 +190 165 -3.071047067257393e-03 +190 166 -3.401691470521391e-03 +190 167 -3.784439171232924e-03 +190 168 -4.230349322908535e-03 +190 169 -4.753493624956896e-03 +190 170 -5.371977266379806e-03 +190 171 -6.109381318875749e-03 +190 172 -6.996835383339674e-03 +190 173 -8.076052134892592e-03 +190 174 -9.403863770832830e-03 +190 175 -1.105916272470025e-02 +190 176 -1.315380302376544e-02 +190 177 -1.585023865775526e-02 +190 178 -1.939104886145111e-02 +190 179 -2.415034675252896e-02 +190 180 -3.072751892616537e-02 +190 181 -4.012781031912995e-02 +190 182 -5.413421453123172e-02 +190 183 -7.613960933881156e-02 +190 184 -1.132183869282762e-01 +190 185 -1.820810586422651e-01 +190 186 -3.301555353436747e-01 +190 187 -7.412185823610191e-01 +190 188 -3.165206906282864e+00 +190 189 -1.502055215864000e+01 +190 191 -1.502055215866001e+01 +190 192 -3.165206906282867e+00 +190 193 -7.412185823610202e-01 +190 194 -3.301555353436767e-01 +190 195 -1.820810586422652e-01 +190 196 -1.132183869282765e-01 +190 197 -7.613960933881173e-02 +190 198 -5.413421453123180e-02 +190 199 -4.012781031913000e-02 +190 200 -3.072751892616548e-02 +190 201 -2.415034675252904e-02 +190 202 -1.939104886145113e-02 +190 203 -1.585023865775527e-02 +190 204 -1.315380302376547e-02 +190 205 -1.105916272470028e-02 +190 206 -9.403863770832835e-03 +190 207 -8.076052134892597e-03 +191 191 3.988394278169705e+01 +191 160 -1.792160480940037e-03 +191 161 -1.945462087124854e-03 +191 162 -2.117777896667794e-03 +191 163 -2.312252367280536e-03 +191 164 -2.532689975072680e-03 +191 165 -2.783725492315672e-03 +191 166 -3.071047067257391e-03 +191 167 -3.401691470521391e-03 +191 168 -3.784439171232929e-03 +191 169 -4.230349322908531e-03 +191 170 -4.753493624956896e-03 +191 171 -5.371977266379806e-03 +191 172 -6.109381318875749e-03 +191 173 -6.996835383339667e-03 +191 174 -8.076052134892590e-03 +191 175 -9.403863770832835e-03 +191 176 -1.105916272470024e-02 +191 177 -1.315380302376547e-02 +191 178 -1.585023865775526e-02 +191 179 -1.939104886145111e-02 +191 180 -2.415034675252893e-02 +191 181 -3.072751892616545e-02 +191 182 -4.012781031912999e-02 +191 183 -5.413421453123174e-02 +191 184 -7.613960933881145e-02 +191 185 -1.132183869282764e-01 +191 186 -1.820810586422646e-01 +191 187 -3.301555353436762e-01 +191 188 -7.412185823610198e-01 +191 189 -3.165206906282859e+00 +191 190 -1.502055215866001e+01 +191 192 -1.502055215931065e+01 +191 193 -3.165206906282867e+00 +191 194 -7.412185823610205e-01 +191 195 -3.301555353436769e-01 +191 196 -1.820810586422652e-01 +191 197 -1.132183869282765e-01 +191 198 -7.613960933881171e-02 +191 199 -5.413421453123171e-02 +191 200 -4.012781031912997e-02 +191 201 -3.072751892616551e-02 +191 202 -2.415034675252897e-02 +191 203 -1.939104886145111e-02 +191 204 -1.585023865775526e-02 +191 205 -1.315380302376548e-02 +191 206 -1.105916272470026e-02 +191 207 -9.403863770832830e-03 +192 192 3.988394278169704e+01 +192 176 -9.403863770832833e-03 +192 177 -1.105916272470028e-02 +192 178 -1.315380302376549e-02 +192 179 -1.585023865775529e-02 +192 180 -1.939104886145112e-02 +192 181 -2.415034675252904e-02 +192 182 -3.072751892616553e-02 +192 183 -4.012781031913009e-02 +192 184 -5.413421453123177e-02 +192 185 -7.613960933881181e-02 +192 186 -1.132183869282765e-01 +192 187 -1.820810586422654e-01 +192 188 -3.301555353436772e-01 +192 189 -7.412185823610143e-01 +192 190 -3.165206906282867e+00 +192 191 -1.502055215931065e+01 +192 193 -1.502055215866002e+01 +192 194 -3.165206906282868e+00 +192 195 -7.412185823610166e-01 +192 196 -3.301555353436764e-01 +192 197 -1.820810586422652e-01 +192 198 -1.132183869282764e-01 +192 199 -7.613960933881138e-02 +192 200 -5.413421453123158e-02 +192 201 -4.012781031912996e-02 +192 202 -3.072751892616538e-02 +192 203 -2.415034675252892e-02 +192 204 -1.939104886145108e-02 +192 205 -1.585023865775526e-02 +192 206 -1.315380302376544e-02 +192 207 -1.105916272470024e-02 +192 208 -9.403863770832820e-03 +192 209 -8.076052134892604e-03 +192 210 -6.996835383339666e-03 +192 211 -6.109381318875744e-03 +192 212 -5.371977266379806e-03 +192 213 -4.753493624956896e-03 +192 214 -4.230349322908531e-03 +192 215 -3.784439171232927e-03 +192 216 -3.401691470521395e-03 +192 217 -3.071047067257391e-03 +192 218 -2.783725492315670e-03 +192 219 -2.532689975072680e-03 +192 220 -2.312252367280536e-03 +192 221 -2.117777896667794e-03 +192 222 -1.945462087124853e-03 +192 223 -1.792160480940039e-03 +193 193 3.988394278164020e+01 +193 176 -8.076052134892597e-03 +193 177 -9.403863770832844e-03 +193 178 -1.105916272470027e-02 +193 179 -1.315380302376548e-02 +193 180 -1.585023865775526e-02 +193 181 -1.939104886145115e-02 +193 182 -2.415034675252902e-02 +193 183 -3.072751892616552e-02 +193 184 -4.012781031912998e-02 +193 185 -5.413421453123190e-02 +193 186 -7.613960933881178e-02 +193 187 -1.132183869282763e-01 +193 188 -1.820810586422650e-01 +193 189 -3.301555353436751e-01 +193 190 -7.412185823610202e-01 +193 191 -3.165206906282867e+00 +193 192 -1.502055215866002e+01 +193 194 -1.502055215864000e+01 +193 195 -3.165206906282859e+00 +193 196 -7.412185823610230e-01 +193 197 -3.301555353436766e-01 +193 198 -1.820810586422657e-01 +193 199 -1.132183869282763e-01 +193 200 -7.613960933881145e-02 +193 201 -5.413421453123175e-02 +193 202 -4.012781031912990e-02 +193 203 -3.072751892616538e-02 +193 204 -2.415034675252893e-02 +193 205 -1.939104886145112e-02 +193 206 -1.585023865775524e-02 +193 207 -1.315380302376545e-02 +193 208 -1.105916272470024e-02 +193 209 -9.403863770832840e-03 +193 210 -8.076052134892590e-03 +193 211 -6.996835383339667e-03 +193 212 -6.109381318875749e-03 +193 213 -5.371977266379806e-03 +193 214 -4.753493624956896e-03 +193 215 -4.230349322908531e-03 +193 216 -3.784439171232929e-03 +193 217 -3.401691470521391e-03 +193 218 -3.071047067257390e-03 +193 219 -2.783725492315672e-03 +193 220 -2.532689975072680e-03 +193 221 -2.312252367280536e-03 +193 222 -2.117777896667794e-03 +193 223 -1.945462087124854e-03 +194 194 3.988394278153931e+01 +194 176 -6.996835383339674e-03 +194 177 -8.076052134892601e-03 +194 178 -9.403863770832844e-03 +194 179 -1.105916272470027e-02 +194 180 -1.315380302376547e-02 +194 181 -1.585023865775529e-02 +194 182 -1.939104886145116e-02 +194 183 -2.415034675252903e-02 +194 184 -3.072751892616547e-02 +194 185 -4.012781031913010e-02 +194 186 -5.413421453123193e-02 +194 187 -7.613960933881175e-02 +194 188 -1.132183869282763e-01 +194 189 -1.820810586422650e-01 +194 190 -3.301555353436767e-01 +194 191 -7.412185823610205e-01 +194 192 -3.165206906282868e+00 +194 193 -1.502055215864000e+01 +194 195 -1.502055215858802e+01 +194 196 -3.165206906282871e+00 +194 197 -7.412185823610200e-01 +194 198 -3.301555353436775e-01 +194 199 -1.820810586422653e-01 +194 200 -1.132183869282762e-01 +194 201 -7.613960933881156e-02 +194 202 -5.413421453123161e-02 +194 203 -4.012781031912986e-02 +194 204 -3.072751892616538e-02 +194 205 -2.415034675252897e-02 +194 206 -1.939104886145108e-02 +194 207 -1.585023865775523e-02 +194 208 -1.315380302376545e-02 +194 209 -1.105916272470025e-02 +194 210 -9.403863770832820e-03 +194 211 -8.076052134892590e-03 +194 212 -6.996835383339674e-03 +194 213 -6.109381318875749e-03 +194 214 -5.371977266379806e-03 +194 215 -4.753493624956896e-03 +194 216 -4.230349322908535e-03 +194 217 -3.784439171232924e-03 +194 218 -3.401691470521391e-03 +194 219 -3.071047067257393e-03 +194 220 -2.783725492315672e-03 +194 221 -2.532689975072680e-03 +194 222 -2.312252367280536e-03 +194 223 -2.117777896667795e-03 +195 195 3.988394278151442e+01 +195 176 -6.109381318875754e-03 +195 177 -6.996835383339680e-03 +195 178 -8.076052134892606e-03 +195 179 -9.403863770832837e-03 +195 180 -1.105916272470024e-02 +195 181 -1.315380302376547e-02 +195 182 -1.585023865775527e-02 +195 183 -1.939104886145112e-02 +195 184 -2.415034675252893e-02 +195 185 -3.072751892616547e-02 +195 186 -4.012781031913000e-02 +195 187 -5.413421453123177e-02 +195 188 -7.613960933881138e-02 +195 189 -1.132183869282759e-01 +195 190 -1.820810586422652e-01 +195 191 -3.301555353436769e-01 +195 192 -7.412185823610166e-01 +195 193 -3.165206906282859e+00 +195 194 -1.502055215858802e+01 +195 196 -1.502055215859655e+01 +195 197 -3.165206906282872e+00 +195 198 -7.412185823610187e-01 +195 199 -3.301555353436760e-01 +195 200 -1.820810586422653e-01 +195 201 -1.132183869282766e-01 +195 202 -7.613960933881170e-02 +195 203 -5.413421453123175e-02 +195 204 -4.012781031912999e-02 +195 205 -3.072751892616552e-02 +195 206 -2.415034675252898e-02 +195 207 -1.939104886145111e-02 +195 208 -1.585023865775527e-02 +195 209 -1.315380302376548e-02 +195 210 -1.105916272470026e-02 +195 211 -9.403863770832832e-03 +195 212 -8.076052134892594e-03 +195 213 -6.996835383339667e-03 +195 214 -6.109381318875745e-03 +195 215 -5.371977266379802e-03 +195 216 -4.753493624956896e-03 +195 217 -4.230349322908526e-03 +195 218 -3.784439171232922e-03 +195 219 -3.401691470521391e-03 +195 220 -3.071047067257391e-03 +195 221 -2.783725492315670e-03 +195 222 -2.532689975072678e-03 +195 223 -2.312252367280536e-03 +196 196 3.988394278151357e+01 +196 176 -5.371977266379802e-03 +196 177 -6.109381318875744e-03 +196 178 -6.996835383339666e-03 +196 179 -8.076052134892590e-03 +196 180 -9.403863770832823e-03 +196 181 -1.105916272470026e-02 +196 182 -1.315380302376547e-02 +196 183 -1.585023865775527e-02 +196 184 -1.939104886145110e-02 +196 185 -2.415034675252899e-02 +196 186 -3.072751892616548e-02 +196 187 -4.012781031913001e-02 +196 188 -5.413421453123164e-02 +196 189 -7.613960933881155e-02 +196 190 -1.132183869282765e-01 +196 191 -1.820810586422652e-01 +196 192 -3.301555353436764e-01 +196 193 -7.412185823610230e-01 +196 194 -3.165206906282871e+00 +196 195 -1.502055215859655e+01 +196 197 -1.502055215859221e+01 +196 198 -3.165206906282863e+00 +196 199 -7.412185823610191e-01 +196 200 -3.301555353436751e-01 +196 201 -1.820810586422650e-01 +196 202 -1.132183869282766e-01 +196 203 -7.613960933881157e-02 +196 204 -5.413421453123168e-02 +196 205 -4.012781031913001e-02 +196 206 -3.072751892616542e-02 +196 207 -2.415034675252895e-02 +196 208 -1.939104886145110e-02 +196 209 -1.585023865775527e-02 +196 210 -1.315380302376546e-02 +196 211 -1.105916272470025e-02 +196 212 -9.403863770832828e-03 +196 213 -8.076052134892604e-03 +196 214 -6.996835383339681e-03 +196 215 -6.109381318875755e-03 +196 216 -5.371977266379815e-03 +196 217 -4.753493624956896e-03 +196 218 -4.230349322908531e-03 +196 219 -3.784439171232930e-03 +196 220 -3.401691470521396e-03 +196 221 -3.071047067257395e-03 +196 222 -2.783725492315674e-03 +196 223 -2.532689975072683e-03 +197 197 3.988394278152496e+01 +197 176 -4.753493624956891e-03 +197 177 -5.371977266379801e-03 +197 178 -6.109381318875744e-03 +197 179 -6.996835383339667e-03 +197 180 -8.076052134892590e-03 +197 181 -9.403863770832840e-03 +197 182 -1.105916272470027e-02 +197 183 -1.315380302376548e-02 +197 184 -1.585023865775525e-02 +197 185 -1.939104886145114e-02 +197 186 -2.415034675252901e-02 +197 187 -3.072751892616550e-02 +197 188 -4.012781031912994e-02 +197 189 -5.413421453123179e-02 +197 190 -7.613960933881173e-02 +197 191 -1.132183869282765e-01 +197 192 -1.820810586422652e-01 +197 193 -3.301555353436766e-01 +197 194 -7.412185823610200e-01 +197 195 -3.165206906282872e+00 +197 196 -1.502055215859221e+01 +197 198 -1.502055215860531e+01 +197 199 -3.165206906282870e+00 +197 200 -7.412185823610210e-01 +197 201 -3.301555353436773e-01 +197 202 -1.820810586422657e-01 +197 203 -1.132183869282763e-01 +197 204 -7.613960933881153e-02 +197 205 -5.413421453123182e-02 +197 206 -4.012781031912994e-02 +197 207 -3.072751892616542e-02 +197 208 -2.415034675252896e-02 +197 209 -1.939104886145113e-02 +197 210 -1.585023865775526e-02 +197 211 -1.315380302376546e-02 +197 212 -1.105916272470025e-02 +197 213 -9.403863770832844e-03 +197 214 -8.076052134892604e-03 +197 215 -6.996835383339681e-03 +197 216 -6.109381318875760e-03 +197 217 -5.371977266379806e-03 +197 218 -4.753493624956895e-03 +197 219 -4.230349322908535e-03 +197 220 -3.784439171232930e-03 +197 221 -3.401691470521395e-03 +197 222 -3.071047067257394e-03 +197 223 -2.783725492315676e-03 +198 198 3.988394278128563e+01 +198 176 -4.230349322908531e-03 +198 177 -4.753493624956896e-03 +198 178 -5.371977266379806e-03 +198 179 -6.109381318875749e-03 +198 180 -6.996835383339667e-03 +198 181 -8.076052134892590e-03 +198 182 -9.403863770832839e-03 +198 183 -1.105916272470026e-02 +198 184 -1.315380302376545e-02 +198 185 -1.585023865775527e-02 +198 186 -1.939104886145113e-02 +198 187 -2.415034675252899e-02 +198 188 -3.072751892616541e-02 +198 189 -4.012781031912997e-02 +198 190 -5.413421453123180e-02 +198 191 -7.613960933881171e-02 +198 192 -1.132183869282764e-01 +198 193 -1.820810586422657e-01 +198 194 -3.301555353436775e-01 +198 195 -7.412185823610187e-01 +198 196 -3.165206906282863e+00 +198 197 -1.502055215860531e+01 +198 199 -1.502055215840048e+01 +198 200 -3.165206906282868e+00 +198 201 -7.412185823610178e-01 +198 202 -3.301555353436766e-01 +198 203 -1.820810586422652e-01 +198 204 -1.132183869282765e-01 +198 205 -7.613960933881164e-02 +198 206 -5.413421453123170e-02 +198 207 -4.012781031912992e-02 +198 208 -3.072751892616542e-02 +198 209 -2.415034675252900e-02 +198 210 -1.939104886145110e-02 +198 211 -1.585023865775525e-02 +198 212 -1.315380302376546e-02 +198 213 -1.105916272470026e-02 +198 214 -9.403863770832825e-03 +198 215 -8.076052134892594e-03 +198 216 -6.996835383339680e-03 +198 217 -6.109381318875744e-03 +198 218 -5.371977266379801e-03 +198 219 -4.753493624956896e-03 +198 220 -4.230349322908531e-03 +198 221 -3.784439171232927e-03 +198 222 -3.401691470521393e-03 +198 223 -3.071047067257394e-03 +199 199 3.988394278105614e+01 +199 176 -3.784439171232927e-03 +199 177 -4.230349322908531e-03 +199 178 -4.753493624956896e-03 +199 179 -5.371977266379806e-03 +199 180 -6.109381318875744e-03 +199 181 -6.996835383339667e-03 +199 182 -8.076052134892604e-03 +199 183 -9.403863770832833e-03 +199 184 -1.105916272470024e-02 +199 185 -1.315380302376547e-02 +199 186 -1.585023865775527e-02 +199 187 -1.939104886145112e-02 +199 188 -2.415034675252893e-02 +199 189 -3.072751892616543e-02 +199 190 -4.012781031913000e-02 +199 191 -5.413421453123171e-02 +199 192 -7.613960933881138e-02 +199 193 -1.132183869282763e-01 +199 194 -1.820810586422653e-01 +199 195 -3.301555353436760e-01 +199 196 -7.412185823610191e-01 +199 197 -3.165206906282870e+00 +199 198 -1.502055215840048e+01 +199 200 -1.502055215835490e+01 +199 201 -3.165206906282867e+00 +199 202 -7.412185823610218e-01 +199 203 -3.301555353436763e-01 +199 204 -1.820810586422653e-01 +199 205 -1.132183869282762e-01 +199 206 -7.613960933881166e-02 +199 207 -5.413421453123175e-02 +199 208 -4.012781031912999e-02 +199 209 -3.072751892616552e-02 +199 210 -2.415034675252898e-02 +199 211 -1.939104886145111e-02 +199 212 -1.585023865775527e-02 +199 213 -1.315380302376548e-02 +199 214 -1.105916272470026e-02 +199 215 -9.403863770832832e-03 +199 216 -8.076052134892604e-03 +199 217 -6.996835383339666e-03 +199 218 -6.109381318875744e-03 +199 219 -5.371977266379806e-03 +199 220 -4.753493624956896e-03 +199 221 -4.230349322908531e-03 +199 222 -3.784439171232927e-03 +199 223 -3.401691470521395e-03 +200 200 3.988394278102304e+01 +200 176 -3.401691470521393e-03 +200 177 -3.784439171232927e-03 +200 178 -4.230349322908531e-03 +200 179 -4.753493624956896e-03 +200 180 -5.371977266379801e-03 +200 181 -6.109381318875745e-03 +200 182 -6.996835383339681e-03 +200 183 -8.076052134892596e-03 +200 184 -9.403863770832823e-03 +200 185 -1.105916272470026e-02 +200 186 -1.315380302376547e-02 +200 187 -1.585023865775527e-02 +200 188 -1.939104886145109e-02 +200 189 -2.415034675252897e-02 +200 190 -3.072751892616548e-02 +200 191 -4.012781031912997e-02 +200 192 -5.413421453123158e-02 +200 193 -7.613960933881145e-02 +200 194 -1.132183869282762e-01 +200 195 -1.820810586422653e-01 +200 196 -3.301555353436751e-01 +200 197 -7.412185823610210e-01 +200 198 -3.165206906282868e+00 +200 199 -1.502055215835490e+01 +200 201 -1.502055215836222e+01 +200 202 -3.165206906282870e+00 +200 203 -7.412185823610193e-01 +200 204 -3.301555353436773e-01 +200 205 -1.820810586422656e-01 +200 206 -1.132183869282766e-01 +200 207 -7.613960933881157e-02 +200 208 -5.413421453123168e-02 +200 209 -4.012781031913001e-02 +200 210 -3.072751892616542e-02 +200 211 -2.415034675252895e-02 +200 212 -1.939104886145110e-02 +200 213 -1.585023865775527e-02 +200 214 -1.315380302376546e-02 +200 215 -1.105916272470025e-02 +200 216 -9.403863770832828e-03 +200 217 -8.076052134892592e-03 +200 218 -6.996835383339667e-03 +200 219 -6.109381318875749e-03 +200 220 -5.371977266379806e-03 +200 221 -4.753493624956896e-03 +200 222 -4.230349322908531e-03 +200 223 -3.784439171232929e-03 +201 201 3.988394278106476e+01 +201 176 -3.071047067257393e-03 +201 177 -3.401691470521393e-03 +201 178 -3.784439171232927e-03 +201 179 -4.230349322908531e-03 +201 180 -4.753493624956892e-03 +201 181 -5.371977266379802e-03 +201 182 -6.109381318875754e-03 +201 183 -6.996835383339674e-03 +201 184 -8.076052134892597e-03 +201 185 -9.403863770832844e-03 +201 186 -1.105916272470028e-02 +201 187 -1.315380302376549e-02 +201 188 -1.585023865775527e-02 +201 189 -1.939104886145114e-02 +201 190 -2.415034675252904e-02 +201 191 -3.072751892616551e-02 +201 192 -4.012781031912996e-02 +201 193 -5.413421453123175e-02 +201 194 -7.613960933881156e-02 +201 195 -1.132183869282766e-01 +201 196 -1.820810586422650e-01 +201 197 -3.301555353436773e-01 +201 198 -7.412185823610178e-01 +201 199 -3.165206906282867e+00 +201 200 -1.502055215836222e+01 +201 202 -1.502055215839541e+01 +201 203 -3.165206906282873e+00 +201 204 -7.412185823610185e-01 +201 205 -3.301555353436767e-01 +201 206 -1.820810586422649e-01 +201 207 -1.132183869282764e-01 +201 208 -7.613960933881153e-02 +201 209 -5.413421453123175e-02 +201 210 -4.012781031912990e-02 +201 211 -3.072751892616538e-02 +201 212 -2.415034675252893e-02 +201 213 -1.939104886145111e-02 +201 214 -1.585023865775524e-02 +201 215 -1.315380302376544e-02 +201 216 -1.105916272470024e-02 +201 217 -9.403863770832832e-03 +201 218 -8.076052134892590e-03 +201 219 -6.996835383339674e-03 +201 220 -6.109381318875749e-03 +201 221 -5.371977266379806e-03 +201 222 -4.753493624956896e-03 +201 223 -4.230349322908535e-03 +202 202 3.988394278115154e+01 +202 176 -2.783725492315673e-03 +202 177 -3.071047067257394e-03 +202 178 -3.401691470521395e-03 +202 179 -3.784439171232929e-03 +202 180 -4.230349322908531e-03 +202 181 -4.753493624956895e-03 +202 182 -5.371977266379814e-03 +202 183 -6.109381318875754e-03 +202 184 -6.996835383339680e-03 +202 185 -8.076052134892604e-03 +202 186 -9.403863770832839e-03 +202 187 -1.105916272470026e-02 +202 188 -1.315380302376545e-02 +202 189 -1.585023865775526e-02 +202 190 -1.939104886145113e-02 +202 191 -2.415034675252897e-02 +202 192 -3.072751892616538e-02 +202 193 -4.012781031912990e-02 +202 194 -5.413421453123161e-02 +202 195 -7.613960933881170e-02 +202 196 -1.132183869282766e-01 +202 197 -1.820810586422657e-01 +202 198 -3.301555353436766e-01 +202 199 -7.412185823610218e-01 +202 200 -3.165206906282870e+00 +202 201 -1.502055215839541e+01 +202 203 -1.502055215844907e+01 +202 204 -3.165206906282863e+00 +202 205 -7.412185823610189e-01 +202 206 -3.301555353436747e-01 +202 207 -1.820810586422648e-01 +202 208 -1.132183869282765e-01 +202 209 -7.613960933881170e-02 +202 210 -5.413421453123169e-02 +202 211 -4.012781031912992e-02 +202 212 -3.072751892616542e-02 +202 213 -2.415034675252899e-02 +202 214 -1.939104886145110e-02 +202 215 -1.585023865775525e-02 +202 216 -1.315380302376546e-02 +202 217 -1.105916272470026e-02 +202 218 -9.403863770832823e-03 +202 219 -8.076052134892590e-03 +202 220 -6.996835383339667e-03 +202 221 -6.109381318875745e-03 +202 222 -5.371977266379802e-03 +202 223 -4.753493624956896e-03 +203 203 3.988394278128113e+01 +203 176 -2.532689975072678e-03 +203 177 -2.783725492315670e-03 +203 178 -3.071047067257391e-03 +203 179 -3.401691470521391e-03 +203 180 -3.784439171232922e-03 +203 181 -4.230349322908526e-03 +203 182 -4.753493624956895e-03 +203 183 -5.371977266379802e-03 +203 184 -6.109381318875744e-03 +203 185 -6.996835383339666e-03 +203 186 -8.076052134892594e-03 +203 187 -9.403863770832833e-03 +203 188 -1.105916272470024e-02 +203 189 -1.315380302376546e-02 +203 190 -1.585023865775527e-02 +203 191 -1.939104886145111e-02 +203 192 -2.415034675252892e-02 +203 193 -3.072751892616538e-02 +203 194 -4.012781031912986e-02 +203 195 -5.413421453123175e-02 +203 196 -7.613960933881157e-02 +203 197 -1.132183869282763e-01 +203 198 -1.820810586422652e-01 +203 199 -3.301555353436763e-01 +203 200 -7.412185823610193e-01 +203 201 -3.165206906282873e+00 +203 202 -1.502055215844907e+01 +203 204 -1.502055215852575e+01 +203 205 -3.165206906282862e+00 +203 206 -7.412185823610168e-01 +203 207 -3.301555353436746e-01 +203 208 -1.820810586422655e-01 +203 209 -1.132183869282764e-01 +203 210 -7.613960933881161e-02 +203 211 -5.413421453123175e-02 +203 212 -4.012781031912999e-02 +203 213 -3.072751892616552e-02 +203 214 -2.415034675252898e-02 +203 215 -1.939104886145111e-02 +203 216 -1.585023865775527e-02 +203 217 -1.315380302376548e-02 +203 218 -1.105916272470026e-02 +203 219 -9.403863770832837e-03 +203 220 -8.076052134892604e-03 +203 221 -6.996835383339681e-03 +203 222 -6.109381318875755e-03 +203 223 -5.371977266379815e-03 +204 204 3.988394278146370e+01 +204 176 -2.312252367280534e-03 +204 177 -2.532689975072678e-03 +204 178 -2.783725492315670e-03 +204 179 -3.071047067257390e-03 +204 180 -3.401691470521388e-03 +204 181 -3.784439171232921e-03 +204 182 -4.230349322908531e-03 +204 183 -4.753493624956891e-03 +204 184 -5.371977266379801e-03 +204 185 -6.109381318875744e-03 +204 186 -6.996835383339667e-03 +204 187 -8.076052134892589e-03 +204 188 -9.403863770832823e-03 +204 189 -1.105916272470026e-02 +204 190 -1.315380302376547e-02 +204 191 -1.585023865775526e-02 +204 192 -1.939104886145108e-02 +204 193 -2.415034675252893e-02 +204 194 -3.072751892616538e-02 +204 195 -4.012781031912999e-02 +204 196 -5.413421453123168e-02 +204 197 -7.613960933881153e-02 +204 198 -1.132183869282765e-01 +204 199 -1.820810586422653e-01 +204 200 -3.301555353436773e-01 +204 201 -7.412185823610185e-01 +204 202 -3.165206906282863e+00 +204 203 -1.502055215852575e+01 +204 205 -1.502055215863300e+01 +204 206 -3.165206906282871e+00 +204 207 -7.412185823610166e-01 +204 208 -3.301555353436766e-01 +204 209 -1.820810586422654e-01 +204 210 -1.132183869282763e-01 +204 211 -7.613960933881161e-02 +204 212 -5.413421453123168e-02 +204 213 -4.012781031913001e-02 +204 214 -3.072751892616542e-02 +204 215 -2.415034675252895e-02 +204 216 -1.939104886145110e-02 +204 217 -1.585023865775527e-02 +204 218 -1.315380302376546e-02 +204 219 -1.105916272470025e-02 +204 220 -9.403863770832828e-03 +204 221 -8.076052134892604e-03 +204 222 -6.996835383339681e-03 +204 223 -6.109381318875760e-03 +205 205 3.988394278171953e+01 +205 176 -2.117777896667794e-03 +205 177 -2.312252367280536e-03 +205 178 -2.532689975072680e-03 +205 179 -2.783725492315672e-03 +205 180 -3.071047067257391e-03 +205 181 -3.401691470521391e-03 +205 182 -3.784439171232929e-03 +205 183 -4.230349322908531e-03 +205 184 -4.753493624956896e-03 +205 185 -5.371977266379806e-03 +205 186 -6.109381318875749e-03 +205 187 -6.996835383339667e-03 +205 188 -8.076052134892594e-03 +205 189 -9.403863770832846e-03 +205 190 -1.105916272470028e-02 +205 191 -1.315380302376548e-02 +205 192 -1.585023865775526e-02 +205 193 -1.939104886145112e-02 +205 194 -2.415034675252897e-02 +205 195 -3.072751892616552e-02 +205 196 -4.012781031913001e-02 +205 197 -5.413421453123182e-02 +205 198 -7.613960933881164e-02 +205 199 -1.132183869282762e-01 +205 200 -1.820810586422656e-01 +205 201 -3.301555353436767e-01 +205 202 -7.412185823610189e-01 +205 203 -3.165206906282862e+00 +205 204 -1.502055215863300e+01 +205 206 -1.502055215878375e+01 +205 207 -3.165206906282870e+00 +205 208 -7.412185823610203e-01 +205 209 -3.301555353436765e-01 +205 210 -1.820810586422651e-01 +205 211 -1.132183869282768e-01 +205 212 -7.613960933881153e-02 +205 213 -5.413421453123175e-02 +205 214 -4.012781031912990e-02 +205 215 -3.072751892616538e-02 +205 216 -2.415034675252893e-02 +205 217 -1.939104886145111e-02 +205 218 -1.585023865775524e-02 +205 219 -1.315380302376544e-02 +205 220 -1.105916272470024e-02 +205 221 -9.403863770832832e-03 +205 222 -8.076052134892597e-03 +205 223 -6.996835383339680e-03 +206 206 3.988394278208169e+01 +206 176 -1.945462087124853e-03 +206 177 -2.117777896667794e-03 +206 178 -2.312252367280536e-03 +206 179 -2.532689975072680e-03 +206 180 -2.783725492315670e-03 +206 181 -3.071047067257390e-03 +206 182 -3.401691470521395e-03 +206 183 -3.784439171232927e-03 +206 184 -4.230349322908531e-03 +206 185 -4.753493624956896e-03 +206 186 -5.371977266379806e-03 +206 187 -6.109381318875744e-03 +206 188 -6.996835383339667e-03 +206 189 -8.076052134892604e-03 +206 190 -9.403863770832835e-03 +206 191 -1.105916272470026e-02 +206 192 -1.315380302376544e-02 +206 193 -1.585023865775524e-02 +206 194 -1.939104886145108e-02 +206 195 -2.415034675252898e-02 +206 196 -3.072751892616542e-02 +206 197 -4.012781031912994e-02 +206 198 -5.413421453123170e-02 +206 199 -7.613960933881166e-02 +206 200 -1.132183869282766e-01 +206 201 -1.820810586422649e-01 +206 202 -3.301555353436747e-01 +206 203 -7.412185823610168e-01 +206 204 -3.165206906282871e+00 +206 205 -1.502055215878375e+01 +206 207 -1.502055215899859e+01 +206 208 -3.165206906282865e+00 +206 209 -7.412185823610205e-01 +206 210 -3.301555353436773e-01 +206 211 -1.820810586422663e-01 +206 212 -1.132183869282767e-01 +206 213 -7.613960933881184e-02 +206 214 -5.413421453123169e-02 +206 215 -4.012781031912992e-02 +206 216 -3.072751892616542e-02 +206 217 -2.415034675252899e-02 +206 218 -1.939104886145110e-02 +206 219 -1.585023865775525e-02 +206 220 -1.315380302376546e-02 +206 221 -1.105916272470026e-02 +206 222 -9.403863770832832e-03 +206 223 -8.076052134892601e-03 +207 207 3.988394278260304e+01 +207 176 -1.792160480940038e-03 +207 177 -1.945462087124853e-03 +207 178 -2.117777896667794e-03 +207 179 -2.312252367280536e-03 +207 180 -2.532689975072678e-03 +207 181 -2.783725492315670e-03 +207 182 -3.071047067257394e-03 +207 183 -3.401691470521393e-03 +207 184 -3.784439171232927e-03 +207 185 -4.230349322908531e-03 +207 186 -4.753493624956896e-03 +207 187 -5.371977266379801e-03 +207 188 -6.109381318875745e-03 +207 189 -6.996835383339681e-03 +207 190 -8.076052134892597e-03 +207 191 -9.403863770832830e-03 +207 192 -1.105916272470024e-02 +207 193 -1.315380302376545e-02 +207 194 -1.585023865775523e-02 +207 195 -1.939104886145111e-02 +207 196 -2.415034675252895e-02 +207 197 -3.072751892616542e-02 +207 198 -4.012781031912992e-02 +207 199 -5.413421453123175e-02 +207 200 -7.613960933881157e-02 +207 201 -1.132183869282764e-01 +207 202 -1.820810586422648e-01 +207 203 -3.301555353436746e-01 +207 204 -7.412185823610166e-01 +207 205 -3.165206906282870e+00 +207 206 -1.502055215899859e+01 +207 208 -1.502055215931065e+01 +207 209 -3.165206906282871e+00 +207 210 -7.412185823610203e-01 +207 211 -3.301555353436784e-01 +207 212 -1.820810586422658e-01 +207 213 -1.132183869282767e-01 +207 214 -7.613960933881166e-02 +207 215 -5.413421453123175e-02 +207 216 -4.012781031912999e-02 +207 217 -3.072751892616552e-02 +207 218 -2.415034675252898e-02 +207 219 -1.939104886145111e-02 +207 220 -1.585023865775527e-02 +207 221 -1.315380302376549e-02 +207 222 -1.105916272470027e-02 +207 223 -9.403863770832837e-03 +208 208 3.988394278260303e+01 +208 192 -9.403863770832820e-03 +208 193 -1.105916272470024e-02 +208 194 -1.315380302376545e-02 +208 195 -1.585023865775527e-02 +208 196 -1.939104886145110e-02 +208 197 -2.415034675252896e-02 +208 198 -3.072751892616542e-02 +208 199 -4.012781031912999e-02 +208 200 -5.413421453123168e-02 +208 201 -7.613960933881153e-02 +208 202 -1.132183869282765e-01 +208 203 -1.820810586422655e-01 +208 204 -3.301555353436766e-01 +208 205 -7.412185823610203e-01 +208 206 -3.165206906282865e+00 +208 207 -1.502055215931065e+01 +208 209 -1.502055215899861e+01 +208 210 -3.165206906282861e+00 +208 211 -7.412185823610189e-01 +208 212 -3.301555353436754e-01 +208 213 -1.820810586422650e-01 +208 214 -1.132183869282765e-01 +208 215 -7.613960933881156e-02 +208 216 -5.413421453123168e-02 +208 217 -4.012781031913001e-02 +208 218 -3.072751892616542e-02 +208 219 -2.415034675252895e-02 +208 220 -1.939104886145110e-02 +208 221 -1.585023865775528e-02 +208 222 -1.315380302376547e-02 +208 223 -1.105916272470025e-02 +208 224 -9.403863770832823e-03 +208 225 -8.076052134892590e-03 +208 226 -6.996835383339674e-03 +208 227 -6.109381318875749e-03 +208 228 -5.371977266379806e-03 +208 229 -4.753493624956896e-03 +208 230 -4.230349322908535e-03 +208 231 -3.784439171232930e-03 +208 232 -3.401691470521391e-03 +208 233 -3.071047067257393e-03 +208 234 -2.783725492315672e-03 +208 235 -2.532689975072680e-03 +208 236 -2.312252367280536e-03 +208 237 -2.117777896667795e-03 +208 238 -1.945462087124854e-03 +208 239 -1.792160480940037e-03 +209 209 3.988394278208167e+01 +209 192 -8.076052134892604e-03 +209 193 -9.403863770832840e-03 +209 194 -1.105916272470025e-02 +209 195 -1.315380302376548e-02 +209 196 -1.585023865775527e-02 +209 197 -1.939104886145113e-02 +209 198 -2.415034675252900e-02 +209 199 -3.072751892616552e-02 +209 200 -4.012781031913001e-02 +209 201 -5.413421453123175e-02 +209 202 -7.613960933881170e-02 +209 203 -1.132183869282764e-01 +209 204 -1.820810586422654e-01 +209 205 -3.301555353436765e-01 +209 206 -7.412185823610205e-01 +209 207 -3.165206906282871e+00 +209 208 -1.502055215899861e+01 +209 210 -1.502055215878373e+01 +209 211 -3.165206906282863e+00 +209 212 -7.412185823610157e-01 +209 213 -3.301555353436759e-01 +209 214 -1.820810586422653e-01 +209 215 -1.132183869282763e-01 +209 216 -7.613960933881148e-02 +209 217 -5.413421453123175e-02 +209 218 -4.012781031912990e-02 +209 219 -3.072751892616538e-02 +209 220 -2.415034675252893e-02 +209 221 -1.939104886145111e-02 +209 222 -1.585023865775525e-02 +209 223 -1.315380302376544e-02 +209 224 -1.105916272470024e-02 +209 225 -9.403863770832823e-03 +209 226 -8.076052134892594e-03 +209 227 -6.996835383339667e-03 +209 228 -6.109381318875745e-03 +209 229 -5.371977266379802e-03 +209 230 -4.753493624956896e-03 +209 231 -4.230349322908533e-03 +209 232 -3.784439171232922e-03 +209 233 -3.401691470521391e-03 +209 234 -3.071047067257391e-03 +209 235 -2.783725492315670e-03 +209 236 -2.532689975072678e-03 +209 237 -2.312252367280536e-03 +209 238 -2.117777896667794e-03 +209 239 -1.945462087124851e-03 +210 210 3.988394278171950e+01 +210 192 -6.996835383339666e-03 +210 193 -8.076052134892590e-03 +210 194 -9.403863770832820e-03 +210 195 -1.105916272470026e-02 +210 196 -1.315380302376546e-02 +210 197 -1.585023865775526e-02 +210 198 -1.939104886145110e-02 +210 199 -2.415034675252898e-02 +210 200 -3.072751892616542e-02 +210 201 -4.012781031912990e-02 +210 202 -5.413421453123169e-02 +210 203 -7.613960933881161e-02 +210 204 -1.132183869282763e-01 +210 205 -1.820810586422651e-01 +210 206 -3.301555353436773e-01 +210 207 -7.412185823610203e-01 +210 208 -3.165206906282861e+00 +210 209 -1.502055215878373e+01 +210 211 -1.502055215863301e+01 +210 212 -3.165206906282866e+00 +210 213 -7.412185823610201e-01 +210 214 -3.301555353436764e-01 +210 215 -1.820810586422655e-01 +210 216 -1.132183869282766e-01 +210 217 -7.613960933881181e-02 +210 218 -5.413421453123169e-02 +210 219 -4.012781031912992e-02 +210 220 -3.072751892616542e-02 +210 221 -2.415034675252899e-02 +210 222 -1.939104886145112e-02 +210 223 -1.585023865775525e-02 +210 224 -1.315380302376546e-02 +210 225 -1.105916272470025e-02 +210 226 -9.403863770832837e-03 +210 227 -8.076052134892603e-03 +210 228 -6.996835383339681e-03 +210 229 -6.109381318875755e-03 +210 230 -5.371977266379815e-03 +210 231 -4.753493624956904e-03 +210 232 -4.230349322908532e-03 +210 233 -3.784439171232930e-03 +210 234 -3.401691470521396e-03 +210 235 -3.071047067257395e-03 +210 236 -2.783725492315674e-03 +210 237 -2.532689975072683e-03 +210 238 -2.312252367280539e-03 +210 239 -2.117777896667794e-03 +211 211 3.988394278146369e+01 +211 192 -6.109381318875744e-03 +211 193 -6.996835383339667e-03 +211 194 -8.076052134892590e-03 +211 195 -9.403863770832832e-03 +211 196 -1.105916272470025e-02 +211 197 -1.315380302376546e-02 +211 198 -1.585023865775525e-02 +211 199 -1.939104886145111e-02 +211 200 -2.415034675252895e-02 +211 201 -3.072751892616538e-02 +211 202 -4.012781031912992e-02 +211 203 -5.413421453123175e-02 +211 204 -7.613960933881161e-02 +211 205 -1.132183869282768e-01 +211 206 -1.820810586422663e-01 +211 207 -3.301555353436784e-01 +211 208 -7.412185823610189e-01 +211 209 -3.165206906282863e+00 +211 210 -1.502055215863301e+01 +211 212 -1.502055215852574e+01 +211 213 -3.165206906282866e+00 +211 214 -7.412185823610173e-01 +211 215 -3.301555353436745e-01 +211 216 -1.820810586422649e-01 +211 217 -1.132183869282766e-01 +211 218 -7.613960933881166e-02 +211 219 -5.413421453123175e-02 +211 220 -4.012781031912999e-02 +211 221 -3.072751892616552e-02 +211 222 -2.415034675252901e-02 +211 223 -1.939104886145111e-02 +211 224 -1.585023865775527e-02 +211 225 -1.315380302376547e-02 +211 226 -1.105916272470027e-02 +211 227 -9.403863770832837e-03 +211 228 -8.076052134892604e-03 +211 229 -6.996835383339681e-03 +211 230 -6.109381318875761e-03 +211 231 -5.371977266379816e-03 +211 232 -4.753493624956896e-03 +211 233 -4.230349322908535e-03 +211 234 -3.784439171232930e-03 +211 235 -3.401691470521395e-03 +211 236 -3.071047067257394e-03 +211 237 -2.783725492315676e-03 +211 238 -2.532689975072683e-03 +211 239 -2.312252367280536e-03 +212 212 3.988394278128112e+01 +212 192 -5.371977266379806e-03 +212 193 -6.109381318875749e-03 +212 194 -6.996835383339674e-03 +212 195 -8.076052134892594e-03 +212 196 -9.403863770832828e-03 +212 197 -1.105916272470025e-02 +212 198 -1.315380302376546e-02 +212 199 -1.585023865775527e-02 +212 200 -1.939104886145110e-02 +212 201 -2.415034675252893e-02 +212 202 -3.072751892616542e-02 +212 203 -4.012781031912999e-02 +212 204 -5.413421453123168e-02 +212 205 -7.613960933881153e-02 +212 206 -1.132183869282767e-01 +212 207 -1.820810586422658e-01 +212 208 -3.301555353436754e-01 +212 209 -7.412185823610157e-01 +212 210 -3.165206906282866e+00 +212 211 -1.502055215852574e+01 +212 213 -1.502055215844907e+01 +212 214 -3.165206906282870e+00 +212 215 -7.412185823610188e-01 +212 216 -3.301555353436776e-01 +212 217 -1.820810586422656e-01 +212 218 -1.132183869282764e-01 +212 219 -7.613960933881159e-02 +212 220 -5.413421453123168e-02 +212 221 -4.012781031913002e-02 +212 222 -3.072751892616546e-02 +212 223 -2.415034675252895e-02 +212 224 -1.939104886145110e-02 +212 225 -1.585023865775525e-02 +212 226 -1.315380302376547e-02 +212 227 -1.105916272470025e-02 +212 228 -9.403863770832823e-03 +212 229 -8.076052134892594e-03 +212 230 -6.996835383339681e-03 +212 231 -6.109381318875754e-03 +212 232 -5.371977266379802e-03 +212 233 -4.753493624956896e-03 +212 234 -4.230349322908531e-03 +212 235 -3.784439171232927e-03 +212 236 -3.401691470521393e-03 +212 237 -3.071047067257394e-03 +212 238 -2.783725492315674e-03 +212 239 -2.532689975072678e-03 +213 213 3.988394278115153e+01 +213 192 -4.753493624956896e-03 +213 193 -5.371977266379806e-03 +213 194 -6.109381318875749e-03 +213 195 -6.996835383339667e-03 +213 196 -8.076052134892604e-03 +213 197 -9.403863770832844e-03 +213 198 -1.105916272470026e-02 +213 199 -1.315380302376548e-02 +213 200 -1.585023865775527e-02 +213 201 -1.939104886145111e-02 +213 202 -2.415034675252899e-02 +213 203 -3.072751892616552e-02 +213 204 -4.012781031913001e-02 +213 205 -5.413421453123175e-02 +213 206 -7.613960933881184e-02 +213 207 -1.132183869282767e-01 +213 208 -1.820810586422650e-01 +213 209 -3.301555353436759e-01 +213 210 -7.412185823610201e-01 +213 211 -3.165206906282866e+00 +213 212 -1.502055215844907e+01 +213 214 -1.502055215839541e+01 +213 215 -3.165206906282861e+00 +213 216 -7.412185823610220e-01 +213 217 -3.301555353436775e-01 +213 218 -1.820810586422649e-01 +213 219 -1.132183869282764e-01 +213 220 -7.613960933881143e-02 +213 221 -5.413421453123175e-02 +213 222 -4.012781031912995e-02 +213 223 -3.072751892616538e-02 +213 224 -2.415034675252893e-02 +213 225 -1.939104886145108e-02 +213 226 -1.585023865775525e-02 +213 227 -1.315380302376544e-02 +213 228 -1.105916272470024e-02 +213 229 -9.403863770832823e-03 +213 230 -8.076052134892604e-03 +213 231 -6.996835383339681e-03 +213 232 -6.109381318875744e-03 +213 233 -5.371977266379806e-03 +213 234 -4.753493624956896e-03 +213 235 -4.230349322908531e-03 +213 236 -3.784439171232927e-03 +213 237 -3.401691470521396e-03 +213 238 -3.071047067257395e-03 +213 239 -2.783725492315670e-03 +214 214 3.988394278106475e+01 +214 192 -4.230349322908531e-03 +214 193 -4.753493624956896e-03 +214 194 -5.371977266379806e-03 +214 195 -6.109381318875745e-03 +214 196 -6.996835383339681e-03 +214 197 -8.076052134892604e-03 +214 198 -9.403863770832825e-03 +214 199 -1.105916272470026e-02 +214 200 -1.315380302376546e-02 +214 201 -1.585023865775524e-02 +214 202 -1.939104886145110e-02 +214 203 -2.415034675252898e-02 +214 204 -3.072751892616542e-02 +214 205 -4.012781031912990e-02 +214 206 -5.413421453123169e-02 +214 207 -7.613960933881166e-02 +214 208 -1.132183869282765e-01 +214 209 -1.820810586422653e-01 +214 210 -3.301555353436764e-01 +214 211 -7.412185823610173e-01 +214 212 -3.165206906282870e+00 +214 213 -1.502055215839541e+01 +214 215 -1.502055215836220e+01 +214 216 -3.165206906282869e+00 +214 217 -7.412185823610221e-01 +214 218 -3.301555353436754e-01 +214 219 -1.820810586422654e-01 +214 220 -1.132183869282762e-01 +214 221 -7.613960933881177e-02 +214 222 -5.413421453123177e-02 +214 223 -4.012781031912992e-02 +214 224 -3.072751892616542e-02 +214 225 -2.415034675252895e-02 +214 226 -1.939104886145112e-02 +214 227 -1.585023865775525e-02 +214 228 -1.315380302376546e-02 +214 229 -1.105916272470025e-02 +214 230 -9.403863770832840e-03 +214 231 -8.076052134892603e-03 +214 232 -6.996835383339669e-03 +214 233 -6.109381318875749e-03 +214 234 -5.371977266379806e-03 +214 235 -4.753493624956896e-03 +214 236 -4.230349322908531e-03 +214 237 -3.784439171232930e-03 +214 238 -3.401691470521396e-03 +214 239 -3.071047067257391e-03 +215 215 3.988394278102303e+01 +215 192 -3.784439171232927e-03 +215 193 -4.230349322908531e-03 +215 194 -4.753493624956896e-03 +215 195 -5.371977266379802e-03 +215 196 -6.109381318875755e-03 +215 197 -6.996835383339681e-03 +215 198 -8.076052134892594e-03 +215 199 -9.403863770832832e-03 +215 200 -1.105916272470025e-02 +215 201 -1.315380302376544e-02 +215 202 -1.585023865775525e-02 +215 203 -1.939104886145111e-02 +215 204 -2.415034675252895e-02 +215 205 -3.072751892616538e-02 +215 206 -4.012781031912992e-02 +215 207 -5.413421453123175e-02 +215 208 -7.613960933881156e-02 +215 209 -1.132183869282763e-01 +215 210 -1.820810586422655e-01 +215 211 -3.301555353436745e-01 +215 212 -7.412185823610188e-01 +215 213 -3.165206906282861e+00 +215 214 -1.502055215836220e+01 +215 216 -1.502055215835491e+01 +215 217 -3.165206906282879e+00 +215 218 -7.412185823610176e-01 +215 219 -3.301555353436749e-01 +215 220 -1.820810586422650e-01 +215 221 -1.132183869282768e-01 +215 222 -7.613960933881175e-02 +215 223 -5.413421453123175e-02 +215 224 -4.012781031912999e-02 +215 225 -3.072751892616545e-02 +215 226 -2.415034675252901e-02 +215 227 -1.939104886145111e-02 +215 228 -1.585023865775527e-02 +215 229 -1.315380302376547e-02 +215 230 -1.105916272470027e-02 +215 231 -9.403863770832837e-03 +215 232 -8.076052134892594e-03 +215 233 -6.996835383339674e-03 +215 234 -6.109381318875749e-03 +215 235 -5.371977266379806e-03 +215 236 -4.753493624956896e-03 +215 237 -4.230349322908535e-03 +215 238 -3.784439171232930e-03 +215 239 -3.401691470521391e-03 +216 216 3.988394278105616e+01 +216 192 -3.401691470521395e-03 +216 193 -3.784439171232929e-03 +216 194 -4.230349322908535e-03 +216 195 -4.753493624956896e-03 +216 196 -5.371977266379815e-03 +216 197 -6.109381318875760e-03 +216 198 -6.996835383339680e-03 +216 199 -8.076052134892604e-03 +216 200 -9.403863770832828e-03 +216 201 -1.105916272470024e-02 +216 202 -1.315380302376546e-02 +216 203 -1.585023865775527e-02 +216 204 -1.939104886145110e-02 +216 205 -2.415034675252893e-02 +216 206 -3.072751892616542e-02 +216 207 -4.012781031912999e-02 +216 208 -5.413421453123168e-02 +216 209 -7.613960933881148e-02 +216 210 -1.132183869282766e-01 +216 211 -1.820810586422649e-01 +216 212 -3.301555353436776e-01 +216 213 -7.412185823610220e-01 +216 214 -3.165206906282869e+00 +216 215 -1.502055215835491e+01 +216 217 -1.502055215840047e+01 +216 218 -3.165206906282869e+00 +216 219 -7.412185823610213e-01 +216 220 -3.301555353436777e-01 +216 221 -1.820810586422654e-01 +216 222 -1.132183869282764e-01 +216 223 -7.613960933881159e-02 +216 224 -5.413421453123167e-02 +216 225 -4.012781031912992e-02 +216 226 -3.072751892616546e-02 +216 227 -2.415034675252895e-02 +216 228 -1.939104886145110e-02 +216 229 -1.585023865775525e-02 +216 230 -1.315380302376548e-02 +216 231 -1.105916272470025e-02 +216 232 -9.403863770832823e-03 +216 233 -8.076052134892590e-03 +216 234 -6.996835383339667e-03 +216 235 -6.109381318875745e-03 +216 236 -5.371977266379802e-03 +216 237 -4.753493624956896e-03 +216 238 -4.230349322908533e-03 +216 239 -3.784439171232922e-03 +217 217 3.988394278128565e+01 +217 192 -3.071047067257391e-03 +217 193 -3.401691470521391e-03 +217 194 -3.784439171232924e-03 +217 195 -4.230349322908526e-03 +217 196 -4.753493624956896e-03 +217 197 -5.371977266379806e-03 +217 198 -6.109381318875744e-03 +217 199 -6.996835383339666e-03 +217 200 -8.076052134892592e-03 +217 201 -9.403863770832832e-03 +217 202 -1.105916272470026e-02 +217 203 -1.315380302376548e-02 +217 204 -1.585023865775527e-02 +217 205 -1.939104886145111e-02 +217 206 -2.415034675252899e-02 +217 207 -3.072751892616552e-02 +217 208 -4.012781031913001e-02 +217 209 -5.413421453123175e-02 +217 210 -7.613960933881181e-02 +217 211 -1.132183869282766e-01 +217 212 -1.820810586422656e-01 +217 213 -3.301555353436775e-01 +217 214 -7.412185823610221e-01 +217 215 -3.165206906282879e+00 +217 216 -1.502055215840047e+01 +217 218 -1.502055215860531e+01 +217 219 -3.165206906282869e+00 +217 220 -7.412185823610205e-01 +217 221 -3.301555353436766e-01 +217 222 -1.820810586422652e-01 +217 223 -1.132183869282764e-01 +217 224 -7.613960933881142e-02 +217 225 -5.413421453123159e-02 +217 226 -4.012781031912994e-02 +217 227 -3.072751892616538e-02 +217 228 -2.415034675252893e-02 +217 229 -1.939104886145108e-02 +217 230 -1.585023865775527e-02 +217 231 -1.315380302376544e-02 +217 232 -1.105916272470024e-02 +217 233 -9.403863770832827e-03 +217 234 -8.076052134892604e-03 +217 235 -6.996835383339681e-03 +217 236 -6.109381318875755e-03 +217 237 -5.371977266379815e-03 +217 238 -4.753493624956904e-03 +217 239 -4.230349322908532e-03 +218 218 3.988394278152494e+01 +218 192 -2.783725492315670e-03 +218 193 -3.071047067257390e-03 +218 194 -3.401691470521391e-03 +218 195 -3.784439171232922e-03 +218 196 -4.230349322908531e-03 +218 197 -4.753493624956895e-03 +218 198 -5.371977266379801e-03 +218 199 -6.109381318875744e-03 +218 200 -6.996835383339667e-03 +218 201 -8.076052134892590e-03 +218 202 -9.403863770832823e-03 +218 203 -1.105916272470026e-02 +218 204 -1.315380302376546e-02 +218 205 -1.585023865775524e-02 +218 206 -1.939104886145110e-02 +218 207 -2.415034675252898e-02 +218 208 -3.072751892616542e-02 +218 209 -4.012781031912990e-02 +218 210 -5.413421453123169e-02 +218 211 -7.613960933881166e-02 +218 212 -1.132183869282764e-01 +218 213 -1.820810586422649e-01 +218 214 -3.301555353436754e-01 +218 215 -7.412185823610176e-01 +218 216 -3.165206906282869e+00 +218 217 -1.502055215860531e+01 +218 219 -1.502055215859222e+01 +218 220 -3.165206906282867e+00 +218 221 -7.412185823610161e-01 +218 222 -3.301555353436767e-01 +218 223 -1.820810586422658e-01 +218 224 -1.132183869282761e-01 +218 225 -7.613960933881153e-02 +218 226 -5.413421453123177e-02 +218 227 -4.012781031912992e-02 +218 228 -3.072751892616542e-02 +218 229 -2.415034675252895e-02 +218 230 -1.939104886145114e-02 +218 231 -1.585023865775525e-02 +218 232 -1.315380302376546e-02 +218 233 -1.105916272470025e-02 +218 234 -9.403863770832840e-03 +218 235 -8.076052134892601e-03 +218 236 -6.996835383339681e-03 +218 237 -6.109381318875761e-03 +218 238 -5.371977266379816e-03 +218 239 -4.753493624956896e-03 +219 219 3.988394278151355e+01 +219 192 -2.532689975072680e-03 +219 193 -2.783725492315672e-03 +219 194 -3.071047067257393e-03 +219 195 -3.401691470521391e-03 +219 196 -3.784439171232930e-03 +219 197 -4.230349322908535e-03 +219 198 -4.753493624956896e-03 +219 199 -5.371977266379806e-03 +219 200 -6.109381318875749e-03 +219 201 -6.996835383339674e-03 +219 202 -8.076052134892590e-03 +219 203 -9.403863770832837e-03 +219 204 -1.105916272470025e-02 +219 205 -1.315380302376544e-02 +219 206 -1.585023865775525e-02 +219 207 -1.939104886145111e-02 +219 208 -2.415034675252895e-02 +219 209 -3.072751892616538e-02 +219 210 -4.012781031912992e-02 +219 211 -5.413421453123175e-02 +219 212 -7.613960933881159e-02 +219 213 -1.132183869282764e-01 +219 214 -1.820810586422654e-01 +219 215 -3.301555353436749e-01 +219 216 -7.412185823610213e-01 +219 217 -3.165206906282869e+00 +219 218 -1.502055215859222e+01 +219 220 -1.502055215859652e+01 +219 221 -3.165206906282860e+00 +219 222 -7.412185823610189e-01 +219 223 -3.301555353436771e-01 +219 224 -1.820810586422646e-01 +219 225 -1.132183869282763e-01 +219 226 -7.613960933881170e-02 +219 227 -5.413421453123175e-02 +219 228 -4.012781031912999e-02 +219 229 -3.072751892616545e-02 +219 230 -2.415034675252904e-02 +219 231 -1.939104886145111e-02 +219 232 -1.585023865775527e-02 +219 233 -1.315380302376547e-02 +219 234 -1.105916272470027e-02 +219 235 -9.403863770832833e-03 +219 236 -8.076052134892597e-03 +219 237 -6.996835383339681e-03 +219 238 -6.109381318875754e-03 +219 239 -5.371977266379802e-03 +220 220 3.988394278151441e+01 +220 192 -2.312252367280536e-03 +220 193 -2.532689975072680e-03 +220 194 -2.783725492315672e-03 +220 195 -3.071047067257391e-03 +220 196 -3.401691470521396e-03 +220 197 -3.784439171232930e-03 +220 198 -4.230349322908531e-03 +220 199 -4.753493624956896e-03 +220 200 -5.371977266379806e-03 +220 201 -6.109381318875749e-03 +220 202 -6.996835383339667e-03 +220 203 -8.076052134892604e-03 +220 204 -9.403863770832828e-03 +220 205 -1.105916272470024e-02 +220 206 -1.315380302376546e-02 +220 207 -1.585023865775527e-02 +220 208 -1.939104886145110e-02 +220 209 -2.415034675252893e-02 +220 210 -3.072751892616542e-02 +220 211 -4.012781031912999e-02 +220 212 -5.413421453123168e-02 +220 213 -7.613960933881143e-02 +220 214 -1.132183869282762e-01 +220 215 -1.820810586422650e-01 +220 216 -3.301555353436777e-01 +220 217 -7.412185823610205e-01 +220 218 -3.165206906282867e+00 +220 219 -1.502055215859652e+01 +220 221 -1.502055215858802e+01 +220 222 -3.165206906282868e+00 +220 223 -7.412185823610227e-01 +220 224 -3.301555353436769e-01 +220 225 -1.820810586422652e-01 +220 226 -1.132183869282766e-01 +220 227 -7.613960933881163e-02 +220 228 -5.413421453123167e-02 +220 229 -4.012781031912992e-02 +220 230 -3.072751892616549e-02 +220 231 -2.415034675252895e-02 +220 232 -1.939104886145110e-02 +220 233 -1.585023865775525e-02 +220 234 -1.315380302376548e-02 +220 235 -1.105916272470025e-02 +220 236 -9.403863770832823e-03 +220 237 -8.076052134892603e-03 +220 238 -6.996835383339681e-03 +220 239 -6.109381318875744e-03 +221 221 3.988394278153932e+01 +221 192 -2.117777896667794e-03 +221 193 -2.312252367280536e-03 +221 194 -2.532689975072680e-03 +221 195 -2.783725492315670e-03 +221 196 -3.071047067257395e-03 +221 197 -3.401691470521395e-03 +221 198 -3.784439171232927e-03 +221 199 -4.230349322908531e-03 +221 200 -4.753493624956896e-03 +221 201 -5.371977266379806e-03 +221 202 -6.109381318875745e-03 +221 203 -6.996835383339681e-03 +221 204 -8.076052134892604e-03 +221 205 -9.403863770832832e-03 +221 206 -1.105916272470026e-02 +221 207 -1.315380302376549e-02 +221 208 -1.585023865775528e-02 +221 209 -1.939104886145111e-02 +221 210 -2.415034675252899e-02 +221 211 -3.072751892616552e-02 +221 212 -4.012781031913002e-02 +221 213 -5.413421453123175e-02 +221 214 -7.613960933881177e-02 +221 215 -1.132183869282768e-01 +221 216 -1.820810586422654e-01 +221 217 -3.301555353436766e-01 +221 218 -7.412185823610161e-01 +221 219 -3.165206906282860e+00 +221 220 -1.502055215858802e+01 +221 222 -1.502055215864002e+01 +221 223 -3.165206906282882e+00 +221 224 -7.412185823610224e-01 +221 225 -3.301555353436740e-01 +221 226 -1.820810586422651e-01 +221 227 -1.132183869282764e-01 +221 228 -7.613960933881146e-02 +221 229 -5.413421453123159e-02 +221 230 -4.012781031912999e-02 +221 231 -3.072751892616538e-02 +221 232 -2.415034675252893e-02 +221 233 -1.939104886145107e-02 +221 234 -1.585023865775527e-02 +221 235 -1.315380302376544e-02 +221 236 -1.105916272470024e-02 +221 237 -9.403863770832827e-03 +221 238 -8.076052134892604e-03 +221 239 -6.996835383339669e-03 +222 222 3.988394278164022e+01 +222 192 -1.945462087124853e-03 +222 193 -2.117777896667794e-03 +222 194 -2.312252367280536e-03 +222 195 -2.532689975072678e-03 +222 196 -2.783725492315674e-03 +222 197 -3.071047067257394e-03 +222 198 -3.401691470521393e-03 +222 199 -3.784439171232927e-03 +222 200 -4.230349322908531e-03 +222 201 -4.753493624956896e-03 +222 202 -5.371977266379802e-03 +222 203 -6.109381318875755e-03 +222 204 -6.996835383339681e-03 +222 205 -8.076052134892597e-03 +222 206 -9.403863770832832e-03 +222 207 -1.105916272470027e-02 +222 208 -1.315380302376547e-02 +222 209 -1.585023865775525e-02 +222 210 -1.939104886145112e-02 +222 211 -2.415034675252901e-02 +222 212 -3.072751892616546e-02 +222 213 -4.012781031912995e-02 +222 214 -5.413421453123177e-02 +222 215 -7.613960933881175e-02 +222 216 -1.132183869282764e-01 +222 217 -1.820810586422652e-01 +222 218 -3.301555353436767e-01 +222 219 -7.412185823610189e-01 +222 220 -3.165206906282868e+00 +222 221 -1.502055215864002e+01 +222 223 -1.502055215866001e+01 +222 224 -3.165206906282868e+00 +222 225 -7.412185823610162e-01 +222 226 -3.301555353436768e-01 +222 227 -1.820810586422657e-01 +222 228 -1.132183869282763e-01 +222 229 -7.613960933881142e-02 +222 230 -5.413421453123177e-02 +222 231 -4.012781031912988e-02 +222 232 -3.072751892616539e-02 +222 233 -2.415034675252892e-02 +222 234 -1.939104886145112e-02 +222 235 -1.585023865775523e-02 +222 236 -1.315380302376545e-02 +222 237 -1.105916272470024e-02 +222 238 -9.403863770832835e-03 +222 239 -8.076052134892590e-03 +223 223 3.988394278169707e+01 +223 192 -1.792160480940039e-03 +223 193 -1.945462087124854e-03 +223 194 -2.117777896667795e-03 +223 195 -2.312252367280536e-03 +223 196 -2.532689975072683e-03 +223 197 -2.783725492315676e-03 +223 198 -3.071047067257394e-03 +223 199 -3.401691470521395e-03 +223 200 -3.784439171232929e-03 +223 201 -4.230349322908535e-03 +223 202 -4.753493624956896e-03 +223 203 -5.371977266379815e-03 +223 204 -6.109381318875760e-03 +223 205 -6.996835383339680e-03 +223 206 -8.076052134892601e-03 +223 207 -9.403863770832837e-03 +223 208 -1.105916272470025e-02 +223 209 -1.315380302376544e-02 +223 210 -1.585023865775525e-02 +223 211 -1.939104886145111e-02 +223 212 -2.415034675252895e-02 +223 213 -3.072751892616538e-02 +223 214 -4.012781031912992e-02 +223 215 -5.413421453123175e-02 +223 216 -7.613960933881159e-02 +223 217 -1.132183869282764e-01 +223 218 -1.820810586422658e-01 +223 219 -3.301555353436771e-01 +223 220 -7.412185823610227e-01 +223 221 -3.165206906282882e+00 +223 222 -1.502055215866001e+01 +223 224 -1.502055215931064e+01 +223 225 -3.165206906282851e+00 +223 226 -7.412185823610147e-01 +223 227 -3.301555353436769e-01 +223 228 -1.820810586422647e-01 +223 229 -1.132183869282763e-01 +223 230 -7.613960933881178e-02 +223 231 -5.413421453123175e-02 +223 232 -4.012781031912999e-02 +223 233 -3.072751892616545e-02 +223 234 -2.415034675252904e-02 +223 235 -1.939104886145111e-02 +223 236 -1.585023865775527e-02 +223 237 -1.315380302376547e-02 +223 238 -1.105916272470027e-02 +223 239 -9.403863770832833e-03 +224 224 3.988394278169704e+01 +224 208 -9.403863770832823e-03 +224 209 -1.105916272470024e-02 +224 210 -1.315380302376546e-02 +224 211 -1.585023865775527e-02 +224 212 -1.939104886145110e-02 +224 213 -2.415034675252893e-02 +224 214 -3.072751892616542e-02 +224 215 -4.012781031912999e-02 +224 216 -5.413421453123167e-02 +224 217 -7.613960933881142e-02 +224 218 -1.132183869282761e-01 +224 219 -1.820810586422646e-01 +224 220 -3.301555353436769e-01 +224 221 -7.412185823610224e-01 +224 222 -3.165206906282868e+00 +224 223 -1.502055215931064e+01 +224 225 -1.502055215866000e+01 +224 226 -3.165206906282873e+00 +224 227 -7.412185823610244e-01 +224 228 -3.301555353436765e-01 +224 229 -1.820810586422655e-01 +224 230 -1.132183869282764e-01 +224 231 -7.613960933881166e-02 +224 232 -5.413421453123168e-02 +224 233 -4.012781031912992e-02 +224 234 -3.072751892616550e-02 +224 235 -2.415034675252895e-02 +224 236 -1.939104886145110e-02 +224 237 -1.585023865775525e-02 +224 238 -1.315380302376548e-02 +224 239 -1.105916272470025e-02 +224 240 -9.403863770832830e-03 +224 241 -8.076052134892603e-03 +224 242 -6.996835383339681e-03 +224 243 -6.109381318875755e-03 +224 244 -5.371977266379815e-03 +224 245 -4.753493624956904e-03 +224 246 -4.230349322908532e-03 +224 247 -3.784439171232930e-03 +224 248 -3.401691470521396e-03 +224 249 -3.071047067257395e-03 +224 250 -2.783725492315674e-03 +224 251 -2.532689975072683e-03 +224 252 -2.312252367280539e-03 +224 253 -2.117777896667794e-03 +224 254 -1.945462087124854e-03 +224 255 -1.792160480940039e-03 +225 225 3.988394278164018e+01 +225 208 -8.076052134892590e-03 +225 209 -9.403863770832823e-03 +225 210 -1.105916272470025e-02 +225 211 -1.315380302376547e-02 +225 212 -1.585023865775525e-02 +225 213 -1.939104886145108e-02 +225 214 -2.415034675252895e-02 +225 215 -3.072751892616545e-02 +225 216 -4.012781031912992e-02 +225 217 -5.413421453123159e-02 +225 218 -7.613960933881153e-02 +225 219 -1.132183869282763e-01 +225 220 -1.820810586422652e-01 +225 221 -3.301555353436740e-01 +225 222 -7.412185823610162e-01 +225 223 -3.165206906282851e+00 +225 224 -1.502055215866000e+01 +225 226 -1.502055215864002e+01 +225 227 -3.165206906282871e+00 +225 228 -7.412185823610180e-01 +225 229 -3.301555353436765e-01 +225 230 -1.820810586422655e-01 +225 231 -1.132183869282767e-01 +225 232 -7.613960933881170e-02 +225 233 -5.413421453123174e-02 +225 234 -4.012781031913008e-02 +225 235 -3.072751892616545e-02 +225 236 -2.415034675252898e-02 +225 237 -1.939104886145111e-02 +225 238 -1.585023865775529e-02 +225 239 -1.315380302376546e-02 +225 240 -1.105916272470026e-02 +225 241 -9.403863770832837e-03 +225 242 -8.076052134892608e-03 +225 243 -6.996835383339681e-03 +225 244 -6.109381318875761e-03 +225 245 -5.371977266379816e-03 +225 246 -4.753493624956896e-03 +225 247 -4.230349322908535e-03 +225 248 -3.784439171232930e-03 +225 249 -3.401691470521395e-03 +225 250 -3.071047067257394e-03 +225 251 -2.783725492315676e-03 +225 252 -2.532689975072683e-03 +225 253 -2.312252367280536e-03 +225 254 -2.117777896667795e-03 +225 255 -1.945462087124854e-03 +226 226 3.988394278153930e+01 +226 208 -6.996835383339674e-03 +226 209 -8.076052134892594e-03 +226 210 -9.403863770832837e-03 +226 211 -1.105916272470027e-02 +226 212 -1.315380302376547e-02 +226 213 -1.585023865775525e-02 +226 214 -1.939104886145112e-02 +226 215 -2.415034675252901e-02 +226 216 -3.072751892616546e-02 +226 217 -4.012781031912994e-02 +226 218 -5.413421453123177e-02 +226 219 -7.613960933881170e-02 +226 220 -1.132183869282766e-01 +226 221 -1.820810586422651e-01 +226 222 -3.301555353436768e-01 +226 223 -7.412185823610147e-01 +226 224 -3.165206906282873e+00 +226 225 -1.502055215864002e+01 +226 227 -1.502055215858803e+01 +226 228 -3.165206906282854e+00 +226 229 -7.412185823610109e-01 +226 230 -3.301555353436761e-01 +226 231 -1.820810586422648e-01 +226 232 -1.132183869282763e-01 +226 233 -7.613960933881148e-02 +226 234 -5.413421453123177e-02 +226 235 -4.012781031912988e-02 +226 236 -3.072751892616539e-02 +226 237 -2.415034675252892e-02 +226 238 -1.939104886145112e-02 +226 239 -1.585023865775523e-02 +226 240 -1.315380302376545e-02 +226 241 -1.105916272470024e-02 +226 242 -9.403863770832832e-03 +226 243 -8.076052134892594e-03 +226 244 -6.996835383339681e-03 +226 245 -6.109381318875754e-03 +226 246 -5.371977266379802e-03 +226 247 -4.753493624956896e-03 +226 248 -4.230349322908531e-03 +226 249 -3.784439171232927e-03 +226 250 -3.401691470521393e-03 +226 251 -3.071047067257394e-03 +226 252 -2.783725492315674e-03 +226 253 -2.532689975072678e-03 +226 254 -2.312252367280536e-03 +226 255 -2.117777896667794e-03 +227 227 3.988394278151441e+01 +227 208 -6.109381318875749e-03 +227 209 -6.996835383339667e-03 +227 210 -8.076052134892603e-03 +227 211 -9.403863770832837e-03 +227 212 -1.105916272470025e-02 +227 213 -1.315380302376544e-02 +227 214 -1.585023865775525e-02 +227 215 -1.939104886145111e-02 +227 216 -2.415034675252895e-02 +227 217 -3.072751892616538e-02 +227 218 -4.012781031912992e-02 +227 219 -5.413421453123175e-02 +227 220 -7.613960933881163e-02 +227 221 -1.132183869282764e-01 +227 222 -1.820810586422657e-01 +227 223 -3.301555353436769e-01 +227 224 -7.412185823610244e-01 +227 225 -3.165206906282871e+00 +227 226 -1.502055215858803e+01 +227 228 -1.502055215859652e+01 +227 229 -3.165206906282859e+00 +227 230 -7.412185823610227e-01 +227 231 -3.301555353436736e-01 +227 232 -1.820810586422645e-01 +227 233 -1.132183869282765e-01 +227 234 -7.613960933881178e-02 +227 235 -5.413421453123175e-02 +227 236 -4.012781031912999e-02 +227 237 -3.072751892616545e-02 +227 238 -2.415034675252904e-02 +227 239 -1.939104886145111e-02 +227 240 -1.585023865775527e-02 +227 241 -1.315380302376547e-02 +227 242 -1.105916272470027e-02 +227 243 -9.403863770832833e-03 +227 244 -8.076052134892604e-03 +227 245 -6.996835383339681e-03 +227 246 -6.109381318875744e-03 +227 247 -5.371977266379806e-03 +227 248 -4.753493624956896e-03 +227 249 -4.230349322908531e-03 +227 250 -3.784439171232927e-03 +227 251 -3.401691470521396e-03 +227 252 -3.071047067257395e-03 +227 253 -2.783725492315670e-03 +227 254 -2.532689975072680e-03 +227 255 -2.312252367280536e-03 +228 228 3.988394278151354e+01 +228 208 -5.371977266379806e-03 +228 209 -6.109381318875745e-03 +228 210 -6.996835383339681e-03 +228 211 -8.076052134892604e-03 +228 212 -9.403863770832823e-03 +228 213 -1.105916272470024e-02 +228 214 -1.315380302376546e-02 +228 215 -1.585023865775527e-02 +228 216 -1.939104886145110e-02 +228 217 -2.415034675252893e-02 +228 218 -3.072751892616542e-02 +228 219 -4.012781031912999e-02 +228 220 -5.413421453123167e-02 +228 221 -7.613960933881146e-02 +228 222 -1.132183869282763e-01 +228 223 -1.820810586422647e-01 +228 224 -3.301555353436765e-01 +228 225 -7.412185823610180e-01 +228 226 -3.165206906282854e+00 +228 227 -1.502055215859652e+01 +228 229 -1.502055215859222e+01 +228 230 -3.165206906282872e+00 +228 231 -7.412185823610198e-01 +228 232 -3.301555353436755e-01 +228 233 -1.820810586422658e-01 +228 234 -1.132183869282762e-01 +228 235 -7.613960933881155e-02 +228 236 -5.413421453123168e-02 +228 237 -4.012781031912992e-02 +228 238 -3.072751892616550e-02 +228 239 -2.415034675252895e-02 +228 240 -1.939104886145110e-02 +228 241 -1.585023865775525e-02 +228 242 -1.315380302376548e-02 +228 243 -1.105916272470025e-02 +228 244 -9.403863770832830e-03 +228 245 -8.076052134892603e-03 +228 246 -6.996835383339669e-03 +228 247 -6.109381318875749e-03 +228 248 -5.371977266379806e-03 +228 249 -4.753493624956896e-03 +228 250 -4.230349322908531e-03 +228 251 -3.784439171232930e-03 +228 252 -3.401691470521396e-03 +228 253 -3.071047067257391e-03 +228 254 -2.783725492315672e-03 +228 255 -2.532689975072680e-03 +229 229 3.988394278152494e+01 +229 208 -4.753493624956896e-03 +229 209 -5.371977266379802e-03 +229 210 -6.109381318875755e-03 +229 211 -6.996835383339681e-03 +229 212 -8.076052134892594e-03 +229 213 -9.403863770832823e-03 +229 214 -1.105916272470025e-02 +229 215 -1.315380302376547e-02 +229 216 -1.585023865775525e-02 +229 217 -1.939104886145108e-02 +229 218 -2.415034675252895e-02 +229 219 -3.072751892616545e-02 +229 220 -4.012781031912992e-02 +229 221 -5.413421453123159e-02 +229 222 -7.613960933881142e-02 +229 223 -1.132183869282763e-01 +229 224 -1.820810586422655e-01 +229 225 -3.301555353436765e-01 +229 226 -7.412185823610109e-01 +229 227 -3.165206906282859e+00 +229 228 -1.502055215859222e+01 +229 230 -1.502055215860532e+01 +229 231 -3.165206906282872e+00 +229 232 -7.412185823610145e-01 +229 233 -3.301555353436766e-01 +229 234 -1.820810586422650e-01 +229 235 -1.132183869282765e-01 +229 236 -7.613960933881170e-02 +229 237 -5.413421453123174e-02 +229 238 -4.012781031913008e-02 +229 239 -3.072751892616545e-02 +229 240 -2.415034675252898e-02 +229 241 -1.939104886145111e-02 +229 242 -1.585023865775529e-02 +229 243 -1.315380302376546e-02 +229 244 -1.105916272470026e-02 +229 245 -9.403863770832835e-03 +229 246 -8.076052134892596e-03 +229 247 -6.996835383339674e-03 +229 248 -6.109381318875749e-03 +229 249 -5.371977266379806e-03 +229 250 -4.753493624956896e-03 +229 251 -4.230349322908535e-03 +229 252 -3.784439171232930e-03 +229 253 -3.401691470521391e-03 +229 254 -3.071047067257393e-03 +229 255 -2.783725492315672e-03 +230 230 3.988394278128563e+01 +230 208 -4.230349322908535e-03 +230 209 -4.753493624956896e-03 +230 210 -5.371977266379815e-03 +230 211 -6.109381318875761e-03 +230 212 -6.996835383339681e-03 +230 213 -8.076052134892604e-03 +230 214 -9.403863770832840e-03 +230 215 -1.105916272470027e-02 +230 216 -1.315380302376548e-02 +230 217 -1.585023865775527e-02 +230 218 -1.939104886145114e-02 +230 219 -2.415034675252904e-02 +230 220 -3.072751892616549e-02 +230 221 -4.012781031912999e-02 +230 222 -5.413421453123177e-02 +230 223 -7.613960933881178e-02 +230 224 -1.132183869282764e-01 +230 225 -1.820810586422655e-01 +230 226 -3.301555353436761e-01 +230 227 -7.412185823610227e-01 +230 228 -3.165206906282872e+00 +230 229 -1.502055215860532e+01 +230 231 -1.502055215840047e+01 +230 232 -3.165206906282858e+00 +230 233 -7.412185823610169e-01 +230 234 -3.301555353436761e-01 +230 235 -1.820810586422651e-01 +230 236 -1.132183869282765e-01 +230 237 -7.613960933881148e-02 +230 238 -5.413421453123169e-02 +230 239 -4.012781031912983e-02 +230 240 -3.072751892616536e-02 +230 241 -2.415034675252890e-02 +230 242 -1.939104886145110e-02 +230 243 -1.585023865775522e-02 +230 244 -1.315380302376544e-02 +230 245 -1.105916272470023e-02 +230 246 -9.403863770832823e-03 +230 247 -8.076052134892587e-03 +230 248 -6.996835383339667e-03 +230 249 -6.109381318875744e-03 +230 250 -5.371977266379801e-03 +230 251 -4.753493624956895e-03 +230 252 -4.230349322908533e-03 +230 253 -3.784439171232922e-03 +230 254 -3.401691470521391e-03 +230 255 -3.071047067257391e-03 +231 231 3.988394278105613e+01 +231 208 -3.784439171232930e-03 +231 209 -4.230349322908533e-03 +231 210 -4.753493624956904e-03 +231 211 -5.371977266379816e-03 +231 212 -6.109381318875754e-03 +231 213 -6.996835383339681e-03 +231 214 -8.076052134892603e-03 +231 215 -9.403863770832837e-03 +231 216 -1.105916272470025e-02 +231 217 -1.315380302376544e-02 +231 218 -1.585023865775525e-02 +231 219 -1.939104886145111e-02 +231 220 -2.415034675252895e-02 +231 221 -3.072751892616538e-02 +231 222 -4.012781031912988e-02 +231 223 -5.413421453123175e-02 +231 224 -7.613960933881166e-02 +231 225 -1.132183869282767e-01 +231 226 -1.820810586422648e-01 +231 227 -3.301555353436736e-01 +231 228 -7.412185823610198e-01 +231 229 -3.165206906282872e+00 +231 230 -1.502055215840047e+01 +231 232 -1.502055215835489e+01 +231 233 -3.165206906282869e+00 +231 234 -7.412185823610267e-01 +231 235 -3.301555353436773e-01 +231 236 -1.820810586422653e-01 +231 237 -1.132183869282765e-01 +231 238 -7.613960933881182e-02 +231 239 -5.413421453123175e-02 +231 240 -4.012781031912999e-02 +231 241 -3.072751892616545e-02 +231 242 -2.415034675252904e-02 +231 243 -1.939104886145111e-02 +231 244 -1.585023865775527e-02 +231 245 -1.315380302376547e-02 +231 246 -1.105916272470027e-02 +231 247 -9.403863770832832e-03 +231 248 -8.076052134892590e-03 +231 249 -6.996835383339667e-03 +231 250 -6.109381318875745e-03 +231 251 -5.371977266379805e-03 +231 252 -4.753493624956895e-03 +231 253 -4.230349322908526e-03 +231 254 -3.784439171232924e-03 +231 255 -3.401691470521391e-03 +232 232 3.988394278102303e+01 +232 208 -3.401691470521391e-03 +232 209 -3.784439171232922e-03 +232 210 -4.230349322908532e-03 +232 211 -4.753493624956896e-03 +232 212 -5.371977266379802e-03 +232 213 -6.109381318875744e-03 +232 214 -6.996835383339669e-03 +232 215 -8.076052134892594e-03 +232 216 -9.403863770832823e-03 +232 217 -1.105916272470024e-02 +232 218 -1.315380302376546e-02 +232 219 -1.585023865775527e-02 +232 220 -1.939104886145110e-02 +232 221 -2.415034675252893e-02 +232 222 -3.072751892616539e-02 +232 223 -4.012781031912999e-02 +232 224 -5.413421453123168e-02 +232 225 -7.613960933881170e-02 +232 226 -1.132183869282763e-01 +232 227 -1.820810586422645e-01 +232 228 -3.301555353436755e-01 +232 229 -7.412185823610145e-01 +232 230 -3.165206906282858e+00 +232 231 -1.502055215835489e+01 +232 233 -1.502055215836223e+01 +232 234 -3.165206906282873e+00 +232 235 -7.412185823610195e-01 +232 236 -3.301555353436768e-01 +232 237 -1.820810586422655e-01 +232 238 -1.132183869282765e-01 +232 239 -7.613960933881155e-02 +232 240 -5.413421453123168e-02 +232 241 -4.012781031912992e-02 +232 242 -3.072751892616550e-02 +232 243 -2.415034675252895e-02 +232 244 -1.939104886145110e-02 +232 245 -1.585023865775525e-02 +232 246 -1.315380302376548e-02 +232 247 -1.105916272470025e-02 +232 248 -9.403863770832830e-03 +232 249 -8.076052134892601e-03 +232 250 -6.996835383339681e-03 +232 251 -6.109381318875761e-03 +232 252 -5.371977266379814e-03 +232 253 -4.753493624956896e-03 +232 254 -4.230349322908535e-03 +232 255 -3.784439171232929e-03 +233 233 3.988394278106475e+01 +233 208 -3.071047067257393e-03 +233 209 -3.401691470521391e-03 +233 210 -3.784439171232930e-03 +233 211 -4.230349322908535e-03 +233 212 -4.753493624956896e-03 +233 213 -5.371977266379806e-03 +233 214 -6.109381318875749e-03 +233 215 -6.996835383339674e-03 +233 216 -8.076052134892590e-03 +233 217 -9.403863770832827e-03 +233 218 -1.105916272470025e-02 +233 219 -1.315380302376547e-02 +233 220 -1.585023865775525e-02 +233 221 -1.939104886145107e-02 +233 222 -2.415034675252892e-02 +233 223 -3.072751892616545e-02 +233 224 -4.012781031912992e-02 +233 225 -5.413421453123174e-02 +233 226 -7.613960933881148e-02 +233 227 -1.132183869282765e-01 +233 228 -1.820810586422658e-01 +233 229 -3.301555353436766e-01 +233 230 -7.412185823610169e-01 +233 231 -3.165206906282869e+00 +233 232 -1.502055215836223e+01 +233 234 -1.502055215839540e+01 +233 235 -3.165206906282861e+00 +233 236 -7.412185823610186e-01 +233 237 -3.301555353436747e-01 +233 238 -1.820810586422649e-01 +233 239 -1.132183869282763e-01 +233 240 -7.613960933881164e-02 +233 241 -5.413421453123174e-02 +233 242 -4.012781031913008e-02 +233 243 -3.072751892616545e-02 +233 244 -2.415034675252898e-02 +233 245 -1.939104886145111e-02 +233 246 -1.585023865775529e-02 +233 247 -1.315380302376546e-02 +233 248 -1.105916272470026e-02 +233 249 -9.403863770832830e-03 +233 250 -8.076052134892599e-03 +233 251 -6.996835383339681e-03 +233 252 -6.109381318875754e-03 +233 253 -5.371977266379802e-03 +233 254 -4.753493624956896e-03 +233 255 -4.230349322908531e-03 +234 234 3.988394278115155e+01 +234 208 -2.783725492315672e-03 +234 209 -3.071047067257391e-03 +234 210 -3.401691470521396e-03 +234 211 -3.784439171232930e-03 +234 212 -4.230349322908531e-03 +234 213 -4.753493624956896e-03 +234 214 -5.371977266379806e-03 +234 215 -6.109381318875749e-03 +234 216 -6.996835383339667e-03 +234 217 -8.076052134892604e-03 +234 218 -9.403863770832840e-03 +234 219 -1.105916272470027e-02 +234 220 -1.315380302376548e-02 +234 221 -1.585023865775527e-02 +234 222 -1.939104886145112e-02 +234 223 -2.415034675252904e-02 +234 224 -3.072751892616550e-02 +234 225 -4.012781031913008e-02 +234 226 -5.413421453123177e-02 +234 227 -7.613960933881178e-02 +234 228 -1.132183869282762e-01 +234 229 -1.820810586422650e-01 +234 230 -3.301555353436761e-01 +234 231 -7.412185823610267e-01 +234 232 -3.165206906282873e+00 +234 233 -1.502055215839540e+01 +234 235 -1.502055215844906e+01 +234 236 -3.165206906282876e+00 +234 237 -7.412185823610227e-01 +234 238 -3.301555353436765e-01 +234 239 -1.820810586422651e-01 +234 240 -1.132183869282764e-01 +234 241 -7.613960933881148e-02 +234 242 -5.413421453123169e-02 +234 243 -4.012781031912983e-02 +234 244 -3.072751892616536e-02 +234 245 -2.415034675252890e-02 +234 246 -1.939104886145110e-02 +234 247 -1.585023865775522e-02 +234 248 -1.315380302376544e-02 +234 249 -1.105916272470023e-02 +234 250 -9.403863770832823e-03 +234 251 -8.076052134892603e-03 +234 252 -6.996835383339681e-03 +234 253 -6.109381318875744e-03 +234 254 -5.371977266379806e-03 +234 255 -4.753493624956896e-03 +235 235 3.988394278128112e+01 +235 208 -2.532689975072680e-03 +235 209 -2.783725492315670e-03 +235 210 -3.071047067257395e-03 +235 211 -3.401691470521395e-03 +235 212 -3.784439171232927e-03 +235 213 -4.230349322908531e-03 +235 214 -4.753493624956896e-03 +235 215 -5.371977266379806e-03 +235 216 -6.109381318875745e-03 +235 217 -6.996835383339681e-03 +235 218 -8.076052134892601e-03 +235 219 -9.403863770832833e-03 +235 220 -1.105916272470025e-02 +235 221 -1.315380302376544e-02 +235 222 -1.585023865775523e-02 +235 223 -1.939104886145111e-02 +235 224 -2.415034675252895e-02 +235 225 -3.072751892616545e-02 +235 226 -4.012781031912988e-02 +235 227 -5.413421453123175e-02 +235 228 -7.613960933881155e-02 +235 229 -1.132183869282765e-01 +235 230 -1.820810586422651e-01 +235 231 -3.301555353436773e-01 +235 232 -7.412185823610195e-01 +235 233 -3.165206906282861e+00 +235 234 -1.502055215844906e+01 +235 236 -1.502055215852576e+01 +235 237 -3.165206906282873e+00 +235 238 -7.412185823610160e-01 +235 239 -3.301555353436773e-01 +235 240 -1.820810586422657e-01 +235 241 -1.132183869282767e-01 +235 242 -7.613960933881186e-02 +235 243 -5.413421453123175e-02 +235 244 -4.012781031912999e-02 +235 245 -3.072751892616545e-02 +235 246 -2.415034675252904e-02 +235 247 -1.939104886145111e-02 +235 248 -1.585023865775527e-02 +235 249 -1.315380302376547e-02 +235 250 -1.105916272470027e-02 +235 251 -9.403863770832847e-03 +235 252 -8.076052134892604e-03 +235 253 -6.996835383339669e-03 +235 254 -6.109381318875749e-03 +235 255 -5.371977266379806e-03 +236 236 3.988394278146370e+01 +236 208 -2.312252367280536e-03 +236 209 -2.532689975072678e-03 +236 210 -2.783725492315674e-03 +236 211 -3.071047067257394e-03 +236 212 -3.401691470521393e-03 +236 213 -3.784439171232927e-03 +236 214 -4.230349322908531e-03 +236 215 -4.753493624956896e-03 +236 216 -5.371977266379802e-03 +236 217 -6.109381318875755e-03 +236 218 -6.996835383339681e-03 +236 219 -8.076052134892597e-03 +236 220 -9.403863770832823e-03 +236 221 -1.105916272470024e-02 +236 222 -1.315380302376545e-02 +236 223 -1.585023865775527e-02 +236 224 -1.939104886145110e-02 +236 225 -2.415034675252898e-02 +236 226 -3.072751892616539e-02 +236 227 -4.012781031912999e-02 +236 228 -5.413421453123168e-02 +236 229 -7.613960933881170e-02 +236 230 -1.132183869282765e-01 +236 231 -1.820810586422653e-01 +236 232 -3.301555353436768e-01 +236 233 -7.412185823610186e-01 +236 234 -3.165206906282876e+00 +236 235 -1.502055215852576e+01 +236 237 -1.502055215863300e+01 +236 238 -3.165206906282857e+00 +236 239 -7.412185823610185e-01 +236 240 -3.301555353436775e-01 +236 241 -1.820810586422656e-01 +236 242 -1.132183869282765e-01 +236 243 -7.613960933881160e-02 +236 244 -5.413421453123168e-02 +236 245 -4.012781031912992e-02 +236 246 -3.072751892616550e-02 +236 247 -2.415034675252895e-02 +236 248 -1.939104886145110e-02 +236 249 -1.585023865775525e-02 +236 250 -1.315380302376548e-02 +236 251 -1.105916272470026e-02 +236 252 -9.403863770832830e-03 +236 253 -8.076052134892590e-03 +236 254 -6.996835383339674e-03 +236 255 -6.109381318875749e-03 +237 237 3.988394278171953e+01 +237 208 -2.117777896667795e-03 +237 209 -2.312252367280536e-03 +237 210 -2.532689975072683e-03 +237 211 -2.783725492315676e-03 +237 212 -3.071047067257394e-03 +237 213 -3.401691470521396e-03 +237 214 -3.784439171232930e-03 +237 215 -4.230349322908535e-03 +237 216 -4.753493624956896e-03 +237 217 -5.371977266379815e-03 +237 218 -6.109381318875761e-03 +237 219 -6.996835383339681e-03 +237 220 -8.076052134892603e-03 +237 221 -9.403863770832827e-03 +237 222 -1.105916272470024e-02 +237 223 -1.315380302376547e-02 +237 224 -1.585023865775525e-02 +237 225 -1.939104886145111e-02 +237 226 -2.415034675252892e-02 +237 227 -3.072751892616545e-02 +237 228 -4.012781031912992e-02 +237 229 -5.413421453123174e-02 +237 230 -7.613960933881148e-02 +237 231 -1.132183869282765e-01 +237 232 -1.820810586422655e-01 +237 233 -3.301555353436747e-01 +237 234 -7.412185823610227e-01 +237 235 -3.165206906282873e+00 +237 236 -1.502055215863300e+01 +237 238 -1.502055215878373e+01 +237 239 -3.165206906282866e+00 +237 240 -7.412185823610231e-01 +237 241 -3.301555353436755e-01 +237 242 -1.820810586422647e-01 +237 243 -1.132183869282765e-01 +237 244 -7.613960933881159e-02 +237 245 -5.413421453123174e-02 +237 246 -4.012781031913008e-02 +237 247 -3.072751892616545e-02 +237 248 -2.415034675252898e-02 +237 249 -1.939104886145111e-02 +237 250 -1.585023865775529e-02 +237 251 -1.315380302376548e-02 +237 252 -1.105916272470026e-02 +237 253 -9.403863770832830e-03 +237 254 -8.076052134892596e-03 +237 255 -6.996835383339667e-03 +238 238 3.988394278208168e+01 +238 208 -1.945462087124854e-03 +238 209 -2.117777896667794e-03 +238 210 -2.312252367280539e-03 +238 211 -2.532689975072683e-03 +238 212 -2.783725492315674e-03 +238 213 -3.071047067257395e-03 +238 214 -3.401691470521396e-03 +238 215 -3.784439171232930e-03 +238 216 -4.230349322908533e-03 +238 217 -4.753493624956904e-03 +238 218 -5.371977266379816e-03 +238 219 -6.109381318875754e-03 +238 220 -6.996835383339681e-03 +238 221 -8.076052134892604e-03 +238 222 -9.403863770832835e-03 +238 223 -1.105916272470027e-02 +238 224 -1.315380302376548e-02 +238 225 -1.585023865775529e-02 +238 226 -1.939104886145112e-02 +238 227 -2.415034675252904e-02 +238 228 -3.072751892616550e-02 +238 229 -4.012781031913008e-02 +238 230 -5.413421453123169e-02 +238 231 -7.613960933881182e-02 +238 232 -1.132183869282765e-01 +238 233 -1.820810586422649e-01 +238 234 -3.301555353436765e-01 +238 235 -7.412185823610160e-01 +238 236 -3.165206906282857e+00 +238 237 -1.502055215878373e+01 +238 239 -1.502055215899860e+01 +238 240 -3.165206906282879e+00 +238 241 -7.412185823610243e-01 +238 242 -3.301555353436780e-01 +238 243 -1.820810586422657e-01 +238 244 -1.132183869282761e-01 +238 245 -7.613960933881142e-02 +238 246 -5.413421453123169e-02 +238 247 -4.012781031912983e-02 +238 248 -3.072751892616536e-02 +238 249 -2.415034675252890e-02 +238 250 -1.939104886145111e-02 +238 251 -1.585023865775525e-02 +238 252 -1.315380302376544e-02 +238 253 -1.105916272470023e-02 +238 254 -9.403863770832823e-03 +238 255 -8.076052134892590e-03 +239 239 3.988394278260306e+01 +239 208 -1.792160480940037e-03 +239 209 -1.945462087124851e-03 +239 210 -2.117777896667794e-03 +239 211 -2.312252367280536e-03 +239 212 -2.532689975072678e-03 +239 213 -2.783725492315670e-03 +239 214 -3.071047067257391e-03 +239 215 -3.401691470521391e-03 +239 216 -3.784439171232922e-03 +239 217 -4.230349322908532e-03 +239 218 -4.753493624956896e-03 +239 219 -5.371977266379802e-03 +239 220 -6.109381318875744e-03 +239 221 -6.996835383339669e-03 +239 222 -8.076052134892590e-03 +239 223 -9.403863770832833e-03 +239 224 -1.105916272470025e-02 +239 225 -1.315380302376546e-02 +239 226 -1.585023865775523e-02 +239 227 -1.939104886145111e-02 +239 228 -2.415034675252895e-02 +239 229 -3.072751892616545e-02 +239 230 -4.012781031912983e-02 +239 231 -5.413421453123175e-02 +239 232 -7.613960933881155e-02 +239 233 -1.132183869282763e-01 +239 234 -1.820810586422651e-01 +239 235 -3.301555353436773e-01 +239 236 -7.412185823610185e-01 +239 237 -3.165206906282866e+00 +239 238 -1.502055215899860e+01 +239 240 -1.502055215931067e+01 +239 241 -3.165206906282876e+00 +239 242 -7.412185823610195e-01 +239 243 -3.301555353436756e-01 +239 244 -1.820810586422648e-01 +239 245 -1.132183869282767e-01 +239 246 -7.613960933881186e-02 +239 247 -5.413421453123175e-02 +239 248 -4.012781031912999e-02 +239 249 -3.072751892616545e-02 +239 250 -2.415034675252904e-02 +239 251 -1.939104886145115e-02 +239 252 -1.585023865775527e-02 +239 253 -1.315380302376547e-02 +239 254 -1.105916272470027e-02 +239 255 -9.403863770832847e-03 +240 240 3.988394278260304e+01 +240 224 -9.403863770832830e-03 +240 225 -1.105916272470026e-02 +240 226 -1.315380302376545e-02 +240 227 -1.585023865775527e-02 +240 228 -1.939104886145110e-02 +240 229 -2.415034675252898e-02 +240 230 -3.072751892616536e-02 +240 231 -4.012781031912999e-02 +240 232 -5.413421453123168e-02 +240 233 -7.613960933881164e-02 +240 234 -1.132183869282764e-01 +240 235 -1.820810586422657e-01 +240 236 -3.301555353436775e-01 +240 237 -7.412185823610231e-01 +240 238 -3.165206906282879e+00 +240 239 -1.502055215931067e+01 +240 241 -1.502055215899859e+01 +240 242 -3.165206906282857e+00 +240 243 -7.412185823610127e-01 +240 244 -3.301555353436744e-01 +240 245 -1.820810586422653e-01 +240 246 -1.132183869282766e-01 +240 247 -7.613960933881166e-02 +240 248 -5.413421453123168e-02 +240 249 -4.012781031912992e-02 +240 250 -3.072751892616550e-02 +240 251 -2.415034675252900e-02 +240 252 -1.939104886145110e-02 +240 253 -1.585023865775525e-02 +240 254 -1.315380302376548e-02 +240 255 -1.105916272470026e-02 +240 256 -9.403863770832833e-03 +240 257 -8.076052134892611e-03 +240 258 -6.996835383339690e-03 +240 259 -6.109381318875761e-03 +240 260 -5.371977266379797e-03 +240 261 -4.753493624956887e-03 +240 262 -4.230349322908524e-03 +240 263 -3.784439171232927e-03 +240 264 -3.401691470521399e-03 +240 265 -3.071047067257397e-03 +240 266 -2.783725492315676e-03 +240 267 -2.532689975072677e-03 +240 268 -2.312252367280532e-03 +240 269 -2.117777896667791e-03 +240 270 -1.945462087124853e-03 +240 271 -1.792160480940041e-03 +241 241 3.988394278208168e+01 +241 224 -8.076052134892603e-03 +241 225 -9.403863770832837e-03 +241 226 -1.105916272470024e-02 +241 227 -1.315380302376547e-02 +241 228 -1.585023865775525e-02 +241 229 -1.939104886145111e-02 +241 230 -2.415034675252890e-02 +241 231 -3.072751892616545e-02 +241 232 -4.012781031912992e-02 +241 233 -5.413421453123174e-02 +241 234 -7.613960933881148e-02 +241 235 -1.132183869282767e-01 +241 236 -1.820810586422656e-01 +241 237 -3.301555353436755e-01 +241 238 -7.412185823610243e-01 +241 239 -3.165206906282876e+00 +241 240 -1.502055215899859e+01 +241 242 -1.502055215878373e+01 +241 243 -3.165206906282868e+00 +241 244 -7.412185823610199e-01 +241 245 -3.301555353436777e-01 +241 246 -1.820810586422652e-01 +241 247 -1.132183869282765e-01 +241 248 -7.613960933881164e-02 +241 249 -5.413421453123174e-02 +241 250 -4.012781031913008e-02 +241 251 -3.072751892616552e-02 +241 252 -2.415034675252898e-02 +241 253 -1.939104886145111e-02 +241 254 -1.585023865775529e-02 +241 255 -1.315380302376548e-02 +241 256 -1.105916272470027e-02 +241 257 -9.403863770832844e-03 +241 258 -8.076052134892609e-03 +241 259 -6.996835383339688e-03 +241 260 -6.109381318875739e-03 +241 261 -5.371977266379796e-03 +241 262 -4.753493624956887e-03 +241 263 -4.230349322908531e-03 +241 264 -3.784439171232933e-03 +241 265 -3.401691470521399e-03 +241 266 -3.071047067257397e-03 +241 267 -2.783725492315669e-03 +241 268 -2.532689975072676e-03 +241 269 -2.312252367280532e-03 +241 270 -2.117777896667794e-03 +241 271 -1.945462087124856e-03 +242 242 3.988394278171951e+01 +242 224 -6.996835383339681e-03 +242 225 -8.076052134892608e-03 +242 226 -9.403863770832832e-03 +242 227 -1.105916272470027e-02 +242 228 -1.315380302376548e-02 +242 229 -1.585023865775529e-02 +242 230 -1.939104886145110e-02 +242 231 -2.415034675252904e-02 +242 232 -3.072751892616550e-02 +242 233 -4.012781031913008e-02 +242 234 -5.413421453123169e-02 +242 235 -7.613960933881186e-02 +242 236 -1.132183869282765e-01 +242 237 -1.820810586422647e-01 +242 238 -3.301555353436780e-01 +242 239 -7.412185823610195e-01 +242 240 -3.165206906282857e+00 +242 241 -1.502055215878373e+01 +242 243 -1.502055215863301e+01 +242 244 -3.165206906282863e+00 +242 245 -7.412185823610220e-01 +242 246 -3.301555353436775e-01 +242 247 -1.820810586422655e-01 +242 248 -1.132183869282763e-01 +242 249 -7.613960933881136e-02 +242 250 -5.413421453123170e-02 +242 251 -4.012781031912993e-02 +242 252 -3.072751892616536e-02 +242 253 -2.415034675252890e-02 +242 254 -1.939104886145111e-02 +242 255 -1.585023865775525e-02 +242 256 -1.315380302376545e-02 +242 257 -1.105916272470024e-02 +242 258 -9.403863770832813e-03 +242 259 -8.076052134892606e-03 +242 260 -6.996835383339660e-03 +242 261 -6.109381318875737e-03 +242 262 -5.371977266379796e-03 +242 263 -4.753493624956895e-03 +242 264 -4.230349322908540e-03 +242 265 -3.784439171232933e-03 +242 266 -3.401691470521398e-03 +242 267 -3.071047067257389e-03 +242 268 -2.783725492315668e-03 +242 269 -2.532689975072676e-03 +242 270 -2.312252367280535e-03 +242 271 -2.117777896667797e-03 +243 243 3.988394278146369e+01 +243 224 -6.109381318875755e-03 +243 225 -6.996835383339681e-03 +243 226 -8.076052134892594e-03 +243 227 -9.403863770832833e-03 +243 228 -1.105916272470025e-02 +243 229 -1.315380302376546e-02 +243 230 -1.585023865775522e-02 +243 231 -1.939104886145111e-02 +243 232 -2.415034675252895e-02 +243 233 -3.072751892616545e-02 +243 234 -4.012781031912983e-02 +243 235 -5.413421453123175e-02 +243 236 -7.613960933881160e-02 +243 237 -1.132183869282765e-01 +243 238 -1.820810586422657e-01 +243 239 -3.301555353436756e-01 +243 240 -7.412185823610127e-01 +243 241 -3.165206906282868e+00 +243 242 -1.502055215863301e+01 +243 244 -1.502055215852574e+01 +243 245 -3.165206906282866e+00 +243 246 -7.412185823610206e-01 +243 247 -3.301555353436758e-01 +243 248 -1.820810586422651e-01 +243 249 -1.132183869282763e-01 +243 250 -7.613960933881182e-02 +243 251 -5.413421453123191e-02 +243 252 -4.012781031912999e-02 +243 253 -3.072751892616545e-02 +243 254 -2.415034675252904e-02 +243 255 -1.939104886145115e-02 +243 256 -1.585023865775528e-02 +243 257 -1.315380302376548e-02 +243 258 -1.105916272470025e-02 +243 259 -9.403863770832853e-03 +243 260 -8.076052134892589e-03 +243 261 -6.996835383339658e-03 +243 262 -6.109381318875737e-03 +243 263 -5.371977266379806e-03 +243 264 -4.753493624956905e-03 +243 265 -4.230349322908540e-03 +243 266 -3.784439171232933e-03 +243 267 -3.401691470521388e-03 +243 268 -3.071047067257388e-03 +243 269 -2.783725492315668e-03 +243 270 -2.532689975072680e-03 +243 271 -2.312252367280539e-03 +244 244 3.988394278128113e+01 +244 224 -5.371977266379815e-03 +244 225 -6.109381318875761e-03 +244 226 -6.996835383339681e-03 +244 227 -8.076052134892604e-03 +244 228 -9.403863770832830e-03 +244 229 -1.105916272470026e-02 +244 230 -1.315380302376544e-02 +244 231 -1.585023865775527e-02 +244 232 -1.939104886145110e-02 +244 233 -2.415034675252898e-02 +244 234 -3.072751892616536e-02 +244 235 -4.012781031912999e-02 +244 236 -5.413421453123168e-02 +244 237 -7.613960933881159e-02 +244 238 -1.132183869282761e-01 +244 239 -1.820810586422648e-01 +244 240 -3.301555353436744e-01 +244 241 -7.412185823610199e-01 +244 242 -3.165206906282863e+00 +244 243 -1.502055215852574e+01 +244 245 -1.502055215844907e+01 +244 246 -3.165206906282878e+00 +244 247 -7.412185823610208e-01 +244 248 -3.301555353436763e-01 +244 249 -1.820810586422653e-01 +244 250 -1.132183869282767e-01 +244 251 -7.613960933881181e-02 +244 252 -5.413421453123170e-02 +244 253 -4.012781031912992e-02 +244 254 -3.072751892616550e-02 +244 255 -2.415034675252900e-02 +244 256 -1.939104886145113e-02 +244 257 -1.585023865775526e-02 +244 258 -1.315380302376544e-02 +244 259 -1.105916272470027e-02 +244 260 -9.403863770832835e-03 +244 261 -8.076052134892580e-03 +244 262 -6.996835383339651e-03 +244 263 -6.109381318875742e-03 +244 264 -5.371977266379811e-03 +244 265 -4.753493624956901e-03 +244 266 -4.230349322908536e-03 +244 267 -3.784439171232919e-03 +244 268 -3.401691470521385e-03 +244 269 -3.071047067257386e-03 +244 270 -2.783725492315670e-03 +244 271 -2.532689975072682e-03 +245 245 3.988394278115153e+01 +245 224 -4.753493624956904e-03 +245 225 -5.371977266379816e-03 +245 226 -6.109381318875754e-03 +245 227 -6.996835383339681e-03 +245 228 -8.076052134892603e-03 +245 229 -9.403863770832835e-03 +245 230 -1.105916272470023e-02 +245 231 -1.315380302376547e-02 +245 232 -1.585023865775525e-02 +245 233 -1.939104886145111e-02 +245 234 -2.415034675252890e-02 +245 235 -3.072751892616545e-02 +245 236 -4.012781031912992e-02 +245 237 -5.413421453123174e-02 +245 238 -7.613960933881142e-02 +245 239 -1.132183869282767e-01 +245 240 -1.820810586422653e-01 +245 241 -3.301555353436777e-01 +245 242 -7.412185823610220e-01 +245 243 -3.165206906282866e+00 +245 244 -1.502055215844907e+01 +245 246 -1.502055215839542e+01 +245 247 -3.165206906282862e+00 +245 248 -7.412185823610138e-01 +245 249 -3.301555353436746e-01 +245 250 -1.820810586422645e-01 +245 251 -1.132183869282767e-01 +245 252 -7.613960933881170e-02 +245 253 -5.413421453123174e-02 +245 254 -4.012781031913008e-02 +245 255 -3.072751892616552e-02 +245 256 -2.415034675252901e-02 +245 257 -1.939104886145113e-02 +245 258 -1.585023865775525e-02 +245 259 -1.315380302376550e-02 +245 260 -1.105916272470028e-02 +245 261 -9.403863770832833e-03 +245 262 -8.076052134892578e-03 +245 263 -6.996835383339667e-03 +245 264 -6.109381318875756e-03 +245 265 -5.371977266379812e-03 +245 266 -4.753493624956900e-03 +245 267 -4.230349322908522e-03 +245 268 -3.784439171232918e-03 +245 269 -3.401691470521385e-03 +245 270 -3.071047067257390e-03 +245 271 -2.783725492315674e-03 +246 246 3.988394278106476e+01 +246 224 -4.230349322908532e-03 +246 225 -4.753493624956896e-03 +246 226 -5.371977266379802e-03 +246 227 -6.109381318875744e-03 +246 228 -6.996835383339669e-03 +246 229 -8.076052134892596e-03 +246 230 -9.403863770832823e-03 +246 231 -1.105916272470027e-02 +246 232 -1.315380302376548e-02 +246 233 -1.585023865775529e-02 +246 234 -1.939104886145110e-02 +246 235 -2.415034675252904e-02 +246 236 -3.072751892616550e-02 +246 237 -4.012781031913008e-02 +246 238 -5.413421453123169e-02 +246 239 -7.613960933881186e-02 +246 240 -1.132183869282766e-01 +246 241 -1.820810586422652e-01 +246 242 -3.301555353436775e-01 +246 243 -7.412185823610206e-01 +246 244 -3.165206906282878e+00 +246 245 -1.502055215839542e+01 +246 247 -1.502055215836221e+01 +246 248 -3.165206906282858e+00 +246 249 -7.412185823610136e-01 +246 250 -3.301555353436744e-01 +246 251 -1.820810586422653e-01 +246 252 -1.132183869282763e-01 +246 253 -7.613960933881142e-02 +246 254 -5.413421453123170e-02 +246 255 -4.012781031912993e-02 +246 256 -3.072751892616539e-02 +246 257 -2.415034675252893e-02 +246 258 -1.939104886145104e-02 +246 259 -1.585023865775526e-02 +246 260 -1.315380302376547e-02 +246 261 -1.105916272470024e-02 +246 262 -9.403863770832806e-03 +246 263 -8.076052134892604e-03 +246 264 -6.996835383339695e-03 +246 265 -6.109381318875767e-03 +246 266 -5.371977266379819e-03 +246 267 -4.753493624956892e-03 +246 268 -4.230349322908527e-03 +246 269 -3.784439171232923e-03 +246 270 -3.401691470521395e-03 +246 271 -3.071047067257399e-03 +247 247 3.988394278102302e+01 +247 224 -3.784439171232930e-03 +247 225 -4.230349322908535e-03 +247 226 -4.753493624956896e-03 +247 227 -5.371977266379806e-03 +247 228 -6.109381318875749e-03 +247 229 -6.996835383339674e-03 +247 230 -8.076052134892587e-03 +247 231 -9.403863770832832e-03 +247 232 -1.105916272470025e-02 +247 233 -1.315380302376546e-02 +247 234 -1.585023865775522e-02 +247 235 -1.939104886145111e-02 +247 236 -2.415034675252895e-02 +247 237 -3.072751892616545e-02 +247 238 -4.012781031912983e-02 +247 239 -5.413421453123175e-02 +247 240 -7.613960933881166e-02 +247 241 -1.132183869282765e-01 +247 242 -1.820810586422655e-01 +247 243 -3.301555353436758e-01 +247 244 -7.412185823610208e-01 +247 245 -3.165206906282862e+00 +247 246 -1.502055215836221e+01 +247 248 -1.502055215835490e+01 +247 249 -3.165206906282855e+00 +247 250 -7.412185823610141e-01 +247 251 -3.301555353436753e-01 +247 252 -1.820810586422653e-01 +247 253 -1.132183869282765e-01 +247 254 -7.613960933881178e-02 +247 255 -5.413421453123191e-02 +247 256 -4.012781031913005e-02 +247 257 -3.072751892616549e-02 +247 258 -2.415034675252895e-02 +247 259 -1.939104886145117e-02 +247 260 -1.585023865775530e-02 +247 261 -1.315380302376548e-02 +247 262 -1.105916272470025e-02 +247 263 -9.403863770832853e-03 +247 264 -8.076052134892615e-03 +247 265 -6.996835383339690e-03 +247 266 -6.109381318875761e-03 +247 267 -5.371977266379797e-03 +247 268 -4.753493624956887e-03 +247 269 -4.230349322908524e-03 +247 270 -3.784439171232927e-03 +247 271 -3.401691470521399e-03 +248 248 3.988394278105611e+01 +248 224 -3.401691470521396e-03 +248 225 -3.784439171232930e-03 +248 226 -4.230349322908531e-03 +248 227 -4.753493624956896e-03 +248 228 -5.371977266379806e-03 +248 229 -6.109381318875749e-03 +248 230 -6.996835383339667e-03 +248 231 -8.076052134892590e-03 +248 232 -9.403863770832830e-03 +248 233 -1.105916272470026e-02 +248 234 -1.315380302376544e-02 +248 235 -1.585023865775527e-02 +248 236 -1.939104886145110e-02 +248 237 -2.415034675252898e-02 +248 238 -3.072751892616536e-02 +248 239 -4.012781031912999e-02 +248 240 -5.413421453123168e-02 +248 241 -7.613960933881164e-02 +248 242 -1.132183869282763e-01 +248 243 -1.820810586422651e-01 +248 244 -3.301555353436763e-01 +248 245 -7.412185823610138e-01 +248 246 -3.165206906282858e+00 +248 247 -1.502055215835490e+01 +248 249 -1.502055215840046e+01 +248 250 -3.165206906282862e+00 +248 251 -7.412185823610206e-01 +248 252 -3.301555353436783e-01 +248 253 -1.820810586422654e-01 +248 254 -1.132183869282763e-01 +248 255 -7.613960933881177e-02 +248 256 -5.413421453123177e-02 +248 257 -4.012781031912999e-02 +248 258 -3.072751892616538e-02 +248 259 -2.415034675252903e-02 +248 260 -1.939104886145116e-02 +248 261 -1.585023865775526e-02 +248 262 -1.315380302376544e-02 +248 263 -1.105916272470027e-02 +248 264 -9.403863770832846e-03 +248 265 -8.076052134892611e-03 +248 266 -6.996835383339688e-03 +248 267 -6.109381318875739e-03 +248 268 -5.371977266379796e-03 +248 269 -4.753493624956887e-03 +248 270 -4.230349322908531e-03 +248 271 -3.784439171232933e-03 +249 249 3.988394278128563e+01 +249 224 -3.071047067257395e-03 +249 225 -3.401691470521395e-03 +249 226 -3.784439171232927e-03 +249 227 -4.230349322908531e-03 +249 228 -4.753493624956896e-03 +249 229 -5.371977266379806e-03 +249 230 -6.109381318875744e-03 +249 231 -6.996835383339667e-03 +249 232 -8.076052134892601e-03 +249 233 -9.403863770832830e-03 +249 234 -1.105916272470023e-02 +249 235 -1.315380302376547e-02 +249 236 -1.585023865775525e-02 +249 237 -1.939104886145111e-02 +249 238 -2.415034675252890e-02 +249 239 -3.072751892616545e-02 +249 240 -4.012781031912992e-02 +249 241 -5.413421453123174e-02 +249 242 -7.613960933881136e-02 +249 243 -1.132183869282763e-01 +249 244 -1.820810586422653e-01 +249 245 -3.301555353436746e-01 +249 246 -7.412185823610136e-01 +249 247 -3.165206906282855e+00 +249 248 -1.502055215840046e+01 +249 250 -1.502055215860533e+01 +249 251 -3.165206906282877e+00 +249 252 -7.412185823610229e-01 +249 253 -3.301555353436765e-01 +249 254 -1.820810586422649e-01 +249 255 -1.132183869282768e-01 +249 256 -7.613960933881182e-02 +249 257 -5.413421453123184e-02 +249 258 -4.012781031912993e-02 +249 259 -3.072751892616556e-02 +249 260 -2.415034675252906e-02 +249 261 -1.939104886145113e-02 +249 262 -1.585023865775525e-02 +249 263 -1.315380302376550e-02 +249 264 -1.105916272470028e-02 +249 265 -9.403863770832851e-03 +249 266 -8.076052134892608e-03 +249 267 -6.996835383339660e-03 +249 268 -6.109381318875737e-03 +249 269 -5.371977266379796e-03 +249 270 -4.753493624956895e-03 +249 271 -4.230349322908540e-03 +250 250 3.988394278152495e+01 +250 224 -2.783725492315674e-03 +250 225 -3.071047067257394e-03 +250 226 -3.401691470521393e-03 +250 227 -3.784439171232927e-03 +250 228 -4.230349322908531e-03 +250 229 -4.753493624956896e-03 +250 230 -5.371977266379801e-03 +250 231 -6.109381318875745e-03 +250 232 -6.996835383339681e-03 +250 233 -8.076052134892599e-03 +250 234 -9.403863770832823e-03 +250 235 -1.105916272470027e-02 +250 236 -1.315380302376548e-02 +250 237 -1.585023865775529e-02 +250 238 -1.939104886145111e-02 +250 239 -2.415034675252904e-02 +250 240 -3.072751892616550e-02 +250 241 -4.012781031913008e-02 +250 242 -5.413421453123170e-02 +250 243 -7.613960933881182e-02 +250 244 -1.132183869282767e-01 +250 245 -1.820810586422645e-01 +250 246 -3.301555353436744e-01 +250 247 -7.412185823610141e-01 +250 248 -3.165206906282862e+00 +250 249 -1.502055215860533e+01 +250 251 -1.502055215859221e+01 +250 252 -3.165206906282871e+00 +250 253 -7.412185823610237e-01 +250 254 -3.301555353436759e-01 +250 255 -1.820810586422658e-01 +250 256 -1.132183869282764e-01 +250 257 -7.613960933881145e-02 +250 258 -5.413421453123143e-02 +250 259 -4.012781031912998e-02 +250 260 -3.072751892616546e-02 +250 261 -2.415034675252892e-02 +250 262 -1.939104886145104e-02 +250 263 -1.585023865775526e-02 +250 264 -1.315380302376547e-02 +250 265 -1.105916272470026e-02 +250 266 -9.403863770832813e-03 +250 267 -8.076052134892580e-03 +250 268 -6.996835383339658e-03 +250 269 -6.109381318875737e-03 +250 270 -5.371977266379806e-03 +250 271 -4.753493624956905e-03 +251 251 3.988394278151357e+01 +251 224 -2.532689975072683e-03 +251 225 -2.783725492315676e-03 +251 226 -3.071047067257394e-03 +251 227 -3.401691470521396e-03 +251 228 -3.784439171232930e-03 +251 229 -4.230349322908535e-03 +251 230 -4.753493624956895e-03 +251 231 -5.371977266379805e-03 +251 232 -6.109381318875761e-03 +251 233 -6.996835383339681e-03 +251 234 -8.076052134892603e-03 +251 235 -9.403863770832847e-03 +251 236 -1.105916272470026e-02 +251 237 -1.315380302376548e-02 +251 238 -1.585023865775525e-02 +251 239 -1.939104886145115e-02 +251 240 -2.415034675252900e-02 +251 241 -3.072751892616552e-02 +251 242 -4.012781031912993e-02 +251 243 -5.413421453123191e-02 +251 244 -7.613960933881181e-02 +251 245 -1.132183869282767e-01 +251 246 -1.820810586422653e-01 +251 247 -3.301555353436753e-01 +251 248 -7.412185823610206e-01 +251 249 -3.165206906282877e+00 +251 250 -1.502055215859221e+01 +251 252 -1.502055215859653e+01 +251 253 -3.165206906282873e+00 +251 254 -7.412185823610171e-01 +251 255 -3.301555353436764e-01 +251 256 -1.820810586422650e-01 +251 257 -1.132183869282763e-01 +251 258 -7.613960933881141e-02 +251 259 -5.413421453123183e-02 +251 260 -4.012781031913004e-02 +251 261 -3.072751892616542e-02 +251 262 -2.415034675252890e-02 +251 263 -1.939104886145113e-02 +251 264 -1.585023865775528e-02 +251 265 -1.315380302376548e-02 +251 266 -1.105916272470023e-02 +251 267 -9.403863770832832e-03 +251 268 -8.076052134892582e-03 +251 269 -6.996835383339651e-03 +251 270 -6.109381318875742e-03 +251 271 -5.371977266379811e-03 +252 252 3.988394278151441e+01 +252 224 -2.312252367280539e-03 +252 225 -2.532689975072683e-03 +252 226 -2.783725492315674e-03 +252 227 -3.071047067257395e-03 +252 228 -3.401691470521396e-03 +252 229 -3.784439171232930e-03 +252 230 -4.230349322908533e-03 +252 231 -4.753493624956895e-03 +252 232 -5.371977266379814e-03 +252 233 -6.109381318875754e-03 +252 234 -6.996835383339681e-03 +252 235 -8.076052134892604e-03 +252 236 -9.403863770832830e-03 +252 237 -1.105916272470026e-02 +252 238 -1.315380302376544e-02 +252 239 -1.585023865775527e-02 +252 240 -1.939104886145110e-02 +252 241 -2.415034675252898e-02 +252 242 -3.072751892616536e-02 +252 243 -4.012781031912999e-02 +252 244 -5.413421453123170e-02 +252 245 -7.613960933881170e-02 +252 246 -1.132183869282763e-01 +252 247 -1.820810586422653e-01 +252 248 -3.301555353436783e-01 +252 249 -7.412185823610229e-01 +252 250 -3.165206906282871e+00 +252 251 -1.502055215859653e+01 +252 253 -1.502055215858804e+01 +252 254 -3.165206906282861e+00 +252 255 -7.412185823610139e-01 +252 256 -3.301555353436756e-01 +252 257 -1.820810586422647e-01 +252 258 -1.132183869282764e-01 +252 259 -7.613960933881175e-02 +252 260 -5.413421453123192e-02 +252 261 -4.012781031912999e-02 +252 262 -3.072751892616538e-02 +252 263 -2.415034675252903e-02 +252 264 -1.939104886145116e-02 +252 265 -1.585023865775529e-02 +252 266 -1.315380302376545e-02 +252 267 -1.105916272470027e-02 +252 268 -9.403863770832835e-03 +252 269 -8.076052134892580e-03 +252 270 -6.996835383339667e-03 +252 271 -6.109381318875756e-03 +253 253 3.988394278153932e+01 +253 224 -2.117777896667794e-03 +253 225 -2.312252367280536e-03 +253 226 -2.532689975072678e-03 +253 227 -2.783725492315670e-03 +253 228 -3.071047067257391e-03 +253 229 -3.401691470521391e-03 +253 230 -3.784439171232922e-03 +253 231 -4.230349322908526e-03 +253 232 -4.753493624956896e-03 +253 233 -5.371977266379802e-03 +253 234 -6.109381318875744e-03 +253 235 -6.996835383339669e-03 +253 236 -8.076052134892590e-03 +253 237 -9.403863770832830e-03 +253 238 -1.105916272470023e-02 +253 239 -1.315380302376547e-02 +253 240 -1.585023865775525e-02 +253 241 -1.939104886145111e-02 +253 242 -2.415034675252890e-02 +253 243 -3.072751892616545e-02 +253 244 -4.012781031912992e-02 +253 245 -5.413421453123174e-02 +253 246 -7.613960933881142e-02 +253 247 -1.132183869282765e-01 +253 248 -1.820810586422654e-01 +253 249 -3.301555353436765e-01 +253 250 -7.412185823610237e-01 +253 251 -3.165206906282873e+00 +253 252 -1.502055215858804e+01 +253 254 -1.502055215864000e+01 +253 255 -3.165206906282862e+00 +253 256 -7.412185823610195e-01 +253 257 -3.301555353436749e-01 +253 258 -1.820810586422654e-01 +253 259 -1.132183869282763e-01 +253 260 -7.613960933881184e-02 +253 261 -5.413421453123184e-02 +253 262 -4.012781031912993e-02 +253 263 -3.072751892616556e-02 +253 264 -2.415034675252906e-02 +253 265 -1.939104886145117e-02 +253 266 -1.585023865775525e-02 +253 267 -1.315380302376550e-02 +253 268 -1.105916272470028e-02 +253 269 -9.403863770832847e-03 +253 270 -8.076052134892606e-03 +253 271 -6.996835383339695e-03 +254 254 3.988394278164018e+01 +254 224 -1.945462087124854e-03 +254 225 -2.117777896667795e-03 +254 226 -2.312252367280536e-03 +254 227 -2.532689975072680e-03 +254 228 -2.783725492315672e-03 +254 229 -3.071047067257393e-03 +254 230 -3.401691470521391e-03 +254 231 -3.784439171232924e-03 +254 232 -4.230349322908535e-03 +254 233 -4.753493624956896e-03 +254 234 -5.371977266379806e-03 +254 235 -6.109381318875749e-03 +254 236 -6.996835383339674e-03 +254 237 -8.076052134892596e-03 +254 238 -9.403863770832823e-03 +254 239 -1.105916272470027e-02 +254 240 -1.315380302376548e-02 +254 241 -1.585023865775529e-02 +254 242 -1.939104886145111e-02 +254 243 -2.415034675252904e-02 +254 244 -3.072751892616550e-02 +254 245 -4.012781031913008e-02 +254 246 -5.413421453123170e-02 +254 247 -7.613960933881178e-02 +254 248 -1.132183869282763e-01 +254 249 -1.820810586422649e-01 +254 250 -3.301555353436759e-01 +254 251 -7.412185823610171e-01 +254 252 -3.165206906282861e+00 +254 253 -1.502055215864000e+01 +254 255 -1.502055215866001e+01 +254 256 -3.165206906282872e+00 +254 257 -7.412185823610206e-01 +254 258 -3.301555353436784e-01 +254 259 -1.820810586422662e-01 +254 260 -1.132183869282764e-01 +254 261 -7.613960933881139e-02 +254 262 -5.413421453123143e-02 +254 263 -4.012781031912998e-02 +254 264 -3.072751892616546e-02 +254 265 -2.415034675252897e-02 +254 266 -1.939104886145104e-02 +254 267 -1.585023865775526e-02 +254 268 -1.315380302376547e-02 +254 269 -1.105916272470026e-02 +254 270 -9.403863770832813e-03 +254 271 -8.076052134892608e-03 +255 255 3.988394278169704e+01 +255 224 -1.792160480940039e-03 +255 225 -1.945462087124854e-03 +255 226 -2.117777896667794e-03 +255 227 -2.312252367280536e-03 +255 228 -2.532689975072680e-03 +255 229 -2.783725492315672e-03 +255 230 -3.071047067257391e-03 +255 231 -3.401691470521391e-03 +255 232 -3.784439171232929e-03 +255 233 -4.230349322908531e-03 +255 234 -4.753493624956896e-03 +255 235 -5.371977266379806e-03 +255 236 -6.109381318875749e-03 +255 237 -6.996835383339667e-03 +255 238 -8.076052134892590e-03 +255 239 -9.403863770832847e-03 +255 240 -1.105916272470026e-02 +255 241 -1.315380302376548e-02 +255 242 -1.585023865775525e-02 +255 243 -1.939104886145115e-02 +255 244 -2.415034675252900e-02 +255 245 -3.072751892616552e-02 +255 246 -4.012781031912993e-02 +255 247 -5.413421453123191e-02 +255 248 -7.613960933881177e-02 +255 249 -1.132183869282768e-01 +255 250 -1.820810586422658e-01 +255 251 -3.301555353436764e-01 +255 252 -7.412185823610139e-01 +255 253 -3.165206906282862e+00 +255 254 -1.502055215866001e+01 +255 256 -1.502055215931066e+01 +255 257 -3.165206906282876e+00 +255 258 -7.412185823610230e-01 +255 259 -3.301555353436768e-01 +255 260 -1.820810586422644e-01 +255 261 -1.132183869282760e-01 +255 262 -7.613960933881141e-02 +255 263 -5.413421453123183e-02 +255 264 -4.012781031913004e-02 +255 265 -3.072751892616549e-02 +255 266 -2.415034675252890e-02 +255 267 -1.939104886145113e-02 +255 268 -1.585023865775528e-02 +255 269 -1.315380302376548e-02 +255 270 -1.105916272470023e-02 +255 271 -9.403863770832842e-03 +256 256 3.988394278169707e+01 +256 240 -9.403863770832833e-03 +256 241 -1.105916272470027e-02 +256 242 -1.315380302376545e-02 +256 243 -1.585023865775528e-02 +256 244 -1.939104886145113e-02 +256 245 -2.415034675252901e-02 +256 246 -3.072751892616539e-02 +256 247 -4.012781031913005e-02 +256 248 -5.413421453123177e-02 +256 249 -7.613960933881182e-02 +256 250 -1.132183869282764e-01 +256 251 -1.820810586422650e-01 +256 252 -3.301555353436756e-01 +256 253 -7.412185823610195e-01 +256 254 -3.165206906282872e+00 +256 255 -1.502055215931066e+01 +256 257 -1.502055215866002e+01 +256 258 -3.165206906282875e+00 +256 259 -7.412185823610238e-01 +256 260 -3.301555353436779e-01 +256 261 -1.820810586422653e-01 +256 262 -1.132183869282766e-01 +256 263 -7.613960933881184e-02 +256 264 -5.413421453123183e-02 +256 265 -4.012781031913003e-02 +256 266 -3.072751892616535e-02 +256 267 -2.415034675252900e-02 +256 268 -1.939104886145114e-02 +256 269 -1.585023865775528e-02 +256 270 -1.315380302376544e-02 +256 271 -1.105916272470026e-02 +256 272 -9.403863770832839e-03 +256 273 -8.076052134892601e-03 +256 274 -6.996835383339652e-03 +256 275 -6.109381318875730e-03 +256 276 -5.371977266379790e-03 +256 277 -4.753493624956890e-03 +256 278 -4.230349322908535e-03 +256 279 -3.784439171232930e-03 +256 280 -3.401691470521395e-03 +256 281 -3.071047067257386e-03 +256 282 -2.783725492315666e-03 +256 283 -2.532689975072674e-03 +256 284 -2.312252367280531e-03 +256 285 -2.117777896667795e-03 +256 286 -1.945462087124854e-03 +256 287 -1.792160480940039e-03 +257 257 3.988394278164019e+01 +257 240 -8.076052134892611e-03 +257 241 -9.403863770832844e-03 +257 242 -1.105916272470024e-02 +257 243 -1.315380302376548e-02 +257 244 -1.585023865775526e-02 +257 245 -1.939104886145113e-02 +257 246 -2.415034675252893e-02 +257 247 -3.072751892616549e-02 +257 248 -4.012781031912999e-02 +257 249 -5.413421453123184e-02 +257 250 -7.613960933881145e-02 +257 251 -1.132183869282763e-01 +257 252 -1.820810586422647e-01 +257 253 -3.301555353436749e-01 +257 254 -7.412185823610206e-01 +257 255 -3.165206906282876e+00 +257 256 -1.502055215866002e+01 +257 258 -1.502055215864001e+01 +257 259 -3.165206906282856e+00 +257 260 -7.412185823610090e-01 +257 261 -3.301555353436748e-01 +257 262 -1.820810586422654e-01 +257 263 -1.132183869282765e-01 +257 264 -7.613960933881168e-02 +257 265 -5.413421453123188e-02 +257 266 -4.012781031912987e-02 +257 267 -3.072751892616551e-02 +257 268 -2.415034675252902e-02 +257 269 -1.939104886145115e-02 +257 270 -1.585023865775523e-02 +257 271 -1.315380302376548e-02 +257 272 -1.105916272470027e-02 +257 273 -9.403863770832840e-03 +257 274 -8.076052134892570e-03 +257 275 -6.996835383339644e-03 +257 276 -6.109381318875723e-03 +257 277 -5.371977266379795e-03 +257 278 -4.753493624956896e-03 +257 279 -4.230349322908531e-03 +257 280 -3.784439171232926e-03 +257 281 -3.401691470521383e-03 +257 282 -3.071047067257383e-03 +257 283 -2.783725492315664e-03 +257 284 -2.532689975072673e-03 +257 285 -2.312252367280536e-03 +257 286 -2.117777896667794e-03 +257 287 -1.945462087124853e-03 +258 258 3.988394278153929e+01 +258 240 -6.996835383339690e-03 +258 241 -8.076052134892609e-03 +258 242 -9.403863770832813e-03 +258 243 -1.105916272470025e-02 +258 244 -1.315380302376544e-02 +258 245 -1.585023865775525e-02 +258 246 -1.939104886145104e-02 +258 247 -2.415034675252895e-02 +258 248 -3.072751892616538e-02 +258 249 -4.012781031912993e-02 +258 250 -5.413421453123143e-02 +258 251 -7.613960933881141e-02 +258 252 -1.132183869282764e-01 +258 253 -1.820810586422654e-01 +258 254 -3.301555353436784e-01 +258 255 -7.412185823610230e-01 +258 256 -3.165206906282875e+00 +258 257 -1.502055215864001e+01 +258 259 -1.502055215858802e+01 +258 260 -3.165206906282849e+00 +258 261 -7.412185823610125e-01 +258 262 -3.301555353436747e-01 +258 263 -1.820810586422653e-01 +258 264 -1.132183869282764e-01 +258 265 -7.613960933881192e-02 +258 266 -5.413421453123173e-02 +258 267 -4.012781031913016e-02 +258 268 -3.072751892616558e-02 +258 269 -2.415034675252907e-02 +258 270 -1.939104886145111e-02 +258 271 -1.585023865775531e-02 +258 272 -1.315380302376551e-02 +258 273 -1.105916272470029e-02 +258 274 -9.403863770832818e-03 +258 275 -8.076052134892573e-03 +258 276 -6.996835383339644e-03 +258 277 -6.109381318875736e-03 +258 278 -5.371977266379805e-03 +258 279 -4.753493624956896e-03 +258 280 -4.230349322908530e-03 +258 281 -3.784439171232915e-03 +258 282 -3.401691470521382e-03 +258 283 -3.071047067257383e-03 +258 284 -2.783725492315664e-03 +258 285 -2.532689975072679e-03 +258 286 -2.312252367280536e-03 +258 287 -2.117777896667794e-03 +259 259 3.988394278151440e+01 +259 240 -6.109381318875761e-03 +259 241 -6.996835383339688e-03 +259 242 -8.076052134892606e-03 +259 243 -9.403863770832853e-03 +259 244 -1.105916272470027e-02 +259 245 -1.315380302376550e-02 +259 246 -1.585023865775526e-02 +259 247 -1.939104886145117e-02 +259 248 -2.415034675252903e-02 +259 249 -3.072751892616556e-02 +259 250 -4.012781031912998e-02 +259 251 -5.413421453123183e-02 +259 252 -7.613960933881175e-02 +259 253 -1.132183869282763e-01 +259 254 -1.820810586422662e-01 +259 255 -3.301555353436768e-01 +259 256 -7.412185823610238e-01 +259 257 -3.165206906282856e+00 +259 258 -1.502055215858802e+01 +259 260 -1.502055215859653e+01 +259 261 -3.165206906282869e+00 +259 262 -7.412185823610217e-01 +259 263 -3.301555353436783e-01 +259 264 -1.820810586422654e-01 +259 265 -1.132183869282764e-01 +259 266 -7.613960933881123e-02 +259 267 -5.413421453123170e-02 +259 268 -4.012781031912997e-02 +259 269 -3.072751892616544e-02 +259 270 -2.415034675252887e-02 +259 271 -1.939104886145111e-02 +259 272 -1.585023865775526e-02 +259 273 -1.315380302376546e-02 +259 274 -1.105916272470022e-02 +259 275 -9.403863770832814e-03 +259 276 -8.076052134892563e-03 +259 277 -6.996835383339660e-03 +259 278 -6.109381318875751e-03 +259 279 -5.371977266379807e-03 +259 280 -4.753493624956895e-03 +259 281 -4.230349322908519e-03 +259 282 -3.784439171232915e-03 +259 283 -3.401691470521383e-03 +259 284 -3.071047067257384e-03 +259 285 -2.783725492315672e-03 +259 286 -2.532689975072680e-03 +259 287 -2.312252367280537e-03 +260 260 3.988394278151356e+01 +260 240 -5.371977266379797e-03 +260 241 -6.109381318875739e-03 +260 242 -6.996835383339660e-03 +260 243 -8.076052134892589e-03 +260 244 -9.403863770832835e-03 +260 245 -1.105916272470028e-02 +260 246 -1.315380302376547e-02 +260 247 -1.585023865775530e-02 +260 248 -1.939104886145116e-02 +260 249 -2.415034675252906e-02 +260 250 -3.072751892616546e-02 +260 251 -4.012781031913004e-02 +260 252 -5.413421453123192e-02 +260 253 -7.613960933881184e-02 +260 254 -1.132183869282764e-01 +260 255 -1.820810586422644e-01 +260 256 -3.301555353436779e-01 +260 257 -7.412185823610090e-01 +260 258 -3.165206906282849e+00 +260 259 -1.502055215859653e+01 +260 261 -1.502055215859223e+01 +260 262 -3.165206906282871e+00 +260 263 -7.412185823610288e-01 +260 264 -3.301555353436793e-01 +260 265 -1.820810586422658e-01 +260 266 -1.132183869282762e-01 +260 267 -7.613960933881166e-02 +260 268 -5.413421453123172e-02 +260 269 -4.012781031912996e-02 +260 270 -3.072751892616530e-02 +260 271 -2.415034675252896e-02 +260 272 -1.939104886145111e-02 +260 273 -1.585023865775526e-02 +260 274 -1.315380302376542e-02 +260 275 -1.105916272470025e-02 +260 276 -9.403863770832806e-03 +260 277 -8.076052134892609e-03 +260 278 -6.996835383339703e-03 +260 279 -6.109381318875772e-03 +260 280 -5.371977266379824e-03 +260 281 -4.753493624956896e-03 +260 282 -4.230349322908531e-03 +260 283 -3.784439171232926e-03 +260 284 -3.401691470521393e-03 +260 285 -3.071047067257401e-03 +260 286 -2.783725492315680e-03 +260 287 -2.532689975072687e-03 +261 261 3.988394278152496e+01 +261 240 -4.753493624956887e-03 +261 241 -5.371977266379796e-03 +261 242 -6.109381318875737e-03 +261 243 -6.996835383339658e-03 +261 244 -8.076052134892580e-03 +261 245 -9.403863770832833e-03 +261 246 -1.105916272470024e-02 +261 247 -1.315380302376548e-02 +261 248 -1.585023865775526e-02 +261 249 -1.939104886145113e-02 +261 250 -2.415034675252892e-02 +261 251 -3.072751892616542e-02 +261 252 -4.012781031912999e-02 +261 253 -5.413421453123184e-02 +261 254 -7.613960933881139e-02 +261 255 -1.132183869282760e-01 +261 256 -1.820810586422653e-01 +261 257 -3.301555353436748e-01 +261 258 -7.412185823610125e-01 +261 259 -3.165206906282869e+00 +261 260 -1.502055215859223e+01 +261 262 -1.502055215860531e+01 +261 263 -3.165206906282875e+00 +261 264 -7.412185823610228e-01 +261 265 -3.301555353436761e-01 +261 266 -1.820810586422657e-01 +261 267 -1.132183869282767e-01 +261 268 -7.613960933881180e-02 +261 269 -5.413421453123188e-02 +261 270 -4.012781031912987e-02 +261 271 -3.072751892616551e-02 +261 272 -2.415034675252902e-02 +261 273 -1.939104886145115e-02 +261 274 -1.585023865775523e-02 +261 275 -1.315380302376548e-02 +261 276 -1.105916272470024e-02 +261 277 -9.403863770832851e-03 +261 278 -8.076052134892627e-03 +261 279 -6.996835383339704e-03 +261 280 -6.109381318875774e-03 +261 281 -5.371977266379807e-03 +261 282 -4.753493624956895e-03 +261 283 -4.230349322908531e-03 +261 284 -3.784439171232928e-03 +261 285 -3.401691470521404e-03 +261 286 -3.071047067257402e-03 +261 287 -2.783725492315680e-03 +262 262 3.988394278128563e+01 +262 240 -4.230349322908524e-03 +262 241 -4.753493624956887e-03 +262 242 -5.371977266379796e-03 +262 243 -6.109381318875737e-03 +262 244 -6.996835383339651e-03 +262 245 -8.076052134892578e-03 +262 246 -9.403863770832806e-03 +262 247 -1.105916272470025e-02 +262 248 -1.315380302376544e-02 +262 249 -1.585023865775525e-02 +262 250 -1.939104886145104e-02 +262 251 -2.415034675252890e-02 +262 252 -3.072751892616538e-02 +262 253 -4.012781031912993e-02 +262 254 -5.413421453123143e-02 +262 255 -7.613960933881141e-02 +262 256 -1.132183869282766e-01 +262 257 -1.820810586422654e-01 +262 258 -3.301555353436747e-01 +262 259 -7.412185823610217e-01 +262 260 -3.165206906282871e+00 +262 261 -1.502055215860531e+01 +262 263 -1.502055215840048e+01 +262 264 -3.165206906282865e+00 +262 265 -7.412185823610099e-01 +262 266 -3.301555353436743e-01 +262 267 -1.820810586422641e-01 +262 268 -1.132183869282767e-01 +262 269 -7.613960933881191e-02 +262 270 -5.413421453123173e-02 +262 271 -4.012781031913016e-02 +262 272 -3.072751892616558e-02 +262 273 -2.415034675252907e-02 +262 274 -1.939104886145111e-02 +262 275 -1.585023865775531e-02 +262 276 -1.315380302376546e-02 +262 277 -1.105916272470029e-02 +262 278 -9.403863770832858e-03 +262 279 -8.076052134892620e-03 +262 280 -6.996835383339703e-03 +262 281 -6.109381318875751e-03 +262 282 -5.371977266379805e-03 +262 283 -4.753493624956895e-03 +262 284 -4.230349322908532e-03 +262 285 -3.784439171232939e-03 +262 286 -3.401691470521405e-03 +262 287 -3.071047067257402e-03 +263 263 3.988394278105614e+01 +263 240 -3.784439171232927e-03 +263 241 -4.230349322908531e-03 +263 242 -4.753493624956895e-03 +263 243 -5.371977266379806e-03 +263 244 -6.109381318875742e-03 +263 245 -6.996835383339667e-03 +263 246 -8.076052134892604e-03 +263 247 -9.403863770832853e-03 +263 248 -1.105916272470027e-02 +263 249 -1.315380302376550e-02 +263 250 -1.585023865775526e-02 +263 251 -1.939104886145113e-02 +263 252 -2.415034675252903e-02 +263 253 -3.072751892616556e-02 +263 254 -4.012781031912998e-02 +263 255 -5.413421453123183e-02 +263 256 -7.613960933881184e-02 +263 257 -1.132183869282765e-01 +263 258 -1.820810586422653e-01 +263 259 -3.301555353436783e-01 +263 260 -7.412185823610288e-01 +263 261 -3.165206906282875e+00 +263 262 -1.502055215840048e+01 +263 264 -1.502055215835489e+01 +263 265 -3.165206906282857e+00 +263 266 -7.412185823610165e-01 +263 267 -3.301555353436726e-01 +263 268 -1.820810586422646e-01 +263 269 -1.132183869282762e-01 +263 270 -7.613960933881134e-02 +263 271 -5.413421453123170e-02 +263 272 -4.012781031912997e-02 +263 273 -3.072751892616544e-02 +263 274 -2.415034675252887e-02 +263 275 -1.939104886145110e-02 +263 276 -1.585023865775520e-02 +263 277 -1.315380302376546e-02 +263 278 -1.105916272470025e-02 +263 279 -9.403863770832816e-03 +263 280 -8.076052134892609e-03 +263 281 -6.996835383339659e-03 +263 282 -6.109381318875736e-03 +263 283 -5.371977266379795e-03 +263 284 -4.753493624956888e-03 +263 285 -4.230349322908538e-03 +263 286 -3.784439171232934e-03 +263 287 -3.401691470521399e-03 +264 264 3.988394278102302e+01 +264 240 -3.401691470521399e-03 +264 241 -3.784439171232933e-03 +264 242 -4.230349322908540e-03 +264 243 -4.753493624956905e-03 +264 244 -5.371977266379811e-03 +264 245 -6.109381318875756e-03 +264 246 -6.996835383339695e-03 +264 247 -8.076052134892615e-03 +264 248 -9.403863770832846e-03 +264 249 -1.105916272470028e-02 +264 250 -1.315380302376547e-02 +264 251 -1.585023865775528e-02 +264 252 -1.939104886145116e-02 +264 253 -2.415034675252906e-02 +264 254 -3.072751892616546e-02 +264 255 -4.012781031913004e-02 +264 256 -5.413421453123183e-02 +264 257 -7.613960933881168e-02 +264 258 -1.132183869282764e-01 +264 259 -1.820810586422654e-01 +264 260 -3.301555353436793e-01 +264 261 -7.412185823610228e-01 +264 262 -3.165206906282865e+00 +264 263 -1.502055215835489e+01 +264 265 -1.502055215836222e+01 +264 266 -3.165206906282862e+00 +264 267 -7.412185823610105e-01 +264 268 -3.301555353436746e-01 +264 269 -1.820810586422657e-01 +264 270 -1.132183869282765e-01 +264 271 -7.613960933881155e-02 +264 272 -5.413421453123172e-02 +264 273 -4.012781031912996e-02 +264 274 -3.072751892616530e-02 +264 275 -2.415034675252895e-02 +264 276 -1.939104886145103e-02 +264 277 -1.585023865775525e-02 +264 278 -1.315380302376546e-02 +264 279 -1.105916272470022e-02 +264 280 -9.403863770832825e-03 +264 281 -8.076052134892570e-03 +264 282 -6.996835383339644e-03 +264 283 -6.109381318875723e-03 +264 284 -5.371977266379785e-03 +264 285 -4.753493624956895e-03 +264 286 -4.230349322908531e-03 +264 287 -3.784439171232927e-03 +265 265 3.988394278106472e+01 +265 240 -3.071047067257397e-03 +265 241 -3.401691470521399e-03 +265 242 -3.784439171232933e-03 +265 243 -4.230349322908540e-03 +265 244 -4.753493624956901e-03 +265 245 -5.371977266379812e-03 +265 246 -6.109381318875767e-03 +265 247 -6.996835383339690e-03 +265 248 -8.076052134892611e-03 +265 249 -9.403863770832851e-03 +265 250 -1.105916272470026e-02 +265 251 -1.315380302376548e-02 +265 252 -1.585023865775529e-02 +265 253 -1.939104886145117e-02 +265 254 -2.415034675252897e-02 +265 255 -3.072751892616549e-02 +265 256 -4.012781031913003e-02 +265 257 -5.413421453123188e-02 +265 258 -7.613960933881192e-02 +265 259 -1.132183869282764e-01 +265 260 -1.820810586422658e-01 +265 261 -3.301555353436761e-01 +265 262 -7.412185823610099e-01 +265 263 -3.165206906282857e+00 +265 264 -1.502055215836222e+01 +265 266 -1.502055215839541e+01 +265 267 -3.165206906282855e+00 +265 268 -7.412185823610175e-01 +265 269 -3.301555353436783e-01 +265 270 -1.820810586422665e-01 +265 271 -1.132183869282764e-01 +265 272 -7.613960933881159e-02 +265 273 -5.413421453123172e-02 +265 274 -4.012781031912977e-02 +265 275 -3.072751892616544e-02 +265 276 -2.415034675252887e-02 +265 277 -1.939104886145111e-02 +265 278 -1.585023865775526e-02 +265 279 -1.315380302376542e-02 +265 280 -1.105916272470025e-02 +265 281 -9.403863770832816e-03 +265 282 -8.076052134892568e-03 +265 283 -6.996835383339644e-03 +265 284 -6.109381318875726e-03 +265 285 -5.371977266379805e-03 +265 286 -4.753493624956896e-03 +265 287 -4.230349322908531e-03 +266 266 3.988394278115152e+01 +266 240 -2.783725492315676e-03 +266 241 -3.071047067257397e-03 +266 242 -3.401691470521398e-03 +266 243 -3.784439171232933e-03 +266 244 -4.230349322908536e-03 +266 245 -4.753493624956900e-03 +266 246 -5.371977266379819e-03 +266 247 -6.109381318875761e-03 +266 248 -6.996835383339688e-03 +266 249 -8.076052134892608e-03 +266 250 -9.403863770832813e-03 +266 251 -1.105916272470023e-02 +266 252 -1.315380302376545e-02 +266 253 -1.585023865775525e-02 +266 254 -1.939104886145104e-02 +266 255 -2.415034675252890e-02 +266 256 -3.072751892616535e-02 +266 257 -4.012781031912987e-02 +266 258 -5.413421453123173e-02 +266 259 -7.613960933881123e-02 +266 260 -1.132183869282762e-01 +266 261 -1.820810586422657e-01 +266 262 -3.301555353436743e-01 +266 263 -7.412185823610165e-01 +266 264 -3.165206906282862e+00 +266 265 -1.502055215839541e+01 +266 267 -1.502055215844906e+01 +266 268 -3.165206906282870e+00 +266 269 -7.412185823610252e-01 +266 270 -3.301555353436795e-01 +266 271 -1.820810586422656e-01 +266 272 -1.132183869282764e-01 +266 273 -7.613960933881200e-02 +266 274 -5.413421453123171e-02 +266 275 -4.012781031913015e-02 +266 276 -3.072751892616544e-02 +266 277 -2.415034675252906e-02 +266 278 -1.939104886145118e-02 +266 279 -1.585023865775526e-02 +266 280 -1.315380302376550e-02 +266 281 -1.105916272470029e-02 +266 282 -9.403863770832830e-03 +266 283 -8.076052134892575e-03 +266 284 -6.996835383339646e-03 +266 285 -6.109381318875749e-03 +266 286 -5.371977266379807e-03 +266 287 -4.753493624956896e-03 +267 267 3.988394278128112e+01 +267 240 -2.532689975072677e-03 +267 241 -2.783725492315669e-03 +267 242 -3.071047067257389e-03 +267 243 -3.401691470521388e-03 +267 244 -3.784439171232919e-03 +267 245 -4.230349322908522e-03 +267 246 -4.753493624956892e-03 +267 247 -5.371977266379797e-03 +267 248 -6.109381318875739e-03 +267 249 -6.996835383339660e-03 +267 250 -8.076052134892580e-03 +267 251 -9.403863770832832e-03 +267 252 -1.105916272470027e-02 +267 253 -1.315380302376550e-02 +267 254 -1.585023865775526e-02 +267 255 -1.939104886145113e-02 +267 256 -2.415034675252900e-02 +267 257 -3.072751892616551e-02 +267 258 -4.012781031913016e-02 +267 259 -5.413421453123170e-02 +267 260 -7.613960933881166e-02 +267 261 -1.132183869282767e-01 +267 262 -1.820810586422641e-01 +267 263 -3.301555353436726e-01 +267 264 -7.412185823610105e-01 +267 265 -3.165206906282855e+00 +267 266 -1.502055215844906e+01 +267 268 -1.502055215852576e+01 +267 269 -3.165206906282878e+00 +267 270 -7.412185823610284e-01 +267 271 -3.301555353436788e-01 +267 272 -1.820810586422645e-01 +267 273 -1.132183869282765e-01 +267 274 -7.613960933881123e-02 +267 275 -5.413421453123170e-02 +267 276 -4.012781031912976e-02 +267 277 -3.072751892616543e-02 +267 278 -2.415034675252897e-02 +267 279 -1.939104886145104e-02 +267 280 -1.585023865775526e-02 +267 281 -1.315380302376546e-02 +267 282 -1.105916272470024e-02 +267 283 -9.403863770832825e-03 +267 284 -8.076052134892589e-03 +267 285 -6.996835383339701e-03 +267 286 -6.109381318875772e-03 +267 287 -5.371977266379824e-03 +268 268 3.988394278146371e+01 +268 240 -2.312252367280532e-03 +268 241 -2.532689975072676e-03 +268 242 -2.783725492315668e-03 +268 243 -3.071047067257388e-03 +268 244 -3.401691470521385e-03 +268 245 -3.784439171232918e-03 +268 246 -4.230349322908527e-03 +268 247 -4.753493624956887e-03 +268 248 -5.371977266379796e-03 +268 249 -6.109381318875737e-03 +268 250 -6.996835383339658e-03 +268 251 -8.076052134892582e-03 +268 252 -9.403863770832835e-03 +268 253 -1.105916272470028e-02 +268 254 -1.315380302376547e-02 +268 255 -1.585023865775528e-02 +268 256 -1.939104886145114e-02 +268 257 -2.415034675252902e-02 +268 258 -3.072751892616558e-02 +268 259 -4.012781031912997e-02 +268 260 -5.413421453123172e-02 +268 261 -7.613960933881180e-02 +268 262 -1.132183869282767e-01 +268 263 -1.820810586422646e-01 +268 264 -3.301555353436746e-01 +268 265 -7.412185823610175e-01 +268 266 -3.165206906282870e+00 +268 267 -1.502055215852576e+01 +268 269 -1.502055215863300e+01 +268 270 -3.165206906282867e+00 +268 271 -7.412185823610171e-01 +268 272 -3.301555353436744e-01 +268 273 -1.820810586422654e-01 +268 274 -1.132183869282761e-01 +268 275 -7.613960933881164e-02 +268 276 -5.413421453123140e-02 +268 277 -4.012781031912995e-02 +268 278 -3.072751892616543e-02 +268 279 -2.415034675252887e-02 +268 280 -1.939104886145110e-02 +268 281 -1.585023865775526e-02 +268 282 -1.315380302376544e-02 +268 283 -1.105916272470025e-02 +268 284 -9.403863770832809e-03 +268 285 -8.076052134892620e-03 +268 286 -6.996835383339704e-03 +268 287 -6.109381318875774e-03 +269 269 3.988394278171950e+01 +269 240 -2.117777896667791e-03 +269 241 -2.312252367280532e-03 +269 242 -2.532689975072676e-03 +269 243 -2.783725492315668e-03 +269 244 -3.071047067257386e-03 +269 245 -3.401691470521385e-03 +269 246 -3.784439171232923e-03 +269 247 -4.230349322908524e-03 +269 248 -4.753493624956887e-03 +269 249 -5.371977266379796e-03 +269 250 -6.109381318875737e-03 +269 251 -6.996835383339651e-03 +269 252 -8.076052134892580e-03 +269 253 -9.403863770832847e-03 +269 254 -1.105916272470026e-02 +269 255 -1.315380302376548e-02 +269 256 -1.585023865775528e-02 +269 257 -1.939104886145115e-02 +269 258 -2.415034675252907e-02 +269 259 -3.072751892616544e-02 +269 260 -4.012781031912996e-02 +269 261 -5.413421453123188e-02 +269 262 -7.613960933881191e-02 +269 263 -1.132183869282762e-01 +269 264 -1.820810586422657e-01 +269 265 -3.301555353436783e-01 +269 266 -7.412185823610252e-01 +269 267 -3.165206906282878e+00 +269 268 -1.502055215863300e+01 +269 270 -1.502055215878374e+01 +269 271 -3.165206906282849e+00 +269 272 -7.412185823610078e-01 +269 273 -3.301555353436751e-01 +269 274 -1.820810586422656e-01 +269 275 -1.132183869282767e-01 +269 276 -7.613960933881123e-02 +269 277 -5.413421453123171e-02 +269 278 -4.012781031912997e-02 +269 279 -3.072751892616531e-02 +269 280 -2.415034675252897e-02 +269 281 -1.939104886145111e-02 +269 282 -1.585023865775523e-02 +269 283 -1.315380302376546e-02 +269 284 -1.105916272470022e-02 +269 285 -9.403863770832837e-03 +269 286 -8.076052134892622e-03 +269 287 -6.996835383339704e-03 +270 270 3.988394278208165e+01 +270 240 -1.945462087124853e-03 +270 241 -2.117777896667794e-03 +270 242 -2.312252367280535e-03 +270 243 -2.532689975072680e-03 +270 244 -2.783725492315670e-03 +270 245 -3.071047067257390e-03 +270 246 -3.401691470521395e-03 +270 247 -3.784439171232927e-03 +270 248 -4.230349322908531e-03 +270 249 -4.753493624956895e-03 +270 250 -5.371977266379806e-03 +270 251 -6.109381318875742e-03 +270 252 -6.996835383339667e-03 +270 253 -8.076052134892606e-03 +270 254 -9.403863770832813e-03 +270 255 -1.105916272470023e-02 +270 256 -1.315380302376544e-02 +270 257 -1.585023865775523e-02 +270 258 -1.939104886145111e-02 +270 259 -2.415034675252887e-02 +270 260 -3.072751892616530e-02 +270 261 -4.012781031912987e-02 +270 262 -5.413421453123173e-02 +270 263 -7.613960933881134e-02 +270 264 -1.132183869282765e-01 +270 265 -1.820810586422665e-01 +270 266 -3.301555353436795e-01 +270 267 -7.412185823610284e-01 +270 268 -3.165206906282867e+00 +270 269 -1.502055215878374e+01 +270 271 -1.502055215899858e+01 +270 272 -3.165206906282846e+00 +270 273 -7.412185823610186e-01 +270 274 -3.301555353436770e-01 +270 275 -1.820810586422646e-01 +270 276 -1.132183869282762e-01 +270 277 -7.613960933881191e-02 +270 278 -5.413421453123202e-02 +270 279 -4.012781031912996e-02 +270 280 -3.072751892616557e-02 +270 281 -2.415034675252907e-02 +270 282 -1.939104886145114e-02 +270 283 -1.585023865775530e-02 +270 284 -1.315380302376546e-02 +270 285 -1.105916272470029e-02 +270 286 -9.403863770832858e-03 +270 287 -8.076052134892611e-03 +271 271 3.988394278260303e+01 +271 240 -1.792160480940041e-03 +271 241 -1.945462087124856e-03 +271 242 -2.117777896667797e-03 +271 243 -2.312252367280539e-03 +271 244 -2.532689975072682e-03 +271 245 -2.783725492315674e-03 +271 246 -3.071047067257399e-03 +271 247 -3.401691470521399e-03 +271 248 -3.784439171232933e-03 +271 249 -4.230349322908540e-03 +271 250 -4.753493624956905e-03 +271 251 -5.371977266379811e-03 +271 252 -6.109381318875756e-03 +271 253 -6.996835383339695e-03 +271 254 -8.076052134892608e-03 +271 255 -9.403863770832842e-03 +271 256 -1.105916272470026e-02 +271 257 -1.315380302376548e-02 +271 258 -1.585023865775531e-02 +271 259 -1.939104886145111e-02 +271 260 -2.415034675252896e-02 +271 261 -3.072751892616551e-02 +271 262 -4.012781031913016e-02 +271 263 -5.413421453123170e-02 +271 264 -7.613960933881155e-02 +271 265 -1.132183869282764e-01 +271 266 -1.820810586422656e-01 +271 267 -3.301555353436788e-01 +271 268 -7.412185823610171e-01 +271 269 -3.165206906282849e+00 +271 270 -1.502055215899858e+01 +271 272 -1.502055215931066e+01 +271 273 -3.165206906282883e+00 +271 274 -7.412185823610268e-01 +271 275 -3.301555353436767e-01 +271 276 -1.820810586422662e-01 +271 277 -1.132183869282762e-01 +271 278 -7.613960933881167e-02 +271 279 -5.413421453123141e-02 +271 280 -4.012781031912995e-02 +271 281 -3.072751892616544e-02 +271 282 -2.415034675252892e-02 +271 283 -1.939104886145110e-02 +271 284 -1.585023865775520e-02 +271 285 -1.315380302376546e-02 +271 286 -1.105916272470025e-02 +271 287 -9.403863770832806e-03 +272 272 3.988394278260302e+01 +272 256 -9.403863770832839e-03 +272 257 -1.105916272470027e-02 +272 258 -1.315380302376551e-02 +272 259 -1.585023865775526e-02 +272 260 -1.939104886145111e-02 +272 261 -2.415034675252902e-02 +272 262 -3.072751892616558e-02 +272 263 -4.012781031912997e-02 +272 264 -5.413421453123172e-02 +272 265 -7.613960933881159e-02 +272 266 -1.132183869282764e-01 +272 267 -1.820810586422645e-01 +272 268 -3.301555353436744e-01 +272 269 -7.412185823610078e-01 +272 270 -3.165206906282846e+00 +272 271 -1.502055215931066e+01 +272 273 -1.502055215899860e+01 +272 274 -3.165206906282878e+00 +272 275 -7.412185823610236e-01 +272 276 -3.301555353436784e-01 +272 277 -1.820810586422659e-01 +272 278 -1.132183869282770e-01 +272 279 -7.613960933881131e-02 +272 280 -5.413421453123170e-02 +272 281 -4.012781031912996e-02 +272 282 -3.072751892616537e-02 +272 283 -2.415034675252895e-02 +272 284 -1.939104886145103e-02 +272 285 -1.585023865775525e-02 +272 286 -1.315380302376546e-02 +272 287 -1.105916272470022e-02 +272 288 -9.403863770832825e-03 +272 289 -8.076052134892564e-03 +272 290 -6.996835383339671e-03 +272 291 -6.109381318875725e-03 +272 292 -5.371977266379785e-03 +272 293 -4.753493624956893e-03 +272 294 -4.230349322908518e-03 +272 295 -3.784439171232926e-03 +272 296 -3.401691470521384e-03 +272 297 -3.071047067257392e-03 +272 298 -2.783725492315665e-03 +272 299 -2.532689975072673e-03 +272 300 -2.312252367280535e-03 +272 301 -2.117777896667789e-03 +272 302 -1.945462087124852e-03 +272 303 -1.792160480940034e-03 +273 273 3.988394278208170e+01 +273 256 -8.076052134892601e-03 +273 257 -9.403863770832840e-03 +273 258 -1.105916272470029e-02 +273 259 -1.315380302376546e-02 +273 260 -1.585023865775526e-02 +273 261 -1.939104886145115e-02 +273 262 -2.415034675252907e-02 +273 263 -3.072751892616544e-02 +273 264 -4.012781031912996e-02 +273 265 -5.413421453123172e-02 +273 266 -7.613960933881200e-02 +273 267 -1.132183869282765e-01 +273 268 -1.820810586422654e-01 +273 269 -3.301555353436751e-01 +273 270 -7.412185823610186e-01 +273 271 -3.165206906282883e+00 +273 272 -1.502055215899860e+01 +273 274 -1.502055215878374e+01 +273 275 -3.165206906282870e+00 +273 276 -7.412185823610179e-01 +273 277 -3.301555353436758e-01 +273 278 -1.820810586422646e-01 +273 279 -1.132183869282761e-01 +273 280 -7.613960933881167e-02 +273 281 -5.413421453123173e-02 +273 282 -4.012781031912987e-02 +273 283 -3.072751892616544e-02 +273 284 -2.415034675252887e-02 +273 285 -1.939104886145111e-02 +273 286 -1.585023865775526e-02 +273 287 -1.315380302376542e-02 +273 288 -1.105916272470025e-02 +273 289 -9.403863770832797e-03 +273 290 -8.076052134892592e-03 +273 291 -6.996835383339646e-03 +273 292 -6.109381318875727e-03 +273 293 -5.371977266379805e-03 +273 294 -4.753493624956881e-03 +273 295 -4.230349322908531e-03 +273 296 -3.784439171232916e-03 +273 297 -3.401691470521393e-03 +273 298 -3.071047067257384e-03 +273 299 -2.783725492315665e-03 +273 300 -2.532689975072679e-03 +273 301 -2.312252367280531e-03 +273 302 -2.117777896667793e-03 +273 303 -1.945462087124849e-03 +274 274 3.988394278171952e+01 +274 256 -6.996835383339652e-03 +274 257 -8.076052134892570e-03 +274 258 -9.403863770832818e-03 +274 259 -1.105916272470022e-02 +274 260 -1.315380302376542e-02 +274 261 -1.585023865775523e-02 +274 262 -1.939104886145111e-02 +274 263 -2.415034675252887e-02 +274 264 -3.072751892616530e-02 +274 265 -4.012781031912977e-02 +274 266 -5.413421453123171e-02 +274 267 -7.613960933881123e-02 +274 268 -1.132183869282761e-01 +274 269 -1.820810586422656e-01 +274 270 -3.301555353436770e-01 +274 271 -7.412185823610268e-01 +274 272 -3.165206906282878e+00 +274 273 -1.502055215878374e+01 +274 275 -1.502055215863300e+01 +274 276 -3.165206906282853e+00 +274 277 -7.412185823610119e-01 +274 278 -3.301555353436775e-01 +274 279 -1.820810586422656e-01 +274 280 -1.132183869282768e-01 +274 281 -7.613960933881191e-02 +274 282 -5.413421453123188e-02 +274 283 -4.012781031913015e-02 +274 284 -3.072751892616544e-02 +274 285 -2.415034675252906e-02 +274 286 -1.939104886145118e-02 +274 287 -1.585023865775526e-02 +274 288 -1.315380302376550e-02 +274 289 -1.105916272470025e-02 +274 290 -9.403863770832854e-03 +274 291 -8.076052134892599e-03 +274 292 -6.996835383339674e-03 +274 293 -6.109381318875770e-03 +274 294 -5.371977266379806e-03 +274 295 -4.753493624956909e-03 +274 296 -4.230349322908533e-03 +274 297 -3.784439171232938e-03 +274 298 -3.401691470521394e-03 +274 299 -3.071047067257393e-03 +274 300 -2.783725492315679e-03 +274 301 -2.532689975072680e-03 +274 302 -2.312252367280541e-03 +274 303 -2.117777896667794e-03 +275 275 3.988394278146369e+01 +275 256 -6.109381318875730e-03 +275 257 -6.996835383339644e-03 +275 258 -8.076052134892573e-03 +275 259 -9.403863770832814e-03 +275 260 -1.105916272470025e-02 +275 261 -1.315380302376548e-02 +275 262 -1.585023865775531e-02 +275 263 -1.939104886145110e-02 +275 264 -2.415034675252895e-02 +275 265 -3.072751892616544e-02 +275 266 -4.012781031913015e-02 +275 267 -5.413421453123170e-02 +275 268 -7.613960933881164e-02 +275 269 -1.132183869282767e-01 +275 270 -1.820810586422646e-01 +275 271 -3.301555353436767e-01 +275 272 -7.412185823610236e-01 +275 273 -3.165206906282870e+00 +275 274 -1.502055215863300e+01 +275 276 -1.502055215852574e+01 +275 277 -3.165206906282855e+00 +275 278 -7.412185823610183e-01 +275 279 -3.301555353436748e-01 +275 280 -1.820810586422654e-01 +275 281 -1.132183869282762e-01 +275 282 -7.613960933881135e-02 +275 283 -5.413421453123172e-02 +275 284 -4.012781031912977e-02 +275 285 -3.072751892616544e-02 +275 286 -2.415034675252897e-02 +275 287 -1.939104886145104e-02 +275 288 -1.585023865775526e-02 +275 289 -1.315380302376542e-02 +275 290 -1.105916272470025e-02 +275 291 -9.403863770832828e-03 +275 292 -8.076052134892590e-03 +275 293 -6.996835383339701e-03 +275 294 -6.109381318875753e-03 +275 295 -5.371977266379824e-03 +275 296 -4.753493624956898e-03 +275 297 -4.230349322908545e-03 +275 298 -3.784439171232928e-03 +275 299 -3.401691470521394e-03 +275 300 -3.071047067257401e-03 +275 301 -2.783725492315673e-03 +275 302 -2.532689975072686e-03 +275 303 -2.312252367280537e-03 +276 276 3.988394278128109e+01 +276 256 -5.371977266379790e-03 +276 257 -6.109381318875723e-03 +276 258 -6.996835383339644e-03 +276 259 -8.076052134892563e-03 +276 260 -9.403863770832806e-03 +276 261 -1.105916272470024e-02 +276 262 -1.315380302376546e-02 +276 263 -1.585023865775520e-02 +276 264 -1.939104886145103e-02 +276 265 -2.415034675252887e-02 +276 266 -3.072751892616544e-02 +276 267 -4.012781031912976e-02 +276 268 -5.413421453123140e-02 +276 269 -7.613960933881123e-02 +276 270 -1.132183869282762e-01 +276 271 -1.820810586422662e-01 +276 272 -3.301555353436784e-01 +276 273 -7.412185823610179e-01 +276 274 -3.165206906282853e+00 +276 275 -1.502055215852574e+01 +276 277 -1.502055215844907e+01 +276 278 -3.165206906282869e+00 +276 279 -7.412185823610168e-01 +276 280 -3.301555353436751e-01 +276 281 -1.820810586422656e-01 +276 282 -1.132183869282764e-01 +276 283 -7.613960933881200e-02 +276 284 -5.413421453123171e-02 +276 285 -4.012781031913015e-02 +276 286 -3.072751892616557e-02 +276 287 -2.415034675252896e-02 +276 288 -1.939104886145117e-02 +276 289 -1.585023865775526e-02 +276 290 -1.315380302376550e-02 +276 291 -1.105916272470029e-02 +276 292 -9.403863770832830e-03 +276 293 -8.076052134892623e-03 +276 294 -6.996835383339677e-03 +276 295 -6.109381318875772e-03 +276 296 -5.371977266379808e-03 +276 297 -4.753493624956910e-03 +276 298 -4.230349322908533e-03 +276 299 -3.784439171232928e-03 +276 300 -3.401691470521403e-03 +276 301 -3.071047067257394e-03 +276 302 -2.783725492315679e-03 +276 303 -2.532689975072681e-03 +277 277 3.988394278115151e+01 +277 256 -4.753493624956890e-03 +277 257 -5.371977266379795e-03 +277 258 -6.109381318875736e-03 +277 259 -6.996835383339660e-03 +277 260 -8.076052134892609e-03 +277 261 -9.403863770832851e-03 +277 262 -1.105916272470029e-02 +277 263 -1.315380302376546e-02 +277 264 -1.585023865775525e-02 +277 265 -1.939104886145111e-02 +277 266 -2.415034675252906e-02 +277 267 -3.072751892616543e-02 +277 268 -4.012781031912995e-02 +277 269 -5.413421453123171e-02 +277 270 -7.613960933881191e-02 +277 271 -1.132183869282762e-01 +277 272 -1.820810586422659e-01 +277 273 -3.301555353436758e-01 +277 274 -7.412185823610119e-01 +277 275 -3.165206906282855e+00 +277 276 -1.502055215844907e+01 +277 278 -1.502055215839542e+01 +277 279 -3.165206906282874e+00 +277 280 -7.412185823610229e-01 +277 281 -3.301555353436783e-01 +277 282 -1.820810586422656e-01 +277 283 -1.132183869282770e-01 +277 284 -7.613960933881132e-02 +277 285 -5.413421453123170e-02 +277 286 -4.012781031912996e-02 +277 287 -3.072751892616530e-02 +277 288 -2.415034675252896e-02 +277 289 -1.939104886145104e-02 +277 290 -1.585023865775526e-02 +277 291 -1.315380302376546e-02 +277 292 -1.105916272470022e-02 +277 293 -9.403863770832835e-03 +277 294 -8.076052134892587e-03 +277 295 -6.996835383339685e-03 +277 296 -6.109381318875740e-03 +277 297 -5.371977266379813e-03 +277 298 -4.753493624956888e-03 +277 299 -4.230349322908524e-03 +277 300 -3.784439171232932e-03 +277 301 -3.401691470521389e-03 +277 302 -3.071047067257396e-03 +277 303 -2.783725492315669e-03 +278 278 3.988394278106478e+01 +278 256 -4.230349322908535e-03 +278 257 -4.753493624956896e-03 +278 258 -5.371977266379805e-03 +278 259 -6.109381318875751e-03 +278 260 -6.996835383339703e-03 +278 261 -8.076052134892627e-03 +278 262 -9.403863770832858e-03 +278 263 -1.105916272470025e-02 +278 264 -1.315380302376546e-02 +278 265 -1.585023865775526e-02 +278 266 -1.939104886145118e-02 +278 267 -2.415034675252897e-02 +278 268 -3.072751892616543e-02 +278 269 -4.012781031912997e-02 +278 270 -5.413421453123202e-02 +278 271 -7.613960933881167e-02 +278 272 -1.132183869282770e-01 +278 273 -1.820810586422646e-01 +278 274 -3.301555353436775e-01 +278 275 -7.412185823610183e-01 +278 276 -3.165206906282869e+00 +278 277 -1.502055215839542e+01 +278 279 -1.502055215836221e+01 +278 280 -3.165206906282885e+00 +278 281 -7.412185823610261e-01 +278 282 -3.301555353436778e-01 +278 283 -1.820810586422653e-01 +278 284 -1.132183869282761e-01 +278 285 -7.613960933881167e-02 +278 286 -5.413421453123172e-02 +278 287 -4.012781031912977e-02 +278 288 -3.072751892616544e-02 +278 289 -2.415034675252887e-02 +278 290 -1.939104886145111e-02 +278 291 -1.585023865775526e-02 +278 292 -1.315380302376542e-02 +278 293 -1.105916272470025e-02 +278 294 -9.403863770832818e-03 +278 295 -8.076052134892585e-03 +278 296 -6.996835383339646e-03 +278 297 -6.109381318875746e-03 +278 298 -5.371977266379786e-03 +278 299 -4.753493624956879e-03 +278 300 -4.230349322908529e-03 +278 301 -3.784439171232916e-03 +278 302 -3.401691470521392e-03 +278 303 -3.071047067257384e-03 +279 279 3.988394278102304e+01 +279 256 -3.784439171232930e-03 +279 257 -4.230349322908531e-03 +279 258 -4.753493624956896e-03 +279 259 -5.371977266379807e-03 +279 260 -6.109381318875772e-03 +279 261 -6.996835383339704e-03 +279 262 -8.076052134892620e-03 +279 263 -9.403863770832816e-03 +279 264 -1.105916272470022e-02 +279 265 -1.315380302376542e-02 +279 266 -1.585023865775526e-02 +279 267 -1.939104886145104e-02 +279 268 -2.415034675252887e-02 +279 269 -3.072751892616531e-02 +279 270 -4.012781031912996e-02 +279 271 -5.413421453123141e-02 +279 272 -7.613960933881131e-02 +279 273 -1.132183869282761e-01 +279 274 -1.820810586422656e-01 +279 275 -3.301555353436748e-01 +279 276 -7.412185823610168e-01 +279 277 -3.165206906282874e+00 +279 278 -1.502055215836221e+01 +279 280 -1.502055215835492e+01 +279 281 -3.165206906282856e+00 +279 282 -7.412185823610136e-01 +279 283 -3.301555353436761e-01 +279 284 -1.820810586422659e-01 +279 285 -1.132183869282768e-01 +279 286 -7.613960933881189e-02 +279 287 -5.413421453123171e-02 +279 288 -4.012781031913015e-02 +279 289 -3.072751892616544e-02 +279 290 -2.415034675252906e-02 +279 291 -1.939104886145118e-02 +279 292 -1.585023865775526e-02 +279 293 -1.315380302376550e-02 +279 294 -1.105916272470029e-02 +279 295 -9.403863770832827e-03 +279 296 -8.076052134892577e-03 +279 297 -6.996835383339671e-03 +279 298 -6.109381318875725e-03 +279 299 -5.371977266379785e-03 +279 300 -4.753493624956893e-03 +279 301 -4.230349322908518e-03 +279 302 -3.784439171232926e-03 +279 303 -3.401691470521384e-03 +280 280 3.988394278105613e+01 +280 256 -3.401691470521395e-03 +280 257 -3.784439171232926e-03 +280 258 -4.230349322908530e-03 +280 259 -4.753493624956895e-03 +280 260 -5.371977266379824e-03 +280 261 -6.109381318875774e-03 +280 262 -6.996835383339703e-03 +280 263 -8.076052134892609e-03 +280 264 -9.403863770832825e-03 +280 265 -1.105916272470025e-02 +280 266 -1.315380302376550e-02 +280 267 -1.585023865775526e-02 +280 268 -1.939104886145110e-02 +280 269 -2.415034675252897e-02 +280 270 -3.072751892616557e-02 +280 271 -4.012781031912995e-02 +280 272 -5.413421453123170e-02 +280 273 -7.613960933881167e-02 +280 274 -1.132183869282768e-01 +280 275 -1.820810586422654e-01 +280 276 -3.301555353436751e-01 +280 277 -7.412185823610229e-01 +280 278 -3.165206906282885e+00 +280 279 -1.502055215835492e+01 +280 281 -1.502055215840045e+01 +280 282 -3.165206906282844e+00 +280 283 -7.412185823610127e-01 +280 284 -3.301555353436751e-01 +280 285 -1.820810586422646e-01 +280 286 -1.132183869282762e-01 +280 287 -7.613960933881123e-02 +280 288 -5.413421453123170e-02 +280 289 -4.012781031912976e-02 +280 290 -3.072751892616543e-02 +280 291 -2.415034675252897e-02 +280 292 -1.939104886145104e-02 +280 293 -1.585023865775526e-02 +280 294 -1.315380302376546e-02 +280 295 -1.105916272470022e-02 +280 296 -9.403863770832816e-03 +280 297 -8.076052134892587e-03 +280 298 -6.996835383339646e-03 +280 299 -6.109381318875727e-03 +280 300 -5.371977266379805e-03 +280 301 -4.753493624956881e-03 +280 302 -4.230349322908531e-03 +280 303 -3.784439171232916e-03 +281 281 3.988394278128561e+01 +281 256 -3.071047067257386e-03 +281 257 -3.401691470521383e-03 +281 258 -3.784439171232915e-03 +281 259 -4.230349322908519e-03 +281 260 -4.753493624956896e-03 +281 261 -5.371977266379807e-03 +281 262 -6.109381318875751e-03 +281 263 -6.996835383339659e-03 +281 264 -8.076052134892570e-03 +281 265 -9.403863770832816e-03 +281 266 -1.105916272470029e-02 +281 267 -1.315380302376546e-02 +281 268 -1.585023865775526e-02 +281 269 -1.939104886145111e-02 +281 270 -2.415034675252907e-02 +281 271 -3.072751892616544e-02 +281 272 -4.012781031912996e-02 +281 273 -5.413421453123173e-02 +281 274 -7.613960933881191e-02 +281 275 -1.132183869282762e-01 +281 276 -1.820810586422656e-01 +281 277 -3.301555353436783e-01 +281 278 -7.412185823610261e-01 +281 279 -3.165206906282856e+00 +281 280 -1.502055215840045e+01 +281 282 -1.502055215860531e+01 +281 283 -3.165206906282882e+00 +281 284 -7.412185823610222e-01 +281 285 -3.301555353436750e-01 +281 286 -1.820810586422644e-01 +281 287 -1.132183869282762e-01 +281 288 -7.613960933881164e-02 +281 289 -5.413421453123140e-02 +281 290 -4.012781031912995e-02 +281 291 -3.072751892616543e-02 +281 292 -2.415034675252887e-02 +281 293 -1.939104886145110e-02 +281 294 -1.585023865775526e-02 +281 295 -1.315380302376542e-02 +281 296 -1.105916272470025e-02 +281 297 -9.403863770832814e-03 +281 298 -8.076052134892592e-03 +281 299 -6.996835383339674e-03 +281 300 -6.109381318875770e-03 +281 301 -5.371977266379806e-03 +281 302 -4.753493624956909e-03 +281 303 -4.230349322908533e-03 +282 282 3.988394278152494e+01 +282 256 -2.783725492315666e-03 +282 257 -3.071047067257383e-03 +282 258 -3.401691470521382e-03 +282 259 -3.784439171232915e-03 +282 260 -4.230349322908531e-03 +282 261 -4.753493624956895e-03 +282 262 -5.371977266379805e-03 +282 263 -6.109381318875736e-03 +282 264 -6.996835383339644e-03 +282 265 -8.076052134892568e-03 +282 266 -9.403863770832830e-03 +282 267 -1.105916272470024e-02 +282 268 -1.315380302376544e-02 +282 269 -1.585023865775523e-02 +282 270 -1.939104886145114e-02 +282 271 -2.415034675252892e-02 +282 272 -3.072751892616537e-02 +282 273 -4.012781031912987e-02 +282 274 -5.413421453123188e-02 +282 275 -7.613960933881135e-02 +282 276 -1.132183869282764e-01 +282 277 -1.820810586422656e-01 +282 278 -3.301555353436778e-01 +282 279 -7.412185823610136e-01 +282 280 -3.165206906282844e+00 +282 281 -1.502055215860531e+01 +282 283 -1.502055215859223e+01 +282 284 -3.165206906282880e+00 +282 285 -7.412185823610240e-01 +282 286 -3.301555353436747e-01 +282 287 -1.820810586422662e-01 +282 288 -1.132183869282767e-01 +282 289 -7.613960933881131e-02 +282 290 -5.413421453123185e-02 +282 291 -4.012781031913006e-02 +282 292 -3.072751892616537e-02 +282 293 -2.415034675252901e-02 +282 294 -1.939104886145114e-02 +282 295 -1.585023865775523e-02 +282 296 -1.315380302376548e-02 +282 297 -1.105916272470024e-02 +282 298 -9.403863770832840e-03 +282 299 -8.076052134892603e-03 +282 300 -6.996835383339701e-03 +282 301 -6.109381318875753e-03 +282 302 -5.371977266379824e-03 +282 303 -4.753493624956898e-03 +283 283 3.988394278151357e+01 +283 256 -2.532689975072674e-03 +283 257 -2.783725492315664e-03 +283 258 -3.071047067257383e-03 +283 259 -3.401691470521383e-03 +283 260 -3.784439171232926e-03 +283 261 -4.230349322908531e-03 +283 262 -4.753493624956895e-03 +283 263 -5.371977266379795e-03 +283 264 -6.109381318875723e-03 +283 265 -6.996835383339644e-03 +283 266 -8.076052134892575e-03 +283 267 -9.403863770832825e-03 +283 268 -1.105916272470025e-02 +283 269 -1.315380302376546e-02 +283 270 -1.585023865775530e-02 +283 271 -1.939104886145110e-02 +283 272 -2.415034675252895e-02 +283 273 -3.072751892616544e-02 +283 274 -4.012781031913015e-02 +283 275 -5.413421453123172e-02 +283 276 -7.613960933881200e-02 +283 277 -1.132183869282770e-01 +283 278 -1.820810586422653e-01 +283 279 -3.301555353436761e-01 +283 280 -7.412185823610127e-01 +283 281 -3.165206906282882e+00 +283 282 -1.502055215859223e+01 +283 284 -1.502055215859654e+01 +283 285 -3.165206906282863e+00 +283 286 -7.412185823610062e-01 +283 287 -3.301555353436759e-01 +283 288 -1.820810586422654e-01 +283 289 -1.132183869282761e-01 +283 290 -7.613960933881168e-02 +283 291 -5.413421453123173e-02 +283 292 -4.012781031912977e-02 +283 293 -3.072751892616544e-02 +283 294 -2.415034675252897e-02 +283 295 -1.939104886145104e-02 +283 296 -1.585023865775526e-02 +283 297 -1.315380302376542e-02 +283 298 -1.105916272470025e-02 +283 299 -9.403863770832830e-03 +283 300 -8.076052134892613e-03 +283 301 -6.996835383339677e-03 +283 302 -6.109381318875772e-03 +283 303 -5.371977266379808e-03 +284 284 3.988394278151439e+01 +284 256 -2.312252367280531e-03 +284 257 -2.532689975072673e-03 +284 258 -2.783725492315664e-03 +284 259 -3.071047067257384e-03 +284 260 -3.401691470521393e-03 +284 261 -3.784439171232928e-03 +284 262 -4.230349322908532e-03 +284 263 -4.753493624956888e-03 +284 264 -5.371977266379785e-03 +284 265 -6.109381318875726e-03 +284 266 -6.996835383339646e-03 +284 267 -8.076052134892589e-03 +284 268 -9.403863770832809e-03 +284 269 -1.105916272470022e-02 +284 270 -1.315380302376546e-02 +284 271 -1.585023865775520e-02 +284 272 -1.939104886145103e-02 +284 273 -2.415034675252887e-02 +284 274 -3.072751892616544e-02 +284 275 -4.012781031912977e-02 +284 276 -5.413421453123171e-02 +284 277 -7.613960933881132e-02 +284 278 -1.132183869282761e-01 +284 279 -1.820810586422659e-01 +284 280 -3.301555353436751e-01 +284 281 -7.412185823610222e-01 +284 282 -3.165206906282880e+00 +284 283 -1.502055215859654e+01 +284 285 -1.502055215858802e+01 +284 286 -3.165206906282846e+00 +284 287 -7.412185823610148e-01 +284 288 -3.301555353436785e-01 +284 289 -1.820810586422654e-01 +284 290 -1.132183869282768e-01 +284 291 -7.613960933881189e-02 +284 292 -5.413421453123171e-02 +284 293 -4.012781031913015e-02 +284 294 -3.072751892616557e-02 +284 295 -2.415034675252896e-02 +284 296 -1.939104886145117e-02 +284 297 -1.585023865775526e-02 +284 298 -1.315380302376550e-02 +284 299 -1.105916272470029e-02 +284 300 -9.403863770832837e-03 +284 301 -8.076052134892601e-03 +284 302 -6.996835383339699e-03 +284 303 -6.109381318875751e-03 +285 285 3.988394278153930e+01 +285 256 -2.117777896667795e-03 +285 257 -2.312252367280536e-03 +285 258 -2.532689975072679e-03 +285 259 -2.783725492315672e-03 +285 260 -3.071047067257401e-03 +285 261 -3.401691470521404e-03 +285 262 -3.784439171232939e-03 +285 263 -4.230349322908538e-03 +285 264 -4.753493624956895e-03 +285 265 -5.371977266379805e-03 +285 266 -6.109381318875749e-03 +285 267 -6.996835383339701e-03 +285 268 -8.076052134892620e-03 +285 269 -9.403863770832837e-03 +285 270 -1.105916272470029e-02 +285 271 -1.315380302376546e-02 +285 272 -1.585023865775525e-02 +285 273 -1.939104886145111e-02 +285 274 -2.415034675252906e-02 +285 275 -3.072751892616544e-02 +285 276 -4.012781031913015e-02 +285 277 -5.413421453123170e-02 +285 278 -7.613960933881167e-02 +285 279 -1.132183869282768e-01 +285 280 -1.820810586422646e-01 +285 281 -3.301555353436750e-01 +285 282 -7.412185823610240e-01 +285 283 -3.165206906282863e+00 +285 284 -1.502055215858802e+01 +285 286 -1.502055215864000e+01 +285 287 -3.165206906282870e+00 +285 288 -7.412185823610283e-01 +285 289 -3.301555353436786e-01 +285 290 -1.820810586422655e-01 +285 291 -1.132183869282762e-01 +285 292 -7.613960933881123e-02 +285 293 -5.413421453123170e-02 +285 294 -4.012781031912996e-02 +285 295 -3.072751892616530e-02 +285 296 -2.415034675252896e-02 +285 297 -1.939104886145104e-02 +285 298 -1.585023865775526e-02 +285 299 -1.315380302376546e-02 +285 300 -1.105916272470022e-02 +285 301 -9.403863770832818e-03 +285 302 -8.076052134892594e-03 +285 303 -6.996835383339648e-03 +286 286 3.988394278164019e+01 +286 256 -1.945462087124854e-03 +286 257 -2.117777896667794e-03 +286 258 -2.312252367280536e-03 +286 259 -2.532689975072680e-03 +286 260 -2.783725492315680e-03 +286 261 -3.071047067257402e-03 +286 262 -3.401691470521405e-03 +286 263 -3.784439171232934e-03 +286 264 -4.230349322908531e-03 +286 265 -4.753493624956896e-03 +286 266 -5.371977266379807e-03 +286 267 -6.109381318875772e-03 +286 268 -6.996835383339704e-03 +286 269 -8.076052134892622e-03 +286 270 -9.403863770832858e-03 +286 271 -1.105916272470025e-02 +286 272 -1.315380302376546e-02 +286 273 -1.585023865775526e-02 +286 274 -1.939104886145118e-02 +286 275 -2.415034675252897e-02 +286 276 -3.072751892616557e-02 +286 277 -4.012781031912996e-02 +286 278 -5.413421453123172e-02 +286 279 -7.613960933881189e-02 +286 280 -1.132183869282762e-01 +286 281 -1.820810586422644e-01 +286 282 -3.301555353436747e-01 +286 283 -7.412185823610062e-01 +286 284 -3.165206906282846e+00 +286 285 -1.502055215864000e+01 +286 287 -1.502055215866002e+01 +286 288 -3.165206906282877e+00 +286 289 -7.412185823610138e-01 +286 290 -3.301555353436768e-01 +286 291 -1.820810586422658e-01 +286 292 -1.132183869282762e-01 +286 293 -7.613960933881167e-02 +286 294 -5.413421453123172e-02 +286 295 -4.012781031912977e-02 +286 296 -3.072751892616544e-02 +286 297 -2.415034675252887e-02 +286 298 -1.939104886145111e-02 +286 299 -1.585023865775526e-02 +286 300 -1.315380302376542e-02 +286 301 -1.105916272470025e-02 +286 302 -9.403863770832827e-03 +286 303 -8.076052134892566e-03 +287 287 3.988394278169707e+01 +287 256 -1.792160480940039e-03 +287 257 -1.945462087124853e-03 +287 258 -2.117777896667794e-03 +287 259 -2.312252367280537e-03 +287 260 -2.532689975072687e-03 +287 261 -2.783725492315680e-03 +287 262 -3.071047067257402e-03 +287 263 -3.401691470521399e-03 +287 264 -3.784439171232927e-03 +287 265 -4.230349322908531e-03 +287 266 -4.753493624956896e-03 +287 267 -5.371977266379824e-03 +287 268 -6.109381318875774e-03 +287 269 -6.996835383339704e-03 +287 270 -8.076052134892611e-03 +287 271 -9.403863770832806e-03 +287 272 -1.105916272470022e-02 +287 273 -1.315380302376542e-02 +287 274 -1.585023865775526e-02 +287 275 -1.939104886145104e-02 +287 276 -2.415034675252896e-02 +287 277 -3.072751892616530e-02 +287 278 -4.012781031912977e-02 +287 279 -5.413421453123171e-02 +287 280 -7.613960933881123e-02 +287 281 -1.132183869282762e-01 +287 282 -1.820810586422662e-01 +287 283 -3.301555353436759e-01 +287 284 -7.412185823610148e-01 +287 285 -3.165206906282870e+00 +287 286 -1.502055215866002e+01 +287 288 -1.502055215931063e+01 +287 289 -3.165206906282857e+00 +287 290 -7.412185823610165e-01 +287 291 -3.301555353436753e-01 +287 292 -1.820810586422656e-01 +287 293 -1.132183869282768e-01 +287 294 -7.613960933881189e-02 +287 295 -5.413421453123171e-02 +287 296 -4.012781031913015e-02 +287 297 -3.072751892616544e-02 +287 298 -2.415034675252906e-02 +287 299 -1.939104886145118e-02 +287 300 -1.585023865775526e-02 +287 301 -1.315380302376550e-02 +287 302 -1.105916272470029e-02 +287 303 -9.403863770832818e-03 +288 288 3.988394278169704e+01 +288 272 -9.403863770832825e-03 +288 273 -1.105916272470025e-02 +288 274 -1.315380302376550e-02 +288 275 -1.585023865775526e-02 +288 276 -1.939104886145117e-02 +288 277 -2.415034675252896e-02 +288 278 -3.072751892616544e-02 +288 279 -4.012781031913015e-02 +288 280 -5.413421453123170e-02 +288 281 -7.613960933881164e-02 +288 282 -1.132183869282767e-01 +288 283 -1.820810586422654e-01 +288 284 -3.301555353436785e-01 +288 285 -7.412185823610283e-01 +288 286 -3.165206906282877e+00 +288 287 -1.502055215931063e+01 +288 289 -1.502055215866002e+01 +288 290 -3.165206906282891e+00 +288 291 -7.412185823610234e-01 +288 292 -3.301555353436770e-01 +288 293 -1.820810586422646e-01 +288 294 -1.132183869282762e-01 +288 295 -7.613960933881135e-02 +288 296 -5.413421453123172e-02 +288 297 -4.012781031912977e-02 +288 298 -3.072751892616544e-02 +288 299 -2.415034675252897e-02 +288 300 -1.939104886145104e-02 +288 301 -1.585023865775526e-02 +288 302 -1.315380302376546e-02 +288 303 -1.105916272470022e-02 +288 304 -9.403863770832827e-03 +288 305 -8.076052134892564e-03 +288 306 -6.996835383339646e-03 +288 307 -6.109381318875748e-03 +288 308 -5.371977266379786e-03 +288 309 -4.753493624956895e-03 +288 310 -4.230349322908519e-03 +288 311 -3.784439171232927e-03 +288 312 -3.401691470521384e-03 +288 313 -3.071047067257384e-03 +288 314 -2.783725492315672e-03 +288 315 -2.532689975072674e-03 +288 316 -2.312252367280536e-03 +288 317 -2.117777896667789e-03 +288 318 -1.945462087124853e-03 +288 319 -1.792160480940034e-03 +289 289 3.988394278164026e+01 +289 272 -8.076052134892564e-03 +289 273 -9.403863770832797e-03 +289 274 -1.105916272470025e-02 +289 275 -1.315380302376542e-02 +289 276 -1.585023865775526e-02 +289 277 -1.939104886145104e-02 +289 278 -2.415034675252887e-02 +289 279 -3.072751892616544e-02 +289 280 -4.012781031912976e-02 +289 281 -5.413421453123140e-02 +289 282 -7.613960933881131e-02 +289 283 -1.132183869282761e-01 +289 284 -1.820810586422654e-01 +289 285 -3.301555353436786e-01 +289 286 -7.412185823610138e-01 +289 287 -3.165206906282857e+00 +289 288 -1.502055215866002e+01 +289 290 -1.502055215864006e+01 +289 291 -3.165206906282874e+00 +289 292 -7.412185823610202e-01 +289 293 -3.301555353436767e-01 +289 294 -1.820810586422662e-01 +289 295 -1.132183869282767e-01 +289 296 -7.613960933881188e-02 +289 297 -5.413421453123171e-02 +289 298 -4.012781031913015e-02 +289 299 -3.072751892616557e-02 +289 300 -2.415034675252896e-02 +289 301 -1.939104886145118e-02 +289 302 -1.585023865775531e-02 +289 303 -1.315380302376546e-02 +289 304 -1.105916272470028e-02 +289 305 -9.403863770832827e-03 +289 306 -8.076052134892599e-03 +289 307 -6.996835383339698e-03 +289 308 -6.109381318875749e-03 +289 309 -5.371977266379821e-03 +289 310 -4.753493624956895e-03 +289 311 -4.230349322908543e-03 +289 312 -3.784439171232927e-03 +289 313 -3.401691470521393e-03 +289 314 -3.071047067257401e-03 +289 315 -2.783725492315672e-03 +289 316 -2.532689975072686e-03 +289 317 -2.312252367280536e-03 +289 318 -2.117777896667798e-03 +289 319 -1.945462087124853e-03 +290 290 3.988394278153936e+01 +290 272 -6.996835383339671e-03 +290 273 -8.076052134892592e-03 +290 274 -9.403863770832854e-03 +290 275 -1.105916272470025e-02 +290 276 -1.315380302376550e-02 +290 277 -1.585023865775526e-02 +290 278 -1.939104886145111e-02 +290 279 -2.415034675252906e-02 +290 280 -3.072751892616543e-02 +290 281 -4.012781031912995e-02 +290 282 -5.413421453123185e-02 +290 283 -7.613960933881168e-02 +290 284 -1.132183869282768e-01 +290 285 -1.820810586422655e-01 +290 286 -3.301555353436768e-01 +290 287 -7.412185823610165e-01 +290 288 -3.165206906282891e+00 +290 289 -1.502055215864006e+01 +290 291 -1.502055215858801e+01 +290 292 -3.165206906282859e+00 +290 293 -7.412185823610157e-01 +290 294 -3.301555353436769e-01 +290 295 -1.820810586422656e-01 +290 296 -1.132183869282762e-01 +290 297 -7.613960933881123e-02 +290 298 -5.413421453123170e-02 +290 299 -4.012781031912996e-02 +290 300 -3.072751892616530e-02 +290 301 -2.415034675252896e-02 +290 302 -1.939104886145111e-02 +290 303 -1.585023865775520e-02 +290 304 -1.315380302376546e-02 +290 305 -1.105916272470022e-02 +290 306 -9.403863770832818e-03 +290 307 -8.076052134892594e-03 +290 308 -6.996835383339650e-03 +290 309 -6.109381318875748e-03 +290 310 -5.371977266379788e-03 +290 311 -4.753493624956895e-03 +290 312 -4.230349322908520e-03 +290 313 -3.784439171232916e-03 +290 314 -3.401691470521394e-03 +290 315 -3.071047067257386e-03 +290 316 -2.783725492315673e-03 +290 317 -2.532689975072674e-03 +290 318 -2.312252367280536e-03 +290 319 -2.117777896667789e-03 +291 291 3.988394278151443e+01 +291 272 -6.109381318875725e-03 +291 273 -6.996835383339646e-03 +291 274 -8.076052134892599e-03 +291 275 -9.403863770832828e-03 +291 276 -1.105916272470029e-02 +291 277 -1.315380302376546e-02 +291 278 -1.585023865775526e-02 +291 279 -1.939104886145118e-02 +291 280 -2.415034675252897e-02 +291 281 -3.072751892616543e-02 +291 282 -4.012781031913006e-02 +291 283 -5.413421453123173e-02 +291 284 -7.613960933881189e-02 +291 285 -1.132183869282762e-01 +291 286 -1.820810586422658e-01 +291 287 -3.301555353436753e-01 +291 288 -7.412185823610234e-01 +291 289 -3.165206906282874e+00 +291 290 -1.502055215858801e+01 +291 292 -1.502055215859655e+01 +291 293 -3.165206906282872e+00 +291 294 -7.412185823610111e-01 +291 295 -3.301555353436767e-01 +291 296 -1.820810586422650e-01 +291 297 -1.132183869282762e-01 +291 298 -7.613960933881167e-02 +291 299 -5.413421453123172e-02 +291 300 -4.012781031912977e-02 +291 301 -3.072751892616544e-02 +291 302 -2.415034675252897e-02 +291 303 -1.939104886145104e-02 +291 304 -1.585023865775525e-02 +291 305 -1.315380302376542e-02 +291 306 -1.105916272470025e-02 +291 307 -9.403863770832835e-03 +291 308 -8.076052134892590e-03 +291 309 -6.996835383339699e-03 +291 310 -6.109381318875751e-03 +291 311 -5.371977266379823e-03 +291 312 -4.753493624956896e-03 +291 313 -4.230349322908531e-03 +291 314 -3.784439171232938e-03 +291 315 -3.401691470521394e-03 +291 316 -3.071047067257401e-03 +291 317 -2.783725492315673e-03 +291 318 -2.532689975072686e-03 +291 319 -2.312252367280537e-03 +292 292 3.988394278151357e+01 +292 272 -5.371977266379785e-03 +292 273 -6.109381318875727e-03 +292 274 -6.996835383339674e-03 +292 275 -8.076052134892590e-03 +292 276 -9.403863770832830e-03 +292 277 -1.105916272470022e-02 +292 278 -1.315380302376542e-02 +292 279 -1.585023865775526e-02 +292 280 -1.939104886145104e-02 +292 281 -2.415034675252887e-02 +292 282 -3.072751892616537e-02 +292 283 -4.012781031912977e-02 +292 284 -5.413421453123171e-02 +292 285 -7.613960933881123e-02 +292 286 -1.132183869282762e-01 +292 287 -1.820810586422656e-01 +292 288 -3.301555353436770e-01 +292 289 -7.412185823610202e-01 +292 290 -3.165206906282859e+00 +292 291 -1.502055215859655e+01 +292 293 -1.502055215859222e+01 +292 294 -3.165206906282866e+00 +292 295 -7.412185823610224e-01 +292 296 -3.301555353436775e-01 +292 297 -1.820810586422656e-01 +292 298 -1.132183869282768e-01 +292 299 -7.613960933881189e-02 +292 300 -5.413421453123171e-02 +292 301 -4.012781031913015e-02 +292 302 -3.072751892616557e-02 +292 303 -2.415034675252896e-02 +292 304 -1.939104886145117e-02 +292 305 -1.585023865775526e-02 +292 306 -1.315380302376550e-02 +292 307 -1.105916272470029e-02 +292 308 -9.403863770832830e-03 +292 309 -8.076052134892622e-03 +292 310 -6.996835383339675e-03 +292 311 -6.109381318875770e-03 +292 312 -5.371977266379806e-03 +292 313 -4.753493624956895e-03 +292 314 -4.230349322908544e-03 +292 315 -3.784439171232928e-03 +292 316 -3.401691470521403e-03 +292 317 -3.071047067257394e-03 +292 318 -2.783725492315679e-03 +292 319 -2.532689975072680e-03 +293 293 3.988394278152496e+01 +293 272 -4.753493624956893e-03 +293 273 -5.371977266379805e-03 +293 274 -6.109381318875770e-03 +293 275 -6.996835383339701e-03 +293 276 -8.076052134892623e-03 +293 277 -9.403863770832835e-03 +293 278 -1.105916272470025e-02 +293 279 -1.315380302376550e-02 +293 280 -1.585023865775526e-02 +293 281 -1.939104886145110e-02 +293 282 -2.415034675252901e-02 +293 283 -3.072751892616544e-02 +293 284 -4.012781031913015e-02 +293 285 -5.413421453123170e-02 +293 286 -7.613960933881167e-02 +293 287 -1.132183869282768e-01 +293 288 -1.820810586422646e-01 +293 289 -3.301555353436767e-01 +293 290 -7.412185823610157e-01 +293 291 -3.165206906282872e+00 +293 292 -1.502055215859222e+01 +293 294 -1.502055215860531e+01 +293 295 -3.165206906282875e+00 +293 296 -7.412185823610227e-01 +293 297 -3.301555353436748e-01 +293 298 -1.820810586422654e-01 +293 299 -1.132183869282762e-01 +293 300 -7.613960933881134e-02 +293 301 -5.413421453123170e-02 +293 302 -4.012781031912996e-02 +293 303 -3.072751892616530e-02 +293 304 -2.415034675252896e-02 +293 305 -1.939104886145104e-02 +293 306 -1.585023865775526e-02 +293 307 -1.315380302376546e-02 +293 308 -1.105916272470022e-02 +293 309 -9.403863770832825e-03 +293 310 -8.076052134892573e-03 +293 311 -6.996835383339674e-03 +293 312 -6.109381318875728e-03 +293 313 -5.371977266379788e-03 +293 314 -4.753493624956895e-03 +293 315 -4.230349322908520e-03 +293 316 -3.784439171232928e-03 +293 317 -3.401691470521385e-03 +293 318 -3.071047067257393e-03 +293 319 -2.783725492315666e-03 +294 294 3.988394278128563e+01 +294 272 -4.230349322908518e-03 +294 273 -4.753493624956881e-03 +294 274 -5.371977266379806e-03 +294 275 -6.109381318875753e-03 +294 276 -6.996835383339677e-03 +294 277 -8.076052134892587e-03 +294 278 -9.403863770832818e-03 +294 279 -1.105916272470029e-02 +294 280 -1.315380302376546e-02 +294 281 -1.585023865775526e-02 +294 282 -1.939104886145114e-02 +294 283 -2.415034675252897e-02 +294 284 -3.072751892616557e-02 +294 285 -4.012781031912996e-02 +294 286 -5.413421453123172e-02 +294 287 -7.613960933881189e-02 +294 288 -1.132183869282762e-01 +294 289 -1.820810586422662e-01 +294 290 -3.301555353436769e-01 +294 291 -7.412185823610111e-01 +294 292 -3.165206906282866e+00 +294 293 -1.502055215860531e+01 +294 295 -1.502055215840048e+01 +294 296 -3.165206906282874e+00 +294 297 -7.412185823610169e-01 +294 298 -3.301555353436751e-01 +294 299 -1.820810586422656e-01 +294 300 -1.132183869282765e-01 +294 301 -7.613960933881156e-02 +294 302 -5.413421453123172e-02 +294 303 -4.012781031912977e-02 +294 304 -3.072751892616544e-02 +294 305 -2.415034675252887e-02 +294 306 -1.939104886145111e-02 +294 307 -1.585023865775526e-02 +294 308 -1.315380302376542e-02 +294 309 -1.105916272470025e-02 +294 310 -9.403863770832828e-03 +294 311 -8.076052134892609e-03 +294 312 -6.996835383339672e-03 +294 313 -6.109381318875748e-03 +294 314 -5.371977266379821e-03 +294 315 -4.753493624956895e-03 +294 316 -4.230349322908543e-03 +294 317 -3.784439171232927e-03 +294 318 -3.401691470521402e-03 +294 319 -3.071047067257393e-03 +295 295 3.988394278105616e+01 +295 272 -3.784439171232926e-03 +295 273 -4.230349322908531e-03 +295 274 -4.753493624956909e-03 +295 275 -5.371977266379824e-03 +295 276 -6.109381318875772e-03 +295 277 -6.996835383339685e-03 +295 278 -8.076052134892585e-03 +295 279 -9.403863770832827e-03 +295 280 -1.105916272470022e-02 +295 281 -1.315380302376542e-02 +295 282 -1.585023865775523e-02 +295 283 -1.939104886145104e-02 +295 284 -2.415034675252896e-02 +295 285 -3.072751892616530e-02 +295 286 -4.012781031912977e-02 +295 287 -5.413421453123171e-02 +295 288 -7.613960933881135e-02 +295 289 -1.132183869282767e-01 +295 290 -1.820810586422656e-01 +295 291 -3.301555353436767e-01 +295 292 -7.412185823610224e-01 +295 293 -3.165206906282875e+00 +295 294 -1.502055215840048e+01 +295 296 -1.502055215835490e+01 +295 297 -3.165206906282879e+00 +295 298 -7.412185823610214e-01 +295 299 -3.301555353436778e-01 +295 300 -1.820810586422651e-01 +295 301 -1.132183869282764e-01 +295 302 -7.613960933881191e-02 +295 303 -5.413421453123171e-02 +295 304 -4.012781031913015e-02 +295 305 -3.072751892616544e-02 +295 306 -2.415034675252906e-02 +295 307 -1.939104886145118e-02 +295 308 -1.585023865775526e-02 +295 309 -1.315380302376550e-02 +295 310 -1.105916272470029e-02 +295 311 -9.403863770832828e-03 +295 312 -8.076052134892578e-03 +295 313 -6.996835383339648e-03 +295 314 -6.109381318875748e-03 +295 315 -5.371977266379788e-03 +295 316 -4.753493624956895e-03 +295 317 -4.230349322908520e-03 +295 318 -3.784439171232928e-03 +295 319 -3.401691470521385e-03 +296 296 3.988394278102305e+01 +296 272 -3.401691470521384e-03 +296 273 -3.784439171232916e-03 +296 274 -4.230349322908533e-03 +296 275 -4.753493624956898e-03 +296 276 -5.371977266379808e-03 +296 277 -6.109381318875740e-03 +296 278 -6.996835383339646e-03 +296 279 -8.076052134892577e-03 +296 280 -9.403863770832816e-03 +296 281 -1.105916272470025e-02 +296 282 -1.315380302376548e-02 +296 283 -1.585023865775526e-02 +296 284 -1.939104886145117e-02 +296 285 -2.415034675252896e-02 +296 286 -3.072751892616544e-02 +296 287 -4.012781031913015e-02 +296 288 -5.413421453123172e-02 +296 289 -7.613960933881188e-02 +296 290 -1.132183869282762e-01 +296 291 -1.820810586422650e-01 +296 292 -3.301555353436775e-01 +296 293 -7.412185823610227e-01 +296 294 -3.165206906282874e+00 +296 295 -1.502055215835490e+01 +296 297 -1.502055215836223e+01 +296 298 -3.165206906282862e+00 +296 299 -7.412185823610150e-01 +296 300 -3.301555353436783e-01 +296 301 -1.820810586422656e-01 +296 302 -1.132183869282764e-01 +296 303 -7.613960933881135e-02 +296 304 -5.413421453123172e-02 +296 305 -4.012781031912977e-02 +296 306 -3.072751892616544e-02 +296 307 -2.415034675252897e-02 +296 308 -1.939104886145104e-02 +296 309 -1.585023865775526e-02 +296 310 -1.315380302376546e-02 +296 311 -1.105916272470022e-02 +296 312 -9.403863770832827e-03 +296 313 -8.076052134892587e-03 +296 314 -6.996835383339698e-03 +296 315 -6.109381318875749e-03 +296 316 -5.371977266379821e-03 +296 317 -4.753493624956895e-03 +296 318 -4.230349322908543e-03 +296 319 -3.784439171232927e-03 +297 297 3.988394278106475e+01 +297 272 -3.071047067257392e-03 +297 273 -3.401691470521393e-03 +297 274 -3.784439171232938e-03 +297 275 -4.230349322908545e-03 +297 276 -4.753493624956910e-03 +297 277 -5.371977266379813e-03 +297 278 -6.109381318875746e-03 +297 279 -6.996835383339671e-03 +297 280 -8.076052134892587e-03 +297 281 -9.403863770832814e-03 +297 282 -1.105916272470024e-02 +297 283 -1.315380302376542e-02 +297 284 -1.585023865775526e-02 +297 285 -1.939104886145104e-02 +297 286 -2.415034675252887e-02 +297 287 -3.072751892616544e-02 +297 288 -4.012781031912977e-02 +297 289 -5.413421453123171e-02 +297 290 -7.613960933881123e-02 +297 291 -1.132183869282762e-01 +297 292 -1.820810586422656e-01 +297 293 -3.301555353436748e-01 +297 294 -7.412185823610169e-01 +297 295 -3.165206906282879e+00 +297 296 -1.502055215836223e+01 +297 298 -1.502055215839540e+01 +297 299 -3.165206906282849e+00 +297 300 -7.412185823610145e-01 +297 301 -3.301555353436752e-01 +297 302 -1.820810586422657e-01 +297 303 -1.132183869282767e-01 +297 304 -7.613960933881188e-02 +297 305 -5.413421453123171e-02 +297 306 -4.012781031913015e-02 +297 307 -3.072751892616557e-02 +297 308 -2.415034675252896e-02 +297 309 -1.939104886145118e-02 +297 310 -1.585023865775531e-02 +297 311 -1.315380302376546e-02 +297 312 -1.105916272470028e-02 +297 313 -9.403863770832820e-03 +297 314 -8.076052134892601e-03 +297 315 -6.996835383339650e-03 +297 316 -6.109381318875748e-03 +297 317 -5.371977266379788e-03 +297 318 -4.753493624956895e-03 +297 319 -4.230349322908520e-03 +298 298 3.988394278115151e+01 +298 272 -2.783725492315665e-03 +298 273 -3.071047067257384e-03 +298 274 -3.401691470521394e-03 +298 275 -3.784439171232928e-03 +298 276 -4.230349322908533e-03 +298 277 -4.753493624956888e-03 +298 278 -5.371977266379786e-03 +298 279 -6.109381318875725e-03 +298 280 -6.996835383339646e-03 +298 281 -8.076052134892592e-03 +298 282 -9.403863770832840e-03 +298 283 -1.105916272470025e-02 +298 284 -1.315380302376550e-02 +298 285 -1.585023865775526e-02 +298 286 -1.939104886145111e-02 +298 287 -2.415034675252906e-02 +298 288 -3.072751892616544e-02 +298 289 -4.012781031913015e-02 +298 290 -5.413421453123170e-02 +298 291 -7.613960933881167e-02 +298 292 -1.132183869282768e-01 +298 293 -1.820810586422654e-01 +298 294 -3.301555353436751e-01 +298 295 -7.412185823610214e-01 +298 296 -3.165206906282862e+00 +298 297 -1.502055215839540e+01 +298 299 -1.502055215844906e+01 +298 300 -3.165206906282878e+00 +298 301 -7.412185823610187e-01 +298 302 -3.301555353436753e-01 +298 303 -1.820810586422649e-01 +298 304 -1.132183869282762e-01 +298 305 -7.613960933881134e-02 +298 306 -5.413421453123170e-02 +298 307 -4.012781031912996e-02 +298 308 -3.072751892616530e-02 +298 309 -2.415034675252896e-02 +298 310 -1.939104886145111e-02 +298 311 -1.585023865775520e-02 +298 312 -1.315380302376546e-02 +298 313 -1.105916272470022e-02 +298 314 -9.403863770832833e-03 +298 315 -8.076052134892596e-03 +298 316 -6.996835383339699e-03 +298 317 -6.109381318875751e-03 +298 318 -5.371977266379823e-03 +298 319 -4.753493624956897e-03 +299 299 3.988394278128114e+01 +299 272 -2.532689975072673e-03 +299 273 -2.783725492315665e-03 +299 274 -3.071047067257393e-03 +299 275 -3.401691470521394e-03 +299 276 -3.784439171232928e-03 +299 277 -4.230349322908524e-03 +299 278 -4.753493624956879e-03 +299 279 -5.371977266379785e-03 +299 280 -6.109381318875727e-03 +299 281 -6.996835383339674e-03 +299 282 -8.076052134892603e-03 +299 283 -9.403863770832830e-03 +299 284 -1.105916272470029e-02 +299 285 -1.315380302376546e-02 +299 286 -1.585023865775526e-02 +299 287 -1.939104886145118e-02 +299 288 -2.415034675252897e-02 +299 289 -3.072751892616557e-02 +299 290 -4.012781031912996e-02 +299 291 -5.413421453123172e-02 +299 292 -7.613960933881189e-02 +299 293 -1.132183869282762e-01 +299 294 -1.820810586422656e-01 +299 295 -3.301555353436778e-01 +299 296 -7.412185823610150e-01 +299 297 -3.165206906282849e+00 +299 298 -1.502055215844906e+01 +299 300 -1.502055215852578e+01 +299 301 -3.165206906282871e+00 +299 302 -7.412185823610254e-01 +299 303 -3.301555353436759e-01 +299 304 -1.820810586422650e-01 +299 305 -1.132183869282765e-01 +299 306 -7.613960933881156e-02 +299 307 -5.413421453123172e-02 +299 308 -4.012781031912977e-02 +299 309 -3.072751892616544e-02 +299 310 -2.415034675252897e-02 +299 311 -1.939104886145104e-02 +299 312 -1.585023865775525e-02 +299 313 -1.315380302376542e-02 +299 314 -1.105916272470025e-02 +299 315 -9.403863770832828e-03 +299 316 -8.076052134892611e-03 +299 317 -6.996835383339675e-03 +299 318 -6.109381318875770e-03 +299 319 -5.371977266379807e-03 +300 300 3.988394278146372e+01 +300 272 -2.312252367280535e-03 +300 273 -2.532689975072679e-03 +300 274 -2.783725492315679e-03 +300 275 -3.071047067257401e-03 +300 276 -3.401691470521403e-03 +300 277 -3.784439171232932e-03 +300 278 -4.230349322908529e-03 +300 279 -4.753493624956893e-03 +300 280 -5.371977266379805e-03 +300 281 -6.109381318875770e-03 +300 282 -6.996835383339701e-03 +300 283 -8.076052134892613e-03 +300 284 -9.403863770832837e-03 +300 285 -1.105916272470022e-02 +300 286 -1.315380302376542e-02 +300 287 -1.585023865775526e-02 +300 288 -1.939104886145104e-02 +300 289 -2.415034675252896e-02 +300 290 -3.072751892616530e-02 +300 291 -4.012781031912977e-02 +300 292 -5.413421453123171e-02 +300 293 -7.613960933881134e-02 +300 294 -1.132183869282765e-01 +300 295 -1.820810586422651e-01 +300 296 -3.301555353436783e-01 +300 297 -7.412185823610145e-01 +300 298 -3.165206906282878e+00 +300 299 -1.502055215852578e+01 +300 301 -1.502055215863300e+01 +300 302 -3.165206906282863e+00 +300 303 -7.412185823610120e-01 +300 304 -3.301555353436763e-01 +300 305 -1.820810586422659e-01 +300 306 -1.132183869282764e-01 +300 307 -7.613960933881191e-02 +300 308 -5.413421453123171e-02 +300 309 -4.012781031913015e-02 +300 310 -3.072751892616557e-02 +300 311 -2.415034675252896e-02 +300 312 -1.939104886145117e-02 +300 313 -1.585023865775526e-02 +300 314 -1.315380302376550e-02 +300 315 -1.105916272470029e-02 +300 316 -9.403863770832828e-03 +300 317 -8.076052134892578e-03 +300 318 -6.996835383339674e-03 +300 319 -6.109381318875729e-03 +301 301 3.988394278171950e+01 +301 272 -2.117777896667789e-03 +301 273 -2.312252367280531e-03 +301 274 -2.532689975072680e-03 +301 275 -2.783725492315673e-03 +301 276 -3.071047067257394e-03 +301 277 -3.401691470521389e-03 +301 278 -3.784439171232916e-03 +301 279 -4.230349322908518e-03 +301 280 -4.753493624956881e-03 +301 281 -5.371977266379806e-03 +301 282 -6.109381318875753e-03 +301 283 -6.996835383339677e-03 +301 284 -8.076052134892601e-03 +301 285 -9.403863770832818e-03 +301 286 -1.105916272470025e-02 +301 287 -1.315380302376550e-02 +301 288 -1.585023865775526e-02 +301 289 -1.939104886145118e-02 +301 290 -2.415034675252896e-02 +301 291 -3.072751892616544e-02 +301 292 -4.012781031913015e-02 +301 293 -5.413421453123170e-02 +301 294 -7.613960933881156e-02 +301 295 -1.132183869282764e-01 +301 296 -1.820810586422656e-01 +301 297 -3.301555353436752e-01 +301 298 -7.412185823610187e-01 +301 299 -3.165206906282871e+00 +301 300 -1.502055215863300e+01 +301 302 -1.502055215878373e+01 +301 303 -3.165206906282856e+00 +301 304 -7.412185823610145e-01 +301 305 -3.301555353436794e-01 +301 306 -1.820810586422664e-01 +301 307 -1.132183869282764e-01 +301 308 -7.613960933881134e-02 +301 309 -5.413421453123170e-02 +301 310 -4.012781031912996e-02 +301 311 -3.072751892616530e-02 +301 312 -2.415034675252896e-02 +301 313 -1.939104886145104e-02 +301 314 -1.585023865775526e-02 +301 315 -1.315380302376546e-02 +301 316 -1.105916272470022e-02 +301 317 -9.403863770832827e-03 +301 318 -8.076052134892615e-03 +301 319 -6.996835383339673e-03 +302 302 3.988394278208167e+01 +302 272 -1.945462087124852e-03 +302 273 -2.117777896667793e-03 +302 274 -2.312252367280541e-03 +302 275 -2.532689975072686e-03 +302 276 -2.783725492315679e-03 +302 277 -3.071047067257396e-03 +302 278 -3.401691470521392e-03 +302 279 -3.784439171232926e-03 +302 280 -4.230349322908531e-03 +302 281 -4.753493624956909e-03 +302 282 -5.371977266379824e-03 +302 283 -6.109381318875772e-03 +302 284 -6.996835383339699e-03 +302 285 -8.076052134892594e-03 +302 286 -9.403863770832827e-03 +302 287 -1.105916272470029e-02 +302 288 -1.315380302376546e-02 +302 289 -1.585023865775531e-02 +302 290 -1.939104886145111e-02 +302 291 -2.415034675252897e-02 +302 292 -3.072751892616557e-02 +302 293 -4.012781031912996e-02 +302 294 -5.413421453123172e-02 +302 295 -7.613960933881191e-02 +302 296 -1.132183869282764e-01 +302 297 -1.820810586422657e-01 +302 298 -3.301555353436753e-01 +302 299 -7.412185823610254e-01 +302 300 -3.165206906282863e+00 +302 301 -1.502055215878373e+01 +302 303 -1.502055215899858e+01 +302 304 -3.165206906282867e+00 +302 305 -7.412185823610263e-01 +302 306 -3.301555353436774e-01 +302 307 -1.820810586422649e-01 +302 308 -1.132183869282765e-01 +302 309 -7.613960933881156e-02 +302 310 -5.413421453123172e-02 +302 311 -4.012781031912977e-02 +302 312 -3.072751892616544e-02 +302 313 -2.415034675252887e-02 +302 314 -1.939104886145111e-02 +302 315 -1.585023865775526e-02 +302 316 -1.315380302376542e-02 +302 317 -1.105916272470025e-02 +302 318 -9.403863770832827e-03 +302 319 -8.076052134892575e-03 +303 303 3.988394278260304e+01 +303 272 -1.792160480940034e-03 +303 273 -1.945462087124849e-03 +303 274 -2.117777896667794e-03 +303 275 -2.312252367280537e-03 +303 276 -2.532689975072681e-03 +303 277 -2.783725492315669e-03 +303 278 -3.071047067257384e-03 +303 279 -3.401691470521384e-03 +303 280 -3.784439171232916e-03 +303 281 -4.230349322908533e-03 +303 282 -4.753493624956898e-03 +303 283 -5.371977266379808e-03 +303 284 -6.109381318875751e-03 +303 285 -6.996835383339648e-03 +303 286 -8.076052134892566e-03 +303 287 -9.403863770832818e-03 +303 288 -1.105916272470022e-02 +303 289 -1.315380302376546e-02 +303 290 -1.585023865775520e-02 +303 291 -1.939104886145104e-02 +303 292 -2.415034675252896e-02 +303 293 -3.072751892616530e-02 +303 294 -4.012781031912977e-02 +303 295 -5.413421453123171e-02 +303 296 -7.613960933881135e-02 +303 297 -1.132183869282767e-01 +303 298 -1.820810586422649e-01 +303 299 -3.301555353436759e-01 +303 300 -7.412185823610120e-01 +303 301 -3.165206906282856e+00 +303 302 -1.502055215899858e+01 +303 304 -1.502055215931068e+01 +303 305 -3.165206906282876e+00 +303 306 -7.412185823610161e-01 +303 307 -3.301555353436776e-01 +303 308 -1.820810586422648e-01 +303 309 -1.132183869282764e-01 +303 310 -7.613960933881202e-02 +303 311 -5.413421453123171e-02 +303 312 -4.012781031913015e-02 +303 313 -3.072751892616544e-02 +303 314 -2.415034675252906e-02 +303 315 -1.939104886145118e-02 +303 316 -1.585023865775526e-02 +303 317 -1.315380302376550e-02 +303 318 -1.105916272470029e-02 +303 319 -9.403863770832847e-03 +304 304 3.988394278260303e+01 +304 288 -9.403863770832827e-03 +304 289 -1.105916272470028e-02 +304 290 -1.315380302376546e-02 +304 291 -1.585023865775525e-02 +304 292 -1.939104886145117e-02 +304 293 -2.415034675252896e-02 +304 294 -3.072751892616544e-02 +304 295 -4.012781031913015e-02 +304 296 -5.413421453123172e-02 +304 297 -7.613960933881188e-02 +304 298 -1.132183869282762e-01 +304 299 -1.820810586422650e-01 +304 300 -3.301555353436763e-01 +304 301 -7.412185823610145e-01 +304 302 -3.165206906282867e+00 +304 303 -1.502055215931068e+01 +304 305 -1.502055215899859e+01 +304 306 -3.165206906282852e+00 +304 307 -7.412185823610180e-01 +304 308 -3.301555353436730e-01 +304 309 -1.820810586422652e-01 +304 310 -1.132183869282767e-01 +304 311 -7.613960933881134e-02 +304 312 -5.413421453123172e-02 +304 313 -4.012781031912977e-02 +304 314 -3.072751892616544e-02 +304 315 -2.415034675252897e-02 +304 316 -1.939104886145104e-02 +304 317 -1.585023865775526e-02 +304 318 -1.315380302376546e-02 +304 319 -1.105916272470026e-02 +304 320 -9.403863770832828e-03 +304 321 -8.076052134892590e-03 +304 322 -6.996835383339650e-03 +304 323 -6.109381318875748e-03 +304 324 -5.371977266379788e-03 +304 325 -4.753493624956895e-03 +304 326 -4.230349322908520e-03 +304 327 -3.784439171232928e-03 +304 328 -3.401691470521394e-03 +304 329 -3.071047067257386e-03 +304 330 -2.783725492315673e-03 +304 331 -2.532689975072674e-03 +304 332 -2.312252367280536e-03 +304 333 -2.117777896667789e-03 +304 334 -1.945462087124853e-03 +304 335 -1.792160480940039e-03 +305 305 3.988394278208168e+01 +305 288 -8.076052134892564e-03 +305 289 -9.403863770832827e-03 +305 290 -1.105916272470022e-02 +305 291 -1.315380302376542e-02 +305 292 -1.585023865775526e-02 +305 293 -1.939104886145104e-02 +305 294 -2.415034675252887e-02 +305 295 -3.072751892616544e-02 +305 296 -4.012781031912977e-02 +305 297 -5.413421453123171e-02 +305 298 -7.613960933881134e-02 +305 299 -1.132183869282765e-01 +305 300 -1.820810586422659e-01 +305 301 -3.301555353436794e-01 +305 302 -7.412185823610263e-01 +305 303 -3.165206906282876e+00 +305 304 -1.502055215899859e+01 +305 306 -1.502055215878373e+01 +305 307 -3.165206906282874e+00 +305 308 -7.412185823610157e-01 +305 309 -3.301555353436706e-01 +305 310 -1.820810586422647e-01 +305 311 -1.132183869282765e-01 +305 312 -7.613960933881189e-02 +305 313 -5.413421453123171e-02 +305 314 -4.012781031913015e-02 +305 315 -3.072751892616557e-02 +305 316 -2.415034675252896e-02 +305 317 -1.939104886145118e-02 +305 318 -1.585023865775531e-02 +305 319 -1.315380302376550e-02 +305 320 -1.105916272470029e-02 +305 321 -9.403863770832835e-03 +305 322 -8.076052134892601e-03 +305 323 -6.996835383339699e-03 +305 324 -6.109381318875751e-03 +305 325 -5.371977266379823e-03 +305 326 -4.753493624956897e-03 +305 327 -4.230349322908545e-03 +305 328 -3.784439171232939e-03 +305 329 -3.401691470521394e-03 +305 330 -3.071047067257401e-03 +305 331 -2.783725492315673e-03 +305 332 -2.532689975072686e-03 +305 333 -2.312252367280537e-03 +305 334 -2.117777896667799e-03 +305 335 -1.945462087124858e-03 +306 306 3.988394278171953e+01 +306 288 -6.996835383339646e-03 +306 289 -8.076052134892599e-03 +306 290 -9.403863770832818e-03 +306 291 -1.105916272470025e-02 +306 292 -1.315380302376550e-02 +306 293 -1.585023865775526e-02 +306 294 -1.939104886145111e-02 +306 295 -2.415034675252906e-02 +306 296 -3.072751892616544e-02 +306 297 -4.012781031913015e-02 +306 298 -5.413421453123170e-02 +306 299 -7.613960933881156e-02 +306 300 -1.132183869282764e-01 +306 301 -1.820810586422664e-01 +306 302 -3.301555353436774e-01 +306 303 -7.412185823610161e-01 +306 304 -3.165206906282852e+00 +306 305 -1.502055215878373e+01 +306 307 -1.502055215863303e+01 +306 308 -3.165206906282876e+00 +306 309 -7.412185823610161e-01 +306 310 -3.301555353436774e-01 +306 311 -1.820810586422652e-01 +306 312 -1.132183869282764e-01 +306 313 -7.613960933881134e-02 +306 314 -5.413421453123170e-02 +306 315 -4.012781031912996e-02 +306 316 -3.072751892616530e-02 +306 317 -2.415034675252896e-02 +306 318 -1.939104886145111e-02 +306 319 -1.585023865775526e-02 +306 320 -1.315380302376546e-02 +306 321 -1.105916272470022e-02 +306 322 -9.403863770832827e-03 +306 323 -8.076052134892618e-03 +306 324 -6.996835383339675e-03 +306 325 -6.109381318875770e-03 +306 326 -5.371977266379807e-03 +306 327 -4.753493624956911e-03 +306 328 -4.230349322908545e-03 +306 329 -3.784439171232928e-03 +306 330 -3.401691470521403e-03 +306 331 -3.071047067257394e-03 +306 332 -2.783725492315679e-03 +306 333 -2.532689975072680e-03 +306 334 -2.312252367280542e-03 +306 335 -2.117777896667799e-03 +307 307 3.988394278146373e+01 +307 288 -6.109381318875748e-03 +307 289 -6.996835383339698e-03 +307 290 -8.076052134892594e-03 +307 291 -9.403863770832835e-03 +307 292 -1.105916272470029e-02 +307 293 -1.315380302376546e-02 +307 294 -1.585023865775526e-02 +307 295 -1.939104886145118e-02 +307 296 -2.415034675252897e-02 +307 297 -3.072751892616557e-02 +307 298 -4.012781031912996e-02 +307 299 -5.413421453123172e-02 +307 300 -7.613960933881191e-02 +307 301 -1.132183869282764e-01 +307 302 -1.820810586422649e-01 +307 303 -3.301555353436776e-01 +307 304 -7.412185823610180e-01 +307 305 -3.165206906282874e+00 +307 306 -1.502055215863303e+01 +307 308 -1.502055215852574e+01 +307 309 -3.165206906282867e+00 +307 310 -7.412185823610222e-01 +307 311 -3.301555353436785e-01 +307 312 -1.820810586422661e-01 +307 313 -1.132183869282765e-01 +307 314 -7.613960933881156e-02 +307 315 -5.413421453123172e-02 +307 316 -4.012781031912977e-02 +307 317 -3.072751892616544e-02 +307 318 -2.415034675252897e-02 +307 319 -1.939104886145111e-02 +307 320 -1.585023865775526e-02 +307 321 -1.315380302376542e-02 +307 322 -1.105916272470025e-02 +307 323 -9.403863770832827e-03 +307 324 -8.076052134892568e-03 +307 325 -6.996835383339674e-03 +307 326 -6.109381318875729e-03 +307 327 -5.371977266379807e-03 +307 328 -4.753493624956896e-03 +307 329 -4.230349322908520e-03 +307 330 -3.784439171232928e-03 +307 331 -3.401691470521385e-03 +307 332 -3.071047067257393e-03 +307 333 -2.783725492315666e-03 +307 334 -2.532689975072680e-03 +307 335 -2.312252367280537e-03 +308 308 3.988394278128111e+01 +308 288 -5.371977266379786e-03 +308 289 -6.109381318875749e-03 +308 290 -6.996835383339650e-03 +308 291 -8.076052134892590e-03 +308 292 -9.403863770832830e-03 +308 293 -1.105916272470022e-02 +308 294 -1.315380302376542e-02 +308 295 -1.585023865775526e-02 +308 296 -1.939104886145104e-02 +308 297 -2.415034675252896e-02 +308 298 -3.072751892616530e-02 +308 299 -4.012781031912977e-02 +308 300 -5.413421453123171e-02 +308 301 -7.613960933881134e-02 +308 302 -1.132183869282765e-01 +308 303 -1.820810586422648e-01 +308 304 -3.301555353436730e-01 +308 305 -7.412185823610157e-01 +308 306 -3.165206906282876e+00 +308 307 -1.502055215852574e+01 +308 309 -1.502055215844907e+01 +308 310 -3.165206906282865e+00 +308 311 -7.412185823610209e-01 +308 312 -3.301555353436785e-01 +308 313 -1.820810586422661e-01 +308 314 -1.132183869282764e-01 +308 315 -7.613960933881202e-02 +308 316 -5.413421453123171e-02 +308 317 -4.012781031913015e-02 +308 318 -3.072751892616558e-02 +308 319 -2.415034675252907e-02 +308 320 -1.939104886145118e-02 +308 321 -1.585023865775526e-02 +308 322 -1.315380302376550e-02 +308 323 -1.105916272470029e-02 +308 324 -9.403863770832828e-03 +308 325 -8.076052134892622e-03 +308 326 -6.996835383339673e-03 +308 327 -6.109381318875770e-03 +308 328 -5.371977266379823e-03 +308 329 -4.753493624956895e-03 +308 330 -4.230349322908543e-03 +308 331 -3.784439171232927e-03 +308 332 -3.401691470521402e-03 +308 333 -3.071047067257393e-03 +308 334 -2.783725492315679e-03 +308 335 -2.532689975072686e-03 +309 309 3.988394278115150e+01 +309 288 -4.753493624956895e-03 +309 289 -5.371977266379821e-03 +309 290 -6.109381318875748e-03 +309 291 -6.996835383339699e-03 +309 292 -8.076052134892622e-03 +309 293 -9.403863770832825e-03 +309 294 -1.105916272470025e-02 +309 295 -1.315380302376550e-02 +309 296 -1.585023865775526e-02 +309 297 -1.939104886145118e-02 +309 298 -2.415034675252896e-02 +309 299 -3.072751892616544e-02 +309 300 -4.012781031913015e-02 +309 301 -5.413421453123170e-02 +309 302 -7.613960933881156e-02 +309 303 -1.132183869282764e-01 +309 304 -1.820810586422652e-01 +309 305 -3.301555353436706e-01 +309 306 -7.412185823610161e-01 +309 307 -3.165206906282867e+00 +309 308 -1.502055215844907e+01 +309 310 -1.502055215839541e+01 +309 311 -3.165206906282854e+00 +309 312 -7.412185823610210e-01 +309 313 -3.301555353436776e-01 +309 314 -1.820810586422650e-01 +309 315 -1.132183869282767e-01 +309 316 -7.613960933881132e-02 +309 317 -5.413421453123170e-02 +309 318 -4.012781031912997e-02 +309 319 -3.072751892616544e-02 +309 320 -2.415034675252897e-02 +309 321 -1.939104886145104e-02 +309 322 -1.585023865775526e-02 +309 323 -1.315380302376546e-02 +309 324 -1.105916272470022e-02 +309 325 -9.403863770832825e-03 +309 326 -8.076052134892568e-03 +309 327 -6.996835383339676e-03 +309 328 -6.109381318875750e-03 +309 329 -5.371977266379788e-03 +309 330 -4.753493624956895e-03 +309 331 -4.230349322908520e-03 +309 332 -3.784439171232928e-03 +309 333 -3.401691470521385e-03 +309 334 -3.071047067257394e-03 +309 335 -2.783725492315673e-03 +310 310 3.988394278106474e+01 +310 288 -4.230349322908519e-03 +310 289 -4.753493624956895e-03 +310 290 -5.371977266379788e-03 +310 291 -6.109381318875751e-03 +310 292 -6.996835383339675e-03 +310 293 -8.076052134892573e-03 +310 294 -9.403863770832828e-03 +310 295 -1.105916272470029e-02 +310 296 -1.315380302376546e-02 +310 297 -1.585023865775531e-02 +310 298 -1.939104886145111e-02 +310 299 -2.415034675252897e-02 +310 300 -3.072751892616557e-02 +310 301 -4.012781031912996e-02 +310 302 -5.413421453123172e-02 +310 303 -7.613960933881202e-02 +310 304 -1.132183869282767e-01 +310 305 -1.820810586422647e-01 +310 306 -3.301555353436774e-01 +310 307 -7.412185823610222e-01 +310 308 -3.165206906282865e+00 +310 309 -1.502055215839541e+01 +310 311 -1.502055215836220e+01 +310 312 -3.165206906282865e+00 +310 313 -7.412185823610257e-01 +310 314 -3.301555353436779e-01 +310 315 -1.820810586422649e-01 +310 316 -1.132183869282763e-01 +310 317 -7.613960933881156e-02 +310 318 -5.413421453123173e-02 +310 319 -4.012781031912997e-02 +310 320 -3.072751892616545e-02 +310 321 -2.415034675252887e-02 +310 322 -1.939104886145111e-02 +310 323 -1.585023865775526e-02 +310 324 -1.315380302376542e-02 +310 325 -1.105916272470025e-02 +310 326 -9.403863770832807e-03 +310 327 -8.076052134892616e-03 +310 328 -6.996835383339699e-03 +310 329 -6.109381318875749e-03 +310 330 -5.371977266379821e-03 +310 331 -4.753493624956895e-03 +310 332 -4.230349322908543e-03 +310 333 -3.784439171232927e-03 +310 334 -3.401691470521403e-03 +310 335 -3.071047067257401e-03 +311 311 3.988394278102304e+01 +311 288 -3.784439171232927e-03 +311 289 -4.230349322908543e-03 +311 290 -4.753493624956895e-03 +311 291 -5.371977266379823e-03 +311 292 -6.109381318875770e-03 +311 293 -6.996835383339674e-03 +311 294 -8.076052134892609e-03 +311 295 -9.403863770832828e-03 +311 296 -1.105916272470022e-02 +311 297 -1.315380302376546e-02 +311 298 -1.585023865775520e-02 +311 299 -1.939104886145104e-02 +311 300 -2.415034675252896e-02 +311 301 -3.072751892616530e-02 +311 302 -4.012781031912977e-02 +311 303 -5.413421453123171e-02 +311 304 -7.613960933881134e-02 +311 305 -1.132183869282765e-01 +311 306 -1.820810586422652e-01 +311 307 -3.301555353436785e-01 +311 308 -7.412185823610209e-01 +311 309 -3.165206906282854e+00 +311 310 -1.502055215836220e+01 +311 312 -1.502055215835490e+01 +311 313 -3.165206906282888e+00 +311 314 -7.412185823610268e-01 +311 315 -3.301555353436724e-01 +311 316 -1.820810586422651e-01 +311 317 -1.132183869282764e-01 +311 318 -7.613960933881202e-02 +311 319 -5.413421453123203e-02 +311 320 -4.012781031913015e-02 +311 321 -3.072751892616544e-02 +311 322 -2.415034675252906e-02 +311 323 -1.939104886145118e-02 +311 324 -1.585023865775526e-02 +311 325 -1.315380302376550e-02 +311 326 -1.105916272470025e-02 +311 327 -9.403863770832847e-03 +311 328 -8.076052134892601e-03 +311 329 -6.996835383339650e-03 +311 330 -6.109381318875748e-03 +311 331 -5.371977266379788e-03 +311 332 -4.753493624956895e-03 +311 333 -4.230349322908520e-03 +311 334 -3.784439171232928e-03 +311 335 -3.401691470521394e-03 +312 312 3.988394278105615e+01 +312 288 -3.401691470521384e-03 +312 289 -3.784439171232927e-03 +312 290 -4.230349322908520e-03 +312 291 -4.753493624956896e-03 +312 292 -5.371977266379806e-03 +312 293 -6.109381318875728e-03 +312 294 -6.996835383339672e-03 +312 295 -8.076052134892578e-03 +312 296 -9.403863770832827e-03 +312 297 -1.105916272470028e-02 +312 298 -1.315380302376546e-02 +312 299 -1.585023865775525e-02 +312 300 -1.939104886145117e-02 +312 301 -2.415034675252896e-02 +312 302 -3.072751892616544e-02 +312 303 -4.012781031913015e-02 +312 304 -5.413421453123172e-02 +312 305 -7.613960933881189e-02 +312 306 -1.132183869282764e-01 +312 307 -1.820810586422661e-01 +312 308 -3.301555353436785e-01 +312 309 -7.412185823610210e-01 +312 310 -3.165206906282865e+00 +312 311 -1.502055215835490e+01 +312 313 -1.502055215840048e+01 +312 314 -3.165206906282879e+00 +312 315 -7.412185823610165e-01 +312 316 -3.301555353436760e-01 +312 317 -1.820810586422656e-01 +312 318 -1.132183869282767e-01 +312 319 -7.613960933881159e-02 +312 320 -5.413421453123173e-02 +312 321 -4.012781031912977e-02 +312 322 -3.072751892616544e-02 +312 323 -2.415034675252897e-02 +312 324 -1.939104886145104e-02 +312 325 -1.585023865775526e-02 +312 326 -1.315380302376542e-02 +312 327 -1.105916272470025e-02 +312 328 -9.403863770832835e-03 +312 329 -8.076052134892590e-03 +312 330 -6.996835383339699e-03 +312 331 -6.109381318875751e-03 +312 332 -5.371977266379823e-03 +312 333 -4.753493624956897e-03 +312 334 -4.230349322908545e-03 +312 335 -3.784439171232939e-03 +313 313 3.988394278128564e+01 +313 288 -3.071047067257384e-03 +313 289 -3.401691470521393e-03 +313 290 -3.784439171232916e-03 +313 291 -4.230349322908531e-03 +313 292 -4.753493624956895e-03 +313 293 -5.371977266379788e-03 +313 294 -6.109381318875748e-03 +313 295 -6.996835383339648e-03 +313 296 -8.076052134892587e-03 +313 297 -9.403863770832820e-03 +313 298 -1.105916272470022e-02 +313 299 -1.315380302376542e-02 +313 300 -1.585023865775526e-02 +313 301 -1.939104886145104e-02 +313 302 -2.415034675252887e-02 +313 303 -3.072751892616544e-02 +313 304 -4.012781031912977e-02 +313 305 -5.413421453123171e-02 +313 306 -7.613960933881134e-02 +313 307 -1.132183869282765e-01 +313 308 -1.820810586422661e-01 +313 309 -3.301555353436776e-01 +313 310 -7.412185823610257e-01 +313 311 -3.165206906282888e+00 +313 312 -1.502055215840048e+01 +313 314 -1.502055215860531e+01 +313 315 -3.165206906282856e+00 +313 316 -7.412185823610136e-01 +313 317 -3.301555353436786e-01 +313 318 -1.820810586422648e-01 +313 319 -1.132183869282764e-01 +313 320 -7.613960933881202e-02 +313 321 -5.413421453123171e-02 +313 322 -4.012781031913015e-02 +313 323 -3.072751892616557e-02 +313 324 -2.415034675252896e-02 +313 325 -1.939104886145117e-02 +313 326 -1.585023865775526e-02 +313 327 -1.315380302376550e-02 +313 328 -1.105916272470029e-02 +313 329 -9.403863770832830e-03 +313 330 -8.076052134892622e-03 +313 331 -6.996835383339675e-03 +313 332 -6.109381318875770e-03 +313 333 -5.371977266379807e-03 +313 334 -4.753493624956911e-03 +313 335 -4.230349322908545e-03 +314 314 3.988394278152496e+01 +314 288 -2.783725492315672e-03 +314 289 -3.071047067257401e-03 +314 290 -3.401691470521394e-03 +314 291 -3.784439171232938e-03 +314 292 -4.230349322908544e-03 +314 293 -4.753493624956895e-03 +314 294 -5.371977266379821e-03 +314 295 -6.109381318875748e-03 +314 296 -6.996835383339698e-03 +314 297 -8.076052134892601e-03 +314 298 -9.403863770832833e-03 +314 299 -1.105916272470025e-02 +314 300 -1.315380302376550e-02 +314 301 -1.585023865775526e-02 +314 302 -1.939104886145111e-02 +314 303 -2.415034675252906e-02 +314 304 -3.072751892616544e-02 +314 305 -4.012781031913015e-02 +314 306 -5.413421453123170e-02 +314 307 -7.613960933881156e-02 +314 308 -1.132183869282764e-01 +314 309 -1.820810586422650e-01 +314 310 -3.301555353436779e-01 +314 311 -7.412185823610268e-01 +314 312 -3.165206906282879e+00 +314 313 -1.502055215860531e+01 +314 315 -1.502055215859221e+01 +314 316 -3.165206906282863e+00 +314 317 -7.412185823610270e-01 +314 318 -3.301555353436759e-01 +314 319 -1.820810586422653e-01 +314 320 -1.132183869282767e-01 +314 321 -7.613960933881132e-02 +314 322 -5.413421453123170e-02 +314 323 -4.012781031912996e-02 +314 324 -3.072751892616530e-02 +314 325 -2.415034675252896e-02 +314 326 -1.939104886145104e-02 +314 327 -1.585023865775526e-02 +314 328 -1.315380302376546e-02 +314 329 -1.105916272470022e-02 +314 330 -9.403863770832825e-03 +314 331 -8.076052134892573e-03 +314 332 -6.996835383339674e-03 +314 333 -6.109381318875729e-03 +314 334 -5.371977266379807e-03 +314 335 -4.753493624956896e-03 +315 315 3.988394278151355e+01 +315 288 -2.532689975072674e-03 +315 289 -2.783725492315672e-03 +315 290 -3.071047067257386e-03 +315 291 -3.401691470521394e-03 +315 292 -3.784439171232928e-03 +315 293 -4.230349322908520e-03 +315 294 -4.753493624956895e-03 +315 295 -5.371977266379788e-03 +315 296 -6.109381318875749e-03 +315 297 -6.996835383339650e-03 +315 298 -8.076052134892596e-03 +315 299 -9.403863770832828e-03 +315 300 -1.105916272470029e-02 +315 301 -1.315380302376546e-02 +315 302 -1.585023865775526e-02 +315 303 -1.939104886145118e-02 +315 304 -2.415034675252897e-02 +315 305 -3.072751892616557e-02 +315 306 -4.012781031912996e-02 +315 307 -5.413421453123172e-02 +315 308 -7.613960933881202e-02 +315 309 -1.132183869282767e-01 +315 310 -1.820810586422649e-01 +315 311 -3.301555353436724e-01 +315 312 -7.412185823610165e-01 +315 313 -3.165206906282856e+00 +315 314 -1.502055215859221e+01 +315 316 -1.502055215859652e+01 +315 317 -3.165206906282885e+00 +315 318 -7.412185823610239e-01 +315 319 -3.301555353436756e-01 +315 320 -1.820810586422654e-01 +315 321 -1.132183869282763e-01 +315 322 -7.613960933881156e-02 +315 323 -5.413421453123172e-02 +315 324 -4.012781031912977e-02 +315 325 -3.072751892616544e-02 +315 326 -2.415034675252887e-02 +315 327 -1.939104886145111e-02 +315 328 -1.585023865775526e-02 +315 329 -1.315380302376542e-02 +315 330 -1.105916272470025e-02 +315 331 -9.403863770832828e-03 +315 332 -8.076052134892609e-03 +315 333 -6.996835383339673e-03 +315 334 -6.109381318875770e-03 +315 335 -5.371977266379823e-03 +316 316 3.988394278151441e+01 +316 288 -2.312252367280536e-03 +316 289 -2.532689975072686e-03 +316 290 -2.783725492315673e-03 +316 291 -3.071047067257401e-03 +316 292 -3.401691470521403e-03 +316 293 -3.784439171232928e-03 +316 294 -4.230349322908543e-03 +316 295 -4.753493624956895e-03 +316 296 -5.371977266379821e-03 +316 297 -6.109381318875748e-03 +316 298 -6.996835383339699e-03 +316 299 -8.076052134892611e-03 +316 300 -9.403863770832828e-03 +316 301 -1.105916272470022e-02 +316 302 -1.315380302376542e-02 +316 303 -1.585023865775526e-02 +316 304 -1.939104886145104e-02 +316 305 -2.415034675252896e-02 +316 306 -3.072751892616530e-02 +316 307 -4.012781031912977e-02 +316 308 -5.413421453123171e-02 +316 309 -7.613960933881132e-02 +316 310 -1.132183869282763e-01 +316 311 -1.820810586422651e-01 +316 312 -3.301555353436760e-01 +316 313 -7.412185823610136e-01 +316 314 -3.165206906282863e+00 +316 315 -1.502055215859652e+01 +316 317 -1.502055215858805e+01 +316 318 -3.165206906282873e+00 +316 319 -7.412185823610122e-01 +316 320 -3.301555353436752e-01 +316 321 -1.820810586422643e-01 +316 322 -1.132183869282764e-01 +316 323 -7.613960933881202e-02 +316 324 -5.413421453123171e-02 +316 325 -4.012781031913015e-02 +316 326 -3.072751892616544e-02 +316 327 -2.415034675252906e-02 +316 328 -1.939104886145118e-02 +316 329 -1.585023865775526e-02 +316 330 -1.315380302376550e-02 +316 331 -1.105916272470029e-02 +316 332 -9.403863770832828e-03 +316 333 -8.076052134892578e-03 +316 334 -6.996835383339676e-03 +316 335 -6.109381318875750e-03 +317 317 3.988394278153933e+01 +317 288 -2.117777896667789e-03 +317 289 -2.312252367280536e-03 +317 290 -2.532689975072674e-03 +317 291 -2.783725492315673e-03 +317 292 -3.071047067257394e-03 +317 293 -3.401691470521385e-03 +317 294 -3.784439171232927e-03 +317 295 -4.230349322908520e-03 +317 296 -4.753493624956895e-03 +317 297 -5.371977266379788e-03 +317 298 -6.109381318875751e-03 +317 299 -6.996835383339675e-03 +317 300 -8.076052134892578e-03 +317 301 -9.403863770832827e-03 +317 302 -1.105916272470025e-02 +317 303 -1.315380302376550e-02 +317 304 -1.585023865775526e-02 +317 305 -1.939104886145118e-02 +317 306 -2.415034675252896e-02 +317 307 -3.072751892616544e-02 +317 308 -4.012781031913015e-02 +317 309 -5.413421453123170e-02 +317 310 -7.613960933881156e-02 +317 311 -1.132183869282764e-01 +317 312 -1.820810586422656e-01 +317 313 -3.301555353436786e-01 +317 314 -7.412185823610270e-01 +317 315 -3.165206906282885e+00 +317 316 -1.502055215858805e+01 +317 318 -1.502055215864000e+01 +317 319 -3.165206906282854e+00 +317 320 -7.412185823610158e-01 +317 321 -3.301555353436726e-01 +317 322 -1.820810586422646e-01 +317 323 -1.132183869282767e-01 +317 324 -7.613960933881123e-02 +317 325 -5.413421453123170e-02 +317 326 -4.012781031912976e-02 +317 327 -3.072751892616543e-02 +317 328 -2.415034675252897e-02 +317 329 -1.939104886145104e-02 +317 330 -1.585023865775526e-02 +317 331 -1.315380302376546e-02 +317 332 -1.105916272470022e-02 +317 333 -9.403863770832827e-03 +317 334 -8.076052134892611e-03 +317 335 -6.996835383339699e-03 +318 318 3.988394278164019e+01 +318 288 -1.945462087124853e-03 +318 289 -2.117777896667798e-03 +318 290 -2.312252367280536e-03 +318 291 -2.532689975072686e-03 +318 292 -2.783725492315679e-03 +318 293 -3.071047067257393e-03 +318 294 -3.401691470521402e-03 +318 295 -3.784439171232928e-03 +318 296 -4.230349322908543e-03 +318 297 -4.753493624956895e-03 +318 298 -5.371977266379823e-03 +318 299 -6.109381318875770e-03 +318 300 -6.996835383339674e-03 +318 301 -8.076052134892615e-03 +318 302 -9.403863770832827e-03 +318 303 -1.105916272470029e-02 +318 304 -1.315380302376546e-02 +318 305 -1.585023865775531e-02 +318 306 -1.939104886145111e-02 +318 307 -2.415034675252897e-02 +318 308 -3.072751892616558e-02 +318 309 -4.012781031912997e-02 +318 310 -5.413421453123173e-02 +318 311 -7.613960933881202e-02 +318 312 -1.132183869282767e-01 +318 313 -1.820810586422648e-01 +318 314 -3.301555353436759e-01 +318 315 -7.412185823610239e-01 +318 316 -3.165206906282873e+00 +318 317 -1.502055215864000e+01 +318 319 -1.502055215866000e+01 +318 320 -3.165206906282886e+00 +318 321 -7.412185823610229e-01 +318 322 -3.301555353436771e-01 +318 323 -1.820810586422659e-01 +318 324 -1.132183869282761e-01 +318 325 -7.613960933881155e-02 +318 326 -5.413421453123140e-02 +318 327 -4.012781031912995e-02 +318 328 -3.072751892616543e-02 +318 329 -2.415034675252887e-02 +318 330 -1.939104886145110e-02 +318 331 -1.585023865775526e-02 +318 332 -1.315380302376542e-02 +318 333 -1.105916272470025e-02 +318 334 -9.403863770832806e-03 +318 335 -8.076052134892594e-03 +319 319 3.988394278169700e+01 +319 288 -1.792160480940034e-03 +319 289 -1.945462087124853e-03 +319 290 -2.117777896667789e-03 +319 291 -2.312252367280537e-03 +319 292 -2.532689975072680e-03 +319 293 -2.783725492315666e-03 +319 294 -3.071047067257393e-03 +319 295 -3.401691470521385e-03 +319 296 -3.784439171232927e-03 +319 297 -4.230349322908520e-03 +319 298 -4.753493624956897e-03 +319 299 -5.371977266379807e-03 +319 300 -6.109381318875729e-03 +319 301 -6.996835383339673e-03 +319 302 -8.076052134892575e-03 +319 303 -9.403863770832847e-03 +319 304 -1.105916272470026e-02 +319 305 -1.315380302376550e-02 +319 306 -1.585023865775526e-02 +319 307 -1.939104886145111e-02 +319 308 -2.415034675252907e-02 +319 309 -3.072751892616544e-02 +319 310 -4.012781031912997e-02 +319 311 -5.413421453123203e-02 +319 312 -7.613960933881159e-02 +319 313 -1.132183869282764e-01 +319 314 -1.820810586422653e-01 +319 315 -3.301555353436756e-01 +319 316 -7.412185823610122e-01 +319 317 -3.165206906282854e+00 +319 318 -1.502055215866000e+01 +319 320 -1.502055215931069e+01 +319 321 -3.165206906282865e+00 +319 322 -7.412185823610178e-01 +319 323 -3.301555353436793e-01 +319 324 -1.820810586422659e-01 +319 325 -1.132183869282762e-01 +319 326 -7.613960933881131e-02 +319 327 -5.413421453123170e-02 +319 328 -4.012781031912996e-02 +319 329 -3.072751892616530e-02 +319 330 -2.415034675252896e-02 +319 331 -1.939104886145111e-02 +319 332 -1.585023865775520e-02 +319 333 -1.315380302376546e-02 +319 334 -1.105916272470022e-02 +319 335 -9.403863770832833e-03 +320 320 3.988394278169703e+01 +320 304 -9.403863770832828e-03 +320 305 -1.105916272470029e-02 +320 306 -1.315380302376546e-02 +320 307 -1.585023865775526e-02 +320 308 -1.939104886145118e-02 +320 309 -2.415034675252897e-02 +320 310 -3.072751892616545e-02 +320 311 -4.012781031913015e-02 +320 312 -5.413421453123173e-02 +320 313 -7.613960933881202e-02 +320 314 -1.132183869282767e-01 +320 315 -1.820810586422654e-01 +320 316 -3.301555353436752e-01 +320 317 -7.412185823610158e-01 +320 318 -3.165206906282886e+00 +320 319 -1.502055215931069e+01 +320 321 -1.502055215865999e+01 +320 322 -3.165206906282859e+00 +320 323 -7.412185823610159e-01 +320 324 -3.301555353436764e-01 +320 325 -1.820810586422640e-01 +320 326 -1.132183869282763e-01 +320 327 -7.613960933881156e-02 +320 328 -5.413421453123172e-02 +320 329 -4.012781031912977e-02 +320 330 -3.072751892616544e-02 +320 331 -2.415034675252897e-02 +320 332 -1.939104886145104e-02 +320 333 -1.585023865775525e-02 +320 334 -1.315380302376542e-02 +320 335 -1.105916272470025e-02 +320 336 -9.403863770832820e-03 +320 337 -8.076052134892587e-03 +320 338 -6.996835383339648e-03 +320 339 -6.109381318875748e-03 +320 340 -5.371977266379788e-03 +320 341 -4.753493624956895e-03 +320 342 -4.230349322908531e-03 +320 343 -3.784439171232917e-03 +320 344 -3.401691470521393e-03 +320 345 -3.071047067257385e-03 +320 346 -2.783725492315672e-03 +320 347 -2.532689975072674e-03 +320 348 -2.312252367280536e-03 +320 349 -2.117777896667794e-03 +320 350 -1.945462087124849e-03 +320 351 -1.792160480940038e-03 +321 321 3.988394278164022e+01 +321 304 -8.076052134892590e-03 +321 305 -9.403863770832835e-03 +321 306 -1.105916272470022e-02 +321 307 -1.315380302376542e-02 +321 308 -1.585023865775526e-02 +321 309 -1.939104886145104e-02 +321 310 -2.415034675252887e-02 +321 311 -3.072751892616544e-02 +321 312 -4.012781031912977e-02 +321 313 -5.413421453123171e-02 +321 314 -7.613960933881132e-02 +321 315 -1.132183869282763e-01 +321 316 -1.820810586422643e-01 +321 317 -3.301555353436726e-01 +321 318 -7.412185823610229e-01 +321 319 -3.165206906282865e+00 +321 320 -1.502055215865999e+01 +321 322 -1.502055215864002e+01 +321 323 -3.165206906282895e+00 +321 324 -7.412185823610347e-01 +321 325 -3.301555353436784e-01 +321 326 -1.820810586422653e-01 +321 327 -1.132183869282764e-01 +321 328 -7.613960933881202e-02 +321 329 -5.413421453123171e-02 +321 330 -4.012781031913015e-02 +321 331 -3.072751892616557e-02 +321 332 -2.415034675252896e-02 +321 333 -1.939104886145117e-02 +321 334 -1.585023865775526e-02 +321 335 -1.315380302376550e-02 +321 336 -1.105916272470029e-02 +321 337 -9.403863770832827e-03 +321 338 -8.076052134892577e-03 +321 339 -6.996835383339672e-03 +321 340 -6.109381318875728e-03 +321 341 -5.371977266379805e-03 +321 342 -4.753493624956895e-03 +321 343 -4.230349322908519e-03 +321 344 -3.784439171232927e-03 +321 345 -3.401691470521384e-03 +321 346 -3.071047067257392e-03 +321 347 -2.783725492315666e-03 +321 348 -2.532689975072680e-03 +321 349 -2.312252367280536e-03 +321 350 -2.117777896667789e-03 +321 351 -1.945462087124853e-03 +322 322 3.988394278153937e+01 +322 304 -6.996835383339650e-03 +322 305 -8.076052134892601e-03 +322 306 -9.403863770832827e-03 +322 307 -1.105916272470025e-02 +322 308 -1.315380302376550e-02 +322 309 -1.585023865775526e-02 +322 310 -1.939104886145111e-02 +322 311 -2.415034675252906e-02 +322 312 -3.072751892616544e-02 +322 313 -4.012781031913015e-02 +322 314 -5.413421453123170e-02 +322 315 -7.613960933881156e-02 +322 316 -1.132183869282764e-01 +322 317 -1.820810586422646e-01 +322 318 -3.301555353436771e-01 +322 319 -7.412185823610178e-01 +322 320 -3.165206906282859e+00 +322 321 -1.502055215864002e+01 +322 323 -1.502055215858805e+01 +322 324 -3.165206906282891e+00 +322 325 -7.412185823610185e-01 +322 326 -3.301555353436760e-01 +322 327 -1.820810586422654e-01 +322 328 -1.132183869282767e-01 +322 329 -7.613960933881123e-02 +322 330 -5.413421453123170e-02 +322 331 -4.012781031912996e-02 +322 332 -3.072751892616530e-02 +322 333 -2.415034675252896e-02 +322 334 -1.939104886145104e-02 +322 335 -1.585023865775526e-02 +322 336 -1.315380302376546e-02 +322 337 -1.105916272470022e-02 +322 338 -9.403863770832827e-03 +322 339 -8.076052134892615e-03 +322 340 -6.996835383339673e-03 +322 341 -6.109381318875770e-03 +322 342 -5.371977266379823e-03 +322 343 -4.753493624956895e-03 +322 344 -4.230349322908543e-03 +322 345 -3.784439171232927e-03 +322 346 -3.401691470521402e-03 +322 347 -3.071047067257393e-03 +322 348 -2.783725492315679e-03 +322 349 -2.532689975072686e-03 +322 350 -2.312252367280536e-03 +322 351 -2.117777896667798e-03 +323 323 3.988394278151446e+01 +323 304 -6.109381318875748e-03 +323 305 -6.996835383339699e-03 +323 306 -8.076052134892618e-03 +323 307 -9.403863770832827e-03 +323 308 -1.105916272470029e-02 +323 309 -1.315380302376546e-02 +323 310 -1.585023865775526e-02 +323 311 -1.939104886145118e-02 +323 312 -2.415034675252897e-02 +323 313 -3.072751892616557e-02 +323 314 -4.012781031912996e-02 +323 315 -5.413421453123172e-02 +323 316 -7.613960933881202e-02 +323 317 -1.132183869282767e-01 +323 318 -1.820810586422659e-01 +323 319 -3.301555353436793e-01 +323 320 -7.412185823610159e-01 +323 321 -3.165206906282895e+00 +323 322 -1.502055215858805e+01 +323 324 -1.502055215859657e+01 +323 325 -3.165206906282853e+00 +323 326 -7.412185823610069e-01 +323 327 -3.301555353436724e-01 +323 328 -1.820810586422649e-01 +323 329 -1.132183869282761e-01 +323 330 -7.613960933881156e-02 +323 331 -5.413421453123172e-02 +323 332 -4.012781031912977e-02 +323 333 -3.072751892616544e-02 +323 334 -2.415034675252887e-02 +323 335 -1.939104886145111e-02 +323 336 -1.585023865775526e-02 +323 337 -1.315380302376542e-02 +323 338 -1.105916272470025e-02 +323 339 -9.403863770832827e-03 +323 340 -8.076052134892568e-03 +323 341 -6.996835383339676e-03 +323 342 -6.109381318875750e-03 +323 343 -5.371977266379788e-03 +323 344 -4.753493624956895e-03 +323 345 -4.230349322908520e-03 +323 346 -3.784439171232928e-03 +323 347 -3.401691470521385e-03 +323 348 -3.071047067257394e-03 +323 349 -2.783725492315673e-03 +323 350 -2.532689975072674e-03 +323 351 -2.312252367280536e-03 +324 324 3.988394278151357e+01 +324 304 -5.371977266379788e-03 +324 305 -6.109381318875751e-03 +324 306 -6.996835383339675e-03 +324 307 -8.076052134892568e-03 +324 308 -9.403863770832828e-03 +324 309 -1.105916272470022e-02 +324 310 -1.315380302376542e-02 +324 311 -1.585023865775526e-02 +324 312 -1.939104886145104e-02 +324 313 -2.415034675252896e-02 +324 314 -3.072751892616530e-02 +324 315 -4.012781031912977e-02 +324 316 -5.413421453123171e-02 +324 317 -7.613960933881123e-02 +324 318 -1.132183869282761e-01 +324 319 -1.820810586422659e-01 +324 320 -3.301555353436764e-01 +324 321 -7.412185823610347e-01 +324 322 -3.165206906282891e+00 +324 323 -1.502055215859657e+01 +324 325 -1.502055215859217e+01 +324 326 -3.165206906282851e+00 +324 327 -7.412185823610161e-01 +324 328 -3.301555353436781e-01 +324 329 -1.820810586422651e-01 +324 330 -1.132183869282764e-01 +324 331 -7.613960933881200e-02 +324 332 -5.413421453123171e-02 +324 333 -4.012781031913015e-02 +324 334 -3.072751892616544e-02 +324 335 -2.415034675252906e-02 +324 336 -1.939104886145118e-02 +324 337 -1.585023865775526e-02 +324 338 -1.315380302376550e-02 +324 339 -1.105916272470029e-02 +324 340 -9.403863770832835e-03 +324 341 -8.076052134892622e-03 +324 342 -6.996835383339699e-03 +324 343 -6.109381318875749e-03 +324 344 -5.371977266379821e-03 +324 345 -4.753493624956895e-03 +324 346 -4.230349322908543e-03 +324 347 -3.784439171232927e-03 +324 348 -3.401691470521403e-03 +324 349 -3.071047067257401e-03 +324 350 -2.783725492315672e-03 +324 351 -2.532689975072686e-03 +325 325 3.988394278152494e+01 +325 304 -4.753493624956895e-03 +325 305 -5.371977266379823e-03 +325 306 -6.109381318875770e-03 +325 307 -6.996835383339674e-03 +325 308 -8.076052134892622e-03 +325 309 -9.403863770832825e-03 +325 310 -1.105916272470025e-02 +325 311 -1.315380302376550e-02 +325 312 -1.585023865775526e-02 +325 313 -1.939104886145117e-02 +325 314 -2.415034675252896e-02 +325 315 -3.072751892616544e-02 +325 316 -4.012781031913015e-02 +325 317 -5.413421453123170e-02 +325 318 -7.613960933881155e-02 +325 319 -1.132183869282762e-01 +325 320 -1.820810586422640e-01 +325 321 -3.301555353436784e-01 +325 322 -7.412185823610185e-01 +325 323 -3.165206906282853e+00 +325 324 -1.502055215859217e+01 +325 326 -1.502055215860533e+01 +325 327 -3.165206906282883e+00 +325 328 -7.412185823610277e-01 +325 329 -3.301555353436796e-01 +325 330 -1.820810586422661e-01 +325 331 -1.132183869282770e-01 +325 332 -7.613960933881134e-02 +325 333 -5.413421453123172e-02 +325 334 -4.012781031912977e-02 +325 335 -3.072751892616544e-02 +325 336 -2.415034675252897e-02 +325 337 -1.939104886145104e-02 +325 338 -1.585023865775526e-02 +325 339 -1.315380302376546e-02 +325 340 -1.105916272470024e-02 +325 341 -9.403863770832828e-03 +325 342 -8.076052134892590e-03 +325 343 -6.996835383339650e-03 +325 344 -6.109381318875748e-03 +325 345 -5.371977266379788e-03 +325 346 -4.753493624956895e-03 +325 347 -4.230349322908520e-03 +325 348 -3.784439171232928e-03 +325 349 -3.401691470521394e-03 +325 350 -3.071047067257386e-03 +325 351 -2.783725492315673e-03 +326 326 3.988394278128568e+01 +326 304 -4.230349322908520e-03 +326 305 -4.753493624956897e-03 +326 306 -5.371977266379807e-03 +326 307 -6.109381318875729e-03 +326 308 -6.996835383339673e-03 +326 309 -8.076052134892568e-03 +326 310 -9.403863770832807e-03 +326 311 -1.105916272470025e-02 +326 312 -1.315380302376542e-02 +326 313 -1.585023865775526e-02 +326 314 -1.939104886145104e-02 +326 315 -2.415034675252887e-02 +326 316 -3.072751892616544e-02 +326 317 -4.012781031912976e-02 +326 318 -5.413421453123140e-02 +326 319 -7.613960933881131e-02 +326 320 -1.132183869282763e-01 +326 321 -1.820810586422653e-01 +326 322 -3.301555353436760e-01 +326 323 -7.412185823610069e-01 +326 324 -3.165206906282851e+00 +326 325 -1.502055215860533e+01 +326 327 -1.502055215840050e+01 +326 328 -3.165206906282884e+00 +326 329 -7.412185823610243e-01 +326 330 -3.301555353436771e-01 +326 331 -1.820810586422655e-01 +326 332 -1.132183869282762e-01 +326 333 -7.613960933881200e-02 +326 334 -5.413421453123171e-02 +326 335 -4.012781031913015e-02 +326 336 -3.072751892616557e-02 +326 337 -2.415034675252896e-02 +326 338 -1.939104886145118e-02 +326 339 -1.585023865775531e-02 +326 340 -1.315380302376548e-02 +326 341 -1.105916272470029e-02 +326 342 -9.403863770832835e-03 +326 343 -8.076052134892599e-03 +326 344 -6.996835383339698e-03 +326 345 -6.109381318875749e-03 +326 346 -5.371977266379821e-03 +326 347 -4.753493624956895e-03 +326 348 -4.230349322908545e-03 +326 349 -3.784439171232938e-03 +326 350 -3.401691470521394e-03 +326 351 -3.071047067257401e-03 +327 327 3.988394278105619e+01 +327 304 -3.784439171232928e-03 +327 305 -4.230349322908545e-03 +327 306 -4.753493624956911e-03 +327 307 -5.371977266379807e-03 +327 308 -6.109381318875770e-03 +327 309 -6.996835383339676e-03 +327 310 -8.076052134892616e-03 +327 311 -9.403863770832847e-03 +327 312 -1.105916272470025e-02 +327 313 -1.315380302376550e-02 +327 314 -1.585023865775526e-02 +327 315 -1.939104886145111e-02 +327 316 -2.415034675252906e-02 +327 317 -3.072751892616543e-02 +327 318 -4.012781031912995e-02 +327 319 -5.413421453123170e-02 +327 320 -7.613960933881156e-02 +327 321 -1.132183869282764e-01 +327 322 -1.820810586422654e-01 +327 323 -3.301555353436724e-01 +327 324 -7.412185823610161e-01 +327 325 -3.165206906282883e+00 +327 326 -1.502055215840050e+01 +327 328 -1.502055215835491e+01 +327 329 -3.165206906282881e+00 +327 330 -7.412185823610210e-01 +327 331 -3.301555353436775e-01 +327 332 -1.820810586422650e-01 +327 333 -1.132183869282767e-01 +327 334 -7.613960933881123e-02 +327 335 -5.413421453123170e-02 +327 336 -4.012781031912996e-02 +327 337 -3.072751892616530e-02 +327 338 -2.415034675252896e-02 +327 339 -1.939104886145111e-02 +327 340 -1.585023865775523e-02 +327 341 -1.315380302376546e-02 +327 342 -1.105916272470022e-02 +327 343 -9.403863770832818e-03 +327 344 -8.076052134892594e-03 +327 345 -6.996835383339648e-03 +327 346 -6.109381318875748e-03 +327 347 -5.371977266379788e-03 +327 348 -4.753493624956895e-03 +327 349 -4.230349322908531e-03 +327 350 -3.784439171232917e-03 +327 351 -3.401691470521393e-03 +328 328 3.988394278102307e+01 +328 304 -3.401691470521394e-03 +328 305 -3.784439171232939e-03 +328 306 -4.230349322908545e-03 +328 307 -4.753493624956896e-03 +328 308 -5.371977266379823e-03 +328 309 -6.109381318875750e-03 +328 310 -6.996835383339699e-03 +328 311 -8.076052134892601e-03 +328 312 -9.403863770832835e-03 +328 313 -1.105916272470029e-02 +328 314 -1.315380302376546e-02 +328 315 -1.585023865775526e-02 +328 316 -1.939104886145118e-02 +328 317 -2.415034675252897e-02 +328 318 -3.072751892616543e-02 +328 319 -4.012781031912996e-02 +328 320 -5.413421453123172e-02 +328 321 -7.613960933881202e-02 +328 322 -1.132183869282767e-01 +328 323 -1.820810586422649e-01 +328 324 -3.301555353436781e-01 +328 325 -7.412185823610277e-01 +328 326 -3.165206906282884e+00 +328 327 -1.502055215835491e+01 +328 329 -1.502055215836221e+01 +328 330 -3.165206906282862e+00 +328 331 -7.412185823610187e-01 +328 332 -3.301555353436756e-01 +328 333 -1.820810586422649e-01 +328 334 -1.132183869282761e-01 +328 335 -7.613960933881156e-02 +328 336 -5.413421453123172e-02 +328 337 -4.012781031912977e-02 +328 338 -3.072751892616544e-02 +328 339 -2.415034675252897e-02 +328 340 -1.939104886145107e-02 +328 341 -1.585023865775526e-02 +328 342 -1.315380302376542e-02 +328 343 -1.105916272470025e-02 +328 344 -9.403863770832827e-03 +328 345 -8.076052134892566e-03 +328 346 -6.996835383339672e-03 +328 347 -6.109381318875728e-03 +328 348 -5.371977266379805e-03 +328 349 -4.753493624956895e-03 +328 350 -4.230349322908519e-03 +328 351 -3.784439171232927e-03 +329 329 3.988394278106475e+01 +329 304 -3.071047067257386e-03 +329 305 -3.401691470521394e-03 +329 306 -3.784439171232928e-03 +329 307 -4.230349322908520e-03 +329 308 -4.753493624956895e-03 +329 309 -5.371977266379788e-03 +329 310 -6.109381318875749e-03 +329 311 -6.996835383339650e-03 +329 312 -8.076052134892590e-03 +329 313 -9.403863770832830e-03 +329 314 -1.105916272470022e-02 +329 315 -1.315380302376542e-02 +329 316 -1.585023865775526e-02 +329 317 -1.939104886145104e-02 +329 318 -2.415034675252887e-02 +329 319 -3.072751892616530e-02 +329 320 -4.012781031912977e-02 +329 321 -5.413421453123171e-02 +329 322 -7.613960933881123e-02 +329 323 -1.132183869282761e-01 +329 324 -1.820810586422651e-01 +329 325 -3.301555353436796e-01 +329 326 -7.412185823610243e-01 +329 327 -3.165206906282881e+00 +329 328 -1.502055215836221e+01 +329 330 -1.502055215839540e+01 +329 331 -3.165206906282859e+00 +329 332 -7.412185823610192e-01 +329 333 -3.301555353436736e-01 +329 334 -1.820810586422652e-01 +329 335 -1.132183869282764e-01 +329 336 -7.613960933881200e-02 +329 337 -5.413421453123171e-02 +329 338 -4.012781031913015e-02 +329 339 -3.072751892616557e-02 +329 340 -2.415034675252901e-02 +329 341 -1.939104886145118e-02 +329 342 -1.585023865775526e-02 +329 343 -1.315380302376550e-02 +329 344 -1.105916272470029e-02 +329 345 -9.403863770832828e-03 +329 346 -8.076052134892622e-03 +329 347 -6.996835383339673e-03 +329 348 -6.109381318875770e-03 +329 349 -5.371977266379823e-03 +329 350 -4.753493624956895e-03 +329 351 -4.230349322908543e-03 +330 330 3.988394278115151e+01 +330 304 -2.783725492315673e-03 +330 305 -3.071047067257401e-03 +330 306 -3.401691470521403e-03 +330 307 -3.784439171232928e-03 +330 308 -4.230349322908543e-03 +330 309 -4.753493624956895e-03 +330 310 -5.371977266379821e-03 +330 311 -6.109381318875748e-03 +330 312 -6.996835383339699e-03 +330 313 -8.076052134892622e-03 +330 314 -9.403863770832825e-03 +330 315 -1.105916272470025e-02 +330 316 -1.315380302376550e-02 +330 317 -1.585023865775526e-02 +330 318 -1.939104886145110e-02 +330 319 -2.415034675252896e-02 +330 320 -3.072751892616544e-02 +330 321 -4.012781031913015e-02 +330 322 -5.413421453123170e-02 +330 323 -7.613960933881156e-02 +330 324 -1.132183869282764e-01 +330 325 -1.820810586422661e-01 +330 326 -3.301555353436771e-01 +330 327 -7.412185823610210e-01 +330 328 -3.165206906282862e+00 +330 329 -1.502055215839540e+01 +330 331 -1.502055215844906e+01 +330 332 -3.165206906282869e+00 +330 333 -7.412185823610136e-01 +330 334 -3.301555353436749e-01 +330 335 -1.820810586422647e-01 +330 336 -1.132183869282770e-01 +330 337 -7.613960933881132e-02 +330 338 -5.413421453123170e-02 +330 339 -4.012781031912996e-02 +330 340 -3.072751892616537e-02 +330 341 -2.415034675252897e-02 +330 342 -1.939104886145104e-02 +330 343 -1.585023865775526e-02 +330 344 -1.315380302376546e-02 +330 345 -1.105916272470022e-02 +330 346 -9.403863770832825e-03 +330 347 -8.076052134892573e-03 +330 348 -6.996835383339676e-03 +330 349 -6.109381318875750e-03 +330 350 -5.371977266379788e-03 +330 351 -4.753493624956895e-03 +331 331 3.988394278128111e+01 +331 304 -2.532689975072674e-03 +331 305 -2.783725492315673e-03 +331 306 -3.071047067257394e-03 +331 307 -3.401691470521385e-03 +331 308 -3.784439171232927e-03 +331 309 -4.230349322908520e-03 +331 310 -4.753493624956895e-03 +331 311 -5.371977266379788e-03 +331 312 -6.109381318875751e-03 +331 313 -6.996835383339675e-03 +331 314 -8.076052134892573e-03 +331 315 -9.403863770832828e-03 +331 316 -1.105916272470029e-02 +331 317 -1.315380302376546e-02 +331 318 -1.585023865775526e-02 +331 319 -1.939104886145111e-02 +331 320 -2.415034675252897e-02 +331 321 -3.072751892616557e-02 +331 322 -4.012781031912996e-02 +331 323 -5.413421453123172e-02 +331 324 -7.613960933881200e-02 +331 325 -1.132183869282770e-01 +331 326 -1.820810586422655e-01 +331 327 -3.301555353436775e-01 +331 328 -7.412185823610187e-01 +331 329 -3.165206906282859e+00 +331 330 -1.502055215844906e+01 +331 332 -1.502055215852574e+01 +331 333 -3.165206906282866e+00 +331 334 -7.412185823610191e-01 +331 335 -3.301555353436754e-01 +331 336 -1.820810586422651e-01 +331 337 -1.132183869282761e-01 +331 338 -7.613960933881167e-02 +331 339 -5.413421453123172e-02 +331 340 -4.012781031912987e-02 +331 341 -3.072751892616545e-02 +331 342 -2.415034675252887e-02 +331 343 -1.939104886145111e-02 +331 344 -1.585023865775526e-02 +331 345 -1.315380302376542e-02 +331 346 -1.105916272470025e-02 +331 347 -9.403863770832828e-03 +331 348 -8.076052134892618e-03 +331 349 -6.996835383339699e-03 +331 350 -6.109381318875749e-03 +331 351 -5.371977266379821e-03 +332 332 3.988394278146370e+01 +332 304 -2.312252367280536e-03 +332 305 -2.532689975072686e-03 +332 306 -2.783725492315679e-03 +332 307 -3.071047067257393e-03 +332 308 -3.401691470521402e-03 +332 309 -3.784439171232928e-03 +332 310 -4.230349322908543e-03 +332 311 -4.753493624956895e-03 +332 312 -5.371977266379823e-03 +332 313 -6.109381318875770e-03 +332 314 -6.996835383339674e-03 +332 315 -8.076052134892609e-03 +332 316 -9.403863770832828e-03 +332 317 -1.105916272470022e-02 +332 318 -1.315380302376542e-02 +332 319 -1.585023865775520e-02 +332 320 -1.939104886145104e-02 +332 321 -2.415034675252896e-02 +332 322 -3.072751892616530e-02 +332 323 -4.012781031912977e-02 +332 324 -5.413421453123171e-02 +332 325 -7.613960933881134e-02 +332 326 -1.132183869282762e-01 +332 327 -1.820810586422650e-01 +332 328 -3.301555353436756e-01 +332 329 -7.412185823610192e-01 +332 330 -3.165206906282869e+00 +332 331 -1.502055215852574e+01 +332 333 -1.502055215863299e+01 +332 334 -3.165206906282878e+00 +332 335 -7.412185823610244e-01 +332 336 -3.301555353436770e-01 +332 337 -1.820810586422655e-01 +332 338 -1.132183869282768e-01 +332 339 -7.613960933881189e-02 +332 340 -5.413421453123186e-02 +332 341 -4.012781031913015e-02 +332 342 -3.072751892616544e-02 +332 343 -2.415034675252906e-02 +332 344 -1.939104886145118e-02 +332 345 -1.585023865775526e-02 +332 346 -1.315380302376550e-02 +332 347 -1.105916272470029e-02 +332 348 -9.403863770832849e-03 +332 349 -8.076052134892601e-03 +332 350 -6.996835383339650e-03 +332 351 -6.109381318875748e-03 +333 333 3.988394278171953e+01 +333 304 -2.117777896667789e-03 +333 305 -2.312252367280537e-03 +333 306 -2.532689975072680e-03 +333 307 -2.783725492315666e-03 +333 308 -3.071047067257393e-03 +333 309 -3.401691470521385e-03 +333 310 -3.784439171232927e-03 +333 311 -4.230349322908520e-03 +333 312 -4.753493624956897e-03 +333 313 -5.371977266379807e-03 +333 314 -6.109381318875729e-03 +333 315 -6.996835383339673e-03 +333 316 -8.076052134892578e-03 +333 317 -9.403863770832827e-03 +333 318 -1.105916272470025e-02 +333 319 -1.315380302376546e-02 +333 320 -1.585023865775525e-02 +333 321 -1.939104886145117e-02 +333 322 -2.415034675252896e-02 +333 323 -3.072751892616544e-02 +333 324 -4.012781031913015e-02 +333 325 -5.413421453123172e-02 +333 326 -7.613960933881200e-02 +333 327 -1.132183869282767e-01 +333 328 -1.820810586422649e-01 +333 329 -3.301555353436736e-01 +333 330 -7.412185823610136e-01 +333 331 -3.165206906282866e+00 +333 332 -1.502055215863299e+01 +333 334 -1.502055215878376e+01 +333 335 -3.165206906282879e+00 +333 336 -7.412185823610209e-01 +333 337 -3.301555353436765e-01 +333 338 -1.820810586422649e-01 +333 339 -1.132183869282762e-01 +333 340 -7.613960933881149e-02 +333 341 -5.413421453123173e-02 +333 342 -4.012781031912977e-02 +333 343 -3.072751892616544e-02 +333 344 -2.415034675252897e-02 +333 345 -1.939104886145104e-02 +333 346 -1.585023865775526e-02 +333 347 -1.315380302376546e-02 +333 348 -1.105916272470026e-02 +333 349 -9.403863770832835e-03 +333 350 -8.076052134892589e-03 +333 351 -6.996835383339698e-03 +334 334 3.988394278208169e+01 +334 304 -1.945462087124853e-03 +334 305 -2.117777896667799e-03 +334 306 -2.312252367280542e-03 +334 307 -2.532689975072680e-03 +334 308 -2.783725492315679e-03 +334 309 -3.071047067257394e-03 +334 310 -3.401691470521403e-03 +334 311 -3.784439171232928e-03 +334 312 -4.230349322908545e-03 +334 313 -4.753493624956911e-03 +334 314 -5.371977266379807e-03 +334 315 -6.109381318875770e-03 +334 316 -6.996835383339676e-03 +334 317 -8.076052134892611e-03 +334 318 -9.403863770832806e-03 +334 319 -1.105916272470022e-02 +334 320 -1.315380302376542e-02 +334 321 -1.585023865775526e-02 +334 322 -1.939104886145104e-02 +334 323 -2.415034675252887e-02 +334 324 -3.072751892616544e-02 +334 325 -4.012781031912977e-02 +334 326 -5.413421453123171e-02 +334 327 -7.613960933881123e-02 +334 328 -1.132183869282761e-01 +334 329 -1.820810586422652e-01 +334 330 -3.301555353436749e-01 +334 331 -7.412185823610191e-01 +334 332 -3.165206906282878e+00 +334 333 -1.502055215878376e+01 +334 335 -1.502055215899860e+01 +334 336 -3.165206906282857e+00 +334 337 -7.412185823610109e-01 +334 338 -3.301555353436735e-01 +334 339 -1.820810586422651e-01 +334 340 -1.132183869282764e-01 +334 341 -7.613960933881200e-02 +334 342 -5.413421453123171e-02 +334 343 -4.012781031913015e-02 +334 344 -3.072751892616557e-02 +334 345 -2.415034675252896e-02 +334 346 -1.939104886145118e-02 +334 347 -1.585023865775531e-02 +334 348 -1.315380302376550e-02 +334 349 -1.105916272470029e-02 +334 350 -9.403863770832820e-03 +334 351 -8.076052134892599e-03 +335 335 3.988394278260305e+01 +335 304 -1.792160480940039e-03 +335 305 -1.945462087124858e-03 +335 306 -2.117777896667799e-03 +335 307 -2.312252367280537e-03 +335 308 -2.532689975072686e-03 +335 309 -2.783725492315673e-03 +335 310 -3.071047067257401e-03 +335 311 -3.401691470521394e-03 +335 312 -3.784439171232939e-03 +335 313 -4.230349322908545e-03 +335 314 -4.753493624956896e-03 +335 315 -5.371977266379823e-03 +335 316 -6.109381318875750e-03 +335 317 -6.996835383339699e-03 +335 318 -8.076052134892594e-03 +335 319 -9.403863770832833e-03 +335 320 -1.105916272470025e-02 +335 321 -1.315380302376550e-02 +335 322 -1.585023865775526e-02 +335 323 -1.939104886145111e-02 +335 324 -2.415034675252906e-02 +335 325 -3.072751892616544e-02 +335 326 -4.012781031913015e-02 +335 327 -5.413421453123170e-02 +335 328 -7.613960933881156e-02 +335 329 -1.132183869282764e-01 +335 330 -1.820810586422647e-01 +335 331 -3.301555353436754e-01 +335 332 -7.412185823610244e-01 +335 333 -3.165206906282879e+00 +335 334 -1.502055215899860e+01 +335 336 -1.502055215931064e+01 +335 337 -3.165206906282877e+00 +335 338 -7.412185823610218e-01 +335 339 -3.301555353436768e-01 +335 340 -1.820810586422651e-01 +335 341 -1.132183869282770e-01 +335 342 -7.613960933881132e-02 +335 343 -5.413421453123170e-02 +335 344 -4.012781031912996e-02 +335 345 -3.072751892616530e-02 +335 346 -2.415034675252896e-02 +335 347 -1.939104886145111e-02 +335 348 -1.585023865775526e-02 +335 349 -1.315380302376546e-02 +335 350 -1.105916272470022e-02 +335 351 -9.403863770832825e-03 +336 336 3.988394278260306e+01 +336 320 -9.403863770832820e-03 +336 321 -1.105916272470029e-02 +336 322 -1.315380302376546e-02 +336 323 -1.585023865775526e-02 +336 324 -1.939104886145118e-02 +336 325 -2.415034675252897e-02 +336 326 -3.072751892616557e-02 +336 327 -4.012781031912996e-02 +336 328 -5.413421453123172e-02 +336 329 -7.613960933881200e-02 +336 330 -1.132183869282770e-01 +336 331 -1.820810586422651e-01 +336 332 -3.301555353436770e-01 +336 333 -7.412185823610209e-01 +336 334 -3.165206906282857e+00 +336 335 -1.502055215931064e+01 +336 337 -1.502055215899863e+01 +336 338 -3.165206906282884e+00 +336 339 -7.412185823610187e-01 +336 340 -3.301555353436752e-01 +336 341 -1.820810586422647e-01 +336 342 -1.132183869282761e-01 +336 343 -7.613960933881167e-02 +336 344 -5.413421453123172e-02 +336 345 -4.012781031912977e-02 +336 346 -3.072751892616544e-02 +336 347 -2.415034675252897e-02 +336 348 -1.939104886145111e-02 +336 349 -1.585023865775526e-02 +336 350 -1.315380302376542e-02 +336 351 -1.105916272470025e-02 +336 352 -9.403863770832828e-03 +336 353 -8.076052134892609e-03 +336 354 -6.996835383339673e-03 +336 355 -6.109381318875770e-03 +336 356 -5.371977266379823e-03 +336 357 -4.753493624956895e-03 +336 358 -4.230349322908543e-03 +336 359 -3.784439171232927e-03 +336 360 -3.401691470521402e-03 +336 361 -3.071047067257393e-03 +336 362 -2.783725492315679e-03 +336 363 -2.532689975072686e-03 +336 364 -2.312252367280536e-03 +336 365 -2.117777896667798e-03 +336 366 -1.945462087124853e-03 +336 367 -1.792160480940042e-03 +337 337 3.988394278208169e+01 +337 320 -8.076052134892587e-03 +337 321 -9.403863770832827e-03 +337 322 -1.105916272470022e-02 +337 323 -1.315380302376542e-02 +337 324 -1.585023865775526e-02 +337 325 -1.939104886145104e-02 +337 326 -2.415034675252896e-02 +337 327 -3.072751892616530e-02 +337 328 -4.012781031912977e-02 +337 329 -5.413421453123171e-02 +337 330 -7.613960933881132e-02 +337 331 -1.132183869282761e-01 +337 332 -1.820810586422655e-01 +337 333 -3.301555353436765e-01 +337 334 -7.412185823610109e-01 +337 335 -3.165206906282877e+00 +337 336 -1.502055215899863e+01 +337 338 -1.502055215878375e+01 +337 339 -3.165206906282857e+00 +337 340 -7.412185823610095e-01 +337 341 -3.301555353436764e-01 +337 342 -1.820810586422658e-01 +337 343 -1.132183869282768e-01 +337 344 -7.613960933881189e-02 +337 345 -5.413421453123171e-02 +337 346 -4.012781031913015e-02 +337 347 -3.072751892616558e-02 +337 348 -2.415034675252907e-02 +337 349 -1.939104886145118e-02 +337 350 -1.585023865775526e-02 +337 351 -1.315380302376550e-02 +337 352 -1.105916272470029e-02 +337 353 -9.403863770832828e-03 +337 354 -8.076052134892578e-03 +337 355 -6.996835383339676e-03 +337 356 -6.109381318875750e-03 +337 357 -5.371977266379788e-03 +337 358 -4.753493624956895e-03 +337 359 -4.230349322908520e-03 +337 360 -3.784439171232928e-03 +337 361 -3.401691470521385e-03 +337 362 -3.071047067257394e-03 +337 363 -2.783725492315673e-03 +337 364 -2.532689975072674e-03 +337 365 -2.312252367280536e-03 +337 366 -2.117777896667789e-03 +337 367 -1.945462087124853e-03 +338 338 3.988394278171953e+01 +338 320 -6.996835383339648e-03 +338 321 -8.076052134892577e-03 +338 322 -9.403863770832827e-03 +338 323 -1.105916272470025e-02 +338 324 -1.315380302376550e-02 +338 325 -1.585023865775526e-02 +338 326 -1.939104886145118e-02 +338 327 -2.415034675252896e-02 +338 328 -3.072751892616544e-02 +338 329 -4.012781031913015e-02 +338 330 -5.413421453123170e-02 +338 331 -7.613960933881167e-02 +338 332 -1.132183869282768e-01 +338 333 -1.820810586422649e-01 +338 334 -3.301555353436735e-01 +338 335 -7.412185823610218e-01 +338 336 -3.165206906282884e+00 +338 337 -1.502055215878375e+01 +338 339 -1.502055215863300e+01 +338 340 -3.165206906282856e+00 +338 341 -7.412185823610195e-01 +338 342 -3.301555353436767e-01 +338 343 -1.820810586422651e-01 +338 344 -1.132183869282762e-01 +338 345 -7.613960933881123e-02 +338 346 -5.413421453123170e-02 +338 347 -4.012781031912997e-02 +338 348 -3.072751892616544e-02 +338 349 -2.415034675252897e-02 +338 350 -1.939104886145104e-02 +338 351 -1.585023865775526e-02 +338 352 -1.315380302376546e-02 +338 353 -1.105916272470022e-02 +338 354 -9.403863770832827e-03 +338 355 -8.076052134892611e-03 +338 356 -6.996835383339699e-03 +338 357 -6.109381318875749e-03 +338 358 -5.371977266379821e-03 +338 359 -4.753493624956895e-03 +338 360 -4.230349322908543e-03 +338 361 -3.784439171232927e-03 +338 362 -3.401691470521403e-03 +338 363 -3.071047067257401e-03 +338 364 -2.783725492315672e-03 +338 365 -2.532689975072686e-03 +338 366 -2.312252367280536e-03 +338 367 -2.117777896667798e-03 +339 339 3.988394278146370e+01 +339 320 -6.109381318875748e-03 +339 321 -6.996835383339672e-03 +339 322 -8.076052134892615e-03 +339 323 -9.403863770832827e-03 +339 324 -1.105916272470029e-02 +339 325 -1.315380302376546e-02 +339 326 -1.585023865775531e-02 +339 327 -1.939104886145111e-02 +339 328 -2.415034675252897e-02 +339 329 -3.072751892616557e-02 +339 330 -4.012781031912996e-02 +339 331 -5.413421453123172e-02 +339 332 -7.613960933881189e-02 +339 333 -1.132183869282762e-01 +339 334 -1.820810586422651e-01 +339 335 -3.301555353436768e-01 +339 336 -7.412185823610187e-01 +339 337 -3.165206906282857e+00 +339 338 -1.502055215863300e+01 +339 340 -1.502055215852576e+01 +339 341 -3.165206906282874e+00 +339 342 -7.412185823610228e-01 +339 343 -3.301555353436774e-01 +339 344 -1.820810586422651e-01 +339 345 -1.132183869282760e-01 +339 346 -7.613960933881166e-02 +339 347 -5.413421453123173e-02 +339 348 -4.012781031912997e-02 +339 349 -3.072751892616545e-02 +339 350 -2.415034675252887e-02 +339 351 -1.939104886145111e-02 +339 352 -1.585023865775526e-02 +339 353 -1.315380302376542e-02 +339 354 -1.105916272470025e-02 +339 355 -9.403863770832807e-03 +339 356 -8.076052134892594e-03 +339 357 -6.996835383339650e-03 +339 358 -6.109381318875748e-03 +339 359 -5.371977266379788e-03 +339 360 -4.753493624956895e-03 +339 361 -4.230349322908520e-03 +339 362 -3.784439171232928e-03 +339 363 -3.401691470521394e-03 +339 364 -3.071047067257386e-03 +339 365 -2.783725492315673e-03 +339 366 -2.532689975072674e-03 +339 367 -2.312252367280536e-03 +340 340 3.988394278128114e+01 +340 320 -5.371977266379788e-03 +340 321 -6.109381318875728e-03 +340 322 -6.996835383339673e-03 +340 323 -8.076052134892568e-03 +340 324 -9.403863770832835e-03 +340 325 -1.105916272470024e-02 +340 326 -1.315380302376548e-02 +340 327 -1.585023865775523e-02 +340 328 -1.939104886145107e-02 +340 329 -2.415034675252901e-02 +340 330 -3.072751892616537e-02 +340 331 -4.012781031912987e-02 +340 332 -5.413421453123186e-02 +340 333 -7.613960933881149e-02 +340 334 -1.132183869282764e-01 +340 335 -1.820810586422651e-01 +340 336 -3.301555353436752e-01 +340 337 -7.412185823610095e-01 +340 338 -3.165206906282856e+00 +340 339 -1.502055215852576e+01 +340 341 -1.502055215844907e+01 +340 342 -3.165206906282880e+00 +340 343 -7.412185823610252e-01 +340 344 -3.301555353436764e-01 +340 345 -1.820810586422656e-01 +340 346 -1.132183869282771e-01 +340 347 -7.613960933881191e-02 +340 348 -5.413421453123187e-02 +340 349 -4.012781031913006e-02 +340 350 -3.072751892616537e-02 +340 351 -2.415034675252901e-02 +340 352 -1.939104886145114e-02 +340 353 -1.585023865775523e-02 +340 354 -1.315380302376548e-02 +340 355 -1.105916272470023e-02 +340 356 -9.403863770832840e-03 +340 357 -8.076052134892594e-03 +340 358 -6.996835383339698e-03 +340 359 -6.109381318875749e-03 +340 360 -5.371977266379821e-03 +340 361 -4.753493624956895e-03 +340 362 -4.230349322908545e-03 +340 363 -3.784439171232938e-03 +340 364 -3.401691470521394e-03 +340 365 -3.071047067257401e-03 +340 366 -2.783725492315672e-03 +340 367 -2.532689975072686e-03 +341 341 3.988394278115154e+01 +341 320 -4.753493624956895e-03 +341 321 -5.371977266379805e-03 +341 322 -6.109381318875770e-03 +341 323 -6.996835383339676e-03 +341 324 -8.076052134892622e-03 +341 325 -9.403863770832828e-03 +341 326 -1.105916272470029e-02 +341 327 -1.315380302376546e-02 +341 328 -1.585023865775526e-02 +341 329 -1.939104886145118e-02 +341 330 -2.415034675252897e-02 +341 331 -3.072751892616545e-02 +341 332 -4.012781031913015e-02 +341 333 -5.413421453123173e-02 +341 334 -7.613960933881200e-02 +341 335 -1.132183869282770e-01 +341 336 -1.820810586422647e-01 +341 337 -3.301555353436764e-01 +341 338 -7.412185823610195e-01 +341 339 -3.165206906282874e+00 +341 340 -1.502055215844907e+01 +341 342 -1.502055215839539e+01 +341 343 -3.165206906282887e+00 +341 344 -7.412185823610238e-01 +341 345 -3.301555353436768e-01 +341 346 -1.820810586422651e-01 +341 347 -1.132183869282762e-01 +341 348 -7.613960933881168e-02 +341 349 -5.413421453123172e-02 +341 350 -4.012781031912977e-02 +341 351 -3.072751892616544e-02 +341 352 -2.415034675252897e-02 +341 353 -1.939104886145104e-02 +341 354 -1.585023865775525e-02 +341 355 -1.315380302376542e-02 +341 356 -1.105916272470025e-02 +341 357 -9.403863770832820e-03 +341 358 -8.076052134892587e-03 +341 359 -6.996835383339648e-03 +341 360 -6.109381318875748e-03 +341 361 -5.371977266379788e-03 +341 362 -4.753493624956895e-03 +341 363 -4.230349322908531e-03 +341 364 -3.784439171232917e-03 +341 365 -3.401691470521393e-03 +341 366 -3.071047067257385e-03 +341 367 -2.783725492315672e-03 +342 342 3.988394278106477e+01 +342 320 -4.230349322908531e-03 +342 321 -4.753493624956895e-03 +342 322 -5.371977266379823e-03 +342 323 -6.109381318875750e-03 +342 324 -6.996835383339699e-03 +342 325 -8.076052134892590e-03 +342 326 -9.403863770832835e-03 +342 327 -1.105916272470022e-02 +342 328 -1.315380302376542e-02 +342 329 -1.585023865775526e-02 +342 330 -1.939104886145104e-02 +342 331 -2.415034675252887e-02 +342 332 -3.072751892616544e-02 +342 333 -4.012781031912977e-02 +342 334 -5.413421453123171e-02 +342 335 -7.613960933881132e-02 +342 336 -1.132183869282761e-01 +342 337 -1.820810586422658e-01 +342 338 -3.301555353436767e-01 +342 339 -7.412185823610228e-01 +342 340 -3.165206906282880e+00 +342 341 -1.502055215839539e+01 +342 343 -1.502055215836222e+01 +342 344 -3.165206906282884e+00 +342 345 -7.412185823610198e-01 +342 346 -3.301555353436774e-01 +342 347 -1.820810586422651e-01 +342 348 -1.132183869282768e-01 +342 349 -7.613960933881189e-02 +342 350 -5.413421453123171e-02 +342 351 -4.012781031913015e-02 +342 352 -3.072751892616557e-02 +342 353 -2.415034675252896e-02 +342 354 -1.939104886145117e-02 +342 355 -1.585023865775526e-02 +342 356 -1.315380302376550e-02 +342 357 -1.105916272470029e-02 +342 358 -9.403863770832827e-03 +342 359 -8.076052134892577e-03 +342 360 -6.996835383339672e-03 +342 361 -6.109381318875728e-03 +342 362 -5.371977266379805e-03 +342 363 -4.753493624956895e-03 +342 364 -4.230349322908519e-03 +342 365 -3.784439171232927e-03 +342 366 -3.401691470521384e-03 +342 367 -3.071047067257392e-03 +343 343 3.988394278102307e+01 +343 320 -3.784439171232917e-03 +343 321 -4.230349322908519e-03 +343 322 -4.753493624956895e-03 +343 323 -5.371977266379788e-03 +343 324 -6.109381318875749e-03 +343 325 -6.996835383339650e-03 +343 326 -8.076052134892599e-03 +343 327 -9.403863770832818e-03 +343 328 -1.105916272470025e-02 +343 329 -1.315380302376550e-02 +343 330 -1.585023865775526e-02 +343 331 -1.939104886145111e-02 +343 332 -2.415034675252906e-02 +343 333 -3.072751892616544e-02 +343 334 -4.012781031913015e-02 +343 335 -5.413421453123170e-02 +343 336 -7.613960933881167e-02 +343 337 -1.132183869282768e-01 +343 338 -1.820810586422651e-01 +343 339 -3.301555353436774e-01 +343 340 -7.412185823610252e-01 +343 341 -3.165206906282887e+00 +343 342 -1.502055215836222e+01 +343 344 -1.502055215835492e+01 +343 345 -3.165206906282861e+00 +343 346 -7.412185823610185e-01 +343 347 -3.301555353436734e-01 +343 348 -1.820810586422649e-01 +343 349 -1.132183869282762e-01 +343 350 -7.613960933881123e-02 +343 351 -5.413421453123170e-02 +343 352 -4.012781031912996e-02 +343 353 -3.072751892616530e-02 +343 354 -2.415034675252896e-02 +343 355 -1.939104886145104e-02 +343 356 -1.585023865775526e-02 +343 357 -1.315380302376546e-02 +343 358 -1.105916272470022e-02 +343 359 -9.403863770832827e-03 +343 360 -8.076052134892615e-03 +343 361 -6.996835383339673e-03 +343 362 -6.109381318875770e-03 +343 363 -5.371977266379823e-03 +343 364 -4.753493624956895e-03 +343 365 -4.230349322908543e-03 +343 366 -3.784439171232927e-03 +343 367 -3.401691470521402e-03 +344 344 3.988394278105616e+01 +344 320 -3.401691470521393e-03 +344 321 -3.784439171232927e-03 +344 322 -4.230349322908543e-03 +344 323 -4.753493624956895e-03 +344 324 -5.371977266379821e-03 +344 325 -6.109381318875748e-03 +344 326 -6.996835383339698e-03 +344 327 -8.076052134892594e-03 +344 328 -9.403863770832827e-03 +344 329 -1.105916272470029e-02 +344 330 -1.315380302376546e-02 +344 331 -1.585023865775526e-02 +344 332 -1.939104886145118e-02 +344 333 -2.415034675252897e-02 +344 334 -3.072751892616557e-02 +344 335 -4.012781031912996e-02 +344 336 -5.413421453123172e-02 +344 337 -7.613960933881189e-02 +344 338 -1.132183869282762e-01 +344 339 -1.820810586422651e-01 +344 340 -3.301555353436764e-01 +344 341 -7.412185823610238e-01 +344 342 -3.165206906282884e+00 +344 343 -1.502055215835492e+01 +344 345 -1.502055215840046e+01 +344 346 -3.165206906282872e+00 +344 347 -7.412185823610199e-01 +344 348 -3.301555353436785e-01 +344 349 -1.820810586422656e-01 +344 350 -1.132183869282760e-01 +344 351 -7.613960933881166e-02 +344 352 -5.413421453123172e-02 +344 353 -4.012781031912977e-02 +344 354 -3.072751892616544e-02 +344 355 -2.415034675252887e-02 +344 356 -1.939104886145111e-02 +344 357 -1.585023865775526e-02 +344 358 -1.315380302376542e-02 +344 359 -1.105916272470025e-02 +344 360 -9.403863770832827e-03 +344 361 -8.076052134892568e-03 +344 362 -6.996835383339676e-03 +344 363 -6.109381318875750e-03 +344 364 -5.371977266379788e-03 +344 365 -4.753493624956895e-03 +344 366 -4.230349322908520e-03 +344 367 -3.784439171232928e-03 +345 345 3.988394278128564e+01 +345 320 -3.071047067257385e-03 +345 321 -3.401691470521384e-03 +345 322 -3.784439171232927e-03 +345 323 -4.230349322908520e-03 +345 324 -4.753493624956895e-03 +345 325 -5.371977266379788e-03 +345 326 -6.109381318875749e-03 +345 327 -6.996835383339648e-03 +345 328 -8.076052134892566e-03 +345 329 -9.403863770832828e-03 +345 330 -1.105916272470022e-02 +345 331 -1.315380302376542e-02 +345 332 -1.585023865775526e-02 +345 333 -1.939104886145104e-02 +345 334 -2.415034675252896e-02 +345 335 -3.072751892616530e-02 +345 336 -4.012781031912977e-02 +345 337 -5.413421453123171e-02 +345 338 -7.613960933881123e-02 +345 339 -1.132183869282760e-01 +345 340 -1.820810586422656e-01 +345 341 -3.301555353436768e-01 +345 342 -7.412185823610198e-01 +345 343 -3.165206906282861e+00 +345 344 -1.502055215840046e+01 +345 346 -1.502055215860534e+01 +345 347 -3.165206906282878e+00 +345 348 -7.412185823610182e-01 +345 349 -3.301555353436770e-01 +345 350 -1.820810586422648e-01 +345 351 -1.132183869282771e-01 +345 352 -7.613960933881200e-02 +345 353 -5.413421453123171e-02 +345 354 -4.012781031913015e-02 +345 355 -3.072751892616544e-02 +345 356 -2.415034675252906e-02 +345 357 -1.939104886145118e-02 +345 358 -1.585023865775526e-02 +345 359 -1.315380302376550e-02 +345 360 -1.105916272470029e-02 +345 361 -9.403863770832828e-03 +345 362 -8.076052134892622e-03 +345 363 -6.996835383339699e-03 +345 364 -6.109381318875749e-03 +345 365 -5.371977266379821e-03 +345 366 -4.753493624956895e-03 +345 367 -4.230349322908543e-03 +346 346 3.988394278152497e+01 +346 320 -2.783725492315672e-03 +346 321 -3.071047067257392e-03 +346 322 -3.401691470521402e-03 +346 323 -3.784439171232928e-03 +346 324 -4.230349322908543e-03 +346 325 -4.753493624956895e-03 +346 326 -5.371977266379821e-03 +346 327 -6.109381318875748e-03 +346 328 -6.996835383339672e-03 +346 329 -8.076052134892622e-03 +346 330 -9.403863770832825e-03 +346 331 -1.105916272470025e-02 +346 332 -1.315380302376550e-02 +346 333 -1.585023865775526e-02 +346 334 -1.939104886145118e-02 +346 335 -2.415034675252896e-02 +346 336 -3.072751892616544e-02 +346 337 -4.012781031913015e-02 +346 338 -5.413421453123170e-02 +346 339 -7.613960933881166e-02 +346 340 -1.132183869282771e-01 +346 341 -1.820810586422651e-01 +346 342 -3.301555353436774e-01 +346 343 -7.412185823610185e-01 +346 344 -3.165206906282872e+00 +346 345 -1.502055215860534e+01 +346 347 -1.502055215859221e+01 +346 348 -3.165206906282865e+00 +346 349 -7.412185823610224e-01 +346 350 -3.301555353436733e-01 +346 351 -1.820810586422648e-01 +346 352 -1.132183869282762e-01 +346 353 -7.613960933881134e-02 +346 354 -5.413421453123170e-02 +346 355 -4.012781031912976e-02 +346 356 -3.072751892616543e-02 +346 357 -2.415034675252897e-02 +346 358 -1.939104886145104e-02 +346 359 -1.585023865775526e-02 +346 360 -1.315380302376546e-02 +346 361 -1.105916272470022e-02 +346 362 -9.403863770832827e-03 +346 363 -8.076052134892589e-03 +346 364 -6.996835383339650e-03 +346 365 -6.109381318875748e-03 +346 366 -5.371977266379788e-03 +346 367 -4.753493624956895e-03 +347 347 3.988394278151357e+01 +347 320 -2.532689975072674e-03 +347 321 -2.783725492315666e-03 +347 322 -3.071047067257393e-03 +347 323 -3.401691470521385e-03 +347 324 -3.784439171232927e-03 +347 325 -4.230349322908520e-03 +347 326 -4.753493624956895e-03 +347 327 -5.371977266379788e-03 +347 328 -6.109381318875728e-03 +347 329 -6.996835383339673e-03 +347 330 -8.076052134892573e-03 +347 331 -9.403863770832828e-03 +347 332 -1.105916272470029e-02 +347 333 -1.315380302376546e-02 +347 334 -1.585023865775531e-02 +347 335 -1.939104886145111e-02 +347 336 -2.415034675252897e-02 +347 337 -3.072751892616558e-02 +347 338 -4.012781031912997e-02 +347 339 -5.413421453123173e-02 +347 340 -7.613960933881191e-02 +347 341 -1.132183869282762e-01 +347 342 -1.820810586422651e-01 +347 343 -3.301555353436734e-01 +347 344 -7.412185823610199e-01 +347 345 -3.165206906282878e+00 +347 346 -1.502055215859221e+01 +347 348 -1.502055215859652e+01 +347 349 -3.165206906282885e+00 +347 350 -7.412185823610202e-01 +347 351 -3.301555353436776e-01 +347 352 -1.820810586422657e-01 +347 353 -1.132183869282765e-01 +347 354 -7.613960933881153e-02 +347 355 -5.413421453123140e-02 +347 356 -4.012781031912995e-02 +347 357 -3.072751892616543e-02 +347 358 -2.415034675252887e-02 +347 359 -1.939104886145110e-02 +347 360 -1.585023865775526e-02 +347 361 -1.315380302376542e-02 +347 362 -1.105916272470025e-02 +347 363 -9.403863770832814e-03 +347 364 -8.076052134892594e-03 +347 365 -6.996835383339698e-03 +347 366 -6.109381318875749e-03 +347 367 -5.371977266379821e-03 +348 348 3.988394278151443e+01 +348 320 -2.312252367280536e-03 +348 321 -2.532689975072680e-03 +348 322 -2.783725492315679e-03 +348 323 -3.071047067257394e-03 +348 324 -3.401691470521403e-03 +348 325 -3.784439171232928e-03 +348 326 -4.230349322908545e-03 +348 327 -4.753493624956895e-03 +348 328 -5.371977266379805e-03 +348 329 -6.109381318875770e-03 +348 330 -6.996835383339676e-03 +348 331 -8.076052134892618e-03 +348 332 -9.403863770832849e-03 +348 333 -1.105916272470026e-02 +348 334 -1.315380302376550e-02 +348 335 -1.585023865775526e-02 +348 336 -1.939104886145111e-02 +348 337 -2.415034675252907e-02 +348 338 -3.072751892616544e-02 +348 339 -4.012781031912997e-02 +348 340 -5.413421453123187e-02 +348 341 -7.613960933881168e-02 +348 342 -1.132183869282768e-01 +348 343 -1.820810586422649e-01 +348 344 -3.301555353436785e-01 +348 345 -7.412185823610182e-01 +348 346 -3.165206906282865e+00 +348 347 -1.502055215859652e+01 +348 349 -1.502055215858806e+01 +348 350 -3.165206906282857e+00 +348 351 -7.412185823610122e-01 +348 352 -3.301555353436771e-01 +348 353 -1.820810586422648e-01 +348 354 -1.132183869282762e-01 +348 355 -7.613960933881121e-02 +348 356 -5.413421453123170e-02 +348 357 -4.012781031912996e-02 +348 358 -3.072751892616530e-02 +348 359 -2.415034675252896e-02 +348 360 -1.939104886145111e-02 +348 361 -1.585023865775520e-02 +348 362 -1.315380302376546e-02 +348 363 -1.105916272470022e-02 +348 364 -9.403863770832816e-03 +348 365 -8.076052134892594e-03 +348 366 -6.996835383339648e-03 +348 367 -6.109381318875748e-03 +349 349 3.988394278153932e+01 +349 320 -2.117777896667794e-03 +349 321 -2.312252367280536e-03 +349 322 -2.532689975072686e-03 +349 323 -2.783725492315673e-03 +349 324 -3.071047067257401e-03 +349 325 -3.401691470521394e-03 +349 326 -3.784439171232938e-03 +349 327 -4.230349322908531e-03 +349 328 -4.753493624956895e-03 +349 329 -5.371977266379823e-03 +349 330 -6.109381318875750e-03 +349 331 -6.996835383339699e-03 +349 332 -8.076052134892601e-03 +349 333 -9.403863770832835e-03 +349 334 -1.105916272470029e-02 +349 335 -1.315380302376546e-02 +349 336 -1.585023865775526e-02 +349 337 -1.939104886145118e-02 +349 338 -2.415034675252897e-02 +349 339 -3.072751892616545e-02 +349 340 -4.012781031913006e-02 +349 341 -5.413421453123172e-02 +349 342 -7.613960933881189e-02 +349 343 -1.132183869282762e-01 +349 344 -1.820810586422656e-01 +349 345 -3.301555353436770e-01 +349 346 -7.412185823610224e-01 +349 347 -3.165206906282885e+00 +349 348 -1.502055215858806e+01 +349 350 -1.502055215863998e+01 +349 351 -3.165206906282850e+00 +349 352 -7.412185823610217e-01 +349 353 -3.301555353436742e-01 +349 354 -1.820810586422651e-01 +349 355 -1.132183869282761e-01 +349 356 -7.613960933881185e-02 +349 357 -5.413421453123172e-02 +349 358 -4.012781031912977e-02 +349 359 -3.072751892616544e-02 +349 360 -2.415034675252897e-02 +349 361 -1.939104886145104e-02 +349 362 -1.585023865775525e-02 +349 363 -1.315380302376542e-02 +349 364 -1.105916272470025e-02 +349 365 -9.403863770832827e-03 +349 366 -8.076052134892566e-03 +349 367 -6.996835383339672e-03 +350 350 3.988394278164017e+01 +350 320 -1.945462087124849e-03 +350 321 -2.117777896667789e-03 +350 322 -2.312252367280536e-03 +350 323 -2.532689975072674e-03 +350 324 -2.783725492315672e-03 +350 325 -3.071047067257386e-03 +350 326 -3.401691470521394e-03 +350 327 -3.784439171232917e-03 +350 328 -4.230349322908519e-03 +350 329 -4.753493624956895e-03 +350 330 -5.371977266379788e-03 +350 331 -6.109381318875749e-03 +350 332 -6.996835383339650e-03 +350 333 -8.076052134892589e-03 +350 334 -9.403863770832820e-03 +350 335 -1.105916272470022e-02 +350 336 -1.315380302376542e-02 +350 337 -1.585023865775526e-02 +350 338 -1.939104886145104e-02 +350 339 -2.415034675252887e-02 +350 340 -3.072751892616537e-02 +350 341 -4.012781031912977e-02 +350 342 -5.413421453123171e-02 +350 343 -7.613960933881123e-02 +350 344 -1.132183869282760e-01 +350 345 -1.820810586422648e-01 +350 346 -3.301555353436733e-01 +350 347 -7.412185823610202e-01 +350 348 -3.165206906282857e+00 +350 349 -1.502055215863998e+01 +350 351 -1.502055215866003e+01 +350 352 -3.165206906282896e+00 +350 353 -7.412185823610264e-01 +350 354 -3.301555353436774e-01 +350 355 -1.820810586422653e-01 +350 356 -1.132183869282777e-01 +350 357 -7.613960933881200e-02 +350 358 -5.413421453123171e-02 +350 359 -4.012781031913015e-02 +350 360 -3.072751892616557e-02 +350 361 -2.415034675252896e-02 +350 362 -1.939104886145117e-02 +350 363 -1.585023865775526e-02 +350 364 -1.315380302376550e-02 +350 365 -1.105916272470029e-02 +350 366 -9.403863770832828e-03 +350 367 -8.076052134892622e-03 +351 351 3.988394278169704e+01 +351 320 -1.792160480940038e-03 +351 321 -1.945462087124853e-03 +351 322 -2.117777896667798e-03 +351 323 -2.312252367280536e-03 +351 324 -2.532689975072686e-03 +351 325 -2.783725492315673e-03 +351 326 -3.071047067257401e-03 +351 327 -3.401691470521393e-03 +351 328 -3.784439171232927e-03 +351 329 -4.230349322908543e-03 +351 330 -4.753493624956895e-03 +351 331 -5.371977266379821e-03 +351 332 -6.109381318875748e-03 +351 333 -6.996835383339698e-03 +351 334 -8.076052134892599e-03 +351 335 -9.403863770832825e-03 +351 336 -1.105916272470025e-02 +351 337 -1.315380302376550e-02 +351 338 -1.585023865775526e-02 +351 339 -1.939104886145111e-02 +351 340 -2.415034675252901e-02 +351 341 -3.072751892616544e-02 +351 342 -4.012781031913015e-02 +351 343 -5.413421453123170e-02 +351 344 -7.613960933881166e-02 +351 345 -1.132183869282771e-01 +351 346 -1.820810586422648e-01 +351 347 -3.301555353436776e-01 +351 348 -7.412185823610122e-01 +351 349 -3.165206906282850e+00 +351 350 -1.502055215866003e+01 +351 352 -1.502055215931066e+01 +351 353 -3.165206906282877e+00 +351 354 -7.412185823610213e-01 +351 355 -3.301555353436768e-01 +351 356 -1.820810586422655e-01 +351 357 -1.132183869282762e-01 +351 358 -7.613960933881134e-02 +351 359 -5.413421453123170e-02 +351 360 -4.012781031912996e-02 +351 361 -3.072751892616530e-02 +351 362 -2.415034675252896e-02 +351 363 -1.939104886145104e-02 +351 364 -1.585023865775526e-02 +351 365 -1.315380302376546e-02 +351 366 -1.105916272470022e-02 +351 367 -9.403863770832825e-03 +352 352 3.988394278169706e+01 +352 336 -9.403863770832828e-03 +352 337 -1.105916272470029e-02 +352 338 -1.315380302376546e-02 +352 339 -1.585023865775526e-02 +352 340 -1.939104886145114e-02 +352 341 -2.415034675252897e-02 +352 342 -3.072751892616557e-02 +352 343 -4.012781031912996e-02 +352 344 -5.413421453123172e-02 +352 345 -7.613960933881200e-02 +352 346 -1.132183869282762e-01 +352 347 -1.820810586422657e-01 +352 348 -3.301555353436771e-01 +352 349 -7.412185823610217e-01 +352 350 -3.165206906282896e+00 +352 351 -1.502055215931066e+01 +352 353 -1.502055215865999e+01 +352 354 -3.165206906282879e+00 +352 355 -7.412185823610229e-01 +352 356 -3.301555353436743e-01 +352 357 -1.820810586422651e-01 +352 358 -1.132183869282765e-01 +352 359 -7.613960933881156e-02 +352 360 -5.413421453123172e-02 +352 361 -4.012781031912977e-02 +352 362 -3.072751892616544e-02 +352 363 -2.415034675252887e-02 +352 364 -1.939104886145111e-02 +352 365 -1.585023865775526e-02 +352 366 -1.315380302376542e-02 +352 367 -1.105916272470025e-02 +352 368 -9.403863770832828e-03 +352 369 -8.076052134892611e-03 +352 370 -6.996835383339699e-03 +352 371 -6.109381318875749e-03 +352 372 -5.371977266379821e-03 +352 373 -4.753493624956895e-03 +352 374 -4.230349322908543e-03 +352 375 -3.784439171232927e-03 +352 376 -3.401691470521403e-03 +352 377 -3.071047067257401e-03 +352 378 -2.783725492315672e-03 +352 379 -2.532689975072686e-03 +352 380 -2.312252367280536e-03 +352 381 -2.117777896667798e-03 +352 382 -1.945462087124853e-03 +352 383 -1.792160480940042e-03 +353 353 3.988394278164024e+01 +353 336 -8.076052134892609e-03 +353 337 -9.403863770832828e-03 +353 338 -1.105916272470022e-02 +353 339 -1.315380302376542e-02 +353 340 -1.585023865775523e-02 +353 341 -1.939104886145104e-02 +353 342 -2.415034675252896e-02 +353 343 -3.072751892616530e-02 +353 344 -4.012781031912977e-02 +353 345 -5.413421453123171e-02 +353 346 -7.613960933881134e-02 +353 347 -1.132183869282765e-01 +353 348 -1.820810586422648e-01 +353 349 -3.301555353436742e-01 +353 350 -7.412185823610264e-01 +353 351 -3.165206906282877e+00 +353 352 -1.502055215865999e+01 +353 354 -1.502055215864003e+01 +353 355 -3.165206906282890e+00 +353 356 -7.412185823610218e-01 +353 357 -3.301555353436770e-01 +353 358 -1.820810586422651e-01 +353 359 -1.132183869282764e-01 +353 360 -7.613960933881210e-02 +353 361 -5.413421453123171e-02 +353 362 -4.012781031913015e-02 +353 363 -3.072751892616544e-02 +353 364 -2.415034675252906e-02 +353 365 -1.939104886145118e-02 +353 366 -1.585023865775526e-02 +353 367 -1.315380302376550e-02 +353 368 -1.105916272470029e-02 +353 369 -9.403863770832835e-03 +353 370 -8.076052134892601e-03 +353 371 -6.996835383339650e-03 +353 372 -6.109381318875748e-03 +353 373 -5.371977266379788e-03 +353 374 -4.753493624956895e-03 +353 375 -4.230349322908520e-03 +353 376 -3.784439171232928e-03 +353 377 -3.401691470521394e-03 +353 378 -3.071047067257386e-03 +353 379 -2.783725492315673e-03 +353 380 -2.532689975072674e-03 +353 381 -2.312252367280536e-03 +353 382 -2.117777896667789e-03 +353 383 -1.945462087124853e-03 +354 354 3.988394278153935e+01 +354 336 -6.996835383339673e-03 +354 337 -8.076052134892578e-03 +354 338 -9.403863770832827e-03 +354 339 -1.105916272470025e-02 +354 340 -1.315380302376548e-02 +354 341 -1.585023865775525e-02 +354 342 -1.939104886145117e-02 +354 343 -2.415034675252896e-02 +354 344 -3.072751892616544e-02 +354 345 -4.012781031913015e-02 +354 346 -5.413421453123170e-02 +354 347 -7.613960933881153e-02 +354 348 -1.132183869282762e-01 +354 349 -1.820810586422651e-01 +354 350 -3.301555353436774e-01 +354 351 -7.412185823610213e-01 +354 352 -3.165206906282879e+00 +354 353 -1.502055215864003e+01 +354 355 -1.502055215858803e+01 +354 356 -3.165206906282868e+00 +354 357 -7.412185823610127e-01 +354 358 -3.301555353436777e-01 +354 359 -1.820810586422655e-01 +354 360 -1.132183869282768e-01 +354 361 -7.613960933881134e-02 +354 362 -5.413421453123172e-02 +354 363 -4.012781031912977e-02 +354 364 -3.072751892616544e-02 +354 365 -2.415034675252897e-02 +354 366 -1.939104886145104e-02 +354 367 -1.585023865775526e-02 +354 368 -1.315380302376546e-02 +354 369 -1.105916272470024e-02 +354 370 -9.403863770832835e-03 +354 371 -8.076052134892589e-03 +354 372 -6.996835383339698e-03 +354 373 -6.109381318875749e-03 +354 374 -5.371977266379821e-03 +354 375 -4.753493624956895e-03 +354 376 -4.230349322908545e-03 +354 377 -3.784439171232938e-03 +354 378 -3.401691470521394e-03 +354 379 -3.071047067257401e-03 +354 380 -2.783725492315672e-03 +354 381 -2.532689975072686e-03 +354 382 -2.312252367280536e-03 +354 383 -2.117777896667798e-03 +355 355 3.988394278151447e+01 +355 336 -6.109381318875770e-03 +355 337 -6.996835383339676e-03 +355 338 -8.076052134892611e-03 +355 339 -9.403863770832807e-03 +355 340 -1.105916272470023e-02 +355 341 -1.315380302376542e-02 +355 342 -1.585023865775526e-02 +355 343 -1.939104886145104e-02 +355 344 -2.415034675252887e-02 +355 345 -3.072751892616544e-02 +355 346 -4.012781031912976e-02 +355 347 -5.413421453123140e-02 +355 348 -7.613960933881121e-02 +355 349 -1.132183869282761e-01 +355 350 -1.820810586422653e-01 +355 351 -3.301555353436768e-01 +355 352 -7.412185823610229e-01 +355 353 -3.165206906282890e+00 +355 354 -1.502055215858803e+01 +355 356 -1.502055215859653e+01 +355 357 -3.165206906282878e+00 +355 358 -7.412185823610267e-01 +355 359 -3.301555353436754e-01 +355 360 -1.820810586422652e-01 +355 361 -1.132183869282767e-01 +355 362 -7.613960933881191e-02 +355 363 -5.413421453123171e-02 +355 364 -4.012781031913015e-02 +355 365 -3.072751892616557e-02 +355 366 -2.415034675252896e-02 +355 367 -1.939104886145118e-02 +355 368 -1.585023865775531e-02 +355 369 -1.315380302376548e-02 +355 370 -1.105916272470029e-02 +355 371 -9.403863770832820e-03 +355 372 -8.076052134892599e-03 +355 373 -6.996835383339648e-03 +355 374 -6.109381318875748e-03 +355 375 -5.371977266379788e-03 +355 376 -4.753493624956895e-03 +355 377 -4.230349322908531e-03 +355 378 -3.784439171232917e-03 +355 379 -3.401691470521393e-03 +355 380 -3.071047067257385e-03 +355 381 -2.783725492315672e-03 +355 382 -2.532689975072674e-03 +355 383 -2.312252367280535e-03 +356 356 3.988394278151365e+01 +356 336 -5.371977266379823e-03 +356 337 -6.109381318875750e-03 +356 338 -6.996835383339699e-03 +356 339 -8.076052134892594e-03 +356 340 -9.403863770832840e-03 +356 341 -1.105916272470025e-02 +356 342 -1.315380302376550e-02 +356 343 -1.585023865775526e-02 +356 344 -1.939104886145111e-02 +356 345 -2.415034675252906e-02 +356 346 -3.072751892616543e-02 +356 347 -4.012781031912995e-02 +356 348 -5.413421453123170e-02 +356 349 -7.613960933881185e-02 +356 350 -1.132183869282777e-01 +356 351 -1.820810586422655e-01 +356 352 -3.301555353436743e-01 +356 353 -7.412185823610218e-01 +356 354 -3.165206906282868e+00 +356 355 -1.502055215859653e+01 +356 357 -1.502055215859225e+01 +356 358 -3.165206906282901e+00 +356 359 -7.412185823610200e-01 +356 360 -3.301555353436755e-01 +356 361 -1.820810586422643e-01 +356 362 -1.132183869282760e-01 +356 363 -7.613960933881134e-02 +356 364 -5.413421453123170e-02 +356 365 -4.012781031912996e-02 +356 366 -3.072751892616530e-02 +356 367 -2.415034675252896e-02 +356 368 -1.939104886145111e-02 +356 369 -1.585023865775523e-02 +356 370 -1.315380302376546e-02 +356 371 -1.105916272470022e-02 +356 372 -9.403863770832825e-03 +356 373 -8.076052134892571e-03 +356 374 -6.996835383339672e-03 +356 375 -6.109381318875728e-03 +356 376 -5.371977266379805e-03 +356 377 -4.753493624956895e-03 +356 378 -4.230349322908519e-03 +356 379 -3.784439171232927e-03 +356 380 -3.401691470521384e-03 +356 381 -3.071047067257392e-03 +356 382 -2.783725492315666e-03 +356 383 -2.532689975072679e-03 +357 357 3.988394278152501e+01 +357 336 -4.753493624956895e-03 +357 337 -5.371977266379788e-03 +357 338 -6.109381318875749e-03 +357 339 -6.996835383339650e-03 +357 340 -8.076052134892594e-03 +357 341 -9.403863770832820e-03 +357 342 -1.105916272470029e-02 +357 343 -1.315380302376546e-02 +357 344 -1.585023865775526e-02 +357 345 -1.939104886145118e-02 +357 346 -2.415034675252897e-02 +357 347 -3.072751892616543e-02 +357 348 -4.012781031912996e-02 +357 349 -5.413421453123172e-02 +357 350 -7.613960933881200e-02 +357 351 -1.132183869282762e-01 +357 352 -1.820810586422651e-01 +357 353 -3.301555353436770e-01 +357 354 -7.412185823610127e-01 +357 355 -3.165206906282878e+00 +357 356 -1.502055215859225e+01 +357 358 -1.502055215860535e+01 +357 359 -3.165206906282858e+00 +357 360 -7.412185823610102e-01 +357 361 -3.301555353436774e-01 +357 362 -1.820810586422651e-01 +357 363 -1.132183869282766e-01 +357 364 -7.613960933881175e-02 +357 365 -5.413421453123172e-02 +357 366 -4.012781031912977e-02 +357 367 -3.072751892616544e-02 +357 368 -2.415034675252897e-02 +357 369 -1.939104886145107e-02 +357 370 -1.585023865775526e-02 +357 371 -1.315380302376542e-02 +357 372 -1.105916272470025e-02 +357 373 -9.403863770832828e-03 +357 374 -8.076052134892609e-03 +357 375 -6.996835383339673e-03 +357 376 -6.109381318875770e-03 +357 377 -5.371977266379823e-03 +357 378 -4.753493624956895e-03 +357 379 -4.230349322908543e-03 +357 380 -3.784439171232927e-03 +357 381 -3.401691470521402e-03 +357 382 -3.071047067257393e-03 +357 383 -2.783725492315679e-03 +358 358 3.988394278128565e+01 +358 336 -4.230349322908543e-03 +358 337 -4.753493624956895e-03 +358 338 -5.371977266379821e-03 +358 339 -6.109381318875748e-03 +358 340 -6.996835383339698e-03 +358 341 -8.076052134892587e-03 +358 342 -9.403863770832827e-03 +358 343 -1.105916272470022e-02 +358 344 -1.315380302376542e-02 +358 345 -1.585023865775526e-02 +358 346 -1.939104886145104e-02 +358 347 -2.415034675252887e-02 +358 348 -3.072751892616530e-02 +358 349 -4.012781031912977e-02 +358 350 -5.413421453123171e-02 +358 351 -7.613960933881134e-02 +358 352 -1.132183869282765e-01 +358 353 -1.820810586422651e-01 +358 354 -3.301555353436777e-01 +358 355 -7.412185823610267e-01 +358 356 -3.165206906282901e+00 +358 357 -1.502055215860535e+01 +358 359 -1.502055215840042e+01 +358 360 -3.165206906282850e+00 +358 361 -7.412185823610209e-01 +358 362 -3.301555353436729e-01 +358 363 -1.820810586422650e-01 +358 364 -1.132183869282770e-01 +358 365 -7.613960933881191e-02 +358 366 -5.413421453123171e-02 +358 367 -4.012781031913015e-02 +358 368 -3.072751892616557e-02 +358 369 -2.415034675252901e-02 +358 370 -1.939104886145118e-02 +358 371 -1.585023865775526e-02 +358 372 -1.315380302376550e-02 +358 373 -1.105916272470029e-02 +358 374 -9.403863770832828e-03 +358 375 -8.076052134892578e-03 +358 376 -6.996835383339676e-03 +358 377 -6.109381318875750e-03 +358 378 -5.371977266379788e-03 +358 379 -4.753493624956895e-03 +358 380 -4.230349322908520e-03 +358 381 -3.784439171232928e-03 +358 382 -3.401691470521385e-03 +358 383 -3.071047067257393e-03 +359 359 3.988394278105613e+01 +359 336 -3.784439171232927e-03 +359 337 -4.230349322908520e-03 +359 338 -4.753493624956895e-03 +359 339 -5.371977266379788e-03 +359 340 -6.109381318875749e-03 +359 341 -6.996835383339648e-03 +359 342 -8.076052134892577e-03 +359 343 -9.403863770832827e-03 +359 344 -1.105916272470025e-02 +359 345 -1.315380302376550e-02 +359 346 -1.585023865775526e-02 +359 347 -1.939104886145110e-02 +359 348 -2.415034675252896e-02 +359 349 -3.072751892616544e-02 +359 350 -4.012781031913015e-02 +359 351 -5.413421453123170e-02 +359 352 -7.613960933881156e-02 +359 353 -1.132183869282764e-01 +359 354 -1.820810586422655e-01 +359 355 -3.301555353436754e-01 +359 356 -7.412185823610200e-01 +359 357 -3.165206906282858e+00 +359 358 -1.502055215840042e+01 +359 360 -1.502055215835492e+01 +359 361 -3.165206906282893e+00 +359 362 -7.412185823610220e-01 +359 363 -3.301555353436777e-01 +359 364 -1.820810586422657e-01 +359 365 -1.132183869282760e-01 +359 366 -7.613960933881125e-02 +359 367 -5.413421453123170e-02 +359 368 -4.012781031912996e-02 +359 369 -3.072751892616537e-02 +359 370 -2.415034675252897e-02 +359 371 -1.939104886145104e-02 +359 372 -1.585023865775526e-02 +359 373 -1.315380302376546e-02 +359 374 -1.105916272470022e-02 +359 375 -9.403863770832827e-03 +359 376 -8.076052134892616e-03 +359 377 -6.996835383339699e-03 +359 378 -6.109381318875749e-03 +359 379 -5.371977266379821e-03 +359 380 -4.753493624956895e-03 +359 381 -4.230349322908543e-03 +359 382 -3.784439171232927e-03 +359 383 -3.401691470521402e-03 +360 360 3.988394278102309e+01 +360 336 -3.401691470521402e-03 +360 337 -3.784439171232928e-03 +360 338 -4.230349322908543e-03 +360 339 -4.753493624956895e-03 +360 340 -5.371977266379821e-03 +360 341 -6.109381318875748e-03 +360 342 -6.996835383339672e-03 +360 343 -8.076052134892615e-03 +360 344 -9.403863770832827e-03 +360 345 -1.105916272470029e-02 +360 346 -1.315380302376546e-02 +360 347 -1.585023865775526e-02 +360 348 -1.939104886145111e-02 +360 349 -2.415034675252897e-02 +360 350 -3.072751892616557e-02 +360 351 -4.012781031912996e-02 +360 352 -5.413421453123172e-02 +360 353 -7.613960933881210e-02 +360 354 -1.132183869282768e-01 +360 355 -1.820810586422652e-01 +360 356 -3.301555353436755e-01 +360 357 -7.412185823610102e-01 +360 358 -3.165206906282850e+00 +360 359 -1.502055215835492e+01 +360 361 -1.502055215836225e+01 +360 362 -3.165206906282885e+00 +360 363 -7.412185823610185e-01 +360 364 -3.301555353436768e-01 +360 365 -1.820810586422640e-01 +360 366 -1.132183869282765e-01 +360 367 -7.613960933881166e-02 +360 368 -5.413421453123172e-02 +360 369 -4.012781031912987e-02 +360 370 -3.072751892616545e-02 +360 371 -2.415034675252887e-02 +360 372 -1.939104886145111e-02 +360 373 -1.585023865775526e-02 +360 374 -1.315380302376542e-02 +360 375 -1.105916272470025e-02 +360 376 -9.403863770832828e-03 +360 377 -8.076052134892596e-03 +360 378 -6.996835383339650e-03 +360 379 -6.109381318875748e-03 +360 380 -5.371977266379788e-03 +360 381 -4.753493624956895e-03 +360 382 -4.230349322908520e-03 +360 383 -3.784439171232928e-03 +361 361 3.988394278106483e+01 +361 336 -3.071047067257393e-03 +361 337 -3.401691470521385e-03 +361 338 -3.784439171232927e-03 +361 339 -4.230349322908520e-03 +361 340 -4.753493624956895e-03 +361 341 -5.371977266379788e-03 +361 342 -6.109381318875728e-03 +361 343 -6.996835383339673e-03 +361 344 -8.076052134892568e-03 +361 345 -9.403863770832828e-03 +361 346 -1.105916272470022e-02 +361 347 -1.315380302376542e-02 +361 348 -1.585023865775520e-02 +361 349 -1.939104886145104e-02 +361 350 -2.415034675252896e-02 +361 351 -3.072751892616530e-02 +361 352 -4.012781031912977e-02 +361 353 -5.413421453123171e-02 +361 354 -7.613960933881134e-02 +361 355 -1.132183869282767e-01 +361 356 -1.820810586422643e-01 +361 357 -3.301555353436774e-01 +361 358 -7.412185823610209e-01 +361 359 -3.165206906282893e+00 +361 360 -1.502055215836225e+01 +361 362 -1.502055215839542e+01 +361 363 -3.165206906282877e+00 +361 364 -7.412185823610227e-01 +361 365 -3.301555353436729e-01 +361 366 -1.820810586422649e-01 +361 367 -1.132183869282764e-01 +361 368 -7.613960933881220e-02 +361 369 -5.413421453123186e-02 +361 370 -4.012781031913015e-02 +361 371 -3.072751892616544e-02 +361 372 -2.415034675252906e-02 +361 373 -1.939104886145118e-02 +361 374 -1.585023865775526e-02 +361 375 -1.315380302376550e-02 +361 376 -1.105916272470029e-02 +361 377 -9.403863770832856e-03 +361 378 -8.076052134892601e-03 +361 379 -6.996835383339698e-03 +361 380 -6.109381318875749e-03 +361 381 -5.371977266379821e-03 +361 382 -4.753493624956895e-03 +361 383 -4.230349322908543e-03 +362 362 3.988394278115158e+01 +362 336 -2.783725492315679e-03 +362 337 -3.071047067257394e-03 +362 338 -3.401691470521403e-03 +362 339 -3.784439171232928e-03 +362 340 -4.230349322908545e-03 +362 341 -4.753493624956895e-03 +362 342 -5.371977266379805e-03 +362 343 -6.109381318875770e-03 +362 344 -6.996835383339676e-03 +362 345 -8.076052134892622e-03 +362 346 -9.403863770832827e-03 +362 347 -1.105916272470025e-02 +362 348 -1.315380302376546e-02 +362 349 -1.585023865775525e-02 +362 350 -1.939104886145117e-02 +362 351 -2.415034675252896e-02 +362 352 -3.072751892616544e-02 +362 353 -4.012781031913015e-02 +362 354 -5.413421453123172e-02 +362 355 -7.613960933881191e-02 +362 356 -1.132183869282760e-01 +362 357 -1.820810586422651e-01 +362 358 -3.301555353436729e-01 +362 359 -7.412185823610220e-01 +362 360 -3.165206906282885e+00 +362 361 -1.502055215839542e+01 +362 363 -1.502055215844907e+01 +362 364 -3.165206906282886e+00 +362 365 -7.412185823610206e-01 +362 366 -3.301555353436785e-01 +362 367 -1.820810586422658e-01 +362 368 -1.132183869282773e-01 +362 369 -7.613960933881148e-02 +362 370 -5.413421453123173e-02 +362 371 -4.012781031912977e-02 +362 372 -3.072751892616544e-02 +362 373 -2.415034675252897e-02 +362 374 -1.939104886145104e-02 +362 375 -1.585023865775526e-02 +362 376 -1.315380302376546e-02 +362 377 -1.105916272470026e-02 +362 378 -9.403863770832820e-03 +362 379 -8.076052134892587e-03 +362 380 -6.996835383339648e-03 +362 381 -6.109381318875748e-03 +362 382 -5.371977266379788e-03 +362 383 -4.753493624956895e-03 +363 363 3.988394278128115e+01 +363 336 -2.532689975072686e-03 +363 337 -2.783725492315673e-03 +363 338 -3.071047067257401e-03 +363 339 -3.401691470521394e-03 +363 340 -3.784439171232938e-03 +363 341 -4.230349322908531e-03 +363 342 -4.753493624956895e-03 +363 343 -5.371977266379823e-03 +363 344 -6.109381318875750e-03 +363 345 -6.996835383339699e-03 +363 346 -8.076052134892589e-03 +363 347 -9.403863770832814e-03 +363 348 -1.105916272470022e-02 +363 349 -1.315380302376542e-02 +363 350 -1.585023865775526e-02 +363 351 -1.939104886145104e-02 +363 352 -2.415034675252887e-02 +363 353 -3.072751892616544e-02 +363 354 -4.012781031912977e-02 +363 355 -5.413421453123171e-02 +363 356 -7.613960933881134e-02 +363 357 -1.132183869282766e-01 +363 358 -1.820810586422650e-01 +363 359 -3.301555353436777e-01 +363 360 -7.412185823610185e-01 +363 361 -3.165206906282877e+00 +363 362 -1.502055215844907e+01 +363 364 -1.502055215852575e+01 +363 365 -3.165206906282865e+00 +363 366 -7.412185823610185e-01 +363 367 -3.301555353436769e-01 +363 368 -1.820810586422655e-01 +363 369 -1.132183869282761e-01 +363 370 -7.613960933881184e-02 +363 371 -5.413421453123171e-02 +363 372 -4.012781031913015e-02 +363 373 -3.072751892616557e-02 +363 374 -2.415034675252896e-02 +363 375 -1.939104886145118e-02 +363 376 -1.585023865775531e-02 +363 377 -1.315380302376550e-02 +363 378 -1.105916272470029e-02 +363 379 -9.403863770832827e-03 +363 380 -8.076052134892577e-03 +363 381 -6.996835383339672e-03 +363 382 -6.109381318875728e-03 +363 383 -5.371977266379805e-03 +364 364 3.988394278146374e+01 +364 336 -2.312252367280536e-03 +364 337 -2.532689975072674e-03 +364 338 -2.783725492315672e-03 +364 339 -3.071047067257386e-03 +364 340 -3.401691470521394e-03 +364 341 -3.784439171232917e-03 +364 342 -4.230349322908519e-03 +364 343 -4.753493624956895e-03 +364 344 -5.371977266379788e-03 +364 345 -6.109381318875749e-03 +364 346 -6.996835383339650e-03 +364 347 -8.076052134892594e-03 +364 348 -9.403863770832816e-03 +364 349 -1.105916272470025e-02 +364 350 -1.315380302376550e-02 +364 351 -1.585023865775526e-02 +364 352 -1.939104886145111e-02 +364 353 -2.415034675252906e-02 +364 354 -3.072751892616544e-02 +364 355 -4.012781031913015e-02 +364 356 -5.413421453123170e-02 +364 357 -7.613960933881175e-02 +364 358 -1.132183869282770e-01 +364 359 -1.820810586422657e-01 +364 360 -3.301555353436768e-01 +364 361 -7.412185823610227e-01 +364 362 -3.165206906282886e+00 +364 363 -1.502055215852575e+01 +364 365 -1.502055215863299e+01 +364 366 -3.165206906282877e+00 +364 367 -7.412185823610213e-01 +364 368 -3.301555353436756e-01 +364 369 -1.820810586422643e-01 +364 370 -1.132183869282761e-01 +364 371 -7.613960933881134e-02 +364 372 -5.413421453123170e-02 +364 373 -4.012781031912996e-02 +364 374 -3.072751892616530e-02 +364 375 -2.415034675252896e-02 +364 376 -1.939104886145111e-02 +364 377 -1.585023865775526e-02 +364 378 -1.315380302376546e-02 +364 379 -1.105916272470022e-02 +364 380 -9.403863770832827e-03 +364 381 -8.076052134892615e-03 +364 382 -6.996835383339673e-03 +364 383 -6.109381318875769e-03 +365 365 3.988394278171954e+01 +365 336 -2.117777896667798e-03 +365 337 -2.312252367280536e-03 +365 338 -2.532689975072686e-03 +365 339 -2.783725492315673e-03 +365 340 -3.071047067257401e-03 +365 341 -3.401691470521393e-03 +365 342 -3.784439171232927e-03 +365 343 -4.230349322908543e-03 +365 344 -4.753493624956895e-03 +365 345 -5.371977266379821e-03 +365 346 -6.109381318875748e-03 +365 347 -6.996835383339698e-03 +365 348 -8.076052134892594e-03 +365 349 -9.403863770832827e-03 +365 350 -1.105916272470029e-02 +365 351 -1.315380302376546e-02 +365 352 -1.585023865775526e-02 +365 353 -1.939104886145118e-02 +365 354 -2.415034675252897e-02 +365 355 -3.072751892616557e-02 +365 356 -4.012781031912996e-02 +365 357 -5.413421453123172e-02 +365 358 -7.613960933881191e-02 +365 359 -1.132183869282760e-01 +365 360 -1.820810586422640e-01 +365 361 -3.301555353436729e-01 +365 362 -7.412185823610206e-01 +365 363 -3.165206906282865e+00 +365 364 -1.502055215863299e+01 +365 366 -1.502055215878377e+01 +365 367 -3.165206906282875e+00 +365 368 -7.412185823610207e-01 +365 369 -3.301555353436776e-01 +365 370 -1.820810586422660e-01 +365 371 -1.132183869282769e-01 +365 372 -7.613960933881184e-02 +365 373 -5.413421453123172e-02 +365 374 -4.012781031912977e-02 +365 375 -3.072751892616544e-02 +365 376 -2.415034675252897e-02 +365 377 -1.939104886145111e-02 +365 378 -1.585023865775526e-02 +365 379 -1.315380302376542e-02 +365 380 -1.105916272470025e-02 +365 381 -9.403863770832827e-03 +365 382 -8.076052134892568e-03 +365 383 -6.996835383339674e-03 +366 366 3.988394278208169e+01 +366 336 -1.945462087124853e-03 +366 337 -2.117777896667789e-03 +366 338 -2.312252367280536e-03 +366 339 -2.532689975072674e-03 +366 340 -2.783725492315672e-03 +366 341 -3.071047067257385e-03 +366 342 -3.401691470521384e-03 +366 343 -3.784439171232927e-03 +366 344 -4.230349322908520e-03 +366 345 -4.753493624956895e-03 +366 346 -5.371977266379788e-03 +366 347 -6.109381318875749e-03 +366 348 -6.996835383339648e-03 +366 349 -8.076052134892566e-03 +366 350 -9.403863770832828e-03 +366 351 -1.105916272470022e-02 +366 352 -1.315380302376542e-02 +366 353 -1.585023865775526e-02 +366 354 -1.939104886145104e-02 +366 355 -2.415034675252896e-02 +366 356 -3.072751892616530e-02 +366 357 -4.012781031912977e-02 +366 358 -5.413421453123171e-02 +366 359 -7.613960933881125e-02 +366 360 -1.132183869282765e-01 +366 361 -1.820810586422649e-01 +366 362 -3.301555353436785e-01 +366 363 -7.412185823610185e-01 +366 364 -3.165206906282877e+00 +366 365 -1.502055215878377e+01 +366 367 -1.502055215899858e+01 +366 368 -3.165206906282857e+00 +366 369 -7.412185823610152e-01 +366 370 -3.301555353436773e-01 +366 371 -1.820810586422655e-01 +366 372 -1.132183869282770e-01 +366 373 -7.613960933881202e-02 +366 374 -5.413421453123171e-02 +366 375 -4.012781031913015e-02 +366 376 -3.072751892616558e-02 +366 377 -2.415034675252907e-02 +366 378 -1.939104886145118e-02 +366 379 -1.585023865775526e-02 +366 380 -1.315380302376550e-02 +366 381 -1.105916272470029e-02 +366 382 -9.403863770832828e-03 +366 383 -8.076052134892622e-03 +367 367 3.988394278260307e+01 +367 336 -1.792160480940042e-03 +367 337 -1.945462087124853e-03 +367 338 -2.117777896667798e-03 +367 339 -2.312252367280536e-03 +367 340 -2.532689975072686e-03 +367 341 -2.783725492315672e-03 +367 342 -3.071047067257392e-03 +367 343 -3.401691470521402e-03 +367 344 -3.784439171232928e-03 +367 345 -4.230349322908543e-03 +367 346 -4.753493624956895e-03 +367 347 -5.371977266379821e-03 +367 348 -6.109381318875748e-03 +367 349 -6.996835383339672e-03 +367 350 -8.076052134892622e-03 +367 351 -9.403863770832825e-03 +367 352 -1.105916272470025e-02 +367 353 -1.315380302376550e-02 +367 354 -1.585023865775526e-02 +367 355 -1.939104886145118e-02 +367 356 -2.415034675252896e-02 +367 357 -3.072751892616544e-02 +367 358 -4.012781031913015e-02 +367 359 -5.413421453123170e-02 +367 360 -7.613960933881166e-02 +367 361 -1.132183869282764e-01 +367 362 -1.820810586422658e-01 +367 363 -3.301555353436769e-01 +367 364 -7.412185823610213e-01 +367 365 -3.165206906282875e+00 +367 366 -1.502055215899858e+01 +367 368 -1.502055215931067e+01 +367 369 -3.165206906282885e+00 +367 370 -7.412185823610240e-01 +367 371 -3.301555353436755e-01 +367 372 -1.820810586422651e-01 +367 373 -1.132183869282764e-01 +367 374 -7.613960933881114e-02 +367 375 -5.413421453123170e-02 +367 376 -4.012781031912997e-02 +367 377 -3.072751892616544e-02 +367 378 -2.415034675252897e-02 +367 379 -1.939104886145104e-02 +367 380 -1.585023865775526e-02 +367 381 -1.315380302376546e-02 +367 382 -1.105916272470022e-02 +367 383 -9.403863770832816e-03 +368 368 3.988394278260307e+01 +368 352 -9.403863770832828e-03 +368 353 -1.105916272470029e-02 +368 354 -1.315380302376546e-02 +368 355 -1.585023865775531e-02 +368 356 -1.939104886145111e-02 +368 357 -2.415034675252897e-02 +368 358 -3.072751892616557e-02 +368 359 -4.012781031912996e-02 +368 360 -5.413421453123172e-02 +368 361 -7.613960933881220e-02 +368 362 -1.132183869282773e-01 +368 363 -1.820810586422655e-01 +368 364 -3.301555353436756e-01 +368 365 -7.412185823610207e-01 +368 366 -3.165206906282857e+00 +368 367 -1.502055215931067e+01 +368 369 -1.502055215899862e+01 +368 370 -3.165206906282871e+00 +368 371 -7.412185823610200e-01 +368 372 -3.301555353436754e-01 +368 373 -1.820810586422643e-01 +368 374 -1.132183869282758e-01 +368 375 -7.613960933881156e-02 +368 376 -5.413421453123173e-02 +368 377 -4.012781031912997e-02 +368 378 -3.072751892616545e-02 +368 379 -2.415034675252887e-02 +368 380 -1.939104886145111e-02 +368 381 -1.585023865775526e-02 +368 382 -1.315380302376542e-02 +368 383 -1.105916272470023e-02 +368 384 -9.403863770832804e-03 +368 385 -8.076052134892594e-03 +368 386 -6.996835383339698e-03 +368 387 -6.109381318875749e-03 +368 388 -5.371977266379821e-03 +368 389 -4.753493624956895e-03 +368 390 -4.230349322908543e-03 +368 391 -3.784439171232927e-03 +368 392 -3.401691470521393e-03 +368 393 -3.071047067257401e-03 +368 394 -2.783725492315672e-03 +368 395 -2.532689975072686e-03 +368 396 -2.312252367280536e-03 +368 397 -2.117777896667798e-03 +368 398 -1.945462087124853e-03 +368 399 -1.792160480940038e-03 +369 369 3.988394278208168e+01 +369 352 -8.076052134892611e-03 +369 353 -9.403863770832835e-03 +369 354 -1.105916272470024e-02 +369 355 -1.315380302376548e-02 +369 356 -1.585023865775523e-02 +369 357 -1.939104886145107e-02 +369 358 -2.415034675252901e-02 +369 359 -3.072751892616537e-02 +369 360 -4.012781031912987e-02 +369 361 -5.413421453123186e-02 +369 362 -7.613960933881148e-02 +369 363 -1.132183869282761e-01 +369 364 -1.820810586422643e-01 +369 365 -3.301555353436776e-01 +369 366 -7.412185823610152e-01 +369 367 -3.165206906282885e+00 +369 368 -1.502055215899862e+01 +369 370 -1.502055215878371e+01 +369 371 -3.165206906282872e+00 +369 372 -7.412185823610227e-01 +369 373 -3.301555353436777e-01 +369 374 -1.820810586422659e-01 +369 375 -1.132183869282766e-01 +369 376 -7.613960933881210e-02 +369 377 -5.413421453123187e-02 +369 378 -4.012781031913006e-02 +369 379 -3.072751892616537e-02 +369 380 -2.415034675252901e-02 +369 381 -1.939104886145114e-02 +369 382 -1.585023865775523e-02 +369 383 -1.315380302376545e-02 +369 384 -1.105916272470022e-02 +369 385 -9.403863770832823e-03 +369 386 -8.076052134892594e-03 +369 387 -6.996835383339648e-03 +369 388 -6.109381318875748e-03 +369 389 -5.371977266379788e-03 +369 390 -4.753493624956895e-03 +369 391 -4.230349322908519e-03 +369 392 -3.784439171232916e-03 +369 393 -3.401691470521393e-03 +369 394 -3.071047067257385e-03 +369 395 -2.783725492315672e-03 +369 396 -2.532689975072674e-03 +369 397 -2.312252367280535e-03 +369 398 -2.117777896667789e-03 +369 399 -1.945462087124848e-03 +370 370 3.988394278171955e+01 +370 352 -6.996835383339699e-03 +370 353 -8.076052134892601e-03 +370 354 -9.403863770832835e-03 +370 355 -1.105916272470029e-02 +370 356 -1.315380302376546e-02 +370 357 -1.585023865775526e-02 +370 358 -1.939104886145118e-02 +370 359 -2.415034675252897e-02 +370 360 -3.072751892616545e-02 +370 361 -4.012781031913015e-02 +370 362 -5.413421453123173e-02 +370 363 -7.613960933881184e-02 +370 364 -1.132183869282761e-01 +370 365 -1.820810586422660e-01 +370 366 -3.301555353436773e-01 +370 367 -7.412185823610240e-01 +370 368 -3.165206906282871e+00 +370 369 -1.502055215878371e+01 +370 371 -1.502055215863303e+01 +370 372 -3.165206906282890e+00 +370 373 -7.412185823610188e-01 +370 374 -3.301555353436755e-01 +370 375 -1.820810586422651e-01 +370 376 -1.132183869282773e-01 +370 377 -7.613960933881157e-02 +370 378 -5.413421453123172e-02 +370 379 -4.012781031912977e-02 +370 380 -3.072751892616544e-02 +370 381 -2.415034675252897e-02 +370 382 -1.939104886145104e-02 +370 383 -1.585023865775522e-02 +370 384 -1.315380302376540e-02 +370 385 -1.105916272470025e-02 +370 386 -9.403863770832830e-03 +370 387 -8.076052134892575e-03 +370 388 -6.996835383339672e-03 +370 389 -6.109381318875728e-03 +370 390 -5.371977266379805e-03 +370 391 -4.753493624956881e-03 +370 392 -4.230349322908518e-03 +370 393 -3.784439171232927e-03 +370 394 -3.401691470521384e-03 +370 395 -3.071047067257392e-03 +370 396 -2.783725492315666e-03 +370 397 -2.532689975072679e-03 +370 398 -2.312252367280531e-03 +370 399 -2.117777896667789e-03 +371 371 3.988394278146373e+01 +371 352 -6.109381318875749e-03 +371 353 -6.996835383339650e-03 +371 354 -8.076052134892589e-03 +371 355 -9.403863770832820e-03 +371 356 -1.105916272470022e-02 +371 357 -1.315380302376542e-02 +371 358 -1.585023865775526e-02 +371 359 -1.939104886145104e-02 +371 360 -2.415034675252887e-02 +371 361 -3.072751892616544e-02 +371 362 -4.012781031912977e-02 +371 363 -5.413421453123171e-02 +371 364 -7.613960933881134e-02 +371 365 -1.132183869282769e-01 +371 366 -1.820810586422655e-01 +371 367 -3.301555353436755e-01 +371 368 -7.412185823610200e-01 +371 369 -3.165206906282872e+00 +371 370 -1.502055215863303e+01 +371 372 -1.502055215852575e+01 +371 373 -3.165206906282861e+00 +371 374 -7.412185823610136e-01 +371 375 -3.301555353436761e-01 +371 376 -1.820810586422648e-01 +371 377 -1.132183869282762e-01 +371 378 -7.613960933881193e-02 +371 379 -5.413421453123171e-02 +371 380 -4.012781031913015e-02 +371 381 -3.072751892616557e-02 +371 382 -2.415034675252896e-02 +371 383 -1.939104886145113e-02 +371 384 -1.585023865775523e-02 +371 385 -1.315380302376550e-02 +371 386 -1.105916272470030e-02 +371 387 -9.403863770832847e-03 +371 388 -8.076052134892622e-03 +371 389 -6.996835383339673e-03 +371 390 -6.109381318875769e-03 +371 391 -5.371977266379805e-03 +371 392 -4.753493624956894e-03 +371 393 -4.230349322908543e-03 +371 394 -3.784439171232927e-03 +371 395 -3.401691470521402e-03 +371 396 -3.071047067257393e-03 +371 397 -2.783725492315679e-03 +371 398 -2.532689975072680e-03 +371 399 -2.312252367280535e-03 +372 372 3.988394278128114e+01 +372 352 -5.371977266379821e-03 +372 353 -6.109381318875748e-03 +372 354 -6.996835383339698e-03 +372 355 -8.076052134892599e-03 +372 356 -9.403863770832825e-03 +372 357 -1.105916272470025e-02 +372 358 -1.315380302376550e-02 +372 359 -1.585023865775526e-02 +372 360 -1.939104886145111e-02 +372 361 -2.415034675252906e-02 +372 362 -3.072751892616544e-02 +372 363 -4.012781031913015e-02 +372 364 -5.413421453123170e-02 +372 365 -7.613960933881184e-02 +372 366 -1.132183869282770e-01 +372 367 -1.820810586422651e-01 +372 368 -3.301555353436754e-01 +372 369 -7.412185823610227e-01 +372 370 -3.165206906282890e+00 +372 371 -1.502055215852575e+01 +372 373 -1.502055215844906e+01 +372 374 -3.165206906282863e+00 +372 375 -7.412185823610182e-01 +372 376 -3.301555353436735e-01 +372 377 -1.820810586422648e-01 +372 378 -1.132183869282764e-01 +372 379 -7.613960933881123e-02 +372 380 -5.413421453123170e-02 +372 381 -4.012781031912996e-02 +372 382 -3.072751892616530e-02 +372 383 -2.415034675252890e-02 +372 384 -1.939104886145101e-02 +372 385 -1.585023865775526e-02 +372 386 -1.315380302376547e-02 +372 387 -1.105916272470025e-02 +372 388 -9.403863770832825e-03 +372 389 -8.076052134892573e-03 +372 390 -6.996835383339674e-03 +372 391 -6.109381318875728e-03 +372 392 -5.371977266379788e-03 +372 393 -4.753493624956895e-03 +372 394 -4.230349322908520e-03 +372 395 -3.784439171232928e-03 +372 396 -3.401691470521385e-03 +372 397 -3.071047067257393e-03 +372 398 -2.783725492315665e-03 +372 399 -2.532689975072674e-03 +373 373 3.988394278115153e+01 +373 352 -4.753493624956895e-03 +373 353 -5.371977266379788e-03 +373 354 -6.109381318875749e-03 +373 355 -6.996835383339648e-03 +373 356 -8.076052134892571e-03 +373 357 -9.403863770832828e-03 +373 358 -1.105916272470029e-02 +373 359 -1.315380302376546e-02 +373 360 -1.585023865775526e-02 +373 361 -1.939104886145118e-02 +373 362 -2.415034675252897e-02 +373 363 -3.072751892616557e-02 +373 364 -4.012781031912996e-02 +373 365 -5.413421453123172e-02 +373 366 -7.613960933881202e-02 +373 367 -1.132183869282764e-01 +373 368 -1.820810586422643e-01 +373 369 -3.301555353436777e-01 +373 370 -7.412185823610188e-01 +373 371 -3.165206906282861e+00 +373 372 -1.502055215844906e+01 +373 374 -1.502055215839543e+01 +373 375 -3.165206906282880e+00 +373 376 -7.412185823610176e-01 +373 377 -3.301555353436751e-01 +373 378 -1.820810586422647e-01 +373 379 -1.132183869282761e-01 +373 380 -7.613960933881175e-02 +373 381 -5.413421453123172e-02 +373 382 -4.012781031912977e-02 +373 383 -3.072751892616535e-02 +373 384 -2.415034675252883e-02 +373 385 -1.939104886145111e-02 +373 386 -1.585023865775527e-02 +373 387 -1.315380302376545e-02 +373 388 -1.105916272470025e-02 +373 389 -9.403863770832828e-03 +373 390 -8.076052134892609e-03 +373 391 -6.996835383339672e-03 +373 392 -6.109381318875748e-03 +373 393 -5.371977266379821e-03 +373 394 -4.753493624956895e-03 +373 395 -4.230349322908543e-03 +373 396 -3.784439171232927e-03 +373 397 -3.401691470521402e-03 +373 398 -3.071047067257392e-03 +373 399 -2.783725492315672e-03 +374 374 3.988394278106477e+01 +374 352 -4.230349322908543e-03 +374 353 -4.753493624956895e-03 +374 354 -5.371977266379821e-03 +374 355 -6.109381318875748e-03 +374 356 -6.996835383339672e-03 +374 357 -8.076052134892609e-03 +374 358 -9.403863770832828e-03 +374 359 -1.105916272470022e-02 +374 360 -1.315380302376542e-02 +374 361 -1.585023865775526e-02 +374 362 -1.939104886145104e-02 +374 363 -2.415034675252896e-02 +374 364 -3.072751892616530e-02 +374 365 -4.012781031912977e-02 +374 366 -5.413421453123171e-02 +374 367 -7.613960933881114e-02 +374 368 -1.132183869282758e-01 +374 369 -1.820810586422659e-01 +374 370 -3.301555353436755e-01 +374 371 -7.412185823610136e-01 +374 372 -3.165206906282863e+00 +374 373 -1.502055215839543e+01 +374 375 -1.502055215836222e+01 +374 376 -3.165206906282875e+00 +374 377 -7.412185823610175e-01 +374 378 -3.301555353436760e-01 +374 379 -1.820810586422651e-01 +374 380 -1.132183869282771e-01 +374 381 -7.613960933881202e-02 +374 382 -5.413421453123171e-02 +374 383 -4.012781031913003e-02 +374 384 -3.072751892616538e-02 +374 385 -2.415034675252906e-02 +374 386 -1.939104886145120e-02 +374 387 -1.585023865775530e-02 +374 388 -1.315380302376550e-02 +374 389 -1.105916272470029e-02 +374 390 -9.403863770832835e-03 +374 391 -8.076052134892578e-03 +374 392 -6.996835383339648e-03 +374 393 -6.109381318875748e-03 +374 394 -5.371977266379788e-03 +374 395 -4.753493624956895e-03 +374 396 -4.230349322908520e-03 +374 397 -3.784439171232928e-03 +374 398 -3.401691470521385e-03 +374 399 -3.071047067257385e-03 +375 375 3.988394278102307e+01 +375 352 -3.784439171232927e-03 +375 353 -4.230349322908520e-03 +375 354 -4.753493624956895e-03 +375 355 -5.371977266379788e-03 +375 356 -6.109381318875728e-03 +375 357 -6.996835383339673e-03 +375 358 -8.076052134892578e-03 +375 359 -9.403863770832827e-03 +375 360 -1.105916272470025e-02 +375 361 -1.315380302376550e-02 +375 362 -1.585023865775526e-02 +375 363 -1.939104886145118e-02 +375 364 -2.415034675252896e-02 +375 365 -3.072751892616544e-02 +375 366 -4.012781031913015e-02 +375 367 -5.413421453123170e-02 +375 368 -7.613960933881156e-02 +375 369 -1.132183869282766e-01 +375 370 -1.820810586422651e-01 +375 371 -3.301555353436761e-01 +375 372 -7.412185823610182e-01 +375 373 -3.165206906282880e+00 +375 374 -1.502055215836222e+01 +375 376 -1.502055215835490e+01 +375 377 -3.165206906282879e+00 +375 378 -7.412185823610232e-01 +375 379 -3.301555353436755e-01 +375 380 -1.820810586422659e-01 +375 381 -1.132183869282764e-01 +375 382 -7.613960933881114e-02 +375 383 -5.413421453123152e-02 +375 384 -4.012781031912967e-02 +375 385 -3.072751892616543e-02 +375 386 -2.415034675252899e-02 +375 387 -1.939104886145109e-02 +375 388 -1.585023865775526e-02 +375 389 -1.315380302376546e-02 +375 390 -1.105916272470023e-02 +375 391 -9.403863770832827e-03 +375 392 -8.076052134892587e-03 +375 393 -6.996835383339698e-03 +375 394 -6.109381318875749e-03 +375 395 -5.371977266379821e-03 +375 396 -4.753493624956895e-03 +375 397 -4.230349322908543e-03 +375 398 -3.784439171232927e-03 +375 399 -3.401691470521393e-03 +376 376 3.988394278105617e+01 +376 352 -3.401691470521403e-03 +376 353 -3.784439171232928e-03 +376 354 -4.230349322908545e-03 +376 355 -4.753493624956895e-03 +376 356 -5.371977266379805e-03 +376 357 -6.109381318875770e-03 +376 358 -6.996835383339676e-03 +376 359 -8.076052134892616e-03 +376 360 -9.403863770832828e-03 +376 361 -1.105916272470029e-02 +376 362 -1.315380302376546e-02 +376 363 -1.585023865775531e-02 +376 364 -1.939104886145111e-02 +376 365 -2.415034675252897e-02 +376 366 -3.072751892616558e-02 +376 367 -4.012781031912997e-02 +376 368 -5.413421453123173e-02 +376 369 -7.613960933881210e-02 +376 370 -1.132183869282773e-01 +376 371 -1.820810586422648e-01 +376 372 -3.301555353436735e-01 +376 373 -7.412185823610176e-01 +376 374 -3.165206906282875e+00 +376 375 -1.502055215835490e+01 +376 377 -1.502055215840048e+01 +376 378 -3.165206906282885e+00 +376 379 -7.412185823610211e-01 +376 380 -3.301555353436766e-01 +376 381 -1.820810586422646e-01 +376 382 -1.132183869282758e-01 +376 383 -7.613960933881136e-02 +376 384 -5.413421453123127e-02 +376 385 -4.012781031912995e-02 +376 386 -3.072751892616547e-02 +376 387 -2.415034675252894e-02 +376 388 -1.939104886145110e-02 +376 389 -1.585023865775526e-02 +376 390 -1.315380302376544e-02 +376 391 -1.105916272470025e-02 +376 392 -9.403863770832799e-03 +376 393 -8.076052134892592e-03 +376 394 -6.996835383339648e-03 +376 395 -6.109381318875748e-03 +376 396 -5.371977266379788e-03 +376 397 -4.753493624956895e-03 +376 398 -4.230349322908519e-03 +376 399 -3.784439171232916e-03 +377 377 3.988394278128565e+01 +377 352 -3.071047067257401e-03 +377 353 -3.401691470521394e-03 +377 354 -3.784439171232938e-03 +377 355 -4.230349322908531e-03 +377 356 -4.753493624956895e-03 +377 357 -5.371977266379823e-03 +377 358 -6.109381318875750e-03 +377 359 -6.996835383339699e-03 +377 360 -8.076052134892596e-03 +377 361 -9.403863770832856e-03 +377 362 -1.105916272470026e-02 +377 363 -1.315380302376550e-02 +377 364 -1.585023865775526e-02 +377 365 -1.939104886145111e-02 +377 366 -2.415034675252907e-02 +377 367 -3.072751892616544e-02 +377 368 -4.012781031912997e-02 +377 369 -5.413421453123187e-02 +377 370 -7.613960933881157e-02 +377 371 -1.132183869282762e-01 +377 372 -1.820810586422648e-01 +377 373 -3.301555353436751e-01 +377 374 -7.412185823610175e-01 +377 375 -3.165206906282879e+00 +377 376 -1.502055215840048e+01 +377 378 -1.502055215860533e+01 +377 379 -3.165206906282862e+00 +377 380 -7.412185823610069e-01 +377 381 -3.301555353436766e-01 +377 382 -1.820810586422649e-01 +377 383 -1.132183869282765e-01 +377 384 -7.613960933881112e-02 +377 385 -5.413421453123170e-02 +377 386 -4.012781031913001e-02 +377 387 -3.072751892616541e-02 +377 388 -2.415034675252896e-02 +377 389 -1.939104886145111e-02 +377 390 -1.585023865775523e-02 +377 391 -1.315380302376546e-02 +377 392 -1.105916272470022e-02 +377 393 -9.403863770832825e-03 +377 394 -8.076052134892571e-03 +377 395 -6.996835383339672e-03 +377 396 -6.109381318875728e-03 +377 397 -5.371977266379805e-03 +377 398 -4.753493624956881e-03 +377 399 -4.230349322908518e-03 +378 378 3.988394278152495e+01 +378 352 -2.783725492315672e-03 +378 353 -3.071047067257386e-03 +378 354 -3.401691470521394e-03 +378 355 -3.784439171232917e-03 +378 356 -4.230349322908519e-03 +378 357 -4.753493624956895e-03 +378 358 -5.371977266379788e-03 +378 359 -6.109381318875749e-03 +378 360 -6.996835383339650e-03 +378 361 -8.076052134892601e-03 +378 362 -9.403863770832820e-03 +378 363 -1.105916272470029e-02 +378 364 -1.315380302376546e-02 +378 365 -1.585023865775526e-02 +378 366 -1.939104886145118e-02 +378 367 -2.415034675252897e-02 +378 368 -3.072751892616545e-02 +378 369 -4.012781031913006e-02 +378 370 -5.413421453123172e-02 +378 371 -7.613960933881193e-02 +378 372 -1.132183869282764e-01 +378 373 -1.820810586422647e-01 +378 374 -3.301555353436760e-01 +378 375 -7.412185823610232e-01 +378 376 -3.165206906282885e+00 +378 377 -1.502055215860533e+01 +378 379 -1.502055215859221e+01 +378 380 -3.165206906282847e+00 +378 381 -7.412185823610196e-01 +378 382 -3.301555353436749e-01 +378 383 -1.820810586422653e-01 +378 384 -1.132183869282761e-01 +378 385 -7.613960933881156e-02 +378 386 -5.413421453123180e-02 +378 387 -4.012781031912992e-02 +378 388 -3.072751892616544e-02 +378 389 -2.415034675252897e-02 +378 390 -1.939104886145107e-02 +378 391 -1.585023865775526e-02 +378 392 -1.315380302376542e-02 +378 393 -1.105916272470025e-02 +378 394 -9.403863770832828e-03 +378 395 -8.076052134892609e-03 +378 396 -6.996835383339673e-03 +378 397 -6.109381318875769e-03 +378 398 -5.371977266379805e-03 +378 399 -4.753493624956894e-03 +379 379 3.988394278151356e+01 +379 352 -2.532689975072686e-03 +379 353 -2.783725492315673e-03 +379 354 -3.071047067257401e-03 +379 355 -3.401691470521393e-03 +379 356 -3.784439171232927e-03 +379 357 -4.230349322908543e-03 +379 358 -4.753493624956895e-03 +379 359 -5.371977266379821e-03 +379 360 -6.109381318875748e-03 +379 361 -6.996835383339698e-03 +379 362 -8.076052134892587e-03 +379 363 -9.403863770832827e-03 +379 364 -1.105916272470022e-02 +379 365 -1.315380302376542e-02 +379 366 -1.585023865775526e-02 +379 367 -1.939104886145104e-02 +379 368 -2.415034675252887e-02 +379 369 -3.072751892616537e-02 +379 370 -4.012781031912977e-02 +379 371 -5.413421453123171e-02 +379 372 -7.613960933881123e-02 +379 373 -1.132183869282761e-01 +379 374 -1.820810586422651e-01 +379 375 -3.301555353436755e-01 +379 376 -7.412185823610211e-01 +379 377 -3.165206906282862e+00 +379 378 -1.502055215859221e+01 +379 380 -1.502055215859652e+01 +379 381 -3.165206906282881e+00 +379 382 -7.412185823610244e-01 +379 383 -3.301555353436775e-01 +379 384 -1.820810586422652e-01 +379 385 -1.132183869282763e-01 +379 386 -7.613960933881206e-02 +379 387 -5.413421453123196e-02 +379 388 -4.012781031913015e-02 +379 389 -3.072751892616557e-02 +379 390 -2.415034675252901e-02 +379 391 -1.939104886145118e-02 +379 392 -1.585023865775526e-02 +379 393 -1.315380302376550e-02 +379 394 -1.105916272470029e-02 +379 395 -9.403863770832828e-03 +379 396 -8.076052134892578e-03 +379 397 -6.996835383339674e-03 +379 398 -6.109381318875728e-03 +379 399 -5.371977266379788e-03 +380 380 3.988394278151442e+01 +380 352 -2.312252367280536e-03 +380 353 -2.532689975072674e-03 +380 354 -2.783725492315672e-03 +380 355 -3.071047067257385e-03 +380 356 -3.401691470521384e-03 +380 357 -3.784439171232927e-03 +380 358 -4.230349322908520e-03 +380 359 -4.753493624956895e-03 +380 360 -5.371977266379788e-03 +380 361 -6.109381318875749e-03 +380 362 -6.996835383339648e-03 +380 363 -8.076052134892577e-03 +380 364 -9.403863770832827e-03 +380 365 -1.105916272470025e-02 +380 366 -1.315380302376550e-02 +380 367 -1.585023865775526e-02 +380 368 -1.939104886145111e-02 +380 369 -2.415034675252901e-02 +380 370 -3.072751892616544e-02 +380 371 -4.012781031913015e-02 +380 372 -5.413421453123170e-02 +380 373 -7.613960933881175e-02 +380 374 -1.132183869282771e-01 +380 375 -1.820810586422659e-01 +380 376 -3.301555353436766e-01 +380 377 -7.412185823610069e-01 +380 378 -3.165206906282847e+00 +380 379 -1.502055215859652e+01 +380 381 -1.502055215858806e+01 +380 382 -3.165206906282887e+00 +380 383 -7.412185823610213e-01 +380 384 -3.301555353436759e-01 +380 385 -1.820810586422644e-01 +380 386 -1.132183869282765e-01 +380 387 -7.613960933881139e-02 +380 388 -5.413421453123170e-02 +380 389 -4.012781031912996e-02 +380 390 -3.072751892616537e-02 +380 391 -2.415034675252897e-02 +380 392 -1.939104886145104e-02 +380 393 -1.585023865775526e-02 +380 394 -1.315380302376546e-02 +380 395 -1.105916272470022e-02 +380 396 -9.403863770832827e-03 +380 397 -8.076052134892615e-03 +380 398 -6.996835383339672e-03 +380 399 -6.109381318875748e-03 +381 381 3.988394278153933e+01 +381 352 -2.117777896667798e-03 +381 353 -2.312252367280536e-03 +381 354 -2.532689975072686e-03 +381 355 -2.783725492315672e-03 +381 356 -3.071047067257392e-03 +381 357 -3.401691470521402e-03 +381 358 -3.784439171232928e-03 +381 359 -4.230349322908543e-03 +381 360 -4.753493624956895e-03 +381 361 -5.371977266379821e-03 +381 362 -6.109381318875748e-03 +381 363 -6.996835383339672e-03 +381 364 -8.076052134892615e-03 +381 365 -9.403863770832827e-03 +381 366 -1.105916272470029e-02 +381 367 -1.315380302376546e-02 +381 368 -1.585023865775526e-02 +381 369 -1.939104886145114e-02 +381 370 -2.415034675252897e-02 +381 371 -3.072751892616557e-02 +381 372 -4.012781031912996e-02 +381 373 -5.413421453123172e-02 +381 374 -7.613960933881202e-02 +381 375 -1.132183869282764e-01 +381 376 -1.820810586422646e-01 +381 377 -3.301555353436766e-01 +381 378 -7.412185823610196e-01 +381 379 -3.165206906282881e+00 +381 380 -1.502055215858806e+01 +381 382 -1.502055215863998e+01 +381 383 -3.165206906282878e+00 +381 384 -7.412185823610167e-01 +381 385 -3.301555353436750e-01 +381 386 -1.820810586422653e-01 +381 387 -1.132183869282761e-01 +381 388 -7.613960933881167e-02 +381 389 -5.413421453123172e-02 +381 390 -4.012781031912987e-02 +381 391 -3.072751892616545e-02 +381 392 -2.415034675252887e-02 +381 393 -1.939104886145111e-02 +381 394 -1.585023865775526e-02 +381 395 -1.315380302376542e-02 +381 396 -1.105916272470025e-02 +381 397 -9.403863770832827e-03 +381 398 -8.076052134892566e-03 +381 399 -6.996835383339648e-03 +382 382 3.988394278164021e+01 +382 352 -1.945462087124853e-03 +382 353 -2.117777896667789e-03 +382 354 -2.312252367280536e-03 +382 355 -2.532689975072674e-03 +382 356 -2.783725492315666e-03 +382 357 -3.071047067257393e-03 +382 358 -3.401691470521385e-03 +382 359 -3.784439171232927e-03 +382 360 -4.230349322908520e-03 +382 361 -4.753493624956895e-03 +382 362 -5.371977266379788e-03 +382 363 -6.109381318875728e-03 +382 364 -6.996835383339673e-03 +382 365 -8.076052134892568e-03 +382 366 -9.403863770832828e-03 +382 367 -1.105916272470022e-02 +382 368 -1.315380302376542e-02 +382 369 -1.585023865775523e-02 +382 370 -1.939104886145104e-02 +382 371 -2.415034675252896e-02 +382 372 -3.072751892616530e-02 +382 373 -4.012781031912977e-02 +382 374 -5.413421453123171e-02 +382 375 -7.613960933881114e-02 +382 376 -1.132183869282758e-01 +382 377 -1.820810586422649e-01 +382 378 -3.301555353436749e-01 +382 379 -7.412185823610244e-01 +382 380 -3.165206906282887e+00 +382 381 -1.502055215863998e+01 +382 383 -1.502055215866003e+01 +382 384 -3.165206906282869e+00 +382 385 -7.412185823610182e-01 +382 386 -3.301555353436775e-01 +382 387 -1.820810586422654e-01 +382 388 -1.132183869282768e-01 +382 389 -7.613960933881189e-02 +382 390 -5.413421453123186e-02 +382 391 -4.012781031913015e-02 +382 392 -3.072751892616544e-02 +382 393 -2.415034675252906e-02 +382 394 -1.939104886145118e-02 +382 395 -1.585023865775526e-02 +382 396 -1.315380302376550e-02 +382 397 -1.105916272470029e-02 +382 398 -9.403863770832833e-03 +382 399 -8.076052134892599e-03 +383 383 3.988394278169709e+01 +383 352 -1.792160480940042e-03 +383 353 -1.945462087124853e-03 +383 354 -2.117777896667798e-03 +383 355 -2.312252367280535e-03 +383 356 -2.532689975072679e-03 +383 357 -2.783725492315679e-03 +383 358 -3.071047067257393e-03 +383 359 -3.401691470521402e-03 +383 360 -3.784439171232928e-03 +383 361 -4.230349322908543e-03 +383 362 -4.753493624956895e-03 +383 363 -5.371977266379805e-03 +383 364 -6.109381318875769e-03 +383 365 -6.996835383339674e-03 +383 366 -8.076052134892622e-03 +383 367 -9.403863770832816e-03 +383 368 -1.105916272470023e-02 +383 369 -1.315380302376545e-02 +383 370 -1.585023865775522e-02 +383 371 -1.939104886145113e-02 +383 372 -2.415034675252890e-02 +383 373 -3.072751892616535e-02 +383 374 -4.012781031913003e-02 +383 375 -5.413421453123152e-02 +383 376 -7.613960933881136e-02 +383 377 -1.132183869282765e-01 +383 378 -1.820810586422653e-01 +383 379 -3.301555353436775e-01 +383 380 -7.412185823610213e-01 +383 381 -3.165206906282878e+00 +383 382 -1.502055215866003e+01 +383 384 -1.502055215931064e+01 +383 385 -3.165206906282859e+00 +383 386 -7.412185823610185e-01 +383 387 -3.301555353436756e-01 +383 388 -1.820810586422647e-01 +383 389 -1.132183869282762e-01 +383 390 -7.613960933881166e-02 +383 391 -5.413421453123198e-02 +383 392 -4.012781031912993e-02 +383 393 -3.072751892616555e-02 +383 394 -2.415034675252904e-02 +383 395 -1.939104886145110e-02 +383 396 -1.585023865775530e-02 +383 397 -1.315380302376550e-02 +383 398 -1.105916272470026e-02 +383 399 -9.403863770832839e-03 +384 384 3.988394278169704e+01 +384 368 -9.403863770832804e-03 +384 369 -1.105916272470022e-02 +384 370 -1.315380302376540e-02 +384 371 -1.585023865775523e-02 +384 372 -1.939104886145101e-02 +384 373 -2.415034675252883e-02 +384 374 -3.072751892616538e-02 +384 375 -4.012781031912967e-02 +384 376 -5.413421453123127e-02 +384 377 -7.613960933881112e-02 +384 378 -1.132183869282761e-01 +384 379 -1.820810586422652e-01 +384 380 -3.301555353436759e-01 +384 381 -7.412185823610167e-01 +384 382 -3.165206906282869e+00 +384 383 -1.502055215931064e+01 +384 385 -1.502055215866002e+01 +384 386 -3.165206906282886e+00 +384 387 -7.412185823610218e-01 +384 388 -3.301555353436764e-01 +384 389 -1.820810586422658e-01 +384 390 -1.132183869282766e-01 +384 391 -7.613960933881213e-02 +384 392 -5.413421453123179e-02 +384 393 -4.012781031913021e-02 +384 394 -3.072751892616561e-02 +384 395 -2.415034675252899e-02 +384 396 -1.939104886145120e-02 +384 397 -1.585023865775533e-02 +384 398 -1.315380302376550e-02 +384 399 -1.105916272470030e-02 +384 400 -9.403863770832840e-03 +384 401 -8.076052134892592e-03 +384 402 -6.996835383339685e-03 +384 403 -6.109381318875739e-03 +384 404 -5.371977266379814e-03 +384 405 -4.753493624956888e-03 +384 406 -4.230349322908524e-03 +384 407 -3.784439171232932e-03 +384 408 -3.401691470521389e-03 +384 409 -3.071047067257397e-03 +384 410 -2.783725492315669e-03 +384 411 -2.532689975072683e-03 +384 412 -2.312252367280533e-03 +384 413 -2.117777896667791e-03 +384 414 -1.945462087124855e-03 +384 415 -1.792160480940037e-03 +385 385 3.988394278164024e+01 +385 368 -8.076052134892594e-03 +385 369 -9.403863770832823e-03 +385 370 -1.105916272470025e-02 +385 371 -1.315380302376550e-02 +385 372 -1.585023865775526e-02 +385 373 -1.939104886145111e-02 +385 374 -2.415034675252906e-02 +385 375 -3.072751892616543e-02 +385 376 -4.012781031912995e-02 +385 377 -5.413421453123170e-02 +385 378 -7.613960933881156e-02 +385 379 -1.132183869282763e-01 +385 380 -1.820810586422644e-01 +385 381 -3.301555353436750e-01 +385 382 -7.412185823610182e-01 +385 383 -3.165206906282859e+00 +385 384 -1.502055215866002e+01 +385 386 -1.502055215864003e+01 +385 387 -3.165206906282876e+00 +385 388 -7.412185823610207e-01 +385 389 -3.301555353436771e-01 +385 390 -1.820810586422654e-01 +385 391 -1.132183869282767e-01 +385 392 -7.613960933881123e-02 +385 393 -5.413421453123170e-02 +385 394 -4.012781031912996e-02 +385 395 -3.072751892616530e-02 +385 396 -2.415034675252896e-02 +385 397 -1.939104886145111e-02 +385 398 -1.585023865775523e-02 +385 399 -1.315380302376546e-02 +385 400 -1.105916272470022e-02 +385 401 -9.403863770832827e-03 +385 402 -8.076052134892615e-03 +385 403 -6.996835383339673e-03 +385 404 -6.109381318875769e-03 +385 405 -5.371977266379805e-03 +385 406 -4.753493624956894e-03 +385 407 -4.230349322908543e-03 +385 408 -3.784439171232927e-03 +385 409 -3.401691470521402e-03 +385 410 -3.071047067257393e-03 +385 411 -2.783725492315679e-03 +385 412 -2.532689975072680e-03 +385 413 -2.312252367280535e-03 +385 414 -2.117777896667798e-03 +385 415 -1.945462087124853e-03 +386 386 3.988394278153934e+01 +386 368 -6.996835383339698e-03 +386 369 -8.076052134892594e-03 +386 370 -9.403863770832830e-03 +386 371 -1.105916272470030e-02 +386 372 -1.315380302376547e-02 +386 373 -1.585023865775527e-02 +386 374 -1.939104886145120e-02 +386 375 -2.415034675252899e-02 +386 376 -3.072751892616547e-02 +386 377 -4.012781031913001e-02 +386 378 -5.413421453123180e-02 +386 379 -7.613960933881206e-02 +386 380 -1.132183869282765e-01 +386 381 -1.820810586422653e-01 +386 382 -3.301555353436775e-01 +386 383 -7.412185823610185e-01 +386 384 -3.165206906282886e+00 +386 385 -1.502055215864003e+01 +386 387 -1.502055215858801e+01 +386 388 -3.165206906282878e+00 +386 389 -7.412185823610211e-01 +386 390 -3.301555353436770e-01 +386 391 -1.820810586422648e-01 +386 392 -1.132183869282761e-01 +386 393 -7.613960933881157e-02 +386 394 -5.413421453123159e-02 +386 395 -4.012781031912967e-02 +386 396 -3.072751892616538e-02 +386 397 -2.415034675252892e-02 +386 398 -1.939104886145104e-02 +386 399 -1.585023865775523e-02 +386 400 -1.315380302376540e-02 +386 401 -1.105916272470024e-02 +386 402 -9.403863770832816e-03 +386 403 -8.076052134892563e-03 +386 404 -6.996835383339674e-03 +386 405 -6.109381318875728e-03 +386 406 -5.371977266379788e-03 +386 407 -4.753493624956895e-03 +386 408 -4.230349322908520e-03 +386 409 -3.784439171232928e-03 +386 410 -3.401691470521385e-03 +386 411 -3.071047067257393e-03 +386 412 -2.783725492315665e-03 +386 413 -2.532689975072674e-03 +386 414 -2.312252367280536e-03 +386 415 -2.117777896667789e-03 +387 387 3.988394278151445e+01 +387 368 -6.109381318875749e-03 +387 369 -6.996835383339648e-03 +387 370 -8.076052134892575e-03 +387 371 -9.403863770832847e-03 +387 372 -1.105916272470025e-02 +387 373 -1.315380302376545e-02 +387 374 -1.585023865775530e-02 +387 375 -1.939104886145109e-02 +387 376 -2.415034675252894e-02 +387 377 -3.072751892616541e-02 +387 378 -4.012781031912992e-02 +387 379 -5.413421453123196e-02 +387 380 -7.613960933881139e-02 +387 381 -1.132183869282761e-01 +387 382 -1.820810586422654e-01 +387 383 -3.301555353436756e-01 +387 384 -7.412185823610218e-01 +387 385 -3.165206906282876e+00 +387 386 -1.502055215858801e+01 +387 388 -1.502055215859656e+01 +387 389 -3.165206906282875e+00 +387 390 -7.412185823610223e-01 +387 391 -3.301555353436764e-01 +387 392 -1.820810586422660e-01 +387 393 -1.132183869282767e-01 +387 394 -7.613960933881161e-02 +387 395 -5.413421453123153e-02 +387 396 -4.012781031913003e-02 +387 397 -3.072751892616549e-02 +387 398 -2.415034675252895e-02 +387 399 -1.939104886145113e-02 +387 400 -1.585023865775522e-02 +387 401 -1.315380302376548e-02 +387 402 -1.105916272470027e-02 +387 403 -9.403863770832818e-03 +387 404 -8.076052134892622e-03 +387 405 -6.996835383339672e-03 +387 406 -6.109381318875748e-03 +387 407 -5.371977266379821e-03 +387 408 -4.753493624956895e-03 +387 409 -4.230349322908543e-03 +387 410 -3.784439171232927e-03 +387 411 -3.401691470521402e-03 +387 412 -3.071047067257392e-03 +387 413 -2.783725492315672e-03 +387 414 -2.532689975072686e-03 +387 415 -2.312252367280536e-03 +388 388 3.988394278151359e+01 +388 368 -5.371977266379821e-03 +388 369 -6.109381318875748e-03 +388 370 -6.996835383339672e-03 +388 371 -8.076052134892622e-03 +388 372 -9.403863770832825e-03 +388 373 -1.105916272470025e-02 +388 374 -1.315380302376550e-02 +388 375 -1.585023865775526e-02 +388 376 -1.939104886145110e-02 +388 377 -2.415034675252896e-02 +388 378 -3.072751892616544e-02 +388 379 -4.012781031913015e-02 +388 380 -5.413421453123170e-02 +388 381 -7.613960933881167e-02 +388 382 -1.132183869282768e-01 +388 383 -1.820810586422647e-01 +388 384 -3.301555353436764e-01 +388 385 -7.412185823610207e-01 +388 386 -3.165206906282878e+00 +388 387 -1.502055215859656e+01 +388 389 -1.502055215859221e+01 +388 390 -3.165206906282866e+00 +388 391 -7.412185823610129e-01 +388 392 -3.301555353436773e-01 +388 393 -1.820810586422651e-01 +388 394 -1.132183869282762e-01 +388 395 -7.613960933881123e-02 +388 396 -5.413421453123170e-02 +388 397 -4.012781031912996e-02 +388 398 -3.072751892616537e-02 +388 399 -2.415034675252897e-02 +388 400 -1.939104886145104e-02 +388 401 -1.585023865775526e-02 +388 402 -1.315380302376546e-02 +388 403 -1.105916272470022e-02 +388 404 -9.403863770832825e-03 +388 405 -8.076052134892573e-03 +388 406 -6.996835383339648e-03 +388 407 -6.109381318875748e-03 +388 408 -5.371977266379788e-03 +388 409 -4.753493624956895e-03 +388 410 -4.230349322908520e-03 +388 411 -3.784439171232928e-03 +388 412 -3.401691470521385e-03 +388 413 -3.071047067257385e-03 +388 414 -2.783725492315673e-03 +388 415 -2.532689975072674e-03 +389 389 3.988394278152497e+01 +389 368 -4.753493624956895e-03 +389 369 -5.371977266379788e-03 +389 370 -6.109381318875728e-03 +389 371 -6.996835383339673e-03 +389 372 -8.076052134892573e-03 +389 373 -9.403863770832828e-03 +389 374 -1.105916272470029e-02 +389 375 -1.315380302376546e-02 +389 376 -1.585023865775526e-02 +389 377 -1.939104886145111e-02 +389 378 -2.415034675252897e-02 +389 379 -3.072751892616557e-02 +389 380 -4.012781031912996e-02 +389 381 -5.413421453123172e-02 +389 382 -7.613960933881189e-02 +389 383 -1.132183869282762e-01 +389 384 -1.820810586422658e-01 +389 385 -3.301555353436771e-01 +389 386 -7.412185823610211e-01 +389 387 -3.165206906282875e+00 +389 388 -1.502055215859221e+01 +389 390 -1.502055215860532e+01 +389 391 -3.165206906282878e+00 +389 392 -7.412185823610241e-01 +389 393 -3.301555353436774e-01 +389 394 -1.820810586422651e-01 +389 395 -1.132183869282762e-01 +389 396 -7.613960933881167e-02 +389 397 -5.413421453123172e-02 +389 398 -4.012781031912987e-02 +389 399 -3.072751892616545e-02 +389 400 -2.415034675252887e-02 +389 401 -1.939104886145111e-02 +389 402 -1.585023865775526e-02 +389 403 -1.315380302376542e-02 +389 404 -1.105916272470025e-02 +389 405 -9.403863770832827e-03 +389 406 -8.076052134892587e-03 +389 407 -6.996835383339698e-03 +389 408 -6.109381318875749e-03 +389 409 -5.371977266379821e-03 +389 410 -4.753493624956895e-03 +389 411 -4.230349322908543e-03 +389 412 -3.784439171232927e-03 +389 413 -3.401691470521393e-03 +389 414 -3.071047067257401e-03 +389 415 -2.783725492315672e-03 +390 390 3.988394278128570e+01 +390 368 -4.230349322908543e-03 +390 369 -4.753493624956895e-03 +390 370 -5.371977266379805e-03 +390 371 -6.109381318875769e-03 +390 372 -6.996835383339674e-03 +390 373 -8.076052134892609e-03 +390 374 -9.403863770832835e-03 +390 375 -1.105916272470023e-02 +390 376 -1.315380302376544e-02 +390 377 -1.585023865775523e-02 +390 378 -1.939104886145107e-02 +390 379 -2.415034675252901e-02 +390 380 -3.072751892616537e-02 +390 381 -4.012781031912987e-02 +390 382 -5.413421453123186e-02 +390 383 -7.613960933881166e-02 +390 384 -1.132183869282766e-01 +390 385 -1.820810586422654e-01 +390 386 -3.301555353436770e-01 +390 387 -7.412185823610223e-01 +390 388 -3.165206906282866e+00 +390 389 -1.502055215860532e+01 +390 391 -1.502055215840050e+01 +390 392 -3.165206906282902e+00 +390 393 -7.412185823610224e-01 +390 394 -3.301555353436738e-01 +390 395 -1.820810586422653e-01 +390 396 -1.132183869282768e-01 +390 397 -7.613960933881178e-02 +390 398 -5.413421453123170e-02 +390 399 -4.012781031913006e-02 +390 400 -3.072751892616537e-02 +390 401 -2.415034675252901e-02 +390 402 -1.939104886145114e-02 +390 403 -1.585023865775523e-02 +390 404 -1.315380302376548e-02 +390 405 -1.105916272470027e-02 +390 406 -9.403863770832813e-03 +390 407 -8.076052134892594e-03 +390 408 -6.996835383339650e-03 +390 409 -6.109381318875748e-03 +390 410 -5.371977266379788e-03 +390 411 -4.753493624956895e-03 +390 412 -4.230349322908520e-03 +390 413 -3.784439171232916e-03 +390 414 -3.401691470521394e-03 +390 415 -3.071047067257386e-03 +391 391 3.988394278105620e+01 +391 368 -3.784439171232927e-03 +391 369 -4.230349322908519e-03 +391 370 -4.753493624956881e-03 +391 371 -5.371977266379805e-03 +391 372 -6.109381318875728e-03 +391 373 -6.996835383339672e-03 +391 374 -8.076052134892578e-03 +391 375 -9.403863770832827e-03 +391 376 -1.105916272470025e-02 +391 377 -1.315380302376546e-02 +391 378 -1.585023865775526e-02 +391 379 -1.939104886145118e-02 +391 380 -2.415034675252897e-02 +391 381 -3.072751892616545e-02 +391 382 -4.012781031913015e-02 +391 383 -5.413421453123198e-02 +391 384 -7.613960933881213e-02 +391 385 -1.132183869282767e-01 +391 386 -1.820810586422648e-01 +391 387 -3.301555353436764e-01 +391 388 -7.412185823610129e-01 +391 389 -3.165206906282878e+00 +391 390 -1.502055215840050e+01 +391 392 -1.502055215835494e+01 +391 393 -3.165206906282868e+00 +391 394 -7.412185823610140e-01 +391 395 -3.301555353436780e-01 +391 396 -1.820810586422653e-01 +391 397 -1.132183869282762e-01 +391 398 -7.613960933881157e-02 +391 399 -5.413421453123172e-02 +391 400 -4.012781031912977e-02 +391 401 -3.072751892616544e-02 +391 402 -2.415034675252897e-02 +391 403 -1.939104886145104e-02 +391 404 -1.585023865775526e-02 +391 405 -1.315380302376546e-02 +391 406 -1.105916272470024e-02 +391 407 -9.403863770832835e-03 +391 408 -8.076052134892590e-03 +391 409 -6.996835383339699e-03 +391 410 -6.109381318875751e-03 +391 411 -5.371977266379823e-03 +391 412 -4.753493624956896e-03 +391 413 -4.230349322908531e-03 +391 414 -3.784439171232938e-03 +391 415 -3.401691470521394e-03 +392 392 3.988394278102304e+01 +392 368 -3.401691470521393e-03 +392 369 -3.784439171232916e-03 +392 370 -4.230349322908518e-03 +392 371 -4.753493624956894e-03 +392 372 -5.371977266379788e-03 +392 373 -6.109381318875748e-03 +392 374 -6.996835383339648e-03 +392 375 -8.076052134892587e-03 +392 376 -9.403863770832799e-03 +392 377 -1.105916272470022e-02 +392 378 -1.315380302376542e-02 +392 379 -1.585023865775526e-02 +392 380 -1.939104886145104e-02 +392 381 -2.415034675252887e-02 +392 382 -3.072751892616544e-02 +392 383 -4.012781031912993e-02 +392 384 -5.413421453123179e-02 +392 385 -7.613960933881123e-02 +392 386 -1.132183869282761e-01 +392 387 -1.820810586422660e-01 +392 388 -3.301555353436773e-01 +392 389 -7.412185823610241e-01 +392 390 -3.165206906282902e+00 +392 391 -1.502055215835494e+01 +392 393 -1.502055215836216e+01 +392 394 -3.165206906282855e+00 +392 395 -7.412185823610175e-01 +392 396 -3.301555353436770e-01 +392 397 -1.820810586422651e-01 +392 398 -1.132183869282768e-01 +392 399 -7.613960933881189e-02 +392 400 -5.413421453123171e-02 +392 401 -4.012781031913015e-02 +392 402 -3.072751892616557e-02 +392 403 -2.415034675252896e-02 +392 404 -1.939104886145118e-02 +392 405 -1.585023865775531e-02 +392 406 -1.315380302376548e-02 +392 407 -1.105916272470029e-02 +392 408 -9.403863770832830e-03 +392 409 -8.076052134892622e-03 +392 410 -6.996835383339675e-03 +392 411 -6.109381318875770e-03 +392 412 -5.371977266379806e-03 +392 413 -4.753493624956895e-03 +392 414 -4.230349322908544e-03 +392 415 -3.784439171232928e-03 +393 393 3.988394278106477e+01 +393 368 -3.071047067257401e-03 +393 369 -3.401691470521393e-03 +393 370 -3.784439171232927e-03 +393 371 -4.230349322908543e-03 +393 372 -4.753493624956895e-03 +393 373 -5.371977266379821e-03 +393 374 -6.109381318875748e-03 +393 375 -6.996835383339698e-03 +393 376 -8.076052134892592e-03 +393 377 -9.403863770832825e-03 +393 378 -1.105916272470025e-02 +393 379 -1.315380302376550e-02 +393 380 -1.585023865775526e-02 +393 381 -1.939104886145111e-02 +393 382 -2.415034675252906e-02 +393 383 -3.072751892616555e-02 +393 384 -4.012781031913021e-02 +393 385 -5.413421453123170e-02 +393 386 -7.613960933881157e-02 +393 387 -1.132183869282767e-01 +393 388 -1.820810586422651e-01 +393 389 -3.301555353436774e-01 +393 390 -7.412185823610224e-01 +393 391 -3.165206906282868e+00 +393 392 -1.502055215836216e+01 +393 394 -1.502055215839545e+01 +393 395 -3.165206906282894e+00 +393 396 -7.412185823610251e-01 +393 397 -3.301555353436738e-01 +393 398 -1.820810586422648e-01 +393 399 -1.132183869282762e-01 +393 400 -7.613960933881123e-02 +393 401 -5.413421453123170e-02 +393 402 -4.012781031912996e-02 +393 403 -3.072751892616530e-02 +393 404 -2.415034675252896e-02 +393 405 -1.939104886145111e-02 +393 406 -1.585023865775523e-02 +393 407 -1.315380302376546e-02 +393 408 -1.105916272470022e-02 +393 409 -9.403863770832825e-03 +393 410 -8.076052134892573e-03 +393 411 -6.996835383339674e-03 +393 412 -6.109381318875728e-03 +393 413 -5.371977266379788e-03 +393 414 -4.753493624956895e-03 +393 415 -4.230349322908520e-03 +394 394 3.988394278115159e+01 +394 368 -2.783725492315672e-03 +394 369 -3.071047067257385e-03 +394 370 -3.401691470521384e-03 +394 371 -3.784439171232927e-03 +394 372 -4.230349322908520e-03 +394 373 -4.753493624956895e-03 +394 374 -5.371977266379788e-03 +394 375 -6.109381318875749e-03 +394 376 -6.996835383339648e-03 +394 377 -8.076052134892571e-03 +394 378 -9.403863770832828e-03 +394 379 -1.105916272470029e-02 +394 380 -1.315380302376546e-02 +394 381 -1.585023865775526e-02 +394 382 -1.939104886145118e-02 +394 383 -2.415034675252904e-02 +394 384 -3.072751892616561e-02 +394 385 -4.012781031912996e-02 +394 386 -5.413421453123159e-02 +394 387 -7.613960933881161e-02 +394 388 -1.132183869282762e-01 +394 389 -1.820810586422651e-01 +394 390 -3.301555353436738e-01 +394 391 -7.412185823610140e-01 +394 392 -3.165206906282855e+00 +394 393 -1.502055215839545e+01 +394 395 -1.502055215844910e+01 +394 396 -3.165206906282886e+00 +394 397 -7.412185823610160e-01 +394 398 -3.301555353436776e-01 +394 399 -1.820810586422658e-01 +394 400 -1.132183869282762e-01 +394 401 -7.613960933881167e-02 +394 402 -5.413421453123172e-02 +394 403 -4.012781031912977e-02 +394 404 -3.072751892616544e-02 +394 405 -2.415034675252897e-02 +394 406 -1.939104886145107e-02 +394 407 -1.585023865775526e-02 +394 408 -1.315380302376542e-02 +394 409 -1.105916272470025e-02 +394 410 -9.403863770832828e-03 +394 411 -8.076052134892609e-03 +394 412 -6.996835383339672e-03 +394 413 -6.109381318875748e-03 +394 414 -5.371977266379821e-03 +394 415 -4.753493624956895e-03 +395 395 3.988394278128119e+01 +395 368 -2.532689975072686e-03 +395 369 -2.783725492315672e-03 +395 370 -3.071047067257392e-03 +395 371 -3.401691470521402e-03 +395 372 -3.784439171232928e-03 +395 373 -4.230349322908543e-03 +395 374 -4.753493624956895e-03 +395 375 -5.371977266379821e-03 +395 376 -6.109381318875748e-03 +395 377 -6.996835383339672e-03 +395 378 -8.076052134892609e-03 +395 379 -9.403863770832828e-03 +395 380 -1.105916272470022e-02 +395 381 -1.315380302376542e-02 +395 382 -1.585023865775526e-02 +395 383 -1.939104886145110e-02 +395 384 -2.415034675252899e-02 +395 385 -3.072751892616530e-02 +395 386 -4.012781031912967e-02 +395 387 -5.413421453123153e-02 +395 388 -7.613960933881123e-02 +395 389 -1.132183869282762e-01 +395 390 -1.820810586422653e-01 +395 391 -3.301555353436780e-01 +395 392 -7.412185823610175e-01 +395 393 -3.165206906282894e+00 +395 394 -1.502055215844910e+01 +395 396 -1.502055215852576e+01 +395 397 -3.165206906282866e+00 +395 398 -7.412185823610156e-01 +395 399 -3.301555353436777e-01 +395 400 -1.820810586422656e-01 +395 401 -1.132183869282768e-01 +395 402 -7.613960933881189e-02 +395 403 -5.413421453123171e-02 +395 404 -4.012781031913015e-02 +395 405 -3.072751892616557e-02 +395 406 -2.415034675252901e-02 +395 407 -1.939104886145118e-02 +395 408 -1.585023865775526e-02 +395 409 -1.315380302376550e-02 +395 410 -1.105916272470029e-02 +395 411 -9.403863770832828e-03 +395 412 -8.076052134892578e-03 +395 413 -6.996835383339648e-03 +395 414 -6.109381318875748e-03 +395 415 -5.371977266379788e-03 +396 396 3.988394278146377e+01 +396 368 -2.312252367280536e-03 +396 369 -2.532689975072674e-03 +396 370 -2.783725492315666e-03 +396 371 -3.071047067257393e-03 +396 372 -3.401691470521385e-03 +396 373 -3.784439171232927e-03 +396 374 -4.230349322908520e-03 +396 375 -4.753493624956895e-03 +396 376 -5.371977266379788e-03 +396 377 -6.109381318875728e-03 +396 378 -6.996835383339673e-03 +396 379 -8.076052134892578e-03 +396 380 -9.403863770832827e-03 +396 381 -1.105916272470025e-02 +396 382 -1.315380302376550e-02 +396 383 -1.585023865775530e-02 +396 384 -1.939104886145120e-02 +396 385 -2.415034675252896e-02 +396 386 -3.072751892616538e-02 +396 387 -4.012781031913003e-02 +396 388 -5.413421453123170e-02 +396 389 -7.613960933881167e-02 +396 390 -1.132183869282768e-01 +396 391 -1.820810586422653e-01 +396 392 -3.301555353436770e-01 +396 393 -7.412185823610251e-01 +396 394 -3.165206906282886e+00 +396 395 -1.502055215852576e+01 +396 397 -1.502055215863300e+01 +396 398 -3.165206906282882e+00 +396 399 -7.412185823610244e-01 +396 400 -3.301555353436758e-01 +396 401 -1.820810586422648e-01 +396 402 -1.132183869282762e-01 +396 403 -7.613960933881134e-02 +396 404 -5.413421453123170e-02 +396 405 -4.012781031912996e-02 +396 406 -3.072751892616537e-02 +396 407 -2.415034675252897e-02 +396 408 -1.939104886145104e-02 +396 409 -1.585023865775526e-02 +396 410 -1.315380302376546e-02 +396 411 -1.105916272470022e-02 +396 412 -9.403863770832825e-03 +396 413 -8.076052134892594e-03 +396 414 -6.996835383339698e-03 +396 415 -6.109381318875749e-03 +397 397 3.988394278171956e+01 +397 368 -2.117777896667798e-03 +397 369 -2.312252367280535e-03 +397 370 -2.532689975072679e-03 +397 371 -2.783725492315679e-03 +397 372 -3.071047067257393e-03 +397 373 -3.401691470521402e-03 +397 374 -3.784439171232928e-03 +397 375 -4.230349322908543e-03 +397 376 -4.753493624956895e-03 +397 377 -5.371977266379805e-03 +397 378 -6.109381318875769e-03 +397 379 -6.996835383339674e-03 +397 380 -8.076052134892615e-03 +397 381 -9.403863770832827e-03 +397 382 -1.105916272470029e-02 +397 383 -1.315380302376550e-02 +397 384 -1.585023865775533e-02 +397 385 -1.939104886145111e-02 +397 386 -2.415034675252892e-02 +397 387 -3.072751892616549e-02 +397 388 -4.012781031912996e-02 +397 389 -5.413421453123172e-02 +397 390 -7.613960933881178e-02 +397 391 -1.132183869282762e-01 +397 392 -1.820810586422651e-01 +397 393 -3.301555353436738e-01 +397 394 -7.412185823610160e-01 +397 395 -3.165206906282866e+00 +397 396 -1.502055215863300e+01 +397 398 -1.502055215878377e+01 +397 399 -3.165206906282878e+00 +397 400 -7.412185823610242e-01 +397 401 -3.301555353436774e-01 +397 402 -1.820810586422654e-01 +397 403 -1.132183869282765e-01 +397 404 -7.613960933881156e-02 +397 405 -5.413421453123172e-02 +397 406 -4.012781031912987e-02 +397 407 -3.072751892616545e-02 +397 408 -2.415034675252887e-02 +397 409 -1.939104886145111e-02 +397 410 -1.585023865775526e-02 +397 411 -1.315380302376542e-02 +397 412 -1.105916272470025e-02 +397 413 -9.403863770832820e-03 +397 414 -8.076052134892594e-03 +397 415 -6.996835383339650e-03 +398 398 3.988394278208170e+01 +398 368 -1.945462087124853e-03 +398 369 -2.117777896667789e-03 +398 370 -2.312252367280531e-03 +398 371 -2.532689975072680e-03 +398 372 -2.783725492315665e-03 +398 373 -3.071047067257392e-03 +398 374 -3.401691470521385e-03 +398 375 -3.784439171232927e-03 +398 376 -4.230349322908519e-03 +398 377 -4.753493624956881e-03 +398 378 -5.371977266379805e-03 +398 379 -6.109381318875728e-03 +398 380 -6.996835383339672e-03 +398 381 -8.076052134892566e-03 +398 382 -9.403863770832833e-03 +398 383 -1.105916272470026e-02 +398 384 -1.315380302376550e-02 +398 385 -1.585023865775523e-02 +398 386 -1.939104886145104e-02 +398 387 -2.415034675252895e-02 +398 388 -3.072751892616537e-02 +398 389 -4.012781031912987e-02 +398 390 -5.413421453123170e-02 +398 391 -7.613960933881157e-02 +398 392 -1.132183869282768e-01 +398 393 -1.820810586422648e-01 +398 394 -3.301555353436776e-01 +398 395 -7.412185823610156e-01 +398 396 -3.165206906282882e+00 +398 397 -1.502055215878377e+01 +398 399 -1.502055215899857e+01 +398 400 -3.165206906282869e+00 +398 401 -7.412185823610229e-01 +398 402 -3.301555353436773e-01 +398 403 -1.820810586422656e-01 +398 404 -1.132183869282764e-01 +398 405 -7.613960933881180e-02 +398 406 -5.413421453123170e-02 +398 407 -4.012781031913006e-02 +398 408 -3.072751892616537e-02 +398 409 -2.415034675252901e-02 +398 410 -1.939104886145114e-02 +398 411 -1.585023865775523e-02 +398 412 -1.315380302376548e-02 +398 413 -1.105916272470027e-02 +398 414 -9.403863770832842e-03 +398 415 -8.076052134892596e-03 +399 399 3.988394278260307e+01 +399 368 -1.792160480940038e-03 +399 369 -1.945462087124848e-03 +399 370 -2.117777896667789e-03 +399 371 -2.312252367280535e-03 +399 372 -2.532689975072674e-03 +399 373 -2.783725492315672e-03 +399 374 -3.071047067257385e-03 +399 375 -3.401691470521393e-03 +399 376 -3.784439171232916e-03 +399 377 -4.230349322908518e-03 +399 378 -4.753493624956894e-03 +399 379 -5.371977266379788e-03 +399 380 -6.109381318875748e-03 +399 381 -6.996835383339648e-03 +399 382 -8.076052134892599e-03 +399 383 -9.403863770832839e-03 +399 384 -1.105916272470030e-02 +399 385 -1.315380302376546e-02 +399 386 -1.585023865775523e-02 +399 387 -1.939104886145113e-02 +399 388 -2.415034675252897e-02 +399 389 -3.072751892616545e-02 +399 390 -4.012781031913006e-02 +399 391 -5.413421453123172e-02 +399 392 -7.613960933881189e-02 +399 393 -1.132183869282762e-01 +399 394 -1.820810586422658e-01 +399 395 -3.301555353436777e-01 +399 396 -7.412185823610244e-01 +399 397 -3.165206906282878e+00 +399 398 -1.502055215899857e+01 +399 400 -1.502055215931068e+01 +399 401 -3.165206906282886e+00 +399 402 -7.412185823610185e-01 +399 403 -3.301555353436755e-01 +399 404 -1.820810586422649e-01 +399 405 -1.132183869282764e-01 +399 406 -7.613960933881157e-02 +399 407 -5.413421453123172e-02 +399 408 -4.012781031912977e-02 +399 409 -3.072751892616544e-02 +399 410 -2.415034675252897e-02 +399 411 -1.939104886145104e-02 +399 412 -1.585023865775526e-02 +399 413 -1.315380302376546e-02 +399 414 -1.105916272470026e-02 +399 415 -9.403863770832828e-03 +400 400 3.988394278260306e+01 +400 384 -9.403863770832840e-03 +400 385 -1.105916272470022e-02 +400 386 -1.315380302376540e-02 +400 387 -1.585023865775522e-02 +400 388 -1.939104886145104e-02 +400 389 -2.415034675252887e-02 +400 390 -3.072751892616537e-02 +400 391 -4.012781031912977e-02 +400 392 -5.413421453123171e-02 +400 393 -7.613960933881123e-02 +400 394 -1.132183869282762e-01 +400 395 -1.820810586422656e-01 +400 396 -3.301555353436758e-01 +400 397 -7.412185823610242e-01 +400 398 -3.165206906282869e+00 +400 399 -1.502055215931068e+01 +400 401 -1.502055215899860e+01 +400 402 -3.165206906282862e+00 +400 403 -7.412185823610178e-01 +400 404 -3.301555353436765e-01 +400 405 -1.820810586422654e-01 +400 406 -1.132183869282768e-01 +400 407 -7.613960933881189e-02 +400 408 -5.413421453123171e-02 +400 409 -4.012781031913015e-02 +400 410 -3.072751892616557e-02 +400 411 -2.415034675252896e-02 +400 412 -1.939104886145118e-02 +400 413 -1.585023865775531e-02 +400 414 -1.315380302376550e-02 +400 415 -1.105916272470029e-02 +400 416 -9.403863770832828e-03 +400 417 -8.076052134892578e-03 +400 418 -6.996835383339674e-03 +400 419 -6.109381318875728e-03 +400 420 -5.371977266379788e-03 +400 421 -4.753493624956895e-03 +400 422 -4.230349322908520e-03 +400 423 -3.784439171232928e-03 +400 424 -3.401691470521385e-03 +400 425 -3.071047067257393e-03 +400 426 -2.783725492315665e-03 +400 427 -2.532689975072674e-03 +400 428 -2.312252367280536e-03 +400 429 -2.117777896667789e-03 +400 430 -1.945462087124853e-03 +400 431 -1.792160480940035e-03 +401 401 3.988394278208168e+01 +401 384 -8.076052134892592e-03 +401 385 -9.403863770832827e-03 +401 386 -1.105916272470024e-02 +401 387 -1.315380302376548e-02 +401 388 -1.585023865775526e-02 +401 389 -1.939104886145111e-02 +401 390 -2.415034675252901e-02 +401 391 -3.072751892616544e-02 +401 392 -4.012781031913015e-02 +401 393 -5.413421453123170e-02 +401 394 -7.613960933881167e-02 +401 395 -1.132183869282768e-01 +401 396 -1.820810586422648e-01 +401 397 -3.301555353436774e-01 +401 398 -7.412185823610229e-01 +401 399 -3.165206906282886e+00 +401 400 -1.502055215899860e+01 +401 402 -1.502055215878372e+01 +401 403 -3.165206906282869e+00 +401 404 -7.412185823610195e-01 +401 405 -3.301555353436767e-01 +401 406 -1.820810586422655e-01 +401 407 -1.132183869282762e-01 +401 408 -7.613960933881134e-02 +401 409 -5.413421453123170e-02 +401 410 -4.012781031912996e-02 +401 411 -3.072751892616530e-02 +401 412 -2.415034675252896e-02 +401 413 -1.939104886145111e-02 +401 414 -1.585023865775526e-02 +401 415 -1.315380302376546e-02 +401 416 -1.105916272470022e-02 +401 417 -9.403863770832827e-03 +401 418 -8.076052134892615e-03 +401 419 -6.996835383339672e-03 +401 420 -6.109381318875748e-03 +401 421 -5.371977266379821e-03 +401 422 -4.753493624956895e-03 +401 423 -4.230349322908543e-03 +401 424 -3.784439171232927e-03 +401 425 -3.401691470521402e-03 +401 426 -3.071047067257392e-03 +401 427 -2.783725492315672e-03 +401 428 -2.532689975072686e-03 +401 429 -2.312252367280536e-03 +401 430 -2.117777896667798e-03 +401 431 -1.945462087124853e-03 +402 402 3.988394278171953e+01 +402 384 -6.996835383339685e-03 +402 385 -8.076052134892615e-03 +402 386 -9.403863770832816e-03 +402 387 -1.105916272470027e-02 +402 388 -1.315380302376546e-02 +402 389 -1.585023865775526e-02 +402 390 -1.939104886145114e-02 +402 391 -2.415034675252897e-02 +402 392 -3.072751892616557e-02 +402 393 -4.012781031912996e-02 +402 394 -5.413421453123172e-02 +402 395 -7.613960933881189e-02 +402 396 -1.132183869282762e-01 +402 397 -1.820810586422654e-01 +402 398 -3.301555353436773e-01 +402 399 -7.412185823610185e-01 +402 400 -3.165206906282862e+00 +402 401 -1.502055215878372e+01 +402 403 -1.502055215863303e+01 +402 404 -3.165206906282877e+00 +402 405 -7.412185823610207e-01 +402 406 -3.301555353436764e-01 +402 407 -1.820810586422650e-01 +402 408 -1.132183869282765e-01 +402 409 -7.613960933881156e-02 +402 410 -5.413421453123172e-02 +402 411 -4.012781031912977e-02 +402 412 -3.072751892616544e-02 +402 413 -2.415034675252897e-02 +402 414 -1.939104886145111e-02 +402 415 -1.585023865775526e-02 +402 416 -1.315380302376542e-02 +402 417 -1.105916272470025e-02 +402 418 -9.403863770832827e-03 +402 419 -8.076052134892566e-03 +402 420 -6.996835383339648e-03 +402 421 -6.109381318875748e-03 +402 422 -5.371977266379788e-03 +402 423 -4.753493624956895e-03 +402 424 -4.230349322908520e-03 +402 425 -3.784439171232928e-03 +402 426 -3.401691470521385e-03 +402 427 -3.071047067257385e-03 +402 428 -2.783725492315673e-03 +402 429 -2.532689975072674e-03 +402 430 -2.312252367280536e-03 +402 431 -2.117777896667789e-03 +403 403 3.988394278146372e+01 +403 384 -6.109381318875739e-03 +403 385 -6.996835383339673e-03 +403 386 -8.076052134892563e-03 +403 387 -9.403863770832818e-03 +403 388 -1.105916272470022e-02 +403 389 -1.315380302376542e-02 +403 390 -1.585023865775523e-02 +403 391 -1.939104886145104e-02 +403 392 -2.415034675252896e-02 +403 393 -3.072751892616530e-02 +403 394 -4.012781031912977e-02 +403 395 -5.413421453123171e-02 +403 396 -7.613960933881134e-02 +403 397 -1.132183869282765e-01 +403 398 -1.820810586422656e-01 +403 399 -3.301555353436755e-01 +403 400 -7.412185823610178e-01 +403 401 -3.165206906282869e+00 +403 402 -1.502055215863303e+01 +403 404 -1.502055215852574e+01 +403 405 -3.165206906282870e+00 +403 406 -7.412185823610183e-01 +403 407 -3.301555353436756e-01 +403 408 -1.820810586422651e-01 +403 409 -1.132183869282764e-01 +403 410 -7.613960933881191e-02 +403 411 -5.413421453123171e-02 +403 412 -4.012781031913015e-02 +403 413 -3.072751892616558e-02 +403 414 -2.415034675252907e-02 +403 415 -1.939104886145118e-02 +403 416 -1.585023865775526e-02 +403 417 -1.315380302376550e-02 +403 418 -1.105916272470029e-02 +403 419 -9.403863770832833e-03 +403 420 -8.076052134892599e-03 +403 421 -6.996835383339698e-03 +403 422 -6.109381318875749e-03 +403 423 -5.371977266379821e-03 +403 424 -4.753493624956895e-03 +403 425 -4.230349322908543e-03 +403 426 -3.784439171232927e-03 +403 427 -3.401691470521393e-03 +403 428 -3.071047067257401e-03 +403 429 -2.783725492315672e-03 +403 430 -2.532689975072686e-03 +403 431 -2.312252367280536e-03 +404 404 3.988394278128114e+01 +404 384 -5.371977266379814e-03 +404 385 -6.109381318875769e-03 +404 386 -6.996835383339674e-03 +404 387 -8.076052134892622e-03 +404 388 -9.403863770832825e-03 +404 389 -1.105916272470025e-02 +404 390 -1.315380302376548e-02 +404 391 -1.585023865775526e-02 +404 392 -1.939104886145118e-02 +404 393 -2.415034675252896e-02 +404 394 -3.072751892616544e-02 +404 395 -4.012781031913015e-02 +404 396 -5.413421453123170e-02 +404 397 -7.613960933881156e-02 +404 398 -1.132183869282764e-01 +404 399 -1.820810586422649e-01 +404 400 -3.301555353436765e-01 +404 401 -7.412185823610195e-01 +404 402 -3.165206906282877e+00 +404 403 -1.502055215852574e+01 +404 405 -1.502055215844907e+01 +404 406 -3.165206906282878e+00 +404 407 -7.412185823610187e-01 +404 408 -3.301555353436775e-01 +404 409 -1.820810586422656e-01 +404 410 -1.132183869282764e-01 +404 411 -7.613960933881134e-02 +404 412 -5.413421453123170e-02 +404 413 -4.012781031912997e-02 +404 414 -3.072751892616544e-02 +404 415 -2.415034675252897e-02 +404 416 -1.939104886145104e-02 +404 417 -1.585023865775526e-02 +404 418 -1.315380302376546e-02 +404 419 -1.105916272470023e-02 +404 420 -9.403863770832820e-03 +404 421 -8.076052134892587e-03 +404 422 -6.996835383339650e-03 +404 423 -6.109381318875748e-03 +404 424 -5.371977266379788e-03 +404 425 -4.753493624956895e-03 +404 426 -4.230349322908520e-03 +404 427 -3.784439171232916e-03 +404 428 -3.401691470521394e-03 +404 429 -3.071047067257386e-03 +404 430 -2.783725492315673e-03 +404 431 -2.532689975072674e-03 +405 405 3.988394278115155e+01 +405 384 -4.753493624956888e-03 +405 385 -5.371977266379805e-03 +405 386 -6.109381318875728e-03 +405 387 -6.996835383339672e-03 +405 388 -8.076052134892573e-03 +405 389 -9.403863770832827e-03 +405 390 -1.105916272470027e-02 +405 391 -1.315380302376546e-02 +405 392 -1.585023865775531e-02 +405 393 -1.939104886145111e-02 +405 394 -2.415034675252897e-02 +405 395 -3.072751892616557e-02 +405 396 -4.012781031912996e-02 +405 397 -5.413421453123172e-02 +405 398 -7.613960933881180e-02 +405 399 -1.132183869282764e-01 +405 400 -1.820810586422654e-01 +405 401 -3.301555353436767e-01 +405 402 -7.412185823610207e-01 +405 403 -3.165206906282870e+00 +405 404 -1.502055215844907e+01 +405 406 -1.502055215839542e+01 +405 407 -3.165206906282863e+00 +405 408 -7.412185823610180e-01 +405 409 -3.301555353436755e-01 +405 410 -1.820810586422652e-01 +405 411 -1.132183869282765e-01 +405 412 -7.613960933881156e-02 +405 413 -5.413421453123173e-02 +405 414 -4.012781031912997e-02 +405 415 -3.072751892616545e-02 +405 416 -2.415034675252887e-02 +405 417 -1.939104886145111e-02 +405 418 -1.585023865775526e-02 +405 419 -1.315380302376544e-02 +405 420 -1.105916272470025e-02 +405 421 -9.403863770832814e-03 +405 422 -8.076052134892596e-03 +405 423 -6.996835383339699e-03 +405 424 -6.109381318875751e-03 +405 425 -5.371977266379823e-03 +405 426 -4.753493624956896e-03 +405 427 -4.230349322908531e-03 +405 428 -3.784439171232938e-03 +405 429 -3.401691470521394e-03 +405 430 -3.071047067257401e-03 +405 431 -2.783725492315673e-03 +406 406 3.988394278106477e+01 +406 384 -4.230349322908524e-03 +406 385 -4.753493624956894e-03 +406 386 -5.371977266379788e-03 +406 387 -6.109381318875748e-03 +406 388 -6.996835383339648e-03 +406 389 -8.076052134892587e-03 +406 390 -9.403863770832813e-03 +406 391 -1.105916272470024e-02 +406 392 -1.315380302376548e-02 +406 393 -1.585023865775523e-02 +406 394 -1.939104886145107e-02 +406 395 -2.415034675252901e-02 +406 396 -3.072751892616537e-02 +406 397 -4.012781031912987e-02 +406 398 -5.413421453123170e-02 +406 399 -7.613960933881157e-02 +406 400 -1.132183869282768e-01 +406 401 -1.820810586422655e-01 +406 402 -3.301555353436764e-01 +406 403 -7.412185823610183e-01 +406 404 -3.165206906282878e+00 +406 405 -1.502055215839542e+01 +406 407 -1.502055215836221e+01 +406 408 -3.165206906282867e+00 +406 409 -7.412185823610147e-01 +406 410 -3.301555353436762e-01 +406 411 -1.820810586422651e-01 +406 412 -1.132183869282764e-01 +406 413 -7.613960933881191e-02 +406 414 -5.413421453123187e-02 +406 415 -4.012781031913006e-02 +406 416 -3.072751892616537e-02 +406 417 -2.415034675252901e-02 +406 418 -1.939104886145114e-02 +406 419 -1.585023865775526e-02 +406 420 -1.315380302376548e-02 +406 421 -1.105916272470023e-02 +406 422 -9.403863770832833e-03 +406 423 -8.076052134892618e-03 +406 424 -6.996835383339675e-03 +406 425 -6.109381318875770e-03 +406 426 -5.371977266379806e-03 +406 427 -4.753493624956895e-03 +406 428 -4.230349322908544e-03 +406 429 -3.784439171232928e-03 +406 430 -3.401691470521403e-03 +406 431 -3.071047067257394e-03 +407 407 3.988394278102304e+01 +407 384 -3.784439171232932e-03 +407 385 -4.230349322908543e-03 +407 386 -4.753493624956895e-03 +407 387 -5.371977266379821e-03 +407 388 -6.109381318875748e-03 +407 389 -6.996835383339698e-03 +407 390 -8.076052134892594e-03 +407 391 -9.403863770832835e-03 +407 392 -1.105916272470029e-02 +407 393 -1.315380302376546e-02 +407 394 -1.585023865775526e-02 +407 395 -1.939104886145118e-02 +407 396 -2.415034675252897e-02 +407 397 -3.072751892616545e-02 +407 398 -4.012781031913006e-02 +407 399 -5.413421453123172e-02 +407 400 -7.613960933881189e-02 +407 401 -1.132183869282762e-01 +407 402 -1.820810586422650e-01 +407 403 -3.301555353436756e-01 +407 404 -7.412185823610187e-01 +407 405 -3.165206906282863e+00 +407 406 -1.502055215836221e+01 +407 408 -1.502055215835492e+01 +407 409 -3.165206906282870e+00 +407 410 -7.412185823610229e-01 +407 411 -3.301555353436775e-01 +407 412 -1.820810586422656e-01 +407 413 -1.132183869282767e-01 +407 414 -7.613960933881157e-02 +407 415 -5.413421453123172e-02 +407 416 -4.012781031912977e-02 +407 417 -3.072751892616544e-02 +407 418 -2.415034675252897e-02 +407 419 -1.939104886145107e-02 +407 420 -1.585023865775526e-02 +407 421 -1.315380302376542e-02 +407 422 -1.105916272470025e-02 +407 423 -9.403863770832827e-03 +407 424 -8.076052134892568e-03 +407 425 -6.996835383339674e-03 +407 426 -6.109381318875728e-03 +407 427 -5.371977266379788e-03 +407 428 -4.753493624956895e-03 +407 429 -4.230349322908520e-03 +407 430 -3.784439171232928e-03 +407 431 -3.401691470521385e-03 +408 408 3.988394278105615e+01 +408 384 -3.401691470521389e-03 +408 385 -3.784439171232927e-03 +408 386 -4.230349322908520e-03 +408 387 -4.753493624956895e-03 +408 388 -5.371977266379788e-03 +408 389 -6.109381318875749e-03 +408 390 -6.996835383339650e-03 +408 391 -8.076052134892590e-03 +408 392 -9.403863770832830e-03 +408 393 -1.105916272470022e-02 +408 394 -1.315380302376542e-02 +408 395 -1.585023865775526e-02 +408 396 -1.939104886145104e-02 +408 397 -2.415034675252887e-02 +408 398 -3.072751892616537e-02 +408 399 -4.012781031912977e-02 +408 400 -5.413421453123171e-02 +408 401 -7.613960933881134e-02 +408 402 -1.132183869282765e-01 +408 403 -1.820810586422651e-01 +408 404 -3.301555353436775e-01 +408 405 -7.412185823610180e-01 +408 406 -3.165206906282867e+00 +408 407 -1.502055215835492e+01 +408 409 -1.502055215840047e+01 +408 410 -3.165206906282872e+00 +408 411 -7.412185823610213e-01 +408 412 -3.301555353436746e-01 +408 413 -1.820810586422647e-01 +408 414 -1.132183869282764e-01 +408 415 -7.613960933881191e-02 +408 416 -5.413421453123171e-02 +408 417 -4.012781031913015e-02 +408 418 -3.072751892616557e-02 +408 419 -2.415034675252901e-02 +408 420 -1.939104886145118e-02 +408 421 -1.585023865775526e-02 +408 422 -1.315380302376550e-02 +408 423 -1.105916272470029e-02 +408 424 -9.403863770832828e-03 +408 425 -8.076052134892622e-03 +408 426 -6.996835383339672e-03 +408 427 -6.109381318875748e-03 +408 428 -5.371977266379821e-03 +408 429 -4.753493624956895e-03 +408 430 -4.230349322908543e-03 +408 431 -3.784439171232927e-03 +409 409 3.988394278128564e+01 +409 384 -3.071047067257397e-03 +409 385 -3.401691470521402e-03 +409 386 -3.784439171232928e-03 +409 387 -4.230349322908543e-03 +409 388 -4.753493624956895e-03 +409 389 -5.371977266379821e-03 +409 390 -6.109381318875748e-03 +409 391 -6.996835383339699e-03 +409 392 -8.076052134892622e-03 +409 393 -9.403863770832825e-03 +409 394 -1.105916272470025e-02 +409 395 -1.315380302376550e-02 +409 396 -1.585023865775526e-02 +409 397 -1.939104886145111e-02 +409 398 -2.415034675252901e-02 +409 399 -3.072751892616544e-02 +409 400 -4.012781031913015e-02 +409 401 -5.413421453123170e-02 +409 402 -7.613960933881156e-02 +409 403 -1.132183869282764e-01 +409 404 -1.820810586422656e-01 +409 405 -3.301555353436755e-01 +409 406 -7.412185823610147e-01 +409 407 -3.165206906282870e+00 +409 408 -1.502055215840047e+01 +409 410 -1.502055215860532e+01 +409 411 -3.165206906282884e+00 +409 412 -7.412185823610230e-01 +409 413 -3.301555353436774e-01 +409 414 -1.820810586422650e-01 +409 415 -1.132183869282764e-01 +409 416 -7.613960933881134e-02 +409 417 -5.413421453123170e-02 +409 418 -4.012781031912996e-02 +409 419 -3.072751892616537e-02 +409 420 -2.415034675252897e-02 +409 421 -1.939104886145104e-02 +409 422 -1.585023865775526e-02 +409 423 -1.315380302376546e-02 +409 424 -1.105916272470022e-02 +409 425 -9.403863770832825e-03 +409 426 -8.076052134892573e-03 +409 427 -6.996835383339648e-03 +409 428 -6.109381318875748e-03 +409 429 -5.371977266379788e-03 +409 430 -4.753493624956895e-03 +409 431 -4.230349322908520e-03 +410 410 3.988394278152496e+01 +410 384 -2.783725492315669e-03 +410 385 -3.071047067257393e-03 +410 386 -3.401691470521385e-03 +410 387 -3.784439171232927e-03 +410 388 -4.230349322908520e-03 +410 389 -4.753493624956895e-03 +410 390 -5.371977266379788e-03 +410 391 -6.109381318875751e-03 +410 392 -6.996835383339675e-03 +410 393 -8.076052134892573e-03 +410 394 -9.403863770832828e-03 +410 395 -1.105916272470029e-02 +410 396 -1.315380302376546e-02 +410 397 -1.585023865775526e-02 +410 398 -1.939104886145114e-02 +410 399 -2.415034675252897e-02 +410 400 -3.072751892616557e-02 +410 401 -4.012781031912996e-02 +410 402 -5.413421453123172e-02 +410 403 -7.613960933881191e-02 +410 404 -1.132183869282764e-01 +410 405 -1.820810586422652e-01 +410 406 -3.301555353436762e-01 +410 407 -7.412185823610229e-01 +410 408 -3.165206906282872e+00 +410 409 -1.502055215860532e+01 +410 411 -1.502055215859221e+01 +410 412 -3.165206906282878e+00 +410 413 -7.412185823610180e-01 +410 414 -3.301555353436734e-01 +410 415 -1.820810586422650e-01 +410 416 -1.132183869282765e-01 +410 417 -7.613960933881156e-02 +410 418 -5.413421453123172e-02 +410 419 -4.012781031912987e-02 +410 420 -3.072751892616545e-02 +410 421 -2.415034675252887e-02 +410 422 -1.939104886145111e-02 +410 423 -1.585023865775526e-02 +410 424 -1.315380302376542e-02 +410 425 -1.105916272470025e-02 +410 426 -9.403863770832827e-03 +410 427 -8.076052134892587e-03 +410 428 -6.996835383339698e-03 +410 429 -6.109381318875749e-03 +410 430 -5.371977266379821e-03 +410 431 -4.753493624956895e-03 +411 411 3.988394278151357e+01 +411 384 -2.532689975072683e-03 +411 385 -2.783725492315679e-03 +411 386 -3.071047067257393e-03 +411 387 -3.401691470521402e-03 +411 388 -3.784439171232928e-03 +411 389 -4.230349322908543e-03 +411 390 -4.753493624956895e-03 +411 391 -5.371977266379823e-03 +411 392 -6.109381318875770e-03 +411 393 -6.996835383339674e-03 +411 394 -8.076052134892609e-03 +411 395 -9.403863770832828e-03 +411 396 -1.105916272470022e-02 +411 397 -1.315380302376542e-02 +411 398 -1.585023865775523e-02 +411 399 -1.939104886145104e-02 +411 400 -2.415034675252896e-02 +411 401 -3.072751892616530e-02 +411 402 -4.012781031912977e-02 +411 403 -5.413421453123171e-02 +411 404 -7.613960933881134e-02 +411 405 -1.132183869282765e-01 +411 406 -1.820810586422651e-01 +411 407 -3.301555353436775e-01 +411 408 -7.412185823610213e-01 +411 409 -3.165206906282884e+00 +411 410 -1.502055215859221e+01 +411 412 -1.502055215859655e+01 +411 413 -3.165206906282865e+00 +411 414 -7.412185823610058e-01 +411 415 -3.301555353436726e-01 +411 416 -1.820810586422652e-01 +411 417 -1.132183869282764e-01 +411 418 -7.613960933881202e-02 +411 419 -5.413421453123186e-02 +411 420 -4.012781031913015e-02 +411 421 -3.072751892616544e-02 +411 422 -2.415034675252906e-02 +411 423 -1.939104886145118e-02 +411 424 -1.585023865775526e-02 +411 425 -1.315380302376550e-02 +411 426 -1.105916272470029e-02 +411 427 -9.403863770832827e-03 +411 428 -8.076052134892601e-03 +411 429 -6.996835383339650e-03 +411 430 -6.109381318875748e-03 +411 431 -5.371977266379788e-03 +412 412 3.988394278151443e+01 +412 384 -2.312252367280533e-03 +412 385 -2.532689975072680e-03 +412 386 -2.783725492315665e-03 +412 387 -3.071047067257392e-03 +412 388 -3.401691470521385e-03 +412 389 -3.784439171232927e-03 +412 390 -4.230349322908520e-03 +412 391 -4.753493624956896e-03 +412 392 -5.371977266379806e-03 +412 393 -6.109381318875728e-03 +412 394 -6.996835383339672e-03 +412 395 -8.076052134892578e-03 +412 396 -9.403863770832825e-03 +412 397 -1.105916272470025e-02 +412 398 -1.315380302376548e-02 +412 399 -1.585023865775526e-02 +412 400 -1.939104886145118e-02 +412 401 -2.415034675252896e-02 +412 402 -3.072751892616544e-02 +412 403 -4.012781031913015e-02 +412 404 -5.413421453123170e-02 +412 405 -7.613960933881156e-02 +412 406 -1.132183869282764e-01 +412 407 -1.820810586422656e-01 +412 408 -3.301555353436746e-01 +412 409 -7.412185823610230e-01 +412 410 -3.165206906282878e+00 +412 411 -1.502055215859655e+01 +412 413 -1.502055215858802e+01 +412 414 -3.165206906282854e+00 +412 415 -7.412185823610182e-01 +412 416 -3.301555353436793e-01 +412 417 -1.820810586422650e-01 +412 418 -1.132183869282767e-01 +412 419 -7.613960933881146e-02 +412 420 -5.413421453123171e-02 +412 421 -4.012781031912976e-02 +412 422 -3.072751892616543e-02 +412 423 -2.415034675252897e-02 +412 424 -1.939104886145104e-02 +412 425 -1.585023865775526e-02 +412 426 -1.315380302376546e-02 +412 427 -1.105916272470023e-02 +412 428 -9.403863770832835e-03 +412 429 -8.076052134892589e-03 +412 430 -6.996835383339699e-03 +412 431 -6.109381318875751e-03 +413 413 3.988394278153933e+01 +413 384 -2.117777896667791e-03 +413 385 -2.312252367280535e-03 +413 386 -2.532689975072674e-03 +413 387 -2.783725492315672e-03 +413 388 -3.071047067257385e-03 +413 389 -3.401691470521393e-03 +413 390 -3.784439171232916e-03 +413 391 -4.230349322908531e-03 +413 392 -4.753493624956895e-03 +413 393 -5.371977266379788e-03 +413 394 -6.109381318875748e-03 +413 395 -6.996835383339648e-03 +413 396 -8.076052134892594e-03 +413 397 -9.403863770832820e-03 +413 398 -1.105916272470027e-02 +413 399 -1.315380302376546e-02 +413 400 -1.585023865775531e-02 +413 401 -1.939104886145111e-02 +413 402 -2.415034675252897e-02 +413 403 -3.072751892616558e-02 +413 404 -4.012781031912997e-02 +413 405 -5.413421453123173e-02 +413 406 -7.613960933881191e-02 +413 407 -1.132183869282767e-01 +413 408 -1.820810586422647e-01 +413 409 -3.301555353436774e-01 +413 410 -7.412185823610180e-01 +413 411 -3.165206906282865e+00 +413 412 -1.502055215858802e+01 +413 414 -1.502055215864001e+01 +413 415 -3.165206906282884e+00 +413 416 -7.412185823610233e-01 +413 417 -3.301555353436738e-01 +413 418 -1.820810586422649e-01 +413 419 -1.132183869282762e-01 +413 420 -7.613960933881156e-02 +413 421 -5.413421453123140e-02 +413 422 -4.012781031912995e-02 +413 423 -3.072751892616543e-02 +413 424 -2.415034675252887e-02 +413 425 -1.939104886145110e-02 +413 426 -1.585023865775526e-02 +413 427 -1.315380302376544e-02 +413 428 -1.105916272470025e-02 +413 429 -9.403863770832809e-03 +413 430 -8.076052134892615e-03 +413 431 -6.996835383339675e-03 +414 414 3.988394278164020e+01 +414 384 -1.945462087124855e-03 +414 385 -2.117777896667798e-03 +414 386 -2.312252367280536e-03 +414 387 -2.532689975072686e-03 +414 388 -2.783725492315673e-03 +414 389 -3.071047067257401e-03 +414 390 -3.401691470521394e-03 +414 391 -3.784439171232938e-03 +414 392 -4.230349322908544e-03 +414 393 -4.753493624956895e-03 +414 394 -5.371977266379821e-03 +414 395 -6.109381318875748e-03 +414 396 -6.996835383339698e-03 +414 397 -8.076052134892594e-03 +414 398 -9.403863770832842e-03 +414 399 -1.105916272470026e-02 +414 400 -1.315380302376550e-02 +414 401 -1.585023865775526e-02 +414 402 -1.939104886145111e-02 +414 403 -2.415034675252907e-02 +414 404 -3.072751892616544e-02 +414 405 -4.012781031912997e-02 +414 406 -5.413421453123187e-02 +414 407 -7.613960933881157e-02 +414 408 -1.132183869282764e-01 +414 409 -1.820810586422650e-01 +414 410 -3.301555353436734e-01 +414 411 -7.412185823610058e-01 +414 412 -3.165206906282854e+00 +414 413 -1.502055215864001e+01 +414 415 -1.502055215866003e+01 +414 416 -3.165206906282882e+00 +414 417 -7.412185823610211e-01 +414 418 -3.301555353436785e-01 +414 419 -1.820810586422667e-01 +414 420 -1.132183869282764e-01 +414 421 -7.613960933881150e-02 +414 422 -5.413421453123170e-02 +414 423 -4.012781031912996e-02 +414 424 -3.072751892616530e-02 +414 425 -2.415034675252896e-02 +414 426 -1.939104886145111e-02 +414 427 -1.585023865775523e-02 +414 428 -1.315380302376546e-02 +414 429 -1.105916272470022e-02 +414 430 -9.403863770832825e-03 +414 431 -8.076052134892573e-03 +415 415 3.988394278169710e+01 +415 384 -1.792160480940037e-03 +415 385 -1.945462087124853e-03 +415 386 -2.117777896667789e-03 +415 387 -2.312252367280536e-03 +415 388 -2.532689975072674e-03 +415 389 -2.783725492315672e-03 +415 390 -3.071047067257386e-03 +415 391 -3.401691470521394e-03 +415 392 -3.784439171232928e-03 +415 393 -4.230349322908520e-03 +415 394 -4.753493624956895e-03 +415 395 -5.371977266379788e-03 +415 396 -6.109381318875749e-03 +415 397 -6.996835383339650e-03 +415 398 -8.076052134892596e-03 +415 399 -9.403863770832828e-03 +415 400 -1.105916272470029e-02 +415 401 -1.315380302376546e-02 +415 402 -1.585023865775526e-02 +415 403 -1.939104886145118e-02 +415 404 -2.415034675252897e-02 +415 405 -3.072751892616545e-02 +415 406 -4.012781031913006e-02 +415 407 -5.413421453123172e-02 +415 408 -7.613960933881191e-02 +415 409 -1.132183869282764e-01 +415 410 -1.820810586422650e-01 +415 411 -3.301555353436726e-01 +415 412 -7.412185823610182e-01 +415 413 -3.165206906282884e+00 +415 414 -1.502055215866003e+01 +415 416 -1.502055215931064e+01 +415 417 -3.165206906282874e+00 +415 418 -7.412185823610214e-01 +415 419 -3.301555353436774e-01 +415 420 -1.820810586422646e-01 +415 421 -1.132183869282771e-01 +415 422 -7.613960933881156e-02 +415 423 -5.413421453123172e-02 +415 424 -4.012781031912977e-02 +415 425 -3.072751892616544e-02 +415 426 -2.415034675252897e-02 +415 427 -1.939104886145107e-02 +415 428 -1.585023865775526e-02 +415 429 -1.315380302376542e-02 +415 430 -1.105916272470025e-02 +415 431 -9.403863770832828e-03 +416 416 3.988394278169709e+01 +416 400 -9.403863770832828e-03 +416 401 -1.105916272470022e-02 +416 402 -1.315380302376542e-02 +416 403 -1.585023865775526e-02 +416 404 -1.939104886145104e-02 +416 405 -2.415034675252887e-02 +416 406 -3.072751892616537e-02 +416 407 -4.012781031912977e-02 +416 408 -5.413421453123171e-02 +416 409 -7.613960933881134e-02 +416 410 -1.132183869282765e-01 +416 411 -1.820810586422652e-01 +416 412 -3.301555353436793e-01 +416 413 -7.412185823610233e-01 +416 414 -3.165206906282882e+00 +416 415 -1.502055215931064e+01 +416 417 -1.502055215866003e+01 +416 418 -3.165206906282885e+00 +416 419 -7.412185823610170e-01 +416 420 -3.301555353436739e-01 +416 421 -1.820810586422659e-01 +416 422 -1.132183869282764e-01 +416 423 -7.613960933881202e-02 +416 424 -5.413421453123171e-02 +416 425 -4.012781031913015e-02 +416 426 -3.072751892616557e-02 +416 427 -2.415034675252901e-02 +416 428 -1.939104886145118e-02 +416 429 -1.585023865775526e-02 +416 430 -1.315380302376550e-02 +416 431 -1.105916272470029e-02 +416 432 -9.403863770832828e-03 +416 433 -8.076052134892578e-03 +416 434 -6.996835383339648e-03 +416 435 -6.109381318875748e-03 +416 436 -5.371977266379788e-03 +416 437 -4.753493624956895e-03 +416 438 -4.230349322908520e-03 +416 439 -3.784439171232928e-03 +416 440 -3.401691470521385e-03 +416 441 -3.071047067257385e-03 +416 442 -2.783725492315673e-03 +416 443 -2.532689975072674e-03 +416 444 -2.312252367280536e-03 +416 445 -2.117777896667789e-03 +416 446 -1.945462087124853e-03 +416 447 -1.792160480940034e-03 +417 417 3.988394278164025e+01 +417 400 -8.076052134892578e-03 +417 401 -9.403863770832827e-03 +417 402 -1.105916272470025e-02 +417 403 -1.315380302376550e-02 +417 404 -1.585023865775526e-02 +417 405 -1.939104886145111e-02 +417 406 -2.415034675252901e-02 +417 407 -3.072751892616544e-02 +417 408 -4.012781031913015e-02 +417 409 -5.413421453123170e-02 +417 410 -7.613960933881156e-02 +417 411 -1.132183869282764e-01 +417 412 -1.820810586422650e-01 +417 413 -3.301555353436738e-01 +417 414 -7.412185823610211e-01 +417 415 -3.165206906282874e+00 +417 416 -1.502055215866003e+01 +417 418 -1.502055215864003e+01 +417 419 -3.165206906282854e+00 +417 420 -7.412185823610186e-01 +417 421 -3.301555353436808e-01 +417 422 -1.820810586422667e-01 +417 423 -1.132183869282769e-01 +417 424 -7.613960933881123e-02 +417 425 -5.413421453123170e-02 +417 426 -4.012781031912996e-02 +417 427 -3.072751892616537e-02 +417 428 -2.415034675252897e-02 +417 429 -1.939104886145104e-02 +417 430 -1.585023865775526e-02 +417 431 -1.315380302376546e-02 +417 432 -1.105916272470022e-02 +417 433 -9.403863770832825e-03 +417 434 -8.076052134892594e-03 +417 435 -6.996835383339698e-03 +417 436 -6.109381318875749e-03 +417 437 -5.371977266379821e-03 +417 438 -4.753493624956895e-03 +417 439 -4.230349322908543e-03 +417 440 -3.784439171232927e-03 +417 441 -3.401691470521393e-03 +417 442 -3.071047067257401e-03 +417 443 -2.783725492315672e-03 +417 444 -2.532689975072686e-03 +417 445 -2.312252367280536e-03 +417 446 -2.117777896667798e-03 +417 447 -1.945462087124853e-03 +418 418 3.988394278153932e+01 +418 400 -6.996835383339674e-03 +418 401 -8.076052134892615e-03 +418 402 -9.403863770832827e-03 +418 403 -1.105916272470029e-02 +418 404 -1.315380302376546e-02 +418 405 -1.585023865775526e-02 +418 406 -1.939104886145114e-02 +418 407 -2.415034675252897e-02 +418 408 -3.072751892616557e-02 +418 409 -4.012781031912996e-02 +418 410 -5.413421453123172e-02 +418 411 -7.613960933881202e-02 +418 412 -1.132183869282767e-01 +418 413 -1.820810586422649e-01 +418 414 -3.301555353436785e-01 +418 415 -7.412185823610214e-01 +418 416 -3.165206906282885e+00 +418 417 -1.502055215864003e+01 +418 419 -1.502055215858800e+01 +418 420 -3.165206906282860e+00 +418 421 -7.412185823610196e-01 +418 422 -3.301555353436769e-01 +418 423 -1.820810586422647e-01 +418 424 -1.132183869282761e-01 +418 425 -7.613960933881175e-02 +418 426 -5.413421453123172e-02 +418 427 -4.012781031912987e-02 +418 428 -3.072751892616545e-02 +418 429 -2.415034675252887e-02 +418 430 -1.939104886145111e-02 +418 431 -1.585023865775526e-02 +418 432 -1.315380302376542e-02 +418 433 -1.105916272470025e-02 +418 434 -9.403863770832820e-03 +418 435 -8.076052134892589e-03 +418 436 -6.996835383339650e-03 +418 437 -6.109381318875748e-03 +418 438 -5.371977266379788e-03 +418 439 -4.753493624956895e-03 +418 440 -4.230349322908520e-03 +418 441 -3.784439171232916e-03 +418 442 -3.401691470521394e-03 +418 443 -3.071047067257386e-03 +418 444 -2.783725492315673e-03 +418 445 -2.532689975072674e-03 +418 446 -2.312252367280536e-03 +418 447 -2.117777896667789e-03 +419 419 3.988394278151441e+01 +419 400 -6.109381318875728e-03 +419 401 -6.996835383339672e-03 +419 402 -8.076052134892566e-03 +419 403 -9.403863770832833e-03 +419 404 -1.105916272470023e-02 +419 405 -1.315380302376544e-02 +419 406 -1.585023865775526e-02 +419 407 -1.939104886145107e-02 +419 408 -2.415034675252901e-02 +419 409 -3.072751892616537e-02 +419 410 -4.012781031912987e-02 +419 411 -5.413421453123186e-02 +419 412 -7.613960933881146e-02 +419 413 -1.132183869282762e-01 +419 414 -1.820810586422667e-01 +419 415 -3.301555353436774e-01 +419 416 -7.412185823610170e-01 +419 417 -3.165206906282854e+00 +419 418 -1.502055215858800e+01 +419 420 -1.502055215859656e+01 +419 421 -3.165206906282878e+00 +419 422 -7.412185823610205e-01 +419 423 -3.301555353436747e-01 +419 424 -1.820810586422660e-01 +419 425 -1.132183869282771e-01 +419 426 -7.613960933881191e-02 +419 427 -5.413421453123170e-02 +419 428 -4.012781031913006e-02 +419 429 -3.072751892616537e-02 +419 430 -2.415034675252901e-02 +419 431 -1.939104886145114e-02 +419 432 -1.585023865775523e-02 +419 433 -1.315380302376548e-02 +419 434 -1.105916272470027e-02 +419 435 -9.403863770832828e-03 +419 436 -8.076052134892596e-03 +419 437 -6.996835383339699e-03 +419 438 -6.109381318875751e-03 +419 439 -5.371977266379823e-03 +419 440 -4.753493624956896e-03 +419 441 -4.230349322908531e-03 +419 442 -3.784439171232938e-03 +419 443 -3.401691470521394e-03 +419 444 -3.071047067257401e-03 +419 445 -2.783725492315673e-03 +419 446 -2.532689975072686e-03 +419 447 -2.312252367280536e-03 +420 420 3.988394278151357e+01 +420 400 -5.371977266379788e-03 +420 401 -6.109381318875748e-03 +420 402 -6.996835383339648e-03 +420 403 -8.076052134892599e-03 +420 404 -9.403863770832820e-03 +420 405 -1.105916272470025e-02 +420 406 -1.315380302376548e-02 +420 407 -1.585023865775526e-02 +420 408 -1.939104886145118e-02 +420 409 -2.415034675252897e-02 +420 410 -3.072751892616545e-02 +420 411 -4.012781031913015e-02 +420 412 -5.413421453123171e-02 +420 413 -7.613960933881156e-02 +420 414 -1.132183869282764e-01 +420 415 -1.820810586422646e-01 +420 416 -3.301555353436739e-01 +420 417 -7.412185823610186e-01 +420 418 -3.165206906282860e+00 +420 419 -1.502055215859656e+01 +420 421 -1.502055215859219e+01 +420 422 -3.165206906282871e+00 +420 423 -7.412185823610214e-01 +420 424 -3.301555353436787e-01 +420 425 -1.820810586422658e-01 +420 426 -1.132183869282764e-01 +420 427 -7.613960933881139e-02 +420 428 -5.413421453123172e-02 +420 429 -4.012781031912977e-02 +420 430 -3.072751892616544e-02 +420 431 -2.415034675252897e-02 +420 432 -1.939104886145104e-02 +420 433 -1.585023865775526e-02 +420 434 -1.315380302376546e-02 +420 435 -1.105916272470024e-02 +420 436 -9.403863770832828e-03 +420 437 -8.076052134892611e-03 +420 438 -6.996835383339675e-03 +420 439 -6.109381318875770e-03 +420 440 -5.371977266379806e-03 +420 441 -4.753493624956895e-03 +420 442 -4.230349322908544e-03 +420 443 -3.784439171232928e-03 +420 444 -3.401691470521403e-03 +420 445 -3.071047067257394e-03 +420 446 -2.783725492315679e-03 +420 447 -2.532689975072680e-03 +421 421 3.988394278152493e+01 +421 400 -4.753493624956895e-03 +421 401 -5.371977266379821e-03 +421 402 -6.109381318875748e-03 +421 403 -6.996835383339698e-03 +421 404 -8.076052134892587e-03 +421 405 -9.403863770832814e-03 +421 406 -1.105916272470023e-02 +421 407 -1.315380302376542e-02 +421 408 -1.585023865775526e-02 +421 409 -1.939104886145104e-02 +421 410 -2.415034675252887e-02 +421 411 -3.072751892616544e-02 +421 412 -4.012781031912976e-02 +421 413 -5.413421453123140e-02 +421 414 -7.613960933881150e-02 +421 415 -1.132183869282771e-01 +421 416 -1.820810586422659e-01 +421 417 -3.301555353436808e-01 +421 418 -7.412185823610196e-01 +421 419 -3.165206906282878e+00 +421 420 -1.502055215859219e+01 +421 422 -1.502055215860532e+01 +421 423 -3.165206906282879e+00 +421 424 -7.412185823610165e-01 +421 425 -3.301555353436724e-01 +421 426 -1.820810586422628e-01 +421 427 -1.132183869282761e-01 +421 428 -7.613960933881202e-02 +421 429 -5.413421453123171e-02 +421 430 -4.012781031913015e-02 +421 431 -3.072751892616557e-02 +421 432 -2.415034675252896e-02 +421 433 -1.939104886145118e-02 +421 434 -1.585023865775531e-02 +421 435 -1.315380302376548e-02 +421 436 -1.105916272470029e-02 +421 437 -9.403863770832828e-03 +421 438 -8.076052134892578e-03 +421 439 -6.996835383339674e-03 +421 440 -6.109381318875728e-03 +421 441 -5.371977266379788e-03 +421 442 -4.753493624956895e-03 +421 443 -4.230349322908520e-03 +421 444 -3.784439171232928e-03 +421 445 -3.401691470521385e-03 +421 446 -3.071047067257393e-03 +421 447 -2.783725492315665e-03 +422 422 3.988394278128565e+01 +422 400 -4.230349322908520e-03 +422 401 -4.753493624956895e-03 +422 402 -5.371977266379788e-03 +422 403 -6.109381318875749e-03 +422 404 -6.996835383339650e-03 +422 405 -8.076052134892596e-03 +422 406 -9.403863770832833e-03 +422 407 -1.105916272470025e-02 +422 408 -1.315380302376550e-02 +422 409 -1.585023865775526e-02 +422 410 -1.939104886145111e-02 +422 411 -2.415034675252906e-02 +422 412 -3.072751892616543e-02 +422 413 -4.012781031912995e-02 +422 414 -5.413421453123170e-02 +422 415 -7.613960933881156e-02 +422 416 -1.132183869282764e-01 +422 417 -1.820810586422667e-01 +422 418 -3.301555353436769e-01 +422 419 -7.412185823610205e-01 +422 420 -3.165206906282871e+00 +422 421 -1.502055215860532e+01 +422 423 -1.502055215840049e+01 +422 424 -3.165206906282871e+00 +422 425 -7.412185823610111e-01 +422 426 -3.301555353436731e-01 +422 427 -1.820810586422660e-01 +422 428 -1.132183869282769e-01 +422 429 -7.613960933881153e-02 +422 430 -5.413421453123170e-02 +422 431 -4.012781031912996e-02 +422 432 -3.072751892616530e-02 +422 433 -2.415034675252896e-02 +422 434 -1.939104886145111e-02 +422 435 -1.585023865775523e-02 +422 436 -1.315380302376546e-02 +422 437 -1.105916272470022e-02 +422 438 -9.403863770832827e-03 +422 439 -8.076052134892615e-03 +422 440 -6.996835383339672e-03 +422 441 -6.109381318875748e-03 +422 442 -5.371977266379821e-03 +422 443 -4.753493624956895e-03 +422 444 -4.230349322908543e-03 +422 445 -3.784439171232927e-03 +422 446 -3.401691470521402e-03 +422 447 -3.071047067257392e-03 +423 423 3.988394278105617e+01 +423 400 -3.784439171232928e-03 +423 401 -4.230349322908543e-03 +423 402 -4.753493624956895e-03 +423 403 -5.371977266379821e-03 +423 404 -6.109381318875748e-03 +423 405 -6.996835383339699e-03 +423 406 -8.076052134892618e-03 +423 407 -9.403863770832827e-03 +423 408 -1.105916272470029e-02 +423 409 -1.315380302376546e-02 +423 410 -1.585023865775526e-02 +423 411 -1.939104886145118e-02 +423 412 -2.415034675252897e-02 +423 413 -3.072751892616543e-02 +423 414 -4.012781031912996e-02 +423 415 -5.413421453123172e-02 +423 416 -7.613960933881202e-02 +423 417 -1.132183869282769e-01 +423 418 -1.820810586422647e-01 +423 419 -3.301555353436747e-01 +423 420 -7.412185823610214e-01 +423 421 -3.165206906282879e+00 +423 422 -1.502055215840049e+01 +423 424 -1.502055215835490e+01 +423 425 -3.165206906282876e+00 +423 426 -7.412185823610242e-01 +423 427 -3.301555353436790e-01 +423 428 -1.820810586422658e-01 +423 429 -1.132183869282767e-01 +423 430 -7.613960933881146e-02 +423 431 -5.413421453123172e-02 +423 432 -4.012781031912977e-02 +423 433 -3.072751892616544e-02 +423 434 -2.415034675252897e-02 +423 435 -1.939104886145107e-02 +423 436 -1.585023865775526e-02 +423 437 -1.315380302376542e-02 +423 438 -1.105916272470025e-02 +423 439 -9.403863770832827e-03 +423 440 -8.076052134892566e-03 +423 441 -6.996835383339648e-03 +423 442 -6.109381318875748e-03 +423 443 -5.371977266379788e-03 +423 444 -4.753493624956895e-03 +423 445 -4.230349322908520e-03 +423 446 -3.784439171232928e-03 +423 447 -3.401691470521385e-03 +424 424 3.988394278102311e+01 +424 400 -3.401691470521385e-03 +424 401 -3.784439171232927e-03 +424 402 -4.230349322908520e-03 +424 403 -4.753493624956895e-03 +424 404 -5.371977266379788e-03 +424 405 -6.109381318875751e-03 +424 406 -6.996835383339675e-03 +424 407 -8.076052134892568e-03 +424 408 -9.403863770832828e-03 +424 409 -1.105916272470022e-02 +424 410 -1.315380302376542e-02 +424 411 -1.585023865775526e-02 +424 412 -1.939104886145104e-02 +424 413 -2.415034675252887e-02 +424 414 -3.072751892616530e-02 +424 415 -4.012781031912977e-02 +424 416 -5.413421453123171e-02 +424 417 -7.613960933881123e-02 +424 418 -1.132183869282761e-01 +424 419 -1.820810586422660e-01 +424 420 -3.301555353436787e-01 +424 421 -7.412185823610165e-01 +424 422 -3.165206906282871e+00 +424 423 -1.502055215835490e+01 +424 425 -1.502055215836226e+01 +424 426 -3.165206906282896e+00 +424 427 -7.412185823610182e-01 +424 428 -3.301555353436769e-01 +424 429 -1.820810586422651e-01 +424 430 -1.132183869282763e-01 +424 431 -7.613960933881193e-02 +424 432 -5.413421453123171e-02 +424 433 -4.012781031913015e-02 +424 434 -3.072751892616557e-02 +424 435 -2.415034675252901e-02 +424 436 -1.939104886145118e-02 +424 437 -1.585023865775526e-02 +424 438 -1.315380302376550e-02 +424 439 -1.105916272470029e-02 +424 440 -9.403863770832827e-03 +424 441 -8.076052134892599e-03 +424 442 -6.996835383339698e-03 +424 443 -6.109381318875749e-03 +424 444 -5.371977266379821e-03 +424 445 -4.753493624956895e-03 +424 446 -4.230349322908543e-03 +424 447 -3.784439171232927e-03 +425 425 3.988394278106482e+01 +425 400 -3.071047067257393e-03 +425 401 -3.401691470521402e-03 +425 402 -3.784439171232928e-03 +425 403 -4.230349322908543e-03 +425 404 -4.753493624956895e-03 +425 405 -5.371977266379823e-03 +425 406 -6.109381318875770e-03 +425 407 -6.996835383339674e-03 +425 408 -8.076052134892622e-03 +425 409 -9.403863770832825e-03 +425 410 -1.105916272470025e-02 +425 411 -1.315380302376550e-02 +425 412 -1.585023865775526e-02 +425 413 -1.939104886145110e-02 +425 414 -2.415034675252896e-02 +425 415 -3.072751892616544e-02 +425 416 -4.012781031913015e-02 +425 417 -5.413421453123170e-02 +425 418 -7.613960933881175e-02 +425 419 -1.132183869282771e-01 +425 420 -1.820810586422658e-01 +425 421 -3.301555353436724e-01 +425 422 -7.412185823610111e-01 +425 423 -3.165206906282876e+00 +425 424 -1.502055215836226e+01 +425 426 -1.502055215839545e+01 +425 427 -3.165206906282858e+00 +425 428 -7.412185823610151e-01 +425 429 -3.301555353436765e-01 +425 430 -1.820810586422661e-01 +425 431 -1.132183869282764e-01 +425 432 -7.613960933881123e-02 +425 433 -5.413421453123170e-02 +425 434 -4.012781031912996e-02 +425 435 -3.072751892616537e-02 +425 436 -2.415034675252897e-02 +425 437 -1.939104886145104e-02 +425 438 -1.585023865775526e-02 +425 439 -1.315380302376546e-02 +425 440 -1.105916272470022e-02 +425 441 -9.403863770832818e-03 +425 442 -8.076052134892594e-03 +425 443 -6.996835383339650e-03 +425 444 -6.109381318875748e-03 +425 445 -5.371977266379788e-03 +425 446 -4.753493624956895e-03 +425 447 -4.230349322908520e-03 +426 426 3.988394278115154e+01 +426 400 -2.783725492315665e-03 +426 401 -3.071047067257392e-03 +426 402 -3.401691470521385e-03 +426 403 -3.784439171232927e-03 +426 404 -4.230349322908520e-03 +426 405 -4.753493624956896e-03 +426 406 -5.371977266379806e-03 +426 407 -6.109381318875728e-03 +426 408 -6.996835383339672e-03 +426 409 -8.076052134892573e-03 +426 410 -9.403863770832827e-03 +426 411 -1.105916272470029e-02 +426 412 -1.315380302376546e-02 +426 413 -1.585023865775526e-02 +426 414 -1.939104886145111e-02 +426 415 -2.415034675252897e-02 +426 416 -3.072751892616557e-02 +426 417 -4.012781031912996e-02 +426 418 -5.413421453123172e-02 +426 419 -7.613960933881191e-02 +426 420 -1.132183869282764e-01 +426 421 -1.820810586422628e-01 +426 422 -3.301555353436731e-01 +426 423 -7.412185823610242e-01 +426 424 -3.165206906282896e+00 +426 425 -1.502055215839545e+01 +426 427 -1.502055215844902e+01 +426 428 -3.165206906282864e+00 +426 429 -7.412185823610196e-01 +426 430 -3.301555353436780e-01 +426 431 -1.820810586422647e-01 +426 432 -1.132183869282761e-01 +426 433 -7.613960933881185e-02 +426 434 -5.413421453123172e-02 +426 435 -4.012781031912987e-02 +426 436 -3.072751892616545e-02 +426 437 -2.415034675252887e-02 +426 438 -1.939104886145111e-02 +426 439 -1.585023865775526e-02 +426 440 -1.315380302376542e-02 +426 441 -1.105916272470025e-02 +426 442 -9.403863770832835e-03 +426 443 -8.076052134892596e-03 +426 444 -6.996835383339699e-03 +426 445 -6.109381318875751e-03 +426 446 -5.371977266379823e-03 +426 447 -4.753493624956896e-03 +427 427 3.988394278128112e+01 +427 400 -2.532689975072674e-03 +427 401 -2.783725492315672e-03 +427 402 -3.071047067257385e-03 +427 403 -3.401691470521393e-03 +427 404 -3.784439171232916e-03 +427 405 -4.230349322908531e-03 +427 406 -4.753493624956895e-03 +427 407 -5.371977266379788e-03 +427 408 -6.109381318875748e-03 +427 409 -6.996835383339648e-03 +427 410 -8.076052134892587e-03 +427 411 -9.403863770832827e-03 +427 412 -1.105916272470023e-02 +427 413 -1.315380302376544e-02 +427 414 -1.585023865775523e-02 +427 415 -1.939104886145107e-02 +427 416 -2.415034675252901e-02 +427 417 -3.072751892616537e-02 +427 418 -4.012781031912987e-02 +427 419 -5.413421453123170e-02 +427 420 -7.613960933881139e-02 +427 421 -1.132183869282761e-01 +427 422 -1.820810586422660e-01 +427 423 -3.301555353436790e-01 +427 424 -7.412185823610182e-01 +427 425 -3.165206906282858e+00 +427 426 -1.502055215844902e+01 +427 428 -1.502055215852579e+01 +427 429 -3.165206906282886e+00 +427 430 -7.412185823610242e-01 +427 431 -3.301555353436765e-01 +427 432 -1.820810586422648e-01 +427 433 -1.132183869282776e-01 +427 434 -7.613960933881191e-02 +427 435 -5.413421453123170e-02 +427 436 -4.012781031913006e-02 +427 437 -3.072751892616537e-02 +427 438 -2.415034675252901e-02 +427 439 -1.939104886145114e-02 +427 440 -1.585023865775523e-02 +427 441 -1.315380302376548e-02 +427 442 -1.105916272470027e-02 +427 443 -9.403863770832835e-03 +427 444 -8.076052134892618e-03 +427 445 -6.996835383339675e-03 +427 446 -6.109381318875770e-03 +427 447 -5.371977266379806e-03 +428 428 3.988394278146377e+01 +428 400 -2.312252367280536e-03 +428 401 -2.532689975072686e-03 +428 402 -2.783725492315673e-03 +428 403 -3.071047067257401e-03 +428 404 -3.401691470521394e-03 +428 405 -3.784439171232938e-03 +428 406 -4.230349322908544e-03 +428 407 -4.753493624956895e-03 +428 408 -5.371977266379821e-03 +428 409 -6.109381318875748e-03 +428 410 -6.996835383339698e-03 +428 411 -8.076052134892601e-03 +428 412 -9.403863770832835e-03 +428 413 -1.105916272470025e-02 +428 414 -1.315380302376546e-02 +428 415 -1.585023865775526e-02 +428 416 -1.939104886145118e-02 +428 417 -2.415034675252897e-02 +428 418 -3.072751892616545e-02 +428 419 -4.012781031913006e-02 +428 420 -5.413421453123172e-02 +428 421 -7.613960933881202e-02 +428 422 -1.132183869282769e-01 +428 423 -1.820810586422658e-01 +428 424 -3.301555353436769e-01 +428 425 -7.412185823610151e-01 +428 426 -3.165206906282864e+00 +428 427 -1.502055215852579e+01 +428 429 -1.502055215863302e+01 +428 430 -3.165206906282870e+00 +428 431 -7.412185823610147e-01 +428 432 -3.301555353436748e-01 +428 433 -1.820810586422666e-01 +428 434 -1.132183869282760e-01 +428 435 -7.613960933881128e-02 +428 436 -5.413421453123172e-02 +428 437 -4.012781031912977e-02 +428 438 -3.072751892616544e-02 +428 439 -2.415034675252897e-02 +428 440 -1.939104886145104e-02 +428 441 -1.585023865775526e-02 +428 442 -1.315380302376546e-02 +428 443 -1.105916272470026e-02 +428 444 -9.403863770832827e-03 +428 445 -8.076052134892568e-03 +428 446 -6.996835383339674e-03 +428 447 -6.109381318875728e-03 +429 429 3.988394278171958e+01 +429 400 -2.117777896667789e-03 +429 401 -2.312252367280536e-03 +429 402 -2.532689975072674e-03 +429 403 -2.783725492315672e-03 +429 404 -3.071047067257386e-03 +429 405 -3.401691470521394e-03 +429 406 -3.784439171232928e-03 +429 407 -4.230349322908520e-03 +429 408 -4.753493624956895e-03 +429 409 -5.371977266379788e-03 +429 410 -6.109381318875749e-03 +429 411 -6.996835383339650e-03 +429 412 -8.076052134892589e-03 +429 413 -9.403863770832809e-03 +429 414 -1.105916272470022e-02 +429 415 -1.315380302376542e-02 +429 416 -1.585023865775526e-02 +429 417 -1.939104886145104e-02 +429 418 -2.415034675252887e-02 +429 419 -3.072751892616537e-02 +429 420 -4.012781031912977e-02 +429 421 -5.413421453123171e-02 +429 422 -7.613960933881153e-02 +429 423 -1.132183869282767e-01 +429 424 -1.820810586422651e-01 +429 425 -3.301555353436765e-01 +429 426 -7.412185823610196e-01 +429 427 -3.165206906282886e+00 +429 428 -1.502055215863302e+01 +429 430 -1.502055215878375e+01 +429 431 -3.165206906282876e+00 +429 432 -7.412185823610217e-01 +429 433 -3.301555353436776e-01 +429 434 -1.820810586422639e-01 +429 435 -1.132183869282761e-01 +429 436 -7.613960933881202e-02 +429 437 -5.413421453123171e-02 +429 438 -4.012781031913015e-02 +429 439 -3.072751892616557e-02 +429 440 -2.415034675252896e-02 +429 441 -1.939104886145118e-02 +429 442 -1.585023865775531e-02 +429 443 -1.315380302376550e-02 +429 444 -1.105916272470029e-02 +429 445 -9.403863770832828e-03 +429 446 -8.076052134892622e-03 +429 447 -6.996835383339672e-03 +430 430 3.988394278208170e+01 +430 400 -1.945462087124853e-03 +430 401 -2.117777896667798e-03 +430 402 -2.312252367280536e-03 +430 403 -2.532689975072686e-03 +430 404 -2.783725492315673e-03 +430 405 -3.071047067257401e-03 +430 406 -3.401691470521403e-03 +430 407 -3.784439171232928e-03 +430 408 -4.230349322908543e-03 +430 409 -4.753493624956895e-03 +430 410 -5.371977266379821e-03 +430 411 -6.109381318875748e-03 +430 412 -6.996835383339699e-03 +430 413 -8.076052134892615e-03 +430 414 -9.403863770832825e-03 +430 415 -1.105916272470025e-02 +430 416 -1.315380302376550e-02 +430 417 -1.585023865775526e-02 +430 418 -1.939104886145111e-02 +430 419 -2.415034675252901e-02 +430 420 -3.072751892616544e-02 +430 421 -4.012781031913015e-02 +430 422 -5.413421453123170e-02 +430 423 -7.613960933881146e-02 +430 424 -1.132183869282763e-01 +430 425 -1.820810586422661e-01 +430 426 -3.301555353436780e-01 +430 427 -7.412185823610242e-01 +430 428 -3.165206906282870e+00 +430 429 -1.502055215878375e+01 +430 431 -1.502055215899858e+01 +430 432 -3.165206906282884e+00 +430 433 -7.412185823610227e-01 +430 434 -3.301555353436764e-01 +430 435 -1.820810586422653e-01 +430 436 -1.132183869282767e-01 +430 437 -7.613960933881142e-02 +430 438 -5.413421453123170e-02 +430 439 -4.012781031912996e-02 +430 440 -3.072751892616530e-02 +430 441 -2.415034675252896e-02 +430 442 -1.939104886145111e-02 +430 443 -1.585023865775526e-02 +430 444 -1.315380302376546e-02 +430 445 -1.105916272470022e-02 +430 446 -9.403863770832825e-03 +430 447 -8.076052134892573e-03 +431 431 3.988394278260307e+01 +431 400 -1.792160480940035e-03 +431 401 -1.945462087124853e-03 +431 402 -2.117777896667789e-03 +431 403 -2.312252367280536e-03 +431 404 -2.532689975072674e-03 +431 405 -2.783725492315673e-03 +431 406 -3.071047067257394e-03 +431 407 -3.401691470521385e-03 +431 408 -3.784439171232927e-03 +431 409 -4.230349322908520e-03 +431 410 -4.753493624956895e-03 +431 411 -5.371977266379788e-03 +431 412 -6.109381318875751e-03 +431 413 -6.996835383339675e-03 +431 414 -8.076052134892573e-03 +431 415 -9.403863770832828e-03 +431 416 -1.105916272470029e-02 +431 417 -1.315380302376546e-02 +431 418 -1.585023865775526e-02 +431 419 -1.939104886145114e-02 +431 420 -2.415034675252897e-02 +431 421 -3.072751892616557e-02 +431 422 -4.012781031912996e-02 +431 423 -5.413421453123172e-02 +431 424 -7.613960933881193e-02 +431 425 -1.132183869282764e-01 +431 426 -1.820810586422647e-01 +431 427 -3.301555353436765e-01 +431 428 -7.412185823610147e-01 +431 429 -3.165206906282876e+00 +431 430 -1.502055215899858e+01 +431 432 -1.502055215931068e+01 +431 433 -3.165206906282881e+00 +431 434 -7.412185823610243e-01 +431 435 -3.301555353436767e-01 +431 436 -1.820810586422656e-01 +431 437 -1.132183869282769e-01 +431 438 -7.613960933881174e-02 +431 439 -5.413421453123172e-02 +431 440 -4.012781031912977e-02 +431 441 -3.072751892616544e-02 +431 442 -2.415034675252897e-02 +431 443 -1.939104886145111e-02 +431 444 -1.585023865775526e-02 +431 445 -1.315380302376542e-02 +431 446 -1.105916272470025e-02 +431 447 -9.403863770832827e-03 +432 432 3.988394278260307e+01 +432 416 -9.403863770832828e-03 +432 417 -1.105916272470022e-02 +432 418 -1.315380302376542e-02 +432 419 -1.585023865775523e-02 +432 420 -1.939104886145104e-02 +432 421 -2.415034675252896e-02 +432 422 -3.072751892616530e-02 +432 423 -4.012781031912977e-02 +432 424 -5.413421453123171e-02 +432 425 -7.613960933881123e-02 +432 426 -1.132183869282761e-01 +432 427 -1.820810586422648e-01 +432 428 -3.301555353436748e-01 +432 429 -7.412185823610217e-01 +432 430 -3.165206906282884e+00 +432 431 -1.502055215931068e+01 +432 433 -1.502055215899858e+01 +432 434 -3.165206906282883e+00 +432 435 -7.412185823610251e-01 +432 436 -3.301555353436753e-01 +432 437 -1.820810586422655e-01 +432 438 -1.132183869282770e-01 +432 439 -7.613960933881193e-02 +432 440 -5.413421453123171e-02 +432 441 -4.012781031913015e-02 +432 442 -3.072751892616558e-02 +432 443 -2.415034675252907e-02 +432 444 -1.939104886145118e-02 +432 445 -1.585023865775526e-02 +432 446 -1.315380302376550e-02 +432 447 -1.105916272470029e-02 +432 448 -9.403863770832827e-03 +432 449 -8.076052134892601e-03 +432 450 -6.996835383339650e-03 +432 451 -6.109381318875748e-03 +432 452 -5.371977266379788e-03 +432 453 -4.753493624956895e-03 +432 454 -4.230349322908520e-03 +432 455 -3.784439171232928e-03 +432 456 -3.401691470521394e-03 +432 457 -3.071047067257386e-03 +432 458 -2.783725492315673e-03 +432 459 -2.532689975072674e-03 +432 460 -2.312252367280536e-03 +432 461 -2.117777896667789e-03 +432 462 -1.945462087124853e-03 +432 463 -1.792160480940039e-03 +433 433 3.988394278208170e+01 +433 416 -8.076052134892578e-03 +433 417 -9.403863770832825e-03 +433 418 -1.105916272470025e-02 +433 419 -1.315380302376548e-02 +433 420 -1.585023865775526e-02 +433 421 -1.939104886145118e-02 +433 422 -2.415034675252896e-02 +433 423 -3.072751892616544e-02 +433 424 -4.012781031913015e-02 +433 425 -5.413421453123170e-02 +433 426 -7.613960933881185e-02 +433 427 -1.132183869282776e-01 +433 428 -1.820810586422666e-01 +433 429 -3.301555353436776e-01 +433 430 -7.412185823610227e-01 +433 431 -3.165206906282881e+00 +433 432 -1.502055215899858e+01 +433 434 -1.502055215878375e+01 +433 435 -3.165206906282886e+00 +433 436 -7.412185823610169e-01 +433 437 -3.301555353436747e-01 +433 438 -1.820810586422651e-01 +433 439 -1.132183869282760e-01 +433 440 -7.613960933881112e-02 +433 441 -5.413421453123170e-02 +433 442 -4.012781031912997e-02 +433 443 -3.072751892616544e-02 +433 444 -2.415034675252897e-02 +433 445 -1.939104886145104e-02 +433 446 -1.585023865775526e-02 +433 447 -1.315380302376546e-02 +433 448 -1.105916272470023e-02 +433 449 -9.403863770832835e-03 +433 450 -8.076052134892589e-03 +433 451 -6.996835383339699e-03 +433 452 -6.109381318875751e-03 +433 453 -5.371977266379823e-03 +433 454 -4.753493624956897e-03 +433 455 -4.230349322908545e-03 +433 456 -3.784439171232939e-03 +433 457 -3.401691470521394e-03 +433 458 -3.071047067257401e-03 +433 459 -2.783725492315673e-03 +433 460 -2.532689975072686e-03 +433 461 -2.312252367280537e-03 +433 462 -2.117777896667799e-03 +433 463 -1.945462087124858e-03 +434 434 3.988394278171957e+01 +434 416 -6.996835383339648e-03 +434 417 -8.076052134892594e-03 +434 418 -9.403863770832820e-03 +434 419 -1.105916272470027e-02 +434 420 -1.315380302376546e-02 +434 421 -1.585023865775531e-02 +434 422 -1.939104886145111e-02 +434 423 -2.415034675252897e-02 +434 424 -3.072751892616557e-02 +434 425 -4.012781031912996e-02 +434 426 -5.413421453123172e-02 +434 427 -7.613960933881191e-02 +434 428 -1.132183869282760e-01 +434 429 -1.820810586422639e-01 +434 430 -3.301555353436764e-01 +434 431 -7.412185823610243e-01 +434 432 -3.165206906282883e+00 +434 433 -1.502055215878375e+01 +434 435 -1.502055215863302e+01 +434 436 -3.165206906282867e+00 +434 437 -7.412185823610182e-01 +434 438 -3.301555353436771e-01 +434 439 -1.820810586422649e-01 +434 440 -1.132183869282761e-01 +434 441 -7.613960933881185e-02 +434 442 -5.413421453123173e-02 +434 443 -4.012781031912997e-02 +434 444 -3.072751892616545e-02 +434 445 -2.415034675252887e-02 +434 446 -1.939104886145111e-02 +434 447 -1.585023865775526e-02 +434 448 -1.315380302376544e-02 +434 449 -1.105916272470025e-02 +434 450 -9.403863770832809e-03 +434 451 -8.076052134892616e-03 +434 452 -6.996835383339675e-03 +434 453 -6.109381318875770e-03 +434 454 -5.371977266379807e-03 +434 455 -4.753493624956911e-03 +434 456 -4.230349322908545e-03 +434 457 -3.784439171232928e-03 +434 458 -3.401691470521403e-03 +434 459 -3.071047067257394e-03 +434 460 -2.783725492315679e-03 +434 461 -2.532689975072680e-03 +434 462 -2.312252367280542e-03 +434 463 -2.117777896667799e-03 +435 435 3.988394278146373e+01 +435 416 -6.109381318875748e-03 +435 417 -6.996835383339698e-03 +435 418 -8.076052134892589e-03 +435 419 -9.403863770832828e-03 +435 420 -1.105916272470024e-02 +435 421 -1.315380302376548e-02 +435 422 -1.585023865775523e-02 +435 423 -1.939104886145107e-02 +435 424 -2.415034675252901e-02 +435 425 -3.072751892616537e-02 +435 426 -4.012781031912987e-02 +435 427 -5.413421453123170e-02 +435 428 -7.613960933881128e-02 +435 429 -1.132183869282761e-01 +435 430 -1.820810586422653e-01 +435 431 -3.301555353436767e-01 +435 432 -7.412185823610251e-01 +435 433 -3.165206906282886e+00 +435 434 -1.502055215863302e+01 +435 436 -1.502055215852574e+01 +435 437 -3.165206906282860e+00 +435 438 -7.412185823610129e-01 +435 439 -3.301555353436763e-01 +435 440 -1.820810586422651e-01 +435 441 -1.132183869282777e-01 +435 442 -7.613960933881188e-02 +435 443 -5.413421453123187e-02 +435 444 -4.012781031913006e-02 +435 445 -3.072751892616537e-02 +435 446 -2.415034675252901e-02 +435 447 -1.939104886145114e-02 +435 448 -1.585023865775526e-02 +435 449 -1.315380302376548e-02 +435 450 -1.105916272470023e-02 +435 451 -9.403863770832832e-03 +435 452 -8.076052134892573e-03 +435 453 -6.996835383339674e-03 +435 454 -6.109381318875729e-03 +435 455 -5.371977266379807e-03 +435 456 -4.753493624956896e-03 +435 457 -4.230349322908520e-03 +435 458 -3.784439171232928e-03 +435 459 -3.401691470521385e-03 +435 460 -3.071047067257393e-03 +435 461 -2.783725492315666e-03 +435 462 -2.532689975072680e-03 +435 463 -2.312252367280537e-03 +436 436 3.988394278128112e+01 +436 416 -5.371977266379788e-03 +436 417 -6.109381318875749e-03 +436 418 -6.996835383339650e-03 +436 419 -8.076052134892596e-03 +436 420 -9.403863770832828e-03 +436 421 -1.105916272470029e-02 +436 422 -1.315380302376546e-02 +436 423 -1.585023865775526e-02 +436 424 -1.939104886145118e-02 +436 425 -2.415034675252897e-02 +436 426 -3.072751892616545e-02 +436 427 -4.012781031913006e-02 +436 428 -5.413421453123172e-02 +436 429 -7.613960933881202e-02 +436 430 -1.132183869282767e-01 +436 431 -1.820810586422656e-01 +436 432 -3.301555353436753e-01 +436 433 -7.412185823610169e-01 +436 434 -3.165206906282867e+00 +436 435 -1.502055215852574e+01 +436 437 -1.502055215844907e+01 +436 438 -3.165206906282862e+00 +436 439 -7.412185823610175e-01 +436 440 -3.301555353436781e-01 +436 441 -1.820810586422676e-01 +436 442 -1.132183869282762e-01 +436 443 -7.613960933881161e-02 +436 444 -5.413421453123172e-02 +436 445 -4.012781031912977e-02 +436 446 -3.072751892616544e-02 +436 447 -2.415034675252897e-02 +436 448 -1.939104886145107e-02 +436 449 -1.585023865775526e-02 +436 450 -1.315380302376542e-02 +436 451 -1.105916272470025e-02 +436 452 -9.403863770832828e-03 +436 453 -8.076052134892609e-03 +436 454 -6.996835383339673e-03 +436 455 -6.109381318875770e-03 +436 456 -5.371977266379823e-03 +436 457 -4.753493624956895e-03 +436 458 -4.230349322908543e-03 +436 459 -3.784439171232927e-03 +436 460 -3.401691470521402e-03 +436 461 -3.071047067257393e-03 +436 462 -2.783725492315679e-03 +436 463 -2.532689975072686e-03 +437 437 3.988394278115153e+01 +437 416 -4.753493624956895e-03 +437 417 -5.371977266379821e-03 +437 418 -6.109381318875748e-03 +437 419 -6.996835383339699e-03 +437 420 -8.076052134892611e-03 +437 421 -9.403863770832828e-03 +437 422 -1.105916272470022e-02 +437 423 -1.315380302376542e-02 +437 424 -1.585023865775526e-02 +437 425 -1.939104886145104e-02 +437 426 -2.415034675252887e-02 +437 427 -3.072751892616537e-02 +437 428 -4.012781031912977e-02 +437 429 -5.413421453123171e-02 +437 430 -7.613960933881142e-02 +437 431 -1.132183869282769e-01 +437 432 -1.820810586422655e-01 +437 433 -3.301555353436747e-01 +437 434 -7.412185823610182e-01 +437 435 -3.165206906282860e+00 +437 436 -1.502055215844907e+01 +437 438 -1.502055215839541e+01 +437 439 -3.165206906282867e+00 +437 440 -7.412185823610262e-01 +437 441 -3.301555353436770e-01 +437 442 -1.820810586422636e-01 +437 443 -1.132183869282762e-01 +437 444 -7.613960933881182e-02 +437 445 -5.413421453123171e-02 +437 446 -4.012781031913015e-02 +437 447 -3.072751892616557e-02 +437 448 -2.415034675252901e-02 +437 449 -1.939104886145118e-02 +437 450 -1.585023865775526e-02 +437 451 -1.315380302376550e-02 +437 452 -1.105916272470029e-02 +437 453 -9.403863770832828e-03 +437 454 -8.076052134892578e-03 +437 455 -6.996835383339676e-03 +437 456 -6.109381318875750e-03 +437 457 -5.371977266379788e-03 +437 458 -4.753493624956895e-03 +437 459 -4.230349322908520e-03 +437 460 -3.784439171232928e-03 +437 461 -3.401691470521385e-03 +437 462 -3.071047067257394e-03 +437 463 -2.783725492315673e-03 +438 438 3.988394278106477e+01 +438 416 -4.230349322908520e-03 +438 417 -4.753493624956895e-03 +438 418 -5.371977266379788e-03 +438 419 -6.109381318875751e-03 +438 420 -6.996835383339675e-03 +438 421 -8.076052134892578e-03 +438 422 -9.403863770832827e-03 +438 423 -1.105916272470025e-02 +438 424 -1.315380302376550e-02 +438 425 -1.585023865775526e-02 +438 426 -1.939104886145111e-02 +438 427 -2.415034675252901e-02 +438 428 -3.072751892616544e-02 +438 429 -4.012781031913015e-02 +438 430 -5.413421453123170e-02 +438 431 -7.613960933881174e-02 +438 432 -1.132183869282770e-01 +438 433 -1.820810586422651e-01 +438 434 -3.301555353436771e-01 +438 435 -7.412185823610129e-01 +438 436 -3.165206906282862e+00 +438 437 -1.502055215839541e+01 +438 439 -1.502055215836220e+01 +438 440 -3.165206906282887e+00 +438 441 -7.412185823610270e-01 +438 442 -3.301555353436753e-01 +438 443 -1.820810586422648e-01 +438 444 -1.132183869282762e-01 +438 445 -7.613960933881131e-02 +438 446 -5.413421453123170e-02 +438 447 -4.012781031912996e-02 +438 448 -3.072751892616537e-02 +438 449 -2.415034675252897e-02 +438 450 -1.939104886145104e-02 +438 451 -1.585023865775526e-02 +438 452 -1.315380302376546e-02 +438 453 -1.105916272470022e-02 +438 454 -9.403863770832827e-03 +438 455 -8.076052134892616e-03 +438 456 -6.996835383339699e-03 +438 457 -6.109381318875749e-03 +438 458 -5.371977266379821e-03 +438 459 -4.753493624956895e-03 +438 460 -4.230349322908543e-03 +438 461 -3.784439171232927e-03 +438 462 -3.401691470521403e-03 +438 463 -3.071047067257401e-03 +439 439 3.988394278102307e+01 +439 416 -3.784439171232928e-03 +439 417 -4.230349322908543e-03 +439 418 -4.753493624956895e-03 +439 419 -5.371977266379823e-03 +439 420 -6.109381318875770e-03 +439 421 -6.996835383339674e-03 +439 422 -8.076052134892615e-03 +439 423 -9.403863770832827e-03 +439 424 -1.105916272470029e-02 +439 425 -1.315380302376546e-02 +439 426 -1.585023865775526e-02 +439 427 -1.939104886145114e-02 +439 428 -2.415034675252897e-02 +439 429 -3.072751892616557e-02 +439 430 -4.012781031912996e-02 +439 431 -5.413421453123172e-02 +439 432 -7.613960933881193e-02 +439 433 -1.132183869282760e-01 +439 434 -1.820810586422649e-01 +439 435 -3.301555353436763e-01 +439 436 -7.412185823610175e-01 +439 437 -3.165206906282867e+00 +439 438 -1.502055215836220e+01 +439 440 -1.502055215835492e+01 +439 441 -3.165206906282877e+00 +439 442 -7.412185823610158e-01 +439 443 -3.301555353436784e-01 +439 444 -1.820810586422667e-01 +439 445 -1.132183869282769e-01 +439 446 -7.613960933881174e-02 +439 447 -5.413421453123172e-02 +439 448 -4.012781031912987e-02 +439 449 -3.072751892616545e-02 +439 450 -2.415034675252887e-02 +439 451 -1.939104886145111e-02 +439 452 -1.585023865775526e-02 +439 453 -1.315380302376542e-02 +439 454 -1.105916272470025e-02 +439 455 -9.403863770832828e-03 +439 456 -8.076052134892590e-03 +439 457 -6.996835383339650e-03 +439 458 -6.109381318875748e-03 +439 459 -5.371977266379788e-03 +439 460 -4.753493624956895e-03 +439 461 -4.230349322908520e-03 +439 462 -3.784439171232928e-03 +439 463 -3.401691470521394e-03 +440 440 3.988394278105613e+01 +440 416 -3.401691470521385e-03 +440 417 -3.784439171232927e-03 +440 418 -4.230349322908520e-03 +440 419 -4.753493624956896e-03 +440 420 -5.371977266379806e-03 +440 421 -6.109381318875728e-03 +440 422 -6.996835383339672e-03 +440 423 -8.076052134892566e-03 +440 424 -9.403863770832827e-03 +440 425 -1.105916272470022e-02 +440 426 -1.315380302376542e-02 +440 427 -1.585023865775523e-02 +440 428 -1.939104886145104e-02 +440 429 -2.415034675252896e-02 +440 430 -3.072751892616530e-02 +440 431 -4.012781031912977e-02 +440 432 -5.413421453123171e-02 +440 433 -7.613960933881112e-02 +440 434 -1.132183869282761e-01 +440 435 -1.820810586422651e-01 +440 436 -3.301555353436781e-01 +440 437 -7.412185823610262e-01 +440 438 -3.165206906282887e+00 +440 439 -1.502055215835492e+01 +440 441 -1.502055215840045e+01 +440 442 -3.165206906282847e+00 +440 443 -7.412185823610120e-01 +440 444 -3.301555353436764e-01 +440 445 -1.820810586422655e-01 +440 446 -1.132183869282768e-01 +440 447 -7.613960933881182e-02 +440 448 -5.413421453123186e-02 +440 449 -4.012781031913015e-02 +440 450 -3.072751892616544e-02 +440 451 -2.415034675252906e-02 +440 452 -1.939104886145118e-02 +440 453 -1.585023865775526e-02 +440 454 -1.315380302376550e-02 +440 455 -1.105916272470029e-02 +440 456 -9.403863770832842e-03 +440 457 -8.076052134892601e-03 +440 458 -6.996835383339699e-03 +440 459 -6.109381318875751e-03 +440 460 -5.371977266379823e-03 +440 461 -4.753493624956897e-03 +440 462 -4.230349322908545e-03 +440 463 -3.784439171232939e-03 +441 441 3.988394278128564e+01 +441 416 -3.071047067257385e-03 +441 417 -3.401691470521393e-03 +441 418 -3.784439171232916e-03 +441 419 -4.230349322908531e-03 +441 420 -4.753493624956895e-03 +441 421 -5.371977266379788e-03 +441 422 -6.109381318875748e-03 +441 423 -6.996835383339648e-03 +441 424 -8.076052134892599e-03 +441 425 -9.403863770832818e-03 +441 426 -1.105916272470025e-02 +441 427 -1.315380302376548e-02 +441 428 -1.585023865775526e-02 +441 429 -1.939104886145118e-02 +441 430 -2.415034675252896e-02 +441 431 -3.072751892616544e-02 +441 432 -4.012781031913015e-02 +441 433 -5.413421453123170e-02 +441 434 -7.613960933881185e-02 +441 435 -1.132183869282777e-01 +441 436 -1.820810586422676e-01 +441 437 -3.301555353436770e-01 +441 438 -7.412185823610270e-01 +441 439 -3.165206906282877e+00 +441 440 -1.502055215840045e+01 +441 442 -1.502055215860531e+01 +441 443 -3.165206906282873e+00 +441 444 -7.412185823610233e-01 +441 445 -3.301555353436749e-01 +441 446 -1.820810586422643e-01 +441 447 -1.132183869282754e-01 +441 448 -7.613960933881128e-02 +441 449 -5.413421453123171e-02 +441 450 -4.012781031912976e-02 +441 451 -3.072751892616543e-02 +441 452 -2.415034675252897e-02 +441 453 -1.939104886145104e-02 +441 454 -1.585023865775526e-02 +441 455 -1.315380302376546e-02 +441 456 -1.105916272470023e-02 +441 457 -9.403863770832828e-03 +441 458 -8.076052134892611e-03 +441 459 -6.996835383339675e-03 +441 460 -6.109381318875770e-03 +441 461 -5.371977266379807e-03 +441 462 -4.753493624956911e-03 +441 463 -4.230349322908545e-03 +442 442 3.988394278152497e+01 +442 416 -2.783725492315673e-03 +442 417 -3.071047067257401e-03 +442 418 -3.401691470521394e-03 +442 419 -3.784439171232938e-03 +442 420 -4.230349322908544e-03 +442 421 -4.753493624956895e-03 +442 422 -5.371977266379821e-03 +442 423 -6.109381318875748e-03 +442 424 -6.996835383339698e-03 +442 425 -8.076052134892594e-03 +442 426 -9.403863770832835e-03 +442 427 -1.105916272470027e-02 +442 428 -1.315380302376546e-02 +442 429 -1.585023865775531e-02 +442 430 -1.939104886145111e-02 +442 431 -2.415034675252897e-02 +442 432 -3.072751892616558e-02 +442 433 -4.012781031912997e-02 +442 434 -5.413421453123173e-02 +442 435 -7.613960933881188e-02 +442 436 -1.132183869282762e-01 +442 437 -1.820810586422636e-01 +442 438 -3.301555353436753e-01 +442 439 -7.412185823610158e-01 +442 440 -3.165206906282847e+00 +442 441 -1.502055215860531e+01 +442 443 -1.502055215859223e+01 +442 444 -3.165206906282893e+00 +442 445 -7.412185823610292e-01 +442 446 -3.301555353436804e-01 +442 447 -1.820810586422661e-01 +442 448 -1.132183869282763e-01 +442 449 -7.613960933881166e-02 +442 450 -5.413421453123140e-02 +442 451 -4.012781031912995e-02 +442 452 -3.072751892616543e-02 +442 453 -2.415034675252887e-02 +442 454 -1.939104886145110e-02 +442 455 -1.585023865775526e-02 +442 456 -1.315380302376544e-02 +442 457 -1.105916272470025e-02 +442 458 -9.403863770832806e-03 +442 459 -8.076052134892573e-03 +442 460 -6.996835383339674e-03 +442 461 -6.109381318875729e-03 +442 462 -5.371977266379807e-03 +442 463 -4.753493624956896e-03 +443 443 3.988394278151362e+01 +443 416 -2.532689975072674e-03 +443 417 -2.783725492315672e-03 +443 418 -3.071047067257386e-03 +443 419 -3.401691470521394e-03 +443 420 -3.784439171232928e-03 +443 421 -4.230349322908520e-03 +443 422 -4.753493624956895e-03 +443 423 -5.371977266379788e-03 +443 424 -6.109381318875749e-03 +443 425 -6.996835383339650e-03 +443 426 -8.076052134892596e-03 +443 427 -9.403863770832835e-03 +443 428 -1.105916272470026e-02 +443 429 -1.315380302376550e-02 +443 430 -1.585023865775526e-02 +443 431 -1.939104886145111e-02 +443 432 -2.415034675252907e-02 +443 433 -3.072751892616544e-02 +443 434 -4.012781031912997e-02 +443 435 -5.413421453123187e-02 +443 436 -7.613960933881161e-02 +443 437 -1.132183869282762e-01 +443 438 -1.820810586422648e-01 +443 439 -3.301555353436784e-01 +443 440 -7.412185823610120e-01 +443 441 -3.165206906282873e+00 +443 442 -1.502055215859223e+01 +443 444 -1.502055215859653e+01 +443 445 -3.165206906282899e+00 +443 446 -7.412185823610341e-01 +443 447 -3.301555353436726e-01 +443 448 -1.820810586422631e-01 +443 449 -1.132183869282762e-01 +443 450 -7.613960933881110e-02 +443 451 -5.413421453123170e-02 +443 452 -4.012781031912996e-02 +443 453 -3.072751892616530e-02 +443 454 -2.415034675252896e-02 +443 455 -1.939104886145111e-02 +443 456 -1.585023865775523e-02 +443 457 -1.315380302376546e-02 +443 458 -1.105916272470022e-02 +443 459 -9.403863770832825e-03 +443 460 -8.076052134892615e-03 +443 461 -6.996835383339673e-03 +443 462 -6.109381318875770e-03 +443 463 -5.371977266379823e-03 +444 444 3.988394278151447e+01 +444 416 -2.312252367280536e-03 +444 417 -2.532689975072686e-03 +444 418 -2.783725492315673e-03 +444 419 -3.071047067257401e-03 +444 420 -3.401691470521403e-03 +444 421 -3.784439171232928e-03 +444 422 -4.230349322908543e-03 +444 423 -4.753493624956895e-03 +444 424 -5.371977266379821e-03 +444 425 -6.109381318875748e-03 +444 426 -6.996835383339699e-03 +444 427 -8.076052134892618e-03 +444 428 -9.403863770832827e-03 +444 429 -1.105916272470029e-02 +444 430 -1.315380302376546e-02 +444 431 -1.585023865775526e-02 +444 432 -1.939104886145118e-02 +444 433 -2.415034675252897e-02 +444 434 -3.072751892616545e-02 +444 435 -4.012781031913006e-02 +444 436 -5.413421453123172e-02 +444 437 -7.613960933881182e-02 +444 438 -1.132183869282762e-01 +444 439 -1.820810586422667e-01 +444 440 -3.301555353436764e-01 +444 441 -7.412185823610233e-01 +444 442 -3.165206906282893e+00 +444 443 -1.502055215859653e+01 +444 445 -1.502055215858805e+01 +444 446 -3.165206906282893e+00 +444 447 -7.412185823610081e-01 +444 448 -3.301555353436730e-01 +444 449 -1.820810586422651e-01 +444 450 -1.132183869282758e-01 +444 451 -7.613960933881159e-02 +444 452 -5.413421453123172e-02 +444 453 -4.012781031912977e-02 +444 454 -3.072751892616544e-02 +444 455 -2.415034675252897e-02 +444 456 -1.939104886145107e-02 +444 457 -1.585023865775526e-02 +444 458 -1.315380302376542e-02 +444 459 -1.105916272470025e-02 +444 460 -9.403863770832827e-03 +444 461 -8.076052134892568e-03 +444 462 -6.996835383339676e-03 +444 463 -6.109381318875750e-03 +445 445 3.988394278153933e+01 +445 416 -2.117777896667789e-03 +445 417 -2.312252367280536e-03 +445 418 -2.532689975072674e-03 +445 419 -2.783725492315673e-03 +445 420 -3.071047067257394e-03 +445 421 -3.401691470521385e-03 +445 422 -3.784439171232927e-03 +445 423 -4.230349322908520e-03 +445 424 -4.753493624956895e-03 +445 425 -5.371977266379788e-03 +445 426 -6.109381318875751e-03 +445 427 -6.996835383339675e-03 +445 428 -8.076052134892568e-03 +445 429 -9.403863770832828e-03 +445 430 -1.105916272470022e-02 +445 431 -1.315380302376542e-02 +445 432 -1.585023865775526e-02 +445 433 -1.939104886145104e-02 +445 434 -2.415034675252887e-02 +445 435 -3.072751892616537e-02 +445 436 -4.012781031912977e-02 +445 437 -5.413421453123171e-02 +445 438 -7.613960933881131e-02 +445 439 -1.132183869282769e-01 +445 440 -1.820810586422655e-01 +445 441 -3.301555353436749e-01 +445 442 -7.412185823610292e-01 +445 443 -3.165206906282899e+00 +445 444 -1.502055215858805e+01 +445 446 -1.502055215864003e+01 +445 447 -3.165206906282831e+00 +445 448 -7.412185823609935e-01 +445 449 -3.301555353436779e-01 +445 450 -1.820810586422646e-01 +445 451 -1.132183869282760e-01 +445 452 -7.613960933881171e-02 +445 453 -5.413421453123171e-02 +445 454 -4.012781031913015e-02 +445 455 -3.072751892616557e-02 +445 456 -2.415034675252901e-02 +445 457 -1.939104886145118e-02 +445 458 -1.585023865775526e-02 +445 459 -1.315380302376550e-02 +445 460 -1.105916272470029e-02 +445 461 -9.403863770832828e-03 +445 462 -8.076052134892622e-03 +445 463 -6.996835383339699e-03 +446 446 3.988394278164019e+01 +446 416 -1.945462087124853e-03 +446 417 -2.117777896667798e-03 +446 418 -2.312252367280536e-03 +446 419 -2.532689975072686e-03 +446 420 -2.783725492315679e-03 +446 421 -3.071047067257393e-03 +446 422 -3.401691470521402e-03 +446 423 -3.784439171232928e-03 +446 424 -4.230349322908543e-03 +446 425 -4.753493624956895e-03 +446 426 -5.371977266379823e-03 +446 427 -6.109381318875770e-03 +446 428 -6.996835383339674e-03 +446 429 -8.076052134892622e-03 +446 430 -9.403863770832825e-03 +446 431 -1.105916272470025e-02 +446 432 -1.315380302376550e-02 +446 433 -1.585023865775526e-02 +446 434 -1.939104886145111e-02 +446 435 -2.415034675252901e-02 +446 436 -3.072751892616544e-02 +446 437 -4.012781031913015e-02 +446 438 -5.413421453123170e-02 +446 439 -7.613960933881174e-02 +446 440 -1.132183869282768e-01 +446 441 -1.820810586422643e-01 +446 442 -3.301555353436804e-01 +446 443 -7.412185823610341e-01 +446 444 -3.165206906282893e+00 +446 445 -1.502055215864003e+01 +446 447 -1.502055215865997e+01 +446 448 -3.165206906282827e+00 +446 449 -7.412185823610182e-01 +446 450 -3.301555353436737e-01 +446 451 -1.820810586422639e-01 +446 452 -1.132183869282762e-01 +446 453 -7.613960933881123e-02 +446 454 -5.413421453123170e-02 +446 455 -4.012781031912996e-02 +446 456 -3.072751892616537e-02 +446 457 -2.415034675252897e-02 +446 458 -1.939104886145104e-02 +446 459 -1.585023865775526e-02 +446 460 -1.315380302376546e-02 +446 461 -1.105916272470022e-02 +446 462 -9.403863770832827e-03 +446 463 -8.076052134892594e-03 +447 447 3.988394278169699e+01 +447 416 -1.792160480940034e-03 +447 417 -1.945462087124853e-03 +447 418 -2.117777896667789e-03 +447 419 -2.312252367280536e-03 +447 420 -2.532689975072680e-03 +447 421 -2.783725492315665e-03 +447 422 -3.071047067257392e-03 +447 423 -3.401691470521385e-03 +447 424 -3.784439171232927e-03 +447 425 -4.230349322908520e-03 +447 426 -4.753493624956896e-03 +447 427 -5.371977266379806e-03 +447 428 -6.109381318875728e-03 +447 429 -6.996835383339672e-03 +447 430 -8.076052134892573e-03 +447 431 -9.403863770832827e-03 +447 432 -1.105916272470029e-02 +447 433 -1.315380302376546e-02 +447 434 -1.585023865775526e-02 +447 435 -1.939104886145114e-02 +447 436 -2.415034675252897e-02 +447 437 -3.072751892616557e-02 +447 438 -4.012781031912996e-02 +447 439 -5.413421453123172e-02 +447 440 -7.613960933881182e-02 +447 441 -1.132183869282754e-01 +447 442 -1.820810586422661e-01 +447 443 -3.301555353436726e-01 +447 444 -7.412185823610081e-01 +447 445 -3.165206906282831e+00 +447 446 -1.502055215865997e+01 +447 448 -1.502055215931067e+01 +447 449 -3.165206906282894e+00 +447 450 -7.412185823610312e-01 +447 451 -3.301555353436774e-01 +447 452 -1.820810586422667e-01 +447 453 -1.132183869282762e-01 +447 454 -7.613960933881167e-02 +447 455 -5.413421453123172e-02 +447 456 -4.012781031912987e-02 +447 457 -3.072751892616545e-02 +447 458 -2.415034675252887e-02 +447 459 -1.939104886145111e-02 +447 460 -1.585023865775526e-02 +447 461 -1.315380302376542e-02 +447 462 -1.105916272470025e-02 +447 463 -9.403863770832835e-03 +448 448 3.988394278169712e+01 +448 432 -9.403863770832827e-03 +448 433 -1.105916272470023e-02 +448 434 -1.315380302376544e-02 +448 435 -1.585023865775526e-02 +448 436 -1.939104886145107e-02 +448 437 -2.415034675252901e-02 +448 438 -3.072751892616537e-02 +448 439 -4.012781031912987e-02 +448 440 -5.413421453123186e-02 +448 441 -7.613960933881128e-02 +448 442 -1.132183869282763e-01 +448 443 -1.820810586422631e-01 +448 444 -3.301555353436730e-01 +448 445 -7.412185823609935e-01 +448 446 -3.165206906282827e+00 +448 447 -1.502055215931067e+01 +448 449 -1.502055215866004e+01 +448 450 -3.165206906282900e+00 +448 451 -7.412185823610314e-01 +448 452 -3.301555353436809e-01 +448 453 -1.820810586422658e-01 +448 454 -1.132183869282768e-01 +448 455 -7.613960933881178e-02 +448 456 -5.413421453123170e-02 +448 457 -4.012781031913006e-02 +448 458 -3.072751892616537e-02 +448 459 -2.415034675252901e-02 +448 460 -1.939104886145114e-02 +448 461 -1.585023865775523e-02 +448 462 -1.315380302376548e-02 +448 463 -1.105916272470027e-02 +448 464 -9.403863770832823e-03 +448 465 -8.076052134892618e-03 +448 466 -6.996835383339675e-03 +448 467 -6.109381318875770e-03 +448 468 -5.371977266379807e-03 +448 469 -4.753493624956911e-03 +448 470 -4.230349322908545e-03 +448 471 -3.784439171232928e-03 +448 472 -3.401691470521403e-03 +448 473 -3.071047067257394e-03 +448 474 -2.783725492315679e-03 +448 475 -2.532689975072680e-03 +448 476 -2.312252367280542e-03 +448 477 -2.117777896667799e-03 +448 478 -1.945462087124854e-03 +448 479 -1.792160480940042e-03 +449 449 3.988394278164027e+01 +449 432 -8.076052134892601e-03 +449 433 -9.403863770832835e-03 +449 434 -1.105916272470025e-02 +449 435 -1.315380302376548e-02 +449 436 -1.585023865775526e-02 +449 437 -1.939104886145118e-02 +449 438 -2.415034675252897e-02 +449 439 -3.072751892616545e-02 +449 440 -4.012781031913015e-02 +449 441 -5.413421453123171e-02 +449 442 -7.613960933881166e-02 +449 443 -1.132183869282762e-01 +449 444 -1.820810586422651e-01 +449 445 -3.301555353436779e-01 +449 446 -7.412185823610182e-01 +449 447 -3.165206906282894e+00 +449 448 -1.502055215866004e+01 +449 450 -1.502055215864001e+01 +449 451 -3.165206906282888e+00 +449 452 -7.412185823610218e-01 +449 453 -3.301555353436738e-01 +449 454 -1.820810586422641e-01 +449 455 -1.132183869282762e-01 +449 456 -7.613960933881157e-02 +449 457 -5.413421453123172e-02 +449 458 -4.012781031912977e-02 +449 459 -3.072751892616544e-02 +449 460 -2.415034675252897e-02 +449 461 -1.939104886145104e-02 +449 462 -1.585023865775526e-02 +449 463 -1.315380302376546e-02 +449 464 -1.105916272470024e-02 +449 465 -9.403863770832827e-03 +449 466 -8.076052134892568e-03 +449 467 -6.996835383339674e-03 +449 468 -6.109381318875729e-03 +449 469 -5.371977266379807e-03 +449 470 -4.753493624956896e-03 +449 471 -4.230349322908520e-03 +449 472 -3.784439171232928e-03 +449 473 -3.401691470521385e-03 +449 474 -3.071047067257393e-03 +449 475 -2.783725492315666e-03 +449 476 -2.532689975072680e-03 +449 477 -2.312252367280537e-03 +449 478 -2.117777896667789e-03 +449 479 -1.945462087124853e-03 +450 450 3.988394278153934e+01 +450 432 -6.996835383339650e-03 +450 433 -8.076052134892589e-03 +450 434 -9.403863770832809e-03 +450 435 -1.105916272470023e-02 +450 436 -1.315380302376542e-02 +450 437 -1.585023865775526e-02 +450 438 -1.939104886145104e-02 +450 439 -2.415034675252887e-02 +450 440 -3.072751892616544e-02 +450 441 -4.012781031912976e-02 +450 442 -5.413421453123140e-02 +450 443 -7.613960933881110e-02 +450 444 -1.132183869282758e-01 +450 445 -1.820810586422646e-01 +450 446 -3.301555353436737e-01 +450 447 -7.412185823610312e-01 +450 448 -3.165206906282900e+00 +450 449 -1.502055215864001e+01 +450 451 -1.502055215858803e+01 +450 452 -3.165206906282863e+00 +450 453 -7.412185823610058e-01 +450 454 -3.301555353436773e-01 +450 455 -1.820810586422661e-01 +450 456 -1.132183869282768e-01 +450 457 -7.613960933881189e-02 +450 458 -5.413421453123171e-02 +450 459 -4.012781031913015e-02 +450 460 -3.072751892616557e-02 +450 461 -2.415034675252896e-02 +450 462 -1.939104886145118e-02 +450 463 -1.585023865775531e-02 +450 464 -1.315380302376548e-02 +450 465 -1.105916272470029e-02 +450 466 -9.403863770832828e-03 +450 467 -8.076052134892622e-03 +450 468 -6.996835383339673e-03 +450 469 -6.109381318875770e-03 +450 470 -5.371977266379823e-03 +450 471 -4.753493624956895e-03 +450 472 -4.230349322908543e-03 +450 473 -3.784439171232927e-03 +450 474 -3.401691470521402e-03 +450 475 -3.071047067257393e-03 +450 476 -2.783725492315679e-03 +450 477 -2.532689975072686e-03 +450 478 -2.312252367280536e-03 +450 479 -2.117777896667798e-03 +451 451 3.988394278151441e+01 +451 432 -6.109381318875748e-03 +451 433 -6.996835383339699e-03 +451 434 -8.076052134892616e-03 +451 435 -9.403863770832832e-03 +451 436 -1.105916272470025e-02 +451 437 -1.315380302376550e-02 +451 438 -1.585023865775526e-02 +451 439 -1.939104886145111e-02 +451 440 -2.415034675252906e-02 +451 441 -3.072751892616543e-02 +451 442 -4.012781031912995e-02 +451 443 -5.413421453123170e-02 +451 444 -7.613960933881159e-02 +451 445 -1.132183869282760e-01 +451 446 -1.820810586422639e-01 +451 447 -3.301555353436774e-01 +451 448 -7.412185823610314e-01 +451 449 -3.165206906282888e+00 +451 450 -1.502055215858803e+01 +451 452 -1.502055215859652e+01 +451 453 -3.165206906282841e+00 +451 454 -7.412185823610152e-01 +451 455 -3.301555353436749e-01 +451 456 -1.820810586422646e-01 +451 457 -1.132183869282762e-01 +451 458 -7.613960933881123e-02 +451 459 -5.413421453123170e-02 +451 460 -4.012781031912996e-02 +451 461 -3.072751892616530e-02 +451 462 -2.415034675252896e-02 +451 463 -1.939104886145111e-02 +451 464 -1.585023865775523e-02 +451 465 -1.315380302376546e-02 +451 466 -1.105916272470022e-02 +451 467 -9.403863770832825e-03 +451 468 -8.076052134892573e-03 +451 469 -6.996835383339676e-03 +451 470 -6.109381318875750e-03 +451 471 -5.371977266379788e-03 +451 472 -4.753493624956895e-03 +451 473 -4.230349322908520e-03 +451 474 -3.784439171232928e-03 +451 475 -3.401691470521385e-03 +451 476 -3.071047067257394e-03 +451 477 -2.783725492315673e-03 +451 478 -2.532689975072674e-03 +451 479 -2.312252367280536e-03 +452 452 3.988394278151355e+01 +452 432 -5.371977266379788e-03 +452 433 -6.109381318875751e-03 +452 434 -6.996835383339675e-03 +452 435 -8.076052134892573e-03 +452 436 -9.403863770832828e-03 +452 437 -1.105916272470029e-02 +452 438 -1.315380302376546e-02 +452 439 -1.585023865775526e-02 +452 440 -1.939104886145118e-02 +452 441 -2.415034675252897e-02 +452 442 -3.072751892616543e-02 +452 443 -4.012781031912996e-02 +452 444 -5.413421453123172e-02 +452 445 -7.613960933881171e-02 +452 446 -1.132183869282762e-01 +452 447 -1.820810586422667e-01 +452 448 -3.301555353436809e-01 +452 449 -7.412185823610218e-01 +452 450 -3.165206906282863e+00 +452 451 -1.502055215859652e+01 +452 453 -1.502055215859221e+01 +452 454 -3.165206906282879e+00 +452 455 -7.412185823610230e-01 +452 456 -3.301555353436734e-01 +452 457 -1.820810586422650e-01 +452 458 -1.132183869282762e-01 +452 459 -7.613960933881167e-02 +452 460 -5.413421453123172e-02 +452 461 -4.012781031912977e-02 +452 462 -3.072751892616544e-02 +452 463 -2.415034675252897e-02 +452 464 -1.939104886145107e-02 +452 465 -1.585023865775526e-02 +452 466 -1.315380302376542e-02 +452 467 -1.105916272470025e-02 +452 468 -9.403863770832828e-03 +452 469 -8.076052134892611e-03 +452 470 -6.996835383339699e-03 +452 471 -6.109381318875749e-03 +452 472 -5.371977266379821e-03 +452 473 -4.753493624956895e-03 +452 474 -4.230349322908543e-03 +452 475 -3.784439171232927e-03 +452 476 -3.401691470521403e-03 +452 477 -3.071047067257401e-03 +452 478 -2.783725492315672e-03 +452 479 -2.532689975072686e-03 +453 453 3.988394278152497e+01 +453 432 -4.753493624956895e-03 +453 433 -5.371977266379823e-03 +453 434 -6.109381318875770e-03 +453 435 -6.996835383339674e-03 +453 436 -8.076052134892609e-03 +453 437 -9.403863770832828e-03 +453 438 -1.105916272470022e-02 +453 439 -1.315380302376542e-02 +453 440 -1.585023865775526e-02 +453 441 -1.939104886145104e-02 +453 442 -2.415034675252887e-02 +453 443 -3.072751892616530e-02 +453 444 -4.012781031912977e-02 +453 445 -5.413421453123171e-02 +453 446 -7.613960933881123e-02 +453 447 -1.132183869282762e-01 +453 448 -1.820810586422658e-01 +453 449 -3.301555353436738e-01 +453 450 -7.412185823610058e-01 +453 451 -3.165206906282841e+00 +453 452 -1.502055215859221e+01 +453 454 -1.502055215860535e+01 +453 455 -3.165206906282892e+00 +453 456 -7.412185823610198e-01 +453 457 -3.301555353436797e-01 +453 458 -1.820810586422661e-01 +453 459 -1.132183869282768e-01 +453 460 -7.613960933881189e-02 +453 461 -5.413421453123171e-02 +453 462 -4.012781031913015e-02 +453 463 -3.072751892616557e-02 +453 464 -2.415034675252901e-02 +453 465 -1.939104886145118e-02 +453 466 -1.585023865775526e-02 +453 467 -1.315380302376550e-02 +453 468 -1.105916272470029e-02 +453 469 -9.403863770832828e-03 +453 470 -8.076052134892601e-03 +453 471 -6.996835383339650e-03 +453 472 -6.109381318875748e-03 +453 473 -5.371977266379788e-03 +453 474 -4.753493624956895e-03 +453 475 -4.230349322908520e-03 +453 476 -3.784439171232928e-03 +453 477 -3.401691470521394e-03 +453 478 -3.071047067257386e-03 +453 479 -2.783725492315673e-03 +454 454 3.988394278128565e+01 +454 432 -4.230349322908520e-03 +454 433 -4.753493624956897e-03 +454 434 -5.371977266379807e-03 +454 435 -6.109381318875729e-03 +454 436 -6.996835383339673e-03 +454 437 -8.076052134892578e-03 +454 438 -9.403863770832827e-03 +454 439 -1.105916272470025e-02 +454 440 -1.315380302376550e-02 +454 441 -1.585023865775526e-02 +454 442 -1.939104886145110e-02 +454 443 -2.415034675252896e-02 +454 444 -3.072751892616544e-02 +454 445 -4.012781031913015e-02 +454 446 -5.413421453123170e-02 +454 447 -7.613960933881167e-02 +454 448 -1.132183869282768e-01 +454 449 -1.820810586422641e-01 +454 450 -3.301555353436773e-01 +454 451 -7.412185823610152e-01 +454 452 -3.165206906282879e+00 +454 453 -1.502055215860535e+01 +454 455 -1.502055215840048e+01 +454 456 -3.165206906282847e+00 +454 457 -7.412185823610079e-01 +454 458 -3.301555353436758e-01 +454 459 -1.820810586422649e-01 +454 460 -1.132183869282762e-01 +454 461 -7.613960933881134e-02 +454 462 -5.413421453123170e-02 +454 463 -4.012781031912996e-02 +454 464 -3.072751892616537e-02 +454 465 -2.415034675252897e-02 +454 466 -1.939104886145104e-02 +454 467 -1.585023865775526e-02 +454 468 -1.315380302376546e-02 +454 469 -1.105916272470022e-02 +454 470 -9.403863770832833e-03 +454 471 -8.076052134892594e-03 +454 472 -6.996835383339698e-03 +454 473 -6.109381318875749e-03 +454 474 -5.371977266379821e-03 +454 475 -4.753493624956895e-03 +454 476 -4.230349322908545e-03 +454 477 -3.784439171232938e-03 +454 478 -3.401691470521394e-03 +454 479 -3.071047067257401e-03 +455 455 3.988394278105612e+01 +455 432 -3.784439171232928e-03 +455 433 -4.230349322908545e-03 +455 434 -4.753493624956911e-03 +455 435 -5.371977266379807e-03 +455 436 -6.109381318875770e-03 +455 437 -6.996835383339676e-03 +455 438 -8.076052134892616e-03 +455 439 -9.403863770832828e-03 +455 440 -1.105916272470029e-02 +455 441 -1.315380302376546e-02 +455 442 -1.585023865775526e-02 +455 443 -1.939104886145111e-02 +455 444 -2.415034675252897e-02 +455 445 -3.072751892616557e-02 +455 446 -4.012781031912996e-02 +455 447 -5.413421453123172e-02 +455 448 -7.613960933881178e-02 +455 449 -1.132183869282762e-01 +455 450 -1.820810586422661e-01 +455 451 -3.301555353436749e-01 +455 452 -7.412185823610230e-01 +455 453 -3.165206906282892e+00 +455 454 -1.502055215840048e+01 +455 456 -1.502055215835487e+01 +455 457 -3.165206906282854e+00 +455 458 -7.412185823610140e-01 +455 459 -3.301555353436764e-01 +455 460 -1.820810586422656e-01 +455 461 -1.132183869282765e-01 +455 462 -7.613960933881156e-02 +455 463 -5.413421453123172e-02 +455 464 -4.012781031912987e-02 +455 465 -3.072751892616545e-02 +455 466 -2.415034675252887e-02 +455 467 -1.939104886145111e-02 +455 468 -1.585023865775526e-02 +455 469 -1.315380302376542e-02 +455 470 -1.105916272470025e-02 +455 471 -9.403863770832820e-03 +455 472 -8.076052134892594e-03 +455 473 -6.996835383339648e-03 +455 474 -6.109381318875748e-03 +455 475 -5.371977266379788e-03 +455 476 -4.753493624956895e-03 +455 477 -4.230349322908531e-03 +455 478 -3.784439171232917e-03 +455 479 -3.401691470521393e-03 +456 456 3.988394278102302e+01 +456 432 -3.401691470521394e-03 +456 433 -3.784439171232939e-03 +456 434 -4.230349322908545e-03 +456 435 -4.753493624956896e-03 +456 436 -5.371977266379823e-03 +456 437 -6.109381318875750e-03 +456 438 -6.996835383339699e-03 +456 439 -8.076052134892590e-03 +456 440 -9.403863770832842e-03 +456 441 -1.105916272470023e-02 +456 442 -1.315380302376544e-02 +456 443 -1.585023865775523e-02 +456 444 -1.939104886145107e-02 +456 445 -2.415034675252901e-02 +456 446 -3.072751892616537e-02 +456 447 -4.012781031912987e-02 +456 448 -5.413421453123170e-02 +456 449 -7.613960933881157e-02 +456 450 -1.132183869282768e-01 +456 451 -1.820810586422646e-01 +456 452 -3.301555353436734e-01 +456 453 -7.412185823610198e-01 +456 454 -3.165206906282847e+00 +456 455 -1.502055215835487e+01 +456 457 -1.502055215836223e+01 +456 458 -3.165206906282878e+00 +456 459 -7.412185823610233e-01 +456 460 -3.301555353436770e-01 +456 461 -1.820810586422645e-01 +456 462 -1.132183869282764e-01 +456 463 -7.613960933881180e-02 +456 464 -5.413421453123170e-02 +456 465 -4.012781031913006e-02 +456 466 -3.072751892616537e-02 +456 467 -2.415034675252901e-02 +456 468 -1.939104886145114e-02 +456 469 -1.585023865775523e-02 +456 470 -1.315380302376548e-02 +456 471 -1.105916272470027e-02 +456 472 -9.403863770832833e-03 +456 473 -8.076052134892571e-03 +456 474 -6.996835383339672e-03 +456 475 -6.109381318875728e-03 +456 476 -5.371977266379805e-03 +456 477 -4.753493624956895e-03 +456 478 -4.230349322908519e-03 +456 479 -3.784439171232927e-03 +457 457 3.988394278106477e+01 +457 432 -3.071047067257386e-03 +457 433 -3.401691470521394e-03 +457 434 -3.784439171232928e-03 +457 435 -4.230349322908520e-03 +457 436 -4.753493624956895e-03 +457 437 -5.371977266379788e-03 +457 438 -6.109381318875749e-03 +457 439 -6.996835383339650e-03 +457 440 -8.076052134892601e-03 +457 441 -9.403863770832828e-03 +457 442 -1.105916272470025e-02 +457 443 -1.315380302376546e-02 +457 444 -1.585023865775526e-02 +457 445 -1.939104886145118e-02 +457 446 -2.415034675252897e-02 +457 447 -3.072751892616545e-02 +457 448 -4.012781031913006e-02 +457 449 -5.413421453123172e-02 +457 450 -7.613960933881189e-02 +457 451 -1.132183869282762e-01 +457 452 -1.820810586422650e-01 +457 453 -3.301555353436797e-01 +457 454 -7.412185823610079e-01 +457 455 -3.165206906282854e+00 +457 456 -1.502055215836223e+01 +457 458 -1.502055215839541e+01 +457 459 -3.165206906282884e+00 +457 460 -7.412185823610289e-01 +457 461 -3.301555353436714e-01 +457 462 -1.820810586422647e-01 +457 463 -1.132183869282764e-01 +457 464 -7.613960933881157e-02 +457 465 -5.413421453123172e-02 +457 466 -4.012781031912977e-02 +457 467 -3.072751892616544e-02 +457 468 -2.415034675252897e-02 +457 469 -1.939104886145104e-02 +457 470 -1.585023865775526e-02 +457 471 -1.315380302376546e-02 +457 472 -1.105916272470026e-02 +457 473 -9.403863770832828e-03 +457 474 -8.076052134892609e-03 +457 475 -6.996835383339673e-03 +457 476 -6.109381318875770e-03 +457 477 -5.371977266379823e-03 +457 478 -4.753493624956895e-03 +457 479 -4.230349322908543e-03 +458 458 3.988394278115162e+01 +458 432 -2.783725492315673e-03 +458 433 -3.071047067257401e-03 +458 434 -3.401691470521403e-03 +458 435 -3.784439171232928e-03 +458 436 -4.230349322908543e-03 +458 437 -4.753493624956895e-03 +458 438 -5.371977266379821e-03 +458 439 -6.109381318875748e-03 +458 440 -6.996835383339699e-03 +458 441 -8.076052134892611e-03 +458 442 -9.403863770832806e-03 +458 443 -1.105916272470022e-02 +458 444 -1.315380302376542e-02 +458 445 -1.585023865775526e-02 +458 446 -1.939104886145104e-02 +458 447 -2.415034675252887e-02 +458 448 -3.072751892616537e-02 +458 449 -4.012781031912977e-02 +458 450 -5.413421453123171e-02 +458 451 -7.613960933881123e-02 +458 452 -1.132183869282762e-01 +458 453 -1.820810586422661e-01 +458 454 -3.301555353436758e-01 +458 455 -7.412185823610140e-01 +458 456 -3.165206906282878e+00 +458 457 -1.502055215839541e+01 +458 459 -1.502055215844912e+01 +458 460 -3.165206906282914e+00 +458 461 -7.412185823610146e-01 +458 462 -3.301555353436753e-01 +458 463 -1.820810586422660e-01 +458 464 -1.132183869282768e-01 +458 465 -7.613960933881189e-02 +458 466 -5.413421453123171e-02 +458 467 -4.012781031913015e-02 +458 468 -3.072751892616557e-02 +458 469 -2.415034675252896e-02 +458 470 -1.939104886145118e-02 +458 471 -1.585023865775531e-02 +458 472 -1.315380302376550e-02 +458 473 -1.105916272470029e-02 +458 474 -9.403863770832828e-03 +458 475 -8.076052134892578e-03 +458 476 -6.996835383339676e-03 +458 477 -6.109381318875750e-03 +458 478 -5.371977266379788e-03 +458 479 -4.753493624956895e-03 +459 459 3.988394278128120e+01 +459 432 -2.532689975072674e-03 +459 433 -2.783725492315673e-03 +459 434 -3.071047067257394e-03 +459 435 -3.401691470521385e-03 +459 436 -3.784439171232927e-03 +459 437 -4.230349322908520e-03 +459 438 -4.753493624956895e-03 +459 439 -5.371977266379788e-03 +459 440 -6.109381318875751e-03 +459 441 -6.996835383339675e-03 +459 442 -8.076052134892573e-03 +459 443 -9.403863770832825e-03 +459 444 -1.105916272470025e-02 +459 445 -1.315380302376550e-02 +459 446 -1.585023865775526e-02 +459 447 -1.939104886145111e-02 +459 448 -2.415034675252901e-02 +459 449 -3.072751892616544e-02 +459 450 -4.012781031913015e-02 +459 451 -5.413421453123170e-02 +459 452 -7.613960933881167e-02 +459 453 -1.132183869282768e-01 +459 454 -1.820810586422649e-01 +459 455 -3.301555353436764e-01 +459 456 -7.412185823610233e-01 +459 457 -3.165206906282884e+00 +459 458 -1.502055215844912e+01 +459 460 -1.502055215852580e+01 +459 461 -3.165206906282836e+00 +459 462 -7.412185823609991e-01 +459 463 -3.301555353436789e-01 +459 464 -1.820810586422648e-01 +459 465 -1.132183869282762e-01 +459 466 -7.613960933881134e-02 +459 467 -5.413421453123170e-02 +459 468 -4.012781031912996e-02 +459 469 -3.072751892616530e-02 +459 470 -2.415034675252896e-02 +459 471 -1.939104886145111e-02 +459 472 -1.585023865775526e-02 +459 473 -1.315380302376546e-02 +459 474 -1.105916272470022e-02 +459 475 -9.403863770832827e-03 +459 476 -8.076052134892616e-03 +459 477 -6.996835383339699e-03 +459 478 -6.109381318875749e-03 +459 479 -5.371977266379821e-03 +460 460 3.988394278146367e+01 +460 432 -2.312252367280536e-03 +460 433 -2.532689975072686e-03 +460 434 -2.783725492315679e-03 +460 435 -3.071047067257393e-03 +460 436 -3.401691470521402e-03 +460 437 -3.784439171232928e-03 +460 438 -4.230349322908543e-03 +460 439 -4.753493624956895e-03 +460 440 -5.371977266379823e-03 +460 441 -6.109381318875770e-03 +460 442 -6.996835383339674e-03 +460 443 -8.076052134892615e-03 +460 444 -9.403863770832827e-03 +460 445 -1.105916272470029e-02 +460 446 -1.315380302376546e-02 +460 447 -1.585023865775526e-02 +460 448 -1.939104886145114e-02 +460 449 -2.415034675252897e-02 +460 450 -3.072751892616557e-02 +460 451 -4.012781031912996e-02 +460 452 -5.413421453123172e-02 +460 453 -7.613960933881189e-02 +460 454 -1.132183869282762e-01 +460 455 -1.820810586422656e-01 +460 456 -3.301555353436770e-01 +460 457 -7.412185823610289e-01 +460 458 -3.165206906282914e+00 +460 459 -1.502055215852580e+01 +460 461 -1.502055215863290e+01 +460 462 -3.165206906282834e+00 +460 463 -7.412185823610161e-01 +460 464 -3.301555353436744e-01 +460 465 -1.820810586422652e-01 +460 466 -1.132183869282765e-01 +460 467 -7.613960933881156e-02 +460 468 -5.413421453123172e-02 +460 469 -4.012781031912977e-02 +460 470 -3.072751892616544e-02 +460 471 -2.415034675252897e-02 +460 472 -1.939104886145111e-02 +460 473 -1.585023865775526e-02 +460 474 -1.315380302376542e-02 +460 475 -1.105916272470025e-02 +460 476 -9.403863770832828e-03 +460 477 -8.076052134892590e-03 +460 478 -6.996835383339650e-03 +460 479 -6.109381318875748e-03 +461 461 3.988394278171949e+01 +461 432 -2.117777896667789e-03 +461 433 -2.312252367280537e-03 +461 434 -2.532689975072680e-03 +461 435 -2.783725492315666e-03 +461 436 -3.071047067257393e-03 +461 437 -3.401691470521385e-03 +461 438 -3.784439171232927e-03 +461 439 -4.230349322908520e-03 +461 440 -4.753493624956897e-03 +461 441 -5.371977266379807e-03 +461 442 -6.109381318875729e-03 +461 443 -6.996835383339673e-03 +461 444 -8.076052134892568e-03 +461 445 -9.403863770832828e-03 +461 446 -1.105916272470022e-02 +461 447 -1.315380302376542e-02 +461 448 -1.585023865775523e-02 +461 449 -1.939104886145104e-02 +461 450 -2.415034675252896e-02 +461 451 -3.072751892616530e-02 +461 452 -4.012781031912977e-02 +461 453 -5.413421453123171e-02 +461 454 -7.613960933881134e-02 +461 455 -1.132183869282765e-01 +461 456 -1.820810586422645e-01 +461 457 -3.301555353436714e-01 +461 458 -7.412185823610146e-01 +461 459 -3.165206906282836e+00 +461 460 -1.502055215863290e+01 +461 462 -1.502055215878379e+01 +461 463 -3.165206906282914e+00 +461 464 -7.412185823610371e-01 +461 465 -3.301555353436786e-01 +461 466 -1.820810586422664e-01 +461 467 -1.132183869282764e-01 +461 468 -7.613960933881191e-02 +461 469 -5.413421453123171e-02 +461 470 -4.012781031913015e-02 +461 471 -3.072751892616558e-02 +461 472 -2.415034675252907e-02 +461 473 -1.939104886145118e-02 +461 474 -1.585023865775526e-02 +461 475 -1.315380302376550e-02 +461 476 -1.105916272470029e-02 +461 477 -9.403863770832842e-03 +461 478 -8.076052134892601e-03 +461 479 -6.996835383339698e-03 +462 462 3.988394278208175e+01 +462 432 -1.945462087124853e-03 +462 433 -2.117777896667799e-03 +462 434 -2.312252367280542e-03 +462 435 -2.532689975072680e-03 +462 436 -2.783725492315679e-03 +462 437 -3.071047067257394e-03 +462 438 -3.401691470521403e-03 +462 439 -3.784439171232928e-03 +462 440 -4.230349322908545e-03 +462 441 -4.753493624956911e-03 +462 442 -5.371977266379807e-03 +462 443 -6.109381318875770e-03 +462 444 -6.996835383339676e-03 +462 445 -8.076052134892622e-03 +462 446 -9.403863770832827e-03 +462 447 -1.105916272470025e-02 +462 448 -1.315380302376548e-02 +462 449 -1.585023865775526e-02 +462 450 -1.939104886145118e-02 +462 451 -2.415034675252896e-02 +462 452 -3.072751892616544e-02 +462 453 -4.012781031913015e-02 +462 454 -5.413421453123170e-02 +462 455 -7.613960933881156e-02 +462 456 -1.132183869282764e-01 +462 457 -1.820810586422647e-01 +462 458 -3.301555353436753e-01 +462 459 -7.412185823609991e-01 +462 460 -3.165206906282834e+00 +462 461 -1.502055215878379e+01 +462 463 -1.502055215899864e+01 +462 464 -3.165206906282893e+00 +462 465 -7.412185823610208e-01 +462 466 -3.301555353436774e-01 +462 467 -1.820810586422644e-01 +462 468 -1.132183869282764e-01 +462 469 -7.613960933881134e-02 +462 470 -5.413421453123170e-02 +462 471 -4.012781031912997e-02 +462 472 -3.072751892616544e-02 +462 473 -2.415034675252897e-02 +462 474 -1.939104886145104e-02 +462 475 -1.585023865775526e-02 +462 476 -1.315380302376546e-02 +462 477 -1.105916272470023e-02 +462 478 -9.403863770832820e-03 +462 479 -8.076052134892594e-03 +463 463 3.988394278260316e+01 +463 432 -1.792160480940039e-03 +463 433 -1.945462087124858e-03 +463 434 -2.117777896667799e-03 +463 435 -2.312252367280537e-03 +463 436 -2.532689975072686e-03 +463 437 -2.783725492315673e-03 +463 438 -3.071047067257401e-03 +463 439 -3.401691470521394e-03 +463 440 -3.784439171232939e-03 +463 441 -4.230349322908545e-03 +463 442 -4.753493624956896e-03 +463 443 -5.371977266379823e-03 +463 444 -6.109381318875750e-03 +463 445 -6.996835383339699e-03 +463 446 -8.076052134892594e-03 +463 447 -9.403863770832835e-03 +463 448 -1.105916272470027e-02 +463 449 -1.315380302376546e-02 +463 450 -1.585023865775531e-02 +463 451 -1.939104886145111e-02 +463 452 -2.415034675252897e-02 +463 453 -3.072751892616557e-02 +463 454 -4.012781031912996e-02 +463 455 -5.413421453123172e-02 +463 456 -7.613960933881180e-02 +463 457 -1.132183869282764e-01 +463 458 -1.820810586422660e-01 +463 459 -3.301555353436789e-01 +463 460 -7.412185823610161e-01 +463 461 -3.165206906282914e+00 +463 462 -1.502055215899864e+01 +463 464 -1.502055215931067e+01 +463 465 -3.165206906282884e+00 +463 466 -7.412185823610183e-01 +463 467 -3.301555353436739e-01 +463 468 -1.820810586422651e-01 +463 469 -1.132183869282765e-01 +463 470 -7.613960933881156e-02 +463 471 -5.413421453123173e-02 +463 472 -4.012781031912997e-02 +463 473 -3.072751892616545e-02 +463 474 -2.415034675252887e-02 +463 475 -1.939104886145111e-02 +463 476 -1.585023865775526e-02 +463 477 -1.315380302376544e-02 +463 478 -1.105916272470026e-02 +463 479 -9.403863770832827e-03 +464 464 3.988394278260311e+01 +464 448 -9.403863770832823e-03 +464 449 -1.105916272470024e-02 +464 450 -1.315380302376548e-02 +464 451 -1.585023865775523e-02 +464 452 -1.939104886145107e-02 +464 453 -2.415034675252901e-02 +464 454 -3.072751892616537e-02 +464 455 -4.012781031912987e-02 +464 456 -5.413421453123170e-02 +464 457 -7.613960933881157e-02 +464 458 -1.132183869282768e-01 +464 459 -1.820810586422648e-01 +464 460 -3.301555353436744e-01 +464 461 -7.412185823610371e-01 +464 462 -3.165206906282893e+00 +464 463 -1.502055215931067e+01 +464 465 -1.502055215899861e+01 +464 466 -3.165206906282873e+00 +464 467 -7.412185823610149e-01 +464 468 -3.301555353436780e-01 +464 469 -1.820810586422664e-01 +464 470 -1.132183869282764e-01 +464 471 -7.613960933881191e-02 +464 472 -5.413421453123187e-02 +464 473 -4.012781031913006e-02 +464 474 -3.072751892616537e-02 +464 475 -2.415034675252901e-02 +464 476 -1.939104886145114e-02 +464 477 -1.585023865775526e-02 +464 478 -1.315380302376548e-02 +464 479 -1.105916272470027e-02 +464 480 -9.403863770832833e-03 +464 481 -8.076052134892615e-03 +464 482 -6.996835383339673e-03 +464 483 -6.109381318875770e-03 +464 484 -5.371977266379823e-03 +464 485 -4.753493624956895e-03 +464 486 -4.230349322908543e-03 +464 487 -3.784439171232927e-03 +464 488 -3.401691470521402e-03 +464 489 -3.071047067257393e-03 +464 490 -2.783725492315679e-03 +464 491 -2.532689975072686e-03 +464 492 -2.312252367280536e-03 +464 493 -2.117777896667798e-03 +464 494 -1.945462087124853e-03 +464 495 -1.792160480940042e-03 +465 465 3.988394278208170e+01 +465 448 -8.076052134892618e-03 +465 449 -9.403863770832827e-03 +465 450 -1.105916272470029e-02 +465 451 -1.315380302376546e-02 +465 452 -1.585023865775526e-02 +465 453 -1.939104886145118e-02 +465 454 -2.415034675252897e-02 +465 455 -3.072751892616545e-02 +465 456 -4.012781031913006e-02 +465 457 -5.413421453123172e-02 +465 458 -7.613960933881189e-02 +465 459 -1.132183869282762e-01 +465 460 -1.820810586422652e-01 +465 461 -3.301555353436786e-01 +465 462 -7.412185823610208e-01 +465 463 -3.165206906282884e+00 +465 464 -1.502055215899861e+01 +465 466 -1.502055215878374e+01 +465 467 -3.165206906282862e+00 +465 468 -7.412185823610172e-01 +465 469 -3.301555353436783e-01 +465 470 -1.820810586422646e-01 +465 471 -1.132183869282767e-01 +465 472 -7.613960933881157e-02 +465 473 -5.413421453123172e-02 +465 474 -4.012781031912977e-02 +465 475 -3.072751892616544e-02 +465 476 -2.415034675252897e-02 +465 477 -1.939104886145107e-02 +465 478 -1.585023865775526e-02 +465 479 -1.315380302376546e-02 +465 480 -1.105916272470026e-02 +465 481 -9.403863770832827e-03 +465 482 -8.076052134892568e-03 +465 483 -6.996835383339676e-03 +465 484 -6.109381318875750e-03 +465 485 -5.371977266379788e-03 +465 486 -4.753493624956895e-03 +465 487 -4.230349322908520e-03 +465 488 -3.784439171232928e-03 +465 489 -3.401691470521385e-03 +465 490 -3.071047067257394e-03 +465 491 -2.783725492315673e-03 +465 492 -2.532689975072674e-03 +465 493 -2.312252367280536e-03 +465 494 -2.117777896667789e-03 +465 495 -1.945462087124853e-03 +466 466 3.988394278171953e+01 +466 448 -6.996835383339675e-03 +466 449 -8.076052134892568e-03 +466 450 -9.403863770832828e-03 +466 451 -1.105916272470022e-02 +466 452 -1.315380302376542e-02 +466 453 -1.585023865775526e-02 +466 454 -1.939104886145104e-02 +466 455 -2.415034675252887e-02 +466 456 -3.072751892616537e-02 +466 457 -4.012781031912977e-02 +466 458 -5.413421453123171e-02 +466 459 -7.613960933881134e-02 +466 460 -1.132183869282765e-01 +466 461 -1.820810586422664e-01 +466 462 -3.301555353436774e-01 +466 463 -7.412185823610183e-01 +466 464 -3.165206906282873e+00 +466 465 -1.502055215878374e+01 +466 467 -1.502055215863300e+01 +466 468 -3.165206906282877e+00 +466 469 -7.412185823610308e-01 +466 470 -3.301555353436746e-01 +466 471 -1.820810586422655e-01 +466 472 -1.132183869282764e-01 +466 473 -7.613960933881191e-02 +466 474 -5.413421453123171e-02 +466 475 -4.012781031913015e-02 +466 476 -3.072751892616557e-02 +466 477 -2.415034675252901e-02 +466 478 -1.939104886145118e-02 +466 479 -1.585023865775531e-02 +466 480 -1.315380302376550e-02 +466 481 -1.105916272470029e-02 +466 482 -9.403863770832828e-03 +466 483 -8.076052134892622e-03 +466 484 -6.996835383339699e-03 +466 485 -6.109381318875749e-03 +466 486 -5.371977266379821e-03 +466 487 -4.753493624956895e-03 +466 488 -4.230349322908543e-03 +466 489 -3.784439171232927e-03 +466 490 -3.401691470521403e-03 +466 491 -3.071047067257401e-03 +466 492 -2.783725492315672e-03 +466 493 -2.532689975072686e-03 +466 494 -2.312252367280536e-03 +466 495 -2.117777896667798e-03 +467 467 3.988394278146373e+01 +467 448 -6.109381318875770e-03 +467 449 -6.996835383339674e-03 +467 450 -8.076052134892622e-03 +467 451 -9.403863770832825e-03 +467 452 -1.105916272470025e-02 +467 453 -1.315380302376550e-02 +467 454 -1.585023865775526e-02 +467 455 -1.939104886145111e-02 +467 456 -2.415034675252901e-02 +467 457 -3.072751892616544e-02 +467 458 -4.012781031913015e-02 +467 459 -5.413421453123170e-02 +467 460 -7.613960933881156e-02 +467 461 -1.132183869282764e-01 +467 462 -1.820810586422644e-01 +467 463 -3.301555353436739e-01 +467 464 -7.412185823610149e-01 +467 465 -3.165206906282862e+00 +467 466 -1.502055215863300e+01 +467 468 -1.502055215852576e+01 +467 469 -3.165206906282895e+00 +467 470 -7.412185823610270e-01 +467 471 -3.301555353436805e-01 +467 472 -1.820810586422660e-01 +467 473 -1.132183869282764e-01 +467 474 -7.613960933881134e-02 +467 475 -5.413421453123170e-02 +467 476 -4.012781031912996e-02 +467 477 -3.072751892616537e-02 +467 478 -2.415034675252897e-02 +467 479 -1.939104886145111e-02 +467 480 -1.585023865775526e-02 +467 481 -1.315380302376546e-02 +467 482 -1.105916272470022e-02 +467 483 -9.403863770832827e-03 +467 484 -8.076052134892594e-03 +467 485 -6.996835383339650e-03 +467 486 -6.109381318875748e-03 +467 487 -5.371977266379788e-03 +467 488 -4.753493624956895e-03 +467 489 -4.230349322908520e-03 +467 490 -3.784439171232928e-03 +467 491 -3.401691470521394e-03 +467 492 -3.071047067257386e-03 +467 493 -2.783725492315673e-03 +467 494 -2.532689975072674e-03 +467 495 -2.312252367280536e-03 +468 468 3.988394278128115e+01 +468 448 -5.371977266379807e-03 +468 449 -6.109381318875729e-03 +468 450 -6.996835383339673e-03 +468 451 -8.076052134892573e-03 +468 452 -9.403863770832828e-03 +468 453 -1.105916272470029e-02 +468 454 -1.315380302376546e-02 +468 455 -1.585023865775526e-02 +468 456 -1.939104886145114e-02 +468 457 -2.415034675252897e-02 +468 458 -3.072751892616557e-02 +468 459 -4.012781031912996e-02 +468 460 -5.413421453123172e-02 +468 461 -7.613960933881191e-02 +468 462 -1.132183869282764e-01 +468 463 -1.820810586422651e-01 +468 464 -3.301555353436780e-01 +468 465 -7.412185823610172e-01 +468 466 -3.165206906282877e+00 +468 467 -1.502055215852576e+01 +468 469 -1.502055215844909e+01 +468 470 -3.165206906282870e+00 +468 471 -7.412185823610125e-01 +468 472 -3.301555353436751e-01 +468 473 -1.820810586422641e-01 +468 474 -1.132183869282765e-01 +468 475 -7.613960933881156e-02 +468 476 -5.413421453123172e-02 +468 477 -4.012781031912987e-02 +468 478 -3.072751892616545e-02 +468 479 -2.415034675252897e-02 +468 480 -1.939104886145111e-02 +468 481 -1.585023865775526e-02 +468 482 -1.315380302376542e-02 +468 483 -1.105916272470025e-02 +468 484 -9.403863770832835e-03 +468 485 -8.076052134892589e-03 +468 486 -6.996835383339698e-03 +468 487 -6.109381318875749e-03 +468 488 -5.371977266379821e-03 +468 489 -4.753493624956895e-03 +468 490 -4.230349322908545e-03 +468 491 -3.784439171232938e-03 +468 492 -3.401691470521394e-03 +468 493 -3.071047067257401e-03 +468 494 -2.783725492315672e-03 +468 495 -2.532689975072686e-03 +469 469 3.988394278115152e+01 +469 448 -4.753493624956911e-03 +469 449 -5.371977266379807e-03 +469 450 -6.109381318875770e-03 +469 451 -6.996835383339676e-03 +469 452 -8.076052134892611e-03 +469 453 -9.403863770832828e-03 +469 454 -1.105916272470022e-02 +469 455 -1.315380302376542e-02 +469 456 -1.585023865775523e-02 +469 457 -1.939104886145104e-02 +469 458 -2.415034675252896e-02 +469 459 -3.072751892616530e-02 +469 460 -4.012781031912977e-02 +469 461 -5.413421453123171e-02 +469 462 -7.613960933881134e-02 +469 463 -1.132183869282765e-01 +469 464 -1.820810586422664e-01 +469 465 -3.301555353436783e-01 +469 466 -7.412185823610308e-01 +469 467 -3.165206906282895e+00 +469 468 -1.502055215844909e+01 +469 470 -1.502055215839539e+01 +469 471 -3.165206906282838e+00 +469 472 -7.412185823610070e-01 +469 473 -3.301555353436715e-01 +469 474 -1.820810586422654e-01 +469 475 -1.132183869282764e-01 +469 476 -7.613960933881202e-02 +469 477 -5.413421453123186e-02 +469 478 -4.012781031913017e-02 +469 479 -3.072751892616558e-02 +469 480 -2.415034675252907e-02 +469 481 -1.939104886145118e-02 +469 482 -1.585023865775526e-02 +469 483 -1.315380302376550e-02 +469 484 -1.105916272470029e-02 +469 485 -9.403863770832827e-03 +469 486 -8.076052134892599e-03 +469 487 -6.996835383339648e-03 +469 488 -6.109381318875748e-03 +469 489 -5.371977266379788e-03 +469 490 -4.753493624956895e-03 +469 491 -4.230349322908531e-03 +469 492 -3.784439171232917e-03 +469 493 -3.401691470521393e-03 +469 494 -3.071047067257385e-03 +469 495 -2.783725492315672e-03 +470 470 3.988394278106474e+01 +470 448 -4.230349322908545e-03 +470 449 -4.753493624956896e-03 +470 450 -5.371977266379823e-03 +470 451 -6.109381318875750e-03 +470 452 -6.996835383339699e-03 +470 453 -8.076052134892601e-03 +470 454 -9.403863770832833e-03 +470 455 -1.105916272470025e-02 +470 456 -1.315380302376548e-02 +470 457 -1.585023865775526e-02 +470 458 -1.939104886145118e-02 +470 459 -2.415034675252896e-02 +470 460 -3.072751892616544e-02 +470 461 -4.012781031913015e-02 +470 462 -5.413421453123170e-02 +470 463 -7.613960933881156e-02 +470 464 -1.132183869282764e-01 +470 465 -1.820810586422646e-01 +470 466 -3.301555353436746e-01 +470 467 -7.412185823610270e-01 +470 468 -3.165206906282870e+00 +470 469 -1.502055215839539e+01 +470 471 -1.502055215836219e+01 +470 472 -3.165206906282876e+00 +470 473 -7.412185823610262e-01 +470 474 -3.301555353436804e-01 +470 475 -1.820810586422656e-01 +470 476 -1.132183869282767e-01 +470 477 -7.613960933881146e-02 +470 478 -5.413421453123173e-02 +470 479 -4.012781031912997e-02 +470 480 -3.072751892616544e-02 +470 481 -2.415034675252897e-02 +470 482 -1.939104886145104e-02 +470 483 -1.585023865775526e-02 +470 484 -1.315380302376546e-02 +470 485 -1.105916272470023e-02 +470 486 -9.403863770832827e-03 +470 487 -8.076052134892566e-03 +470 488 -6.996835383339672e-03 +470 489 -6.109381318875728e-03 +470 490 -5.371977266379805e-03 +470 491 -4.753493624956895e-03 +470 492 -4.230349322908519e-03 +470 493 -3.784439171232927e-03 +470 494 -3.401691470521384e-03 +470 495 -3.071047067257392e-03 +471 471 3.988394278102304e+01 +471 448 -3.784439171232928e-03 +471 449 -4.230349322908520e-03 +471 450 -4.753493624956895e-03 +471 451 -5.371977266379788e-03 +471 452 -6.109381318875749e-03 +471 453 -6.996835383339650e-03 +471 454 -8.076052134892594e-03 +471 455 -9.403863770832820e-03 +471 456 -1.105916272470027e-02 +471 457 -1.315380302376546e-02 +471 458 -1.585023865775531e-02 +471 459 -1.939104886145111e-02 +471 460 -2.415034675252897e-02 +471 461 -3.072751892616558e-02 +471 462 -4.012781031912997e-02 +471 463 -5.413421453123173e-02 +471 464 -7.613960933881191e-02 +471 465 -1.132183869282767e-01 +471 466 -1.820810586422655e-01 +471 467 -3.301555353436805e-01 +471 468 -7.412185823610125e-01 +471 469 -3.165206906282838e+00 +471 470 -1.502055215836219e+01 +471 472 -1.502055215835492e+01 +471 473 -3.165206906282889e+00 +471 474 -7.412185823610259e-01 +471 475 -3.301555353436759e-01 +471 476 -1.820810586422643e-01 +471 477 -1.132183869282762e-01 +471 478 -7.613960933881157e-02 +471 479 -5.413421453123172e-02 +471 480 -4.012781031912996e-02 +471 481 -3.072751892616543e-02 +471 482 -2.415034675252887e-02 +471 483 -1.939104886145110e-02 +471 484 -1.585023865775526e-02 +471 485 -1.315380302376544e-02 +471 486 -1.105916272470025e-02 +471 487 -9.403863770832806e-03 +471 488 -8.076052134892615e-03 +471 489 -6.996835383339673e-03 +471 490 -6.109381318875770e-03 +471 491 -5.371977266379823e-03 +471 492 -4.753493624956895e-03 +471 493 -4.230349322908543e-03 +471 494 -3.784439171232927e-03 +471 495 -3.401691470521402e-03 +472 472 3.988394278105617e+01 +472 448 -3.401691470521403e-03 +472 449 -3.784439171232928e-03 +472 450 -4.230349322908543e-03 +472 451 -4.753493624956895e-03 +472 452 -5.371977266379821e-03 +472 453 -6.109381318875748e-03 +472 454 -6.996835383339698e-03 +472 455 -8.076052134892594e-03 +472 456 -9.403863770832833e-03 +472 457 -1.105916272470026e-02 +472 458 -1.315380302376550e-02 +472 459 -1.585023865775526e-02 +472 460 -1.939104886145111e-02 +472 461 -2.415034675252907e-02 +472 462 -3.072751892616544e-02 +472 463 -4.012781031912997e-02 +472 464 -5.413421453123187e-02 +472 465 -7.613960933881157e-02 +472 466 -1.132183869282764e-01 +472 467 -1.820810586422660e-01 +472 468 -3.301555353436751e-01 +472 469 -7.412185823610070e-01 +472 470 -3.165206906282876e+00 +472 471 -1.502055215835492e+01 +472 473 -1.502055215840046e+01 +472 474 -3.165206906282888e+00 +472 475 -7.412185823610291e-01 +472 476 -3.301555353436751e-01 +472 477 -1.820810586422664e-01 +472 478 -1.132183869282764e-01 +472 479 -7.613960933881167e-02 +472 480 -5.413421453123172e-02 +472 481 -4.012781031912996e-02 +472 482 -3.072751892616530e-02 +472 483 -2.415034675252896e-02 +472 484 -1.939104886145111e-02 +472 485 -1.585023865775523e-02 +472 486 -1.315380302376546e-02 +472 487 -1.105916272470022e-02 +472 488 -9.403863770832825e-03 +472 489 -8.076052134892573e-03 +472 490 -6.996835383339676e-03 +472 491 -6.109381318875750e-03 +472 492 -5.371977266379788e-03 +472 493 -4.753493624956895e-03 +472 494 -4.230349322908520e-03 +472 495 -3.784439171232928e-03 +473 473 3.988394278128570e+01 +473 448 -3.071047067257394e-03 +473 449 -3.401691470521385e-03 +473 450 -3.784439171232927e-03 +473 451 -4.230349322908520e-03 +473 452 -4.753493624956895e-03 +473 453 -5.371977266379788e-03 +473 454 -6.109381318875749e-03 +473 455 -6.996835383339648e-03 +473 456 -8.076052134892571e-03 +473 457 -9.403863770832828e-03 +473 458 -1.105916272470029e-02 +473 459 -1.315380302376546e-02 +473 460 -1.585023865775526e-02 +473 461 -1.939104886145118e-02 +473 462 -2.415034675252897e-02 +473 463 -3.072751892616545e-02 +473 464 -4.012781031913006e-02 +473 465 -5.413421453123172e-02 +473 466 -7.613960933881191e-02 +473 467 -1.132183869282764e-01 +473 468 -1.820810586422641e-01 +473 469 -3.301555353436715e-01 +473 470 -7.412185823610262e-01 +473 471 -3.165206906282889e+00 +473 472 -1.502055215840046e+01 +473 474 -1.502055215860533e+01 +473 475 -3.165206906282898e+00 +473 476 -7.412185823610203e-01 +473 477 -3.301555353436783e-01 +473 478 -1.820810586422650e-01 +473 479 -1.132183869282767e-01 +473 480 -7.613960933881157e-02 +473 481 -5.413421453123172e-02 +473 482 -4.012781031912977e-02 +473 483 -3.072751892616544e-02 +473 484 -2.415034675252897e-02 +473 485 -1.939104886145107e-02 +473 486 -1.585023865775526e-02 +473 487 -1.315380302376542e-02 +473 488 -1.105916272470025e-02 +473 489 -9.403863770832828e-03 +473 490 -8.076052134892611e-03 +473 491 -6.996835383339699e-03 +473 492 -6.109381318875749e-03 +473 493 -5.371977266379821e-03 +473 494 -4.753493624956895e-03 +473 495 -4.230349322908543e-03 +474 474 3.988394278152497e+01 +474 448 -2.783725492315679e-03 +474 449 -3.071047067257393e-03 +474 450 -3.401691470521402e-03 +474 451 -3.784439171232928e-03 +474 452 -4.230349322908543e-03 +474 453 -4.753493624956895e-03 +474 454 -5.371977266379821e-03 +474 455 -6.109381318875748e-03 +474 456 -6.996835383339672e-03 +474 457 -8.076052134892609e-03 +474 458 -9.403863770832828e-03 +474 459 -1.105916272470022e-02 +474 460 -1.315380302376542e-02 +474 461 -1.585023865775526e-02 +474 462 -1.939104886145104e-02 +474 463 -2.415034675252887e-02 +474 464 -3.072751892616537e-02 +474 465 -4.012781031912977e-02 +474 466 -5.413421453123171e-02 +474 467 -7.613960933881134e-02 +474 468 -1.132183869282765e-01 +474 469 -1.820810586422654e-01 +474 470 -3.301555353436804e-01 +474 471 -7.412185823610259e-01 +474 472 -3.165206906282888e+00 +474 473 -1.502055215860533e+01 +474 475 -1.502055215859223e+01 +474 476 -3.165206906282846e+00 +474 477 -7.412185823610056e-01 +474 478 -3.301555353436756e-01 +474 479 -1.820810586422649e-01 +474 480 -1.132183869282764e-01 +474 481 -7.613960933881202e-02 +474 482 -5.413421453123171e-02 +474 483 -4.012781031913015e-02 +474 484 -3.072751892616557e-02 +474 485 -2.415034675252901e-02 +474 486 -1.939104886145118e-02 +474 487 -1.585023865775526e-02 +474 488 -1.315380302376550e-02 +474 489 -1.105916272470029e-02 +474 490 -9.403863770832828e-03 +474 491 -8.076052134892601e-03 +474 492 -6.996835383339650e-03 +474 493 -6.109381318875748e-03 +474 494 -5.371977266379788e-03 +474 495 -4.753493624956895e-03 +475 475 3.988394278151357e+01 +475 448 -2.532689975072680e-03 +475 449 -2.783725492315666e-03 +475 450 -3.071047067257393e-03 +475 451 -3.401691470521385e-03 +475 452 -3.784439171232927e-03 +475 453 -4.230349322908520e-03 +475 454 -4.753493624956895e-03 +475 455 -5.371977266379788e-03 +475 456 -6.109381318875728e-03 +475 457 -6.996835383339673e-03 +475 458 -8.076052134892578e-03 +475 459 -9.403863770832827e-03 +475 460 -1.105916272470025e-02 +475 461 -1.315380302376550e-02 +475 462 -1.585023865775526e-02 +475 463 -1.939104886145111e-02 +475 464 -2.415034675252901e-02 +475 465 -3.072751892616544e-02 +475 466 -4.012781031913015e-02 +475 467 -5.413421453123170e-02 +475 468 -7.613960933881156e-02 +475 469 -1.132183869282764e-01 +475 470 -1.820810586422656e-01 +475 471 -3.301555353436759e-01 +475 472 -7.412185823610291e-01 +475 473 -3.165206906282898e+00 +475 474 -1.502055215859223e+01 +475 476 -1.502055215859650e+01 +475 477 -3.165206906282852e+00 +475 478 -7.412185823610197e-01 +475 479 -3.301555353436771e-01 +475 480 -1.820810586422663e-01 +475 481 -1.132183869282767e-01 +475 482 -7.613960933881142e-02 +475 483 -5.413421453123170e-02 +475 484 -4.012781031912996e-02 +475 485 -3.072751892616537e-02 +475 486 -2.415034675252897e-02 +475 487 -1.939104886145104e-02 +475 488 -1.585023865775526e-02 +475 489 -1.315380302376546e-02 +475 490 -1.105916272470022e-02 +475 491 -9.403863770832833e-03 +475 492 -8.076052134892594e-03 +475 493 -6.996835383339698e-03 +475 494 -6.109381318875749e-03 +475 495 -5.371977266379821e-03 +476 476 3.988394278151441e+01 +476 448 -2.312252367280542e-03 +476 449 -2.532689975072680e-03 +476 450 -2.783725492315679e-03 +476 451 -3.071047067257394e-03 +476 452 -3.401691470521403e-03 +476 453 -3.784439171232928e-03 +476 454 -4.230349322908545e-03 +476 455 -4.753493624956895e-03 +476 456 -5.371977266379805e-03 +476 457 -6.109381318875770e-03 +476 458 -6.996835383339676e-03 +476 459 -8.076052134892616e-03 +476 460 -9.403863770832828e-03 +476 461 -1.105916272470029e-02 +476 462 -1.315380302376546e-02 +476 463 -1.585023865775526e-02 +476 464 -1.939104886145114e-02 +476 465 -2.415034675252897e-02 +476 466 -3.072751892616557e-02 +476 467 -4.012781031912996e-02 +476 468 -5.413421453123172e-02 +476 469 -7.613960933881202e-02 +476 470 -1.132183869282767e-01 +476 471 -1.820810586422643e-01 +476 472 -3.301555353436751e-01 +476 473 -7.412185823610203e-01 +476 474 -3.165206906282846e+00 +476 475 -1.502055215859650e+01 +476 477 -1.502055215858806e+01 +476 478 -3.165206906282884e+00 +476 479 -7.412185823610277e-01 +476 480 -3.301555353436778e-01 +476 481 -1.820810586422648e-01 +476 482 -1.132183869282766e-01 +476 483 -7.613960933881156e-02 +476 484 -5.413421453123172e-02 +476 485 -4.012781031912987e-02 +476 486 -3.072751892616545e-02 +476 487 -2.415034675252887e-02 +476 488 -1.939104886145111e-02 +476 489 -1.585023865775526e-02 +476 490 -1.315380302376542e-02 +476 491 -1.105916272470025e-02 +476 492 -9.403863770832820e-03 +476 493 -8.076052134892587e-03 +476 494 -6.996835383339648e-03 +476 495 -6.109381318875748e-03 +477 477 3.988394278153931e+01 +477 448 -2.117777896667799e-03 +477 449 -2.312252367280537e-03 +477 450 -2.532689975072686e-03 +477 451 -2.783725492315673e-03 +477 452 -3.071047067257401e-03 +477 453 -3.401691470521394e-03 +477 454 -3.784439171232938e-03 +477 455 -4.230349322908531e-03 +477 456 -4.753493624956895e-03 +477 457 -5.371977266379823e-03 +477 458 -6.109381318875750e-03 +477 459 -6.996835383339699e-03 +477 460 -8.076052134892590e-03 +477 461 -9.403863770832842e-03 +477 462 -1.105916272470023e-02 +477 463 -1.315380302376544e-02 +477 464 -1.585023865775526e-02 +477 465 -1.939104886145107e-02 +477 466 -2.415034675252901e-02 +477 467 -3.072751892616537e-02 +477 468 -4.012781031912987e-02 +477 469 -5.413421453123186e-02 +477 470 -7.613960933881146e-02 +477 471 -1.132183869282762e-01 +477 472 -1.820810586422664e-01 +477 473 -3.301555353436783e-01 +477 474 -7.412185823610056e-01 +477 475 -3.165206906282852e+00 +477 476 -1.502055215858806e+01 +477 478 -1.502055215863999e+01 +477 479 -3.165206906282880e+00 +477 480 -7.412185823610264e-01 +477 481 -3.301555353436766e-01 +477 482 -1.820810586422663e-01 +477 483 -1.132183869282766e-01 +477 484 -7.613960933881191e-02 +477 485 -5.413421453123170e-02 +477 486 -4.012781031913006e-02 +477 487 -3.072751892616537e-02 +477 488 -2.415034675252901e-02 +477 489 -1.939104886145114e-02 +477 490 -1.585023865775523e-02 +477 491 -1.315380302376548e-02 +477 492 -1.105916272470027e-02 +477 493 -9.403863770832820e-03 +477 494 -8.076052134892571e-03 +477 495 -6.996835383339672e-03 +478 478 3.988394278164025e+01 +478 448 -1.945462087124854e-03 +478 449 -2.117777896667789e-03 +478 450 -2.312252367280536e-03 +478 451 -2.532689975072674e-03 +478 452 -2.783725492315672e-03 +478 453 -3.071047067257386e-03 +478 454 -3.401691470521394e-03 +478 455 -3.784439171232917e-03 +478 456 -4.230349322908519e-03 +478 457 -4.753493624956895e-03 +478 458 -5.371977266379788e-03 +478 459 -6.109381318875749e-03 +478 460 -6.996835383339650e-03 +478 461 -8.076052134892601e-03 +478 462 -9.403863770832820e-03 +478 463 -1.105916272470026e-02 +478 464 -1.315380302376548e-02 +478 465 -1.585023865775526e-02 +478 466 -1.939104886145118e-02 +478 467 -2.415034675252897e-02 +478 468 -3.072751892616545e-02 +478 469 -4.012781031913017e-02 +478 470 -5.413421453123173e-02 +478 471 -7.613960933881157e-02 +478 472 -1.132183869282764e-01 +478 473 -1.820810586422650e-01 +478 474 -3.301555353436756e-01 +478 475 -7.412185823610197e-01 +478 476 -3.165206906282884e+00 +478 477 -1.502055215863999e+01 +478 479 -1.502055215866002e+01 +478 480 -3.165206906282894e+00 +478 481 -7.412185823610226e-01 +478 482 -3.301555353436783e-01 +478 483 -1.820810586422655e-01 +478 484 -1.132183869282767e-01 +478 485 -7.613960933881145e-02 +478 486 -5.413421453123171e-02 +478 487 -4.012781031912976e-02 +478 488 -3.072751892616542e-02 +478 489 -2.415034675252896e-02 +478 490 -1.939104886145103e-02 +478 491 -1.585023865775525e-02 +478 492 -1.315380302376546e-02 +478 493 -1.105916272470023e-02 +478 494 -9.403863770832827e-03 +478 495 -8.076052134892608e-03 +479 479 3.988394278169712e+01 +479 448 -1.792160480940042e-03 +479 449 -1.945462087124853e-03 +479 450 -2.117777896667798e-03 +479 451 -2.312252367280536e-03 +479 452 -2.532689975072686e-03 +479 453 -2.783725492315673e-03 +479 454 -3.071047067257401e-03 +479 455 -3.401691470521393e-03 +479 456 -3.784439171232927e-03 +479 457 -4.230349322908543e-03 +479 458 -4.753493624956895e-03 +479 459 -5.371977266379821e-03 +479 460 -6.109381318875748e-03 +479 461 -6.996835383339698e-03 +479 462 -8.076052134892594e-03 +479 463 -9.403863770832827e-03 +479 464 -1.105916272470027e-02 +479 465 -1.315380302376546e-02 +479 466 -1.585023865775531e-02 +479 467 -1.939104886145111e-02 +479 468 -2.415034675252897e-02 +479 469 -3.072751892616558e-02 +479 470 -4.012781031912997e-02 +479 471 -5.413421453123172e-02 +479 472 -7.613960933881167e-02 +479 473 -1.132183869282767e-01 +479 474 -1.820810586422649e-01 +479 475 -3.301555353436771e-01 +479 476 -7.412185823610277e-01 +479 477 -3.165206906282880e+00 +479 478 -1.502055215866002e+01 +479 480 -1.502055215931067e+01 +479 481 -3.165206906282844e+00 +479 482 -7.412185823610038e-01 +479 483 -3.301555353436738e-01 +479 484 -1.820810586422641e-01 +479 485 -1.132183869282763e-01 +479 486 -7.613960933881185e-02 +479 487 -5.413421453123140e-02 +479 488 -4.012781031912995e-02 +479 489 -3.072751892616543e-02 +479 490 -2.415034675252887e-02 +479 491 -1.939104886145110e-02 +479 492 -1.585023865775526e-02 +479 493 -1.315380302376544e-02 +479 494 -1.105916272470025e-02 +479 495 -9.403863770832806e-03 +480 480 3.988394278169700e+01 +480 464 -9.403863770832833e-03 +480 465 -1.105916272470026e-02 +480 466 -1.315380302376550e-02 +480 467 -1.585023865775526e-02 +480 468 -1.939104886145111e-02 +480 469 -2.415034675252907e-02 +480 470 -3.072751892616544e-02 +480 471 -4.012781031912996e-02 +480 472 -5.413421453123172e-02 +480 473 -7.613960933881157e-02 +480 474 -1.132183869282764e-01 +480 475 -1.820810586422663e-01 +480 476 -3.301555353436778e-01 +480 477 -7.412185823610264e-01 +480 478 -3.165206906282894e+00 +480 479 -1.502055215931067e+01 +480 481 -1.502055215865997e+01 +480 482 -3.165206906282844e+00 +480 483 -7.412185823610135e-01 +480 484 -3.301555353436745e-01 +480 485 -1.820810586422660e-01 +480 486 -1.132183869282775e-01 +480 487 -7.613960933881128e-02 +480 488 -5.413421453123170e-02 +480 489 -4.012781031912996e-02 +480 490 -3.072751892616530e-02 +480 491 -2.415034675252896e-02 +480 492 -1.939104886145111e-02 +480 493 -1.585023865775523e-02 +480 494 -1.315380302376546e-02 +480 495 -1.105916272470022e-02 +480 496 -9.403863770832825e-03 +480 497 -8.076052134892616e-03 +480 498 -6.996835383339699e-03 +480 499 -6.109381318875749e-03 +480 500 -5.371977266379821e-03 +480 501 -4.753493624956895e-03 +480 502 -4.230349322908543e-03 +480 503 -3.784439171232927e-03 +480 504 -3.401691470521403e-03 +480 505 -3.071047067257401e-03 +480 506 -2.783725492315672e-03 +480 507 -2.532689975072686e-03 +480 508 -2.312252367280536e-03 +480 509 -2.117777896667798e-03 +480 510 -1.945462087124853e-03 +480 511 -1.792160480940042e-03 +481 481 3.988394278164020e+01 +481 464 -8.076052134892615e-03 +481 465 -9.403863770832827e-03 +481 466 -1.105916272470029e-02 +481 467 -1.315380302376546e-02 +481 468 -1.585023865775526e-02 +481 469 -1.939104886145118e-02 +481 470 -2.415034675252897e-02 +481 471 -3.072751892616543e-02 +481 472 -4.012781031912996e-02 +481 473 -5.413421453123172e-02 +481 474 -7.613960933881202e-02 +481 475 -1.132183869282767e-01 +481 476 -1.820810586422648e-01 +481 477 -3.301555353436766e-01 +481 478 -7.412185823610226e-01 +481 479 -3.165206906282844e+00 +481 480 -1.502055215865997e+01 +481 482 -1.502055215864003e+01 +481 483 -3.165206906282897e+00 +481 484 -7.412185823610318e-01 +481 485 -3.301555353436760e-01 +481 486 -1.820810586422658e-01 +481 487 -1.132183869282760e-01 +481 488 -7.613960933881149e-02 +481 489 -5.413421453123172e-02 +481 490 -4.012781031912977e-02 +481 491 -3.072751892616544e-02 +481 492 -2.415034675252897e-02 +481 493 -1.939104886145107e-02 +481 494 -1.585023865775526e-02 +481 495 -1.315380302376542e-02 +481 496 -1.105916272470025e-02 +481 497 -9.403863770832828e-03 +481 498 -8.076052134892590e-03 +481 499 -6.996835383339650e-03 +481 500 -6.109381318875748e-03 +481 501 -5.371977266379788e-03 +481 502 -4.753493624956895e-03 +481 503 -4.230349322908520e-03 +481 504 -3.784439171232928e-03 +481 505 -3.401691470521394e-03 +481 506 -3.071047067257386e-03 +481 507 -2.783725492315673e-03 +481 508 -2.532689975072674e-03 +481 509 -2.312252367280536e-03 +481 510 -2.117777896667789e-03 +481 511 -1.945462087124853e-03 +482 482 3.988394278153936e+01 +482 464 -6.996835383339673e-03 +482 465 -8.076052134892568e-03 +482 466 -9.403863770832828e-03 +482 467 -1.105916272470022e-02 +482 468 -1.315380302376542e-02 +482 469 -1.585023865775526e-02 +482 470 -1.939104886145104e-02 +482 471 -2.415034675252887e-02 +482 472 -3.072751892616530e-02 +482 473 -4.012781031912977e-02 +482 474 -5.413421453123171e-02 +482 475 -7.613960933881142e-02 +482 476 -1.132183869282766e-01 +482 477 -1.820810586422663e-01 +482 478 -3.301555353436783e-01 +482 479 -7.412185823610038e-01 +482 480 -3.165206906282844e+00 +482 481 -1.502055215864003e+01 +482 483 -1.502055215858806e+01 +482 484 -3.165206906282900e+00 +482 485 -7.412185823610280e-01 +482 486 -3.301555353436753e-01 +482 487 -1.820810586422644e-01 +482 488 -1.132183869282763e-01 +482 489 -7.613960933881202e-02 +482 490 -5.413421453123171e-02 +482 491 -4.012781031913015e-02 +482 492 -3.072751892616557e-02 +482 493 -2.415034675252901e-02 +482 494 -1.939104886145118e-02 +482 495 -1.585023865775526e-02 +482 496 -1.315380302376550e-02 +482 497 -1.105916272470029e-02 +482 498 -9.403863770832835e-03 +482 499 -8.076052134892599e-03 +482 500 -6.996835383339698e-03 +482 501 -6.109381318875749e-03 +482 502 -5.371977266379821e-03 +482 503 -4.753493624956895e-03 +482 504 -4.230349322908545e-03 +482 505 -3.784439171232938e-03 +482 506 -3.401691470521394e-03 +482 507 -3.071047067257401e-03 +482 508 -2.783725492315672e-03 +482 509 -2.532689975072686e-03 +482 510 -2.312252367280536e-03 +482 511 -2.117777896667798e-03 +483 483 3.988394278151449e+01 +483 464 -6.109381318875770e-03 +483 465 -6.996835383339676e-03 +483 466 -8.076052134892622e-03 +483 467 -9.403863770832827e-03 +483 468 -1.105916272470025e-02 +483 469 -1.315380302376550e-02 +483 470 -1.585023865775526e-02 +483 471 -1.939104886145110e-02 +483 472 -2.415034675252896e-02 +483 473 -3.072751892616544e-02 +483 474 -4.012781031913015e-02 +483 475 -5.413421453123170e-02 +483 476 -7.613960933881156e-02 +483 477 -1.132183869282766e-01 +483 478 -1.820810586422655e-01 +483 479 -3.301555353436738e-01 +483 480 -7.412185823610135e-01 +483 481 -3.165206906282897e+00 +483 482 -1.502055215858806e+01 +483 484 -1.502055215859653e+01 +483 485 -3.165206906282887e+00 +483 486 -7.412185823610171e-01 +483 487 -3.301555353436784e-01 +483 488 -1.820810586422669e-01 +483 489 -1.132183869282767e-01 +483 490 -7.613960933881142e-02 +483 491 -5.413421453123170e-02 +483 492 -4.012781031912996e-02 +483 493 -3.072751892616537e-02 +483 494 -2.415034675252897e-02 +483 495 -1.939104886145104e-02 +483 496 -1.585023865775526e-02 +483 497 -1.315380302376546e-02 +483 498 -1.105916272470022e-02 +483 499 -9.403863770832818e-03 +483 500 -8.076052134892594e-03 +483 501 -6.996835383339648e-03 +483 502 -6.109381318875748e-03 +483 503 -5.371977266379788e-03 +483 504 -4.753493624956895e-03 +483 505 -4.230349322908531e-03 +483 506 -3.784439171232917e-03 +483 507 -3.401691470521393e-03 +483 508 -3.071047067257385e-03 +483 509 -2.783725492315672e-03 +483 510 -2.532689975072674e-03 +483 511 -2.312252367280535e-03 +484 484 3.988394278151360e+01 +484 464 -5.371977266379823e-03 +484 465 -6.109381318875750e-03 +484 466 -6.996835383339699e-03 +484 467 -8.076052134892594e-03 +484 468 -9.403863770832835e-03 +484 469 -1.105916272470029e-02 +484 470 -1.315380302376546e-02 +484 471 -1.585023865775526e-02 +484 472 -1.939104886145111e-02 +484 473 -2.415034675252897e-02 +484 474 -3.072751892616557e-02 +484 475 -4.012781031912996e-02 +484 476 -5.413421453123172e-02 +484 477 -7.613960933881191e-02 +484 478 -1.132183869282767e-01 +484 479 -1.820810586422641e-01 +484 480 -3.301555353436745e-01 +484 481 -7.412185823610318e-01 +484 482 -3.165206906282900e+00 +484 483 -1.502055215859653e+01 +484 485 -1.502055215859223e+01 +484 486 -3.165206906282856e+00 +484 487 -7.412185823610086e-01 +484 488 -3.301555353436783e-01 +484 489 -1.820810586422649e-01 +484 490 -1.132183869282769e-01 +484 491 -7.613960933881174e-02 +484 492 -5.413421453123172e-02 +484 493 -4.012781031912987e-02 +484 494 -3.072751892616545e-02 +484 495 -2.415034675252887e-02 +484 496 -1.939104886145111e-02 +484 497 -1.585023865775526e-02 +484 498 -1.315380302376542e-02 +484 499 -1.105916272470025e-02 +484 500 -9.403863770832827e-03 +484 501 -8.076052134892573e-03 +484 502 -6.996835383339672e-03 +484 503 -6.109381318875728e-03 +484 504 -5.371977266379805e-03 +484 505 -4.753493624956895e-03 +484 506 -4.230349322908519e-03 +484 507 -3.784439171232927e-03 +484 508 -3.401691470521384e-03 +484 509 -3.071047067257392e-03 +484 510 -2.783725492315666e-03 +484 511 -2.532689975072679e-03 +485 485 3.988394278152496e+01 +485 464 -4.753493624956895e-03 +485 465 -5.371977266379788e-03 +485 466 -6.109381318875749e-03 +485 467 -6.996835383339650e-03 +485 468 -8.076052134892589e-03 +485 469 -9.403863770832827e-03 +485 470 -1.105916272470023e-02 +485 471 -1.315380302376544e-02 +485 472 -1.585023865775523e-02 +485 473 -1.939104886145107e-02 +485 474 -2.415034675252901e-02 +485 475 -3.072751892616537e-02 +485 476 -4.012781031912987e-02 +485 477 -5.413421453123170e-02 +485 478 -7.613960933881145e-02 +485 479 -1.132183869282763e-01 +485 480 -1.820810586422660e-01 +485 481 -3.301555353436760e-01 +485 482 -7.412185823610280e-01 +485 483 -3.165206906282887e+00 +485 484 -1.502055215859223e+01 +485 486 -1.502055215860531e+01 +485 487 -3.165206906282843e+00 +485 488 -7.412185823610113e-01 +485 489 -3.301555353436755e-01 +485 490 -1.820810586422660e-01 +485 491 -1.132183869282768e-01 +485 492 -7.613960933881171e-02 +485 493 -5.413421453123170e-02 +485 494 -4.012781031913006e-02 +485 495 -3.072751892616537e-02 +485 496 -2.415034675252901e-02 +485 497 -1.939104886145114e-02 +485 498 -1.585023865775523e-02 +485 499 -1.315380302376548e-02 +485 500 -1.105916272470027e-02 +485 501 -9.403863770832833e-03 +485 502 -8.076052134892615e-03 +485 503 -6.996835383339673e-03 +485 504 -6.109381318875770e-03 +485 505 -5.371977266379823e-03 +485 506 -4.753493624956895e-03 +485 507 -4.230349322908543e-03 +485 508 -3.784439171232927e-03 +485 509 -3.401691470521402e-03 +485 510 -3.071047067257393e-03 +485 511 -2.783725492315679e-03 +486 486 3.988394278128563e+01 +486 464 -4.230349322908543e-03 +486 465 -4.753493624956895e-03 +486 466 -5.371977266379821e-03 +486 467 -6.109381318875748e-03 +486 468 -6.996835383339698e-03 +486 469 -8.076052134892599e-03 +486 470 -9.403863770832827e-03 +486 471 -1.105916272470025e-02 +486 472 -1.315380302376546e-02 +486 473 -1.585023865775526e-02 +486 474 -1.939104886145118e-02 +486 475 -2.415034675252897e-02 +486 476 -3.072751892616545e-02 +486 477 -4.012781031913006e-02 +486 478 -5.413421453123171e-02 +486 479 -7.613960933881185e-02 +486 480 -1.132183869282775e-01 +486 481 -1.820810586422658e-01 +486 482 -3.301555353436753e-01 +486 483 -7.412185823610171e-01 +486 484 -3.165206906282856e+00 +486 485 -1.502055215860531e+01 +486 487 -1.502055215840047e+01 +486 488 -3.165206906282867e+00 +486 489 -7.412185823610267e-01 +486 490 -3.301555353436780e-01 +486 491 -1.820810586422655e-01 +486 492 -1.132183869282754e-01 +486 493 -7.613960933881128e-02 +486 494 -5.413421453123172e-02 +486 495 -4.012781031912977e-02 +486 496 -3.072751892616544e-02 +486 497 -2.415034675252897e-02 +486 498 -1.939104886145104e-02 +486 499 -1.585023865775526e-02 +486 500 -1.315380302376546e-02 +486 501 -1.105916272470026e-02 +486 502 -9.403863770832827e-03 +486 503 -8.076052134892568e-03 +486 504 -6.996835383339676e-03 +486 505 -6.109381318875750e-03 +486 506 -5.371977266379788e-03 +486 507 -4.753493624956895e-03 +486 508 -4.230349322908520e-03 +486 509 -3.784439171232928e-03 +486 510 -3.401691470521385e-03 +486 511 -3.071047067257393e-03 +487 487 3.988394278105616e+01 +487 464 -3.784439171232927e-03 +487 465 -4.230349322908520e-03 +487 466 -4.753493624956895e-03 +487 467 -5.371977266379788e-03 +487 468 -6.109381318875749e-03 +487 469 -6.996835383339648e-03 +487 470 -8.076052134892566e-03 +487 471 -9.403863770832806e-03 +487 472 -1.105916272470022e-02 +487 473 -1.315380302376542e-02 +487 474 -1.585023865775526e-02 +487 475 -1.939104886145104e-02 +487 476 -2.415034675252887e-02 +487 477 -3.072751892616537e-02 +487 478 -4.012781031912976e-02 +487 479 -5.413421453123140e-02 +487 480 -7.613960933881128e-02 +487 481 -1.132183869282760e-01 +487 482 -1.820810586422644e-01 +487 483 -3.301555353436784e-01 +487 484 -7.412185823610086e-01 +487 485 -3.165206906282843e+00 +487 486 -1.502055215840047e+01 +487 488 -1.502055215835491e+01 +487 489 -3.165206906282896e+00 +487 490 -7.412185823610331e-01 +487 491 -3.301555353436761e-01 +487 492 -1.820810586422643e-01 +487 493 -1.132183869282766e-01 +487 494 -7.613960933881220e-02 +487 495 -5.413421453123171e-02 +487 496 -4.012781031913015e-02 +487 497 -3.072751892616557e-02 +487 498 -2.415034675252896e-02 +487 499 -1.939104886145118e-02 +487 500 -1.585023865775531e-02 +487 501 -1.315380302376550e-02 +487 502 -1.105916272470029e-02 +487 503 -9.403863770832828e-03 +487 504 -8.076052134892622e-03 +487 505 -6.996835383339699e-03 +487 506 -6.109381318875749e-03 +487 507 -5.371977266379821e-03 +487 508 -4.753493624956895e-03 +487 509 -4.230349322908543e-03 +487 510 -3.784439171232927e-03 +487 511 -3.401691470521402e-03 +488 488 3.988394278102309e+01 +488 464 -3.401691470521402e-03 +488 465 -3.784439171232928e-03 +488 466 -4.230349322908543e-03 +488 467 -4.753493624956895e-03 +488 468 -5.371977266379821e-03 +488 469 -6.109381318875748e-03 +488 470 -6.996835383339672e-03 +488 471 -8.076052134892615e-03 +488 472 -9.403863770832825e-03 +488 473 -1.105916272470025e-02 +488 474 -1.315380302376550e-02 +488 475 -1.585023865775526e-02 +488 476 -1.939104886145111e-02 +488 477 -2.415034675252901e-02 +488 478 -3.072751892616542e-02 +488 479 -4.012781031912995e-02 +488 480 -5.413421453123170e-02 +488 481 -7.613960933881149e-02 +488 482 -1.132183869282763e-01 +488 483 -1.820810586422669e-01 +488 484 -3.301555353436783e-01 +488 485 -7.412185823610113e-01 +488 486 -3.165206906282867e+00 +488 487 -1.502055215835491e+01 +488 489 -1.502055215836224e+01 +488 490 -3.165206906282891e+00 +488 491 -7.412185823610156e-01 +488 492 -3.301555353436753e-01 +488 493 -1.820810586422652e-01 +488 494 -1.132183869282775e-01 +488 495 -7.613960933881130e-02 +488 496 -5.413421453123170e-02 +488 497 -4.012781031912996e-02 +488 498 -3.072751892616530e-02 +488 499 -2.415034675252896e-02 +488 500 -1.939104886145111e-02 +488 501 -1.585023865775526e-02 +488 502 -1.315380302376546e-02 +488 503 -1.105916272470022e-02 +488 504 -9.403863770832827e-03 +488 505 -8.076052134892594e-03 +488 506 -6.996835383339650e-03 +488 507 -6.109381318875748e-03 +488 508 -5.371977266379788e-03 +488 509 -4.753493624956895e-03 +488 510 -4.230349322908520e-03 +488 511 -3.784439171232928e-03 +489 489 3.988394278106477e+01 +489 464 -3.071047067257393e-03 +489 465 -3.401691470521385e-03 +489 466 -3.784439171232927e-03 +489 467 -4.230349322908520e-03 +489 468 -4.753493624956895e-03 +489 469 -5.371977266379788e-03 +489 470 -6.109381318875728e-03 +489 471 -6.996835383339673e-03 +489 472 -8.076052134892573e-03 +489 473 -9.403863770832828e-03 +489 474 -1.105916272470029e-02 +489 475 -1.315380302376546e-02 +489 476 -1.585023865775526e-02 +489 477 -1.939104886145114e-02 +489 478 -2.415034675252896e-02 +489 479 -3.072751892616543e-02 +489 480 -4.012781031912996e-02 +489 481 -5.413421453123172e-02 +489 482 -7.613960933881202e-02 +489 483 -1.132183869282767e-01 +489 484 -1.820810586422649e-01 +489 485 -3.301555353436755e-01 +489 486 -7.412185823610267e-01 +489 487 -3.165206906282896e+00 +489 488 -1.502055215836224e+01 +489 490 -1.502055215839539e+01 +489 491 -3.165206906282848e+00 +489 492 -7.412185823610102e-01 +489 493 -3.301555353436776e-01 +489 494 -1.820810586422674e-01 +489 495 -1.132183869282760e-01 +489 496 -7.613960933881159e-02 +489 497 -5.413421453123172e-02 +489 498 -4.012781031912977e-02 +489 499 -3.072751892616544e-02 +489 500 -2.415034675252897e-02 +489 501 -1.939104886145111e-02 +489 502 -1.585023865775526e-02 +489 503 -1.315380302376542e-02 +489 504 -1.105916272470025e-02 +489 505 -9.403863770832835e-03 +489 506 -8.076052134892589e-03 +489 507 -6.996835383339698e-03 +489 508 -6.109381318875749e-03 +489 509 -5.371977266379821e-03 +489 510 -4.753493624956895e-03 +489 511 -4.230349322908543e-03 +490 490 3.988394278115153e+01 +490 464 -2.783725492315679e-03 +490 465 -3.071047067257394e-03 +490 466 -3.401691470521403e-03 +490 467 -3.784439171232928e-03 +490 468 -4.230349322908545e-03 +490 469 -4.753493624956895e-03 +490 470 -5.371977266379805e-03 +490 471 -6.109381318875770e-03 +490 472 -6.996835383339676e-03 +490 473 -8.076052134892611e-03 +490 474 -9.403863770832828e-03 +490 475 -1.105916272470022e-02 +490 476 -1.315380302376542e-02 +490 477 -1.585023865775523e-02 +490 478 -1.939104886145103e-02 +490 479 -2.415034675252887e-02 +490 480 -3.072751892616530e-02 +490 481 -4.012781031912977e-02 +490 482 -5.413421453123171e-02 +490 483 -7.613960933881142e-02 +490 484 -1.132183869282769e-01 +490 485 -1.820810586422660e-01 +490 486 -3.301555353436780e-01 +490 487 -7.412185823610331e-01 +490 488 -3.165206906282891e+00 +490 489 -1.502055215839539e+01 +490 491 -1.502055215844904e+01 +490 492 -3.165206906282874e+00 +490 493 -7.412185823610185e-01 +490 494 -3.301555353436754e-01 +490 495 -1.820810586422634e-01 +490 496 -1.132183869282760e-01 +490 497 -7.613960933881171e-02 +490 498 -5.413421453123171e-02 +490 499 -4.012781031913015e-02 +490 500 -3.072751892616558e-02 +490 501 -2.415034675252907e-02 +490 502 -1.939104886145118e-02 +490 503 -1.585023865775526e-02 +490 504 -1.315380302376550e-02 +490 505 -1.105916272470029e-02 +490 506 -9.403863770832827e-03 +490 507 -8.076052134892599e-03 +490 508 -6.996835383339648e-03 +490 509 -6.109381318875748e-03 +490 510 -5.371977266379788e-03 +490 511 -4.753493624956895e-03 +491 491 3.988394278128114e+01 +491 464 -2.532689975072686e-03 +491 465 -2.783725492315673e-03 +491 466 -3.071047067257401e-03 +491 467 -3.401691470521394e-03 +491 468 -3.784439171232938e-03 +491 469 -4.230349322908531e-03 +491 470 -4.753493624956895e-03 +491 471 -5.371977266379823e-03 +491 472 -6.109381318875750e-03 +491 473 -6.996835383339699e-03 +491 474 -8.076052134892601e-03 +491 475 -9.403863770832833e-03 +491 476 -1.105916272470025e-02 +491 477 -1.315380302376548e-02 +491 478 -1.585023865775525e-02 +491 479 -1.939104886145110e-02 +491 480 -2.415034675252896e-02 +491 481 -3.072751892616544e-02 +491 482 -4.012781031913015e-02 +491 483 -5.413421453123170e-02 +491 484 -7.613960933881174e-02 +491 485 -1.132183869282768e-01 +491 486 -1.820810586422655e-01 +491 487 -3.301555353436761e-01 +491 488 -7.412185823610156e-01 +491 489 -3.165206906282848e+00 +491 490 -1.502055215844904e+01 +491 492 -1.502055215852578e+01 +491 493 -3.165206906282890e+00 +491 494 -7.412185823610286e-01 +491 495 -3.301555353436746e-01 +491 496 -1.820810586422645e-01 +491 497 -1.132183869282762e-01 +491 498 -7.613960933881142e-02 +491 499 -5.413421453123170e-02 +491 500 -4.012781031912997e-02 +491 501 -3.072751892616544e-02 +491 502 -2.415034675252897e-02 +491 503 -1.939104886145104e-02 +491 504 -1.585023865775526e-02 +491 505 -1.315380302376546e-02 +491 506 -1.105916272470023e-02 +491 507 -9.403863770832827e-03 +491 508 -8.076052134892571e-03 +491 509 -6.996835383339672e-03 +491 510 -6.109381318875728e-03 +491 511 -5.371977266379805e-03 +492 492 3.988394278146379e+01 +492 464 -2.312252367280536e-03 +492 465 -2.532689975072674e-03 +492 466 -2.783725492315672e-03 +492 467 -3.071047067257386e-03 +492 468 -3.401691470521394e-03 +492 469 -3.784439171232917e-03 +492 470 -4.230349322908519e-03 +492 471 -4.753493624956895e-03 +492 472 -5.371977266379788e-03 +492 473 -6.109381318875749e-03 +492 474 -6.996835383339650e-03 +492 475 -8.076052134892594e-03 +492 476 -9.403863770832820e-03 +492 477 -1.105916272470027e-02 +492 478 -1.315380302376546e-02 +492 479 -1.585023865775526e-02 +492 480 -1.939104886145111e-02 +492 481 -2.415034675252897e-02 +492 482 -3.072751892616557e-02 +492 483 -4.012781031912996e-02 +492 484 -5.413421453123172e-02 +492 485 -7.613960933881171e-02 +492 486 -1.132183869282754e-01 +492 487 -1.820810586422643e-01 +492 488 -3.301555353436753e-01 +492 489 -7.412185823610102e-01 +492 490 -3.165206906282874e+00 +492 491 -1.502055215852578e+01 +492 493 -1.502055215863303e+01 +492 494 -3.165206906282894e+00 +492 495 -7.412185823610137e-01 +492 496 -3.301555353436764e-01 +492 497 -1.820810586422660e-01 +492 498 -1.132183869282771e-01 +492 499 -7.613960933881174e-02 +492 500 -5.413421453123173e-02 +492 501 -4.012781031912997e-02 +492 502 -3.072751892616545e-02 +492 503 -2.415034675252887e-02 +492 504 -1.939104886145111e-02 +492 505 -1.585023865775526e-02 +492 506 -1.315380302376544e-02 +492 507 -1.105916272470026e-02 +492 508 -9.403863770832828e-03 +492 509 -8.076052134892615e-03 +492 510 -6.996835383339673e-03 +492 511 -6.109381318875769e-03 +493 493 3.988394278171956e+01 +493 464 -2.117777896667798e-03 +493 465 -2.312252367280536e-03 +493 466 -2.532689975072686e-03 +493 467 -2.783725492315673e-03 +493 468 -3.071047067257401e-03 +493 469 -3.401691470521393e-03 +493 470 -3.784439171232927e-03 +493 471 -4.230349322908543e-03 +493 472 -4.753493624956895e-03 +493 473 -5.371977266379821e-03 +493 474 -6.109381318875748e-03 +493 475 -6.996835383339698e-03 +493 476 -8.076052134892587e-03 +493 477 -9.403863770832820e-03 +493 478 -1.105916272470023e-02 +493 479 -1.315380302376544e-02 +493 480 -1.585023865775523e-02 +493 481 -1.939104886145107e-02 +493 482 -2.415034675252901e-02 +493 483 -3.072751892616537e-02 +493 484 -4.012781031912987e-02 +493 485 -5.413421453123170e-02 +493 486 -7.613960933881128e-02 +493 487 -1.132183869282766e-01 +493 488 -1.820810586422652e-01 +493 489 -3.301555353436776e-01 +493 490 -7.412185823610185e-01 +493 491 -3.165206906282890e+00 +493 492 -1.502055215863303e+01 +493 494 -1.502055215878379e+01 +493 495 -3.165206906282836e+00 +493 496 -7.412185823609971e-01 +493 497 -3.301555353436746e-01 +493 498 -1.820810586422655e-01 +493 499 -1.132183869282768e-01 +493 500 -7.613960933881173e-02 +493 501 -5.413421453123187e-02 +493 502 -4.012781031913006e-02 +493 503 -3.072751892616537e-02 +493 504 -2.415034675252901e-02 +493 505 -1.939104886145114e-02 +493 506 -1.585023865775526e-02 +493 507 -1.315380302376548e-02 +493 508 -1.105916272470027e-02 +493 509 -9.403863770832833e-03 +493 510 -8.076052134892573e-03 +493 511 -6.996835383339674e-03 +494 494 3.988394278208163e+01 +494 464 -1.945462087124853e-03 +494 465 -2.117777896667789e-03 +494 466 -2.312252367280536e-03 +494 467 -2.532689975072674e-03 +494 468 -2.783725492315672e-03 +494 469 -3.071047067257385e-03 +494 470 -3.401691470521384e-03 +494 471 -3.784439171232927e-03 +494 472 -4.230349322908520e-03 +494 473 -4.753493624956895e-03 +494 474 -5.371977266379788e-03 +494 475 -6.109381318875749e-03 +494 476 -6.996835383339648e-03 +494 477 -8.076052134892571e-03 +494 478 -9.403863770832827e-03 +494 479 -1.105916272470025e-02 +494 480 -1.315380302376546e-02 +494 481 -1.585023865775526e-02 +494 482 -1.939104886145118e-02 +494 483 -2.415034675252897e-02 +494 484 -3.072751892616545e-02 +494 485 -4.012781031913006e-02 +494 486 -5.413421453123172e-02 +494 487 -7.613960933881220e-02 +494 488 -1.132183869282775e-01 +494 489 -1.820810586422674e-01 +494 490 -3.301555353436754e-01 +494 491 -7.412185823610286e-01 +494 492 -3.165206906282894e+00 +494 493 -1.502055215878379e+01 +494 495 -1.502055215899853e+01 +494 496 -3.165206906282808e+00 +494 497 -7.412185823610031e-01 +494 498 -3.301555353436738e-01 +494 499 -1.820810586422642e-01 +494 500 -1.132183869282754e-01 +494 501 -7.613960933881150e-02 +494 502 -5.413421453123172e-02 +494 503 -4.012781031912977e-02 +494 504 -3.072751892616544e-02 +494 505 -2.415034675252897e-02 +494 506 -1.939104886145107e-02 +494 507 -1.585023865775526e-02 +494 508 -1.315380302376546e-02 +494 509 -1.105916272470026e-02 +494 510 -9.403863770832828e-03 +494 511 -8.076052134892609e-03 +495 495 3.988394278260296e+01 +495 464 -1.792160480940042e-03 +495 465 -1.945462087124853e-03 +495 466 -2.117777896667798e-03 +495 467 -2.312252367280536e-03 +495 468 -2.532689975072686e-03 +495 469 -2.783725492315672e-03 +495 470 -3.071047067257392e-03 +495 471 -3.401691470521402e-03 +495 472 -3.784439171232928e-03 +495 473 -4.230349322908543e-03 +495 474 -4.753493624956895e-03 +495 475 -5.371977266379821e-03 +495 476 -6.109381318875748e-03 +495 477 -6.996835383339672e-03 +495 478 -8.076052134892608e-03 +495 479 -9.403863770832806e-03 +495 480 -1.105916272470022e-02 +495 481 -1.315380302376542e-02 +495 482 -1.585023865775526e-02 +495 483 -1.939104886145104e-02 +495 484 -2.415034675252887e-02 +495 485 -3.072751892616537e-02 +495 486 -4.012781031912977e-02 +495 487 -5.413421453123171e-02 +495 488 -7.613960933881130e-02 +495 489 -1.132183869282760e-01 +495 490 -1.820810586422634e-01 +495 491 -3.301555353436746e-01 +495 492 -7.412185823610137e-01 +495 493 -3.165206906282836e+00 +495 494 -1.502055215899853e+01 +495 496 -1.502055215931066e+01 +495 497 -3.165206906282893e+00 +495 498 -7.412185823610283e-01 +495 499 -3.301555353436781e-01 +495 500 -1.820810586422656e-01 +495 501 -1.132183869282770e-01 +495 502 -7.613960933881210e-02 +495 503 -5.413421453123171e-02 +495 504 -4.012781031913015e-02 +495 505 -3.072751892616557e-02 +495 506 -2.415034675252901e-02 +495 507 -1.939104886145118e-02 +495 508 -1.585023865775531e-02 +495 509 -1.315380302376550e-02 +495 510 -1.105916272470029e-02 +495 511 -9.403863770832828e-03 +496 496 3.988394278260306e+01 +496 480 -9.403863770832825e-03 +496 481 -1.105916272470025e-02 +496 482 -1.315380302376550e-02 +496 483 -1.585023865775526e-02 +496 484 -1.939104886145111e-02 +496 485 -2.415034675252901e-02 +496 486 -3.072751892616544e-02 +496 487 -4.012781031913015e-02 +496 488 -5.413421453123170e-02 +496 489 -7.613960933881159e-02 +496 490 -1.132183869282760e-01 +496 491 -1.820810586422645e-01 +496 492 -3.301555353436764e-01 +496 493 -7.412185823609971e-01 +496 494 -3.165206906282808e+00 +496 495 -1.502055215931066e+01 +496 497 -1.502055215899865e+01 +496 498 -3.165206906282897e+00 +496 499 -7.412185823610312e-01 +496 500 -3.301555353436759e-01 +496 501 -1.820810586422654e-01 +496 502 -1.132183869282771e-01 +496 503 -7.613960933881131e-02 +496 504 -5.413421453123170e-02 +496 505 -4.012781031912996e-02 +496 506 -3.072751892616537e-02 +496 507 -2.415034675252897e-02 +496 508 -1.939104886145111e-02 +496 509 -1.585023865775526e-02 +496 510 -1.315380302376546e-02 +496 511 -1.105916272470022e-02 +496 512 -9.403863770832820e-03 +496 513 -8.076052134892601e-03 +496 514 -6.996835383339686e-03 +496 515 -6.109381318875759e-03 +496 516 -5.371977266379814e-03 +496 517 -4.753493624956902e-03 +496 518 -4.230349322908538e-03 +496 519 -3.784439171232932e-03 +496 520 -3.401691470521398e-03 +496 521 -3.071047067257396e-03 +496 522 -2.783725492315676e-03 +496 523 -2.532689975072682e-03 +496 524 -2.312252367280538e-03 +496 525 -2.117777896667796e-03 +496 526 -1.945462087124855e-03 +496 527 -1.792160480940040e-03 +497 497 3.988394278208175e+01 +497 480 -8.076052134892616e-03 +497 481 -9.403863770832828e-03 +497 482 -1.105916272470029e-02 +497 483 -1.315380302376546e-02 +497 484 -1.585023865775526e-02 +497 485 -1.939104886145114e-02 +497 486 -2.415034675252897e-02 +497 487 -3.072751892616557e-02 +497 488 -4.012781031912996e-02 +497 489 -5.413421453123172e-02 +497 490 -7.613960933881171e-02 +497 491 -1.132183869282762e-01 +497 492 -1.820810586422660e-01 +497 493 -3.301555353436746e-01 +497 494 -7.412185823610031e-01 +497 495 -3.165206906282893e+00 +497 496 -1.502055215899865e+01 +497 498 -1.502055215878375e+01 +497 499 -3.165206906282883e+00 +497 500 -7.412185823610191e-01 +497 501 -3.301555353436779e-01 +497 502 -1.820810586422672e-01 +497 503 -1.132183869282762e-01 +497 504 -7.613960933881159e-02 +497 505 -5.413421453123172e-02 +497 506 -4.012781031912987e-02 +497 507 -3.072751892616545e-02 +497 508 -2.415034675252897e-02 +497 509 -1.939104886145111e-02 +497 510 -1.585023865775526e-02 +497 511 -1.315380302376542e-02 +497 512 -1.105916272470023e-02 +497 513 -9.403863770832827e-03 +497 514 -8.076052134892580e-03 +497 515 -6.996835383339660e-03 +497 516 -6.109381318875739e-03 +497 517 -5.371977266379796e-03 +497 518 -4.753493624956888e-03 +497 519 -4.230349322908524e-03 +497 520 -3.784439171232921e-03 +497 521 -3.401691470521389e-03 +497 522 -3.071047067257388e-03 +497 523 -2.783725492315669e-03 +497 524 -2.532689975072676e-03 +497 525 -2.312252367280533e-03 +497 526 -2.117777896667792e-03 +497 527 -1.945462087124851e-03 +498 498 3.988394278171960e+01 +498 480 -6.996835383339699e-03 +498 481 -8.076052134892590e-03 +498 482 -9.403863770832835e-03 +498 483 -1.105916272470022e-02 +498 484 -1.315380302376542e-02 +498 485 -1.585023865775523e-02 +498 486 -1.939104886145104e-02 +498 487 -2.415034675252896e-02 +498 488 -3.072751892616530e-02 +498 489 -4.012781031912977e-02 +498 490 -5.413421453123171e-02 +498 491 -7.613960933881142e-02 +498 492 -1.132183869282771e-01 +498 493 -1.820810586422655e-01 +498 494 -3.301555353436738e-01 +498 495 -7.412185823610283e-01 +498 496 -3.165206906282897e+00 +498 497 -1.502055215878375e+01 +498 499 -1.502055215863304e+01 +498 500 -3.165206906282874e+00 +498 501 -7.412185823610096e-01 +498 502 -3.301555353436762e-01 +498 503 -1.820810586422641e-01 +498 504 -1.132183869282760e-01 +498 505 -7.613960933881171e-02 +498 506 -5.413421453123186e-02 +498 507 -4.012781031913017e-02 +498 508 -3.072751892616558e-02 +498 509 -2.415034675252907e-02 +498 510 -1.939104886145118e-02 +498 511 -1.585023865775526e-02 +498 512 -1.315380302376548e-02 +498 513 -1.105916272470030e-02 +498 514 -9.403863770832832e-03 +498 515 -8.076052134892583e-03 +498 516 -6.996835383339660e-03 +498 517 -6.109381318875739e-03 +498 518 -5.371977266379797e-03 +498 519 -4.753493624956888e-03 +498 520 -4.230349322908525e-03 +498 521 -3.784439171232922e-03 +498 522 -3.401691470521388e-03 +498 523 -3.071047067257388e-03 +498 524 -2.783725492315668e-03 +498 525 -2.532689975072677e-03 +498 526 -2.312252367280533e-03 +498 527 -2.117777896667791e-03 +499 499 3.988394278146372e+01 +499 480 -6.109381318875749e-03 +499 481 -6.996835383339650e-03 +499 482 -8.076052134892599e-03 +499 483 -9.403863770832818e-03 +499 484 -1.105916272470025e-02 +499 485 -1.315380302376548e-02 +499 486 -1.585023865775526e-02 +499 487 -1.939104886145118e-02 +499 488 -2.415034675252896e-02 +499 489 -3.072751892616544e-02 +499 490 -4.012781031913015e-02 +499 491 -5.413421453123170e-02 +499 492 -7.613960933881174e-02 +499 493 -1.132183869282768e-01 +499 494 -1.820810586422642e-01 +499 495 -3.301555353436781e-01 +499 496 -7.412185823610312e-01 +499 497 -3.165206906282883e+00 +499 498 -1.502055215863304e+01 +499 500 -1.502055215852572e+01 +499 501 -3.165206906282850e+00 +499 502 -7.412185823610172e-01 +499 503 -3.301555353436754e-01 +499 504 -1.820810586422645e-01 +499 505 -1.132183869282762e-01 +499 506 -7.613960933881177e-02 +499 507 -5.413421453123173e-02 +499 508 -4.012781031912997e-02 +499 509 -3.072751892616544e-02 +499 510 -2.415034675252897e-02 +499 511 -1.939104886145104e-02 +499 512 -1.585023865775523e-02 +499 513 -1.315380302376548e-02 +499 514 -1.105916272470024e-02 +499 515 -9.403863770832833e-03 +499 516 -8.076052134892603e-03 +499 517 -6.996835383339686e-03 +499 518 -6.109381318875759e-03 +499 519 -5.371977266379814e-03 +499 520 -4.753493624956902e-03 +499 521 -4.230349322908538e-03 +499 522 -3.784439171232932e-03 +499 523 -3.401691470521398e-03 +499 524 -3.071047067257396e-03 +499 525 -2.783725492315676e-03 +499 526 -2.532689975072682e-03 +499 527 -2.312252367280538e-03 +500 500 3.988394278128111e+01 +500 480 -5.371977266379821e-03 +500 481 -6.109381318875748e-03 +500 482 -6.996835383339698e-03 +500 483 -8.076052134892594e-03 +500 484 -9.403863770832827e-03 +500 485 -1.105916272470027e-02 +500 486 -1.315380302376546e-02 +500 487 -1.585023865775531e-02 +500 488 -1.939104886145111e-02 +500 489 -2.415034675252897e-02 +500 490 -3.072751892616558e-02 +500 491 -4.012781031912997e-02 +500 492 -5.413421453123173e-02 +500 493 -7.613960933881173e-02 +500 494 -1.132183869282754e-01 +500 495 -1.820810586422656e-01 +500 496 -3.301555353436759e-01 +500 497 -7.412185823610191e-01 +500 498 -3.165206906282874e+00 +500 499 -1.502055215852572e+01 +500 501 -1.502055215844904e+01 +500 502 -3.165206906282889e+00 +500 503 -7.412185823610322e-01 +500 504 -3.301555353436774e-01 +500 505 -1.820810586422663e-01 +500 506 -1.132183869282777e-01 +500 507 -7.613960933881164e-02 +500 508 -5.413421453123172e-02 +500 509 -4.012781031912996e-02 +500 510 -3.072751892616543e-02 +500 511 -2.415034675252887e-02 +500 512 -1.939104886145107e-02 +500 513 -1.585023865775528e-02 +500 514 -1.315380302376544e-02 +500 515 -1.105916272470027e-02 +500 516 -9.403863770832813e-03 +500 517 -8.076052134892578e-03 +500 518 -6.996835383339662e-03 +500 519 -6.109381318875741e-03 +500 520 -5.371977266379797e-03 +500 521 -4.753493624956888e-03 +500 522 -4.230349322908526e-03 +500 523 -3.784439171232922e-03 +500 524 -3.401691470521389e-03 +500 525 -3.071047067257389e-03 +500 526 -2.783725492315669e-03 +500 527 -2.532689975072677e-03 +501 501 3.988394278115155e+01 +501 480 -4.753493624956895e-03 +501 481 -5.371977266379788e-03 +501 482 -6.109381318875749e-03 +501 483 -6.996835383339648e-03 +501 484 -8.076052134892573e-03 +501 485 -9.403863770832833e-03 +501 486 -1.105916272470026e-02 +501 487 -1.315380302376550e-02 +501 488 -1.585023865775526e-02 +501 489 -1.939104886145111e-02 +501 490 -2.415034675252907e-02 +501 491 -3.072751892616544e-02 +501 492 -4.012781031912997e-02 +501 493 -5.413421453123187e-02 +501 494 -7.613960933881150e-02 +501 495 -1.132183869282770e-01 +501 496 -1.820810586422654e-01 +501 497 -3.301555353436779e-01 +501 498 -7.412185823610096e-01 +501 499 -3.165206906282850e+00 +501 500 -1.502055215844904e+01 +501 502 -1.502055215839543e+01 +501 503 -3.165206906282905e+00 +501 504 -7.412185823610283e-01 +501 505 -3.301555353436759e-01 +501 506 -1.820810586422662e-01 +501 507 -1.132183869282759e-01 +501 508 -7.613960933881139e-02 +501 509 -5.413421453123172e-02 +501 510 -4.012781031912996e-02 +501 511 -3.072751892616530e-02 +501 512 -2.415034675252891e-02 +501 513 -1.939104886145114e-02 +501 514 -1.585023865775523e-02 +501 515 -1.315380302376548e-02 +501 516 -1.105916272470024e-02 +501 517 -9.403863770832818e-03 +501 518 -8.076052134892601e-03 +501 519 -6.996835383339686e-03 +501 520 -6.109381318875759e-03 +501 521 -5.371977266379814e-03 +501 522 -4.753493624956902e-03 +501 523 -4.230349322908538e-03 +501 524 -3.784439171232932e-03 +501 525 -3.401691470521398e-03 +501 526 -3.071047067257396e-03 +501 527 -2.783725492315676e-03 +502 502 3.988394278106482e+01 +502 480 -4.230349322908543e-03 +502 481 -4.753493624956895e-03 +502 482 -5.371977266379821e-03 +502 483 -6.109381318875748e-03 +502 484 -6.996835383339672e-03 +502 485 -8.076052134892615e-03 +502 486 -9.403863770832827e-03 +502 487 -1.105916272470029e-02 +502 488 -1.315380302376546e-02 +502 489 -1.585023865775526e-02 +502 490 -1.939104886145118e-02 +502 491 -2.415034675252897e-02 +502 492 -3.072751892616545e-02 +502 493 -4.012781031913006e-02 +502 494 -5.413421453123172e-02 +502 495 -7.613960933881210e-02 +502 496 -1.132183869282771e-01 +502 497 -1.820810586422672e-01 +502 498 -3.301555353436762e-01 +502 499 -7.412185823610172e-01 +502 500 -3.165206906282889e+00 +502 501 -1.502055215839543e+01 +502 503 -1.502055215836224e+01 +502 504 -3.165206906282878e+00 +502 505 -7.412185823610129e-01 +502 506 -3.301555353436768e-01 +502 507 -1.820810586422646e-01 +502 508 -1.132183869282756e-01 +502 509 -7.613960933881150e-02 +502 510 -5.413421453123172e-02 +502 511 -4.012781031912977e-02 +502 512 -3.072751892616537e-02 +502 513 -2.415034675252901e-02 +502 514 -1.939104886145108e-02 +502 515 -1.585023865775528e-02 +502 516 -1.315380302376544e-02 +502 517 -1.105916272470023e-02 +502 518 -9.403863770832827e-03 +502 519 -8.076052134892582e-03 +502 520 -6.996835383339662e-03 +502 521 -6.109381318875741e-03 +502 522 -5.371977266379797e-03 +502 523 -4.753493624956888e-03 +502 524 -4.230349322908526e-03 +502 525 -3.784439171232922e-03 +502 526 -3.401691470521389e-03 +502 527 -3.071047067257389e-03 +503 503 3.988394278102307e+01 +503 480 -3.784439171232927e-03 +503 481 -4.230349322908520e-03 +503 482 -4.753493624956895e-03 +503 483 -5.371977266379788e-03 +503 484 -6.109381318875728e-03 +503 485 -6.996835383339673e-03 +503 486 -8.076052134892568e-03 +503 487 -9.403863770832828e-03 +503 488 -1.105916272470022e-02 +503 489 -1.315380302376542e-02 +503 490 -1.585023865775526e-02 +503 491 -1.939104886145104e-02 +503 492 -2.415034675252887e-02 +503 493 -3.072751892616537e-02 +503 494 -4.012781031912977e-02 +503 495 -5.413421453123171e-02 +503 496 -7.613960933881131e-02 +503 497 -1.132183869282762e-01 +503 498 -1.820810586422641e-01 +503 499 -3.301555353436754e-01 +503 500 -7.412185823610322e-01 +503 501 -3.165206906282905e+00 +503 502 -1.502055215836224e+01 +503 504 -1.502055215835489e+01 +503 505 -3.165206906282846e+00 +503 506 -7.412185823610101e-01 +503 507 -3.301555353436803e-01 +503 508 -1.820810586422655e-01 +503 509 -1.132183869282768e-01 +503 510 -7.613960933881209e-02 +503 511 -5.413421453123171e-02 +503 512 -4.012781031913006e-02 +503 513 -3.072751892616564e-02 +503 514 -2.415034675252902e-02 +503 515 -1.939104886145121e-02 +503 516 -1.585023865775529e-02 +503 517 -1.315380302376548e-02 +503 518 -1.105916272470030e-02 +503 519 -9.403863770832842e-03 +503 520 -8.076052134892606e-03 +503 521 -6.996835383339686e-03 +503 522 -6.109381318875759e-03 +503 523 -5.371977266379814e-03 +503 524 -4.753493624956902e-03 +503 525 -4.230349322908538e-03 +503 526 -3.784439171232932e-03 +503 527 -3.401691470521398e-03 +504 504 3.988394278105613e+01 +504 480 -3.401691470521403e-03 +504 481 -3.784439171232928e-03 +504 482 -4.230349322908545e-03 +504 483 -4.753493624956895e-03 +504 484 -5.371977266379805e-03 +504 485 -6.109381318875770e-03 +504 486 -6.996835383339676e-03 +504 487 -8.076052134892622e-03 +504 488 -9.403863770832827e-03 +504 489 -1.105916272470025e-02 +504 490 -1.315380302376550e-02 +504 491 -1.585023865775526e-02 +504 492 -1.939104886145111e-02 +504 493 -2.415034675252901e-02 +504 494 -3.072751892616544e-02 +504 495 -4.012781031913015e-02 +504 496 -5.413421453123170e-02 +504 497 -7.613960933881159e-02 +504 498 -1.132183869282760e-01 +504 499 -1.820810586422645e-01 +504 500 -3.301555353436774e-01 +504 501 -7.412185823610283e-01 +504 502 -3.165206906282878e+00 +504 503 -1.502055215835489e+01 +504 505 -1.502055215840047e+01 +504 506 -3.165206906282869e+00 +504 507 -7.412185823610270e-01 +504 508 -3.301555353436735e-01 +504 509 -1.820810586422645e-01 +504 510 -1.132183869282770e-01 +504 511 -7.613960933881141e-02 +504 512 -5.413421453123156e-02 +504 513 -4.012781031913006e-02 +504 514 -3.072751892616538e-02 +504 515 -2.415034675252901e-02 +504 516 -1.939104886145108e-02 +504 517 -1.585023865775523e-02 +504 518 -1.315380302376548e-02 +504 519 -1.105916272470024e-02 +504 520 -9.403863770832811e-03 +504 521 -8.076052134892577e-03 +504 522 -6.996835383339660e-03 +504 523 -6.109381318875739e-03 +504 524 -5.371977266379796e-03 +504 525 -4.753493624956888e-03 +504 526 -4.230349322908524e-03 +504 527 -3.784439171232921e-03 +505 505 3.988394278128565e+01 +505 480 -3.071047067257401e-03 +505 481 -3.401691470521394e-03 +505 482 -3.784439171232938e-03 +505 483 -4.230349322908531e-03 +505 484 -4.753493624956895e-03 +505 485 -5.371977266379823e-03 +505 486 -6.109381318875750e-03 +505 487 -6.996835383339699e-03 +505 488 -8.076052134892594e-03 +505 489 -9.403863770832835e-03 +505 490 -1.105916272470029e-02 +505 491 -1.315380302376546e-02 +505 492 -1.585023865775526e-02 +505 493 -1.939104886145114e-02 +505 494 -2.415034675252897e-02 +505 495 -3.072751892616557e-02 +505 496 -4.012781031912996e-02 +505 497 -5.413421453123172e-02 +505 498 -7.613960933881171e-02 +505 499 -1.132183869282762e-01 +505 500 -1.820810586422663e-01 +505 501 -3.301555353436759e-01 +505 502 -7.412185823610129e-01 +505 503 -3.165206906282846e+00 +505 504 -1.502055215840047e+01 +505 506 -1.502055215860534e+01 +505 507 -3.165206906282892e+00 +505 508 -7.412185823610197e-01 +505 509 -3.301555353436754e-01 +505 510 -1.820810586422671e-01 +505 511 -1.132183869282767e-01 +505 512 -7.613960933881125e-02 +505 513 -5.413421453123186e-02 +505 514 -4.012781031912988e-02 +505 515 -3.072751892616551e-02 +505 516 -2.415034675252892e-02 +505 517 -1.939104886145107e-02 +505 518 -1.585023865775528e-02 +505 519 -1.315380302376544e-02 +505 520 -1.105916272470023e-02 +505 521 -9.403863770832823e-03 +505 522 -8.076052134892580e-03 +505 523 -6.996835383339660e-03 +505 524 -6.109381318875739e-03 +505 525 -5.371977266379797e-03 +505 526 -4.753493624956888e-03 +505 527 -4.230349322908525e-03 +506 506 3.988394278152497e+01 +506 480 -2.783725492315672e-03 +506 481 -3.071047067257386e-03 +506 482 -3.401691470521394e-03 +506 483 -3.784439171232917e-03 +506 484 -4.230349322908519e-03 +506 485 -4.753493624956895e-03 +506 486 -5.371977266379788e-03 +506 487 -6.109381318875749e-03 +506 488 -6.996835383339650e-03 +506 489 -8.076052134892589e-03 +506 490 -9.403863770832827e-03 +506 491 -1.105916272470023e-02 +506 492 -1.315380302376544e-02 +506 493 -1.585023865775526e-02 +506 494 -1.939104886145107e-02 +506 495 -2.415034675252901e-02 +506 496 -3.072751892616537e-02 +506 497 -4.012781031912987e-02 +506 498 -5.413421453123186e-02 +506 499 -7.613960933881177e-02 +506 500 -1.132183869282777e-01 +506 501 -1.820810586422662e-01 +506 502 -3.301555353436768e-01 +506 503 -7.412185823610101e-01 +506 504 -3.165206906282869e+00 +506 505 -1.502055215860534e+01 +506 507 -1.502055215859221e+01 +506 508 -3.165206906282877e+00 +506 509 -7.412185823610270e-01 +506 510 -3.301555353436799e-01 +506 511 -1.820810586422643e-01 +506 512 -1.132183869282753e-01 +506 513 -7.613960933881164e-02 +506 514 -5.413421453123174e-02 +506 515 -4.012781031913015e-02 +506 516 -3.072751892616545e-02 +506 517 -2.415034675252896e-02 +506 518 -1.939104886145118e-02 +506 519 -1.585023865775526e-02 +506 520 -1.315380302376546e-02 +506 521 -1.105916272470028e-02 +506 522 -9.403863770832828e-03 +506 523 -8.076052134892601e-03 +506 524 -6.996835383339686e-03 +506 525 -6.109381318875759e-03 +506 526 -5.371977266379814e-03 +506 527 -4.753493624956902e-03 +507 507 3.988394278151360e+01 +507 480 -2.532689975072686e-03 +507 481 -2.783725492315673e-03 +507 482 -3.071047067257401e-03 +507 483 -3.401691470521393e-03 +507 484 -3.784439171232927e-03 +507 485 -4.230349322908543e-03 +507 486 -4.753493624956895e-03 +507 487 -5.371977266379821e-03 +507 488 -6.109381318875748e-03 +507 489 -6.996835383339698e-03 +507 490 -8.076052134892599e-03 +507 491 -9.403863770832827e-03 +507 492 -1.105916272470026e-02 +507 493 -1.315380302376548e-02 +507 494 -1.585023865775526e-02 +507 495 -1.939104886145118e-02 +507 496 -2.415034675252897e-02 +507 497 -3.072751892616545e-02 +507 498 -4.012781031913017e-02 +507 499 -5.413421453123173e-02 +507 500 -7.613960933881164e-02 +507 501 -1.132183869282759e-01 +507 502 -1.820810586422646e-01 +507 503 -3.301555353436803e-01 +507 504 -7.412185823610270e-01 +507 505 -3.165206906282892e+00 +507 506 -1.502055215859221e+01 +507 508 -1.502055215859653e+01 +507 509 -3.165206906282885e+00 +507 510 -7.412185823610220e-01 +507 511 -3.301555353436734e-01 +507 512 -1.820810586422650e-01 +507 513 -1.132183869282760e-01 +507 514 -7.613960933881143e-02 +507 515 -5.413421453123185e-02 +507 516 -4.012781031912987e-02 +507 517 -3.072751892616536e-02 +507 518 -2.415034675252901e-02 +507 519 -1.939104886145107e-02 +507 520 -1.585023865775523e-02 +507 521 -1.315380302376548e-02 +507 522 -1.105916272470024e-02 +507 523 -9.403863770832823e-03 +507 524 -8.076052134892580e-03 +507 525 -6.996835383339662e-03 +507 526 -6.109381318875741e-03 +507 527 -5.371977266379797e-03 +508 508 3.988394278151443e+01 +508 480 -2.312252367280536e-03 +508 481 -2.532689975072674e-03 +508 482 -2.783725492315672e-03 +508 483 -3.071047067257385e-03 +508 484 -3.401691470521384e-03 +508 485 -3.784439171232927e-03 +508 486 -4.230349322908520e-03 +508 487 -4.753493624956895e-03 +508 488 -5.371977266379788e-03 +508 489 -6.109381318875749e-03 +508 490 -6.996835383339648e-03 +508 491 -8.076052134892571e-03 +508 492 -9.403863770832828e-03 +508 493 -1.105916272470027e-02 +508 494 -1.315380302376546e-02 +508 495 -1.585023865775531e-02 +508 496 -1.939104886145111e-02 +508 497 -2.415034675252897e-02 +508 498 -3.072751892616558e-02 +508 499 -4.012781031912997e-02 +508 500 -5.413421453123172e-02 +508 501 -7.613960933881139e-02 +508 502 -1.132183869282756e-01 +508 503 -1.820810586422655e-01 +508 504 -3.301555353436735e-01 +508 505 -7.412185823610197e-01 +508 506 -3.165206906282877e+00 +508 507 -1.502055215859653e+01 +508 509 -1.502055215858805e+01 +508 510 -3.165206906282857e+00 +508 511 -7.412185823610093e-01 +508 512 -3.301555353436784e-01 +508 513 -1.820810586422653e-01 +508 514 -1.132183869282767e-01 +508 515 -7.613960933881189e-02 +508 516 -5.413421453123159e-02 +508 517 -4.012781031912985e-02 +508 518 -3.072751892616550e-02 +508 519 -2.415034675252892e-02 +508 520 -1.939104886145107e-02 +508 521 -1.585023865775528e-02 +508 522 -1.315380302376544e-02 +508 523 -1.105916272470027e-02 +508 524 -9.403863770832821e-03 +508 525 -8.076052134892601e-03 +508 526 -6.996835383339686e-03 +508 527 -6.109381318875759e-03 +509 509 3.988394278153929e+01 +509 480 -2.117777896667798e-03 +509 481 -2.312252367280536e-03 +509 482 -2.532689975072686e-03 +509 483 -2.783725492315672e-03 +509 484 -3.071047067257392e-03 +509 485 -3.401691470521402e-03 +509 486 -3.784439171232928e-03 +509 487 -4.230349322908543e-03 +509 488 -4.753493624956895e-03 +509 489 -5.371977266379821e-03 +509 490 -6.109381318875748e-03 +509 491 -6.996835383339672e-03 +509 492 -8.076052134892615e-03 +509 493 -9.403863770832833e-03 +509 494 -1.105916272470026e-02 +509 495 -1.315380302376550e-02 +509 496 -1.585023865775526e-02 +509 497 -1.939104886145111e-02 +509 498 -2.415034675252907e-02 +509 499 -3.072751892616544e-02 +509 500 -4.012781031912996e-02 +509 501 -5.413421453123172e-02 +509 502 -7.613960933881150e-02 +509 503 -1.132183869282768e-01 +509 504 -1.820810586422645e-01 +509 505 -3.301555353436754e-01 +509 506 -7.412185823610270e-01 +509 507 -3.165206906282885e+00 +509 508 -1.502055215858805e+01 +509 510 -1.502055215863996e+01 +509 511 -3.165206906282846e+00 +509 512 -7.412185823610171e-01 +509 513 -3.301555353436741e-01 +509 514 -1.820810586422650e-01 +509 515 -1.132183869282763e-01 +509 516 -7.613960933881136e-02 +509 517 -5.413421453123154e-02 +509 518 -4.012781031913005e-02 +509 519 -3.072751892616538e-02 +509 520 -2.415034675252891e-02 +509 521 -1.939104886145114e-02 +509 522 -1.585023865775523e-02 +509 523 -1.315380302376548e-02 +509 524 -1.105916272470024e-02 +509 525 -9.403863770832809e-03 +509 526 -8.076052134892578e-03 +509 527 -6.996835383339662e-03 +510 510 3.988394278164017e+01 +510 480 -1.945462087124853e-03 +510 481 -2.117777896667789e-03 +510 482 -2.312252367280536e-03 +510 483 -2.532689975072674e-03 +510 484 -2.783725492315666e-03 +510 485 -3.071047067257393e-03 +510 486 -3.401691470521385e-03 +510 487 -3.784439171232927e-03 +510 488 -4.230349322908520e-03 +510 489 -4.753493624956895e-03 +510 490 -5.371977266379788e-03 +510 491 -6.109381318875728e-03 +510 492 -6.996835383339673e-03 +510 493 -8.076052134892573e-03 +510 494 -9.403863770832828e-03 +510 495 -1.105916272470029e-02 +510 496 -1.315380302376546e-02 +510 497 -1.585023865775526e-02 +510 498 -1.939104886145118e-02 +510 499 -2.415034675252897e-02 +510 500 -3.072751892616543e-02 +510 501 -4.012781031912996e-02 +510 502 -5.413421453123172e-02 +510 503 -7.613960933881209e-02 +510 504 -1.132183869282770e-01 +510 505 -1.820810586422671e-01 +510 506 -3.301555353436799e-01 +510 507 -7.412185823610220e-01 +510 508 -3.165206906282857e+00 +510 509 -1.502055215863996e+01 +510 511 -1.502055215866001e+01 +510 512 -3.165206906282882e+00 +510 513 -7.412185823610281e-01 +510 514 -3.301555353436745e-01 +510 515 -1.820810586422636e-01 +510 516 -1.132183869282758e-01 +510 517 -7.613960933881124e-02 +510 518 -5.413421453123186e-02 +510 519 -4.012781031912988e-02 +510 520 -3.072751892616537e-02 +510 521 -2.415034675252901e-02 +510 522 -1.939104886145108e-02 +510 523 -1.585023865775528e-02 +510 524 -1.315380302376544e-02 +510 525 -1.105916272470023e-02 +510 526 -9.403863770832833e-03 +510 527 -8.076052134892603e-03 +511 511 3.988394278169705e+01 +511 480 -1.792160480940042e-03 +511 481 -1.945462087124853e-03 +511 482 -2.117777896667798e-03 +511 483 -2.312252367280535e-03 +511 484 -2.532689975072679e-03 +511 485 -2.783725492315679e-03 +511 486 -3.071047067257393e-03 +511 487 -3.401691470521402e-03 +511 488 -3.784439171232928e-03 +511 489 -4.230349322908543e-03 +511 490 -4.753493624956895e-03 +511 491 -5.371977266379805e-03 +511 492 -6.109381318875769e-03 +511 493 -6.996835383339674e-03 +511 494 -8.076052134892609e-03 +511 495 -9.403863770832828e-03 +511 496 -1.105916272470022e-02 +511 497 -1.315380302376542e-02 +511 498 -1.585023865775526e-02 +511 499 -1.939104886145104e-02 +511 500 -2.415034675252887e-02 +511 501 -3.072751892616530e-02 +511 502 -4.012781031912977e-02 +511 503 -5.413421453123171e-02 +511 504 -7.613960933881141e-02 +511 505 -1.132183869282767e-01 +511 506 -1.820810586422643e-01 +511 507 -3.301555353436734e-01 +511 508 -7.412185823610093e-01 +511 509 -3.165206906282846e+00 +511 510 -1.502055215866001e+01 +511 512 -1.502055215931065e+01 +511 513 -3.165206906282887e+00 +511 514 -7.412185823610362e-01 +511 515 -3.301555353436788e-01 +511 516 -1.820810586422659e-01 +511 517 -1.132183869282763e-01 +511 518 -7.613960933881193e-02 +511 519 -5.413421453123189e-02 +511 520 -4.012781031913006e-02 +511 521 -3.072751892616564e-02 +511 522 -2.415034675252902e-02 +511 523 -1.939104886145121e-02 +511 524 -1.585023865775529e-02 +511 525 -1.315380302376548e-02 +511 526 -1.105916272470030e-02 +511 527 -9.403863770832833e-03 +512 512 3.988394278169706e+01 +512 496 -9.403863770832820e-03 +512 497 -1.105916272470023e-02 +512 498 -1.315380302376548e-02 +512 499 -1.585023865775523e-02 +512 500 -1.939104886145107e-02 +512 501 -2.415034675252891e-02 +512 502 -3.072751892616537e-02 +512 503 -4.012781031913006e-02 +512 504 -5.413421453123156e-02 +512 505 -7.613960933881125e-02 +512 506 -1.132183869282753e-01 +512 507 -1.820810586422650e-01 +512 508 -3.301555353436784e-01 +512 509 -7.412185823610171e-01 +512 510 -3.165206906282882e+00 +512 511 -1.502055215931065e+01 +512 513 -1.502055215866000e+01 +512 514 -3.165206906282891e+00 +512 515 -7.412185823610205e-01 +512 516 -3.301555353436774e-01 +512 517 -1.820810586422660e-01 +512 518 -1.132183869282758e-01 +512 519 -7.613960933881146e-02 +512 520 -5.413421453123171e-02 +512 521 -4.012781031913016e-02 +512 522 -3.072751892616546e-02 +512 523 -2.415034675252906e-02 +512 524 -1.939104886145111e-02 +512 525 -1.585023865775526e-02 +512 526 -1.315380302376551e-02 +512 527 -1.105916272470026e-02 +512 528 -9.403863770832847e-03 +512 529 -8.076052134892608e-03 +512 530 -6.996835383339686e-03 +512 531 -6.109381318875759e-03 +512 532 -5.371977266379814e-03 +512 533 -4.753493624956902e-03 +512 534 -4.230349322908538e-03 +512 535 -3.784439171232932e-03 +512 536 -3.401691470521398e-03 +512 537 -3.071047067257396e-03 +512 538 -2.783725492315676e-03 +512 539 -2.532689975072682e-03 +512 540 -2.312252367280538e-03 +512 541 -2.117777896667796e-03 +512 542 -1.945462087124855e-03 +512 543 -1.792160480940040e-03 +513 513 3.988394278164017e+01 +513 496 -8.076052134892601e-03 +513 497 -9.403863770832827e-03 +513 498 -1.105916272470030e-02 +513 499 -1.315380302376548e-02 +513 500 -1.585023865775528e-02 +513 501 -1.939104886145114e-02 +513 502 -2.415034675252901e-02 +513 503 -3.072751892616564e-02 +513 504 -4.012781031913006e-02 +513 505 -5.413421453123186e-02 +513 506 -7.613960933881164e-02 +513 507 -1.132183869282760e-01 +513 508 -1.820810586422653e-01 +513 509 -3.301555353436741e-01 +513 510 -7.412185823610281e-01 +513 511 -3.165206906282887e+00 +513 512 -1.502055215866000e+01 +513 514 -1.502055215864002e+01 +513 515 -3.165206906282849e+00 +513 516 -7.412185823610125e-01 +513 517 -3.301555353436775e-01 +513 518 -1.820810586422655e-01 +513 519 -1.132183869282772e-01 +513 520 -7.613960933881142e-02 +513 521 -5.413421453123170e-02 +513 522 -4.012781031912977e-02 +513 523 -3.072751892616543e-02 +513 524 -2.415034675252887e-02 +513 525 -1.939104886145103e-02 +513 526 -1.585023865775526e-02 +513 527 -1.315380302376542e-02 +513 528 -1.105916272470025e-02 +513 529 -9.403863770832814e-03 +513 530 -8.076052134892582e-03 +513 531 -6.996835383339674e-03 +513 532 -6.109381318875750e-03 +513 533 -5.371977266379805e-03 +513 534 -4.753493624956895e-03 +513 535 -4.230349322908531e-03 +513 536 -3.784439171232927e-03 +513 537 -3.401691470521394e-03 +513 538 -3.071047067257393e-03 +513 539 -2.783725492315672e-03 +513 540 -2.532689975072680e-03 +513 541 -2.312252367280536e-03 +513 542 -2.117777896667794e-03 +513 543 -1.945462087124853e-03 +514 514 3.988394278153925e+01 +514 496 -6.996835383339686e-03 +514 497 -8.076052134892580e-03 +514 498 -9.403863770832832e-03 +514 499 -1.105916272470024e-02 +514 500 -1.315380302376544e-02 +514 501 -1.585023865775523e-02 +514 502 -1.939104886145108e-02 +514 503 -2.415034675252902e-02 +514 504 -3.072751892616538e-02 +514 505 -4.012781031912988e-02 +514 506 -5.413421453123174e-02 +514 507 -7.613960933881143e-02 +514 508 -1.132183869282767e-01 +514 509 -1.820810586422650e-01 +514 510 -3.301555353436745e-01 +514 511 -7.412185823610362e-01 +514 512 -3.165206906282891e+00 +514 513 -1.502055215864002e+01 +514 515 -1.502055215858796e+01 +514 516 -3.165206906282840e+00 +514 517 -7.412185823610113e-01 +514 518 -3.301555353436757e-01 +514 519 -1.820810586422654e-01 +514 520 -1.132183869282759e-01 +514 521 -7.613960933881188e-02 +514 522 -5.413421453123174e-02 +514 523 -4.012781031913015e-02 +514 524 -3.072751892616545e-02 +514 525 -2.415034675252896e-02 +514 526 -1.939104886145118e-02 +514 527 -1.585023865775526e-02 +514 528 -1.315380302376550e-02 +514 529 -1.105916272470029e-02 +514 530 -9.403863770832827e-03 +514 531 -8.076052134892592e-03 +514 532 -6.996835383339674e-03 +514 533 -6.109381318875750e-03 +514 534 -5.371977266379805e-03 +514 535 -4.753493624956895e-03 +514 536 -4.230349322908531e-03 +514 537 -3.784439171232927e-03 +514 538 -3.401691470521394e-03 +514 539 -3.071047067257393e-03 +514 540 -2.783725492315672e-03 +514 541 -2.532689975072680e-03 +514 542 -2.312252367280536e-03 +514 543 -2.117777896667794e-03 +515 515 3.988394278151434e+01 +515 496 -6.109381318875759e-03 +515 497 -6.996835383339660e-03 +515 498 -8.076052134892583e-03 +515 499 -9.403863770832833e-03 +515 500 -1.105916272470027e-02 +515 501 -1.315380302376548e-02 +515 502 -1.585023865775528e-02 +515 503 -1.939104886145121e-02 +515 504 -2.415034675252901e-02 +515 505 -3.072751892616551e-02 +515 506 -4.012781031913015e-02 +515 507 -5.413421453123185e-02 +515 508 -7.613960933881189e-02 +515 509 -1.132183869282763e-01 +515 510 -1.820810586422636e-01 +515 511 -3.301555353436788e-01 +515 512 -7.412185823610205e-01 +515 513 -3.165206906282849e+00 +515 514 -1.502055215858796e+01 +515 516 -1.502055215859654e+01 +515 517 -3.165206906282859e+00 +515 518 -7.412185823610269e-01 +515 519 -3.301555353436766e-01 +515 520 -1.820810586422648e-01 +515 521 -1.132183869282771e-01 +515 522 -7.613960933881145e-02 +515 523 -5.413421453123170e-02 +515 524 -4.012781031912977e-02 +515 525 -3.072751892616529e-02 +515 526 -2.415034675252896e-02 +515 527 -1.939104886145104e-02 +515 528 -1.585023865775526e-02 +515 529 -1.315380302376546e-02 +515 530 -1.105916272470022e-02 +515 531 -9.403863770832811e-03 +515 532 -8.076052134892582e-03 +515 533 -6.996835383339674e-03 +515 534 -6.109381318875750e-03 +515 535 -5.371977266379805e-03 +515 536 -4.753493624956895e-03 +515 537 -4.230349322908531e-03 +515 538 -3.784439171232927e-03 +515 539 -3.401691470521394e-03 +515 540 -3.071047067257393e-03 +515 541 -2.783725492315672e-03 +515 542 -2.532689975072680e-03 +515 543 -2.312252367280536e-03 +516 516 3.988394278151356e+01 +516 496 -5.371977266379814e-03 +516 497 -6.109381318875739e-03 +516 498 -6.996835383339660e-03 +516 499 -8.076052134892603e-03 +516 500 -9.403863770832813e-03 +516 501 -1.105916272470024e-02 +516 502 -1.315380302376544e-02 +516 503 -1.585023865775529e-02 +516 504 -1.939104886145108e-02 +516 505 -2.415034675252892e-02 +516 506 -3.072751892616545e-02 +516 507 -4.012781031912987e-02 +516 508 -5.413421453123159e-02 +516 509 -7.613960933881136e-02 +516 510 -1.132183869282758e-01 +516 511 -1.820810586422659e-01 +516 512 -3.301555353436774e-01 +516 513 -7.412185823610125e-01 +516 514 -3.165206906282840e+00 +516 515 -1.502055215859654e+01 +516 517 -1.502055215859219e+01 +516 518 -3.165206906282890e+00 +516 519 -7.412185823610309e-01 +516 520 -3.301555353436757e-01 +516 521 -1.820810586422654e-01 +516 522 -1.132183869282762e-01 +516 523 -7.613960933881167e-02 +516 524 -5.413421453123174e-02 +516 525 -4.012781031912995e-02 +516 526 -3.072751892616557e-02 +516 527 -2.415034675252897e-02 +516 528 -1.939104886145118e-02 +516 529 -1.585023865775531e-02 +516 530 -1.315380302376546e-02 +516 531 -1.105916272470028e-02 +516 532 -9.403863770832827e-03 +516 533 -8.076052134892592e-03 +516 534 -6.996835383339674e-03 +516 535 -6.109381318875750e-03 +516 536 -5.371977266379805e-03 +516 537 -4.753493624956895e-03 +516 538 -4.230349322908531e-03 +516 539 -3.784439171232927e-03 +516 540 -3.401691470521394e-03 +516 541 -3.071047067257393e-03 +516 542 -2.783725492315672e-03 +516 543 -2.532689975072680e-03 +517 517 3.988394278152500e+01 +517 496 -4.753493624956902e-03 +517 497 -5.371977266379796e-03 +517 498 -6.109381318875739e-03 +517 499 -6.996835383339686e-03 +517 500 -8.076052134892578e-03 +517 501 -9.403863770832818e-03 +517 502 -1.105916272470023e-02 +517 503 -1.315380302376548e-02 +517 504 -1.585023865775523e-02 +517 505 -1.939104886145107e-02 +517 506 -2.415034675252896e-02 +517 507 -3.072751892616536e-02 +517 508 -4.012781031912985e-02 +517 509 -5.413421453123154e-02 +517 510 -7.613960933881124e-02 +517 511 -1.132183869282763e-01 +517 512 -1.820810586422660e-01 +517 513 -3.301555353436775e-01 +517 514 -7.412185823610113e-01 +517 515 -3.165206906282859e+00 +517 516 -1.502055215859219e+01 +517 518 -1.502055215860536e+01 +517 519 -3.165206906282907e+00 +517 520 -7.412185823610271e-01 +517 521 -3.301555353436766e-01 +517 522 -1.820810586422655e-01 +517 523 -1.132183869282757e-01 +517 524 -7.613960933881146e-02 +517 525 -5.413421453123171e-02 +517 526 -4.012781031913016e-02 +517 527 -3.072751892616546e-02 +517 528 -2.415034675252906e-02 +517 529 -1.939104886145119e-02 +517 530 -1.585023865775526e-02 +517 531 -1.315380302376551e-02 +517 532 -1.105916272470026e-02 +517 533 -9.403863770832825e-03 +517 534 -8.076052134892592e-03 +517 535 -6.996835383339674e-03 +517 536 -6.109381318875750e-03 +517 537 -5.371977266379805e-03 +517 538 -4.753493624956895e-03 +517 539 -4.230349322908531e-03 +517 540 -3.784439171232927e-03 +517 541 -3.401691470521394e-03 +517 542 -3.071047067257393e-03 +517 543 -2.783725492315672e-03 +518 518 3.988394278128570e+01 +518 496 -4.230349322908538e-03 +518 497 -4.753493624956888e-03 +518 498 -5.371977266379797e-03 +518 499 -6.109381318875759e-03 +518 500 -6.996835383339662e-03 +518 501 -8.076052134892601e-03 +518 502 -9.403863770832827e-03 +518 503 -1.105916272470030e-02 +518 504 -1.315380302376548e-02 +518 505 -1.585023865775528e-02 +518 506 -1.939104886145118e-02 +518 507 -2.415034675252901e-02 +518 508 -3.072751892616550e-02 +518 509 -4.012781031913005e-02 +518 510 -5.413421453123186e-02 +518 511 -7.613960933881193e-02 +518 512 -1.132183869282758e-01 +518 513 -1.820810586422655e-01 +518 514 -3.301555353436757e-01 +518 515 -7.412185823610269e-01 +518 516 -3.165206906282890e+00 +518 517 -1.502055215860536e+01 +518 519 -1.502055215840047e+01 +518 520 -3.165206906282872e+00 +518 521 -7.412185823610112e-01 +518 522 -3.301555353436775e-01 +518 523 -1.820810586422655e-01 +518 524 -1.132183869282772e-01 +518 525 -7.613960933881142e-02 +518 526 -5.413421453123170e-02 +518 527 -4.012781031912977e-02 +518 528 -3.072751892616543e-02 +518 529 -2.415034675252897e-02 +518 530 -1.939104886145104e-02 +518 531 -1.585023865775526e-02 +518 532 -1.315380302376542e-02 +518 533 -1.105916272470022e-02 +518 534 -9.403863770832811e-03 +518 535 -8.076052134892582e-03 +518 536 -6.996835383339674e-03 +518 537 -6.109381318875750e-03 +518 538 -5.371977266379805e-03 +518 539 -4.753493624956895e-03 +518 540 -4.230349322908531e-03 +518 541 -3.784439171232927e-03 +518 542 -3.401691470521394e-03 +518 543 -3.071047067257393e-03 +519 519 3.988394278105615e+01 +519 496 -3.784439171232932e-03 +519 497 -4.230349322908524e-03 +519 498 -4.753493624956888e-03 +519 499 -5.371977266379814e-03 +519 500 -6.109381318875741e-03 +519 501 -6.996835383339686e-03 +519 502 -8.076052134892582e-03 +519 503 -9.403863770832842e-03 +519 504 -1.105916272470024e-02 +519 505 -1.315380302376544e-02 +519 506 -1.585023865775526e-02 +519 507 -1.939104886145107e-02 +519 508 -2.415034675252892e-02 +519 509 -3.072751892616538e-02 +519 510 -4.012781031912988e-02 +519 511 -5.413421453123189e-02 +519 512 -7.613960933881146e-02 +519 513 -1.132183869282772e-01 +519 514 -1.820810586422654e-01 +519 515 -3.301555353436766e-01 +519 516 -7.412185823610309e-01 +519 517 -3.165206906282907e+00 +519 518 -1.502055215840047e+01 +519 520 -1.502055215835491e+01 +519 521 -3.165206906282836e+00 +519 522 -7.412185823610051e-01 +519 523 -3.301555353436757e-01 +519 524 -1.820810586422654e-01 +519 525 -1.132183869282759e-01 +519 526 -7.613960933881188e-02 +519 527 -5.413421453123174e-02 +519 528 -4.012781031913015e-02 +519 529 -3.072751892616558e-02 +519 530 -2.415034675252897e-02 +519 531 -1.939104886145118e-02 +519 532 -1.585023865775526e-02 +519 533 -1.315380302376546e-02 +519 534 -1.105916272470028e-02 +519 535 -9.403863770832827e-03 +519 536 -8.076052134892592e-03 +519 537 -6.996835383339674e-03 +519 538 -6.109381318875750e-03 +519 539 -5.371977266379805e-03 +519 540 -4.753493624956895e-03 +519 541 -4.230349322908531e-03 +519 542 -3.784439171232927e-03 +519 543 -3.401691470521394e-03 +520 520 3.988394278102299e+01 +520 496 -3.401691470521398e-03 +520 497 -3.784439171232921e-03 +520 498 -4.230349322908525e-03 +520 499 -4.753493624956902e-03 +520 500 -5.371977266379797e-03 +520 501 -6.109381318875759e-03 +520 502 -6.996835383339662e-03 +520 503 -8.076052134892606e-03 +520 504 -9.403863770832811e-03 +520 505 -1.105916272470023e-02 +520 506 -1.315380302376546e-02 +520 507 -1.585023865775523e-02 +520 508 -1.939104886145107e-02 +520 509 -2.415034675252891e-02 +520 510 -3.072751892616537e-02 +520 511 -4.012781031913006e-02 +520 512 -5.413421453123171e-02 +520 513 -7.613960933881142e-02 +520 514 -1.132183869282759e-01 +520 515 -1.820810586422648e-01 +520 516 -3.301555353436757e-01 +520 517 -7.412185823610271e-01 +520 518 -3.165206906282872e+00 +520 519 -1.502055215835491e+01 +520 521 -1.502055215836218e+01 +520 522 -3.165206906282836e+00 +520 523 -7.412185823610113e-01 +520 524 -3.301555353436766e-01 +520 525 -1.820810586422648e-01 +520 526 -1.132183869282771e-01 +520 527 -7.613960933881167e-02 +520 528 -5.413421453123202e-02 +520 529 -4.012781031913018e-02 +520 530 -3.072751892616546e-02 +520 531 -2.415034675252906e-02 +520 532 -1.939104886145111e-02 +520 533 -1.585023865775526e-02 +520 534 -1.315380302376551e-02 +520 535 -1.105916272470026e-02 +520 536 -9.403863770832839e-03 +520 537 -8.076052134892594e-03 +520 538 -6.996835383339674e-03 +520 539 -6.109381318875750e-03 +520 540 -5.371977266379805e-03 +520 541 -4.753493624956895e-03 +520 542 -4.230349322908531e-03 +520 543 -3.784439171232927e-03 +521 521 3.988394278106472e+01 +521 496 -3.071047067257396e-03 +521 497 -3.401691470521389e-03 +521 498 -3.784439171232922e-03 +521 499 -4.230349322908538e-03 +521 500 -4.753493624956888e-03 +521 501 -5.371977266379814e-03 +521 502 -6.109381318875741e-03 +521 503 -6.996835383339686e-03 +521 504 -8.076052134892577e-03 +521 505 -9.403863770832823e-03 +521 506 -1.105916272470028e-02 +521 507 -1.315380302376548e-02 +521 508 -1.585023865775528e-02 +521 509 -1.939104886145114e-02 +521 510 -2.415034675252901e-02 +521 511 -3.072751892616564e-02 +521 512 -4.012781031913016e-02 +521 513 -5.413421453123170e-02 +521 514 -7.613960933881188e-02 +521 515 -1.132183869282771e-01 +521 516 -1.820810586422654e-01 +521 517 -3.301555353436766e-01 +521 518 -7.412185823610112e-01 +521 519 -3.165206906282836e+00 +521 520 -1.502055215836218e+01 +521 522 -1.502055215839542e+01 +521 523 -3.165206906282878e+00 +521 524 -7.412185823610365e-01 +521 525 -3.301555353436757e-01 +521 526 -1.820810586422654e-01 +521 527 -1.132183869282763e-01 +521 528 -7.613960933881149e-02 +521 529 -5.413421453123173e-02 +521 530 -4.012781031912977e-02 +521 531 -3.072751892616543e-02 +521 532 -2.415034675252887e-02 +521 533 -1.939104886145103e-02 +521 534 -1.585023865775526e-02 +521 535 -1.315380302376542e-02 +521 536 -1.105916272470025e-02 +521 537 -9.403863770832814e-03 +521 538 -8.076052134892582e-03 +521 539 -6.996835383339674e-03 +521 540 -6.109381318875750e-03 +521 541 -5.371977266379805e-03 +521 542 -4.753493624956895e-03 +521 543 -4.230349322908531e-03 +522 522 3.988394278115157e+01 +522 496 -2.783725492315676e-03 +522 497 -3.071047067257388e-03 +522 498 -3.401691470521388e-03 +522 499 -3.784439171232932e-03 +522 500 -4.230349322908526e-03 +522 501 -4.753493624956902e-03 +522 502 -5.371977266379797e-03 +522 503 -6.109381318875759e-03 +522 504 -6.996835383339660e-03 +522 505 -8.076052134892580e-03 +522 506 -9.403863770832828e-03 +522 507 -1.105916272470024e-02 +522 508 -1.315380302376544e-02 +522 509 -1.585023865775523e-02 +522 510 -1.939104886145108e-02 +522 511 -2.415034675252902e-02 +522 512 -3.072751892616546e-02 +522 513 -4.012781031912977e-02 +522 514 -5.413421453123174e-02 +522 515 -7.613960933881145e-02 +522 516 -1.132183869282762e-01 +522 517 -1.820810586422655e-01 +522 518 -3.301555353436775e-01 +522 519 -7.412185823610051e-01 +522 520 -3.165206906282836e+00 +522 521 -1.502055215839542e+01 +522 523 -1.502055215844907e+01 +522 524 -3.165206906282924e+00 +522 525 -7.412185823610355e-01 +522 526 -3.301555353436766e-01 +522 527 -1.820810586422655e-01 +522 528 -1.132183869282756e-01 +522 529 -7.613960933881192e-02 +522 530 -5.413421453123174e-02 +522 531 -4.012781031913015e-02 +522 532 -3.072751892616545e-02 +522 533 -2.415034675252896e-02 +522 534 -1.939104886145118e-02 +522 535 -1.585023865775526e-02 +522 536 -1.315380302376550e-02 +522 537 -1.105916272470029e-02 +522 538 -9.403863770832827e-03 +522 539 -8.076052134892592e-03 +522 540 -6.996835383339674e-03 +522 541 -6.109381318875750e-03 +522 542 -5.371977266379805e-03 +522 543 -4.753493624956895e-03 +523 523 3.988394278128121e+01 +523 496 -2.532689975072682e-03 +523 497 -2.783725492315669e-03 +523 498 -3.071047067257388e-03 +523 499 -3.401691470521398e-03 +523 500 -3.784439171232922e-03 +523 501 -4.230349322908538e-03 +523 502 -4.753493624956888e-03 +523 503 -5.371977266379814e-03 +523 504 -6.109381318875739e-03 +523 505 -6.996835383339660e-03 +523 506 -8.076052134892601e-03 +523 507 -9.403863770832823e-03 +523 508 -1.105916272470027e-02 +523 509 -1.315380302376548e-02 +523 510 -1.585023865775528e-02 +523 511 -1.939104886145121e-02 +523 512 -2.415034675252906e-02 +523 513 -3.072751892616543e-02 +523 514 -4.012781031913015e-02 +523 515 -5.413421453123170e-02 +523 516 -7.613960933881167e-02 +523 517 -1.132183869282757e-01 +523 518 -1.820810586422655e-01 +523 519 -3.301555353436757e-01 +523 520 -7.412185823610113e-01 +523 521 -3.165206906282878e+00 +523 522 -1.502055215844907e+01 +523 524 -1.502055215852579e+01 +523 525 -3.165206906282894e+00 +523 526 -7.412185823610182e-01 +523 527 -3.301555353436775e-01 +523 528 -1.820810586422655e-01 +523 529 -1.132183869282775e-01 +523 530 -7.613960933881145e-02 +523 531 -5.413421453123170e-02 +523 532 -4.012781031912977e-02 +523 533 -3.072751892616529e-02 +523 534 -2.415034675252896e-02 +523 535 -1.939104886145104e-02 +523 536 -1.585023865775526e-02 +523 537 -1.315380302376546e-02 +523 538 -1.105916272470022e-02 +523 539 -9.403863770832811e-03 +523 540 -8.076052134892582e-03 +523 541 -6.996835383339674e-03 +523 542 -6.109381318875750e-03 +523 543 -5.371977266379805e-03 +524 524 3.988394278146379e+01 +524 496 -2.312252367280538e-03 +524 497 -2.532689975072676e-03 +524 498 -2.783725492315668e-03 +524 499 -3.071047067257396e-03 +524 500 -3.401691470521389e-03 +524 501 -3.784439171232932e-03 +524 502 -4.230349322908526e-03 +524 503 -4.753493624956902e-03 +524 504 -5.371977266379796e-03 +524 505 -6.109381318875739e-03 +524 506 -6.996835383339686e-03 +524 507 -8.076052134892580e-03 +524 508 -9.403863770832821e-03 +524 509 -1.105916272470024e-02 +524 510 -1.315380302376544e-02 +524 511 -1.585023865775529e-02 +524 512 -1.939104886145111e-02 +524 513 -2.415034675252887e-02 +524 514 -3.072751892616545e-02 +524 515 -4.012781031912977e-02 +524 516 -5.413421453123174e-02 +524 517 -7.613960933881146e-02 +524 518 -1.132183869282772e-01 +524 519 -1.820810586422654e-01 +524 520 -3.301555353436766e-01 +524 521 -7.412185823610365e-01 +524 522 -3.165206906282924e+00 +524 523 -1.502055215852579e+01 +524 525 -1.502055215863297e+01 +524 526 -3.165206906282859e+00 +524 527 -7.412185823610132e-01 +524 528 -3.301555353436757e-01 +524 529 -1.820810586422654e-01 +524 530 -1.132183869282759e-01 +524 531 -7.613960933881188e-02 +524 532 -5.413421453123174e-02 +524 533 -4.012781031912995e-02 +524 534 -3.072751892616557e-02 +524 535 -2.415034675252897e-02 +524 536 -1.939104886145118e-02 +524 537 -1.585023865775531e-02 +524 538 -1.315380302376546e-02 +524 539 -1.105916272470028e-02 +524 540 -9.403863770832827e-03 +524 541 -8.076052134892592e-03 +524 542 -6.996835383339674e-03 +524 543 -6.109381318875750e-03 +525 525 3.988394278171948e+01 +525 496 -2.117777896667796e-03 +525 497 -2.312252367280533e-03 +525 498 -2.532689975072677e-03 +525 499 -2.783725492315676e-03 +525 500 -3.071047067257389e-03 +525 501 -3.401691470521398e-03 +525 502 -3.784439171232922e-03 +525 503 -4.230349322908538e-03 +525 504 -4.753493624956888e-03 +525 505 -5.371977266379797e-03 +525 506 -6.109381318875759e-03 +525 507 -6.996835383339662e-03 +525 508 -8.076052134892601e-03 +525 509 -9.403863770832809e-03 +525 510 -1.105916272470023e-02 +525 511 -1.315380302376548e-02 +525 512 -1.585023865775526e-02 +525 513 -1.939104886145103e-02 +525 514 -2.415034675252896e-02 +525 515 -3.072751892616529e-02 +525 516 -4.012781031912995e-02 +525 517 -5.413421453123171e-02 +525 518 -7.613960933881142e-02 +525 519 -1.132183869282759e-01 +525 520 -1.820810586422648e-01 +525 521 -3.301555353436757e-01 +525 522 -7.412185823610355e-01 +525 523 -3.165206906282894e+00 +525 524 -1.502055215863297e+01 +525 526 -1.502055215878372e+01 +525 527 -3.165206906282840e+00 +525 528 -7.412185823610054e-01 +525 529 -3.301555353436766e-01 +525 530 -1.820810586422648e-01 +525 531 -1.132183869282771e-01 +525 532 -7.613960933881167e-02 +525 533 -5.413421453123171e-02 +525 534 -4.012781031913016e-02 +525 535 -3.072751892616546e-02 +525 536 -2.415034675252906e-02 +525 537 -1.939104886145119e-02 +525 538 -1.585023865775526e-02 +525 539 -1.315380302376551e-02 +525 540 -1.105916272470026e-02 +525 541 -9.403863770832825e-03 +525 542 -8.076052134892592e-03 +525 543 -6.996835383339674e-03 +526 526 3.988394278208163e+01 +526 496 -1.945462087124855e-03 +526 497 -2.117777896667792e-03 +526 498 -2.312252367280533e-03 +526 499 -2.532689975072682e-03 +526 500 -2.783725492315669e-03 +526 501 -3.071047067257396e-03 +526 502 -3.401691470521389e-03 +526 503 -3.784439171232932e-03 +526 504 -4.230349322908524e-03 +526 505 -4.753493624956888e-03 +526 506 -5.371977266379814e-03 +526 507 -6.109381318875741e-03 +526 508 -6.996835383339686e-03 +526 509 -8.076052134892578e-03 +526 510 -9.403863770832833e-03 +526 511 -1.105916272470030e-02 +526 512 -1.315380302376551e-02 +526 513 -1.585023865775526e-02 +526 514 -1.939104886145118e-02 +526 515 -2.415034675252896e-02 +526 516 -3.072751892616557e-02 +526 517 -4.012781031913016e-02 +526 518 -5.413421453123170e-02 +526 519 -7.613960933881188e-02 +526 520 -1.132183869282771e-01 +526 521 -1.820810586422654e-01 +526 522 -3.301555353436766e-01 +526 523 -7.412185823610182e-01 +526 524 -3.165206906282859e+00 +526 525 -1.502055215878372e+01 +526 527 -1.502055215899859e+01 +526 528 -3.165206906282843e+00 +526 529 -7.412185823610228e-01 +526 530 -3.301555353436757e-01 +526 531 -1.820810586422654e-01 +526 532 -1.132183869282763e-01 +526 533 -7.613960933881099e-02 +526 534 -5.413421453123170e-02 +526 535 -4.012781031912977e-02 +526 536 -3.072751892616543e-02 +526 537 -2.415034675252897e-02 +526 538 -1.939104886145104e-02 +526 539 -1.585023865775526e-02 +526 540 -1.315380302376542e-02 +526 541 -1.105916272470022e-02 +526 542 -9.403863770832811e-03 +526 543 -8.076052134892582e-03 +527 527 3.988394278260303e+01 +527 496 -1.792160480940040e-03 +527 497 -1.945462087124851e-03 +527 498 -2.117777896667791e-03 +527 499 -2.312252367280538e-03 +527 500 -2.532689975072677e-03 +527 501 -2.783725492315676e-03 +527 502 -3.071047067257389e-03 +527 503 -3.401691470521398e-03 +527 504 -3.784439171232921e-03 +527 505 -4.230349322908525e-03 +527 506 -4.753493624956902e-03 +527 507 -5.371977266379797e-03 +527 508 -6.109381318875759e-03 +527 509 -6.996835383339662e-03 +527 510 -8.076052134892603e-03 +527 511 -9.403863770832833e-03 +527 512 -1.105916272470026e-02 +527 513 -1.315380302376542e-02 +527 514 -1.585023865775526e-02 +527 515 -1.939104886145104e-02 +527 516 -2.415034675252897e-02 +527 517 -3.072751892616546e-02 +527 518 -4.012781031912977e-02 +527 519 -5.413421453123174e-02 +527 520 -7.613960933881167e-02 +527 521 -1.132183869282763e-01 +527 522 -1.820810586422655e-01 +527 523 -3.301555353436775e-01 +527 524 -7.412185823610132e-01 +527 525 -3.165206906282840e+00 +527 526 -1.502055215899859e+01 +527 528 -1.502055215931063e+01 +527 529 -3.165206906282908e+00 +527 530 -7.412185823610257e-01 +527 531 -3.301555353436766e-01 +527 532 -1.820810586422655e-01 +527 533 -1.132183869282753e-01 +527 534 -7.613960933881189e-02 +527 535 -5.413421453123174e-02 +527 536 -4.012781031913015e-02 +527 537 -3.072751892616558e-02 +527 538 -2.415034675252897e-02 +527 539 -1.939104886145118e-02 +527 540 -1.585023865775526e-02 +527 541 -1.315380302376546e-02 +527 542 -1.105916272470028e-02 +527 543 -9.403863770832827e-03 +528 528 3.988394278260307e+01 +528 512 -9.403863770832847e-03 +528 513 -1.105916272470025e-02 +528 514 -1.315380302376550e-02 +528 515 -1.585023865775526e-02 +528 516 -1.939104886145118e-02 +528 517 -2.415034675252906e-02 +528 518 -3.072751892616543e-02 +528 519 -4.012781031913015e-02 +528 520 -5.413421453123202e-02 +528 521 -7.613960933881149e-02 +528 522 -1.132183869282756e-01 +528 523 -1.820810586422655e-01 +528 524 -3.301555353436757e-01 +528 525 -7.412185823610054e-01 +528 526 -3.165206906282843e+00 +528 527 -1.502055215931063e+01 +528 529 -1.502055215899868e+01 +528 530 -3.165206906282872e+00 +528 531 -7.412185823610187e-01 +528 532 -3.301555353436775e-01 +528 533 -1.820810586422655e-01 +528 534 -1.132183869282775e-01 +528 535 -7.613960933881145e-02 +528 536 -5.413421453123170e-02 +528 537 -4.012781031912997e-02 +528 538 -3.072751892616531e-02 +528 539 -2.415034675252896e-02 +528 540 -1.939104886145104e-02 +528 541 -1.585023865775520e-02 +528 542 -1.315380302376546e-02 +528 543 -1.105916272470022e-02 +528 544 -9.403863770832811e-03 +528 545 -8.076052134892582e-03 +528 546 -6.996835383339674e-03 +528 547 -6.109381318875750e-03 +528 548 -5.371977266379805e-03 +528 549 -4.753493624956895e-03 +528 550 -4.230349322908531e-03 +528 551 -3.784439171232927e-03 +528 552 -3.401691470521394e-03 +528 553 -3.071047067257393e-03 +528 554 -2.783725492315672e-03 +528 555 -2.532689975072680e-03 +528 556 -2.312252367280536e-03 +528 557 -2.117777896667794e-03 +528 558 -1.945462087124853e-03 +528 559 -1.792160480940038e-03 +529 529 3.988394278208170e+01 +529 512 -8.076052134892608e-03 +529 513 -9.403863770832814e-03 +529 514 -1.105916272470029e-02 +529 515 -1.315380302376546e-02 +529 516 -1.585023865775531e-02 +529 517 -1.939104886145119e-02 +529 518 -2.415034675252897e-02 +529 519 -3.072751892616558e-02 +529 520 -4.012781031913018e-02 +529 521 -5.413421453123173e-02 +529 522 -7.613960933881192e-02 +529 523 -1.132183869282775e-01 +529 524 -1.820810586422654e-01 +529 525 -3.301555353436766e-01 +529 526 -7.412185823610228e-01 +529 527 -3.165206906282908e+00 +529 528 -1.502055215899868e+01 +529 530 -1.502055215878367e+01 +529 531 -3.165206906282847e+00 +529 532 -7.412185823610038e-01 +529 533 -3.301555353436757e-01 +529 534 -1.820810586422654e-01 +529 535 -1.132183869282759e-01 +529 536 -7.613960933881167e-02 +529 537 -5.413421453123172e-02 +529 538 -4.012781031912976e-02 +529 539 -3.072751892616542e-02 +529 540 -2.415034675252887e-02 +529 541 -1.939104886145103e-02 +529 542 -1.585023865775525e-02 +529 543 -1.315380302376542e-02 +529 544 -1.105916272470025e-02 +529 545 -9.403863770832799e-03 +529 546 -8.076052134892580e-03 +529 547 -6.996835383339674e-03 +529 548 -6.109381318875750e-03 +529 549 -5.371977266379805e-03 +529 550 -4.753493624956895e-03 +529 551 -4.230349322908531e-03 +529 552 -3.784439171232927e-03 +529 553 -3.401691470521394e-03 +529 554 -3.071047067257393e-03 +529 555 -2.783725492315672e-03 +529 556 -2.532689975072680e-03 +529 557 -2.312252367280536e-03 +529 558 -2.117777896667794e-03 +529 559 -1.945462087124853e-03 +530 530 3.988394278171947e+01 +530 512 -6.996835383339686e-03 +530 513 -8.076052134892582e-03 +530 514 -9.403863770832827e-03 +530 515 -1.105916272470022e-02 +530 516 -1.315380302376546e-02 +530 517 -1.585023865775526e-02 +530 518 -1.939104886145104e-02 +530 519 -2.415034675252897e-02 +530 520 -3.072751892616546e-02 +530 521 -4.012781031912977e-02 +530 522 -5.413421453123174e-02 +530 523 -7.613960933881145e-02 +530 524 -1.132183869282759e-01 +530 525 -1.820810586422648e-01 +530 526 -3.301555353436757e-01 +530 527 -7.412185823610257e-01 +530 528 -3.165206906282872e+00 +530 529 -1.502055215878367e+01 +530 531 -1.502055215863306e+01 +530 532 -3.165206906282836e+00 +530 533 -7.412185823610049e-01 +530 534 -3.301555353436766e-01 +530 535 -1.820810586422648e-01 +530 536 -1.132183869282771e-01 +530 537 -7.613960933881213e-02 +530 538 -5.413421453123174e-02 +530 539 -4.012781031913015e-02 +530 540 -3.072751892616545e-02 +530 541 -2.415034675252896e-02 +530 542 -1.939104886145118e-02 +530 543 -1.585023865775526e-02 +530 544 -1.315380302376550e-02 +530 545 -1.105916272470025e-02 +530 546 -9.403863770832823e-03 +530 547 -8.076052134892592e-03 +530 548 -6.996835383339674e-03 +530 549 -6.109381318875750e-03 +530 550 -5.371977266379805e-03 +530 551 -4.753493624956895e-03 +530 552 -4.230349322908531e-03 +530 553 -3.784439171232927e-03 +530 554 -3.401691470521394e-03 +530 555 -3.071047067257393e-03 +530 556 -2.783725492315672e-03 +530 557 -2.532689975072680e-03 +530 558 -2.312252367280536e-03 +530 559 -2.117777896667794e-03 +531 531 3.988394278146362e+01 +531 512 -6.109381318875759e-03 +531 513 -6.996835383339674e-03 +531 514 -8.076052134892592e-03 +531 515 -9.403863770832811e-03 +531 516 -1.105916272470028e-02 +531 517 -1.315380302376551e-02 +531 518 -1.585023865775526e-02 +531 519 -1.939104886145118e-02 +531 520 -2.415034675252906e-02 +531 521 -3.072751892616543e-02 +531 522 -4.012781031913015e-02 +531 523 -5.413421453123170e-02 +531 524 -7.613960933881188e-02 +531 525 -1.132183869282771e-01 +531 526 -1.820810586422654e-01 +531 527 -3.301555353436766e-01 +531 528 -7.412185823610187e-01 +531 529 -3.165206906282847e+00 +531 530 -1.502055215863306e+01 +531 532 -1.502055215852569e+01 +531 533 -3.165206906282820e+00 +531 534 -7.412185823610112e-01 +531 535 -3.301555353436757e-01 +531 536 -1.820810586422654e-01 +531 537 -1.132183869282766e-01 +531 538 -7.613960933881124e-02 +531 539 -5.413421453123170e-02 +531 540 -4.012781031912977e-02 +531 541 -3.072751892616529e-02 +531 542 -2.415034675252896e-02 +531 543 -1.939104886145104e-02 +531 544 -1.585023865775526e-02 +531 545 -1.315380302376542e-02 +531 546 -1.105916272470022e-02 +531 547 -9.403863770832811e-03 +531 548 -8.076052134892582e-03 +531 549 -6.996835383339674e-03 +531 550 -6.109381318875750e-03 +531 551 -5.371977266379805e-03 +531 552 -4.753493624956895e-03 +531 553 -4.230349322908531e-03 +531 554 -3.784439171232927e-03 +531 555 -3.401691470521394e-03 +531 556 -3.071047067257393e-03 +531 557 -2.783725492315672e-03 +531 558 -2.532689975072680e-03 +531 559 -2.312252367280536e-03 +532 532 3.988394278128103e+01 +532 512 -5.371977266379814e-03 +532 513 -6.109381318875750e-03 +532 514 -6.996835383339674e-03 +532 515 -8.076052134892582e-03 +532 516 -9.403863770832827e-03 +532 517 -1.105916272470026e-02 +532 518 -1.315380302376542e-02 +532 519 -1.585023865775526e-02 +532 520 -1.939104886145111e-02 +532 521 -2.415034675252887e-02 +532 522 -3.072751892616545e-02 +532 523 -4.012781031912977e-02 +532 524 -5.413421453123174e-02 +532 525 -7.613960933881167e-02 +532 526 -1.132183869282763e-01 +532 527 -1.820810586422655e-01 +532 528 -3.301555353436775e-01 +532 529 -7.412185823610038e-01 +532 530 -3.165206906282836e+00 +532 531 -1.502055215852569e+01 +532 533 -1.502055215844909e+01 +532 534 -3.165206906282860e+00 +532 535 -7.412185823610103e-01 +532 536 -3.301555353436766e-01 +532 537 -1.820810586422655e-01 +532 538 -1.132183869282759e-01 +532 539 -7.613960933881189e-02 +532 540 -5.413421453123174e-02 +532 541 -4.012781031912995e-02 +532 542 -3.072751892616557e-02 +532 543 -2.415034675252897e-02 +532 544 -1.939104886145118e-02 +532 545 -1.585023865775526e-02 +532 546 -1.315380302376546e-02 +532 547 -1.105916272470028e-02 +532 548 -9.403863770832827e-03 +532 549 -8.076052134892592e-03 +532 550 -6.996835383339674e-03 +532 551 -6.109381318875750e-03 +532 552 -5.371977266379805e-03 +532 553 -4.753493624956895e-03 +532 554 -4.230349322908531e-03 +532 555 -3.784439171232927e-03 +532 556 -3.401691470521394e-03 +532 557 -3.071047067257393e-03 +532 558 -2.783725492315672e-03 +532 559 -2.532689975072680e-03 +533 533 3.988394278115148e+01 +533 512 -4.753493624956902e-03 +533 513 -5.371977266379805e-03 +533 514 -6.109381318875750e-03 +533 515 -6.996835383339674e-03 +533 516 -8.076052134892592e-03 +533 517 -9.403863770832825e-03 +533 518 -1.105916272470022e-02 +533 519 -1.315380302376546e-02 +533 520 -1.585023865775526e-02 +533 521 -1.939104886145103e-02 +533 522 -2.415034675252896e-02 +533 523 -3.072751892616529e-02 +533 524 -4.012781031912995e-02 +533 525 -5.413421453123171e-02 +533 526 -7.613960933881099e-02 +533 527 -1.132183869282753e-01 +533 528 -1.820810586422655e-01 +533 529 -3.301555353436757e-01 +533 530 -7.412185823610049e-01 +533 531 -3.165206906282820e+00 +533 532 -1.502055215844909e+01 +533 534 -1.502055215839538e+01 +533 535 -3.165206906282877e+00 +533 536 -7.412185823610353e-01 +533 537 -3.301555353436775e-01 +533 538 -1.820810586422659e-01 +533 539 -1.132183869282775e-01 +533 540 -7.613960933881167e-02 +533 541 -5.413421453123171e-02 +533 542 -4.012781031913016e-02 +533 543 -3.072751892616546e-02 +533 544 -2.415034675252906e-02 +533 545 -1.939104886145111e-02 +533 546 -1.585023865775526e-02 +533 547 -1.315380302376551e-02 +533 548 -1.105916272470026e-02 +533 549 -9.403863770832825e-03 +533 550 -8.076052134892592e-03 +533 551 -6.996835383339674e-03 +533 552 -6.109381318875750e-03 +533 553 -5.371977266379805e-03 +533 554 -4.753493624956895e-03 +533 555 -4.230349322908531e-03 +533 556 -3.784439171232927e-03 +533 557 -3.401691470521394e-03 +533 558 -3.071047067257393e-03 +533 559 -2.783725492315672e-03 +534 534 3.988394278106480e+01 +534 512 -4.230349322908538e-03 +534 513 -4.753493624956895e-03 +534 514 -5.371977266379805e-03 +534 515 -6.109381318875750e-03 +534 516 -6.996835383339674e-03 +534 517 -8.076052134892592e-03 +534 518 -9.403863770832811e-03 +534 519 -1.105916272470028e-02 +534 520 -1.315380302376551e-02 +534 521 -1.585023865775526e-02 +534 522 -1.939104886145118e-02 +534 523 -2.415034675252896e-02 +534 524 -3.072751892616557e-02 +534 525 -4.012781031913016e-02 +534 526 -5.413421453123170e-02 +534 527 -7.613960933881189e-02 +534 528 -1.132183869282775e-01 +534 529 -1.820810586422654e-01 +534 530 -3.301555353436766e-01 +534 531 -7.412185823610112e-01 +534 532 -3.165206906282860e+00 +534 533 -1.502055215839538e+01 +534 535 -1.502055215836221e+01 +534 536 -3.165206906282940e+00 +534 537 -7.412185823610429e-01 +534 538 -3.301555353436757e-01 +534 539 -1.820810586422654e-01 +534 540 -1.132183869282763e-01 +534 541 -7.613960933881099e-02 +534 542 -5.413421453123170e-02 +534 543 -4.012781031912977e-02 +534 544 -3.072751892616543e-02 +534 545 -2.415034675252887e-02 +534 546 -1.939104886145103e-02 +534 547 -1.585023865775526e-02 +534 548 -1.315380302376542e-02 +534 549 -1.105916272470022e-02 +534 550 -9.403863770832811e-03 +534 551 -8.076052134892582e-03 +534 552 -6.996835383339674e-03 +534 553 -6.109381318875750e-03 +534 554 -5.371977266379805e-03 +534 555 -4.753493624956895e-03 +534 556 -4.230349322908531e-03 +534 557 -3.784439171232927e-03 +534 558 -3.401691470521394e-03 +534 559 -3.071047067257393e-03 +535 535 3.988394278102314e+01 +535 512 -3.784439171232932e-03 +535 513 -4.230349322908531e-03 +535 514 -4.753493624956895e-03 +535 515 -5.371977266379805e-03 +535 516 -6.109381318875750e-03 +535 517 -6.996835383339674e-03 +535 518 -8.076052134892582e-03 +535 519 -9.403863770832827e-03 +535 520 -1.105916272470026e-02 +535 521 -1.315380302376542e-02 +535 522 -1.585023865775526e-02 +535 523 -1.939104886145104e-02 +535 524 -2.415034675252897e-02 +535 525 -3.072751892616546e-02 +535 526 -4.012781031912977e-02 +535 527 -5.413421453123174e-02 +535 528 -7.613960933881145e-02 +535 529 -1.132183869282759e-01 +535 530 -1.820810586422648e-01 +535 531 -3.301555353436757e-01 +535 532 -7.412185823610103e-01 +535 533 -3.165206906282877e+00 +535 534 -1.502055215836221e+01 +535 536 -1.502055215835498e+01 +535 537 -3.165206906282898e+00 +535 538 -7.412185823610133e-01 +535 539 -3.301555353436766e-01 +535 540 -1.820810586422659e-01 +535 541 -1.132183869282759e-01 +535 542 -7.613960933881209e-02 +535 543 -5.413421453123174e-02 +535 544 -4.012781031913015e-02 +535 545 -3.072751892616545e-02 +535 546 -2.415034675252896e-02 +535 547 -1.939104886145118e-02 +535 548 -1.585023865775526e-02 +535 549 -1.315380302376546e-02 +535 550 -1.105916272470028e-02 +535 551 -9.403863770832840e-03 +535 552 -8.076052134892582e-03 +535 553 -6.996835383339674e-03 +535 554 -6.109381318875750e-03 +535 555 -5.371977266379805e-03 +535 556 -4.753493624956895e-03 +535 557 -4.230349322908531e-03 +535 558 -3.784439171232927e-03 +535 559 -3.401691470521394e-03 +536 536 3.988394278105621e+01 +536 512 -3.401691470521398e-03 +536 513 -3.784439171232927e-03 +536 514 -4.230349322908531e-03 +536 515 -4.753493624956895e-03 +536 516 -5.371977266379805e-03 +536 517 -6.109381318875750e-03 +536 518 -6.996835383339674e-03 +536 519 -8.076052134892592e-03 +536 520 -9.403863770832839e-03 +536 521 -1.105916272470025e-02 +536 522 -1.315380302376550e-02 +536 523 -1.585023865775526e-02 +536 524 -1.939104886145118e-02 +536 525 -2.415034675252906e-02 +536 526 -3.072751892616543e-02 +536 527 -4.012781031913015e-02 +536 528 -5.413421453123170e-02 +536 529 -7.613960933881167e-02 +536 530 -1.132183869282771e-01 +536 531 -1.820810586422654e-01 +536 532 -3.301555353436766e-01 +536 533 -7.412185823610353e-01 +536 534 -3.165206906282940e+00 +536 535 -1.502055215835498e+01 +536 537 -1.502055215840043e+01 +536 538 -3.165206906282837e+00 +536 539 -7.412185823610030e-01 +536 540 -3.301555353436766e-01 +536 541 -1.820810586422639e-01 +536 542 -1.132183869282765e-01 +536 543 -7.613960933881124e-02 +536 544 -5.413421453123170e-02 +536 545 -4.012781031912977e-02 +536 546 -3.072751892616529e-02 +536 547 -2.415034675252896e-02 +536 548 -1.939104886145104e-02 +536 549 -1.585023865775520e-02 +536 550 -1.315380302376546e-02 +536 551 -1.105916272470025e-02 +536 552 -9.403863770832771e-03 +536 553 -8.076052134892580e-03 +536 554 -6.996835383339674e-03 +536 555 -6.109381318875750e-03 +536 556 -5.371977266379805e-03 +536 557 -4.753493624956895e-03 +536 558 -4.230349322908531e-03 +536 559 -3.784439171232927e-03 +537 537 3.988394278128559e+01 +537 512 -3.071047067257396e-03 +537 513 -3.401691470521394e-03 +537 514 -3.784439171232927e-03 +537 515 -4.230349322908531e-03 +537 516 -4.753493624956895e-03 +537 517 -5.371977266379805e-03 +537 518 -6.109381318875750e-03 +537 519 -6.996835383339674e-03 +537 520 -8.076052134892594e-03 +537 521 -9.403863770832814e-03 +537 522 -1.105916272470029e-02 +537 523 -1.315380302376546e-02 +537 524 -1.585023865775531e-02 +537 525 -1.939104886145119e-02 +537 526 -2.415034675252897e-02 +537 527 -3.072751892616558e-02 +537 528 -4.012781031912997e-02 +537 529 -5.413421453123172e-02 +537 530 -7.613960933881213e-02 +537 531 -1.132183869282766e-01 +537 532 -1.820810586422655e-01 +537 533 -3.301555353436775e-01 +537 534 -7.412185823610429e-01 +537 535 -3.165206906282898e+00 +537 536 -1.502055215840043e+01 +537 538 -1.502055215860532e+01 +537 539 -3.165206906282823e+00 +537 540 -7.412185823610045e-01 +537 541 -3.301555353436757e-01 +537 542 -1.820810586422654e-01 +537 543 -1.132183869282762e-01 +537 544 -7.613960933881146e-02 +537 545 -5.413421453123141e-02 +537 546 -4.012781031912974e-02 +537 547 -3.072751892616542e-02 +537 548 -2.415034675252887e-02 +537 549 -1.939104886145103e-02 +537 550 -1.585023865775525e-02 +537 551 -1.315380302376546e-02 +537 552 -1.105916272470018e-02 +537 553 -9.403863770832795e-03 +537 554 -8.076052134892580e-03 +537 555 -6.996835383339674e-03 +537 556 -6.109381318875750e-03 +537 557 -5.371977266379805e-03 +537 558 -4.753493624956895e-03 +537 559 -4.230349322908531e-03 +538 538 3.988394278152487e+01 +538 512 -2.783725492315676e-03 +538 513 -3.071047067257393e-03 +538 514 -3.401691470521394e-03 +538 515 -3.784439171232927e-03 +538 516 -4.230349322908531e-03 +538 517 -4.753493624956895e-03 +538 518 -5.371977266379805e-03 +538 519 -6.109381318875750e-03 +538 520 -6.996835383339674e-03 +538 521 -8.076052134892582e-03 +538 522 -9.403863770832827e-03 +538 523 -1.105916272470022e-02 +538 524 -1.315380302376546e-02 +538 525 -1.585023865775526e-02 +538 526 -1.939104886145104e-02 +538 527 -2.415034675252897e-02 +538 528 -3.072751892616531e-02 +538 529 -4.012781031912976e-02 +538 530 -5.413421453123174e-02 +538 531 -7.613960933881124e-02 +538 532 -1.132183869282759e-01 +538 533 -1.820810586422659e-01 +538 534 -3.301555353436757e-01 +538 535 -7.412185823610133e-01 +538 536 -3.165206906282837e+00 +538 537 -1.502055215860532e+01 +538 539 -1.502055215859217e+01 +538 540 -3.165206906282856e+00 +538 541 -7.412185823610250e-01 +538 542 -3.301555353436766e-01 +538 543 -1.820810586422659e-01 +538 544 -1.132183869282762e-01 +538 545 -7.613960933881163e-02 +538 546 -5.413421453123170e-02 +538 547 -4.012781031913015e-02 +538 548 -3.072751892616545e-02 +538 549 -2.415034675252896e-02 +538 550 -1.939104886145118e-02 +538 551 -1.585023865775531e-02 +538 552 -1.315380302376542e-02 +538 553 -1.105916272470025e-02 +538 554 -9.403863770832823e-03 +538 555 -8.076052134892592e-03 +538 556 -6.996835383339674e-03 +538 557 -6.109381318875750e-03 +538 558 -5.371977266379805e-03 +538 559 -4.753493624956895e-03 +539 539 3.988394278151357e+01 +539 512 -2.532689975072682e-03 +539 513 -2.783725492315672e-03 +539 514 -3.071047067257393e-03 +539 515 -3.401691470521394e-03 +539 516 -3.784439171232927e-03 +539 517 -4.230349322908531e-03 +539 518 -4.753493624956895e-03 +539 519 -5.371977266379805e-03 +539 520 -6.109381318875750e-03 +539 521 -6.996835383339674e-03 +539 522 -8.076052134892592e-03 +539 523 -9.403863770832811e-03 +539 524 -1.105916272470028e-02 +539 525 -1.315380302376551e-02 +539 526 -1.585023865775526e-02 +539 527 -1.939104886145118e-02 +539 528 -2.415034675252896e-02 +539 529 -3.072751892616542e-02 +539 530 -4.012781031913015e-02 +539 531 -5.413421453123170e-02 +539 532 -7.613960933881189e-02 +539 533 -1.132183869282775e-01 +539 534 -1.820810586422654e-01 +539 535 -3.301555353436766e-01 +539 536 -7.412185823610030e-01 +539 537 -3.165206906282823e+00 +539 538 -1.502055215859217e+01 +539 540 -1.502055215859656e+01 +539 541 -3.165206906282924e+00 +539 542 -7.412185823610424e-01 +539 543 -3.301555353436766e-01 +539 544 -1.820810586422639e-01 +539 545 -1.132183869282762e-01 +539 546 -7.613960933881121e-02 +539 547 -5.413421453123170e-02 +539 548 -4.012781031912977e-02 +539 549 -3.072751892616529e-02 +539 550 -2.415034675252896e-02 +539 551 -1.939104886145111e-02 +539 552 -1.585023865775514e-02 +539 553 -1.315380302376542e-02 +539 554 -1.105916272470022e-02 +539 555 -9.403863770832811e-03 +539 556 -8.076052134892582e-03 +539 557 -6.996835383339674e-03 +539 558 -6.109381318875750e-03 +539 559 -5.371977266379805e-03 +540 540 3.988394278151448e+01 +540 512 -2.312252367280538e-03 +540 513 -2.532689975072680e-03 +540 514 -2.783725492315672e-03 +540 515 -3.071047067257393e-03 +540 516 -3.401691470521394e-03 +540 517 -3.784439171232927e-03 +540 518 -4.230349322908531e-03 +540 519 -4.753493624956895e-03 +540 520 -5.371977266379805e-03 +540 521 -6.109381318875750e-03 +540 522 -6.996835383339674e-03 +540 523 -8.076052134892582e-03 +540 524 -9.403863770832827e-03 +540 525 -1.105916272470026e-02 +540 526 -1.315380302376542e-02 +540 527 -1.585023865775526e-02 +540 528 -1.939104886145104e-02 +540 529 -2.415034675252887e-02 +540 530 -3.072751892616545e-02 +540 531 -4.012781031912977e-02 +540 532 -5.413421453123174e-02 +540 533 -7.613960933881167e-02 +540 534 -1.132183869282763e-01 +540 535 -1.820810586422659e-01 +540 536 -3.301555353436766e-01 +540 537 -7.412185823610045e-01 +540 538 -3.165206906282856e+00 +540 539 -1.502055215859656e+01 +540 541 -1.502055215858805e+01 +540 542 -3.165206906282897e+00 +540 543 -7.412185823610271e-01 +540 544 -3.301555353436757e-01 +540 545 -1.820810586422655e-01 +540 546 -1.132183869282763e-01 +540 547 -7.613960933881168e-02 +540 548 -5.413421453123174e-02 +540 549 -4.012781031912995e-02 +540 550 -3.072751892616557e-02 +540 551 -2.415034675252906e-02 +540 552 -1.939104886145103e-02 +540 553 -1.585023865775526e-02 +540 554 -1.315380302376546e-02 +540 555 -1.105916272470028e-02 +540 556 -9.403863770832840e-03 +540 557 -8.076052134892582e-03 +540 558 -6.996835383339674e-03 +540 559 -6.109381318875750e-03 +541 541 3.988394278153937e+01 +541 512 -2.117777896667796e-03 +541 513 -2.312252367280536e-03 +541 514 -2.532689975072680e-03 +541 515 -2.783725492315672e-03 +541 516 -3.071047067257393e-03 +541 517 -3.401691470521394e-03 +541 518 -3.784439171232927e-03 +541 519 -4.230349322908531e-03 +541 520 -4.753493624956895e-03 +541 521 -5.371977266379805e-03 +541 522 -6.109381318875750e-03 +541 523 -6.996835383339674e-03 +541 524 -8.076052134892592e-03 +541 525 -9.403863770832825e-03 +541 526 -1.105916272470022e-02 +541 527 -1.315380302376546e-02 +541 528 -1.585023865775520e-02 +541 529 -1.939104886145103e-02 +541 530 -2.415034675252896e-02 +541 531 -3.072751892616529e-02 +541 532 -4.012781031912995e-02 +541 533 -5.413421453123171e-02 +541 534 -7.613960933881099e-02 +541 535 -1.132183869282759e-01 +541 536 -1.820810586422639e-01 +541 537 -3.301555353436757e-01 +541 538 -7.412185823610250e-01 +541 539 -3.165206906282924e+00 +541 540 -1.502055215858805e+01 +541 542 -1.502055215864000e+01 +541 543 -3.165206906282876e+00 +541 544 -7.412185823610112e-01 +541 545 -3.301555353436775e-01 +541 546 -1.820810586422670e-01 +541 547 -1.132183869282766e-01 +541 548 -7.613960933881164e-02 +541 549 -5.413421453123171e-02 +541 550 -4.012781031913016e-02 +541 551 -3.072751892616558e-02 +541 552 -2.415034675252888e-02 +541 553 -1.939104886145111e-02 +541 554 -1.585023865775526e-02 +541 555 -1.315380302376551e-02 +541 556 -1.105916272470029e-02 +541 557 -9.403863770832799e-03 +541 558 -8.076052134892580e-03 +541 559 -6.996835383339674e-03 +542 542 3.988394278164020e+01 +542 512 -1.945462087124855e-03 +542 513 -2.117777896667794e-03 +542 514 -2.312252367280536e-03 +542 515 -2.532689975072680e-03 +542 516 -2.783725492315672e-03 +542 517 -3.071047067257393e-03 +542 518 -3.401691470521394e-03 +542 519 -3.784439171232927e-03 +542 520 -4.230349322908531e-03 +542 521 -4.753493624956895e-03 +542 522 -5.371977266379805e-03 +542 523 -6.109381318875750e-03 +542 524 -6.996835383339674e-03 +542 525 -8.076052134892592e-03 +542 526 -9.403863770832811e-03 +542 527 -1.105916272470028e-02 +542 528 -1.315380302376546e-02 +542 529 -1.585023865775525e-02 +542 530 -1.939104886145118e-02 +542 531 -2.415034675252896e-02 +542 532 -3.072751892616557e-02 +542 533 -4.012781031913016e-02 +542 534 -5.413421453123170e-02 +542 535 -7.613960933881209e-02 +542 536 -1.132183869282765e-01 +542 537 -1.820810586422654e-01 +542 538 -3.301555353436766e-01 +542 539 -7.412185823610424e-01 +542 540 -3.165206906282897e+00 +542 541 -1.502055215864000e+01 +542 543 -1.502055215866000e+01 +542 544 -3.165206906282837e+00 +542 545 -7.412185823610125e-01 +542 546 -3.301555353436766e-01 +542 547 -1.820810586422639e-01 +542 548 -1.132183869282758e-01 +542 549 -7.613960933881120e-02 +542 550 -5.413421453123170e-02 +542 551 -4.012781031912996e-02 +542 552 -3.072751892616516e-02 +542 553 -2.415034675252886e-02 +542 554 -1.939104886145103e-02 +542 555 -1.585023865775526e-02 +542 556 -1.315380302376546e-02 +542 557 -1.105916272470018e-02 +542 558 -9.403863770832768e-03 +542 559 -8.076052134892580e-03 +543 543 3.988394278169706e+01 +543 512 -1.792160480940040e-03 +543 513 -1.945462087124853e-03 +543 514 -2.117777896667794e-03 +543 515 -2.312252367280536e-03 +543 516 -2.532689975072680e-03 +543 517 -2.783725492315672e-03 +543 518 -3.071047067257393e-03 +543 519 -3.401691470521394e-03 +543 520 -3.784439171232927e-03 +543 521 -4.230349322908531e-03 +543 522 -4.753493624956895e-03 +543 523 -5.371977266379805e-03 +543 524 -6.109381318875750e-03 +543 525 -6.996835383339674e-03 +543 526 -8.076052134892582e-03 +543 527 -9.403863770832827e-03 +543 528 -1.105916272470022e-02 +543 529 -1.315380302376542e-02 +543 530 -1.585023865775526e-02 +543 531 -1.939104886145104e-02 +543 532 -2.415034675252897e-02 +543 533 -3.072751892616546e-02 +543 534 -4.012781031912977e-02 +543 535 -5.413421453123174e-02 +543 536 -7.613960933881124e-02 +543 537 -1.132183869282762e-01 +543 538 -1.820810586422659e-01 +543 539 -3.301555353436766e-01 +543 540 -7.412185823610271e-01 +543 541 -3.165206906282876e+00 +543 542 -1.502055215866000e+01 +543 544 -1.502055215931059e+01 +543 545 -3.165206906282839e+00 +543 546 -7.412185823610246e-01 +543 547 -3.301555353436757e-01 +543 548 -1.820810586422643e-01 +543 549 -1.132183869282762e-01 +543 550 -7.613960933881191e-02 +543 551 -5.413421453123202e-02 +543 552 -4.012781031912976e-02 +543 553 -3.072751892616543e-02 +543 554 -2.415034675252896e-02 +543 555 -1.939104886145118e-02 +543 556 -1.585023865775531e-02 +543 557 -1.315380302376542e-02 +543 558 -1.105916272470022e-02 +543 559 -9.403863770832823e-03 +544 544 3.988394278169714e+01 +544 528 -9.403863770832811e-03 +544 529 -1.105916272470025e-02 +544 530 -1.315380302376550e-02 +544 531 -1.585023865775526e-02 +544 532 -1.939104886145118e-02 +544 533 -2.415034675252906e-02 +544 534 -3.072751892616543e-02 +544 535 -4.012781031913015e-02 +544 536 -5.413421453123170e-02 +544 537 -7.613960933881146e-02 +544 538 -1.132183869282762e-01 +544 539 -1.820810586422639e-01 +544 540 -3.301555353436757e-01 +544 541 -7.412185823610112e-01 +544 542 -3.165206906282837e+00 +544 543 -1.502055215931059e+01 +544 545 -1.502055215866001e+01 +544 546 -3.165206906282889e+00 +544 547 -7.412185823610321e-01 +544 548 -3.301555353436766e-01 +544 549 -1.820810586422670e-01 +544 550 -1.132183869282775e-01 +544 551 -7.613960933881170e-02 +544 552 -5.413421453123111e-02 +544 553 -4.012781031912974e-02 +544 554 -3.072751892616529e-02 +544 555 -2.415034675252896e-02 +544 556 -1.939104886145111e-02 +544 557 -1.585023865775514e-02 +544 558 -1.315380302376537e-02 +544 559 -1.105916272470022e-02 +544 560 -9.403863770832811e-03 +544 561 -8.076052134892582e-03 +544 562 -6.996835383339674e-03 +544 563 -6.109381318875750e-03 +544 564 -5.371977266379805e-03 +544 565 -4.753493624956895e-03 +544 566 -4.230349322908531e-03 +544 567 -3.784439171232927e-03 +544 568 -3.401691470521394e-03 +544 569 -3.071047067257393e-03 +544 570 -2.783725492315672e-03 +544 571 -2.532689975072680e-03 +544 572 -2.312252367280536e-03 +544 573 -2.117777896667794e-03 +544 574 -1.945462087124853e-03 +544 575 -1.792160480940038e-03 +545 545 3.988394278164014e+01 +545 528 -8.076052134892582e-03 +545 529 -9.403863770832799e-03 +545 530 -1.105916272470025e-02 +545 531 -1.315380302376542e-02 +545 532 -1.585023865775526e-02 +545 533 -1.939104886145111e-02 +545 534 -2.415034675252887e-02 +545 535 -3.072751892616545e-02 +545 536 -4.012781031912977e-02 +545 537 -5.413421453123141e-02 +545 538 -7.613960933881163e-02 +545 539 -1.132183869282762e-01 +545 540 -1.820810586422655e-01 +545 541 -3.301555353436775e-01 +545 542 -7.412185823610125e-01 +545 543 -3.165206906282839e+00 +545 544 -1.502055215866001e+01 +545 546 -1.502055215863994e+01 +545 547 -3.165206906282882e+00 +545 548 -7.412185823610302e-01 +545 549 -3.301555353436766e-01 +545 550 -1.820810586422654e-01 +545 551 -1.132183869282756e-01 +545 552 -7.613960933881121e-02 +545 553 -5.413421453123170e-02 +545 554 -4.012781031912995e-02 +545 555 -3.072751892616557e-02 +545 556 -2.415034675252906e-02 +545 557 -1.939104886145103e-02 +545 558 -1.585023865775519e-02 +545 559 -1.315380302376546e-02 +545 560 -1.105916272470028e-02 +545 561 -9.403863770832840e-03 +545 562 -8.076052134892594e-03 +545 563 -6.996835383339674e-03 +545 564 -6.109381318875750e-03 +545 565 -5.371977266379805e-03 +545 566 -4.753493624956895e-03 +545 567 -4.230349322908531e-03 +545 568 -3.784439171232927e-03 +545 569 -3.401691470521394e-03 +545 570 -3.071047067257393e-03 +545 571 -2.783725492315672e-03 +545 572 -2.532689975072680e-03 +545 573 -2.312252367280536e-03 +545 574 -2.117777896667794e-03 +545 575 -1.945462087124853e-03 +546 546 3.988394278153930e+01 +546 528 -6.996835383339674e-03 +546 529 -8.076052134892580e-03 +546 530 -9.403863770832823e-03 +546 531 -1.105916272470022e-02 +546 532 -1.315380302376546e-02 +546 533 -1.585023865775526e-02 +546 534 -1.939104886145103e-02 +546 535 -2.415034675252896e-02 +546 536 -3.072751892616529e-02 +546 537 -4.012781031912974e-02 +546 538 -5.413421453123170e-02 +546 539 -7.613960933881121e-02 +546 540 -1.132183869282763e-01 +546 541 -1.820810586422670e-01 +546 542 -3.301555353436766e-01 +546 543 -7.412185823610246e-01 +546 544 -3.165206906282889e+00 +546 545 -1.502055215863994e+01 +546 547 -1.502055215858803e+01 +546 548 -3.165206906282890e+00 +546 549 -7.412185823610266e-01 +546 550 -3.301555353436766e-01 +546 551 -1.820810586422639e-01 +546 552 -1.132183869282762e-01 +546 553 -7.613960933881145e-02 +546 554 -5.413421453123171e-02 +546 555 -4.012781031913016e-02 +546 556 -3.072751892616558e-02 +546 557 -2.415034675252887e-02 +546 558 -1.939104886145103e-02 +546 559 -1.585023865775526e-02 +546 560 -1.315380302376551e-02 +546 561 -1.105916272470029e-02 +546 562 -9.403863770832840e-03 +546 563 -8.076052134892582e-03 +546 564 -6.996835383339674e-03 +546 565 -6.109381318875750e-03 +546 566 -5.371977266379805e-03 +546 567 -4.753493624956895e-03 +546 568 -4.230349322908531e-03 +546 569 -3.784439171232927e-03 +546 570 -3.401691470521394e-03 +546 571 -3.071047067257393e-03 +546 572 -2.783725492315672e-03 +546 573 -2.532689975072680e-03 +546 574 -2.312252367280536e-03 +546 575 -2.117777896667794e-03 +547 547 3.988394278151440e+01 +547 528 -6.109381318875750e-03 +547 529 -6.996835383339674e-03 +547 530 -8.076052134892592e-03 +547 531 -9.403863770832811e-03 +547 532 -1.105916272470028e-02 +547 533 -1.315380302376551e-02 +547 534 -1.585023865775526e-02 +547 535 -1.939104886145118e-02 +547 536 -2.415034675252896e-02 +547 537 -3.072751892616542e-02 +547 538 -4.012781031913015e-02 +547 539 -5.413421453123170e-02 +547 540 -7.613960933881168e-02 +547 541 -1.132183869282766e-01 +547 542 -1.820810586422639e-01 +547 543 -3.301555353436757e-01 +547 544 -7.412185823610321e-01 +547 545 -3.165206906282882e+00 +547 546 -1.502055215858803e+01 +547 548 -1.502055215859651e+01 +547 549 -3.165206906282848e+00 +547 550 -7.412185823610083e-01 +547 551 -3.301555353436766e-01 +547 552 -1.820810586422670e-01 +547 553 -1.132183869282772e-01 +547 554 -7.613960933881120e-02 +547 555 -5.413421453123170e-02 +547 556 -4.012781031912996e-02 +547 557 -3.072751892616516e-02 +547 558 -2.415034675252876e-02 +547 559 -1.939104886145103e-02 +547 560 -1.585023865775526e-02 +547 561 -1.315380302376546e-02 +547 562 -1.105916272470025e-02 +547 563 -9.403863770832771e-03 +547 564 -8.076052134892580e-03 +547 565 -6.996835383339674e-03 +547 566 -6.109381318875750e-03 +547 567 -5.371977266379805e-03 +547 568 -4.753493624956895e-03 +547 569 -4.230349322908531e-03 +547 570 -3.784439171232927e-03 +547 571 -3.401691470521394e-03 +547 572 -3.071047067257393e-03 +547 573 -2.783725492315672e-03 +547 574 -2.532689975072680e-03 +547 575 -2.312252367280536e-03 +548 548 3.988394278151353e+01 +548 528 -5.371977266379805e-03 +548 529 -6.109381318875750e-03 +548 530 -6.996835383339674e-03 +548 531 -8.076052134892582e-03 +548 532 -9.403863770832827e-03 +548 533 -1.105916272470026e-02 +548 534 -1.315380302376542e-02 +548 535 -1.585023865775526e-02 +548 536 -1.939104886145104e-02 +548 537 -2.415034675252887e-02 +548 538 -3.072751892616545e-02 +548 539 -4.012781031912977e-02 +548 540 -5.413421453123174e-02 +548 541 -7.613960933881164e-02 +548 542 -1.132183869282758e-01 +548 543 -1.820810586422643e-01 +548 544 -3.301555353436766e-01 +548 545 -7.412185823610302e-01 +548 546 -3.165206906282890e+00 +548 547 -1.502055215859651e+01 +548 549 -1.502055215859221e+01 +548 550 -3.165206906282837e+00 +548 551 -7.412185823610133e-01 +548 552 -3.301555353436766e-01 +548 553 -1.820810586422659e-01 +548 554 -1.132183869282759e-01 +548 555 -7.613960933881209e-02 +548 556 -5.413421453123202e-02 +548 557 -4.012781031912975e-02 +548 558 -3.072751892616529e-02 +548 559 -2.415034675252896e-02 +548 560 -1.939104886145118e-02 +548 561 -1.585023865775531e-02 +548 562 -1.315380302376550e-02 +548 563 -1.105916272470022e-02 +548 564 -9.403863770832823e-03 +548 565 -8.076052134892592e-03 +548 566 -6.996835383339674e-03 +548 567 -6.109381318875750e-03 +548 568 -5.371977266379805e-03 +548 569 -4.753493624956895e-03 +548 570 -4.230349322908531e-03 +548 571 -3.784439171232927e-03 +548 572 -3.401691470521394e-03 +548 573 -3.071047067257393e-03 +548 574 -2.783725492315672e-03 +548 575 -2.532689975072680e-03 +549 549 3.988394278152492e+01 +549 528 -4.753493624956895e-03 +549 529 -5.371977266379805e-03 +549 530 -6.109381318875750e-03 +549 531 -6.996835383339674e-03 +549 532 -8.076052134892592e-03 +549 533 -9.403863770832825e-03 +549 534 -1.105916272470022e-02 +549 535 -1.315380302376546e-02 +549 536 -1.585023865775520e-02 +549 537 -1.939104886145103e-02 +549 538 -2.415034675252896e-02 +549 539 -3.072751892616529e-02 +549 540 -4.012781031912995e-02 +549 541 -5.413421453123171e-02 +549 542 -7.613960933881120e-02 +549 543 -1.132183869282762e-01 +549 544 -1.820810586422670e-01 +549 545 -3.301555353436766e-01 +549 546 -7.412185823610266e-01 +549 547 -3.165206906282848e+00 +549 548 -1.502055215859221e+01 +549 550 -1.502055215860529e+01 +549 551 -3.165206906282872e+00 +549 552 -7.412185823610251e-01 +549 553 -3.301555353436766e-01 +549 554 -1.820810586422639e-01 +549 555 -1.132183869282765e-01 +549 556 -7.613960933881192e-02 +549 557 -5.413421453123142e-02 +549 558 -4.012781031912975e-02 +549 559 -3.072751892616544e-02 +549 560 -2.415034675252906e-02 +549 561 -1.939104886145119e-02 +549 562 -1.585023865775531e-02 +549 563 -1.315380302376542e-02 +549 564 -1.105916272470025e-02 +549 565 -9.403863770832839e-03 +549 566 -8.076052134892594e-03 +549 567 -6.996835383339674e-03 +549 568 -6.109381318875750e-03 +549 569 -5.371977266379805e-03 +549 570 -4.753493624956895e-03 +549 571 -4.230349322908531e-03 +549 572 -3.784439171232927e-03 +549 573 -3.401691470521394e-03 +549 574 -3.071047067257393e-03 +549 575 -2.783725492315672e-03 +550 550 3.988394278128563e+01 +550 528 -4.230349322908531e-03 +550 529 -4.753493624956895e-03 +550 530 -5.371977266379805e-03 +550 531 -6.109381318875750e-03 +550 532 -6.996835383339674e-03 +550 533 -8.076052134892592e-03 +550 534 -9.403863770832811e-03 +550 535 -1.105916272470028e-02 +550 536 -1.315380302376546e-02 +550 537 -1.585023865775525e-02 +550 538 -1.939104886145118e-02 +550 539 -2.415034675252896e-02 +550 540 -3.072751892616557e-02 +550 541 -4.012781031913016e-02 +550 542 -5.413421453123170e-02 +550 543 -7.613960933881191e-02 +550 544 -1.132183869282775e-01 +550 545 -1.820810586422654e-01 +550 546 -3.301555353436766e-01 +550 547 -7.412185823610083e-01 +550 548 -3.165206906282837e+00 +550 549 -1.502055215860529e+01 +550 551 -1.502055215840052e+01 +550 552 -3.165206906282888e+00 +550 553 -7.412185823610269e-01 +550 554 -3.301555353436757e-01 +550 555 -1.820810586422655e-01 +550 556 -1.132183869282766e-01 +550 557 -7.613960933881080e-02 +550 558 -5.413421453123107e-02 +550 559 -4.012781031912974e-02 +550 560 -3.072751892616543e-02 +550 561 -2.415034675252897e-02 +550 562 -1.939104886145111e-02 +550 563 -1.585023865775514e-02 +550 564 -1.315380302376542e-02 +550 565 -1.105916272470025e-02 +550 566 -9.403863770832814e-03 +550 567 -8.076052134892582e-03 +550 568 -6.996835383339674e-03 +550 569 -6.109381318875750e-03 +550 570 -5.371977266379805e-03 +550 571 -4.753493624956895e-03 +550 572 -4.230349322908531e-03 +550 573 -3.784439171232927e-03 +550 574 -3.401691470521394e-03 +550 575 -3.071047067257393e-03 +551 551 3.988394278105616e+01 +551 528 -3.784439171232927e-03 +551 529 -4.230349322908531e-03 +551 530 -4.753493624956895e-03 +551 531 -5.371977266379805e-03 +551 532 -6.109381318875750e-03 +551 533 -6.996835383339674e-03 +551 534 -8.076052134892582e-03 +551 535 -9.403863770832840e-03 +551 536 -1.105916272470025e-02 +551 537 -1.315380302376546e-02 +551 538 -1.585023865775531e-02 +551 539 -1.939104886145111e-02 +551 540 -2.415034675252906e-02 +551 541 -3.072751892616558e-02 +551 542 -4.012781031912996e-02 +551 543 -5.413421453123202e-02 +551 544 -7.613960933881170e-02 +551 545 -1.132183869282756e-01 +551 546 -1.820810586422639e-01 +551 547 -3.301555353436766e-01 +551 548 -7.412185823610133e-01 +551 549 -3.165206906282872e+00 +551 550 -1.502055215840052e+01 +551 552 -1.502055215835487e+01 +551 553 -3.165206906282878e+00 +551 554 -7.412185823610271e-01 +551 555 -3.301555353436775e-01 +551 556 -1.820810586422670e-01 +551 557 -1.132183869282762e-01 +551 558 -7.613960933881120e-02 +551 559 -5.413421453123141e-02 +551 560 -4.012781031912996e-02 +551 561 -3.072751892616545e-02 +551 562 -2.415034675252897e-02 +551 563 -1.939104886145097e-02 +551 564 -1.585023865775520e-02 +551 565 -1.315380302376546e-02 +551 566 -1.105916272470026e-02 +551 567 -9.403863770832816e-03 +551 568 -8.076052134892570e-03 +551 569 -6.996835383339674e-03 +551 570 -6.109381318875750e-03 +551 571 -5.371977266379805e-03 +551 572 -4.753493624956895e-03 +551 573 -4.230349322908531e-03 +551 574 -3.784439171232927e-03 +551 575 -3.401691470521394e-03 +552 552 3.988394278102307e+01 +552 528 -3.401691470521394e-03 +552 529 -3.784439171232927e-03 +552 530 -4.230349322908531e-03 +552 531 -4.753493624956895e-03 +552 532 -5.371977266379805e-03 +552 533 -6.109381318875750e-03 +552 534 -6.996835383339674e-03 +552 535 -8.076052134892582e-03 +552 536 -9.403863770832771e-03 +552 537 -1.105916272470018e-02 +552 538 -1.315380302376542e-02 +552 539 -1.585023865775514e-02 +552 540 -1.939104886145103e-02 +552 541 -2.415034675252888e-02 +552 542 -3.072751892616516e-02 +552 543 -4.012781031912976e-02 +552 544 -5.413421453123111e-02 +552 545 -7.613960933881121e-02 +552 546 -1.132183869282762e-01 +552 547 -1.820810586422670e-01 +552 548 -3.301555353436766e-01 +552 549 -7.412185823610251e-01 +552 550 -3.165206906282888e+00 +552 551 -1.502055215835487e+01 +552 553 -1.502055215836223e+01 +552 554 -3.165206906282889e+00 +552 555 -7.412185823610191e-01 +552 556 -3.301555353436766e-01 +552 557 -1.820810586422639e-01 +552 558 -1.132183869282762e-01 +552 559 -7.613960933881188e-02 +552 560 -5.413421453123230e-02 +552 561 -4.012781031913037e-02 +552 562 -3.072751892616572e-02 +552 563 -2.415034675252897e-02 +552 564 -1.939104886145118e-02 +552 565 -1.585023865775536e-02 +552 566 -1.315380302376555e-02 +552 567 -1.105916272470032e-02 +552 568 -9.403863770832813e-03 +552 569 -8.076052134892592e-03 +552 570 -6.996835383339674e-03 +552 571 -6.109381318875750e-03 +552 572 -5.371977266379805e-03 +552 573 -4.753493624956895e-03 +552 574 -4.230349322908531e-03 +552 575 -3.784439171232927e-03 +553 553 3.988394278106477e+01 +553 528 -3.071047067257393e-03 +553 529 -3.401691470521394e-03 +553 530 -3.784439171232927e-03 +553 531 -4.230349322908531e-03 +553 532 -4.753493624956895e-03 +553 533 -5.371977266379805e-03 +553 534 -6.109381318875750e-03 +553 535 -6.996835383339674e-03 +553 536 -8.076052134892580e-03 +553 537 -9.403863770832795e-03 +553 538 -1.105916272470025e-02 +553 539 -1.315380302376542e-02 +553 540 -1.585023865775526e-02 +553 541 -1.939104886145111e-02 +553 542 -2.415034675252886e-02 +553 543 -3.072751892616543e-02 +553 544 -4.012781031912974e-02 +553 545 -5.413421453123170e-02 +553 546 -7.613960933881145e-02 +553 547 -1.132183869282772e-01 +553 548 -1.820810586422659e-01 +553 549 -3.301555353436766e-01 +553 550 -7.412185823610269e-01 +553 551 -3.165206906282878e+00 +553 552 -1.502055215836223e+01 +553 554 -1.502055215839543e+01 +553 555 -3.165206906282839e+00 +553 556 -7.412185823610071e-01 +553 557 -3.301555353436757e-01 +553 558 -1.820810586422643e-01 +553 559 -1.132183869282762e-01 +553 560 -7.613960933881192e-02 +553 561 -5.413421453123205e-02 +553 562 -4.012781031913017e-02 +553 563 -3.072751892616531e-02 +553 564 -2.415034675252897e-02 +553 565 -1.939104886145118e-02 +553 566 -1.585023865775532e-02 +553 567 -1.315380302376550e-02 +553 568 -1.105916272470022e-02 +553 569 -9.403863770832825e-03 +553 570 -8.076052134892592e-03 +553 571 -6.996835383339674e-03 +553 572 -6.109381318875750e-03 +553 573 -5.371977266379805e-03 +553 574 -4.753493624956895e-03 +553 575 -4.230349322908531e-03 +554 554 3.988394278115146e+01 +554 528 -2.783725492315672e-03 +554 529 -3.071047067257393e-03 +554 530 -3.401691470521394e-03 +554 531 -3.784439171232927e-03 +554 532 -4.230349322908531e-03 +554 533 -4.753493624956895e-03 +554 534 -5.371977266379805e-03 +554 535 -6.109381318875750e-03 +554 536 -6.996835383339674e-03 +554 537 -8.076052134892580e-03 +554 538 -9.403863770832823e-03 +554 539 -1.105916272470022e-02 +554 540 -1.315380302376546e-02 +554 541 -1.585023865775526e-02 +554 542 -1.939104886145103e-02 +554 543 -2.415034675252896e-02 +554 544 -3.072751892616529e-02 +554 545 -4.012781031912995e-02 +554 546 -5.413421453123171e-02 +554 547 -7.613960933881120e-02 +554 548 -1.132183869282759e-01 +554 549 -1.820810586422639e-01 +554 550 -3.301555353436757e-01 +554 551 -7.412185823610271e-01 +554 552 -3.165206906282889e+00 +554 553 -1.502055215839543e+01 +554 555 -1.502055215844899e+01 +554 556 -3.165206906282840e+00 +554 557 -7.412185823610117e-01 +554 558 -3.301555353436766e-01 +554 559 -1.820810586422670e-01 +554 560 -1.132183869282775e-01 +554 561 -7.613960933881193e-02 +554 562 -5.413421453123204e-02 +554 563 -4.012781031912978e-02 +554 564 -3.072751892616544e-02 +554 565 -2.415034675252906e-02 +554 566 -1.939104886145119e-02 +554 567 -1.585023865775531e-02 +554 568 -1.315380302376542e-02 +554 569 -1.105916272470025e-02 +554 570 -9.403863770832825e-03 +554 571 -8.076052134892592e-03 +554 572 -6.996835383339674e-03 +554 573 -6.109381318875750e-03 +554 574 -5.371977266379805e-03 +554 575 -4.753493624956895e-03 +555 555 3.988394278128109e+01 +555 528 -2.532689975072680e-03 +555 529 -2.783725492315672e-03 +555 530 -3.071047067257393e-03 +555 531 -3.401691470521394e-03 +555 532 -3.784439171232927e-03 +555 533 -4.230349322908531e-03 +555 534 -4.753493624956895e-03 +555 535 -5.371977266379805e-03 +555 536 -6.109381318875750e-03 +555 537 -6.996835383339674e-03 +555 538 -8.076052134892592e-03 +555 539 -9.403863770832811e-03 +555 540 -1.105916272470028e-02 +555 541 -1.315380302376551e-02 +555 542 -1.585023865775526e-02 +555 543 -1.939104886145118e-02 +555 544 -2.415034675252896e-02 +555 545 -3.072751892616557e-02 +555 546 -4.012781031913016e-02 +555 547 -5.413421453123170e-02 +555 548 -7.613960933881209e-02 +555 549 -1.132183869282765e-01 +555 550 -1.820810586422655e-01 +555 551 -3.301555353436775e-01 +555 552 -7.412185823610191e-01 +555 553 -3.165206906282839e+00 +555 554 -1.502055215844899e+01 +555 556 -1.502055215852580e+01 +555 557 -3.165206906282872e+00 +555 558 -7.412185823610292e-01 +555 559 -3.301555353436766e-01 +555 560 -1.820810586422654e-01 +555 561 -1.132183869282756e-01 +555 562 -7.613960933881170e-02 +555 563 -5.413421453123111e-02 +555 564 -4.012781031912974e-02 +555 565 -3.072751892616543e-02 +555 566 -2.415034675252897e-02 +555 567 -1.939104886145111e-02 +555 568 -1.585023865775514e-02 +555 569 -1.315380302376542e-02 +555 570 -1.105916272470022e-02 +555 571 -9.403863770832811e-03 +555 572 -8.076052134892582e-03 +555 573 -6.996835383339674e-03 +555 574 -6.109381318875750e-03 +555 575 -5.371977266379805e-03 +556 556 3.988394278146372e+01 +556 528 -2.312252367280536e-03 +556 529 -2.532689975072680e-03 +556 530 -2.783725492315672e-03 +556 531 -3.071047067257393e-03 +556 532 -3.401691470521394e-03 +556 533 -3.784439171232927e-03 +556 534 -4.230349322908531e-03 +556 535 -4.753493624956895e-03 +556 536 -5.371977266379805e-03 +556 537 -6.109381318875750e-03 +556 538 -6.996835383339674e-03 +556 539 -8.076052134892582e-03 +556 540 -9.403863770832840e-03 +556 541 -1.105916272470029e-02 +556 542 -1.315380302376546e-02 +556 543 -1.585023865775531e-02 +556 544 -1.939104886145111e-02 +556 545 -2.415034675252906e-02 +556 546 -3.072751892616558e-02 +556 547 -4.012781031912996e-02 +556 548 -5.413421453123202e-02 +556 549 -7.613960933881192e-02 +556 550 -1.132183869282766e-01 +556 551 -1.820810586422670e-01 +556 552 -3.301555353436766e-01 +556 553 -7.412185823610071e-01 +556 554 -3.165206906282840e+00 +556 555 -1.502055215852580e+01 +556 557 -1.502055215863296e+01 +556 558 -3.165206906282908e+00 +556 559 -7.412185823610311e-01 +556 560 -3.301555353436766e-01 +556 561 -1.820810586422639e-01 +556 562 -1.132183869282765e-01 +556 563 -7.613960933881106e-02 +556 564 -5.413421453123141e-02 +556 565 -4.012781031912996e-02 +556 566 -3.072751892616545e-02 +556 567 -2.415034675252897e-02 +556 568 -1.939104886145097e-02 +556 569 -1.585023865775520e-02 +556 570 -1.315380302376542e-02 +556 571 -1.105916272470025e-02 +556 572 -9.403863770832816e-03 +556 573 -8.076052134892570e-03 +556 574 -6.996835383339674e-03 +556 575 -6.109381318875750e-03 +557 557 3.988394278171960e+01 +557 528 -2.117777896667794e-03 +557 529 -2.312252367280536e-03 +557 530 -2.532689975072680e-03 +557 531 -2.783725492315672e-03 +557 532 -3.071047067257393e-03 +557 533 -3.401691470521394e-03 +557 534 -3.784439171232927e-03 +557 535 -4.230349322908531e-03 +557 536 -4.753493624956895e-03 +557 537 -5.371977266379805e-03 +557 538 -6.109381318875750e-03 +557 539 -6.996835383339674e-03 +557 540 -8.076052134892582e-03 +557 541 -9.403863770832799e-03 +557 542 -1.105916272470018e-02 +557 543 -1.315380302376542e-02 +557 544 -1.585023865775514e-02 +557 545 -1.939104886145103e-02 +557 546 -2.415034675252887e-02 +557 547 -3.072751892616516e-02 +557 548 -4.012781031912975e-02 +557 549 -5.413421453123142e-02 +557 550 -7.613960933881080e-02 +557 551 -1.132183869282762e-01 +557 552 -1.820810586422639e-01 +557 553 -3.301555353436757e-01 +557 554 -7.412185823610117e-01 +557 555 -3.165206906282872e+00 +557 556 -1.502055215863296e+01 +557 558 -1.502055215878381e+01 +557 559 -3.165206906282908e+00 +557 560 -7.412185823610291e-01 +557 561 -3.301555353436766e-01 +557 562 -1.820810586422670e-01 +557 563 -1.132183869282780e-01 +557 564 -7.613960933881207e-02 +557 565 -5.413421453123234e-02 +557 566 -4.012781031913039e-02 +557 567 -3.072751892616573e-02 +557 568 -2.415034675252898e-02 +557 569 -1.939104886145118e-02 +557 570 -1.585023865775531e-02 +557 571 -1.315380302376555e-02 +557 572 -1.105916272470032e-02 +557 573 -9.403863770832814e-03 +557 574 -8.076052134892592e-03 +557 575 -6.996835383339674e-03 +558 558 3.988394278208176e+01 +558 528 -1.945462087124853e-03 +558 529 -2.117777896667794e-03 +558 530 -2.312252367280536e-03 +558 531 -2.532689975072680e-03 +558 532 -2.783725492315672e-03 +558 533 -3.071047067257393e-03 +558 534 -3.401691470521394e-03 +558 535 -3.784439171232927e-03 +558 536 -4.230349322908531e-03 +558 537 -4.753493624956895e-03 +558 538 -5.371977266379805e-03 +558 539 -6.109381318875750e-03 +558 540 -6.996835383339674e-03 +558 541 -8.076052134892580e-03 +558 542 -9.403863770832768e-03 +558 543 -1.105916272470022e-02 +558 544 -1.315380302376537e-02 +558 545 -1.585023865775519e-02 +558 546 -1.939104886145103e-02 +558 547 -2.415034675252876e-02 +558 548 -3.072751892616529e-02 +558 549 -4.012781031912975e-02 +558 550 -5.413421453123107e-02 +558 551 -7.613960933881120e-02 +558 552 -1.132183869282762e-01 +558 553 -1.820810586422643e-01 +558 554 -3.301555353436766e-01 +558 555 -7.412185823610292e-01 +558 556 -3.165206906282908e+00 +558 557 -1.502055215878381e+01 +558 559 -1.502055215899856e+01 +558 560 -3.165206906282871e+00 +558 561 -7.412185823610091e-01 +558 562 -3.301555353436766e-01 +558 563 -1.820810586422675e-01 +558 564 -1.132183869282767e-01 +558 565 -7.613960933881259e-02 +558 566 -5.413421453123236e-02 +558 567 -4.012781031913037e-02 +558 568 -3.072751892616545e-02 +558 569 -2.415034675252906e-02 +558 570 -1.939104886145118e-02 +558 571 -1.585023865775537e-02 +558 572 -1.315380302376555e-02 +558 573 -1.105916272470025e-02 +558 574 -9.403863770832839e-03 +558 575 -8.076052134892592e-03 +559 559 3.988394278260306e+01 +559 528 -1.792160480940038e-03 +559 529 -1.945462087124853e-03 +559 530 -2.117777896667794e-03 +559 531 -2.312252367280536e-03 +559 532 -2.532689975072680e-03 +559 533 -2.783725492315672e-03 +559 534 -3.071047067257393e-03 +559 535 -3.401691470521394e-03 +559 536 -3.784439171232927e-03 +559 537 -4.230349322908531e-03 +559 538 -4.753493624956895e-03 +559 539 -5.371977266379805e-03 +559 540 -6.109381318875750e-03 +559 541 -6.996835383339674e-03 +559 542 -8.076052134892580e-03 +559 543 -9.403863770832823e-03 +559 544 -1.105916272470022e-02 +559 545 -1.315380302376546e-02 +559 546 -1.585023865775526e-02 +559 547 -1.939104886145103e-02 +559 548 -2.415034675252896e-02 +559 549 -3.072751892616544e-02 +559 550 -4.012781031912974e-02 +559 551 -5.413421453123141e-02 +559 552 -7.613960933881188e-02 +559 553 -1.132183869282762e-01 +559 554 -1.820810586422670e-01 +559 555 -3.301555353436766e-01 +559 556 -7.412185823610311e-01 +559 557 -3.165206906282908e+00 +559 558 -1.502055215899856e+01 +559 560 -1.502055215931070e+01 +559 561 -3.165206906282836e+00 +559 562 -7.412185823610047e-01 +559 563 -3.301555353436779e-01 +559 564 -1.820810586422643e-01 +559 565 -1.132183869282765e-01 +559 566 -7.613960933881193e-02 +559 567 -5.413421453123204e-02 +559 568 -4.012781031912978e-02 +559 569 -3.072751892616544e-02 +559 570 -2.415034675252897e-02 +559 571 -1.939104886145118e-02 +559 572 -1.585023865775531e-02 +559 573 -1.315380302376542e-02 +559 574 -1.105916272470025e-02 +559 575 -9.403863770832825e-03 +560 560 3.988394278260300e+01 +560 544 -9.403863770832811e-03 +560 545 -1.105916272470028e-02 +560 546 -1.315380302376551e-02 +560 547 -1.585023865775526e-02 +560 548 -1.939104886145118e-02 +560 549 -2.415034675252906e-02 +560 550 -3.072751892616543e-02 +560 551 -4.012781031912996e-02 +560 552 -5.413421453123230e-02 +560 553 -7.613960933881192e-02 +560 554 -1.132183869282775e-01 +560 555 -1.820810586422654e-01 +560 556 -3.301555353436766e-01 +560 557 -7.412185823610291e-01 +560 558 -3.165206906282871e+00 +560 559 -1.502055215931070e+01 +560 561 -1.502055215899852e+01 +560 562 -3.165206906282829e+00 +560 563 -7.412185823610287e-01 +560 564 -3.301555353436757e-01 +560 565 -1.820810586422655e-01 +560 566 -1.132183869282766e-01 +560 567 -7.613960933881150e-02 +560 568 -5.413421453123111e-02 +560 569 -4.012781031912974e-02 +560 570 -3.072751892616529e-02 +560 571 -2.415034675252896e-02 +560 572 -1.939104886145111e-02 +560 573 -1.585023865775514e-02 +560 574 -1.315380302376542e-02 +560 575 -1.105916272470022e-02 +560 576 -9.403863770832811e-03 +560 577 -8.076052134892582e-03 +560 578 -6.996835383339674e-03 +560 579 -6.109381318875750e-03 +560 580 -5.371977266379822e-03 +560 581 -4.753493624956882e-03 +560 582 -4.230349322908531e-03 +560 583 -3.784439171232926e-03 +560 584 -3.401691470521383e-03 +560 585 -3.071047067257393e-03 +560 586 -2.783725492315672e-03 +560 587 -2.532689975072685e-03 +560 588 -2.312252367280531e-03 +560 589 -2.117777896667794e-03 +560 590 -1.945462087124853e-03 +560 591 -1.792160480940034e-03 +561 561 3.988394278208163e+01 +561 544 -8.076052134892582e-03 +561 545 -9.403863770832840e-03 +561 546 -1.105916272470029e-02 +561 547 -1.315380302376546e-02 +561 548 -1.585023865775531e-02 +561 549 -1.939104886145119e-02 +561 550 -2.415034675252897e-02 +561 551 -3.072751892616545e-02 +561 552 -4.012781031913037e-02 +561 553 -5.413421453123205e-02 +561 554 -7.613960933881193e-02 +561 555 -1.132183869282756e-01 +561 556 -1.820810586422639e-01 +561 557 -3.301555353436766e-01 +561 558 -7.412185823610091e-01 +561 559 -3.165206906282836e+00 +561 560 -1.502055215899852e+01 +561 562 -1.502055215878377e+01 +561 563 -3.165206906282905e+00 +561 564 -7.412185823610218e-01 +561 565 -3.301555353436775e-01 +561 566 -1.820810586422670e-01 +561 567 -1.132183869282770e-01 +561 568 -7.613960933881135e-02 +561 569 -5.413421453123138e-02 +561 570 -4.012781031912974e-02 +561 571 -3.072751892616542e-02 +561 572 -2.415034675252896e-02 +561 573 -1.939104886145096e-02 +561 574 -1.585023865775520e-02 +561 575 -1.315380302376542e-02 +561 576 -1.105916272470025e-02 +561 577 -9.403863770832813e-03 +561 578 -8.076052134892570e-03 +561 579 -6.996835383339674e-03 +561 580 -6.109381318875769e-03 +561 581 -5.371977266379790e-03 +561 582 -4.753493624956895e-03 +561 583 -4.230349322908531e-03 +561 584 -3.784439171232915e-03 +561 585 -3.401691470521394e-03 +561 586 -3.071047067257393e-03 +561 587 -2.783725492315679e-03 +561 588 -2.532689975072674e-03 +561 589 -2.312252367280536e-03 +561 590 -2.117777896667793e-03 +561 591 -1.945462087124849e-03 +562 562 3.988394278171949e+01 +562 544 -6.996835383339674e-03 +562 545 -8.076052134892594e-03 +562 546 -9.403863770832840e-03 +562 547 -1.105916272470025e-02 +562 548 -1.315380302376550e-02 +562 549 -1.585023865775531e-02 +562 550 -1.939104886145111e-02 +562 551 -2.415034675252897e-02 +562 552 -3.072751892616572e-02 +562 553 -4.012781031913017e-02 +562 554 -5.413421453123204e-02 +562 555 -7.613960933881170e-02 +562 556 -1.132183869282765e-01 +562 557 -1.820810586422670e-01 +562 558 -3.301555353436766e-01 +562 559 -7.412185823610047e-01 +562 560 -3.165206906282829e+00 +562 561 -1.502055215878377e+01 +562 563 -1.502055215863302e+01 +562 564 -3.165206906282847e+00 +562 565 -7.412185823610126e-01 +562 566 -3.301555353436766e-01 +562 567 -1.820810586422655e-01 +562 568 -1.132183869282763e-01 +562 569 -7.613960933881120e-02 +562 570 -5.413421453123141e-02 +562 571 -4.012781031912996e-02 +562 572 -3.072751892616545e-02 +562 573 -2.415034675252878e-02 +562 574 -1.939104886145103e-02 +562 575 -1.585023865775520e-02 +562 576 -1.315380302376546e-02 +562 577 -1.105916272470026e-02 +562 578 -9.403863770832771e-03 +562 579 -8.076052134892570e-03 +562 580 -6.996835383339698e-03 +562 581 -6.109381318875730e-03 +562 582 -5.371977266379805e-03 +562 583 -4.753493624956894e-03 +562 584 -4.230349322908517e-03 +562 585 -3.784439171232927e-03 +562 586 -3.401691470521394e-03 +562 587 -3.071047067257401e-03 +562 588 -2.783725492315666e-03 +562 589 -2.532689975072680e-03 +562 590 -2.312252367280536e-03 +562 591 -2.117777896667789e-03 +563 563 3.988394278146365e+01 +563 544 -6.109381318875750e-03 +563 545 -6.996835383339674e-03 +563 546 -8.076052134892582e-03 +563 547 -9.403863770832771e-03 +563 548 -1.105916272470022e-02 +563 549 -1.315380302376542e-02 +563 550 -1.585023865775514e-02 +563 551 -1.939104886145097e-02 +563 552 -2.415034675252897e-02 +563 553 -3.072751892616531e-02 +563 554 -4.012781031912978e-02 +563 555 -5.413421453123111e-02 +563 556 -7.613960933881106e-02 +563 557 -1.132183869282780e-01 +563 558 -1.820810586422675e-01 +563 559 -3.301555353436779e-01 +563 560 -7.412185823610287e-01 +563 561 -3.165206906282905e+00 +563 562 -1.502055215863302e+01 +563 564 -1.502055215852566e+01 +563 565 -3.165206906282835e+00 +563 566 -7.412185823610218e-01 +563 567 -3.301555353436770e-01 +563 568 -1.820810586422638e-01 +563 569 -1.132183869282754e-01 +563 570 -7.613960933881153e-02 +563 571 -5.413421453123230e-02 +563 572 -4.012781031913035e-02 +563 573 -3.072751892616544e-02 +563 574 -2.415034675252906e-02 +563 575 -1.939104886145118e-02 +563 576 -1.585023865775536e-02 +563 577 -1.315380302376555e-02 +563 578 -1.105916272470025e-02 +563 579 -9.403863770832811e-03 +563 580 -8.076052134892622e-03 +563 581 -6.996835383339651e-03 +563 582 -6.109381318875750e-03 +563 583 -5.371977266379804e-03 +563 584 -4.753493624956879e-03 +563 585 -4.230349322908531e-03 +563 586 -3.784439171232927e-03 +563 587 -3.401691470521402e-03 +563 588 -3.071047067257385e-03 +563 589 -2.783725492315672e-03 +563 590 -2.532689975072679e-03 +563 591 -2.312252367280530e-03 +564 564 3.988394278128104e+01 +564 544 -5.371977266379805e-03 +564 545 -6.109381318875750e-03 +564 546 -6.996835383339674e-03 +564 547 -8.076052134892580e-03 +564 548 -9.403863770832823e-03 +564 549 -1.105916272470025e-02 +564 550 -1.315380302376542e-02 +564 551 -1.585023865775520e-02 +564 552 -1.939104886145118e-02 +564 553 -2.415034675252897e-02 +564 554 -3.072751892616544e-02 +564 555 -4.012781031912974e-02 +564 556 -5.413421453123141e-02 +564 557 -7.613960933881207e-02 +564 558 -1.132183869282767e-01 +564 559 -1.820810586422643e-01 +564 560 -3.301555353436757e-01 +564 561 -7.412185823610218e-01 +564 562 -3.165206906282847e+00 +564 563 -1.502055215852566e+01 +564 565 -1.502055215844910e+01 +564 566 -3.165206906282871e+00 +564 567 -7.412185823610133e-01 +564 568 -3.301555353436764e-01 +564 569 -1.820810586422666e-01 +564 570 -1.132183869282771e-01 +564 571 -7.613960933881191e-02 +564 572 -5.413421453123204e-02 +564 573 -4.012781031912978e-02 +564 574 -3.072751892616544e-02 +564 575 -2.415034675252897e-02 +564 576 -1.939104886145118e-02 +564 577 -1.585023865775531e-02 +564 578 -1.315380302376542e-02 +564 579 -1.105916272470022e-02 +564 580 -9.403863770832840e-03 +564 581 -8.076052134892578e-03 +564 582 -6.996835383339674e-03 +564 583 -6.109381318875747e-03 +564 584 -5.371977266379786e-03 +564 585 -4.753493624956895e-03 +564 586 -4.230349322908531e-03 +564 587 -3.784439171232937e-03 +564 588 -3.401691470521385e-03 +564 589 -3.071047067257393e-03 +564 590 -2.783725492315671e-03 +564 591 -2.532689975072673e-03 +565 565 3.988394278115147e+01 +565 544 -4.753493624956895e-03 +565 545 -5.371977266379805e-03 +565 546 -6.109381318875750e-03 +565 547 -6.996835383339674e-03 +565 548 -8.076052134892592e-03 +565 549 -9.403863770832839e-03 +565 550 -1.105916272470025e-02 +565 551 -1.315380302376546e-02 +565 552 -1.585023865775536e-02 +565 553 -1.939104886145118e-02 +565 554 -2.415034675252906e-02 +565 555 -3.072751892616543e-02 +565 556 -4.012781031912996e-02 +565 557 -5.413421453123234e-02 +565 558 -7.613960933881259e-02 +565 559 -1.132183869282765e-01 +565 560 -1.820810586422655e-01 +565 561 -3.301555353436775e-01 +565 562 -7.412185823610126e-01 +565 563 -3.165206906282835e+00 +565 564 -1.502055215844910e+01 +565 566 -1.502055215839538e+01 +565 567 -3.165206906282847e+00 +565 568 -7.412185823610147e-01 +565 569 -3.301555353436766e-01 +565 570 -1.820810586422654e-01 +565 571 -1.132183869282761e-01 +565 572 -7.613960933881185e-02 +565 573 -5.413421453123111e-02 +565 574 -4.012781031912974e-02 +565 575 -3.072751892616529e-02 +565 576 -2.415034675252896e-02 +565 577 -1.939104886145111e-02 +565 578 -1.585023865775514e-02 +565 579 -1.315380302376537e-02 +565 580 -1.105916272470022e-02 +565 581 -9.403863770832811e-03 +565 582 -8.076052134892582e-03 +565 583 -6.996835383339671e-03 +565 584 -6.109381318875727e-03 +565 585 -5.371977266379805e-03 +565 586 -4.753493624956895e-03 +565 587 -4.230349322908543e-03 +565 588 -3.784439171232917e-03 +565 589 -3.401691470521394e-03 +565 590 -3.071047067257392e-03 +565 591 -2.783725492315665e-03 +566 566 3.988394278106474e+01 +566 544 -4.230349322908531e-03 +566 545 -4.753493624956895e-03 +566 546 -5.371977266379805e-03 +566 547 -6.109381318875750e-03 +566 548 -6.996835383339674e-03 +566 549 -8.076052134892594e-03 +566 550 -9.403863770832814e-03 +566 551 -1.105916272470026e-02 +566 552 -1.315380302376555e-02 +566 553 -1.585023865775532e-02 +566 554 -1.939104886145119e-02 +566 555 -2.415034675252897e-02 +566 556 -3.072751892616545e-02 +566 557 -4.012781031913039e-02 +566 558 -5.413421453123236e-02 +566 559 -7.613960933881193e-02 +566 560 -1.132183869282766e-01 +566 561 -1.820810586422670e-01 +566 562 -3.301555353436766e-01 +566 563 -7.412185823610218e-01 +566 564 -3.165206906282871e+00 +566 565 -1.502055215839538e+01 +566 567 -1.502055215836222e+01 +566 568 -3.165206906282855e+00 +566 569 -7.412185823610213e-01 +566 570 -3.301555353436766e-01 +566 571 -1.820810586422655e-01 +566 572 -1.132183869282770e-01 +566 573 -7.613960933881102e-02 +566 574 -5.413421453123138e-02 +566 575 -4.012781031912974e-02 +566 576 -3.072751892616542e-02 +566 577 -2.415034675252896e-02 +566 578 -1.939104886145095e-02 +566 579 -1.585023865775514e-02 +566 580 -1.315380302376542e-02 +566 581 -1.105916272470025e-02 +566 582 -9.403863770832814e-03 +566 583 -8.076052134892578e-03 +566 584 -6.996835383339646e-03 +566 585 -6.109381318875750e-03 +566 586 -5.371977266379805e-03 +566 587 -4.753493624956908e-03 +566 588 -4.230349322908521e-03 +566 589 -3.784439171232927e-03 +566 590 -3.401691470521392e-03 +566 591 -3.071047067257384e-03 +567 567 3.988394278102300e+01 +567 544 -3.784439171232927e-03 +567 545 -4.230349322908531e-03 +567 546 -4.753493624956895e-03 +567 547 -5.371977266379805e-03 +567 548 -6.109381318875750e-03 +567 549 -6.996835383339674e-03 +567 550 -8.076052134892582e-03 +567 551 -9.403863770832816e-03 +567 552 -1.105916272470032e-02 +567 553 -1.315380302376550e-02 +567 554 -1.585023865775531e-02 +567 555 -1.939104886145111e-02 +567 556 -2.415034675252897e-02 +567 557 -3.072751892616573e-02 +567 558 -4.012781031913037e-02 +567 559 -5.413421453123204e-02 +567 560 -7.613960933881150e-02 +567 561 -1.132183869282770e-01 +567 562 -1.820810586422655e-01 +567 563 -3.301555353436770e-01 +567 564 -7.412185823610133e-01 +567 565 -3.165206906282847e+00 +567 566 -1.502055215836222e+01 +567 568 -1.502055215835488e+01 +567 569 -3.165206906282870e+00 +567 570 -7.412185823610216e-01 +567 571 -3.301555353436779e-01 +567 572 -1.820810586422665e-01 +567 573 -1.132183869282761e-01 +567 574 -7.613960933881084e-02 +567 575 -5.413421453123141e-02 +567 576 -4.012781031912996e-02 +567 577 -3.072751892616545e-02 +567 578 -2.415034675252877e-02 +567 579 -1.939104886145096e-02 +567 580 -1.585023865775520e-02 +567 581 -1.315380302376546e-02 +567 582 -1.105916272470026e-02 +567 583 -9.403863770832813e-03 +567 584 -8.076052134892556e-03 +567 585 -6.996835383339674e-03 +567 586 -6.109381318875750e-03 +567 587 -5.371977266379822e-03 +567 588 -4.753493624956882e-03 +567 589 -4.230349322908531e-03 +567 590 -3.784439171232926e-03 +567 591 -3.401691470521383e-03 +568 568 3.988394278105616e+01 +568 544 -3.401691470521394e-03 +568 545 -3.784439171232927e-03 +568 546 -4.230349322908531e-03 +568 547 -4.753493624956895e-03 +568 548 -5.371977266379805e-03 +568 549 -6.109381318875750e-03 +568 550 -6.996835383339674e-03 +568 551 -8.076052134892570e-03 +568 552 -9.403863770832813e-03 +568 553 -1.105916272470022e-02 +568 554 -1.315380302376542e-02 +568 555 -1.585023865775514e-02 +568 556 -1.939104886145097e-02 +568 557 -2.415034675252898e-02 +568 558 -3.072751892616545e-02 +568 559 -4.012781031912978e-02 +568 560 -5.413421453123111e-02 +568 561 -7.613960933881135e-02 +568 562 -1.132183869282763e-01 +568 563 -1.820810586422638e-01 +568 564 -3.301555353436764e-01 +568 565 -7.412185823610147e-01 +568 566 -3.165206906282855e+00 +568 567 -1.502055215835488e+01 +568 569 -1.502055215840048e+01 +568 570 -3.165206906282914e+00 +568 571 -7.412185823610318e-01 +568 572 -3.301555353436764e-01 +568 573 -1.820810586422656e-01 +568 574 -1.132183869282761e-01 +568 575 -7.613960933881209e-02 +568 576 -5.413421453123230e-02 +568 577 -4.012781031913035e-02 +568 578 -3.072751892616543e-02 +568 579 -2.415034675252896e-02 +568 580 -1.939104886145118e-02 +568 581 -1.585023865775536e-02 +568 582 -1.315380302376555e-02 +568 583 -1.105916272470032e-02 +568 584 -9.403863770832813e-03 +568 585 -8.076052134892592e-03 +568 586 -6.996835383339674e-03 +568 587 -6.109381318875769e-03 +568 588 -5.371977266379790e-03 +568 589 -4.753493624956895e-03 +568 590 -4.230349322908531e-03 +568 591 -3.784439171232915e-03 +569 569 3.988394278128568e+01 +569 544 -3.071047067257393e-03 +569 545 -3.401691470521394e-03 +569 546 -3.784439171232927e-03 +569 547 -4.230349322908531e-03 +569 548 -4.753493624956895e-03 +569 549 -5.371977266379805e-03 +569 550 -6.109381318875750e-03 +569 551 -6.996835383339674e-03 +569 552 -8.076052134892592e-03 +569 553 -9.403863770832825e-03 +569 554 -1.105916272470025e-02 +569 555 -1.315380302376542e-02 +569 556 -1.585023865775520e-02 +569 557 -1.939104886145118e-02 +569 558 -2.415034675252906e-02 +569 559 -3.072751892616544e-02 +569 560 -4.012781031912974e-02 +569 561 -5.413421453123138e-02 +569 562 -7.613960933881120e-02 +569 563 -1.132183869282754e-01 +569 564 -1.820810586422666e-01 +569 565 -3.301555353436766e-01 +569 566 -7.412185823610213e-01 +569 567 -3.165206906282870e+00 +569 568 -1.502055215840048e+01 +569 570 -1.502055215860534e+01 +569 571 -3.165206906282886e+00 +569 572 -7.412185823610199e-01 +569 573 -3.301555353436766e-01 +569 574 -1.820810586422639e-01 +569 575 -1.132183869282767e-01 +569 576 -7.613960933881206e-02 +569 577 -5.413421453123204e-02 +569 578 -4.012781031912976e-02 +569 579 -3.072751892616530e-02 +569 580 -2.415034675252897e-02 +569 581 -1.939104886145118e-02 +569 582 -1.585023865775532e-02 +569 583 -1.315380302376550e-02 +569 584 -1.105916272470022e-02 +569 585 -9.403863770832825e-03 +569 586 -8.076052134892592e-03 +569 587 -6.996835383339698e-03 +569 588 -6.109381318875730e-03 +569 589 -5.371977266379805e-03 +569 590 -4.753493624956894e-03 +569 591 -4.230349322908517e-03 +570 570 3.988394278152496e+01 +570 544 -2.783725492315672e-03 +570 545 -3.071047067257393e-03 +570 546 -3.401691470521394e-03 +570 547 -3.784439171232927e-03 +570 548 -4.230349322908531e-03 +570 549 -4.753493624956895e-03 +570 550 -5.371977266379805e-03 +570 551 -6.109381318875750e-03 +570 552 -6.996835383339674e-03 +570 553 -8.076052134892592e-03 +570 554 -9.403863770832825e-03 +570 555 -1.105916272470022e-02 +570 556 -1.315380302376542e-02 +570 557 -1.585023865775531e-02 +570 558 -1.939104886145118e-02 +570 559 -2.415034675252897e-02 +570 560 -3.072751892616529e-02 +570 561 -4.012781031912974e-02 +570 562 -5.413421453123141e-02 +570 563 -7.613960933881153e-02 +570 564 -1.132183869282771e-01 +570 565 -1.820810586422654e-01 +570 566 -3.301555353436766e-01 +570 567 -7.412185823610216e-01 +570 568 -3.165206906282914e+00 +570 569 -1.502055215860534e+01 +570 571 -1.502055215859220e+01 +570 572 -3.165206906282839e+00 +570 573 -7.412185823610018e-01 +570 574 -3.301555353436757e-01 +570 575 -1.820810586422670e-01 +570 576 -1.132183869282771e-01 +570 577 -7.613960933881171e-02 +570 578 -5.413421453123142e-02 +570 579 -4.012781031912975e-02 +570 580 -3.072751892616544e-02 +570 581 -2.415034675252906e-02 +570 582 -1.939104886145119e-02 +570 583 -1.585023865775531e-02 +570 584 -1.315380302376542e-02 +570 585 -1.105916272470025e-02 +570 586 -9.403863770832839e-03 +570 587 -8.076052134892622e-03 +570 588 -6.996835383339651e-03 +570 589 -6.109381318875750e-03 +570 590 -5.371977266379804e-03 +570 591 -4.753493624956879e-03 +571 571 3.988394278151350e+01 +571 544 -2.532689975072680e-03 +571 545 -2.783725492315672e-03 +571 546 -3.071047067257393e-03 +571 547 -3.401691470521394e-03 +571 548 -3.784439171232927e-03 +571 549 -4.230349322908531e-03 +571 550 -4.753493624956895e-03 +571 551 -5.371977266379805e-03 +571 552 -6.109381318875750e-03 +571 553 -6.996835383339674e-03 +571 554 -8.076052134892592e-03 +571 555 -9.403863770832811e-03 +571 556 -1.105916272470025e-02 +571 557 -1.315380302376555e-02 +571 558 -1.585023865775537e-02 +571 559 -1.939104886145118e-02 +571 560 -2.415034675252896e-02 +571 561 -3.072751892616542e-02 +571 562 -4.012781031912996e-02 +571 563 -5.413421453123230e-02 +571 564 -7.613960933881191e-02 +571 565 -1.132183869282761e-01 +571 566 -1.820810586422655e-01 +571 567 -3.301555353436779e-01 +571 568 -7.412185823610318e-01 +571 569 -3.165206906282886e+00 +571 570 -1.502055215859220e+01 +571 572 -1.502055215859653e+01 +571 573 -3.165206906282807e+00 +571 574 -7.412185823610054e-01 +571 575 -3.301555353436788e-01 +571 576 -1.820810586422665e-01 +571 577 -1.132183869282754e-01 +571 578 -7.613960933881082e-02 +571 579 -5.413421453123107e-02 +571 580 -4.012781031912974e-02 +571 581 -3.072751892616543e-02 +571 582 -2.415034675252897e-02 +571 583 -1.939104886145111e-02 +571 584 -1.585023865775514e-02 +571 585 -1.315380302376542e-02 +571 586 -1.105916272470025e-02 +571 587 -9.403863770832832e-03 +571 588 -8.076052134892568e-03 +571 589 -6.996835383339674e-03 +571 590 -6.109381318875747e-03 +571 591 -5.371977266379786e-03 +572 572 3.988394278151432e+01 +572 544 -2.312252367280536e-03 +572 545 -2.532689975072680e-03 +572 546 -2.783725492315672e-03 +572 547 -3.071047067257393e-03 +572 548 -3.401691470521394e-03 +572 549 -3.784439171232927e-03 +572 550 -4.230349322908531e-03 +572 551 -4.753493624956895e-03 +572 552 -5.371977266379805e-03 +572 553 -6.109381318875750e-03 +572 554 -6.996835383339674e-03 +572 555 -8.076052134892582e-03 +572 556 -9.403863770832816e-03 +572 557 -1.105916272470032e-02 +572 558 -1.315380302376555e-02 +572 559 -1.585023865775531e-02 +572 560 -1.939104886145111e-02 +572 561 -2.415034675252896e-02 +572 562 -3.072751892616545e-02 +572 563 -4.012781031913035e-02 +572 564 -5.413421453123204e-02 +572 565 -7.613960933881185e-02 +572 566 -1.132183869282770e-01 +572 567 -1.820810586422665e-01 +572 568 -3.301555353436764e-01 +572 569 -7.412185823610199e-01 +572 570 -3.165206906282839e+00 +572 571 -1.502055215859653e+01 +572 573 -1.502055215858796e+01 +572 574 -3.165206906282860e+00 +572 575 -7.412185823610242e-01 +572 576 -3.301555353436763e-01 +572 577 -1.820810586422635e-01 +572 578 -1.132183869282757e-01 +572 579 -7.613960933881100e-02 +572 580 -5.413421453123141e-02 +572 581 -4.012781031912996e-02 +572 582 -3.072751892616545e-02 +572 583 -2.415034675252897e-02 +572 584 -1.939104886145097e-02 +572 585 -1.585023865775520e-02 +572 586 -1.315380302376546e-02 +572 587 -1.105916272470026e-02 +572 588 -9.403863770832816e-03 +572 589 -8.076052134892570e-03 +572 590 -6.996835383339671e-03 +572 591 -6.109381318875727e-03 +573 573 3.988394278153930e+01 +573 544 -2.117777896667794e-03 +573 545 -2.312252367280536e-03 +573 546 -2.532689975072680e-03 +573 547 -2.783725492315672e-03 +573 548 -3.071047067257393e-03 +573 549 -3.401691470521394e-03 +573 550 -3.784439171232927e-03 +573 551 -4.230349322908531e-03 +573 552 -4.753493624956895e-03 +573 553 -5.371977266379805e-03 +573 554 -6.109381318875750e-03 +573 555 -6.996835383339674e-03 +573 556 -8.076052134892570e-03 +573 557 -9.403863770832814e-03 +573 558 -1.105916272470025e-02 +573 559 -1.315380302376542e-02 +573 560 -1.585023865775514e-02 +573 561 -1.939104886145096e-02 +573 562 -2.415034675252878e-02 +573 563 -3.072751892616544e-02 +573 564 -4.012781031912978e-02 +573 565 -5.413421453123111e-02 +573 566 -7.613960933881102e-02 +573 567 -1.132183869282761e-01 +573 568 -1.820810586422656e-01 +573 569 -3.301555353436766e-01 +573 570 -7.412185823610018e-01 +573 571 -3.165206906282807e+00 +573 572 -1.502055215858796e+01 +573 574 -1.502055215864008e+01 +573 575 -3.165206906282904e+00 +573 576 -7.412185823610414e-01 +573 577 -3.301555353436757e-01 +573 578 -1.820810586422643e-01 +573 579 -1.132183869282765e-01 +573 580 -7.613960933881191e-02 +573 581 -5.413421453123230e-02 +573 582 -4.012781031913037e-02 +573 583 -3.072751892616572e-02 +573 584 -2.415034675252897e-02 +573 585 -1.939104886145118e-02 +573 586 -1.585023865775536e-02 +573 587 -1.315380302376555e-02 +573 588 -1.105916272470032e-02 +573 589 -9.403863770832813e-03 +573 590 -8.076052134892589e-03 +573 591 -6.996835383339646e-03 +574 574 3.988394278164016e+01 +574 544 -1.945462087124853e-03 +574 545 -2.117777896667794e-03 +574 546 -2.312252367280536e-03 +574 547 -2.532689975072680e-03 +574 548 -2.783725492315672e-03 +574 549 -3.071047067257393e-03 +574 550 -3.401691470521394e-03 +574 551 -3.784439171232927e-03 +574 552 -4.230349322908531e-03 +574 553 -4.753493624956895e-03 +574 554 -5.371977266379805e-03 +574 555 -6.109381318875750e-03 +574 556 -6.996835383339674e-03 +574 557 -8.076052134892592e-03 +574 558 -9.403863770832839e-03 +574 559 -1.105916272470025e-02 +574 560 -1.315380302376542e-02 +574 561 -1.585023865775520e-02 +574 562 -1.939104886145103e-02 +574 563 -2.415034675252906e-02 +574 564 -3.072751892616544e-02 +574 565 -4.012781031912974e-02 +574 566 -5.413421453123138e-02 +574 567 -7.613960933881084e-02 +574 568 -1.132183869282761e-01 +574 569 -1.820810586422639e-01 +574 570 -3.301555353436757e-01 +574 571 -7.412185823610054e-01 +574 572 -3.165206906282860e+00 +574 573 -1.502055215864008e+01 +574 575 -1.502055215865993e+01 +574 576 -3.165206906282906e+00 +574 577 -7.412185823610246e-01 +574 578 -3.301555353436766e-01 +574 579 -1.820810586422670e-01 +574 580 -1.132183869282772e-01 +574 581 -7.613960933881191e-02 +574 582 -5.413421453123205e-02 +574 583 -4.012781031913017e-02 +574 584 -3.072751892616531e-02 +574 585 -2.415034675252897e-02 +574 586 -1.939104886145118e-02 +574 587 -1.585023865775532e-02 +574 588 -1.315380302376550e-02 +574 589 -1.105916272470022e-02 +574 590 -9.403863770832821e-03 +574 591 -8.076052134892577e-03 +575 575 3.988394278169706e+01 +575 544 -1.792160480940038e-03 +575 545 -1.945462087124853e-03 +575 546 -2.117777896667794e-03 +575 547 -2.312252367280536e-03 +575 548 -2.532689975072680e-03 +575 549 -2.783725492315672e-03 +575 550 -3.071047067257393e-03 +575 551 -3.401691470521394e-03 +575 552 -3.784439171232927e-03 +575 553 -4.230349322908531e-03 +575 554 -4.753493624956895e-03 +575 555 -5.371977266379805e-03 +575 556 -6.109381318875750e-03 +575 557 -6.996835383339674e-03 +575 558 -8.076052134892592e-03 +575 559 -9.403863770832825e-03 +575 560 -1.105916272470022e-02 +575 561 -1.315380302376542e-02 +575 562 -1.585023865775520e-02 +575 563 -1.939104886145118e-02 +575 564 -2.415034675252897e-02 +575 565 -3.072751892616529e-02 +575 566 -4.012781031912974e-02 +575 567 -5.413421453123141e-02 +575 568 -7.613960933881209e-02 +575 569 -1.132183869282767e-01 +575 570 -1.820810586422670e-01 +575 571 -3.301555353436788e-01 +575 572 -7.412185823610242e-01 +575 573 -3.165206906282904e+00 +575 574 -1.502055215865993e+01 +575 576 -1.502055215931075e+01 +575 577 -3.165206906282885e+00 +575 578 -7.412185823610241e-01 +575 579 -3.301555353436766e-01 +575 580 -1.820810586422646e-01 +575 581 -1.132183869282745e-01 +575 582 -7.613960933881155e-02 +575 583 -5.413421453123204e-02 +575 584 -4.012781031912978e-02 +575 585 -3.072751892616544e-02 +575 586 -2.415034675252906e-02 +575 587 -1.939104886145119e-02 +575 588 -1.585023865775531e-02 +575 589 -1.315380302376542e-02 +575 590 -1.105916272470025e-02 +575 591 -9.403863770832825e-03 +576 576 3.988394278169687e+01 +576 560 -9.403863770832811e-03 +576 561 -1.105916272470025e-02 +576 562 -1.315380302376546e-02 +576 563 -1.585023865775536e-02 +576 564 -1.939104886145118e-02 +576 565 -2.415034675252896e-02 +576 566 -3.072751892616542e-02 +576 567 -4.012781031912996e-02 +576 568 -5.413421453123230e-02 +576 569 -7.613960933881206e-02 +576 570 -1.132183869282771e-01 +576 571 -1.820810586422665e-01 +576 572 -3.301555353436763e-01 +576 573 -7.412185823610414e-01 +576 574 -3.165206906282906e+00 +576 575 -1.502055215931075e+01 +576 577 -1.502055215865996e+01 +576 578 -3.165206906282826e+00 +576 579 -7.412185823609913e-01 +576 580 -3.301555353436763e-01 +576 581 -1.820810586422636e-01 +576 582 -1.132183869282765e-01 +576 583 -7.613960933881173e-02 +576 584 -5.413421453123111e-02 +576 585 -4.012781031912974e-02 +576 586 -3.072751892616543e-02 +576 587 -2.415034675252897e-02 +576 588 -1.939104886145111e-02 +576 589 -1.585023865775514e-02 +576 590 -1.315380302376542e-02 +576 591 -1.105916272470022e-02 +576 592 -9.403863770832811e-03 +576 593 -8.076052134892582e-03 +576 594 -6.996835383339698e-03 +576 595 -6.109381318875730e-03 +576 596 -5.371977266379805e-03 +576 597 -4.753493624956894e-03 +576 598 -4.230349322908517e-03 +576 599 -3.784439171232927e-03 +576 600 -3.401691470521394e-03 +576 601 -3.071047067257401e-03 +576 602 -2.783725492315666e-03 +576 603 -2.532689975072680e-03 +576 604 -2.312252367280536e-03 +576 605 -2.117777896667789e-03 +576 606 -1.945462087124853e-03 +576 607 -1.792160480940038e-03 +577 577 3.988394278164012e+01 +577 560 -8.076052134892582e-03 +577 561 -9.403863770832813e-03 +577 562 -1.105916272470026e-02 +577 563 -1.315380302376555e-02 +577 564 -1.585023865775531e-02 +577 565 -1.939104886145111e-02 +577 566 -2.415034675252896e-02 +577 567 -3.072751892616545e-02 +577 568 -4.012781031913035e-02 +577 569 -5.413421453123204e-02 +577 570 -7.613960933881171e-02 +577 571 -1.132183869282754e-01 +577 572 -1.820810586422635e-01 +577 573 -3.301555353436757e-01 +577 574 -7.412185823610246e-01 +577 575 -3.165206906282885e+00 +577 576 -1.502055215865996e+01 +577 578 -1.502055215864004e+01 +577 579 -3.165206906282823e+00 +577 580 -7.412185823610242e-01 +577 581 -3.301555353436766e-01 +577 582 -1.820810586422670e-01 +577 583 -1.132183869282775e-01 +577 584 -7.613960933881103e-02 +577 585 -5.413421453123141e-02 +577 586 -4.012781031912996e-02 +577 587 -3.072751892616545e-02 +577 588 -2.415034675252897e-02 +577 589 -1.939104886145097e-02 +577 590 -1.585023865775520e-02 +577 591 -1.315380302376542e-02 +577 592 -1.105916272470025e-02 +577 593 -9.403863770832816e-03 +577 594 -8.076052134892599e-03 +577 595 -6.996835383339651e-03 +577 596 -6.109381318875750e-03 +577 597 -5.371977266379804e-03 +577 598 -4.753493624956879e-03 +577 599 -4.230349322908531e-03 +577 600 -3.784439171232927e-03 +577 601 -3.401691470521402e-03 +577 602 -3.071047067257385e-03 +577 603 -2.783725492315672e-03 +577 604 -2.532689975072679e-03 +577 605 -2.312252367280530e-03 +577 606 -2.117777896667794e-03 +577 607 -1.945462087124853e-03 +578 578 3.988394278153928e+01 +578 560 -6.996835383339674e-03 +578 561 -8.076052134892570e-03 +578 562 -9.403863770832771e-03 +578 563 -1.105916272470025e-02 +578 564 -1.315380302376542e-02 +578 565 -1.585023865775514e-02 +578 566 -1.939104886145095e-02 +578 567 -2.415034675252877e-02 +578 568 -3.072751892616543e-02 +578 569 -4.012781031912976e-02 +578 570 -5.413421453123142e-02 +578 571 -7.613960933881082e-02 +578 572 -1.132183869282757e-01 +578 573 -1.820810586422643e-01 +578 574 -3.301555353436766e-01 +578 575 -7.412185823610241e-01 +578 576 -3.165206906282826e+00 +578 577 -1.502055215864004e+01 +578 579 -1.502055215858795e+01 +578 580 -3.165206906282902e+00 +578 581 -7.412185823610369e-01 +578 582 -3.301555353436766e-01 +578 583 -1.820810586422659e-01 +578 584 -1.132183869282762e-01 +578 585 -7.613960933881211e-02 +578 586 -5.413421453123234e-02 +578 587 -4.012781031913039e-02 +578 588 -3.072751892616573e-02 +578 589 -2.415034675252898e-02 +578 590 -1.939104886145118e-02 +578 591 -1.585023865775531e-02 +578 592 -1.315380302376555e-02 +578 593 -1.105916272470032e-02 +578 594 -9.403863770832832e-03 +578 595 -8.076052134892580e-03 +578 596 -6.996835383339674e-03 +578 597 -6.109381318875747e-03 +578 598 -5.371977266379786e-03 +578 599 -4.753493624956895e-03 +578 600 -4.230349322908531e-03 +578 601 -3.784439171232937e-03 +578 602 -3.401691470521385e-03 +578 603 -3.071047067257393e-03 +578 604 -2.783725492315671e-03 +578 605 -2.532689975072673e-03 +578 606 -2.312252367280536e-03 +578 607 -2.117777896667794e-03 +579 579 3.988394278151443e+01 +579 560 -6.109381318875750e-03 +579 561 -6.996835383339674e-03 +579 562 -8.076052134892570e-03 +579 563 -9.403863770832811e-03 +579 564 -1.105916272470022e-02 +579 565 -1.315380302376537e-02 +579 566 -1.585023865775514e-02 +579 567 -1.939104886145096e-02 +579 568 -2.415034675252896e-02 +579 569 -3.072751892616530e-02 +579 570 -4.012781031912975e-02 +579 571 -5.413421453123107e-02 +579 572 -7.613960933881100e-02 +579 573 -1.132183869282765e-01 +579 574 -1.820810586422670e-01 +579 575 -3.301555353436766e-01 +579 576 -7.412185823609913e-01 +579 577 -3.165206906282823e+00 +579 578 -1.502055215858795e+01 +579 580 -1.502055215859664e+01 +579 581 -3.165206906282910e+00 +579 582 -7.412185823610244e-01 +579 583 -3.301555353436766e-01 +579 584 -1.820810586422639e-01 +579 585 -1.132183869282765e-01 +579 586 -7.613960933881239e-02 +579 587 -5.413421453123236e-02 +579 588 -4.012781031913037e-02 +579 589 -3.072751892616545e-02 +579 590 -2.415034675252906e-02 +579 591 -1.939104886145118e-02 +579 592 -1.585023865775537e-02 +579 593 -1.315380302376555e-02 +579 594 -1.105916272470025e-02 +579 595 -9.403863770832839e-03 +579 596 -8.076052134892592e-03 +579 597 -6.996835383339671e-03 +579 598 -6.109381318875727e-03 +579 599 -5.371977266379805e-03 +579 600 -4.753493624956895e-03 +579 601 -4.230349322908543e-03 +579 602 -3.784439171232917e-03 +579 603 -3.401691470521394e-03 +579 604 -3.071047067257392e-03 +579 605 -2.783725492315665e-03 +579 606 -2.532689975072680e-03 +579 607 -2.312252367280536e-03 +580 580 3.988394278151360e+01 +580 560 -5.371977266379822e-03 +580 561 -6.109381318875769e-03 +580 562 -6.996835383339698e-03 +580 563 -8.076052134892622e-03 +580 564 -9.403863770832840e-03 +580 565 -1.105916272470022e-02 +580 566 -1.315380302376542e-02 +580 567 -1.585023865775520e-02 +580 568 -1.939104886145118e-02 +580 569 -2.415034675252897e-02 +580 570 -3.072751892616544e-02 +580 571 -4.012781031912974e-02 +580 572 -5.413421453123141e-02 +580 573 -7.613960933881191e-02 +580 574 -1.132183869282772e-01 +580 575 -1.820810586422646e-01 +580 576 -3.301555353436763e-01 +580 577 -7.412185823610242e-01 +580 578 -3.165206906282902e+00 +580 579 -1.502055215859664e+01 +580 581 -1.502055215859213e+01 +580 582 -3.165206906282836e+00 +580 583 -7.412185823610246e-01 +580 584 -3.301555353436757e-01 +580 585 -1.820810586422655e-01 +580 586 -1.132183869282766e-01 +580 587 -7.613960933881174e-02 +580 588 -5.413421453123204e-02 +580 589 -4.012781031912978e-02 +580 590 -3.072751892616544e-02 +580 591 -2.415034675252897e-02 +580 592 -1.939104886145118e-02 +580 593 -1.585023865775531e-02 +580 594 -1.315380302376542e-02 +580 595 -1.105916272470025e-02 +580 596 -9.403863770832825e-03 +580 597 -8.076052134892575e-03 +580 598 -6.996835383339622e-03 +580 599 -6.109381318875730e-03 +580 600 -5.371977266379788e-03 +580 601 -4.753493624956895e-03 +580 602 -4.230349322908508e-03 +580 603 -3.784439171232917e-03 +580 604 -3.401691470521384e-03 +580 605 -3.071047067257376e-03 +580 606 -2.783725492315666e-03 +580 607 -2.532689975072674e-03 +581 581 3.988394278152490e+01 +581 560 -4.753493624956882e-03 +581 561 -5.371977266379790e-03 +581 562 -6.109381318875730e-03 +581 563 -6.996835383339651e-03 +581 564 -8.076052134892578e-03 +581 565 -9.403863770832811e-03 +581 566 -1.105916272470025e-02 +581 567 -1.315380302376546e-02 +581 568 -1.585023865775536e-02 +581 569 -1.939104886145118e-02 +581 570 -2.415034675252906e-02 +581 571 -3.072751892616543e-02 +581 572 -4.012781031912996e-02 +581 573 -5.413421453123230e-02 +581 574 -7.613960933881191e-02 +581 575 -1.132183869282745e-01 +581 576 -1.820810586422636e-01 +581 577 -3.301555353436766e-01 +581 578 -7.412185823610369e-01 +581 579 -3.165206906282910e+00 +581 580 -1.502055215859213e+01 +581 582 -1.502055215860528e+01 +581 583 -3.165206906282884e+00 +581 584 -7.412185823610138e-01 +581 585 -3.301555353436775e-01 +581 586 -1.820810586422670e-01 +581 587 -1.132183869282766e-01 +581 588 -7.613960933881189e-02 +581 589 -5.413421453123111e-02 +581 590 -4.012781031912974e-02 +581 591 -3.072751892616529e-02 +581 592 -2.415034675252896e-02 +581 593 -1.939104886145111e-02 +581 594 -1.585023865775514e-02 +581 595 -1.315380302376542e-02 +581 596 -1.105916272470022e-02 +581 597 -9.403863770832827e-03 +581 598 -8.076052134892594e-03 +581 599 -6.996835383339698e-03 +581 600 -6.109381318875769e-03 +581 601 -5.371977266379837e-03 +581 602 -4.753493624956895e-03 +581 603 -4.230349322908543e-03 +581 604 -3.784439171232936e-03 +581 605 -3.401691470521392e-03 +581 606 -3.071047067257401e-03 +581 607 -2.783725492315679e-03 +582 582 3.988394278128561e+01 +582 560 -4.230349322908531e-03 +582 561 -4.753493624956895e-03 +582 562 -5.371977266379805e-03 +582 563 -6.109381318875750e-03 +582 564 -6.996835383339674e-03 +582 565 -8.076052134892582e-03 +582 566 -9.403863770832814e-03 +582 567 -1.105916272470026e-02 +582 568 -1.315380302376555e-02 +582 569 -1.585023865775532e-02 +582 570 -1.939104886145119e-02 +582 571 -2.415034675252897e-02 +582 572 -3.072751892616545e-02 +582 573 -4.012781031913037e-02 +582 574 -5.413421453123205e-02 +582 575 -7.613960933881155e-02 +582 576 -1.132183869282765e-01 +582 577 -1.820810586422670e-01 +582 578 -3.301555353436766e-01 +582 579 -7.412185823610244e-01 +582 580 -3.165206906282836e+00 +582 581 -1.502055215860528e+01 +582 583 -1.502055215840055e+01 +582 584 -3.165206906282837e+00 +582 585 -7.412185823610100e-01 +582 586 -3.301555353436766e-01 +582 587 -1.820810586422639e-01 +582 588 -1.132183869282761e-01 +582 589 -7.613960933881099e-02 +582 590 -5.413421453123138e-02 +582 591 -4.012781031912974e-02 +582 592 -3.072751892616542e-02 +582 593 -2.415034675252896e-02 +582 594 -1.939104886145096e-02 +582 595 -1.585023865775520e-02 +582 596 -1.315380302376542e-02 +582 597 -1.105916272470025e-02 +582 598 -9.403863770832814e-03 +582 599 -8.076052134892582e-03 +582 600 -6.996835383339674e-03 +582 601 -6.109381318875769e-03 +582 602 -5.371977266379790e-03 +582 603 -4.753493624956895e-03 +582 604 -4.230349322908531e-03 +582 605 -3.784439171232915e-03 +582 606 -3.401691470521394e-03 +582 607 -3.071047067257393e-03 +583 583 3.988394278105606e+01 +583 560 -3.784439171232926e-03 +583 561 -4.230349322908531e-03 +583 562 -4.753493624956894e-03 +583 563 -5.371977266379804e-03 +583 564 -6.109381318875747e-03 +583 565 -6.996835383339671e-03 +583 566 -8.076052134892578e-03 +583 567 -9.403863770832813e-03 +583 568 -1.105916272470032e-02 +583 569 -1.315380302376550e-02 +583 570 -1.585023865775531e-02 +583 571 -1.939104886145111e-02 +583 572 -2.415034675252897e-02 +583 573 -3.072751892616572e-02 +583 574 -4.012781031913017e-02 +583 575 -5.413421453123204e-02 +583 576 -7.613960933881173e-02 +583 577 -1.132183869282775e-01 +583 578 -1.820810586422659e-01 +583 579 -3.301555353436766e-01 +583 580 -7.412185823610246e-01 +583 581 -3.165206906282884e+00 +583 582 -1.502055215840055e+01 +583 584 -1.502055215835477e+01 +583 585 -3.165206906282830e+00 +583 586 -7.412185823610162e-01 +583 587 -3.301555353436757e-01 +583 588 -1.820810586422643e-01 +583 589 -1.132183869282762e-01 +583 590 -7.613960933881123e-02 +583 591 -5.413421453123141e-02 +583 592 -4.012781031912996e-02 +583 593 -3.072751892616545e-02 +583 594 -2.415034675252878e-02 +583 595 -1.939104886145103e-02 +583 596 -1.585023865775520e-02 +583 597 -1.315380302376546e-02 +583 598 -1.105916272470026e-02 +583 599 -9.403863770832816e-03 +583 600 -8.076052134892573e-03 +583 601 -6.996835383339702e-03 +583 602 -6.109381318875734e-03 +583 603 -5.371977266379808e-03 +583 604 -4.753493624956896e-03 +583 605 -4.230349322908520e-03 +583 606 -3.784439171232929e-03 +583 607 -3.401691470521395e-03 +584 584 3.988394278102298e+01 +584 560 -3.401691470521383e-03 +584 561 -3.784439171232915e-03 +584 562 -4.230349322908517e-03 +584 563 -4.753493624956879e-03 +584 564 -5.371977266379786e-03 +584 565 -6.109381318875727e-03 +584 566 -6.996835383339646e-03 +584 567 -8.076052134892556e-03 +584 568 -9.403863770832813e-03 +584 569 -1.105916272470022e-02 +584 570 -1.315380302376542e-02 +584 571 -1.585023865775514e-02 +584 572 -1.939104886145097e-02 +584 573 -2.415034675252897e-02 +584 574 -3.072751892616531e-02 +584 575 -4.012781031912978e-02 +584 576 -5.413421453123111e-02 +584 577 -7.613960933881103e-02 +584 578 -1.132183869282762e-01 +584 579 -1.820810586422639e-01 +584 580 -3.301555353436757e-01 +584 581 -7.412185823610138e-01 +584 582 -3.165206906282837e+00 +584 583 -1.502055215835477e+01 +584 585 -1.502055215836229e+01 +584 586 -3.165206906282885e+00 +584 587 -7.412185823610321e-01 +584 588 -3.301555353436766e-01 +584 589 -1.820810586422670e-01 +584 590 -1.132183869282775e-01 +584 591 -7.613960933881189e-02 +584 592 -5.413421453123230e-02 +584 593 -4.012781031913035e-02 +584 594 -3.072751892616544e-02 +584 595 -2.415034675252906e-02 +584 596 -1.939104886145118e-02 +584 597 -1.585023865775536e-02 +584 598 -1.315380302376555e-02 +584 599 -1.105916272470032e-02 +584 600 -9.403863770832830e-03 +584 601 -8.076052134892653e-03 +584 602 -6.996835383339677e-03 +584 603 -6.109381318875772e-03 +584 604 -5.371977266379821e-03 +584 605 -4.753493624956895e-03 +584 606 -4.230349322908545e-03 +584 607 -3.784439171232938e-03 +585 585 3.988394278106473e+01 +585 560 -3.071047067257393e-03 +585 561 -3.401691470521394e-03 +585 562 -3.784439171232927e-03 +585 563 -4.230349322908531e-03 +585 564 -4.753493624956895e-03 +585 565 -5.371977266379805e-03 +585 566 -6.109381318875750e-03 +585 567 -6.996835383339674e-03 +585 568 -8.076052134892592e-03 +585 569 -9.403863770832825e-03 +585 570 -1.105916272470025e-02 +585 571 -1.315380302376542e-02 +585 572 -1.585023865775520e-02 +585 573 -1.939104886145118e-02 +585 574 -2.415034675252897e-02 +585 575 -3.072751892616544e-02 +585 576 -4.012781031912974e-02 +585 577 -5.413421453123141e-02 +585 578 -7.613960933881211e-02 +585 579 -1.132183869282765e-01 +585 580 -1.820810586422655e-01 +585 581 -3.301555353436775e-01 +585 582 -7.412185823610100e-01 +585 583 -3.165206906282830e+00 +585 584 -1.502055215836229e+01 +585 586 -1.502055215839532e+01 +585 587 -3.165206906282899e+00 +585 588 -7.412185823610246e-01 +585 589 -3.301555353436766e-01 +585 590 -1.820810586422654e-01 +585 591 -1.132183869282753e-01 +585 592 -7.613960933881189e-02 +585 593 -5.413421453123204e-02 +585 594 -4.012781031912978e-02 +585 595 -3.072751892616544e-02 +585 596 -2.415034675252897e-02 +585 597 -1.939104886145118e-02 +585 598 -1.585023865775532e-02 +585 599 -1.315380302376550e-02 +585 600 -1.105916272470022e-02 +585 601 -9.403863770832840e-03 +585 602 -8.076052134892578e-03 +585 603 -6.996835383339674e-03 +585 604 -6.109381318875747e-03 +585 605 -5.371977266379786e-03 +585 606 -4.753493624956895e-03 +585 607 -4.230349322908531e-03 +586 586 3.988394278115158e+01 +586 560 -2.783725492315672e-03 +586 561 -3.071047067257393e-03 +586 562 -3.401691470521394e-03 +586 563 -3.784439171232927e-03 +586 564 -4.230349322908531e-03 +586 565 -4.753493624956895e-03 +586 566 -5.371977266379805e-03 +586 567 -6.109381318875750e-03 +586 568 -6.996835383339674e-03 +586 569 -8.076052134892592e-03 +586 570 -9.403863770832839e-03 +586 571 -1.105916272470025e-02 +586 572 -1.315380302376546e-02 +586 573 -1.585023865775536e-02 +586 574 -1.939104886145118e-02 +586 575 -2.415034675252906e-02 +586 576 -3.072751892616543e-02 +586 577 -4.012781031912996e-02 +586 578 -5.413421453123234e-02 +586 579 -7.613960933881239e-02 +586 580 -1.132183869282766e-01 +586 581 -1.820810586422670e-01 +586 582 -3.301555353436766e-01 +586 583 -7.412185823610162e-01 +586 584 -3.165206906282885e+00 +586 585 -1.502055215839532e+01 +586 587 -1.502055215844917e+01 +586 588 -3.165206906282885e+00 +586 589 -7.412185823610241e-01 +586 590 -3.301555353436766e-01 +586 591 -1.820810586422639e-01 +586 592 -1.132183869282766e-01 +586 593 -7.613960933881173e-02 +586 594 -5.413421453123111e-02 +586 595 -4.012781031912974e-02 +586 596 -3.072751892616529e-02 +586 597 -2.415034675252896e-02 +586 598 -1.939104886145111e-02 +586 599 -1.585023865775526e-02 +586 600 -1.315380302376538e-02 +586 601 -1.105916272470022e-02 +586 602 -9.403863770832811e-03 +586 603 -8.076052134892582e-03 +586 604 -6.996835383339671e-03 +586 605 -6.109381318875727e-03 +586 606 -5.371977266379805e-03 +586 607 -4.753493624956895e-03 +587 587 3.988394278128114e+01 +587 560 -2.532689975072685e-03 +587 561 -2.783725492315679e-03 +587 562 -3.071047067257401e-03 +587 563 -3.401691470521402e-03 +587 564 -3.784439171232937e-03 +587 565 -4.230349322908543e-03 +587 566 -4.753493624956908e-03 +587 567 -5.371977266379822e-03 +587 568 -6.109381318875769e-03 +587 569 -6.996835383339698e-03 +587 570 -8.076052134892622e-03 +587 571 -9.403863770832832e-03 +587 572 -1.105916272470026e-02 +587 573 -1.315380302376555e-02 +587 574 -1.585023865775532e-02 +587 575 -1.939104886145119e-02 +587 576 -2.415034675252897e-02 +587 577 -3.072751892616545e-02 +587 578 -4.012781031913039e-02 +587 579 -5.413421453123236e-02 +587 580 -7.613960933881174e-02 +587 581 -1.132183869282766e-01 +587 582 -1.820810586422639e-01 +587 583 -3.301555353436757e-01 +587 584 -7.412185823610321e-01 +587 585 -3.165206906282899e+00 +587 586 -1.502055215844917e+01 +587 588 -1.502055215852567e+01 +587 589 -3.165206906282839e+00 +587 590 -7.412185823610000e-01 +587 591 -3.301555353436766e-01 +587 592 -1.820810586422670e-01 +587 593 -1.132183869282775e-01 +587 594 -7.613960933881099e-02 +587 595 -5.413421453123138e-02 +587 596 -4.012781031912974e-02 +587 597 -3.072751892616542e-02 +587 598 -2.415034675252897e-02 +587 599 -1.939104886145110e-02 +587 600 -1.585023865775514e-02 +587 601 -1.315380302376542e-02 +587 602 -1.105916272470025e-02 +587 603 -9.403863770832814e-03 +587 604 -8.076052134892564e-03 +587 605 -6.996835383339622e-03 +587 606 -6.109381318875730e-03 +587 607 -5.371977266379788e-03 +588 588 3.988394278146367e+01 +588 560 -2.312252367280531e-03 +588 561 -2.532689975072674e-03 +588 562 -2.783725492315666e-03 +588 563 -3.071047067257385e-03 +588 564 -3.401691470521385e-03 +588 565 -3.784439171232917e-03 +588 566 -4.230349322908521e-03 +588 567 -4.753493624956882e-03 +588 568 -5.371977266379790e-03 +588 569 -6.109381318875730e-03 +588 570 -6.996835383339651e-03 +588 571 -8.076052134892568e-03 +588 572 -9.403863770832816e-03 +588 573 -1.105916272470032e-02 +588 574 -1.315380302376550e-02 +588 575 -1.585023865775531e-02 +588 576 -1.939104886145111e-02 +588 577 -2.415034675252897e-02 +588 578 -3.072751892616573e-02 +588 579 -4.012781031913037e-02 +588 580 -5.413421453123204e-02 +588 581 -7.613960933881189e-02 +588 582 -1.132183869282761e-01 +588 583 -1.820810586422643e-01 +588 584 -3.301555353436766e-01 +588 585 -7.412185823610246e-01 +588 586 -3.165206906282885e+00 +588 587 -1.502055215852567e+01 +588 589 -1.502055215863306e+01 +588 590 -3.165206906282836e+00 +588 591 -7.412185823610140e-01 +588 592 -3.301555353436766e-01 +588 593 -1.820810586422659e-01 +588 594 -1.132183869282759e-01 +588 595 -7.613960933881142e-02 +588 596 -5.413421453123141e-02 +588 597 -4.012781031912996e-02 +588 598 -3.072751892616545e-02 +588 599 -2.415034675252897e-02 +588 600 -1.939104886145097e-02 +588 601 -1.585023865775520e-02 +588 602 -1.315380302376546e-02 +588 603 -1.105916272470026e-02 +588 604 -9.403863770832830e-03 +588 605 -8.076052134892583e-03 +588 606 -6.996835383339698e-03 +588 607 -6.109381318875769e-03 +589 589 3.988394278171947e+01 +589 560 -2.117777896667794e-03 +589 561 -2.312252367280536e-03 +589 562 -2.532689975072680e-03 +589 563 -2.783725492315672e-03 +589 564 -3.071047067257393e-03 +589 565 -3.401691470521394e-03 +589 566 -3.784439171232927e-03 +589 567 -4.230349322908531e-03 +589 568 -4.753493624956895e-03 +589 569 -5.371977266379805e-03 +589 570 -6.109381318875750e-03 +589 571 -6.996835383339674e-03 +589 572 -8.076052134892570e-03 +589 573 -9.403863770832813e-03 +589 574 -1.105916272470022e-02 +589 575 -1.315380302376542e-02 +589 576 -1.585023865775514e-02 +589 577 -1.939104886145097e-02 +589 578 -2.415034675252898e-02 +589 579 -3.072751892616545e-02 +589 580 -4.012781031912978e-02 +589 581 -5.413421453123111e-02 +589 582 -7.613960933881099e-02 +589 583 -1.132183869282762e-01 +589 584 -1.820810586422670e-01 +589 585 -3.301555353436766e-01 +589 586 -7.412185823610241e-01 +589 587 -3.165206906282839e+00 +589 588 -1.502055215863306e+01 +589 590 -1.502055215878366e+01 +589 591 -3.165206906282855e+00 +589 592 -7.412185823610242e-01 +589 593 -3.301555353436766e-01 +589 594 -1.820810586422639e-01 +589 595 -1.132183869282765e-01 +589 596 -7.613960933881189e-02 +589 597 -5.413421453123230e-02 +589 598 -4.012781031913037e-02 +589 599 -3.072751892616572e-02 +589 600 -2.415034675252897e-02 +589 601 -1.939104886145118e-02 +589 602 -1.585023865775536e-02 +589 603 -1.315380302376555e-02 +589 604 -1.105916272470032e-02 +589 605 -9.403863770832813e-03 +589 606 -8.076052134892592e-03 +589 607 -6.996835383339674e-03 +590 590 3.988394278208166e+01 +590 560 -1.945462087124853e-03 +590 561 -2.117777896667793e-03 +590 562 -2.312252367280536e-03 +590 563 -2.532689975072679e-03 +590 564 -2.783725492315671e-03 +590 565 -3.071047067257392e-03 +590 566 -3.401691470521392e-03 +590 567 -3.784439171232926e-03 +590 568 -4.230349322908531e-03 +590 569 -4.753493624956894e-03 +590 570 -5.371977266379804e-03 +590 571 -6.109381318875747e-03 +590 572 -6.996835383339671e-03 +590 573 -8.076052134892589e-03 +590 574 -9.403863770832821e-03 +590 575 -1.105916272470025e-02 +590 576 -1.315380302376542e-02 +590 577 -1.585023865775520e-02 +590 578 -1.939104886145118e-02 +590 579 -2.415034675252906e-02 +590 580 -3.072751892616544e-02 +590 581 -4.012781031912974e-02 +590 582 -5.413421453123138e-02 +590 583 -7.613960933881123e-02 +590 584 -1.132183869282775e-01 +590 585 -1.820810586422654e-01 +590 586 -3.301555353436766e-01 +590 587 -7.412185823610000e-01 +590 588 -3.165206906282836e+00 +590 589 -1.502055215878366e+01 +590 591 -1.502055215899867e+01 +590 592 -3.165206906282892e+00 +590 593 -7.412185823610300e-01 +590 594 -3.301555353436757e-01 +590 595 -1.820810586422655e-01 +590 596 -1.132183869282763e-01 +590 597 -7.613960933881171e-02 +590 598 -5.413421453123205e-02 +590 599 -4.012781031913017e-02 +590 600 -3.072751892616531e-02 +590 601 -2.415034675252897e-02 +590 602 -1.939104886145118e-02 +590 603 -1.585023865775532e-02 +590 604 -1.315380302376550e-02 +590 605 -1.105916272470022e-02 +590 606 -9.403863770832825e-03 +590 607 -8.076052134892594e-03 +591 591 3.988394278260306e+01 +591 560 -1.792160480940034e-03 +591 561 -1.945462087124849e-03 +591 562 -2.117777896667789e-03 +591 563 -2.312252367280530e-03 +591 564 -2.532689975072673e-03 +591 565 -2.783725492315665e-03 +591 566 -3.071047067257384e-03 +591 567 -3.401691470521383e-03 +591 568 -3.784439171232915e-03 +591 569 -4.230349322908517e-03 +591 570 -4.753493624956879e-03 +591 571 -5.371977266379786e-03 +591 572 -6.109381318875727e-03 +591 573 -6.996835383339646e-03 +591 574 -8.076052134892577e-03 +591 575 -9.403863770832825e-03 +591 576 -1.105916272470022e-02 +591 577 -1.315380302376542e-02 +591 578 -1.585023865775531e-02 +591 579 -1.939104886145118e-02 +591 580 -2.415034675252897e-02 +591 581 -3.072751892616529e-02 +591 582 -4.012781031912974e-02 +591 583 -5.413421453123141e-02 +591 584 -7.613960933881189e-02 +591 585 -1.132183869282753e-01 +591 586 -1.820810586422639e-01 +591 587 -3.301555353436766e-01 +591 588 -7.412185823610140e-01 +591 589 -3.165206906282855e+00 +591 590 -1.502055215899867e+01 +591 592 -1.502055215931060e+01 +591 593 -3.165206906282895e+00 +591 594 -7.412185823610263e-01 +591 595 -3.301555353436775e-01 +591 596 -1.820810586422670e-01 +591 597 -1.132183869282766e-01 +591 598 -7.613960933881213e-02 +591 599 -5.413421453123204e-02 +591 600 -4.012781031912978e-02 +591 601 -3.072751892616544e-02 +591 602 -2.415034675252906e-02 +591 603 -1.939104886145119e-02 +591 604 -1.585023865775531e-02 +591 605 -1.315380302376542e-02 +591 606 -1.105916272470025e-02 +591 607 -9.403863770832858e-03 +592 592 3.988394278260306e+01 +592 576 -9.403863770832811e-03 +592 577 -1.105916272470025e-02 +592 578 -1.315380302376555e-02 +592 579 -1.585023865775537e-02 +592 580 -1.939104886145118e-02 +592 581 -2.415034675252896e-02 +592 582 -3.072751892616542e-02 +592 583 -4.012781031912996e-02 +592 584 -5.413421453123230e-02 +592 585 -7.613960933881189e-02 +592 586 -1.132183869282766e-01 +592 587 -1.820810586422670e-01 +592 588 -3.301555353436766e-01 +592 589 -7.412185823610242e-01 +592 590 -3.165206906282892e+00 +592 591 -1.502055215931060e+01 +592 593 -1.502055215899863e+01 +592 594 -3.165206906282876e+00 +592 595 -7.412185823610220e-01 +592 596 -3.301555353436766e-01 +592 597 -1.820810586422639e-01 +592 598 -1.132183869282762e-01 +592 599 -7.613960933881170e-02 +592 600 -5.413421453123111e-02 +592 601 -4.012781031912974e-02 +592 602 -3.072751892616543e-02 +592 603 -2.415034675252897e-02 +592 604 -1.939104886145111e-02 +592 605 -1.585023865775514e-02 +592 606 -1.315380302376542e-02 +592 607 -1.105916272470025e-02 +592 608 -9.403863770832832e-03 +592 609 -8.076052134892568e-03 +592 610 -6.996835383339674e-03 +592 611 -6.109381318875747e-03 +592 612 -5.371977266379786e-03 +592 613 -4.753493624956895e-03 +592 614 -4.230349322908531e-03 +592 615 -3.784439171232937e-03 +592 616 -3.401691470521385e-03 +592 617 -3.071047067257393e-03 +592 618 -2.783725492315671e-03 +592 619 -2.532689975072673e-03 +592 620 -2.312252367280536e-03 +592 621 -2.117777896667794e-03 +592 622 -1.945462087124857e-03 +592 623 -1.792160480940035e-03 +593 593 3.988394278208166e+01 +593 576 -8.076052134892582e-03 +593 577 -9.403863770832816e-03 +593 578 -1.105916272470032e-02 +593 579 -1.315380302376555e-02 +593 580 -1.585023865775531e-02 +593 581 -1.939104886145111e-02 +593 582 -2.415034675252896e-02 +593 583 -3.072751892616545e-02 +593 584 -4.012781031913035e-02 +593 585 -5.413421453123204e-02 +593 586 -7.613960933881173e-02 +593 587 -1.132183869282775e-01 +593 588 -1.820810586422659e-01 +593 589 -3.301555353436766e-01 +593 590 -7.412185823610300e-01 +593 591 -3.165206906282895e+00 +593 592 -1.502055215899863e+01 +593 594 -1.502055215878370e+01 +593 595 -3.165206906282839e+00 +593 596 -7.412185823610042e-01 +593 597 -3.301555353436757e-01 +593 598 -1.820810586422643e-01 +593 599 -1.132183869282765e-01 +593 600 -7.613960933881106e-02 +593 601 -5.413421453123141e-02 +593 602 -4.012781031912996e-02 +593 603 -3.072751892616545e-02 +593 604 -2.415034675252897e-02 +593 605 -1.939104886145097e-02 +593 606 -1.585023865775520e-02 +593 607 -1.315380302376546e-02 +593 608 -1.105916272470026e-02 +593 609 -9.403863770832816e-03 +593 610 -8.076052134892570e-03 +593 611 -6.996835383339671e-03 +593 612 -6.109381318875727e-03 +593 613 -5.371977266379805e-03 +593 614 -4.753493624956895e-03 +593 615 -4.230349322908543e-03 +593 616 -3.784439171232917e-03 +593 617 -3.401691470521394e-03 +593 618 -3.071047067257392e-03 +593 619 -2.783725492315665e-03 +593 620 -2.532689975072680e-03 +593 621 -2.312252367280536e-03 +593 622 -2.117777896667799e-03 +593 623 -1.945462087124849e-03 +594 594 3.988394278171945e+01 +594 576 -6.996835383339698e-03 +594 577 -8.076052134892599e-03 +594 578 -9.403863770832832e-03 +594 579 -1.105916272470025e-02 +594 580 -1.315380302376542e-02 +594 581 -1.585023865775514e-02 +594 582 -1.939104886145096e-02 +594 583 -2.415034675252878e-02 +594 584 -3.072751892616544e-02 +594 585 -4.012781031912978e-02 +594 586 -5.413421453123111e-02 +594 587 -7.613960933881099e-02 +594 588 -1.132183869282759e-01 +594 589 -1.820810586422639e-01 +594 590 -3.301555353436757e-01 +594 591 -7.412185823610263e-01 +594 592 -3.165206906282876e+00 +594 593 -1.502055215878370e+01 +594 595 -1.502055215863298e+01 +594 596 -3.165206906282843e+00 +594 597 -7.412185823610224e-01 +594 598 -3.301555353436766e-01 +594 599 -1.820810586422670e-01 +594 600 -1.132183869282775e-01 +594 601 -7.613960933881189e-02 +594 602 -5.413421453123230e-02 +594 603 -4.012781031913037e-02 +594 604 -3.072751892616572e-02 +594 605 -2.415034675252897e-02 +594 606 -1.939104886145118e-02 +594 607 -1.585023865775536e-02 +594 608 -1.315380302376555e-02 +594 609 -1.105916272470032e-02 +594 610 -9.403863770832813e-03 +594 611 -8.076052134892575e-03 +594 612 -6.996835383339622e-03 +594 613 -6.109381318875730e-03 +594 614 -5.371977266379788e-03 +594 615 -4.753493624956895e-03 +594 616 -4.230349322908508e-03 +594 617 -3.784439171232917e-03 +594 618 -3.401691470521384e-03 +594 619 -3.071047067257376e-03 +594 620 -2.783725492315666e-03 +594 621 -2.532689975072674e-03 +594 622 -2.312252367280536e-03 +594 623 -2.117777896667785e-03 +595 595 3.988394278146367e+01 +595 576 -6.109381318875730e-03 +595 577 -6.996835383339651e-03 +595 578 -8.076052134892580e-03 +595 579 -9.403863770832839e-03 +595 580 -1.105916272470025e-02 +595 581 -1.315380302376542e-02 +595 582 -1.585023865775520e-02 +595 583 -1.939104886145103e-02 +595 584 -2.415034675252906e-02 +595 585 -3.072751892616544e-02 +595 586 -4.012781031912974e-02 +595 587 -5.413421453123138e-02 +595 588 -7.613960933881142e-02 +595 589 -1.132183869282765e-01 +595 590 -1.820810586422655e-01 +595 591 -3.301555353436775e-01 +595 592 -7.412185823610220e-01 +595 593 -3.165206906282839e+00 +595 594 -1.502055215863298e+01 +595 596 -1.502055215852574e+01 +595 597 -3.165206906282886e+00 +595 598 -7.412185823610263e-01 +595 599 -3.301555353436766e-01 +595 600 -1.820810586422654e-01 +595 601 -1.132183869282753e-01 +595 602 -7.613960933881189e-02 +595 603 -5.413421453123205e-02 +595 604 -4.012781031913017e-02 +595 605 -3.072751892616531e-02 +595 606 -2.415034675252897e-02 +595 607 -1.939104886145118e-02 +595 608 -1.585023865775532e-02 +595 609 -1.315380302376550e-02 +595 610 -1.105916272470022e-02 +595 611 -9.403863770832839e-03 +595 612 -8.076052134892604e-03 +595 613 -6.996835383339698e-03 +595 614 -6.109381318875769e-03 +595 615 -5.371977266379837e-03 +595 616 -4.753493624956895e-03 +595 617 -4.230349322908543e-03 +595 618 -3.784439171232936e-03 +595 619 -3.401691470521392e-03 +595 620 -3.071047067257401e-03 +595 621 -2.783725492315679e-03 +595 622 -2.532689975072691e-03 +595 623 -2.312252367280536e-03 +596 596 3.988394278128114e+01 +596 576 -5.371977266379805e-03 +596 577 -6.109381318875750e-03 +596 578 -6.996835383339674e-03 +596 579 -8.076052134892592e-03 +596 580 -9.403863770832825e-03 +596 581 -1.105916272470022e-02 +596 582 -1.315380302376542e-02 +596 583 -1.585023865775520e-02 +596 584 -1.939104886145118e-02 +596 585 -2.415034675252897e-02 +596 586 -3.072751892616529e-02 +596 587 -4.012781031912974e-02 +596 588 -5.413421453123141e-02 +596 589 -7.613960933881189e-02 +596 590 -1.132183869282763e-01 +596 591 -1.820810586422670e-01 +596 592 -3.301555353436766e-01 +596 593 -7.412185823610042e-01 +596 594 -3.165206906282843e+00 +596 595 -1.502055215852574e+01 +596 597 -1.502055215844909e+01 +596 598 -3.165206906282895e+00 +596 599 -7.412185823610278e-01 +596 600 -3.301555353436766e-01 +596 601 -1.820810586422639e-01 +596 602 -1.132183869282766e-01 +596 603 -7.613960933881195e-02 +596 604 -5.413421453123204e-02 +596 605 -4.012781031912978e-02 +596 606 -3.072751892616544e-02 +596 607 -2.415034675252906e-02 +596 608 -1.939104886145119e-02 +596 609 -1.585023865775531e-02 +596 610 -1.315380302376542e-02 +596 611 -1.105916272470025e-02 +596 612 -9.403863770832825e-03 +596 613 -8.076052134892592e-03 +596 614 -6.996835383339674e-03 +596 615 -6.109381318875769e-03 +596 616 -5.371977266379790e-03 +596 617 -4.753493624956895e-03 +596 618 -4.230349322908531e-03 +596 619 -3.784439171232915e-03 +596 620 -3.401691470521394e-03 +596 621 -3.071047067257393e-03 +596 622 -2.783725492315679e-03 +596 623 -2.532689975072674e-03 +597 597 3.988394278115157e+01 +597 576 -4.753493624956894e-03 +597 577 -5.371977266379804e-03 +597 578 -6.109381318875747e-03 +597 579 -6.996835383339671e-03 +597 580 -8.076052134892575e-03 +597 581 -9.403863770832827e-03 +597 582 -1.105916272470025e-02 +597 583 -1.315380302376546e-02 +597 584 -1.585023865775536e-02 +597 585 -1.939104886145118e-02 +597 586 -2.415034675252896e-02 +597 587 -3.072751892616542e-02 +597 588 -4.012781031912996e-02 +597 589 -5.413421453123230e-02 +597 590 -7.613960933881171e-02 +597 591 -1.132183869282766e-01 +597 592 -1.820810586422639e-01 +597 593 -3.301555353436757e-01 +597 594 -7.412185823610224e-01 +597 595 -3.165206906282886e+00 +597 596 -1.502055215844909e+01 +597 598 -1.502055215839538e+01 +597 599 -3.165206906282888e+00 +597 600 -7.412185823610263e-01 +597 601 -3.301555353436766e-01 +597 602 -1.820810586422670e-01 +597 603 -1.132183869282775e-01 +597 604 -7.613960933881170e-02 +597 605 -5.413421453123111e-02 +597 606 -4.012781031912974e-02 +597 607 -3.072751892616543e-02 +597 608 -2.415034675252897e-02 +597 609 -1.939104886145111e-02 +597 610 -1.585023865775514e-02 +597 611 -1.315380302376542e-02 +597 612 -1.105916272470022e-02 +597 613 -9.403863770832811e-03 +597 614 -8.076052134892583e-03 +597 615 -6.996835383339702e-03 +597 616 -6.109381318875734e-03 +597 617 -5.371977266379808e-03 +597 618 -4.753493624956896e-03 +597 619 -4.230349322908520e-03 +597 620 -3.784439171232929e-03 +597 621 -3.401691470521395e-03 +597 622 -3.071047067257401e-03 +597 623 -2.783725492315667e-03 +598 598 3.988394278106480e+01 +598 576 -4.230349322908517e-03 +598 577 -4.753493624956879e-03 +598 578 -5.371977266379786e-03 +598 579 -6.109381318875727e-03 +598 580 -6.996835383339622e-03 +598 581 -8.076052134892594e-03 +598 582 -9.403863770832814e-03 +598 583 -1.105916272470026e-02 +598 584 -1.315380302376555e-02 +598 585 -1.585023865775532e-02 +598 586 -1.939104886145111e-02 +598 587 -2.415034675252897e-02 +598 588 -3.072751892616545e-02 +598 589 -4.012781031913037e-02 +598 590 -5.413421453123205e-02 +598 591 -7.613960933881213e-02 +598 592 -1.132183869282762e-01 +598 593 -1.820810586422643e-01 +598 594 -3.301555353436766e-01 +598 595 -7.412185823610263e-01 +598 596 -3.165206906282895e+00 +598 597 -1.502055215839538e+01 +598 599 -1.502055215836224e+01 +598 600 -3.165206906282872e+00 +598 601 -7.412185823610120e-01 +598 602 -3.301555353436766e-01 +598 603 -1.820810586422659e-01 +598 604 -1.132183869282762e-01 +598 605 -7.613960933881120e-02 +598 606 -5.413421453123138e-02 +598 607 -4.012781031912993e-02 +598 608 -3.072751892616544e-02 +598 609 -2.415034675252896e-02 +598 610 -1.939104886145096e-02 +598 611 -1.585023865775520e-02 +598 612 -1.315380302376542e-02 +598 613 -1.105916272470025e-02 +598 614 -9.403863770832830e-03 +598 615 -8.076052134892630e-03 +598 616 -6.996835383339677e-03 +598 617 -6.109381318875772e-03 +598 618 -5.371977266379821e-03 +598 619 -4.753493624956895e-03 +598 620 -4.230349322908545e-03 +598 621 -3.784439171232938e-03 +598 622 -3.401691470521412e-03 +598 623 -3.071047067257394e-03 +599 599 3.988394278102304e+01 +599 576 -3.784439171232927e-03 +599 577 -4.230349322908531e-03 +599 578 -4.753493624956895e-03 +599 579 -5.371977266379805e-03 +599 580 -6.109381318875730e-03 +599 581 -6.996835383339698e-03 +599 582 -8.076052134892582e-03 +599 583 -9.403863770832816e-03 +599 584 -1.105916272470032e-02 +599 585 -1.315380302376550e-02 +599 586 -1.585023865775526e-02 +599 587 -1.939104886145110e-02 +599 588 -2.415034675252897e-02 +599 589 -3.072751892616572e-02 +599 590 -4.012781031913017e-02 +599 591 -5.413421453123204e-02 +599 592 -7.613960933881170e-02 +599 593 -1.132183869282765e-01 +599 594 -1.820810586422670e-01 +599 595 -3.301555353436766e-01 +599 596 -7.412185823610278e-01 +599 597 -3.165206906282888e+00 +599 598 -1.502055215836224e+01 +599 600 -1.502055215835488e+01 +599 601 -3.165206906282843e+00 +599 602 -7.412185823610111e-01 +599 603 -3.301555353436766e-01 +599 604 -1.820810586422639e-01 +599 605 -1.132183869282762e-01 +599 606 -7.613960933881123e-02 +599 607 -5.413421453123171e-02 +599 608 -4.012781031912998e-02 +599 609 -3.072751892616545e-02 +599 610 -2.415034675252878e-02 +599 611 -1.939104886145103e-02 +599 612 -1.585023865775520e-02 +599 613 -1.315380302376546e-02 +599 614 -1.105916272470026e-02 +599 615 -9.403863770832788e-03 +599 616 -8.076052134892556e-03 +599 617 -6.996835383339674e-03 +599 618 -6.109381318875747e-03 +599 619 -5.371977266379786e-03 +599 620 -4.753493624956895e-03 +599 621 -4.230349322908531e-03 +599 622 -3.784439171232937e-03 +599 623 -3.401691470521385e-03 +600 600 3.988394278105610e+01 +600 576 -3.401691470521394e-03 +600 577 -3.784439171232927e-03 +600 578 -4.230349322908531e-03 +600 579 -4.753493624956895e-03 +600 580 -5.371977266379788e-03 +600 581 -6.109381318875769e-03 +600 582 -6.996835383339674e-03 +600 583 -8.076052134892573e-03 +600 584 -9.403863770832830e-03 +600 585 -1.105916272470022e-02 +600 586 -1.315380302376538e-02 +600 587 -1.585023865775514e-02 +600 588 -1.939104886145097e-02 +600 589 -2.415034675252897e-02 +600 590 -3.072751892616531e-02 +600 591 -4.012781031912978e-02 +600 592 -5.413421453123111e-02 +600 593 -7.613960933881106e-02 +600 594 -1.132183869282775e-01 +600 595 -1.820810586422654e-01 +600 596 -3.301555353436766e-01 +600 597 -7.412185823610263e-01 +600 598 -3.165206906282872e+00 +600 599 -1.502055215835488e+01 +600 601 -1.502055215840048e+01 +600 602 -3.165206906282839e+00 +600 603 -7.412185823610220e-01 +600 604 -3.301555353436757e-01 +600 605 -1.820810586422655e-01 +600 606 -1.132183869282766e-01 +600 607 -7.613960933881217e-02 +600 608 -5.413421453123234e-02 +600 609 -4.012781031913035e-02 +600 610 -3.072751892616544e-02 +600 611 -2.415034675252906e-02 +600 612 -1.939104886145118e-02 +600 613 -1.585023865775536e-02 +600 614 -1.315380302376555e-02 +600 615 -1.105916272470025e-02 +600 616 -9.403863770832811e-03 +600 617 -8.076052134892592e-03 +600 618 -6.996835383339671e-03 +600 619 -6.109381318875727e-03 +600 620 -5.371977266379805e-03 +600 621 -4.753493624956895e-03 +600 622 -4.230349322908543e-03 +600 623 -3.784439171232917e-03 +601 601 3.988394278128557e+01 +601 576 -3.071047067257401e-03 +601 577 -3.401691470521402e-03 +601 578 -3.784439171232937e-03 +601 579 -4.230349322908543e-03 +601 580 -4.753493624956895e-03 +601 581 -5.371977266379837e-03 +601 582 -6.109381318875769e-03 +601 583 -6.996835383339702e-03 +601 584 -8.076052134892653e-03 +601 585 -9.403863770832840e-03 +601 586 -1.105916272470022e-02 +601 587 -1.315380302376542e-02 +601 588 -1.585023865775520e-02 +601 589 -1.939104886145118e-02 +601 590 -2.415034675252897e-02 +601 591 -3.072751892616544e-02 +601 592 -4.012781031912974e-02 +601 593 -5.413421453123141e-02 +601 594 -7.613960933881189e-02 +601 595 -1.132183869282753e-01 +601 596 -1.820810586422639e-01 +601 597 -3.301555353436766e-01 +601 598 -7.412185823610120e-01 +601 599 -3.165206906282843e+00 +601 600 -1.502055215840048e+01 +601 602 -1.502055215860528e+01 +601 603 -3.165206906282873e+00 +601 604 -7.412185823610153e-01 +601 605 -3.301555353436775e-01 +601 606 -1.820810586422670e-01 +601 607 -1.132183869282766e-01 +601 608 -7.613960933881213e-02 +601 609 -5.413421453123204e-02 +601 610 -4.012781031912978e-02 +601 611 -3.072751892616544e-02 +601 612 -2.415034675252897e-02 +601 613 -1.939104886145118e-02 +601 614 -1.585023865775531e-02 +601 615 -1.315380302376542e-02 +601 616 -1.105916272470022e-02 +601 617 -9.403863770832825e-03 +601 618 -8.076052134892575e-03 +601 619 -6.996835383339622e-03 +601 620 -6.109381318875730e-03 +601 621 -5.371977266379788e-03 +601 622 -4.753493624956895e-03 +601 623 -4.230349322908508e-03 +602 602 3.988394278152494e+01 +602 576 -2.783725492315666e-03 +602 577 -3.071047067257385e-03 +602 578 -3.401691470521385e-03 +602 579 -3.784439171232917e-03 +602 580 -4.230349322908508e-03 +602 581 -4.753493624956895e-03 +602 582 -5.371977266379790e-03 +602 583 -6.109381318875734e-03 +602 584 -6.996835383339677e-03 +602 585 -8.076052134892578e-03 +602 586 -9.403863770832811e-03 +602 587 -1.105916272470025e-02 +602 588 -1.315380302376546e-02 +602 589 -1.585023865775536e-02 +602 590 -1.939104886145118e-02 +602 591 -2.415034675252906e-02 +602 592 -3.072751892616543e-02 +602 593 -4.012781031912996e-02 +602 594 -5.413421453123230e-02 +602 595 -7.613960933881189e-02 +602 596 -1.132183869282766e-01 +602 597 -1.820810586422670e-01 +602 598 -3.301555353436766e-01 +602 599 -7.412185823610111e-01 +602 600 -3.165206906282839e+00 +602 601 -1.502055215860528e+01 +602 603 -1.502055215859226e+01 +602 604 -3.165206906282882e+00 +602 605 -7.412185823610321e-01 +602 606 -3.301555353436766e-01 +602 607 -1.820810586422639e-01 +602 608 -1.132183869282762e-01 +602 609 -7.613960933881170e-02 +602 610 -5.413421453123111e-02 +602 611 -4.012781031912974e-02 +602 612 -3.072751892616529e-02 +602 613 -2.415034675252896e-02 +602 614 -1.939104886145111e-02 +602 615 -1.585023865775514e-02 +602 616 -1.315380302376537e-02 +602 617 -1.105916272470022e-02 +602 618 -9.403863770832827e-03 +602 619 -8.076052134892594e-03 +602 620 -6.996835383339698e-03 +602 621 -6.109381318875769e-03 +602 622 -5.371977266379837e-03 +602 623 -4.753493624956895e-03 +603 603 3.988394278151355e+01 +603 576 -2.532689975072680e-03 +603 577 -2.783725492315672e-03 +603 578 -3.071047067257393e-03 +603 579 -3.401691470521394e-03 +603 580 -3.784439171232917e-03 +603 581 -4.230349322908543e-03 +603 582 -4.753493624956895e-03 +603 583 -5.371977266379808e-03 +603 584 -6.109381318875772e-03 +603 585 -6.996835383339674e-03 +603 586 -8.076052134892582e-03 +603 587 -9.403863770832814e-03 +603 588 -1.105916272470026e-02 +603 589 -1.315380302376555e-02 +603 590 -1.585023865775532e-02 +603 591 -1.939104886145119e-02 +603 592 -2.415034675252897e-02 +603 593 -3.072751892616545e-02 +603 594 -4.012781031913037e-02 +603 595 -5.413421453123205e-02 +603 596 -7.613960933881195e-02 +603 597 -1.132183869282775e-01 +603 598 -1.820810586422659e-01 +603 599 -3.301555353436766e-01 +603 600 -7.412185823610220e-01 +603 601 -3.165206906282873e+00 +603 602 -1.502055215859226e+01 +603 604 -1.502055215859645e+01 +603 605 -3.165206906282876e+00 +603 606 -7.412185823610162e-01 +603 607 -3.301555353436757e-01 +603 608 -1.820810586422643e-01 +603 609 -1.132183869282765e-01 +603 610 -7.613960933881102e-02 +603 611 -5.413421453123138e-02 +603 612 -4.012781031912974e-02 +603 613 -3.072751892616542e-02 +603 614 -2.415034675252896e-02 +603 615 -1.939104886145095e-02 +603 616 -1.585023865775514e-02 +603 617 -1.315380302376542e-02 +603 618 -1.105916272470025e-02 +603 619 -9.403863770832814e-03 +603 620 -8.076052134892582e-03 +603 621 -6.996835383339674e-03 +603 622 -6.109381318875769e-03 +603 623 -5.371977266379790e-03 +604 604 3.988394278151440e+01 +604 576 -2.312252367280536e-03 +604 577 -2.532689975072679e-03 +604 578 -2.783725492315671e-03 +604 579 -3.071047067257392e-03 +604 580 -3.401691470521384e-03 +604 581 -3.784439171232936e-03 +604 582 -4.230349322908531e-03 +604 583 -4.753493624956896e-03 +604 584 -5.371977266379821e-03 +604 585 -6.109381318875747e-03 +604 586 -6.996835383339671e-03 +604 587 -8.076052134892564e-03 +604 588 -9.403863770832830e-03 +604 589 -1.105916272470032e-02 +604 590 -1.315380302376550e-02 +604 591 -1.585023865775531e-02 +604 592 -1.939104886145111e-02 +604 593 -2.415034675252897e-02 +604 594 -3.072751892616572e-02 +604 595 -4.012781031913017e-02 +604 596 -5.413421453123204e-02 +604 597 -7.613960933881170e-02 +604 598 -1.132183869282762e-01 +604 599 -1.820810586422639e-01 +604 600 -3.301555353436757e-01 +604 601 -7.412185823610153e-01 +604 602 -3.165206906282882e+00 +604 603 -1.502055215859645e+01 +604 605 -1.502055215858810e+01 +604 606 -3.165206906282845e+00 +604 607 -7.412185823610196e-01 +604 608 -3.301555353436766e-01 +604 609 -1.820810586422670e-01 +604 610 -1.132183869282772e-01 +604 611 -7.613960933881123e-02 +604 612 -5.413421453123141e-02 +604 613 -4.012781031912996e-02 +604 614 -3.072751892616545e-02 +604 615 -2.415034675252877e-02 +604 616 -1.939104886145096e-02 +604 617 -1.585023865775520e-02 +604 618 -1.315380302376546e-02 +604 619 -1.105916272470026e-02 +604 620 -9.403863770832816e-03 +604 621 -8.076052134892573e-03 +604 622 -6.996835383339702e-03 +604 623 -6.109381318875734e-03 +605 605 3.988394278153926e+01 +605 576 -2.117777896667789e-03 +605 577 -2.312252367280530e-03 +605 578 -2.532689975072673e-03 +605 579 -2.783725492315665e-03 +605 580 -3.071047067257376e-03 +605 581 -3.401691470521392e-03 +605 582 -3.784439171232915e-03 +605 583 -4.230349322908520e-03 +605 584 -4.753493624956895e-03 +605 585 -5.371977266379786e-03 +605 586 -6.109381318875727e-03 +605 587 -6.996835383339622e-03 +605 588 -8.076052134892583e-03 +605 589 -9.403863770832813e-03 +605 590 -1.105916272470022e-02 +605 591 -1.315380302376542e-02 +605 592 -1.585023865775514e-02 +605 593 -1.939104886145097e-02 +605 594 -2.415034675252897e-02 +605 595 -3.072751892616531e-02 +605 596 -4.012781031912978e-02 +605 597 -5.413421453123111e-02 +605 598 -7.613960933881120e-02 +605 599 -1.132183869282762e-01 +605 600 -1.820810586422655e-01 +605 601 -3.301555353436775e-01 +605 602 -7.412185823610321e-01 +605 603 -3.165206906282876e+00 +605 604 -1.502055215858810e+01 +605 606 -1.502055215863989e+01 +605 607 -3.165206906282857e+00 +605 608 -7.412185823610087e-01 +605 609 -3.301555353436766e-01 +605 610 -1.820810586422654e-01 +605 611 -1.132183869282756e-01 +605 612 -7.613960933881188e-02 +605 613 -5.413421453123230e-02 +605 614 -4.012781031913035e-02 +605 615 -3.072751892616543e-02 +605 616 -2.415034675252896e-02 +605 617 -1.939104886145118e-02 +605 618 -1.585023865775536e-02 +605 619 -1.315380302376555e-02 +605 620 -1.105916272470032e-02 +605 621 -9.403863770832830e-03 +605 622 -8.076052134892653e-03 +605 623 -6.996835383339677e-03 +606 606 3.988394278164015e+01 +606 576 -1.945462087124853e-03 +606 577 -2.117777896667794e-03 +606 578 -2.312252367280536e-03 +606 579 -2.532689975072680e-03 +606 580 -2.783725492315666e-03 +606 581 -3.071047067257401e-03 +606 582 -3.401691470521394e-03 +606 583 -3.784439171232929e-03 +606 584 -4.230349322908545e-03 +606 585 -4.753493624956895e-03 +606 586 -5.371977266379805e-03 +606 587 -6.109381318875730e-03 +606 588 -6.996835383339698e-03 +606 589 -8.076052134892592e-03 +606 590 -9.403863770832825e-03 +606 591 -1.105916272470025e-02 +606 592 -1.315380302376542e-02 +606 593 -1.585023865775520e-02 +606 594 -1.939104886145118e-02 +606 595 -2.415034675252897e-02 +606 596 -3.072751892616544e-02 +606 597 -4.012781031912974e-02 +606 598 -5.413421453123138e-02 +606 599 -7.613960933881123e-02 +606 600 -1.132183869282766e-01 +606 601 -1.820810586422670e-01 +606 602 -3.301555353436766e-01 +606 603 -7.412185823610162e-01 +606 604 -3.165206906282845e+00 +606 605 -1.502055215863989e+01 +606 607 -1.502055215866010e+01 +606 608 -3.165206906282856e+00 +606 609 -7.412185823610233e-01 +606 610 -3.301555353436766e-01 +606 611 -1.820810586422639e-01 +606 612 -1.132183869282762e-01 +606 613 -7.613960933881192e-02 +606 614 -5.413421453123204e-02 +606 615 -4.012781031912976e-02 +606 616 -3.072751892616530e-02 +606 617 -2.415034675252897e-02 +606 618 -1.939104886145118e-02 +606 619 -1.585023865775532e-02 +606 620 -1.315380302376550e-02 +606 621 -1.105916272470022e-02 +606 622 -9.403863770832840e-03 +606 623 -8.076052134892578e-03 +607 607 3.988394278169710e+01 +607 576 -1.792160480940038e-03 +607 577 -1.945462087124853e-03 +607 578 -2.117777896667794e-03 +607 579 -2.312252367280536e-03 +607 580 -2.532689975072674e-03 +607 581 -2.783725492315679e-03 +607 582 -3.071047067257393e-03 +607 583 -3.401691470521395e-03 +607 584 -3.784439171232938e-03 +607 585 -4.230349322908531e-03 +607 586 -4.753493624956895e-03 +607 587 -5.371977266379788e-03 +607 588 -6.109381318875769e-03 +607 589 -6.996835383339674e-03 +607 590 -8.076052134892594e-03 +607 591 -9.403863770832858e-03 +607 592 -1.105916272470025e-02 +607 593 -1.315380302376546e-02 +607 594 -1.585023865775536e-02 +607 595 -1.939104886145118e-02 +607 596 -2.415034675252906e-02 +607 597 -3.072751892616543e-02 +607 598 -4.012781031912993e-02 +607 599 -5.413421453123171e-02 +607 600 -7.613960933881217e-02 +607 601 -1.132183869282766e-01 +607 602 -1.820810586422639e-01 +607 603 -3.301555353436757e-01 +607 604 -7.412185823610196e-01 +607 605 -3.165206906282857e+00 +607 606 -1.502055215866010e+01 +607 608 -1.502055215931054e+01 +607 609 -3.165206906282875e+00 +607 610 -7.412185823610222e-01 +607 611 -3.301555353436766e-01 +607 612 -1.820810586422670e-01 +607 613 -1.132183869282775e-01 +607 614 -7.613960933881170e-02 +607 615 -5.413421453123109e-02 +607 616 -4.012781031912954e-02 +607 617 -3.072751892616529e-02 +607 618 -2.415034675252896e-02 +607 619 -1.939104886145111e-02 +607 620 -1.585023865775526e-02 +607 621 -1.315380302376538e-02 +607 622 -1.105916272470022e-02 +607 623 -9.403863770832811e-03 +608 608 3.988394278169718e+01 +608 592 -9.403863770832832e-03 +608 593 -1.105916272470026e-02 +608 594 -1.315380302376555e-02 +608 595 -1.585023865775532e-02 +608 596 -1.939104886145119e-02 +608 597 -2.415034675252897e-02 +608 598 -3.072751892616544e-02 +608 599 -4.012781031912998e-02 +608 600 -5.413421453123234e-02 +608 601 -7.613960933881213e-02 +608 602 -1.132183869282762e-01 +608 603 -1.820810586422643e-01 +608 604 -3.301555353436766e-01 +608 605 -7.412185823610087e-01 +608 606 -3.165206906282856e+00 +608 607 -1.502055215931054e+01 +608 609 -1.502055215866010e+01 +608 610 -3.165206906282895e+00 +608 611 -7.412185823610298e-01 +608 612 -3.301555353436766e-01 +608 613 -1.820810586422659e-01 +608 614 -1.132183869282762e-01 +608 615 -7.613960933881117e-02 +608 616 -5.413421453123106e-02 +608 617 -4.012781031912974e-02 +608 618 -3.072751892616542e-02 +608 619 -2.415034675252897e-02 +608 620 -1.939104886145110e-02 +608 621 -1.585023865775514e-02 +608 622 -1.315380302376542e-02 +608 623 -1.105916272470025e-02 +608 624 -9.403863770832814e-03 +608 625 -8.076052134892564e-03 +608 626 -6.996835383339622e-03 +608 627 -6.109381318875730e-03 +608 628 -5.371977266379788e-03 +608 629 -4.753493624956895e-03 +608 630 -4.230349322908508e-03 +608 631 -3.784439171232917e-03 +608 632 -3.401691470521384e-03 +608 633 -3.071047067257376e-03 +608 634 -2.783725492315666e-03 +608 635 -2.532689975072674e-03 +608 636 -2.312252367280536e-03 +608 637 -2.117777896667785e-03 +608 638 -1.945462087124849e-03 +608 639 -1.792160480940035e-03 +609 609 3.988394278164020e+01 +609 592 -8.076052134892568e-03 +609 593 -9.403863770832816e-03 +609 594 -1.105916272470032e-02 +609 595 -1.315380302376550e-02 +609 596 -1.585023865775531e-02 +609 597 -1.939104886145111e-02 +609 598 -2.415034675252896e-02 +609 599 -3.072751892616545e-02 +609 600 -4.012781031913035e-02 +609 601 -5.413421453123204e-02 +609 602 -7.613960933881170e-02 +609 603 -1.132183869282765e-01 +609 604 -1.820810586422670e-01 +609 605 -3.301555353436766e-01 +609 606 -7.412185823610233e-01 +609 607 -3.165206906282875e+00 +609 608 -1.502055215866010e+01 +609 610 -1.502055215863993e+01 +609 611 -3.165206906282869e+00 +609 612 -7.412185823610162e-01 +609 613 -3.301555353436766e-01 +609 614 -1.820810586422639e-01 +609 615 -1.132183869282762e-01 +609 616 -7.613960933881100e-02 +609 617 -5.413421453123141e-02 +609 618 -4.012781031912996e-02 +609 619 -3.072751892616545e-02 +609 620 -2.415034675252897e-02 +609 621 -1.939104886145097e-02 +609 622 -1.585023865775520e-02 +609 623 -1.315380302376546e-02 +609 624 -1.105916272470026e-02 +609 625 -9.403863770832830e-03 +609 626 -8.076052134892583e-03 +609 627 -6.996835383339698e-03 +609 628 -6.109381318875769e-03 +609 629 -5.371977266379837e-03 +609 630 -4.753493624956895e-03 +609 631 -4.230349322908543e-03 +609 632 -3.784439171232936e-03 +609 633 -3.401691470521392e-03 +609 634 -3.071047067257401e-03 +609 635 -2.783725492315679e-03 +609 636 -2.532689975072691e-03 +609 637 -2.312252367280536e-03 +609 638 -2.117777896667799e-03 +609 639 -1.945462087124857e-03 +610 610 3.988394278153928e+01 +610 592 -6.996835383339674e-03 +610 593 -8.076052134892570e-03 +610 594 -9.403863770832813e-03 +610 595 -1.105916272470022e-02 +610 596 -1.315380302376542e-02 +610 597 -1.585023865775514e-02 +610 598 -1.939104886145096e-02 +610 599 -2.415034675252878e-02 +610 600 -3.072751892616544e-02 +610 601 -4.012781031912978e-02 +610 602 -5.413421453123111e-02 +610 603 -7.613960933881102e-02 +610 604 -1.132183869282772e-01 +610 605 -1.820810586422654e-01 +610 606 -3.301555353436766e-01 +610 607 -7.412185823610222e-01 +610 608 -3.165206906282895e+00 +610 609 -1.502055215863993e+01 +610 611 -1.502055215858812e+01 +610 612 -3.165206906282830e+00 +610 613 -7.412185823609991e-01 +610 614 -3.301555353436757e-01 +610 615 -1.820810586422655e-01 +610 616 -1.132183869282771e-01 +610 617 -7.613960933881185e-02 +610 618 -5.413421453123230e-02 +610 619 -4.012781031913037e-02 +610 620 -3.072751892616572e-02 +610 621 -2.415034675252897e-02 +610 622 -1.939104886145118e-02 +610 623 -1.585023865775536e-02 +610 624 -1.315380302376555e-02 +610 625 -1.105916272470032e-02 +610 626 -9.403863770832813e-03 +610 627 -8.076052134892592e-03 +610 628 -6.996835383339674e-03 +610 629 -6.109381318875769e-03 +610 630 -5.371977266379790e-03 +610 631 -4.753493624956895e-03 +610 632 -4.230349322908531e-03 +610 633 -3.784439171232915e-03 +610 634 -3.401691470521394e-03 +610 635 -3.071047067257393e-03 +610 636 -2.783725492315679e-03 +610 637 -2.532689975072674e-03 +610 638 -2.312252367280536e-03 +610 639 -2.117777896667794e-03 +611 611 3.988394278151435e+01 +611 592 -6.109381318875747e-03 +611 593 -6.996835383339671e-03 +611 594 -8.076052134892575e-03 +611 595 -9.403863770832839e-03 +611 596 -1.105916272470025e-02 +611 597 -1.315380302376542e-02 +611 598 -1.585023865775520e-02 +611 599 -1.939104886145103e-02 +611 600 -2.415034675252906e-02 +611 601 -3.072751892616544e-02 +611 602 -4.012781031912974e-02 +611 603 -5.413421453123138e-02 +611 604 -7.613960933881123e-02 +611 605 -1.132183869282756e-01 +611 606 -1.820810586422639e-01 +611 607 -3.301555353436766e-01 +611 608 -7.412185823610298e-01 +611 609 -3.165206906282869e+00 +611 610 -1.502055215858812e+01 +611 612 -1.502055215859640e+01 +611 613 -3.165206906282823e+00 +611 614 -7.412185823610238e-01 +611 615 -3.301555353436775e-01 +611 616 -1.820810586422686e-01 +611 617 -1.132183869282767e-01 +611 618 -7.613960933881210e-02 +611 619 -5.413421453123205e-02 +611 620 -4.012781031913017e-02 +611 621 -3.072751892616531e-02 +611 622 -2.415034675252897e-02 +611 623 -1.939104886145118e-02 +611 624 -1.585023865775532e-02 +611 625 -1.315380302376550e-02 +611 626 -1.105916272470022e-02 +611 627 -9.403863770832825e-03 +611 628 -8.076052134892594e-03 +611 629 -6.996835383339702e-03 +611 630 -6.109381318875734e-03 +611 631 -5.371977266379808e-03 +611 632 -4.753493624956896e-03 +611 633 -4.230349322908520e-03 +611 634 -3.784439171232929e-03 +611 635 -3.401691470521395e-03 +611 636 -3.071047067257401e-03 +611 637 -2.783725492315667e-03 +611 638 -2.532689975072680e-03 +611 639 -2.312252367280537e-03 +612 612 3.988394278151350e+01 +612 592 -5.371977266379786e-03 +612 593 -6.109381318875727e-03 +612 594 -6.996835383339622e-03 +612 595 -8.076052134892604e-03 +612 596 -9.403863770832825e-03 +612 597 -1.105916272470022e-02 +612 598 -1.315380302376542e-02 +612 599 -1.585023865775520e-02 +612 600 -1.939104886145118e-02 +612 601 -2.415034675252897e-02 +612 602 -3.072751892616529e-02 +612 603 -4.012781031912974e-02 +612 604 -5.413421453123141e-02 +612 605 -7.613960933881188e-02 +612 606 -1.132183869282762e-01 +612 607 -1.820810586422670e-01 +612 608 -3.301555353436766e-01 +612 609 -7.412185823610162e-01 +612 610 -3.165206906282830e+00 +612 611 -1.502055215859640e+01 +612 613 -1.502055215859227e+01 +612 614 -3.165206906282901e+00 +612 615 -7.412185823610340e-01 +612 616 -3.301555353436779e-01 +612 617 -1.820810586422643e-01 +612 618 -1.132183869282765e-01 +612 619 -7.613960933881193e-02 +612 620 -5.413421453123204e-02 +612 621 -4.012781031912978e-02 +612 622 -3.072751892616544e-02 +612 623 -2.415034675252906e-02 +612 624 -1.939104886145119e-02 +612 625 -1.585023865775531e-02 +612 626 -1.315380302376542e-02 +612 627 -1.105916272470025e-02 +612 628 -9.403863770832858e-03 +612 629 -8.076052134892655e-03 +612 630 -6.996835383339677e-03 +612 631 -6.109381318875772e-03 +612 632 -5.371977266379821e-03 +612 633 -4.753493624956895e-03 +612 634 -4.230349322908545e-03 +612 635 -3.784439171232938e-03 +612 636 -3.401691470521412e-03 +612 637 -3.071047067257394e-03 +612 638 -2.783725492315679e-03 +612 639 -2.532689975072686e-03 +613 613 3.988394278152492e+01 +613 592 -4.753493624956895e-03 +613 593 -5.371977266379805e-03 +613 594 -6.109381318875730e-03 +613 595 -6.996835383339698e-03 +613 596 -8.076052134892592e-03 +613 597 -9.403863770832811e-03 +613 598 -1.105916272470025e-02 +613 599 -1.315380302376546e-02 +613 600 -1.585023865775536e-02 +613 601 -1.939104886145118e-02 +613 602 -2.415034675252896e-02 +613 603 -3.072751892616542e-02 +613 604 -4.012781031912996e-02 +613 605 -5.413421453123230e-02 +613 606 -7.613960933881192e-02 +613 607 -1.132183869282775e-01 +613 608 -1.820810586422659e-01 +613 609 -3.301555353436766e-01 +613 610 -7.412185823609991e-01 +613 611 -3.165206906282823e+00 +613 612 -1.502055215859227e+01 +613 614 -1.502055215860529e+01 +613 615 -3.165206906282866e+00 +613 616 -7.412185823610267e-01 +613 617 -3.301555353436774e-01 +613 618 -1.820810586422648e-01 +613 619 -1.132183869282766e-01 +613 620 -7.613960933881173e-02 +613 621 -5.413421453123111e-02 +613 622 -4.012781031912974e-02 +613 623 -3.072751892616543e-02 +613 624 -2.415034675252897e-02 +613 625 -1.939104886145111e-02 +613 626 -1.585023865775514e-02 +613 627 -1.315380302376542e-02 +613 628 -1.105916272470025e-02 +613 629 -9.403863770832832e-03 +613 630 -8.076052134892568e-03 +613 631 -6.996835383339674e-03 +613 632 -6.109381318875747e-03 +613 633 -5.371977266379786e-03 +613 634 -4.753493624956895e-03 +613 635 -4.230349322908531e-03 +613 636 -3.784439171232937e-03 +613 637 -3.401691470521385e-03 +613 638 -3.071047067257393e-03 +613 639 -2.783725492315672e-03 +614 614 3.988394278128560e+01 +614 592 -4.230349322908531e-03 +614 593 -4.753493624956895e-03 +614 594 -5.371977266379788e-03 +614 595 -6.109381318875769e-03 +614 596 -6.996835383339674e-03 +614 597 -8.076052134892583e-03 +614 598 -9.403863770832830e-03 +614 599 -1.105916272470026e-02 +614 600 -1.315380302376555e-02 +614 601 -1.585023865775531e-02 +614 602 -1.939104886145111e-02 +614 603 -2.415034675252896e-02 +614 604 -3.072751892616545e-02 +614 605 -4.012781031913035e-02 +614 606 -5.413421453123204e-02 +614 607 -7.613960933881170e-02 +614 608 -1.132183869282762e-01 +614 609 -1.820810586422639e-01 +614 610 -3.301555353436757e-01 +614 611 -7.412185823610238e-01 +614 612 -3.165206906282901e+00 +614 613 -1.502055215860529e+01 +614 615 -1.502055215840038e+01 +614 616 -3.165206906282900e+00 +614 617 -7.412185823610373e-01 +614 618 -3.301555353436751e-01 +614 619 -1.820810586422670e-01 +614 620 -1.132183869282780e-01 +614 621 -7.613960933881117e-02 +614 622 -5.413421453123141e-02 +614 623 -4.012781031912996e-02 +614 624 -3.072751892616545e-02 +614 625 -2.415034675252897e-02 +614 626 -1.939104886145097e-02 +614 627 -1.585023865775520e-02 +614 628 -1.315380302376546e-02 +614 629 -1.105916272470026e-02 +614 630 -9.403863770832816e-03 +614 631 -8.076052134892570e-03 +614 632 -6.996835383339671e-03 +614 633 -6.109381318875727e-03 +614 634 -5.371977266379805e-03 +614 635 -4.753493624956895e-03 +614 636 -4.230349322908543e-03 +614 637 -3.784439171232917e-03 +614 638 -3.401691470521394e-03 +614 639 -3.071047067257393e-03 +615 615 3.988394278105616e+01 +615 592 -3.784439171232937e-03 +615 593 -4.230349322908543e-03 +615 594 -4.753493624956895e-03 +615 595 -5.371977266379837e-03 +615 596 -6.109381318875769e-03 +615 597 -6.996835383339702e-03 +615 598 -8.076052134892630e-03 +615 599 -9.403863770832788e-03 +615 600 -1.105916272470025e-02 +615 601 -1.315380302376542e-02 +615 602 -1.585023865775514e-02 +615 603 -1.939104886145095e-02 +615 604 -2.415034675252877e-02 +615 605 -3.072751892616543e-02 +615 606 -4.012781031912976e-02 +615 607 -5.413421453123109e-02 +615 608 -7.613960933881117e-02 +615 609 -1.132183869282762e-01 +615 610 -1.820810586422655e-01 +615 611 -3.301555353436775e-01 +615 612 -7.412185823610340e-01 +615 613 -3.165206906282866e+00 +615 614 -1.502055215840038e+01 +615 616 -1.502055215835501e+01 +615 617 -3.165206906282868e+00 +615 618 -7.412185823610055e-01 +615 619 -3.301555353436766e-01 +615 620 -1.820810586422671e-01 +615 621 -1.132183869282761e-01 +615 622 -7.613960933881191e-02 +615 623 -5.413421453123234e-02 +615 624 -4.012781031913039e-02 +615 625 -3.072751892616573e-02 +615 626 -2.415034675252898e-02 +615 627 -1.939104886145118e-02 +615 628 -1.585023865775537e-02 +615 629 -1.315380302376555e-02 +615 630 -1.105916272470032e-02 +615 631 -9.403863770832814e-03 +615 632 -8.076052134892575e-03 +615 633 -6.996835383339622e-03 +615 634 -6.109381318875730e-03 +615 635 -5.371977266379788e-03 +615 636 -4.753493624956895e-03 +615 637 -4.230349322908508e-03 +615 638 -3.784439171232917e-03 +615 639 -3.401691470521385e-03 +616 616 3.988394278102302e+01 +616 592 -3.401691470521385e-03 +616 593 -3.784439171232917e-03 +616 594 -4.230349322908508e-03 +616 595 -4.753493624956895e-03 +616 596 -5.371977266379790e-03 +616 597 -6.109381318875734e-03 +616 598 -6.996835383339677e-03 +616 599 -8.076052134892556e-03 +616 600 -9.403863770832811e-03 +616 601 -1.105916272470022e-02 +616 602 -1.315380302376537e-02 +616 603 -1.585023865775514e-02 +616 604 -1.939104886145096e-02 +616 605 -2.415034675252896e-02 +616 606 -3.072751892616530e-02 +616 607 -4.012781031912954e-02 +616 608 -5.413421453123106e-02 +616 609 -7.613960933881100e-02 +616 610 -1.132183869282771e-01 +616 611 -1.820810586422686e-01 +616 612 -3.301555353436779e-01 +616 613 -7.412185823610267e-01 +616 614 -3.165206906282900e+00 +616 615 -1.502055215835501e+01 +616 617 -1.502055215836210e+01 +616 618 -3.165206906282820e+00 +616 619 -7.412185823610000e-01 +616 620 -3.301555353436778e-01 +616 621 -1.820810586422634e-01 +616 622 -1.132183869282754e-01 +616 623 -7.613960933881203e-02 +616 624 -5.413421453123236e-02 +616 625 -4.012781031913037e-02 +616 626 -3.072751892616545e-02 +616 627 -2.415034675252906e-02 +616 628 -1.939104886145125e-02 +616 629 -1.585023865775537e-02 +616 630 -1.315380302376555e-02 +616 631 -1.105916272470025e-02 +616 632 -9.403863770832853e-03 +616 633 -8.076052134892604e-03 +616 634 -6.996835383339698e-03 +616 635 -6.109381318875769e-03 +616 636 -5.371977266379837e-03 +616 637 -4.753493624956895e-03 +616 638 -4.230349322908543e-03 +616 639 -3.784439171232937e-03 +617 617 3.988394278106472e+01 +617 592 -3.071047067257393e-03 +617 593 -3.401691470521394e-03 +617 594 -3.784439171232917e-03 +617 595 -4.230349322908543e-03 +617 596 -4.753493624956895e-03 +617 597 -5.371977266379808e-03 +617 598 -6.109381318875772e-03 +617 599 -6.996835383339674e-03 +617 600 -8.076052134892592e-03 +617 601 -9.403863770832825e-03 +617 602 -1.105916272470022e-02 +617 603 -1.315380302376542e-02 +617 604 -1.585023865775520e-02 +617 605 -1.939104886145118e-02 +617 606 -2.415034675252897e-02 +617 607 -3.072751892616529e-02 +617 608 -4.012781031912974e-02 +617 609 -5.413421453123141e-02 +617 610 -7.613960933881185e-02 +617 611 -1.132183869282767e-01 +617 612 -1.820810586422643e-01 +617 613 -3.301555353436774e-01 +617 614 -7.412185823610373e-01 +617 615 -3.165206906282868e+00 +617 616 -1.502055215836210e+01 +617 618 -1.502055215839547e+01 +617 619 -3.165206906282855e+00 +617 620 -7.412185823610316e-01 +617 621 -3.301555353436740e-01 +617 622 -1.820810586422660e-01 +617 623 -1.132183869282774e-01 +617 624 -7.613960933881193e-02 +617 625 -5.413421453123204e-02 +617 626 -4.012781031912978e-02 +617 627 -3.072751892616544e-02 +617 628 -2.415034675252906e-02 +617 629 -1.939104886145119e-02 +617 630 -1.585023865775531e-02 +617 631 -1.315380302376542e-02 +617 632 -1.105916272470025e-02 +617 633 -9.403863770832825e-03 +617 634 -8.076052134892592e-03 +617 635 -6.996835383339674e-03 +617 636 -6.109381318875769e-03 +617 637 -5.371977266379790e-03 +617 638 -4.753493624956895e-03 +617 639 -4.230349322908531e-03 +618 618 3.988394278115150e+01 +618 592 -2.783725492315671e-03 +618 593 -3.071047067257392e-03 +618 594 -3.401691470521384e-03 +618 595 -3.784439171232936e-03 +618 596 -4.230349322908531e-03 +618 597 -4.753493624956896e-03 +618 598 -5.371977266379821e-03 +618 599 -6.109381318875747e-03 +618 600 -6.996835383339671e-03 +618 601 -8.076052134892575e-03 +618 602 -9.403863770832827e-03 +618 603 -1.105916272470025e-02 +618 604 -1.315380302376546e-02 +618 605 -1.585023865775536e-02 +618 606 -1.939104886145118e-02 +618 607 -2.415034675252896e-02 +618 608 -3.072751892616542e-02 +618 609 -4.012781031912996e-02 +618 610 -5.413421453123230e-02 +618 611 -7.613960933881210e-02 +618 612 -1.132183869282765e-01 +618 613 -1.820810586422648e-01 +618 614 -3.301555353436751e-01 +618 615 -7.412185823610055e-01 +618 616 -3.165206906282820e+00 +618 617 -1.502055215839547e+01 +618 619 -1.502055215844899e+01 +618 620 -3.165206906282900e+00 +618 621 -7.412185823610296e-01 +618 622 -3.301555353436803e-01 +618 623 -1.820810586422659e-01 +618 624 -1.132183869282761e-01 +618 625 -7.613960933881185e-02 +618 626 -5.413421453123111e-02 +618 627 -4.012781031912974e-02 +618 628 -3.072751892616543e-02 +618 629 -2.415034675252897e-02 +618 630 -1.939104886145111e-02 +618 631 -1.585023865775514e-02 +618 632 -1.315380302376542e-02 +618 633 -1.105916272470022e-02 +618 634 -9.403863770832811e-03 +618 635 -8.076052134892583e-03 +618 636 -6.996835383339702e-03 +618 637 -6.109381318875734e-03 +618 638 -5.371977266379808e-03 +618 639 -4.753493624956898e-03 +619 619 3.988394278128116e+01 +619 592 -2.532689975072673e-03 +619 593 -2.783725492315665e-03 +619 594 -3.071047067257376e-03 +619 595 -3.401691470521392e-03 +619 596 -3.784439171232915e-03 +619 597 -4.230349322908520e-03 +619 598 -4.753493624956895e-03 +619 599 -5.371977266379786e-03 +619 600 -6.109381318875727e-03 +619 601 -6.996835383339622e-03 +619 602 -8.076052134892594e-03 +619 603 -9.403863770832814e-03 +619 604 -1.105916272470026e-02 +619 605 -1.315380302376555e-02 +619 606 -1.585023865775532e-02 +619 607 -1.939104886145111e-02 +619 608 -2.415034675252897e-02 +619 609 -3.072751892616545e-02 +619 610 -4.012781031913037e-02 +619 611 -5.413421453123205e-02 +619 612 -7.613960933881193e-02 +619 613 -1.132183869282766e-01 +619 614 -1.820810586422670e-01 +619 615 -3.301555353436766e-01 +619 616 -7.412185823610000e-01 +619 617 -3.165206906282855e+00 +619 618 -1.502055215844899e+01 +619 620 -1.502055215852584e+01 +619 621 -3.165206906282895e+00 +619 622 -7.412185823610380e-01 +619 623 -3.301555353436800e-01 +619 624 -1.820810586422648e-01 +619 625 -1.132183869282770e-01 +619 626 -7.613960933881100e-02 +619 627 -5.413421453123138e-02 +619 628 -4.012781031912993e-02 +619 629 -3.072751892616544e-02 +619 630 -2.415034675252896e-02 +619 631 -1.939104886145096e-02 +619 632 -1.585023865775520e-02 +619 633 -1.315380302376542e-02 +619 634 -1.105916272470025e-02 +619 635 -9.403863770832832e-03 +619 636 -8.076052134892642e-03 +619 637 -6.996835383339677e-03 +619 638 -6.109381318875772e-03 +619 639 -5.371977266379824e-03 +620 620 3.988394278146377e+01 +620 592 -2.312252367280536e-03 +620 593 -2.532689975072680e-03 +620 594 -2.783725492315666e-03 +620 595 -3.071047067257401e-03 +620 596 -3.401691470521394e-03 +620 597 -3.784439171232929e-03 +620 598 -4.230349322908545e-03 +620 599 -4.753493624956895e-03 +620 600 -5.371977266379805e-03 +620 601 -6.109381318875730e-03 +620 602 -6.996835383339698e-03 +620 603 -8.076052134892582e-03 +620 604 -9.403863770832816e-03 +620 605 -1.105916272470032e-02 +620 606 -1.315380302376550e-02 +620 607 -1.585023865775526e-02 +620 608 -1.939104886145110e-02 +620 609 -2.415034675252897e-02 +620 610 -3.072751892616572e-02 +620 611 -4.012781031913017e-02 +620 612 -5.413421453123204e-02 +620 613 -7.613960933881173e-02 +620 614 -1.132183869282780e-01 +620 615 -1.820810586422671e-01 +620 616 -3.301555353436778e-01 +620 617 -7.412185823610316e-01 +620 618 -3.165206906282900e+00 +620 619 -1.502055215852584e+01 +620 621 -1.502055215863291e+01 +620 622 -3.165206906282878e+00 +620 623 -7.412185823610256e-01 +620 624 -3.301555353436746e-01 +620 625 -1.820810586422650e-01 +620 626 -1.132183869282751e-01 +620 627 -7.613960933881064e-02 +620 628 -5.413421453123171e-02 +620 629 -4.012781031912998e-02 +620 630 -3.072751892616545e-02 +620 631 -2.415034675252878e-02 +620 632 -1.939104886145103e-02 +620 633 -1.585023865775520e-02 +620 634 -1.315380302376546e-02 +620 635 -1.105916272470026e-02 +620 636 -9.403863770832832e-03 +620 637 -8.076052134892557e-03 +620 638 -6.996835383339674e-03 +620 639 -6.109381318875750e-03 +621 621 3.988394278171951e+01 +621 592 -2.117777896667794e-03 +621 593 -2.312252367280536e-03 +621 594 -2.532689975072674e-03 +621 595 -2.783725492315679e-03 +621 596 -3.071047067257393e-03 +621 597 -3.401691470521395e-03 +621 598 -3.784439171232938e-03 +621 599 -4.230349322908531e-03 +621 600 -4.753493624956895e-03 +621 601 -5.371977266379788e-03 +621 602 -6.109381318875769e-03 +621 603 -6.996835383339674e-03 +621 604 -8.076052134892573e-03 +621 605 -9.403863770832830e-03 +621 606 -1.105916272470022e-02 +621 607 -1.315380302376538e-02 +621 608 -1.585023865775514e-02 +621 609 -1.939104886145097e-02 +621 610 -2.415034675252897e-02 +621 611 -3.072751892616531e-02 +621 612 -4.012781031912978e-02 +621 613 -5.413421453123111e-02 +621 614 -7.613960933881117e-02 +621 615 -1.132183869282761e-01 +621 616 -1.820810586422634e-01 +621 617 -3.301555353436740e-01 +621 618 -7.412185823610296e-01 +621 619 -3.165206906282895e+00 +621 620 -1.502055215863291e+01 +621 622 -1.502055215878382e+01 +621 623 -3.165206906282851e+00 +621 624 -7.412185823610060e-01 +621 625 -3.301555353436773e-01 +621 626 -1.820810586422666e-01 +621 627 -1.132183869282764e-01 +621 628 -7.613960933881257e-02 +621 629 -5.413421453123234e-02 +621 630 -4.012781031913035e-02 +621 631 -3.072751892616544e-02 +621 632 -2.415034675252906e-02 +621 633 -1.939104886145118e-02 +621 634 -1.585023865775536e-02 +621 635 -1.315380302376555e-02 +621 636 -1.105916272470032e-02 +621 637 -9.403863770832813e-03 +621 638 -8.076052134892592e-03 +621 639 -6.996835383339674e-03 +622 622 3.988394278208165e+01 +622 592 -1.945462087124857e-03 +622 593 -2.117777896667799e-03 +622 594 -2.312252367280536e-03 +622 595 -2.532689975072691e-03 +622 596 -2.783725492315679e-03 +622 597 -3.071047067257401e-03 +622 598 -3.401691470521412e-03 +622 599 -3.784439171232937e-03 +622 600 -4.230349322908543e-03 +622 601 -4.753493624956895e-03 +622 602 -5.371977266379837e-03 +622 603 -6.109381318875769e-03 +622 604 -6.996835383339702e-03 +622 605 -8.076052134892653e-03 +622 606 -9.403863770832840e-03 +622 607 -1.105916272470022e-02 +622 608 -1.315380302376542e-02 +622 609 -1.585023865775520e-02 +622 610 -1.939104886145118e-02 +622 611 -2.415034675252897e-02 +622 612 -3.072751892616544e-02 +622 613 -4.012781031912974e-02 +622 614 -5.413421453123141e-02 +622 615 -7.613960933881191e-02 +622 616 -1.132183869282754e-01 +622 617 -1.820810586422660e-01 +622 618 -3.301555353436803e-01 +622 619 -7.412185823610380e-01 +622 620 -3.165206906282878e+00 +622 621 -1.502055215878382e+01 +622 623 -1.502055215899850e+01 +622 624 -3.165206906282836e+00 +622 625 -7.412185823610067e-01 +622 626 -3.301555353436725e-01 +622 627 -1.820810586422628e-01 +622 628 -1.132183869282770e-01 +622 629 -7.613960933881209e-02 +622 630 -5.413421453123204e-02 +622 631 -4.012781031912978e-02 +622 632 -3.072751892616544e-02 +622 633 -2.415034675252897e-02 +622 634 -1.939104886145118e-02 +622 635 -1.585023865775532e-02 +622 636 -1.315380302376550e-02 +622 637 -1.105916272470022e-02 +622 638 -9.403863770832825e-03 +622 639 -8.076052134892578e-03 +623 623 3.988394278260297e+01 +623 592 -1.792160480940035e-03 +623 593 -1.945462087124849e-03 +623 594 -2.117777896667785e-03 +623 595 -2.312252367280536e-03 +623 596 -2.532689975072674e-03 +623 597 -2.783725492315667e-03 +623 598 -3.071047067257394e-03 +623 599 -3.401691470521385e-03 +623 600 -3.784439171232917e-03 +623 601 -4.230349322908508e-03 +623 602 -4.753493624956895e-03 +623 603 -5.371977266379790e-03 +623 604 -6.109381318875734e-03 +623 605 -6.996835383339677e-03 +623 606 -8.076052134892578e-03 +623 607 -9.403863770832811e-03 +623 608 -1.105916272470025e-02 +623 609 -1.315380302376546e-02 +623 610 -1.585023865775536e-02 +623 611 -1.939104886145118e-02 +623 612 -2.415034675252906e-02 +623 613 -3.072751892616543e-02 +623 614 -4.012781031912996e-02 +623 615 -5.413421453123234e-02 +623 616 -7.613960933881203e-02 +623 617 -1.132183869282774e-01 +623 618 -1.820810586422659e-01 +623 619 -3.301555353436800e-01 +623 620 -7.412185823610256e-01 +623 621 -3.165206906282851e+00 +623 622 -1.502055215899850e+01 +623 624 -1.502055215931069e+01 +623 625 -3.165206906282862e+00 +623 626 -7.412185823610271e-01 +623 627 -3.301555353436731e-01 +623 628 -1.820810586422663e-01 +623 629 -1.132183869282771e-01 +623 630 -7.613960933881173e-02 +623 631 -5.413421453123111e-02 +623 632 -4.012781031912974e-02 +623 633 -3.072751892616529e-02 +623 634 -2.415034675252896e-02 +623 635 -1.939104886145111e-02 +623 636 -1.585023865775526e-02 +623 637 -1.315380302376538e-02 +623 638 -1.105916272470022e-02 +623 639 -9.403863770832828e-03 +624 624 3.988394278260302e+01 +624 608 -9.403863770832814e-03 +624 609 -1.105916272470026e-02 +624 610 -1.315380302376555e-02 +624 611 -1.585023865775532e-02 +624 612 -1.939104886145119e-02 +624 613 -2.415034675252897e-02 +624 614 -3.072751892616545e-02 +624 615 -4.012781031913039e-02 +624 616 -5.413421453123236e-02 +624 617 -7.613960933881193e-02 +624 618 -1.132183869282761e-01 +624 619 -1.820810586422648e-01 +624 620 -3.301555353436746e-01 +624 621 -7.412185823610060e-01 +624 622 -3.165206906282836e+00 +624 623 -1.502055215931069e+01 +624 625 -1.502055215899855e+01 +624 626 -3.165206906282895e+00 +624 627 -7.412185823610338e-01 +624 628 -3.301555353436824e-01 +624 629 -1.820810586422670e-01 +624 630 -1.132183869282764e-01 +624 631 -7.613960933881062e-02 +624 632 -5.413421453123138e-02 +624 633 -4.012781031912974e-02 +624 634 -3.072751892616542e-02 +624 635 -2.415034675252897e-02 +624 636 -1.939104886145110e-02 +624 637 -1.585023865775514e-02 +624 638 -1.315380302376542e-02 +624 639 -1.105916272470025e-02 +624 640 -9.403863770832832e-03 +624 641 -8.076052134892583e-03 +624 642 -6.996835383339674e-03 +624 643 -6.109381318875769e-03 +624 644 -5.371977266379790e-03 +624 645 -4.753493624956895e-03 +624 646 -4.230349322908531e-03 +624 647 -3.784439171232939e-03 +624 648 -3.401691470521395e-03 +624 649 -3.071047067257393e-03 +624 650 -2.783725492315679e-03 +624 651 -2.532689975072674e-03 +624 652 -2.312252367280536e-03 +624 653 -2.117777896667794e-03 +624 654 -1.945462087124857e-03 +624 655 -1.792160480940039e-03 +625 625 3.988394278208168e+01 +625 608 -8.076052134892564e-03 +625 609 -9.403863770832830e-03 +625 610 -1.105916272470032e-02 +625 611 -1.315380302376550e-02 +625 612 -1.585023865775531e-02 +625 613 -1.939104886145111e-02 +625 614 -2.415034675252897e-02 +625 615 -3.072751892616573e-02 +625 616 -4.012781031913037e-02 +625 617 -5.413421453123204e-02 +625 618 -7.613960933881185e-02 +625 619 -1.132183869282770e-01 +625 620 -1.820810586422650e-01 +625 621 -3.301555353436773e-01 +625 622 -7.412185823610067e-01 +625 623 -3.165206906282862e+00 +625 624 -1.502055215899855e+01 +625 626 -1.502055215878376e+01 +625 627 -3.165206906282899e+00 +625 628 -7.412185823610385e-01 +625 629 -3.301555353436798e-01 +625 630 -1.820810586422644e-01 +625 631 -1.132183869282752e-01 +625 632 -7.613960933881120e-02 +625 633 -5.413421453123141e-02 +625 634 -4.012781031912996e-02 +625 635 -3.072751892616545e-02 +625 636 -2.415034675252897e-02 +625 637 -1.939104886145097e-02 +625 638 -1.585023865775520e-02 +625 639 -1.315380302376546e-02 +625 640 -1.105916272470026e-02 +625 641 -9.403863770832816e-03 +625 642 -8.076052134892573e-03 +625 643 -6.996835383339702e-03 +625 644 -6.109381318875734e-03 +625 645 -5.371977266379808e-03 +625 646 -4.753493624956898e-03 +625 647 -4.230349322908547e-03 +625 648 -3.784439171232931e-03 +625 649 -3.401691470521395e-03 +625 650 -3.071047067257401e-03 +625 651 -2.783725492315667e-03 +625 652 -2.532689975072680e-03 +625 653 -2.312252367280537e-03 +625 654 -2.117777896667799e-03 +625 655 -1.945462087124854e-03 +626 626 3.988394278171958e+01 +626 608 -6.996835383339622e-03 +626 609 -8.076052134892583e-03 +626 610 -9.403863770832813e-03 +626 611 -1.105916272470022e-02 +626 612 -1.315380302376542e-02 +626 613 -1.585023865775514e-02 +626 614 -1.939104886145097e-02 +626 615 -2.415034675252898e-02 +626 616 -3.072751892616545e-02 +626 617 -4.012781031912978e-02 +626 618 -5.413421453123111e-02 +626 619 -7.613960933881100e-02 +626 620 -1.132183869282751e-01 +626 621 -1.820810586422666e-01 +626 622 -3.301555353436725e-01 +626 623 -7.412185823610271e-01 +626 624 -3.165206906282895e+00 +626 625 -1.502055215878376e+01 +626 627 -1.502055215863298e+01 +626 628 -3.165206906282894e+00 +626 629 -7.412185823610276e-01 +626 630 -3.301555353436742e-01 +626 631 -1.820810586422639e-01 +626 632 -1.132183869282771e-01 +626 633 -7.613960933881206e-02 +626 634 -5.413421453123230e-02 +626 635 -4.012781031913037e-02 +626 636 -3.072751892616572e-02 +626 637 -2.415034675252897e-02 +626 638 -1.939104886145118e-02 +626 639 -1.585023865775536e-02 +626 640 -1.315380302376555e-02 +626 641 -1.105916272470032e-02 +626 642 -9.403863770832830e-03 +626 643 -8.076052134892653e-03 +626 644 -6.996835383339677e-03 +626 645 -6.109381318875772e-03 +626 646 -5.371977266379824e-03 +626 647 -4.753493624956926e-03 +626 648 -4.230349322908547e-03 +626 649 -3.784439171232938e-03 +626 650 -3.401691470521412e-03 +626 651 -3.071047067257394e-03 +626 652 -2.783725492315679e-03 +626 653 -2.532689975072686e-03 +626 654 -2.312252367280547e-03 +626 655 -2.117777896667799e-03 +627 627 3.988394278146372e+01 +627 608 -6.109381318875730e-03 +627 609 -6.996835383339698e-03 +627 610 -8.076052134892592e-03 +627 611 -9.403863770832825e-03 +627 612 -1.105916272470025e-02 +627 613 -1.315380302376542e-02 +627 614 -1.585023865775520e-02 +627 615 -1.939104886145118e-02 +627 616 -2.415034675252906e-02 +627 617 -3.072751892616544e-02 +627 618 -4.012781031912974e-02 +627 619 -5.413421453123138e-02 +627 620 -7.613960933881064e-02 +627 621 -1.132183869282764e-01 +627 622 -1.820810586422628e-01 +627 623 -3.301555353436731e-01 +627 624 -7.412185823610338e-01 +627 625 -3.165206906282899e+00 +627 626 -1.502055215863298e+01 +627 628 -1.502055215852579e+01 +627 629 -3.165206906282847e+00 +627 630 -7.412185823610038e-01 +627 631 -3.301555353436766e-01 +627 632 -1.820810586422686e-01 +627 633 -1.132183869282777e-01 +627 634 -7.613960933881191e-02 +627 635 -5.413421453123205e-02 +627 636 -4.012781031913017e-02 +627 637 -3.072751892616531e-02 +627 638 -2.415034675252897e-02 +627 639 -1.939104886145118e-02 +627 640 -1.585023865775532e-02 +627 641 -1.315380302376550e-02 +627 642 -1.105916272470022e-02 +627 643 -9.403863770832840e-03 +627 644 -8.076052134892578e-03 +627 645 -6.996835383339674e-03 +627 646 -6.109381318875750e-03 +627 647 -5.371977266379823e-03 +627 648 -4.753493624956898e-03 +627 649 -4.230349322908531e-03 +627 650 -3.784439171232937e-03 +627 651 -3.401691470521385e-03 +627 652 -3.071047067257393e-03 +627 653 -2.783725492315672e-03 +627 654 -2.532689975072686e-03 +627 655 -2.312252367280537e-03 +628 628 3.988394278128110e+01 +628 608 -5.371977266379788e-03 +628 609 -6.109381318875769e-03 +628 610 -6.996835383339674e-03 +628 611 -8.076052134892594e-03 +628 612 -9.403863770832858e-03 +628 613 -1.105916272470025e-02 +628 614 -1.315380302376546e-02 +628 615 -1.585023865775537e-02 +628 616 -1.939104886145125e-02 +628 617 -2.415034675252906e-02 +628 618 -3.072751892616543e-02 +628 619 -4.012781031912993e-02 +628 620 -5.413421453123171e-02 +628 621 -7.613960933881257e-02 +628 622 -1.132183869282770e-01 +628 623 -1.820810586422663e-01 +628 624 -3.301555353436824e-01 +628 625 -7.412185823610385e-01 +628 626 -3.165206906282894e+00 +628 627 -1.502055215852579e+01 +628 629 -1.502055215844900e+01 +628 630 -3.165206906282837e+00 +628 631 -7.412185823610044e-01 +628 632 -3.301555353436738e-01 +628 633 -1.820810586422639e-01 +628 634 -1.132183869282745e-01 +628 635 -7.613960933881134e-02 +628 636 -5.413421453123172e-02 +628 637 -4.012781031912956e-02 +628 638 -3.072751892616529e-02 +628 639 -2.415034675252896e-02 +628 640 -1.939104886145111e-02 +628 641 -1.585023865775526e-02 +628 642 -1.315380302376538e-02 +628 643 -1.105916272470022e-02 +628 644 -9.403863770832811e-03 +628 645 -8.076052134892582e-03 +628 646 -6.996835383339674e-03 +628 647 -6.109381318875771e-03 +628 648 -5.371977266379809e-03 +628 649 -4.753493624956895e-03 +628 650 -4.230349322908543e-03 +628 651 -3.784439171232917e-03 +628 652 -3.401691470521394e-03 +628 653 -3.071047067257393e-03 +628 654 -2.783725492315679e-03 +628 655 -2.532689975072680e-03 +629 629 3.988394278115148e+01 +629 608 -4.753493624956895e-03 +629 609 -5.371977266379837e-03 +629 610 -6.109381318875769e-03 +629 611 -6.996835383339702e-03 +629 612 -8.076052134892655e-03 +629 613 -9.403863770832832e-03 +629 614 -1.105916272470026e-02 +629 615 -1.315380302376555e-02 +629 616 -1.585023865775537e-02 +629 617 -1.939104886145119e-02 +629 618 -2.415034675252897e-02 +629 619 -3.072751892616544e-02 +629 620 -4.012781031912998e-02 +629 621 -5.413421453123234e-02 +629 622 -7.613960933881209e-02 +629 623 -1.132183869282771e-01 +629 624 -1.820810586422670e-01 +629 625 -3.301555353436798e-01 +629 626 -7.412185823610276e-01 +629 627 -3.165206906282847e+00 +629 628 -1.502055215844900e+01 +629 630 -1.502055215839545e+01 +629 631 -3.165206906282855e+00 +629 632 -7.412185823610271e-01 +629 633 -3.301555353436737e-01 +629 634 -1.820810586422628e-01 +629 635 -1.132183869282764e-01 +629 636 -7.613960933881168e-02 +629 637 -5.413421453123109e-02 +629 638 -4.012781031912974e-02 +629 639 -3.072751892616542e-02 +629 640 -2.415034675252897e-02 +629 641 -1.939104886145110e-02 +629 642 -1.585023865775514e-02 +629 643 -1.315380302376542e-02 +629 644 -1.105916272470025e-02 +629 645 -9.403863770832814e-03 +629 646 -8.076052134892568e-03 +629 647 -6.996835383339677e-03 +629 648 -6.109381318875733e-03 +629 649 -5.371977266379788e-03 +629 650 -4.753493624956895e-03 +629 651 -4.230349322908508e-03 +629 652 -3.784439171232917e-03 +629 653 -3.401691470521385e-03 +629 654 -3.071047067257394e-03 +629 655 -2.783725492315667e-03 +630 630 3.988394278106476e+01 +630 608 -4.230349322908508e-03 +630 609 -4.753493624956895e-03 +630 610 -5.371977266379790e-03 +630 611 -6.109381318875734e-03 +630 612 -6.996835383339677e-03 +630 613 -8.076052134892568e-03 +630 614 -9.403863770832816e-03 +630 615 -1.105916272470032e-02 +630 616 -1.315380302376555e-02 +630 617 -1.585023865775531e-02 +630 618 -1.939104886145111e-02 +630 619 -2.415034675252896e-02 +630 620 -3.072751892616545e-02 +630 621 -4.012781031913035e-02 +630 622 -5.413421453123204e-02 +630 623 -7.613960933881173e-02 +630 624 -1.132183869282764e-01 +630 625 -1.820810586422644e-01 +630 626 -3.301555353436742e-01 +630 627 -7.412185823610038e-01 +630 628 -3.165206906282837e+00 +630 629 -1.502055215839545e+01 +630 631 -1.502055215836215e+01 +630 632 -3.165206906282920e+00 +630 633 -7.412185823610378e-01 +630 634 -3.301555353436791e-01 +630 635 -1.820810586422648e-01 +630 636 -1.132183869282771e-01 +630 637 -7.613960933881099e-02 +630 638 -5.413421453123141e-02 +630 639 -4.012781031912996e-02 +630 640 -3.072751892616545e-02 +630 641 -2.415034675252897e-02 +630 642 -1.939104886145097e-02 +630 643 -1.585023865775520e-02 +630 644 -1.315380302376546e-02 +630 645 -1.105916272470026e-02 +630 646 -9.403863770832832e-03 +630 647 -8.076052134892632e-03 +630 648 -6.996835383339702e-03 +630 649 -6.109381318875769e-03 +630 650 -5.371977266379837e-03 +630 651 -4.753493624956895e-03 +630 652 -4.230349322908543e-03 +630 653 -3.784439171232937e-03 +630 654 -3.401691470521412e-03 +630 655 -3.071047067257401e-03 +631 631 3.988394278102310e+01 +631 608 -3.784439171232917e-03 +631 609 -4.230349322908543e-03 +631 610 -4.753493624956895e-03 +631 611 -5.371977266379808e-03 +631 612 -6.109381318875772e-03 +631 613 -6.996835383339674e-03 +631 614 -8.076052134892570e-03 +631 615 -9.403863770832814e-03 +631 616 -1.105916272470025e-02 +631 617 -1.315380302376542e-02 +631 618 -1.585023865775514e-02 +631 619 -1.939104886145096e-02 +631 620 -2.415034675252878e-02 +631 621 -3.072751892616544e-02 +631 622 -4.012781031912978e-02 +631 623 -5.413421453123111e-02 +631 624 -7.613960933881062e-02 +631 625 -1.132183869282752e-01 +631 626 -1.820810586422639e-01 +631 627 -3.301555353436766e-01 +631 628 -7.412185823610044e-01 +631 629 -3.165206906282855e+00 +631 630 -1.502055215836215e+01 +631 632 -1.502055215835500e+01 +631 633 -3.165206906282907e+00 +631 634 -7.412185823610395e-01 +631 635 -3.301555353436749e-01 +631 636 -1.820810586422675e-01 +631 637 -1.132183869282770e-01 +631 638 -7.613960933881209e-02 +631 639 -5.413421453123230e-02 +631 640 -4.012781031913037e-02 +631 641 -3.072751892616572e-02 +631 642 -2.415034675252897e-02 +631 643 -1.939104886145118e-02 +631 644 -1.585023865775536e-02 +631 645 -1.315380302376555e-02 +631 646 -1.105916272470032e-02 +631 647 -9.403863770832830e-03 +631 648 -8.076052134892594e-03 +631 649 -6.996835383339674e-03 +631 650 -6.109381318875769e-03 +631 651 -5.371977266379790e-03 +631 652 -4.753493624956895e-03 +631 653 -4.230349322908531e-03 +631 654 -3.784439171232939e-03 +631 655 -3.401691470521395e-03 +632 632 3.988394278105618e+01 +632 608 -3.401691470521384e-03 +632 609 -3.784439171232936e-03 +632 610 -4.230349322908531e-03 +632 611 -4.753493624956896e-03 +632 612 -5.371977266379821e-03 +632 613 -6.109381318875747e-03 +632 614 -6.996835383339671e-03 +632 615 -8.076052134892575e-03 +632 616 -9.403863770832853e-03 +632 617 -1.105916272470025e-02 +632 618 -1.315380302376542e-02 +632 619 -1.585023865775520e-02 +632 620 -1.939104886145103e-02 +632 621 -2.415034675252906e-02 +632 622 -3.072751892616544e-02 +632 623 -4.012781031912974e-02 +632 624 -5.413421453123138e-02 +632 625 -7.613960933881120e-02 +632 626 -1.132183869282771e-01 +632 627 -1.820810586422686e-01 +632 628 -3.301555353436738e-01 +632 629 -7.412185823610271e-01 +632 630 -3.165206906282920e+00 +632 631 -1.502055215835500e+01 +632 633 -1.502055215840038e+01 +632 634 -3.165206906282870e+00 +632 635 -7.412185823610055e-01 +632 636 -3.301555353436738e-01 +632 637 -1.820810586422634e-01 +632 638 -1.132183869282751e-01 +632 639 -7.613960933881153e-02 +632 640 -5.413421453123205e-02 +632 641 -4.012781031913017e-02 +632 642 -3.072751892616531e-02 +632 643 -2.415034675252897e-02 +632 644 -1.939104886145118e-02 +632 645 -1.585023865775532e-02 +632 646 -1.315380302376550e-02 +632 647 -1.105916272470022e-02 +632 648 -9.403863770832825e-03 +632 649 -8.076052134892594e-03 +632 650 -6.996835383339702e-03 +632 651 -6.109381318875734e-03 +632 652 -5.371977266379808e-03 +632 653 -4.753493624956898e-03 +632 654 -4.230349322908547e-03 +632 655 -3.784439171232931e-03 +633 633 3.988394278128561e+01 +633 608 -3.071047067257376e-03 +633 609 -3.401691470521392e-03 +633 610 -3.784439171232915e-03 +633 611 -4.230349322908520e-03 +633 612 -4.753493624956895e-03 +633 613 -5.371977266379786e-03 +633 614 -6.109381318875727e-03 +633 615 -6.996835383339622e-03 +633 616 -8.076052134892604e-03 +633 617 -9.403863770832825e-03 +633 618 -1.105916272470022e-02 +633 619 -1.315380302376542e-02 +633 620 -1.585023865775520e-02 +633 621 -1.939104886145118e-02 +633 622 -2.415034675252897e-02 +633 623 -3.072751892616529e-02 +633 624 -4.012781031912974e-02 +633 625 -5.413421453123141e-02 +633 626 -7.613960933881206e-02 +633 627 -1.132183869282777e-01 +633 628 -1.820810586422639e-01 +633 629 -3.301555353436737e-01 +633 630 -7.412185823610378e-01 +633 631 -3.165206906282907e+00 +633 632 -1.502055215840038e+01 +633 634 -1.502055215860539e+01 +633 635 -3.165206906282835e+00 +633 636 -7.412185823610062e-01 +633 637 -3.301555353436754e-01 +633 638 -1.820810586422651e-01 +633 639 -1.132183869282765e-01 +633 640 -7.613960933881195e-02 +633 641 -5.413421453123204e-02 +633 642 -4.012781031912978e-02 +633 643 -3.072751892616544e-02 +633 644 -2.415034675252906e-02 +633 645 -1.939104886145119e-02 +633 646 -1.585023865775531e-02 +633 647 -1.315380302376542e-02 +633 648 -1.105916272470025e-02 +633 649 -9.403863770832842e-03 +633 650 -8.076052134892653e-03 +633 651 -6.996835383339677e-03 +633 652 -6.109381318875772e-03 +633 653 -5.371977266379824e-03 +633 654 -4.753493624956926e-03 +633 655 -4.230349322908547e-03 +634 634 3.988394278152488e+01 +634 608 -2.783725492315666e-03 +634 609 -3.071047067257401e-03 +634 610 -3.401691470521394e-03 +634 611 -3.784439171232929e-03 +634 612 -4.230349322908545e-03 +634 613 -4.753493624956895e-03 +634 614 -5.371977266379805e-03 +634 615 -6.109381318875730e-03 +634 616 -6.996835383339698e-03 +634 617 -8.076052134892592e-03 +634 618 -9.403863770832811e-03 +634 619 -1.105916272470025e-02 +634 620 -1.315380302376546e-02 +634 621 -1.585023865775536e-02 +634 622 -1.939104886145118e-02 +634 623 -2.415034675252896e-02 +634 624 -3.072751892616542e-02 +634 625 -4.012781031912996e-02 +634 626 -5.413421453123230e-02 +634 627 -7.613960933881191e-02 +634 628 -1.132183869282745e-01 +634 629 -1.820810586422628e-01 +634 630 -3.301555353436791e-01 +634 631 -7.412185823610395e-01 +634 632 -3.165206906282870e+00 +634 633 -1.502055215860539e+01 +634 635 -1.502055215859208e+01 +634 636 -3.165206906282843e+00 +634 637 -7.412185823610147e-01 +634 638 -3.301555353436751e-01 +634 639 -1.820810586422663e-01 +634 640 -1.132183869282780e-01 +634 641 -7.613960933881185e-02 +634 642 -5.413421453123111e-02 +634 643 -4.012781031912974e-02 +634 644 -3.072751892616543e-02 +634 645 -2.415034675252897e-02 +634 646 -1.939104886145111e-02 +634 647 -1.585023865775514e-02 +634 648 -1.315380302376542e-02 +634 649 -1.105916272470022e-02 +634 650 -9.403863770832828e-03 +634 651 -8.076052134892568e-03 +634 652 -6.996835383339674e-03 +634 653 -6.109381318875750e-03 +634 654 -5.371977266379823e-03 +634 655 -4.753493624956898e-03 +635 635 3.988394278151354e+01 +635 608 -2.532689975072674e-03 +635 609 -2.783725492315679e-03 +635 610 -3.071047067257393e-03 +635 611 -3.401691470521395e-03 +635 612 -3.784439171232938e-03 +635 613 -4.230349322908531e-03 +635 614 -4.753493624956895e-03 +635 615 -5.371977266379788e-03 +635 616 -6.109381318875769e-03 +635 617 -6.996835383339674e-03 +635 618 -8.076052134892583e-03 +635 619 -9.403863770832832e-03 +635 620 -1.105916272470026e-02 +635 621 -1.315380302376555e-02 +635 622 -1.585023865775532e-02 +635 623 -1.939104886145111e-02 +635 624 -2.415034675252897e-02 +635 625 -3.072751892616545e-02 +635 626 -4.012781031913037e-02 +635 627 -5.413421453123205e-02 +635 628 -7.613960933881134e-02 +635 629 -1.132183869282764e-01 +635 630 -1.820810586422648e-01 +635 631 -3.301555353436749e-01 +635 632 -7.412185823610055e-01 +635 633 -3.165206906282835e+00 +635 634 -1.502055215859208e+01 +635 636 -1.502055215859663e+01 +635 637 -3.165206906282894e+00 +635 638 -7.412185823610413e-01 +635 639 -3.301555353436800e-01 +635 640 -1.820810586422675e-01 +635 641 -1.132183869282761e-01 +635 642 -7.613960933881099e-02 +635 643 -5.413421453123138e-02 +635 644 -4.012781031912993e-02 +635 645 -3.072751892616544e-02 +635 646 -2.415034675252896e-02 +635 647 -1.939104886145096e-02 +635 648 -1.585023865775520e-02 +635 649 -1.315380302376542e-02 +635 650 -1.105916272470025e-02 +635 651 -9.403863770832813e-03 +635 652 -8.076052134892570e-03 +635 653 -6.996835383339674e-03 +635 654 -6.109381318875771e-03 +635 655 -5.371977266379809e-03 +636 636 3.988394278151444e+01 +636 608 -2.312252367280536e-03 +636 609 -2.532689975072691e-03 +636 610 -2.783725492315679e-03 +636 611 -3.071047067257401e-03 +636 612 -3.401691470521412e-03 +636 613 -3.784439171232937e-03 +636 614 -4.230349322908543e-03 +636 615 -4.753493624956895e-03 +636 616 -5.371977266379837e-03 +636 617 -6.109381318875769e-03 +636 618 -6.996835383339702e-03 +636 619 -8.076052134892642e-03 +636 620 -9.403863770832832e-03 +636 621 -1.105916272470032e-02 +636 622 -1.315380302376550e-02 +636 623 -1.585023865775526e-02 +636 624 -1.939104886145110e-02 +636 625 -2.415034675252897e-02 +636 626 -3.072751892616572e-02 +636 627 -4.012781031913017e-02 +636 628 -5.413421453123172e-02 +636 629 -7.613960933881168e-02 +636 630 -1.132183869282771e-01 +636 631 -1.820810586422675e-01 +636 632 -3.301555353436738e-01 +636 633 -7.412185823610062e-01 +636 634 -3.165206906282843e+00 +636 635 -1.502055215859663e+01 +636 637 -1.502055215858794e+01 +636 638 -3.165206906282904e+00 +636 639 -7.412185823610303e-01 +636 640 -3.301555353436815e-01 +636 641 -1.820810586422628e-01 +636 642 -1.132183869282751e-01 +636 643 -7.613960933881087e-02 +636 644 -5.413421453123171e-02 +636 645 -4.012781031912998e-02 +636 646 -3.072751892616545e-02 +636 647 -2.415034675252878e-02 +636 648 -1.939104886145103e-02 +636 649 -1.585023865775520e-02 +636 650 -1.315380302376546e-02 +636 651 -1.105916272470026e-02 +636 652 -9.403863770832771e-03 +636 653 -8.076052134892556e-03 +636 654 -6.996835383339677e-03 +636 655 -6.109381318875733e-03 +637 637 3.988394278153937e+01 +637 608 -2.117777896667785e-03 +637 609 -2.312252367280536e-03 +637 610 -2.532689975072674e-03 +637 611 -2.783725492315667e-03 +637 612 -3.071047067257394e-03 +637 613 -3.401691470521385e-03 +637 614 -3.784439171232917e-03 +637 615 -4.230349322908508e-03 +637 616 -4.753493624956895e-03 +637 617 -5.371977266379790e-03 +637 618 -6.109381318875734e-03 +637 619 -6.996835383339677e-03 +637 620 -8.076052134892557e-03 +637 621 -9.403863770832813e-03 +637 622 -1.105916272470022e-02 +637 623 -1.315380302376538e-02 +637 624 -1.585023865775514e-02 +637 625 -1.939104886145097e-02 +637 626 -2.415034675252897e-02 +637 627 -3.072751892616531e-02 +637 628 -4.012781031912956e-02 +637 629 -5.413421453123109e-02 +637 630 -7.613960933881099e-02 +637 631 -1.132183869282770e-01 +637 632 -1.820810586422634e-01 +637 633 -3.301555353436754e-01 +637 634 -7.412185823610147e-01 +637 635 -3.165206906282894e+00 +637 636 -1.502055215858794e+01 +637 638 -1.502055215864010e+01 +637 639 -3.165206906282888e+00 +637 640 -7.412185823610395e-01 +637 641 -3.301555353436737e-01 +637 642 -1.820810586422656e-01 +637 643 -1.132183869282774e-01 +637 644 -7.613960933881236e-02 +637 645 -5.413421453123234e-02 +637 646 -4.012781031913035e-02 +637 647 -3.072751892616544e-02 +637 648 -2.415034675252906e-02 +637 649 -1.939104886145118e-02 +637 650 -1.585023865775536e-02 +637 651 -1.315380302376555e-02 +637 652 -1.105916272470025e-02 +637 653 -9.403863770832827e-03 +637 654 -8.076052134892653e-03 +637 655 -6.996835383339702e-03 +638 638 3.988394278164024e+01 +638 608 -1.945462087124849e-03 +638 609 -2.117777896667799e-03 +638 610 -2.312252367280536e-03 +638 611 -2.532689975072680e-03 +638 612 -2.783725492315679e-03 +638 613 -3.071047067257393e-03 +638 614 -3.401691470521394e-03 +638 615 -3.784439171232917e-03 +638 616 -4.230349322908543e-03 +638 617 -4.753493624956895e-03 +638 618 -5.371977266379808e-03 +638 619 -6.109381318875772e-03 +638 620 -6.996835383339674e-03 +638 621 -8.076052134892592e-03 +638 622 -9.403863770832825e-03 +638 623 -1.105916272470022e-02 +638 624 -1.315380302376542e-02 +638 625 -1.585023865775520e-02 +638 626 -1.939104886145118e-02 +638 627 -2.415034675252897e-02 +638 628 -3.072751892616529e-02 +638 629 -4.012781031912974e-02 +638 630 -5.413421453123141e-02 +638 631 -7.613960933881209e-02 +638 632 -1.132183869282751e-01 +638 633 -1.820810586422651e-01 +638 634 -3.301555353436751e-01 +638 635 -7.412185823610413e-01 +638 636 -3.165206906282904e+00 +638 637 -1.502055215864010e+01 +638 639 -1.502055215865991e+01 +638 640 -3.165206906282880e+00 +638 641 -7.412185823610035e-01 +638 642 -3.301555353436726e-01 +638 643 -1.820810586422654e-01 +638 644 -1.132183869282756e-01 +638 645 -7.613960933881192e-02 +638 646 -5.413421453123204e-02 +638 647 -4.012781031912978e-02 +638 648 -3.072751892616544e-02 +638 649 -2.415034675252897e-02 +638 650 -1.939104886145118e-02 +638 651 -1.585023865775531e-02 +638 652 -1.315380302376542e-02 +638 653 -1.105916272470022e-02 +638 654 -9.403863770832842e-03 +638 655 -8.076052134892594e-03 +639 639 3.988394278169704e+01 +639 608 -1.792160480940035e-03 +639 609 -1.945462087124857e-03 +639 610 -2.117777896667794e-03 +639 611 -2.312252367280537e-03 +639 612 -2.532689975072686e-03 +639 613 -2.783725492315672e-03 +639 614 -3.071047067257393e-03 +639 615 -3.401691470521385e-03 +639 616 -3.784439171232937e-03 +639 617 -4.230349322908531e-03 +639 618 -4.753493624956898e-03 +639 619 -5.371977266379824e-03 +639 620 -6.109381318875750e-03 +639 621 -6.996835383339674e-03 +639 622 -8.076052134892578e-03 +639 623 -9.403863770832828e-03 +639 624 -1.105916272470025e-02 +639 625 -1.315380302376546e-02 +639 626 -1.585023865775536e-02 +639 627 -1.939104886145118e-02 +639 628 -2.415034675252896e-02 +639 629 -3.072751892616542e-02 +639 630 -4.012781031912996e-02 +639 631 -5.413421453123230e-02 +639 632 -7.613960933881153e-02 +639 633 -1.132183869282765e-01 +639 634 -1.820810586422663e-01 +639 635 -3.301555353436800e-01 +639 636 -7.412185823610303e-01 +639 637 -3.165206906282888e+00 +639 638 -1.502055215865991e+01 +639 640 -1.502055215931076e+01 +639 641 -3.165206906282836e+00 +639 642 -7.412185823610040e-01 +639 643 -3.301555353436766e-01 +639 644 -1.820810586422638e-01 +639 645 -1.132183869282765e-01 +639 646 -7.613960933881171e-02 +639 647 -5.413421453123111e-02 +639 648 -4.012781031912974e-02 +639 649 -3.072751892616529e-02 +639 650 -2.415034675252896e-02 +639 651 -1.939104886145111e-02 +639 652 -1.585023865775514e-02 +639 653 -1.315380302376537e-02 +639 654 -1.105916272470022e-02 +639 655 -9.403863770832811e-03 +640 640 3.988394278169697e+01 +640 624 -9.403863770832832e-03 +640 625 -1.105916272470026e-02 +640 626 -1.315380302376555e-02 +640 627 -1.585023865775532e-02 +640 628 -1.939104886145111e-02 +640 629 -2.415034675252897e-02 +640 630 -3.072751892616545e-02 +640 631 -4.012781031913037e-02 +640 632 -5.413421453123205e-02 +640 633 -7.613960933881195e-02 +640 634 -1.132183869282780e-01 +640 635 -1.820810586422675e-01 +640 636 -3.301555353436815e-01 +640 637 -7.412185823610395e-01 +640 638 -3.165206906282880e+00 +640 639 -1.502055215931076e+01 +640 641 -1.502055215865988e+01 +640 642 -3.165206906282822e+00 +640 643 -7.412185823610142e-01 +640 644 -3.301555353436733e-01 +640 645 -1.820810586422639e-01 +640 646 -1.132183869282755e-01 +640 647 -7.613960933881044e-02 +640 648 -5.413421453123138e-02 +640 649 -4.012781031912974e-02 +640 650 -3.072751892616542e-02 +640 651 -2.415034675252896e-02 +640 652 -1.939104886145095e-02 +640 653 -1.585023865775514e-02 +640 654 -1.315380302376542e-02 +640 655 -1.105916272470025e-02 +640 656 -9.403863770832814e-03 +640 657 -8.076052134892594e-03 +640 658 -6.996835383339623e-03 +640 659 -6.109381318875727e-03 +640 660 -5.371977266379786e-03 +640 661 -4.753493624956895e-03 +640 662 -4.230349322908520e-03 +640 663 -3.784439171232916e-03 +640 664 -3.401691470521392e-03 +640 665 -3.071047067257377e-03 +640 666 -2.783725492315665e-03 +640 667 -2.532689975072673e-03 +640 668 -2.312252367280536e-03 +640 669 -2.117777896667789e-03 +640 670 -1.945462087124849e-03 +640 671 -1.792160480940038e-03 +641 641 3.988394278164016e+01 +641 624 -8.076052134892583e-03 +641 625 -9.403863770832816e-03 +641 626 -1.105916272470032e-02 +641 627 -1.315380302376550e-02 +641 628 -1.585023865775526e-02 +641 629 -1.939104886145110e-02 +641 630 -2.415034675252897e-02 +641 631 -3.072751892616572e-02 +641 632 -4.012781031913017e-02 +641 633 -5.413421453123204e-02 +641 634 -7.613960933881185e-02 +641 635 -1.132183869282761e-01 +641 636 -1.820810586422628e-01 +641 637 -3.301555353436737e-01 +641 638 -7.412185823610035e-01 +641 639 -3.165206906282836e+00 +641 640 -1.502055215865988e+01 +641 642 -1.502055215864009e+01 +641 643 -3.165206906282897e+00 +641 644 -7.412185823610393e-01 +641 645 -3.301555353436806e-01 +641 646 -1.820810586422670e-01 +641 647 -1.132183869282761e-01 +641 648 -7.613960933881142e-02 +641 649 -5.413421453123141e-02 +641 650 -4.012781031912996e-02 +641 651 -3.072751892616545e-02 +641 652 -2.415034675252877e-02 +641 653 -1.939104886145096e-02 +641 654 -1.585023865775520e-02 +641 655 -1.315380302376546e-02 +641 656 -1.105916272470026e-02 +641 657 -9.403863770832830e-03 +641 658 -8.076052134892554e-03 +641 659 -6.996835383339671e-03 +641 660 -6.109381318875748e-03 +641 661 -5.371977266379821e-03 +641 662 -4.753493624956896e-03 +641 663 -4.230349322908531e-03 +641 664 -3.784439171232936e-03 +641 665 -3.401691470521384e-03 +641 666 -3.071047067257392e-03 +641 667 -2.783725492315671e-03 +641 668 -2.532689975072685e-03 +641 669 -2.312252367280536e-03 +641 670 -2.117777896667793e-03 +641 671 -1.945462087124857e-03 +642 642 3.988394278153935e+01 +642 624 -6.996835383339674e-03 +642 625 -8.076052134892573e-03 +642 626 -9.403863770832830e-03 +642 627 -1.105916272470022e-02 +642 628 -1.315380302376538e-02 +642 629 -1.585023865775514e-02 +642 630 -1.939104886145097e-02 +642 631 -2.415034675252897e-02 +642 632 -3.072751892616531e-02 +642 633 -4.012781031912978e-02 +642 634 -5.413421453123111e-02 +642 635 -7.613960933881099e-02 +642 636 -1.132183869282751e-01 +642 637 -1.820810586422656e-01 +642 638 -3.301555353436726e-01 +642 639 -7.412185823610040e-01 +642 640 -3.165206906282822e+00 +642 641 -1.502055215864009e+01 +642 643 -1.502055215858798e+01 +642 644 -3.165206906282904e+00 +642 645 -7.412185823610346e-01 +642 646 -3.301555353436803e-01 +642 647 -1.820810586422632e-01 +642 648 -1.132183869282765e-01 +642 649 -7.613960933881189e-02 +642 650 -5.413421453123230e-02 +642 651 -4.012781031913035e-02 +642 652 -3.072751892616543e-02 +642 653 -2.415034675252896e-02 +642 654 -1.939104886145118e-02 +642 655 -1.585023865775536e-02 +642 656 -1.315380302376555e-02 +642 657 -1.105916272470032e-02 +642 658 -9.403863770832813e-03 +642 659 -8.076052134892592e-03 +642 660 -6.996835383339674e-03 +642 661 -6.109381318875771e-03 +642 662 -5.371977266379809e-03 +642 663 -4.753493624956895e-03 +642 664 -4.230349322908543e-03 +642 665 -3.784439171232917e-03 +642 666 -3.401691470521394e-03 +642 667 -3.071047067257393e-03 +642 668 -2.783725492315679e-03 +642 669 -2.532689975072680e-03 +642 670 -2.312252367280536e-03 +642 671 -2.117777896667799e-03 +643 643 3.988394278151443e+01 +643 624 -6.109381318875769e-03 +643 625 -6.996835383339702e-03 +643 626 -8.076052134892653e-03 +643 627 -9.403863770832840e-03 +643 628 -1.105916272470022e-02 +643 629 -1.315380302376542e-02 +643 630 -1.585023865775520e-02 +643 631 -1.939104886145118e-02 +643 632 -2.415034675252897e-02 +643 633 -3.072751892616544e-02 +643 634 -4.012781031912974e-02 +643 635 -5.413421453123138e-02 +643 636 -7.613960933881087e-02 +643 637 -1.132183869282774e-01 +643 638 -1.820810586422654e-01 +643 639 -3.301555353436766e-01 +643 640 -7.412185823610142e-01 +643 641 -3.165206906282897e+00 +643 642 -1.502055215858798e+01 +643 644 -1.502055215859656e+01 +643 645 -3.165206906282876e+00 +643 646 -7.412185823610296e-01 +643 647 -3.301555353436733e-01 +643 648 -1.820810586422655e-01 +643 649 -1.132183869282763e-01 +643 650 -7.613960933881171e-02 +643 651 -5.413421453123204e-02 +643 652 -4.012781031912976e-02 +643 653 -3.072751892616530e-02 +643 654 -2.415034675252897e-02 +643 655 -1.939104886145118e-02 +643 656 -1.585023865775532e-02 +643 657 -1.315380302376550e-02 +643 658 -1.105916272470022e-02 +643 659 -9.403863770832825e-03 +643 660 -8.076052134892578e-03 +643 661 -6.996835383339677e-03 +643 662 -6.109381318875733e-03 +643 663 -5.371977266379788e-03 +643 664 -4.753493624956895e-03 +643 665 -4.230349322908508e-03 +643 666 -3.784439171232917e-03 +643 667 -3.401691470521385e-03 +643 668 -3.071047067257394e-03 +643 669 -2.783725492315667e-03 +643 670 -2.532689975072674e-03 +643 671 -2.312252367280536e-03 +644 644 3.988394278151358e+01 +644 624 -5.371977266379790e-03 +644 625 -6.109381318875734e-03 +644 626 -6.996835383339677e-03 +644 627 -8.076052134892578e-03 +644 628 -9.403863770832811e-03 +644 629 -1.105916272470025e-02 +644 630 -1.315380302376546e-02 +644 631 -1.585023865775536e-02 +644 632 -1.939104886145118e-02 +644 633 -2.415034675252906e-02 +644 634 -3.072751892616543e-02 +644 635 -4.012781031912993e-02 +644 636 -5.413421453123171e-02 +644 637 -7.613960933881236e-02 +644 638 -1.132183869282756e-01 +644 639 -1.820810586422638e-01 +644 640 -3.301555353436733e-01 +644 641 -7.412185823610393e-01 +644 642 -3.165206906282904e+00 +644 643 -1.502055215859656e+01 +644 645 -1.502055215859217e+01 +644 646 -3.165206906282847e+00 +644 647 -7.412185823610076e-01 +644 648 -3.301555353436775e-01 +644 649 -1.820810586422670e-01 +644 650 -1.132183869282766e-01 +644 651 -7.613960933881168e-02 +644 652 -5.413421453123109e-02 +644 653 -4.012781031912954e-02 +644 654 -3.072751892616529e-02 +644 655 -2.415034675252896e-02 +644 656 -1.939104886145111e-02 +644 657 -1.585023865775526e-02 +644 658 -1.315380302376538e-02 +644 659 -1.105916272470022e-02 +644 660 -9.403863770832828e-03 +644 661 -8.076052134892642e-03 +644 662 -6.996835383339702e-03 +644 663 -6.109381318875769e-03 +644 664 -5.371977266379837e-03 +644 665 -4.753493624956895e-03 +644 666 -4.230349322908543e-03 +644 667 -3.784439171232937e-03 +644 668 -3.401691470521412e-03 +644 669 -3.071047067257401e-03 +644 670 -2.783725492315679e-03 +644 671 -2.532689975072691e-03 +645 645 3.988394278152489e+01 +645 624 -4.753493624956895e-03 +645 625 -5.371977266379808e-03 +645 626 -6.109381318875772e-03 +645 627 -6.996835383339674e-03 +645 628 -8.076052134892582e-03 +645 629 -9.403863770832814e-03 +645 630 -1.105916272470026e-02 +645 631 -1.315380302376555e-02 +645 632 -1.585023865775532e-02 +645 633 -1.939104886145119e-02 +645 634 -2.415034675252897e-02 +645 635 -3.072751892616544e-02 +645 636 -4.012781031912998e-02 +645 637 -5.413421453123234e-02 +645 638 -7.613960933881192e-02 +645 639 -1.132183869282765e-01 +645 640 -1.820810586422639e-01 +645 641 -3.301555353436806e-01 +645 642 -7.412185823610346e-01 +645 643 -3.165206906282876e+00 +645 644 -1.502055215859217e+01 +645 646 -1.502055215860530e+01 +645 647 -3.165206906282849e+00 +645 648 -7.412185823610146e-01 +645 649 -3.301555353436766e-01 +645 650 -1.820810586422639e-01 +645 651 -1.132183869282755e-01 +645 652 -7.613960933881096e-02 +645 653 -5.413421453123106e-02 +645 654 -4.012781031912974e-02 +645 655 -3.072751892616542e-02 +645 656 -2.415034675252897e-02 +645 657 -1.939104886145110e-02 +645 658 -1.585023865775514e-02 +645 659 -1.315380302376542e-02 +645 660 -1.105916272470025e-02 +645 661 -9.403863770832832e-03 +645 662 -8.076052134892583e-03 +645 663 -6.996835383339674e-03 +645 664 -6.109381318875769e-03 +645 665 -5.371977266379790e-03 +645 666 -4.753493624956895e-03 +645 667 -4.230349322908531e-03 +645 668 -3.784439171232939e-03 +645 669 -3.401691470521395e-03 +645 670 -3.071047067257393e-03 +645 671 -2.783725492315679e-03 +646 646 3.988394278128560e+01 +646 624 -4.230349322908531e-03 +646 625 -4.753493624956898e-03 +646 626 -5.371977266379824e-03 +646 627 -6.109381318875750e-03 +646 628 -6.996835383339674e-03 +646 629 -8.076052134892568e-03 +646 630 -9.403863770832832e-03 +646 631 -1.105916272470032e-02 +646 632 -1.315380302376550e-02 +646 633 -1.585023865775531e-02 +646 634 -1.939104886145111e-02 +646 635 -2.415034675252896e-02 +646 636 -3.072751892616545e-02 +646 637 -4.012781031913035e-02 +646 638 -5.413421453123204e-02 +646 639 -7.613960933881171e-02 +646 640 -1.132183869282755e-01 +646 641 -1.820810586422670e-01 +646 642 -3.301555353436803e-01 +646 643 -7.412185823610296e-01 +646 644 -3.165206906282847e+00 +646 645 -1.502055215860530e+01 +646 647 -1.502055215840046e+01 +646 648 -3.165206906282867e+00 +646 649 -7.412185823610272e-01 +646 650 -3.301555353436733e-01 +646 651 -1.820810586422632e-01 +646 652 -1.132183869282762e-01 +646 653 -7.613960933881103e-02 +646 654 -5.413421453123141e-02 +646 655 -4.012781031912996e-02 +646 656 -3.072751892616545e-02 +646 657 -2.415034675252897e-02 +646 658 -1.939104886145097e-02 +646 659 -1.585023865775520e-02 +646 660 -1.315380302376546e-02 +646 661 -1.105916272470026e-02 +646 662 -9.403863770832816e-03 +646 663 -8.076052134892570e-03 +646 664 -6.996835383339698e-03 +646 665 -6.109381318875730e-03 +646 666 -5.371977266379805e-03 +646 667 -4.753493624956895e-03 +646 668 -4.230349322908545e-03 +646 669 -3.784439171232929e-03 +646 670 -3.401691470521394e-03 +646 671 -3.071047067257401e-03 +647 647 3.988394278105611e+01 +647 624 -3.784439171232939e-03 +647 625 -4.230349322908547e-03 +647 626 -4.753493624956926e-03 +647 627 -5.371977266379823e-03 +647 628 -6.109381318875771e-03 +647 629 -6.996835383339677e-03 +647 630 -8.076052134892632e-03 +647 631 -9.403863770832830e-03 +647 632 -1.105916272470022e-02 +647 633 -1.315380302376542e-02 +647 634 -1.585023865775514e-02 +647 635 -1.939104886145096e-02 +647 636 -2.415034675252878e-02 +647 637 -3.072751892616544e-02 +647 638 -4.012781031912978e-02 +647 639 -5.413421453123111e-02 +647 640 -7.613960933881044e-02 +647 641 -1.132183869282761e-01 +647 642 -1.820810586422632e-01 +647 643 -3.301555353436733e-01 +647 644 -7.412185823610076e-01 +647 645 -3.165206906282849e+00 +647 646 -1.502055215840046e+01 +647 648 -1.502055215835487e+01 +647 649 -3.165206906282902e+00 +647 650 -7.412185823610360e-01 +647 651 -3.301555353436783e-01 +647 652 -1.820810586422670e-01 +647 653 -1.132183869282775e-01 +647 654 -7.613960933881189e-02 +647 655 -5.413421453123230e-02 +647 656 -4.012781031913037e-02 +647 657 -3.072751892616572e-02 +647 658 -2.415034675252897e-02 +647 659 -1.939104886145118e-02 +647 660 -1.585023865775536e-02 +647 661 -1.315380302376555e-02 +647 662 -1.105916272470032e-02 +647 663 -9.403863770832813e-03 +647 664 -8.076052134892604e-03 +647 665 -6.996835383339623e-03 +647 666 -6.109381318875727e-03 +647 667 -5.371977266379786e-03 +647 668 -4.753493624956895e-03 +647 669 -4.230349322908520e-03 +647 670 -3.784439171232916e-03 +647 671 -3.401691470521392e-03 +648 648 3.988394278102307e+01 +648 624 -3.401691470521395e-03 +648 625 -3.784439171232931e-03 +648 626 -4.230349322908547e-03 +648 627 -4.753493624956898e-03 +648 628 -5.371977266379809e-03 +648 629 -6.109381318875733e-03 +648 630 -6.996835383339702e-03 +648 631 -8.076052134892594e-03 +648 632 -9.403863770832825e-03 +648 633 -1.105916272470025e-02 +648 634 -1.315380302376542e-02 +648 635 -1.585023865775520e-02 +648 636 -1.939104886145103e-02 +648 637 -2.415034675252906e-02 +648 638 -3.072751892616544e-02 +648 639 -4.012781031912974e-02 +648 640 -5.413421453123138e-02 +648 641 -7.613960933881142e-02 +648 642 -1.132183869282765e-01 +648 643 -1.820810586422655e-01 +648 644 -3.301555353436775e-01 +648 645 -7.412185823610146e-01 +648 646 -3.165206906282867e+00 +648 647 -1.502055215835487e+01 +648 649 -1.502055215836226e+01 +648 650 -3.165206906282872e+00 +648 651 -7.412185823610243e-01 +648 652 -3.301555353436783e-01 +648 653 -1.820810586422648e-01 +648 654 -1.132183869282753e-01 +648 655 -7.613960933881189e-02 +648 656 -5.413421453123205e-02 +648 657 -4.012781031913017e-02 +648 658 -3.072751892616531e-02 +648 659 -2.415034675252897e-02 +648 660 -1.939104886145118e-02 +648 661 -1.585023865775532e-02 +648 662 -1.315380302376550e-02 +648 663 -1.105916272470022e-02 +648 664 -9.403863770832839e-03 +648 665 -8.076052134892575e-03 +648 666 -6.996835383339671e-03 +648 667 -6.109381318875748e-03 +648 668 -5.371977266379821e-03 +648 669 -4.753493624956896e-03 +648 670 -4.230349322908531e-03 +648 671 -3.784439171232936e-03 +649 649 3.988394278106475e+01 +649 624 -3.071047067257393e-03 +649 625 -3.401691470521395e-03 +649 626 -3.784439171232938e-03 +649 627 -4.230349322908531e-03 +649 628 -4.753493624956895e-03 +649 629 -5.371977266379788e-03 +649 630 -6.109381318875769e-03 +649 631 -6.996835383339674e-03 +649 632 -8.076052134892594e-03 +649 633 -9.403863770832842e-03 +649 634 -1.105916272470022e-02 +649 635 -1.315380302376542e-02 +649 636 -1.585023865775520e-02 +649 637 -1.939104886145118e-02 +649 638 -2.415034675252897e-02 +649 639 -3.072751892616529e-02 +649 640 -4.012781031912974e-02 +649 641 -5.413421453123141e-02 +649 642 -7.613960933881189e-02 +649 643 -1.132183869282763e-01 +649 644 -1.820810586422670e-01 +649 645 -3.301555353436766e-01 +649 646 -7.412185823610272e-01 +649 647 -3.165206906282902e+00 +649 648 -1.502055215836226e+01 +649 650 -1.502055215839534e+01 +649 651 -3.165206906282842e+00 +649 652 -7.412185823610187e-01 +649 653 -3.301555353436742e-01 +649 654 -1.820810586422639e-01 +649 655 -1.132183869282766e-01 +649 656 -7.613960933881195e-02 +649 657 -5.413421453123204e-02 +649 658 -4.012781031912978e-02 +649 659 -3.072751892616544e-02 +649 660 -2.415034675252906e-02 +649 661 -1.939104886145119e-02 +649 662 -1.585023865775531e-02 +649 663 -1.315380302376542e-02 +649 664 -1.105916272470025e-02 +649 665 -9.403863770832839e-03 +649 666 -8.076052134892594e-03 +649 667 -6.996835383339674e-03 +649 668 -6.109381318875771e-03 +649 669 -5.371977266379809e-03 +649 670 -4.753493624956895e-03 +649 671 -4.230349322908543e-03 +650 650 3.988394278115148e+01 +650 624 -2.783725492315679e-03 +650 625 -3.071047067257401e-03 +650 626 -3.401691470521412e-03 +650 627 -3.784439171232937e-03 +650 628 -4.230349322908543e-03 +650 629 -4.753493624956895e-03 +650 630 -5.371977266379837e-03 +650 631 -6.109381318875769e-03 +650 632 -6.996835383339702e-03 +650 633 -8.076052134892653e-03 +650 634 -9.403863770832828e-03 +650 635 -1.105916272470025e-02 +650 636 -1.315380302376546e-02 +650 637 -1.585023865775536e-02 +650 638 -1.939104886145118e-02 +650 639 -2.415034675252896e-02 +650 640 -3.072751892616542e-02 +650 641 -4.012781031912996e-02 +650 642 -5.413421453123230e-02 +650 643 -7.613960933881171e-02 +650 644 -1.132183869282766e-01 +650 645 -1.820810586422639e-01 +650 646 -3.301555353436733e-01 +650 647 -7.412185823610360e-01 +650 648 -3.165206906282872e+00 +650 649 -1.502055215839534e+01 +650 651 -1.502055215844910e+01 +650 652 -3.165206906282844e+00 +650 653 -7.412185823610060e-01 +650 654 -3.301555353436766e-01 +650 655 -1.820810586422670e-01 +650 656 -1.132183869282776e-01 +650 657 -7.613960933881171e-02 +650 658 -5.413421453123111e-02 +650 659 -4.012781031912974e-02 +650 660 -3.072751892616543e-02 +650 661 -2.415034675252897e-02 +650 662 -1.939104886145111e-02 +650 663 -1.585023865775514e-02 +650 664 -1.315380302376542e-02 +650 665 -1.105916272470025e-02 +650 666 -9.403863770832814e-03 +650 667 -8.076052134892568e-03 +650 668 -6.996835383339677e-03 +650 669 -6.109381318875733e-03 +650 670 -5.371977266379788e-03 +650 671 -4.753493624956895e-03 +651 651 3.988394278128104e+01 +651 624 -2.532689975072674e-03 +651 625 -2.783725492315667e-03 +651 626 -3.071047067257394e-03 +651 627 -3.401691470521385e-03 +651 628 -3.784439171232917e-03 +651 629 -4.230349322908508e-03 +651 630 -4.753493624956895e-03 +651 631 -5.371977266379790e-03 +651 632 -6.109381318875734e-03 +651 633 -6.996835383339677e-03 +651 634 -8.076052134892568e-03 +651 635 -9.403863770832813e-03 +651 636 -1.105916272470026e-02 +651 637 -1.315380302376555e-02 +651 638 -1.585023865775531e-02 +651 639 -1.939104886145111e-02 +651 640 -2.415034675252896e-02 +651 641 -3.072751892616545e-02 +651 642 -4.012781031913035e-02 +651 643 -5.413421453123204e-02 +651 644 -7.613960933881168e-02 +651 645 -1.132183869282755e-01 +651 646 -1.820810586422632e-01 +651 647 -3.301555353436783e-01 +651 648 -7.412185823610243e-01 +651 649 -3.165206906282842e+00 +651 650 -1.502055215844910e+01 +651 652 -1.502055215852566e+01 +651 653 -3.165206906282847e+00 +651 654 -7.412185823610238e-01 +651 655 -3.301555353436775e-01 +651 656 -1.820810586422670e-01 +651 657 -1.132183869282766e-01 +651 658 -7.613960933881123e-02 +651 659 -5.413421453123141e-02 +651 660 -4.012781031912996e-02 +651 661 -3.072751892616545e-02 +651 662 -2.415034675252897e-02 +651 663 -1.939104886145097e-02 +651 664 -1.585023865775520e-02 +651 665 -1.315380302376546e-02 +651 666 -1.105916272470026e-02 +651 667 -9.403863770832832e-03 +651 668 -8.076052134892632e-03 +651 669 -6.996835383339702e-03 +651 670 -6.109381318875769e-03 +651 671 -5.371977266379837e-03 +652 652 3.988394278146365e+01 +652 624 -2.312252367280536e-03 +652 625 -2.532689975072680e-03 +652 626 -2.783725492315679e-03 +652 627 -3.071047067257393e-03 +652 628 -3.401691470521394e-03 +652 629 -3.784439171232917e-03 +652 630 -4.230349322908543e-03 +652 631 -4.753493624956895e-03 +652 632 -5.371977266379808e-03 +652 633 -6.109381318875772e-03 +652 634 -6.996835383339674e-03 +652 635 -8.076052134892570e-03 +652 636 -9.403863770832771e-03 +652 637 -1.105916272470025e-02 +652 638 -1.315380302376542e-02 +652 639 -1.585023865775514e-02 +652 640 -1.939104886145095e-02 +652 641 -2.415034675252877e-02 +652 642 -3.072751892616543e-02 +652 643 -4.012781031912976e-02 +652 644 -5.413421453123109e-02 +652 645 -7.613960933881096e-02 +652 646 -1.132183869282762e-01 +652 647 -1.820810586422670e-01 +652 648 -3.301555353436783e-01 +652 649 -7.412185823610187e-01 +652 650 -3.165206906282844e+00 +652 651 -1.502055215852566e+01 +652 653 -1.502055215863305e+01 +652 654 -3.165206906282877e+00 +652 655 -7.412185823610280e-01 +652 656 -3.301555353436742e-01 +652 657 -1.820810586422632e-01 +652 658 -1.132183869282765e-01 +652 659 -7.613960933881192e-02 +652 660 -5.413421453123234e-02 +652 661 -4.012781031913039e-02 +652 662 -3.072751892616573e-02 +652 663 -2.415034675252898e-02 +652 664 -1.939104886145118e-02 +652 665 -1.585023865775537e-02 +652 666 -1.315380302376555e-02 +652 667 -1.105916272470032e-02 +652 668 -9.403863770832833e-03 +652 669 -8.076052134892596e-03 +652 670 -6.996835383339674e-03 +652 671 -6.109381318875769e-03 +653 653 3.988394278171953e+01 +653 624 -2.117777896667794e-03 +653 625 -2.312252367280537e-03 +653 626 -2.532689975072686e-03 +653 627 -2.783725492315672e-03 +653 628 -3.071047067257393e-03 +653 629 -3.401691470521385e-03 +653 630 -3.784439171232937e-03 +653 631 -4.230349322908531e-03 +653 632 -4.753493624956898e-03 +653 633 -5.371977266379824e-03 +653 634 -6.109381318875750e-03 +653 635 -6.996835383339674e-03 +653 636 -8.076052134892556e-03 +653 637 -9.403863770832827e-03 +653 638 -1.105916272470022e-02 +653 639 -1.315380302376537e-02 +653 640 -1.585023865775514e-02 +653 641 -1.939104886145096e-02 +653 642 -2.415034675252896e-02 +653 643 -3.072751892616530e-02 +653 644 -4.012781031912954e-02 +653 645 -5.413421453123106e-02 +653 646 -7.613960933881103e-02 +653 647 -1.132183869282775e-01 +653 648 -1.820810586422648e-01 +653 649 -3.301555353436742e-01 +653 650 -7.412185823610060e-01 +653 651 -3.165206906282847e+00 +653 652 -1.502055215863305e+01 +653 654 -1.502055215878368e+01 +653 655 -3.165206906282903e+00 +653 656 -7.412185823610338e-01 +653 657 -3.301555353436793e-01 +653 658 -1.820810586422659e-01 +653 659 -1.132183869282766e-01 +653 660 -7.613960933881220e-02 +653 661 -5.413421453123236e-02 +653 662 -4.012781031913037e-02 +653 663 -3.072751892616545e-02 +653 664 -2.415034675252906e-02 +653 665 -1.939104886145125e-02 +653 666 -1.585023865775537e-02 +653 667 -1.315380302376555e-02 +653 668 -1.105916272470025e-02 +653 669 -9.403863770832839e-03 +653 670 -8.076052134892592e-03 +653 671 -6.996835383339698e-03 +654 654 3.988394278208170e+01 +654 624 -1.945462087124857e-03 +654 625 -2.117777896667799e-03 +654 626 -2.312252367280547e-03 +654 627 -2.532689975072686e-03 +654 628 -2.783725492315679e-03 +654 629 -3.071047067257394e-03 +654 630 -3.401691470521412e-03 +654 631 -3.784439171232939e-03 +654 632 -4.230349322908547e-03 +654 633 -4.753493624956926e-03 +654 634 -5.371977266379823e-03 +654 635 -6.109381318875771e-03 +654 636 -6.996835383339677e-03 +654 637 -8.076052134892653e-03 +654 638 -9.403863770832842e-03 +654 639 -1.105916272470022e-02 +654 640 -1.315380302376542e-02 +654 641 -1.585023865775520e-02 +654 642 -1.939104886145118e-02 +654 643 -2.415034675252897e-02 +654 644 -3.072751892616529e-02 +654 645 -4.012781031912974e-02 +654 646 -5.413421453123141e-02 +654 647 -7.613960933881189e-02 +654 648 -1.132183869282753e-01 +654 649 -1.820810586422639e-01 +654 650 -3.301555353436766e-01 +654 651 -7.412185823610238e-01 +654 652 -3.165206906282877e+00 +654 653 -1.502055215878368e+01 +654 655 -1.502055215899862e+01 +654 656 -3.165206906282892e+00 +654 657 -7.412185823610385e-01 +654 658 -3.301555353436809e-01 +654 659 -1.820810586422663e-01 +654 660 -1.132183869282766e-01 +654 661 -7.613960933881192e-02 +654 662 -5.413421453123204e-02 +654 663 -4.012781031912978e-02 +654 664 -3.072751892616544e-02 +654 665 -2.415034675252906e-02 +654 666 -1.939104886145119e-02 +654 667 -1.585023865775531e-02 +654 668 -1.315380302376542e-02 +654 669 -1.105916272470025e-02 +654 670 -9.403863770832825e-03 +654 671 -8.076052134892604e-03 +655 655 3.988394278260309e+01 +655 624 -1.792160480940039e-03 +655 625 -1.945462087124854e-03 +655 626 -2.117777896667799e-03 +655 627 -2.312252367280537e-03 +655 628 -2.532689975072680e-03 +655 629 -2.783725492315667e-03 +655 630 -3.071047067257401e-03 +655 631 -3.401691470521395e-03 +655 632 -3.784439171232931e-03 +655 633 -4.230349322908547e-03 +655 634 -4.753493624956898e-03 +655 635 -5.371977266379809e-03 +655 636 -6.109381318875733e-03 +655 637 -6.996835383339702e-03 +655 638 -8.076052134892594e-03 +655 639 -9.403863770832811e-03 +655 640 -1.105916272470025e-02 +655 641 -1.315380302376546e-02 +655 642 -1.585023865775536e-02 +655 643 -1.939104886145118e-02 +655 644 -2.415034675252896e-02 +655 645 -3.072751892616542e-02 +655 646 -4.012781031912996e-02 +655 647 -5.413421453123230e-02 +655 648 -7.613960933881189e-02 +655 649 -1.132183869282766e-01 +655 650 -1.820810586422670e-01 +655 651 -3.301555353436775e-01 +655 652 -7.412185823610280e-01 +655 653 -3.165206906282903e+00 +655 654 -1.502055215899862e+01 +655 656 -1.502055215931063e+01 +655 657 -3.165206906282881e+00 +655 658 -7.412185823610196e-01 +655 659 -3.301555353436742e-01 +655 660 -1.820810586422639e-01 +655 661 -1.132183869282756e-01 +655 662 -7.613960933881170e-02 +655 663 -5.413421453123111e-02 +655 664 -4.012781031912974e-02 +655 665 -3.072751892616543e-02 +655 666 -2.415034675252897e-02 +655 667 -1.939104886145111e-02 +655 668 -1.585023865775514e-02 +655 669 -1.315380302376542e-02 +655 670 -1.105916272470022e-02 +655 671 -9.403863770832827e-03 +656 656 3.988394278260305e+01 +656 640 -9.403863770832814e-03 +656 641 -1.105916272470026e-02 +656 642 -1.315380302376555e-02 +656 643 -1.585023865775532e-02 +656 644 -1.939104886145111e-02 +656 645 -2.415034675252897e-02 +656 646 -3.072751892616545e-02 +656 647 -4.012781031913037e-02 +656 648 -5.413421453123205e-02 +656 649 -7.613960933881195e-02 +656 650 -1.132183869282776e-01 +656 651 -1.820810586422670e-01 +656 652 -3.301555353436742e-01 +656 653 -7.412185823610338e-01 +656 654 -3.165206906282892e+00 +656 655 -1.502055215931063e+01 +656 657 -1.502055215899863e+01 +656 658 -3.165206906282844e+00 +656 659 -7.412185823610038e-01 +656 660 -3.301555353436757e-01 +656 661 -1.820810586422639e-01 +656 662 -1.132183869282765e-01 +656 663 -7.613960933881102e-02 +656 664 -5.413421453123138e-02 +656 665 -4.012781031912993e-02 +656 666 -3.072751892616544e-02 +656 667 -2.415034675252896e-02 +656 668 -1.939104886145096e-02 +656 669 -1.585023865775520e-02 +656 670 -1.315380302376542e-02 +656 671 -1.105916272470025e-02 +656 672 -9.403863770832813e-03 +656 673 -8.076052134892570e-03 +656 674 -6.996835383339674e-03 +656 675 -6.109381318875771e-03 +656 676 -5.371977266379809e-03 +656 677 -4.753493624956895e-03 +656 678 -4.230349322908543e-03 +656 679 -3.784439171232917e-03 +656 680 -3.401691470521394e-03 +656 681 -3.071047067257393e-03 +656 682 -2.783725492315679e-03 +656 683 -2.532689975072680e-03 +656 684 -2.312252367280536e-03 +656 685 -2.117777896667799e-03 +656 686 -1.945462087124849e-03 +656 687 -1.792160480940038e-03 +657 657 3.988394278208164e+01 +657 640 -8.076052134892594e-03 +657 641 -9.403863770832830e-03 +657 642 -1.105916272470032e-02 +657 643 -1.315380302376550e-02 +657 644 -1.585023865775526e-02 +657 645 -1.939104886145110e-02 +657 646 -2.415034675252897e-02 +657 647 -3.072751892616572e-02 +657 648 -4.012781031913017e-02 +657 649 -5.413421453123204e-02 +657 650 -7.613960933881171e-02 +657 651 -1.132183869282766e-01 +657 652 -1.820810586422632e-01 +657 653 -3.301555353436793e-01 +657 654 -7.412185823610385e-01 +657 655 -3.165206906282881e+00 +657 656 -1.502055215899863e+01 +657 658 -1.502055215878367e+01 +657 659 -3.165206906282839e+00 +657 660 -7.412185823610122e-01 +657 661 -3.301555353436725e-01 +657 662 -1.820810586422659e-01 +657 663 -1.132183869282772e-01 +657 664 -7.613960933881123e-02 +657 665 -5.413421453123171e-02 +657 666 -4.012781031912998e-02 +657 667 -3.072751892616545e-02 +657 668 -2.415034675252878e-02 +657 669 -1.939104886145103e-02 +657 670 -1.585023865775520e-02 +657 671 -1.315380302376546e-02 +657 672 -1.105916272470026e-02 +657 673 -9.403863770832771e-03 +657 674 -8.076052134892556e-03 +657 675 -6.996835383339677e-03 +657 676 -6.109381318875733e-03 +657 677 -5.371977266379788e-03 +657 678 -4.753493624956895e-03 +657 679 -4.230349322908508e-03 +657 680 -3.784439171232917e-03 +657 681 -3.401691470521385e-03 +657 682 -3.071047067257394e-03 +657 683 -2.783725492315667e-03 +657 684 -2.532689975072674e-03 +657 685 -2.312252367280536e-03 +657 686 -2.117777896667785e-03 +657 687 -1.945462087124849e-03 +658 658 3.988394278171948e+01 +658 640 -6.996835383339623e-03 +658 641 -8.076052134892554e-03 +658 642 -9.403863770832813e-03 +658 643 -1.105916272470022e-02 +658 644 -1.315380302376538e-02 +658 645 -1.585023865775514e-02 +658 646 -1.939104886145097e-02 +658 647 -2.415034675252897e-02 +658 648 -3.072751892616531e-02 +658 649 -4.012781031912978e-02 +658 650 -5.413421453123111e-02 +658 651 -7.613960933881123e-02 +658 652 -1.132183869282765e-01 +658 653 -1.820810586422659e-01 +658 654 -3.301555353436809e-01 +658 655 -7.412185823610196e-01 +658 656 -3.165206906282844e+00 +658 657 -1.502055215878367e+01 +658 659 -1.502055215863304e+01 +658 660 -3.165206906282868e+00 +658 661 -7.412185823610271e-01 +658 662 -3.301555353436740e-01 +658 663 -1.820810586422648e-01 +658 664 -1.132183869282756e-01 +658 665 -7.613960933881236e-02 +658 666 -5.413421453123234e-02 +658 667 -4.012781031913035e-02 +658 668 -3.072751892616544e-02 +658 669 -2.415034675252906e-02 +658 670 -1.939104886145118e-02 +658 671 -1.585023865775536e-02 +658 672 -1.315380302376555e-02 +658 673 -1.105916272470025e-02 +658 674 -9.403863770832827e-03 +658 675 -8.076052134892653e-03 +658 676 -6.996835383339702e-03 +658 677 -6.109381318875769e-03 +658 678 -5.371977266379837e-03 +658 679 -4.753493624956895e-03 +658 680 -4.230349322908543e-03 +658 681 -3.784439171232937e-03 +658 682 -3.401691470521412e-03 +658 683 -3.071047067257401e-03 +658 684 -2.783725492315679e-03 +658 685 -2.532689975072691e-03 +658 686 -2.312252367280536e-03 +658 687 -2.117777896667799e-03 +659 659 3.988394278146370e+01 +659 640 -6.109381318875727e-03 +659 641 -6.996835383339671e-03 +659 642 -8.076052134892592e-03 +659 643 -9.403863770832825e-03 +659 644 -1.105916272470022e-02 +659 645 -1.315380302376542e-02 +659 646 -1.585023865775520e-02 +659 647 -1.939104886145118e-02 +659 648 -2.415034675252897e-02 +659 649 -3.072751892616544e-02 +659 650 -4.012781031912974e-02 +659 651 -5.413421453123141e-02 +659 652 -7.613960933881192e-02 +659 653 -1.132183869282766e-01 +659 654 -1.820810586422663e-01 +659 655 -3.301555353436742e-01 +659 656 -7.412185823610038e-01 +659 657 -3.165206906282839e+00 +659 658 -1.502055215863304e+01 +659 660 -1.502055215852570e+01 +659 661 -3.165206906282907e+00 +659 662 -7.412185823610317e-01 +659 663 -3.301555353436801e-01 +659 664 -1.820810586422643e-01 +659 665 -1.132183869282771e-01 +659 666 -7.613960933881211e-02 +659 667 -5.413421453123204e-02 +659 668 -4.012781031912978e-02 +659 669 -3.072751892616544e-02 +659 670 -2.415034675252897e-02 +659 671 -1.939104886145118e-02 +659 672 -1.585023865775531e-02 +659 673 -1.315380302376542e-02 +659 674 -1.105916272470022e-02 +659 675 -9.403863770832842e-03 +659 676 -8.076052134892594e-03 +659 677 -6.996835383339674e-03 +659 678 -6.109381318875769e-03 +659 679 -5.371977266379790e-03 +659 680 -4.753493624956895e-03 +659 681 -4.230349322908531e-03 +659 682 -3.784439171232939e-03 +659 683 -3.401691470521395e-03 +659 684 -3.071047067257393e-03 +659 685 -2.783725492315679e-03 +659 686 -2.532689975072674e-03 +659 687 -2.312252367280536e-03 +660 660 3.988394278128116e+01 +660 640 -5.371977266379786e-03 +660 641 -6.109381318875748e-03 +660 642 -6.996835383339674e-03 +660 643 -8.076052134892578e-03 +660 644 -9.403863770832828e-03 +660 645 -1.105916272470025e-02 +660 646 -1.315380302376546e-02 +660 647 -1.585023865775536e-02 +660 648 -1.939104886145118e-02 +660 649 -2.415034675252906e-02 +660 650 -3.072751892616543e-02 +660 651 -4.012781031912996e-02 +660 652 -5.413421453123234e-02 +660 653 -7.613960933881220e-02 +660 654 -1.132183869282766e-01 +660 655 -1.820810586422639e-01 +660 656 -3.301555353436757e-01 +660 657 -7.412185823610122e-01 +660 658 -3.165206906282868e+00 +660 659 -1.502055215852570e+01 +660 661 -1.502055215844913e+01 +660 662 -3.165206906282885e+00 +660 663 -7.412185823610323e-01 +660 664 -3.301555353436800e-01 +660 665 -1.820810586422679e-01 +660 666 -1.132183869282781e-01 +660 667 -7.613960933881171e-02 +660 668 -5.413421453123111e-02 +660 669 -4.012781031912974e-02 +660 670 -3.072751892616529e-02 +660 671 -2.415034675252896e-02 +660 672 -1.939104886145111e-02 +660 673 -1.585023865775514e-02 +660 674 -1.315380302376537e-02 +660 675 -1.105916272470022e-02 +660 676 -9.403863770832811e-03 +660 677 -8.076052134892582e-03 +660 678 -6.996835383339698e-03 +660 679 -6.109381318875730e-03 +660 680 -5.371977266379805e-03 +660 681 -4.753493624956895e-03 +660 682 -4.230349322908545e-03 +660 683 -3.784439171232929e-03 +660 684 -3.401691470521394e-03 +660 685 -3.071047067257401e-03 +660 686 -2.783725492315666e-03 +660 687 -2.532689975072680e-03 +661 661 3.988394278115151e+01 +661 640 -4.753493624956895e-03 +661 641 -5.371977266379821e-03 +661 642 -6.109381318875771e-03 +661 643 -6.996835383339677e-03 +661 644 -8.076052134892642e-03 +661 645 -9.403863770832832e-03 +661 646 -1.105916272470026e-02 +661 647 -1.315380302376555e-02 +661 648 -1.585023865775532e-02 +661 649 -1.939104886145119e-02 +661 650 -2.415034675252897e-02 +661 651 -3.072751892616545e-02 +661 652 -4.012781031913039e-02 +661 653 -5.413421453123236e-02 +661 654 -7.613960933881192e-02 +661 655 -1.132183869282756e-01 +661 656 -1.820810586422639e-01 +661 657 -3.301555353436725e-01 +661 658 -7.412185823610271e-01 +661 659 -3.165206906282907e+00 +661 660 -1.502055215844913e+01 +661 662 -1.502055215839533e+01 +661 663 -3.165206906282839e+00 +661 664 -7.412185823610113e-01 +661 665 -3.301555353436764e-01 +661 666 -1.820810586422674e-01 +661 667 -1.132183869282766e-01 +661 668 -7.613960933881120e-02 +661 669 -5.413421453123138e-02 +661 670 -4.012781031912974e-02 +661 671 -3.072751892616542e-02 +661 672 -2.415034675252896e-02 +661 673 -1.939104886145095e-02 +661 674 -1.585023865775514e-02 +661 675 -1.315380302376542e-02 +661 676 -1.105916272470025e-02 +661 677 -9.403863770832814e-03 +661 678 -8.076052134892594e-03 +661 679 -6.996835383339623e-03 +661 680 -6.109381318875727e-03 +661 681 -5.371977266379786e-03 +661 682 -4.753493624956895e-03 +661 683 -4.230349322908520e-03 +661 684 -3.784439171232916e-03 +661 685 -3.401691470521392e-03 +661 686 -3.071047067257377e-03 +661 687 -2.783725492315665e-03 +662 662 3.988394278106470e+01 +662 640 -4.230349322908520e-03 +662 641 -4.753493624956896e-03 +662 642 -5.371977266379809e-03 +662 643 -6.109381318875733e-03 +662 644 -6.996835383339702e-03 +662 645 -8.076052134892583e-03 +662 646 -9.403863770832816e-03 +662 647 -1.105916272470032e-02 +662 648 -1.315380302376550e-02 +662 649 -1.585023865775531e-02 +662 650 -1.939104886145111e-02 +662 651 -2.415034675252897e-02 +662 652 -3.072751892616573e-02 +662 653 -4.012781031913037e-02 +662 654 -5.413421453123204e-02 +662 655 -7.613960933881170e-02 +662 656 -1.132183869282765e-01 +662 657 -1.820810586422659e-01 +662 658 -3.301555353436740e-01 +662 659 -7.412185823610317e-01 +662 660 -3.165206906282885e+00 +662 661 -1.502055215839533e+01 +662 663 -1.502055215836224e+01 +662 664 -3.165206906282844e+00 +662 665 -7.412185823610142e-01 +662 666 -3.301555353436766e-01 +662 667 -1.820810586422639e-01 +662 668 -1.132183869282762e-01 +662 669 -7.613960933881123e-02 +662 670 -5.413421453123141e-02 +662 671 -4.012781031912996e-02 +662 672 -3.072751892616545e-02 +662 673 -2.415034675252877e-02 +662 674 -1.939104886145096e-02 +662 675 -1.585023865775520e-02 +662 676 -1.315380302376546e-02 +662 677 -1.105916272470026e-02 +662 678 -9.403863770832830e-03 +662 679 -8.076052134892554e-03 +662 680 -6.996835383339671e-03 +662 681 -6.109381318875748e-03 +662 682 -5.371977266379821e-03 +662 683 -4.753493624956896e-03 +662 684 -4.230349322908531e-03 +662 685 -3.784439171232936e-03 +662 686 -3.401691470521384e-03 +662 687 -3.071047067257392e-03 +663 663 3.988394278102297e+01 +663 640 -3.784439171232916e-03 +663 641 -4.230349322908531e-03 +663 642 -4.753493624956895e-03 +663 643 -5.371977266379788e-03 +663 644 -6.109381318875769e-03 +663 645 -6.996835383339674e-03 +663 646 -8.076052134892570e-03 +663 647 -9.403863770832813e-03 +663 648 -1.105916272470022e-02 +663 649 -1.315380302376542e-02 +663 650 -1.585023865775514e-02 +663 651 -1.939104886145097e-02 +663 652 -2.415034675252898e-02 +663 653 -3.072751892616545e-02 +663 654 -4.012781031912978e-02 +663 655 -5.413421453123111e-02 +663 656 -7.613960933881102e-02 +663 657 -1.132183869282772e-01 +663 658 -1.820810586422648e-01 +663 659 -3.301555353436801e-01 +663 660 -7.412185823610323e-01 +663 661 -3.165206906282839e+00 +663 662 -1.502055215836224e+01 +663 664 -1.502055215835481e+01 +663 665 -3.165206906282876e+00 +663 666 -7.412185823610208e-01 +663 667 -3.301555353436716e-01 +663 668 -1.820810586422644e-01 +663 669 -1.132183869282766e-01 +663 670 -7.613960933881170e-02 +663 671 -5.413421453123230e-02 +663 672 -4.012781031913035e-02 +663 673 -3.072751892616543e-02 +663 674 -2.415034675252896e-02 +663 675 -1.939104886145118e-02 +663 676 -1.585023865775536e-02 +663 677 -1.315380302376555e-02 +663 678 -1.105916272470032e-02 +663 679 -9.403863770832813e-03 +663 680 -8.076052134892592e-03 +663 681 -6.996835383339674e-03 +663 682 -6.109381318875771e-03 +663 683 -5.371977266379809e-03 +663 684 -4.753493624956895e-03 +663 685 -4.230349322908543e-03 +663 686 -3.784439171232917e-03 +663 687 -3.401691470521394e-03 +664 664 3.988394278105613e+01 +664 640 -3.401691470521392e-03 +664 641 -3.784439171232936e-03 +664 642 -4.230349322908543e-03 +664 643 -4.753493624956895e-03 +664 644 -5.371977266379837e-03 +664 645 -6.109381318875769e-03 +664 646 -6.996835383339698e-03 +664 647 -8.076052134892604e-03 +664 648 -9.403863770832839e-03 +664 649 -1.105916272470025e-02 +664 650 -1.315380302376542e-02 +664 651 -1.585023865775520e-02 +664 652 -1.939104886145118e-02 +664 653 -2.415034675252906e-02 +664 654 -3.072751892616544e-02 +664 655 -4.012781031912974e-02 +664 656 -5.413421453123138e-02 +664 657 -7.613960933881123e-02 +664 658 -1.132183869282756e-01 +664 659 -1.820810586422643e-01 +664 660 -3.301555353436800e-01 +664 661 -7.412185823610113e-01 +664 662 -3.165206906282844e+00 +664 663 -1.502055215835481e+01 +664 665 -1.502055215840057e+01 +664 666 -3.165206906282887e+00 +664 667 -7.412185823610292e-01 +664 668 -3.301555353436749e-01 +664 669 -1.820810586422663e-01 +664 670 -1.132183869282764e-01 +664 671 -7.613960933881248e-02 +664 672 -5.413421453123204e-02 +664 673 -4.012781031912976e-02 +664 674 -3.072751892616530e-02 +664 675 -2.415034675252897e-02 +664 676 -1.939104886145118e-02 +664 677 -1.585023865775532e-02 +664 678 -1.315380302376550e-02 +664 679 -1.105916272470022e-02 +664 680 -9.403863770832825e-03 +664 681 -8.076052134892578e-03 +664 682 -6.996835383339677e-03 +664 683 -6.109381318875733e-03 +664 684 -5.371977266379788e-03 +664 685 -4.753493624956895e-03 +664 686 -4.230349322908508e-03 +664 687 -3.784439171232917e-03 +665 665 3.988394278128569e+01 +665 640 -3.071047067257377e-03 +665 641 -3.401691470521384e-03 +665 642 -3.784439171232917e-03 +665 643 -4.230349322908508e-03 +665 644 -4.753493624956895e-03 +665 645 -5.371977266379790e-03 +665 646 -6.109381318875730e-03 +665 647 -6.996835383339623e-03 +665 648 -8.076052134892575e-03 +665 649 -9.403863770832839e-03 +665 650 -1.105916272470025e-02 +665 651 -1.315380302376546e-02 +665 652 -1.585023865775537e-02 +665 653 -1.939104886145125e-02 +665 654 -2.415034675252906e-02 +665 655 -3.072751892616543e-02 +665 656 -4.012781031912993e-02 +665 657 -5.413421453123171e-02 +665 658 -7.613960933881236e-02 +665 659 -1.132183869282771e-01 +665 660 -1.820810586422679e-01 +665 661 -3.301555353436764e-01 +665 662 -7.412185823610142e-01 +665 663 -3.165206906282876e+00 +665 664 -1.502055215840057e+01 +665 666 -1.502055215860522e+01 +665 667 -3.165206906282903e+00 +665 668 -7.412185823610296e-01 +665 669 -3.301555353436800e-01 +665 670 -1.820810586422627e-01 +665 671 -1.132183869282768e-01 +665 672 -7.613960933881184e-02 +665 673 -5.413421453123109e-02 +665 674 -4.012781031912954e-02 +665 675 -3.072751892616529e-02 +665 676 -2.415034675252896e-02 +665 677 -1.939104886145111e-02 +665 678 -1.585023865775526e-02 +665 679 -1.315380302376538e-02 +665 680 -1.105916272470022e-02 +665 681 -9.403863770832828e-03 +665 682 -8.076052134892642e-03 +665 683 -6.996835383339702e-03 +665 684 -6.109381318875769e-03 +665 685 -5.371977266379837e-03 +665 686 -4.753493624956895e-03 +665 687 -4.230349322908543e-03 +666 666 3.988394278152500e+01 +666 640 -2.783725492315665e-03 +666 641 -3.071047067257392e-03 +666 642 -3.401691470521394e-03 +666 643 -3.784439171232917e-03 +666 644 -4.230349322908543e-03 +666 645 -4.753493624956895e-03 +666 646 -5.371977266379805e-03 +666 647 -6.109381318875727e-03 +666 648 -6.996835383339671e-03 +666 649 -8.076052134892594e-03 +666 650 -9.403863770832814e-03 +666 651 -1.105916272470026e-02 +666 652 -1.315380302376555e-02 +666 653 -1.585023865775537e-02 +666 654 -1.939104886145119e-02 +666 655 -2.415034675252897e-02 +666 656 -3.072751892616544e-02 +666 657 -4.012781031912998e-02 +666 658 -5.413421453123234e-02 +666 659 -7.613960933881211e-02 +666 660 -1.132183869282781e-01 +666 661 -1.820810586422674e-01 +666 662 -3.301555353436766e-01 +666 663 -7.412185823610208e-01 +666 664 -3.165206906282887e+00 +666 665 -1.502055215860522e+01 +666 667 -1.502055215859231e+01 +666 668 -3.165206906282885e+00 +666 669 -7.412185823610316e-01 +666 670 -3.301555353436731e-01 +666 671 -1.820810586422657e-01 +666 672 -1.132183869282785e-01 +666 673 -7.613960933881114e-02 +666 674 -5.413421453123106e-02 +666 675 -4.012781031912974e-02 +666 676 -3.072751892616542e-02 +666 677 -2.415034675252897e-02 +666 678 -1.939104886145110e-02 +666 679 -1.585023865775514e-02 +666 680 -1.315380302376542e-02 +666 681 -1.105916272470025e-02 +666 682 -9.403863770832832e-03 +666 683 -8.076052134892583e-03 +666 684 -6.996835383339674e-03 +666 685 -6.109381318875769e-03 +666 686 -5.371977266379790e-03 +666 687 -4.753493624956895e-03 +667 667 3.988394278151356e+01 +667 640 -2.532689975072673e-03 +667 641 -2.783725492315671e-03 +667 642 -3.071047067257393e-03 +667 643 -3.401691470521385e-03 +667 644 -3.784439171232937e-03 +667 645 -4.230349322908531e-03 +667 646 -4.753493624956895e-03 +667 647 -5.371977266379786e-03 +667 648 -6.109381318875748e-03 +667 649 -6.996835383339674e-03 +667 650 -8.076052134892568e-03 +667 651 -9.403863770832832e-03 +667 652 -1.105916272470032e-02 +667 653 -1.315380302376555e-02 +667 654 -1.585023865775531e-02 +667 655 -1.939104886145111e-02 +667 656 -2.415034675252896e-02 +667 657 -3.072751892616545e-02 +667 658 -4.012781031913035e-02 +667 659 -5.413421453123204e-02 +667 660 -7.613960933881171e-02 +667 661 -1.132183869282766e-01 +667 662 -1.820810586422639e-01 +667 663 -3.301555353436716e-01 +667 664 -7.412185823610292e-01 +667 665 -3.165206906282903e+00 +667 666 -1.502055215859231e+01 +667 668 -1.502055215859645e+01 +667 669 -3.165206906282847e+00 +667 670 -7.412185823609972e-01 +667 671 -3.301555353436740e-01 +667 672 -1.820810586422698e-01 +667 673 -1.132183869282782e-01 +667 674 -7.613960933881114e-02 +667 675 -5.413421453123141e-02 +667 676 -4.012781031912996e-02 +667 677 -3.072751892616545e-02 +667 678 -2.415034675252897e-02 +667 679 -1.939104886145097e-02 +667 680 -1.585023865775520e-02 +667 681 -1.315380302376546e-02 +667 682 -1.105916272470026e-02 +667 683 -9.403863770832816e-03 +667 684 -8.076052134892570e-03 +667 685 -6.996835383339698e-03 +667 686 -6.109381318875730e-03 +667 687 -5.371977266379805e-03 +668 668 3.988394278151438e+01 +668 640 -2.312252367280536e-03 +668 641 -2.532689975072685e-03 +668 642 -2.783725492315679e-03 +668 643 -3.071047067257394e-03 +668 644 -3.401691470521412e-03 +668 645 -3.784439171232939e-03 +668 646 -4.230349322908545e-03 +668 647 -4.753493624956895e-03 +668 648 -5.371977266379821e-03 +668 649 -6.109381318875771e-03 +668 650 -6.996835383339677e-03 +668 651 -8.076052134892632e-03 +668 652 -9.403863770832833e-03 +668 653 -1.105916272470025e-02 +668 654 -1.315380302376542e-02 +668 655 -1.585023865775514e-02 +668 656 -1.939104886145096e-02 +668 657 -2.415034675252878e-02 +668 658 -3.072751892616544e-02 +668 659 -4.012781031912978e-02 +668 660 -5.413421453123111e-02 +668 661 -7.613960933881120e-02 +668 662 -1.132183869282762e-01 +668 663 -1.820810586422644e-01 +668 664 -3.301555353436749e-01 +668 665 -7.412185823610296e-01 +668 666 -3.165206906282885e+00 +668 667 -1.502055215859645e+01 +668 669 -1.502055215858808e+01 +668 670 -3.165206906282838e+00 +668 671 -7.412185823610181e-01 +668 672 -3.301555353436779e-01 +668 673 -1.820810586422675e-01 +668 674 -1.132183869282761e-01 +668 675 -7.613960933881188e-02 +668 676 -5.413421453123230e-02 +668 677 -4.012781031913037e-02 +668 678 -3.072751892616572e-02 +668 679 -2.415034675252897e-02 +668 680 -1.939104886145118e-02 +668 681 -1.585023865775536e-02 +668 682 -1.315380302376555e-02 +668 683 -1.105916272470032e-02 +668 684 -9.403863770832813e-03 +668 685 -8.076052134892604e-03 +668 686 -6.996835383339623e-03 +668 687 -6.109381318875727e-03 +669 669 3.988394278153928e+01 +669 640 -2.117777896667789e-03 +669 641 -2.312252367280536e-03 +669 642 -2.532689975072680e-03 +669 643 -2.783725492315667e-03 +669 644 -3.071047067257401e-03 +669 645 -3.401691470521395e-03 +669 646 -3.784439171232929e-03 +669 647 -4.230349322908520e-03 +669 648 -4.753493624956896e-03 +669 649 -5.371977266379809e-03 +669 650 -6.109381318875733e-03 +669 651 -6.996835383339702e-03 +669 652 -8.076052134892596e-03 +669 653 -9.403863770832839e-03 +669 654 -1.105916272470025e-02 +669 655 -1.315380302376542e-02 +669 656 -1.585023865775520e-02 +669 657 -1.939104886145103e-02 +669 658 -2.415034675252906e-02 +669 659 -3.072751892616544e-02 +669 660 -4.012781031912974e-02 +669 661 -5.413421453123138e-02 +669 662 -7.613960933881123e-02 +669 663 -1.132183869282766e-01 +669 664 -1.820810586422663e-01 +669 665 -3.301555353436800e-01 +669 666 -7.412185823610316e-01 +669 667 -3.165206906282847e+00 +669 668 -1.502055215858808e+01 +669 670 -1.502055215863993e+01 +669 671 -3.165206906282869e+00 +669 672 -7.412185823610222e-01 +669 673 -3.301555353436754e-01 +669 674 -1.820810586422636e-01 +669 675 -1.132183869282762e-01 +669 676 -7.613960933881192e-02 +669 677 -5.413421453123205e-02 +669 678 -4.012781031913017e-02 +669 679 -3.072751892616531e-02 +669 680 -2.415034675252897e-02 +669 681 -1.939104886145118e-02 +669 682 -1.585023865775532e-02 +669 683 -1.315380302376550e-02 +669 684 -1.105916272470022e-02 +669 685 -9.403863770832839e-03 +669 686 -8.076052134892575e-03 +669 687 -6.996835383339671e-03 +670 670 3.988394278164015e+01 +670 640 -1.945462087124849e-03 +670 641 -2.117777896667793e-03 +670 642 -2.312252367280536e-03 +670 643 -2.532689975072674e-03 +670 644 -2.783725492315679e-03 +670 645 -3.071047067257393e-03 +670 646 -3.401691470521394e-03 +670 647 -3.784439171232916e-03 +670 648 -4.230349322908531e-03 +670 649 -4.753493624956895e-03 +670 650 -5.371977266379788e-03 +670 651 -6.109381318875769e-03 +670 652 -6.996835383339674e-03 +670 653 -8.076052134892592e-03 +670 654 -9.403863770832825e-03 +670 655 -1.105916272470022e-02 +670 656 -1.315380302376542e-02 +670 657 -1.585023865775520e-02 +670 658 -1.939104886145118e-02 +670 659 -2.415034675252897e-02 +670 660 -3.072751892616529e-02 +670 661 -4.012781031912974e-02 +670 662 -5.413421453123141e-02 +670 663 -7.613960933881170e-02 +670 664 -1.132183869282764e-01 +670 665 -1.820810586422627e-01 +670 666 -3.301555353436731e-01 +670 667 -7.412185823609972e-01 +670 668 -3.165206906282838e+00 +670 669 -1.502055215863993e+01 +670 671 -1.502055215866007e+01 +670 672 -3.165206906282904e+00 +670 673 -7.412185823610313e-01 +670 674 -3.301555353436800e-01 +670 675 -1.820810586422670e-01 +670 676 -1.132183869282770e-01 +670 677 -7.613960933881178e-02 +670 678 -5.413421453123204e-02 +670 679 -4.012781031912978e-02 +670 680 -3.072751892616544e-02 +670 681 -2.415034675252906e-02 +670 682 -1.939104886145119e-02 +670 683 -1.585023865775531e-02 +670 684 -1.315380302376542e-02 +670 685 -1.105916272470025e-02 +670 686 -9.403863770832839e-03 +670 687 -8.076052134892594e-03 +671 671 3.988394278169714e+01 +671 640 -1.792160480940038e-03 +671 641 -1.945462087124857e-03 +671 642 -2.117777896667799e-03 +671 643 -2.312252367280536e-03 +671 644 -2.532689975072691e-03 +671 645 -2.783725492315679e-03 +671 646 -3.071047067257401e-03 +671 647 -3.401691470521392e-03 +671 648 -3.784439171232936e-03 +671 649 -4.230349322908543e-03 +671 650 -4.753493624956895e-03 +671 651 -5.371977266379837e-03 +671 652 -6.109381318875769e-03 +671 653 -6.996835383339698e-03 +671 654 -8.076052134892604e-03 +671 655 -9.403863770832827e-03 +671 656 -1.105916272470025e-02 +671 657 -1.315380302376546e-02 +671 658 -1.585023865775536e-02 +671 659 -1.939104886145118e-02 +671 660 -2.415034675252896e-02 +671 661 -3.072751892616542e-02 +671 662 -4.012781031912996e-02 +671 663 -5.413421453123230e-02 +671 664 -7.613960933881248e-02 +671 665 -1.132183869282768e-01 +671 666 -1.820810586422657e-01 +671 667 -3.301555353436740e-01 +671 668 -7.412185823610181e-01 +671 669 -3.165206906282869e+00 +671 670 -1.502055215866007e+01 +671 672 -1.502055215931060e+01 +671 673 -3.165206906282863e+00 +671 674 -7.412185823610284e-01 +671 675 -3.301555353436790e-01 +671 676 -1.820810586422624e-01 +671 677 -1.132183869282741e-01 +671 678 -7.613960933881136e-02 +671 679 -5.413421453123111e-02 +671 680 -4.012781031912974e-02 +671 681 -3.072751892616543e-02 +671 682 -2.415034675252897e-02 +671 683 -1.939104886145111e-02 +671 684 -1.585023865775514e-02 +671 685 -1.315380302376542e-02 +671 686 -1.105916272470025e-02 +671 687 -9.403863770832814e-03 +672 672 3.988394278169704e+01 +672 656 -9.403863770832813e-03 +672 657 -1.105916272470026e-02 +672 658 -1.315380302376555e-02 +672 659 -1.585023865775531e-02 +672 660 -1.939104886145111e-02 +672 661 -2.415034675252896e-02 +672 662 -3.072751892616545e-02 +672 663 -4.012781031913035e-02 +672 664 -5.413421453123204e-02 +672 665 -7.613960933881184e-02 +672 666 -1.132183869282785e-01 +672 667 -1.820810586422698e-01 +672 668 -3.301555353436779e-01 +672 669 -7.412185823610222e-01 +672 670 -3.165206906282904e+00 +672 671 -1.502055215931060e+01 +672 673 -1.502055215866000e+01 +672 674 -3.165206906282862e+00 +672 675 -7.412185823610278e-01 +672 676 -3.301555353436725e-01 +672 677 -1.820810586422600e-01 +672 678 -1.132183869282749e-01 +672 679 -7.613960933881103e-02 +672 680 -5.413421453123141e-02 +672 681 -4.012781031912996e-02 +672 682 -3.072751892616545e-02 +672 683 -2.415034675252897e-02 +672 684 -1.939104886145097e-02 +672 685 -1.585023865775520e-02 +672 686 -1.315380302376546e-02 +672 687 -1.105916272470026e-02 +672 688 -9.403863770832832e-03 +672 689 -8.076052134892632e-03 +672 690 -6.996835383339702e-03 +672 691 -6.109381318875769e-03 +672 692 -5.371977266379837e-03 +672 693 -4.753493624956895e-03 +672 694 -4.230349322908543e-03 +672 695 -3.784439171232937e-03 +672 696 -3.401691470521412e-03 +672 697 -3.071047067257401e-03 +672 698 -2.783725492315679e-03 +672 699 -2.532689975072691e-03 +672 700 -2.312252367280536e-03 +672 701 -2.117777896667799e-03 +672 702 -1.945462087124857e-03 +672 703 -1.792160480940046e-03 +673 673 3.988394278164019e+01 +673 656 -8.076052134892570e-03 +673 657 -9.403863770832771e-03 +673 658 -1.105916272470025e-02 +673 659 -1.315380302376542e-02 +673 660 -1.585023865775514e-02 +673 661 -1.939104886145095e-02 +673 662 -2.415034675252877e-02 +673 663 -3.072751892616543e-02 +673 664 -4.012781031912976e-02 +673 665 -5.413421453123109e-02 +673 666 -7.613960933881114e-02 +673 667 -1.132183869282782e-01 +673 668 -1.820810586422675e-01 +673 669 -3.301555353436754e-01 +673 670 -7.412185823610313e-01 +673 671 -3.165206906282863e+00 +673 672 -1.502055215866000e+01 +673 674 -1.502055215864002e+01 +673 675 -3.165206906282879e+00 +673 676 -7.412185823610173e-01 +673 677 -3.301555353436714e-01 +673 678 -1.820810586422646e-01 +673 679 -1.132183869282771e-01 +673 680 -7.613960933881188e-02 +673 681 -5.413421453123234e-02 +673 682 -4.012781031913039e-02 +673 683 -3.072751892616573e-02 +673 684 -2.415034675252898e-02 +673 685 -1.939104886145118e-02 +673 686 -1.585023865775537e-02 +673 687 -1.315380302376555e-02 +673 688 -1.105916272470032e-02 +673 689 -9.403863770832833e-03 +673 690 -8.076052134892596e-03 +673 691 -6.996835383339674e-03 +673 692 -6.109381318875769e-03 +673 693 -5.371977266379790e-03 +673 694 -4.753493624956895e-03 +673 695 -4.230349322908531e-03 +673 696 -3.784439171232939e-03 +673 697 -3.401691470521395e-03 +673 698 -3.071047067257393e-03 +673 699 -2.783725492315679e-03 +673 700 -2.532689975072674e-03 +673 701 -2.312252367280536e-03 +673 702 -2.117777896667794e-03 +673 703 -1.945462087124857e-03 +674 674 3.988394278153930e+01 +674 656 -6.996835383339674e-03 +674 657 -8.076052134892556e-03 +674 658 -9.403863770832827e-03 +674 659 -1.105916272470022e-02 +674 660 -1.315380302376537e-02 +674 661 -1.585023865775514e-02 +674 662 -1.939104886145096e-02 +674 663 -2.415034675252896e-02 +674 664 -3.072751892616530e-02 +674 665 -4.012781031912954e-02 +674 666 -5.413421453123106e-02 +674 667 -7.613960933881114e-02 +674 668 -1.132183869282761e-01 +674 669 -1.820810586422636e-01 +674 670 -3.301555353436800e-01 +674 671 -7.412185823610284e-01 +674 672 -3.165206906282862e+00 +674 673 -1.502055215864002e+01 +674 675 -1.502055215858800e+01 +674 676 -3.165206906282878e+00 +674 677 -7.412185823610247e-01 +674 678 -3.301555353436775e-01 +674 679 -1.820810586422694e-01 +674 680 -1.132183869282786e-01 +674 681 -7.613960933881274e-02 +674 682 -5.413421453123236e-02 +674 683 -4.012781031913037e-02 +674 684 -3.072751892616545e-02 +674 685 -2.415034675252906e-02 +674 686 -1.939104886145125e-02 +674 687 -1.585023865775537e-02 +674 688 -1.315380302376555e-02 +674 689 -1.105916272470025e-02 +674 690 -9.403863770832839e-03 +674 691 -8.076052134892592e-03 +674 692 -6.996835383339698e-03 +674 693 -6.109381318875730e-03 +674 694 -5.371977266379805e-03 +674 695 -4.753493624956895e-03 +674 696 -4.230349322908545e-03 +674 697 -3.784439171232929e-03 +674 698 -3.401691470521394e-03 +674 699 -3.071047067257401e-03 +674 700 -2.783725492315666e-03 +674 701 -2.532689975072680e-03 +674 702 -2.312252367280536e-03 +674 703 -2.117777896667799e-03 +675 675 3.988394278151446e+01 +675 656 -6.109381318875771e-03 +675 657 -6.996835383339677e-03 +675 658 -8.076052134892653e-03 +675 659 -9.403863770832842e-03 +675 660 -1.105916272470022e-02 +675 661 -1.315380302376542e-02 +675 662 -1.585023865775520e-02 +675 663 -1.939104886145118e-02 +675 664 -2.415034675252897e-02 +675 665 -3.072751892616529e-02 +675 666 -4.012781031912974e-02 +675 667 -5.413421453123141e-02 +675 668 -7.613960933881188e-02 +675 669 -1.132183869282762e-01 +675 670 -1.820810586422670e-01 +675 671 -3.301555353436790e-01 +675 672 -7.412185823610278e-01 +675 673 -3.165206906282879e+00 +675 674 -1.502055215858800e+01 +675 676 -1.502055215859656e+01 +675 677 -3.165206906282883e+00 +675 678 -7.412185823610101e-01 +675 679 -3.301555353436757e-01 +675 680 -1.820810586422661e-01 +675 681 -1.132183869282772e-01 +675 682 -7.613960933881207e-02 +675 683 -5.413421453123204e-02 +675 684 -4.012781031912978e-02 +675 685 -3.072751892616544e-02 +675 686 -2.415034675252906e-02 +675 687 -1.939104886145119e-02 +675 688 -1.585023865775531e-02 +675 689 -1.315380302376542e-02 +675 690 -1.105916272470025e-02 +675 691 -9.403863770832825e-03 +675 692 -8.076052134892604e-03 +675 693 -6.996835383339623e-03 +675 694 -6.109381318875727e-03 +675 695 -5.371977266379786e-03 +675 696 -4.753493624956895e-03 +675 697 -4.230349322908520e-03 +675 698 -3.784439171232916e-03 +675 699 -3.401691470521392e-03 +675 700 -3.071047067257377e-03 +675 701 -2.783725492315665e-03 +675 702 -2.532689975072673e-03 +675 703 -2.312252367280536e-03 +676 676 3.988394278151357e+01 +676 656 -5.371977266379809e-03 +676 657 -6.109381318875733e-03 +676 658 -6.996835383339702e-03 +676 659 -8.076052134892594e-03 +676 660 -9.403863770832811e-03 +676 661 -1.105916272470025e-02 +676 662 -1.315380302376546e-02 +676 663 -1.585023865775536e-02 +676 664 -1.939104886145118e-02 +676 665 -2.415034675252896e-02 +676 666 -3.072751892616542e-02 +676 667 -4.012781031912996e-02 +676 668 -5.413421453123230e-02 +676 669 -7.613960933881192e-02 +676 670 -1.132183869282770e-01 +676 671 -1.820810586422624e-01 +676 672 -3.301555353436725e-01 +676 673 -7.412185823610173e-01 +676 674 -3.165206906282878e+00 +676 675 -1.502055215859656e+01 +676 677 -1.502055215859220e+01 +676 678 -3.165206906282837e+00 +676 679 -7.412185823610229e-01 +676 680 -3.301555353436804e-01 +676 681 -1.820810586422667e-01 +676 682 -1.132183869282771e-01 +676 683 -7.613960933881173e-02 +676 684 -5.413421453123111e-02 +676 685 -4.012781031912974e-02 +676 686 -3.072751892616543e-02 +676 687 -2.415034675252897e-02 +676 688 -1.939104886145111e-02 +676 689 -1.585023865775514e-02 +676 690 -1.315380302376542e-02 +676 691 -1.105916272470022e-02 +676 692 -9.403863770832827e-03 +676 693 -8.076052134892564e-03 +676 694 -6.996835383339671e-03 +676 695 -6.109381318875748e-03 +676 696 -5.371977266379821e-03 +676 697 -4.753493624956896e-03 +676 698 -4.230349322908531e-03 +676 699 -3.784439171232936e-03 +676 700 -3.401691470521384e-03 +676 701 -3.071047067257392e-03 +676 702 -2.783725492315671e-03 +676 703 -2.532689975072685e-03 +677 677 3.988394278152493e+01 +677 656 -4.753493624956895e-03 +677 657 -5.371977266379788e-03 +677 658 -6.109381318875769e-03 +677 659 -6.996835383339674e-03 +677 660 -8.076052134892582e-03 +677 661 -9.403863770832814e-03 +677 662 -1.105916272470026e-02 +677 663 -1.315380302376555e-02 +677 664 -1.585023865775532e-02 +677 665 -1.939104886145111e-02 +677 666 -2.415034675252897e-02 +677 667 -3.072751892616545e-02 +677 668 -4.012781031913037e-02 +677 669 -5.413421453123205e-02 +677 670 -7.613960933881178e-02 +677 671 -1.132183869282741e-01 +677 672 -1.820810586422600e-01 +677 673 -3.301555353436714e-01 +677 674 -7.412185823610247e-01 +677 675 -3.165206906282883e+00 +677 676 -1.502055215859220e+01 +677 678 -1.502055215860525e+01 +677 679 -3.165206906282893e+00 +677 680 -7.412185823610358e-01 +677 681 -3.301555353436815e-01 +677 682 -1.820810586422667e-01 +677 683 -1.132183869282775e-01 +677 684 -7.613960933881099e-02 +677 685 -5.413421453123138e-02 +677 686 -4.012781031912993e-02 +677 687 -3.072751892616544e-02 +677 688 -2.415034675252896e-02 +677 689 -1.939104886145096e-02 +677 690 -1.585023865775520e-02 +677 691 -1.315380302376542e-02 +677 692 -1.105916272470025e-02 +677 693 -9.403863770832814e-03 +677 694 -8.076052134892582e-03 +677 695 -6.996835383339674e-03 +677 696 -6.109381318875771e-03 +677 697 -5.371977266379809e-03 +677 698 -4.753493624956895e-03 +677 699 -4.230349322908543e-03 +677 700 -3.784439171232917e-03 +677 701 -3.401691470521394e-03 +677 702 -3.071047067257393e-03 +677 703 -2.783725492315679e-03 +678 678 3.988394278128563e+01 +678 656 -4.230349322908543e-03 +678 657 -4.753493624956895e-03 +678 658 -5.371977266379837e-03 +678 659 -6.109381318875769e-03 +678 660 -6.996835383339698e-03 +678 661 -8.076052134892594e-03 +678 662 -9.403863770832830e-03 +678 663 -1.105916272470032e-02 +678 664 -1.315380302376550e-02 +678 665 -1.585023865775526e-02 +678 666 -1.939104886145110e-02 +678 667 -2.415034675252897e-02 +678 668 -3.072751892616572e-02 +678 669 -4.012781031913017e-02 +678 670 -5.413421453123204e-02 +678 671 -7.613960933881136e-02 +678 672 -1.132183869282749e-01 +678 673 -1.820810586422646e-01 +678 674 -3.301555353436775e-01 +678 675 -7.412185823610101e-01 +678 676 -3.165206906282837e+00 +678 677 -1.502055215860525e+01 +678 679 -1.502055215840057e+01 +678 680 -3.165206906282866e+00 +678 681 -7.412185823610313e-01 +678 682 -3.301555353436740e-01 +678 683 -1.820810586422640e-01 +678 684 -1.132183869282748e-01 +678 685 -7.613960933881106e-02 +678 686 -5.413421453123171e-02 +678 687 -4.012781031912998e-02 +678 688 -3.072751892616545e-02 +678 689 -2.415034675252878e-02 +678 690 -1.939104886145103e-02 +678 691 -1.585023865775520e-02 +678 692 -1.315380302376546e-02 +678 693 -1.105916272470026e-02 +678 694 -9.403863770832816e-03 +678 695 -8.076052134892557e-03 +678 696 -6.996835383339677e-03 +678 697 -6.109381318875733e-03 +678 698 -5.371977266379788e-03 +678 699 -4.753493624956895e-03 +678 700 -4.230349322908508e-03 +678 701 -3.784439171232917e-03 +678 702 -3.401691470521385e-03 +678 703 -3.071047067257394e-03 +679 679 3.988394278105615e+01 +679 656 -3.784439171232917e-03 +679 657 -4.230349322908508e-03 +679 658 -4.753493624956895e-03 +679 659 -5.371977266379790e-03 +679 660 -6.109381318875730e-03 +679 661 -6.996835383339623e-03 +679 662 -8.076052134892554e-03 +679 663 -9.403863770832813e-03 +679 664 -1.105916272470022e-02 +679 665 -1.315380302376538e-02 +679 666 -1.585023865775514e-02 +679 667 -1.939104886145097e-02 +679 668 -2.415034675252897e-02 +679 669 -3.072751892616531e-02 +679 670 -4.012781031912978e-02 +679 671 -5.413421453123111e-02 +679 672 -7.613960933881103e-02 +679 673 -1.132183869282771e-01 +679 674 -1.820810586422694e-01 +679 675 -3.301555353436757e-01 +679 676 -7.412185823610229e-01 +679 677 -3.165206906282893e+00 +679 678 -1.502055215840057e+01 +679 680 -1.502055215835479e+01 +679 681 -3.165206906282879e+00 +679 682 -7.412185823610147e-01 +679 683 -3.301555353436713e-01 +679 684 -1.820810586422611e-01 +679 685 -1.132183869282744e-01 +679 686 -7.613960933881186e-02 +679 687 -5.413421453123234e-02 +679 688 -4.012781031913035e-02 +679 689 -3.072751892616544e-02 +679 690 -2.415034675252906e-02 +679 691 -1.939104886145118e-02 +679 692 -1.585023865775536e-02 +679 693 -1.315380302376555e-02 +679 694 -1.105916272470032e-02 +679 695 -9.403863770832828e-03 +679 696 -8.076052134892653e-03 +679 697 -6.996835383339702e-03 +679 698 -6.109381318875769e-03 +679 699 -5.371977266379837e-03 +679 700 -4.753493624956895e-03 +679 701 -4.230349322908543e-03 +679 702 -3.784439171232937e-03 +679 703 -3.401691470521412e-03 +680 680 3.988394278102300e+01 +680 656 -3.401691470521394e-03 +680 657 -3.784439171232917e-03 +680 658 -4.230349322908543e-03 +680 659 -4.753493624956895e-03 +680 660 -5.371977266379805e-03 +680 661 -6.109381318875727e-03 +680 662 -6.996835383339671e-03 +680 663 -8.076052134892592e-03 +680 664 -9.403863770832825e-03 +680 665 -1.105916272470022e-02 +680 666 -1.315380302376542e-02 +680 667 -1.585023865775520e-02 +680 668 -1.939104886145118e-02 +680 669 -2.415034675252897e-02 +680 670 -3.072751892616544e-02 +680 671 -4.012781031912974e-02 +680 672 -5.413421453123141e-02 +680 673 -7.613960933881188e-02 +680 674 -1.132183869282786e-01 +680 675 -1.820810586422661e-01 +680 676 -3.301555353436804e-01 +680 677 -7.412185823610358e-01 +680 678 -3.165206906282866e+00 +680 679 -1.502055215835479e+01 +680 681 -1.502055215836229e+01 +680 682 -3.165206906282855e+00 +680 683 -7.412185823610089e-01 +680 684 -3.301555353436751e-01 +680 685 -1.820810586422642e-01 +680 686 -1.132183869282759e-01 +680 687 -7.613960933881193e-02 +680 688 -5.413421453123204e-02 +680 689 -4.012781031912978e-02 +680 690 -3.072751892616544e-02 +680 691 -2.415034675252897e-02 +680 692 -1.939104886145118e-02 +680 693 -1.585023865775532e-02 +680 694 -1.315380302376550e-02 +680 695 -1.105916272470022e-02 +680 696 -9.403863770832842e-03 +680 697 -8.076052134892594e-03 +680 698 -6.996835383339674e-03 +680 699 -6.109381318875769e-03 +680 700 -5.371977266379790e-03 +680 701 -4.753493624956895e-03 +680 702 -4.230349322908531e-03 +680 703 -3.784439171232939e-03 +681 681 3.988394278106467e+01 +681 656 -3.071047067257393e-03 +681 657 -3.401691470521385e-03 +681 658 -3.784439171232937e-03 +681 659 -4.230349322908531e-03 +681 660 -4.753493624956895e-03 +681 661 -5.371977266379786e-03 +681 662 -6.109381318875748e-03 +681 663 -6.996835383339674e-03 +681 664 -8.076052134892578e-03 +681 665 -9.403863770832828e-03 +681 666 -1.105916272470025e-02 +681 667 -1.315380302376546e-02 +681 668 -1.585023865775536e-02 +681 669 -1.939104886145118e-02 +681 670 -2.415034675252906e-02 +681 671 -3.072751892616543e-02 +681 672 -4.012781031912996e-02 +681 673 -5.413421453123234e-02 +681 674 -7.613960933881274e-02 +681 675 -1.132183869282772e-01 +681 676 -1.820810586422667e-01 +681 677 -3.301555353436815e-01 +681 678 -7.412185823610313e-01 +681 679 -3.165206906282879e+00 +681 680 -1.502055215836229e+01 +681 682 -1.502055215839530e+01 +681 683 -3.165206906282797e+00 +681 684 -7.412185823610147e-01 +681 685 -3.301555353436740e-01 +681 686 -1.820810586422644e-01 +681 687 -1.132183869282767e-01 +681 688 -7.613960933881204e-02 +681 689 -5.413421453123111e-02 +681 690 -4.012781031912974e-02 +681 691 -3.072751892616529e-02 +681 692 -2.415034675252896e-02 +681 693 -1.939104886145111e-02 +681 694 -1.585023865775526e-02 +681 695 -1.315380302376538e-02 +681 696 -1.105916272470022e-02 +681 697 -9.403863770832811e-03 +681 698 -8.076052134892582e-03 +681 699 -6.996835383339698e-03 +681 700 -6.109381318875730e-03 +681 701 -5.371977266379805e-03 +681 702 -4.753493624956895e-03 +681 703 -4.230349322908545e-03 +682 682 3.988394278115143e+01 +682 656 -2.783725492315679e-03 +682 657 -3.071047067257394e-03 +682 658 -3.401691470521412e-03 +682 659 -3.784439171232939e-03 +682 660 -4.230349322908545e-03 +682 661 -4.753493624956895e-03 +682 662 -5.371977266379821e-03 +682 663 -6.109381318875771e-03 +682 664 -6.996835383339677e-03 +682 665 -8.076052134892642e-03 +682 666 -9.403863770832832e-03 +682 667 -1.105916272470026e-02 +682 668 -1.315380302376555e-02 +682 669 -1.585023865775532e-02 +682 670 -1.939104886145119e-02 +682 671 -2.415034675252897e-02 +682 672 -3.072751892616545e-02 +682 673 -4.012781031913039e-02 +682 674 -5.413421453123236e-02 +682 675 -7.613960933881207e-02 +682 676 -1.132183869282771e-01 +682 677 -1.820810586422667e-01 +682 678 -3.301555353436740e-01 +682 679 -7.412185823610147e-01 +682 680 -3.165206906282855e+00 +682 681 -1.502055215839530e+01 +682 683 -1.502055215844904e+01 +682 684 -3.165206906282897e+00 +682 685 -7.412185823610367e-01 +682 686 -3.301555353436800e-01 +682 687 -1.820810586422668e-01 +682 688 -1.132183869282785e-01 +682 689 -7.613960933881116e-02 +682 690 -5.413421453123138e-02 +682 691 -4.012781031912974e-02 +682 692 -3.072751892616542e-02 +682 693 -2.415034675252897e-02 +682 694 -1.939104886145110e-02 +682 695 -1.585023865775514e-02 +682 696 -1.315380302376542e-02 +682 697 -1.105916272470025e-02 +682 698 -9.403863770832814e-03 +682 699 -8.076052134892594e-03 +682 700 -6.996835383339623e-03 +682 701 -6.109381318875727e-03 +682 702 -5.371977266379786e-03 +682 703 -4.753493624956895e-03 +683 683 3.988394278128108e+01 +683 656 -2.532689975072680e-03 +683 657 -2.783725492315667e-03 +683 658 -3.071047067257401e-03 +683 659 -3.401691470521395e-03 +683 660 -3.784439171232929e-03 +683 661 -4.230349322908520e-03 +683 662 -4.753493624956896e-03 +683 663 -5.371977266379809e-03 +683 664 -6.109381318875733e-03 +683 665 -6.996835383339702e-03 +683 666 -8.076052134892583e-03 +683 667 -9.403863770832816e-03 +683 668 -1.105916272470032e-02 +683 669 -1.315380302376550e-02 +683 670 -1.585023865775531e-02 +683 671 -1.939104886145111e-02 +683 672 -2.415034675252897e-02 +683 673 -3.072751892616573e-02 +683 674 -4.012781031913037e-02 +683 675 -5.413421453123204e-02 +683 676 -7.613960933881173e-02 +683 677 -1.132183869282775e-01 +683 678 -1.820810586422640e-01 +683 679 -3.301555353436713e-01 +683 680 -7.412185823610089e-01 +683 681 -3.165206906282797e+00 +683 682 -1.502055215844904e+01 +683 684 -1.502055215852578e+01 +683 685 -3.165206906282882e+00 +683 686 -7.412185823610323e-01 +683 687 -3.301555353436809e-01 +683 688 -1.820810586422676e-01 +683 689 -1.132183869282773e-01 +683 690 -7.613960933881117e-02 +683 691 -5.413421453123141e-02 +683 692 -4.012781031912996e-02 +683 693 -3.072751892616545e-02 +683 694 -2.415034675252897e-02 +683 695 -1.939104886145097e-02 +683 696 -1.585023865775520e-02 +683 697 -1.315380302376546e-02 +683 698 -1.105916272470026e-02 +683 699 -9.403863770832830e-03 +683 700 -8.076052134892554e-03 +683 701 -6.996835383339671e-03 +683 702 -6.109381318875748e-03 +683 703 -5.371977266379821e-03 +684 684 3.988394278146370e+01 +684 656 -2.312252367280536e-03 +684 657 -2.532689975072674e-03 +684 658 -2.783725492315679e-03 +684 659 -3.071047067257393e-03 +684 660 -3.401691470521394e-03 +684 661 -3.784439171232916e-03 +684 662 -4.230349322908531e-03 +684 663 -4.753493624956895e-03 +684 664 -5.371977266379788e-03 +684 665 -6.109381318875769e-03 +684 666 -6.996835383339674e-03 +684 667 -8.076052134892570e-03 +684 668 -9.403863770832813e-03 +684 669 -1.105916272470022e-02 +684 670 -1.315380302376542e-02 +684 671 -1.585023865775514e-02 +684 672 -1.939104886145097e-02 +684 673 -2.415034675252898e-02 +684 674 -3.072751892616545e-02 +684 675 -4.012781031912978e-02 +684 676 -5.413421453123111e-02 +684 677 -7.613960933881099e-02 +684 678 -1.132183869282748e-01 +684 679 -1.820810586422611e-01 +684 680 -3.301555353436751e-01 +684 681 -7.412185823610147e-01 +684 682 -3.165206906282897e+00 +684 683 -1.502055215852578e+01 +684 685 -1.502055215863292e+01 +684 686 -3.165206906282881e+00 +684 687 -7.412185823610294e-01 +684 688 -3.301555353436764e-01 +684 689 -1.820810586422690e-01 +684 690 -1.132183869282770e-01 +684 691 -7.613960933881209e-02 +684 692 -5.413421453123230e-02 +684 693 -4.012781031913037e-02 +684 694 -3.072751892616572e-02 +684 695 -2.415034675252897e-02 +684 696 -1.939104886145118e-02 +684 697 -1.585023865775536e-02 +684 698 -1.315380302376555e-02 +684 699 -1.105916272470032e-02 +684 700 -9.403863770832813e-03 +684 701 -8.076052134892592e-03 +684 702 -6.996835383339674e-03 +684 703 -6.109381318875771e-03 +685 685 3.988394278171956e+01 +685 656 -2.117777896667799e-03 +685 657 -2.312252367280536e-03 +685 658 -2.532689975072691e-03 +685 659 -2.783725492315679e-03 +685 660 -3.071047067257401e-03 +685 661 -3.401691470521392e-03 +685 662 -3.784439171232936e-03 +685 663 -4.230349322908543e-03 +685 664 -4.753493624956895e-03 +685 665 -5.371977266379837e-03 +685 666 -6.109381318875769e-03 +685 667 -6.996835383339698e-03 +685 668 -8.076052134892604e-03 +685 669 -9.403863770832839e-03 +685 670 -1.105916272470025e-02 +685 671 -1.315380302376542e-02 +685 672 -1.585023865775520e-02 +685 673 -1.939104886145118e-02 +685 674 -2.415034675252906e-02 +685 675 -3.072751892616544e-02 +685 676 -4.012781031912974e-02 +685 677 -5.413421453123138e-02 +685 678 -7.613960933881106e-02 +685 679 -1.132183869282744e-01 +685 680 -1.820810586422642e-01 +685 681 -3.301555353436740e-01 +685 682 -7.412185823610367e-01 +685 683 -3.165206906282882e+00 +685 684 -1.502055215863292e+01 +685 686 -1.502055215878381e+01 +685 687 -3.165206906282881e+00 +685 688 -7.412185823610197e-01 +685 689 -3.301555353436779e-01 +685 690 -1.820810586422643e-01 +685 691 -1.132183869282762e-01 +685 692 -7.613960933881191e-02 +685 693 -5.413421453123205e-02 +685 694 -4.012781031913017e-02 +685 695 -3.072751892616531e-02 +685 696 -2.415034675252897e-02 +685 697 -1.939104886145118e-02 +685 698 -1.585023865775532e-02 +685 699 -1.315380302376550e-02 +685 700 -1.105916272470022e-02 +685 701 -9.403863770832825e-03 +685 702 -8.076052134892578e-03 +685 703 -6.996835383339677e-03 +686 686 3.988394278208172e+01 +686 656 -1.945462087124849e-03 +686 657 -2.117777896667785e-03 +686 658 -2.312252367280536e-03 +686 659 -2.532689975072674e-03 +686 660 -2.783725492315666e-03 +686 661 -3.071047067257377e-03 +686 662 -3.401691470521384e-03 +686 663 -3.784439171232917e-03 +686 664 -4.230349322908508e-03 +686 665 -4.753493624956895e-03 +686 666 -5.371977266379790e-03 +686 667 -6.109381318875730e-03 +686 668 -6.996835383339623e-03 +686 669 -8.076052134892575e-03 +686 670 -9.403863770832839e-03 +686 671 -1.105916272470025e-02 +686 672 -1.315380302376546e-02 +686 673 -1.585023865775537e-02 +686 674 -1.939104886145125e-02 +686 675 -2.415034675252906e-02 +686 676 -3.072751892616543e-02 +686 677 -4.012781031912993e-02 +686 678 -5.413421453123171e-02 +686 679 -7.613960933881186e-02 +686 680 -1.132183869282759e-01 +686 681 -1.820810586422644e-01 +686 682 -3.301555353436800e-01 +686 683 -7.412185823610323e-01 +686 684 -3.165206906282881e+00 +686 685 -1.502055215878381e+01 +686 687 -1.502055215899852e+01 +686 688 -3.165206906282874e+00 +686 689 -7.412185823610246e-01 +686 690 -3.301555353436757e-01 +686 691 -1.820810586422651e-01 +686 692 -1.132183869282761e-01 +686 693 -7.613960933881159e-02 +686 694 -5.413421453123172e-02 +686 695 -4.012781031912956e-02 +686 696 -3.072751892616529e-02 +686 697 -2.415034675252896e-02 +686 698 -1.939104886145111e-02 +686 699 -1.585023865775526e-02 +686 700 -1.315380302376538e-02 +686 701 -1.105916272470022e-02 +686 702 -9.403863770832828e-03 +686 703 -8.076052134892642e-03 +687 687 3.988394278260309e+01 +687 656 -1.792160480940038e-03 +687 657 -1.945462087124849e-03 +687 658 -2.117777896667799e-03 +687 659 -2.312252367280536e-03 +687 660 -2.532689975072680e-03 +687 661 -2.783725492315665e-03 +687 662 -3.071047067257392e-03 +687 663 -3.401691470521394e-03 +687 664 -3.784439171232917e-03 +687 665 -4.230349322908543e-03 +687 666 -4.753493624956895e-03 +687 667 -5.371977266379805e-03 +687 668 -6.109381318875727e-03 +687 669 -6.996835383339671e-03 +687 670 -8.076052134892594e-03 +687 671 -9.403863770832814e-03 +687 672 -1.105916272470026e-02 +687 673 -1.315380302376555e-02 +687 674 -1.585023865775537e-02 +687 675 -1.939104886145119e-02 +687 676 -2.415034675252897e-02 +687 677 -3.072751892616544e-02 +687 678 -4.012781031912998e-02 +687 679 -5.413421453123234e-02 +687 680 -7.613960933881193e-02 +687 681 -1.132183869282767e-01 +687 682 -1.820810586422668e-01 +687 683 -3.301555353436809e-01 +687 684 -7.412185823610294e-01 +687 685 -3.165206906282881e+00 +687 686 -1.502055215899852e+01 +687 688 -1.502055215931073e+01 +687 689 -3.165206906282902e+00 +687 690 -7.412185823610179e-01 +687 691 -3.301555353436738e-01 +687 692 -1.820810586422635e-01 +687 693 -1.132183869282754e-01 +687 694 -7.613960933881114e-02 +687 695 -5.413421453123109e-02 +687 696 -4.012781031912974e-02 +687 697 -3.072751892616542e-02 +687 698 -2.415034675252897e-02 +687 699 -1.939104886145110e-02 +687 700 -1.585023865775514e-02 +687 701 -1.315380302376542e-02 +687 702 -1.105916272470025e-02 +687 703 -9.403863770832832e-03 +688 688 3.988394278260308e+01 +688 672 -9.403863770832832e-03 +688 673 -1.105916272470032e-02 +688 674 -1.315380302376555e-02 +688 675 -1.585023865775531e-02 +688 676 -1.939104886145111e-02 +688 677 -2.415034675252896e-02 +688 678 -3.072751892616545e-02 +688 679 -4.012781031913035e-02 +688 680 -5.413421453123204e-02 +688 681 -7.613960933881204e-02 +688 682 -1.132183869282785e-01 +688 683 -1.820810586422676e-01 +688 684 -3.301555353436764e-01 +688 685 -7.412185823610197e-01 +688 686 -3.165206906282874e+00 +688 687 -1.502055215931073e+01 +688 689 -1.502055215899858e+01 +688 690 -3.165206906282849e+00 +688 691 -7.412185823610173e-01 +688 692 -3.301555353436768e-01 +688 693 -1.820810586422626e-01 +688 694 -1.132183869282739e-01 +688 695 -7.613960933881102e-02 +688 696 -5.413421453123141e-02 +688 697 -4.012781031912996e-02 +688 698 -3.072751892616545e-02 +688 699 -2.415034675252897e-02 +688 700 -1.939104886145097e-02 +688 701 -1.585023865775520e-02 +688 702 -1.315380302376546e-02 +688 703 -1.105916272470026e-02 +688 704 -9.403863770832816e-03 +688 705 -8.076052134892570e-03 +688 706 -6.996835383339698e-03 +688 707 -6.109381318875730e-03 +688 708 -5.371977266379805e-03 +688 709 -4.753493624956895e-03 +688 710 -4.230349322908545e-03 +688 711 -3.784439171232929e-03 +688 712 -3.401691470521394e-03 +688 713 -3.071047067257401e-03 +688 714 -2.783725492315666e-03 +688 715 -2.532689975072680e-03 +688 716 -2.312252367280536e-03 +688 717 -2.117777896667799e-03 +688 718 -1.945462087124854e-03 +688 719 -1.792160480940038e-03 +689 689 3.988394278208167e+01 +689 672 -8.076052134892632e-03 +689 673 -9.403863770832833e-03 +689 674 -1.105916272470025e-02 +689 675 -1.315380302376542e-02 +689 676 -1.585023865775514e-02 +689 677 -1.939104886145096e-02 +689 678 -2.415034675252878e-02 +689 679 -3.072751892616544e-02 +689 680 -4.012781031912978e-02 +689 681 -5.413421453123111e-02 +689 682 -7.613960933881116e-02 +689 683 -1.132183869282773e-01 +689 684 -1.820810586422690e-01 +689 685 -3.301555353436779e-01 +689 686 -7.412185823610246e-01 +689 687 -3.165206906282902e+00 +689 688 -1.502055215899858e+01 +689 690 -1.502055215878372e+01 +689 691 -3.165206906282852e+00 +689 692 -7.412185823610203e-01 +689 693 -3.301555353436780e-01 +689 694 -1.820810586422624e-01 +689 695 -1.132183869282771e-01 +689 696 -7.613960933881206e-02 +689 697 -5.413421453123230e-02 +689 698 -4.012781031913037e-02 +689 699 -3.072751892616572e-02 +689 700 -2.415034675252897e-02 +689 701 -1.939104886145118e-02 +689 702 -1.585023865775536e-02 +689 703 -1.315380302376555e-02 +689 704 -1.105916272470032e-02 +689 705 -9.403863770832813e-03 +689 706 -8.076052134892604e-03 +689 707 -6.996835383339623e-03 +689 708 -6.109381318875727e-03 +689 709 -5.371977266379786e-03 +689 710 -4.753493624956895e-03 +689 711 -4.230349322908520e-03 +689 712 -3.784439171232916e-03 +689 713 -3.401691470521392e-03 +689 714 -3.071047067257377e-03 +689 715 -2.783725492315665e-03 +689 716 -2.532689975072673e-03 +689 717 -2.312252367280536e-03 +689 718 -2.117777896667789e-03 +689 719 -1.945462087124849e-03 +690 690 3.988394278171949e+01 +690 672 -6.996835383339702e-03 +690 673 -8.076052134892596e-03 +690 674 -9.403863770832839e-03 +690 675 -1.105916272470025e-02 +690 676 -1.315380302376542e-02 +690 677 -1.585023865775520e-02 +690 678 -1.939104886145103e-02 +690 679 -2.415034675252906e-02 +690 680 -3.072751892616544e-02 +690 681 -4.012781031912974e-02 +690 682 -5.413421453123138e-02 +690 683 -7.613960933881117e-02 +690 684 -1.132183869282770e-01 +690 685 -1.820810586422643e-01 +690 686 -3.301555353436757e-01 +690 687 -7.412185823610179e-01 +690 688 -3.165206906282849e+00 +690 689 -1.502055215878372e+01 +690 691 -1.502055215863300e+01 +690 692 -3.165206906282876e+00 +690 693 -7.412185823610254e-01 +690 694 -3.301555353436742e-01 +690 695 -1.820810586422694e-01 +690 696 -1.132183869282792e-01 +690 697 -7.613960933881206e-02 +690 698 -5.413421453123205e-02 +690 699 -4.012781031913017e-02 +690 700 -3.072751892616531e-02 +690 701 -2.415034675252897e-02 +690 702 -1.939104886145118e-02 +690 703 -1.585023865775532e-02 +690 704 -1.315380302376550e-02 +690 705 -1.105916272470022e-02 +690 706 -9.403863770832839e-03 +690 707 -8.076052134892575e-03 +690 708 -6.996835383339671e-03 +690 709 -6.109381318875748e-03 +690 710 -5.371977266379821e-03 +690 711 -4.753493624956896e-03 +690 712 -4.230349322908531e-03 +690 713 -3.784439171232936e-03 +690 714 -3.401691470521384e-03 +690 715 -3.071047067257392e-03 +690 716 -2.783725492315671e-03 +690 717 -2.532689975072685e-03 +690 718 -2.312252367280536e-03 +690 719 -2.117777896667793e-03 +691 691 3.988394278146372e+01 +691 672 -6.109381318875769e-03 +691 673 -6.996835383339674e-03 +691 674 -8.076052134892592e-03 +691 675 -9.403863770832825e-03 +691 676 -1.105916272470022e-02 +691 677 -1.315380302376542e-02 +691 678 -1.585023865775520e-02 +691 679 -1.939104886145118e-02 +691 680 -2.415034675252897e-02 +691 681 -3.072751892616529e-02 +691 682 -4.012781031912974e-02 +691 683 -5.413421453123141e-02 +691 684 -7.613960933881209e-02 +691 685 -1.132183869282762e-01 +691 686 -1.820810586422651e-01 +691 687 -3.301555353436738e-01 +691 688 -7.412185823610173e-01 +691 689 -3.165206906282852e+00 +691 690 -1.502055215863300e+01 +691 692 -1.502055215852576e+01 +691 693 -3.165206906282882e+00 +691 694 -7.412185823610282e-01 +691 695 -3.301555353436781e-01 +691 696 -1.820810586422683e-01 +691 697 -1.132183869282766e-01 +691 698 -7.613960933881207e-02 +691 699 -5.413421453123204e-02 +691 700 -4.012781031912978e-02 +691 701 -3.072751892616544e-02 +691 702 -2.415034675252906e-02 +691 703 -1.939104886145119e-02 +691 704 -1.585023865775531e-02 +691 705 -1.315380302376542e-02 +691 706 -1.105916272470025e-02 +691 707 -9.403863770832839e-03 +691 708 -8.076052134892594e-03 +691 709 -6.996835383339674e-03 +691 710 -6.109381318875771e-03 +691 711 -5.371977266379809e-03 +691 712 -4.753493624956895e-03 +691 713 -4.230349322908543e-03 +691 714 -3.784439171232917e-03 +691 715 -3.401691470521394e-03 +691 716 -3.071047067257393e-03 +691 717 -2.783725492315679e-03 +691 718 -2.532689975072680e-03 +691 719 -2.312252367280536e-03 +692 692 3.988394278128110e+01 +692 672 -5.371977266379837e-03 +692 673 -6.109381318875769e-03 +692 674 -6.996835383339698e-03 +692 675 -8.076052134892604e-03 +692 676 -9.403863770832827e-03 +692 677 -1.105916272470025e-02 +692 678 -1.315380302376546e-02 +692 679 -1.585023865775536e-02 +692 680 -1.939104886145118e-02 +692 681 -2.415034675252896e-02 +692 682 -3.072751892616542e-02 +692 683 -4.012781031912996e-02 +692 684 -5.413421453123230e-02 +692 685 -7.613960933881191e-02 +692 686 -1.132183869282761e-01 +692 687 -1.820810586422635e-01 +692 688 -3.301555353436768e-01 +692 689 -7.412185823610203e-01 +692 690 -3.165206906282876e+00 +692 691 -1.502055215852576e+01 +692 693 -1.502055215844904e+01 +692 694 -3.165206906282874e+00 +692 695 -7.412185823610100e-01 +692 696 -3.301555353436778e-01 +692 697 -1.820810586422658e-01 +692 698 -1.132183869282770e-01 +692 699 -7.613960933881171e-02 +692 700 -5.413421453123111e-02 +692 701 -4.012781031912974e-02 +692 702 -3.072751892616543e-02 +692 703 -2.415034675252897e-02 +692 704 -1.939104886145111e-02 +692 705 -1.585023865775514e-02 +692 706 -1.315380302376542e-02 +692 707 -1.105916272470025e-02 +692 708 -9.403863770832814e-03 +692 709 -8.076052134892568e-03 +692 710 -6.996835383339677e-03 +692 711 -6.109381318875733e-03 +692 712 -5.371977266379788e-03 +692 713 -4.753493624956895e-03 +692 714 -4.230349322908508e-03 +692 715 -3.784439171232917e-03 +692 716 -3.401691470521385e-03 +692 717 -3.071047067257394e-03 +692 718 -2.783725492315667e-03 +692 719 -2.532689975072674e-03 +693 693 3.988394278115150e+01 +693 672 -4.753493624956895e-03 +693 673 -5.371977266379790e-03 +693 674 -6.109381318875730e-03 +693 675 -6.996835383339623e-03 +693 676 -8.076052134892564e-03 +693 677 -9.403863770832814e-03 +693 678 -1.105916272470026e-02 +693 679 -1.315380302376555e-02 +693 680 -1.585023865775532e-02 +693 681 -1.939104886145111e-02 +693 682 -2.415034675252897e-02 +693 683 -3.072751892616545e-02 +693 684 -4.012781031913037e-02 +693 685 -5.413421453123205e-02 +693 686 -7.613960933881159e-02 +693 687 -1.132183869282754e-01 +693 688 -1.820810586422626e-01 +693 689 -3.301555353436780e-01 +693 690 -7.412185823610254e-01 +693 691 -3.165206906282882e+00 +693 692 -1.502055215844904e+01 +693 694 -1.502055215839544e+01 +693 695 -3.165206906282828e+00 +693 696 -7.412185823610160e-01 +693 697 -3.301555353436746e-01 +693 698 -1.820810586422651e-01 +693 699 -1.132183869282766e-01 +693 700 -7.613960933881080e-02 +693 701 -5.413421453123138e-02 +693 702 -4.012781031912993e-02 +693 703 -3.072751892616544e-02 +693 704 -2.415034675252896e-02 +693 705 -1.939104886145096e-02 +693 706 -1.585023865775520e-02 +693 707 -1.315380302376546e-02 +693 708 -1.105916272470025e-02 +693 709 -9.403863770832828e-03 +693 710 -8.076052134892630e-03 +693 711 -6.996835383339702e-03 +693 712 -6.109381318875769e-03 +693 713 -5.371977266379837e-03 +693 714 -4.753493624956895e-03 +693 715 -4.230349322908543e-03 +693 716 -3.784439171232937e-03 +693 717 -3.401691470521412e-03 +693 718 -3.071047067257401e-03 +693 719 -2.783725492315679e-03 +694 694 3.988394278106470e+01 +694 672 -4.230349322908543e-03 +694 673 -4.753493624956895e-03 +694 674 -5.371977266379805e-03 +694 675 -6.109381318875727e-03 +694 676 -6.996835383339671e-03 +694 677 -8.076052134892582e-03 +694 678 -9.403863770832816e-03 +694 679 -1.105916272470032e-02 +694 680 -1.315380302376550e-02 +694 681 -1.585023865775526e-02 +694 682 -1.939104886145110e-02 +694 683 -2.415034675252897e-02 +694 684 -3.072751892616572e-02 +694 685 -4.012781031913017e-02 +694 686 -5.413421453123172e-02 +694 687 -7.613960933881114e-02 +694 688 -1.132183869282739e-01 +694 689 -1.820810586422624e-01 +694 690 -3.301555353436742e-01 +694 691 -7.412185823610282e-01 +694 692 -3.165206906282874e+00 +694 693 -1.502055215839544e+01 +694 695 -1.502055215836208e+01 +694 696 -3.165206906282895e+00 +694 697 -7.412185823610302e-01 +694 698 -3.301555353436811e-01 +694 699 -1.820810586422670e-01 +694 700 -1.132183869282757e-01 +694 701 -7.613960933881125e-02 +694 702 -5.413421453123171e-02 +694 703 -4.012781031912998e-02 +694 704 -3.072751892616545e-02 +694 705 -2.415034675252878e-02 +694 706 -1.939104886145103e-02 +694 707 -1.585023865775526e-02 +694 708 -1.315380302376547e-02 +694 709 -1.105916272470026e-02 +694 710 -9.403863770832792e-03 +694 711 -8.076052134892571e-03 +694 712 -6.996835383339674e-03 +694 713 -6.109381318875769e-03 +694 714 -5.371977266379790e-03 +694 715 -4.753493624956895e-03 +694 716 -4.230349322908531e-03 +694 717 -3.784439171232939e-03 +694 718 -3.401691470521395e-03 +694 719 -3.071047067257393e-03 +695 695 3.988394278102304e+01 +695 672 -3.784439171232937e-03 +695 673 -4.230349322908531e-03 +695 674 -4.753493624956895e-03 +695 675 -5.371977266379786e-03 +695 676 -6.109381318875748e-03 +695 677 -6.996835383339674e-03 +695 678 -8.076052134892557e-03 +695 679 -9.403863770832828e-03 +695 680 -1.105916272470022e-02 +695 681 -1.315380302376538e-02 +695 682 -1.585023865775514e-02 +695 683 -1.939104886145097e-02 +695 684 -2.415034675252897e-02 +695 685 -3.072751892616531e-02 +695 686 -4.012781031912956e-02 +695 687 -5.413421453123109e-02 +695 688 -7.613960933881102e-02 +695 689 -1.132183869282771e-01 +695 690 -1.820810586422694e-01 +695 691 -3.301555353436781e-01 +695 692 -7.412185823610100e-01 +695 693 -3.165206906282828e+00 +695 694 -1.502055215836208e+01 +695 696 -1.502055215835506e+01 +695 697 -3.165206906282874e+00 +695 698 -7.412185823610342e-01 +695 699 -3.301555353436788e-01 +695 700 -1.820810586422604e-01 +695 701 -1.132183869282744e-01 +695 702 -7.613960933881185e-02 +695 703 -5.413421453123234e-02 +695 704 -4.012781031913035e-02 +695 705 -3.072751892616544e-02 +695 706 -2.415034675252906e-02 +695 707 -1.939104886145125e-02 +695 708 -1.585023865775537e-02 +695 709 -1.315380302376555e-02 +695 710 -1.105916272470025e-02 +695 711 -9.403863770832811e-03 +695 712 -8.076052134892592e-03 +695 713 -6.996835383339698e-03 +695 714 -6.109381318875730e-03 +695 715 -5.371977266379805e-03 +695 716 -4.753493624956895e-03 +695 717 -4.230349322908545e-03 +695 718 -3.784439171232929e-03 +695 719 -3.401691470521394e-03 +696 696 3.988394278105618e+01 +696 672 -3.401691470521412e-03 +696 673 -3.784439171232939e-03 +696 674 -4.230349322908545e-03 +696 675 -4.753493624956895e-03 +696 676 -5.371977266379821e-03 +696 677 -6.109381318875771e-03 +696 678 -6.996835383339677e-03 +696 679 -8.076052134892653e-03 +696 680 -9.403863770832842e-03 +696 681 -1.105916272470022e-02 +696 682 -1.315380302376542e-02 +696 683 -1.585023865775520e-02 +696 684 -1.939104886145118e-02 +696 685 -2.415034675252897e-02 +696 686 -3.072751892616529e-02 +696 687 -4.012781031912974e-02 +696 688 -5.413421453123141e-02 +696 689 -7.613960933881206e-02 +696 690 -1.132183869282792e-01 +696 691 -1.820810586422683e-01 +696 692 -3.301555353436778e-01 +696 693 -7.412185823610160e-01 +696 694 -3.165206906282895e+00 +696 695 -1.502055215835506e+01 +696 697 -1.502055215840032e+01 +696 698 -3.165206906282881e+00 +696 699 -7.412185823610217e-01 +696 700 -3.301555353436718e-01 +696 701 -1.820810586422626e-01 +696 702 -1.132183869282750e-01 +696 703 -7.613960933881195e-02 +696 704 -5.413421453123204e-02 +696 705 -4.012781031912978e-02 +696 706 -3.072751892616544e-02 +696 707 -2.415034675252906e-02 +696 708 -1.939104886145119e-02 +696 709 -1.585023865775531e-02 +696 710 -1.315380302376542e-02 +696 711 -1.105916272470022e-02 +696 712 -9.403863770832825e-03 +696 713 -8.076052134892604e-03 +696 714 -6.996835383339623e-03 +696 715 -6.109381318875727e-03 +696 716 -5.371977266379786e-03 +696 717 -4.753493624956895e-03 +696 718 -4.230349322908520e-03 +696 719 -3.784439171232916e-03 +697 697 3.988394278128566e+01 +697 672 -3.071047067257401e-03 +697 673 -3.401691470521395e-03 +697 674 -3.784439171232929e-03 +697 675 -4.230349322908520e-03 +697 676 -4.753493624956896e-03 +697 677 -5.371977266379809e-03 +697 678 -6.109381318875733e-03 +697 679 -6.996835383339702e-03 +697 680 -8.076052134892594e-03 +697 681 -9.403863770832811e-03 +697 682 -1.105916272470025e-02 +697 683 -1.315380302376546e-02 +697 684 -1.585023865775536e-02 +697 685 -1.939104886145118e-02 +697 686 -2.415034675252896e-02 +697 687 -3.072751892616542e-02 +697 688 -4.012781031912996e-02 +697 689 -5.413421453123230e-02 +697 690 -7.613960933881206e-02 +697 691 -1.132183869282766e-01 +697 692 -1.820810586422658e-01 +697 693 -3.301555353436746e-01 +697 694 -7.412185823610302e-01 +697 695 -3.165206906282874e+00 +697 696 -1.502055215840032e+01 +697 698 -1.502055215860547e+01 +697 699 -3.165206906282878e+00 +697 700 -7.412185823610136e-01 +697 701 -3.301555353436773e-01 +697 702 -1.820810586422662e-01 +697 703 -1.132183869282780e-01 +697 704 -7.613960933881185e-02 +697 705 -5.413421453123111e-02 +697 706 -4.012781031912974e-02 +697 707 -3.072751892616543e-02 +697 708 -2.415034675252897e-02 +697 709 -1.939104886145111e-02 +697 710 -1.585023865775514e-02 +697 711 -1.315380302376537e-02 +697 712 -1.105916272470022e-02 +697 713 -9.403863770832827e-03 +697 714 -8.076052134892564e-03 +697 715 -6.996835383339671e-03 +697 716 -6.109381318875748e-03 +697 717 -5.371977266379821e-03 +697 718 -4.753493624956896e-03 +697 719 -4.230349322908531e-03 +698 698 3.988394278152494e+01 +698 672 -2.783725492315679e-03 +698 673 -3.071047067257393e-03 +698 674 -3.401691470521394e-03 +698 675 -3.784439171232916e-03 +698 676 -4.230349322908531e-03 +698 677 -4.753493624956895e-03 +698 678 -5.371977266379788e-03 +698 679 -6.109381318875769e-03 +698 680 -6.996835383339674e-03 +698 681 -8.076052134892582e-03 +698 682 -9.403863770832814e-03 +698 683 -1.105916272470026e-02 +698 684 -1.315380302376555e-02 +698 685 -1.585023865775532e-02 +698 686 -1.939104886145111e-02 +698 687 -2.415034675252897e-02 +698 688 -3.072751892616545e-02 +698 689 -4.012781031913037e-02 +698 690 -5.413421453123205e-02 +698 691 -7.613960933881207e-02 +698 692 -1.132183869282770e-01 +698 693 -1.820810586422651e-01 +698 694 -3.301555353436811e-01 +698 695 -7.412185823610342e-01 +698 696 -3.165206906282881e+00 +698 697 -1.502055215860547e+01 +698 699 -1.502055215859208e+01 +698 700 -3.165206906282825e+00 +698 701 -7.412185823610125e-01 +698 702 -3.301555353436725e-01 +698 703 -1.820810586422668e-01 +698 704 -1.132183869282777e-01 +698 705 -7.613960933881152e-02 +698 706 -5.413421453123138e-02 +698 707 -4.012781031912993e-02 +698 708 -3.072751892616544e-02 +698 709 -2.415034675252896e-02 +698 710 -1.939104886145095e-02 +698 711 -1.585023865775514e-02 +698 712 -1.315380302376542e-02 +698 713 -1.105916272470025e-02 +698 714 -9.403863770832814e-03 +698 715 -8.076052134892582e-03 +698 716 -6.996835383339674e-03 +698 717 -6.109381318875771e-03 +698 718 -5.371977266379809e-03 +698 719 -4.753493624956895e-03 +699 699 3.988394278151354e+01 +699 672 -2.532689975072691e-03 +699 673 -2.783725492315679e-03 +699 674 -3.071047067257401e-03 +699 675 -3.401691470521392e-03 +699 676 -3.784439171232936e-03 +699 677 -4.230349322908543e-03 +699 678 -4.753493624956895e-03 +699 679 -5.371977266379837e-03 +699 680 -6.109381318875769e-03 +699 681 -6.996835383339698e-03 +699 682 -8.076052134892594e-03 +699 683 -9.403863770832830e-03 +699 684 -1.105916272470032e-02 +699 685 -1.315380302376550e-02 +699 686 -1.585023865775526e-02 +699 687 -1.939104886145110e-02 +699 688 -2.415034675252897e-02 +699 689 -3.072751892616572e-02 +699 690 -4.012781031913017e-02 +699 691 -5.413421453123204e-02 +699 692 -7.613960933881171e-02 +699 693 -1.132183869282766e-01 +699 694 -1.820810586422670e-01 +699 695 -3.301555353436788e-01 +699 696 -7.412185823610217e-01 +699 697 -3.165206906282878e+00 +699 698 -1.502055215859208e+01 +699 700 -1.502055215859659e+01 +699 701 -3.165206906282906e+00 +699 702 -7.412185823610253e-01 +699 703 -3.301555353436755e-01 +699 704 -1.820810586422664e-01 +699 705 -1.132183869282783e-01 +699 706 -7.613960933881139e-02 +699 707 -5.413421453123171e-02 +699 708 -4.012781031912998e-02 +699 709 -3.072751892616545e-02 +699 710 -2.415034675252877e-02 +699 711 -1.939104886145096e-02 +699 712 -1.585023865775520e-02 +699 713 -1.315380302376546e-02 +699 714 -1.105916272470026e-02 +699 715 -9.403863770832816e-03 +699 716 -8.076052134892557e-03 +699 717 -6.996835383339677e-03 +699 718 -6.109381318875733e-03 +699 719 -5.371977266379788e-03 +700 700 3.988394278151443e+01 +700 672 -2.312252367280536e-03 +700 673 -2.532689975072674e-03 +700 674 -2.783725492315666e-03 +700 675 -3.071047067257377e-03 +700 676 -3.401691470521384e-03 +700 677 -3.784439171232917e-03 +700 678 -4.230349322908508e-03 +700 679 -4.753493624956895e-03 +700 680 -5.371977266379790e-03 +700 681 -6.109381318875730e-03 +700 682 -6.996835383339623e-03 +700 683 -8.076052134892554e-03 +700 684 -9.403863770832813e-03 +700 685 -1.105916272470022e-02 +700 686 -1.315380302376538e-02 +700 687 -1.585023865775514e-02 +700 688 -1.939104886145097e-02 +700 689 -2.415034675252897e-02 +700 690 -3.072751892616531e-02 +700 691 -4.012781031912978e-02 +700 692 -5.413421453123111e-02 +700 693 -7.613960933881080e-02 +700 694 -1.132183869282757e-01 +700 695 -1.820810586422604e-01 +700 696 -3.301555353436718e-01 +700 697 -7.412185823610136e-01 +700 698 -3.165206906282825e+00 +700 699 -1.502055215859659e+01 +700 701 -1.502055215858802e+01 +700 702 -3.165206906282882e+00 +700 703 -7.412185823610276e-01 +700 704 -3.301555353436817e-01 +700 705 -1.820810586422702e-01 +700 706 -1.132183869282780e-01 +700 707 -7.613960933881236e-02 +700 708 -5.413421453123234e-02 +700 709 -4.012781031913035e-02 +700 710 -3.072751892616543e-02 +700 711 -2.415034675252896e-02 +700 712 -1.939104886145118e-02 +700 713 -1.585023865775536e-02 +700 714 -1.315380302376555e-02 +700 715 -1.105916272470032e-02 +700 716 -9.403863770832828e-03 +700 717 -8.076052134892653e-03 +700 718 -6.996835383339702e-03 +700 719 -6.109381318875769e-03 +701 701 3.988394278153930e+01 +701 672 -2.117777896667799e-03 +701 673 -2.312252367280536e-03 +701 674 -2.532689975072680e-03 +701 675 -2.783725492315665e-03 +701 676 -3.071047067257392e-03 +701 677 -3.401691470521394e-03 +701 678 -3.784439171232917e-03 +701 679 -4.230349322908543e-03 +701 680 -4.753493624956895e-03 +701 681 -5.371977266379805e-03 +701 682 -6.109381318875727e-03 +701 683 -6.996835383339671e-03 +701 684 -8.076052134892592e-03 +701 685 -9.403863770832825e-03 +701 686 -1.105916272470022e-02 +701 687 -1.315380302376542e-02 +701 688 -1.585023865775520e-02 +701 689 -1.939104886145118e-02 +701 690 -2.415034675252897e-02 +701 691 -3.072751892616544e-02 +701 692 -4.012781031912974e-02 +701 693 -5.413421453123138e-02 +701 694 -7.613960933881125e-02 +701 695 -1.132183869282744e-01 +701 696 -1.820810586422626e-01 +701 697 -3.301555353436773e-01 +701 698 -7.412185823610125e-01 +701 699 -3.165206906282906e+00 +701 700 -1.502055215858802e+01 +701 702 -1.502055215863999e+01 +701 703 -3.165206906282862e+00 +701 704 -7.412185823610286e-01 +701 705 -3.301555353436813e-01 +701 706 -1.820810586422651e-01 +701 707 -1.132183869282756e-01 +701 708 -7.613960933881192e-02 +701 709 -5.413421453123204e-02 +701 710 -4.012781031912976e-02 +701 711 -3.072751892616530e-02 +701 712 -2.415034675252897e-02 +701 713 -1.939104886145118e-02 +701 714 -1.585023865775532e-02 +701 715 -1.315380302376550e-02 +701 716 -1.105916272470022e-02 +701 717 -9.403863770832842e-03 +701 718 -8.076052134892594e-03 +701 719 -6.996835383339674e-03 +702 702 3.988394278164017e+01 +702 672 -1.945462087124857e-03 +702 673 -2.117777896667794e-03 +702 674 -2.312252367280536e-03 +702 675 -2.532689975072673e-03 +702 676 -2.783725492315671e-03 +702 677 -3.071047067257393e-03 +702 678 -3.401691470521385e-03 +702 679 -3.784439171232937e-03 +702 680 -4.230349322908531e-03 +702 681 -4.753493624956895e-03 +702 682 -5.371977266379786e-03 +702 683 -6.109381318875748e-03 +702 684 -6.996835383339674e-03 +702 685 -8.076052134892578e-03 +702 686 -9.403863770832828e-03 +702 687 -1.105916272470025e-02 +702 688 -1.315380302376546e-02 +702 689 -1.585023865775536e-02 +702 690 -1.939104886145118e-02 +702 691 -2.415034675252906e-02 +702 692 -3.072751892616543e-02 +702 693 -4.012781031912993e-02 +702 694 -5.413421453123171e-02 +702 695 -7.613960933881185e-02 +702 696 -1.132183869282750e-01 +702 697 -1.820810586422662e-01 +702 698 -3.301555353436725e-01 +702 699 -7.412185823610253e-01 +702 700 -3.165206906282882e+00 +702 701 -1.502055215863999e+01 +702 703 -1.502055215866000e+01 +702 704 -3.165206906282880e+00 +702 705 -7.412185823610293e-01 +702 706 -3.301555353436742e-01 +702 707 -1.820810586422635e-01 +702 708 -1.132183869282760e-01 +702 709 -7.613960933881156e-02 +702 710 -5.413421453123109e-02 +702 711 -4.012781031912954e-02 +702 712 -3.072751892616529e-02 +702 713 -2.415034675252896e-02 +702 714 -1.939104886145111e-02 +702 715 -1.585023865775526e-02 +702 716 -1.315380302376538e-02 +702 717 -1.105916272470022e-02 +702 718 -9.403863770832811e-03 +702 719 -8.076052134892582e-03 +703 703 3.988394278169712e+01 +703 672 -1.792160480940046e-03 +703 673 -1.945462087124857e-03 +703 674 -2.117777896667799e-03 +703 675 -2.312252367280536e-03 +703 676 -2.532689975072685e-03 +703 677 -2.783725492315679e-03 +703 678 -3.071047067257394e-03 +703 679 -3.401691470521412e-03 +703 680 -3.784439171232939e-03 +703 681 -4.230349322908545e-03 +703 682 -4.753493624956895e-03 +703 683 -5.371977266379821e-03 +703 684 -6.109381318875771e-03 +703 685 -6.996835383339677e-03 +703 686 -8.076052134892642e-03 +703 687 -9.403863770832832e-03 +703 688 -1.105916272470026e-02 +703 689 -1.315380302376555e-02 +703 690 -1.585023865775532e-02 +703 691 -1.939104886145119e-02 +703 692 -2.415034675252897e-02 +703 693 -3.072751892616544e-02 +703 694 -4.012781031912998e-02 +703 695 -5.413421453123234e-02 +703 696 -7.613960933881195e-02 +703 697 -1.132183869282780e-01 +703 698 -1.820810586422668e-01 +703 699 -3.301555353436755e-01 +703 700 -7.412185823610276e-01 +703 701 -3.165206906282862e+00 +703 702 -1.502055215866000e+01 +703 704 -1.502055215931063e+01 +703 705 -3.165206906282886e+00 +703 706 -7.412185823610264e-01 +703 707 -3.301555353436744e-01 +703 708 -1.820810586422626e-01 +703 709 -1.132183869282744e-01 +703 710 -7.613960933881025e-02 +703 711 -5.413421453123106e-02 +703 712 -4.012781031912974e-02 +703 713 -3.072751892616542e-02 +703 714 -2.415034675252897e-02 +703 715 -1.939104886145110e-02 +703 716 -1.585023865775514e-02 +703 717 -1.315380302376542e-02 +703 718 -1.105916272470025e-02 +703 719 -9.403863770832814e-03 +704 704 3.988394278169704e+01 +704 688 -9.403863770832816e-03 +704 689 -1.105916272470032e-02 +704 690 -1.315380302376550e-02 +704 691 -1.585023865775531e-02 +704 692 -1.939104886145111e-02 +704 693 -2.415034675252896e-02 +704 694 -3.072751892616545e-02 +704 695 -4.012781031913035e-02 +704 696 -5.413421453123204e-02 +704 697 -7.613960933881185e-02 +704 698 -1.132183869282777e-01 +704 699 -1.820810586422664e-01 +704 700 -3.301555353436817e-01 +704 701 -7.412185823610286e-01 +704 702 -3.165206906282880e+00 +704 703 -1.502055215931063e+01 +704 705 -1.502055215866004e+01 +704 706 -3.165206906282903e+00 +704 707 -7.412185823610146e-01 +704 708 -3.301555353436719e-01 +704 709 -1.820810586422628e-01 +704 710 -1.132183869282740e-01 +704 711 -7.613960933881067e-02 +704 712 -5.413421453123141e-02 +704 713 -4.012781031912996e-02 +704 714 -3.072751892616545e-02 +704 715 -2.415034675252897e-02 +704 716 -1.939104886145097e-02 +704 717 -1.585023865775520e-02 +704 718 -1.315380302376546e-02 +704 719 -1.105916272470026e-02 +704 720 -9.403863770832830e-03 +704 721 -8.076052134892554e-03 +704 722 -6.996835383339671e-03 +704 723 -6.109381318875748e-03 +704 724 -5.371977266379821e-03 +704 725 -4.753493624956896e-03 +704 726 -4.230349322908531e-03 +704 727 -3.784439171232936e-03 +704 728 -3.401691470521384e-03 +704 729 -3.071047067257392e-03 +704 730 -2.783725492315671e-03 +704 731 -2.532689975072685e-03 +704 732 -2.312252367280536e-03 +704 733 -2.117777896667793e-03 +704 734 -1.945462087124857e-03 +704 735 -1.792160480940034e-03 +705 705 3.988394278164024e+01 +705 688 -8.076052134892570e-03 +705 689 -9.403863770832813e-03 +705 690 -1.105916272470022e-02 +705 691 -1.315380302376542e-02 +705 692 -1.585023865775514e-02 +705 693 -1.939104886145096e-02 +705 694 -2.415034675252878e-02 +705 695 -3.072751892616544e-02 +705 696 -4.012781031912978e-02 +705 697 -5.413421453123111e-02 +705 698 -7.613960933881152e-02 +705 699 -1.132183869282783e-01 +705 700 -1.820810586422702e-01 +705 701 -3.301555353436813e-01 +705 702 -7.412185823610293e-01 +705 703 -3.165206906282886e+00 +705 704 -1.502055215866004e+01 +705 706 -1.502055215864003e+01 +705 707 -3.165206906282841e+00 +705 708 -7.412185823610109e-01 +705 709 -3.301555353436725e-01 +705 710 -1.820810586422605e-01 +705 711 -1.132183869282749e-01 +705 712 -7.613960933881189e-02 +705 713 -5.413421453123230e-02 +705 714 -4.012781031913037e-02 +705 715 -3.072751892616572e-02 +705 716 -2.415034675252897e-02 +705 717 -1.939104886145118e-02 +705 718 -1.585023865775536e-02 +705 719 -1.315380302376555e-02 +705 720 -1.105916272470032e-02 +705 721 -9.403863770832813e-03 +705 722 -8.076052134892592e-03 +705 723 -6.996835383339674e-03 +705 724 -6.109381318875771e-03 +705 725 -5.371977266379809e-03 +705 726 -4.753493624956895e-03 +705 727 -4.230349322908543e-03 +705 728 -3.784439171232917e-03 +705 729 -3.401691470521394e-03 +705 730 -3.071047067257393e-03 +705 731 -2.783725492315679e-03 +705 732 -2.532689975072680e-03 +705 733 -2.312252367280536e-03 +705 734 -2.117777896667799e-03 +705 735 -1.945462087124849e-03 +706 706 3.988394278153934e+01 +706 688 -6.996835383339698e-03 +706 689 -8.076052134892604e-03 +706 690 -9.403863770832839e-03 +706 691 -1.105916272470025e-02 +706 692 -1.315380302376542e-02 +706 693 -1.585023865775520e-02 +706 694 -1.939104886145103e-02 +706 695 -2.415034675252906e-02 +706 696 -3.072751892616544e-02 +706 697 -4.012781031912974e-02 +706 698 -5.413421453123138e-02 +706 699 -7.613960933881139e-02 +706 700 -1.132183869282780e-01 +706 701 -1.820810586422651e-01 +706 702 -3.301555353436742e-01 +706 703 -7.412185823610264e-01 +706 704 -3.165206906282903e+00 +706 705 -1.502055215864003e+01 +706 707 -1.502055215858796e+01 +706 708 -3.165206906282878e+00 +706 709 -7.412185823610218e-01 +706 710 -3.301555353436789e-01 +706 711 -1.820810586422648e-01 +706 712 -1.132183869282779e-01 +706 713 -7.613960933881245e-02 +706 714 -5.413421453123205e-02 +706 715 -4.012781031913017e-02 +706 716 -3.072751892616531e-02 +706 717 -2.415034675252897e-02 +706 718 -1.939104886145118e-02 +706 719 -1.585023865775532e-02 +706 720 -1.315380302376550e-02 +706 721 -1.105916272470022e-02 +706 722 -9.403863770832825e-03 +706 723 -8.076052134892578e-03 +706 724 -6.996835383339677e-03 +706 725 -6.109381318875733e-03 +706 726 -5.371977266379788e-03 +706 727 -4.753493624956895e-03 +706 728 -4.230349322908508e-03 +706 729 -3.784439171232917e-03 +706 730 -3.401691470521385e-03 +706 731 -3.071047067257394e-03 +706 732 -2.783725492315667e-03 +706 733 -2.532689975072674e-03 +706 734 -2.312252367280536e-03 +706 735 -2.117777896667785e-03 +707 707 3.988394278151441e+01 +707 688 -6.109381318875730e-03 +707 689 -6.996835383339623e-03 +707 690 -8.076052134892575e-03 +707 691 -9.403863770832839e-03 +707 692 -1.105916272470025e-02 +707 693 -1.315380302376546e-02 +707 694 -1.585023865775526e-02 +707 695 -1.939104886145125e-02 +707 696 -2.415034675252906e-02 +707 697 -3.072751892616543e-02 +707 698 -4.012781031912993e-02 +707 699 -5.413421453123171e-02 +707 700 -7.613960933881236e-02 +707 701 -1.132183869282756e-01 +707 702 -1.820810586422635e-01 +707 703 -3.301555353436744e-01 +707 704 -7.412185823610146e-01 +707 705 -3.165206906282841e+00 +707 706 -1.502055215858796e+01 +707 708 -1.502055215859662e+01 +707 709 -3.165206906282855e+00 +707 710 -7.412185823610289e-01 +707 711 -3.301555353436751e-01 +707 712 -1.820810586422687e-01 +707 713 -1.132183869282797e-01 +707 714 -7.613960933881188e-02 +707 715 -5.413421453123172e-02 +707 716 -4.012781031912956e-02 +707 717 -3.072751892616529e-02 +707 718 -2.415034675252896e-02 +707 719 -1.939104886145111e-02 +707 720 -1.585023865775526e-02 +707 721 -1.315380302376538e-02 +707 722 -1.105916272470022e-02 +707 723 -9.403863770832828e-03 +707 724 -8.076052134892642e-03 +707 725 -6.996835383339702e-03 +707 726 -6.109381318875769e-03 +707 727 -5.371977266379837e-03 +707 728 -4.753493624956895e-03 +707 729 -4.230349322908543e-03 +707 730 -3.784439171232937e-03 +707 731 -3.401691470521412e-03 +707 732 -3.071047067257401e-03 +707 733 -2.783725492315679e-03 +707 734 -2.532689975072691e-03 +707 735 -2.312252367280536e-03 +708 708 3.988394278151355e+01 +708 688 -5.371977266379805e-03 +708 689 -6.109381318875727e-03 +708 690 -6.996835383339671e-03 +708 691 -8.076052134892594e-03 +708 692 -9.403863770832814e-03 +708 693 -1.105916272470025e-02 +708 694 -1.315380302376547e-02 +708 695 -1.585023865775537e-02 +708 696 -1.939104886145119e-02 +708 697 -2.415034675252897e-02 +708 698 -3.072751892616544e-02 +708 699 -4.012781031912998e-02 +708 700 -5.413421453123234e-02 +708 701 -7.613960933881192e-02 +708 702 -1.132183869282760e-01 +708 703 -1.820810586422626e-01 +708 704 -3.301555353436719e-01 +708 705 -7.412185823610109e-01 +708 706 -3.165206906282878e+00 +708 707 -1.502055215859662e+01 +708 709 -1.502055215859211e+01 +708 710 -3.165206906282883e+00 +708 711 -7.412185823610197e-01 +708 712 -3.301555353436740e-01 +708 713 -1.820810586422683e-01 +708 714 -1.132183869282761e-01 +708 715 -7.613960933881167e-02 +708 716 -5.413421453123109e-02 +708 717 -4.012781031912974e-02 +708 718 -3.072751892616542e-02 +708 719 -2.415034675252897e-02 +708 720 -1.939104886145110e-02 +708 721 -1.585023865775514e-02 +708 722 -1.315380302376542e-02 +708 723 -1.105916272470025e-02 +708 724 -9.403863770832832e-03 +708 725 -8.076052134892583e-03 +708 726 -6.996835383339674e-03 +708 727 -6.109381318875769e-03 +708 728 -5.371977266379790e-03 +708 729 -4.753493624956895e-03 +708 730 -4.230349322908531e-03 +708 731 -3.784439171232939e-03 +708 732 -3.401691470521395e-03 +708 733 -3.071047067257393e-03 +708 734 -2.783725492315679e-03 +708 735 -2.532689975072674e-03 +709 709 3.988394278152496e+01 +709 688 -4.753493624956895e-03 +709 689 -5.371977266379786e-03 +709 690 -6.109381318875748e-03 +709 691 -6.996835383339674e-03 +709 692 -8.076052134892568e-03 +709 693 -9.403863770832828e-03 +709 694 -1.105916272470026e-02 +709 695 -1.315380302376555e-02 +709 696 -1.585023865775531e-02 +709 697 -1.939104886145111e-02 +709 698 -2.415034675252896e-02 +709 699 -3.072751892616545e-02 +709 700 -4.012781031913035e-02 +709 701 -5.413421453123204e-02 +709 702 -7.613960933881156e-02 +709 703 -1.132183869282744e-01 +709 704 -1.820810586422628e-01 +709 705 -3.301555353436725e-01 +709 706 -7.412185823610218e-01 +709 707 -3.165206906282855e+00 +709 708 -1.502055215859211e+01 +709 710 -1.502055215860544e+01 +709 711 -3.165206906282882e+00 +709 712 -7.412185823610146e-01 +709 713 -3.301555353436778e-01 +709 714 -1.820810586422643e-01 +709 715 -1.132183869282765e-01 +709 716 -7.613960933881106e-02 +709 717 -5.413421453123141e-02 +709 718 -4.012781031912996e-02 +709 719 -3.072751892616545e-02 +709 720 -2.415034675252897e-02 +709 721 -1.939104886145097e-02 +709 722 -1.585023865775520e-02 +709 723 -1.315380302376546e-02 +709 724 -1.105916272470026e-02 +709 725 -9.403863770832816e-03 +709 726 -8.076052134892570e-03 +709 727 -6.996835383339698e-03 +709 728 -6.109381318875730e-03 +709 729 -5.371977266379805e-03 +709 730 -4.753493624956895e-03 +709 731 -4.230349322908545e-03 +709 732 -3.784439171232929e-03 +709 733 -3.401691470521394e-03 +709 734 -3.071047067257401e-03 +709 735 -2.783725492315666e-03 +710 710 3.988394278128563e+01 +710 688 -4.230349322908545e-03 +710 689 -4.753493624956895e-03 +710 690 -5.371977266379821e-03 +710 691 -6.109381318875771e-03 +710 692 -6.996835383339677e-03 +710 693 -8.076052134892630e-03 +710 694 -9.403863770832792e-03 +710 695 -1.105916272470025e-02 +710 696 -1.315380302376542e-02 +710 697 -1.585023865775514e-02 +710 698 -1.939104886145095e-02 +710 699 -2.415034675252877e-02 +710 700 -3.072751892616543e-02 +710 701 -4.012781031912976e-02 +710 702 -5.413421453123109e-02 +710 703 -7.613960933881025e-02 +710 704 -1.132183869282740e-01 +710 705 -1.820810586422605e-01 +710 706 -3.301555353436789e-01 +710 707 -7.412185823610289e-01 +710 708 -3.165206906282883e+00 +710 709 -1.502055215860544e+01 +710 711 -1.502055215840038e+01 +710 712 -3.165206906282833e+00 +710 713 -7.412185823610080e-01 +710 714 -3.301555353436742e-01 +710 715 -1.820810586422663e-01 +710 716 -1.132183869282775e-01 +710 717 -7.613960933881192e-02 +710 718 -5.413421453123234e-02 +710 719 -4.012781031913039e-02 +710 720 -3.072751892616573e-02 +710 721 -2.415034675252898e-02 +710 722 -1.939104886145118e-02 +710 723 -1.585023865775537e-02 +710 724 -1.315380302376555e-02 +710 725 -1.105916272470032e-02 +710 726 -9.403863770832814e-03 +710 727 -8.076052134892606e-03 +710 728 -6.996835383339623e-03 +710 729 -6.109381318875727e-03 +710 730 -5.371977266379786e-03 +710 731 -4.753493624956895e-03 +710 732 -4.230349322908520e-03 +710 733 -3.784439171232916e-03 +710 734 -3.401691470521392e-03 +710 735 -3.071047067257377e-03 +711 711 3.988394278105611e+01 +711 688 -3.784439171232929e-03 +711 689 -4.230349322908520e-03 +711 690 -4.753493624956896e-03 +711 691 -5.371977266379809e-03 +711 692 -6.109381318875733e-03 +711 693 -6.996835383339702e-03 +711 694 -8.076052134892571e-03 +711 695 -9.403863770832811e-03 +711 696 -1.105916272470022e-02 +711 697 -1.315380302376537e-02 +711 698 -1.585023865775514e-02 +711 699 -1.939104886145096e-02 +711 700 -2.415034675252896e-02 +711 701 -3.072751892616530e-02 +711 702 -4.012781031912954e-02 +711 703 -5.413421453123106e-02 +711 704 -7.613960933881067e-02 +711 705 -1.132183869282749e-01 +711 706 -1.820810586422648e-01 +711 707 -3.301555353436751e-01 +711 708 -7.412185823610197e-01 +711 709 -3.165206906282882e+00 +711 710 -1.502055215840038e+01 +711 712 -1.502055215835492e+01 +711 713 -3.165206906282890e+00 +711 714 -7.412185823610395e-01 +711 715 -3.301555353436800e-01 +711 716 -1.820810586422655e-01 +711 717 -1.132183869282751e-01 +711 718 -7.613960933881223e-02 +711 719 -5.413421453123236e-02 +711 720 -4.012781031913037e-02 +711 721 -3.072751892616545e-02 +711 722 -2.415034675252906e-02 +711 723 -1.939104886145125e-02 +711 724 -1.585023865775537e-02 +711 725 -1.315380302376555e-02 +711 726 -1.105916272470025e-02 +711 727 -9.403863770832853e-03 +711 728 -8.076052134892575e-03 +711 729 -6.996835383339671e-03 +711 730 -6.109381318875748e-03 +711 731 -5.371977266379821e-03 +711 732 -4.753493624956896e-03 +711 733 -4.230349322908531e-03 +711 734 -3.784439171232936e-03 +711 735 -3.401691470521384e-03 +712 712 3.988394278102301e+01 +712 688 -3.401691470521394e-03 +712 689 -3.784439171232916e-03 +712 690 -4.230349322908531e-03 +712 691 -4.753493624956895e-03 +712 692 -5.371977266379788e-03 +712 693 -6.109381318875769e-03 +712 694 -6.996835383339674e-03 +712 695 -8.076052134892592e-03 +712 696 -9.403863770832825e-03 +712 697 -1.105916272470022e-02 +712 698 -1.315380302376542e-02 +712 699 -1.585023865775520e-02 +712 700 -1.939104886145118e-02 +712 701 -2.415034675252897e-02 +712 702 -3.072751892616529e-02 +712 703 -4.012781031912974e-02 +712 704 -5.413421453123141e-02 +712 705 -7.613960933881189e-02 +712 706 -1.132183869282779e-01 +712 707 -1.820810586422687e-01 +712 708 -3.301555353436740e-01 +712 709 -7.412185823610146e-01 +712 710 -3.165206906282833e+00 +712 711 -1.502055215835492e+01 +712 713 -1.502055215836218e+01 +712 714 -3.165206906282874e+00 +712 715 -7.412185823610316e-01 +712 716 -3.301555353436789e-01 +712 717 -1.820810586422603e-01 +712 718 -1.132183869282744e-01 +712 719 -7.613960933881141e-02 +712 720 -5.413421453123204e-02 +712 721 -4.012781031912978e-02 +712 722 -3.072751892616544e-02 +712 723 -2.415034675252906e-02 +712 724 -1.939104886145119e-02 +712 725 -1.585023865775531e-02 +712 726 -1.315380302376542e-02 +712 727 -1.105916272470025e-02 +712 728 -9.403863770832825e-03 +712 729 -8.076052134892592e-03 +712 730 -6.996835383339674e-03 +712 731 -6.109381318875771e-03 +712 732 -5.371977266379809e-03 +712 733 -4.753493624956895e-03 +712 734 -4.230349322908543e-03 +712 735 -3.784439171232917e-03 +713 713 3.988394278106477e+01 +713 688 -3.071047067257401e-03 +713 689 -3.401691470521392e-03 +713 690 -3.784439171232936e-03 +713 691 -4.230349322908543e-03 +713 692 -4.753493624956895e-03 +713 693 -5.371977266379837e-03 +713 694 -6.109381318875769e-03 +713 695 -6.996835383339698e-03 +713 696 -8.076052134892604e-03 +713 697 -9.403863770832827e-03 +713 698 -1.105916272470025e-02 +713 699 -1.315380302376546e-02 +713 700 -1.585023865775536e-02 +713 701 -1.939104886145118e-02 +713 702 -2.415034675252896e-02 +713 703 -3.072751892616542e-02 +713 704 -4.012781031912996e-02 +713 705 -5.413421453123230e-02 +713 706 -7.613960933881245e-02 +713 707 -1.132183869282797e-01 +713 708 -1.820810586422683e-01 +713 709 -3.301555353436778e-01 +713 710 -7.412185823610080e-01 +713 711 -3.165206906282890e+00 +713 712 -1.502055215836218e+01 +713 714 -1.502055215839542e+01 +713 715 -3.165206906282881e+00 +713 716 -7.412185823610298e-01 +713 717 -3.301555353436716e-01 +713 718 -1.820810586422616e-01 +713 719 -1.132183869282750e-01 +713 720 -7.613960933881150e-02 +713 721 -5.413421453123111e-02 +713 722 -4.012781031912974e-02 +713 723 -3.072751892616543e-02 +713 724 -2.415034675252897e-02 +713 725 -1.939104886145111e-02 +713 726 -1.585023865775514e-02 +713 727 -1.315380302376542e-02 +713 728 -1.105916272470022e-02 +713 729 -9.403863770832811e-03 +713 730 -8.076052134892568e-03 +713 731 -6.996835383339677e-03 +713 732 -6.109381318875733e-03 +713 733 -5.371977266379788e-03 +713 734 -4.753493624956895e-03 +713 735 -4.230349322908508e-03 +714 714 3.988394278115153e+01 +714 688 -2.783725492315666e-03 +714 689 -3.071047067257377e-03 +714 690 -3.401691470521384e-03 +714 691 -3.784439171232917e-03 +714 692 -4.230349322908508e-03 +714 693 -4.753493624956895e-03 +714 694 -5.371977266379790e-03 +714 695 -6.109381318875730e-03 +714 696 -6.996835383339623e-03 +714 697 -8.076052134892564e-03 +714 698 -9.403863770832814e-03 +714 699 -1.105916272470026e-02 +714 700 -1.315380302376555e-02 +714 701 -1.585023865775532e-02 +714 702 -1.939104886145111e-02 +714 703 -2.415034675252897e-02 +714 704 -3.072751892616545e-02 +714 705 -4.012781031913037e-02 +714 706 -5.413421453123205e-02 +714 707 -7.613960933881188e-02 +714 708 -1.132183869282761e-01 +714 709 -1.820810586422643e-01 +714 710 -3.301555353436742e-01 +714 711 -7.412185823610395e-01 +714 712 -3.165206906282874e+00 +714 713 -1.502055215839542e+01 +714 715 -1.502055215844903e+01 +714 716 -3.165206906282877e+00 +714 717 -7.412185823610103e-01 +714 718 -3.301555353436731e-01 +714 719 -1.820810586422670e-01 +714 720 -1.132183869282782e-01 +714 721 -7.613960933881173e-02 +714 722 -5.413421453123138e-02 +714 723 -4.012781031912993e-02 +714 724 -3.072751892616544e-02 +714 725 -2.415034675252896e-02 +714 726 -1.939104886145096e-02 +714 727 -1.585023865775520e-02 +714 728 -1.315380302376542e-02 +714 729 -1.105916272470025e-02 +714 730 -9.403863770832830e-03 +714 731 -8.076052134892642e-03 +714 732 -6.996835383339702e-03 +714 733 -6.109381318875769e-03 +714 734 -5.371977266379837e-03 +714 735 -4.753493624956895e-03 +715 715 3.988394278128108e+01 +715 688 -2.532689975072680e-03 +715 689 -2.783725492315665e-03 +715 690 -3.071047067257392e-03 +715 691 -3.401691470521394e-03 +715 692 -3.784439171232917e-03 +715 693 -4.230349322908543e-03 +715 694 -4.753493624956895e-03 +715 695 -5.371977266379805e-03 +715 696 -6.109381318875727e-03 +715 697 -6.996835383339671e-03 +715 698 -8.076052134892582e-03 +715 699 -9.403863770832816e-03 +715 700 -1.105916272470032e-02 +715 701 -1.315380302376550e-02 +715 702 -1.585023865775526e-02 +715 703 -1.939104886145110e-02 +715 704 -2.415034675252897e-02 +715 705 -3.072751892616572e-02 +715 706 -4.012781031913017e-02 +715 707 -5.413421453123172e-02 +715 708 -7.613960933881167e-02 +715 709 -1.132183869282765e-01 +715 710 -1.820810586422663e-01 +715 711 -3.301555353436800e-01 +715 712 -7.412185823610316e-01 +715 713 -3.165206906282881e+00 +715 714 -1.502055215844903e+01 +715 716 -1.502055215852575e+01 +715 717 -3.165206906282827e+00 +715 718 -7.412185823610151e-01 +715 719 -3.301555353436769e-01 +715 720 -1.820810586422667e-01 +715 721 -1.132183869282783e-01 +715 722 -7.613960933881136e-02 +715 723 -5.413421453123171e-02 +715 724 -4.012781031912998e-02 +715 725 -3.072751892616545e-02 +715 726 -2.415034675252878e-02 +715 727 -1.939104886145103e-02 +715 728 -1.585023865775520e-02 +715 729 -1.315380302376546e-02 +715 730 -1.105916272470026e-02 +715 731 -9.403863770832833e-03 +715 732 -8.076052134892573e-03 +715 733 -6.996835383339674e-03 +715 734 -6.109381318875769e-03 +715 735 -5.371977266379790e-03 +716 716 3.988394278146366e+01 +716 688 -2.312252367280536e-03 +716 689 -2.532689975072673e-03 +716 690 -2.783725492315671e-03 +716 691 -3.071047067257393e-03 +716 692 -3.401691470521385e-03 +716 693 -3.784439171232937e-03 +716 694 -4.230349322908531e-03 +716 695 -4.753493624956895e-03 +716 696 -5.371977266379786e-03 +716 697 -6.109381318875748e-03 +716 698 -6.996835383339674e-03 +716 699 -8.076052134892557e-03 +716 700 -9.403863770832828e-03 +716 701 -1.105916272470022e-02 +716 702 -1.315380302376538e-02 +716 703 -1.585023865775514e-02 +716 704 -1.939104886145097e-02 +716 705 -2.415034675252897e-02 +716 706 -3.072751892616531e-02 +716 707 -4.012781031912956e-02 +716 708 -5.413421453123109e-02 +716 709 -7.613960933881106e-02 +716 710 -1.132183869282775e-01 +716 711 -1.820810586422655e-01 +716 712 -3.301555353436789e-01 +716 713 -7.412185823610298e-01 +716 714 -3.165206906282877e+00 +716 715 -1.502055215852575e+01 +716 717 -1.502055215863293e+01 +716 718 -3.165206906282867e+00 +716 719 -7.412185823610187e-01 +716 720 -3.301555353436748e-01 +716 721 -1.820810586422676e-01 +716 722 -1.132183869282776e-01 +716 723 -7.613960933881254e-02 +716 724 -5.413421453123234e-02 +716 725 -4.012781031913035e-02 +716 726 -3.072751892616544e-02 +716 727 -2.415034675252906e-02 +716 728 -1.939104886145118e-02 +716 729 -1.585023865775536e-02 +716 730 -1.315380302376555e-02 +716 731 -1.105916272470032e-02 +716 732 -9.403863770832813e-03 +716 733 -8.076052134892592e-03 +716 734 -6.996835383339698e-03 +716 735 -6.109381318875730e-03 +717 717 3.988394278171945e+01 +717 688 -2.117777896667799e-03 +717 689 -2.312252367280536e-03 +717 690 -2.532689975072685e-03 +717 691 -2.783725492315679e-03 +717 692 -3.071047067257394e-03 +717 693 -3.401691470521412e-03 +717 694 -3.784439171232939e-03 +717 695 -4.230349322908545e-03 +717 696 -4.753493624956895e-03 +717 697 -5.371977266379821e-03 +717 698 -6.109381318875771e-03 +717 699 -6.996835383339677e-03 +717 700 -8.076052134892653e-03 +717 701 -9.403863770832842e-03 +717 702 -1.105916272470022e-02 +717 703 -1.315380302376542e-02 +717 704 -1.585023865775520e-02 +717 705 -1.939104886145118e-02 +717 706 -2.415034675252897e-02 +717 707 -3.072751892616529e-02 +717 708 -4.012781031912974e-02 +717 709 -5.413421453123141e-02 +717 710 -7.613960933881192e-02 +717 711 -1.132183869282751e-01 +717 712 -1.820810586422603e-01 +717 713 -3.301555353436716e-01 +717 714 -7.412185823610103e-01 +717 715 -3.165206906282827e+00 +717 716 -1.502055215863293e+01 +717 718 -1.502055215878379e+01 +717 719 -3.165206906282869e+00 +717 720 -7.412185823610300e-01 +717 721 -3.301555353436821e-01 +717 722 -1.820810586422694e-01 +717 723 -1.132183869282780e-01 +717 724 -7.613960933881193e-02 +717 725 -5.413421453123204e-02 +717 726 -4.012781031912978e-02 +717 727 -3.072751892616544e-02 +717 728 -2.415034675252897e-02 +717 729 -1.939104886145118e-02 +717 730 -1.585023865775532e-02 +717 731 -1.315380302376550e-02 +717 732 -1.105916272470022e-02 +717 733 -9.403863770832825e-03 +717 734 -8.076052134892604e-03 +717 735 -6.996835383339623e-03 +718 718 3.988394278208166e+01 +718 688 -1.945462087124854e-03 +718 689 -2.117777896667789e-03 +718 690 -2.312252367280536e-03 +718 691 -2.532689975072680e-03 +718 692 -2.783725492315667e-03 +718 693 -3.071047067257401e-03 +718 694 -3.401691470521395e-03 +718 695 -3.784439171232929e-03 +718 696 -4.230349322908520e-03 +718 697 -4.753493624956896e-03 +718 698 -5.371977266379809e-03 +718 699 -6.109381318875733e-03 +718 700 -6.996835383339702e-03 +718 701 -8.076052134892594e-03 +718 702 -9.403863770832811e-03 +718 703 -1.105916272470025e-02 +718 704 -1.315380302376546e-02 +718 705 -1.585023865775536e-02 +718 706 -1.939104886145118e-02 +718 707 -2.415034675252896e-02 +718 708 -3.072751892616542e-02 +718 709 -4.012781031912996e-02 +718 710 -5.413421453123234e-02 +718 711 -7.613960933881223e-02 +718 712 -1.132183869282744e-01 +718 713 -1.820810586422616e-01 +718 714 -3.301555353436731e-01 +718 715 -7.412185823610151e-01 +718 716 -3.165206906282867e+00 +718 717 -1.502055215878379e+01 +718 719 -1.502055215899853e+01 +718 720 -3.165206906282859e+00 +718 721 -7.412185823610286e-01 +718 722 -3.301555353436815e-01 +718 723 -1.820810586422651e-01 +718 724 -1.132183869282756e-01 +718 725 -7.613960933881170e-02 +718 726 -5.413421453123111e-02 +718 727 -4.012781031912974e-02 +718 728 -3.072751892616529e-02 +718 729 -2.415034675252896e-02 +718 730 -1.939104886145111e-02 +718 731 -1.585023865775526e-02 +718 732 -1.315380302376538e-02 +718 733 -1.105916272470022e-02 +718 734 -9.403863770832827e-03 +718 735 -8.076052134892564e-03 +719 719 3.988394278260300e+01 +719 688 -1.792160480940038e-03 +719 689 -1.945462087124849e-03 +719 690 -2.117777896667793e-03 +719 691 -2.312252367280536e-03 +719 692 -2.532689975072674e-03 +719 693 -2.783725492315679e-03 +719 694 -3.071047067257393e-03 +719 695 -3.401691470521394e-03 +719 696 -3.784439171232916e-03 +719 697 -4.230349322908531e-03 +719 698 -4.753493624956895e-03 +719 699 -5.371977266379788e-03 +719 700 -6.109381318875769e-03 +719 701 -6.996835383339674e-03 +719 702 -8.076052134892582e-03 +719 703 -9.403863770832814e-03 +719 704 -1.105916272470026e-02 +719 705 -1.315380302376555e-02 +719 706 -1.585023865775532e-02 +719 707 -1.939104886145111e-02 +719 708 -2.415034675252897e-02 +719 709 -3.072751892616545e-02 +719 710 -4.012781031913039e-02 +719 711 -5.413421453123236e-02 +719 712 -7.613960933881141e-02 +719 713 -1.132183869282750e-01 +719 714 -1.820810586422670e-01 +719 715 -3.301555353436769e-01 +719 716 -7.412185823610187e-01 +719 717 -3.165206906282869e+00 +719 718 -1.502055215899853e+01 +719 720 -1.502055215931066e+01 +719 721 -3.165206906282885e+00 +719 722 -7.412185823610309e-01 +719 723 -3.301555353436740e-01 +719 724 -1.820810586422625e-01 +719 725 -1.132183869282760e-01 +719 726 -7.613960933881087e-02 +719 727 -5.413421453123138e-02 +719 728 -4.012781031912974e-02 +719 729 -3.072751892616542e-02 +719 730 -2.415034675252897e-02 +719 731 -1.939104886145110e-02 +719 732 -1.585023865775514e-02 +719 733 -1.315380302376542e-02 +719 734 -1.105916272470025e-02 +719 735 -9.403863770832814e-03 +720 720 3.988394278260306e+01 +720 704 -9.403863770832830e-03 +720 705 -1.105916272470032e-02 +720 706 -1.315380302376550e-02 +720 707 -1.585023865775526e-02 +720 708 -1.939104886145110e-02 +720 709 -2.415034675252897e-02 +720 710 -3.072751892616573e-02 +720 711 -4.012781031913037e-02 +720 712 -5.413421453123204e-02 +720 713 -7.613960933881150e-02 +720 714 -1.132183869282782e-01 +720 715 -1.820810586422667e-01 +720 716 -3.301555353436748e-01 +720 717 -7.412185823610300e-01 +720 718 -3.165206906282859e+00 +720 719 -1.502055215931066e+01 +720 721 -1.502055215899860e+01 +720 722 -3.165206906282882e+00 +720 723 -7.412185823610274e-01 +720 724 -3.301555353436713e-01 +720 725 -1.820810586422641e-01 +720 726 -1.132183869282751e-01 +720 727 -7.613960933881070e-02 +720 728 -5.413421453123141e-02 +720 729 -4.012781031912996e-02 +720 730 -3.072751892616545e-02 +720 731 -2.415034675252897e-02 +720 732 -1.939104886145097e-02 +720 733 -1.585023865775520e-02 +720 734 -1.315380302376546e-02 +720 735 -1.105916272470026e-02 +720 736 -9.403863770832816e-03 +720 737 -8.076052134892557e-03 +720 738 -6.996835383339677e-03 +720 739 -6.109381318875733e-03 +720 740 -5.371977266379788e-03 +720 741 -4.753493624956895e-03 +720 742 -4.230349322908508e-03 +720 743 -3.784439171232917e-03 +720 744 -3.401691470521385e-03 +720 745 -3.071047067257394e-03 +720 746 -2.783725492315667e-03 +720 747 -2.532689975072674e-03 +720 748 -2.312252367280536e-03 +720 749 -2.117777896667785e-03 +720 750 -1.945462087124849e-03 +720 751 -1.792160480940035e-03 +721 721 3.988394278208168e+01 +721 704 -8.076052134892554e-03 +721 705 -9.403863770832813e-03 +721 706 -1.105916272470022e-02 +721 707 -1.315380302376538e-02 +721 708 -1.585023865775514e-02 +721 709 -1.939104886145097e-02 +721 710 -2.415034675252898e-02 +721 711 -3.072751892616545e-02 +721 712 -4.012781031912978e-02 +721 713 -5.413421453123111e-02 +721 714 -7.613960933881173e-02 +721 715 -1.132183869282783e-01 +721 716 -1.820810586422676e-01 +721 717 -3.301555353436821e-01 +721 718 -7.412185823610286e-01 +721 719 -3.165206906282885e+00 +721 720 -1.502055215899860e+01 +721 722 -1.502055215878370e+01 +721 723 -3.165206906282893e+00 +721 724 -7.412185823610125e-01 +721 725 -3.301555353436751e-01 +721 726 -1.820810586422626e-01 +721 727 -1.132183869282740e-01 +721 728 -7.613960933881188e-02 +721 729 -5.413421453123230e-02 +721 730 -4.012781031913037e-02 +721 731 -3.072751892616572e-02 +721 732 -2.415034675252897e-02 +721 733 -1.939104886145118e-02 +721 734 -1.585023865775536e-02 +721 735 -1.315380302376555e-02 +721 736 -1.105916272470032e-02 +721 737 -9.403863770832828e-03 +721 738 -8.076052134892653e-03 +721 739 -6.996835383339702e-03 +721 740 -6.109381318875769e-03 +721 741 -5.371977266379837e-03 +721 742 -4.753493624956895e-03 +721 743 -4.230349322908543e-03 +721 744 -3.784439171232937e-03 +721 745 -3.401691470521412e-03 +721 746 -3.071047067257401e-03 +721 747 -2.783725492315679e-03 +721 748 -2.532689975072691e-03 +721 749 -2.312252367280536e-03 +721 750 -2.117777896667799e-03 +721 751 -1.945462087124857e-03 +722 722 3.988394278171954e+01 +722 704 -6.996835383339671e-03 +722 705 -8.076052134892592e-03 +722 706 -9.403863770832825e-03 +722 707 -1.105916272470022e-02 +722 708 -1.315380302376542e-02 +722 709 -1.585023865775520e-02 +722 710 -1.939104886145118e-02 +722 711 -2.415034675252906e-02 +722 712 -3.072751892616544e-02 +722 713 -4.012781031912974e-02 +722 714 -5.413421453123138e-02 +722 715 -7.613960933881136e-02 +722 716 -1.132183869282776e-01 +722 717 -1.820810586422694e-01 +722 718 -3.301555353436815e-01 +722 719 -7.412185823610309e-01 +722 720 -3.165206906282882e+00 +722 721 -1.502055215878370e+01 +722 723 -1.502055215863307e+01 +722 724 -3.165206906282841e+00 +722 725 -7.412185823610160e-01 +722 726 -3.301555353436739e-01 +722 727 -1.820810586422623e-01 +722 728 -1.132183869282767e-01 +722 729 -7.613960933881206e-02 +722 730 -5.413421453123205e-02 +722 731 -4.012781031913017e-02 +722 732 -3.072751892616531e-02 +722 733 -2.415034675252897e-02 +722 734 -1.939104886145118e-02 +722 735 -1.585023865775532e-02 +722 736 -1.315380302376550e-02 +722 737 -1.105916272470022e-02 +722 738 -9.403863770832842e-03 +722 739 -8.076052134892594e-03 +722 740 -6.996835383339674e-03 +722 741 -6.109381318875769e-03 +722 742 -5.371977266379790e-03 +722 743 -4.753493624956895e-03 +722 744 -4.230349322908531e-03 +722 745 -3.784439171232939e-03 +722 746 -3.401691470521395e-03 +722 747 -3.071047067257393e-03 +722 748 -2.783725492315679e-03 +722 749 -2.532689975072674e-03 +722 750 -2.312252367280536e-03 +722 751 -2.117777896667794e-03 +723 723 3.988394278146369e+01 +723 704 -6.109381318875748e-03 +723 705 -6.996835383339674e-03 +723 706 -8.076052134892578e-03 +723 707 -9.403863770832828e-03 +723 708 -1.105916272470025e-02 +723 709 -1.315380302376546e-02 +723 710 -1.585023865775537e-02 +723 711 -1.939104886145125e-02 +723 712 -2.415034675252906e-02 +723 713 -3.072751892616543e-02 +723 714 -4.012781031912993e-02 +723 715 -5.413421453123171e-02 +723 716 -7.613960933881254e-02 +723 717 -1.132183869282780e-01 +723 718 -1.820810586422651e-01 +723 719 -3.301555353436740e-01 +723 720 -7.412185823610274e-01 +723 721 -3.165206906282893e+00 +723 722 -1.502055215863307e+01 +723 724 -1.502055215852561e+01 +723 725 -3.165206906282882e+00 +723 726 -7.412185823610241e-01 +723 727 -3.301555353436791e-01 +723 728 -1.820810586422683e-01 +723 729 -1.132183869282786e-01 +723 730 -7.613960933881168e-02 +723 731 -5.413421453123172e-02 +723 732 -4.012781031912956e-02 +723 733 -3.072751892616529e-02 +723 734 -2.415034675252896e-02 +723 735 -1.939104886145111e-02 +723 736 -1.585023865775526e-02 +723 737 -1.315380302376538e-02 +723 738 -1.105916272470022e-02 +723 739 -9.403863770832811e-03 +723 740 -8.076052134892582e-03 +723 741 -6.996835383339698e-03 +723 742 -6.109381318875730e-03 +723 743 -5.371977266379805e-03 +723 744 -4.753493624956895e-03 +723 745 -4.230349322908545e-03 +723 746 -3.784439171232929e-03 +723 747 -3.401691470521394e-03 +723 748 -3.071047067257401e-03 +723 749 -2.783725492315666e-03 +723 750 -2.532689975072680e-03 +723 751 -2.312252367280536e-03 +724 724 3.988394278128113e+01 +724 704 -5.371977266379821e-03 +724 705 -6.109381318875771e-03 +724 706 -6.996835383339677e-03 +724 707 -8.076052134892642e-03 +724 708 -9.403863770832832e-03 +724 709 -1.105916272470026e-02 +724 710 -1.315380302376555e-02 +724 711 -1.585023865775537e-02 +724 712 -1.939104886145119e-02 +724 713 -2.415034675252897e-02 +724 714 -3.072751892616544e-02 +724 715 -4.012781031912998e-02 +724 716 -5.413421453123234e-02 +724 717 -7.613960933881193e-02 +724 718 -1.132183869282756e-01 +724 719 -1.820810586422625e-01 +724 720 -3.301555353436713e-01 +724 721 -7.412185823610125e-01 +724 722 -3.165206906282841e+00 +724 723 -1.502055215852561e+01 +724 725 -1.502055215844922e+01 +724 726 -3.165206906282881e+00 +724 727 -7.412185823610342e-01 +724 728 -3.301555353436826e-01 +724 729 -1.820810586422691e-01 +724 730 -1.132183869282775e-01 +724 731 -7.613960933881203e-02 +724 732 -5.413421453123109e-02 +724 733 -4.012781031912974e-02 +724 734 -3.072751892616542e-02 +724 735 -2.415034675252897e-02 +724 736 -1.939104886145110e-02 +724 737 -1.585023865775514e-02 +724 738 -1.315380302376542e-02 +724 739 -1.105916272470025e-02 +724 740 -9.403863770832814e-03 +724 741 -8.076052134892594e-03 +724 742 -6.996835383339623e-03 +724 743 -6.109381318875727e-03 +724 744 -5.371977266379786e-03 +724 745 -4.753493624956895e-03 +724 746 -4.230349322908520e-03 +724 747 -3.784439171232916e-03 +724 748 -3.401691470521392e-03 +724 749 -3.071047067257377e-03 +724 750 -2.783725492315665e-03 +724 751 -2.532689975072673e-03 +725 725 3.988394278115155e+01 +725 704 -4.753493624956896e-03 +725 705 -5.371977266379809e-03 +725 706 -6.109381318875733e-03 +725 707 -6.996835383339702e-03 +725 708 -8.076052134892583e-03 +725 709 -9.403863770832816e-03 +725 710 -1.105916272470032e-02 +725 711 -1.315380302376555e-02 +725 712 -1.585023865775531e-02 +725 713 -1.939104886145111e-02 +725 714 -2.415034675252896e-02 +725 715 -3.072751892616545e-02 +725 716 -4.012781031913035e-02 +725 717 -5.413421453123204e-02 +725 718 -7.613960933881170e-02 +725 719 -1.132183869282760e-01 +725 720 -1.820810586422641e-01 +725 721 -3.301555353436751e-01 +725 722 -7.412185823610160e-01 +725 723 -3.165206906282882e+00 +725 724 -1.502055215844922e+01 +725 726 -1.502055215839526e+01 +725 727 -3.165206906282874e+00 +725 728 -7.412185823610278e-01 +725 729 -3.301555353436755e-01 +725 730 -1.820810586422659e-01 +725 731 -1.132183869282770e-01 +725 732 -7.613960933881103e-02 +725 733 -5.413421453123141e-02 +725 734 -4.012781031912996e-02 +725 735 -3.072751892616545e-02 +725 736 -2.415034675252897e-02 +725 737 -1.939104886145097e-02 +725 738 -1.585023865775520e-02 +725 739 -1.315380302376546e-02 +725 740 -1.105916272470026e-02 +725 741 -9.403863770832830e-03 +725 742 -8.076052134892554e-03 +725 743 -6.996835383339671e-03 +725 744 -6.109381318875748e-03 +725 745 -5.371977266379821e-03 +725 746 -4.753493624956896e-03 +725 747 -4.230349322908531e-03 +725 748 -3.784439171232936e-03 +725 749 -3.401691470521384e-03 +725 750 -3.071047067257392e-03 +725 751 -2.783725492315671e-03 +726 726 3.988394278106479e+01 +726 704 -4.230349322908531e-03 +726 705 -4.753493624956895e-03 +726 706 -5.371977266379788e-03 +726 707 -6.109381318875769e-03 +726 708 -6.996835383339674e-03 +726 709 -8.076052134892570e-03 +726 710 -9.403863770832814e-03 +726 711 -1.105916272470025e-02 +726 712 -1.315380302376542e-02 +726 713 -1.585023865775514e-02 +726 714 -1.939104886145096e-02 +726 715 -2.415034675252878e-02 +726 716 -3.072751892616544e-02 +726 717 -4.012781031912978e-02 +726 718 -5.413421453123111e-02 +726 719 -7.613960933881087e-02 +726 720 -1.132183869282751e-01 +726 721 -1.820810586422626e-01 +726 722 -3.301555353436739e-01 +726 723 -7.412185823610241e-01 +726 724 -3.165206906282881e+00 +726 725 -1.502055215839526e+01 +726 727 -1.502055215836237e+01 +726 728 -3.165206906282891e+00 +726 729 -7.412185823610136e-01 +726 730 -3.301555353436770e-01 +726 731 -1.820810586422658e-01 +726 732 -1.132183869282766e-01 +726 733 -7.613960933881191e-02 +726 734 -5.413421453123230e-02 +726 735 -4.012781031913037e-02 +726 736 -3.072751892616572e-02 +726 737 -2.415034675252897e-02 +726 738 -1.939104886145118e-02 +726 739 -1.585023865775536e-02 +726 740 -1.315380302376555e-02 +726 741 -1.105916272470032e-02 +726 742 -9.403863770832813e-03 +726 743 -8.076052134892592e-03 +726 744 -6.996835383339674e-03 +726 745 -6.109381318875771e-03 +726 746 -5.371977266379809e-03 +726 747 -4.753493624956895e-03 +726 748 -4.230349322908543e-03 +726 749 -3.784439171232917e-03 +726 750 -3.401691470521394e-03 +726 751 -3.071047067257393e-03 +727 727 3.988394278102302e+01 +727 704 -3.784439171232936e-03 +727 705 -4.230349322908543e-03 +727 706 -4.753493624956895e-03 +727 707 -5.371977266379837e-03 +727 708 -6.109381318875769e-03 +727 709 -6.996835383339698e-03 +727 710 -8.076052134892606e-03 +727 711 -9.403863770832853e-03 +727 712 -1.105916272470025e-02 +727 713 -1.315380302376542e-02 +727 714 -1.585023865775520e-02 +727 715 -1.939104886145103e-02 +727 716 -2.415034675252906e-02 +727 717 -3.072751892616544e-02 +727 718 -4.012781031912974e-02 +727 719 -5.413421453123138e-02 +727 720 -7.613960933881070e-02 +727 721 -1.132183869282740e-01 +727 722 -1.820810586422623e-01 +727 723 -3.301555353436791e-01 +727 724 -7.412185823610342e-01 +727 725 -3.165206906282874e+00 +727 726 -1.502055215836237e+01 +727 728 -1.502055215835477e+01 +727 729 -3.165206906282812e+00 +727 730 -7.412185823610101e-01 +727 731 -3.301555353436775e-01 +727 732 -1.820810586422666e-01 +727 733 -1.132183869282767e-01 +727 734 -7.613960933881175e-02 +727 735 -5.413421453123205e-02 +727 736 -4.012781031913017e-02 +727 737 -3.072751892616531e-02 +727 738 -2.415034675252897e-02 +727 739 -1.939104886145118e-02 +727 740 -1.585023865775532e-02 +727 741 -1.315380302376550e-02 +727 742 -1.105916272470022e-02 +727 743 -9.403863770832825e-03 +727 744 -8.076052134892578e-03 +727 745 -6.996835383339677e-03 +727 746 -6.109381318875733e-03 +727 747 -5.371977266379788e-03 +727 748 -4.753493624956895e-03 +727 749 -4.230349322908508e-03 +727 750 -3.784439171232917e-03 +727 751 -3.401691470521385e-03 +728 728 3.988394278105609e+01 +728 704 -3.401691470521384e-03 +728 705 -3.784439171232917e-03 +728 706 -4.230349322908508e-03 +728 707 -4.753493624956895e-03 +728 708 -5.371977266379790e-03 +728 709 -6.109381318875730e-03 +728 710 -6.996835383339623e-03 +728 711 -8.076052134892575e-03 +728 712 -9.403863770832825e-03 +728 713 -1.105916272470022e-02 +728 714 -1.315380302376542e-02 +728 715 -1.585023865775520e-02 +728 716 -1.939104886145118e-02 +728 717 -2.415034675252897e-02 +728 718 -3.072751892616529e-02 +728 719 -4.012781031912974e-02 +728 720 -5.413421453123141e-02 +728 721 -7.613960933881188e-02 +728 722 -1.132183869282767e-01 +728 723 -1.820810586422683e-01 +728 724 -3.301555353436826e-01 +728 725 -7.412185823610278e-01 +728 726 -3.165206906282891e+00 +728 727 -1.502055215835477e+01 +728 729 -1.502055215840050e+01 +728 730 -3.165206906282886e+00 +728 731 -7.412185823610262e-01 +728 732 -3.301555353436730e-01 +728 733 -1.820810586422620e-01 +728 734 -1.132183869282735e-01 +728 735 -7.613960933881139e-02 +728 736 -5.413421453123204e-02 +728 737 -4.012781031912978e-02 +728 738 -3.072751892616544e-02 +728 739 -2.415034675252906e-02 +728 740 -1.939104886145119e-02 +728 741 -1.585023865775531e-02 +728 742 -1.315380302376542e-02 +728 743 -1.105916272470025e-02 +728 744 -9.403863770832854e-03 +728 745 -8.076052134892655e-03 +728 746 -6.996835383339702e-03 +728 747 -6.109381318875769e-03 +728 748 -5.371977266379837e-03 +728 749 -4.753493624956895e-03 +728 750 -4.230349322908543e-03 +728 751 -3.784439171232937e-03 +729 729 3.988394278128562e+01 +729 704 -3.071047067257392e-03 +729 705 -3.401691470521394e-03 +729 706 -3.784439171232917e-03 +729 707 -4.230349322908543e-03 +729 708 -4.753493624956895e-03 +729 709 -5.371977266379805e-03 +729 710 -6.109381318875727e-03 +729 711 -6.996835383339671e-03 +729 712 -8.076052134892592e-03 +729 713 -9.403863770832811e-03 +729 714 -1.105916272470025e-02 +729 715 -1.315380302376546e-02 +729 716 -1.585023865775536e-02 +729 717 -1.939104886145118e-02 +729 718 -2.415034675252896e-02 +729 719 -3.072751892616542e-02 +729 720 -4.012781031912996e-02 +729 721 -5.413421453123230e-02 +729 722 -7.613960933881206e-02 +729 723 -1.132183869282786e-01 +729 724 -1.820810586422691e-01 +729 725 -3.301555353436755e-01 +729 726 -7.412185823610136e-01 +729 727 -3.165206906282812e+00 +729 728 -1.502055215840050e+01 +729 730 -1.502055215860531e+01 +729 731 -3.165206906282882e+00 +729 732 -7.412185823610276e-01 +729 733 -3.301555353436787e-01 +729 734 -1.820810586422615e-01 +729 735 -1.132183869282749e-01 +729 736 -7.613960933881171e-02 +729 737 -5.413421453123111e-02 +729 738 -4.012781031912974e-02 +729 739 -3.072751892616543e-02 +729 740 -2.415034675252897e-02 +729 741 -1.939104886145111e-02 +729 742 -1.585023865775514e-02 +729 743 -1.315380302376542e-02 +729 744 -1.105916272470025e-02 +729 745 -9.403863770832833e-03 +729 746 -8.076052134892583e-03 +729 747 -6.996835383339674e-03 +729 748 -6.109381318875769e-03 +729 749 -5.371977266379790e-03 +729 750 -4.753493624956895e-03 +729 751 -4.230349322908531e-03 +730 730 3.988394278152493e+01 +730 704 -2.783725492315671e-03 +730 705 -3.071047067257393e-03 +730 706 -3.401691470521385e-03 +730 707 -3.784439171232937e-03 +730 708 -4.230349322908531e-03 +730 709 -4.753493624956895e-03 +730 710 -5.371977266379786e-03 +730 711 -6.109381318875748e-03 +730 712 -6.996835383339674e-03 +730 713 -8.076052134892568e-03 +730 714 -9.403863770832830e-03 +730 715 -1.105916272470026e-02 +730 716 -1.315380302376555e-02 +730 717 -1.585023865775532e-02 +730 718 -1.939104886145111e-02 +730 719 -2.415034675252897e-02 +730 720 -3.072751892616545e-02 +730 721 -4.012781031913037e-02 +730 722 -5.413421453123205e-02 +730 723 -7.613960933881168e-02 +730 724 -1.132183869282775e-01 +730 725 -1.820810586422659e-01 +730 726 -3.301555353436770e-01 +730 727 -7.412185823610101e-01 +730 728 -3.165206906282886e+00 +730 729 -1.502055215860531e+01 +730 731 -1.502055215859219e+01 +730 732 -3.165206906282862e+00 +730 733 -7.412185823610286e-01 +730 734 -3.301555353436798e-01 +730 735 -1.820810586422655e-01 +730 736 -1.132183869282780e-01 +730 737 -7.613960933881114e-02 +730 738 -5.413421453123138e-02 +730 739 -4.012781031912993e-02 +730 740 -3.072751892616544e-02 +730 741 -2.415034675252896e-02 +730 742 -1.939104886145096e-02 +730 743 -1.585023865775520e-02 +730 744 -1.315380302376546e-02 +730 745 -1.105916272470025e-02 +730 746 -9.403863770832813e-03 +730 747 -8.076052134892570e-03 +730 748 -6.996835383339698e-03 +730 749 -6.109381318875730e-03 +730 750 -5.371977266379805e-03 +730 751 -4.753493624956895e-03 +731 731 3.988394278151357e+01 +731 704 -2.532689975072685e-03 +731 705 -2.783725492315679e-03 +731 706 -3.071047067257394e-03 +731 707 -3.401691470521412e-03 +731 708 -3.784439171232939e-03 +731 709 -4.230349322908545e-03 +731 710 -4.753493624956895e-03 +731 711 -5.371977266379821e-03 +731 712 -6.109381318875771e-03 +731 713 -6.996835383339677e-03 +731 714 -8.076052134892642e-03 +731 715 -9.403863770832833e-03 +731 716 -1.105916272470032e-02 +731 717 -1.315380302376550e-02 +731 718 -1.585023865775526e-02 +731 719 -1.939104886145110e-02 +731 720 -2.415034675252897e-02 +731 721 -3.072751892616572e-02 +731 722 -4.012781031913017e-02 +731 723 -5.413421453123172e-02 +731 724 -7.613960933881203e-02 +731 725 -1.132183869282770e-01 +731 726 -1.820810586422658e-01 +731 727 -3.301555353436775e-01 +731 728 -7.412185823610262e-01 +731 729 -3.165206906282882e+00 +731 730 -1.502055215859219e+01 +731 732 -1.502055215859653e+01 +731 733 -3.165206906282878e+00 +731 734 -7.412185823610213e-01 +731 735 -3.301555353436743e-01 +731 736 -1.820810586422679e-01 +731 737 -1.132183869282773e-01 +731 738 -7.613960933881136e-02 +731 739 -5.413421453123171e-02 +731 740 -4.012781031912998e-02 +731 741 -3.072751892616545e-02 +731 742 -2.415034675252878e-02 +731 743 -1.939104886145103e-02 +731 744 -1.585023865775526e-02 +731 745 -1.315380302376547e-02 +731 746 -1.105916272470026e-02 +731 747 -9.403863770832771e-03 +731 748 -8.076052134892582e-03 +731 749 -6.996835383339623e-03 +731 750 -6.109381318875727e-03 +731 751 -5.371977266379786e-03 +732 732 3.988394278151438e+01 +732 704 -2.312252367280536e-03 +732 705 -2.532689975072680e-03 +732 706 -2.783725492315667e-03 +732 707 -3.071047067257401e-03 +732 708 -3.401691470521395e-03 +732 709 -3.784439171232929e-03 +732 710 -4.230349322908520e-03 +732 711 -4.753493624956896e-03 +732 712 -5.371977266379809e-03 +732 713 -6.109381318875733e-03 +732 714 -6.996835383339702e-03 +732 715 -8.076052134892573e-03 +732 716 -9.403863770832813e-03 +732 717 -1.105916272470022e-02 +732 718 -1.315380302376538e-02 +732 719 -1.585023865775514e-02 +732 720 -1.939104886145097e-02 +732 721 -2.415034675252897e-02 +732 722 -3.072751892616531e-02 +732 723 -4.012781031912956e-02 +732 724 -5.413421453123109e-02 +732 725 -7.613960933881103e-02 +732 726 -1.132183869282766e-01 +732 727 -1.820810586422666e-01 +732 728 -3.301555353436730e-01 +732 729 -7.412185823610276e-01 +732 730 -3.165206906282862e+00 +732 731 -1.502055215859653e+01 +732 733 -1.502055215858801e+01 +732 734 -3.165206906282840e+00 +732 735 -7.412185823610201e-01 +732 736 -3.301555353436781e-01 +732 737 -1.820810586422667e-01 +732 738 -1.132183869282775e-01 +732 739 -7.613960933881253e-02 +732 740 -5.413421453123234e-02 +732 741 -4.012781031913035e-02 +732 742 -3.072751892616544e-02 +732 743 -2.415034675252906e-02 +732 744 -1.939104886145125e-02 +732 745 -1.585023865775537e-02 +732 746 -1.315380302376555e-02 +732 747 -1.105916272470025e-02 +732 748 -9.403863770832825e-03 +732 749 -8.076052134892575e-03 +732 750 -6.996835383339671e-03 +732 751 -6.109381318875748e-03 +733 733 3.988394278153930e+01 +733 704 -2.117777896667793e-03 +733 705 -2.312252367280536e-03 +733 706 -2.532689975072674e-03 +733 707 -2.783725492315679e-03 +733 708 -3.071047067257393e-03 +733 709 -3.401691470521394e-03 +733 710 -3.784439171232916e-03 +733 711 -4.230349322908531e-03 +733 712 -4.753493624956895e-03 +733 713 -5.371977266379788e-03 +733 714 -6.109381318875769e-03 +733 715 -6.996835383339674e-03 +733 716 -8.076052134892592e-03 +733 717 -9.403863770832825e-03 +733 718 -1.105916272470022e-02 +733 719 -1.315380302376542e-02 +733 720 -1.585023865775520e-02 +733 721 -1.939104886145118e-02 +733 722 -2.415034675252897e-02 +733 723 -3.072751892616529e-02 +733 724 -4.012781031912974e-02 +733 725 -5.413421453123141e-02 +733 726 -7.613960933881191e-02 +733 727 -1.132183869282767e-01 +733 728 -1.820810586422620e-01 +733 729 -3.301555353436787e-01 +733 730 -7.412185823610286e-01 +733 731 -3.165206906282878e+00 +733 732 -1.502055215858801e+01 +733 734 -1.502055215863996e+01 +733 735 -3.165206906282902e+00 +733 736 -7.412185823610207e-01 +733 737 -3.301555353436729e-01 +733 738 -1.820810586422663e-01 +733 739 -1.132183869282771e-01 +733 740 -7.613960933881174e-02 +733 741 -5.413421453123204e-02 +733 742 -4.012781031912978e-02 +733 743 -3.072751892616544e-02 +733 744 -2.415034675252906e-02 +733 745 -1.939104886145119e-02 +733 746 -1.585023865775531e-02 +733 747 -1.315380302376542e-02 +733 748 -1.105916272470022e-02 +733 749 -9.403863770832825e-03 +733 750 -8.076052134892592e-03 +733 751 -6.996835383339674e-03 +734 734 3.988394278164018e+01 +734 704 -1.945462087124857e-03 +734 705 -2.117777896667799e-03 +734 706 -2.312252367280536e-03 +734 707 -2.532689975072691e-03 +734 708 -2.783725492315679e-03 +734 709 -3.071047067257401e-03 +734 710 -3.401691470521392e-03 +734 711 -3.784439171232936e-03 +734 712 -4.230349322908543e-03 +734 713 -4.753493624956895e-03 +734 714 -5.371977266379837e-03 +734 715 -6.109381318875769e-03 +734 716 -6.996835383339698e-03 +734 717 -8.076052134892604e-03 +734 718 -9.403863770832827e-03 +734 719 -1.105916272470025e-02 +734 720 -1.315380302376546e-02 +734 721 -1.585023865775536e-02 +734 722 -1.939104886145118e-02 +734 723 -2.415034675252896e-02 +734 724 -3.072751892616542e-02 +734 725 -4.012781031912996e-02 +734 726 -5.413421453123230e-02 +734 727 -7.613960933881175e-02 +734 728 -1.132183869282735e-01 +734 729 -1.820810586422615e-01 +734 730 -3.301555353436798e-01 +734 731 -7.412185823610213e-01 +734 732 -3.165206906282840e+00 +734 733 -1.502055215863996e+01 +734 735 -1.502055215866007e+01 +734 736 -3.165206906282878e+00 +734 737 -7.412185823610212e-01 +734 738 -3.301555353436761e-01 +734 739 -1.820810586422667e-01 +734 740 -1.132183869282766e-01 +734 741 -7.613960933881189e-02 +734 742 -5.413421453123111e-02 +734 743 -4.012781031912974e-02 +734 744 -3.072751892616543e-02 +734 745 -2.415034675252897e-02 +734 746 -1.939104886145111e-02 +734 747 -1.585023865775514e-02 +734 748 -1.315380302376537e-02 +734 749 -1.105916272470022e-02 +734 750 -9.403863770832811e-03 +734 751 -8.076052134892568e-03 +735 735 3.988394278169711e+01 +735 704 -1.792160480940034e-03 +735 705 -1.945462087124849e-03 +735 706 -2.117777896667785e-03 +735 707 -2.312252367280536e-03 +735 708 -2.532689975072674e-03 +735 709 -2.783725492315666e-03 +735 710 -3.071047067257377e-03 +735 711 -3.401691470521384e-03 +735 712 -3.784439171232917e-03 +735 713 -4.230349322908508e-03 +735 714 -4.753493624956895e-03 +735 715 -5.371977266379790e-03 +735 716 -6.109381318875730e-03 +735 717 -6.996835383339623e-03 +735 718 -8.076052134892564e-03 +735 719 -9.403863770832814e-03 +735 720 -1.105916272470026e-02 +735 721 -1.315380302376555e-02 +735 722 -1.585023865775532e-02 +735 723 -1.939104886145111e-02 +735 724 -2.415034675252897e-02 +735 725 -3.072751892616545e-02 +735 726 -4.012781031913037e-02 +735 727 -5.413421453123205e-02 +735 728 -7.613960933881139e-02 +735 729 -1.132183869282749e-01 +735 730 -1.820810586422655e-01 +735 731 -3.301555353436743e-01 +735 732 -7.412185823610201e-01 +735 733 -3.165206906282902e+00 +735 734 -1.502055215866007e+01 +735 736 -1.502055215931058e+01 +735 737 -3.165206906282880e+00 +735 738 -7.412185823610240e-01 +735 739 -3.301555353436803e-01 +735 740 -1.820810586422639e-01 +735 741 -1.132183869282760e-01 +735 742 -7.613960933881085e-02 +735 743 -5.413421453123138e-02 +735 744 -4.012781031912993e-02 +735 745 -3.072751892616544e-02 +735 746 -2.415034675252896e-02 +735 747 -1.939104886145095e-02 +735 748 -1.585023865775514e-02 +735 749 -1.315380302376542e-02 +735 750 -1.105916272470025e-02 +735 751 -9.403863770832830e-03 +736 736 3.988394278169709e+01 +736 720 -9.403863770832816e-03 +736 721 -1.105916272470032e-02 +736 722 -1.315380302376550e-02 +736 723 -1.585023865775526e-02 +736 724 -1.939104886145110e-02 +736 725 -2.415034675252897e-02 +736 726 -3.072751892616572e-02 +736 727 -4.012781031913017e-02 +736 728 -5.413421453123204e-02 +736 729 -7.613960933881171e-02 +736 730 -1.132183869282780e-01 +736 731 -1.820810586422679e-01 +736 732 -3.301555353436781e-01 +736 733 -7.412185823610207e-01 +736 734 -3.165206906282878e+00 +736 735 -1.502055215931058e+01 +736 737 -1.502055215866008e+01 +736 738 -3.165206906282872e+00 +736 739 -7.412185823610299e-01 +736 740 -3.301555353436779e-01 +736 741 -1.820810586422619e-01 +736 742 -1.132183869282741e-01 +736 743 -7.613960933881070e-02 +736 744 -5.413421453123171e-02 +736 745 -4.012781031912998e-02 +736 746 -3.072751892616545e-02 +736 747 -2.415034675252877e-02 +736 748 -1.939104886145096e-02 +736 749 -1.585023865775520e-02 +736 750 -1.315380302376546e-02 +736 751 -1.105916272470026e-02 +736 752 -9.403863770832833e-03 +736 753 -8.076052134892573e-03 +736 754 -6.996835383339674e-03 +736 755 -6.109381318875769e-03 +736 756 -5.371977266379790e-03 +736 757 -4.753493624956895e-03 +736 758 -4.230349322908531e-03 +736 759 -3.784439171232937e-03 +736 760 -3.401691470521385e-03 +736 761 -3.071047067257393e-03 +736 762 -2.783725492315679e-03 +736 763 -2.532689975072674e-03 +736 764 -2.312252367280536e-03 +736 765 -2.117777896667794e-03 +736 766 -1.945462087124857e-03 +736 767 -1.792160480940035e-03 +737 737 3.988394278164024e+01 +737 720 -8.076052134892557e-03 +737 721 -9.403863770832828e-03 +737 722 -1.105916272470022e-02 +737 723 -1.315380302376538e-02 +737 724 -1.585023865775514e-02 +737 725 -1.939104886145097e-02 +737 726 -2.415034675252897e-02 +737 727 -3.072751892616531e-02 +737 728 -4.012781031912978e-02 +737 729 -5.413421453123111e-02 +737 730 -7.613960933881114e-02 +737 731 -1.132183869282773e-01 +737 732 -1.820810586422667e-01 +737 733 -3.301555353436729e-01 +737 734 -7.412185823610212e-01 +737 735 -3.165206906282880e+00 +737 736 -1.502055215866008e+01 +737 738 -1.502055215863993e+01 +737 739 -3.165206906282883e+00 +737 740 -7.412185823610314e-01 +737 741 -3.301555353436736e-01 +737 742 -1.820810586422642e-01 +737 743 -1.132183869282759e-01 +737 744 -7.613960933881236e-02 +737 745 -5.413421453123234e-02 +737 746 -4.012781031913035e-02 +737 747 -3.072751892616543e-02 +737 748 -2.415034675252896e-02 +737 749 -1.939104886145118e-02 +737 750 -1.585023865775536e-02 +737 751 -1.315380302376555e-02 +737 752 -1.105916272470032e-02 +737 753 -9.403863770832813e-03 +737 754 -8.076052134892592e-03 +737 755 -6.996835383339698e-03 +737 756 -6.109381318875730e-03 +737 757 -5.371977266379805e-03 +737 758 -4.753493624956895e-03 +737 759 -4.230349322908543e-03 +737 760 -3.784439171232917e-03 +737 761 -3.401691470521394e-03 +737 762 -3.071047067257401e-03 +737 763 -2.783725492315666e-03 +737 764 -2.532689975072680e-03 +737 765 -2.312252367280536e-03 +737 766 -2.117777896667799e-03 +737 767 -1.945462087124849e-03 +738 738 3.988394278153935e+01 +738 720 -6.996835383339677e-03 +738 721 -8.076052134892653e-03 +738 722 -9.403863770832842e-03 +738 723 -1.105916272470022e-02 +738 724 -1.315380302376542e-02 +738 725 -1.585023865775520e-02 +738 726 -1.939104886145118e-02 +738 727 -2.415034675252897e-02 +738 728 -3.072751892616544e-02 +738 729 -4.012781031912974e-02 +738 730 -5.413421453123138e-02 +738 731 -7.613960933881136e-02 +738 732 -1.132183869282775e-01 +738 733 -1.820810586422663e-01 +738 734 -3.301555353436761e-01 +738 735 -7.412185823610240e-01 +738 736 -3.165206906282872e+00 +738 737 -1.502055215863993e+01 +738 739 -1.502055215858811e+01 +738 740 -3.165206906282894e+00 +738 741 -7.412185823610200e-01 +738 742 -3.301555353436764e-01 +738 743 -1.820810586422646e-01 +738 744 -1.132183869282761e-01 +738 745 -7.613960933881207e-02 +738 746 -5.413421453123204e-02 +738 747 -4.012781031912976e-02 +738 748 -3.072751892616530e-02 +738 749 -2.415034675252897e-02 +738 750 -1.939104886145118e-02 +738 751 -1.585023865775532e-02 +738 752 -1.315380302376550e-02 +738 753 -1.105916272470022e-02 +738 754 -9.403863770832825e-03 +738 755 -8.076052134892604e-03 +738 756 -6.996835383339623e-03 +738 757 -6.109381318875727e-03 +738 758 -5.371977266379786e-03 +738 759 -4.753493624956893e-03 +738 760 -4.230349322908507e-03 +738 761 -3.784439171232916e-03 +738 762 -3.401691470521392e-03 +738 763 -3.071047067257377e-03 +738 764 -2.783725492315665e-03 +738 765 -2.532689975072673e-03 +738 766 -2.312252367280535e-03 +738 767 -2.117777896667784e-03 +739 739 3.988394278151443e+01 +739 720 -6.109381318875733e-03 +739 721 -6.996835383339702e-03 +739 722 -8.076052134892594e-03 +739 723 -9.403863770832811e-03 +739 724 -1.105916272470025e-02 +739 725 -1.315380302376546e-02 +739 726 -1.585023865775536e-02 +739 727 -1.939104886145118e-02 +739 728 -2.415034675252906e-02 +739 729 -3.072751892616543e-02 +739 730 -4.012781031912993e-02 +739 731 -5.413421453123171e-02 +739 732 -7.613960933881253e-02 +739 733 -1.132183869282771e-01 +739 734 -1.820810586422667e-01 +739 735 -3.301555353436803e-01 +739 736 -7.412185823610299e-01 +739 737 -3.165206906282883e+00 +739 738 -1.502055215858811e+01 +739 740 -1.502055215859648e+01 +739 741 -3.165206906282846e+00 +739 742 -7.412185823610062e-01 +739 743 -3.301555353436725e-01 +739 744 -1.820810586422653e-01 +739 745 -1.132183869282786e-01 +739 746 -7.613960933881188e-02 +739 747 -5.413421453123109e-02 +739 748 -4.012781031912954e-02 +739 749 -3.072751892616529e-02 +739 750 -2.415034675252896e-02 +739 751 -1.939104886145111e-02 +739 752 -1.585023865775526e-02 +739 753 -1.315380302376538e-02 +739 754 -1.105916272470022e-02 +739 755 -9.403863770832827e-03 +739 756 -8.076052134892564e-03 +739 757 -6.996835383339671e-03 +739 758 -6.109381318875748e-03 +739 759 -5.371977266379819e-03 +739 760 -4.753493624956880e-03 +739 761 -4.230349322908531e-03 +739 762 -3.784439171232936e-03 +739 763 -3.401691470521384e-03 +739 764 -3.071047067257392e-03 +739 765 -2.783725492315671e-03 +739 766 -2.532689975072684e-03 +739 767 -2.312252367280530e-03 +740 740 3.988394278151357e+01 +740 720 -5.371977266379788e-03 +740 721 -6.109381318875769e-03 +740 722 -6.996835383339674e-03 +740 723 -8.076052134892582e-03 +740 724 -9.403863770832814e-03 +740 725 -1.105916272470026e-02 +740 726 -1.315380302376555e-02 +740 727 -1.585023865775532e-02 +740 728 -1.939104886145119e-02 +740 729 -2.415034675252897e-02 +740 730 -3.072751892616544e-02 +740 731 -4.012781031912998e-02 +740 732 -5.413421453123234e-02 +740 733 -7.613960933881174e-02 +740 734 -1.132183869282766e-01 +740 735 -1.820810586422639e-01 +740 736 -3.301555353436779e-01 +740 737 -7.412185823610314e-01 +740 738 -3.165206906282894e+00 +740 739 -1.502055215859648e+01 +740 741 -1.502055215859223e+01 +740 742 -3.165206906282868e+00 +740 743 -7.412185823610196e-01 +740 744 -3.301555353436755e-01 +740 745 -1.820810586422691e-01 +740 746 -1.132183869282785e-01 +740 747 -7.613960933881112e-02 +740 748 -5.413421453123106e-02 +740 749 -4.012781031912974e-02 +740 750 -3.072751892616542e-02 +740 751 -2.415034675252897e-02 +740 752 -1.939104886145110e-02 +740 753 -1.585023865775514e-02 +740 754 -1.315380302376542e-02 +740 755 -1.105916272470025e-02 +740 756 -9.403863770832814e-03 +740 757 -8.076052134892582e-03 +740 758 -6.996835383339674e-03 +740 759 -6.109381318875769e-03 +740 760 -5.371977266379790e-03 +740 761 -4.753493624956895e-03 +740 762 -4.230349322908543e-03 +740 763 -3.784439171232917e-03 +740 764 -3.401691470521394e-03 +740 765 -3.071047067257393e-03 +740 766 -2.783725492315679e-03 +740 767 -2.532689975072674e-03 +741 741 3.988394278152492e+01 +741 720 -4.753493624956895e-03 +741 721 -5.371977266379837e-03 +741 722 -6.109381318875769e-03 +741 723 -6.996835383339698e-03 +741 724 -8.076052134892594e-03 +741 725 -9.403863770832830e-03 +741 726 -1.105916272470032e-02 +741 727 -1.315380302376550e-02 +741 728 -1.585023865775531e-02 +741 729 -1.939104886145111e-02 +741 730 -2.415034675252896e-02 +741 731 -3.072751892616545e-02 +741 732 -4.012781031913035e-02 +741 733 -5.413421453123204e-02 +741 734 -7.613960933881189e-02 +741 735 -1.132183869282760e-01 +741 736 -1.820810586422619e-01 +741 737 -3.301555353436736e-01 +741 738 -7.412185823610200e-01 +741 739 -3.165206906282846e+00 +741 740 -1.502055215859223e+01 +741 742 -1.502055215860528e+01 +741 743 -3.165206906282871e+00 +741 744 -7.412185823610254e-01 +741 745 -3.301555353436815e-01 +741 746 -1.820810586422678e-01 +741 747 -1.132183869282757e-01 +741 748 -7.613960933881100e-02 +741 749 -5.413421453123141e-02 +741 750 -4.012781031912996e-02 +741 751 -3.072751892616545e-02 +741 752 -2.415034675252897e-02 +741 753 -1.939104886145097e-02 +741 754 -1.585023865775520e-02 +741 755 -1.315380302376546e-02 +741 756 -1.105916272470026e-02 +741 757 -9.403863770832816e-03 +741 758 -8.076052134892557e-03 +741 759 -6.996835383339673e-03 +741 760 -6.109381318875710e-03 +741 761 -5.371977266379788e-03 +741 762 -4.753493624956895e-03 +741 763 -4.230349322908508e-03 +741 764 -3.784439171232917e-03 +741 765 -3.401691470521385e-03 +741 766 -3.071047067257393e-03 +741 767 -2.783725492315660e-03 +742 742 3.988394278128561e+01 +742 720 -4.230349322908508e-03 +742 721 -4.753493624956895e-03 +742 722 -5.371977266379790e-03 +742 723 -6.109381318875730e-03 +742 724 -6.996835383339623e-03 +742 725 -8.076052134892554e-03 +742 726 -9.403863770832813e-03 +742 727 -1.105916272470022e-02 +742 728 -1.315380302376542e-02 +742 729 -1.585023865775514e-02 +742 730 -1.939104886145096e-02 +742 731 -2.415034675252878e-02 +742 732 -3.072751892616544e-02 +742 733 -4.012781031912978e-02 +742 734 -5.413421453123111e-02 +742 735 -7.613960933881085e-02 +742 736 -1.132183869282741e-01 +742 737 -1.820810586422642e-01 +742 738 -3.301555353436764e-01 +742 739 -7.412185823610062e-01 +742 740 -3.165206906282868e+00 +742 741 -1.502055215860528e+01 +742 743 -1.502055215840049e+01 +742 744 -3.165206906282874e+00 +742 745 -7.412185823610385e-01 +742 746 -3.301555353436813e-01 +742 747 -1.820810586422636e-01 +742 748 -1.132183869282765e-01 +742 749 -7.613960933881189e-02 +742 750 -5.413421453123230e-02 +742 751 -4.012781031913037e-02 +742 752 -3.072751892616572e-02 +742 753 -2.415034675252897e-02 +742 754 -1.939104886145118e-02 +742 755 -1.585023865775536e-02 +742 756 -1.315380302376555e-02 +742 757 -1.105916272470032e-02 +742 758 -9.403863770832828e-03 +742 759 -8.076052134892649e-03 +742 760 -6.996835383339673e-03 +742 761 -6.109381318875769e-03 +742 762 -5.371977266379837e-03 +742 763 -4.753493624956895e-03 +742 764 -4.230349322908543e-03 +742 765 -3.784439171232937e-03 +742 766 -3.401691470521411e-03 +742 767 -3.071047067257393e-03 +743 743 3.988394278105613e+01 +743 720 -3.784439171232917e-03 +743 721 -4.230349322908543e-03 +743 722 -4.753493624956895e-03 +743 723 -5.371977266379805e-03 +743 724 -6.109381318875727e-03 +743 725 -6.996835383339671e-03 +743 726 -8.076052134892592e-03 +743 727 -9.403863770832825e-03 +743 728 -1.105916272470025e-02 +743 729 -1.315380302376542e-02 +743 730 -1.585023865775520e-02 +743 731 -1.939104886145103e-02 +743 732 -2.415034675252906e-02 +743 733 -3.072751892616544e-02 +743 734 -4.012781031912974e-02 +743 735 -5.413421453123138e-02 +743 736 -7.613960933881070e-02 +743 737 -1.132183869282759e-01 +743 738 -1.820810586422646e-01 +743 739 -3.301555353436725e-01 +743 740 -7.412185823610196e-01 +743 741 -3.165206906282871e+00 +743 742 -1.502055215840049e+01 +743 744 -1.502055215835487e+01 +743 745 -3.165206906282896e+00 +743 746 -7.412185823610196e-01 +743 747 -3.301555353436733e-01 +743 748 -1.820810586422651e-01 +743 749 -1.132183869282758e-01 +743 750 -7.613960933881156e-02 +743 751 -5.413421453123205e-02 +743 752 -4.012781031913017e-02 +743 753 -3.072751892616531e-02 +743 754 -2.415034675252897e-02 +743 755 -1.939104886145118e-02 +743 756 -1.585023865775532e-02 +743 757 -1.315380302376550e-02 +743 758 -1.105916272470022e-02 +743 759 -9.403863770832840e-03 +743 760 -8.076052134892578e-03 +743 761 -6.996835383339674e-03 +743 762 -6.109381318875769e-03 +743 763 -5.371977266379790e-03 +743 764 -4.753493624956895e-03 +743 765 -4.230349322908531e-03 +743 766 -3.784439171232937e-03 +743 767 -3.401691470521385e-03 +744 744 3.988394278102304e+01 +744 720 -3.401691470521385e-03 +744 721 -3.784439171232937e-03 +744 722 -4.230349322908531e-03 +744 723 -4.753493624956895e-03 +744 724 -5.371977266379786e-03 +744 725 -6.109381318875748e-03 +744 726 -6.996835383339674e-03 +744 727 -8.076052134892578e-03 +744 728 -9.403863770832854e-03 +744 729 -1.105916272470025e-02 +744 730 -1.315380302376546e-02 +744 731 -1.585023865775526e-02 +744 732 -1.939104886145125e-02 +744 733 -2.415034675252906e-02 +744 734 -3.072751892616543e-02 +744 735 -4.012781031912993e-02 +744 736 -5.413421453123171e-02 +744 737 -7.613960933881236e-02 +744 738 -1.132183869282761e-01 +744 739 -1.820810586422653e-01 +744 740 -3.301555353436755e-01 +744 741 -7.412185823610254e-01 +744 742 -3.165206906282874e+00 +744 743 -1.502055215835487e+01 +744 745 -1.502055215836227e+01 +744 746 -3.165206906282837e+00 +744 747 -7.412185823610160e-01 +744 748 -3.301555353436762e-01 +744 749 -1.820810586422642e-01 +744 750 -1.132183869282744e-01 +744 751 -7.613960933881139e-02 +744 752 -5.413421453123172e-02 +744 753 -4.012781031912956e-02 +744 754 -3.072751892616529e-02 +744 755 -2.415034675252896e-02 +744 756 -1.939104886145111e-02 +744 757 -1.585023865775526e-02 +744 758 -1.315380302376538e-02 +744 759 -1.105916272470022e-02 +744 760 -9.403863770832811e-03 +744 761 -8.076052134892582e-03 +744 762 -6.996835383339698e-03 +744 763 -6.109381318875730e-03 +744 764 -5.371977266379805e-03 +744 765 -4.753493624956895e-03 +744 766 -4.230349322908543e-03 +744 767 -3.784439171232917e-03 +745 745 3.988394278106475e+01 +745 720 -3.071047067257394e-03 +745 721 -3.401691470521412e-03 +745 722 -3.784439171232939e-03 +745 723 -4.230349322908545e-03 +745 724 -4.753493624956895e-03 +745 725 -5.371977266379821e-03 +745 726 -6.109381318875771e-03 +745 727 -6.996835383339677e-03 +745 728 -8.076052134892655e-03 +745 729 -9.403863770832833e-03 +745 730 -1.105916272470025e-02 +745 731 -1.315380302376547e-02 +745 732 -1.585023865775537e-02 +745 733 -1.939104886145119e-02 +745 734 -2.415034675252897e-02 +745 735 -3.072751892616544e-02 +745 736 -4.012781031912998e-02 +745 737 -5.413421453123234e-02 +745 738 -7.613960933881207e-02 +745 739 -1.132183869282786e-01 +745 740 -1.820810586422691e-01 +745 741 -3.301555353436815e-01 +745 742 -7.412185823610385e-01 +745 743 -3.165206906282896e+00 +745 744 -1.502055215836227e+01 +745 746 -1.502055215839528e+01 +745 747 -3.165206906282883e+00 +745 748 -7.412185823610220e-01 +745 749 -3.301555353436710e-01 +745 750 -1.820810586422600e-01 +745 751 -1.132183869282749e-01 +745 752 -7.613960933881167e-02 +745 753 -5.413421453123109e-02 +745 754 -4.012781031912974e-02 +745 755 -3.072751892616542e-02 +745 756 -2.415034675252897e-02 +745 757 -1.939104886145110e-02 +745 758 -1.585023865775514e-02 +745 759 -1.315380302376542e-02 +745 760 -1.105916272470025e-02 +745 761 -9.403863770832814e-03 +745 762 -8.076052134892594e-03 +745 763 -6.996835383339623e-03 +745 764 -6.109381318875727e-03 +745 765 -5.371977266379786e-03 +745 766 -4.753493624956893e-03 +745 767 -4.230349322908507e-03 +746 746 3.988394278115155e+01 +746 720 -2.783725492315667e-03 +746 721 -3.071047067257401e-03 +746 722 -3.401691470521395e-03 +746 723 -3.784439171232929e-03 +746 724 -4.230349322908520e-03 +746 725 -4.753493624956896e-03 +746 726 -5.371977266379809e-03 +746 727 -6.109381318875733e-03 +746 728 -6.996835383339702e-03 +746 729 -8.076052134892583e-03 +746 730 -9.403863770832813e-03 +746 731 -1.105916272470026e-02 +746 732 -1.315380302376555e-02 +746 733 -1.585023865775531e-02 +746 734 -1.939104886145111e-02 +746 735 -2.415034675252896e-02 +746 736 -3.072751892616545e-02 +746 737 -4.012781031913035e-02 +746 738 -5.413421453123204e-02 +746 739 -7.613960933881188e-02 +746 740 -1.132183869282785e-01 +746 741 -1.820810586422678e-01 +746 742 -3.301555353436813e-01 +746 743 -7.412185823610196e-01 +746 744 -3.165206906282837e+00 +746 745 -1.502055215839528e+01 +746 747 -1.502055215844922e+01 +746 748 -3.165206906282882e+00 +746 749 -7.412185823610207e-01 +746 750 -3.301555353436728e-01 +746 751 -1.820810586422639e-01 +746 752 -1.132183869282771e-01 +746 753 -7.613960933881120e-02 +746 754 -5.413421453123141e-02 +746 755 -4.012781031912996e-02 +746 756 -3.072751892616545e-02 +746 757 -2.415034675252897e-02 +746 758 -1.939104886145097e-02 +746 759 -1.585023865775520e-02 +746 760 -1.315380302376546e-02 +746 761 -1.105916272470026e-02 +746 762 -9.403863770832830e-03 +746 763 -8.076052134892554e-03 +746 764 -6.996835383339671e-03 +746 765 -6.109381318875748e-03 +746 766 -5.371977266379819e-03 +746 767 -4.753493624956880e-03 +747 747 3.988394278128114e+01 +747 720 -2.532689975072674e-03 +747 721 -2.783725492315679e-03 +747 722 -3.071047067257393e-03 +747 723 -3.401691470521394e-03 +747 724 -3.784439171232916e-03 +747 725 -4.230349322908531e-03 +747 726 -4.753493624956895e-03 +747 727 -5.371977266379788e-03 +747 728 -6.109381318875769e-03 +747 729 -6.996835383339674e-03 +747 730 -8.076052134892570e-03 +747 731 -9.403863770832771e-03 +747 732 -1.105916272470025e-02 +747 733 -1.315380302376542e-02 +747 734 -1.585023865775514e-02 +747 735 -1.939104886145095e-02 +747 736 -2.415034675252877e-02 +747 737 -3.072751892616543e-02 +747 738 -4.012781031912976e-02 +747 739 -5.413421453123109e-02 +747 740 -7.613960933881112e-02 +747 741 -1.132183869282757e-01 +747 742 -1.820810586422636e-01 +747 743 -3.301555353436733e-01 +747 744 -7.412185823610160e-01 +747 745 -3.165206906282883e+00 +747 746 -1.502055215844922e+01 +747 748 -1.502055215852561e+01 +747 749 -3.165206906282859e+00 +747 750 -7.412185823610249e-01 +747 751 -3.301555353436809e-01 +747 752 -1.820810586422688e-01 +747 753 -1.132183869282795e-01 +747 754 -7.613960933881207e-02 +747 755 -5.413421453123234e-02 +747 756 -4.012781031913039e-02 +747 757 -3.072751892616573e-02 +747 758 -2.415034675252898e-02 +747 759 -1.939104886145118e-02 +747 760 -1.585023865775537e-02 +747 761 -1.315380302376555e-02 +747 762 -1.105916272470032e-02 +747 763 -9.403863770832814e-03 +747 764 -8.076052134892592e-03 +747 765 -6.996835383339674e-03 +747 766 -6.109381318875769e-03 +747 767 -5.371977266379790e-03 +748 748 3.988394278146365e+01 +748 720 -2.312252367280536e-03 +748 721 -2.532689975072691e-03 +748 722 -2.783725492315679e-03 +748 723 -3.071047067257401e-03 +748 724 -3.401691470521392e-03 +748 725 -3.784439171232936e-03 +748 726 -4.230349322908543e-03 +748 727 -4.753493624956895e-03 +748 728 -5.371977266379837e-03 +748 729 -6.109381318875769e-03 +748 730 -6.996835383339698e-03 +748 731 -8.076052134892582e-03 +748 732 -9.403863770832825e-03 +748 733 -1.105916272470022e-02 +748 734 -1.315380302376537e-02 +748 735 -1.585023865775514e-02 +748 736 -1.939104886145096e-02 +748 737 -2.415034675252896e-02 +748 738 -3.072751892616530e-02 +748 739 -4.012781031912954e-02 +748 740 -5.413421453123106e-02 +748 741 -7.613960933881100e-02 +748 742 -1.132183869282765e-01 +748 743 -1.820810586422651e-01 +748 744 -3.301555353436762e-01 +748 745 -7.412185823610220e-01 +748 746 -3.165206906282882e+00 +748 747 -1.502055215852561e+01 +748 749 -1.502055215863308e+01 +748 750 -3.165206906282860e+00 +748 751 -7.412185823610180e-01 +748 752 -3.301555353436755e-01 +748 753 -1.820810586422672e-01 +748 754 -1.132183869282766e-01 +748 755 -7.613960933881253e-02 +748 756 -5.413421453123236e-02 +748 757 -4.012781031913037e-02 +748 758 -3.072751892616545e-02 +748 759 -2.415034675252906e-02 +748 760 -1.939104886145125e-02 +748 761 -1.585023865775537e-02 +748 762 -1.315380302376555e-02 +748 763 -1.105916272470025e-02 +748 764 -9.403863770832839e-03 +748 765 -8.076052134892578e-03 +748 766 -6.996835383339673e-03 +748 767 -6.109381318875710e-03 +749 749 3.988394278171944e+01 +749 720 -2.117777896667785e-03 +749 721 -2.312252367280536e-03 +749 722 -2.532689975072674e-03 +749 723 -2.783725492315666e-03 +749 724 -3.071047067257377e-03 +749 725 -3.401691470521384e-03 +749 726 -3.784439171232917e-03 +749 727 -4.230349322908508e-03 +749 728 -4.753493624956895e-03 +749 729 -5.371977266379790e-03 +749 730 -6.109381318875730e-03 +749 731 -6.996835383339623e-03 +749 732 -8.076052134892575e-03 +749 733 -9.403863770832825e-03 +749 734 -1.105916272470022e-02 +749 735 -1.315380302376542e-02 +749 736 -1.585023865775520e-02 +749 737 -1.939104886145118e-02 +749 738 -2.415034675252897e-02 +749 739 -3.072751892616529e-02 +749 740 -4.012781031912974e-02 +749 741 -5.413421453123141e-02 +749 742 -7.613960933881189e-02 +749 743 -1.132183869282758e-01 +749 744 -1.820810586422642e-01 +749 745 -3.301555353436710e-01 +749 746 -7.412185823610207e-01 +749 747 -3.165206906282859e+00 +749 748 -1.502055215863308e+01 +749 750 -1.502055215878366e+01 +749 751 -3.165206906282814e+00 +749 752 -7.412185823610159e-01 +749 753 -3.301555353436738e-01 +749 754 -1.820810586422659e-01 +749 755 -1.132183869282771e-01 +749 756 -7.613960933881195e-02 +749 757 -5.413421453123204e-02 +749 758 -4.012781031912978e-02 +749 759 -3.072751892616544e-02 +749 760 -2.415034675252906e-02 +749 761 -1.939104886145119e-02 +749 762 -1.585023865775531e-02 +749 763 -1.315380302376542e-02 +749 764 -1.105916272470025e-02 +749 765 -9.403863770832854e-03 +749 766 -8.076052134892651e-03 +749 767 -6.996835383339673e-03 +750 750 3.988394278208155e+01 +750 720 -1.945462087124849e-03 +750 721 -2.117777896667799e-03 +750 722 -2.312252367280536e-03 +750 723 -2.532689975072680e-03 +750 724 -2.783725492315665e-03 +750 725 -3.071047067257392e-03 +750 726 -3.401691470521394e-03 +750 727 -3.784439171232917e-03 +750 728 -4.230349322908543e-03 +750 729 -4.753493624956895e-03 +750 730 -5.371977266379805e-03 +750 731 -6.109381318875727e-03 +750 732 -6.996835383339671e-03 +750 733 -8.076052134892592e-03 +750 734 -9.403863770832811e-03 +750 735 -1.105916272470025e-02 +750 736 -1.315380302376546e-02 +750 737 -1.585023865775536e-02 +750 738 -1.939104886145118e-02 +750 739 -2.415034675252896e-02 +750 740 -3.072751892616542e-02 +750 741 -4.012781031912996e-02 +750 742 -5.413421453123230e-02 +750 743 -7.613960933881156e-02 +750 744 -1.132183869282744e-01 +750 745 -1.820810586422600e-01 +750 746 -3.301555353436728e-01 +750 747 -7.412185823610249e-01 +750 748 -3.165206906282860e+00 +750 749 -1.502055215878366e+01 +750 751 -1.502055215899854e+01 +750 752 -3.165206906282879e+00 +750 753 -7.412185823610216e-01 +750 754 -3.301555353436779e-01 +750 755 -1.820810586422674e-01 +750 756 -1.132183869282775e-01 +750 757 -7.613960933881170e-02 +750 758 -5.413421453123111e-02 +750 759 -4.012781031912974e-02 +750 760 -3.072751892616543e-02 +750 761 -2.415034675252897e-02 +750 762 -1.939104886145111e-02 +750 763 -1.585023865775514e-02 +750 764 -1.315380302376542e-02 +750 765 -1.105916272470025e-02 +750 766 -9.403863770832832e-03 +750 767 -8.076052134892568e-03 +751 751 3.988394278260300e+01 +751 720 -1.792160480940035e-03 +751 721 -1.945462087124857e-03 +751 722 -2.117777896667794e-03 +751 723 -2.312252367280536e-03 +751 724 -2.532689975072673e-03 +751 725 -2.783725492315671e-03 +751 726 -3.071047067257393e-03 +751 727 -3.401691470521385e-03 +751 728 -3.784439171232937e-03 +751 729 -4.230349322908531e-03 +751 730 -4.753493624956895e-03 +751 731 -5.371977266379786e-03 +751 732 -6.109381318875748e-03 +751 733 -6.996835383339674e-03 +751 734 -8.076052134892568e-03 +751 735 -9.403863770832830e-03 +751 736 -1.105916272470026e-02 +751 737 -1.315380302376555e-02 +751 738 -1.585023865775532e-02 +751 739 -1.939104886145111e-02 +751 740 -2.415034675252897e-02 +751 741 -3.072751892616545e-02 +751 742 -4.012781031913037e-02 +751 743 -5.413421453123205e-02 +751 744 -7.613960933881139e-02 +751 745 -1.132183869282749e-01 +751 746 -1.820810586422639e-01 +751 747 -3.301555353436809e-01 +751 748 -7.412185823610180e-01 +751 749 -3.165206906282814e+00 +751 750 -1.502055215899854e+01 +751 752 -1.502055215931073e+01 +751 753 -3.165206906282869e+00 +751 754 -7.412185823610240e-01 +751 755 -3.301555353436742e-01 +751 756 -1.820810586422644e-01 +751 757 -1.132183869282751e-01 +751 758 -7.613960933881084e-02 +751 759 -5.413421453123138e-02 +751 760 -4.012781031912993e-02 +751 761 -3.072751892616544e-02 +751 762 -2.415034675252896e-02 +751 763 -1.939104886145096e-02 +751 764 -1.585023865775520e-02 +751 765 -1.315380302376546e-02 +751 766 -1.105916272470025e-02 +751 767 -9.403863770832813e-03 +752 752 3.988394278260299e+01 +752 736 -9.403863770832833e-03 +752 737 -1.105916272470032e-02 +752 738 -1.315380302376550e-02 +752 739 -1.585023865775526e-02 +752 740 -1.939104886145110e-02 +752 741 -2.415034675252897e-02 +752 742 -3.072751892616572e-02 +752 743 -4.012781031913017e-02 +752 744 -5.413421453123172e-02 +752 745 -7.613960933881167e-02 +752 746 -1.132183869282771e-01 +752 747 -1.820810586422688e-01 +752 748 -3.301555353436755e-01 +752 749 -7.412185823610159e-01 +752 750 -3.165206906282879e+00 +752 751 -1.502055215931073e+01 +752 753 -1.502055215899847e+01 +752 754 -3.165206906282857e+00 +752 755 -7.412185823610267e-01 +752 756 -3.301555353436787e-01 +752 757 -1.820810586422615e-01 +752 758 -1.132183869282740e-01 +752 759 -7.613960933881070e-02 +752 760 -5.413421453123171e-02 +752 761 -4.012781031912998e-02 +752 762 -3.072751892616545e-02 +752 763 -2.415034675252878e-02 +752 764 -1.939104886145103e-02 +752 765 -1.585023865775526e-02 +752 766 -1.315380302376547e-02 +752 767 -1.105916272470026e-02 +752 768 -9.403863770832771e-03 +752 769 -8.076052134892582e-03 +752 770 -6.996835383339623e-03 +752 771 -6.109381318875727e-03 +752 772 -5.371977266379786e-03 +752 773 -4.753493624956893e-03 +752 774 -4.230349322908507e-03 +752 775 -3.784439171232916e-03 +752 776 -3.401691470521392e-03 +752 777 -3.071047067257377e-03 +752 778 -2.783725492315665e-03 +752 779 -2.532689975072673e-03 +752 780 -2.312252367280535e-03 +752 781 -2.117777896667784e-03 +752 782 -1.945462087124849e-03 +752 783 -1.792160480940034e-03 +753 753 3.988394278208165e+01 +753 736 -8.076052134892573e-03 +753 737 -9.403863770832813e-03 +753 738 -1.105916272470022e-02 +753 739 -1.315380302376538e-02 +753 740 -1.585023865775514e-02 +753 741 -1.939104886145097e-02 +753 742 -2.415034675252897e-02 +753 743 -3.072751892616531e-02 +753 744 -4.012781031912956e-02 +753 745 -5.413421453123109e-02 +753 746 -7.613960933881120e-02 +753 747 -1.132183869282795e-01 +753 748 -1.820810586422672e-01 +753 749 -3.301555353436738e-01 +753 750 -7.412185823610216e-01 +753 751 -3.165206906282869e+00 +753 752 -1.502055215899847e+01 +753 754 -1.502055215878381e+01 +753 755 -3.165206906282875e+00 +753 756 -7.412185823610342e-01 +753 757 -3.301555353436778e-01 +753 758 -1.820810586422620e-01 +753 759 -1.132183869282750e-01 +753 760 -7.613960933881217e-02 +753 761 -5.413421453123234e-02 +753 762 -4.012781031913035e-02 +753 763 -3.072751892616544e-02 +753 764 -2.415034675252906e-02 +753 765 -1.939104886145125e-02 +753 766 -1.585023865775537e-02 +753 767 -1.315380302376555e-02 +753 768 -1.105916272470025e-02 +753 769 -9.403863770832825e-03 +753 770 -8.076052134892575e-03 +753 771 -6.996835383339671e-03 +753 772 -6.109381318875748e-03 +753 773 -5.371977266379819e-03 +753 774 -4.753493624956880e-03 +753 775 -4.230349322908531e-03 +753 776 -3.784439171232936e-03 +753 777 -3.401691470521384e-03 +753 778 -3.071047067257392e-03 +753 779 -2.783725492315671e-03 +753 780 -2.532689975072684e-03 +753 781 -2.312252367280530e-03 +753 782 -2.117777896667793e-03 +753 783 -1.945462087124852e-03 +754 754 3.988394278171947e+01 +754 736 -6.996835383339674e-03 +754 737 -8.076052134892592e-03 +754 738 -9.403863770832825e-03 +754 739 -1.105916272470022e-02 +754 740 -1.315380302376542e-02 +754 741 -1.585023865775520e-02 +754 742 -1.939104886145118e-02 +754 743 -2.415034675252897e-02 +754 744 -3.072751892616529e-02 +754 745 -4.012781031912974e-02 +754 746 -5.413421453123141e-02 +754 747 -7.613960933881207e-02 +754 748 -1.132183869282766e-01 +754 749 -1.820810586422659e-01 +754 750 -3.301555353436779e-01 +754 751 -7.412185823610240e-01 +754 752 -3.165206906282857e+00 +754 753 -1.502055215878381e+01 +754 755 -1.502055215863285e+01 +754 756 -3.165206906282887e+00 +754 757 -7.412185823610357e-01 +754 758 -3.301555353436746e-01 +754 759 -1.820810586422651e-01 +754 760 -1.132183869282771e-01 +754 761 -7.613960933881228e-02 +754 762 -5.413421453123204e-02 +754 763 -4.012781031912978e-02 +754 764 -3.072751892616544e-02 +754 765 -2.415034675252906e-02 +754 766 -1.939104886145119e-02 +754 767 -1.585023865775531e-02 +754 768 -1.315380302376542e-02 +754 769 -1.105916272470022e-02 +754 770 -9.403863770832825e-03 +754 771 -8.076052134892592e-03 +754 772 -6.996835383339674e-03 +754 773 -6.109381318875769e-03 +754 774 -5.371977266379790e-03 +754 775 -4.753493624956895e-03 +754 776 -4.230349322908543e-03 +754 777 -3.784439171232917e-03 +754 778 -3.401691470521394e-03 +754 779 -3.071047067257393e-03 +754 780 -2.783725492315679e-03 +754 781 -2.532689975072674e-03 +754 782 -2.312252367280536e-03 +754 783 -2.117777896667793e-03 +755 755 3.988394278146374e+01 +755 736 -6.109381318875769e-03 +755 737 -6.996835383339698e-03 +755 738 -8.076052134892604e-03 +755 739 -9.403863770832827e-03 +755 740 -1.105916272470025e-02 +755 741 -1.315380302376546e-02 +755 742 -1.585023865775536e-02 +755 743 -1.939104886145118e-02 +755 744 -2.415034675252896e-02 +755 745 -3.072751892616542e-02 +755 746 -4.012781031912996e-02 +755 747 -5.413421453123234e-02 +755 748 -7.613960933881253e-02 +755 749 -1.132183869282771e-01 +755 750 -1.820810586422674e-01 +755 751 -3.301555353436742e-01 +755 752 -7.412185823610267e-01 +755 753 -3.165206906282875e+00 +755 754 -1.502055215863285e+01 +755 756 -1.502055215852591e+01 +755 757 -3.165206906282892e+00 +755 758 -7.412185823610152e-01 +755 759 -3.301555353436725e-01 +755 760 -1.820810586422664e-01 +755 761 -1.132183869282785e-01 +755 762 -7.613960933881186e-02 +755 763 -5.413421453123111e-02 +755 764 -4.012781031912974e-02 +755 765 -3.072751892616543e-02 +755 766 -2.415034675252897e-02 +755 767 -1.939104886145111e-02 +755 768 -1.585023865775514e-02 +755 769 -1.315380302376537e-02 +755 770 -1.105916272470022e-02 +755 771 -9.403863770832811e-03 +755 772 -8.076052134892568e-03 +755 773 -6.996835383339673e-03 +755 774 -6.109381318875710e-03 +755 775 -5.371977266379788e-03 +755 776 -4.753493624956895e-03 +755 777 -4.230349322908508e-03 +755 778 -3.784439171232917e-03 +755 779 -3.401691470521385e-03 +755 780 -3.071047067257393e-03 +755 781 -2.783725492315660e-03 +755 782 -2.532689975072674e-03 +755 783 -2.312252367280530e-03 +756 756 3.988394278128112e+01 +756 736 -5.371977266379790e-03 +756 737 -6.109381318875730e-03 +756 738 -6.996835383339623e-03 +756 739 -8.076052134892564e-03 +756 740 -9.403863770832814e-03 +756 741 -1.105916272470026e-02 +756 742 -1.315380302376555e-02 +756 743 -1.585023865775532e-02 +756 744 -1.939104886145111e-02 +756 745 -2.415034675252897e-02 +756 746 -3.072751892616545e-02 +756 747 -4.012781031913039e-02 +756 748 -5.413421453123236e-02 +756 749 -7.613960933881195e-02 +756 750 -1.132183869282775e-01 +756 751 -1.820810586422644e-01 +756 752 -3.301555353436787e-01 +756 753 -7.412185823610342e-01 +756 754 -3.165206906282887e+00 +756 755 -1.502055215852591e+01 +756 757 -1.502055215844893e+01 +756 758 -3.165206906282829e+00 +756 759 -7.412185823610042e-01 +756 760 -3.301555353436772e-01 +756 761 -1.820810586422683e-01 +756 762 -1.132183869282776e-01 +756 763 -7.613960933881117e-02 +756 764 -5.413421453123138e-02 +756 765 -4.012781031912993e-02 +756 766 -3.072751892616544e-02 +756 767 -2.415034675252896e-02 +756 768 -1.939104886145095e-02 +756 769 -1.585023865775514e-02 +756 770 -1.315380302376542e-02 +756 771 -1.105916272470025e-02 +756 772 -9.403863770832830e-03 +756 773 -8.076052134892639e-03 +756 774 -6.996835383339673e-03 +756 775 -6.109381318875769e-03 +756 776 -5.371977266379837e-03 +756 777 -4.753493624956895e-03 +756 778 -4.230349322908543e-03 +756 779 -3.784439171232937e-03 +756 780 -3.401691470521411e-03 +756 781 -3.071047067257393e-03 +756 782 -2.783725492315679e-03 +756 783 -2.532689975072684e-03 +757 757 3.988394278115149e+01 +757 736 -4.753493624956895e-03 +757 737 -5.371977266379805e-03 +757 738 -6.109381318875727e-03 +757 739 -6.996835383339671e-03 +757 740 -8.076052134892582e-03 +757 741 -9.403863770832816e-03 +757 742 -1.105916272470032e-02 +757 743 -1.315380302376550e-02 +757 744 -1.585023865775526e-02 +757 745 -1.939104886145110e-02 +757 746 -2.415034675252897e-02 +757 747 -3.072751892616573e-02 +757 748 -4.012781031913037e-02 +757 749 -5.413421453123204e-02 +757 750 -7.613960933881170e-02 +757 751 -1.132183869282751e-01 +757 752 -1.820810586422615e-01 +757 753 -3.301555353436778e-01 +757 754 -7.412185823610357e-01 +757 755 -3.165206906282892e+00 +757 756 -1.502055215844893e+01 +757 758 -1.502055215839547e+01 +757 759 -3.165206906282883e+00 +757 760 -7.412185823610260e-01 +757 761 -3.301555353436764e-01 +757 762 -1.820810586422683e-01 +757 763 -1.132183869282777e-01 +757 764 -7.613960933881123e-02 +757 765 -5.413421453123171e-02 +757 766 -4.012781031912998e-02 +757 767 -3.072751892616545e-02 +757 768 -2.415034675252877e-02 +757 769 -1.939104886145096e-02 +757 770 -1.585023865775520e-02 +757 771 -1.315380302376546e-02 +757 772 -1.105916272470026e-02 +757 773 -9.403863770832832e-03 +757 774 -8.076052134892557e-03 +757 775 -6.996835383339674e-03 +757 776 -6.109381318875769e-03 +757 777 -5.371977266379790e-03 +757 778 -4.753493624956895e-03 +757 779 -4.230349322908531e-03 +757 780 -3.784439171232937e-03 +757 781 -3.401691470521385e-03 +757 782 -3.071047067257393e-03 +757 783 -2.783725492315671e-03 +758 758 3.988394278106475e+01 +758 736 -4.230349322908531e-03 +758 737 -4.753493624956895e-03 +758 738 -5.371977266379786e-03 +758 739 -6.109381318875748e-03 +758 740 -6.996835383339674e-03 +758 741 -8.076052134892557e-03 +758 742 -9.403863770832828e-03 +758 743 -1.105916272470022e-02 +758 744 -1.315380302376538e-02 +758 745 -1.585023865775514e-02 +758 746 -1.939104886145097e-02 +758 747 -2.415034675252898e-02 +758 748 -3.072751892616545e-02 +758 749 -4.012781031912978e-02 +758 750 -5.413421453123111e-02 +758 751 -7.613960933881084e-02 +758 752 -1.132183869282740e-01 +758 753 -1.820810586422620e-01 +758 754 -3.301555353436746e-01 +758 755 -7.412185823610152e-01 +758 756 -3.165206906282829e+00 +758 757 -1.502055215839547e+01 +758 759 -1.502055215836219e+01 +758 760 -3.165206906282866e+00 +758 761 -7.412185823610273e-01 +758 762 -3.301555353436831e-01 +758 763 -1.820810586422666e-01 +758 764 -1.132183869282759e-01 +758 765 -7.613960933881238e-02 +758 766 -5.413421453123234e-02 +758 767 -4.012781031913035e-02 +758 768 -3.072751892616543e-02 +758 769 -2.415034675252896e-02 +758 770 -1.939104886145118e-02 +758 771 -1.585023865775536e-02 +758 772 -1.315380302376555e-02 +758 773 -1.105916272470032e-02 +758 774 -9.403863770832813e-03 +758 775 -8.076052134892592e-03 +758 776 -6.996835383339698e-03 +758 777 -6.109381318875730e-03 +758 778 -5.371977266379805e-03 +758 779 -4.753493624956895e-03 +758 780 -4.230349322908543e-03 +758 781 -3.784439171232917e-03 +758 782 -3.401691470521394e-03 +758 783 -3.071047067257392e-03 +759 759 3.988394278102305e+01 +759 736 -3.784439171232937e-03 +759 737 -4.230349322908543e-03 +759 738 -4.753493624956893e-03 +759 739 -5.371977266379819e-03 +759 740 -6.109381318875769e-03 +759 741 -6.996835383339673e-03 +759 742 -8.076052134892649e-03 +759 743 -9.403863770832840e-03 +759 744 -1.105916272470022e-02 +759 745 -1.315380302376542e-02 +759 746 -1.585023865775520e-02 +759 747 -1.939104886145118e-02 +759 748 -2.415034675252906e-02 +759 749 -3.072751892616544e-02 +759 750 -4.012781031912974e-02 +759 751 -5.413421453123138e-02 +759 752 -7.613960933881070e-02 +759 753 -1.132183869282750e-01 +759 754 -1.820810586422651e-01 +759 755 -3.301555353436725e-01 +759 756 -7.412185823610042e-01 +759 757 -3.165206906282883e+00 +759 758 -1.502055215836219e+01 +759 760 -1.502055215835491e+01 +759 761 -3.165206906282887e+00 +759 762 -7.412185823610448e-01 +759 763 -3.301555353436819e-01 +759 764 -1.820810586422640e-01 +759 765 -1.132183869282761e-01 +759 766 -7.613960933881180e-02 +759 767 -5.413421453123204e-02 +759 768 -4.012781031912976e-02 +759 769 -3.072751892616530e-02 +759 770 -2.415034675252897e-02 +759 771 -1.939104886145118e-02 +759 772 -1.585023865775532e-02 +759 773 -1.315380302376550e-02 +759 774 -1.105916272470022e-02 +759 775 -9.403863770832825e-03 +759 776 -8.076052134892608e-03 +759 777 -6.996835383339627e-03 +759 778 -6.109381318875730e-03 +759 779 -5.371977266379788e-03 +759 780 -4.753493624956895e-03 +759 781 -4.230349322908508e-03 +759 782 -3.784439171232917e-03 +759 783 -3.401691470521384e-03 +760 760 3.988394278105617e+01 +760 736 -3.401691470521385e-03 +760 737 -3.784439171232917e-03 +760 738 -4.230349322908507e-03 +760 739 -4.753493624956880e-03 +760 740 -5.371977266379790e-03 +760 741 -6.109381318875710e-03 +760 742 -6.996835383339673e-03 +760 743 -8.076052134892578e-03 +760 744 -9.403863770832811e-03 +760 745 -1.105916272470025e-02 +760 746 -1.315380302376546e-02 +760 747 -1.585023865775537e-02 +760 748 -1.939104886145125e-02 +760 749 -2.415034675252906e-02 +760 750 -3.072751892616543e-02 +760 751 -4.012781031912993e-02 +760 752 -5.413421453123171e-02 +760 753 -7.613960933881217e-02 +760 754 -1.132183869282771e-01 +760 755 -1.820810586422664e-01 +760 756 -3.301555353436772e-01 +760 757 -7.412185823610260e-01 +760 758 -3.165206906282866e+00 +760 759 -1.502055215835491e+01 +760 761 -1.502055215840047e+01 +760 762 -3.165206906282891e+00 +760 763 -7.412185823610213e-01 +760 764 -3.301555353436736e-01 +760 765 -1.820810586422631e-01 +760 766 -1.132183869282754e-01 +760 767 -7.613960933881117e-02 +760 768 -5.413421453123109e-02 +760 769 -4.012781031912954e-02 +760 770 -3.072751892616529e-02 +760 771 -2.415034675252896e-02 +760 772 -1.939104886145111e-02 +760 773 -1.585023865775526e-02 +760 774 -1.315380302376538e-02 +760 775 -1.105916272470022e-02 +760 776 -9.403863770832846e-03 +760 777 -8.076052134892597e-03 +760 778 -6.996835383339698e-03 +760 779 -6.109381318875769e-03 +760 780 -5.371977266379837e-03 +760 781 -4.753493624956895e-03 +760 782 -4.230349322908543e-03 +760 783 -3.784439171232936e-03 +761 761 3.988394278128560e+01 +761 736 -3.071047067257393e-03 +761 737 -3.401691470521394e-03 +761 738 -3.784439171232916e-03 +761 739 -4.230349322908531e-03 +761 740 -4.753493624956895e-03 +761 741 -5.371977266379788e-03 +761 742 -6.109381318875769e-03 +761 743 -6.996835383339674e-03 +761 744 -8.076052134892582e-03 +761 745 -9.403863770832814e-03 +761 746 -1.105916272470026e-02 +761 747 -1.315380302376555e-02 +761 748 -1.585023865775537e-02 +761 749 -1.939104886145119e-02 +761 750 -2.415034675252897e-02 +761 751 -3.072751892616544e-02 +761 752 -4.012781031912998e-02 +761 753 -5.413421453123234e-02 +761 754 -7.613960933881228e-02 +761 755 -1.132183869282785e-01 +761 756 -1.820810586422683e-01 +761 757 -3.301555353436764e-01 +761 758 -7.412185823610273e-01 +761 759 -3.165206906282887e+00 +761 760 -1.502055215840047e+01 +761 762 -1.502055215860531e+01 +761 763 -3.165206906282828e+00 +761 764 -7.412185823610130e-01 +761 765 -3.301555353436710e-01 +761 766 -1.820810586422626e-01 +761 767 -1.132183869282737e-01 +761 768 -7.613960933881021e-02 +761 769 -5.413421453123106e-02 +761 770 -4.012781031912974e-02 +761 771 -3.072751892616542e-02 +761 772 -2.415034675252897e-02 +761 773 -1.939104886145110e-02 +761 774 -1.585023865775514e-02 +761 775 -1.315380302376542e-02 +761 776 -1.105916272470025e-02 +761 777 -9.403863770832814e-03 +761 778 -8.076052134892582e-03 +761 779 -6.996835383339674e-03 +761 780 -6.109381318875769e-03 +761 781 -5.371977266379790e-03 +761 782 -4.753493624956895e-03 +761 783 -4.230349322908531e-03 +762 762 3.988394278152490e+01 +762 736 -2.783725492315679e-03 +762 737 -3.071047067257401e-03 +762 738 -3.401691470521392e-03 +762 739 -3.784439171232936e-03 +762 740 -4.230349322908543e-03 +762 741 -4.753493624956895e-03 +762 742 -5.371977266379837e-03 +762 743 -6.109381318875769e-03 +762 744 -6.996835383339698e-03 +762 745 -8.076052134892594e-03 +762 746 -9.403863770832830e-03 +762 747 -1.105916272470032e-02 +762 748 -1.315380302376555e-02 +762 749 -1.585023865775531e-02 +762 750 -1.939104886145111e-02 +762 751 -2.415034675252896e-02 +762 752 -3.072751892616545e-02 +762 753 -4.012781031913035e-02 +762 754 -5.413421453123204e-02 +762 755 -7.613960933881186e-02 +762 756 -1.132183869282776e-01 +762 757 -1.820810586422683e-01 +762 758 -3.301555353436831e-01 +762 759 -7.412185823610448e-01 +762 760 -3.165206906282891e+00 +762 761 -1.502055215860531e+01 +762 763 -1.502055215859212e+01 +762 764 -3.165206906282882e+00 +762 765 -7.412185823610169e-01 +762 766 -3.301555353436723e-01 +762 767 -1.820810586422613e-01 +762 768 -1.132183869282739e-01 +762 769 -7.613960933881100e-02 +762 770 -5.413421453123141e-02 +762 771 -4.012781031912996e-02 +762 772 -3.072751892616545e-02 +762 773 -2.415034675252897e-02 +762 774 -1.939104886145097e-02 +762 775 -1.585023865775520e-02 +762 776 -1.315380302376546e-02 +762 777 -1.105916272470026e-02 +762 778 -9.403863770832816e-03 +762 779 -8.076052134892557e-03 +762 780 -6.996835383339673e-03 +762 781 -6.109381318875710e-03 +762 782 -5.371977266379788e-03 +762 783 -4.753493624956881e-03 +763 763 3.988394278151353e+01 +763 736 -2.532689975072674e-03 +763 737 -2.783725492315666e-03 +763 738 -3.071047067257377e-03 +763 739 -3.401691470521384e-03 +763 740 -3.784439171232917e-03 +763 741 -4.230349322908508e-03 +763 742 -4.753493624956895e-03 +763 743 -5.371977266379790e-03 +763 744 -6.109381318875730e-03 +763 745 -6.996835383339623e-03 +763 746 -8.076052134892554e-03 +763 747 -9.403863770832814e-03 +763 748 -1.105916272470025e-02 +763 749 -1.315380302376542e-02 +763 750 -1.585023865775514e-02 +763 751 -1.939104886145096e-02 +763 752 -2.415034675252878e-02 +763 753 -3.072751892616544e-02 +763 754 -4.012781031912978e-02 +763 755 -5.413421453123111e-02 +763 756 -7.613960933881117e-02 +763 757 -1.132183869282777e-01 +763 758 -1.820810586422666e-01 +763 759 -3.301555353436819e-01 +763 760 -7.412185823610213e-01 +763 761 -3.165206906282828e+00 +763 762 -1.502055215859212e+01 +763 764 -1.502055215859661e+01 +763 765 -3.165206906282878e+00 +763 766 -7.412185823610212e-01 +763 767 -3.301555353436726e-01 +763 768 -1.820810586422639e-01 +763 769 -1.132183869282782e-01 +763 770 -7.613960933881223e-02 +763 771 -5.413421453123230e-02 +763 772 -4.012781031913037e-02 +763 773 -3.072751892616572e-02 +763 774 -2.415034675252897e-02 +763 775 -1.939104886145118e-02 +763 776 -1.585023865775536e-02 +763 777 -1.315380302376555e-02 +763 778 -1.105916272470032e-02 +763 779 -9.403863770832828e-03 +763 780 -8.076052134892649e-03 +763 781 -6.996835383339673e-03 +763 782 -6.109381318875769e-03 +763 783 -5.371977266379819e-03 +764 764 3.988394278151444e+01 +764 736 -2.312252367280536e-03 +764 737 -2.532689975072680e-03 +764 738 -2.783725492315665e-03 +764 739 -3.071047067257392e-03 +764 740 -3.401691470521394e-03 +764 741 -3.784439171232917e-03 +764 742 -4.230349322908543e-03 +764 743 -4.753493624956895e-03 +764 744 -5.371977266379805e-03 +764 745 -6.109381318875727e-03 +764 746 -6.996835383339671e-03 +764 747 -8.076052134892592e-03 +764 748 -9.403863770832839e-03 +764 749 -1.105916272470025e-02 +764 750 -1.315380302376542e-02 +764 751 -1.585023865775520e-02 +764 752 -1.939104886145103e-02 +764 753 -2.415034675252906e-02 +764 754 -3.072751892616544e-02 +764 755 -4.012781031912974e-02 +764 756 -5.413421453123138e-02 +764 757 -7.613960933881123e-02 +764 758 -1.132183869282759e-01 +764 759 -1.820810586422640e-01 +764 760 -3.301555353436736e-01 +764 761 -7.412185823610130e-01 +764 762 -3.165206906282882e+00 +764 763 -1.502055215859661e+01 +764 765 -1.502055215858795e+01 +764 766 -3.165206906282880e+00 +764 767 -7.412185823610258e-01 +764 768 -3.301555353436830e-01 +764 769 -1.820810586422701e-01 +764 770 -1.132183869282777e-01 +764 771 -7.613960933881204e-02 +764 772 -5.413421453123205e-02 +764 773 -4.012781031913017e-02 +764 774 -3.072751892616531e-02 +764 775 -2.415034675252897e-02 +764 776 -1.939104886145118e-02 +764 777 -1.585023865775532e-02 +764 778 -1.315380302376550e-02 +764 779 -1.105916272470022e-02 +764 780 -9.403863770832840e-03 +764 781 -8.076052134892578e-03 +764 782 -6.996835383339674e-03 +764 783 -6.109381318875747e-03 +765 765 3.988394278153932e+01 +765 736 -2.117777896667794e-03 +765 737 -2.312252367280536e-03 +765 738 -2.532689975072673e-03 +765 739 -2.783725492315671e-03 +765 740 -3.071047067257393e-03 +765 741 -3.401691470521385e-03 +765 742 -3.784439171232937e-03 +765 743 -4.230349322908531e-03 +765 744 -4.753493624956895e-03 +765 745 -5.371977266379786e-03 +765 746 -6.109381318875748e-03 +765 747 -6.996835383339674e-03 +765 748 -8.076052134892578e-03 +765 749 -9.403863770832854e-03 +765 750 -1.105916272470025e-02 +765 751 -1.315380302376546e-02 +765 752 -1.585023865775526e-02 +765 753 -1.939104886145125e-02 +765 754 -2.415034675252906e-02 +765 755 -3.072751892616543e-02 +765 756 -4.012781031912993e-02 +765 757 -5.413421453123171e-02 +765 758 -7.613960933881238e-02 +765 759 -1.132183869282761e-01 +765 760 -1.820810586422631e-01 +765 761 -3.301555353436710e-01 +765 762 -7.412185823610169e-01 +765 763 -3.165206906282878e+00 +765 764 -1.502055215858795e+01 +765 766 -1.502055215864009e+01 +765 767 -3.165206906282878e+00 +765 768 -7.412185823610303e-01 +765 769 -3.301555353436834e-01 +765 770 -1.820810586422660e-01 +765 771 -1.132183869282775e-01 +765 772 -7.613960933881188e-02 +765 773 -5.413421453123172e-02 +765 774 -4.012781031912956e-02 +765 775 -3.072751892616529e-02 +765 776 -2.415034675252896e-02 +765 777 -1.939104886145111e-02 +765 778 -1.585023865775526e-02 +765 779 -1.315380302376538e-02 +765 780 -1.105916272470022e-02 +765 781 -9.403863770832811e-03 +765 782 -8.076052134892582e-03 +765 783 -6.996835383339671e-03 +766 766 3.988394278164023e+01 +766 736 -1.945462087124857e-03 +766 737 -2.117777896667799e-03 +766 738 -2.312252367280535e-03 +766 739 -2.532689975072684e-03 +766 740 -2.783725492315679e-03 +766 741 -3.071047067257393e-03 +766 742 -3.401691470521411e-03 +766 743 -3.784439171232937e-03 +766 744 -4.230349322908543e-03 +766 745 -4.753493624956893e-03 +766 746 -5.371977266379819e-03 +766 747 -6.109381318875769e-03 +766 748 -6.996835383339673e-03 +766 749 -8.076052134892651e-03 +766 750 -9.403863770832832e-03 +766 751 -1.105916272470025e-02 +766 752 -1.315380302376547e-02 +766 753 -1.585023865775537e-02 +766 754 -1.939104886145119e-02 +766 755 -2.415034675252897e-02 +766 756 -3.072751892616544e-02 +766 757 -4.012781031912998e-02 +766 758 -5.413421453123234e-02 +766 759 -7.613960933881180e-02 +766 760 -1.132183869282754e-01 +766 761 -1.820810586422626e-01 +766 762 -3.301555353436723e-01 +766 763 -7.412185823610212e-01 +766 764 -3.165206906282880e+00 +766 765 -1.502055215864009e+01 +766 767 -1.502055215865994e+01 +766 768 -3.165206906282851e+00 +766 769 -7.412185823610253e-01 +766 770 -3.301555353436744e-01 +766 771 -1.820810586422663e-01 +766 772 -1.132183869282771e-01 +766 773 -7.613960933881148e-02 +766 774 -5.413421453123109e-02 +766 775 -4.012781031912974e-02 +766 776 -3.072751892616542e-02 +766 777 -2.415034675252897e-02 +766 778 -1.939104886145110e-02 +766 779 -1.585023865775514e-02 +766 780 -1.315380302376542e-02 +766 781 -1.105916272470025e-02 +766 782 -9.403863770832814e-03 +766 783 -8.076052134892564e-03 +767 767 3.988394278169699e+01 +767 736 -1.792160480940035e-03 +767 737 -1.945462087124849e-03 +767 738 -2.117777896667784e-03 +767 739 -2.312252367280530e-03 +767 740 -2.532689975072674e-03 +767 741 -2.783725492315660e-03 +767 742 -3.071047067257393e-03 +767 743 -3.401691470521385e-03 +767 744 -3.784439171232917e-03 +767 745 -4.230349322908507e-03 +767 746 -4.753493624956880e-03 +767 747 -5.371977266379790e-03 +767 748 -6.109381318875710e-03 +767 749 -6.996835383339673e-03 +767 750 -8.076052134892568e-03 +767 751 -9.403863770832813e-03 +767 752 -1.105916272470026e-02 +767 753 -1.315380302376555e-02 +767 754 -1.585023865775531e-02 +767 755 -1.939104886145111e-02 +767 756 -2.415034675252896e-02 +767 757 -3.072751892616545e-02 +767 758 -4.012781031913035e-02 +767 759 -5.413421453123204e-02 +767 760 -7.613960933881117e-02 +767 761 -1.132183869282737e-01 +767 762 -1.820810586422613e-01 +767 763 -3.301555353436726e-01 +767 764 -7.412185823610258e-01 +767 765 -3.165206906282878e+00 +767 766 -1.502055215865994e+01 +767 768 -1.502055215931069e+01 +767 769 -3.165206906282893e+00 +767 770 -7.412185823610254e-01 +767 771 -3.301555353436747e-01 +767 772 -1.820810586422678e-01 +767 773 -1.132183869282770e-01 +767 774 -7.613960933881117e-02 +767 775 -5.413421453123141e-02 +767 776 -4.012781031912996e-02 +767 777 -3.072751892616545e-02 +767 778 -2.415034675252897e-02 +767 779 -1.939104886145097e-02 +767 780 -1.585023865775520e-02 +767 781 -1.315380302376546e-02 +767 782 -1.105916272470026e-02 +767 783 -9.403863770832830e-03 +768 768 3.988394278169694e+01 +768 752 -9.403863770832771e-03 +768 753 -1.105916272470025e-02 +768 754 -1.315380302376542e-02 +768 755 -1.585023865775514e-02 +768 756 -1.939104886145095e-02 +768 757 -2.415034675252877e-02 +768 758 -3.072751892616543e-02 +768 759 -4.012781031912976e-02 +768 760 -5.413421453123109e-02 +768 761 -7.613960933881021e-02 +768 762 -1.132183869282739e-01 +768 763 -1.820810586422639e-01 +768 764 -3.301555353436830e-01 +768 765 -7.412185823610303e-01 +768 766 -3.165206906282851e+00 +768 767 -1.502055215931069e+01 +768 769 -1.502055215866003e+01 +768 770 -3.165206906282878e+00 +768 771 -7.412185823610105e-01 +768 772 -3.301555353436738e-01 +768 773 -1.820810586422640e-01 +768 774 -1.132183869282759e-01 +768 775 -7.613960933881177e-02 +768 776 -5.413421453123234e-02 +768 777 -4.012781031913039e-02 +768 778 -3.072751892616573e-02 +768 779 -2.415034675252898e-02 +768 780 -1.939104886145118e-02 +768 781 -1.585023865775537e-02 +768 782 -1.315380302376555e-02 +768 783 -1.105916272470032e-02 +768 784 -9.403863770832814e-03 +768 785 -8.076052134892580e-03 +768 786 -6.996835383339674e-03 +768 787 -6.109381318875769e-03 +768 788 -5.371977266379790e-03 +768 789 -4.753493624956895e-03 +768 790 -4.230349322908531e-03 +768 791 -3.784439171232915e-03 +768 792 -3.401691470521394e-03 +768 793 -3.071047067257393e-03 +768 794 -2.783725492315679e-03 +768 795 -2.532689975072674e-03 +768 796 -2.312252367280536e-03 +768 797 -2.117777896667793e-03 +768 798 -1.945462087124849e-03 +768 799 -1.792160480940038e-03 +769 769 3.988394278164022e+01 +769 752 -8.076052134892582e-03 +769 753 -9.403863770832825e-03 +769 754 -1.105916272470022e-02 +769 755 -1.315380302376537e-02 +769 756 -1.585023865775514e-02 +769 757 -1.939104886145096e-02 +769 758 -2.415034675252896e-02 +769 759 -3.072751892616530e-02 +769 760 -4.012781031912954e-02 +769 761 -5.413421453123106e-02 +769 762 -7.613960933881100e-02 +769 763 -1.132183869282782e-01 +769 764 -1.820810586422701e-01 +769 765 -3.301555353436834e-01 +769 766 -7.412185823610253e-01 +769 767 -3.165206906282893e+00 +769 768 -1.502055215866003e+01 +769 770 -1.502055215864002e+01 +769 771 -3.165206906282871e+00 +769 772 -7.412185823610196e-01 +769 773 -3.301555353436718e-01 +769 774 -1.820810586422615e-01 +769 775 -1.132183869282745e-01 +769 776 -7.613960933881188e-02 +769 777 -5.413421453123236e-02 +769 778 -4.012781031913037e-02 +769 779 -3.072751892616545e-02 +769 780 -2.415034675252906e-02 +769 781 -1.939104886145125e-02 +769 782 -1.585023865775537e-02 +769 783 -1.315380302376555e-02 +769 784 -1.105916272470025e-02 +769 785 -9.403863770832811e-03 +769 786 -8.076052134892578e-03 +769 787 -6.996835383339673e-03 +769 788 -6.109381318875710e-03 +769 789 -5.371977266379788e-03 +769 790 -4.753493624956881e-03 +769 791 -4.230349322908506e-03 +769 792 -3.784439171232917e-03 +769 793 -3.401691470521385e-03 +769 794 -3.071047067257393e-03 +769 795 -2.783725492315660e-03 +769 796 -2.532689975072674e-03 +769 797 -2.312252367280530e-03 +769 798 -2.117777896667784e-03 +769 799 -1.945462087124849e-03 +770 770 3.988394278153933e+01 +770 752 -6.996835383339623e-03 +770 753 -8.076052134892575e-03 +770 754 -9.403863770832825e-03 +770 755 -1.105916272470022e-02 +770 756 -1.315380302376542e-02 +770 757 -1.585023865775520e-02 +770 758 -1.939104886145118e-02 +770 759 -2.415034675252897e-02 +770 760 -3.072751892616529e-02 +770 761 -4.012781031912974e-02 +770 762 -5.413421453123141e-02 +770 763 -7.613960933881223e-02 +770 764 -1.132183869282777e-01 +770 765 -1.820810586422660e-01 +770 766 -3.301555353436744e-01 +770 767 -7.412185823610254e-01 +770 768 -3.165206906282878e+00 +770 769 -1.502055215864002e+01 +770 771 -1.502055215858799e+01 +770 772 -3.165206906282871e+00 +770 773 -7.412185823610272e-01 +770 774 -3.301555353436813e-01 +770 775 -1.820810586422650e-01 +770 776 -1.132183869282759e-01 +770 777 -7.613960933881193e-02 +770 778 -5.413421453123204e-02 +770 779 -4.012781031912978e-02 +770 780 -3.072751892616544e-02 +770 781 -2.415034675252906e-02 +770 782 -1.939104886145119e-02 +770 783 -1.585023865775531e-02 +770 784 -1.315380302376542e-02 +770 785 -1.105916272470022e-02 +770 786 -9.403863770832854e-03 +770 787 -8.076052134892651e-03 +770 788 -6.996835383339673e-03 +770 789 -6.109381318875769e-03 +770 790 -5.371977266379819e-03 +770 791 -4.753493624956893e-03 +770 792 -4.230349322908543e-03 +770 793 -3.784439171232937e-03 +770 794 -3.401691470521411e-03 +770 795 -3.071047067257393e-03 +770 796 -2.783725492315679e-03 +770 797 -2.532689975072684e-03 +770 798 -2.312252367280535e-03 +770 799 -2.117777896667799e-03 +771 771 3.988394278151443e+01 +771 752 -6.109381318875727e-03 +771 753 -6.996835383339671e-03 +771 754 -8.076052134892592e-03 +771 755 -9.403863770832811e-03 +771 756 -1.105916272470025e-02 +771 757 -1.315380302376546e-02 +771 758 -1.585023865775536e-02 +771 759 -1.939104886145118e-02 +771 760 -2.415034675252896e-02 +771 761 -3.072751892616542e-02 +771 762 -4.012781031912996e-02 +771 763 -5.413421453123230e-02 +771 764 -7.613960933881204e-02 +771 765 -1.132183869282775e-01 +771 766 -1.820810586422663e-01 +771 767 -3.301555353436747e-01 +771 768 -7.412185823610105e-01 +771 769 -3.165206906282871e+00 +771 770 -1.502055215858799e+01 +771 772 -1.502055215859654e+01 +771 773 -3.165206906282882e+00 +771 774 -7.412185823610468e-01 +771 775 -3.301555353436817e-01 +771 776 -1.820810586422639e-01 +771 777 -1.132183869282761e-01 +771 778 -7.613960933881184e-02 +771 779 -5.413421453123111e-02 +771 780 -4.012781031912974e-02 +771 781 -3.072751892616543e-02 +771 782 -2.415034675252897e-02 +771 783 -1.939104886145111e-02 +771 784 -1.585023865775514e-02 +771 785 -1.315380302376537e-02 +771 786 -1.105916272470025e-02 +771 787 -9.403863770832832e-03 +771 788 -8.076052134892568e-03 +771 789 -6.996835383339674e-03 +771 790 -6.109381318875747e-03 +771 791 -5.371977266379786e-03 +771 792 -4.753493624956895e-03 +771 793 -4.230349322908531e-03 +771 794 -3.784439171232937e-03 +771 795 -3.401691470521385e-03 +771 796 -3.071047067257393e-03 +771 797 -2.783725492315671e-03 +771 798 -2.532689975072673e-03 +771 799 -2.312252367280536e-03 +772 772 3.988394278151355e+01 +772 752 -5.371977266379786e-03 +772 753 -6.109381318875748e-03 +772 754 -6.996835383339674e-03 +772 755 -8.076052134892568e-03 +772 756 -9.403863770832830e-03 +772 757 -1.105916272470026e-02 +772 758 -1.315380302376555e-02 +772 759 -1.585023865775532e-02 +772 760 -1.939104886145111e-02 +772 761 -2.415034675252897e-02 +772 762 -3.072751892616545e-02 +772 763 -4.012781031913037e-02 +772 764 -5.413421453123205e-02 +772 765 -7.613960933881188e-02 +772 766 -1.132183869282771e-01 +772 767 -1.820810586422678e-01 +772 768 -3.301555353436738e-01 +772 769 -7.412185823610196e-01 +772 770 -3.165206906282871e+00 +772 771 -1.502055215859654e+01 +772 773 -1.502055215859219e+01 +772 774 -3.165206906282882e+00 +772 775 -7.412185823610192e-01 +772 776 -3.301555353436739e-01 +772 777 -1.820810586422653e-01 +772 778 -1.132183869282785e-01 +772 779 -7.613960933881117e-02 +772 780 -5.413421453123138e-02 +772 781 -4.012781031912993e-02 +772 782 -3.072751892616544e-02 +772 783 -2.415034675252896e-02 +772 784 -1.939104886145095e-02 +772 785 -1.585023865775514e-02 +772 786 -1.315380302376546e-02 +772 787 -1.105916272470025e-02 +772 788 -9.403863770832814e-03 +772 789 -8.076052134892582e-03 +772 790 -6.996835383339671e-03 +772 791 -6.109381318875727e-03 +772 792 -5.371977266379805e-03 +772 793 -4.753493624956895e-03 +772 794 -4.230349322908543e-03 +772 795 -3.784439171232917e-03 +772 796 -3.401691470521394e-03 +772 797 -3.071047067257392e-03 +772 798 -2.783725492315665e-03 +772 799 -2.532689975072680e-03 +773 773 3.988394278152494e+01 +773 752 -4.753493624956893e-03 +773 753 -5.371977266379819e-03 +773 754 -6.109381318875769e-03 +773 755 -6.996835383339673e-03 +773 756 -8.076052134892639e-03 +773 757 -9.403863770832832e-03 +773 758 -1.105916272470032e-02 +773 759 -1.315380302376550e-02 +773 760 -1.585023865775526e-02 +773 761 -1.939104886145110e-02 +773 762 -2.415034675252897e-02 +773 763 -3.072751892616572e-02 +773 764 -4.012781031913017e-02 +773 765 -5.413421453123172e-02 +773 766 -7.613960933881148e-02 +773 767 -1.132183869282770e-01 +773 768 -1.820810586422640e-01 +773 769 -3.301555353436718e-01 +773 770 -7.412185823610272e-01 +773 771 -3.165206906282882e+00 +773 772 -1.502055215859219e+01 +773 774 -1.502055215860534e+01 +773 775 -3.165206906282836e+00 +773 776 -7.412185823610152e-01 +773 777 -3.301555353436740e-01 +773 778 -1.820810586422699e-01 +773 779 -1.132183869282782e-01 +773 780 -7.613960933881139e-02 +773 781 -5.413421453123171e-02 +773 782 -4.012781031912998e-02 +773 783 -3.072751892616545e-02 +773 784 -2.415034675252877e-02 +773 785 -1.939104886145096e-02 +773 786 -1.585023865775526e-02 +773 787 -1.315380302376547e-02 +773 788 -1.105916272470026e-02 +773 789 -9.403863770832816e-03 +773 790 -8.076052134892552e-03 +773 791 -6.996835383339622e-03 +773 792 -6.109381318875730e-03 +773 793 -5.371977266379788e-03 +773 794 -4.753493624956895e-03 +773 795 -4.230349322908508e-03 +773 796 -3.784439171232917e-03 +773 797 -3.401691470521384e-03 +773 798 -3.071047067257376e-03 +773 799 -2.783725492315666e-03 +774 774 3.988394278128558e+01 +774 752 -4.230349322908507e-03 +774 753 -4.753493624956880e-03 +774 754 -5.371977266379790e-03 +774 755 -6.109381318875710e-03 +774 756 -6.996835383339673e-03 +774 757 -8.076052134892557e-03 +774 758 -9.403863770832813e-03 +774 759 -1.105916272470022e-02 +774 760 -1.315380302376538e-02 +774 761 -1.585023865775514e-02 +774 762 -1.939104886145097e-02 +774 763 -2.415034675252897e-02 +774 764 -3.072751892616531e-02 +774 765 -4.012781031912956e-02 +774 766 -5.413421453123109e-02 +774 767 -7.613960933881117e-02 +774 768 -1.132183869282759e-01 +774 769 -1.820810586422615e-01 +774 770 -3.301555353436813e-01 +774 771 -7.412185823610468e-01 +774 772 -3.165206906282882e+00 +774 773 -1.502055215860534e+01 +774 775 -1.502055215840034e+01 +774 776 -3.165206906282886e+00 +774 777 -7.412185823610152e-01 +774 778 -3.301555353436747e-01 +774 779 -1.820810586422675e-01 +774 780 -1.132183869282764e-01 +774 781 -7.613960933881236e-02 +774 782 -5.413421453123234e-02 +774 783 -4.012781031913035e-02 +774 784 -3.072751892616543e-02 +774 785 -2.415034675252896e-02 +774 786 -1.939104886145125e-02 +774 787 -1.585023865775537e-02 +774 788 -1.315380302376555e-02 +774 789 -1.105916272470032e-02 +774 790 -9.403863770832827e-03 +774 791 -8.076052134892604e-03 +774 792 -6.996835383339698e-03 +774 793 -6.109381318875769e-03 +774 794 -5.371977266379837e-03 +774 795 -4.753493624956895e-03 +774 796 -4.230349322908543e-03 +774 797 -3.784439171232936e-03 +774 798 -3.401691470521392e-03 +774 799 -3.071047067257401e-03 +775 775 3.988394278105613e+01 +775 752 -3.784439171232916e-03 +775 753 -4.230349322908531e-03 +775 754 -4.753493624956895e-03 +775 755 -5.371977266379788e-03 +775 756 -6.109381318875769e-03 +775 757 -6.996835383339674e-03 +775 758 -8.076052134892592e-03 +775 759 -9.403863770832825e-03 +775 760 -1.105916272470022e-02 +775 761 -1.315380302376542e-02 +775 762 -1.585023865775520e-02 +775 763 -1.939104886145118e-02 +775 764 -2.415034675252897e-02 +775 765 -3.072751892616529e-02 +775 766 -4.012781031912974e-02 +775 767 -5.413421453123141e-02 +775 768 -7.613960933881177e-02 +775 769 -1.132183869282745e-01 +775 770 -1.820810586422650e-01 +775 771 -3.301555353436817e-01 +775 772 -7.412185823610192e-01 +775 773 -3.165206906282836e+00 +775 774 -1.502055215840034e+01 +775 776 -1.502055215835506e+01 +775 777 -3.165206906282874e+00 +775 778 -7.412185823610207e-01 +775 779 -3.301555353436752e-01 +775 780 -1.820810586422636e-01 +775 781 -1.132183869282765e-01 +775 782 -7.613960933881193e-02 +775 783 -5.413421453123204e-02 +775 784 -4.012781031912976e-02 +775 785 -3.072751892616530e-02 +775 786 -2.415034675252906e-02 +775 787 -1.939104886145119e-02 +775 788 -1.585023865775532e-02 +775 789 -1.315380302376550e-02 +775 790 -1.105916272470022e-02 +775 791 -9.403863770832825e-03 +775 792 -8.076052134892592e-03 +775 793 -6.996835383339674e-03 +775 794 -6.109381318875769e-03 +775 795 -5.371977266379790e-03 +775 796 -4.753493624956895e-03 +775 797 -4.230349322908531e-03 +775 798 -3.784439171232915e-03 +775 799 -3.401691470521394e-03 +776 776 3.988394278102308e+01 +776 752 -3.401691470521392e-03 +776 753 -3.784439171232936e-03 +776 754 -4.230349322908543e-03 +776 755 -4.753493624956895e-03 +776 756 -5.371977266379837e-03 +776 757 -6.109381318875769e-03 +776 758 -6.996835383339698e-03 +776 759 -8.076052134892608e-03 +776 760 -9.403863770832846e-03 +776 761 -1.105916272470025e-02 +776 762 -1.315380302376546e-02 +776 763 -1.585023865775536e-02 +776 764 -1.939104886145118e-02 +776 765 -2.415034675252896e-02 +776 766 -3.072751892616542e-02 +776 767 -4.012781031912996e-02 +776 768 -5.413421453123234e-02 +776 769 -7.613960933881188e-02 +776 770 -1.132183869282759e-01 +776 771 -1.820810586422639e-01 +776 772 -3.301555353436739e-01 +776 773 -7.412185823610152e-01 +776 774 -3.165206906282886e+00 +776 775 -1.502055215835506e+01 +776 777 -1.502055215836207e+01 +776 778 -3.165206906282866e+00 +776 779 -7.412185823610293e-01 +776 780 -3.301555353436810e-01 +776 781 -1.820810586422659e-01 +776 782 -1.132183869282761e-01 +776 783 -7.613960933881135e-02 +776 784 -5.413421453123109e-02 +776 785 -4.012781031912954e-02 +776 786 -3.072751892616543e-02 +776 787 -2.415034675252897e-02 +776 788 -1.939104886145111e-02 +776 789 -1.585023865775526e-02 +776 790 -1.315380302376538e-02 +776 791 -1.105916272470022e-02 +776 792 -9.403863770832811e-03 +776 793 -8.076052134892568e-03 +776 794 -6.996835383339673e-03 +776 795 -6.109381318875710e-03 +776 796 -5.371977266379788e-03 +776 797 -4.753493624956881e-03 +776 798 -4.230349322908506e-03 +776 799 -3.784439171232917e-03 +777 777 3.988394278106478e+01 +777 752 -3.071047067257377e-03 +777 753 -3.401691470521384e-03 +777 754 -3.784439171232917e-03 +777 755 -4.230349322908508e-03 +777 756 -4.753493624956895e-03 +777 757 -5.371977266379790e-03 +777 758 -6.109381318875730e-03 +777 759 -6.996835383339627e-03 +777 760 -8.076052134892597e-03 +777 761 -9.403863770832814e-03 +777 762 -1.105916272470026e-02 +777 763 -1.315380302376555e-02 +777 764 -1.585023865775532e-02 +777 765 -1.939104886145111e-02 +777 766 -2.415034675252897e-02 +777 767 -3.072751892616545e-02 +777 768 -4.012781031913039e-02 +777 769 -5.413421453123236e-02 +777 770 -7.613960933881193e-02 +777 771 -1.132183869282761e-01 +777 772 -1.820810586422653e-01 +777 773 -3.301555353436740e-01 +777 774 -7.412185823610152e-01 +777 775 -3.165206906282874e+00 +777 776 -1.502055215836207e+01 +777 778 -1.502055215839554e+01 +777 779 -3.165206906282892e+00 +777 780 -7.412185823610324e-01 +777 781 -3.301555353436815e-01 +777 782 -1.820810586422635e-01 +777 783 -1.132183869282744e-01 +777 784 -7.613960933881042e-02 +777 785 -5.413421453123106e-02 +777 786 -4.012781031912993e-02 +777 787 -3.072751892616544e-02 +777 788 -2.415034675252897e-02 +777 789 -1.939104886145110e-02 +777 790 -1.585023865775514e-02 +777 791 -1.315380302376542e-02 +777 792 -1.105916272470025e-02 +777 793 -9.403863770832830e-03 +777 794 -8.076052134892639e-03 +777 795 -6.996835383339673e-03 +777 796 -6.109381318875769e-03 +777 797 -5.371977266379819e-03 +777 798 -4.753493624956893e-03 +777 799 -4.230349322908543e-03 +778 778 3.988394278115153e+01 +778 752 -2.783725492315665e-03 +778 753 -3.071047067257392e-03 +778 754 -3.401691470521394e-03 +778 755 -3.784439171232917e-03 +778 756 -4.230349322908543e-03 +778 757 -4.753493624956895e-03 +778 758 -5.371977266379805e-03 +778 759 -6.109381318875730e-03 +778 760 -6.996835383339698e-03 +778 761 -8.076052134892582e-03 +778 762 -9.403863770832816e-03 +778 763 -1.105916272470032e-02 +778 764 -1.315380302376550e-02 +778 765 -1.585023865775526e-02 +778 766 -1.939104886145110e-02 +778 767 -2.415034675252897e-02 +778 768 -3.072751892616573e-02 +778 769 -4.012781031913037e-02 +778 770 -5.413421453123204e-02 +778 771 -7.613960933881184e-02 +778 772 -1.132183869282785e-01 +778 773 -1.820810586422699e-01 +778 774 -3.301555353436747e-01 +778 775 -7.412185823610207e-01 +778 776 -3.165206906282866e+00 +778 777 -1.502055215839554e+01 +778 779 -1.502055215844897e+01 +778 780 -3.165206906282838e+00 +778 781 -7.412185823610218e-01 +778 782 -3.301555353436727e-01 +778 783 -1.820810586422611e-01 +778 784 -1.132183869282739e-01 +778 785 -7.613960933881100e-02 +778 786 -5.413421453123171e-02 +778 787 -4.012781031912998e-02 +778 788 -3.072751892616545e-02 +778 789 -2.415034675252897e-02 +778 790 -1.939104886145097e-02 +778 791 -1.585023865775520e-02 +778 792 -1.315380302376546e-02 +778 793 -1.105916272470026e-02 +778 794 -9.403863770832832e-03 +778 795 -8.076052134892557e-03 +778 796 -6.996835383339674e-03 +778 797 -6.109381318875747e-03 +778 798 -5.371977266379786e-03 +778 799 -4.753493624956895e-03 +779 779 3.988394278128111e+01 +779 752 -2.532689975072673e-03 +779 753 -2.783725492315671e-03 +779 754 -3.071047067257393e-03 +779 755 -3.401691470521385e-03 +779 756 -3.784439171232937e-03 +779 757 -4.230349322908531e-03 +779 758 -4.753493624956895e-03 +779 759 -5.371977266379788e-03 +779 760 -6.109381318875769e-03 +779 761 -6.996835383339674e-03 +779 762 -8.076052134892557e-03 +779 763 -9.403863770832828e-03 +779 764 -1.105916272470022e-02 +779 765 -1.315380302376538e-02 +779 766 -1.585023865775514e-02 +779 767 -1.939104886145097e-02 +779 768 -2.415034675252898e-02 +779 769 -3.072751892616545e-02 +779 770 -4.012781031912978e-02 +779 771 -5.413421453123111e-02 +779 772 -7.613960933881117e-02 +779 773 -1.132183869282782e-01 +779 774 -1.820810586422675e-01 +779 775 -3.301555353436752e-01 +779 776 -7.412185823610293e-01 +779 777 -3.165206906282892e+00 +779 778 -1.502055215844897e+01 +779 780 -1.502055215852577e+01 +779 781 -3.165206906282894e+00 +779 782 -7.412185823610262e-01 +779 783 -3.301555353436754e-01 +779 784 -1.820810586422641e-01 +779 785 -1.132183869282771e-01 +779 786 -7.613960933881254e-02 +779 787 -5.413421453123234e-02 +779 788 -4.012781031913037e-02 +779 789 -3.072751892616572e-02 +779 790 -2.415034675252897e-02 +779 791 -1.939104886145118e-02 +779 792 -1.585023865775536e-02 +779 793 -1.315380302376555e-02 +779 794 -1.105916272470032e-02 +779 795 -9.403863770832813e-03 +779 796 -8.076052134892592e-03 +779 797 -6.996835383339671e-03 +779 798 -6.109381318875727e-03 +779 799 -5.371977266379805e-03 +780 780 3.988394278146372e+01 +780 752 -2.312252367280535e-03 +780 753 -2.532689975072684e-03 +780 754 -2.783725492315679e-03 +780 755 -3.071047067257393e-03 +780 756 -3.401691470521411e-03 +780 757 -3.784439171232937e-03 +780 758 -4.230349322908543e-03 +780 759 -4.753493624956895e-03 +780 760 -5.371977266379837e-03 +780 761 -6.109381318875769e-03 +780 762 -6.996835383339673e-03 +780 763 -8.076052134892649e-03 +780 764 -9.403863770832840e-03 +780 765 -1.105916272470022e-02 +780 766 -1.315380302376542e-02 +780 767 -1.585023865775520e-02 +780 768 -1.939104886145118e-02 +780 769 -2.415034675252906e-02 +780 770 -3.072751892616544e-02 +780 771 -4.012781031912974e-02 +780 772 -5.413421453123138e-02 +780 773 -7.613960933881139e-02 +780 774 -1.132183869282764e-01 +780 775 -1.820810586422636e-01 +780 776 -3.301555353436810e-01 +780 777 -7.412185823610324e-01 +780 778 -3.165206906282838e+00 +780 779 -1.502055215852577e+01 +780 781 -1.502055215863300e+01 +780 782 -3.165206906282875e+00 +780 783 -7.412185823610217e-01 +780 784 -3.301555353436734e-01 +780 785 -1.820810586422684e-01 +780 786 -1.132183869282795e-01 +780 787 -7.613960933881209e-02 +780 788 -5.413421453123205e-02 +780 789 -4.012781031913017e-02 +780 790 -3.072751892616531e-02 +780 791 -2.415034675252897e-02 +780 792 -1.939104886145118e-02 +780 793 -1.585023865775532e-02 +780 794 -1.315380302376550e-02 +780 795 -1.105916272470022e-02 +780 796 -9.403863770832825e-03 +780 797 -8.076052134892575e-03 +780 798 -6.996835383339622e-03 +780 799 -6.109381318875730e-03 +781 781 3.988394278171953e+01 +781 752 -2.117777896667784e-03 +781 753 -2.312252367280530e-03 +781 754 -2.532689975072674e-03 +781 755 -2.783725492315660e-03 +781 756 -3.071047067257393e-03 +781 757 -3.401691470521385e-03 +781 758 -3.784439171232917e-03 +781 759 -4.230349322908508e-03 +781 760 -4.753493624956895e-03 +781 761 -5.371977266379790e-03 +781 762 -6.109381318875710e-03 +781 763 -6.996835383339673e-03 +781 764 -8.076052134892578e-03 +781 765 -9.403863770832811e-03 +781 766 -1.105916272470025e-02 +781 767 -1.315380302376546e-02 +781 768 -1.585023865775537e-02 +781 769 -1.939104886145125e-02 +781 770 -2.415034675252906e-02 +781 771 -3.072751892616543e-02 +781 772 -4.012781031912993e-02 +781 773 -5.413421453123171e-02 +781 774 -7.613960933881236e-02 +781 775 -1.132183869282765e-01 +781 776 -1.820810586422659e-01 +781 777 -3.301555353436815e-01 +781 778 -7.412185823610218e-01 +781 779 -3.165206906282894e+00 +781 780 -1.502055215863300e+01 +781 782 -1.502055215878371e+01 +781 783 -3.165206906282871e+00 +781 784 -7.412185823610175e-01 +781 785 -3.301555353436755e-01 +781 786 -1.820810586422676e-01 +781 787 -1.132183869282766e-01 +781 788 -7.613960933881186e-02 +781 789 -5.413421453123172e-02 +781 790 -4.012781031912956e-02 +781 791 -3.072751892616529e-02 +781 792 -2.415034675252896e-02 +781 793 -1.939104886145111e-02 +781 794 -1.585023865775526e-02 +781 795 -1.315380302376538e-02 +781 796 -1.105916272470022e-02 +781 797 -9.403863770832827e-03 +781 798 -8.076052134892594e-03 +781 799 -6.996835383339698e-03 +782 782 3.988394278208170e+01 +782 752 -1.945462087124849e-03 +782 753 -2.117777896667793e-03 +782 754 -2.312252367280536e-03 +782 755 -2.532689975072674e-03 +782 756 -2.783725492315679e-03 +782 757 -3.071047067257393e-03 +782 758 -3.401691470521394e-03 +782 759 -3.784439171232917e-03 +782 760 -4.230349322908543e-03 +782 761 -4.753493624956895e-03 +782 762 -5.371977266379788e-03 +782 763 -6.109381318875769e-03 +782 764 -6.996835383339674e-03 +782 765 -8.076052134892582e-03 +782 766 -9.403863770832814e-03 +782 767 -1.105916272470026e-02 +782 768 -1.315380302376555e-02 +782 769 -1.585023865775537e-02 +782 770 -1.939104886145119e-02 +782 771 -2.415034675252897e-02 +782 772 -3.072751892616544e-02 +782 773 -4.012781031912998e-02 +782 774 -5.413421453123234e-02 +782 775 -7.613960933881193e-02 +782 776 -1.132183869282761e-01 +782 777 -1.820810586422635e-01 +782 778 -3.301555353436727e-01 +782 779 -7.412185823610262e-01 +782 780 -3.165206906282875e+00 +782 781 -1.502055215878371e+01 +782 783 -1.502055215899860e+01 +782 784 -3.165206906282875e+00 +782 785 -7.412185823610304e-01 +782 786 -3.301555353436815e-01 +782 787 -1.820810586422663e-01 +782 788 -1.132183869282770e-01 +782 789 -7.613960933881170e-02 +782 790 -5.413421453123109e-02 +782 791 -4.012781031912974e-02 +782 792 -3.072751892616542e-02 +782 793 -2.415034675252897e-02 +782 794 -1.939104886145110e-02 +782 795 -1.585023865775514e-02 +782 796 -1.315380302376542e-02 +782 797 -1.105916272470025e-02 +782 798 -9.403863770832814e-03 +782 799 -8.076052134892582e-03 +783 783 3.988394278260298e+01 +783 752 -1.792160480940034e-03 +783 753 -1.945462087124852e-03 +783 754 -2.117777896667793e-03 +783 755 -2.312252367280530e-03 +783 756 -2.532689975072684e-03 +783 757 -2.783725492315671e-03 +783 758 -3.071047067257392e-03 +783 759 -3.401691470521384e-03 +783 760 -3.784439171232936e-03 +783 761 -4.230349322908531e-03 +783 762 -4.753493624956881e-03 +783 763 -5.371977266379819e-03 +783 764 -6.109381318875747e-03 +783 765 -6.996835383339671e-03 +783 766 -8.076052134892564e-03 +783 767 -9.403863770832830e-03 +783 768 -1.105916272470032e-02 +783 769 -1.315380302376555e-02 +783 770 -1.585023865775531e-02 +783 771 -1.939104886145111e-02 +783 772 -2.415034675252896e-02 +783 773 -3.072751892616545e-02 +783 774 -4.012781031913035e-02 +783 775 -5.413421453123204e-02 +783 776 -7.613960933881135e-02 +783 777 -1.132183869282744e-01 +783 778 -1.820810586422611e-01 +783 779 -3.301555353436754e-01 +783 780 -7.412185823610217e-01 +783 781 -3.165206906282871e+00 +783 782 -1.502055215899860e+01 +783 784 -1.502055215931058e+01 +783 785 -3.165206906282865e+00 +783 786 -7.412185823610313e-01 +783 787 -3.301555353436813e-01 +783 788 -1.820810586422667e-01 +783 789 -1.132183869282775e-01 +783 790 -7.613960933881103e-02 +783 791 -5.413421453123141e-02 +783 792 -4.012781031912996e-02 +783 793 -3.072751892616545e-02 +783 794 -2.415034675252897e-02 +783 795 -1.939104886145097e-02 +783 796 -1.585023865775520e-02 +783 797 -1.315380302376546e-02 +783 798 -1.105916272470026e-02 +783 799 -9.403863770832816e-03 +784 784 3.988394278260303e+01 +784 768 -9.403863770832814e-03 +784 769 -1.105916272470025e-02 +784 770 -1.315380302376542e-02 +784 771 -1.585023865775514e-02 +784 772 -1.939104886145095e-02 +784 773 -2.415034675252877e-02 +784 774 -3.072751892616543e-02 +784 775 -4.012781031912976e-02 +784 776 -5.413421453123109e-02 +784 777 -7.613960933881042e-02 +784 778 -1.132183869282739e-01 +784 779 -1.820810586422641e-01 +784 780 -3.301555353436734e-01 +784 781 -7.412185823610175e-01 +784 782 -3.165206906282875e+00 +784 783 -1.502055215931058e+01 +784 785 -1.502055215899865e+01 +784 786 -3.165206906282876e+00 +784 787 -7.412185823610280e-01 +784 788 -3.301555353436751e-01 +784 789 -1.820810586422662e-01 +784 790 -1.132183869282754e-01 +784 791 -7.613960933881175e-02 +784 792 -5.413421453123234e-02 +784 793 -4.012781031913039e-02 +784 794 -3.072751892616573e-02 +784 795 -2.415034675252898e-02 +784 796 -1.939104886145118e-02 +784 797 -1.585023865775537e-02 +784 798 -1.315380302376555e-02 +784 799 -1.105916272470032e-02 +784 800 -9.403863770832833e-03 +784 801 -8.076052134892655e-03 +784 802 -6.996835383339677e-03 +784 803 -6.109381318875772e-03 +784 804 -5.371977266379821e-03 +784 805 -4.753493624956895e-03 +784 806 -4.230349322908545e-03 +784 807 -3.784439171232938e-03 +784 808 -3.401691470521412e-03 +784 809 -3.071047067257394e-03 +784 810 -2.783725492315679e-03 +784 811 -2.532689975072685e-03 +784 812 -2.312252367280536e-03 +784 813 -2.117777896667799e-03 +784 814 -1.945462087124858e-03 +784 815 -1.792160480940046e-03 +785 785 3.988394278208161e+01 +785 768 -8.076052134892580e-03 +785 769 -9.403863770832811e-03 +785 770 -1.105916272470022e-02 +785 771 -1.315380302376537e-02 +785 772 -1.585023865775514e-02 +785 773 -1.939104886145096e-02 +785 774 -2.415034675252896e-02 +785 775 -3.072751892616530e-02 +785 776 -4.012781031912954e-02 +785 777 -5.413421453123106e-02 +785 778 -7.613960933881100e-02 +785 779 -1.132183869282771e-01 +785 780 -1.820810586422684e-01 +785 781 -3.301555353436755e-01 +785 782 -7.412185823610304e-01 +785 783 -3.165206906282865e+00 +785 784 -1.502055215899865e+01 +785 786 -1.502055215878367e+01 +785 787 -3.165206906282836e+00 +785 788 -7.412185823610089e-01 +785 789 -3.301555353436753e-01 +785 790 -1.820810586422610e-01 +785 791 -1.132183869282744e-01 +785 792 -7.613960933881186e-02 +785 793 -5.413421453123236e-02 +785 794 -4.012781031913037e-02 +785 795 -3.072751892616545e-02 +785 796 -2.415034675252906e-02 +785 797 -1.939104886145125e-02 +785 798 -1.585023865775537e-02 +785 799 -1.315380302376555e-02 +785 800 -1.105916272470025e-02 +785 801 -9.403863770832854e-03 +785 802 -8.076052134892578e-03 +785 803 -6.996835383339674e-03 +785 804 -6.109381318875747e-03 +785 805 -5.371977266379786e-03 +785 806 -4.753493624956895e-03 +785 807 -4.230349322908531e-03 +785 808 -3.784439171232937e-03 +785 809 -3.401691470521385e-03 +785 810 -3.071047067257393e-03 +785 811 -2.783725492315671e-03 +785 812 -2.532689975072673e-03 +785 813 -2.312252367280536e-03 +785 814 -2.117777896667794e-03 +785 815 -1.945462087124857e-03 +786 786 3.988394278171947e+01 +786 768 -6.996835383339674e-03 +786 769 -8.076052134892578e-03 +786 770 -9.403863770832854e-03 +786 771 -1.105916272470025e-02 +786 772 -1.315380302376546e-02 +786 773 -1.585023865775526e-02 +786 774 -1.939104886145125e-02 +786 775 -2.415034675252906e-02 +786 776 -3.072751892616543e-02 +786 777 -4.012781031912993e-02 +786 778 -5.413421453123171e-02 +786 779 -7.613960933881254e-02 +786 780 -1.132183869282795e-01 +786 781 -1.820810586422676e-01 +786 782 -3.301555353436815e-01 +786 783 -7.412185823610313e-01 +786 784 -3.165206906282876e+00 +786 785 -1.502055215878367e+01 +786 787 -1.502055215863301e+01 +786 788 -3.165206906282865e+00 +786 789 -7.412185823610162e-01 +786 790 -3.301555353436701e-01 +786 791 -1.820810586422616e-01 +786 792 -1.132183869282750e-01 +786 793 -7.613960933881152e-02 +786 794 -5.413421453123172e-02 +786 795 -4.012781031912956e-02 +786 796 -3.072751892616529e-02 +786 797 -2.415034675252896e-02 +786 798 -1.939104886145111e-02 +786 799 -1.585023865775526e-02 +786 800 -1.315380302376538e-02 +786 801 -1.105916272470022e-02 +786 802 -9.403863770832811e-03 +786 803 -8.076052134892582e-03 +786 804 -6.996835383339671e-03 +786 805 -6.109381318875727e-03 +786 806 -5.371977266379805e-03 +786 807 -4.753493624956895e-03 +786 808 -4.230349322908543e-03 +786 809 -3.784439171232917e-03 +786 810 -3.401691470521394e-03 +786 811 -3.071047067257392e-03 +786 812 -2.783725492315665e-03 +786 813 -2.532689975072680e-03 +786 814 -2.312252367280536e-03 +786 815 -2.117777896667799e-03 +787 787 3.988394278146365e+01 +787 768 -6.109381318875769e-03 +787 769 -6.996835383339673e-03 +787 770 -8.076052134892651e-03 +787 771 -9.403863770832832e-03 +787 772 -1.105916272470025e-02 +787 773 -1.315380302376547e-02 +787 774 -1.585023865775537e-02 +787 775 -1.939104886145119e-02 +787 776 -2.415034675252897e-02 +787 777 -3.072751892616544e-02 +787 778 -4.012781031912998e-02 +787 779 -5.413421453123234e-02 +787 780 -7.613960933881209e-02 +787 781 -1.132183869282766e-01 +787 782 -1.820810586422663e-01 +787 783 -3.301555353436813e-01 +787 784 -7.412185823610280e-01 +787 785 -3.165206906282836e+00 +787 786 -1.502055215863301e+01 +787 788 -1.502055215852572e+01 +787 789 -3.165206906282863e+00 +787 790 -7.412185823610206e-01 +787 791 -3.301555353436746e-01 +787 792 -1.820810586422655e-01 +787 793 -1.132183869282770e-01 +787 794 -7.613960933881181e-02 +787 795 -5.413421453123109e-02 +787 796 -4.012781031912974e-02 +787 797 -3.072751892616542e-02 +787 798 -2.415034675252897e-02 +787 799 -1.939104886145110e-02 +787 800 -1.585023865775514e-02 +787 801 -1.315380302376542e-02 +787 802 -1.105916272470025e-02 +787 803 -9.403863770832814e-03 +787 804 -8.076052134892564e-03 +787 805 -6.996835383339622e-03 +787 806 -6.109381318875730e-03 +787 807 -5.371977266379788e-03 +787 808 -4.753493624956895e-03 +787 809 -4.230349322908508e-03 +787 810 -3.784439171232917e-03 +787 811 -3.401691470521384e-03 +787 812 -3.071047067257376e-03 +787 813 -2.783725492315666e-03 +787 814 -2.532689975072674e-03 +787 815 -2.312252367280536e-03 +788 788 3.988394278128112e+01 +788 768 -5.371977266379790e-03 +788 769 -6.109381318875710e-03 +788 770 -6.996835383339673e-03 +788 771 -8.076052134892568e-03 +788 772 -9.403863770832814e-03 +788 773 -1.105916272470026e-02 +788 774 -1.315380302376555e-02 +788 775 -1.585023865775532e-02 +788 776 -1.939104886145111e-02 +788 777 -2.415034675252897e-02 +788 778 -3.072751892616545e-02 +788 779 -4.012781031913037e-02 +788 780 -5.413421453123205e-02 +788 781 -7.613960933881186e-02 +788 782 -1.132183869282770e-01 +788 783 -1.820810586422667e-01 +788 784 -3.301555353436751e-01 +788 785 -7.412185823610089e-01 +788 786 -3.165206906282865e+00 +788 787 -1.502055215852572e+01 +788 789 -1.502055215844908e+01 +788 790 -3.165206906282887e+00 +788 791 -7.412185823610357e-01 +788 792 -3.301555353436800e-01 +788 793 -1.820810586422656e-01 +788 794 -1.132183869282779e-01 +788 795 -7.613960933881116e-02 +788 796 -5.413421453123138e-02 +788 797 -4.012781031912993e-02 +788 798 -3.072751892616544e-02 +788 799 -2.415034675252896e-02 +788 800 -1.939104886145096e-02 +788 801 -1.585023865775520e-02 +788 802 -1.315380302376546e-02 +788 803 -1.105916272470025e-02 +788 804 -9.403863770832827e-03 +788 805 -8.076052134892582e-03 +788 806 -6.996835383339698e-03 +788 807 -6.109381318875769e-03 +788 808 -5.371977266379837e-03 +788 809 -4.753493624956895e-03 +788 810 -4.230349322908543e-03 +788 811 -3.784439171232936e-03 +788 812 -3.401691470521392e-03 +788 813 -3.071047067257401e-03 +788 814 -2.783725492315679e-03 +788 815 -2.532689975072691e-03 +789 789 3.988394278115154e+01 +789 768 -4.753493624956895e-03 +789 769 -5.371977266379788e-03 +789 770 -6.109381318875769e-03 +789 771 -6.996835383339674e-03 +789 772 -8.076052134892582e-03 +789 773 -9.403863770832816e-03 +789 774 -1.105916272470032e-02 +789 775 -1.315380302376550e-02 +789 776 -1.585023865775526e-02 +789 777 -1.939104886145110e-02 +789 778 -2.415034675252897e-02 +789 779 -3.072751892616572e-02 +789 780 -4.012781031913017e-02 +789 781 -5.413421453123172e-02 +789 782 -7.613960933881170e-02 +789 783 -1.132183869282775e-01 +789 784 -1.820810586422662e-01 +789 785 -3.301555353436753e-01 +789 786 -7.412185823610162e-01 +789 787 -3.165206906282863e+00 +789 788 -1.502055215844908e+01 +789 790 -1.502055215839541e+01 +789 791 -3.165206906282882e+00 +789 792 -7.412185823610196e-01 +789 793 -3.301555353436746e-01 +789 794 -1.820810586422667e-01 +789 795 -1.132183869282773e-01 +789 796 -7.613960933881139e-02 +789 797 -5.413421453123171e-02 +789 798 -4.012781031912998e-02 +789 799 -3.072751892616545e-02 +789 800 -2.415034675252878e-02 +789 801 -1.939104886145103e-02 +789 802 -1.585023865775526e-02 +789 803 -1.315380302376547e-02 +789 804 -1.105916272470026e-02 +789 805 -9.403863770832771e-03 +789 806 -8.076052134892570e-03 +789 807 -6.996835383339674e-03 +789 808 -6.109381318875769e-03 +789 809 -5.371977266379790e-03 +789 810 -4.753493624956895e-03 +789 811 -4.230349322908531e-03 +789 812 -3.784439171232915e-03 +789 813 -3.401691470521394e-03 +789 814 -3.071047067257393e-03 +789 815 -2.783725492315679e-03 +790 790 3.988394278106471e+01 +790 768 -4.230349322908531e-03 +790 769 -4.753493624956881e-03 +790 770 -5.371977266379819e-03 +790 771 -6.109381318875747e-03 +790 772 -6.996835383339671e-03 +790 773 -8.076052134892552e-03 +790 774 -9.403863770832827e-03 +790 775 -1.105916272470022e-02 +790 776 -1.315380302376538e-02 +790 777 -1.585023865775514e-02 +790 778 -1.939104886145097e-02 +790 779 -2.415034675252897e-02 +790 780 -3.072751892616531e-02 +790 781 -4.012781031912956e-02 +790 782 -5.413421453123109e-02 +790 783 -7.613960933881103e-02 +790 784 -1.132183869282754e-01 +790 785 -1.820810586422610e-01 +790 786 -3.301555353436701e-01 +790 787 -7.412185823610206e-01 +790 788 -3.165206906282887e+00 +790 789 -1.502055215839541e+01 +790 791 -1.502055215836221e+01 +790 792 -3.165206906282828e+00 +790 793 -7.412185823610130e-01 +790 794 -3.301555353436747e-01 +790 795 -1.820810586422690e-01 +790 796 -1.132183869282780e-01 +790 797 -7.613960933881236e-02 +790 798 -5.413421453123234e-02 +790 799 -4.012781031913035e-02 +790 800 -3.072751892616544e-02 +790 801 -2.415034675252906e-02 +790 802 -1.939104886145125e-02 +790 803 -1.585023865775537e-02 +790 804 -1.315380302376555e-02 +790 805 -1.105916272470025e-02 +790 806 -9.403863770832811e-03 +790 807 -8.076052134892594e-03 +790 808 -6.996835383339702e-03 +790 809 -6.109381318875734e-03 +790 810 -5.371977266379808e-03 +790 811 -4.753493624956896e-03 +790 812 -4.230349322908520e-03 +790 813 -3.784439171232929e-03 +790 814 -3.401691470521395e-03 +790 815 -3.071047067257401e-03 +791 791 3.988394278102297e+01 +791 768 -3.784439171232915e-03 +791 769 -4.230349322908506e-03 +791 770 -4.753493624956893e-03 +791 771 -5.371977266379786e-03 +791 772 -6.109381318875727e-03 +791 773 -6.996835383339622e-03 +791 774 -8.076052134892604e-03 +791 775 -9.403863770832825e-03 +791 776 -1.105916272470022e-02 +791 777 -1.315380302376542e-02 +791 778 -1.585023865775520e-02 +791 779 -1.939104886145118e-02 +791 780 -2.415034675252897e-02 +791 781 -3.072751892616529e-02 +791 782 -4.012781031912974e-02 +791 783 -5.413421453123141e-02 +791 784 -7.613960933881175e-02 +791 785 -1.132183869282744e-01 +791 786 -1.820810586422616e-01 +791 787 -3.301555353436746e-01 +791 788 -7.412185823610357e-01 +791 789 -3.165206906282882e+00 +791 790 -1.502055215836221e+01 +791 792 -1.502055215835481e+01 +791 793 -3.165206906282882e+00 +791 794 -7.412185823610207e-01 +791 795 -3.301555353436779e-01 +791 796 -1.820810586422658e-01 +791 797 -1.132183869282756e-01 +791 798 -7.613960933881192e-02 +791 799 -5.413421453123204e-02 +791 800 -4.012781031912978e-02 +791 801 -3.072751892616544e-02 +791 802 -2.415034675252906e-02 +791 803 -1.939104886145119e-02 +791 804 -1.585023865775531e-02 +791 805 -1.315380302376542e-02 +791 806 -1.105916272470022e-02 +791 807 -9.403863770832858e-03 +791 808 -8.076052134892655e-03 +791 809 -6.996835383339677e-03 +791 810 -6.109381318875772e-03 +791 811 -5.371977266379821e-03 +791 812 -4.753493624956895e-03 +791 813 -4.230349322908545e-03 +791 814 -3.784439171232938e-03 +791 815 -3.401691470521412e-03 +792 792 3.988394278105610e+01 +792 768 -3.401691470521394e-03 +792 769 -3.784439171232917e-03 +792 770 -4.230349322908543e-03 +792 771 -4.753493624956895e-03 +792 772 -5.371977266379805e-03 +792 773 -6.109381318875730e-03 +792 774 -6.996835383339698e-03 +792 775 -8.076052134892592e-03 +792 776 -9.403863770832811e-03 +792 777 -1.105916272470025e-02 +792 778 -1.315380302376546e-02 +792 779 -1.585023865775536e-02 +792 780 -1.939104886145118e-02 +792 781 -2.415034675252896e-02 +792 782 -3.072751892616542e-02 +792 783 -4.012781031912996e-02 +792 784 -5.413421453123234e-02 +792 785 -7.613960933881186e-02 +792 786 -1.132183869282750e-01 +792 787 -1.820810586422655e-01 +792 788 -3.301555353436800e-01 +792 789 -7.412185823610196e-01 +792 790 -3.165206906282828e+00 +792 791 -1.502055215835481e+01 +792 793 -1.502055215840056e+01 +792 794 -3.165206906282865e+00 +792 795 -7.412185823610218e-01 +792 796 -3.301555353436742e-01 +792 797 -1.820810586422628e-01 +792 798 -1.132183869282761e-01 +792 799 -7.613960933881157e-02 +792 800 -5.413421453123111e-02 +792 801 -4.012781031912974e-02 +792 802 -3.072751892616543e-02 +792 803 -2.415034675252897e-02 +792 804 -1.939104886145111e-02 +792 805 -1.585023865775514e-02 +792 806 -1.315380302376537e-02 +792 807 -1.105916272470025e-02 +792 808 -9.403863770832832e-03 +792 809 -8.076052134892568e-03 +792 810 -6.996835383339674e-03 +792 811 -6.109381318875747e-03 +792 812 -5.371977266379786e-03 +792 813 -4.753493624956895e-03 +792 814 -4.230349322908531e-03 +792 815 -3.784439171232937e-03 +793 793 3.988394278128565e+01 +793 768 -3.071047067257393e-03 +793 769 -3.401691470521385e-03 +793 770 -3.784439171232937e-03 +793 771 -4.230349322908531e-03 +793 772 -4.753493624956895e-03 +793 773 -5.371977266379788e-03 +793 774 -6.109381318875769e-03 +793 775 -6.996835383339674e-03 +793 776 -8.076052134892568e-03 +793 777 -9.403863770832830e-03 +793 778 -1.105916272470026e-02 +793 779 -1.315380302376555e-02 +793 780 -1.585023865775532e-02 +793 781 -1.939104886145111e-02 +793 782 -2.415034675252897e-02 +793 783 -3.072751892616545e-02 +793 784 -4.012781031913039e-02 +793 785 -5.413421453123236e-02 +793 786 -7.613960933881152e-02 +793 787 -1.132183869282770e-01 +793 788 -1.820810586422656e-01 +793 789 -3.301555353436746e-01 +793 790 -7.412185823610130e-01 +793 791 -3.165206906282882e+00 +793 792 -1.502055215840056e+01 +793 794 -1.502055215860520e+01 +793 795 -3.165206906282880e+00 +793 796 -7.412185823610258e-01 +793 797 -3.301555353436806e-01 +793 798 -1.820810586422650e-01 +793 799 -1.132183869282754e-01 +793 800 -7.613960933881049e-02 +793 801 -5.413421453123138e-02 +793 802 -4.012781031912993e-02 +793 803 -3.072751892616544e-02 +793 804 -2.415034675252896e-02 +793 805 -1.939104886145095e-02 +793 806 -1.585023865775514e-02 +793 807 -1.315380302376546e-02 +793 808 -1.105916272470025e-02 +793 809 -9.403863770832814e-03 +793 810 -8.076052134892582e-03 +793 811 -6.996835383339671e-03 +793 812 -6.109381318875727e-03 +793 813 -5.371977266379805e-03 +793 814 -4.753493624956895e-03 +793 815 -4.230349322908543e-03 +794 794 3.988394278152494e+01 +794 768 -2.783725492315679e-03 +794 769 -3.071047067257393e-03 +794 770 -3.401691470521411e-03 +794 771 -3.784439171232937e-03 +794 772 -4.230349322908543e-03 +794 773 -4.753493624956895e-03 +794 774 -5.371977266379837e-03 +794 775 -6.109381318875769e-03 +794 776 -6.996835383339673e-03 +794 777 -8.076052134892639e-03 +794 778 -9.403863770832832e-03 +794 779 -1.105916272470032e-02 +794 780 -1.315380302376550e-02 +794 781 -1.585023865775526e-02 +794 782 -1.939104886145110e-02 +794 783 -2.415034675252897e-02 +794 784 -3.072751892616573e-02 +794 785 -4.012781031913037e-02 +794 786 -5.413421453123172e-02 +794 787 -7.613960933881181e-02 +794 788 -1.132183869282779e-01 +794 789 -1.820810586422667e-01 +794 790 -3.301555353436747e-01 +794 791 -7.412185823610207e-01 +794 792 -3.165206906282865e+00 +794 793 -1.502055215860520e+01 +794 795 -1.502055215859230e+01 +794 796 -3.165206906282882e+00 +794 797 -7.412185823610328e-01 +794 798 -3.301555353436813e-01 +794 799 -1.820810586422631e-01 +794 800 -1.132183869282740e-01 +794 801 -7.613960933881120e-02 +794 802 -5.413421453123171e-02 +794 803 -4.012781031912998e-02 +794 804 -3.072751892616545e-02 +794 805 -2.415034675252877e-02 +794 806 -1.939104886145096e-02 +794 807 -1.585023865775526e-02 +794 808 -1.315380302376547e-02 +794 809 -1.105916272470026e-02 +794 810 -9.403863770832816e-03 +794 811 -8.076052134892552e-03 +794 812 -6.996835383339622e-03 +794 813 -6.109381318875730e-03 +794 814 -5.371977266379788e-03 +794 815 -4.753493624956895e-03 +795 795 3.988394278151357e+01 +795 768 -2.532689975072674e-03 +795 769 -2.783725492315660e-03 +795 770 -3.071047067257393e-03 +795 771 -3.401691470521385e-03 +795 772 -3.784439171232917e-03 +795 773 -4.230349322908508e-03 +795 774 -4.753493624956895e-03 +795 775 -5.371977266379790e-03 +795 776 -6.109381318875710e-03 +795 777 -6.996835383339673e-03 +795 778 -8.076052134892557e-03 +795 779 -9.403863770832813e-03 +795 780 -1.105916272470022e-02 +795 781 -1.315380302376538e-02 +795 782 -1.585023865775514e-02 +795 783 -1.939104886145097e-02 +795 784 -2.415034675252898e-02 +795 785 -3.072751892616545e-02 +795 786 -4.012781031912956e-02 +795 787 -5.413421453123109e-02 +795 788 -7.613960933881116e-02 +795 789 -1.132183869282773e-01 +795 790 -1.820810586422690e-01 +795 791 -3.301555353436779e-01 +795 792 -7.412185823610218e-01 +795 793 -3.165206906282880e+00 +795 794 -1.502055215859230e+01 +795 796 -1.502055215859645e+01 +795 797 -3.165206906282851e+00 +795 798 -7.412185823610253e-01 +795 799 -3.301555353436737e-01 +795 800 -1.820810586422619e-01 +795 801 -1.132183869282770e-01 +795 802 -7.613960933881253e-02 +795 803 -5.413421453123234e-02 +795 804 -4.012781031913035e-02 +795 805 -3.072751892616543e-02 +795 806 -2.415034675252896e-02 +795 807 -1.939104886145125e-02 +795 808 -1.585023865775537e-02 +795 809 -1.315380302376555e-02 +795 810 -1.105916272470032e-02 +795 811 -9.403863770832827e-03 +795 812 -8.076052134892604e-03 +795 813 -6.996835383339698e-03 +795 814 -6.109381318875769e-03 +795 815 -5.371977266379837e-03 +796 796 3.988394278151442e+01 +796 768 -2.312252367280536e-03 +796 769 -2.532689975072674e-03 +796 770 -2.783725492315679e-03 +796 771 -3.071047067257393e-03 +796 772 -3.401691470521394e-03 +796 773 -3.784439171232917e-03 +796 774 -4.230349322908543e-03 +796 775 -4.753493624956895e-03 +796 776 -5.371977266379788e-03 +796 777 -6.109381318875769e-03 +796 778 -6.996835383339674e-03 +796 779 -8.076052134892592e-03 +796 780 -9.403863770832825e-03 +796 781 -1.105916272470022e-02 +796 782 -1.315380302376542e-02 +796 783 -1.585023865775520e-02 +796 784 -1.939104886145118e-02 +796 785 -2.415034675252906e-02 +796 786 -3.072751892616529e-02 +796 787 -4.012781031912974e-02 +796 788 -5.413421453123138e-02 +796 789 -7.613960933881139e-02 +796 790 -1.132183869282780e-01 +796 791 -1.820810586422658e-01 +796 792 -3.301555353436742e-01 +796 793 -7.412185823610258e-01 +796 794 -3.165206906282882e+00 +796 795 -1.502055215859645e+01 +796 797 -1.502055215858806e+01 +796 798 -3.165206906282893e+00 +796 799 -7.412185823610254e-01 +796 800 -3.301555353436716e-01 +796 801 -1.820810586422679e-01 +796 802 -1.132183869282786e-01 +796 803 -7.613960933881189e-02 +796 804 -5.413421453123204e-02 +796 805 -4.012781031912976e-02 +796 806 -3.072751892616530e-02 +796 807 -2.415034675252906e-02 +796 808 -1.939104886145119e-02 +796 809 -1.585023865775532e-02 +796 810 -1.315380302376550e-02 +796 811 -1.105916272470022e-02 +796 812 -9.403863770832825e-03 +796 813 -8.076052134892592e-03 +796 814 -6.996835383339674e-03 +796 815 -6.109381318875769e-03 +797 797 3.988394278153933e+01 +797 768 -2.117777896667793e-03 +797 769 -2.312252367280530e-03 +797 770 -2.532689975072684e-03 +797 771 -2.783725492315671e-03 +797 772 -3.071047067257392e-03 +797 773 -3.401691470521384e-03 +797 774 -3.784439171232936e-03 +797 775 -4.230349322908531e-03 +797 776 -4.753493624956881e-03 +797 777 -5.371977266379819e-03 +797 778 -6.109381318875747e-03 +797 779 -6.996835383339671e-03 +797 780 -8.076052134892575e-03 +797 781 -9.403863770832827e-03 +797 782 -1.105916272470025e-02 +797 783 -1.315380302376546e-02 +797 784 -1.585023865775537e-02 +797 785 -1.939104886145125e-02 +797 786 -2.415034675252896e-02 +797 787 -3.072751892616542e-02 +797 788 -4.012781031912993e-02 +797 789 -5.413421453123171e-02 +797 790 -7.613960933881236e-02 +797 791 -1.132183869282756e-01 +797 792 -1.820810586422628e-01 +797 793 -3.301555353436806e-01 +797 794 -7.412185823610328e-01 +797 795 -3.165206906282851e+00 +797 796 -1.502055215858806e+01 +797 798 -1.502055215864000e+01 +797 799 -3.165206906282878e+00 +797 800 -7.412185823610105e-01 +797 801 -3.301555353436749e-01 +797 802 -1.820810586422688e-01 +797 803 -1.132183869282775e-01 +797 804 -7.613960933881184e-02 +797 805 -5.413421453123109e-02 +797 806 -4.012781031912954e-02 +797 807 -3.072751892616543e-02 +797 808 -2.415034675252897e-02 +797 809 -1.939104886145111e-02 +797 810 -1.585023865775526e-02 +797 811 -1.315380302376538e-02 +797 812 -1.105916272470022e-02 +797 813 -9.403863770832811e-03 +797 814 -8.076052134892583e-03 +797 815 -6.996835383339702e-03 +798 798 3.988394278164026e+01 +798 768 -1.945462087124849e-03 +798 769 -2.117777896667784e-03 +798 770 -2.312252367280535e-03 +798 771 -2.532689975072673e-03 +798 772 -2.783725492315665e-03 +798 773 -3.071047067257376e-03 +798 774 -3.401691470521392e-03 +798 775 -3.784439171232915e-03 +798 776 -4.230349322908506e-03 +798 777 -4.753493624956893e-03 +798 778 -5.371977266379786e-03 +798 779 -6.109381318875727e-03 +798 780 -6.996835383339622e-03 +798 781 -8.076052134892594e-03 +798 782 -9.403863770832814e-03 +798 783 -1.105916272470026e-02 +798 784 -1.315380302376555e-02 +798 785 -1.585023865775537e-02 +798 786 -1.939104886145111e-02 +798 787 -2.415034675252897e-02 +798 788 -3.072751892616544e-02 +798 789 -4.012781031912998e-02 +798 790 -5.413421453123234e-02 +798 791 -7.613960933881192e-02 +798 792 -1.132183869282761e-01 +798 793 -1.820810586422650e-01 +798 794 -3.301555353436813e-01 +798 795 -7.412185823610253e-01 +798 796 -3.165206906282893e+00 +798 797 -1.502055215864000e+01 +798 799 -1.502055215866001e+01 +798 800 -3.165206906282871e+00 +798 801 -7.412185823610196e-01 +798 802 -3.301555353436753e-01 +798 803 -1.820810586422651e-01 +798 804 -1.132183869282763e-01 +798 805 -7.613960933881098e-02 +798 806 -5.413421453123106e-02 +798 807 -4.012781031912993e-02 +798 808 -3.072751892616544e-02 +798 809 -2.415034675252897e-02 +798 810 -1.939104886145110e-02 +798 811 -1.585023865775514e-02 +798 812 -1.315380302376542e-02 +798 813 -1.105916272470025e-02 +798 814 -9.403863770832832e-03 +798 815 -8.076052134892642e-03 +799 799 3.988394278169704e+01 +799 768 -1.792160480940038e-03 +799 769 -1.945462087124849e-03 +799 770 -2.117777896667799e-03 +799 771 -2.312252367280536e-03 +799 772 -2.532689975072680e-03 +799 773 -2.783725492315666e-03 +799 774 -3.071047067257401e-03 +799 775 -3.401691470521394e-03 +799 776 -3.784439171232917e-03 +799 777 -4.230349322908543e-03 +799 778 -4.753493624956895e-03 +799 779 -5.371977266379805e-03 +799 780 -6.109381318875730e-03 +799 781 -6.996835383339698e-03 +799 782 -8.076052134892582e-03 +799 783 -9.403863770832816e-03 +799 784 -1.105916272470032e-02 +799 785 -1.315380302376555e-02 +799 786 -1.585023865775526e-02 +799 787 -1.939104886145110e-02 +799 788 -2.415034675252896e-02 +799 789 -3.072751892616545e-02 +799 790 -4.012781031913035e-02 +799 791 -5.413421453123204e-02 +799 792 -7.613960933881157e-02 +799 793 -1.132183869282754e-01 +799 794 -1.820810586422631e-01 +799 795 -3.301555353436737e-01 +799 796 -7.412185823610254e-01 +799 797 -3.165206906282878e+00 +799 798 -1.502055215866001e+01 +799 800 -1.502055215931062e+01 +799 801 -3.165206906282871e+00 +799 802 -7.412185823610272e-01 +799 803 -3.301555353436822e-01 +799 804 -1.820810586422661e-01 +799 805 -1.132183869282763e-01 +799 806 -7.613960933881103e-02 +799 807 -5.413421453123171e-02 +799 808 -4.012781031912998e-02 +799 809 -3.072751892616545e-02 +799 810 -2.415034675252897e-02 +799 811 -1.939104886145097e-02 +799 812 -1.585023865775520e-02 +799 813 -1.315380302376546e-02 +799 814 -1.105916272470026e-02 +799 815 -9.403863770832832e-03 +800 800 3.988394278169706e+01 +800 784 -9.403863770832833e-03 +800 785 -1.105916272470025e-02 +800 786 -1.315380302376538e-02 +800 787 -1.585023865775514e-02 +800 788 -1.939104886145096e-02 +800 789 -2.415034675252878e-02 +800 790 -3.072751892616544e-02 +800 791 -4.012781031912978e-02 +800 792 -5.413421453123111e-02 +800 793 -7.613960933881049e-02 +800 794 -1.132183869282740e-01 +800 795 -1.820810586422619e-01 +800 796 -3.301555353436716e-01 +800 797 -7.412185823610105e-01 +800 798 -3.165206906282871e+00 +800 799 -1.502055215931062e+01 +800 801 -1.502055215866002e+01 +800 802 -3.165206906282882e+00 +800 803 -7.412185823610468e-01 +800 804 -3.301555353436828e-01 +800 805 -1.820810586422660e-01 +800 806 -1.132183869282770e-01 +800 807 -7.613960933881223e-02 +800 808 -5.413421453123234e-02 +800 809 -4.012781031913037e-02 +800 810 -3.072751892616572e-02 +800 811 -2.415034675252897e-02 +800 812 -1.939104886145118e-02 +800 813 -1.585023865775536e-02 +800 814 -1.315380302376555e-02 +800 815 -1.105916272470032e-02 +800 816 -9.403863770832813e-03 +800 817 -8.076052134892592e-03 +800 818 -6.996835383339671e-03 +800 819 -6.109381318875727e-03 +800 820 -5.371977266379805e-03 +800 821 -4.753493624956895e-03 +800 822 -4.230349322908543e-03 +800 823 -3.784439171232917e-03 +800 824 -3.401691470521394e-03 +800 825 -3.071047067257392e-03 +800 826 -2.783725492315665e-03 +800 827 -2.532689975072680e-03 +800 828 -2.312252367280536e-03 +800 829 -2.117777896667799e-03 +800 830 -1.945462087124849e-03 +800 831 -1.792160480940038e-03 +801 801 3.988394278164019e+01 +801 784 -8.076052134892655e-03 +801 785 -9.403863770832854e-03 +801 786 -1.105916272470022e-02 +801 787 -1.315380302376542e-02 +801 788 -1.585023865775520e-02 +801 789 -1.939104886145103e-02 +801 790 -2.415034675252906e-02 +801 791 -3.072751892616544e-02 +801 792 -4.012781031912974e-02 +801 793 -5.413421453123138e-02 +801 794 -7.613960933881120e-02 +801 795 -1.132183869282770e-01 +801 796 -1.820810586422679e-01 +801 797 -3.301555353436749e-01 +801 798 -7.412185823610196e-01 +801 799 -3.165206906282871e+00 +801 800 -1.502055215866002e+01 +801 802 -1.502055215863997e+01 +801 803 -3.165206906282902e+00 +801 804 -7.412185823610254e-01 +801 805 -3.301555353436728e-01 +801 806 -1.820810586422615e-01 +801 807 -1.132183869282735e-01 +801 808 -7.613960933881139e-02 +801 809 -5.413421453123205e-02 +801 810 -4.012781031913017e-02 +801 811 -3.072751892616531e-02 +801 812 -2.415034675252897e-02 +801 813 -1.939104886145118e-02 +801 814 -1.585023865775532e-02 +801 815 -1.315380302376550e-02 +801 816 -1.105916272470022e-02 +801 817 -9.403863770832825e-03 +801 818 -8.076052134892575e-03 +801 819 -6.996835383339622e-03 +801 820 -6.109381318875730e-03 +801 821 -5.371977266379788e-03 +801 822 -4.753493624956895e-03 +801 823 -4.230349322908508e-03 +801 824 -3.784439171232917e-03 +801 825 -3.401691470521384e-03 +801 826 -3.071047067257376e-03 +801 827 -2.783725492315666e-03 +801 828 -2.532689975072674e-03 +801 829 -2.312252367280536e-03 +801 830 -2.117777896667785e-03 +801 831 -1.945462087124849e-03 +802 802 3.988394278153934e+01 +802 784 -6.996835383339677e-03 +802 785 -8.076052134892578e-03 +802 786 -9.403863770832811e-03 +802 787 -1.105916272470025e-02 +802 788 -1.315380302376546e-02 +802 789 -1.585023865775526e-02 +802 790 -1.939104886145125e-02 +802 791 -2.415034675252906e-02 +802 792 -3.072751892616543e-02 +802 793 -4.012781031912993e-02 +802 794 -5.413421453123171e-02 +802 795 -7.613960933881253e-02 +802 796 -1.132183869282786e-01 +802 797 -1.820810586422688e-01 +802 798 -3.301555353436753e-01 +802 799 -7.412185823610272e-01 +802 800 -3.165206906282882e+00 +802 801 -1.502055215863997e+01 +802 803 -1.502055215858810e+01 +802 804 -3.165206906282849e+00 +802 805 -7.412185823610152e-01 +802 806 -3.301555353436710e-01 +802 807 -1.820810586422611e-01 +802 808 -1.132183869282749e-01 +802 809 -7.613960933881174e-02 +802 810 -5.413421453123172e-02 +802 811 -4.012781031912956e-02 +802 812 -3.072751892616529e-02 +802 813 -2.415034675252896e-02 +802 814 -1.939104886145111e-02 +802 815 -1.585023865775526e-02 +802 816 -1.315380302376538e-02 +802 817 -1.105916272470022e-02 +802 818 -9.403863770832827e-03 +802 819 -8.076052134892594e-03 +802 820 -6.996835383339698e-03 +802 821 -6.109381318875769e-03 +802 822 -5.371977266379837e-03 +802 823 -4.753493624956895e-03 +802 824 -4.230349322908543e-03 +802 825 -3.784439171232936e-03 +802 826 -3.401691470521392e-03 +802 827 -3.071047067257401e-03 +802 828 -2.783725492315679e-03 +802 829 -2.532689975072691e-03 +802 830 -2.312252367280536e-03 +802 831 -2.117777896667799e-03 +803 803 3.988394278151440e+01 +803 784 -6.109381318875772e-03 +803 785 -6.996835383339674e-03 +803 786 -8.076052134892582e-03 +803 787 -9.403863770832814e-03 +803 788 -1.105916272470025e-02 +803 789 -1.315380302376547e-02 +803 790 -1.585023865775537e-02 +803 791 -1.939104886145119e-02 +803 792 -2.415034675252897e-02 +803 793 -3.072751892616544e-02 +803 794 -4.012781031912998e-02 +803 795 -5.413421453123234e-02 +803 796 -7.613960933881189e-02 +803 797 -1.132183869282775e-01 +803 798 -1.820810586422651e-01 +803 799 -3.301555353436822e-01 +803 800 -7.412185823610468e-01 +803 801 -3.165206906282902e+00 +803 802 -1.502055215858810e+01 +803 804 -1.502055215859639e+01 +803 805 -3.165206906282873e+00 +803 806 -7.412185823610073e-01 +803 807 -3.301555353436723e-01 +803 808 -1.820810586422651e-01 +803 809 -1.132183869282781e-01 +803 810 -7.613960933881184e-02 +803 811 -5.413421453123109e-02 +803 812 -4.012781031912974e-02 +803 813 -3.072751892616542e-02 +803 814 -2.415034675252897e-02 +803 815 -1.939104886145110e-02 +803 816 -1.585023865775514e-02 +803 817 -1.315380302376542e-02 +803 818 -1.105916272470025e-02 +803 819 -9.403863770832814e-03 +803 820 -8.076052134892582e-03 +803 821 -6.996835383339674e-03 +803 822 -6.109381318875769e-03 +803 823 -5.371977266379790e-03 +803 824 -4.753493624956895e-03 +803 825 -4.230349322908531e-03 +803 826 -3.784439171232915e-03 +803 827 -3.401691470521394e-03 +803 828 -3.071047067257393e-03 +803 829 -2.783725492315679e-03 +803 830 -2.532689975072674e-03 +803 831 -2.312252367280536e-03 +804 804 3.988394278151357e+01 +804 784 -5.371977266379821e-03 +804 785 -6.109381318875747e-03 +804 786 -6.996835383339671e-03 +804 787 -8.076052134892564e-03 +804 788 -9.403863770832827e-03 +804 789 -1.105916272470026e-02 +804 790 -1.315380302376555e-02 +804 791 -1.585023865775531e-02 +804 792 -1.939104886145111e-02 +804 793 -2.415034675252896e-02 +804 794 -3.072751892616545e-02 +804 795 -4.012781031913035e-02 +804 796 -5.413421453123204e-02 +804 797 -7.613960933881184e-02 +804 798 -1.132183869282763e-01 +804 799 -1.820810586422661e-01 +804 800 -3.301555353436828e-01 +804 801 -7.412185823610254e-01 +804 802 -3.165206906282849e+00 +804 803 -1.502055215859639e+01 +804 805 -1.502055215859237e+01 +804 806 -3.165206906282871e+00 +804 807 -7.412185823610231e-01 +804 808 -3.301555353436749e-01 +804 809 -1.820810586422683e-01 +804 810 -1.132183869282779e-01 +804 811 -7.613960933881117e-02 +804 812 -5.413421453123141e-02 +804 813 -4.012781031912996e-02 +804 814 -3.072751892616545e-02 +804 815 -2.415034675252897e-02 +804 816 -1.939104886145097e-02 +804 817 -1.585023865775520e-02 +804 818 -1.315380302376546e-02 +804 819 -1.105916272470026e-02 +804 820 -9.403863770832816e-03 +804 821 -8.076052134892573e-03 +804 822 -6.996835383339702e-03 +804 823 -6.109381318875734e-03 +804 824 -5.371977266379808e-03 +804 825 -4.753493624956896e-03 +804 826 -4.230349322908520e-03 +804 827 -3.784439171232929e-03 +804 828 -3.401691470521395e-03 +804 829 -3.071047067257401e-03 +804 830 -2.783725492315667e-03 +804 831 -2.532689975072680e-03 +805 805 3.988394278152499e+01 +805 784 -4.753493624956895e-03 +805 785 -5.371977266379786e-03 +805 786 -6.109381318875727e-03 +805 787 -6.996835383339622e-03 +805 788 -8.076052134892582e-03 +805 789 -9.403863770832771e-03 +805 790 -1.105916272470025e-02 +805 791 -1.315380302376542e-02 +805 792 -1.585023865775514e-02 +805 793 -1.939104886145095e-02 +805 794 -2.415034675252877e-02 +805 795 -3.072751892616543e-02 +805 796 -4.012781031912976e-02 +805 797 -5.413421453123109e-02 +805 798 -7.613960933881098e-02 +805 799 -1.132183869282763e-01 +805 800 -1.820810586422660e-01 +805 801 -3.301555353436728e-01 +805 802 -7.412185823610152e-01 +805 803 -3.165206906282873e+00 +805 804 -1.502055215859237e+01 +805 806 -1.502055215860516e+01 +805 807 -3.165206906282882e+00 +805 808 -7.412185823610296e-01 +805 809 -3.301555353436834e-01 +805 810 -1.820810586422675e-01 +805 811 -1.132183869282775e-01 +805 812 -7.613960933881207e-02 +805 813 -5.413421453123234e-02 +805 814 -4.012781031913039e-02 +805 815 -3.072751892616573e-02 +805 816 -2.415034675252898e-02 +805 817 -1.939104886145118e-02 +805 818 -1.585023865775537e-02 +805 819 -1.315380302376555e-02 +805 820 -1.105916272470032e-02 +805 821 -9.403863770832833e-03 +805 822 -8.076052134892655e-03 +805 823 -6.996835383339677e-03 +805 824 -6.109381318875772e-03 +805 825 -5.371977266379821e-03 +805 826 -4.753493624956895e-03 +805 827 -4.230349322908545e-03 +805 828 -3.784439171232938e-03 +805 829 -3.401691470521412e-03 +805 830 -3.071047067257394e-03 +805 831 -2.783725492315679e-03 +806 806 3.988394278128567e+01 +806 784 -4.230349322908545e-03 +806 785 -4.753493624956895e-03 +806 786 -5.371977266379805e-03 +806 787 -6.109381318875730e-03 +806 788 -6.996835383339698e-03 +806 789 -8.076052134892570e-03 +806 790 -9.403863770832811e-03 +806 791 -1.105916272470022e-02 +806 792 -1.315380302376537e-02 +806 793 -1.585023865775514e-02 +806 794 -1.939104886145096e-02 +806 795 -2.415034675252896e-02 +806 796 -3.072751892616530e-02 +806 797 -4.012781031912954e-02 +806 798 -5.413421453123106e-02 +806 799 -7.613960933881103e-02 +806 800 -1.132183869282770e-01 +806 801 -1.820810586422615e-01 +806 802 -3.301555353436710e-01 +806 803 -7.412185823610073e-01 +806 804 -3.165206906282871e+00 +806 805 -1.502055215860516e+01 +806 807 -1.502055215840063e+01 +806 808 -3.165206906282892e+00 +806 809 -7.412185823610321e-01 +806 810 -3.301555353436823e-01 +806 811 -1.820810586422667e-01 +806 812 -1.132183869282771e-01 +806 813 -7.613960933881220e-02 +806 814 -5.413421453123236e-02 +806 815 -4.012781031913037e-02 +806 816 -3.072751892616545e-02 +806 817 -2.415034675252906e-02 +806 818 -1.939104886145125e-02 +806 819 -1.585023865775537e-02 +806 820 -1.315380302376555e-02 +806 821 -1.105916272470025e-02 +806 822 -9.403863770832854e-03 +806 823 -8.076052134892578e-03 +806 824 -6.996835383339674e-03 +806 825 -6.109381318875747e-03 +806 826 -5.371977266379786e-03 +806 827 -4.753493624956895e-03 +806 828 -4.230349322908531e-03 +806 829 -3.784439171232937e-03 +806 830 -3.401691470521385e-03 +806 831 -3.071047067257393e-03 +807 807 3.988394278105611e+01 +807 784 -3.784439171232938e-03 +807 785 -4.230349322908531e-03 +807 786 -4.753493624956895e-03 +807 787 -5.371977266379788e-03 +807 788 -6.109381318875769e-03 +807 789 -6.996835383339674e-03 +807 790 -8.076052134892594e-03 +807 791 -9.403863770832858e-03 +807 792 -1.105916272470025e-02 +807 793 -1.315380302376546e-02 +807 794 -1.585023865775526e-02 +807 795 -1.939104886145125e-02 +807 796 -2.415034675252906e-02 +807 797 -3.072751892616543e-02 +807 798 -4.012781031912993e-02 +807 799 -5.413421453123171e-02 +807 800 -7.613960933881223e-02 +807 801 -1.132183869282735e-01 +807 802 -1.820810586422611e-01 +807 803 -3.301555353436723e-01 +807 804 -7.412185823610231e-01 +807 805 -3.165206906282882e+00 +807 806 -1.502055215840063e+01 +807 808 -1.502055215835477e+01 +807 809 -3.165206906282821e+00 +807 810 -7.412185823610193e-01 +807 811 -3.301555353436761e-01 +807 812 -1.820810586422663e-01 +807 813 -1.132183869282766e-01 +807 814 -7.613960933881192e-02 +807 815 -5.413421453123172e-02 +807 816 -4.012781031912956e-02 +807 817 -3.072751892616529e-02 +807 818 -2.415034675252896e-02 +807 819 -1.939104886145111e-02 +807 820 -1.585023865775526e-02 +807 821 -1.315380302376538e-02 +807 822 -1.105916272470022e-02 +807 823 -9.403863770832811e-03 +807 824 -8.076052134892582e-03 +807 825 -6.996835383339671e-03 +807 826 -6.109381318875727e-03 +807 827 -5.371977266379805e-03 +807 828 -4.753493624956895e-03 +807 829 -4.230349322908543e-03 +807 830 -3.784439171232917e-03 +807 831 -3.401691470521394e-03 +808 808 3.988394278102299e+01 +808 784 -3.401691470521412e-03 +808 785 -3.784439171232937e-03 +808 786 -4.230349322908543e-03 +808 787 -4.753493624956895e-03 +808 788 -5.371977266379837e-03 +808 789 -6.109381318875769e-03 +808 790 -6.996835383339702e-03 +808 791 -8.076052134892655e-03 +808 792 -9.403863770832832e-03 +808 793 -1.105916272470025e-02 +808 794 -1.315380302376547e-02 +808 795 -1.585023865775537e-02 +808 796 -1.939104886145119e-02 +808 797 -2.415034675252897e-02 +808 798 -3.072751892616544e-02 +808 799 -4.012781031912998e-02 +808 800 -5.413421453123234e-02 +808 801 -7.613960933881139e-02 +808 802 -1.132183869282749e-01 +808 803 -1.820810586422651e-01 +808 804 -3.301555353436749e-01 +808 805 -7.412185823610296e-01 +808 806 -3.165206906282892e+00 +808 807 -1.502055215835477e+01 +808 809 -1.502055215836224e+01 +808 810 -3.165206906282894e+00 +808 811 -7.412185823610254e-01 +808 812 -3.301555353436725e-01 +808 813 -1.820810586422635e-01 +808 814 -1.132183869282760e-01 +808 815 -7.613960933881153e-02 +808 816 -5.413421453123109e-02 +808 817 -4.012781031912974e-02 +808 818 -3.072751892616542e-02 +808 819 -2.415034675252897e-02 +808 820 -1.939104886145110e-02 +808 821 -1.585023865775514e-02 +808 822 -1.315380302376542e-02 +808 823 -1.105916272470025e-02 +808 824 -9.403863770832814e-03 +808 825 -8.076052134892564e-03 +808 826 -6.996835383339622e-03 +808 827 -6.109381318875730e-03 +808 828 -5.371977266379788e-03 +808 829 -4.753493624956895e-03 +808 830 -4.230349322908508e-03 +808 831 -3.784439171232917e-03 +809 809 3.988394278106475e+01 +809 784 -3.071047067257394e-03 +809 785 -3.401691470521385e-03 +809 786 -3.784439171232917e-03 +809 787 -4.230349322908508e-03 +809 788 -4.753493624956895e-03 +809 789 -5.371977266379790e-03 +809 790 -6.109381318875734e-03 +809 791 -6.996835383339677e-03 +809 792 -8.076052134892568e-03 +809 793 -9.403863770832814e-03 +809 794 -1.105916272470026e-02 +809 795 -1.315380302376555e-02 +809 796 -1.585023865775532e-02 +809 797 -1.939104886145111e-02 +809 798 -2.415034675252897e-02 +809 799 -3.072751892616545e-02 +809 800 -4.012781031913037e-02 +809 801 -5.413421453123205e-02 +809 802 -7.613960933881174e-02 +809 803 -1.132183869282781e-01 +809 804 -1.820810586422683e-01 +809 805 -3.301555353436834e-01 +809 806 -7.412185823610321e-01 +809 807 -3.165206906282821e+00 +809 808 -1.502055215836224e+01 +809 810 -1.502055215839541e+01 +809 811 -3.165206906282873e+00 +809 812 -7.412185823610127e-01 +809 813 -3.301555353436704e-01 +809 814 -1.820810586422615e-01 +809 815 -1.132183869282744e-01 +809 816 -7.613960933881049e-02 +809 817 -5.413421453123138e-02 +809 818 -4.012781031912993e-02 +809 819 -3.072751892616544e-02 +809 820 -2.415034675252896e-02 +809 821 -1.939104886145096e-02 +809 822 -1.585023865775520e-02 +809 823 -1.315380302376546e-02 +809 824 -1.105916272470025e-02 +809 825 -9.403863770832828e-03 +809 826 -8.076052134892594e-03 +809 827 -6.996835383339698e-03 +809 828 -6.109381318875769e-03 +809 829 -5.371977266379837e-03 +809 830 -4.753493624956895e-03 +809 831 -4.230349322908543e-03 +810 810 3.988394278115153e+01 +810 784 -2.783725492315679e-03 +810 785 -3.071047067257393e-03 +810 786 -3.401691470521394e-03 +810 787 -3.784439171232917e-03 +810 788 -4.230349322908543e-03 +810 789 -4.753493624956895e-03 +810 790 -5.371977266379808e-03 +810 791 -6.109381318875772e-03 +810 792 -6.996835383339674e-03 +810 793 -8.076052134892582e-03 +810 794 -9.403863770832816e-03 +810 795 -1.105916272470032e-02 +810 796 -1.315380302376550e-02 +810 797 -1.585023865775526e-02 +810 798 -1.939104886145110e-02 +810 799 -2.415034675252897e-02 +810 800 -3.072751892616572e-02 +810 801 -4.012781031913017e-02 +810 802 -5.413421453123172e-02 +810 803 -7.613960933881184e-02 +810 804 -1.132183869282779e-01 +810 805 -1.820810586422675e-01 +810 806 -3.301555353436823e-01 +810 807 -7.412185823610193e-01 +810 808 -3.165206906282894e+00 +810 809 -1.502055215839541e+01 +810 811 -1.502055215844904e+01 +810 812 -3.165206906282862e+00 +810 813 -7.412185823610175e-01 +810 814 -3.301555353436734e-01 +810 815 -1.820810586422635e-01 +810 816 -1.132183869282756e-01 +810 817 -7.613960933881123e-02 +810 818 -5.413421453123171e-02 +810 819 -4.012781031912998e-02 +810 820 -3.072751892616545e-02 +810 821 -2.415034675252878e-02 +810 822 -1.939104886145103e-02 +810 823 -1.585023865775526e-02 +810 824 -1.315380302376547e-02 +810 825 -1.105916272470026e-02 +810 826 -9.403863770832816e-03 +810 827 -8.076052134892570e-03 +810 828 -6.996835383339674e-03 +810 829 -6.109381318875769e-03 +810 830 -5.371977266379790e-03 +810 831 -4.753493624956895e-03 +811 811 3.988394278128114e+01 +811 784 -2.532689975072685e-03 +811 785 -2.783725492315671e-03 +811 786 -3.071047067257392e-03 +811 787 -3.401691470521384e-03 +811 788 -3.784439171232936e-03 +811 789 -4.230349322908531e-03 +811 790 -4.753493624956896e-03 +811 791 -5.371977266379821e-03 +811 792 -6.109381318875747e-03 +811 793 -6.996835383339671e-03 +811 794 -8.076052134892552e-03 +811 795 -9.403863770832827e-03 +811 796 -1.105916272470022e-02 +811 797 -1.315380302376538e-02 +811 798 -1.585023865775514e-02 +811 799 -1.939104886145097e-02 +811 800 -2.415034675252897e-02 +811 801 -3.072751892616531e-02 +811 802 -4.012781031912956e-02 +811 803 -5.413421453123109e-02 +811 804 -7.613960933881117e-02 +811 805 -1.132183869282775e-01 +811 806 -1.820810586422667e-01 +811 807 -3.301555353436761e-01 +811 808 -7.412185823610254e-01 +811 809 -3.165206906282873e+00 +811 810 -1.502055215844904e+01 +811 812 -1.502055215852575e+01 +811 813 -3.165206906282877e+00 +811 814 -7.412185823610213e-01 +811 815 -3.301555353436816e-01 +811 816 -1.820810586422654e-01 +811 817 -1.132183869282761e-01 +811 818 -7.613960933881252e-02 +811 819 -5.413421453123234e-02 +811 820 -4.012781031913035e-02 +811 821 -3.072751892616544e-02 +811 822 -2.415034675252906e-02 +811 823 -1.939104886145125e-02 +811 824 -1.585023865775537e-02 +811 825 -1.315380302376555e-02 +811 826 -1.105916272470032e-02 +811 827 -9.403863770832813e-03 +811 828 -8.076052134892594e-03 +811 829 -6.996835383339702e-03 +811 830 -6.109381318875734e-03 +811 831 -5.371977266379808e-03 +812 812 3.988394278146368e+01 +812 784 -2.312252367280536e-03 +812 785 -2.532689975072673e-03 +812 786 -2.783725492315665e-03 +812 787 -3.071047067257376e-03 +812 788 -3.401691470521392e-03 +812 789 -3.784439171232915e-03 +812 790 -4.230349322908520e-03 +812 791 -4.753493624956895e-03 +812 792 -5.371977266379786e-03 +812 793 -6.109381318875727e-03 +812 794 -6.996835383339622e-03 +812 795 -8.076052134892604e-03 +812 796 -9.403863770832825e-03 +812 797 -1.105916272470022e-02 +812 798 -1.315380302376542e-02 +812 799 -1.585023865775520e-02 +812 800 -1.939104886145118e-02 +812 801 -2.415034675252897e-02 +812 802 -3.072751892616529e-02 +812 803 -4.012781031912974e-02 +812 804 -5.413421453123141e-02 +812 805 -7.613960933881207e-02 +812 806 -1.132183869282771e-01 +812 807 -1.820810586422663e-01 +812 808 -3.301555353436725e-01 +812 809 -7.412185823610127e-01 +812 810 -3.165206906282862e+00 +812 811 -1.502055215852575e+01 +812 813 -1.502055215863298e+01 +812 814 -3.165206906282854e+00 +812 815 -7.412185823610390e-01 +812 816 -3.301555353436819e-01 +812 817 -1.820810586422657e-01 +812 818 -1.132183869282786e-01 +812 819 -7.613960933881211e-02 +812 820 -5.413421453123204e-02 +812 821 -4.012781031912978e-02 +812 822 -3.072751892616544e-02 +812 823 -2.415034675252906e-02 +812 824 -1.939104886145119e-02 +812 825 -1.585023865775532e-02 +812 826 -1.315380302376550e-02 +812 827 -1.105916272470022e-02 +812 828 -9.403863770832842e-03 +812 829 -8.076052134892653e-03 +812 830 -6.996835383339677e-03 +812 831 -6.109381318875772e-03 +813 813 3.988394278171953e+01 +813 784 -2.117777896667799e-03 +813 785 -2.312252367280536e-03 +813 786 -2.532689975072680e-03 +813 787 -2.783725492315666e-03 +813 788 -3.071047067257401e-03 +813 789 -3.401691470521394e-03 +813 790 -3.784439171232929e-03 +813 791 -4.230349322908545e-03 +813 792 -4.753493624956895e-03 +813 793 -5.371977266379805e-03 +813 794 -6.109381318875730e-03 +813 795 -6.996835383339698e-03 +813 796 -8.076052134892592e-03 +813 797 -9.403863770832811e-03 +813 798 -1.105916272470025e-02 +813 799 -1.315380302376546e-02 +813 800 -1.585023865775536e-02 +813 801 -1.939104886145118e-02 +813 802 -2.415034675252896e-02 +813 803 -3.072751892616542e-02 +813 804 -4.012781031912996e-02 +813 805 -5.413421453123234e-02 +813 806 -7.613960933881220e-02 +813 807 -1.132183869282766e-01 +813 808 -1.820810586422635e-01 +813 809 -3.301555353436704e-01 +813 810 -7.412185823610175e-01 +813 811 -3.165206906282877e+00 +813 812 -1.502055215863298e+01 +813 814 -1.502055215878371e+01 +813 815 -3.165206906282912e+00 +813 816 -7.412185823610391e-01 +813 817 -3.301555353436755e-01 +813 818 -1.820810586422687e-01 +813 819 -1.132183869282785e-01 +813 820 -7.613960933881185e-02 +813 821 -5.413421453123111e-02 +813 822 -4.012781031912974e-02 +813 823 -3.072751892616543e-02 +813 824 -2.415034675252897e-02 +813 825 -1.939104886145111e-02 +813 826 -1.585023865775526e-02 +813 827 -1.315380302376538e-02 +813 828 -1.105916272470022e-02 +813 829 -9.403863770832828e-03 +813 830 -8.076052134892568e-03 +813 831 -6.996835383339674e-03 +814 814 3.988394278208173e+01 +814 784 -1.945462087124858e-03 +814 785 -2.117777896667794e-03 +814 786 -2.312252367280536e-03 +814 787 -2.532689975072674e-03 +814 788 -2.783725492315679e-03 +814 789 -3.071047067257393e-03 +814 790 -3.401691470521395e-03 +814 791 -3.784439171232938e-03 +814 792 -4.230349322908531e-03 +814 793 -4.753493624956895e-03 +814 794 -5.371977266379788e-03 +814 795 -6.109381318875769e-03 +814 796 -6.996835383339674e-03 +814 797 -8.076052134892583e-03 +814 798 -9.403863770832832e-03 +814 799 -1.105916272470026e-02 +814 800 -1.315380302376555e-02 +814 801 -1.585023865775532e-02 +814 802 -1.939104886145111e-02 +814 803 -2.415034675252897e-02 +814 804 -3.072751892616545e-02 +814 805 -4.012781031913039e-02 +814 806 -5.413421453123236e-02 +814 807 -7.613960933881192e-02 +814 808 -1.132183869282760e-01 +814 809 -1.820810586422615e-01 +814 810 -3.301555353436734e-01 +814 811 -7.412185823610213e-01 +814 812 -3.165206906282854e+00 +814 813 -1.502055215878371e+01 +814 815 -1.502055215899867e+01 +814 816 -3.165206906282891e+00 +814 817 -7.412185823610188e-01 +814 818 -3.301555353436738e-01 +814 819 -1.820810586422675e-01 +814 820 -1.132183869282766e-01 +814 821 -7.613960933881114e-02 +814 822 -5.413421453123138e-02 +814 823 -4.012781031912993e-02 +814 824 -3.072751892616544e-02 +814 825 -2.415034675252897e-02 +814 826 -1.939104886145110e-02 +814 827 -1.585023865775514e-02 +814 828 -1.315380302376542e-02 +814 829 -1.105916272470025e-02 +814 830 -9.403863770832814e-03 +814 831 -8.076052134892582e-03 +815 815 3.988394278260309e+01 +815 784 -1.792160480940046e-03 +815 785 -1.945462087124857e-03 +815 786 -2.117777896667799e-03 +815 787 -2.312252367280536e-03 +815 788 -2.532689975072691e-03 +815 789 -2.783725492315679e-03 +815 790 -3.071047067257401e-03 +815 791 -3.401691470521412e-03 +815 792 -3.784439171232937e-03 +815 793 -4.230349322908543e-03 +815 794 -4.753493624956895e-03 +815 795 -5.371977266379837e-03 +815 796 -6.109381318875769e-03 +815 797 -6.996835383339702e-03 +815 798 -8.076052134892642e-03 +815 799 -9.403863770832832e-03 +815 800 -1.105916272470032e-02 +815 801 -1.315380302376550e-02 +815 802 -1.585023865775526e-02 +815 803 -1.939104886145110e-02 +815 804 -2.415034675252897e-02 +815 805 -3.072751892616573e-02 +815 806 -4.012781031913037e-02 +815 807 -5.413421453123172e-02 +815 808 -7.613960933881153e-02 +815 809 -1.132183869282744e-01 +815 810 -1.820810586422635e-01 +815 811 -3.301555353436816e-01 +815 812 -7.412185823610390e-01 +815 813 -3.165206906282912e+00 +815 814 -1.502055215899867e+01 +815 816 -1.502055215931058e+01 +815 817 -3.165206906282866e+00 +815 818 -7.412185823610096e-01 +815 819 -3.301555353436738e-01 +815 820 -1.820810586422648e-01 +815 821 -1.132183869282767e-01 +815 822 -7.613960933881123e-02 +815 823 -5.413421453123171e-02 +815 824 -4.012781031912998e-02 +815 825 -3.072751892616545e-02 +815 826 -2.415034675252897e-02 +815 827 -1.939104886145097e-02 +815 828 -1.585023865775520e-02 +815 829 -1.315380302376546e-02 +815 830 -1.105916272470026e-02 +815 831 -9.403863770832816e-03 +816 816 3.988394278260301e+01 +816 800 -9.403863770832813e-03 +816 801 -1.105916272470022e-02 +816 802 -1.315380302376538e-02 +816 803 -1.585023865775514e-02 +816 804 -1.939104886145097e-02 +816 805 -2.415034675252898e-02 +816 806 -3.072751892616545e-02 +816 807 -4.012781031912956e-02 +816 808 -5.413421453123109e-02 +816 809 -7.613960933881049e-02 +816 810 -1.132183869282756e-01 +816 811 -1.820810586422654e-01 +816 812 -3.301555353436819e-01 +816 813 -7.412185823610391e-01 +816 814 -3.165206906282891e+00 +816 815 -1.502055215931058e+01 +816 817 -1.502055215899863e+01 +816 818 -3.165206906282841e+00 +816 819 -7.412185823610209e-01 +816 820 -3.301555353436744e-01 +816 821 -1.820810586422648e-01 +816 822 -1.132183869282761e-01 +816 823 -7.613960933881203e-02 +816 824 -5.413421453123234e-02 +816 825 -4.012781031913037e-02 +816 826 -3.072751892616572e-02 +816 827 -2.415034675252897e-02 +816 828 -1.939104886145118e-02 +816 829 -1.585023865775536e-02 +816 830 -1.315380302376555e-02 +816 831 -1.105916272470032e-02 +816 832 -9.403863770832827e-03 +816 833 -8.076052134892604e-03 +816 834 -6.996835383339698e-03 +816 835 -6.109381318875769e-03 +816 836 -5.371977266379837e-03 +816 837 -4.753493624956895e-03 +816 838 -4.230349322908543e-03 +816 839 -3.784439171232936e-03 +816 840 -3.401691470521392e-03 +816 841 -3.071047067257401e-03 +816 842 -2.783725492315679e-03 +816 843 -2.532689975072691e-03 +816 844 -2.312252367280536e-03 +816 845 -2.117777896667799e-03 +816 846 -1.945462087124857e-03 +816 847 -1.792160480940038e-03 +817 817 3.988394278208165e+01 +817 800 -8.076052134892592e-03 +817 801 -9.403863770832825e-03 +817 802 -1.105916272470022e-02 +817 803 -1.315380302376542e-02 +817 804 -1.585023865775520e-02 +817 805 -1.939104886145118e-02 +817 806 -2.415034675252906e-02 +817 807 -3.072751892616529e-02 +817 808 -4.012781031912974e-02 +817 809 -5.413421453123138e-02 +817 810 -7.613960933881123e-02 +817 811 -1.132183869282761e-01 +817 812 -1.820810586422657e-01 +817 813 -3.301555353436755e-01 +817 814 -7.412185823610188e-01 +817 815 -3.165206906282866e+00 +817 816 -1.502055215899863e+01 +817 818 -1.502055215878364e+01 +817 819 -3.165206906282882e+00 +817 820 -7.412185823610346e-01 +817 821 -3.301555353436815e-01 +817 822 -1.820810586422650e-01 +817 823 -1.132183869282744e-01 +817 824 -7.613960933881160e-02 +817 825 -5.413421453123205e-02 +817 826 -4.012781031913017e-02 +817 827 -3.072751892616531e-02 +817 828 -2.415034675252897e-02 +817 829 -1.939104886145118e-02 +817 830 -1.585023865775532e-02 +817 831 -1.315380302376550e-02 +817 832 -1.105916272470022e-02 +817 833 -9.403863770832825e-03 +817 834 -8.076052134892592e-03 +817 835 -6.996835383339674e-03 +817 836 -6.109381318875769e-03 +817 837 -5.371977266379790e-03 +817 838 -4.753493624956895e-03 +817 839 -4.230349322908531e-03 +817 840 -3.784439171232915e-03 +817 841 -3.401691470521394e-03 +817 842 -3.071047067257393e-03 +817 843 -2.783725492315679e-03 +817 844 -2.532689975072674e-03 +817 845 -2.312252367280536e-03 +817 846 -2.117777896667793e-03 +817 847 -1.945462087124849e-03 +818 818 3.988394278171950e+01 +818 800 -6.996835383339671e-03 +818 801 -8.076052134892575e-03 +818 802 -9.403863770832827e-03 +818 803 -1.105916272470025e-02 +818 804 -1.315380302376546e-02 +818 805 -1.585023865775537e-02 +818 806 -1.939104886145125e-02 +818 807 -2.415034675252896e-02 +818 808 -3.072751892616542e-02 +818 809 -4.012781031912993e-02 +818 810 -5.413421453123171e-02 +818 811 -7.613960933881252e-02 +818 812 -1.132183869282786e-01 +818 813 -1.820810586422687e-01 +818 814 -3.301555353436738e-01 +818 815 -7.412185823610096e-01 +818 816 -3.165206906282841e+00 +818 817 -1.502055215878364e+01 +818 819 -1.502055215863307e+01 +818 820 -3.165206906282897e+00 +818 821 -7.412185823610353e-01 +818 822 -3.301555353436804e-01 +818 823 -1.820810586422605e-01 +818 824 -1.132183869282749e-01 +818 825 -7.613960933881173e-02 +818 826 -5.413421453123172e-02 +818 827 -4.012781031912956e-02 +818 828 -3.072751892616529e-02 +818 829 -2.415034675252896e-02 +818 830 -1.939104886145111e-02 +818 831 -1.585023865775526e-02 +818 832 -1.315380302376538e-02 +818 833 -1.105916272470022e-02 +818 834 -9.403863770832811e-03 +818 835 -8.076052134892583e-03 +818 836 -6.996835383339702e-03 +818 837 -6.109381318875734e-03 +818 838 -5.371977266379808e-03 +818 839 -4.753493624956896e-03 +818 840 -4.230349322908520e-03 +818 841 -3.784439171232929e-03 +818 842 -3.401691470521395e-03 +818 843 -3.071047067257401e-03 +818 844 -2.783725492315667e-03 +818 845 -2.532689975072680e-03 +818 846 -2.312252367280536e-03 +818 847 -2.117777896667789e-03 +819 819 3.988394278146366e+01 +819 800 -6.109381318875727e-03 +819 801 -6.996835383339622e-03 +819 802 -8.076052134892594e-03 +819 803 -9.403863770832814e-03 +819 804 -1.105916272470026e-02 +819 805 -1.315380302376555e-02 +819 806 -1.585023865775537e-02 +819 807 -1.939104886145111e-02 +819 808 -2.415034675252897e-02 +819 809 -3.072751892616544e-02 +819 810 -4.012781031912998e-02 +819 811 -5.413421453123234e-02 +819 812 -7.613960933881211e-02 +819 813 -1.132183869282785e-01 +819 814 -1.820810586422675e-01 +819 815 -3.301555353436738e-01 +819 816 -7.412185823610209e-01 +819 817 -3.165206906282882e+00 +819 818 -1.502055215863307e+01 +819 820 -1.502055215852568e+01 +819 821 -3.165206906282806e+00 +819 822 -7.412185823610197e-01 +819 823 -3.301555353436730e-01 +819 824 -1.820810586422646e-01 +819 825 -1.132183869282771e-01 +819 826 -7.613960933881184e-02 +819 827 -5.413421453123109e-02 +819 828 -4.012781031912974e-02 +819 829 -3.072751892616542e-02 +819 830 -2.415034675252897e-02 +819 831 -1.939104886145110e-02 +819 832 -1.585023865775514e-02 +819 833 -1.315380302376542e-02 +819 834 -1.105916272470025e-02 +819 835 -9.403863770832832e-03 +819 836 -8.076052134892642e-03 +819 837 -6.996835383339677e-03 +819 838 -6.109381318875772e-03 +819 839 -5.371977266379821e-03 +819 840 -4.753493624956895e-03 +819 841 -4.230349322908545e-03 +819 842 -3.784439171232938e-03 +819 843 -3.401691470521412e-03 +819 844 -3.071047067257394e-03 +819 845 -2.783725492315679e-03 +819 846 -2.532689975072685e-03 +819 847 -2.312252367280536e-03 +820 820 3.988394278128102e+01 +820 800 -5.371977266379805e-03 +820 801 -6.109381318875730e-03 +820 802 -6.996835383339698e-03 +820 803 -8.076052134892582e-03 +820 804 -9.403863770832816e-03 +820 805 -1.105916272470032e-02 +820 806 -1.315380302376555e-02 +820 807 -1.585023865775526e-02 +820 808 -1.939104886145110e-02 +820 809 -2.415034675252896e-02 +820 810 -3.072751892616545e-02 +820 811 -4.012781031913035e-02 +820 812 -5.413421453123204e-02 +820 813 -7.613960933881185e-02 +820 814 -1.132183869282766e-01 +820 815 -1.820810586422648e-01 +820 816 -3.301555353436744e-01 +820 817 -7.412185823610346e-01 +820 818 -3.165206906282897e+00 +820 819 -1.502055215852568e+01 +820 821 -1.502055215844899e+01 +820 822 -3.165206906282863e+00 +820 823 -7.412185823610176e-01 +820 824 -3.301555353436775e-01 +820 825 -1.820810586422686e-01 +820 826 -1.132183869282784e-01 +820 827 -7.613960933881081e-02 +820 828 -5.413421453123141e-02 +820 829 -4.012781031912996e-02 +820 830 -3.072751892616545e-02 +820 831 -2.415034675252897e-02 +820 832 -1.939104886145097e-02 +820 833 -1.585023865775520e-02 +820 834 -1.315380302376546e-02 +820 835 -1.105916272470026e-02 +820 836 -9.403863770832832e-03 +820 837 -8.076052134892557e-03 +820 838 -6.996835383339674e-03 +820 839 -6.109381318875747e-03 +820 840 -5.371977266379786e-03 +820 841 -4.753493624956895e-03 +820 842 -4.230349322908531e-03 +820 843 -3.784439171232937e-03 +820 844 -3.401691470521385e-03 +820 845 -3.071047067257393e-03 +820 846 -2.783725492315671e-03 +820 847 -2.532689975072673e-03 +821 821 3.988394278115143e+01 +821 800 -4.753493624956895e-03 +821 801 -5.371977266379788e-03 +821 802 -6.109381318875769e-03 +821 803 -6.996835383339674e-03 +821 804 -8.076052134892573e-03 +821 805 -9.403863770832833e-03 +821 806 -1.105916272470025e-02 +821 807 -1.315380302376538e-02 +821 808 -1.585023865775514e-02 +821 809 -1.939104886145096e-02 +821 810 -2.415034675252878e-02 +821 811 -3.072751892616544e-02 +821 812 -4.012781031912978e-02 +821 813 -5.413421453123111e-02 +821 814 -7.613960933881114e-02 +821 815 -1.132183869282767e-01 +821 816 -1.820810586422648e-01 +821 817 -3.301555353436815e-01 +821 818 -7.412185823610353e-01 +821 819 -3.165206906282806e+00 +821 820 -1.502055215844899e+01 +821 822 -1.502055215839546e+01 +821 823 -3.165206906282858e+00 +821 824 -7.412185823610200e-01 +821 825 -3.301555353436738e-01 +821 826 -1.820810586422668e-01 +821 827 -1.132183869282765e-01 +821 828 -7.613960933881203e-02 +821 829 -5.413421453123230e-02 +821 830 -4.012781031913037e-02 +821 831 -3.072751892616572e-02 +821 832 -2.415034675252897e-02 +821 833 -1.939104886145118e-02 +821 834 -1.585023865775536e-02 +821 835 -1.315380302376555e-02 +821 836 -1.105916272470032e-02 +821 837 -9.403863770832813e-03 +821 838 -8.076052134892592e-03 +821 839 -6.996835383339671e-03 +821 840 -6.109381318875727e-03 +821 841 -5.371977266379805e-03 +821 842 -4.753493624956895e-03 +821 843 -4.230349322908543e-03 +821 844 -3.784439171232917e-03 +821 845 -3.401691470521394e-03 +821 846 -3.071047067257392e-03 +821 847 -2.783725492315665e-03 +822 822 3.988394278106472e+01 +822 800 -4.230349322908543e-03 +822 801 -4.753493624956895e-03 +822 802 -5.371977266379837e-03 +822 803 -6.109381318875769e-03 +822 804 -6.996835383339702e-03 +822 805 -8.076052134892655e-03 +822 806 -9.403863770832854e-03 +822 807 -1.105916272470022e-02 +822 808 -1.315380302376542e-02 +822 809 -1.585023865775520e-02 +822 810 -1.939104886145103e-02 +822 811 -2.415034675252906e-02 +822 812 -3.072751892616544e-02 +822 813 -4.012781031912974e-02 +822 814 -5.413421453123138e-02 +822 815 -7.613960933881123e-02 +822 816 -1.132183869282761e-01 +822 817 -1.820810586422650e-01 +822 818 -3.301555353436804e-01 +822 819 -7.412185823610197e-01 +822 820 -3.165206906282863e+00 +822 821 -1.502055215839546e+01 +822 823 -1.502055215836211e+01 +822 824 -3.165206906282882e+00 +822 825 -7.412185823610271e-01 +822 826 -3.301555353436752e-01 +822 827 -1.820810586422652e-01 +822 828 -1.132183869282772e-01 +822 829 -7.613960933881209e-02 +822 830 -5.413421453123205e-02 +822 831 -4.012781031913017e-02 +822 832 -3.072751892616531e-02 +822 833 -2.415034675252897e-02 +822 834 -1.939104886145118e-02 +822 835 -1.585023865775532e-02 +822 836 -1.315380302376550e-02 +822 837 -1.105916272470022e-02 +822 838 -9.403863770832825e-03 +822 839 -8.076052134892575e-03 +822 840 -6.996835383339622e-03 +822 841 -6.109381318875730e-03 +822 842 -5.371977266379788e-03 +822 843 -4.753493624956895e-03 +822 844 -4.230349322908508e-03 +822 845 -3.784439171232917e-03 +822 846 -3.401691470521384e-03 +822 847 -3.071047067257376e-03 +823 823 3.988394278102304e+01 +823 800 -3.784439171232917e-03 +823 801 -4.230349322908508e-03 +823 802 -4.753493624956895e-03 +823 803 -5.371977266379790e-03 +823 804 -6.109381318875734e-03 +823 805 -6.996835383339677e-03 +823 806 -8.076052134892578e-03 +823 807 -9.403863770832811e-03 +823 808 -1.105916272470025e-02 +823 809 -1.315380302376546e-02 +823 810 -1.585023865775526e-02 +823 811 -1.939104886145125e-02 +823 812 -2.415034675252906e-02 +823 813 -3.072751892616543e-02 +823 814 -4.012781031912993e-02 +823 815 -5.413421453123171e-02 +823 816 -7.613960933881203e-02 +823 817 -1.132183869282744e-01 +823 818 -1.820810586422605e-01 +823 819 -3.301555353436730e-01 +823 820 -7.412185823610176e-01 +823 821 -3.165206906282858e+00 +823 822 -1.502055215836211e+01 +823 824 -1.502055215835499e+01 +823 825 -3.165206906282895e+00 +823 826 -7.412185823610236e-01 +823 827 -3.301555353436813e-01 +823 828 -1.820810586422683e-01 +823 829 -1.132183869282780e-01 +823 830 -7.613960933881173e-02 +823 831 -5.413421453123172e-02 +823 832 -4.012781031912956e-02 +823 833 -3.072751892616529e-02 +823 834 -2.415034675252896e-02 +823 835 -1.939104886145111e-02 +823 836 -1.585023865775526e-02 +823 837 -1.315380302376538e-02 +823 838 -1.105916272470022e-02 +823 839 -9.403863770832827e-03 +823 840 -8.076052134892594e-03 +823 841 -6.996835383339698e-03 +823 842 -6.109381318875769e-03 +823 843 -5.371977266379837e-03 +823 844 -4.753493624956895e-03 +823 845 -4.230349322908543e-03 +823 846 -3.784439171232936e-03 +823 847 -3.401691470521392e-03 +824 824 3.988394278105613e+01 +824 800 -3.401691470521394e-03 +824 801 -3.784439171232917e-03 +824 802 -4.230349322908543e-03 +824 803 -4.753493624956895e-03 +824 804 -5.371977266379808e-03 +824 805 -6.109381318875772e-03 +824 806 -6.996835383339674e-03 +824 807 -8.076052134892582e-03 +824 808 -9.403863770832814e-03 +824 809 -1.105916272470025e-02 +824 810 -1.315380302376547e-02 +824 811 -1.585023865775537e-02 +824 812 -1.939104886145119e-02 +824 813 -2.415034675252897e-02 +824 814 -3.072751892616544e-02 +824 815 -4.012781031912998e-02 +824 816 -5.413421453123234e-02 +824 817 -7.613960933881160e-02 +824 818 -1.132183869282749e-01 +824 819 -1.820810586422646e-01 +824 820 -3.301555353436775e-01 +824 821 -7.412185823610200e-01 +824 822 -3.165206906282882e+00 +824 823 -1.502055215835499e+01 +824 825 -1.502055215840041e+01 +824 826 -3.165206906282829e+00 +824 827 -7.412185823610197e-01 +824 828 -3.301555353436753e-01 +824 829 -1.820810586422644e-01 +824 830 -1.132183869282751e-01 +824 831 -7.613960933881150e-02 +824 832 -5.413421453123109e-02 +824 833 -4.012781031912974e-02 +824 834 -3.072751892616542e-02 +824 835 -2.415034675252897e-02 +824 836 -1.939104886145110e-02 +824 837 -1.585023865775514e-02 +824 838 -1.315380302376542e-02 +824 839 -1.105916272470025e-02 +824 840 -9.403863770832814e-03 +824 841 -8.076052134892582e-03 +824 842 -6.996835383339674e-03 +824 843 -6.109381318875769e-03 +824 844 -5.371977266379790e-03 +824 845 -4.753493624956895e-03 +824 846 -4.230349322908531e-03 +824 847 -3.784439171232915e-03 +825 825 3.988394278128562e+01 +825 800 -3.071047067257392e-03 +825 801 -3.401691470521384e-03 +825 802 -3.784439171232936e-03 +825 803 -4.230349322908531e-03 +825 804 -4.753493624956896e-03 +825 805 -5.371977266379821e-03 +825 806 -6.109381318875747e-03 +825 807 -6.996835383339671e-03 +825 808 -8.076052134892564e-03 +825 809 -9.403863770832828e-03 +825 810 -1.105916272470026e-02 +825 811 -1.315380302376555e-02 +825 812 -1.585023865775532e-02 +825 813 -1.939104886145111e-02 +825 814 -2.415034675252897e-02 +825 815 -3.072751892616545e-02 +825 816 -4.012781031913037e-02 +825 817 -5.413421453123205e-02 +825 818 -7.613960933881173e-02 +825 819 -1.132183869282771e-01 +825 820 -1.820810586422686e-01 +825 821 -3.301555353436738e-01 +825 822 -7.412185823610271e-01 +825 823 -3.165206906282895e+00 +825 824 -1.502055215840041e+01 +825 826 -1.502055215860530e+01 +825 827 -3.165206906282891e+00 +825 828 -7.412185823610232e-01 +825 829 -3.301555353436713e-01 +825 830 -1.820810586422610e-01 +825 831 -1.132183869282744e-01 +825 832 -7.613960933881048e-02 +825 833 -5.413421453123138e-02 +825 834 -4.012781031912993e-02 +825 835 -3.072751892616544e-02 +825 836 -2.415034675252896e-02 +825 837 -1.939104886145096e-02 +825 838 -1.585023865775520e-02 +825 839 -1.315380302376546e-02 +825 840 -1.105916272470025e-02 +825 841 -9.403863770832813e-03 +825 842 -8.076052134892573e-03 +825 843 -6.996835383339702e-03 +825 844 -6.109381318875734e-03 +825 845 -5.371977266379808e-03 +825 846 -4.753493624956896e-03 +825 847 -4.230349322908520e-03 +826 826 3.988394278152493e+01 +826 800 -2.783725492315665e-03 +826 801 -3.071047067257376e-03 +826 802 -3.401691470521392e-03 +826 803 -3.784439171232915e-03 +826 804 -4.230349322908520e-03 +826 805 -4.753493624956895e-03 +826 806 -5.371977266379786e-03 +826 807 -6.109381318875727e-03 +826 808 -6.996835383339622e-03 +826 809 -8.076052134892594e-03 +826 810 -9.403863770832816e-03 +826 811 -1.105916272470032e-02 +826 812 -1.315380302376550e-02 +826 813 -1.585023865775526e-02 +826 814 -1.939104886145110e-02 +826 815 -2.415034675252897e-02 +826 816 -3.072751892616572e-02 +826 817 -4.012781031913017e-02 +826 818 -5.413421453123172e-02 +826 819 -7.613960933881184e-02 +826 820 -1.132183869282784e-01 +826 821 -1.820810586422668e-01 +826 822 -3.301555353436752e-01 +826 823 -7.412185823610236e-01 +826 824 -3.165206906282829e+00 +826 825 -1.502055215860530e+01 +826 827 -1.502055215859225e+01 +826 828 -3.165206906282874e+00 +826 829 -7.412185823610140e-01 +826 830 -3.301555353436742e-01 +826 831 -1.820810586422626e-01 +826 832 -1.132183869282744e-01 +826 833 -7.613960933881028e-02 +826 834 -5.413421453123171e-02 +826 835 -4.012781031912998e-02 +826 836 -3.072751892616545e-02 +826 837 -2.415034675252878e-02 +826 838 -1.939104886145103e-02 +826 839 -1.585023865775526e-02 +826 840 -1.315380302376547e-02 +826 841 -1.105916272470026e-02 +826 842 -9.403863770832792e-03 +826 843 -8.076052134892630e-03 +826 844 -6.996835383339677e-03 +826 845 -6.109381318875772e-03 +826 846 -5.371977266379821e-03 +826 847 -4.753493624956895e-03 +827 827 3.988394278151358e+01 +827 800 -2.532689975072680e-03 +827 801 -2.783725492315666e-03 +827 802 -3.071047067257401e-03 +827 803 -3.401691470521394e-03 +827 804 -3.784439171232929e-03 +827 805 -4.230349322908545e-03 +827 806 -4.753493624956895e-03 +827 807 -5.371977266379805e-03 +827 808 -6.109381318875730e-03 +827 809 -6.996835383339698e-03 +827 810 -8.076052134892570e-03 +827 811 -9.403863770832813e-03 +827 812 -1.105916272470022e-02 +827 813 -1.315380302376538e-02 +827 814 -1.585023865775514e-02 +827 815 -1.939104886145097e-02 +827 816 -2.415034675252897e-02 +827 817 -3.072751892616531e-02 +827 818 -4.012781031912956e-02 +827 819 -5.413421453123109e-02 +827 820 -7.613960933881081e-02 +827 821 -1.132183869282765e-01 +827 822 -1.820810586422652e-01 +827 823 -3.301555353436813e-01 +827 824 -7.412185823610197e-01 +827 825 -3.165206906282891e+00 +827 826 -1.502055215859225e+01 +827 828 -1.502055215859650e+01 +827 829 -3.165206906282855e+00 +827 830 -7.412185823610183e-01 +827 831 -3.301555353436749e-01 +827 832 -1.820810586422648e-01 +827 833 -1.132183869282743e-01 +827 834 -7.613960933881257e-02 +827 835 -5.413421453123234e-02 +827 836 -4.012781031913035e-02 +827 837 -3.072751892616544e-02 +827 838 -2.415034675252906e-02 +827 839 -1.939104886145125e-02 +827 840 -1.585023865775537e-02 +827 841 -1.315380302376555e-02 +827 842 -1.105916272470025e-02 +827 843 -9.403863770832827e-03 +827 844 -8.076052134892578e-03 +827 845 -6.996835383339674e-03 +827 846 -6.109381318875747e-03 +827 847 -5.371977266379786e-03 +828 828 3.988394278151441e+01 +828 800 -2.312252367280536e-03 +828 801 -2.532689975072674e-03 +828 802 -2.783725492315679e-03 +828 803 -3.071047067257393e-03 +828 804 -3.401691470521395e-03 +828 805 -3.784439171232938e-03 +828 806 -4.230349322908531e-03 +828 807 -4.753493624956895e-03 +828 808 -5.371977266379788e-03 +828 809 -6.109381318875769e-03 +828 810 -6.996835383339674e-03 +828 811 -8.076052134892594e-03 +828 812 -9.403863770832842e-03 +828 813 -1.105916272470022e-02 +828 814 -1.315380302376542e-02 +828 815 -1.585023865775520e-02 +828 816 -1.939104886145118e-02 +828 817 -2.415034675252897e-02 +828 818 -3.072751892616529e-02 +828 819 -4.012781031912974e-02 +828 820 -5.413421453123141e-02 +828 821 -7.613960933881203e-02 +828 822 -1.132183869282772e-01 +828 823 -1.820810586422683e-01 +828 824 -3.301555353436753e-01 +828 825 -7.412185823610232e-01 +828 826 -3.165206906282874e+00 +828 827 -1.502055215859650e+01 +828 829 -1.502055215858803e+01 +828 830 -3.165206906282881e+00 +828 831 -7.412185823610192e-01 +828 832 -3.301555353436795e-01 +828 833 -1.820810586422626e-01 +828 834 -1.132183869282770e-01 +828 835 -7.613960933881209e-02 +828 836 -5.413421453123204e-02 +828 837 -4.012781031912978e-02 +828 838 -3.072751892616544e-02 +828 839 -2.415034675252906e-02 +828 840 -1.939104886145119e-02 +828 841 -1.585023865775531e-02 +828 842 -1.315380302376542e-02 +828 843 -1.105916272470022e-02 +828 844 -9.403863770832839e-03 +828 845 -8.076052134892594e-03 +828 846 -6.996835383339671e-03 +828 847 -6.109381318875727e-03 +829 829 3.988394278153930e+01 +829 800 -2.117777896667799e-03 +829 801 -2.312252367280536e-03 +829 802 -2.532689975072691e-03 +829 803 -2.783725492315679e-03 +829 804 -3.071047067257401e-03 +829 805 -3.401691470521412e-03 +829 806 -3.784439171232937e-03 +829 807 -4.230349322908543e-03 +829 808 -4.753493624956895e-03 +829 809 -5.371977266379837e-03 +829 810 -6.109381318875769e-03 +829 811 -6.996835383339702e-03 +829 812 -8.076052134892653e-03 +829 813 -9.403863770832828e-03 +829 814 -1.105916272470025e-02 +829 815 -1.315380302376546e-02 +829 816 -1.585023865775536e-02 +829 817 -1.939104886145118e-02 +829 818 -2.415034675252896e-02 +829 819 -3.072751892616542e-02 +829 820 -4.012781031912996e-02 +829 821 -5.413421453123230e-02 +829 822 -7.613960933881209e-02 +829 823 -1.132183869282780e-01 +829 824 -1.820810586422644e-01 +829 825 -3.301555353436713e-01 +829 826 -7.412185823610140e-01 +829 827 -3.165206906282855e+00 +829 828 -1.502055215858803e+01 +829 830 -1.502055215864003e+01 +829 831 -3.165206906282850e+00 +829 832 -7.412185823610324e-01 +829 833 -3.301555353436793e-01 +829 834 -1.820810586422672e-01 +829 835 -1.132183869282786e-01 +829 836 -7.613960933881188e-02 +829 837 -5.413421453123111e-02 +829 838 -4.012781031912974e-02 +829 839 -3.072751892616543e-02 +829 840 -2.415034675252897e-02 +829 841 -1.939104886145111e-02 +829 842 -1.585023865775514e-02 +829 843 -1.315380302376537e-02 +829 844 -1.105916272470025e-02 +829 845 -9.403863770832814e-03 +829 846 -8.076052134892564e-03 +829 847 -6.996835383339622e-03 +830 830 3.988394278164016e+01 +830 800 -1.945462087124849e-03 +830 801 -2.117777896667785e-03 +830 802 -2.312252367280536e-03 +830 803 -2.532689975072674e-03 +830 804 -2.783725492315667e-03 +830 805 -3.071047067257394e-03 +830 806 -3.401691470521385e-03 +830 807 -3.784439171232917e-03 +830 808 -4.230349322908508e-03 +830 809 -4.753493624956895e-03 +830 810 -5.371977266379790e-03 +830 811 -6.109381318875734e-03 +830 812 -6.996835383339677e-03 +830 813 -8.076052134892568e-03 +830 814 -9.403863770832814e-03 +830 815 -1.105916272470026e-02 +830 816 -1.315380302376555e-02 +830 817 -1.585023865775532e-02 +830 818 -1.939104886145111e-02 +830 819 -2.415034675252897e-02 +830 820 -3.072751892616545e-02 +830 821 -4.012781031913037e-02 +830 822 -5.413421453123205e-02 +830 823 -7.613960933881173e-02 +830 824 -1.132183869282751e-01 +830 825 -1.820810586422610e-01 +830 826 -3.301555353436742e-01 +830 827 -7.412185823610183e-01 +830 828 -3.165206906282881e+00 +830 829 -1.502055215864003e+01 +830 831 -1.502055215865992e+01 +830 832 -3.165206906282894e+00 +830 833 -7.412185823610299e-01 +830 834 -3.301555353436764e-01 +830 835 -1.820810586422688e-01 +830 836 -1.132183869282785e-01 +830 837 -7.613960933881114e-02 +830 838 -5.413421453123138e-02 +830 839 -4.012781031912993e-02 +830 840 -3.072751892616544e-02 +830 841 -2.415034675252896e-02 +830 842 -1.939104886145095e-02 +830 843 -1.585023865775514e-02 +830 844 -1.315380302376546e-02 +830 845 -1.105916272470025e-02 +830 846 -9.403863770832828e-03 +830 847 -8.076052134892594e-03 +831 831 3.988394278169700e+01 +831 800 -1.792160480940038e-03 +831 801 -1.945462087124849e-03 +831 802 -2.117777896667799e-03 +831 803 -2.312252367280536e-03 +831 804 -2.532689975072680e-03 +831 805 -2.783725492315679e-03 +831 806 -3.071047067257393e-03 +831 807 -3.401691470521394e-03 +831 808 -3.784439171232917e-03 +831 809 -4.230349322908543e-03 +831 810 -4.753493624956895e-03 +831 811 -5.371977266379808e-03 +831 812 -6.109381318875772e-03 +831 813 -6.996835383339674e-03 +831 814 -8.076052134892582e-03 +831 815 -9.403863770832816e-03 +831 816 -1.105916272470032e-02 +831 817 -1.315380302376550e-02 +831 818 -1.585023865775526e-02 +831 819 -1.939104886145110e-02 +831 820 -2.415034675252897e-02 +831 821 -3.072751892616572e-02 +831 822 -4.012781031913017e-02 +831 823 -5.413421453123172e-02 +831 824 -7.613960933881150e-02 +831 825 -1.132183869282744e-01 +831 826 -1.820810586422626e-01 +831 827 -3.301555353436749e-01 +831 828 -7.412185823610192e-01 +831 829 -3.165206906282850e+00 +831 830 -1.502055215865992e+01 +831 832 -1.502055215931077e+01 +831 833 -3.165206906282882e+00 +831 834 -7.412185823610231e-01 +831 835 -3.301555353436738e-01 +831 836 -1.820810586422675e-01 +831 837 -1.132183869282758e-01 +831 838 -7.613960933881120e-02 +831 839 -5.413421453123171e-02 +831 840 -4.012781031912998e-02 +831 841 -3.072751892616545e-02 +831 842 -2.415034675252877e-02 +831 843 -1.939104886145096e-02 +831 844 -1.585023865775526e-02 +831 845 -1.315380302376547e-02 +831 846 -1.105916272470026e-02 +831 847 -9.403863770832816e-03 +832 832 3.988394278169702e+01 +832 816 -9.403863770832827e-03 +832 817 -1.105916272470022e-02 +832 818 -1.315380302376538e-02 +832 819 -1.585023865775514e-02 +832 820 -1.939104886145097e-02 +832 821 -2.415034675252897e-02 +832 822 -3.072751892616531e-02 +832 823 -4.012781031912956e-02 +832 824 -5.413421453123109e-02 +832 825 -7.613960933881048e-02 +832 826 -1.132183869282744e-01 +832 827 -1.820810586422648e-01 +832 828 -3.301555353436795e-01 +832 829 -7.412185823610324e-01 +832 830 -3.165206906282894e+00 +832 831 -1.502055215931077e+01 +832 833 -1.502055215865987e+01 +832 834 -3.165206906282875e+00 +832 835 -7.412185823610111e-01 +832 836 -3.301555353436778e-01 +832 837 -1.820810586422646e-01 +832 838 -1.132183869282770e-01 +832 839 -7.613960933881254e-02 +832 840 -5.413421453123234e-02 +832 841 -4.012781031913035e-02 +832 842 -3.072751892616543e-02 +832 843 -2.415034675252896e-02 +832 844 -1.939104886145125e-02 +832 845 -1.585023865775537e-02 +832 846 -1.315380302376555e-02 +832 847 -1.105916272470032e-02 +832 848 -9.403863770832813e-03 +832 849 -8.076052134892594e-03 +832 850 -6.996835383339702e-03 +832 851 -6.109381318875734e-03 +832 852 -5.371977266379808e-03 +832 853 -4.753493624956896e-03 +832 854 -4.230349322908520e-03 +832 855 -3.784439171232929e-03 +832 856 -3.401691470521395e-03 +832 857 -3.071047067257401e-03 +832 858 -2.783725492315667e-03 +832 859 -2.532689975072680e-03 +832 860 -2.312252367280536e-03 +832 861 -2.117777896667789e-03 +832 862 -1.945462087124854e-03 +832 863 -1.792160480940039e-03 +833 833 3.988394278164021e+01 +833 816 -8.076052134892604e-03 +833 817 -9.403863770832825e-03 +833 818 -1.105916272470022e-02 +833 819 -1.315380302376542e-02 +833 820 -1.585023865775520e-02 +833 821 -1.939104886145118e-02 +833 822 -2.415034675252897e-02 +833 823 -3.072751892616529e-02 +833 824 -4.012781031912974e-02 +833 825 -5.413421453123138e-02 +833 826 -7.613960933881028e-02 +833 827 -1.132183869282743e-01 +833 828 -1.820810586422626e-01 +833 829 -3.301555353436793e-01 +833 830 -7.412185823610299e-01 +833 831 -3.165206906282882e+00 +833 832 -1.502055215865987e+01 +833 834 -1.502055215864016e+01 +833 835 -3.165206906282872e+00 +833 836 -7.412185823610240e-01 +833 837 -3.301555353436755e-01 +833 838 -1.820810586422675e-01 +833 839 -1.132183869282776e-01 +833 840 -7.613960933881178e-02 +833 841 -5.413421453123204e-02 +833 842 -4.012781031912976e-02 +833 843 -3.072751892616530e-02 +833 844 -2.415034675252906e-02 +833 845 -1.939104886145119e-02 +833 846 -1.585023865775532e-02 +833 847 -1.315380302376550e-02 +833 848 -1.105916272470022e-02 +833 849 -9.403863770832842e-03 +833 850 -8.076052134892653e-03 +833 851 -6.996835383339677e-03 +833 852 -6.109381318875772e-03 +833 853 -5.371977266379821e-03 +833 854 -4.753493624956895e-03 +833 855 -4.230349322908545e-03 +833 856 -3.784439171232938e-03 +833 857 -3.401691470521412e-03 +833 858 -3.071047067257394e-03 +833 859 -2.783725492315679e-03 +833 860 -2.532689975072685e-03 +833 861 -2.312252367280536e-03 +833 862 -2.117777896667799e-03 +833 863 -1.945462087124858e-03 +834 834 3.988394278153936e+01 +834 816 -6.996835383339698e-03 +834 817 -8.076052134892592e-03 +834 818 -9.403863770832811e-03 +834 819 -1.105916272470025e-02 +834 820 -1.315380302376546e-02 +834 821 -1.585023865775536e-02 +834 822 -1.939104886145118e-02 +834 823 -2.415034675252896e-02 +834 824 -3.072751892616542e-02 +834 825 -4.012781031912993e-02 +834 826 -5.413421453123171e-02 +834 827 -7.613960933881257e-02 +834 828 -1.132183869282770e-01 +834 829 -1.820810586422672e-01 +834 830 -3.301555353436764e-01 +834 831 -7.412185823610231e-01 +834 832 -3.165206906282875e+00 +834 833 -1.502055215864016e+01 +834 835 -1.502055215858788e+01 +834 836 -3.165206906282882e+00 +834 837 -7.412185823610296e-01 +834 838 -3.301555353436806e-01 +834 839 -1.820810586422634e-01 +834 840 -1.132183869282735e-01 +834 841 -7.613960933881116e-02 +834 842 -5.413421453123109e-02 +834 843 -4.012781031912954e-02 +834 844 -3.072751892616543e-02 +834 845 -2.415034675252897e-02 +834 846 -1.939104886145111e-02 +834 847 -1.585023865775526e-02 +834 848 -1.315380302376538e-02 +834 849 -1.105916272470022e-02 +834 850 -9.403863770832828e-03 +834 851 -8.076052134892568e-03 +834 852 -6.996835383339674e-03 +834 853 -6.109381318875747e-03 +834 854 -5.371977266379786e-03 +834 855 -4.753493624956895e-03 +834 856 -4.230349322908531e-03 +834 857 -3.784439171232937e-03 +834 858 -3.401691470521385e-03 +834 859 -3.071047067257393e-03 +834 860 -2.783725492315671e-03 +834 861 -2.532689975072673e-03 +834 862 -2.312252367280536e-03 +834 863 -2.117777896667794e-03 +835 835 3.988394278151446e+01 +835 816 -6.109381318875769e-03 +835 817 -6.996835383339674e-03 +835 818 -8.076052134892583e-03 +835 819 -9.403863770832832e-03 +835 820 -1.105916272470026e-02 +835 821 -1.315380302376555e-02 +835 822 -1.585023865775532e-02 +835 823 -1.939104886145111e-02 +835 824 -2.415034675252897e-02 +835 825 -3.072751892616544e-02 +835 826 -4.012781031912998e-02 +835 827 -5.413421453123234e-02 +835 828 -7.613960933881209e-02 +835 829 -1.132183869282786e-01 +835 830 -1.820810586422688e-01 +835 831 -3.301555353436738e-01 +835 832 -7.412185823610111e-01 +835 833 -3.165206906282872e+00 +835 834 -1.502055215858788e+01 +835 836 -1.502055215859668e+01 +835 837 -3.165206906282911e+00 +835 838 -7.412185823610383e-01 +835 839 -3.301555353436804e-01 +835 840 -1.820810586422604e-01 +835 841 -1.132183869282749e-01 +835 842 -7.613960933881098e-02 +835 843 -5.413421453123106e-02 +835 844 -4.012781031912993e-02 +835 845 -3.072751892616544e-02 +835 846 -2.415034675252897e-02 +835 847 -1.939104886145110e-02 +835 848 -1.585023865775514e-02 +835 849 -1.315380302376542e-02 +835 850 -1.105916272470025e-02 +835 851 -9.403863770832814e-03 +835 852 -8.076052134892582e-03 +835 853 -6.996835383339671e-03 +835 854 -6.109381318875727e-03 +835 855 -5.371977266379805e-03 +835 856 -4.753493624956895e-03 +835 857 -4.230349322908543e-03 +835 858 -3.784439171232917e-03 +835 859 -3.401691470521394e-03 +835 860 -3.071047067257392e-03 +835 861 -2.783725492315665e-03 +835 862 -2.532689975072680e-03 +835 863 -2.312252367280536e-03 +836 836 3.988394278151360e+01 +836 816 -5.371977266379837e-03 +836 817 -6.109381318875769e-03 +836 818 -6.996835383339702e-03 +836 819 -8.076052134892642e-03 +836 820 -9.403863770832832e-03 +836 821 -1.105916272470032e-02 +836 822 -1.315380302376550e-02 +836 823 -1.585023865775526e-02 +836 824 -1.939104886145110e-02 +836 825 -2.415034675252896e-02 +836 826 -3.072751892616545e-02 +836 827 -4.012781031913035e-02 +836 828 -5.413421453123204e-02 +836 829 -7.613960933881188e-02 +836 830 -1.132183869282785e-01 +836 831 -1.820810586422675e-01 +836 832 -3.301555353436778e-01 +836 833 -7.412185823610240e-01 +836 834 -3.165206906282882e+00 +836 835 -1.502055215859668e+01 +836 837 -1.502055215859212e+01 +836 838 -3.165206906282833e+00 +836 839 -7.412185823610193e-01 +836 840 -3.301555353436736e-01 +836 841 -1.820810586422648e-01 +836 842 -1.132183869282768e-01 +836 843 -7.613960933881095e-02 +836 844 -5.413421453123171e-02 +836 845 -4.012781031912998e-02 +836 846 -3.072751892616545e-02 +836 847 -2.415034675252897e-02 +836 848 -1.939104886145097e-02 +836 849 -1.585023865775520e-02 +836 850 -1.315380302376546e-02 +836 851 -1.105916272470026e-02 +836 852 -9.403863770832816e-03 +836 853 -8.076052134892552e-03 +836 854 -6.996835383339622e-03 +836 855 -6.109381318875730e-03 +836 856 -5.371977266379788e-03 +836 857 -4.753493624956895e-03 +836 858 -4.230349322908508e-03 +836 859 -3.784439171232917e-03 +836 860 -3.401691470521384e-03 +836 861 -3.071047067257376e-03 +836 862 -2.783725492315666e-03 +836 863 -2.532689975072674e-03 +837 837 3.988394278152495e+01 +837 816 -4.753493624956895e-03 +837 817 -5.371977266379790e-03 +837 818 -6.109381318875734e-03 +837 819 -6.996835383339677e-03 +837 820 -8.076052134892557e-03 +837 821 -9.403863770832813e-03 +837 822 -1.105916272470022e-02 +837 823 -1.315380302376538e-02 +837 824 -1.585023865775514e-02 +837 825 -1.939104886145096e-02 +837 826 -2.415034675252878e-02 +837 827 -3.072751892616544e-02 +837 828 -4.012781031912978e-02 +837 829 -5.413421453123111e-02 +837 830 -7.613960933881114e-02 +837 831 -1.132183869282758e-01 +837 832 -1.820810586422646e-01 +837 833 -3.301555353436755e-01 +837 834 -7.412185823610296e-01 +837 835 -3.165206906282911e+00 +837 836 -1.502055215859212e+01 +837 838 -1.502055215860533e+01 +837 839 -3.165206906282881e+00 +837 840 -7.412185823610206e-01 +837 841 -3.301555353436783e-01 +837 842 -1.820810586422694e-01 +837 843 -1.132183869282786e-01 +837 844 -7.613960933881272e-02 +837 845 -5.413421453123234e-02 +837 846 -4.012781031913037e-02 +837 847 -3.072751892616572e-02 +837 848 -2.415034675252897e-02 +837 849 -1.939104886145118e-02 +837 850 -1.585023865775536e-02 +837 851 -1.315380302376555e-02 +837 852 -1.105916272470032e-02 +837 853 -9.403863770832827e-03 +837 854 -8.076052134892604e-03 +837 855 -6.996835383339698e-03 +837 856 -6.109381318875769e-03 +837 857 -5.371977266379837e-03 +837 858 -4.753493624956895e-03 +837 859 -4.230349322908543e-03 +837 860 -3.784439171232936e-03 +837 861 -3.401691470521392e-03 +837 862 -3.071047067257401e-03 +837 863 -2.783725492315679e-03 +838 838 3.988394278128563e+01 +838 816 -4.230349322908543e-03 +838 817 -4.753493624956895e-03 +838 818 -5.371977266379808e-03 +838 819 -6.109381318875772e-03 +838 820 -6.996835383339674e-03 +838 821 -8.076052134892592e-03 +838 822 -9.403863770832825e-03 +838 823 -1.105916272470022e-02 +838 824 -1.315380302376542e-02 +838 825 -1.585023865775520e-02 +838 826 -1.939104886145103e-02 +838 827 -2.415034675252906e-02 +838 828 -3.072751892616544e-02 +838 829 -4.012781031912974e-02 +838 830 -5.413421453123138e-02 +838 831 -7.613960933881120e-02 +838 832 -1.132183869282770e-01 +838 833 -1.820810586422675e-01 +838 834 -3.301555353436806e-01 +838 835 -7.412185823610383e-01 +838 836 -3.165206906282833e+00 +838 837 -1.502055215860533e+01 +838 839 -1.502055215840047e+01 +838 840 -3.165206906282874e+00 +838 841 -7.412185823610173e-01 +838 842 -3.301555353436740e-01 +838 843 -1.820810586422656e-01 +838 844 -1.132183869282775e-01 +838 845 -7.613960933881209e-02 +838 846 -5.413421453123205e-02 +838 847 -4.012781031913017e-02 +838 848 -3.072751892616531e-02 +838 849 -2.415034675252897e-02 +838 850 -1.939104886145118e-02 +838 851 -1.585023865775532e-02 +838 852 -1.315380302376550e-02 +838 853 -1.105916272470022e-02 +838 854 -9.403863770832825e-03 +838 855 -8.076052134892592e-03 +838 856 -6.996835383339674e-03 +838 857 -6.109381318875769e-03 +838 858 -5.371977266379790e-03 +838 859 -4.753493624956895e-03 +838 860 -4.230349322908531e-03 +838 861 -3.784439171232915e-03 +838 862 -3.401691470521394e-03 +838 863 -3.071047067257393e-03 +839 839 3.988394278105612e+01 +839 816 -3.784439171232936e-03 +839 817 -4.230349322908531e-03 +839 818 -4.753493624956896e-03 +839 819 -5.371977266379821e-03 +839 820 -6.109381318875747e-03 +839 821 -6.996835383339671e-03 +839 822 -8.076052134892575e-03 +839 823 -9.403863770832827e-03 +839 824 -1.105916272470025e-02 +839 825 -1.315380302376546e-02 +839 826 -1.585023865775526e-02 +839 827 -1.939104886145125e-02 +839 828 -2.415034675252906e-02 +839 829 -3.072751892616543e-02 +839 830 -4.012781031912993e-02 +839 831 -5.413421453123171e-02 +839 832 -7.613960933881254e-02 +839 833 -1.132183869282776e-01 +839 834 -1.820810586422634e-01 +839 835 -3.301555353436804e-01 +839 836 -7.412185823610193e-01 +839 837 -3.165206906282881e+00 +839 838 -1.502055215840047e+01 +839 840 -1.502055215835487e+01 +839 841 -3.165206906282865e+00 +839 842 -7.412185823610253e-01 +839 843 -3.301555353436751e-01 +839 844 -1.820810586422680e-01 +839 845 -1.132183869282771e-01 +839 846 -7.613960933881174e-02 +839 847 -5.413421453123172e-02 +839 848 -4.012781031912956e-02 +839 849 -3.072751892616529e-02 +839 850 -2.415034675252896e-02 +839 851 -1.939104886145111e-02 +839 852 -1.585023865775526e-02 +839 853 -1.315380302376538e-02 +839 854 -1.105916272470022e-02 +839 855 -9.403863770832811e-03 +839 856 -8.076052134892583e-03 +839 857 -6.996835383339702e-03 +839 858 -6.109381318875734e-03 +839 859 -5.371977266379808e-03 +839 860 -4.753493624956896e-03 +839 861 -4.230349322908520e-03 +839 862 -3.784439171232929e-03 +839 863 -3.401691470521395e-03 +840 840 3.988394278102305e+01 +840 816 -3.401691470521392e-03 +840 817 -3.784439171232915e-03 +840 818 -4.230349322908520e-03 +840 819 -4.753493624956895e-03 +840 820 -5.371977266379786e-03 +840 821 -6.109381318875727e-03 +840 822 -6.996835383339622e-03 +840 823 -8.076052134892594e-03 +840 824 -9.403863770832814e-03 +840 825 -1.105916272470025e-02 +840 826 -1.315380302376547e-02 +840 827 -1.585023865775537e-02 +840 828 -1.939104886145119e-02 +840 829 -2.415034675252897e-02 +840 830 -3.072751892616544e-02 +840 831 -4.012781031912998e-02 +840 832 -5.413421453123234e-02 +840 833 -7.613960933881178e-02 +840 834 -1.132183869282735e-01 +840 835 -1.820810586422604e-01 +840 836 -3.301555353436736e-01 +840 837 -7.412185823610206e-01 +840 838 -3.165206906282874e+00 +840 839 -1.502055215835487e+01 +840 841 -1.502055215836222e+01 +840 842 -3.165206906282890e+00 +840 843 -7.412185823610205e-01 +840 844 -3.301555353436850e-01 +840 845 -1.820810586422673e-01 +840 846 -1.132183869282775e-01 +840 847 -7.613960933881167e-02 +840 848 -5.413421453123109e-02 +840 849 -4.012781031912974e-02 +840 850 -3.072751892616542e-02 +840 851 -2.415034675252897e-02 +840 852 -1.939104886145110e-02 +840 853 -1.585023865775514e-02 +840 854 -1.315380302376542e-02 +840 855 -1.105916272470025e-02 +840 856 -9.403863770832832e-03 +840 857 -8.076052134892642e-03 +840 858 -6.996835383339677e-03 +840 859 -6.109381318875772e-03 +840 860 -5.371977266379821e-03 +840 861 -4.753493624956895e-03 +840 862 -4.230349322908545e-03 +840 863 -3.784439171232938e-03 +841 841 3.988394278106471e+01 +841 816 -3.071047067257401e-03 +841 817 -3.401691470521394e-03 +841 818 -3.784439171232929e-03 +841 819 -4.230349322908545e-03 +841 820 -4.753493624956895e-03 +841 821 -5.371977266379805e-03 +841 822 -6.109381318875730e-03 +841 823 -6.996835383339698e-03 +841 824 -8.076052134892582e-03 +841 825 -9.403863770832813e-03 +841 826 -1.105916272470026e-02 +841 827 -1.315380302376555e-02 +841 828 -1.585023865775531e-02 +841 829 -1.939104886145111e-02 +841 830 -2.415034675252896e-02 +841 831 -3.072751892616545e-02 +841 832 -4.012781031913035e-02 +841 833 -5.413421453123204e-02 +841 834 -7.613960933881116e-02 +841 835 -1.132183869282749e-01 +841 836 -1.820810586422648e-01 +841 837 -3.301555353436783e-01 +841 838 -7.412185823610173e-01 +841 839 -3.165206906282865e+00 +841 840 -1.502055215836222e+01 +841 842 -1.502055215839541e+01 +841 843 -3.165206906282825e+00 +841 844 -7.412185823610308e-01 +841 845 -3.301555353436804e-01 +841 846 -1.820810586422644e-01 +841 847 -1.132183869282754e-01 +841 848 -7.613960933881089e-02 +841 849 -5.413421453123141e-02 +841 850 -4.012781031912996e-02 +841 851 -3.072751892616545e-02 +841 852 -2.415034675252897e-02 +841 853 -1.939104886145097e-02 +841 854 -1.585023865775520e-02 +841 855 -1.315380302376546e-02 +841 856 -1.105916272470026e-02 +841 857 -9.403863770832832e-03 +841 858 -8.076052134892557e-03 +841 859 -6.996835383339674e-03 +841 860 -6.109381318875747e-03 +841 861 -5.371977266379786e-03 +841 862 -4.753493624956895e-03 +841 863 -4.230349322908531e-03 +842 842 3.988394278115149e+01 +842 816 -2.783725492315679e-03 +842 817 -3.071047067257393e-03 +842 818 -3.401691470521395e-03 +842 819 -3.784439171232938e-03 +842 820 -4.230349322908531e-03 +842 821 -4.753493624956895e-03 +842 822 -5.371977266379788e-03 +842 823 -6.109381318875769e-03 +842 824 -6.996835383339674e-03 +842 825 -8.076052134892573e-03 +842 826 -9.403863770832792e-03 +842 827 -1.105916272470025e-02 +842 828 -1.315380302376542e-02 +842 829 -1.585023865775514e-02 +842 830 -1.939104886145095e-02 +842 831 -2.415034675252877e-02 +842 832 -3.072751892616543e-02 +842 833 -4.012781031912976e-02 +842 834 -5.413421453123109e-02 +842 835 -7.613960933881098e-02 +842 836 -1.132183869282768e-01 +842 837 -1.820810586422694e-01 +842 838 -3.301555353436740e-01 +842 839 -7.412185823610253e-01 +842 840 -3.165206906282890e+00 +842 841 -1.502055215839541e+01 +842 843 -1.502055215844897e+01 +842 844 -3.165206906282891e+00 +842 845 -7.412185823610338e-01 +842 846 -3.301555353436727e-01 +842 847 -1.820810586422612e-01 +842 848 -1.132183869282745e-01 +842 849 -7.613960933881141e-02 +842 850 -5.413421453123234e-02 +842 851 -4.012781031913039e-02 +842 852 -3.072751892616573e-02 +842 853 -2.415034675252898e-02 +842 854 -1.939104886145118e-02 +842 855 -1.585023865775537e-02 +842 856 -1.315380302376555e-02 +842 857 -1.105916272470032e-02 +842 858 -9.403863770832814e-03 +842 859 -8.076052134892592e-03 +842 860 -6.996835383339671e-03 +842 861 -6.109381318875727e-03 +842 862 -5.371977266379805e-03 +842 863 -4.753493624956895e-03 +843 843 3.988394278128109e+01 +843 816 -2.532689975072691e-03 +843 817 -2.783725492315679e-03 +843 818 -3.071047067257401e-03 +843 819 -3.401691470521412e-03 +843 820 -3.784439171232937e-03 +843 821 -4.230349322908543e-03 +843 822 -4.753493624956895e-03 +843 823 -5.371977266379837e-03 +843 824 -6.109381318875769e-03 +843 825 -6.996835383339702e-03 +843 826 -8.076052134892630e-03 +843 827 -9.403863770832827e-03 +843 828 -1.105916272470022e-02 +843 829 -1.315380302376537e-02 +843 830 -1.585023865775514e-02 +843 831 -1.939104886145096e-02 +843 832 -2.415034675252896e-02 +843 833 -3.072751892616530e-02 +843 834 -4.012781031912954e-02 +843 835 -5.413421453123106e-02 +843 836 -7.613960933881095e-02 +843 837 -1.132183869282786e-01 +843 838 -1.820810586422656e-01 +843 839 -3.301555353436751e-01 +843 840 -7.412185823610205e-01 +843 841 -3.165206906282825e+00 +843 842 -1.502055215844897e+01 +843 844 -1.502055215852584e+01 +843 845 -3.165206906282886e+00 +843 846 -7.412185823610173e-01 +843 847 -3.301555353436665e-01 +843 848 -1.820810586422624e-01 +843 849 -1.132183869282759e-01 +843 850 -7.613960933881239e-02 +843 851 -5.413421453123236e-02 +843 852 -4.012781031913037e-02 +843 853 -3.072751892616545e-02 +843 854 -2.415034675252906e-02 +843 855 -1.939104886145125e-02 +843 856 -1.585023865775537e-02 +843 857 -1.315380302376555e-02 +843 858 -1.105916272470025e-02 +843 859 -9.403863770832839e-03 +843 860 -8.076052134892575e-03 +843 861 -6.996835383339622e-03 +843 862 -6.109381318875730e-03 +843 863 -5.371977266379788e-03 +844 844 3.988394278146373e+01 +844 816 -2.312252367280536e-03 +844 817 -2.532689975072674e-03 +844 818 -2.783725492315667e-03 +844 819 -3.071047067257394e-03 +844 820 -3.401691470521385e-03 +844 821 -3.784439171232917e-03 +844 822 -4.230349322908508e-03 +844 823 -4.753493624956895e-03 +844 824 -5.371977266379790e-03 +844 825 -6.109381318875734e-03 +844 826 -6.996835383339677e-03 +844 827 -8.076052134892578e-03 +844 828 -9.403863770832839e-03 +844 829 -1.105916272470025e-02 +844 830 -1.315380302376546e-02 +844 831 -1.585023865775526e-02 +844 832 -1.939104886145125e-02 +844 833 -2.415034675252906e-02 +844 834 -3.072751892616543e-02 +844 835 -4.012781031912993e-02 +844 836 -5.413421453123171e-02 +844 837 -7.613960933881272e-02 +844 838 -1.132183869282775e-01 +844 839 -1.820810586422680e-01 +844 840 -3.301555353436850e-01 +844 841 -7.412185823610308e-01 +844 842 -3.165206906282891e+00 +844 843 -1.502055215852584e+01 +844 845 -1.502055215863293e+01 +844 846 -3.165206906282865e+00 +844 847 -7.412185823609942e-01 +844 848 -3.301555353436669e-01 +844 849 -1.820810586422635e-01 +844 850 -1.132183869282761e-01 +844 851 -7.613960933881186e-02 +844 852 -5.413421453123172e-02 +844 853 -4.012781031912956e-02 +844 854 -3.072751892616529e-02 +844 855 -2.415034675252896e-02 +844 856 -1.939104886145111e-02 +844 857 -1.585023865775526e-02 +844 858 -1.315380302376538e-02 +844 859 -1.105916272470022e-02 +844 860 -9.403863770832827e-03 +844 861 -8.076052134892594e-03 +844 862 -6.996835383339698e-03 +844 863 -6.109381318875769e-03 +845 845 3.988394278171953e+01 +845 816 -2.117777896667799e-03 +845 817 -2.312252367280536e-03 +845 818 -2.532689975072680e-03 +845 819 -2.783725492315679e-03 +845 820 -3.071047067257393e-03 +845 821 -3.401691470521394e-03 +845 822 -3.784439171232917e-03 +845 823 -4.230349322908543e-03 +845 824 -4.753493624956895e-03 +845 825 -5.371977266379808e-03 +845 826 -6.109381318875772e-03 +845 827 -6.996835383339674e-03 +845 828 -8.076052134892594e-03 +845 829 -9.403863770832814e-03 +845 830 -1.105916272470025e-02 +845 831 -1.315380302376547e-02 +845 832 -1.585023865775537e-02 +845 833 -1.939104886145119e-02 +845 834 -2.415034675252897e-02 +845 835 -3.072751892616544e-02 +845 836 -4.012781031912998e-02 +845 837 -5.413421453123234e-02 +845 838 -7.613960933881209e-02 +845 839 -1.132183869282771e-01 +845 840 -1.820810586422673e-01 +845 841 -3.301555353436804e-01 +845 842 -7.412185823610338e-01 +845 843 -3.165206906282886e+00 +845 844 -1.502055215863293e+01 +845 846 -1.502055215878382e+01 +845 847 -3.165206906282845e+00 +845 848 -7.412185823610067e-01 +845 849 -3.301555353436740e-01 +845 850 -1.820810586422656e-01 +845 851 -1.132183869282785e-01 +845 852 -7.613960933881184e-02 +845 853 -5.413421453123109e-02 +845 854 -4.012781031912974e-02 +845 855 -3.072751892616542e-02 +845 856 -2.415034675252897e-02 +845 857 -1.939104886145110e-02 +845 858 -1.585023865775514e-02 +845 859 -1.315380302376542e-02 +845 860 -1.105916272470025e-02 +845 861 -9.403863770832814e-03 +845 862 -8.076052134892582e-03 +845 863 -6.996835383339674e-03 +846 846 3.988394278208166e+01 +846 816 -1.945462087124857e-03 +846 817 -2.117777896667793e-03 +846 818 -2.312252367280536e-03 +846 819 -2.532689975072685e-03 +846 820 -2.783725492315671e-03 +846 821 -3.071047067257392e-03 +846 822 -3.401691470521384e-03 +846 823 -3.784439171232936e-03 +846 824 -4.230349322908531e-03 +846 825 -4.753493624956896e-03 +846 826 -5.371977266379821e-03 +846 827 -6.109381318875747e-03 +846 828 -6.996835383339671e-03 +846 829 -8.076052134892564e-03 +846 830 -9.403863770832828e-03 +846 831 -1.105916272470026e-02 +846 832 -1.315380302376555e-02 +846 833 -1.585023865775532e-02 +846 834 -1.939104886145111e-02 +846 835 -2.415034675252897e-02 +846 836 -3.072751892616545e-02 +846 837 -4.012781031913037e-02 +846 838 -5.413421453123205e-02 +846 839 -7.613960933881174e-02 +846 840 -1.132183869282775e-01 +846 841 -1.820810586422644e-01 +846 842 -3.301555353436727e-01 +846 843 -7.412185823610173e-01 +846 844 -3.165206906282865e+00 +846 845 -1.502055215878382e+01 +846 847 -1.502055215899850e+01 +846 848 -3.165206906282850e+00 +846 849 -7.412185823610256e-01 +846 850 -3.301555353436810e-01 +846 851 -1.820810586422681e-01 +846 852 -1.132183869282776e-01 +846 853 -7.613960933881096e-02 +846 854 -5.413421453123138e-02 +846 855 -4.012781031912993e-02 +846 856 -3.072751892616544e-02 +846 857 -2.415034675252896e-02 +846 858 -1.939104886145096e-02 +846 859 -1.585023865775520e-02 +846 860 -1.315380302376546e-02 +846 861 -1.105916272470025e-02 +846 862 -9.403863770832814e-03 +846 863 -8.076052134892583e-03 +847 847 3.988394278260303e+01 +847 816 -1.792160480940038e-03 +847 817 -1.945462087124849e-03 +847 818 -2.117777896667789e-03 +847 819 -2.312252367280536e-03 +847 820 -2.532689975072673e-03 +847 821 -2.783725492315665e-03 +847 822 -3.071047067257376e-03 +847 823 -3.401691470521392e-03 +847 824 -3.784439171232915e-03 +847 825 -4.230349322908520e-03 +847 826 -4.753493624956895e-03 +847 827 -5.371977266379786e-03 +847 828 -6.109381318875727e-03 +847 829 -6.996835383339622e-03 +847 830 -8.076052134892594e-03 +847 831 -9.403863770832816e-03 +847 832 -1.105916272470032e-02 +847 833 -1.315380302376550e-02 +847 834 -1.585023865775526e-02 +847 835 -1.939104886145110e-02 +847 836 -2.415034675252897e-02 +847 837 -3.072751892616572e-02 +847 838 -4.012781031913017e-02 +847 839 -5.413421453123172e-02 +847 840 -7.613960933881167e-02 +847 841 -1.132183869282754e-01 +847 842 -1.820810586422612e-01 +847 843 -3.301555353436665e-01 +847 844 -7.412185823609942e-01 +847 845 -3.165206906282845e+00 +847 846 -1.502055215899850e+01 +847 848 -1.502055215931072e+01 +847 849 -3.165206906282911e+00 +847 850 -7.412185823610454e-01 +847 851 -3.301555353436850e-01 +847 852 -1.820810586422691e-01 +847 853 -1.132183869282761e-01 +847 854 -7.613960933881120e-02 +847 855 -5.413421453123171e-02 +847 856 -4.012781031912998e-02 +847 857 -3.072751892616545e-02 +847 858 -2.415034675252878e-02 +847 859 -1.939104886145103e-02 +847 860 -1.585023865775526e-02 +847 861 -1.315380302376547e-02 +847 862 -1.105916272470026e-02 +847 863 -9.403863770832833e-03 +848 848 3.988394278260308e+01 +848 832 -9.403863770832813e-03 +848 833 -1.105916272470022e-02 +848 834 -1.315380302376538e-02 +848 835 -1.585023865775514e-02 +848 836 -1.939104886145097e-02 +848 837 -2.415034675252897e-02 +848 838 -3.072751892616531e-02 +848 839 -4.012781031912956e-02 +848 840 -5.413421453123109e-02 +848 841 -7.613960933881089e-02 +848 842 -1.132183869282745e-01 +848 843 -1.820810586422624e-01 +848 844 -3.301555353436669e-01 +848 845 -7.412185823610067e-01 +848 846 -3.165206906282850e+00 +848 847 -1.502055215931072e+01 +848 849 -1.502055215899859e+01 +848 850 -3.165206906282884e+00 +848 851 -7.412185823610317e-01 +848 852 -3.301555353436760e-01 +848 853 -1.820810586422631e-01 +848 854 -1.132183869282765e-01 +848 855 -7.613960933881238e-02 +848 856 -5.413421453123234e-02 +848 857 -4.012781031913035e-02 +848 858 -3.072751892616544e-02 +848 859 -2.415034675252906e-02 +848 860 -1.939104886145125e-02 +848 861 -1.585023865775537e-02 +848 862 -1.315380302376555e-02 +848 863 -1.105916272470032e-02 +848 864 -9.403863770832828e-03 +848 865 -8.076052134892578e-03 +848 866 -6.996835383339674e-03 +848 867 -6.109381318875747e-03 +848 868 -5.371977266379786e-03 +848 869 -4.753493624956895e-03 +848 870 -4.230349322908531e-03 +848 871 -3.784439171232937e-03 +848 872 -3.401691470521385e-03 +848 873 -3.071047067257393e-03 +848 874 -2.783725492315671e-03 +848 875 -2.532689975072673e-03 +848 876 -2.312252367280536e-03 +848 877 -2.117777896667794e-03 +848 878 -1.945462087124857e-03 +848 879 -1.792160480940035e-03 +849 849 3.988394278208172e+01 +849 832 -8.076052134892594e-03 +849 833 -9.403863770832842e-03 +849 834 -1.105916272470022e-02 +849 835 -1.315380302376542e-02 +849 836 -1.585023865775520e-02 +849 837 -1.939104886145118e-02 +849 838 -2.415034675252897e-02 +849 839 -3.072751892616529e-02 +849 840 -4.012781031912974e-02 +849 841 -5.413421453123141e-02 +849 842 -7.613960933881141e-02 +849 843 -1.132183869282759e-01 +849 844 -1.820810586422635e-01 +849 845 -3.301555353436740e-01 +849 846 -7.412185823610256e-01 +849 847 -3.165206906282911e+00 +849 848 -1.502055215899859e+01 +849 850 -1.502055215878375e+01 +849 851 -3.165206906282889e+00 +849 852 -7.412185823610196e-01 +849 853 -3.301555353436716e-01 +849 854 -1.820810586422651e-01 +849 855 -1.132183869282761e-01 +849 856 -7.613960933881180e-02 +849 857 -5.413421453123204e-02 +849 858 -4.012781031912978e-02 +849 859 -3.072751892616544e-02 +849 860 -2.415034675252906e-02 +849 861 -1.939104886145119e-02 +849 862 -1.585023865775532e-02 +849 863 -1.315380302376550e-02 +849 864 -1.105916272470022e-02 +849 865 -9.403863770832839e-03 +849 866 -8.076052134892594e-03 +849 867 -6.996835383339671e-03 +849 868 -6.109381318875727e-03 +849 869 -5.371977266379805e-03 +849 870 -4.753493624956895e-03 +849 871 -4.230349322908543e-03 +849 872 -3.784439171232917e-03 +849 873 -3.401691470521394e-03 +849 874 -3.071047067257392e-03 +849 875 -2.783725492315665e-03 +849 876 -2.532689975072680e-03 +849 877 -2.312252367280536e-03 +849 878 -2.117777896667799e-03 +849 879 -1.945462087124849e-03 +850 850 3.988394278171953e+01 +850 832 -6.996835383339702e-03 +850 833 -8.076052134892653e-03 +850 834 -9.403863770832828e-03 +850 835 -1.105916272470025e-02 +850 836 -1.315380302376546e-02 +850 837 -1.585023865775536e-02 +850 838 -1.939104886145118e-02 +850 839 -2.415034675252896e-02 +850 840 -3.072751892616542e-02 +850 841 -4.012781031912996e-02 +850 842 -5.413421453123234e-02 +850 843 -7.613960933881239e-02 +850 844 -1.132183869282761e-01 +850 845 -1.820810586422656e-01 +850 846 -3.301555353436810e-01 +850 847 -7.412185823610454e-01 +850 848 -3.165206906282884e+00 +850 849 -1.502055215878375e+01 +850 851 -1.502055215863297e+01 +850 852 -3.165206906282857e+00 +850 853 -7.412185823610180e-01 +850 854 -3.301555353436770e-01 +850 855 -1.820810586422644e-01 +850 856 -1.132183869282754e-01 +850 857 -7.613960933881117e-02 +850 858 -5.413421453123111e-02 +850 859 -4.012781031912974e-02 +850 860 -3.072751892616543e-02 +850 861 -2.415034675252897e-02 +850 862 -1.939104886145111e-02 +850 863 -1.585023865775526e-02 +850 864 -1.315380302376538e-02 +850 865 -1.105916272470025e-02 +850 866 -9.403863770832814e-03 +850 867 -8.076052134892564e-03 +850 868 -6.996835383339622e-03 +850 869 -6.109381318875730e-03 +850 870 -5.371977266379788e-03 +850 871 -4.753493624956895e-03 +850 872 -4.230349322908508e-03 +850 873 -3.784439171232917e-03 +850 874 -3.401691470521384e-03 +850 875 -3.071047067257376e-03 +850 876 -2.783725492315666e-03 +850 877 -2.532689975072674e-03 +850 878 -2.312252367280536e-03 +850 879 -2.117777896667785e-03 +851 851 3.988394278146368e+01 +851 832 -6.109381318875734e-03 +851 833 -6.996835383339677e-03 +851 834 -8.076052134892568e-03 +851 835 -9.403863770832814e-03 +851 836 -1.105916272470026e-02 +851 837 -1.315380302376555e-02 +851 838 -1.585023865775532e-02 +851 839 -1.939104886145111e-02 +851 840 -2.415034675252897e-02 +851 841 -3.072751892616545e-02 +851 842 -4.012781031913039e-02 +851 843 -5.413421453123236e-02 +851 844 -7.613960933881186e-02 +851 845 -1.132183869282785e-01 +851 846 -1.820810586422681e-01 +851 847 -3.301555353436850e-01 +851 848 -7.412185823610317e-01 +851 849 -3.165206906282889e+00 +851 850 -1.502055215863297e+01 +851 852 -1.502055215852572e+01 +851 853 -3.165206906282862e+00 +851 854 -7.412185823610250e-01 +851 855 -3.301555353436733e-01 +851 856 -1.820810586422620e-01 +851 857 -1.132183869282743e-01 +851 858 -7.613960933881100e-02 +851 859 -5.413421453123138e-02 +851 860 -4.012781031912993e-02 +851 861 -3.072751892616544e-02 +851 862 -2.415034675252897e-02 +851 863 -1.939104886145110e-02 +851 864 -1.585023865775514e-02 +851 865 -1.315380302376546e-02 +851 866 -1.105916272470025e-02 +851 867 -9.403863770832828e-03 +851 868 -8.076052134892594e-03 +851 869 -6.996835383339698e-03 +851 870 -6.109381318875769e-03 +851 871 -5.371977266379837e-03 +851 872 -4.753493624956895e-03 +851 873 -4.230349322908543e-03 +851 874 -3.784439171232936e-03 +851 875 -3.401691470521392e-03 +851 876 -3.071047067257401e-03 +851 877 -2.783725492315679e-03 +851 878 -2.532689975072691e-03 +851 879 -2.312252367280536e-03 +852 852 3.988394278128109e+01 +852 832 -5.371977266379808e-03 +852 833 -6.109381318875772e-03 +852 834 -6.996835383339674e-03 +852 835 -8.076052134892582e-03 +852 836 -9.403863770832816e-03 +852 837 -1.105916272470032e-02 +852 838 -1.315380302376550e-02 +852 839 -1.585023865775526e-02 +852 840 -1.939104886145110e-02 +852 841 -2.415034675252897e-02 +852 842 -3.072751892616573e-02 +852 843 -4.012781031913037e-02 +852 844 -5.413421453123172e-02 +852 845 -7.613960933881184e-02 +852 846 -1.132183869282776e-01 +852 847 -1.820810586422691e-01 +852 848 -3.301555353436760e-01 +852 849 -7.412185823610196e-01 +852 850 -3.165206906282857e+00 +852 851 -1.502055215852572e+01 +852 853 -1.502055215844904e+01 +852 854 -3.165206906282879e+00 +852 855 -7.412185823610261e-01 +852 856 -3.301555353436816e-01 +852 857 -1.820810586422650e-01 +852 858 -1.132183869282768e-01 +852 859 -7.613960933881139e-02 +852 860 -5.413421453123171e-02 +852 861 -4.012781031912998e-02 +852 862 -3.072751892616545e-02 +852 863 -2.415034675252897e-02 +852 864 -1.939104886145097e-02 +852 865 -1.585023865775526e-02 +852 866 -1.315380302376547e-02 +852 867 -1.105916272470026e-02 +852 868 -9.403863770832816e-03 +852 869 -8.076052134892570e-03 +852 870 -6.996835383339674e-03 +852 871 -6.109381318875769e-03 +852 872 -5.371977266379790e-03 +852 873 -4.753493624956895e-03 +852 874 -4.230349322908531e-03 +852 875 -3.784439171232915e-03 +852 876 -3.401691470521394e-03 +852 877 -3.071047067257393e-03 +852 878 -2.783725492315679e-03 +852 879 -2.532689975072674e-03 +853 853 3.988394278115148e+01 +853 832 -4.753493624956896e-03 +853 833 -5.371977266379821e-03 +853 834 -6.109381318875747e-03 +853 835 -6.996835383339671e-03 +853 836 -8.076052134892552e-03 +853 837 -9.403863770832827e-03 +853 838 -1.105916272470022e-02 +853 839 -1.315380302376538e-02 +853 840 -1.585023865775514e-02 +853 841 -1.939104886145097e-02 +853 842 -2.415034675252898e-02 +853 843 -3.072751892616545e-02 +853 844 -4.012781031912956e-02 +853 845 -5.413421453123109e-02 +853 846 -7.613960933881096e-02 +853 847 -1.132183869282761e-01 +853 848 -1.820810586422631e-01 +853 849 -3.301555353436716e-01 +853 850 -7.412185823610180e-01 +853 851 -3.165206906282862e+00 +853 852 -1.502055215844904e+01 +853 854 -1.502055215839541e+01 +853 855 -3.165206906282837e+00 +853 856 -7.412185823610318e-01 +853 857 -3.301555353436828e-01 +853 858 -1.820810586422688e-01 +853 859 -1.132183869282795e-01 +853 860 -7.613960933881252e-02 +853 861 -5.413421453123234e-02 +853 862 -4.012781031913037e-02 +853 863 -3.072751892616572e-02 +853 864 -2.415034675252897e-02 +853 865 -1.939104886145125e-02 +853 866 -1.585023865775537e-02 +853 867 -1.315380302376555e-02 +853 868 -1.105916272470032e-02 +853 869 -9.403863770832813e-03 +853 870 -8.076052134892594e-03 +853 871 -6.996835383339702e-03 +853 872 -6.109381318875734e-03 +853 873 -5.371977266379808e-03 +853 874 -4.753493624956896e-03 +853 875 -4.230349322908520e-03 +853 876 -3.784439171232929e-03 +853 877 -3.401691470521395e-03 +853 878 -3.071047067257401e-03 +853 879 -2.783725492315667e-03 +854 854 3.988394278106472e+01 +854 832 -4.230349322908520e-03 +854 833 -4.753493624956895e-03 +854 834 -5.371977266379786e-03 +854 835 -6.109381318875727e-03 +854 836 -6.996835383339622e-03 +854 837 -8.076052134892604e-03 +854 838 -9.403863770832825e-03 +854 839 -1.105916272470022e-02 +854 840 -1.315380302376542e-02 +854 841 -1.585023865775520e-02 +854 842 -1.939104886145118e-02 +854 843 -2.415034675252906e-02 +854 844 -3.072751892616529e-02 +854 845 -4.012781031912974e-02 +854 846 -5.413421453123138e-02 +854 847 -7.613960933881120e-02 +854 848 -1.132183869282765e-01 +854 849 -1.820810586422651e-01 +854 850 -3.301555353436770e-01 +854 851 -7.412185823610250e-01 +854 852 -3.165206906282879e+00 +854 853 -1.502055215839541e+01 +854 855 -1.502055215836214e+01 +854 856 -3.165206906282874e+00 +854 857 -7.412185823610274e-01 +854 858 -3.301555353436758e-01 +854 859 -1.820810586422683e-01 +854 860 -1.132183869282766e-01 +854 861 -7.613960933881207e-02 +854 862 -5.413421453123205e-02 +854 863 -4.012781031913017e-02 +854 864 -3.072751892616531e-02 +854 865 -2.415034675252906e-02 +854 866 -1.939104886145119e-02 +854 867 -1.585023865775532e-02 +854 868 -1.315380302376550e-02 +854 869 -1.105916272470022e-02 +854 870 -9.403863770832842e-03 +854 871 -8.076052134892653e-03 +854 872 -6.996835383339677e-03 +854 873 -6.109381318875772e-03 +854 874 -5.371977266379821e-03 +854 875 -4.753493624956895e-03 +854 876 -4.230349322908545e-03 +854 877 -3.784439171232938e-03 +854 878 -3.401691470521412e-03 +854 879 -3.071047067257394e-03 +855 855 3.988394278102300e+01 +855 832 -3.784439171232929e-03 +855 833 -4.230349322908545e-03 +855 834 -4.753493624956895e-03 +855 835 -5.371977266379805e-03 +855 836 -6.109381318875730e-03 +855 837 -6.996835383339698e-03 +855 838 -8.076052134892592e-03 +855 839 -9.403863770832811e-03 +855 840 -1.105916272470025e-02 +855 841 -1.315380302376546e-02 +855 842 -1.585023865775537e-02 +855 843 -1.939104886145125e-02 +855 844 -2.415034675252896e-02 +855 845 -3.072751892616542e-02 +855 846 -4.012781031912993e-02 +855 847 -5.413421453123171e-02 +855 848 -7.613960933881238e-02 +855 849 -1.132183869282761e-01 +855 850 -1.820810586422644e-01 +855 851 -3.301555353436733e-01 +855 852 -7.412185823610261e-01 +855 853 -3.165206906282837e+00 +855 854 -1.502055215836214e+01 +855 856 -1.502055215835493e+01 +855 857 -3.165206906282889e+00 +855 858 -7.412185823610212e-01 +855 859 -3.301555353436778e-01 +855 860 -1.820810586422658e-01 +855 861 -1.132183869282770e-01 +855 862 -7.613960933881173e-02 +855 863 -5.413421453123172e-02 +855 864 -4.012781031912956e-02 +855 865 -3.072751892616543e-02 +855 866 -2.415034675252897e-02 +855 867 -1.939104886145111e-02 +855 868 -1.585023865775526e-02 +855 869 -1.315380302376538e-02 +855 870 -1.105916272470022e-02 +855 871 -9.403863770832828e-03 +855 872 -8.076052134892568e-03 +855 873 -6.996835383339674e-03 +855 874 -6.109381318875747e-03 +855 875 -5.371977266379786e-03 +855 876 -4.753493624956895e-03 +855 877 -4.230349322908531e-03 +855 878 -3.784439171232937e-03 +855 879 -3.401691470521385e-03 +856 856 3.988394278105616e+01 +856 832 -3.401691470521395e-03 +856 833 -3.784439171232938e-03 +856 834 -4.230349322908531e-03 +856 835 -4.753493624956895e-03 +856 836 -5.371977266379788e-03 +856 837 -6.109381318875769e-03 +856 838 -6.996835383339674e-03 +856 839 -8.076052134892583e-03 +856 840 -9.403863770832832e-03 +856 841 -1.105916272470026e-02 +856 842 -1.315380302376555e-02 +856 843 -1.585023865775537e-02 +856 844 -1.939104886145111e-02 +856 845 -2.415034675252897e-02 +856 846 -3.072751892616544e-02 +856 847 -4.012781031912998e-02 +856 848 -5.413421453123234e-02 +856 849 -7.613960933881180e-02 +856 850 -1.132183869282754e-01 +856 851 -1.820810586422620e-01 +856 852 -3.301555353436816e-01 +856 853 -7.412185823610318e-01 +856 854 -3.165206906282874e+00 +856 855 -1.502055215835493e+01 +856 857 -1.502055215840045e+01 +856 858 -3.165206906282858e+00 +856 859 -7.412185823610244e-01 +856 860 -3.301555353436729e-01 +856 861 -1.820810586422648e-01 +856 862 -1.132183869282766e-01 +856 863 -7.613960933881148e-02 +856 864 -5.413421453123109e-02 +856 865 -4.012781031912993e-02 +856 866 -3.072751892616544e-02 +856 867 -2.415034675252897e-02 +856 868 -1.939104886145110e-02 +856 869 -1.585023865775514e-02 +856 870 -1.315380302376542e-02 +856 871 -1.105916272470025e-02 +856 872 -9.403863770832814e-03 +856 873 -8.076052134892582e-03 +856 874 -6.996835383339671e-03 +856 875 -6.109381318875727e-03 +856 876 -5.371977266379805e-03 +856 877 -4.753493624956895e-03 +856 878 -4.230349322908543e-03 +856 879 -3.784439171232917e-03 +857 857 3.988394278128564e+01 +857 832 -3.071047067257401e-03 +857 833 -3.401691470521412e-03 +857 834 -3.784439171232937e-03 +857 835 -4.230349322908543e-03 +857 836 -4.753493624956895e-03 +857 837 -5.371977266379837e-03 +857 838 -6.109381318875769e-03 +857 839 -6.996835383339702e-03 +857 840 -8.076052134892642e-03 +857 841 -9.403863770832832e-03 +857 842 -1.105916272470032e-02 +857 843 -1.315380302376555e-02 +857 844 -1.585023865775526e-02 +857 845 -1.939104886145110e-02 +857 846 -2.415034675252896e-02 +857 847 -3.072751892616545e-02 +857 848 -4.012781031913035e-02 +857 849 -5.413421453123204e-02 +857 850 -7.613960933881117e-02 +857 851 -1.132183869282743e-01 +857 852 -1.820810586422650e-01 +857 853 -3.301555353436828e-01 +857 854 -7.412185823610274e-01 +857 855 -3.165206906282889e+00 +857 856 -1.502055215840045e+01 +857 858 -1.502055215860532e+01 +857 859 -3.165206906282886e+00 +857 860 -7.412185823610071e-01 +857 861 -3.301555353436749e-01 +857 862 -1.820810586422655e-01 +857 863 -1.132183869282754e-01 +857 864 -7.613960933881087e-02 +857 865 -5.413421453123171e-02 +857 866 -4.012781031912998e-02 +857 867 -3.072751892616545e-02 +857 868 -2.415034675252897e-02 +857 869 -1.939104886145097e-02 +857 870 -1.585023865775520e-02 +857 871 -1.315380302376546e-02 +857 872 -1.105916272470026e-02 +857 873 -9.403863770832816e-03 +857 874 -8.076052134892552e-03 +857 875 -6.996835383339622e-03 +857 876 -6.109381318875730e-03 +857 877 -5.371977266379788e-03 +857 878 -4.753493624956895e-03 +857 879 -4.230349322908508e-03 +858 858 3.988394278152494e+01 +858 832 -2.783725492315667e-03 +858 833 -3.071047067257394e-03 +858 834 -3.401691470521385e-03 +858 835 -3.784439171232917e-03 +858 836 -4.230349322908508e-03 +858 837 -4.753493624956895e-03 +858 838 -5.371977266379790e-03 +858 839 -6.109381318875734e-03 +858 840 -6.996835383339677e-03 +858 841 -8.076052134892557e-03 +858 842 -9.403863770832814e-03 +858 843 -1.105916272470025e-02 +858 844 -1.315380302376538e-02 +858 845 -1.585023865775514e-02 +858 846 -1.939104886145096e-02 +858 847 -2.415034675252878e-02 +858 848 -3.072751892616544e-02 +858 849 -4.012781031912978e-02 +858 850 -5.413421453123111e-02 +858 851 -7.613960933881100e-02 +858 852 -1.132183869282768e-01 +858 853 -1.820810586422688e-01 +858 854 -3.301555353436758e-01 +858 855 -7.412185823610212e-01 +858 856 -3.165206906282858e+00 +858 857 -1.502055215860532e+01 +858 859 -1.502055215859224e+01 +858 860 -3.165206906282837e+00 +858 861 -7.412185823610254e-01 +858 862 -3.301555353436789e-01 +858 863 -1.820810586422615e-01 +858 864 -1.132183869282744e-01 +858 865 -7.613960933881185e-02 +858 866 -5.413421453123234e-02 +858 867 -4.012781031913037e-02 +858 868 -3.072751892616572e-02 +858 869 -2.415034675252897e-02 +858 870 -1.939104886145118e-02 +858 871 -1.585023865775536e-02 +858 872 -1.315380302376555e-02 +858 873 -1.105916272470032e-02 +858 874 -9.403863770832827e-03 +858 875 -8.076052134892604e-03 +858 876 -6.996835383339698e-03 +858 877 -6.109381318875769e-03 +858 878 -5.371977266379837e-03 +858 879 -4.753493624956895e-03 +859 859 3.988394278151349e+01 +859 832 -2.532689975072680e-03 +859 833 -2.783725492315679e-03 +859 834 -3.071047067257393e-03 +859 835 -3.401691470521394e-03 +859 836 -3.784439171232917e-03 +859 837 -4.230349322908543e-03 +859 838 -4.753493624956895e-03 +859 839 -5.371977266379808e-03 +859 840 -6.109381318875772e-03 +859 841 -6.996835383339674e-03 +859 842 -8.076052134892592e-03 +859 843 -9.403863770832839e-03 +859 844 -1.105916272470022e-02 +859 845 -1.315380302376542e-02 +859 846 -1.585023865775520e-02 +859 847 -1.939104886145103e-02 +859 848 -2.415034675252906e-02 +859 849 -3.072751892616544e-02 +859 850 -4.012781031912974e-02 +859 851 -5.413421453123138e-02 +859 852 -7.613960933881139e-02 +859 853 -1.132183869282795e-01 +859 854 -1.820810586422683e-01 +859 855 -3.301555353436778e-01 +859 856 -7.412185823610244e-01 +859 857 -3.165206906282886e+00 +859 858 -1.502055215859224e+01 +859 860 -1.502055215859640e+01 +859 861 -3.165206906282874e+00 +859 862 -7.412185823610308e-01 +859 863 -3.301555353436776e-01 +859 864 -1.820810586422620e-01 +859 865 -1.132183869282750e-01 +859 866 -7.613960933881195e-02 +859 867 -5.413421453123205e-02 +859 868 -4.012781031913017e-02 +859 869 -3.072751892616531e-02 +859 870 -2.415034675252897e-02 +859 871 -1.939104886145118e-02 +859 872 -1.585023865775532e-02 +859 873 -1.315380302376550e-02 +859 874 -1.105916272470022e-02 +859 875 -9.403863770832825e-03 +859 876 -8.076052134892592e-03 +859 877 -6.996835383339674e-03 +859 878 -6.109381318875769e-03 +859 879 -5.371977266379790e-03 +860 860 3.988394278151439e+01 +860 832 -2.312252367280536e-03 +860 833 -2.532689975072685e-03 +860 834 -2.783725492315671e-03 +860 835 -3.071047067257392e-03 +860 836 -3.401691470521384e-03 +860 837 -3.784439171232936e-03 +860 838 -4.230349322908531e-03 +860 839 -4.753493624956896e-03 +860 840 -5.371977266379821e-03 +860 841 -6.109381318875747e-03 +860 842 -6.996835383339671e-03 +860 843 -8.076052134892575e-03 +860 844 -9.403863770832827e-03 +860 845 -1.105916272470025e-02 +860 846 -1.315380302376546e-02 +860 847 -1.585023865775526e-02 +860 848 -1.939104886145125e-02 +860 849 -2.415034675252906e-02 +860 850 -3.072751892616543e-02 +860 851 -4.012781031912993e-02 +860 852 -5.413421453123171e-02 +860 853 -7.613960933881252e-02 +860 854 -1.132183869282766e-01 +860 855 -1.820810586422658e-01 +860 856 -3.301555353436729e-01 +860 857 -7.412185823610071e-01 +860 858 -3.165206906282837e+00 +860 859 -1.502055215859640e+01 +860 861 -1.502055215858815e+01 +860 862 -3.165206906282882e+00 +860 863 -7.412185823610351e-01 +860 864 -3.301555353436748e-01 +860 865 -1.820810586422662e-01 +860 866 -1.132183869282780e-01 +860 867 -7.613960933881188e-02 +860 868 -5.413421453123172e-02 +860 869 -4.012781031912956e-02 +860 870 -3.072751892616529e-02 +860 871 -2.415034675252896e-02 +860 872 -1.939104886145111e-02 +860 873 -1.585023865775526e-02 +860 874 -1.315380302376538e-02 +860 875 -1.105916272470022e-02 +860 876 -9.403863770832811e-03 +860 877 -8.076052134892583e-03 +860 878 -6.996835383339702e-03 +860 879 -6.109381318875734e-03 +861 861 3.988394278153930e+01 +861 832 -2.117777896667789e-03 +861 833 -2.312252367280536e-03 +861 834 -2.532689975072673e-03 +861 835 -2.783725492315665e-03 +861 836 -3.071047067257376e-03 +861 837 -3.401691470521392e-03 +861 838 -3.784439171232915e-03 +861 839 -4.230349322908520e-03 +861 840 -4.753493624956895e-03 +861 841 -5.371977266379786e-03 +861 842 -6.109381318875727e-03 +861 843 -6.996835383339622e-03 +861 844 -8.076052134892594e-03 +861 845 -9.403863770832814e-03 +861 846 -1.105916272470025e-02 +861 847 -1.315380302376547e-02 +861 848 -1.585023865775537e-02 +861 849 -1.939104886145119e-02 +861 850 -2.415034675252897e-02 +861 851 -3.072751892616544e-02 +861 852 -4.012781031912998e-02 +861 853 -5.413421453123234e-02 +861 854 -7.613960933881207e-02 +861 855 -1.132183869282770e-01 +861 856 -1.820810586422648e-01 +861 857 -3.301555353436749e-01 +861 858 -7.412185823610254e-01 +861 859 -3.165206906282874e+00 +861 860 -1.502055215858815e+01 +861 862 -1.502055215863987e+01 +861 863 -3.165206906282870e+00 +861 864 -7.412185823610126e-01 +861 865 -3.301555353436774e-01 +861 866 -1.820810586422691e-01 +861 867 -1.132183869282780e-01 +861 868 -7.613960933881184e-02 +861 869 -5.413421453123109e-02 +861 870 -4.012781031912974e-02 +861 871 -3.072751892616542e-02 +861 872 -2.415034675252897e-02 +861 873 -1.939104886145110e-02 +861 874 -1.585023865775514e-02 +861 875 -1.315380302376542e-02 +861 876 -1.105916272470025e-02 +861 877 -9.403863770832832e-03 +861 878 -8.076052134892642e-03 +861 879 -6.996835383339677e-03 +862 862 3.988394278164019e+01 +862 832 -1.945462087124854e-03 +862 833 -2.117777896667799e-03 +862 834 -2.312252367280536e-03 +862 835 -2.532689975072680e-03 +862 836 -2.783725492315666e-03 +862 837 -3.071047067257401e-03 +862 838 -3.401691470521394e-03 +862 839 -3.784439171232929e-03 +862 840 -4.230349322908545e-03 +862 841 -4.753493624956895e-03 +862 842 -5.371977266379805e-03 +862 843 -6.109381318875730e-03 +862 844 -6.996835383339698e-03 +862 845 -8.076052134892582e-03 +862 846 -9.403863770832814e-03 +862 847 -1.105916272470026e-02 +862 848 -1.315380302376555e-02 +862 849 -1.585023865775532e-02 +862 850 -1.939104886145111e-02 +862 851 -2.415034675252897e-02 +862 852 -3.072751892616545e-02 +862 853 -4.012781031913037e-02 +862 854 -5.413421453123205e-02 +862 855 -7.613960933881173e-02 +862 856 -1.132183869282766e-01 +862 857 -1.820810586422655e-01 +862 858 -3.301555353436789e-01 +862 859 -7.412185823610308e-01 +862 860 -3.165206906282882e+00 +862 861 -1.502055215863987e+01 +862 863 -1.502055215866010e+01 +862 864 -3.165206906282869e+00 +862 865 -7.412185823610172e-01 +862 866 -3.301555353436789e-01 +862 867 -1.820810586422668e-01 +862 868 -1.132183869282776e-01 +862 869 -7.613960933881117e-02 +862 870 -5.413421453123138e-02 +862 871 -4.012781031912993e-02 +862 872 -3.072751892616544e-02 +862 873 -2.415034675252896e-02 +862 874 -1.939104886145096e-02 +862 875 -1.585023865775520e-02 +862 876 -1.315380302376546e-02 +862 877 -1.105916272470025e-02 +862 878 -9.403863770832828e-03 +862 879 -8.076052134892556e-03 +863 863 3.988394278169719e+01 +863 832 -1.792160480940039e-03 +863 833 -1.945462087124858e-03 +863 834 -2.117777896667794e-03 +863 835 -2.312252367280536e-03 +863 836 -2.532689975072674e-03 +863 837 -2.783725492315679e-03 +863 838 -3.071047067257393e-03 +863 839 -3.401691470521395e-03 +863 840 -3.784439171232938e-03 +863 841 -4.230349322908531e-03 +863 842 -4.753493624956895e-03 +863 843 -5.371977266379788e-03 +863 844 -6.109381318875769e-03 +863 845 -6.996835383339674e-03 +863 846 -8.076052134892583e-03 +863 847 -9.403863770832833e-03 +863 848 -1.105916272470032e-02 +863 849 -1.315380302376550e-02 +863 850 -1.585023865775526e-02 +863 851 -1.939104886145110e-02 +863 852 -2.415034675252897e-02 +863 853 -3.072751892616572e-02 +863 854 -4.012781031913017e-02 +863 855 -5.413421453123172e-02 +863 856 -7.613960933881148e-02 +863 857 -1.132183869282754e-01 +863 858 -1.820810586422615e-01 +863 859 -3.301555353436776e-01 +863 860 -7.412185823610351e-01 +863 861 -3.165206906282870e+00 +863 862 -1.502055215866010e+01 +863 864 -1.502055215931051e+01 +863 865 -3.165206906282847e+00 +863 866 -7.412185823610185e-01 +863 867 -3.301555353436761e-01 +863 868 -1.820810586422683e-01 +863 869 -1.132183869282777e-01 +863 870 -7.613960933881123e-02 +863 871 -5.413421453123171e-02 +863 872 -4.012781031912998e-02 +863 873 -3.072751892616545e-02 +863 874 -2.415034675252878e-02 +863 875 -1.939104886145103e-02 +863 876 -1.585023865775526e-02 +863 877 -1.315380302376547e-02 +863 878 -1.105916272470026e-02 +863 879 -9.403863770832771e-03 +864 864 3.988394278169726e+01 +864 848 -9.403863770832828e-03 +864 849 -1.105916272470022e-02 +864 850 -1.315380302376538e-02 +864 851 -1.585023865775514e-02 +864 852 -1.939104886145097e-02 +864 853 -2.415034675252897e-02 +864 854 -3.072751892616531e-02 +864 855 -4.012781031912956e-02 +864 856 -5.413421453123109e-02 +864 857 -7.613960933881087e-02 +864 858 -1.132183869282744e-01 +864 859 -1.820810586422620e-01 +864 860 -3.301555353436748e-01 +864 861 -7.412185823610126e-01 +864 862 -3.165206906282869e+00 +864 863 -1.502055215931051e+01 +864 865 -1.502055215866007e+01 +864 866 -3.165206906282917e+00 +864 867 -7.412185823610449e-01 +864 868 -3.301555353436820e-01 +864 869 -1.820810586422664e-01 +864 870 -1.132183869282756e-01 +864 871 -7.613960933881236e-02 +864 872 -5.413421453123234e-02 +864 873 -4.012781031913035e-02 +864 874 -3.072751892616544e-02 +864 875 -2.415034675252906e-02 +864 876 -1.939104886145125e-02 +864 877 -1.585023865775537e-02 +864 878 -1.315380302376555e-02 +864 879 -1.105916272470025e-02 +864 880 -9.403863770832811e-03 +864 881 -8.076052134892575e-03 +864 882 -6.996835383339622e-03 +864 883 -6.109381318875730e-03 +864 884 -5.371977266379788e-03 +864 885 -4.753493624956895e-03 +864 886 -4.230349322908508e-03 +864 887 -3.784439171232917e-03 +864 888 -3.401691470521384e-03 +864 889 -3.071047067257376e-03 +864 890 -2.783725492315666e-03 +864 891 -2.532689975072674e-03 +864 892 -2.312252367280536e-03 +864 893 -2.117777896667785e-03 +864 894 -1.945462087124849e-03 +864 895 -1.792160480940034e-03 +865 865 3.988394278164026e+01 +865 848 -8.076052134892578e-03 +865 849 -9.403863770832839e-03 +865 850 -1.105916272470025e-02 +865 851 -1.315380302376546e-02 +865 852 -1.585023865775526e-02 +865 853 -1.939104886145125e-02 +865 854 -2.415034675252906e-02 +865 855 -3.072751892616543e-02 +865 856 -4.012781031912993e-02 +865 857 -5.413421453123171e-02 +865 858 -7.613960933881185e-02 +865 859 -1.132183869282750e-01 +865 860 -1.820810586422662e-01 +865 861 -3.301555353436774e-01 +865 862 -7.412185823610172e-01 +865 863 -3.165206906282847e+00 +865 864 -1.502055215866007e+01 +865 866 -1.502055215863998e+01 +865 867 -3.165206906282874e+00 +865 868 -7.412185823610246e-01 +865 869 -3.301555353436750e-01 +865 870 -1.820810586422615e-01 +865 871 -1.132183869282760e-01 +865 872 -7.613960933881157e-02 +865 873 -5.413421453123172e-02 +865 874 -4.012781031912956e-02 +865 875 -3.072751892616529e-02 +865 876 -2.415034675252896e-02 +865 877 -1.939104886145111e-02 +865 878 -1.585023865775526e-02 +865 879 -1.315380302376538e-02 +865 880 -1.105916272470018e-02 +865 881 -9.403863770832827e-03 +865 882 -8.076052134892594e-03 +865 883 -6.996835383339698e-03 +865 884 -6.109381318875769e-03 +865 885 -5.371977266379837e-03 +865 886 -4.753493624956895e-03 +865 887 -4.230349322908543e-03 +865 888 -3.784439171232936e-03 +865 889 -3.401691470521392e-03 +865 890 -3.071047067257401e-03 +865 891 -2.783725492315679e-03 +865 892 -2.532689975072691e-03 +865 893 -2.312252367280536e-03 +865 894 -2.117777896667799e-03 +865 895 -1.945462087124857e-03 +866 866 3.988394278153930e+01 +866 848 -6.996835383339674e-03 +866 849 -8.076052134892594e-03 +866 850 -9.403863770832814e-03 +866 851 -1.105916272470025e-02 +866 852 -1.315380302376547e-02 +866 853 -1.585023865775537e-02 +866 854 -1.939104886145119e-02 +866 855 -2.415034675252897e-02 +866 856 -3.072751892616544e-02 +866 857 -4.012781031912998e-02 +866 858 -5.413421453123234e-02 +866 859 -7.613960933881195e-02 +866 860 -1.132183869282780e-01 +866 861 -1.820810586422691e-01 +866 862 -3.301555353436789e-01 +866 863 -7.412185823610185e-01 +866 864 -3.165206906282917e+00 +866 865 -1.502055215863998e+01 +866 867 -1.502055215858805e+01 +866 868 -3.165206906282863e+00 +866 869 -7.412185823610072e-01 +866 870 -3.301555353436688e-01 +866 871 -1.820810586422626e-01 +866 872 -1.132183869282745e-01 +866 873 -7.613960933881096e-02 +866 874 -5.413421453123109e-02 +866 875 -4.012781031912974e-02 +866 876 -3.072751892616542e-02 +866 877 -2.415034675252897e-02 +866 878 -1.939104886145110e-02 +866 879 -1.585023865775514e-02 +866 880 -1.315380302376537e-02 +866 881 -1.105916272470025e-02 +866 882 -9.403863770832814e-03 +866 883 -8.076052134892582e-03 +866 884 -6.996835383339674e-03 +866 885 -6.109381318875769e-03 +866 886 -5.371977266379790e-03 +866 887 -4.753493624956895e-03 +866 888 -4.230349322908531e-03 +866 889 -3.784439171232915e-03 +866 890 -3.401691470521394e-03 +866 891 -3.071047067257393e-03 +866 892 -2.783725492315679e-03 +866 893 -2.532689975072674e-03 +866 894 -2.312252367280536e-03 +866 895 -2.117777896667793e-03 +867 867 3.988394278151441e+01 +867 848 -6.109381318875747e-03 +867 849 -6.996835383339671e-03 +867 850 -8.076052134892564e-03 +867 851 -9.403863770832828e-03 +867 852 -1.105916272470026e-02 +867 853 -1.315380302376555e-02 +867 854 -1.585023865775532e-02 +867 855 -1.939104886145111e-02 +867 856 -2.415034675252897e-02 +867 857 -3.072751892616545e-02 +867 858 -4.012781031913037e-02 +867 859 -5.413421453123205e-02 +867 860 -7.613960933881188e-02 +867 861 -1.132183869282780e-01 +867 862 -1.820810586422668e-01 +867 863 -3.301555353436761e-01 +867 864 -7.412185823610449e-01 +867 865 -3.165206906282874e+00 +867 866 -1.502055215858805e+01 +867 868 -1.502055215859651e+01 +867 869 -3.165206906282846e+00 +867 870 -7.412185823610076e-01 +867 871 -3.301555353436760e-01 +867 872 -1.820810586422637e-01 +867 873 -1.132183869282743e-01 +867 874 -7.613960933881099e-02 +867 875 -5.413421453123138e-02 +867 876 -4.012781031912993e-02 +867 877 -3.072751892616544e-02 +867 878 -2.415034675252896e-02 +867 879 -1.939104886145095e-02 +867 880 -1.585023865775514e-02 +867 881 -1.315380302376546e-02 +867 882 -1.105916272470025e-02 +867 883 -9.403863770832814e-03 +867 884 -8.076052134892583e-03 +867 885 -6.996835383339702e-03 +867 886 -6.109381318875734e-03 +867 887 -5.371977266379808e-03 +867 888 -4.753493624956896e-03 +867 889 -4.230349322908520e-03 +867 890 -3.784439171232929e-03 +867 891 -3.401691470521395e-03 +867 892 -3.071047067257401e-03 +867 893 -2.783725492315667e-03 +867 894 -2.532689975072680e-03 +867 895 -2.312252367280536e-03 +868 868 3.988394278151350e+01 +868 848 -5.371977266379786e-03 +868 849 -6.109381318875727e-03 +868 850 -6.996835383339622e-03 +868 851 -8.076052134892594e-03 +868 852 -9.403863770832816e-03 +868 853 -1.105916272470032e-02 +868 854 -1.315380302376550e-02 +868 855 -1.585023865775526e-02 +868 856 -1.939104886145110e-02 +868 857 -2.415034675252897e-02 +868 858 -3.072751892616572e-02 +868 859 -4.012781031913017e-02 +868 860 -5.413421453123172e-02 +868 861 -7.613960933881184e-02 +868 862 -1.132183869282776e-01 +868 863 -1.820810586422683e-01 +868 864 -3.301555353436820e-01 +868 865 -7.412185823610246e-01 +868 866 -3.165206906282863e+00 +868 867 -1.502055215859651e+01 +868 869 -1.502055215859218e+01 +868 870 -3.165206906282849e+00 +868 871 -7.412185823610224e-01 +868 872 -3.301555353436686e-01 +868 873 -1.820810586422605e-01 +868 874 -1.132183869282767e-01 +868 875 -7.613960933881136e-02 +868 876 -5.413421453123171e-02 +868 877 -4.012781031912998e-02 +868 878 -3.072751892616545e-02 +868 879 -2.415034675252877e-02 +868 880 -1.939104886145096e-02 +868 881 -1.585023865775526e-02 +868 882 -1.315380302376547e-02 +868 883 -1.105916272470026e-02 +868 884 -9.403863770832833e-03 +868 885 -8.076052134892632e-03 +868 886 -6.996835383339677e-03 +868 887 -6.109381318875772e-03 +868 888 -5.371977266379821e-03 +868 889 -4.753493624956895e-03 +868 890 -4.230349322908545e-03 +868 891 -3.784439171232938e-03 +868 892 -3.401691470521412e-03 +868 893 -3.071047067257394e-03 +868 894 -2.783725492315679e-03 +868 895 -2.532689975072685e-03 +869 869 3.988394278152494e+01 +869 848 -4.753493624956895e-03 +869 849 -5.371977266379805e-03 +869 850 -6.109381318875730e-03 +869 851 -6.996835383339698e-03 +869 852 -8.076052134892570e-03 +869 853 -9.403863770832813e-03 +869 854 -1.105916272470022e-02 +869 855 -1.315380302376538e-02 +869 856 -1.585023865775514e-02 +869 857 -1.939104886145097e-02 +869 858 -2.415034675252897e-02 +869 859 -3.072751892616531e-02 +869 860 -4.012781031912956e-02 +869 861 -5.413421453123109e-02 +869 862 -7.613960933881117e-02 +869 863 -1.132183869282777e-01 +869 864 -1.820810586422664e-01 +869 865 -3.301555353436750e-01 +869 866 -7.412185823610072e-01 +869 867 -3.165206906282846e+00 +869 868 -1.502055215859218e+01 +869 870 -1.502055215860531e+01 +869 871 -3.165206906282927e+00 +869 872 -7.412185823610338e-01 +869 873 -3.301555353436737e-01 +869 874 -1.820810586422683e-01 +869 875 -1.132183869282786e-01 +869 876 -7.613960933881254e-02 +869 877 -5.413421453123234e-02 +869 878 -4.012781031913035e-02 +869 879 -3.072751892616543e-02 +869 880 -2.415034675252896e-02 +869 881 -1.939104886145125e-02 +869 882 -1.585023865775537e-02 +869 883 -1.315380302376555e-02 +869 884 -1.105916272470032e-02 +869 885 -9.403863770832828e-03 +869 886 -8.076052134892578e-03 +869 887 -6.996835383339674e-03 +869 888 -6.109381318875747e-03 +869 889 -5.371977266379786e-03 +869 890 -4.753493624956895e-03 +869 891 -4.230349322908531e-03 +869 892 -3.784439171232937e-03 +869 893 -3.401691470521385e-03 +869 894 -3.071047067257393e-03 +869 895 -2.783725492315671e-03 +870 870 3.988394278128563e+01 +870 848 -4.230349322908531e-03 +870 849 -4.753493624956895e-03 +870 850 -5.371977266379788e-03 +870 851 -6.109381318875769e-03 +870 852 -6.996835383339674e-03 +870 853 -8.076052134892594e-03 +870 854 -9.403863770832842e-03 +870 855 -1.105916272470022e-02 +870 856 -1.315380302376542e-02 +870 857 -1.585023865775520e-02 +870 858 -1.939104886145118e-02 +870 859 -2.415034675252897e-02 +870 860 -3.072751892616529e-02 +870 861 -4.012781031912974e-02 +870 862 -5.413421453123138e-02 +870 863 -7.613960933881123e-02 +870 864 -1.132183869282756e-01 +870 865 -1.820810586422615e-01 +870 866 -3.301555353436688e-01 +870 867 -7.412185823610076e-01 +870 868 -3.165206906282849e+00 +870 869 -1.502055215860531e+01 +870 871 -1.502055215840053e+01 +870 872 -3.165206906282858e+00 +870 873 -7.412185823610202e-01 +870 874 -3.301555353436826e-01 +870 875 -1.820810586422692e-01 +870 876 -1.132183869282785e-01 +870 877 -7.613960933881209e-02 +870 878 -5.413421453123204e-02 +870 879 -4.012781031912976e-02 +870 880 -3.072751892616530e-02 +870 881 -2.415034675252906e-02 +870 882 -1.939104886145119e-02 +870 883 -1.585023865775532e-02 +870 884 -1.315380302376550e-02 +870 885 -1.105916272470022e-02 +870 886 -9.403863770832839e-03 +870 887 -8.076052134892594e-03 +870 888 -6.996835383339671e-03 +870 889 -6.109381318875727e-03 +870 890 -5.371977266379805e-03 +870 891 -4.753493624956895e-03 +870 892 -4.230349322908543e-03 +870 893 -3.784439171232917e-03 +870 894 -3.401691470521394e-03 +870 895 -3.071047067257392e-03 +871 871 3.988394278105613e+01 +871 848 -3.784439171232937e-03 +871 849 -4.230349322908543e-03 +871 850 -4.753493624956895e-03 +871 851 -5.371977266379837e-03 +871 852 -6.109381318875769e-03 +871 853 -6.996835383339702e-03 +871 854 -8.076052134892653e-03 +871 855 -9.403863770832828e-03 +871 856 -1.105916272470025e-02 +871 857 -1.315380302376546e-02 +871 858 -1.585023865775536e-02 +871 859 -1.939104886145118e-02 +871 860 -2.415034675252896e-02 +871 861 -3.072751892616542e-02 +871 862 -4.012781031912993e-02 +871 863 -5.413421453123171e-02 +871 864 -7.613960933881236e-02 +871 865 -1.132183869282760e-01 +871 866 -1.820810586422626e-01 +871 867 -3.301555353436760e-01 +871 868 -7.412185823610224e-01 +871 869 -3.165206906282927e+00 +871 870 -1.502055215840053e+01 +871 872 -1.502055215835480e+01 +871 873 -3.165206906282853e+00 +871 874 -7.412185823610151e-01 +871 875 -3.301555353436753e-01 +871 876 -1.820810586422663e-01 +871 877 -1.132183869282770e-01 +871 878 -7.613960933881186e-02 +871 879 -5.413421453123109e-02 +871 880 -4.012781031912954e-02 +871 881 -3.072751892616543e-02 +871 882 -2.415034675252897e-02 +871 883 -1.939104886145111e-02 +871 884 -1.585023865775526e-02 +871 885 -1.315380302376538e-02 +871 886 -1.105916272470025e-02 +871 887 -9.403863770832814e-03 +871 888 -8.076052134892564e-03 +871 889 -6.996835383339622e-03 +871 890 -6.109381318875730e-03 +871 891 -5.371977266379788e-03 +871 892 -4.753493624956895e-03 +871 893 -4.230349322908508e-03 +871 894 -3.784439171232917e-03 +871 895 -3.401691470521384e-03 +872 872 3.988394278102299e+01 +872 848 -3.401691470521385e-03 +872 849 -3.784439171232917e-03 +872 850 -4.230349322908508e-03 +872 851 -4.753493624956895e-03 +872 852 -5.371977266379790e-03 +872 853 -6.109381318875734e-03 +872 854 -6.996835383339677e-03 +872 855 -8.076052134892568e-03 +872 856 -9.403863770832814e-03 +872 857 -1.105916272470026e-02 +872 858 -1.315380302376555e-02 +872 859 -1.585023865775532e-02 +872 860 -1.939104886145111e-02 +872 861 -2.415034675252897e-02 +872 862 -3.072751892616544e-02 +872 863 -4.012781031912998e-02 +872 864 -5.413421453123234e-02 +872 865 -7.613960933881157e-02 +872 866 -1.132183869282745e-01 +872 867 -1.820810586422637e-01 +872 868 -3.301555353436686e-01 +872 869 -7.412185823610338e-01 +872 870 -3.165206906282858e+00 +872 871 -1.502055215835480e+01 +872 873 -1.502055215836228e+01 +872 874 -3.165206906282858e+00 +872 875 -7.412185823610171e-01 +872 876 -3.301555353436786e-01 +872 877 -1.820810586422683e-01 +872 878 -1.132183869282771e-01 +872 879 -7.613960933881099e-02 +872 880 -5.413421453123106e-02 +872 881 -4.012781031912993e-02 +872 882 -3.072751892616544e-02 +872 883 -2.415034675252897e-02 +872 884 -1.939104886145110e-02 +872 885 -1.585023865775514e-02 +872 886 -1.315380302376546e-02 +872 887 -1.105916272470025e-02 +872 888 -9.403863770832828e-03 +872 889 -8.076052134892594e-03 +872 890 -6.996835383339698e-03 +872 891 -6.109381318875769e-03 +872 892 -5.371977266379837e-03 +872 893 -4.753493624956895e-03 +872 894 -4.230349322908543e-03 +872 895 -3.784439171232936e-03 +873 873 3.988394278106472e+01 +873 848 -3.071047067257393e-03 +873 849 -3.401691470521394e-03 +873 850 -3.784439171232917e-03 +873 851 -4.230349322908543e-03 +873 852 -4.753493624956895e-03 +873 853 -5.371977266379808e-03 +873 854 -6.109381318875772e-03 +873 855 -6.996835383339674e-03 +873 856 -8.076052134892582e-03 +873 857 -9.403863770832816e-03 +873 858 -1.105916272470032e-02 +873 859 -1.315380302376550e-02 +873 860 -1.585023865775526e-02 +873 861 -1.939104886145110e-02 +873 862 -2.415034675252896e-02 +873 863 -3.072751892616545e-02 +873 864 -4.012781031913035e-02 +873 865 -5.413421453123172e-02 +873 866 -7.613960933881096e-02 +873 867 -1.132183869282743e-01 +873 868 -1.820810586422605e-01 +873 869 -3.301555353436737e-01 +873 870 -7.412185823610202e-01 +873 871 -3.165206906282853e+00 +873 872 -1.502055215836228e+01 +873 874 -1.502055215839532e+01 +873 875 -3.165206906282860e+00 +873 876 -7.412185823610238e-01 +873 877 -3.301555353436795e-01 +873 878 -1.820810586422670e-01 +873 879 -1.132183869282767e-01 +873 880 -7.613960933881085e-02 +873 881 -5.413421453123171e-02 +873 882 -4.012781031912998e-02 +873 883 -3.072751892616545e-02 +873 884 -2.415034675252897e-02 +873 885 -1.939104886145097e-02 +873 886 -1.585023865775526e-02 +873 887 -1.315380302376547e-02 +873 888 -1.105916272470026e-02 +873 889 -9.403863770832816e-03 +873 890 -8.076052134892570e-03 +873 891 -6.996835383339674e-03 +873 892 -6.109381318875769e-03 +873 893 -5.371977266379790e-03 +873 894 -4.753493624956895e-03 +873 895 -4.230349322908531e-03 +874 874 3.988394278115156e+01 +874 848 -2.783725492315671e-03 +874 849 -3.071047067257392e-03 +874 850 -3.401691470521384e-03 +874 851 -3.784439171232936e-03 +874 852 -4.230349322908531e-03 +874 853 -4.753493624956896e-03 +874 854 -5.371977266379821e-03 +874 855 -6.109381318875747e-03 +874 856 -6.996835383339671e-03 +874 857 -8.076052134892552e-03 +874 858 -9.403863770832827e-03 +874 859 -1.105916272470022e-02 +874 860 -1.315380302376538e-02 +874 861 -1.585023865775514e-02 +874 862 -1.939104886145096e-02 +874 863 -2.415034675252878e-02 +874 864 -3.072751892616544e-02 +874 865 -4.012781031912956e-02 +874 866 -5.413421453123109e-02 +874 867 -7.613960933881099e-02 +874 868 -1.132183869282767e-01 +874 869 -1.820810586422683e-01 +874 870 -3.301555353436826e-01 +874 871 -7.412185823610151e-01 +874 872 -3.165206906282858e+00 +874 873 -1.502055215839532e+01 +874 875 -1.502055215844915e+01 +874 876 -3.165206906282906e+00 +874 877 -7.412185823610304e-01 +874 878 -3.301555353436730e-01 +874 879 -1.820810586422620e-01 +874 880 -1.132183869282735e-01 +874 881 -7.613960933881182e-02 +874 882 -5.413421453123234e-02 +874 883 -4.012781031913037e-02 +874 884 -3.072751892616572e-02 +874 885 -2.415034675252897e-02 +874 886 -1.939104886145125e-02 +874 887 -1.585023865775537e-02 +874 888 -1.315380302376555e-02 +874 889 -1.105916272470032e-02 +874 890 -9.403863770832813e-03 +874 891 -8.076052134892594e-03 +874 892 -6.996835383339702e-03 +874 893 -6.109381318875734e-03 +874 894 -5.371977266379808e-03 +874 895 -4.753493624956896e-03 +875 875 3.988394278128116e+01 +875 848 -2.532689975072673e-03 +875 849 -2.783725492315665e-03 +875 850 -3.071047067257376e-03 +875 851 -3.401691470521392e-03 +875 852 -3.784439171232915e-03 +875 853 -4.230349322908520e-03 +875 854 -4.753493624956895e-03 +875 855 -5.371977266379786e-03 +875 856 -6.109381318875727e-03 +875 857 -6.996835383339622e-03 +875 858 -8.076052134892604e-03 +875 859 -9.403863770832825e-03 +875 860 -1.105916272470022e-02 +875 861 -1.315380302376542e-02 +875 862 -1.585023865775520e-02 +875 863 -1.939104886145103e-02 +875 864 -2.415034675252906e-02 +875 865 -3.072751892616529e-02 +875 866 -4.012781031912974e-02 +875 867 -5.413421453123138e-02 +875 868 -7.613960933881136e-02 +875 869 -1.132183869282786e-01 +875 870 -1.820810586422692e-01 +875 871 -3.301555353436753e-01 +875 872 -7.412185823610171e-01 +875 873 -3.165206906282860e+00 +875 874 -1.502055215844915e+01 +875 876 -1.502055215852571e+01 +875 877 -3.165206906282860e+00 +875 878 -7.412185823610191e-01 +875 879 -3.301555353436803e-01 +875 880 -1.820810586422619e-01 +875 881 -1.132183869282749e-01 +875 882 -7.613960933881193e-02 +875 883 -5.413421453123205e-02 +875 884 -4.012781031913017e-02 +875 885 -3.072751892616531e-02 +875 886 -2.415034675252906e-02 +875 887 -1.939104886145119e-02 +875 888 -1.585023865775532e-02 +875 889 -1.315380302376550e-02 +875 890 -1.105916272470022e-02 +875 891 -9.403863770832842e-03 +875 892 -8.076052134892653e-03 +875 893 -6.996835383339677e-03 +875 894 -6.109381318875772e-03 +875 895 -5.371977266379821e-03 +876 876 3.988394278146370e+01 +876 848 -2.312252367280536e-03 +876 849 -2.532689975072680e-03 +876 850 -2.783725492315666e-03 +876 851 -3.071047067257401e-03 +876 852 -3.401691470521394e-03 +876 853 -3.784439171232929e-03 +876 854 -4.230349322908545e-03 +876 855 -4.753493624956895e-03 +876 856 -5.371977266379805e-03 +876 857 -6.109381318875730e-03 +876 858 -6.996835383339698e-03 +876 859 -8.076052134892592e-03 +876 860 -9.403863770832811e-03 +876 861 -1.105916272470025e-02 +876 862 -1.315380302376546e-02 +876 863 -1.585023865775526e-02 +876 864 -1.939104886145125e-02 +876 865 -2.415034675252896e-02 +876 866 -3.072751892616542e-02 +876 867 -4.012781031912993e-02 +876 868 -5.413421453123171e-02 +876 869 -7.613960933881254e-02 +876 870 -1.132183869282785e-01 +876 871 -1.820810586422663e-01 +876 872 -3.301555353436786e-01 +876 873 -7.412185823610238e-01 +876 874 -3.165206906282906e+00 +876 875 -1.502055215852571e+01 +876 877 -1.502055215863299e+01 +876 878 -3.165206906282858e+00 +876 879 -7.412185823610361e-01 +876 880 -3.301555353436808e-01 +876 881 -1.820810586422639e-01 +876 882 -1.132183869282771e-01 +876 883 -7.613960933881168e-02 +876 884 -5.413421453123172e-02 +876 885 -4.012781031912956e-02 +876 886 -3.072751892616543e-02 +876 887 -2.415034675252897e-02 +876 888 -1.939104886145111e-02 +876 889 -1.585023865775526e-02 +876 890 -1.315380302376538e-02 +876 891 -1.105916272470022e-02 +876 892 -9.403863770832828e-03 +876 893 -8.076052134892568e-03 +876 894 -6.996835383339674e-03 +876 895 -6.109381318875747e-03 +877 877 3.988394278171950e+01 +877 848 -2.117777896667794e-03 +877 849 -2.312252367280536e-03 +877 850 -2.532689975072674e-03 +877 851 -2.783725492315679e-03 +877 852 -3.071047067257393e-03 +877 853 -3.401691470521395e-03 +877 854 -3.784439171232938e-03 +877 855 -4.230349322908531e-03 +877 856 -4.753493624956895e-03 +877 857 -5.371977266379788e-03 +877 858 -6.109381318875769e-03 +877 859 -6.996835383339674e-03 +877 860 -8.076052134892583e-03 +877 861 -9.403863770832832e-03 +877 862 -1.105916272470025e-02 +877 863 -1.315380302376547e-02 +877 864 -1.585023865775537e-02 +877 865 -1.939104886145111e-02 +877 866 -2.415034675252897e-02 +877 867 -3.072751892616544e-02 +877 868 -4.012781031912998e-02 +877 869 -5.413421453123234e-02 +877 870 -7.613960933881209e-02 +877 871 -1.132183869282770e-01 +877 872 -1.820810586422683e-01 +877 873 -3.301555353436795e-01 +877 874 -7.412185823610304e-01 +877 875 -3.165206906282860e+00 +877 876 -1.502055215863299e+01 +877 878 -1.502055215878373e+01 +877 879 -3.165206906282862e+00 +877 880 -7.412185823610185e-01 +877 881 -3.301555353436749e-01 +877 882 -1.820810586422670e-01 +877 883 -1.132183869282768e-01 +877 884 -7.613960933881145e-02 +877 885 -5.413421453123109e-02 +877 886 -4.012781031912993e-02 +877 887 -3.072751892616544e-02 +877 888 -2.415034675252897e-02 +877 889 -1.939104886145110e-02 +877 890 -1.585023865775514e-02 +877 891 -1.315380302376542e-02 +877 892 -1.105916272470025e-02 +877 893 -9.403863770832814e-03 +877 894 -8.076052134892582e-03 +877 895 -6.996835383339671e-03 +878 878 3.988394278208164e+01 +878 848 -1.945462087124857e-03 +878 849 -2.117777896667799e-03 +878 850 -2.312252367280536e-03 +878 851 -2.532689975072691e-03 +878 852 -2.783725492315679e-03 +878 853 -3.071047067257401e-03 +878 854 -3.401691470521412e-03 +878 855 -3.784439171232937e-03 +878 856 -4.230349322908543e-03 +878 857 -4.753493624956895e-03 +878 858 -5.371977266379837e-03 +878 859 -6.109381318875769e-03 +878 860 -6.996835383339702e-03 +878 861 -8.076052134892642e-03 +878 862 -9.403863770832828e-03 +878 863 -1.105916272470026e-02 +878 864 -1.315380302376555e-02 +878 865 -1.585023865775526e-02 +878 866 -1.939104886145110e-02 +878 867 -2.415034675252896e-02 +878 868 -3.072751892616545e-02 +878 869 -4.012781031913035e-02 +878 870 -5.413421453123204e-02 +878 871 -7.613960933881186e-02 +878 872 -1.132183869282771e-01 +878 873 -1.820810586422670e-01 +878 874 -3.301555353436730e-01 +878 875 -7.412185823610191e-01 +878 876 -3.165206906282858e+00 +878 877 -1.502055215878373e+01 +878 879 -1.502055215899859e+01 +878 880 -3.165206906282863e+00 +878 881 -7.412185823610196e-01 +878 882 -3.301555353436738e-01 +878 883 -1.820810586422664e-01 +878 884 -1.132183869282774e-01 +878 885 -7.613960933881120e-02 +878 886 -5.413421453123171e-02 +878 887 -4.012781031912998e-02 +878 888 -3.072751892616545e-02 +878 889 -2.415034675252897e-02 +878 890 -1.939104886145097e-02 +878 891 -1.585023865775520e-02 +878 892 -1.315380302376546e-02 +878 893 -1.105916272470026e-02 +878 894 -9.403863770832816e-03 +878 895 -8.076052134892552e-03 +879 879 3.988394278260302e+01 +879 848 -1.792160480940035e-03 +879 849 -1.945462087124849e-03 +879 850 -2.117777896667785e-03 +879 851 -2.312252367280536e-03 +879 852 -2.532689975072674e-03 +879 853 -2.783725492315667e-03 +879 854 -3.071047067257394e-03 +879 855 -3.401691470521385e-03 +879 856 -3.784439171232917e-03 +879 857 -4.230349322908508e-03 +879 858 -4.753493624956895e-03 +879 859 -5.371977266379790e-03 +879 860 -6.109381318875734e-03 +879 861 -6.996835383339677e-03 +879 862 -8.076052134892556e-03 +879 863 -9.403863770832771e-03 +879 864 -1.105916272470025e-02 +879 865 -1.315380302376538e-02 +879 866 -1.585023865775514e-02 +879 867 -1.939104886145095e-02 +879 868 -2.415034675252877e-02 +879 869 -3.072751892616543e-02 +879 870 -4.012781031912976e-02 +879 871 -5.413421453123109e-02 +879 872 -7.613960933881099e-02 +879 873 -1.132183869282767e-01 +879 874 -1.820810586422620e-01 +879 875 -3.301555353436803e-01 +879 876 -7.412185823610361e-01 +879 877 -3.165206906282862e+00 +879 878 -1.502055215899859e+01 +879 880 -1.502055215931062e+01 +879 881 -3.165206906282882e+00 +879 882 -7.412185823610211e-01 +879 883 -3.301555353436729e-01 +879 884 -1.820810586422663e-01 +879 885 -1.132183869282776e-01 +879 886 -7.613960933881259e-02 +879 887 -5.413421453123238e-02 +879 888 -4.012781031913039e-02 +879 889 -3.072751892616573e-02 +879 890 -2.415034675252898e-02 +879 891 -1.939104886145118e-02 +879 892 -1.585023865775537e-02 +879 893 -1.315380302376555e-02 +879 894 -1.105916272470032e-02 +879 895 -9.403863770832830e-03 +880 880 3.988394278260303e+01 +880 864 -9.403863770832811e-03 +880 865 -1.105916272470018e-02 +880 866 -1.315380302376537e-02 +880 867 -1.585023865775514e-02 +880 868 -1.939104886145096e-02 +880 869 -2.415034675252896e-02 +880 870 -3.072751892616530e-02 +880 871 -4.012781031912954e-02 +880 872 -5.413421453123106e-02 +880 873 -7.613960933881085e-02 +880 874 -1.132183869282735e-01 +880 875 -1.820810586422619e-01 +880 876 -3.301555353436808e-01 +880 877 -7.412185823610185e-01 +880 878 -3.165206906282863e+00 +880 879 -1.502055215931062e+01 +880 881 -1.502055215899864e+01 +880 882 -3.165206906282863e+00 +880 883 -7.412185823610213e-01 +880 884 -3.301555353436761e-01 +880 885 -1.820810586422683e-01 +880 886 -1.132183869282783e-01 +880 887 -7.613960933881241e-02 +880 888 -5.413421453123236e-02 +880 889 -4.012781031913037e-02 +880 890 -3.072751892616545e-02 +880 891 -2.415034675252906e-02 +880 892 -1.939104886145125e-02 +880 893 -1.585023865775537e-02 +880 894 -1.315380302376555e-02 +880 895 -1.105916272470025e-02 +880 896 -9.403863770832839e-03 +880 897 -8.076052134892592e-03 +880 898 -6.996835383339674e-03 +880 899 -6.109381318875769e-03 +880 900 -5.371977266379790e-03 +880 901 -4.753493624956895e-03 +880 902 -4.230349322908531e-03 +880 903 -3.784439171232939e-03 +880 904 -3.401691470521395e-03 +880 905 -3.071047067257393e-03 +880 906 -2.783725492315679e-03 +880 907 -2.532689975072674e-03 +880 908 -2.312252367280536e-03 +880 909 -2.117777896667794e-03 +880 910 -1.945462087124857e-03 +880 911 -1.792160480940039e-03 +881 881 3.988394278208167e+01 +881 864 -8.076052134892575e-03 +881 865 -9.403863770832827e-03 +881 866 -1.105916272470025e-02 +881 867 -1.315380302376546e-02 +881 868 -1.585023865775526e-02 +881 869 -1.939104886145125e-02 +881 870 -2.415034675252906e-02 +881 871 -3.072751892616543e-02 +881 872 -4.012781031912993e-02 +881 873 -5.413421453123171e-02 +881 874 -7.613960933881182e-02 +881 875 -1.132183869282749e-01 +881 876 -1.820810586422639e-01 +881 877 -3.301555353436749e-01 +881 878 -7.412185823610196e-01 +881 879 -3.165206906282882e+00 +881 880 -1.502055215899864e+01 +881 882 -1.502055215878365e+01 +881 883 -3.165206906282885e+00 +881 884 -7.412185823610228e-01 +881 885 -3.301555353436831e-01 +881 886 -1.820810586422663e-01 +881 887 -1.132183869282755e-01 +881 888 -7.613960933881157e-02 +881 889 -5.413421453123172e-02 +881 890 -4.012781031912956e-02 +881 891 -3.072751892616529e-02 +881 892 -2.415034675252896e-02 +881 893 -1.939104886145111e-02 +881 894 -1.585023865775526e-02 +881 895 -1.315380302376538e-02 +881 896 -1.105916272470022e-02 +881 897 -9.403863770832811e-03 +881 898 -8.076052134892583e-03 +881 899 -6.996835383339702e-03 +881 900 -6.109381318875734e-03 +881 901 -5.371977266379808e-03 +881 902 -4.753493624956898e-03 +881 903 -4.230349322908547e-03 +881 904 -3.784439171232931e-03 +881 905 -3.401691470521395e-03 +881 906 -3.071047067257401e-03 +881 907 -2.783725492315667e-03 +881 908 -2.532689975072680e-03 +881 909 -2.312252367280537e-03 +881 910 -2.117777896667799e-03 +881 911 -1.945462087124854e-03 +882 882 3.988394278171953e+01 +882 864 -6.996835383339622e-03 +882 865 -8.076052134892594e-03 +882 866 -9.403863770832814e-03 +882 867 -1.105916272470025e-02 +882 868 -1.315380302376547e-02 +882 869 -1.585023865775537e-02 +882 870 -1.939104886145119e-02 +882 871 -2.415034675252897e-02 +882 872 -3.072751892616544e-02 +882 873 -4.012781031912998e-02 +882 874 -5.413421453123234e-02 +882 875 -7.613960933881193e-02 +882 876 -1.132183869282771e-01 +882 877 -1.820810586422670e-01 +882 878 -3.301555353436738e-01 +882 879 -7.412185823610211e-01 +882 880 -3.165206906282863e+00 +882 881 -1.502055215878365e+01 +882 883 -1.502055215863310e+01 +882 884 -3.165206906282857e+00 +882 885 -7.412185823610337e-01 +882 886 -3.301555353436806e-01 +882 887 -1.820810586422615e-01 +882 888 -1.132183869282745e-01 +882 889 -7.613960933881117e-02 +882 890 -5.413421453123109e-02 +882 891 -4.012781031912974e-02 +882 892 -3.072751892616542e-02 +882 893 -2.415034675252897e-02 +882 894 -1.939104886145110e-02 +882 895 -1.585023865775514e-02 +882 896 -1.315380302376542e-02 +882 897 -1.105916272470025e-02 +882 898 -9.403863770832832e-03 +882 899 -8.076052134892642e-03 +882 900 -6.996835383339677e-03 +882 901 -6.109381318875772e-03 +882 902 -5.371977266379824e-03 +882 903 -4.753493624956926e-03 +882 904 -4.230349322908547e-03 +882 905 -3.784439171232938e-03 +882 906 -3.401691470521412e-03 +882 907 -3.071047067257394e-03 +882 908 -2.783725492315679e-03 +882 909 -2.532689975072686e-03 +882 910 -2.312252367280547e-03 +882 911 -2.117777896667799e-03 +883 883 3.988394278146366e+01 +883 864 -6.109381318875730e-03 +883 865 -6.996835383339698e-03 +883 866 -8.076052134892582e-03 +883 867 -9.403863770832814e-03 +883 868 -1.105916272470026e-02 +883 869 -1.315380302376555e-02 +883 870 -1.585023865775532e-02 +883 871 -1.939104886145111e-02 +883 872 -2.415034675252897e-02 +883 873 -3.072751892616545e-02 +883 874 -4.012781031913037e-02 +883 875 -5.413421453123205e-02 +883 876 -7.613960933881168e-02 +883 877 -1.132183869282768e-01 +883 878 -1.820810586422664e-01 +883 879 -3.301555353436729e-01 +883 880 -7.412185823610213e-01 +883 881 -3.165206906282885e+00 +883 882 -1.502055215863310e+01 +883 884 -1.502055215852558e+01 +883 885 -3.165206906282869e+00 +883 886 -7.412185823610296e-01 +883 887 -3.301555353436734e-01 +883 888 -1.820810586422631e-01 +883 889 -1.132183869282759e-01 +883 890 -7.613960933881099e-02 +883 891 -5.413421453123138e-02 +883 892 -4.012781031912993e-02 +883 893 -3.072751892616544e-02 +883 894 -2.415034675252896e-02 +883 895 -1.939104886145096e-02 +883 896 -1.585023865775520e-02 +883 897 -1.315380302376546e-02 +883 898 -1.105916272470025e-02 +883 899 -9.403863770832828e-03 +883 900 -8.076052134892556e-03 +883 901 -6.996835383339674e-03 +883 902 -6.109381318875750e-03 +883 903 -5.371977266379823e-03 +883 904 -4.753493624956898e-03 +883 905 -4.230349322908531e-03 +883 906 -3.784439171232937e-03 +883 907 -3.401691470521385e-03 +883 908 -3.071047067257393e-03 +883 909 -2.783725492315672e-03 +883 910 -2.532689975072686e-03 +883 911 -2.312252367280537e-03 +884 884 3.988394278128116e+01 +884 864 -5.371977266379788e-03 +884 865 -6.109381318875769e-03 +884 866 -6.996835383339674e-03 +884 867 -8.076052134892583e-03 +884 868 -9.403863770832833e-03 +884 869 -1.105916272470032e-02 +884 870 -1.315380302376550e-02 +884 871 -1.585023865775526e-02 +884 872 -1.939104886145110e-02 +884 873 -2.415034675252897e-02 +884 874 -3.072751892616572e-02 +884 875 -4.012781031913017e-02 +884 876 -5.413421453123172e-02 +884 877 -7.613960933881145e-02 +884 878 -1.132183869282774e-01 +884 879 -1.820810586422663e-01 +884 880 -3.301555353436761e-01 +884 881 -7.412185823610228e-01 +884 882 -3.165206906282857e+00 +884 883 -1.502055215852558e+01 +884 885 -1.502055215844921e+01 +884 886 -3.165206906282912e+00 +884 887 -7.412185823610394e-01 +884 888 -3.301555353436723e-01 +884 889 -1.820810586422646e-01 +884 890 -1.132183869282758e-01 +884 891 -7.613960933881136e-02 +884 892 -5.413421453123171e-02 +884 893 -4.012781031912998e-02 +884 894 -3.072751892616545e-02 +884 895 -2.415034675252878e-02 +884 896 -1.939104886145103e-02 +884 897 -1.585023865775526e-02 +884 898 -1.315380302376547e-02 +884 899 -1.105916272470026e-02 +884 900 -9.403863770832771e-03 +884 901 -8.076052134892570e-03 +884 902 -6.996835383339674e-03 +884 903 -6.109381318875771e-03 +884 904 -5.371977266379809e-03 +884 905 -4.753493624956895e-03 +884 906 -4.230349322908543e-03 +884 907 -3.784439171232917e-03 +884 908 -3.401691470521394e-03 +884 909 -3.071047067257393e-03 +884 910 -2.783725492315679e-03 +884 911 -2.532689975072680e-03 +885 885 3.988394278115157e+01 +885 864 -4.753493624956895e-03 +885 865 -5.371977266379837e-03 +885 866 -6.109381318875769e-03 +885 867 -6.996835383339702e-03 +885 868 -8.076052134892632e-03 +885 869 -9.403863770832828e-03 +885 870 -1.105916272470022e-02 +885 871 -1.315380302376538e-02 +885 872 -1.585023865775514e-02 +885 873 -1.939104886145097e-02 +885 874 -2.415034675252897e-02 +885 875 -3.072751892616531e-02 +885 876 -4.012781031912956e-02 +885 877 -5.413421453123109e-02 +885 878 -7.613960933881120e-02 +885 879 -1.132183869282776e-01 +885 880 -1.820810586422683e-01 +885 881 -3.301555353436831e-01 +885 882 -7.412185823610337e-01 +885 883 -3.165206906282869e+00 +885 884 -1.502055215844921e+01 +885 886 -1.502055215839529e+01 +885 887 -3.165206906282875e+00 +885 888 -7.412185823610178e-01 +885 889 -3.301555353436725e-01 +885 890 -1.820810586422644e-01 +885 891 -1.132183869282774e-01 +885 892 -7.613960933881216e-02 +885 893 -5.413421453123234e-02 +885 894 -4.012781031913035e-02 +885 895 -3.072751892616544e-02 +885 896 -2.415034675252906e-02 +885 897 -1.939104886145125e-02 +885 898 -1.585023865775537e-02 +885 899 -1.315380302376555e-02 +885 900 -1.105916272470025e-02 +885 901 -9.403863770832811e-03 +885 902 -8.076052134892578e-03 +885 903 -6.996835383339677e-03 +885 904 -6.109381318875733e-03 +885 905 -5.371977266379788e-03 +885 906 -4.753493624956895e-03 +885 907 -4.230349322908508e-03 +885 908 -3.784439171232917e-03 +885 909 -3.401691470521385e-03 +885 910 -3.071047067257394e-03 +885 911 -2.783725492315667e-03 +886 886 3.988394278106475e+01 +886 864 -4.230349322908508e-03 +886 865 -4.753493624956895e-03 +886 866 -5.371977266379790e-03 +886 867 -6.109381318875734e-03 +886 868 -6.996835383339677e-03 +886 869 -8.076052134892578e-03 +886 870 -9.403863770832839e-03 +886 871 -1.105916272470025e-02 +886 872 -1.315380302376546e-02 +886 873 -1.585023865775526e-02 +886 874 -1.939104886145125e-02 +886 875 -2.415034675252906e-02 +886 876 -3.072751892616543e-02 +886 877 -4.012781031912993e-02 +886 878 -5.413421453123171e-02 +886 879 -7.613960933881259e-02 +886 880 -1.132183869282783e-01 +886 881 -1.820810586422663e-01 +886 882 -3.301555353436806e-01 +886 883 -7.412185823610296e-01 +886 884 -3.165206906282912e+00 +886 885 -1.502055215839529e+01 +886 887 -1.502055215836228e+01 +886 888 -3.165206906282875e+00 +886 889 -7.412185823610049e-01 +886 890 -3.301555353436751e-01 +886 891 -1.820810586422685e-01 +886 892 -1.132183869282775e-01 +886 893 -7.613960933881168e-02 +886 894 -5.413421453123172e-02 +886 895 -4.012781031912956e-02 +886 896 -3.072751892616529e-02 +886 897 -2.415034675252896e-02 +886 898 -1.939104886145111e-02 +886 899 -1.585023865775526e-02 +886 900 -1.315380302376538e-02 +886 901 -1.105916272470018e-02 +886 902 -9.403863770832828e-03 +886 903 -8.076052134892642e-03 +886 904 -6.996835383339702e-03 +886 905 -6.109381318875769e-03 +886 906 -5.371977266379837e-03 +886 907 -4.753493624956895e-03 +886 908 -4.230349322908543e-03 +886 909 -3.784439171232937e-03 +886 910 -3.401691470521412e-03 +886 911 -3.071047067257401e-03 +887 887 3.988394278102302e+01 +887 864 -3.784439171232917e-03 +887 865 -4.230349322908543e-03 +887 866 -4.753493624956895e-03 +887 867 -5.371977266379808e-03 +887 868 -6.109381318875772e-03 +887 869 -6.996835383339674e-03 +887 870 -8.076052134892594e-03 +887 871 -9.403863770832814e-03 +887 872 -1.105916272470025e-02 +887 873 -1.315380302376547e-02 +887 874 -1.585023865775537e-02 +887 875 -1.939104886145119e-02 +887 876 -2.415034675252897e-02 +887 877 -3.072751892616544e-02 +887 878 -4.012781031912998e-02 +887 879 -5.413421453123238e-02 +887 880 -7.613960933881241e-02 +887 881 -1.132183869282755e-01 +887 882 -1.820810586422615e-01 +887 883 -3.301555353436734e-01 +887 884 -7.412185823610394e-01 +887 885 -3.165206906282875e+00 +887 886 -1.502055215836228e+01 +887 888 -1.502055215835484e+01 +887 889 -3.165206906282800e+00 +887 890 -7.412185823610249e-01 +887 891 -3.301555353436889e-01 +887 892 -1.820810586422693e-01 +887 893 -1.132183869282769e-01 +887 894 -7.613960933881182e-02 +887 895 -5.413421453123109e-02 +887 896 -4.012781031912974e-02 +887 897 -3.072751892616542e-02 +887 898 -2.415034675252897e-02 +887 899 -1.939104886145110e-02 +887 900 -1.585023865775514e-02 +887 901 -1.315380302376537e-02 +887 902 -1.105916272470025e-02 +887 903 -9.403863770832832e-03 +887 904 -8.076052134892583e-03 +887 905 -6.996835383339674e-03 +887 906 -6.109381318875769e-03 +887 907 -5.371977266379790e-03 +887 908 -4.753493624956895e-03 +887 909 -4.230349322908531e-03 +887 910 -3.784439171232939e-03 +887 911 -3.401691470521395e-03 +888 888 3.988394278105598e+01 +888 864 -3.401691470521384e-03 +888 865 -3.784439171232936e-03 +888 866 -4.230349322908531e-03 +888 867 -4.753493624956896e-03 +888 868 -5.371977266379821e-03 +888 869 -6.109381318875747e-03 +888 870 -6.996835383339671e-03 +888 871 -8.076052134892564e-03 +888 872 -9.403863770832828e-03 +888 873 -1.105916272470026e-02 +888 874 -1.315380302376555e-02 +888 875 -1.585023865775532e-02 +888 876 -1.939104886145111e-02 +888 877 -2.415034675252897e-02 +888 878 -3.072751892616545e-02 +888 879 -4.012781031913039e-02 +888 880 -5.413421453123236e-02 +888 881 -7.613960933881157e-02 +888 882 -1.132183869282745e-01 +888 883 -1.820810586422631e-01 +888 884 -3.301555353436723e-01 +888 885 -7.412185823610178e-01 +888 886 -3.165206906282875e+00 +888 887 -1.502055215835484e+01 +888 889 -1.502055215840037e+01 +888 890 -3.165206906282858e+00 +888 891 -7.412185823610385e-01 +888 892 -3.301555353436831e-01 +888 893 -1.820810586422652e-01 +888 894 -1.132183869282770e-01 +888 895 -7.613960933881100e-02 +888 896 -5.413421453123138e-02 +888 897 -4.012781031912993e-02 +888 898 -3.072751892616544e-02 +888 899 -2.415034675252896e-02 +888 900 -1.939104886145095e-02 +888 901 -1.585023865775514e-02 +888 902 -1.315380302376546e-02 +888 903 -1.105916272470025e-02 +888 904 -9.403863770832814e-03 +888 905 -8.076052134892583e-03 +888 906 -6.996835383339702e-03 +888 907 -6.109381318875734e-03 +888 908 -5.371977266379808e-03 +888 909 -4.753493624956898e-03 +888 910 -4.230349322908547e-03 +888 911 -3.784439171232931e-03 +889 889 3.988394278128555e+01 +889 864 -3.071047067257376e-03 +889 865 -3.401691470521392e-03 +889 866 -3.784439171232915e-03 +889 867 -4.230349322908520e-03 +889 868 -4.753493624956895e-03 +889 869 -5.371977266379786e-03 +889 870 -6.109381318875727e-03 +889 871 -6.996835383339622e-03 +889 872 -8.076052134892594e-03 +889 873 -9.403863770832816e-03 +889 874 -1.105916272470032e-02 +889 875 -1.315380302376550e-02 +889 876 -1.585023865775526e-02 +889 877 -1.939104886145110e-02 +889 878 -2.415034675252897e-02 +889 879 -3.072751892616573e-02 +889 880 -4.012781031913037e-02 +889 881 -5.413421453123172e-02 +889 882 -7.613960933881117e-02 +889 883 -1.132183869282759e-01 +889 884 -1.820810586422646e-01 +889 885 -3.301555353436725e-01 +889 886 -7.412185823610049e-01 +889 887 -3.165206906282800e+00 +889 888 -1.502055215840037e+01 +889 890 -1.502055215860539e+01 +889 891 -3.165206906282882e+00 +889 892 -7.412185823610445e-01 +889 893 -3.301555353436744e-01 +889 894 -1.820810586422644e-01 +889 895 -1.132183869282758e-01 +889 896 -7.613960933881087e-02 +889 897 -5.413421453123171e-02 +889 898 -4.012781031912998e-02 +889 899 -3.072751892616545e-02 +889 900 -2.415034675252877e-02 +889 901 -1.939104886145096e-02 +889 902 -1.585023865775526e-02 +889 903 -1.315380302376547e-02 +889 904 -1.105916272470026e-02 +889 905 -9.403863770832833e-03 +889 906 -8.076052134892632e-03 +889 907 -6.996835383339677e-03 +889 908 -6.109381318875772e-03 +889 909 -5.371977266379824e-03 +889 910 -4.753493624956926e-03 +889 911 -4.230349322908547e-03 +890 890 3.988394278152490e+01 +890 864 -2.783725492315666e-03 +890 865 -3.071047067257401e-03 +890 866 -3.401691470521394e-03 +890 867 -3.784439171232929e-03 +890 868 -4.230349322908545e-03 +890 869 -4.753493624956895e-03 +890 870 -5.371977266379805e-03 +890 871 -6.109381318875730e-03 +890 872 -6.996835383339698e-03 +890 873 -8.076052134892570e-03 +890 874 -9.403863770832813e-03 +890 875 -1.105916272470022e-02 +890 876 -1.315380302376538e-02 +890 877 -1.585023865775514e-02 +890 878 -1.939104886145097e-02 +890 879 -2.415034675252898e-02 +890 880 -3.072751892616545e-02 +890 881 -4.012781031912956e-02 +890 882 -5.413421453123109e-02 +890 883 -7.613960933881099e-02 +890 884 -1.132183869282758e-01 +890 885 -1.820810586422644e-01 +890 886 -3.301555353436751e-01 +890 887 -7.412185823610249e-01 +890 888 -3.165206906282858e+00 +890 889 -1.502055215860539e+01 +890 891 -1.502055215859209e+01 +890 892 -3.165206906282899e+00 +890 893 -7.412185823610211e-01 +890 894 -3.301555353436668e-01 +890 895 -1.820810586422623e-01 +890 896 -1.132183869282744e-01 +890 897 -7.613960933881182e-02 +890 898 -5.413421453123234e-02 +890 899 -4.012781031913035e-02 +890 900 -3.072751892616543e-02 +890 901 -2.415034675252896e-02 +890 902 -1.939104886145125e-02 +890 903 -1.585023865775537e-02 +890 904 -1.315380302376555e-02 +890 905 -1.105916272470032e-02 +890 906 -9.403863770832828e-03 +890 907 -8.076052134892578e-03 +890 908 -6.996835383339674e-03 +890 909 -6.109381318875750e-03 +890 910 -5.371977266379823e-03 +890 911 -4.753493624956898e-03 +891 891 3.988394278151357e+01 +891 864 -2.532689975072674e-03 +891 865 -2.783725492315679e-03 +891 866 -3.071047067257393e-03 +891 867 -3.401691470521395e-03 +891 868 -3.784439171232938e-03 +891 869 -4.230349322908531e-03 +891 870 -4.753493624956895e-03 +891 871 -5.371977266379788e-03 +891 872 -6.109381318875769e-03 +891 873 -6.996835383339674e-03 +891 874 -8.076052134892594e-03 +891 875 -9.403863770832842e-03 +891 876 -1.105916272470022e-02 +891 877 -1.315380302376542e-02 +891 878 -1.585023865775520e-02 +891 879 -1.939104886145118e-02 +891 880 -2.415034675252906e-02 +891 881 -3.072751892616529e-02 +891 882 -4.012781031912974e-02 +891 883 -5.413421453123138e-02 +891 884 -7.613960933881136e-02 +891 885 -1.132183869282774e-01 +891 886 -1.820810586422685e-01 +891 887 -3.301555353436889e-01 +891 888 -7.412185823610385e-01 +891 889 -3.165206906282882e+00 +891 890 -1.502055215859209e+01 +891 892 -1.502055215859666e+01 +891 893 -3.165206906282860e+00 +891 894 -7.412185823609891e-01 +891 895 -3.301555353436656e-01 +891 896 -1.820810586422600e-01 +891 897 -1.132183869282742e-01 +891 898 -7.613960933881156e-02 +891 899 -5.413421453123204e-02 +891 900 -4.012781031912976e-02 +891 901 -3.072751892616530e-02 +891 902 -2.415034675252906e-02 +891 903 -1.939104886145119e-02 +891 904 -1.585023865775532e-02 +891 905 -1.315380302376550e-02 +891 906 -1.105916272470022e-02 +891 907 -9.403863770832825e-03 +891 908 -8.076052134892592e-03 +891 909 -6.996835383339674e-03 +891 910 -6.109381318875771e-03 +891 911 -5.371977266379809e-03 +892 892 3.988394278151437e+01 +892 864 -2.312252367280536e-03 +892 865 -2.532689975072691e-03 +892 866 -2.783725492315679e-03 +892 867 -3.071047067257401e-03 +892 868 -3.401691470521412e-03 +892 869 -3.784439171232937e-03 +892 870 -4.230349322908543e-03 +892 871 -4.753493624956895e-03 +892 872 -5.371977266379837e-03 +892 873 -6.109381318875769e-03 +892 874 -6.996835383339702e-03 +892 875 -8.076052134892653e-03 +892 876 -9.403863770832828e-03 +892 877 -1.105916272470025e-02 +892 878 -1.315380302376546e-02 +892 879 -1.585023865775537e-02 +892 880 -1.939104886145125e-02 +892 881 -2.415034675252896e-02 +892 882 -3.072751892616542e-02 +892 883 -4.012781031912993e-02 +892 884 -5.413421453123171e-02 +892 885 -7.613960933881216e-02 +892 886 -1.132183869282775e-01 +892 887 -1.820810586422693e-01 +892 888 -3.301555353436831e-01 +892 889 -7.412185823610445e-01 +892 890 -3.165206906282899e+00 +892 891 -1.502055215859666e+01 +892 893 -1.502055215858787e+01 +892 894 -3.165206906282813e+00 +892 895 -7.412185823610036e-01 +892 896 -3.301555353436728e-01 +892 897 -1.820810586422631e-01 +892 898 -1.132183869282755e-01 +892 899 -7.613960933881171e-02 +892 900 -5.413421453123109e-02 +892 901 -4.012781031912954e-02 +892 902 -3.072751892616543e-02 +892 903 -2.415034675252897e-02 +892 904 -1.939104886145111e-02 +892 905 -1.585023865775526e-02 +892 906 -1.315380302376538e-02 +892 907 -1.105916272470022e-02 +892 908 -9.403863770832811e-03 +892 909 -8.076052134892568e-03 +892 910 -6.996835383339677e-03 +892 911 -6.109381318875733e-03 +893 893 3.988394278153925e+01 +893 864 -2.117777896667785e-03 +893 865 -2.312252367280536e-03 +893 866 -2.532689975072674e-03 +893 867 -2.783725492315667e-03 +893 868 -3.071047067257394e-03 +893 869 -3.401691470521385e-03 +893 870 -3.784439171232917e-03 +893 871 -4.230349322908508e-03 +893 872 -4.753493624956895e-03 +893 873 -5.371977266379790e-03 +893 874 -6.109381318875734e-03 +893 875 -6.996835383339677e-03 +893 876 -8.076052134892568e-03 +893 877 -9.403863770832814e-03 +893 878 -1.105916272470026e-02 +893 879 -1.315380302376555e-02 +893 880 -1.585023865775537e-02 +893 881 -1.939104886145111e-02 +893 882 -2.415034675252897e-02 +893 883 -3.072751892616544e-02 +893 884 -4.012781031912998e-02 +893 885 -5.413421453123234e-02 +893 886 -7.613960933881168e-02 +893 887 -1.132183869282769e-01 +893 888 -1.820810586422652e-01 +893 889 -3.301555353436744e-01 +893 890 -7.412185823610211e-01 +893 891 -3.165206906282860e+00 +893 892 -1.502055215858787e+01 +893 894 -1.502055215864008e+01 +893 895 -3.165206906282891e+00 +893 896 -7.412185823610372e-01 +893 897 -3.301555353436810e-01 +893 898 -1.820810586422660e-01 +893 899 -1.132183869282780e-01 +893 900 -7.613960933881112e-02 +893 901 -5.413421453123106e-02 +893 902 -4.012781031912993e-02 +893 903 -3.072751892616544e-02 +893 904 -2.415034675252897e-02 +893 905 -1.939104886145110e-02 +893 906 -1.585023865775514e-02 +893 907 -1.315380302376542e-02 +893 908 -1.105916272470025e-02 +893 909 -9.403863770832830e-03 +893 910 -8.076052134892642e-03 +893 911 -6.996835383339702e-03 +894 894 3.988394278164014e+01 +894 864 -1.945462087124849e-03 +894 865 -2.117777896667799e-03 +894 866 -2.312252367280536e-03 +894 867 -2.532689975072680e-03 +894 868 -2.783725492315679e-03 +894 869 -3.071047067257393e-03 +894 870 -3.401691470521394e-03 +894 871 -3.784439171232917e-03 +894 872 -4.230349322908543e-03 +894 873 -4.753493624956895e-03 +894 874 -5.371977266379808e-03 +894 875 -6.109381318875772e-03 +894 876 -6.996835383339674e-03 +894 877 -8.076052134892582e-03 +894 878 -9.403863770832816e-03 +894 879 -1.105916272470032e-02 +894 880 -1.315380302376555e-02 +894 881 -1.585023865775526e-02 +894 882 -1.939104886145110e-02 +894 883 -2.415034675252896e-02 +894 884 -3.072751892616545e-02 +894 885 -4.012781031913035e-02 +894 886 -5.413421453123172e-02 +894 887 -7.613960933881182e-02 +894 888 -1.132183869282770e-01 +894 889 -1.820810586422644e-01 +894 890 -3.301555353436668e-01 +894 891 -7.412185823609891e-01 +894 892 -3.165206906282813e+00 +894 893 -1.502055215864008e+01 +894 895 -1.502055215865999e+01 +894 896 -3.165206906282873e+00 +894 897 -7.412185823610399e-01 +894 898 -3.301555353436829e-01 +894 899 -1.820810586422685e-01 +894 900 -1.132183869282773e-01 +894 901 -7.613960933881114e-02 +894 902 -5.413421453123171e-02 +894 903 -4.012781031912998e-02 +894 904 -3.072751892616545e-02 +894 905 -2.415034675252897e-02 +894 906 -1.939104886145097e-02 +894 907 -1.585023865775520e-02 +894 908 -1.315380302376546e-02 +894 909 -1.105916272470026e-02 +894 910 -9.403863770832833e-03 +894 911 -8.076052134892573e-03 +895 895 3.988394278169704e+01 +895 864 -1.792160480940034e-03 +895 865 -1.945462087124857e-03 +895 866 -2.117777896667793e-03 +895 867 -2.312252367280536e-03 +895 868 -2.532689975072685e-03 +895 869 -2.783725492315671e-03 +895 870 -3.071047067257392e-03 +895 871 -3.401691470521384e-03 +895 872 -3.784439171232936e-03 +895 873 -4.230349322908531e-03 +895 874 -4.753493624956896e-03 +895 875 -5.371977266379821e-03 +895 876 -6.109381318875747e-03 +895 877 -6.996835383339671e-03 +895 878 -8.076052134892552e-03 +895 879 -9.403863770832830e-03 +895 880 -1.105916272470025e-02 +895 881 -1.315380302376538e-02 +895 882 -1.585023865775514e-02 +895 883 -1.939104886145096e-02 +895 884 -2.415034675252878e-02 +895 885 -3.072751892616544e-02 +895 886 -4.012781031912956e-02 +895 887 -5.413421453123109e-02 +895 888 -7.613960933881100e-02 +895 889 -1.132183869282758e-01 +895 890 -1.820810586422623e-01 +895 891 -3.301555353436656e-01 +895 892 -7.412185823610036e-01 +895 893 -3.165206906282891e+00 +895 894 -1.502055215865999e+01 +895 896 -1.502055215931068e+01 +895 897 -3.165206906282894e+00 +895 898 -7.412185823610287e-01 +895 899 -3.301555353436765e-01 +895 900 -1.820810586422667e-01 +895 901 -1.132183869282775e-01 +895 902 -7.613960933881254e-02 +895 903 -5.413421453123234e-02 +895 904 -4.012781031913037e-02 +895 905 -3.072751892616572e-02 +895 906 -2.415034675252897e-02 +895 907 -1.939104886145118e-02 +895 908 -1.585023865775536e-02 +895 909 -1.315380302376555e-02 +895 910 -1.105916272470032e-02 +895 911 -9.403863770832813e-03 +896 896 3.988394278169703e+01 +896 880 -9.403863770832839e-03 +896 881 -1.105916272470022e-02 +896 882 -1.315380302376542e-02 +896 883 -1.585023865775520e-02 +896 884 -1.939104886145103e-02 +896 885 -2.415034675252906e-02 +896 886 -3.072751892616529e-02 +896 887 -4.012781031912974e-02 +896 888 -5.413421453123138e-02 +896 889 -7.613960933881087e-02 +896 890 -1.132183869282744e-01 +896 891 -1.820810586422600e-01 +896 892 -3.301555353436728e-01 +896 893 -7.412185823610372e-01 +896 894 -3.165206906282873e+00 +896 895 -1.502055215931068e+01 +896 897 -1.502055215866002e+01 +896 898 -3.165206906282861e+00 +896 899 -7.412185823610016e-01 +896 900 -3.301555353436779e-01 +896 901 -1.820810586422690e-01 +896 902 -1.132183869282781e-01 +896 903 -7.613960933881195e-02 +896 904 -5.413421453123205e-02 +896 905 -4.012781031913017e-02 +896 906 -3.072751892616531e-02 +896 907 -2.415034675252897e-02 +896 908 -1.939104886145118e-02 +896 909 -1.585023865775532e-02 +896 910 -1.315380302376550e-02 +896 911 -1.105916272470022e-02 +896 912 -9.403863770832842e-03 +896 913 -8.076052134892653e-03 +896 914 -6.996835383339677e-03 +896 915 -6.109381318875772e-03 +896 916 -5.371977266379824e-03 +896 917 -4.753493624956926e-03 +896 918 -4.230349322908547e-03 +896 919 -3.784439171232938e-03 +896 920 -3.401691470521412e-03 +896 921 -3.071047067257394e-03 +896 922 -2.783725492315679e-03 +896 923 -2.532689975072686e-03 +896 924 -2.312252367280547e-03 +896 925 -2.117777896667799e-03 +896 926 -1.945462087124858e-03 +896 927 -1.792160480940046e-03 +897 897 3.988394278164019e+01 +897 880 -8.076052134892592e-03 +897 881 -9.403863770832811e-03 +897 882 -1.105916272470025e-02 +897 883 -1.315380302376546e-02 +897 884 -1.585023865775526e-02 +897 885 -1.939104886145125e-02 +897 886 -2.415034675252896e-02 +897 887 -3.072751892616542e-02 +897 888 -4.012781031912993e-02 +897 889 -5.413421453123171e-02 +897 890 -7.613960933881182e-02 +897 891 -1.132183869282742e-01 +897 892 -1.820810586422631e-01 +897 893 -3.301555353436810e-01 +897 894 -7.412185823610399e-01 +897 895 -3.165206906282894e+00 +897 896 -1.502055215866002e+01 +897 898 -1.502055215864000e+01 +897 899 -3.165206906282832e+00 +897 900 -7.412185823610230e-01 +897 901 -3.301555353436796e-01 +897 902 -1.820810586422671e-01 +897 903 -1.132183869282760e-01 +897 904 -7.613960933881171e-02 +897 905 -5.413421453123172e-02 +897 906 -4.012781031912956e-02 +897 907 -3.072751892616529e-02 +897 908 -2.415034675252896e-02 +897 909 -1.939104886145111e-02 +897 910 -1.585023865775526e-02 +897 911 -1.315380302376538e-02 +897 912 -1.105916272470022e-02 +897 913 -9.403863770832828e-03 +897 914 -8.076052134892568e-03 +897 915 -6.996835383339674e-03 +897 916 -6.109381318875750e-03 +897 917 -5.371977266379823e-03 +897 918 -4.753493624956898e-03 +897 919 -4.230349322908531e-03 +897 920 -3.784439171232937e-03 +897 921 -3.401691470521385e-03 +897 922 -3.071047067257393e-03 +897 923 -2.783725492315672e-03 +897 924 -2.532689975072686e-03 +897 925 -2.312252367280537e-03 +897 926 -2.117777896667794e-03 +897 927 -1.945462087124857e-03 +898 898 3.988394278153931e+01 +898 880 -6.996835383339674e-03 +898 881 -8.076052134892583e-03 +898 882 -9.403863770832832e-03 +898 883 -1.105916272470025e-02 +898 884 -1.315380302376547e-02 +898 885 -1.585023865775537e-02 +898 886 -1.939104886145111e-02 +898 887 -2.415034675252897e-02 +898 888 -3.072751892616544e-02 +898 889 -4.012781031912998e-02 +898 890 -5.413421453123234e-02 +898 891 -7.613960933881156e-02 +898 892 -1.132183869282755e-01 +898 893 -1.820810586422660e-01 +898 894 -3.301555353436829e-01 +898 895 -7.412185823610287e-01 +898 896 -3.165206906282861e+00 +898 897 -1.502055215864000e+01 +898 899 -1.502055215858798e+01 +898 900 -3.165206906282905e+00 +898 901 -7.412185823610247e-01 +898 902 -3.301555353436747e-01 +898 903 -1.820810586422628e-01 +898 904 -1.132183869282760e-01 +898 905 -7.613960933881153e-02 +898 906 -5.413421453123109e-02 +898 907 -4.012781031912974e-02 +898 908 -3.072751892616542e-02 +898 909 -2.415034675252897e-02 +898 910 -1.939104886145110e-02 +898 911 -1.585023865775514e-02 +898 912 -1.315380302376542e-02 +898 913 -1.105916272470025e-02 +898 914 -9.403863770832814e-03 +898 915 -8.076052134892582e-03 +898 916 -6.996835383339674e-03 +898 917 -6.109381318875771e-03 +898 918 -5.371977266379809e-03 +898 919 -4.753493624956895e-03 +898 920 -4.230349322908543e-03 +898 921 -3.784439171232917e-03 +898 922 -3.401691470521394e-03 +898 923 -3.071047067257393e-03 +898 924 -2.783725492315679e-03 +898 925 -2.532689975072680e-03 +898 926 -2.312252367280536e-03 +898 927 -2.117777896667799e-03 +899 899 3.988394278151443e+01 +899 880 -6.109381318875769e-03 +899 881 -6.996835383339702e-03 +899 882 -8.076052134892642e-03 +899 883 -9.403863770832828e-03 +899 884 -1.105916272470026e-02 +899 885 -1.315380302376555e-02 +899 886 -1.585023865775526e-02 +899 887 -1.939104886145110e-02 +899 888 -2.415034675252896e-02 +899 889 -3.072751892616545e-02 +899 890 -4.012781031913035e-02 +899 891 -5.413421453123204e-02 +899 892 -7.613960933881171e-02 +899 893 -1.132183869282780e-01 +899 894 -1.820810586422685e-01 +899 895 -3.301555353436765e-01 +899 896 -7.412185823610016e-01 +899 897 -3.165206906282832e+00 +899 898 -1.502055215858798e+01 +899 900 -1.502055215859660e+01 +899 901 -3.165206906282879e+00 +899 902 -7.412185823610407e-01 +899 903 -3.301555353436780e-01 +899 904 -1.820810586422630e-01 +899 905 -1.132183869282744e-01 +899 906 -7.613960933881031e-02 +899 907 -5.413421453123141e-02 +899 908 -4.012781031912996e-02 +899 909 -3.072751892616545e-02 +899 910 -2.415034675252897e-02 +899 911 -1.939104886145097e-02 +899 912 -1.585023865775520e-02 +899 913 -1.315380302376546e-02 +899 914 -1.105916272470026e-02 +899 915 -9.403863770832816e-03 +899 916 -8.076052134892557e-03 +899 917 -6.996835383339677e-03 +899 918 -6.109381318875733e-03 +899 919 -5.371977266379788e-03 +899 920 -4.753493624956895e-03 +899 921 -4.230349322908508e-03 +899 922 -3.784439171232917e-03 +899 923 -3.401691470521385e-03 +899 924 -3.071047067257394e-03 +899 925 -2.783725492315667e-03 +899 926 -2.532689975072674e-03 +899 927 -2.312252367280536e-03 +900 900 3.988394278151362e+01 +900 880 -5.371977266379790e-03 +900 881 -6.109381318875734e-03 +900 882 -6.996835383339677e-03 +900 883 -8.076052134892556e-03 +900 884 -9.403863770832771e-03 +900 885 -1.105916272470025e-02 +900 886 -1.315380302376538e-02 +900 887 -1.585023865775514e-02 +900 888 -1.939104886145095e-02 +900 889 -2.415034675252877e-02 +900 890 -3.072751892616543e-02 +900 891 -4.012781031912976e-02 +900 892 -5.413421453123109e-02 +900 893 -7.613960933881112e-02 +900 894 -1.132183869282773e-01 +900 895 -1.820810586422667e-01 +900 896 -3.301555353436779e-01 +900 897 -7.412185823610230e-01 +900 898 -3.165206906282905e+00 +900 899 -1.502055215859660e+01 +900 901 -1.502055215859212e+01 +900 902 -3.165206906282888e+00 +900 903 -7.412185823610248e-01 +900 904 -3.301555353436794e-01 +900 905 -1.820810586422635e-01 +900 906 -1.132183869282749e-01 +900 907 -7.613960933881191e-02 +900 908 -5.413421453123234e-02 +900 909 -4.012781031913039e-02 +900 910 -3.072751892616573e-02 +900 911 -2.415034675252898e-02 +900 912 -1.939104886145118e-02 +900 913 -1.585023865775537e-02 +900 914 -1.315380302376555e-02 +900 915 -1.105916272470032e-02 +900 916 -9.403863770832832e-03 +900 917 -8.076052134892655e-03 +900 918 -6.996835383339702e-03 +900 919 -6.109381318875769e-03 +900 920 -5.371977266379837e-03 +900 921 -4.753493624956895e-03 +900 922 -4.230349322908543e-03 +900 923 -3.784439171232937e-03 +900 924 -3.401691470521412e-03 +900 925 -3.071047067257401e-03 +900 926 -2.783725492315679e-03 +900 927 -2.532689975072691e-03 +901 901 3.988394278152495e+01 +901 880 -4.753493624956895e-03 +901 881 -5.371977266379808e-03 +901 882 -6.109381318875772e-03 +901 883 -6.996835383339674e-03 +901 884 -8.076052134892570e-03 +901 885 -9.403863770832811e-03 +901 886 -1.105916272470018e-02 +901 887 -1.315380302376537e-02 +901 888 -1.585023865775514e-02 +901 889 -1.939104886145096e-02 +901 890 -2.415034675252896e-02 +901 891 -3.072751892616530e-02 +901 892 -4.012781031912954e-02 +901 893 -5.413421453123106e-02 +901 894 -7.613960933881114e-02 +901 895 -1.132183869282775e-01 +901 896 -1.820810586422690e-01 +901 897 -3.301555353436796e-01 +901 898 -7.412185823610247e-01 +901 899 -3.165206906282879e+00 +901 900 -1.502055215859212e+01 +901 902 -1.502055215860540e+01 +901 903 -3.165206906282855e+00 +901 904 -7.412185823610242e-01 +901 905 -3.301555353436739e-01 +901 906 -1.820810586422630e-01 +901 907 -1.132183869282764e-01 +901 908 -7.613960933881254e-02 +901 909 -5.413421453123236e-02 +901 910 -4.012781031913037e-02 +901 911 -3.072751892616545e-02 +901 912 -2.415034675252906e-02 +901 913 -1.939104886145125e-02 +901 914 -1.585023865775537e-02 +901 915 -1.315380302376555e-02 +901 916 -1.105916272470025e-02 +901 917 -9.403863770832856e-03 +901 918 -8.076052134892594e-03 +901 919 -6.996835383339674e-03 +901 920 -6.109381318875769e-03 +901 921 -5.371977266379790e-03 +901 922 -4.753493624956895e-03 +901 923 -4.230349322908531e-03 +901 924 -3.784439171232939e-03 +901 925 -3.401691470521395e-03 +901 926 -3.071047067257393e-03 +901 927 -2.783725492315679e-03 +902 902 3.988394278128565e+01 +902 880 -4.230349322908531e-03 +902 881 -4.753493624956898e-03 +902 882 -5.371977266379824e-03 +902 883 -6.109381318875750e-03 +902 884 -6.996835383339674e-03 +902 885 -8.076052134892578e-03 +902 886 -9.403863770832828e-03 +902 887 -1.105916272470025e-02 +902 888 -1.315380302376546e-02 +902 889 -1.585023865775526e-02 +902 890 -1.939104886145125e-02 +902 891 -2.415034675252906e-02 +902 892 -3.072751892616543e-02 +902 893 -4.012781031912993e-02 +902 894 -5.413421453123171e-02 +902 895 -7.613960933881254e-02 +902 896 -1.132183869282781e-01 +902 897 -1.820810586422671e-01 +902 898 -3.301555353436747e-01 +902 899 -7.412185823610407e-01 +902 900 -3.165206906282888e+00 +902 901 -1.502055215860540e+01 +902 903 -1.502055215840034e+01 +902 904 -3.165206906282869e+00 +902 905 -7.412185823610226e-01 +902 906 -3.301555353436756e-01 +902 907 -1.820810586422674e-01 +902 908 -1.132183869282786e-01 +902 909 -7.613960933881189e-02 +902 910 -5.413421453123172e-02 +902 911 -4.012781031912956e-02 +902 912 -3.072751892616529e-02 +902 913 -2.415034675252896e-02 +902 914 -1.939104886145111e-02 +902 915 -1.585023865775526e-02 +902 916 -1.315380302376538e-02 +902 917 -1.105916272470022e-02 +902 918 -9.403863770832811e-03 +902 919 -8.076052134892582e-03 +902 920 -6.996835383339698e-03 +902 921 -6.109381318875730e-03 +902 922 -5.371977266379805e-03 +902 923 -4.753493624956895e-03 +902 924 -4.230349322908545e-03 +902 925 -3.784439171232929e-03 +902 926 -3.401691470521394e-03 +902 927 -3.071047067257401e-03 +903 903 3.988394278105612e+01 +903 880 -3.784439171232939e-03 +903 881 -4.230349322908547e-03 +903 882 -4.753493624956926e-03 +903 883 -5.371977266379823e-03 +903 884 -6.109381318875771e-03 +903 885 -6.996835383339677e-03 +903 886 -8.076052134892642e-03 +903 887 -9.403863770832832e-03 +903 888 -1.105916272470025e-02 +903 889 -1.315380302376547e-02 +903 890 -1.585023865775537e-02 +903 891 -1.939104886145119e-02 +903 892 -2.415034675252897e-02 +903 893 -3.072751892616544e-02 +903 894 -4.012781031912998e-02 +903 895 -5.413421453123234e-02 +903 896 -7.613960933881195e-02 +903 897 -1.132183869282760e-01 +903 898 -1.820810586422628e-01 +903 899 -3.301555353436780e-01 +903 900 -7.412185823610248e-01 +903 901 -3.165206906282855e+00 +903 902 -1.502055215840034e+01 +903 904 -1.502055215835498e+01 +903 905 -3.165206906282906e+00 +903 906 -7.412185823610186e-01 +903 907 -3.301555353436749e-01 +903 908 -1.820810586422688e-01 +903 909 -1.132183869282785e-01 +903 910 -7.613960933881182e-02 +903 911 -5.413421453123109e-02 +903 912 -4.012781031912974e-02 +903 913 -3.072751892616542e-02 +903 914 -2.415034675252897e-02 +903 915 -1.939104886145110e-02 +903 916 -1.585023865775514e-02 +903 917 -1.315380302376542e-02 +903 918 -1.105916272470025e-02 +903 919 -9.403863770832814e-03 +903 920 -8.076052134892594e-03 +903 921 -6.996835383339623e-03 +903 922 -6.109381318875727e-03 +903 923 -5.371977266379786e-03 +903 924 -4.753493624956895e-03 +903 925 -4.230349322908520e-03 +903 926 -3.784439171232916e-03 +903 927 -3.401691470521392e-03 +904 904 3.988394278102307e+01 +904 880 -3.401691470521395e-03 +904 881 -3.784439171232931e-03 +904 882 -4.230349322908547e-03 +904 883 -4.753493624956898e-03 +904 884 -5.371977266379809e-03 +904 885 -6.109381318875733e-03 +904 886 -6.996835383339702e-03 +904 887 -8.076052134892583e-03 +904 888 -9.403863770832814e-03 +904 889 -1.105916272470026e-02 +904 890 -1.315380302376555e-02 +904 891 -1.585023865775532e-02 +904 892 -1.939104886145111e-02 +904 893 -2.415034675252897e-02 +904 894 -3.072751892616545e-02 +904 895 -4.012781031913037e-02 +904 896 -5.413421453123205e-02 +904 897 -7.613960933881171e-02 +904 898 -1.132183869282760e-01 +904 899 -1.820810586422630e-01 +904 900 -3.301555353436794e-01 +904 901 -7.412185823610242e-01 +904 902 -3.165206906282869e+00 +904 903 -1.502055215835498e+01 +904 905 -1.502055215836219e+01 +904 906 -3.165206906282841e+00 +904 907 -7.412185823610069e-01 +904 908 -3.301555353436753e-01 +904 909 -1.820810586422668e-01 +904 910 -1.132183869282761e-01 +904 911 -7.613960933881099e-02 +904 912 -5.413421453123138e-02 +904 913 -4.012781031912993e-02 +904 914 -3.072751892616544e-02 +904 915 -2.415034675252896e-02 +904 916 -1.939104886145096e-02 +904 917 -1.585023865775520e-02 +904 918 -1.315380302376546e-02 +904 919 -1.105916272470025e-02 +904 920 -9.403863770832828e-03 +904 921 -8.076052134892564e-03 +904 922 -6.996835383339671e-03 +904 923 -6.109381318875748e-03 +904 924 -5.371977266379821e-03 +904 925 -4.753493624956896e-03 +904 926 -4.230349322908531e-03 +904 927 -3.784439171232936e-03 +905 905 3.988394278106475e+01 +905 880 -3.071047067257393e-03 +905 881 -3.401691470521395e-03 +905 882 -3.784439171232938e-03 +905 883 -4.230349322908531e-03 +905 884 -4.753493624956895e-03 +905 885 -5.371977266379788e-03 +905 886 -6.109381318875769e-03 +905 887 -6.996835383339674e-03 +905 888 -8.076052134892583e-03 +905 889 -9.403863770832833e-03 +905 890 -1.105916272470032e-02 +905 891 -1.315380302376550e-02 +905 892 -1.585023865775526e-02 +905 893 -1.939104886145110e-02 +905 894 -2.415034675252897e-02 +905 895 -3.072751892616572e-02 +905 896 -4.012781031913017e-02 +905 897 -5.413421453123172e-02 +905 898 -7.613960933881153e-02 +905 899 -1.132183869282744e-01 +905 900 -1.820810586422635e-01 +905 901 -3.301555353436739e-01 +905 902 -7.412185823610226e-01 +905 903 -3.165206906282906e+00 +905 904 -1.502055215836219e+01 +905 906 -1.502055215839541e+01 +905 907 -3.165206906282847e+00 +905 908 -7.412185823610189e-01 +905 909 -3.301555353436813e-01 +905 910 -1.820810586422636e-01 +905 911 -1.132183869282762e-01 +905 912 -7.613960933881123e-02 +905 913 -5.413421453123171e-02 +905 914 -4.012781031912998e-02 +905 915 -3.072751892616545e-02 +905 916 -2.415034675252878e-02 +905 917 -1.939104886145103e-02 +905 918 -1.585023865775526e-02 +905 919 -1.315380302376547e-02 +905 920 -1.105916272470026e-02 +905 921 -9.403863770832816e-03 +905 922 -8.076052134892570e-03 +905 923 -6.996835383339674e-03 +905 924 -6.109381318875771e-03 +905 925 -5.371977266379809e-03 +905 926 -4.753493624956895e-03 +905 927 -4.230349322908543e-03 +906 906 3.988394278115147e+01 +906 880 -2.783725492315679e-03 +906 881 -3.071047067257401e-03 +906 882 -3.401691470521412e-03 +906 883 -3.784439171232937e-03 +906 884 -4.230349322908543e-03 +906 885 -4.753493624956895e-03 +906 886 -5.371977266379837e-03 +906 887 -6.109381318875769e-03 +906 888 -6.996835383339702e-03 +906 889 -8.076052134892632e-03 +906 890 -9.403863770832828e-03 +906 891 -1.105916272470022e-02 +906 892 -1.315380302376538e-02 +906 893 -1.585023865775514e-02 +906 894 -1.939104886145097e-02 +906 895 -2.415034675252897e-02 +906 896 -3.072751892616531e-02 +906 897 -4.012781031912956e-02 +906 898 -5.413421453123109e-02 +906 899 -7.613960933881031e-02 +906 900 -1.132183869282749e-01 +906 901 -1.820810586422630e-01 +906 902 -3.301555353436756e-01 +906 903 -7.412185823610186e-01 +906 904 -3.165206906282841e+00 +906 905 -1.502055215839541e+01 +906 907 -1.502055215844905e+01 +906 908 -3.165206906282859e+00 +906 909 -7.412185823610254e-01 +906 910 -3.301555353436740e-01 +906 911 -1.820810586422655e-01 +906 912 -1.132183869282771e-01 +906 913 -7.613960933881224e-02 +906 914 -5.413421453123234e-02 +906 915 -4.012781031913035e-02 +906 916 -3.072751892616544e-02 +906 917 -2.415034675252906e-02 +906 918 -1.939104886145125e-02 +906 919 -1.585023865775537e-02 +906 920 -1.315380302376555e-02 +906 921 -1.105916272470032e-02 +906 922 -9.403863770832813e-03 +906 923 -8.076052134892578e-03 +906 924 -6.996835383339677e-03 +906 925 -6.109381318875733e-03 +906 926 -5.371977266379788e-03 +906 927 -4.753493624956895e-03 +907 907 3.988394278128113e+01 +907 880 -2.532689975072674e-03 +907 881 -2.783725492315667e-03 +907 882 -3.071047067257394e-03 +907 883 -3.401691470521385e-03 +907 884 -3.784439171232917e-03 +907 885 -4.230349322908508e-03 +907 886 -4.753493624956895e-03 +907 887 -5.371977266379790e-03 +907 888 -6.109381318875734e-03 +907 889 -6.996835383339677e-03 +907 890 -8.076052134892578e-03 +907 891 -9.403863770832825e-03 +907 892 -1.105916272470022e-02 +907 893 -1.315380302376542e-02 +907 894 -1.585023865775520e-02 +907 895 -1.939104886145118e-02 +907 896 -2.415034675252897e-02 +907 897 -3.072751892616529e-02 +907 898 -4.012781031912974e-02 +907 899 -5.413421453123141e-02 +907 900 -7.613960933881191e-02 +907 901 -1.132183869282764e-01 +907 902 -1.820810586422674e-01 +907 903 -3.301555353436749e-01 +907 904 -7.412185823610069e-01 +907 905 -3.165206906282847e+00 +907 906 -1.502055215844905e+01 +907 908 -1.502055215852576e+01 +907 909 -3.165206906282898e+00 +907 910 -7.412185823610368e-01 +907 911 -3.301555353436721e-01 +907 912 -1.820810586422638e-01 +907 913 -1.132183869282738e-01 +907 914 -7.613960933881139e-02 +907 915 -5.413421453123204e-02 +907 916 -4.012781031912978e-02 +907 917 -3.072751892616544e-02 +907 918 -2.415034675252906e-02 +907 919 -1.939104886145119e-02 +907 920 -1.585023865775532e-02 +907 921 -1.315380302376550e-02 +907 922 -1.105916272470022e-02 +907 923 -9.403863770832854e-03 +907 924 -8.076052134892655e-03 +907 925 -6.996835383339702e-03 +907 926 -6.109381318875769e-03 +907 927 -5.371977266379837e-03 +908 908 3.988394278146369e+01 +908 880 -2.312252367280536e-03 +908 881 -2.532689975072680e-03 +908 882 -2.783725492315679e-03 +908 883 -3.071047067257393e-03 +908 884 -3.401691470521394e-03 +908 885 -3.784439171232917e-03 +908 886 -4.230349322908543e-03 +908 887 -4.753493624956895e-03 +908 888 -5.371977266379808e-03 +908 889 -6.109381318875772e-03 +908 890 -6.996835383339674e-03 +908 891 -8.076052134892592e-03 +908 892 -9.403863770832811e-03 +908 893 -1.105916272470025e-02 +908 894 -1.315380302376546e-02 +908 895 -1.585023865775536e-02 +908 896 -1.939104886145118e-02 +908 897 -2.415034675252896e-02 +908 898 -3.072751892616542e-02 +908 899 -4.012781031912996e-02 +908 900 -5.413421453123234e-02 +908 901 -7.613960933881254e-02 +908 902 -1.132183869282786e-01 +908 903 -1.820810586422688e-01 +908 904 -3.301555353436753e-01 +908 905 -7.412185823610189e-01 +908 906 -3.165206906282859e+00 +908 907 -1.502055215852576e+01 +908 909 -1.502055215863298e+01 +908 910 -3.165206906282879e+00 +908 911 -7.412185823610062e-01 +908 912 -3.301555353436758e-01 +908 913 -1.820810586422623e-01 +908 914 -1.132183869282749e-01 +908 915 -7.613960933881170e-02 +908 916 -5.413421453123111e-02 +908 917 -4.012781031912974e-02 +908 918 -3.072751892616543e-02 +908 919 -2.415034675252897e-02 +908 920 -1.939104886145111e-02 +908 921 -1.585023865775526e-02 +908 922 -1.315380302376538e-02 +908 923 -1.105916272470025e-02 +908 924 -9.403863770832833e-03 +908 925 -8.076052134892583e-03 +908 926 -6.996835383339674e-03 +908 927 -6.109381318875769e-03 +909 909 3.988394278171953e+01 +909 880 -2.117777896667794e-03 +909 881 -2.312252367280537e-03 +909 882 -2.532689975072686e-03 +909 883 -2.783725492315672e-03 +909 884 -3.071047067257393e-03 +909 885 -3.401691470521385e-03 +909 886 -3.784439171232937e-03 +909 887 -4.230349322908531e-03 +909 888 -4.753493624956898e-03 +909 889 -5.371977266379824e-03 +909 890 -6.109381318875750e-03 +909 891 -6.996835383339674e-03 +909 892 -8.076052134892568e-03 +909 893 -9.403863770832830e-03 +909 894 -1.105916272470026e-02 +909 895 -1.315380302376555e-02 +909 896 -1.585023865775532e-02 +909 897 -1.939104886145111e-02 +909 898 -2.415034675252897e-02 +909 899 -3.072751892616545e-02 +909 900 -4.012781031913039e-02 +909 901 -5.413421453123236e-02 +909 902 -7.613960933881189e-02 +909 903 -1.132183869282785e-01 +909 904 -1.820810586422668e-01 +909 905 -3.301555353436813e-01 +909 906 -7.412185823610254e-01 +909 907 -3.165206906282898e+00 +909 908 -1.502055215863298e+01 +909 910 -1.502055215878375e+01 +909 911 -3.165206906282828e+00 +909 912 -7.412185823610190e-01 +909 913 -3.301555353436779e-01 +909 914 -1.820810586422639e-01 +909 915 -1.132183869282771e-01 +909 916 -7.613960933881095e-02 +909 917 -5.413421453123138e-02 +909 918 -4.012781031912993e-02 +909 919 -3.072751892616544e-02 +909 920 -2.415034675252897e-02 +909 921 -1.939104886145110e-02 +909 922 -1.585023865775514e-02 +909 923 -1.315380302376546e-02 +909 924 -1.105916272470025e-02 +909 925 -9.403863770832814e-03 +909 926 -8.076052134892582e-03 +909 927 -6.996835383339698e-03 +910 910 3.988394278208162e+01 +910 880 -1.945462087124857e-03 +910 881 -2.117777896667799e-03 +910 882 -2.312252367280547e-03 +910 883 -2.532689975072686e-03 +910 884 -2.783725492315679e-03 +910 885 -3.071047067257394e-03 +910 886 -3.401691470521412e-03 +910 887 -3.784439171232939e-03 +910 888 -4.230349322908547e-03 +910 889 -4.753493624956926e-03 +910 890 -5.371977266379823e-03 +910 891 -6.109381318875771e-03 +910 892 -6.996835383339677e-03 +910 893 -8.076052134892642e-03 +910 894 -9.403863770832833e-03 +910 895 -1.105916272470032e-02 +910 896 -1.315380302376550e-02 +910 897 -1.585023865775526e-02 +910 898 -1.939104886145110e-02 +910 899 -2.415034675252897e-02 +910 900 -3.072751892616573e-02 +910 901 -4.012781031913037e-02 +910 902 -5.413421453123172e-02 +910 903 -7.613960933881182e-02 +910 904 -1.132183869282761e-01 +910 905 -1.820810586422636e-01 +910 906 -3.301555353436740e-01 +910 907 -7.412185823610368e-01 +910 908 -3.165206906282879e+00 +910 909 -1.502055215878375e+01 +910 911 -1.502055215899848e+01 +910 912 -3.165206906282872e+00 +910 913 -7.412185823610276e-01 +910 914 -3.301555353436809e-01 +910 915 -1.820810586422698e-01 +910 916 -1.132183869282782e-01 +910 917 -7.613960933881136e-02 +910 918 -5.413421453123171e-02 +910 919 -4.012781031912998e-02 +910 920 -3.072751892616545e-02 +910 921 -2.415034675252897e-02 +910 922 -1.939104886145097e-02 +910 923 -1.585023865775526e-02 +910 924 -1.315380302376547e-02 +910 925 -1.105916272470026e-02 +910 926 -9.403863770832816e-03 +910 927 -8.076052134892583e-03 +911 911 3.988394278260300e+01 +911 880 -1.792160480940039e-03 +911 881 -1.945462087124854e-03 +911 882 -2.117777896667799e-03 +911 883 -2.312252367280537e-03 +911 884 -2.532689975072680e-03 +911 885 -2.783725492315667e-03 +911 886 -3.071047067257401e-03 +911 887 -3.401691470521395e-03 +911 888 -3.784439171232931e-03 +911 889 -4.230349322908547e-03 +911 890 -4.753493624956898e-03 +911 891 -5.371977266379809e-03 +911 892 -6.109381318875733e-03 +911 893 -6.996835383339702e-03 +911 894 -8.076052134892573e-03 +911 895 -9.403863770832813e-03 +911 896 -1.105916272470022e-02 +911 897 -1.315380302376538e-02 +911 898 -1.585023865775514e-02 +911 899 -1.939104886145097e-02 +911 900 -2.415034675252898e-02 +911 901 -3.072751892616545e-02 +911 902 -4.012781031912956e-02 +911 903 -5.413421453123109e-02 +911 904 -7.613960933881099e-02 +911 905 -1.132183869282762e-01 +911 906 -1.820810586422655e-01 +911 907 -3.301555353436721e-01 +911 908 -7.412185823610062e-01 +911 909 -3.165206906282828e+00 +911 910 -1.502055215899848e+01 +911 912 -1.502055215931076e+01 +911 913 -3.165206906282866e+00 +911 914 -7.412185823610342e-01 +911 915 -3.301555353436825e-01 +911 916 -1.820810586422673e-01 +911 917 -1.132183869282769e-01 +911 918 -7.613960933881253e-02 +911 919 -5.413421453123234e-02 +911 920 -4.012781031913037e-02 +911 921 -3.072751892616572e-02 +911 922 -2.415034675252897e-02 +911 923 -1.939104886145125e-02 +911 924 -1.585023865775537e-02 +911 925 -1.315380302376555e-02 +911 926 -1.105916272470032e-02 +911 927 -9.403863770832827e-03 +912 912 3.988394278260303e+01 +912 896 -9.403863770832842e-03 +912 897 -1.105916272470022e-02 +912 898 -1.315380302376542e-02 +912 899 -1.585023865775520e-02 +912 900 -1.939104886145118e-02 +912 901 -2.415034675252906e-02 +912 902 -3.072751892616529e-02 +912 903 -4.012781031912974e-02 +912 904 -5.413421453123138e-02 +912 905 -7.613960933881123e-02 +912 906 -1.132183869282771e-01 +912 907 -1.820810586422638e-01 +912 908 -3.301555353436758e-01 +912 909 -7.412185823610190e-01 +912 910 -3.165206906282872e+00 +912 911 -1.502055215931076e+01 +912 913 -1.502055215899845e+01 +912 914 -3.165206906282892e+00 +912 915 -7.412185823610308e-01 +912 916 -3.301555353436753e-01 +912 917 -1.820810586422650e-01 +912 918 -1.132183869282771e-01 +912 919 -7.613960933881195e-02 +912 920 -5.413421453123205e-02 +912 921 -4.012781031913017e-02 +912 922 -3.072751892616531e-02 +912 923 -2.415034675252906e-02 +912 924 -1.939104886145119e-02 +912 925 -1.585023865775532e-02 +912 926 -1.315380302376550e-02 +912 927 -1.105916272470022e-02 +912 928 -9.403863770832839e-03 +912 929 -8.076052134892594e-03 +912 930 -6.996835383339674e-03 +912 931 -6.109381318875771e-03 +912 932 -5.371977266379809e-03 +912 933 -4.753493624956895e-03 +912 934 -4.230349322908543e-03 +912 935 -3.784439171232917e-03 +912 936 -3.401691470521394e-03 +912 937 -3.071047067257393e-03 +912 938 -2.783725492315679e-03 +912 939 -2.532689975072680e-03 +912 940 -2.312252367280536e-03 +912 941 -2.117777896667799e-03 +912 942 -1.945462087124849e-03 +912 943 -1.792160480940038e-03 +913 913 3.988394278208169e+01 +913 896 -8.076052134892653e-03 +913 897 -9.403863770832828e-03 +913 898 -1.105916272470025e-02 +913 899 -1.315380302376546e-02 +913 900 -1.585023865775537e-02 +913 901 -1.939104886145125e-02 +913 902 -2.415034675252896e-02 +913 903 -3.072751892616542e-02 +913 904 -4.012781031912993e-02 +913 905 -5.413421453123171e-02 +913 906 -7.613960933881224e-02 +913 907 -1.132183869282738e-01 +913 908 -1.820810586422623e-01 +913 909 -3.301555353436779e-01 +913 910 -7.412185823610276e-01 +913 911 -3.165206906282866e+00 +913 912 -1.502055215899845e+01 +913 914 -1.502055215878390e+01 +913 915 -3.165206906282880e+00 +913 916 -7.412185823610112e-01 +913 917 -3.301555353436731e-01 +913 918 -1.820810586422674e-01 +913 919 -1.132183869282775e-01 +913 920 -7.613960933881173e-02 +913 921 -5.413421453123172e-02 +913 922 -4.012781031912956e-02 +913 923 -3.072751892616543e-02 +913 924 -2.415034675252897e-02 +913 925 -1.939104886145111e-02 +913 926 -1.585023865775526e-02 +913 927 -1.315380302376538e-02 +913 928 -1.105916272470025e-02 +913 929 -9.403863770832814e-03 +913 930 -8.076052134892568e-03 +913 931 -6.996835383339677e-03 +913 932 -6.109381318875733e-03 +913 933 -5.371977266379788e-03 +913 934 -4.753493624956895e-03 +913 935 -4.230349322908508e-03 +913 936 -3.784439171232917e-03 +913 937 -3.401691470521385e-03 +913 938 -3.071047067257394e-03 +913 939 -2.783725492315667e-03 +913 940 -2.532689975072674e-03 +913 941 -2.312252367280536e-03 +913 942 -2.117777896667785e-03 +913 943 -1.945462087124849e-03 +914 914 3.988394278171953e+01 +914 896 -6.996835383339677e-03 +914 897 -8.076052134892568e-03 +914 898 -9.403863770832814e-03 +914 899 -1.105916272470026e-02 +914 900 -1.315380302376555e-02 +914 901 -1.585023865775537e-02 +914 902 -1.939104886145111e-02 +914 903 -2.415034675252897e-02 +914 904 -3.072751892616544e-02 +914 905 -4.012781031912998e-02 +914 906 -5.413421453123234e-02 +914 907 -7.613960933881139e-02 +914 908 -1.132183869282749e-01 +914 909 -1.820810586422639e-01 +914 910 -3.301555353436809e-01 +914 911 -7.412185823610342e-01 +914 912 -3.165206906282892e+00 +914 913 -1.502055215878390e+01 +914 915 -1.502055215863286e+01 +914 916 -3.165206906282823e+00 +914 917 -7.412185823610101e-01 +914 918 -3.301555353436766e-01 +914 919 -1.820810586422651e-01 +914 920 -1.132183869282755e-01 +914 921 -7.613960933881153e-02 +914 922 -5.413421453123109e-02 +914 923 -4.012781031912993e-02 +914 924 -3.072751892616544e-02 +914 925 -2.415034675252897e-02 +914 926 -1.939104886145110e-02 +914 927 -1.585023865775514e-02 +914 928 -1.315380302376546e-02 +914 929 -1.105916272470025e-02 +914 930 -9.403863770832830e-03 +914 931 -8.076052134892642e-03 +914 932 -6.996835383339702e-03 +914 933 -6.109381318875769e-03 +914 934 -5.371977266379837e-03 +914 935 -4.753493624956895e-03 +914 936 -4.230349322908543e-03 +914 937 -3.784439171232937e-03 +914 938 -3.401691470521412e-03 +914 939 -3.071047067257401e-03 +914 940 -2.783725492315679e-03 +914 941 -2.532689975072691e-03 +914 942 -2.312252367280536e-03 +914 943 -2.117777896667799e-03 +915 915 3.988394278146368e+01 +915 896 -6.109381318875772e-03 +915 897 -6.996835383339674e-03 +915 898 -8.076052134892582e-03 +915 899 -9.403863770832816e-03 +915 900 -1.105916272470032e-02 +915 901 -1.315380302376555e-02 +915 902 -1.585023865775526e-02 +915 903 -1.939104886145110e-02 +915 904 -2.415034675252896e-02 +915 905 -3.072751892616545e-02 +915 906 -4.012781031913035e-02 +915 907 -5.413421453123204e-02 +915 908 -7.613960933881170e-02 +915 909 -1.132183869282771e-01 +915 910 -1.820810586422698e-01 +915 911 -3.301555353436825e-01 +915 912 -7.412185823610308e-01 +915 913 -3.165206906282880e+00 +915 914 -1.502055215863286e+01 +915 916 -1.502055215852583e+01 +915 917 -3.165206906282890e+00 +915 918 -7.412185823610136e-01 +915 919 -3.301555353436675e-01 +915 920 -1.820810586422597e-01 +915 921 -1.132183869282744e-01 +915 922 -7.613960933881053e-02 +915 923 -5.413421453123171e-02 +915 924 -4.012781031912998e-02 +915 925 -3.072751892616545e-02 +915 926 -2.415034675252897e-02 +915 927 -1.939104886145097e-02 +915 928 -1.585023865775526e-02 +915 929 -1.315380302376547e-02 +915 930 -1.105916272470026e-02 +915 931 -9.403863770832833e-03 +915 932 -8.076052134892573e-03 +915 933 -6.996835383339674e-03 +915 934 -6.109381318875769e-03 +915 935 -5.371977266379790e-03 +915 936 -4.753493624956895e-03 +915 937 -4.230349322908531e-03 +915 938 -3.784439171232939e-03 +915 939 -3.401691470521395e-03 +915 940 -3.071047067257393e-03 +915 941 -2.783725492315679e-03 +915 942 -2.532689975072674e-03 +915 943 -2.312252367280536e-03 +916 916 3.988394278128111e+01 +916 896 -5.371977266379824e-03 +916 897 -6.109381318875750e-03 +916 898 -6.996835383339674e-03 +916 899 -8.076052134892557e-03 +916 900 -9.403863770832832e-03 +916 901 -1.105916272470025e-02 +916 902 -1.315380302376538e-02 +916 903 -1.585023865775514e-02 +916 904 -1.939104886145096e-02 +916 905 -2.415034675252878e-02 +916 906 -3.072751892616544e-02 +916 907 -4.012781031912978e-02 +916 908 -5.413421453123111e-02 +916 909 -7.613960933881095e-02 +916 910 -1.132183869282782e-01 +916 911 -1.820810586422673e-01 +916 912 -3.301555353436753e-01 +916 913 -7.412185823610112e-01 +916 914 -3.165206906282823e+00 +916 915 -1.502055215852583e+01 +916 917 -1.502055215844903e+01 +916 918 -3.165206906282860e+00 +916 919 -7.412185823610224e-01 +916 920 -3.301555353436759e-01 +916 921 -1.820810586422651e-01 +916 922 -1.132183869282759e-01 +916 923 -7.613960933881238e-02 +916 924 -5.413421453123234e-02 +916 925 -4.012781031913037e-02 +916 926 -3.072751892616572e-02 +916 927 -2.415034675252897e-02 +916 928 -1.939104886145125e-02 +916 929 -1.585023865775537e-02 +916 930 -1.315380302376555e-02 +916 931 -1.105916272470032e-02 +916 932 -9.403863770832813e-03 +916 933 -8.076052134892592e-03 +916 934 -6.996835383339698e-03 +916 935 -6.109381318875730e-03 +916 936 -5.371977266379805e-03 +916 937 -4.753493624956895e-03 +916 938 -4.230349322908545e-03 +916 939 -3.784439171232929e-03 +916 940 -3.401691470521394e-03 +916 941 -3.071047067257401e-03 +916 942 -2.783725492315666e-03 +916 943 -2.532689975072680e-03 +917 917 3.988394278115156e+01 +917 896 -4.753493624956926e-03 +917 897 -5.371977266379823e-03 +917 898 -6.109381318875771e-03 +917 899 -6.996835383339677e-03 +917 900 -8.076052134892655e-03 +917 901 -9.403863770832856e-03 +917 902 -1.105916272470022e-02 +917 903 -1.315380302376542e-02 +917 904 -1.585023865775520e-02 +917 905 -1.939104886145103e-02 +917 906 -2.415034675252906e-02 +917 907 -3.072751892616544e-02 +917 908 -4.012781031912974e-02 +917 909 -5.413421453123138e-02 +917 910 -7.613960933881136e-02 +917 911 -1.132183869282769e-01 +917 912 -1.820810586422650e-01 +917 913 -3.301555353436731e-01 +917 914 -7.412185823610101e-01 +917 915 -3.165206906282890e+00 +917 916 -1.502055215844903e+01 +917 918 -1.502055215839542e+01 +917 919 -3.165206906282904e+00 +917 920 -7.412185823610423e-01 +917 921 -3.301555353436826e-01 +917 922 -1.820810586422650e-01 +917 923 -1.132183869282765e-01 +917 924 -7.613960933881207e-02 +917 925 -5.413421453123205e-02 +917 926 -4.012781031913017e-02 +917 927 -3.072751892616531e-02 +917 928 -2.415034675252906e-02 +917 929 -1.939104886145119e-02 +917 930 -1.585023865775532e-02 +917 931 -1.315380302376550e-02 +917 932 -1.105916272470022e-02 +917 933 -9.403863770832825e-03 +917 934 -8.076052134892604e-03 +917 935 -6.996835383339623e-03 +917 936 -6.109381318875727e-03 +917 937 -5.371977266379786e-03 +917 938 -4.753493624956895e-03 +917 939 -4.230349322908520e-03 +917 940 -3.784439171232916e-03 +917 941 -3.401691470521392e-03 +917 942 -3.071047067257377e-03 +917 943 -2.783725492315665e-03 +918 918 3.988394278106479e+01 +918 896 -4.230349322908547e-03 +918 897 -4.753493624956898e-03 +918 898 -5.371977266379809e-03 +918 899 -6.109381318875733e-03 +918 900 -6.996835383339702e-03 +918 901 -8.076052134892594e-03 +918 902 -9.403863770832811e-03 +918 903 -1.105916272470025e-02 +918 904 -1.315380302376546e-02 +918 905 -1.585023865775526e-02 +918 906 -1.939104886145125e-02 +918 907 -2.415034675252906e-02 +918 908 -3.072751892616543e-02 +918 909 -4.012781031912993e-02 +918 910 -5.413421453123171e-02 +918 911 -7.613960933881253e-02 +918 912 -1.132183869282771e-01 +918 913 -1.820810586422674e-01 +918 914 -3.301555353436766e-01 +918 915 -7.412185823610136e-01 +918 916 -3.165206906282860e+00 +918 917 -1.502055215839542e+01 +918 919 -1.502055215836222e+01 +918 920 -3.165206906282882e+00 +918 921 -7.412185823610322e-01 +918 922 -3.301555353436739e-01 +918 923 -1.820810586422652e-01 +918 924 -1.132183869282785e-01 +918 925 -7.613960933881188e-02 +918 926 -5.413421453123172e-02 +918 927 -4.012781031912956e-02 +918 928 -3.072751892616543e-02 +918 929 -2.415034675252897e-02 +918 930 -1.939104886145111e-02 +918 931 -1.585023865775526e-02 +918 932 -1.315380302376538e-02 +918 933 -1.105916272470022e-02 +918 934 -9.403863770832827e-03 +918 935 -8.076052134892564e-03 +918 936 -6.996835383339671e-03 +918 937 -6.109381318875748e-03 +918 938 -5.371977266379821e-03 +918 939 -4.753493624956896e-03 +918 940 -4.230349322908531e-03 +918 941 -3.784439171232936e-03 +918 942 -3.401691470521384e-03 +918 943 -3.071047067257392e-03 +919 919 3.988394278102302e+01 +919 896 -3.784439171232938e-03 +919 897 -4.230349322908531e-03 +919 898 -4.753493624956895e-03 +919 899 -5.371977266379788e-03 +919 900 -6.109381318875769e-03 +919 901 -6.996835383339674e-03 +919 902 -8.076052134892582e-03 +919 903 -9.403863770832814e-03 +919 904 -1.105916272470025e-02 +919 905 -1.315380302376547e-02 +919 906 -1.585023865775537e-02 +919 907 -1.939104886145119e-02 +919 908 -2.415034675252897e-02 +919 909 -3.072751892616544e-02 +919 910 -4.012781031912998e-02 +919 911 -5.413421453123234e-02 +919 912 -7.613960933881195e-02 +919 913 -1.132183869282775e-01 +919 914 -1.820810586422651e-01 +919 915 -3.301555353436675e-01 +919 916 -7.412185823610224e-01 +919 917 -3.165206906282904e+00 +919 918 -1.502055215836222e+01 +919 920 -1.502055215835483e+01 +919 921 -3.165206906282859e+00 +919 922 -7.412185823610246e-01 +919 923 -3.301555353436780e-01 +919 924 -1.820810586422695e-01 +919 925 -1.132183869282776e-01 +919 926 -7.613960933881163e-02 +919 927 -5.413421453123109e-02 +919 928 -4.012781031912993e-02 +919 929 -3.072751892616544e-02 +919 930 -2.415034675252897e-02 +919 931 -1.939104886145110e-02 +919 932 -1.585023865775514e-02 +919 933 -1.315380302376542e-02 +919 934 -1.105916272470025e-02 +919 935 -9.403863770832814e-03 +919 936 -8.076052134892582e-03 +919 937 -6.996835383339674e-03 +919 938 -6.109381318875771e-03 +919 939 -5.371977266379809e-03 +919 940 -4.753493624956895e-03 +919 941 -4.230349322908543e-03 +919 942 -3.784439171232917e-03 +919 943 -3.401691470521394e-03 +920 920 3.988394278105609e+01 +920 896 -3.401691470521412e-03 +920 897 -3.784439171232937e-03 +920 898 -4.230349322908543e-03 +920 899 -4.753493624956895e-03 +920 900 -5.371977266379837e-03 +920 901 -6.109381318875769e-03 +920 902 -6.996835383339698e-03 +920 903 -8.076052134892594e-03 +920 904 -9.403863770832828e-03 +920 905 -1.105916272470026e-02 +920 906 -1.315380302376555e-02 +920 907 -1.585023865775532e-02 +920 908 -1.939104886145111e-02 +920 909 -2.415034675252897e-02 +920 910 -3.072751892616545e-02 +920 911 -4.012781031913037e-02 +920 912 -5.413421453123205e-02 +920 913 -7.613960933881173e-02 +920 914 -1.132183869282755e-01 +920 915 -1.820810586422597e-01 +920 916 -3.301555353436759e-01 +920 917 -7.412185823610423e-01 +920 918 -3.165206906282882e+00 +920 919 -1.502055215835483e+01 +920 921 -1.502055215840051e+01 +920 922 -3.165206906282836e+00 +920 923 -7.412185823609991e-01 +920 924 -3.301555353436754e-01 +920 925 -1.820810586422675e-01 +920 926 -1.132183869282769e-01 +920 927 -7.613960933881092e-02 +920 928 -5.413421453123168e-02 +920 929 -4.012781031912996e-02 +920 930 -3.072751892616544e-02 +920 931 -2.415034675252896e-02 +920 932 -1.939104886145096e-02 +920 933 -1.585023865775520e-02 +920 934 -1.315380302376546e-02 +920 935 -1.105916272470025e-02 +920 936 -9.403863770832813e-03 +920 937 -8.076052134892556e-03 +920 938 -6.996835383339677e-03 +920 939 -6.109381318875733e-03 +920 940 -5.371977266379788e-03 +920 941 -4.753493624956895e-03 +920 942 -4.230349322908508e-03 +920 943 -3.784439171232917e-03 +921 921 3.988394278128546e+01 +921 896 -3.071047067257394e-03 +921 897 -3.401691470521385e-03 +921 898 -3.784439171232917e-03 +921 899 -4.230349322908508e-03 +921 900 -4.753493624956895e-03 +921 901 -5.371977266379790e-03 +921 902 -6.109381318875730e-03 +921 903 -6.996835383339623e-03 +921 904 -8.076052134892564e-03 +921 905 -9.403863770832816e-03 +921 906 -1.105916272470032e-02 +921 907 -1.315380302376550e-02 +921 908 -1.585023865775526e-02 +921 909 -1.939104886145110e-02 +921 910 -2.415034675252897e-02 +921 911 -3.072751892616572e-02 +921 912 -4.012781031913017e-02 +921 913 -5.413421453123172e-02 +921 914 -7.613960933881153e-02 +921 915 -1.132183869282744e-01 +921 916 -1.820810586422651e-01 +921 917 -3.301555353436826e-01 +921 918 -7.412185823610322e-01 +921 919 -3.165206906282859e+00 +921 920 -1.502055215840051e+01 +921 922 -1.502055215860518e+01 +921 923 -3.165206906282789e+00 +921 924 -7.412185823610101e-01 +921 925 -3.301555353436752e-01 +921 926 -1.820810586422651e-01 +921 927 -1.132183869282760e-01 +921 928 -7.613960933881171e-02 +921 929 -5.413421453123175e-02 +921 930 -4.012781031912998e-02 +921 931 -3.072751892616545e-02 +921 932 -2.415034675252878e-02 +921 933 -1.939104886145103e-02 +921 934 -1.585023865775526e-02 +921 935 -1.315380302376547e-02 +921 936 -1.105916272470026e-02 +921 937 -9.403863770832788e-03 +921 938 -8.076052134892630e-03 +921 939 -6.996835383339702e-03 +921 940 -6.109381318875769e-03 +921 941 -5.371977266379837e-03 +921 942 -4.753493624956895e-03 +921 943 -4.230349322908543e-03 +922 922 3.988394278152485e+01 +922 896 -2.783725492315679e-03 +922 897 -3.071047067257393e-03 +922 898 -3.401691470521394e-03 +922 899 -3.784439171232917e-03 +922 900 -4.230349322908543e-03 +922 901 -4.753493624956895e-03 +922 902 -5.371977266379805e-03 +922 903 -6.109381318875727e-03 +922 904 -6.996835383339671e-03 +922 905 -8.076052134892570e-03 +922 906 -9.403863770832813e-03 +922 907 -1.105916272470022e-02 +922 908 -1.315380302376538e-02 +922 909 -1.585023865775514e-02 +922 910 -1.939104886145097e-02 +922 911 -2.415034675252897e-02 +922 912 -3.072751892616531e-02 +922 913 -4.012781031912956e-02 +922 914 -5.413421453123109e-02 +922 915 -7.613960933881053e-02 +922 916 -1.132183869282759e-01 +922 917 -1.820810586422650e-01 +922 918 -3.301555353436739e-01 +922 919 -7.412185823610246e-01 +922 920 -3.165206906282836e+00 +922 921 -1.502055215860518e+01 +922 923 -1.502055215859220e+01 +922 924 -3.165206906282902e+00 +922 925 -7.412185823610489e-01 +922 926 -3.301555353436822e-01 +922 927 -1.820810586422658e-01 +922 928 -1.132183869282765e-01 +922 929 -7.613960933881225e-02 +922 930 -5.413421453123234e-02 +922 931 -4.012781031913035e-02 +922 932 -3.072751892616544e-02 +922 933 -2.415034675252906e-02 +922 934 -1.939104886145125e-02 +922 935 -1.585023865775537e-02 +922 936 -1.315380302376555e-02 +922 937 -1.105916272470025e-02 +922 938 -9.403863770832828e-03 +922 939 -8.076052134892594e-03 +922 940 -6.996835383339674e-03 +922 941 -6.109381318875769e-03 +922 942 -5.371977266379790e-03 +922 943 -4.753493624956895e-03 +923 923 3.988394278151348e+01 +923 896 -2.532689975072686e-03 +923 897 -2.783725492315672e-03 +923 898 -3.071047067257393e-03 +923 899 -3.401691470521385e-03 +923 900 -3.784439171232937e-03 +923 901 -4.230349322908531e-03 +923 902 -4.753493624956895e-03 +923 903 -5.371977266379786e-03 +923 904 -6.109381318875748e-03 +923 905 -6.996835383339674e-03 +923 906 -8.076052134892578e-03 +923 907 -9.403863770832854e-03 +923 908 -1.105916272470025e-02 +923 909 -1.315380302376546e-02 +923 910 -1.585023865775526e-02 +923 911 -1.939104886145125e-02 +923 912 -2.415034675252906e-02 +923 913 -3.072751892616543e-02 +923 914 -4.012781031912993e-02 +923 915 -5.413421453123171e-02 +923 916 -7.613960933881238e-02 +923 917 -1.132183869282765e-01 +923 918 -1.820810586422652e-01 +923 919 -3.301555353436780e-01 +923 920 -7.412185823609991e-01 +923 921 -3.165206906282789e+00 +923 922 -1.502055215859220e+01 +923 924 -1.502055215859651e+01 +923 925 -3.165206906282902e+00 +923 926 -7.412185823610403e-01 +923 927 -3.301555353436815e-01 +923 928 -1.820810586422635e-01 +923 929 -1.132183869282754e-01 +923 930 -7.613960933881120e-02 +923 931 -5.413421453123172e-02 +923 932 -4.012781031912956e-02 +923 933 -3.072751892616529e-02 +923 934 -2.415034675252896e-02 +923 935 -1.939104886145111e-02 +923 936 -1.585023865775526e-02 +923 937 -1.315380302376538e-02 +923 938 -1.105916272470018e-02 +923 939 -9.403863770832811e-03 +923 940 -8.076052134892582e-03 +923 941 -6.996835383339698e-03 +923 942 -6.109381318875730e-03 +923 943 -5.371977266379805e-03 +924 924 3.988394278151447e+01 +924 896 -2.312252367280547e-03 +924 897 -2.532689975072686e-03 +924 898 -2.783725492315679e-03 +924 899 -3.071047067257394e-03 +924 900 -3.401691470521412e-03 +924 901 -3.784439171232939e-03 +924 902 -4.230349322908545e-03 +924 903 -4.753493624956895e-03 +924 904 -5.371977266379821e-03 +924 905 -6.109381318875771e-03 +924 906 -6.996835383339677e-03 +924 907 -8.076052134892655e-03 +924 908 -9.403863770832833e-03 +924 909 -1.105916272470025e-02 +924 910 -1.315380302376547e-02 +924 911 -1.585023865775537e-02 +924 912 -1.939104886145119e-02 +924 913 -2.415034675252897e-02 +924 914 -3.072751892616544e-02 +924 915 -4.012781031912998e-02 +924 916 -5.413421453123234e-02 +924 917 -7.613960933881207e-02 +924 918 -1.132183869282785e-01 +924 919 -1.820810586422695e-01 +924 920 -3.301555353436754e-01 +924 921 -7.412185823610101e-01 +924 922 -3.165206906282902e+00 +924 923 -1.502055215859651e+01 +924 925 -1.502055215858806e+01 +924 926 -3.165206906282884e+00 +924 927 -7.412185823610372e-01 +924 928 -3.301555353436725e-01 +924 929 -1.820810586422616e-01 +924 930 -1.132183869282743e-01 +924 931 -7.613960933881167e-02 +924 932 -5.413421453123109e-02 +924 933 -4.012781031912974e-02 +924 934 -3.072751892616542e-02 +924 935 -2.415034675252897e-02 +924 936 -1.939104886145110e-02 +924 937 -1.585023865775514e-02 +924 938 -1.315380302376537e-02 +924 939 -1.105916272470025e-02 +924 940 -9.403863770832814e-03 +924 941 -8.076052134892594e-03 +924 942 -6.996835383339623e-03 +924 943 -6.109381318875727e-03 +925 925 3.988394278153935e+01 +925 896 -2.117777896667799e-03 +925 897 -2.312252367280537e-03 +925 898 -2.532689975072680e-03 +925 899 -2.783725492315667e-03 +925 900 -3.071047067257401e-03 +925 901 -3.401691470521395e-03 +925 902 -3.784439171232929e-03 +925 903 -4.230349322908520e-03 +925 904 -4.753493624956896e-03 +925 905 -5.371977266379809e-03 +925 906 -6.109381318875733e-03 +925 907 -6.996835383339702e-03 +925 908 -8.076052134892583e-03 +925 909 -9.403863770832814e-03 +925 910 -1.105916272470026e-02 +925 911 -1.315380302376555e-02 +925 912 -1.585023865775532e-02 +925 913 -1.939104886145111e-02 +925 914 -2.415034675252897e-02 +925 915 -3.072751892616545e-02 +925 916 -4.012781031913037e-02 +925 917 -5.413421453123205e-02 +925 918 -7.613960933881188e-02 +925 919 -1.132183869282776e-01 +925 920 -1.820810586422675e-01 +925 921 -3.301555353436752e-01 +925 922 -7.412185823610489e-01 +925 923 -3.165206906282902e+00 +925 924 -1.502055215858806e+01 +925 926 -1.502055215863999e+01 +925 927 -3.165206906282861e+00 +925 928 -7.412185823609985e-01 +925 929 -3.301555353436723e-01 +925 930 -1.820810586422641e-01 +925 931 -1.132183869282771e-01 +925 932 -7.613960933881117e-02 +925 933 -5.413421453123138e-02 +925 934 -4.012781031912993e-02 +925 935 -3.072751892616544e-02 +925 936 -2.415034675252896e-02 +925 937 -1.939104886145095e-02 +925 938 -1.585023865775514e-02 +925 939 -1.315380302376546e-02 +925 940 -1.105916272470025e-02 +925 941 -9.403863770832828e-03 +925 942 -8.076052134892564e-03 +925 943 -6.996835383339671e-03 +926 926 3.988394278164013e+01 +926 896 -1.945462087124858e-03 +926 897 -2.117777896667794e-03 +926 898 -2.312252367280536e-03 +926 899 -2.532689975072674e-03 +926 900 -2.783725492315679e-03 +926 901 -3.071047067257393e-03 +926 902 -3.401691470521394e-03 +926 903 -3.784439171232916e-03 +926 904 -4.230349322908531e-03 +926 905 -4.753493624956895e-03 +926 906 -5.371977266379788e-03 +926 907 -6.109381318875769e-03 +926 908 -6.996835383339674e-03 +926 909 -8.076052134892582e-03 +926 910 -9.403863770832816e-03 +926 911 -1.105916272470032e-02 +926 912 -1.315380302376550e-02 +926 913 -1.585023865775526e-02 +926 914 -1.939104886145110e-02 +926 915 -2.415034675252897e-02 +926 916 -3.072751892616572e-02 +926 917 -4.012781031913017e-02 +926 918 -5.413421453123172e-02 +926 919 -7.613960933881163e-02 +926 920 -1.132183869282769e-01 +926 921 -1.820810586422651e-01 +926 922 -3.301555353436822e-01 +926 923 -7.412185823610403e-01 +926 924 -3.165206906282884e+00 +926 925 -1.502055215863999e+01 +926 927 -1.502055215865999e+01 +926 928 -3.165206906282816e+00 +926 929 -7.412185823610083e-01 +926 930 -3.301555353436734e-01 +926 931 -1.820810586422676e-01 +926 932 -1.132183869282781e-01 +926 933 -7.613960933881100e-02 +926 934 -5.413421453123171e-02 +926 935 -4.012781031912998e-02 +926 936 -3.072751892616545e-02 +926 937 -2.415034675252877e-02 +926 938 -1.939104886145096e-02 +926 939 -1.585023865775526e-02 +926 940 -1.315380302376547e-02 +926 941 -1.105916272470026e-02 +926 942 -9.403863770832816e-03 +926 943 -8.076052134892570e-03 +927 927 3.988394278169704e+01 +927 896 -1.792160480940046e-03 +927 897 -1.945462087124857e-03 +927 898 -2.117777896667799e-03 +927 899 -2.312252367280536e-03 +927 900 -2.532689975072691e-03 +927 901 -2.783725492315679e-03 +927 902 -3.071047067257401e-03 +927 903 -3.401691470521392e-03 +927 904 -3.784439171232936e-03 +927 905 -4.230349322908543e-03 +927 906 -4.753493624956895e-03 +927 907 -5.371977266379837e-03 +927 908 -6.109381318875769e-03 +927 909 -6.996835383339698e-03 +927 910 -8.076052134892583e-03 +927 911 -9.403863770832827e-03 +927 912 -1.105916272470022e-02 +927 913 -1.315380302376538e-02 +927 914 -1.585023865775514e-02 +927 915 -1.939104886145097e-02 +927 916 -2.415034675252897e-02 +927 917 -3.072751892616531e-02 +927 918 -4.012781031912956e-02 +927 919 -5.413421453123109e-02 +927 920 -7.613960933881092e-02 +927 921 -1.132183869282760e-01 +927 922 -1.820810586422658e-01 +927 923 -3.301555353436815e-01 +927 924 -7.412185823610372e-01 +927 925 -3.165206906282861e+00 +927 926 -1.502055215865999e+01 +927 928 -1.502055215931055e+01 +927 929 -3.165206906282904e+00 +927 930 -7.412185823610402e-01 +927 931 -3.301555353436761e-01 +927 932 -1.820810586422684e-01 +927 933 -1.132183869282768e-01 +927 934 -7.613960933881252e-02 +927 935 -5.413421453123234e-02 +927 936 -4.012781031913035e-02 +927 937 -3.072751892616543e-02 +927 938 -2.415034675252896e-02 +927 939 -1.939104886145125e-02 +927 940 -1.585023865775537e-02 +927 941 -1.315380302376555e-02 +927 942 -1.105916272470032e-02 +927 943 -9.403863770832813e-03 +928 928 3.988394278169710e+01 +928 912 -9.403863770832839e-03 +928 913 -1.105916272470025e-02 +928 914 -1.315380302376546e-02 +928 915 -1.585023865775526e-02 +928 916 -1.939104886145125e-02 +928 917 -2.415034675252906e-02 +928 918 -3.072751892616543e-02 +928 919 -4.012781031912993e-02 +928 920 -5.413421453123168e-02 +928 921 -7.613960933881171e-02 +928 922 -1.132183869282765e-01 +928 923 -1.820810586422635e-01 +928 924 -3.301555353436725e-01 +928 925 -7.412185823609985e-01 +928 926 -3.165206906282816e+00 +928 927 -1.502055215931055e+01 +928 929 -1.502055215866011e+01 +928 930 -3.165206906282896e+00 +928 931 -7.412185823610331e-01 +928 932 -3.301555353436831e-01 +928 933 -1.820810586422666e-01 +928 934 -1.132183869282775e-01 +928 935 -7.613960933881188e-02 +928 936 -5.413421453123172e-02 +928 937 -4.012781031912956e-02 +928 938 -3.072751892616515e-02 +928 939 -2.415034675252896e-02 +928 940 -1.939104886145111e-02 +928 941 -1.585023865775526e-02 +928 942 -1.315380302376546e-02 +928 943 -1.105916272470019e-02 +928 944 -9.403863770832828e-03 +928 945 -8.076052134892642e-03 +928 946 -6.996835383339702e-03 +928 947 -6.109381318875769e-03 +928 948 -5.371977266379837e-03 +928 949 -4.753493624956895e-03 +928 950 -4.230349322908543e-03 +928 951 -3.784439171232937e-03 +928 952 -3.401691470521412e-03 +928 953 -3.071047067257401e-03 +928 954 -2.783725492315679e-03 +928 955 -2.532689975072691e-03 +928 956 -2.312252367280536e-03 +928 957 -2.117777896667799e-03 +928 958 -1.945462087124857e-03 +928 959 -1.792160480940046e-03 +929 929 3.988394278164023e+01 +929 912 -8.076052134892594e-03 +929 913 -9.403863770832814e-03 +929 914 -1.105916272470025e-02 +929 915 -1.315380302376547e-02 +929 916 -1.585023865775537e-02 +929 917 -1.939104886145119e-02 +929 918 -2.415034675252897e-02 +929 919 -3.072751892616544e-02 +929 920 -4.012781031912996e-02 +929 921 -5.413421453123175e-02 +929 922 -7.613960933881225e-02 +929 923 -1.132183869282754e-01 +929 924 -1.820810586422616e-01 +929 925 -3.301555353436723e-01 +929 926 -7.412185823610083e-01 +929 927 -3.165206906282904e+00 +929 928 -1.502055215866011e+01 +929 930 -1.502055215863991e+01 +929 931 -3.165206906282864e+00 +929 932 -7.412185823610243e-01 +929 933 -3.301555353436823e-01 +929 934 -1.820810586422667e-01 +929 935 -1.132183869282771e-01 +929 936 -7.613960933881148e-02 +929 937 -5.413421453123108e-02 +929 938 -4.012781031912953e-02 +929 939 -3.072751892616542e-02 +929 940 -2.415034675252897e-02 +929 941 -1.939104886145111e-02 +929 942 -1.585023865775525e-02 +929 943 -1.315380302376538e-02 +929 944 -1.105916272470025e-02 +929 945 -9.403863770832832e-03 +929 946 -8.076052134892583e-03 +929 947 -6.996835383339674e-03 +929 948 -6.109381318875769e-03 +929 949 -5.371977266379790e-03 +929 950 -4.753493624956895e-03 +929 951 -4.230349322908531e-03 +929 952 -3.784439171232939e-03 +929 953 -3.401691470521395e-03 +929 954 -3.071047067257393e-03 +929 955 -2.783725492315679e-03 +929 956 -2.532689975072674e-03 +929 957 -2.312252367280536e-03 +929 958 -2.117777896667794e-03 +929 959 -1.945462087124857e-03 +930 930 3.988394278153929e+01 +930 912 -6.996835383339674e-03 +930 913 -8.076052134892568e-03 +930 914 -9.403863770832830e-03 +930 915 -1.105916272470026e-02 +930 916 -1.315380302376555e-02 +930 917 -1.585023865775532e-02 +930 918 -1.939104886145111e-02 +930 919 -2.415034675252897e-02 +930 920 -3.072751892616544e-02 +930 921 -4.012781031912998e-02 +930 922 -5.413421453123234e-02 +930 923 -7.613960933881120e-02 +930 924 -1.132183869282743e-01 +930 925 -1.820810586422641e-01 +930 926 -3.301555353436734e-01 +930 927 -7.412185823610402e-01 +930 928 -3.165206906282896e+00 +930 929 -1.502055215863991e+01 +930 931 -1.502055215858811e+01 +930 932 -3.165206906282843e+00 +930 933 -7.412185823610163e-01 +930 934 -3.301555353436761e-01 +930 935 -1.820810586422655e-01 +930 936 -1.132183869282754e-01 +930 937 -7.613960933881059e-02 +930 938 -5.413421453123106e-02 +930 939 -4.012781031912993e-02 +930 940 -3.072751892616544e-02 +930 941 -2.415034675252897e-02 +930 942 -1.939104886145110e-02 +930 943 -1.585023865775514e-02 +930 944 -1.315380302376546e-02 +930 945 -1.105916272470025e-02 +930 946 -9.403863770832814e-03 +930 947 -8.076052134892582e-03 +930 948 -6.996835383339698e-03 +930 949 -6.109381318875730e-03 +930 950 -5.371977266379805e-03 +930 951 -4.753493624956895e-03 +930 952 -4.230349322908545e-03 +930 953 -3.784439171232929e-03 +930 954 -3.401691470521394e-03 +930 955 -3.071047067257401e-03 +930 956 -2.783725492315666e-03 +930 957 -2.532689975072680e-03 +930 958 -2.312252367280536e-03 +930 959 -2.117777896667799e-03 +931 931 3.988394278151433e+01 +931 912 -6.109381318875771e-03 +931 913 -6.996835383339677e-03 +931 914 -8.076052134892642e-03 +931 915 -9.403863770832833e-03 +931 916 -1.105916272470032e-02 +931 917 -1.315380302376550e-02 +931 918 -1.585023865775526e-02 +931 919 -1.939104886145110e-02 +931 920 -2.415034675252896e-02 +931 921 -3.072751892616545e-02 +931 922 -4.012781031913035e-02 +931 923 -5.413421453123172e-02 +931 924 -7.613960933881167e-02 +931 925 -1.132183869282771e-01 +931 926 -1.820810586422676e-01 +931 927 -3.301555353436761e-01 +931 928 -7.412185823610331e-01 +931 929 -3.165206906282864e+00 +931 930 -1.502055215858811e+01 +931 932 -1.502055215859642e+01 +931 933 -3.165206906282832e+00 +931 934 -7.412185823610156e-01 +931 935 -3.301555353436713e-01 +931 936 -1.820810586422610e-01 +931 937 -1.132183869282734e-01 +931 938 -7.613960933881048e-02 +931 939 -5.413421453123171e-02 +931 940 -4.012781031912998e-02 +931 941 -3.072751892616545e-02 +931 942 -2.415034675252897e-02 +931 943 -1.939104886145097e-02 +931 944 -1.585023865775526e-02 +931 945 -1.315380302376547e-02 +931 946 -1.105916272470026e-02 +931 947 -9.403863770832816e-03 +931 948 -8.076052134892583e-03 +931 949 -6.996835383339623e-03 +931 950 -6.109381318875727e-03 +931 951 -5.371977266379786e-03 +931 952 -4.753493624956895e-03 +931 953 -4.230349322908520e-03 +931 954 -3.784439171232916e-03 +931 955 -3.401691470521392e-03 +931 956 -3.071047067257377e-03 +931 957 -2.783725492315665e-03 +931 958 -2.532689975072673e-03 +931 959 -2.312252367280536e-03 +932 932 3.988394278151353e+01 +932 912 -5.371977266379809e-03 +932 913 -6.109381318875733e-03 +932 914 -6.996835383339702e-03 +932 915 -8.076052134892573e-03 +932 916 -9.403863770832813e-03 +932 917 -1.105916272470022e-02 +932 918 -1.315380302376538e-02 +932 919 -1.585023865775514e-02 +932 920 -1.939104886145096e-02 +932 921 -2.415034675252878e-02 +932 922 -3.072751892616544e-02 +932 923 -4.012781031912956e-02 +932 924 -5.413421453123109e-02 +932 925 -7.613960933881117e-02 +932 926 -1.132183869282781e-01 +932 927 -1.820810586422684e-01 +932 928 -3.301555353436831e-01 +932 929 -7.412185823610243e-01 +932 930 -3.165206906282843e+00 +932 931 -1.502055215859642e+01 +932 933 -1.502055215859224e+01 +932 934 -3.165206906282929e+00 +932 935 -7.412185823610398e-01 +932 936 -3.301555353436701e-01 +932 937 -1.820810586422611e-01 +932 938 -1.132183869282750e-01 +932 939 -7.613960933881238e-02 +932 940 -5.413421453123234e-02 +932 941 -4.012781031913037e-02 +932 942 -3.072751892616572e-02 +932 943 -2.415034675252897e-02 +932 944 -1.939104886145125e-02 +932 945 -1.585023865775537e-02 +932 946 -1.315380302376555e-02 +932 947 -1.105916272470032e-02 +932 948 -9.403863770832827e-03 +932 949 -8.076052134892575e-03 +932 950 -6.996835383339671e-03 +932 951 -6.109381318875748e-03 +932 952 -5.371977266379821e-03 +932 953 -4.753493624956896e-03 +932 954 -4.230349322908531e-03 +932 955 -3.784439171232936e-03 +932 956 -3.401691470521384e-03 +932 957 -3.071047067257392e-03 +932 958 -2.783725492315671e-03 +932 959 -2.532689975072685e-03 +933 933 3.988394278152501e+01 +933 912 -4.753493624956895e-03 +933 913 -5.371977266379788e-03 +933 914 -6.109381318875769e-03 +933 915 -6.996835383339674e-03 +933 916 -8.076052134892592e-03 +933 917 -9.403863770832825e-03 +933 918 -1.105916272470022e-02 +933 919 -1.315380302376542e-02 +933 920 -1.585023865775520e-02 +933 921 -1.939104886145103e-02 +933 922 -2.415034675252906e-02 +933 923 -3.072751892616529e-02 +933 924 -4.012781031912974e-02 +933 925 -5.413421453123138e-02 +933 926 -7.613960933881100e-02 +933 927 -1.132183869282768e-01 +933 928 -1.820810586422666e-01 +933 929 -3.301555353436823e-01 +933 930 -7.412185823610163e-01 +933 931 -3.165206906282832e+00 +933 932 -1.502055215859224e+01 +933 934 -1.502055215860536e+01 +933 935 -3.165206906282897e+00 +933 936 -7.412185823610149e-01 +933 937 -3.301555353436754e-01 +933 938 -1.820810586422667e-01 +933 939 -1.132183869282780e-01 +933 940 -7.613960933881209e-02 +933 941 -5.413421453123205e-02 +933 942 -4.012781031913017e-02 +933 943 -3.072751892616531e-02 +933 944 -2.415034675252906e-02 +933 945 -1.939104886145119e-02 +933 946 -1.585023865775532e-02 +933 947 -1.315380302376550e-02 +933 948 -1.105916272470022e-02 +933 949 -9.403863770832839e-03 +933 950 -8.076052134892594e-03 +933 951 -6.996835383339674e-03 +933 952 -6.109381318875771e-03 +933 953 -5.371977266379809e-03 +933 954 -4.753493624956895e-03 +933 955 -4.230349322908543e-03 +933 956 -3.784439171232917e-03 +933 957 -3.401691470521394e-03 +933 958 -3.071047067257393e-03 +933 959 -2.783725492315679e-03 +934 934 3.988394278128570e+01 +934 912 -4.230349322908543e-03 +934 913 -4.753493624956895e-03 +934 914 -5.371977266379837e-03 +934 915 -6.109381318875769e-03 +934 916 -6.996835383339698e-03 +934 917 -8.076052134892604e-03 +934 918 -9.403863770832827e-03 +934 919 -1.105916272470025e-02 +934 920 -1.315380302376546e-02 +934 921 -1.585023865775526e-02 +934 922 -1.939104886145125e-02 +934 923 -2.415034675252896e-02 +934 924 -3.072751892616542e-02 +934 925 -4.012781031912993e-02 +934 926 -5.413421453123171e-02 +934 927 -7.613960933881252e-02 +934 928 -1.132183869282775e-01 +934 929 -1.820810586422667e-01 +934 930 -3.301555353436761e-01 +934 931 -7.412185823610156e-01 +934 932 -3.165206906282929e+00 +934 933 -1.502055215860536e+01 +934 935 -1.502055215840044e+01 +934 936 -3.165206906282847e+00 +934 937 -7.412185823610238e-01 +934 938 -3.301555353436867e-01 +934 939 -1.820810586422679e-01 +934 940 -1.132183869282768e-01 +934 941 -7.613960933881150e-02 +934 942 -5.413421453123172e-02 +934 943 -4.012781031912956e-02 +934 944 -3.072751892616543e-02 +934 945 -2.415034675252897e-02 +934 946 -1.939104886145111e-02 +934 947 -1.585023865775526e-02 +934 948 -1.315380302376538e-02 +934 949 -1.105916272470025e-02 +934 950 -9.403863770832814e-03 +934 951 -8.076052134892568e-03 +934 952 -6.996835383339677e-03 +934 953 -6.109381318875733e-03 +934 954 -5.371977266379788e-03 +934 955 -4.753493624956895e-03 +934 956 -4.230349322908508e-03 +934 957 -3.784439171232917e-03 +934 958 -3.401691470521385e-03 +934 959 -3.071047067257394e-03 +935 935 3.988394278105614e+01 +935 912 -3.784439171232917e-03 +935 913 -4.230349322908508e-03 +935 914 -4.753493624956895e-03 +935 915 -5.371977266379790e-03 +935 916 -6.109381318875730e-03 +935 917 -6.996835383339623e-03 +935 918 -8.076052134892564e-03 +935 919 -9.403863770832814e-03 +935 920 -1.105916272470025e-02 +935 921 -1.315380302376547e-02 +935 922 -1.585023865775537e-02 +935 923 -1.939104886145111e-02 +935 924 -2.415034675252897e-02 +935 925 -3.072751892616544e-02 +935 926 -4.012781031912998e-02 +935 927 -5.413421453123234e-02 +935 928 -7.613960933881188e-02 +935 929 -1.132183869282771e-01 +935 930 -1.820810586422655e-01 +935 931 -3.301555353436713e-01 +935 932 -7.412185823610398e-01 +935 933 -3.165206906282897e+00 +935 934 -1.502055215840044e+01 +935 936 -1.502055215835489e+01 +935 937 -3.165206906282862e+00 +935 938 -7.412185823610304e-01 +935 939 -3.301555353436831e-01 +935 940 -1.820810586422668e-01 +935 941 -1.132183869282775e-01 +935 942 -7.613960933881185e-02 +935 943 -5.413421453123109e-02 +935 944 -4.012781031912993e-02 +935 945 -3.072751892616544e-02 +935 946 -2.415034675252897e-02 +935 947 -1.939104886145110e-02 +935 948 -1.585023865775514e-02 +935 949 -1.315380302376546e-02 +935 950 -1.105916272470025e-02 +935 951 -9.403863770832830e-03 +935 952 -8.076052134892642e-03 +935 953 -6.996835383339702e-03 +935 954 -6.109381318875769e-03 +935 955 -5.371977266379837e-03 +935 956 -4.753493624956895e-03 +935 957 -4.230349322908543e-03 +935 958 -3.784439171232937e-03 +935 959 -3.401691470521412e-03 +936 936 3.988394278102299e+01 +936 912 -3.401691470521394e-03 +936 913 -3.784439171232917e-03 +936 914 -4.230349322908543e-03 +936 915 -4.753493624956895e-03 +936 916 -5.371977266379805e-03 +936 917 -6.109381318875727e-03 +936 918 -6.996835383339671e-03 +936 919 -8.076052134892582e-03 +936 920 -9.403863770832813e-03 +936 921 -1.105916272470026e-02 +936 922 -1.315380302376555e-02 +936 923 -1.585023865775526e-02 +936 924 -1.939104886145110e-02 +936 925 -2.415034675252896e-02 +936 926 -3.072751892616545e-02 +936 927 -4.012781031913035e-02 +936 928 -5.413421453123172e-02 +936 929 -7.613960933881148e-02 +936 930 -1.132183869282754e-01 +936 931 -1.820810586422610e-01 +936 932 -3.301555353436701e-01 +936 933 -7.412185823610149e-01 +936 934 -3.165206906282847e+00 +936 935 -1.502055215835489e+01 +936 937 -1.502055215836221e+01 +936 938 -3.165206906282866e+00 +936 939 -7.412185823610395e-01 +936 940 -3.301555353436764e-01 +936 941 -1.820810586422690e-01 +936 942 -1.132183869282785e-01 +936 943 -7.613960933881120e-02 +936 944 -5.413421453123171e-02 +936 945 -4.012781031912998e-02 +936 946 -3.072751892616545e-02 +936 947 -2.415034675252897e-02 +936 948 -1.939104886145097e-02 +936 949 -1.585023865775526e-02 +936 950 -1.315380302376547e-02 +936 951 -1.105916272470026e-02 +936 952 -9.403863770832833e-03 +936 953 -8.076052134892573e-03 +936 954 -6.996835383339674e-03 +936 955 -6.109381318875769e-03 +936 956 -5.371977266379790e-03 +936 957 -4.753493624956895e-03 +936 958 -4.230349322908531e-03 +936 959 -3.784439171232939e-03 +937 937 3.988394278106474e+01 +937 912 -3.071047067257393e-03 +937 913 -3.401691470521385e-03 +937 914 -3.784439171232937e-03 +937 915 -4.230349322908531e-03 +937 916 -4.753493624956895e-03 +937 917 -5.371977266379786e-03 +937 918 -6.109381318875748e-03 +937 919 -6.996835383339674e-03 +937 920 -8.076052134892556e-03 +937 921 -9.403863770832788e-03 +937 922 -1.105916272470025e-02 +937 923 -1.315380302376538e-02 +937 924 -1.585023865775514e-02 +937 925 -1.939104886145095e-02 +937 926 -2.415034675252877e-02 +937 927 -3.072751892616543e-02 +937 928 -4.012781031912956e-02 +937 929 -5.413421453123108e-02 +937 930 -7.613960933881059e-02 +937 931 -1.132183869282734e-01 +937 932 -1.820810586422611e-01 +937 933 -3.301555353436754e-01 +937 934 -7.412185823610238e-01 +937 935 -3.165206906282862e+00 +937 936 -1.502055215836221e+01 +937 938 -1.502055215839538e+01 +937 939 -3.165206906282904e+00 +937 940 -7.412185823610228e-01 +937 941 -3.301555353436734e-01 +937 942 -1.820810586422667e-01 +937 943 -1.132183869282764e-01 +937 944 -7.613960933881239e-02 +937 945 -5.413421453123238e-02 +937 946 -4.012781031913039e-02 +937 947 -3.072751892616573e-02 +937 948 -2.415034675252898e-02 +937 949 -1.939104886145126e-02 +937 950 -1.585023865775537e-02 +937 951 -1.315380302376555e-02 +937 952 -1.105916272470032e-02 +937 953 -9.403863770832814e-03 +937 954 -8.076052134892580e-03 +937 955 -6.996835383339698e-03 +937 956 -6.109381318875730e-03 +937 957 -5.371977266379805e-03 +937 958 -4.753493624956895e-03 +937 959 -4.230349322908545e-03 +938 938 3.988394278115153e+01 +938 912 -2.783725492315679e-03 +938 913 -3.071047067257394e-03 +938 914 -3.401691470521412e-03 +938 915 -3.784439171232939e-03 +938 916 -4.230349322908545e-03 +938 917 -4.753493624956895e-03 +938 918 -5.371977266379821e-03 +938 919 -6.109381318875771e-03 +938 920 -6.996835383339677e-03 +938 921 -8.076052134892630e-03 +938 922 -9.403863770832828e-03 +938 923 -1.105916272470018e-02 +938 924 -1.315380302376537e-02 +938 925 -1.585023865775514e-02 +938 926 -1.939104886145096e-02 +938 927 -2.415034675252896e-02 +938 928 -3.072751892616515e-02 +938 929 -4.012781031912953e-02 +938 930 -5.413421453123106e-02 +938 931 -7.613960933881048e-02 +938 932 -1.132183869282750e-01 +938 933 -1.820810586422667e-01 +938 934 -3.301555353436867e-01 +938 935 -7.412185823610304e-01 +938 936 -3.165206906282866e+00 +938 937 -1.502055215839538e+01 +938 939 -1.502055215844912e+01 +938 940 -3.165206906282845e+00 +938 941 -7.412185823610017e-01 +938 942 -3.301555353436684e-01 +938 943 -1.820810586422628e-01 +938 944 -1.132183869282763e-01 +938 945 -7.613960933881227e-02 +938 946 -5.413421453123236e-02 +938 947 -4.012781031913037e-02 +938 948 -3.072751892616545e-02 +938 949 -2.415034675252917e-02 +938 950 -1.939104886145126e-02 +938 951 -1.585023865775537e-02 +938 952 -1.315380302376555e-02 +938 953 -1.105916272470025e-02 +938 954 -9.403863770832811e-03 +938 955 -8.076052134892604e-03 +938 956 -6.996835383339623e-03 +938 957 -6.109381318875727e-03 +938 958 -5.371977266379786e-03 +938 959 -4.753493624956895e-03 +939 939 3.988394278128108e+01 +939 912 -2.532689975072680e-03 +939 913 -2.783725492315667e-03 +939 914 -3.071047067257401e-03 +939 915 -3.401691470521395e-03 +939 916 -3.784439171232929e-03 +939 917 -4.230349322908520e-03 +939 918 -4.753493624956896e-03 +939 919 -5.371977266379809e-03 +939 920 -6.109381318875733e-03 +939 921 -6.996835383339702e-03 +939 922 -8.076052134892594e-03 +939 923 -9.403863770832811e-03 +939 924 -1.105916272470025e-02 +939 925 -1.315380302376546e-02 +939 926 -1.585023865775526e-02 +939 927 -1.939104886145125e-02 +939 928 -2.415034675252896e-02 +939 929 -3.072751892616542e-02 +939 930 -4.012781031912993e-02 +939 931 -5.413421453123171e-02 +939 932 -7.613960933881238e-02 +939 933 -1.132183869282780e-01 +939 934 -1.820810586422679e-01 +939 935 -3.301555353436831e-01 +939 936 -7.412185823610395e-01 +939 937 -3.165206906282904e+00 +939 938 -1.502055215844912e+01 +939 940 -1.502055215852562e+01 +939 941 -3.165206906282850e+00 +939 942 -7.412185823610068e-01 +939 943 -3.301555353436718e-01 +939 944 -1.820810586422619e-01 +939 945 -1.132183869282745e-01 +939 946 -7.613960933881100e-02 +939 947 -5.413421453123172e-02 +939 948 -4.012781031912956e-02 +939 949 -3.072751892616543e-02 +939 950 -2.415034675252897e-02 +939 951 -1.939104886145111e-02 +939 952 -1.585023865775526e-02 +939 953 -1.315380302376538e-02 +939 954 -1.105916272470018e-02 +939 955 -9.403863770832827e-03 +939 956 -8.076052134892564e-03 +939 957 -6.996835383339671e-03 +939 958 -6.109381318875748e-03 +939 959 -5.371977266379821e-03 +940 940 3.988394278146367e+01 +940 912 -2.312252367280536e-03 +940 913 -2.532689975072674e-03 +940 914 -2.783725492315679e-03 +940 915 -3.071047067257393e-03 +940 916 -3.401691470521394e-03 +940 917 -3.784439171232916e-03 +940 918 -4.230349322908531e-03 +940 919 -4.753493624956895e-03 +940 920 -5.371977266379788e-03 +940 921 -6.109381318875769e-03 +940 922 -6.996835383339674e-03 +940 923 -8.076052134892582e-03 +940 924 -9.403863770832814e-03 +940 925 -1.105916272470025e-02 +940 926 -1.315380302376547e-02 +940 927 -1.585023865775537e-02 +940 928 -1.939104886145111e-02 +940 929 -2.415034675252897e-02 +940 930 -3.072751892616544e-02 +940 931 -4.012781031912998e-02 +940 932 -5.413421453123234e-02 +940 933 -7.613960933881209e-02 +940 934 -1.132183869282768e-01 +940 935 -1.820810586422668e-01 +940 936 -3.301555353436764e-01 +940 937 -7.412185823610228e-01 +940 938 -3.165206906282845e+00 +940 939 -1.502055215852562e+01 +940 941 -1.502055215863312e+01 +940 942 -3.165206906282856e+00 +940 943 -7.412185823610247e-01 +940 944 -3.301555353436780e-01 +940 945 -1.820810586422632e-01 +940 946 -1.132183869282743e-01 +940 947 -7.613960933881166e-02 +940 948 -5.413421453123109e-02 +940 949 -4.012781031912993e-02 +940 950 -3.072751892616544e-02 +940 951 -2.415034675252897e-02 +940 952 -1.939104886145110e-02 +940 953 -1.585023865775514e-02 +940 954 -1.315380302376537e-02 +940 955 -1.105916272470025e-02 +940 956 -9.403863770832814e-03 +940 957 -8.076052134892582e-03 +940 958 -6.996835383339674e-03 +940 959 -6.109381318875771e-03 +941 941 3.988394278171944e+01 +941 912 -2.117777896667799e-03 +941 913 -2.312252367280536e-03 +941 914 -2.532689975072691e-03 +941 915 -2.783725492315679e-03 +941 916 -3.071047067257401e-03 +941 917 -3.401691470521392e-03 +941 918 -3.784439171232936e-03 +941 919 -4.230349322908543e-03 +941 920 -4.753493624956895e-03 +941 921 -5.371977266379837e-03 +941 922 -6.109381318875769e-03 +941 923 -6.996835383339698e-03 +941 924 -8.076052134892594e-03 +941 925 -9.403863770832828e-03 +941 926 -1.105916272470026e-02 +941 927 -1.315380302376555e-02 +941 928 -1.585023865775526e-02 +941 929 -1.939104886145111e-02 +941 930 -2.415034675252897e-02 +941 931 -3.072751892616545e-02 +941 932 -4.012781031913037e-02 +941 933 -5.413421453123205e-02 +941 934 -7.613960933881150e-02 +941 935 -1.132183869282775e-01 +941 936 -1.820810586422690e-01 +941 937 -3.301555353436734e-01 +941 938 -7.412185823610017e-01 +941 939 -3.165206906282850e+00 +941 940 -1.502055215863312e+01 +941 942 -1.502055215878358e+01 +941 943 -3.165206906282849e+00 +941 944 -7.412185823610291e-01 +941 945 -3.301555353436807e-01 +941 946 -1.820810586422636e-01 +941 947 -1.132183869282770e-01 +941 948 -7.613960933881116e-02 +941 949 -5.413421453123168e-02 +941 950 -4.012781031912996e-02 +941 951 -3.072751892616544e-02 +941 952 -2.415034675252896e-02 +941 953 -1.939104886145095e-02 +941 954 -1.585023865775514e-02 +941 955 -1.315380302376546e-02 +941 956 -1.105916272470025e-02 +941 957 -9.403863770832814e-03 +941 958 -8.076052134892568e-03 +941 959 -6.996835383339677e-03 +942 942 3.988394278208168e+01 +942 912 -1.945462087124849e-03 +942 913 -2.117777896667785e-03 +942 914 -2.312252367280536e-03 +942 915 -2.532689975072674e-03 +942 916 -2.783725492315666e-03 +942 917 -3.071047067257377e-03 +942 918 -3.401691470521384e-03 +942 919 -3.784439171232917e-03 +942 920 -4.230349322908508e-03 +942 921 -4.753493624956895e-03 +942 922 -5.371977266379790e-03 +942 923 -6.109381318875730e-03 +942 924 -6.996835383339623e-03 +942 925 -8.076052134892564e-03 +942 926 -9.403863770832816e-03 +942 927 -1.105916272470032e-02 +942 928 -1.315380302376546e-02 +942 929 -1.585023865775525e-02 +942 930 -1.939104886145110e-02 +942 931 -2.415034675252897e-02 +942 932 -3.072751892616572e-02 +942 933 -4.012781031913017e-02 +942 934 -5.413421453123172e-02 +942 935 -7.613960933881185e-02 +942 936 -1.132183869282785e-01 +942 937 -1.820810586422667e-01 +942 938 -3.301555353436684e-01 +942 939 -7.412185823610068e-01 +942 940 -3.165206906282856e+00 +942 941 -1.502055215878358e+01 +942 943 -1.502055215899872e+01 +942 944 -3.165206906282910e+00 +942 945 -7.412185823610450e-01 +942 946 -3.301555353436741e-01 +942 947 -1.820810586422670e-01 +942 948 -1.132183869282772e-01 +942 949 -7.613960933881150e-02 +942 950 -5.413421453123175e-02 +942 951 -4.012781031912998e-02 +942 952 -3.072751892616545e-02 +942 953 -2.415034675252877e-02 +942 954 -1.939104886145096e-02 +942 955 -1.585023865775526e-02 +942 956 -1.315380302376547e-02 +942 957 -1.105916272470026e-02 +942 958 -9.403863770832832e-03 +942 959 -8.076052134892632e-03 +943 943 3.988394278260302e+01 +943 912 -1.792160480940038e-03 +943 913 -1.945462087124849e-03 +943 914 -2.117777896667799e-03 +943 915 -2.312252367280536e-03 +943 916 -2.532689975072680e-03 +943 917 -2.783725492315665e-03 +943 918 -3.071047067257392e-03 +943 919 -3.401691470521394e-03 +943 920 -3.784439171232917e-03 +943 921 -4.230349322908543e-03 +943 922 -4.753493624956895e-03 +943 923 -5.371977266379805e-03 +943 924 -6.109381318875727e-03 +943 925 -6.996835383339671e-03 +943 926 -8.076052134892570e-03 +943 927 -9.403863770832813e-03 +943 928 -1.105916272470019e-02 +943 929 -1.315380302376538e-02 +943 930 -1.585023865775514e-02 +943 931 -1.939104886145097e-02 +943 932 -2.415034675252897e-02 +943 933 -3.072751892616531e-02 +943 934 -4.012781031912956e-02 +943 935 -5.413421453123109e-02 +943 936 -7.613960933881120e-02 +943 937 -1.132183869282764e-01 +943 938 -1.820810586422628e-01 +943 939 -3.301555353436718e-01 +943 940 -7.412185823610247e-01 +943 941 -3.165206906282849e+00 +943 942 -1.502055215899872e+01 +943 944 -1.502055215931055e+01 +943 945 -3.165206906282864e+00 +943 946 -7.412185823610085e-01 +943 947 -3.301555353436788e-01 +943 948 -1.820810586422695e-01 +943 949 -1.132183869282787e-01 +943 950 -7.613960933881254e-02 +943 951 -5.413421453123234e-02 +943 952 -4.012781031913035e-02 +943 953 -3.072751892616543e-02 +943 954 -2.415034675252896e-02 +943 955 -1.939104886145125e-02 +943 956 -1.585023865775537e-02 +943 957 -1.315380302376555e-02 +943 958 -1.105916272470032e-02 +943 959 -9.403863770832830e-03 +944 944 3.988394278260304e+01 +944 928 -9.403863770832828e-03 +944 929 -1.105916272470025e-02 +944 930 -1.315380302376546e-02 +944 931 -1.585023865775526e-02 +944 932 -1.939104886145125e-02 +944 933 -2.415034675252906e-02 +944 934 -3.072751892616543e-02 +944 935 -4.012781031912993e-02 +944 936 -5.413421453123171e-02 +944 937 -7.613960933881239e-02 +944 938 -1.132183869282763e-01 +944 939 -1.820810586422619e-01 +944 940 -3.301555353436780e-01 +944 941 -7.412185823610291e-01 +944 942 -3.165206906282910e+00 +944 943 -1.502055215931055e+01 +944 945 -1.502055215899865e+01 +944 946 -3.165206906282866e+00 +944 947 -7.412185823610200e-01 +944 948 -3.301555353436787e-01 +944 949 -1.820810586422676e-01 +944 950 -1.132183869282770e-01 +944 951 -7.613960933881188e-02 +944 952 -5.413421453123172e-02 +944 953 -4.012781031912956e-02 +944 954 -3.072751892616515e-02 +944 955 -2.415034675252896e-02 +944 956 -1.939104886145111e-02 +944 957 -1.585023865775526e-02 +944 958 -1.315380302376546e-02 +944 959 -1.105916272470019e-02 +944 960 -9.403863770832811e-03 +944 961 -8.076052134892582e-03 +944 962 -6.996835383339698e-03 +944 963 -6.109381318875730e-03 +944 964 -5.371977266379805e-03 +944 965 -4.753493624956895e-03 +944 966 -4.230349322908545e-03 +944 967 -3.784439171232929e-03 +944 968 -3.401691470521394e-03 +944 969 -3.071047067257401e-03 +944 970 -2.783725492315666e-03 +944 971 -2.532689975072680e-03 +944 972 -2.312252367280536e-03 +944 973 -2.117777896667799e-03 +944 974 -1.945462087124854e-03 +944 975 -1.792160480940038e-03 +945 945 3.988394278208166e+01 +945 928 -8.076052134892642e-03 +945 929 -9.403863770832832e-03 +945 930 -1.105916272470025e-02 +945 931 -1.315380302376547e-02 +945 932 -1.585023865775537e-02 +945 933 -1.939104886145119e-02 +945 934 -2.415034675252897e-02 +945 935 -3.072751892616544e-02 +945 936 -4.012781031912998e-02 +945 937 -5.413421453123238e-02 +945 938 -7.613960933881227e-02 +945 939 -1.132183869282745e-01 +945 940 -1.820810586422632e-01 +945 941 -3.301555353436807e-01 +945 942 -7.412185823610450e-01 +945 943 -3.165206906282864e+00 +945 944 -1.502055215899865e+01 +945 946 -1.502055215878369e+01 +945 947 -3.165206906282834e+00 +945 948 -7.412185823610093e-01 +945 949 -3.301555353436760e-01 +945 950 -1.820810586422663e-01 +945 951 -1.132183869282771e-01 +945 952 -7.613960933881170e-02 +945 953 -5.413421453123108e-02 +945 954 -4.012781031912953e-02 +945 955 -3.072751892616542e-02 +945 956 -2.415034675252897e-02 +945 957 -1.939104886145111e-02 +945 958 -1.585023865775525e-02 +945 959 -1.315380302376538e-02 +945 960 -1.105916272470025e-02 +945 961 -9.403863770832814e-03 +945 962 -8.076052134892594e-03 +945 963 -6.996835383339623e-03 +945 964 -6.109381318875727e-03 +945 965 -5.371977266379786e-03 +945 966 -4.753493624956895e-03 +945 967 -4.230349322908520e-03 +945 968 -3.784439171232916e-03 +945 969 -3.401691470521392e-03 +945 970 -3.071047067257377e-03 +945 971 -2.783725492315665e-03 +945 972 -2.532689975072673e-03 +945 973 -2.312252367280536e-03 +945 974 -2.117777896667789e-03 +945 975 -1.945462087124849e-03 +946 946 3.988394278171946e+01 +946 928 -6.996835383339702e-03 +946 929 -8.076052134892583e-03 +946 930 -9.403863770832814e-03 +946 931 -1.105916272470026e-02 +946 932 -1.315380302376555e-02 +946 933 -1.585023865775532e-02 +946 934 -1.939104886145111e-02 +946 935 -2.415034675252897e-02 +946 936 -3.072751892616545e-02 +946 937 -4.012781031913039e-02 +946 938 -5.413421453123236e-02 +946 939 -7.613960933881100e-02 +946 940 -1.132183869282743e-01 +946 941 -1.820810586422636e-01 +946 942 -3.301555353436741e-01 +946 943 -7.412185823610085e-01 +946 944 -3.165206906282866e+00 +946 945 -1.502055215878369e+01 +946 947 -1.502055215863300e+01 +946 948 -3.165206906282867e+00 +946 949 -7.412185823610278e-01 +946 950 -3.301555353436821e-01 +946 951 -1.820810586422663e-01 +946 952 -1.132183869282770e-01 +946 953 -7.613960933881082e-02 +946 954 -5.413421453123106e-02 +946 955 -4.012781031912993e-02 +946 956 -3.072751892616544e-02 +946 957 -2.415034675252897e-02 +946 958 -1.939104886145110e-02 +946 959 -1.585023865775514e-02 +946 960 -1.315380302376546e-02 +946 961 -1.105916272470025e-02 +946 962 -9.403863770832828e-03 +946 963 -8.076052134892564e-03 +946 964 -6.996835383339671e-03 +946 965 -6.109381318875748e-03 +946 966 -5.371977266379821e-03 +946 967 -4.753493624956896e-03 +946 968 -4.230349322908531e-03 +946 969 -3.784439171232936e-03 +946 970 -3.401691470521384e-03 +946 971 -3.071047067257392e-03 +946 972 -2.783725492315671e-03 +946 973 -2.532689975072685e-03 +946 974 -2.312252367280536e-03 +946 975 -2.117777896667793e-03 +947 947 3.988394278146372e+01 +947 928 -6.109381318875769e-03 +947 929 -6.996835383339674e-03 +947 930 -8.076052134892582e-03 +947 931 -9.403863770832816e-03 +947 932 -1.105916272470032e-02 +947 933 -1.315380302376550e-02 +947 934 -1.585023865775526e-02 +947 935 -1.939104886145110e-02 +947 936 -2.415034675252897e-02 +947 937 -3.072751892616573e-02 +947 938 -4.012781031913037e-02 +947 939 -5.413421453123172e-02 +947 940 -7.613960933881166e-02 +947 941 -1.132183869282770e-01 +947 942 -1.820810586422670e-01 +947 943 -3.301555353436788e-01 +947 944 -7.412185823610200e-01 +947 945 -3.165206906282834e+00 +947 946 -1.502055215863300e+01 +947 948 -1.502055215852574e+01 +947 949 -3.165206906282894e+00 +947 950 -7.412185823610462e-01 +947 951 -3.301555353436728e-01 +947 952 -1.820810586422615e-01 +947 953 -1.132183869282731e-01 +947 954 -7.613960933881045e-02 +947 955 -5.413421453123171e-02 +947 956 -4.012781031912998e-02 +947 957 -3.072751892616545e-02 +947 958 -2.415034675252897e-02 +947 959 -1.939104886145097e-02 +947 960 -1.585023865775526e-02 +947 961 -1.315380302376547e-02 +947 962 -1.105916272470026e-02 +947 963 -9.403863770832816e-03 +947 964 -8.076052134892570e-03 +947 965 -6.996835383339674e-03 +947 966 -6.109381318875771e-03 +947 967 -5.371977266379809e-03 +947 968 -4.753493624956895e-03 +947 969 -4.230349322908543e-03 +947 970 -3.784439171232917e-03 +947 971 -3.401691470521394e-03 +947 972 -3.071047067257393e-03 +947 973 -2.783725492315679e-03 +947 974 -2.532689975072680e-03 +947 975 -2.312252367280536e-03 +948 948 3.988394278128113e+01 +948 928 -5.371977266379837e-03 +948 929 -6.109381318875769e-03 +948 930 -6.996835383339698e-03 +948 931 -8.076052134892583e-03 +948 932 -9.403863770832827e-03 +948 933 -1.105916272470022e-02 +948 934 -1.315380302376538e-02 +948 935 -1.585023865775514e-02 +948 936 -1.939104886145097e-02 +948 937 -2.415034675252898e-02 +948 938 -3.072751892616545e-02 +948 939 -4.012781031912956e-02 +948 940 -5.413421453123109e-02 +948 941 -7.613960933881116e-02 +948 942 -1.132183869282772e-01 +948 943 -1.820810586422695e-01 +948 944 -3.301555353436787e-01 +948 945 -7.412185823610093e-01 +948 946 -3.165206906282867e+00 +948 947 -1.502055215852574e+01 +948 949 -1.502055215844907e+01 +948 950 -3.165206906282896e+00 +948 951 -7.412185823610254e-01 +948 952 -3.301555353436710e-01 +948 953 -1.820810586422611e-01 +948 954 -1.132183869282749e-01 +948 955 -7.613960933881238e-02 +948 956 -5.413421453123234e-02 +948 957 -4.012781031913037e-02 +948 958 -3.072751892616572e-02 +948 959 -2.415034675252897e-02 +948 960 -1.939104886145125e-02 +948 961 -1.585023865775537e-02 +948 962 -1.315380302376555e-02 +948 963 -1.105916272470032e-02 +948 964 -9.403863770832813e-03 +948 965 -8.076052134892578e-03 +948 966 -6.996835383339677e-03 +948 967 -6.109381318875733e-03 +948 968 -5.371977266379788e-03 +948 969 -4.753493624956895e-03 +948 970 -4.230349322908508e-03 +948 971 -3.784439171232917e-03 +948 972 -3.401691470521385e-03 +948 973 -3.071047067257394e-03 +948 974 -2.783725492315667e-03 +948 975 -2.532689975072674e-03 +949 949 3.988394278115155e+01 +949 928 -4.753493624956895e-03 +949 929 -5.371977266379790e-03 +949 930 -6.109381318875730e-03 +949 931 -6.996835383339623e-03 +949 932 -8.076052134892575e-03 +949 933 -9.403863770832839e-03 +949 934 -1.105916272470025e-02 +949 935 -1.315380302376546e-02 +949 936 -1.585023865775526e-02 +949 937 -1.939104886145126e-02 +949 938 -2.415034675252917e-02 +949 939 -3.072751892616543e-02 +949 940 -4.012781031912993e-02 +949 941 -5.413421453123168e-02 +949 942 -7.613960933881150e-02 +949 943 -1.132183869282787e-01 +949 944 -1.820810586422676e-01 +949 945 -3.301555353436760e-01 +949 946 -7.412185823610278e-01 +949 947 -3.165206906282894e+00 +949 948 -1.502055215844907e+01 +949 950 -1.502055215839540e+01 +949 951 -3.165206906282885e+00 +949 952 -7.412185823610058e-01 +949 953 -3.301555353436754e-01 +949 954 -1.820810586422646e-01 +949 955 -1.132183869282771e-01 +949 956 -7.613960933881168e-02 +949 957 -5.413421453123173e-02 +949 958 -4.012781031912996e-02 +949 959 -3.072751892616516e-02 +949 960 -2.415034675252896e-02 +949 961 -1.939104886145111e-02 +949 962 -1.585023865775526e-02 +949 963 -1.315380302376546e-02 +949 964 -1.105916272470019e-02 +949 965 -9.403863770832828e-03 +949 966 -8.076052134892642e-03 +949 967 -6.996835383339702e-03 +949 968 -6.109381318875769e-03 +949 969 -5.371977266379837e-03 +949 970 -4.753493624956895e-03 +949 971 -4.230349322908543e-03 +949 972 -3.784439171232937e-03 +949 973 -3.401691470521412e-03 +949 974 -3.071047067257401e-03 +949 975 -2.783725492315679e-03 +950 950 3.988394278106475e+01 +950 928 -4.230349322908543e-03 +950 929 -4.753493624956895e-03 +950 930 -5.371977266379805e-03 +950 931 -6.109381318875727e-03 +950 932 -6.996835383339671e-03 +950 933 -8.076052134892594e-03 +950 934 -9.403863770832814e-03 +950 935 -1.105916272470025e-02 +950 936 -1.315380302376547e-02 +950 937 -1.585023865775537e-02 +950 938 -1.939104886145126e-02 +950 939 -2.415034675252897e-02 +950 940 -3.072751892616544e-02 +950 941 -4.012781031912996e-02 +950 942 -5.413421453123175e-02 +950 943 -7.613960933881254e-02 +950 944 -1.132183869282770e-01 +950 945 -1.820810586422663e-01 +950 946 -3.301555353436821e-01 +950 947 -7.412185823610462e-01 +950 948 -3.165206906282896e+00 +950 949 -1.502055215839540e+01 +950 951 -1.502055215836223e+01 +950 952 -3.165206906282807e+00 +950 953 -7.412185823610051e-01 +950 954 -3.301555353436751e-01 +950 955 -1.820810586422675e-01 +950 956 -1.132183869282768e-01 +950 957 -7.613960933881148e-02 +950 958 -5.413421453123170e-02 +950 959 -4.012781031912955e-02 +950 960 -3.072751892616542e-02 +950 961 -2.415034675252897e-02 +950 962 -1.939104886145111e-02 +950 963 -1.585023865775525e-02 +950 964 -1.315380302376538e-02 +950 965 -1.105916272470025e-02 +950 966 -9.403863770832832e-03 +950 967 -8.076052134892583e-03 +950 968 -6.996835383339674e-03 +950 969 -6.109381318875769e-03 +950 970 -5.371977266379790e-03 +950 971 -4.753493624956895e-03 +950 972 -4.230349322908531e-03 +950 973 -3.784439171232939e-03 +950 974 -3.401691470521395e-03 +950 975 -3.071047067257393e-03 +951 951 3.988394278102297e+01 +951 928 -3.784439171232937e-03 +951 929 -4.230349322908531e-03 +951 930 -4.753493624956895e-03 +951 931 -5.371977266379786e-03 +951 932 -6.109381318875748e-03 +951 933 -6.996835383339674e-03 +951 934 -8.076052134892568e-03 +951 935 -9.403863770832830e-03 +951 936 -1.105916272470026e-02 +951 937 -1.315380302376555e-02 +951 938 -1.585023865775537e-02 +951 939 -1.939104886145111e-02 +951 940 -2.415034675252897e-02 +951 941 -3.072751892616544e-02 +951 942 -4.012781031912998e-02 +951 943 -5.413421453123234e-02 +951 944 -7.613960933881188e-02 +951 945 -1.132183869282771e-01 +951 946 -1.820810586422663e-01 +951 947 -3.301555353436728e-01 +951 948 -7.412185823610254e-01 +951 949 -3.165206906282885e+00 +951 950 -1.502055215836223e+01 +951 952 -1.502055215835478e+01 +951 953 -3.165206906282861e+00 +951 954 -7.412185823610311e-01 +951 955 -3.301555353436831e-01 +951 956 -1.820810586422672e-01 +951 957 -1.132183869282774e-01 +951 958 -7.613960933881184e-02 +951 959 -5.413421453123109e-02 +951 960 -4.012781031912993e-02 +951 961 -3.072751892616544e-02 +951 962 -2.415034675252897e-02 +951 963 -1.939104886145110e-02 +951 964 -1.585023865775514e-02 +951 965 -1.315380302376546e-02 +951 966 -1.105916272470025e-02 +951 967 -9.403863770832814e-03 +951 968 -8.076052134892582e-03 +951 969 -6.996835383339698e-03 +951 970 -6.109381318875730e-03 +951 971 -5.371977266379805e-03 +951 972 -4.753493624956895e-03 +951 973 -4.230349322908545e-03 +951 974 -3.784439171232929e-03 +951 975 -3.401691470521394e-03 +952 952 3.988394278105610e+01 +952 928 -3.401691470521412e-03 +952 929 -3.784439171232939e-03 +952 930 -4.230349322908545e-03 +952 931 -4.753493624956895e-03 +952 932 -5.371977266379821e-03 +952 933 -6.109381318875771e-03 +952 934 -6.996835383339677e-03 +952 935 -8.076052134892642e-03 +952 936 -9.403863770832833e-03 +952 937 -1.105916272470032e-02 +952 938 -1.315380302376555e-02 +952 939 -1.585023865775526e-02 +952 940 -1.939104886145110e-02 +952 941 -2.415034675252896e-02 +952 942 -3.072751892616545e-02 +952 943 -4.012781031913035e-02 +952 944 -5.413421453123172e-02 +952 945 -7.613960933881170e-02 +952 946 -1.132183869282770e-01 +952 947 -1.820810586422615e-01 +952 948 -3.301555353436710e-01 +952 949 -7.412185823610058e-01 +952 950 -3.165206906282807e+00 +952 951 -1.502055215835478e+01 +952 953 -1.502055215840055e+01 +952 954 -3.165206906282917e+00 +952 955 -7.412185823610593e-01 +952 956 -3.301555353436823e-01 +952 957 -1.820810586422667e-01 +952 958 -1.132183869282776e-01 +952 959 -7.613960933881120e-02 +952 960 -5.413421453123171e-02 +952 961 -4.012781031912998e-02 +952 962 -3.072751892616545e-02 +952 963 -2.415034675252897e-02 +952 964 -1.939104886145097e-02 +952 965 -1.585023865775526e-02 +952 966 -1.315380302376547e-02 +952 967 -1.105916272470026e-02 +952 968 -9.403863770832816e-03 +952 969 -8.076052134892583e-03 +952 970 -6.996835383339623e-03 +952 971 -6.109381318875727e-03 +952 972 -5.371977266379786e-03 +952 973 -4.753493624956895e-03 +952 974 -4.230349322908520e-03 +952 975 -3.784439171232916e-03 +953 953 3.988394278128567e+01 +953 928 -3.071047067257401e-03 +953 929 -3.401691470521395e-03 +953 930 -3.784439171232929e-03 +953 931 -4.230349322908520e-03 +953 932 -4.753493624956896e-03 +953 933 -5.371977266379809e-03 +953 934 -6.109381318875733e-03 +953 935 -6.996835383339702e-03 +953 936 -8.076052134892573e-03 +953 937 -9.403863770832814e-03 +953 938 -1.105916272470025e-02 +953 939 -1.315380302376538e-02 +953 940 -1.585023865775514e-02 +953 941 -1.939104886145095e-02 +953 942 -2.415034675252877e-02 +953 943 -3.072751892616543e-02 +953 944 -4.012781031912956e-02 +953 945 -5.413421453123108e-02 +953 946 -7.613960933881082e-02 +953 947 -1.132183869282731e-01 +953 948 -1.820810586422611e-01 +953 949 -3.301555353436754e-01 +953 950 -7.412185823610051e-01 +953 951 -3.165206906282861e+00 +953 952 -1.502055215840055e+01 +953 954 -1.502055215860526e+01 +953 955 -3.165206906282902e+00 +953 956 -7.412185823610342e-01 +953 957 -3.301555353436761e-01 +953 958 -1.820810586422679e-01 +953 959 -1.132183869282780e-01 +953 960 -7.613960933881239e-02 +953 961 -5.413421453123238e-02 +953 962 -4.012781031913039e-02 +953 963 -3.072751892616573e-02 +953 964 -2.415034675252898e-02 +953 965 -1.939104886145126e-02 +953 966 -1.585023865775537e-02 +953 967 -1.315380302376555e-02 +953 968 -1.105916272470032e-02 +953 969 -9.403863770832830e-03 +953 970 -8.076052134892577e-03 +953 971 -6.996835383339671e-03 +953 972 -6.109381318875748e-03 +953 973 -5.371977266379821e-03 +953 974 -4.753493624956896e-03 +953 975 -4.230349322908531e-03 +954 954 3.988394278152494e+01 +954 928 -2.783725492315679e-03 +954 929 -3.071047067257393e-03 +954 930 -3.401691470521394e-03 +954 931 -3.784439171232916e-03 +954 932 -4.230349322908531e-03 +954 933 -4.753493624956895e-03 +954 934 -5.371977266379788e-03 +954 935 -6.109381318875769e-03 +954 936 -6.996835383339674e-03 +954 937 -8.076052134892580e-03 +954 938 -9.403863770832811e-03 +954 939 -1.105916272470018e-02 +954 940 -1.315380302376537e-02 +954 941 -1.585023865775514e-02 +954 942 -1.939104886145096e-02 +954 943 -2.415034675252896e-02 +954 944 -3.072751892616515e-02 +954 945 -4.012781031912953e-02 +954 946 -5.413421453123106e-02 +954 947 -7.613960933881045e-02 +954 948 -1.132183869282749e-01 +954 949 -1.820810586422646e-01 +954 950 -3.301555353436751e-01 +954 951 -7.412185823610311e-01 +954 952 -3.165206906282917e+00 +954 953 -1.502055215860526e+01 +954 955 -1.502055215859226e+01 +954 956 -3.165206906282844e+00 +954 957 -7.412185823609989e-01 +954 958 -3.301555353436738e-01 +954 959 -1.820810586422655e-01 +954 960 -1.132183869282758e-01 +954 961 -7.613960933881227e-02 +954 962 -5.413421453123236e-02 +954 963 -4.012781031913037e-02 +954 964 -3.072751892616545e-02 +954 965 -2.415034675252917e-02 +954 966 -1.939104886145126e-02 +954 967 -1.585023865775537e-02 +954 968 -1.315380302376555e-02 +954 969 -1.105916272470025e-02 +954 970 -9.403863770832839e-03 +954 971 -8.076052134892592e-03 +954 972 -6.996835383339674e-03 +954 973 -6.109381318875771e-03 +954 974 -5.371977266379809e-03 +954 975 -4.753493624956895e-03 +955 955 3.988394278151348e+01 +955 928 -2.532689975072691e-03 +955 929 -2.783725492315679e-03 +955 930 -3.071047067257401e-03 +955 931 -3.401691470521392e-03 +955 932 -3.784439171232936e-03 +955 933 -4.230349322908543e-03 +955 934 -4.753493624956895e-03 +955 935 -5.371977266379837e-03 +955 936 -6.109381318875769e-03 +955 937 -6.996835383339698e-03 +955 938 -8.076052134892604e-03 +955 939 -9.403863770832827e-03 +955 940 -1.105916272470025e-02 +955 941 -1.315380302376546e-02 +955 942 -1.585023865775526e-02 +955 943 -1.939104886145125e-02 +955 944 -2.415034675252896e-02 +955 945 -3.072751892616542e-02 +955 946 -4.012781031912993e-02 +955 947 -5.413421453123171e-02 +955 948 -7.613960933881238e-02 +955 949 -1.132183869282771e-01 +955 950 -1.820810586422675e-01 +955 951 -3.301555353436831e-01 +955 952 -7.412185823610593e-01 +955 953 -3.165206906282902e+00 +955 954 -1.502055215859226e+01 +955 956 -1.502055215859644e+01 +955 957 -3.165206906282771e+00 +955 958 -7.412185823609941e-01 +955 959 -3.301555353436720e-01 +955 960 -1.820810586422624e-01 +955 961 -1.132183869282745e-01 +955 962 -7.613960933881121e-02 +955 963 -5.413421453123172e-02 +955 964 -4.012781031912956e-02 +955 965 -3.072751892616543e-02 +955 966 -2.415034675252897e-02 +955 967 -1.939104886145111e-02 +955 968 -1.585023865775526e-02 +955 969 -1.315380302376538e-02 +955 970 -1.105916272470022e-02 +955 971 -9.403863770832811e-03 +955 972 -8.076052134892568e-03 +955 973 -6.996835383339677e-03 +955 974 -6.109381318875733e-03 +955 975 -5.371977266379788e-03 +956 956 3.988394278151423e+01 +956 928 -2.312252367280536e-03 +956 929 -2.532689975072674e-03 +956 930 -2.783725492315666e-03 +956 931 -3.071047067257377e-03 +956 932 -3.401691470521384e-03 +956 933 -3.784439171232917e-03 +956 934 -4.230349322908508e-03 +956 935 -4.753493624956895e-03 +956 936 -5.371977266379790e-03 +956 937 -6.109381318875730e-03 +956 938 -6.996835383339623e-03 +956 939 -8.076052134892564e-03 +956 940 -9.403863770832814e-03 +956 941 -1.105916272470025e-02 +956 942 -1.315380302376547e-02 +956 943 -1.585023865775537e-02 +956 944 -1.939104886145111e-02 +956 945 -2.415034675252897e-02 +956 946 -3.072751892616544e-02 +956 947 -4.012781031912998e-02 +956 948 -5.413421453123234e-02 +956 949 -7.613960933881168e-02 +956 950 -1.132183869282768e-01 +956 951 -1.820810586422672e-01 +956 952 -3.301555353436823e-01 +956 953 -7.412185823610342e-01 +956 954 -3.165206906282844e+00 +956 955 -1.502055215859644e+01 +956 957 -1.502055215858794e+01 +956 958 -3.165206906282851e+00 +956 959 -7.412185823610276e-01 +956 960 -3.301555353436782e-01 +956 961 -1.820810586422635e-01 +956 962 -1.132183869282758e-01 +956 963 -7.613960933881130e-02 +956 964 -5.413421453123109e-02 +956 965 -4.012781031912993e-02 +956 966 -3.072751892616544e-02 +956 967 -2.415034675252897e-02 +956 968 -1.939104886145110e-02 +956 969 -1.585023865775514e-02 +956 970 -1.315380302376542e-02 +956 971 -1.105916272470025e-02 +956 972 -9.403863770832830e-03 +956 973 -8.076052134892642e-03 +956 974 -6.996835383339702e-03 +956 975 -6.109381318875769e-03 +957 957 3.988394278153921e+01 +957 928 -2.117777896667799e-03 +957 929 -2.312252367280536e-03 +957 930 -2.532689975072680e-03 +957 931 -2.783725492315665e-03 +957 932 -3.071047067257392e-03 +957 933 -3.401691470521394e-03 +957 934 -3.784439171232917e-03 +957 935 -4.230349322908543e-03 +957 936 -4.753493624956895e-03 +957 937 -5.371977266379805e-03 +957 938 -6.109381318875727e-03 +957 939 -6.996835383339671e-03 +957 940 -8.076052134892582e-03 +957 941 -9.403863770832814e-03 +957 942 -1.105916272470026e-02 +957 943 -1.315380302376555e-02 +957 944 -1.585023865775526e-02 +957 945 -1.939104886145111e-02 +957 946 -2.415034675252897e-02 +957 947 -3.072751892616545e-02 +957 948 -4.012781031913037e-02 +957 949 -5.413421453123173e-02 +957 950 -7.613960933881148e-02 +957 951 -1.132183869282774e-01 +957 952 -1.820810586422667e-01 +957 953 -3.301555353436761e-01 +957 954 -7.412185823609989e-01 +957 955 -3.165206906282771e+00 +957 956 -1.502055215858794e+01 +957 958 -1.502055215864006e+01 +957 959 -3.165206906282894e+00 +957 960 -7.412185823610564e-01 +957 961 -3.301555353436816e-01 +957 962 -1.820810586422651e-01 +957 963 -1.132183869282745e-01 +957 964 -7.613960933881099e-02 +957 965 -5.413421453123168e-02 +957 966 -4.012781031912996e-02 +957 967 -3.072751892616544e-02 +957 968 -2.415034675252896e-02 +957 969 -1.939104886145096e-02 +957 970 -1.585023865775520e-02 +957 971 -1.315380302376546e-02 +957 972 -1.105916272470025e-02 +957 973 -9.403863770832830e-03 +957 974 -8.076052134892571e-03 +957 975 -6.996835383339674e-03 +958 958 3.988394278164018e+01 +958 928 -1.945462087124857e-03 +958 929 -2.117777896667794e-03 +958 930 -2.312252367280536e-03 +958 931 -2.532689975072673e-03 +958 932 -2.783725492315671e-03 +958 933 -3.071047067257393e-03 +958 934 -3.401691470521385e-03 +958 935 -3.784439171232937e-03 +958 936 -4.230349322908531e-03 +958 937 -4.753493624956895e-03 +958 938 -5.371977266379786e-03 +958 939 -6.109381318875748e-03 +958 940 -6.996835383339674e-03 +958 941 -8.076052134892568e-03 +958 942 -9.403863770832832e-03 +958 943 -1.105916272470032e-02 +958 944 -1.315380302376546e-02 +958 945 -1.585023865775525e-02 +958 946 -1.939104886145110e-02 +958 947 -2.415034675252897e-02 +958 948 -3.072751892616572e-02 +958 949 -4.012781031912996e-02 +958 950 -5.413421453123170e-02 +958 951 -7.613960933881184e-02 +958 952 -1.132183869282776e-01 +958 953 -1.820810586422679e-01 +958 954 -3.301555353436738e-01 +958 955 -7.412185823609941e-01 +958 956 -3.165206906282851e+00 +958 957 -1.502055215864006e+01 +958 959 -1.502055215865995e+01 +958 960 -3.165206906282914e+00 +958 961 -7.412185823610465e-01 +958 962 -3.301555353436824e-01 +958 963 -1.820810586422636e-01 +958 964 -1.132183869282767e-01 +958 965 -7.613960933881186e-02 +958 966 -5.413421453123175e-02 +958 967 -4.012781031912998e-02 +958 968 -3.072751892616545e-02 +958 969 -2.415034675252878e-02 +958 970 -1.939104886145103e-02 +958 971 -1.585023865775526e-02 +958 972 -1.315380302376547e-02 +958 973 -1.105916272470026e-02 +958 974 -9.403863770832771e-03 +958 975 -8.076052134892570e-03 +959 959 3.988394278169689e+01 +959 928 -1.792160480940046e-03 +959 929 -1.945462087124857e-03 +959 930 -2.117777896667799e-03 +959 931 -2.312252367280536e-03 +959 932 -2.532689975072685e-03 +959 933 -2.783725492315679e-03 +959 934 -3.071047067257394e-03 +959 935 -3.401691470521412e-03 +959 936 -3.784439171232939e-03 +959 937 -4.230349322908545e-03 +959 938 -4.753493624956895e-03 +959 939 -5.371977266379821e-03 +959 940 -6.109381318875771e-03 +959 941 -6.996835383339677e-03 +959 942 -8.076052134892632e-03 +959 943 -9.403863770832830e-03 +959 944 -1.105916272470019e-02 +959 945 -1.315380302376538e-02 +959 946 -1.585023865775514e-02 +959 947 -1.939104886145097e-02 +959 948 -2.415034675252897e-02 +959 949 -3.072751892616516e-02 +959 950 -4.012781031912955e-02 +959 951 -5.413421453123109e-02 +959 952 -7.613960933881120e-02 +959 953 -1.132183869282780e-01 +959 954 -1.820810586422655e-01 +959 955 -3.301555353436720e-01 +959 956 -7.412185823610276e-01 +959 957 -3.165206906282894e+00 +959 958 -1.502055215865995e+01 +959 960 -1.502055215931074e+01 +959 961 -3.165206906282866e+00 +959 962 -7.412185823610155e-01 +959 963 -3.301555353436741e-01 +959 964 -1.820810586422659e-01 +959 965 -1.132183869282789e-01 +959 966 -7.613960933881235e-02 +959 967 -5.413421453123234e-02 +959 968 -4.012781031913035e-02 +959 969 -3.072751892616544e-02 +959 970 -2.415034675252906e-02 +959 971 -1.939104886145125e-02 +959 972 -1.585023865775537e-02 +959 973 -1.315380302376555e-02 +959 974 -1.105916272470025e-02 +959 975 -9.403863770832811e-03 +960 960 3.988394278169693e+01 +960 944 -9.403863770832811e-03 +960 945 -1.105916272470025e-02 +960 946 -1.315380302376546e-02 +960 947 -1.585023865775526e-02 +960 948 -1.939104886145125e-02 +960 949 -2.415034675252896e-02 +960 950 -3.072751892616542e-02 +960 951 -4.012781031912993e-02 +960 952 -5.413421453123171e-02 +960 953 -7.613960933881239e-02 +960 954 -1.132183869282758e-01 +960 955 -1.820810586422624e-01 +960 956 -3.301555353436782e-01 +960 957 -7.412185823610564e-01 +960 958 -3.165206906282914e+00 +960 959 -1.502055215931074e+01 +960 961 -1.502055215865992e+01 +960 962 -3.165206906282808e+00 +960 963 -7.412185823609990e-01 +960 964 -3.301555353436734e-01 +960 965 -1.820810586422694e-01 +960 966 -1.132183869282770e-01 +960 967 -7.613960933881186e-02 +960 968 -5.413421453123172e-02 +960 969 -4.012781031912956e-02 +960 970 -3.072751892616529e-02 +960 971 -2.415034675252896e-02 +960 972 -1.939104886145111e-02 +960 973 -1.585023865775526e-02 +960 974 -1.315380302376538e-02 +960 975 -1.105916272470018e-02 +960 976 -9.403863770832827e-03 +960 977 -8.076052134892564e-03 +960 978 -6.996835383339671e-03 +960 979 -6.109381318875748e-03 +960 980 -5.371977266379821e-03 +960 981 -4.753493624956896e-03 +960 982 -4.230349322908531e-03 +960 983 -3.784439171232936e-03 +960 984 -3.401691470521384e-03 +960 985 -3.071047067257392e-03 +960 986 -2.783725492315671e-03 +960 987 -2.532689975072685e-03 +960 988 -2.312252367280536e-03 +960 989 -2.117777896667793e-03 +960 990 -1.945462087124857e-03 +960 991 -1.792160480940034e-03 +961 961 3.988394278164005e+01 +961 944 -8.076052134892582e-03 +961 945 -9.403863770832814e-03 +961 946 -1.105916272470025e-02 +961 947 -1.315380302376547e-02 +961 948 -1.585023865775537e-02 +961 949 -1.939104886145111e-02 +961 950 -2.415034675252897e-02 +961 951 -3.072751892616544e-02 +961 952 -4.012781031912998e-02 +961 953 -5.413421453123238e-02 +961 954 -7.613960933881227e-02 +961 955 -1.132183869282745e-01 +961 956 -1.820810586422635e-01 +961 957 -3.301555353436816e-01 +961 958 -7.412185823610465e-01 +961 959 -3.165206906282866e+00 +961 960 -1.502055215865992e+01 +961 962 -1.502055215863999e+01 +961 963 -3.165206906282856e+00 +961 964 -7.412185823610207e-01 +961 965 -3.301555353436738e-01 +961 966 -1.820810586422648e-01 +961 967 -1.132183869282770e-01 +961 968 -7.613960933881168e-02 +961 969 -5.413421453123109e-02 +961 970 -4.012781031912974e-02 +961 971 -3.072751892616542e-02 +961 972 -2.415034675252897e-02 +961 973 -1.939104886145110e-02 +961 974 -1.585023865775514e-02 +961 975 -1.315380302376537e-02 +961 976 -1.105916272470025e-02 +961 977 -9.403863770832814e-03 +961 978 -8.076052134892582e-03 +961 979 -6.996835383339674e-03 +961 980 -6.109381318875771e-03 +961 981 -5.371977266379809e-03 +961 982 -4.753493624956895e-03 +961 983 -4.230349322908543e-03 +961 984 -3.784439171232917e-03 +961 985 -3.401691470521394e-03 +961 986 -3.071047067257393e-03 +961 987 -2.783725492315679e-03 +961 988 -2.532689975072680e-03 +961 989 -2.312252367280536e-03 +961 990 -2.117777896667799e-03 +961 991 -1.945462087124849e-03 +962 962 3.988394278153928e+01 +962 944 -6.996835383339698e-03 +962 945 -8.076052134892594e-03 +962 946 -9.403863770832828e-03 +962 947 -1.105916272470026e-02 +962 948 -1.315380302376555e-02 +962 949 -1.585023865775526e-02 +962 950 -1.939104886145111e-02 +962 951 -2.415034675252897e-02 +962 952 -3.072751892616545e-02 +962 953 -4.012781031913039e-02 +962 954 -5.413421453123236e-02 +962 955 -7.613960933881121e-02 +962 956 -1.132183869282758e-01 +962 957 -1.820810586422651e-01 +962 958 -3.301555353436824e-01 +962 959 -7.412185823610155e-01 +962 960 -3.165206906282808e+00 +962 961 -1.502055215863999e+01 +962 963 -1.502055215858804e+01 +962 964 -3.165206906282896e+00 +962 965 -7.412185823610298e-01 +962 966 -3.301555353436690e-01 +962 967 -1.820810586422633e-01 +962 968 -1.132183869282766e-01 +962 969 -7.613960933881102e-02 +962 970 -5.413421453123138e-02 +962 971 -4.012781031912993e-02 +962 972 -3.072751892616544e-02 +962 973 -2.415034675252896e-02 +962 974 -1.939104886145095e-02 +962 975 -1.585023865775514e-02 +962 976 -1.315380302376546e-02 +962 977 -1.105916272470025e-02 +962 978 -9.403863770832814e-03 +962 979 -8.076052134892568e-03 +962 980 -6.996835383339677e-03 +962 981 -6.109381318875733e-03 +962 982 -5.371977266379788e-03 +962 983 -4.753493624956895e-03 +962 984 -4.230349322908508e-03 +962 985 -3.784439171232917e-03 +962 986 -3.401691470521385e-03 +962 987 -3.071047067257394e-03 +962 988 -2.783725492315667e-03 +962 989 -2.532689975072674e-03 +962 990 -2.312252367280536e-03 +962 991 -2.117777896667785e-03 +963 963 3.988394278151442e+01 +963 944 -6.109381318875730e-03 +963 945 -6.996835383339623e-03 +963 946 -8.076052134892564e-03 +963 947 -9.403863770832816e-03 +963 948 -1.105916272470032e-02 +963 949 -1.315380302376546e-02 +963 950 -1.585023865775525e-02 +963 951 -1.939104886145110e-02 +963 952 -2.415034675252897e-02 +963 953 -3.072751892616573e-02 +963 954 -4.012781031913037e-02 +963 955 -5.413421453123172e-02 +963 956 -7.613960933881130e-02 +963 957 -1.132183869282745e-01 +963 958 -1.820810586422636e-01 +963 959 -3.301555353436741e-01 +963 960 -7.412185823609990e-01 +963 961 -3.165206906282856e+00 +963 962 -1.502055215858804e+01 +963 964 -1.502055215859653e+01 +963 965 -3.165206906282883e+00 +963 966 -7.412185823610171e-01 +963 967 -3.301555353436774e-01 +963 968 -1.820810586422675e-01 +963 969 -1.132183869282767e-01 +963 970 -7.613960933881106e-02 +963 971 -5.413421453123171e-02 +963 972 -4.012781031912998e-02 +963 973 -3.072751892616545e-02 +963 974 -2.415034675252877e-02 +963 975 -1.939104886145096e-02 +963 976 -1.585023865775526e-02 +963 977 -1.315380302376547e-02 +963 978 -1.105916272470026e-02 +963 979 -9.403863770832832e-03 +963 980 -8.076052134892632e-03 +963 981 -6.996835383339702e-03 +963 982 -6.109381318875769e-03 +963 983 -5.371977266379837e-03 +963 984 -4.753493624956895e-03 +963 985 -4.230349322908543e-03 +963 986 -3.784439171232937e-03 +963 987 -3.401691470521412e-03 +963 988 -3.071047067257401e-03 +963 989 -2.783725492315679e-03 +963 990 -2.532689975072691e-03 +963 991 -2.312252367280536e-03 +964 964 3.988394278151359e+01 +964 944 -5.371977266379805e-03 +964 945 -6.109381318875727e-03 +964 946 -6.996835383339671e-03 +964 947 -8.076052134892570e-03 +964 948 -9.403863770832813e-03 +964 949 -1.105916272470019e-02 +964 950 -1.315380302376538e-02 +964 951 -1.585023865775514e-02 +964 952 -1.939104886145097e-02 +964 953 -2.415034675252898e-02 +964 954 -3.072751892616545e-02 +964 955 -4.012781031912956e-02 +964 956 -5.413421453123109e-02 +964 957 -7.613960933881099e-02 +964 958 -1.132183869282767e-01 +964 959 -1.820810586422659e-01 +964 960 -3.301555353436734e-01 +964 961 -7.412185823610207e-01 +964 962 -3.165206906282896e+00 +964 963 -1.502055215859653e+01 +964 965 -1.502055215859221e+01 +964 966 -3.165206906282858e+00 +964 967 -7.412185823610218e-01 +964 968 -3.301555353436807e-01 +964 969 -1.820810586422620e-01 +964 970 -1.132183869282738e-01 +964 971 -7.613960933881185e-02 +964 972 -5.413421453123234e-02 +964 973 -4.012781031913035e-02 +964 974 -3.072751892616543e-02 +964 975 -2.415034675252896e-02 +964 976 -1.939104886145125e-02 +964 977 -1.585023865775537e-02 +964 978 -1.315380302376555e-02 +964 979 -1.105916272470032e-02 +964 980 -9.403863770832830e-03 +964 981 -8.076052134892594e-03 +964 982 -6.996835383339674e-03 +964 983 -6.109381318875769e-03 +964 984 -5.371977266379790e-03 +964 985 -4.753493624956895e-03 +964 986 -4.230349322908531e-03 +964 987 -3.784439171232939e-03 +964 988 -3.401691470521395e-03 +964 989 -3.071047067257393e-03 +964 990 -2.783725492315679e-03 +964 991 -2.532689975072674e-03 +965 965 3.988394278152497e+01 +965 944 -4.753493624956895e-03 +965 945 -5.371977266379786e-03 +965 946 -6.109381318875748e-03 +965 947 -6.996835383339674e-03 +965 948 -8.076052134892578e-03 +965 949 -9.403863770832828e-03 +965 950 -1.105916272470025e-02 +965 951 -1.315380302376546e-02 +965 952 -1.585023865775526e-02 +965 953 -1.939104886145126e-02 +965 954 -2.415034675252917e-02 +965 955 -3.072751892616543e-02 +965 956 -4.012781031912993e-02 +965 957 -5.413421453123168e-02 +965 958 -7.613960933881186e-02 +965 959 -1.132183869282789e-01 +965 960 -1.820810586422694e-01 +965 961 -3.301555353436738e-01 +965 962 -7.412185823610298e-01 +965 963 -3.165206906282883e+00 +965 964 -1.502055215859221e+01 +965 966 -1.502055215860530e+01 +965 967 -3.165206906282870e+00 +965 968 -7.412185823610398e-01 +965 969 -3.301555353436709e-01 +965 970 -1.820810586422602e-01 +965 971 -1.132183869282750e-01 +965 972 -7.613960933881174e-02 +965 973 -5.413421453123172e-02 +965 974 -4.012781031912956e-02 +965 975 -3.072751892616515e-02 +965 976 -2.415034675252896e-02 +965 977 -1.939104886145111e-02 +965 978 -1.585023865775526e-02 +965 979 -1.315380302376546e-02 +965 980 -1.105916272470019e-02 +965 981 -9.403863770832811e-03 +965 982 -8.076052134892582e-03 +965 983 -6.996835383339698e-03 +965 984 -6.109381318875730e-03 +965 985 -5.371977266379805e-03 +965 986 -4.753493624956895e-03 +965 987 -4.230349322908545e-03 +965 988 -3.784439171232929e-03 +965 989 -3.401691470521394e-03 +965 990 -3.071047067257401e-03 +965 991 -2.783725492315666e-03 +966 966 3.988394278128564e+01 +966 944 -4.230349322908545e-03 +966 945 -4.753493624956895e-03 +966 946 -5.371977266379821e-03 +966 947 -6.109381318875771e-03 +966 948 -6.996835383339677e-03 +966 949 -8.076052134892642e-03 +966 950 -9.403863770832832e-03 +966 951 -1.105916272470025e-02 +966 952 -1.315380302376547e-02 +966 953 -1.585023865775537e-02 +966 954 -1.939104886145126e-02 +966 955 -2.415034675252897e-02 +966 956 -3.072751892616544e-02 +966 957 -4.012781031912996e-02 +966 958 -5.413421453123175e-02 +966 959 -7.613960933881235e-02 +966 960 -1.132183869282770e-01 +966 961 -1.820810586422648e-01 +966 962 -3.301555353436690e-01 +966 963 -7.412185823610171e-01 +966 964 -3.165206906282858e+00 +966 965 -1.502055215860530e+01 +966 967 -1.502055215840048e+01 +966 968 -3.165206906282915e+00 +966 969 -7.412185823610118e-01 +966 970 -3.301555353436742e-01 +966 971 -1.820810586422674e-01 +966 972 -1.132183869282780e-01 +966 973 -7.613960933881182e-02 +966 974 -5.413421453123108e-02 +966 975 -4.012781031912953e-02 +966 976 -3.072751892616542e-02 +966 977 -2.415034675252897e-02 +966 978 -1.939104886145111e-02 +966 979 -1.585023865775525e-02 +966 980 -1.315380302376538e-02 +966 981 -1.105916272470025e-02 +966 982 -9.403863770832814e-03 +966 983 -8.076052134892594e-03 +966 984 -6.996835383339623e-03 +966 985 -6.109381318875727e-03 +966 986 -5.371977266379786e-03 +966 987 -4.753493624956895e-03 +966 988 -4.230349322908520e-03 +966 989 -3.784439171232916e-03 +966 990 -3.401691470521392e-03 +966 991 -3.071047067257377e-03 +967 967 3.988394278105617e+01 +967 944 -3.784439171232929e-03 +967 945 -4.230349322908520e-03 +967 946 -4.753493624956896e-03 +967 947 -5.371977266379809e-03 +967 948 -6.109381318875733e-03 +967 949 -6.996835383339702e-03 +967 950 -8.076052134892583e-03 +967 951 -9.403863770832814e-03 +967 952 -1.105916272470026e-02 +967 953 -1.315380302376555e-02 +967 954 -1.585023865775537e-02 +967 955 -1.939104886145111e-02 +967 956 -2.415034675252897e-02 +967 957 -3.072751892616544e-02 +967 958 -4.012781031912998e-02 +967 959 -5.413421453123234e-02 +967 960 -7.613960933881186e-02 +967 961 -1.132183869282770e-01 +967 962 -1.820810586422633e-01 +967 963 -3.301555353436774e-01 +967 964 -7.412185823610218e-01 +967 965 -3.165206906282870e+00 +967 966 -1.502055215840048e+01 +967 968 -1.502055215835495e+01 +967 969 -3.165206906282843e+00 +967 970 -7.412185823610189e-01 +967 971 -3.301555353436733e-01 +967 972 -1.820810586422668e-01 +967 973 -1.132183869282776e-01 +967 974 -7.613960933881112e-02 +967 975 -5.413421453123106e-02 +967 976 -4.012781031912993e-02 +967 977 -3.072751892616544e-02 +967 978 -2.415034675252897e-02 +967 979 -1.939104886145110e-02 +967 980 -1.585023865775514e-02 +967 981 -1.315380302376546e-02 +967 982 -1.105916272470025e-02 +967 983 -9.403863770832828e-03 +967 984 -8.076052134892564e-03 +967 985 -6.996835383339671e-03 +967 986 -6.109381318875748e-03 +967 987 -5.371977266379821e-03 +967 988 -4.753493624956896e-03 +967 989 -4.230349322908531e-03 +967 990 -3.784439171232936e-03 +967 991 -3.401691470521384e-03 +968 968 3.988394278102304e+01 +968 944 -3.401691470521394e-03 +968 945 -3.784439171232916e-03 +968 946 -4.230349322908531e-03 +968 947 -4.753493624956895e-03 +968 948 -5.371977266379788e-03 +968 949 -6.109381318875769e-03 +968 950 -6.996835383339674e-03 +968 951 -8.076052134892582e-03 +968 952 -9.403863770832816e-03 +968 953 -1.105916272470032e-02 +968 954 -1.315380302376555e-02 +968 955 -1.585023865775526e-02 +968 956 -1.939104886145110e-02 +968 957 -2.415034675252896e-02 +968 958 -3.072751892616545e-02 +968 959 -4.012781031913035e-02 +968 960 -5.413421453123172e-02 +968 961 -7.613960933881168e-02 +968 962 -1.132183869282766e-01 +968 963 -1.820810586422675e-01 +968 964 -3.301555353436807e-01 +968 965 -7.412185823610398e-01 +968 966 -3.165206906282915e+00 +968 967 -1.502055215835495e+01 +968 969 -1.502055215836209e+01 +968 970 -3.165206906282876e+00 +968 971 -7.412185823610117e-01 +968 972 -3.301555353436755e-01 +968 973 -1.820810586422660e-01 +968 974 -1.132183869282772e-01 +968 975 -7.613960933881117e-02 +968 976 -5.413421453123171e-02 +968 977 -4.012781031912998e-02 +968 978 -3.072751892616545e-02 +968 979 -2.415034675252897e-02 +968 980 -1.939104886145097e-02 +968 981 -1.585023865775526e-02 +968 982 -1.315380302376547e-02 +968 983 -1.105916272470026e-02 +968 984 -9.403863770832816e-03 +968 985 -8.076052134892570e-03 +968 986 -6.996835383339674e-03 +968 987 -6.109381318875771e-03 +968 988 -5.371977266379809e-03 +968 989 -4.753493624956895e-03 +968 990 -4.230349322908543e-03 +968 991 -3.784439171232917e-03 +969 969 3.988394278106473e+01 +969 944 -3.071047067257401e-03 +969 945 -3.401691470521392e-03 +969 946 -3.784439171232936e-03 +969 947 -4.230349322908543e-03 +969 948 -4.753493624956895e-03 +969 949 -5.371977266379837e-03 +969 950 -6.109381318875769e-03 +969 951 -6.996835383339698e-03 +969 952 -8.076052134892583e-03 +969 953 -9.403863770832830e-03 +969 954 -1.105916272470025e-02 +969 955 -1.315380302376538e-02 +969 956 -1.585023865775514e-02 +969 957 -1.939104886145096e-02 +969 958 -2.415034675252878e-02 +969 959 -3.072751892616544e-02 +969 960 -4.012781031912956e-02 +969 961 -5.413421453123109e-02 +969 962 -7.613960933881102e-02 +969 963 -1.132183869282767e-01 +969 964 -1.820810586422620e-01 +969 965 -3.301555353436709e-01 +969 966 -7.412185823610118e-01 +969 967 -3.165206906282843e+00 +969 968 -1.502055215836209e+01 +969 970 -1.502055215839554e+01 +969 971 -3.165206906282863e+00 +969 972 -7.412185823610311e-01 +969 973 -3.301555353436871e-01 +969 974 -1.820810586422694e-01 +969 975 -1.132183869282776e-01 +969 976 -7.613960933881234e-02 +969 977 -5.413421453123234e-02 +969 978 -4.012781031913037e-02 +969 979 -3.072751892616572e-02 +969 980 -2.415034675252897e-02 +969 981 -1.939104886145125e-02 +969 982 -1.585023865775537e-02 +969 983 -1.315380302376555e-02 +969 984 -1.105916272470032e-02 +969 985 -9.403863770832813e-03 +969 986 -8.076052134892578e-03 +969 987 -6.996835383339677e-03 +969 988 -6.109381318875733e-03 +969 989 -5.371977266379788e-03 +969 990 -4.753493624956895e-03 +969 991 -4.230349322908508e-03 +970 970 3.988394278115150e+01 +970 944 -2.783725492315666e-03 +970 945 -3.071047067257377e-03 +970 946 -3.401691470521384e-03 +970 947 -3.784439171232917e-03 +970 948 -4.230349322908508e-03 +970 949 -4.753493624956895e-03 +970 950 -5.371977266379790e-03 +970 951 -6.109381318875730e-03 +970 952 -6.996835383339623e-03 +970 953 -8.076052134892577e-03 +970 954 -9.403863770832839e-03 +970 955 -1.105916272470022e-02 +970 956 -1.315380302376542e-02 +970 957 -1.585023865775520e-02 +970 958 -1.939104886145103e-02 +970 959 -2.415034675252906e-02 +970 960 -3.072751892616529e-02 +970 961 -4.012781031912974e-02 +970 962 -5.413421453123138e-02 +970 963 -7.613960933881106e-02 +970 964 -1.132183869282738e-01 +970 965 -1.820810586422602e-01 +970 966 -3.301555353436742e-01 +970 967 -7.412185823610189e-01 +970 968 -3.165206906282876e+00 +970 969 -1.502055215839554e+01 +970 971 -1.502055215844890e+01 +970 972 -3.165206906282864e+00 +970 973 -7.412185823610420e-01 +970 974 -3.301555353436849e-01 +970 975 -1.820810586422678e-01 +970 976 -1.132183869282764e-01 +970 977 -7.613960933881192e-02 +970 978 -5.413421453123205e-02 +970 979 -4.012781031913017e-02 +970 980 -3.072751892616531e-02 +970 981 -2.415034675252906e-02 +970 982 -1.939104886145119e-02 +970 983 -1.585023865775532e-02 +970 984 -1.315380302376550e-02 +970 985 -1.105916272470022e-02 +970 986 -9.403863770832854e-03 +970 987 -8.076052134892655e-03 +970 988 -6.996835383339702e-03 +970 989 -6.109381318875769e-03 +970 990 -5.371977266379837e-03 +970 991 -4.753493624956895e-03 +971 971 3.988394278128110e+01 +971 944 -2.532689975072680e-03 +971 945 -2.783725492315665e-03 +971 946 -3.071047067257392e-03 +971 947 -3.401691470521394e-03 +971 948 -3.784439171232917e-03 +971 949 -4.230349322908543e-03 +971 950 -4.753493624956895e-03 +971 951 -5.371977266379805e-03 +971 952 -6.109381318875727e-03 +971 953 -6.996835383339671e-03 +971 954 -8.076052134892592e-03 +971 955 -9.403863770832811e-03 +971 956 -1.105916272470025e-02 +971 957 -1.315380302376546e-02 +971 958 -1.585023865775526e-02 +971 959 -1.939104886145125e-02 +971 960 -2.415034675252896e-02 +971 961 -3.072751892616542e-02 +971 962 -4.012781031912993e-02 +971 963 -5.413421453123171e-02 +971 964 -7.613960933881185e-02 +971 965 -1.132183869282750e-01 +971 966 -1.820810586422674e-01 +971 967 -3.301555353436733e-01 +971 968 -7.412185823610117e-01 +971 969 -3.165206906282863e+00 +971 970 -1.502055215844890e+01 +971 972 -1.502055215852588e+01 +971 973 -3.165206906282891e+00 +971 974 -7.412185823610272e-01 +971 975 -3.301555353436755e-01 +971 976 -1.820810586422639e-01 +971 977 -1.132183869282760e-01 +971 978 -7.613960933881157e-02 +971 979 -5.413421453123172e-02 +971 980 -4.012781031912956e-02 +971 981 -3.072751892616543e-02 +971 982 -2.415034675252897e-02 +971 983 -1.939104886145111e-02 +971 984 -1.585023865775526e-02 +971 985 -1.315380302376538e-02 +971 986 -1.105916272470025e-02 +971 987 -9.403863770832833e-03 +971 988 -8.076052134892583e-03 +971 989 -6.996835383339674e-03 +971 990 -6.109381318875769e-03 +971 991 -5.371977266379790e-03 +972 972 3.988394278146369e+01 +972 944 -2.312252367280536e-03 +972 945 -2.532689975072673e-03 +972 946 -2.783725492315671e-03 +972 947 -3.071047067257393e-03 +972 948 -3.401691470521385e-03 +972 949 -3.784439171232937e-03 +972 950 -4.230349322908531e-03 +972 951 -4.753493624956895e-03 +972 952 -5.371977266379786e-03 +972 953 -6.109381318875748e-03 +972 954 -6.996835383339674e-03 +972 955 -8.076052134892568e-03 +972 956 -9.403863770832830e-03 +972 957 -1.105916272470025e-02 +972 958 -1.315380302376547e-02 +972 959 -1.585023865775537e-02 +972 960 -1.939104886145111e-02 +972 961 -2.415034675252897e-02 +972 962 -3.072751892616544e-02 +972 963 -4.012781031912998e-02 +972 964 -5.413421453123234e-02 +972 965 -7.613960933881174e-02 +972 966 -1.132183869282780e-01 +972 967 -1.820810586422668e-01 +972 968 -3.301555353436755e-01 +972 969 -7.412185823610311e-01 +972 970 -3.165206906282864e+00 +972 971 -1.502055215852588e+01 +972 973 -1.502055215863286e+01 +972 974 -3.165206906282847e+00 +972 975 -7.412185823610178e-01 +972 976 -3.301555353436744e-01 +972 977 -1.820810586422626e-01 +972 978 -1.132183869282745e-01 +972 979 -7.613960933881117e-02 +972 980 -5.413421453123109e-02 +972 981 -4.012781031912993e-02 +972 982 -3.072751892616544e-02 +972 983 -2.415034675252897e-02 +972 984 -1.939104886145110e-02 +972 985 -1.585023865775514e-02 +972 986 -1.315380302376546e-02 +972 987 -1.105916272470025e-02 +972 988 -9.403863770832814e-03 +972 989 -8.076052134892582e-03 +972 990 -6.996835383339698e-03 +972 991 -6.109381318875730e-03 +973 973 3.988394278171953e+01 +973 944 -2.117777896667799e-03 +973 945 -2.312252367280536e-03 +973 946 -2.532689975072685e-03 +973 947 -2.783725492315679e-03 +973 948 -3.071047067257394e-03 +973 949 -3.401691470521412e-03 +973 950 -3.784439171232939e-03 +973 951 -4.230349322908545e-03 +973 952 -4.753493624956895e-03 +973 953 -5.371977266379821e-03 +973 954 -6.109381318875771e-03 +973 955 -6.996835383339677e-03 +973 956 -8.076052134892642e-03 +973 957 -9.403863770832830e-03 +973 958 -1.105916272470026e-02 +973 959 -1.315380302376555e-02 +973 960 -1.585023865775526e-02 +973 961 -1.939104886145110e-02 +973 962 -2.415034675252896e-02 +973 963 -3.072751892616545e-02 +973 964 -4.012781031913035e-02 +973 965 -5.413421453123172e-02 +973 966 -7.613960933881182e-02 +973 967 -1.132183869282776e-01 +973 968 -1.820810586422660e-01 +973 969 -3.301555353436871e-01 +973 970 -7.412185823610420e-01 +973 971 -3.165206906282891e+00 +973 972 -1.502055215863286e+01 +973 974 -1.502055215878380e+01 +973 975 -3.165206906282899e+00 +973 976 -7.412185823610242e-01 +973 977 -3.301555353436719e-01 +973 978 -1.820810586422631e-01 +973 979 -1.132183869282759e-01 +973 980 -7.613960933881103e-02 +973 981 -5.413421453123171e-02 +973 982 -4.012781031912998e-02 +973 983 -3.072751892616545e-02 +973 984 -2.415034675252897e-02 +973 985 -1.939104886145097e-02 +973 986 -1.585023865775526e-02 +973 987 -1.315380302376547e-02 +973 988 -1.105916272470026e-02 +973 989 -9.403863770832816e-03 +973 990 -8.076052134892583e-03 +973 991 -6.996835383339623e-03 +974 974 3.988394278208168e+01 +974 944 -1.945462087124854e-03 +974 945 -2.117777896667789e-03 +974 946 -2.312252367280536e-03 +974 947 -2.532689975072680e-03 +974 948 -2.783725492315667e-03 +974 949 -3.071047067257401e-03 +974 950 -3.401691470521395e-03 +974 951 -3.784439171232929e-03 +974 952 -4.230349322908520e-03 +974 953 -4.753493624956896e-03 +974 954 -5.371977266379809e-03 +974 955 -6.109381318875733e-03 +974 956 -6.996835383339702e-03 +974 957 -8.076052134892571e-03 +974 958 -9.403863770832771e-03 +974 959 -1.105916272470025e-02 +974 960 -1.315380302376538e-02 +974 961 -1.585023865775514e-02 +974 962 -1.939104886145095e-02 +974 963 -2.415034675252877e-02 +974 964 -3.072751892616543e-02 +974 965 -4.012781031912956e-02 +974 966 -5.413421453123108e-02 +974 967 -7.613960933881112e-02 +974 968 -1.132183869282772e-01 +974 969 -1.820810586422694e-01 +974 970 -3.301555353436849e-01 +974 971 -7.412185823610272e-01 +974 972 -3.165206906282847e+00 +974 973 -1.502055215878380e+01 +974 975 -1.502055215899857e+01 +974 976 -3.165206906282840e+00 +974 977 -7.412185823610062e-01 +974 978 -3.301555353436738e-01 +974 979 -1.820810586422639e-01 +974 980 -1.132183869282764e-01 +974 981 -7.613960933881256e-02 +974 982 -5.413421453123238e-02 +974 983 -4.012781031913039e-02 +974 984 -3.072751892616573e-02 +974 985 -2.415034675252898e-02 +974 986 -1.939104886145126e-02 +974 987 -1.585023865775537e-02 +974 988 -1.315380302376555e-02 +974 989 -1.105916272470032e-02 +974 990 -9.403863770832830e-03 +974 991 -8.076052134892564e-03 +975 975 3.988394278260305e+01 +975 944 -1.792160480940038e-03 +975 945 -1.945462087124849e-03 +975 946 -2.117777896667793e-03 +975 947 -2.312252367280536e-03 +975 948 -2.532689975072674e-03 +975 949 -2.783725492315679e-03 +975 950 -3.071047067257393e-03 +975 951 -3.401691470521394e-03 +975 952 -3.784439171232916e-03 +975 953 -4.230349322908531e-03 +975 954 -4.753493624956895e-03 +975 955 -5.371977266379788e-03 +975 956 -6.109381318875769e-03 +975 957 -6.996835383339674e-03 +975 958 -8.076052134892570e-03 +975 959 -9.403863770832811e-03 +975 960 -1.105916272470018e-02 +975 961 -1.315380302376537e-02 +975 962 -1.585023865775514e-02 +975 963 -1.939104886145096e-02 +975 964 -2.415034675252896e-02 +975 965 -3.072751892616515e-02 +975 966 -4.012781031912953e-02 +975 967 -5.413421453123106e-02 +975 968 -7.613960933881117e-02 +975 969 -1.132183869282776e-01 +975 970 -1.820810586422678e-01 +975 971 -3.301555353436755e-01 +975 972 -7.412185823610178e-01 +975 973 -3.165206906282899e+00 +975 974 -1.502055215899857e+01 +975 976 -1.502055215931064e+01 +975 977 -3.165206906282871e+00 +975 978 -7.412185823610278e-01 +975 979 -3.301555353436801e-01 +975 980 -1.820810586422670e-01 +975 981 -1.132183869282778e-01 +975 982 -7.613960933881221e-02 +975 983 -5.413421453123236e-02 +975 984 -4.012781031913037e-02 +975 985 -3.072751892616545e-02 +975 986 -2.415034675252917e-02 +975 987 -1.939104886145126e-02 +975 988 -1.585023865775537e-02 +975 989 -1.315380302376555e-02 +975 990 -1.105916272470025e-02 +975 991 -9.403863770832811e-03 +976 976 3.988394278260301e+01 +976 960 -9.403863770832827e-03 +976 961 -1.105916272470025e-02 +976 962 -1.315380302376546e-02 +976 963 -1.585023865775526e-02 +976 964 -1.939104886145125e-02 +976 965 -2.415034675252896e-02 +976 966 -3.072751892616542e-02 +976 967 -4.012781031912993e-02 +976 968 -5.413421453123171e-02 +976 969 -7.613960933881234e-02 +976 970 -1.132183869282764e-01 +976 971 -1.820810586422639e-01 +976 972 -3.301555353436744e-01 +976 973 -7.412185823610242e-01 +976 974 -3.165206906282840e+00 +976 975 -1.502055215931064e+01 +976 977 -1.502055215899860e+01 +976 978 -3.165206906282869e+00 +976 979 -7.412185823610203e-01 +976 980 -3.301555353436821e-01 +976 981 -1.820810586422688e-01 +976 982 -1.132183869282784e-01 +976 983 -7.613960933881188e-02 +976 984 -5.413421453123172e-02 +976 985 -4.012781031912956e-02 +976 986 -3.072751892616543e-02 +976 987 -2.415034675252897e-02 +976 988 -1.939104886145111e-02 +976 989 -1.585023865775526e-02 +976 990 -1.315380302376538e-02 +976 991 -1.105916272470018e-02 +976 992 -9.403863770832811e-03 +976 993 -8.076052134892568e-03 +976 994 -6.996835383339677e-03 +976 995 -6.109381318875733e-03 +976 996 -5.371977266379788e-03 +976 997 -4.753493624956895e-03 +976 998 -4.230349322908508e-03 +976 999 -3.784439171232917e-03 +976 1000 -3.401691470521385e-03 +976 1001 -3.071047067257394e-03 +976 1002 -2.783725492315667e-03 +976 1003 -2.532689975072674e-03 +976 1004 -2.312252367280536e-03 +976 1005 -2.117777896667785e-03 +976 1006 -1.945462087124849e-03 +976 1007 -1.792160480940035e-03 +977 977 3.988394278208164e+01 +977 960 -8.076052134892564e-03 +977 961 -9.403863770832814e-03 +977 962 -1.105916272470025e-02 +977 963 -1.315380302376547e-02 +977 964 -1.585023865775537e-02 +977 965 -1.939104886145111e-02 +977 966 -2.415034675252897e-02 +977 967 -3.072751892616544e-02 +977 968 -4.012781031912998e-02 +977 969 -5.413421453123234e-02 +977 970 -7.613960933881192e-02 +977 971 -1.132183869282760e-01 +977 972 -1.820810586422626e-01 +977 973 -3.301555353436719e-01 +977 974 -7.412185823610062e-01 +977 975 -3.165206906282871e+00 +977 976 -1.502055215899860e+01 +977 978 -1.502055215878371e+01 +977 979 -3.165206906282847e+00 +977 980 -7.412185823610407e-01 +977 981 -3.301555353436755e-01 +977 982 -1.820810586422675e-01 +977 983 -1.132183869282766e-01 +977 984 -7.613960933881182e-02 +977 985 -5.413421453123109e-02 +977 986 -4.012781031912993e-02 +977 987 -3.072751892616544e-02 +977 988 -2.415034675252897e-02 +977 989 -1.939104886145110e-02 +977 990 -1.585023865775514e-02 +977 991 -1.315380302376537e-02 +977 992 -1.105916272470025e-02 +977 993 -9.403863770832830e-03 +977 994 -8.076052134892642e-03 +977 995 -6.996835383339702e-03 +977 996 -6.109381318875769e-03 +977 997 -5.371977266379837e-03 +977 998 -4.753493624956895e-03 +977 999 -4.230349322908543e-03 +977 1000 -3.784439171232937e-03 +977 1001 -3.401691470521412e-03 +977 1002 -3.071047067257401e-03 +977 1003 -2.783725492315679e-03 +977 1004 -2.532689975072691e-03 +977 1005 -2.312252367280536e-03 +977 1006 -2.117777896667799e-03 +977 1007 -1.945462087124857e-03 +978 978 3.988394278171953e+01 +978 960 -6.996835383339671e-03 +978 961 -8.076052134892582e-03 +978 962 -9.403863770832814e-03 +978 963 -1.105916272470026e-02 +978 964 -1.315380302376555e-02 +978 965 -1.585023865775526e-02 +978 966 -1.939104886145111e-02 +978 967 -2.415034675252897e-02 +978 968 -3.072751892616545e-02 +978 969 -4.012781031913037e-02 +978 970 -5.413421453123205e-02 +978 971 -7.613960933881157e-02 +978 972 -1.132183869282745e-01 +978 973 -1.820810586422631e-01 +978 974 -3.301555353436738e-01 +978 975 -7.412185823610278e-01 +978 976 -3.165206906282869e+00 +978 977 -1.502055215878371e+01 +978 979 -1.502055215863296e+01 +978 980 -3.165206906282927e+00 +978 981 -7.412185823610224e-01 +978 982 -3.301555353436778e-01 +978 983 -1.820810586422658e-01 +978 984 -1.132183869282770e-01 +978 985 -7.613960933881100e-02 +978 986 -5.413421453123168e-02 +978 987 -4.012781031912996e-02 +978 988 -3.072751892616544e-02 +978 989 -2.415034675252896e-02 +978 990 -1.939104886145095e-02 +978 991 -1.585023865775514e-02 +978 992 -1.315380302376546e-02 +978 993 -1.105916272470025e-02 +978 994 -9.403863770832830e-03 +978 995 -8.076052134892571e-03 +978 996 -6.996835383339674e-03 +978 997 -6.109381318875769e-03 +978 998 -5.371977266379790e-03 +978 999 -4.753493624956895e-03 +978 1000 -4.230349322908531e-03 +978 1001 -3.784439171232939e-03 +978 1002 -3.401691470521395e-03 +978 1003 -3.071047067257393e-03 +978 1004 -2.783725492315679e-03 +978 1005 -2.532689975072674e-03 +978 1006 -2.312252367280536e-03 +978 1007 -2.117777896667794e-03 +979 979 3.988394278146370e+01 +979 960 -6.109381318875748e-03 +979 961 -6.996835383339674e-03 +979 962 -8.076052134892568e-03 +979 963 -9.403863770832832e-03 +979 964 -1.105916272470032e-02 +979 965 -1.315380302376546e-02 +979 966 -1.585023865775525e-02 +979 967 -1.939104886145110e-02 +979 968 -2.415034675252897e-02 +979 969 -3.072751892616572e-02 +979 970 -4.012781031913017e-02 +979 971 -5.413421453123172e-02 +979 972 -7.613960933881117e-02 +979 973 -1.132183869282759e-01 +979 974 -1.820810586422639e-01 +979 975 -3.301555353436801e-01 +979 976 -7.412185823610203e-01 +979 977 -3.165206906282847e+00 +979 978 -1.502055215863296e+01 +979 980 -1.502055215852583e+01 +979 981 -3.165206906282848e+00 +979 982 -7.412185823610112e-01 +979 983 -3.301555353436729e-01 +979 984 -1.820810586422644e-01 +979 985 -1.132183869282758e-01 +979 986 -7.613960933881136e-02 +979 987 -5.413421453123175e-02 +979 988 -4.012781031912998e-02 +979 989 -3.072751892616545e-02 +979 990 -2.415034675252877e-02 +979 991 -1.939104886145096e-02 +979 992 -1.585023865775526e-02 +979 993 -1.315380302376547e-02 +979 994 -1.105916272470026e-02 +979 995 -9.403863770832771e-03 +979 996 -8.076052134892570e-03 +979 997 -6.996835383339698e-03 +979 998 -6.109381318875730e-03 +979 999 -5.371977266379805e-03 +979 1000 -4.753493624956895e-03 +979 1001 -4.230349322908545e-03 +979 1002 -3.784439171232929e-03 +979 1003 -3.401691470521394e-03 +979 1004 -3.071047067257401e-03 +979 1005 -2.783725492315666e-03 +979 1006 -2.532689975072680e-03 +979 1007 -2.312252367280536e-03 +980 980 3.988394278128114e+01 +980 960 -5.371977266379821e-03 +980 961 -6.109381318875771e-03 +980 962 -6.996835383339677e-03 +980 963 -8.076052134892632e-03 +980 964 -9.403863770832830e-03 +980 965 -1.105916272470019e-02 +980 966 -1.315380302376538e-02 +980 967 -1.585023865775514e-02 +980 968 -1.939104886145097e-02 +980 969 -2.415034675252897e-02 +980 970 -3.072751892616531e-02 +980 971 -4.012781031912956e-02 +980 972 -5.413421453123109e-02 +980 973 -7.613960933881103e-02 +980 974 -1.132183869282764e-01 +980 975 -1.820810586422670e-01 +980 976 -3.301555353436821e-01 +980 977 -7.412185823610407e-01 +980 978 -3.165206906282927e+00 +980 979 -1.502055215852583e+01 +980 981 -1.502055215844893e+01 +980 982 -3.165206906282858e+00 +980 983 -7.412185823610137e-01 +980 984 -3.301555353436744e-01 +980 985 -1.820810586422643e-01 +980 986 -1.132183869282741e-01 +980 987 -7.613960933881185e-02 +980 988 -5.413421453123234e-02 +980 989 -4.012781031913035e-02 +980 990 -3.072751892616543e-02 +980 991 -2.415034675252896e-02 +980 992 -1.939104886145125e-02 +980 993 -1.585023865775537e-02 +980 994 -1.315380302376555e-02 +980 995 -1.105916272470025e-02 +980 996 -9.403863770832811e-03 +980 997 -8.076052134892604e-03 +980 998 -6.996835383339623e-03 +980 999 -6.109381318875727e-03 +980 1000 -5.371977266379786e-03 +980 1001 -4.753493624956895e-03 +980 1002 -4.230349322908520e-03 +980 1003 -3.784439171232916e-03 +980 1004 -3.401691470521392e-03 +980 1005 -3.071047067257377e-03 +980 1006 -2.783725492315665e-03 +980 1007 -2.532689975072673e-03 +981 981 3.988394278115150e+01 +981 960 -4.753493624956896e-03 +981 961 -5.371977266379809e-03 +981 962 -6.109381318875733e-03 +981 963 -6.996835383339702e-03 +981 964 -8.076052134892594e-03 +981 965 -9.403863770832811e-03 +981 966 -1.105916272470025e-02 +981 967 -1.315380302376546e-02 +981 968 -1.585023865775526e-02 +981 969 -1.939104886145125e-02 +981 970 -2.415034675252906e-02 +981 971 -3.072751892616543e-02 +981 972 -4.012781031912993e-02 +981 973 -5.413421453123171e-02 +981 974 -7.613960933881256e-02 +981 975 -1.132183869282778e-01 +981 976 -1.820810586422688e-01 +981 977 -3.301555353436755e-01 +981 978 -7.412185823610224e-01 +981 979 -3.165206906282848e+00 +981 980 -1.502055215844893e+01 +981 982 -1.502055215839550e+01 +981 983 -3.165206906282884e+00 +981 984 -7.412185823610346e-01 +981 985 -3.301555353436833e-01 +981 986 -1.820810586422604e-01 +981 987 -1.132183869282749e-01 +981 988 -7.613960933881173e-02 +981 989 -5.413421453123172e-02 +981 990 -4.012781031912956e-02 +981 991 -3.072751892616515e-02 +981 992 -2.415034675252896e-02 +981 993 -1.939104886145111e-02 +981 994 -1.585023865775526e-02 +981 995 -1.315380302376538e-02 +981 996 -1.105916272470018e-02 +981 997 -9.403863770832827e-03 +981 998 -8.076052134892564e-03 +981 999 -6.996835383339671e-03 +981 1000 -6.109381318875748e-03 +981 1001 -5.371977266379821e-03 +981 1002 -4.753493624956896e-03 +981 1003 -4.230349322908531e-03 +981 1004 -3.784439171232936e-03 +981 1005 -3.401691470521384e-03 +981 1006 -3.071047067257392e-03 +981 1007 -2.783725492315671e-03 +982 982 3.988394278106477e+01 +982 960 -4.230349322908531e-03 +982 961 -4.753493624956895e-03 +982 962 -5.371977266379788e-03 +982 963 -6.109381318875769e-03 +982 964 -6.996835383339674e-03 +982 965 -8.076052134892582e-03 +982 966 -9.403863770832814e-03 +982 967 -1.105916272470025e-02 +982 968 -1.315380302376547e-02 +982 969 -1.585023865775537e-02 +982 970 -1.939104886145119e-02 +982 971 -2.415034675252897e-02 +982 972 -3.072751892616544e-02 +982 973 -4.012781031912998e-02 +982 974 -5.413421453123238e-02 +982 975 -7.613960933881221e-02 +982 976 -1.132183869282784e-01 +982 977 -1.820810586422675e-01 +982 978 -3.301555353436778e-01 +982 979 -7.412185823610112e-01 +982 980 -3.165206906282858e+00 +982 981 -1.502055215839550e+01 +982 983 -1.502055215836213e+01 +982 984 -3.165206906282878e+00 +982 985 -7.412185823610343e-01 +982 986 -3.301555353436728e-01 +982 987 -1.820810586422635e-01 +982 988 -1.132183869282771e-01 +982 989 -7.613960933881184e-02 +982 990 -5.413421453123108e-02 +982 991 -4.012781031912953e-02 +982 992 -3.072751892616542e-02 +982 993 -2.415034675252897e-02 +982 994 -1.939104886145110e-02 +982 995 -1.585023865775514e-02 +982 996 -1.315380302376537e-02 +982 997 -1.105916272470025e-02 +982 998 -9.403863770832814e-03 +982 999 -8.076052134892582e-03 +982 1000 -6.996835383339674e-03 +982 1001 -6.109381318875771e-03 +982 1002 -5.371977266379809e-03 +982 1003 -4.753493624956895e-03 +982 1004 -4.230349322908543e-03 +982 1005 -3.784439171232917e-03 +982 1006 -3.401691470521394e-03 +982 1007 -3.071047067257393e-03 +983 983 3.988394278102306e+01 +983 960 -3.784439171232936e-03 +983 961 -4.230349322908543e-03 +983 962 -4.753493624956895e-03 +983 963 -5.371977266379837e-03 +983 964 -6.109381318875769e-03 +983 965 -6.996835383339698e-03 +983 966 -8.076052134892594e-03 +983 967 -9.403863770832828e-03 +983 968 -1.105916272470026e-02 +983 969 -1.315380302376555e-02 +983 970 -1.585023865775532e-02 +983 971 -1.939104886145111e-02 +983 972 -2.415034675252897e-02 +983 973 -3.072751892616545e-02 +983 974 -4.012781031913039e-02 +983 975 -5.413421453123236e-02 +983 976 -7.613960933881188e-02 +983 977 -1.132183869282766e-01 +983 978 -1.820810586422658e-01 +983 979 -3.301555353436729e-01 +983 980 -7.412185823610137e-01 +983 981 -3.165206906282884e+00 +983 982 -1.502055215836213e+01 +983 984 -1.502055215835499e+01 +983 985 -3.165206906282881e+00 +983 986 -7.412185823610105e-01 +983 987 -3.301555353436741e-01 +983 988 -1.820810586422699e-01 +983 989 -1.132183869282784e-01 +983 990 -7.613960933881075e-02 +983 991 -5.413421453123106e-02 +983 992 -4.012781031912993e-02 +983 993 -3.072751892616544e-02 +983 994 -2.415034675252896e-02 +983 995 -1.939104886145095e-02 +983 996 -1.585023865775514e-02 +983 997 -1.315380302376546e-02 +983 998 -1.105916272470025e-02 +983 999 -9.403863770832814e-03 +983 1000 -8.076052134892568e-03 +983 1001 -6.996835383339677e-03 +983 1002 -6.109381318875733e-03 +983 1003 -5.371977266379788e-03 +983 1004 -4.753493624956895e-03 +983 1005 -4.230349322908508e-03 +983 1006 -3.784439171232917e-03 +983 1007 -3.401691470521385e-03 +984 984 3.988394278105613e+01 +984 960 -3.401691470521384e-03 +984 961 -3.784439171232917e-03 +984 962 -4.230349322908508e-03 +984 963 -4.753493624956895e-03 +984 964 -5.371977266379790e-03 +984 965 -6.109381318875730e-03 +984 966 -6.996835383339623e-03 +984 967 -8.076052134892564e-03 +984 968 -9.403863770832816e-03 +984 969 -1.105916272470032e-02 +984 970 -1.315380302376550e-02 +984 971 -1.585023865775526e-02 +984 972 -1.939104886145110e-02 +984 973 -2.415034675252897e-02 +984 974 -3.072751892616573e-02 +984 975 -4.012781031913037e-02 +984 976 -5.413421453123172e-02 +984 977 -7.613960933881182e-02 +984 978 -1.132183869282770e-01 +984 979 -1.820810586422644e-01 +984 980 -3.301555353436744e-01 +984 981 -7.412185823610346e-01 +984 982 -3.165206906282878e+00 +984 983 -1.502055215835499e+01 +984 985 -1.502055215840039e+01 +984 986 -3.165206906282828e+00 +984 987 -7.412185823610108e-01 +984 988 -3.301555353436789e-01 +984 989 -1.820810586422670e-01 +984 990 -1.132183869282765e-01 +984 991 -7.613960933881117e-02 +984 992 -5.413421453123171e-02 +984 993 -4.012781031912998e-02 +984 994 -3.072751892616545e-02 +984 995 -2.415034675252877e-02 +984 996 -1.939104886145096e-02 +984 997 -1.585023865775526e-02 +984 998 -1.315380302376547e-02 +984 999 -1.105916272470026e-02 +984 1000 -9.403863770832832e-03 +984 1001 -8.076052134892632e-03 +984 1002 -6.996835383339702e-03 +984 1003 -6.109381318875769e-03 +984 1004 -5.371977266379837e-03 +984 1005 -4.753493624956895e-03 +984 1006 -4.230349322908543e-03 +984 1007 -3.784439171232937e-03 +985 985 3.988394278128564e+01 +985 960 -3.071047067257392e-03 +985 961 -3.401691470521394e-03 +985 962 -3.784439171232917e-03 +985 963 -4.230349322908543e-03 +985 964 -4.753493624956895e-03 +985 965 -5.371977266379805e-03 +985 966 -6.109381318875727e-03 +985 967 -6.996835383339671e-03 +985 968 -8.076052134892570e-03 +985 969 -9.403863770832813e-03 +985 970 -1.105916272470022e-02 +985 971 -1.315380302376538e-02 +985 972 -1.585023865775514e-02 +985 973 -1.939104886145097e-02 +985 974 -2.415034675252898e-02 +985 975 -3.072751892616545e-02 +985 976 -4.012781031912956e-02 +985 977 -5.413421453123109e-02 +985 978 -7.613960933881100e-02 +985 979 -1.132183869282758e-01 +985 980 -1.820810586422643e-01 +985 981 -3.301555353436833e-01 +985 982 -7.412185823610343e-01 +985 983 -3.165206906282881e+00 +985 984 -1.502055215840039e+01 +985 986 -1.502055215860533e+01 +985 987 -3.165206906282891e+00 +985 988 -7.412185823610282e-01 +985 989 -3.301555353436739e-01 +985 990 -1.820810586422663e-01 +985 991 -1.132183869282776e-01 +985 992 -7.613960933881254e-02 +985 993 -5.413421453123234e-02 +985 994 -4.012781031913035e-02 +985 995 -3.072751892616543e-02 +985 996 -2.415034675252896e-02 +985 997 -1.939104886145125e-02 +985 998 -1.585023865775537e-02 +985 999 -1.315380302376555e-02 +985 1000 -1.105916272470032e-02 +985 1001 -9.403863770832830e-03 +985 1002 -8.076052134892594e-03 +985 1003 -6.996835383339674e-03 +985 1004 -6.109381318875769e-03 +985 1005 -5.371977266379790e-03 +985 1006 -4.753493624956895e-03 +985 1007 -4.230349322908531e-03 +986 986 3.988394278152491e+01 +986 960 -2.783725492315671e-03 +986 961 -3.071047067257393e-03 +986 962 -3.401691470521385e-03 +986 963 -3.784439171232937e-03 +986 964 -4.230349322908531e-03 +986 965 -4.753493624956895e-03 +986 966 -5.371977266379786e-03 +986 967 -6.109381318875748e-03 +986 968 -6.996835383339674e-03 +986 969 -8.076052134892578e-03 +986 970 -9.403863770832854e-03 +986 971 -1.105916272470025e-02 +986 972 -1.315380302376546e-02 +986 973 -1.585023865775526e-02 +986 974 -1.939104886145126e-02 +986 975 -2.415034675252917e-02 +986 976 -3.072751892616543e-02 +986 977 -4.012781031912993e-02 +986 978 -5.413421453123168e-02 +986 979 -7.613960933881136e-02 +986 980 -1.132183869282741e-01 +986 981 -1.820810586422604e-01 +986 982 -3.301555353436728e-01 +986 983 -7.412185823610105e-01 +986 984 -3.165206906282828e+00 +986 985 -1.502055215860533e+01 +986 987 -1.502055215859220e+01 +986 988 -3.165206906282873e+00 +986 989 -7.412185823610301e-01 +986 990 -3.301555353436821e-01 +986 991 -1.820810586422694e-01 +986 992 -1.132183869282780e-01 +986 993 -7.613960933881173e-02 +986 994 -5.413421453123172e-02 +986 995 -4.012781031912956e-02 +986 996 -3.072751892616515e-02 +986 997 -2.415034675252896e-02 +986 998 -1.939104886145111e-02 +986 999 -1.585023865775526e-02 +986 1000 -1.315380302376546e-02 +986 1001 -1.105916272470019e-02 +986 1002 -9.403863770832811e-03 +986 1003 -8.076052134892582e-03 +986 1004 -6.996835383339698e-03 +986 1005 -6.109381318875730e-03 +986 1006 -5.371977266379805e-03 +986 1007 -4.753493624956895e-03 +987 987 3.988394278151353e+01 +987 960 -2.532689975072685e-03 +987 961 -2.783725492315679e-03 +987 962 -3.071047067257394e-03 +987 963 -3.401691470521412e-03 +987 964 -3.784439171232939e-03 +987 965 -4.230349322908545e-03 +987 966 -4.753493624956895e-03 +987 967 -5.371977266379821e-03 +987 968 -6.109381318875771e-03 +987 969 -6.996835383339677e-03 +987 970 -8.076052134892655e-03 +987 971 -9.403863770832833e-03 +987 972 -1.105916272470025e-02 +987 973 -1.315380302376547e-02 +987 974 -1.585023865775537e-02 +987 975 -1.939104886145126e-02 +987 976 -2.415034675252897e-02 +987 977 -3.072751892616544e-02 +987 978 -4.012781031912996e-02 +987 979 -5.413421453123175e-02 +987 980 -7.613960933881185e-02 +987 981 -1.132183869282749e-01 +987 982 -1.820810586422635e-01 +987 983 -3.301555353436741e-01 +987 984 -7.412185823610108e-01 +987 985 -3.165206906282891e+00 +987 986 -1.502055215859220e+01 +987 988 -1.502055215859649e+01 +987 989 -3.165206906282869e+00 +987 990 -7.412185823610292e-01 +987 991 -3.301555353436761e-01 +987 992 -1.820810586422629e-01 +987 993 -1.132183869282751e-01 +987 994 -7.613960933881150e-02 +987 995 -5.413421453123108e-02 +987 996 -4.012781031912953e-02 +987 997 -3.072751892616542e-02 +987 998 -2.415034675252897e-02 +987 999 -1.939104886145111e-02 +987 1000 -1.585023865775525e-02 +987 1001 -1.315380302376538e-02 +987 1002 -1.105916272470025e-02 +987 1003 -9.403863770832814e-03 +987 1004 -8.076052134892594e-03 +987 1005 -6.996835383339623e-03 +987 1006 -6.109381318875727e-03 +987 1007 -5.371977266379786e-03 +988 988 3.988394278151432e+01 +988 960 -2.312252367280536e-03 +988 961 -2.532689975072680e-03 +988 962 -2.783725492315667e-03 +988 963 -3.071047067257401e-03 +988 964 -3.401691470521395e-03 +988 965 -3.784439171232929e-03 +988 966 -4.230349322908520e-03 +988 967 -4.753493624956896e-03 +988 968 -5.371977266379809e-03 +988 969 -6.109381318875733e-03 +988 970 -6.996835383339702e-03 +988 971 -8.076052134892583e-03 +988 972 -9.403863770832814e-03 +988 973 -1.105916272470026e-02 +988 974 -1.315380302376555e-02 +988 975 -1.585023865775537e-02 +988 976 -1.939104886145111e-02 +988 977 -2.415034675252897e-02 +988 978 -3.072751892616544e-02 +988 979 -4.012781031912998e-02 +988 980 -5.413421453123234e-02 +988 981 -7.613960933881173e-02 +988 982 -1.132183869282771e-01 +988 983 -1.820810586422699e-01 +988 984 -3.301555353436789e-01 +988 985 -7.412185823610282e-01 +988 986 -3.165206906282873e+00 +988 987 -1.502055215859649e+01 +988 989 -1.502055215858804e+01 +988 990 -3.165206906282819e+00 +988 991 -7.412185823609966e-01 +988 992 -3.301555353436674e-01 +988 993 -1.820810586422600e-01 +988 994 -1.132183869282744e-01 +988 995 -7.613960933881045e-02 +988 996 -5.413421453123106e-02 +988 997 -4.012781031912993e-02 +988 998 -3.072751892616544e-02 +988 999 -2.415034675252897e-02 +988 1000 -1.939104886145110e-02 +988 1001 -1.585023865775514e-02 +988 1002 -1.315380302376546e-02 +988 1003 -1.105916272470025e-02 +988 1004 -9.403863770832828e-03 +988 1005 -8.076052134892564e-03 +988 1006 -6.996835383339671e-03 +988 1007 -6.109381318875748e-03 +989 989 3.988394278153915e+01 +989 960 -2.117777896667793e-03 +989 961 -2.312252367280536e-03 +989 962 -2.532689975072674e-03 +989 963 -2.783725492315679e-03 +989 964 -3.071047067257393e-03 +989 965 -3.401691470521394e-03 +989 966 -3.784439171232916e-03 +989 967 -4.230349322908531e-03 +989 968 -4.753493624956895e-03 +989 969 -5.371977266379788e-03 +989 970 -6.109381318875769e-03 +989 971 -6.996835383339674e-03 +989 972 -8.076052134892582e-03 +989 973 -9.403863770832816e-03 +989 974 -1.105916272470032e-02 +989 975 -1.315380302376555e-02 +989 976 -1.585023865775526e-02 +989 977 -1.939104886145110e-02 +989 978 -2.415034675252896e-02 +989 979 -3.072751892616545e-02 +989 980 -4.012781031913035e-02 +989 981 -5.413421453123172e-02 +989 982 -7.613960933881184e-02 +989 983 -1.132183869282784e-01 +989 984 -1.820810586422670e-01 +989 985 -3.301555353436739e-01 +989 986 -7.412185823610301e-01 +989 987 -3.165206906282869e+00 +989 988 -1.502055215858804e+01 +989 990 -1.502055215863992e+01 +989 991 -3.165206906282800e+00 +989 992 -7.412185823610086e-01 +989 993 -3.301555353436701e-01 +989 994 -1.820810586422626e-01 +989 995 -1.132183869282746e-01 +989 996 -7.613960933881081e-02 +989 997 -5.413421453123171e-02 +989 998 -4.012781031912998e-02 +989 999 -3.072751892616545e-02 +989 1000 -2.415034675252897e-02 +989 1001 -1.939104886145097e-02 +989 1002 -1.585023865775526e-02 +989 1003 -1.315380302376547e-02 +989 1004 -1.105916272470026e-02 +989 1005 -9.403863770832816e-03 +989 1006 -8.076052134892570e-03 +989 1007 -6.996835383339674e-03 +990 990 3.988394278164002e+01 +990 960 -1.945462087124857e-03 +990 961 -2.117777896667799e-03 +990 962 -2.312252367280536e-03 +990 963 -2.532689975072691e-03 +990 964 -2.783725492315679e-03 +990 965 -3.071047067257401e-03 +990 966 -3.401691470521392e-03 +990 967 -3.784439171232936e-03 +990 968 -4.230349322908543e-03 +990 969 -4.753493624956895e-03 +990 970 -5.371977266379837e-03 +990 971 -6.109381318875769e-03 +990 972 -6.996835383339698e-03 +990 973 -8.076052134892583e-03 +990 974 -9.403863770832830e-03 +990 975 -1.105916272470025e-02 +990 976 -1.315380302376538e-02 +990 977 -1.585023865775514e-02 +990 978 -1.939104886145095e-02 +990 979 -2.415034675252877e-02 +990 980 -3.072751892616543e-02 +990 981 -4.012781031912956e-02 +990 982 -5.413421453123108e-02 +990 983 -7.613960933881075e-02 +990 984 -1.132183869282765e-01 +990 985 -1.820810586422663e-01 +990 986 -3.301555353436821e-01 +990 987 -7.412185823610292e-01 +990 988 -3.165206906282819e+00 +990 989 -1.502055215863992e+01 +990 991 -1.502055215865998e+01 +990 992 -3.165206906282885e+00 +990 993 -7.412185823610338e-01 +990 994 -3.301555353436773e-01 +990 995 -1.820810586422657e-01 +990 996 -1.132183869282764e-01 +990 997 -7.613960933881254e-02 +990 998 -5.413421453123238e-02 +990 999 -4.012781031913039e-02 +990 1000 -3.072751892616573e-02 +990 1001 -2.415034675252898e-02 +990 1002 -1.939104886145126e-02 +990 1003 -1.585023865775537e-02 +990 1004 -1.315380302376555e-02 +990 1005 -1.105916272470032e-02 +990 1006 -9.403863770832814e-03 +990 1007 -8.076052134892578e-03 +991 991 3.988394278169693e+01 +991 960 -1.792160480940034e-03 +991 961 -1.945462087124849e-03 +991 962 -2.117777896667785e-03 +991 963 -2.312252367280536e-03 +991 964 -2.532689975072674e-03 +991 965 -2.783725492315666e-03 +991 966 -3.071047067257377e-03 +991 967 -3.401691470521384e-03 +991 968 -3.784439171232917e-03 +991 969 -4.230349322908508e-03 +991 970 -4.753493624956895e-03 +991 971 -5.371977266379790e-03 +991 972 -6.109381318875730e-03 +991 973 -6.996835383339623e-03 +991 974 -8.076052134892564e-03 +991 975 -9.403863770832811e-03 +991 976 -1.105916272470018e-02 +991 977 -1.315380302376537e-02 +991 978 -1.585023865775514e-02 +991 979 -1.939104886145096e-02 +991 980 -2.415034675252896e-02 +991 981 -3.072751892616515e-02 +991 982 -4.012781031912953e-02 +991 983 -5.413421453123106e-02 +991 984 -7.613960933881117e-02 +991 985 -1.132183869282776e-01 +991 986 -1.820810586422694e-01 +991 987 -3.301555353436761e-01 +991 988 -7.412185823609966e-01 +991 989 -3.165206906282800e+00 +991 990 -1.502055215865998e+01 +991 992 -1.502055215931069e+01 +991 993 -3.165206906282867e+00 +991 994 -7.412185823610258e-01 +991 995 -3.301555353436791e-01 +991 996 -1.820810586422660e-01 +991 997 -1.132183869282777e-01 +991 998 -7.613960933881220e-02 +991 999 -5.413421453123236e-02 +991 1000 -4.012781031913037e-02 +991 1001 -3.072751892616545e-02 +991 1002 -2.415034675252917e-02 +991 1003 -1.939104886145126e-02 +991 1004 -1.585023865775537e-02 +991 1005 -1.315380302376555e-02 +991 1006 -1.105916272470025e-02 +991 1007 -9.403863770832868e-03 +992 992 3.988394278169699e+01 +992 976 -9.403863770832811e-03 +992 977 -1.105916272470025e-02 +992 978 -1.315380302376546e-02 +992 979 -1.585023865775526e-02 +992 980 -1.939104886145125e-02 +992 981 -2.415034675252896e-02 +992 982 -3.072751892616542e-02 +992 983 -4.012781031912993e-02 +992 984 -5.413421453123171e-02 +992 985 -7.613960933881254e-02 +992 986 -1.132183869282780e-01 +992 987 -1.820810586422629e-01 +992 988 -3.301555353436674e-01 +992 989 -7.412185823610086e-01 +992 990 -3.165206906282885e+00 +992 991 -1.502055215931069e+01 +992 993 -1.502055215865994e+01 +992 994 -3.165206906282882e+00 +992 995 -7.412185823610329e-01 +992 996 -3.301555353436830e-01 +992 997 -1.820810586422687e-01 +992 998 -1.132183869282775e-01 +992 999 -7.613960933881189e-02 +992 1000 -5.413421453123172e-02 +992 1001 -4.012781031912956e-02 +992 1002 -3.072751892616543e-02 +992 1003 -2.415034675252897e-02 +992 1004 -1.939104886145111e-02 +992 1005 -1.585023865775526e-02 +992 1006 -1.315380302376538e-02 +992 1007 -1.105916272470025e-02 +992 1008 -9.403863770832833e-03 +992 1009 -8.076052134892583e-03 +992 1010 -6.996835383339674e-03 +992 1011 -6.109381318875769e-03 +992 1012 -5.371977266379790e-03 +992 1013 -4.753493624956895e-03 +992 1014 -4.230349322908531e-03 +992 1015 -3.784439171232937e-03 +992 1016 -3.401691470521385e-03 +992 1017 -3.071047067257393e-03 +992 1018 -2.783725492315679e-03 +992 1019 -2.532689975072674e-03 +992 1020 -2.312252367280536e-03 +992 1021 -2.117777896667794e-03 +992 1022 -1.945462087124857e-03 +992 1023 -1.792160480940035e-03 +993 993 3.988394278164016e+01 +993 976 -8.076052134892568e-03 +993 977 -9.403863770832830e-03 +993 978 -1.105916272470025e-02 +993 979 -1.315380302376547e-02 +993 980 -1.585023865775537e-02 +993 981 -1.939104886145111e-02 +993 982 -2.415034675252897e-02 +993 983 -3.072751892616544e-02 +993 984 -4.012781031912998e-02 +993 985 -5.413421453123234e-02 +993 986 -7.613960933881173e-02 +993 987 -1.132183869282751e-01 +993 988 -1.820810586422600e-01 +993 989 -3.301555353436701e-01 +993 990 -7.412185823610338e-01 +993 991 -3.165206906282867e+00 +993 992 -1.502055215865994e+01 +993 994 -1.502055215864007e+01 +993 995 -3.165206906282875e+00 +993 996 -7.412185823610230e-01 +993 997 -3.301555353436841e-01 +993 998 -1.820810586422683e-01 +993 999 -1.132183869282785e-01 +993 1000 -7.613960933881182e-02 +993 1001 -5.413421453123109e-02 +993 1002 -4.012781031912993e-02 +993 1003 -3.072751892616544e-02 +993 1004 -2.415034675252897e-02 +993 1005 -1.939104886145110e-02 +993 1006 -1.585023865775514e-02 +993 1007 -1.315380302376546e-02 +993 1008 -1.105916272470025e-02 +993 1009 -9.403863770832814e-03 +993 1010 -8.076052134892582e-03 +993 1011 -6.996835383339698e-03 +993 1012 -6.109381318875730e-03 +993 1013 -5.371977266379805e-03 +993 1014 -4.753493624956895e-03 +993 1015 -4.230349322908543e-03 +993 1016 -3.784439171232917e-03 +993 1017 -3.401691470521394e-03 +993 1018 -3.071047067257401e-03 +993 1019 -2.783725492315666e-03 +993 1020 -2.532689975072680e-03 +993 1021 -2.312252367280536e-03 +993 1022 -2.117777896667799e-03 +993 1023 -1.945462087124849e-03 +994 994 3.988394278153928e+01 +994 976 -6.996835383339677e-03 +994 977 -8.076052134892642e-03 +994 978 -9.403863770832830e-03 +994 979 -1.105916272470026e-02 +994 980 -1.315380302376555e-02 +994 981 -1.585023865775526e-02 +994 982 -1.939104886145110e-02 +994 983 -2.415034675252896e-02 +994 984 -3.072751892616545e-02 +994 985 -4.012781031913035e-02 +994 986 -5.413421453123172e-02 +994 987 -7.613960933881150e-02 +994 988 -1.132183869282744e-01 +994 989 -1.820810586422626e-01 +994 990 -3.301555353436773e-01 +994 991 -7.412185823610258e-01 +994 992 -3.165206906282882e+00 +994 993 -1.502055215864007e+01 +994 995 -1.502055215858799e+01 +994 996 -3.165206906282818e+00 +994 997 -7.412185823610313e-01 +994 998 -3.301555353436753e-01 +994 999 -1.820810586422663e-01 +994 1000 -1.132183869282764e-01 +994 1001 -7.613960933881103e-02 +994 1002 -5.413421453123171e-02 +994 1003 -4.012781031912998e-02 +994 1004 -3.072751892616545e-02 +994 1005 -2.415034675252897e-02 +994 1006 -1.939104886145097e-02 +994 1007 -1.585023865775526e-02 +994 1008 -1.315380302376547e-02 +994 1009 -1.105916272470026e-02 +994 1010 -9.403863770832816e-03 +994 1011 -8.076052134892583e-03 +994 1012 -6.996835383339623e-03 +994 1013 -6.109381318875727e-03 +994 1014 -5.371977266379786e-03 +994 1015 -4.753493624956893e-03 +994 1016 -4.230349322908507e-03 +994 1017 -3.784439171232916e-03 +994 1018 -3.401691470521392e-03 +994 1019 -3.071047067257377e-03 +994 1020 -2.783725492315665e-03 +994 1021 -2.532689975072673e-03 +994 1022 -2.312252367280535e-03 +994 1023 -2.117777896667784e-03 +995 995 3.988394278151441e+01 +995 976 -6.109381318875733e-03 +995 977 -6.996835383339702e-03 +995 978 -8.076052134892571e-03 +995 979 -9.403863770832771e-03 +995 980 -1.105916272470025e-02 +995 981 -1.315380302376538e-02 +995 982 -1.585023865775514e-02 +995 983 -1.939104886145095e-02 +995 984 -2.415034675252877e-02 +995 985 -3.072751892616543e-02 +995 986 -4.012781031912956e-02 +995 987 -5.413421453123108e-02 +995 988 -7.613960933881045e-02 +995 989 -1.132183869282746e-01 +995 990 -1.820810586422657e-01 +995 991 -3.301555353436791e-01 +995 992 -7.412185823610329e-01 +995 993 -3.165206906282875e+00 +995 994 -1.502055215858799e+01 +995 996 -1.502055215859648e+01 +995 997 -3.165206906282931e+00 +995 998 -7.412185823610290e-01 +995 999 -3.301555353436738e-01 +995 1000 -1.820810586422650e-01 +995 1001 -1.132183869282761e-01 +995 1002 -7.613960933881228e-02 +995 1003 -5.413421453123238e-02 +995 1004 -4.012781031913039e-02 +995 1005 -3.072751892616573e-02 +995 1006 -2.415034675252898e-02 +995 1007 -1.939104886145126e-02 +995 1008 -1.585023865775537e-02 +995 1009 -1.315380302376555e-02 +995 1010 -1.105916272470032e-02 +995 1011 -9.403863770832830e-03 +995 1012 -8.076052134892564e-03 +995 1013 -6.996835383339671e-03 +995 1014 -6.109381318875748e-03 +995 1015 -5.371977266379819e-03 +995 1016 -4.753493624956880e-03 +995 1017 -4.230349322908531e-03 +995 1018 -3.784439171232936e-03 +995 1019 -3.401691470521384e-03 +995 1020 -3.071047067257392e-03 +995 1021 -2.783725492315671e-03 +995 1022 -2.532689975072684e-03 +995 1023 -2.312252367280530e-03 +996 996 3.988394278151360e+01 +996 976 -5.371977266379788e-03 +996 977 -6.109381318875769e-03 +996 978 -6.996835383339674e-03 +996 979 -8.076052134892570e-03 +996 980 -9.403863770832811e-03 +996 981 -1.105916272470018e-02 +996 982 -1.315380302376537e-02 +996 983 -1.585023865775514e-02 +996 984 -1.939104886145096e-02 +996 985 -2.415034675252896e-02 +996 986 -3.072751892616515e-02 +996 987 -4.012781031912953e-02 +996 988 -5.413421453123106e-02 +996 989 -7.613960933881081e-02 +996 990 -1.132183869282764e-01 +996 991 -1.820810586422660e-01 +996 992 -3.301555353436830e-01 +996 993 -7.412185823610230e-01 +996 994 -3.165206906282818e+00 +996 995 -1.502055215859648e+01 +996 997 -1.502055215859234e+01 +996 998 -3.165206906282879e+00 +996 999 -7.412185823610185e-01 +996 1000 -3.301555353436721e-01 +996 1001 -1.820810586422631e-01 +996 1002 -1.132183869282757e-01 +996 1003 -7.613960933881189e-02 +996 1004 -5.413421453123236e-02 +996 1005 -4.012781031913037e-02 +996 1006 -3.072751892616545e-02 +996 1007 -2.415034675252917e-02 +996 1008 -1.939104886145126e-02 +996 1009 -1.585023865775537e-02 +996 1010 -1.315380302376555e-02 +996 1011 -1.105916272470025e-02 +996 1012 -9.403863770832811e-03 +996 1013 -8.076052134892592e-03 +996 1014 -6.996835383339674e-03 +996 1015 -6.109381318875769e-03 +996 1016 -5.371977266379790e-03 +996 1017 -4.753493624956895e-03 +996 1018 -4.230349322908543e-03 +996 1019 -3.784439171232917e-03 +996 1020 -3.401691470521394e-03 +996 1021 -3.071047067257393e-03 +996 1022 -2.783725492315679e-03 +996 1023 -2.532689975072674e-03 +997 997 3.988394278152499e+01 +997 976 -4.753493624956895e-03 +997 977 -5.371977266379837e-03 +997 978 -6.109381318875769e-03 +997 979 -6.996835383339698e-03 +997 980 -8.076052134892604e-03 +997 981 -9.403863770832827e-03 +997 982 -1.105916272470025e-02 +997 983 -1.315380302376546e-02 +997 984 -1.585023865775526e-02 +997 985 -1.939104886145125e-02 +997 986 -2.415034675252896e-02 +997 987 -3.072751892616542e-02 +997 988 -4.012781031912993e-02 +997 989 -5.413421453123171e-02 +997 990 -7.613960933881254e-02 +997 991 -1.132183869282777e-01 +997 992 -1.820810586422687e-01 +997 993 -3.301555353436841e-01 +997 994 -7.412185823610313e-01 +997 995 -3.165206906282931e+00 +997 996 -1.502055215859234e+01 +997 998 -1.502055215860516e+01 +997 999 -3.165206906282862e+00 +997 1000 -7.412185823610117e-01 +997 1001 -3.301555353436725e-01 +997 1002 -1.820810586422620e-01 +997 1003 -1.132183869282743e-01 +997 1004 -7.613960933881173e-02 +997 1005 -5.413421453123172e-02 +997 1006 -4.012781031912956e-02 +997 1007 -3.072751892616543e-02 +997 1008 -2.415034675252897e-02 +997 1009 -1.939104886145111e-02 +997 1010 -1.585023865775526e-02 +997 1011 -1.315380302376538e-02 +997 1012 -1.105916272470018e-02 +997 1013 -9.403863770832811e-03 +997 1014 -8.076052134892568e-03 +997 1015 -6.996835383339673e-03 +997 1016 -6.109381318875710e-03 +997 1017 -5.371977266379788e-03 +997 1018 -4.753493624956895e-03 +997 1019 -4.230349322908508e-03 +997 1020 -3.784439171232917e-03 +997 1021 -3.401691470521385e-03 +997 1022 -3.071047067257393e-03 +997 1023 -2.783725492315660e-03 +998 998 3.988394278128565e+01 +998 976 -4.230349322908508e-03 +998 977 -4.753493624956895e-03 +998 978 -5.371977266379790e-03 +998 979 -6.109381318875730e-03 +998 980 -6.996835383339623e-03 +998 981 -8.076052134892564e-03 +998 982 -9.403863770832814e-03 +998 983 -1.105916272470025e-02 +998 984 -1.315380302376547e-02 +998 985 -1.585023865775537e-02 +998 986 -1.939104886145111e-02 +998 987 -2.415034675252897e-02 +998 988 -3.072751892616544e-02 +998 989 -4.012781031912998e-02 +998 990 -5.413421453123238e-02 +998 991 -7.613960933881220e-02 +998 992 -1.132183869282775e-01 +998 993 -1.820810586422683e-01 +998 994 -3.301555353436753e-01 +998 995 -7.412185823610290e-01 +998 996 -3.165206906282879e+00 +998 997 -1.502055215860516e+01 +998 999 -1.502055215840060e+01 +998 1000 -3.165206906282866e+00 +998 1001 -7.412185823610264e-01 +998 1002 -3.301555353436816e-01 +998 1003 -1.820810586422649e-01 +998 1004 -1.132183869282771e-01 +998 1005 -7.613960933881182e-02 +998 1006 -5.413421453123109e-02 +998 1007 -4.012781031912993e-02 +998 1008 -3.072751892616544e-02 +998 1009 -2.415034675252897e-02 +998 1010 -1.939104886145110e-02 +998 1011 -1.585023865775514e-02 +998 1012 -1.315380302376537e-02 +998 1013 -1.105916272470025e-02 +998 1014 -9.403863770832830e-03 +998 1015 -8.076052134892639e-03 +998 1016 -6.996835383339673e-03 +998 1017 -6.109381318875769e-03 +998 1018 -5.371977266379837e-03 +998 1019 -4.753493624956895e-03 +998 1020 -4.230349322908543e-03 +998 1021 -3.784439171232937e-03 +998 1022 -3.401691470521411e-03 +998 1023 -3.071047067257393e-03 +999 999 3.988394278105610e+01 +999 976 -3.784439171232917e-03 +999 977 -4.230349322908543e-03 +999 978 -4.753493624956895e-03 +999 979 -5.371977266379805e-03 +999 980 -6.109381318875727e-03 +999 981 -6.996835383339671e-03 +999 982 -8.076052134892582e-03 +999 983 -9.403863770832814e-03 +999 984 -1.105916272470026e-02 +999 985 -1.315380302376555e-02 +999 986 -1.585023865775526e-02 +999 987 -1.939104886145111e-02 +999 988 -2.415034675252897e-02 +999 989 -3.072751892616545e-02 +999 990 -4.012781031913039e-02 +999 991 -5.413421453123236e-02 +999 992 -7.613960933881189e-02 +999 993 -1.132183869282785e-01 +999 994 -1.820810586422663e-01 +999 995 -3.301555353436738e-01 +999 996 -7.412185823610185e-01 +999 997 -3.165206906282862e+00 +999 998 -1.502055215840060e+01 +999 1000 -1.502055215835473e+01 +999 1001 -3.165206906282858e+00 +999 1002 -7.412185823610390e-01 +999 1003 -3.301555353436819e-01 +999 1004 -1.820810586422664e-01 +999 1005 -1.132183869282775e-01 +999 1006 -7.613960933881059e-02 +999 1007 -5.413421453123168e-02 +999 1008 -4.012781031912996e-02 +999 1009 -3.072751892616544e-02 +999 1010 -2.415034675252896e-02 +999 1011 -1.939104886145095e-02 +999 1012 -1.585023865775514e-02 +999 1013 -1.315380302376546e-02 +999 1014 -1.105916272470025e-02 +999 1015 -9.403863770832830e-03 +999 1016 -8.076052134892568e-03 +999 1017 -6.996835383339674e-03 +999 1018 -6.109381318875769e-03 +999 1019 -5.371977266379790e-03 +999 1020 -4.753493624956895e-03 +999 1021 -4.230349322908531e-03 +999 1022 -3.784439171232937e-03 +999 1023 -3.401691470521385e-03 +1000 1000 3.988394278102306e+01 +1000 976 -3.401691470521385e-03 +1000 977 -3.784439171232937e-03 +1000 978 -4.230349322908531e-03 +1000 979 -4.753493624956895e-03 +1000 980 -5.371977266379786e-03 +1000 981 -6.109381318875748e-03 +1000 982 -6.996835383339674e-03 +1000 983 -8.076052134892568e-03 +1000 984 -9.403863770832832e-03 +1000 985 -1.105916272470032e-02 +1000 986 -1.315380302376546e-02 +1000 987 -1.585023865775525e-02 +1000 988 -1.939104886145110e-02 +1000 989 -2.415034675252897e-02 +1000 990 -3.072751892616573e-02 +1000 991 -4.012781031913037e-02 +1000 992 -5.413421453123172e-02 +1000 993 -7.613960933881182e-02 +1000 994 -1.132183869282764e-01 +1000 995 -1.820810586422650e-01 +1000 996 -3.301555353436721e-01 +1000 997 -7.412185823610117e-01 +1000 998 -3.165206906282866e+00 +1000 999 -1.502055215835473e+01 +1000 1001 -1.502055215836233e+01 +1000 1002 -3.165206906282927e+00 +1000 1003 -7.412185823610427e-01 +1000 1004 -3.301555353436761e-01 +1000 1005 -1.820810586422680e-01 +1000 1006 -1.132183869282765e-01 +1000 1007 -7.613960933881185e-02 +1000 1008 -5.413421453123175e-02 +1000 1009 -4.012781031912998e-02 +1000 1010 -3.072751892616545e-02 +1000 1011 -2.415034675252877e-02 +1000 1012 -1.939104886145096e-02 +1000 1013 -1.585023865775526e-02 +1000 1014 -1.315380302376547e-02 +1000 1015 -1.105916272470026e-02 +1000 1016 -9.403863770832816e-03 +1000 1017 -8.076052134892570e-03 +1000 1018 -6.996835383339698e-03 +1000 1019 -6.109381318875730e-03 +1000 1020 -5.371977266379805e-03 +1000 1021 -4.753493624956895e-03 +1000 1022 -4.230349322908543e-03 +1000 1023 -3.784439171232917e-03 +1001 1001 3.988394278106475e+01 +1001 976 -3.071047067257394e-03 +1001 977 -3.401691470521412e-03 +1001 978 -3.784439171232939e-03 +1001 979 -4.230349322908545e-03 +1001 980 -4.753493624956895e-03 +1001 981 -5.371977266379821e-03 +1001 982 -6.109381318875771e-03 +1001 983 -6.996835383339677e-03 +1001 984 -8.076052134892632e-03 +1001 985 -9.403863770832830e-03 +1001 986 -1.105916272470019e-02 +1001 987 -1.315380302376538e-02 +1001 988 -1.585023865775514e-02 +1001 989 -1.939104886145097e-02 +1001 990 -2.415034675252898e-02 +1001 991 -3.072751892616545e-02 +1001 992 -4.012781031912956e-02 +1001 993 -5.413421453123109e-02 +1001 994 -7.613960933881103e-02 +1001 995 -1.132183869282761e-01 +1001 996 -1.820810586422631e-01 +1001 997 -3.301555353436725e-01 +1001 998 -7.412185823610264e-01 +1001 999 -3.165206906282858e+00 +1001 1000 -1.502055215836233e+01 +1001 1002 -1.502055215839533e+01 +1001 1003 -3.165206906282859e+00 +1001 1004 -7.412185823610076e-01 +1001 1005 -3.301555353436738e-01 +1001 1006 -1.820810586422658e-01 +1001 1007 -1.132183869282778e-01 +1001 1008 -7.613960933881254e-02 +1001 1009 -5.413421453123234e-02 +1001 1010 -4.012781031913035e-02 +1001 1011 -3.072751892616543e-02 +1001 1012 -2.415034675252896e-02 +1001 1013 -1.939104886145125e-02 +1001 1014 -1.585023865775537e-02 +1001 1015 -1.315380302376555e-02 +1001 1016 -1.105916272470032e-02 +1001 1017 -9.403863770832813e-03 +1001 1018 -8.076052134892604e-03 +1001 1019 -6.996835383339623e-03 +1001 1020 -6.109381318875727e-03 +1001 1021 -5.371977266379786e-03 +1001 1022 -4.753493624956893e-03 +1001 1023 -4.230349322908507e-03 +1002 1002 3.988394278115156e+01 +1002 976 -2.783725492315667e-03 +1002 977 -3.071047067257401e-03 +1002 978 -3.401691470521395e-03 +1002 979 -3.784439171232929e-03 +1002 980 -4.230349322908520e-03 +1002 981 -4.753493624956896e-03 +1002 982 -5.371977266379809e-03 +1002 983 -6.109381318875733e-03 +1002 984 -6.996835383339702e-03 +1002 985 -8.076052134892594e-03 +1002 986 -9.403863770832811e-03 +1002 987 -1.105916272470025e-02 +1002 988 -1.315380302376546e-02 +1002 989 -1.585023865775526e-02 +1002 990 -1.939104886145126e-02 +1002 991 -2.415034675252917e-02 +1002 992 -3.072751892616543e-02 +1002 993 -4.012781031912993e-02 +1002 994 -5.413421453123171e-02 +1002 995 -7.613960933881228e-02 +1002 996 -1.132183869282757e-01 +1002 997 -1.820810586422620e-01 +1002 998 -3.301555353436816e-01 +1002 999 -7.412185823610390e-01 +1002 1000 -3.165206906282927e+00 +1002 1001 -1.502055215839533e+01 +1002 1003 -1.502055215844911e+01 +1002 1004 -3.165206906282869e+00 +1002 1005 -7.412185823610125e-01 +1002 1006 -3.301555353436729e-01 +1002 1007 -1.820810586422663e-01 +1002 1008 -1.132183869282771e-01 +1002 1009 -7.613960933881174e-02 +1002 1010 -5.413421453123172e-02 +1002 1011 -4.012781031912956e-02 +1002 1012 -3.072751892616515e-02 +1002 1013 -2.415034675252896e-02 +1002 1014 -1.939104886145111e-02 +1002 1015 -1.585023865775526e-02 +1002 1016 -1.315380302376546e-02 +1002 1017 -1.105916272470019e-02 +1002 1018 -9.403863770832827e-03 +1002 1019 -8.076052134892564e-03 +1002 1020 -6.996835383339671e-03 +1002 1021 -6.109381318875748e-03 +1002 1022 -5.371977266379819e-03 +1002 1023 -4.753493624956880e-03 +1003 1003 3.988394278128112e+01 +1003 976 -2.532689975072674e-03 +1003 977 -2.783725492315679e-03 +1003 978 -3.071047067257393e-03 +1003 979 -3.401691470521394e-03 +1003 980 -3.784439171232916e-03 +1003 981 -4.230349322908531e-03 +1003 982 -4.753493624956895e-03 +1003 983 -5.371977266379788e-03 +1003 984 -6.109381318875769e-03 +1003 985 -6.996835383339674e-03 +1003 986 -8.076052134892582e-03 +1003 987 -9.403863770832814e-03 +1003 988 -1.105916272470025e-02 +1003 989 -1.315380302376547e-02 +1003 990 -1.585023865775537e-02 +1003 991 -1.939104886145126e-02 +1003 992 -2.415034675252897e-02 +1003 993 -3.072751892616544e-02 +1003 994 -4.012781031912998e-02 +1003 995 -5.413421453123238e-02 +1003 996 -7.613960933881189e-02 +1003 997 -1.132183869282743e-01 +1003 998 -1.820810586422649e-01 +1003 999 -3.301555353436819e-01 +1003 1000 -7.412185823610427e-01 +1003 1001 -3.165206906282859e+00 +1003 1002 -1.502055215844911e+01 +1003 1004 -1.502055215852572e+01 +1003 1005 -3.165206906282842e+00 +1003 1006 -7.412185823610064e-01 +1003 1007 -3.301555353436761e-01 +1003 1008 -1.820810586422659e-01 +1003 1009 -1.132183869282764e-01 +1003 1010 -7.613960933881131e-02 +1003 1011 -5.413421453123108e-02 +1003 1012 -4.012781031912953e-02 +1003 1013 -3.072751892616542e-02 +1003 1014 -2.415034675252897e-02 +1003 1015 -1.939104886145111e-02 +1003 1016 -1.585023865775525e-02 +1003 1017 -1.315380302376538e-02 +1003 1018 -1.105916272470025e-02 +1003 1019 -9.403863770832814e-03 +1003 1020 -8.076052134892582e-03 +1003 1021 -6.996835383339674e-03 +1003 1022 -6.109381318875769e-03 +1003 1023 -5.371977266379790e-03 +1004 1004 3.988394278146369e+01 +1004 976 -2.312252367280536e-03 +1004 977 -2.532689975072691e-03 +1004 978 -2.783725492315679e-03 +1004 979 -3.071047067257401e-03 +1004 980 -3.401691470521392e-03 +1004 981 -3.784439171232936e-03 +1004 982 -4.230349322908543e-03 +1004 983 -4.753493624956895e-03 +1004 984 -5.371977266379837e-03 +1004 985 -6.109381318875769e-03 +1004 986 -6.996835383339698e-03 +1004 987 -8.076052134892594e-03 +1004 988 -9.403863770832828e-03 +1004 989 -1.105916272470026e-02 +1004 990 -1.315380302376555e-02 +1004 991 -1.585023865775537e-02 +1004 992 -1.939104886145111e-02 +1004 993 -2.415034675252897e-02 +1004 994 -3.072751892616545e-02 +1004 995 -4.012781031913039e-02 +1004 996 -5.413421453123236e-02 +1004 997 -7.613960933881173e-02 +1004 998 -1.132183869282771e-01 +1004 999 -1.820810586422664e-01 +1004 1000 -3.301555353436761e-01 +1004 1001 -7.412185823610076e-01 +1004 1002 -3.165206906282869e+00 +1004 1003 -1.502055215852572e+01 +1004 1005 -1.502055215863299e+01 +1004 1006 -3.165206906282870e+00 +1004 1007 -7.412185823610374e-01 +1004 1008 -3.301555353436806e-01 +1004 1009 -1.820810586422634e-01 +1004 1010 -1.132183869282738e-01 +1004 1011 -7.613960933881045e-02 +1004 1012 -5.413421453123106e-02 +1004 1013 -4.012781031912993e-02 +1004 1014 -3.072751892616544e-02 +1004 1015 -2.415034675252897e-02 +1004 1016 -1.939104886145110e-02 +1004 1017 -1.585023865775514e-02 +1004 1018 -1.315380302376546e-02 +1004 1019 -1.105916272470025e-02 +1004 1020 -9.403863770832814e-03 +1004 1021 -8.076052134892568e-03 +1004 1022 -6.996835383339673e-03 +1004 1023 -6.109381318875710e-03 +1005 1005 3.988394278171955e+01 +1005 976 -2.117777896667785e-03 +1005 977 -2.312252367280536e-03 +1005 978 -2.532689975072674e-03 +1005 979 -2.783725492315666e-03 +1005 980 -3.071047067257377e-03 +1005 981 -3.401691470521384e-03 +1005 982 -3.784439171232917e-03 +1005 983 -4.230349322908508e-03 +1005 984 -4.753493624956895e-03 +1005 985 -5.371977266379790e-03 +1005 986 -6.109381318875730e-03 +1005 987 -6.996835383339623e-03 +1005 988 -8.076052134892564e-03 +1005 989 -9.403863770832816e-03 +1005 990 -1.105916272470032e-02 +1005 991 -1.315380302376555e-02 +1005 992 -1.585023865775526e-02 +1005 993 -1.939104886145110e-02 +1005 994 -2.415034675252897e-02 +1005 995 -3.072751892616573e-02 +1005 996 -4.012781031913037e-02 +1005 997 -5.413421453123172e-02 +1005 998 -7.613960933881182e-02 +1005 999 -1.132183869282775e-01 +1005 1000 -1.820810586422680e-01 +1005 1001 -3.301555353436738e-01 +1005 1002 -7.412185823610125e-01 +1005 1003 -3.165206906282842e+00 +1005 1004 -1.502055215863299e+01 +1005 1006 -1.502055215878374e+01 +1005 1007 -3.165206906282914e+00 +1005 1008 -7.412185823610473e-01 +1005 1009 -3.301555353436811e-01 +1005 1010 -1.820810586422628e-01 +1005 1011 -1.132183869282746e-01 +1005 1012 -7.613960933881100e-02 +1005 1013 -5.413421453123171e-02 +1005 1014 -4.012781031912998e-02 +1005 1015 -3.072751892616545e-02 +1005 1016 -2.415034675252897e-02 +1005 1017 -1.939104886145097e-02 +1005 1018 -1.585023865775526e-02 +1005 1019 -1.315380302376547e-02 +1005 1020 -1.105916272470026e-02 +1005 1021 -9.403863770832832e-03 +1005 1022 -8.076052134892629e-03 +1005 1023 -6.996835383339673e-03 +1006 1006 3.988394278208166e+01 +1006 976 -1.945462087124849e-03 +1006 977 -2.117777896667799e-03 +1006 978 -2.312252367280536e-03 +1006 979 -2.532689975072680e-03 +1006 980 -2.783725492315665e-03 +1006 981 -3.071047067257392e-03 +1006 982 -3.401691470521394e-03 +1006 983 -3.784439171232917e-03 +1006 984 -4.230349322908543e-03 +1006 985 -4.753493624956895e-03 +1006 986 -5.371977266379805e-03 +1006 987 -6.109381318875727e-03 +1006 988 -6.996835383339671e-03 +1006 989 -8.076052134892570e-03 +1006 990 -9.403863770832814e-03 +1006 991 -1.105916272470025e-02 +1006 992 -1.315380302376538e-02 +1006 993 -1.585023865775514e-02 +1006 994 -1.939104886145097e-02 +1006 995 -2.415034675252898e-02 +1006 996 -3.072751892616545e-02 +1006 997 -4.012781031912956e-02 +1006 998 -5.413421453123109e-02 +1006 999 -7.613960933881059e-02 +1006 1000 -1.132183869282765e-01 +1006 1001 -1.820810586422658e-01 +1006 1002 -3.301555353436729e-01 +1006 1003 -7.412185823610064e-01 +1006 1004 -3.165206906282870e+00 +1006 1005 -1.502055215878374e+01 +1006 1007 -1.502055215899861e+01 +1006 1008 -3.165206906282852e+00 +1006 1009 -7.412185823610281e-01 +1006 1010 -3.301555353436795e-01 +1006 1011 -1.820810586422651e-01 +1006 1012 -1.132183869282780e-01 +1006 1013 -7.613960933881252e-02 +1006 1014 -5.413421453123234e-02 +1006 1015 -4.012781031913037e-02 +1006 1016 -3.072751892616572e-02 +1006 1017 -2.415034675252897e-02 +1006 1018 -1.939104886145125e-02 +1006 1019 -1.585023865775537e-02 +1006 1020 -1.315380302376555e-02 +1006 1021 -1.105916272470032e-02 +1006 1022 -9.403863770832828e-03 +1006 1023 -8.076052134892578e-03 +1007 1007 3.988394278260303e+01 +1007 976 -1.792160480940035e-03 +1007 977 -1.945462087124857e-03 +1007 978 -2.117777896667794e-03 +1007 979 -2.312252367280536e-03 +1007 980 -2.532689975072673e-03 +1007 981 -2.783725492315671e-03 +1007 982 -3.071047067257393e-03 +1007 983 -3.401691470521385e-03 +1007 984 -3.784439171232937e-03 +1007 985 -4.230349322908531e-03 +1007 986 -4.753493624956895e-03 +1007 987 -5.371977266379786e-03 +1007 988 -6.109381318875748e-03 +1007 989 -6.996835383339674e-03 +1007 990 -8.076052134892578e-03 +1007 991 -9.403863770832868e-03 +1007 992 -1.105916272470025e-02 +1007 993 -1.315380302376546e-02 +1007 994 -1.585023865775526e-02 +1007 995 -1.939104886145126e-02 +1007 996 -2.415034675252917e-02 +1007 997 -3.072751892616543e-02 +1007 998 -4.012781031912993e-02 +1007 999 -5.413421453123168e-02 +1007 1000 -7.613960933881185e-02 +1007 1001 -1.132183869282778e-01 +1007 1002 -1.820810586422663e-01 +1007 1003 -3.301555353436761e-01 +1007 1004 -7.412185823610374e-01 +1007 1005 -3.165206906282914e+00 +1007 1006 -1.502055215899861e+01 +1007 1008 -1.502055215931056e+01 +1007 1009 -3.165206906282877e+00 +1007 1010 -7.412185823610176e-01 +1007 1011 -3.301555353436726e-01 +1007 1012 -1.820810586422670e-01 +1007 1013 -1.132183869282768e-01 +1007 1014 -7.613960933881150e-02 +1007 1015 -5.413421453123173e-02 +1007 1016 -4.012781031912996e-02 +1007 1017 -3.072751892616516e-02 +1007 1018 -2.415034675252896e-02 +1007 1019 -1.939104886145111e-02 +1007 1020 -1.585023865775526e-02 +1007 1021 -1.315380302376546e-02 +1007 1022 -1.105916272470019e-02 +1007 1023 -9.403863770832811e-03 +1008 1008 3.988394278260299e+01 +1008 992 -9.403863770832833e-03 +1008 993 -1.105916272470025e-02 +1008 994 -1.315380302376547e-02 +1008 995 -1.585023865775537e-02 +1008 996 -1.939104886145126e-02 +1008 997 -2.415034675252897e-02 +1008 998 -3.072751892616544e-02 +1008 999 -4.012781031912996e-02 +1008 1000 -5.413421453123175e-02 +1008 1001 -7.613960933881254e-02 +1008 1002 -1.132183869282771e-01 +1008 1003 -1.820810586422659e-01 +1008 1004 -3.301555353436806e-01 +1008 1005 -7.412185823610473e-01 +1008 1006 -3.165206906282852e+00 +1008 1007 -1.502055215931056e+01 +1008 1009 -1.502055215899867e+01 +1008 1010 -3.165206906282839e+00 +1008 1011 -7.412185823610075e-01 +1008 1012 -3.301555353436738e-01 +1008 1013 -1.820810586422664e-01 +1008 1014 -1.132183869282774e-01 +1008 1015 -7.613960933881186e-02 +1008 1016 -5.413421453123170e-02 +1008 1017 -4.012781031912955e-02 +1008 1018 -3.072751892616542e-02 +1008 1019 -2.415034675252897e-02 +1008 1020 -1.939104886145111e-02 +1008 1021 -1.585023865775525e-02 +1008 1022 -1.315380302376538e-02 +1008 1023 -1.105916272470025e-02 +1009 1009 3.988394278208162e+01 +1009 992 -8.076052134892583e-03 +1009 993 -9.403863770832814e-03 +1009 994 -1.105916272470026e-02 +1009 995 -1.315380302376555e-02 +1009 996 -1.585023865775537e-02 +1009 997 -1.939104886145111e-02 +1009 998 -2.415034675252897e-02 +1009 999 -3.072751892616544e-02 +1009 1000 -4.012781031912998e-02 +1009 1001 -5.413421453123234e-02 +1009 1002 -7.613960933881174e-02 +1009 1003 -1.132183869282764e-01 +1009 1004 -1.820810586422634e-01 +1009 1005 -3.301555353436811e-01 +1009 1006 -7.412185823610281e-01 +1009 1007 -3.165206906282877e+00 +1009 1008 -1.502055215899867e+01 +1009 1010 -1.502055215878362e+01 +1009 1011 -3.165206906282855e+00 +1009 1012 -7.412185823610098e-01 +1009 1013 -3.301555353436699e-01 +1009 1014 -1.820810586422649e-01 +1009 1015 -1.132183869282776e-01 +1009 1016 -7.613960933881163e-02 +1009 1017 -5.413421453123109e-02 +1009 1018 -4.012781031912993e-02 +1009 1019 -3.072751892616544e-02 +1009 1020 -2.415034675252897e-02 +1009 1021 -1.939104886145110e-02 +1009 1022 -1.585023865775514e-02 +1009 1023 -1.315380302376546e-02 +1010 1010 3.988394278171948e+01 +1010 992 -6.996835383339674e-03 +1010 993 -8.076052134892582e-03 +1010 994 -9.403863770832816e-03 +1010 995 -1.105916272470032e-02 +1010 996 -1.315380302376555e-02 +1010 997 -1.585023865775526e-02 +1010 998 -1.939104886145110e-02 +1010 999 -2.415034675252896e-02 +1010 1000 -3.072751892616545e-02 +1010 1001 -4.012781031913035e-02 +1010 1002 -5.413421453123172e-02 +1010 1003 -7.613960933881131e-02 +1010 1004 -1.132183869282738e-01 +1010 1005 -1.820810586422628e-01 +1010 1006 -3.301555353436795e-01 +1010 1007 -7.412185823610176e-01 +1010 1008 -3.165206906282839e+00 +1010 1009 -1.502055215878362e+01 +1010 1011 -1.502055215863309e+01 +1010 1012 -3.165206906282885e+00 +1010 1013 -7.412185823610313e-01 +1010 1014 -3.301555353436786e-01 +1010 1015 -1.820810586422693e-01 +1010 1016 -1.132183869282764e-01 +1010 1017 -7.613960933881103e-02 +1010 1018 -5.413421453123171e-02 +1010 1019 -4.012781031912998e-02 +1010 1020 -3.072751892616545e-02 +1010 1021 -2.415034675252897e-02 +1010 1022 -1.939104886145097e-02 +1010 1023 -1.585023865775526e-02 +1011 1011 3.988394278146369e+01 +1011 992 -6.109381318875769e-03 +1011 993 -6.996835383339698e-03 +1011 994 -8.076052134892583e-03 +1011 995 -9.403863770832830e-03 +1011 996 -1.105916272470025e-02 +1011 997 -1.315380302376538e-02 +1011 998 -1.585023865775514e-02 +1011 999 -1.939104886145095e-02 +1011 1000 -2.415034675252877e-02 +1011 1001 -3.072751892616543e-02 +1011 1002 -4.012781031912956e-02 +1011 1003 -5.413421453123108e-02 +1011 1004 -7.613960933881045e-02 +1011 1005 -1.132183869282746e-01 +1011 1006 -1.820810586422651e-01 +1011 1007 -3.301555353436726e-01 +1011 1008 -7.412185823610075e-01 +1011 1009 -3.165206906282855e+00 +1011 1010 -1.502055215863309e+01 +1011 1012 -1.502055215852567e+01 +1011 1013 -3.165206906282866e+00 +1011 1014 -7.412185823610310e-01 +1011 1015 -3.301555353436831e-01 +1011 1016 -1.820810586422632e-01 +1011 1017 -1.132183869282760e-01 +1011 1018 -7.613960933881225e-02 +1011 1019 -5.413421453123238e-02 +1011 1020 -4.012781031913039e-02 +1011 1021 -3.072751892616573e-02 +1011 1022 -2.415034675252898e-02 +1011 1023 -1.939104886145126e-02 +1012 1012 3.988394278128111e+01 +1012 992 -5.371977266379790e-03 +1012 993 -6.109381318875730e-03 +1012 994 -6.996835383339623e-03 +1012 995 -8.076052134892564e-03 +1012 996 -9.403863770832811e-03 +1012 997 -1.105916272470018e-02 +1012 998 -1.315380302376537e-02 +1012 999 -1.585023865775514e-02 +1012 1000 -1.939104886145096e-02 +1012 1001 -2.415034675252896e-02 +1012 1002 -3.072751892616515e-02 +1012 1003 -4.012781031912953e-02 +1012 1004 -5.413421453123106e-02 +1012 1005 -7.613960933881100e-02 +1012 1006 -1.132183869282780e-01 +1012 1007 -1.820810586422670e-01 +1012 1008 -3.301555353436738e-01 +1012 1009 -7.412185823610098e-01 +1012 1010 -3.165206906282885e+00 +1012 1011 -1.502055215852567e+01 +1012 1013 -1.502055215844909e+01 +1012 1014 -3.165206906282898e+00 +1012 1015 -7.412185823610289e-01 +1012 1016 -3.301555353436705e-01 +1012 1017 -1.820810586422617e-01 +1012 1018 -1.132183869282748e-01 +1012 1019 -7.613960933881191e-02 +1012 1020 -5.413421453123236e-02 +1012 1021 -4.012781031913037e-02 +1012 1022 -3.072751892616545e-02 +1012 1023 -2.415034675252917e-02 +1013 1013 3.988394278115156e+01 +1013 992 -4.753493624956895e-03 +1013 993 -5.371977266379805e-03 +1013 994 -6.109381318875727e-03 +1013 995 -6.996835383339671e-03 +1013 996 -8.076052134892592e-03 +1013 997 -9.403863770832811e-03 +1013 998 -1.105916272470025e-02 +1013 999 -1.315380302376546e-02 +1013 1000 -1.585023865775526e-02 +1013 1001 -1.939104886145125e-02 +1013 1002 -2.415034675252896e-02 +1013 1003 -3.072751892616542e-02 +1013 1004 -4.012781031912993e-02 +1013 1005 -5.413421453123171e-02 +1013 1006 -7.613960933881252e-02 +1013 1007 -1.132183869282768e-01 +1013 1008 -1.820810586422664e-01 +1013 1009 -3.301555353436699e-01 +1013 1010 -7.412185823610313e-01 +1013 1011 -3.165206906282866e+00 +1013 1012 -1.502055215844909e+01 +1013 1014 -1.502055215839543e+01 +1013 1015 -3.165206906282857e+00 +1013 1016 -7.412185823610054e-01 +1013 1017 -3.301555353436770e-01 +1013 1018 -1.820810586422650e-01 +1013 1019 -1.132183869282753e-01 +1013 1020 -7.613960933881152e-02 +1013 1021 -5.413421453123172e-02 +1013 1022 -4.012781031912956e-02 +1013 1023 -3.072751892616543e-02 +1014 1014 3.988394278106474e+01 +1014 992 -4.230349322908531e-03 +1014 993 -4.753493624956895e-03 +1014 994 -5.371977266379786e-03 +1014 995 -6.109381318875748e-03 +1014 996 -6.996835383339674e-03 +1014 997 -8.076052134892568e-03 +1014 998 -9.403863770832830e-03 +1014 999 -1.105916272470025e-02 +1014 1000 -1.315380302376547e-02 +1014 1001 -1.585023865775537e-02 +1014 1002 -1.939104886145111e-02 +1014 1003 -2.415034675252897e-02 +1014 1004 -3.072751892616544e-02 +1014 1005 -4.012781031912998e-02 +1014 1006 -5.413421453123234e-02 +1014 1007 -7.613960933881150e-02 +1014 1008 -1.132183869282774e-01 +1014 1009 -1.820810586422649e-01 +1014 1010 -3.301555353436786e-01 +1014 1011 -7.412185823610310e-01 +1014 1012 -3.165206906282898e+00 +1014 1013 -1.502055215839543e+01 +1014 1015 -1.502055215836217e+01 +1014 1016 -3.165206906282835e+00 +1014 1017 -7.412185823610157e-01 +1014 1018 -3.301555353436730e-01 +1014 1019 -1.820810586422635e-01 +1014 1020 -1.132183869282764e-01 +1014 1021 -7.613960933881182e-02 +1014 1022 -5.413421453123109e-02 +1014 1023 -4.012781031912993e-02 +1015 1015 3.988394278102304e+01 +1015 992 -3.784439171232937e-03 +1015 993 -4.230349322908543e-03 +1015 994 -4.753493624956893e-03 +1015 995 -5.371977266379819e-03 +1015 996 -6.109381318875769e-03 +1015 997 -6.996835383339673e-03 +1015 998 -8.076052134892639e-03 +1015 999 -9.403863770832830e-03 +1015 1000 -1.105916272470026e-02 +1015 1001 -1.315380302376555e-02 +1015 1002 -1.585023865775526e-02 +1015 1003 -1.939104886145111e-02 +1015 1004 -2.415034675252897e-02 +1015 1005 -3.072751892616545e-02 +1015 1006 -4.012781031913037e-02 +1015 1007 -5.413421453123173e-02 +1015 1008 -7.613960933881186e-02 +1015 1009 -1.132183869282776e-01 +1015 1010 -1.820810586422693e-01 +1015 1011 -3.301555353436831e-01 +1015 1012 -7.412185823610289e-01 +1015 1013 -3.165206906282857e+00 +1015 1014 -1.502055215836217e+01 +1015 1016 -1.502055215835489e+01 +1015 1017 -3.165206906282898e+00 +1015 1018 -7.412185823610338e-01 +1015 1019 -3.301555353436740e-01 +1015 1020 -1.820810586422660e-01 +1015 1021 -1.132183869282775e-01 +1015 1022 -7.613960933881080e-02 +1015 1023 -5.413421453123168e-02 +1016 1016 3.988394278105618e+01 +1016 992 -3.401691470521385e-03 +1016 993 -3.784439171232917e-03 +1016 994 -4.230349322908507e-03 +1016 995 -4.753493624956880e-03 +1016 996 -5.371977266379790e-03 +1016 997 -6.109381318875710e-03 +1016 998 -6.996835383339673e-03 +1016 999 -8.076052134892568e-03 +1016 1000 -9.403863770832816e-03 +1016 1001 -1.105916272470032e-02 +1016 1002 -1.315380302376546e-02 +1016 1003 -1.585023865775525e-02 +1016 1004 -1.939104886145110e-02 +1016 1005 -2.415034675252897e-02 +1016 1006 -3.072751892616572e-02 +1016 1007 -4.012781031912996e-02 +1016 1008 -5.413421453123170e-02 +1016 1009 -7.613960933881163e-02 +1016 1010 -1.132183869282764e-01 +1016 1011 -1.820810586422632e-01 +1016 1012 -3.301555353436705e-01 +1016 1013 -7.412185823610054e-01 +1016 1014 -3.165206906282835e+00 +1016 1015 -1.502055215835489e+01 +1016 1017 -1.502055215840050e+01 +1016 1018 -3.165206906282905e+00 +1016 1019 -7.412185823610424e-01 +1016 1020 -3.301555353436872e-01 +1016 1021 -1.820810586422711e-01 +1016 1022 -1.132183869282781e-01 +1016 1023 -7.613960933881185e-02 +1017 1017 3.988394278128565e+01 +1017 992 -3.071047067257393e-03 +1017 993 -3.401691470521394e-03 +1017 994 -3.784439171232916e-03 +1017 995 -4.230349322908531e-03 +1017 996 -4.753493624956895e-03 +1017 997 -5.371977266379788e-03 +1017 998 -6.109381318875769e-03 +1017 999 -6.996835383339674e-03 +1017 1000 -8.076052134892570e-03 +1017 1001 -9.403863770832813e-03 +1017 1002 -1.105916272470019e-02 +1017 1003 -1.315380302376538e-02 +1017 1004 -1.585023865775514e-02 +1017 1005 -1.939104886145097e-02 +1017 1006 -2.415034675252897e-02 +1017 1007 -3.072751892616516e-02 +1017 1008 -4.012781031912955e-02 +1017 1009 -5.413421453123109e-02 +1017 1010 -7.613960933881103e-02 +1017 1011 -1.132183869282760e-01 +1017 1012 -1.820810586422617e-01 +1017 1013 -3.301555353436770e-01 +1017 1014 -7.412185823610157e-01 +1017 1015 -3.165206906282898e+00 +1017 1016 -1.502055215840050e+01 +1017 1018 -1.502055215860527e+01 +1017 1019 -3.165206906282880e+00 +1017 1020 -7.412185823610186e-01 +1017 1021 -3.301555353436820e-01 +1017 1022 -1.820810586422668e-01 +1017 1023 -1.132183869282773e-01 +1018 1018 3.988394278152496e+01 +1018 992 -2.783725492315679e-03 +1018 993 -3.071047067257401e-03 +1018 994 -3.401691470521392e-03 +1018 995 -3.784439171232936e-03 +1018 996 -4.230349322908543e-03 +1018 997 -4.753493624956895e-03 +1018 998 -5.371977266379837e-03 +1018 999 -6.109381318875769e-03 +1018 1000 -6.996835383339698e-03 +1018 1001 -8.076052134892604e-03 +1018 1002 -9.403863770832827e-03 +1018 1003 -1.105916272470025e-02 +1018 1004 -1.315380302376546e-02 +1018 1005 -1.585023865775526e-02 +1018 1006 -1.939104886145125e-02 +1018 1007 -2.415034675252896e-02 +1018 1008 -3.072751892616542e-02 +1018 1009 -4.012781031912993e-02 +1018 1010 -5.413421453123171e-02 +1018 1011 -7.613960933881225e-02 +1018 1012 -1.132183869282748e-01 +1018 1013 -1.820810586422650e-01 +1018 1014 -3.301555353436730e-01 +1018 1015 -7.412185823610338e-01 +1018 1016 -3.165206906282905e+00 +1018 1017 -1.502055215860527e+01 +1018 1019 -1.502055215859227e+01 +1018 1020 -3.165206906282824e+00 +1018 1021 -7.412185823610185e-01 +1018 1022 -3.301555353436755e-01 +1018 1023 -1.820810586422670e-01 +1019 1019 3.988394278151348e+01 +1019 992 -2.532689975072674e-03 +1019 993 -2.783725492315666e-03 +1019 994 -3.071047067257377e-03 +1019 995 -3.401691470521384e-03 +1019 996 -3.784439171232917e-03 +1019 997 -4.230349322908508e-03 +1019 998 -4.753493624956895e-03 +1019 999 -5.371977266379790e-03 +1019 1000 -6.109381318875730e-03 +1019 1001 -6.996835383339623e-03 +1019 1002 -8.076052134892564e-03 +1019 1003 -9.403863770832814e-03 +1019 1004 -1.105916272470025e-02 +1019 1005 -1.315380302376547e-02 +1019 1006 -1.585023865775537e-02 +1019 1007 -1.939104886145111e-02 +1019 1008 -2.415034675252897e-02 +1019 1009 -3.072751892616544e-02 +1019 1010 -4.012781031912998e-02 +1019 1011 -5.413421453123238e-02 +1019 1012 -7.613960933881191e-02 +1019 1013 -1.132183869282753e-01 +1019 1014 -1.820810586422635e-01 +1019 1015 -3.301555353436740e-01 +1019 1016 -7.412185823610424e-01 +1019 1017 -3.165206906282880e+00 +1019 1018 -1.502055215859227e+01 +1019 1020 -1.502055215859637e+01 +1019 1021 -3.165206906282853e+00 +1019 1022 -7.412185823610180e-01 +1019 1023 -3.301555353436779e-01 +1020 1020 3.988394278151439e+01 +1020 992 -2.312252367280536e-03 +1020 993 -2.532689975072680e-03 +1020 994 -2.783725492315665e-03 +1020 995 -3.071047067257392e-03 +1020 996 -3.401691470521394e-03 +1020 997 -3.784439171232917e-03 +1020 998 -4.230349322908543e-03 +1020 999 -4.753493624956895e-03 +1020 1000 -5.371977266379805e-03 +1020 1001 -6.109381318875727e-03 +1020 1002 -6.996835383339671e-03 +1020 1003 -8.076052134892582e-03 +1020 1004 -9.403863770832814e-03 +1020 1005 -1.105916272470026e-02 +1020 1006 -1.315380302376555e-02 +1020 1007 -1.585023865775526e-02 +1020 1008 -1.939104886145111e-02 +1020 1009 -2.415034675252897e-02 +1020 1010 -3.072751892616545e-02 +1020 1011 -4.012781031913039e-02 +1020 1012 -5.413421453123236e-02 +1020 1013 -7.613960933881152e-02 +1020 1014 -1.132183869282764e-01 +1020 1015 -1.820810586422660e-01 +1020 1016 -3.301555353436872e-01 +1020 1017 -7.412185823610186e-01 +1020 1018 -3.165206906282824e+00 +1020 1019 -1.502055215859637e+01 +1020 1021 -1.502055215858815e+01 +1020 1022 -3.165206906282903e+00 +1020 1023 -7.412185823610409e-01 +1021 1021 3.988394278153935e+01 +1021 992 -2.117777896667794e-03 +1021 993 -2.312252367280536e-03 +1021 994 -2.532689975072673e-03 +1021 995 -2.783725492315671e-03 +1021 996 -3.071047067257393e-03 +1021 997 -3.401691470521385e-03 +1021 998 -3.784439171232937e-03 +1021 999 -4.230349322908531e-03 +1021 1000 -4.753493624956895e-03 +1021 1001 -5.371977266379786e-03 +1021 1002 -6.109381318875748e-03 +1021 1003 -6.996835383339674e-03 +1021 1004 -8.076052134892568e-03 +1021 1005 -9.403863770832832e-03 +1021 1006 -1.105916272470032e-02 +1021 1007 -1.315380302376546e-02 +1021 1008 -1.585023865775525e-02 +1021 1009 -1.939104886145110e-02 +1021 1010 -2.415034675252897e-02 +1021 1011 -3.072751892616573e-02 +1021 1012 -4.012781031913037e-02 +1021 1013 -5.413421453123172e-02 +1021 1014 -7.613960933881182e-02 +1021 1015 -1.132183869282775e-01 +1021 1016 -1.820810586422711e-01 +1021 1017 -3.301555353436820e-01 +1021 1018 -7.412185823610185e-01 +1021 1019 -3.165206906282853e+00 +1021 1020 -1.502055215858815e+01 +1021 1022 -1.502055215863988e+01 +1021 1023 -3.165206906282896e+00 +1022 1022 3.988394278164019e+01 +1022 992 -1.945462087124857e-03 +1022 993 -2.117777896667799e-03 +1022 994 -2.312252367280535e-03 +1022 995 -2.532689975072684e-03 +1022 996 -2.783725492315679e-03 +1022 997 -3.071047067257393e-03 +1022 998 -3.401691470521411e-03 +1022 999 -3.784439171232937e-03 +1022 1000 -4.230349322908543e-03 +1022 1001 -4.753493624956893e-03 +1022 1002 -5.371977266379819e-03 +1022 1003 -6.109381318875769e-03 +1022 1004 -6.996835383339673e-03 +1022 1005 -8.076052134892629e-03 +1022 1006 -9.403863770832828e-03 +1022 1007 -1.105916272470019e-02 +1022 1008 -1.315380302376538e-02 +1022 1009 -1.585023865775514e-02 +1022 1010 -1.939104886145097e-02 +1022 1011 -2.415034675252898e-02 +1022 1012 -3.072751892616545e-02 +1022 1013 -4.012781031912956e-02 +1022 1014 -5.413421453123109e-02 +1022 1015 -7.613960933881080e-02 +1022 1016 -1.132183869282781e-01 +1022 1017 -1.820810586422668e-01 +1022 1018 -3.301555353436755e-01 +1022 1019 -7.412185823610180e-01 +1022 1020 -3.165206906282903e+00 +1022 1021 -1.502055215863988e+01 +1022 1023 -1.502055215866009e+01 +1023 1023 3.988394278169710e+01 +1023 992 -1.792160480940035e-03 +1023 993 -1.945462087124849e-03 +1023 994 -2.117777896667784e-03 +1023 995 -2.312252367280530e-03 +1023 996 -2.532689975072674e-03 +1023 997 -2.783725492315660e-03 +1023 998 -3.071047067257393e-03 +1023 999 -3.401691470521385e-03 +1023 1000 -3.784439171232917e-03 +1023 1001 -4.230349322908507e-03 +1023 1002 -4.753493624956880e-03 +1023 1003 -5.371977266379790e-03 +1023 1004 -6.109381318875710e-03 +1023 1005 -6.996835383339673e-03 +1023 1006 -8.076052134892578e-03 +1023 1007 -9.403863770832811e-03 +1023 1008 -1.105916272470025e-02 +1023 1009 -1.315380302376546e-02 +1023 1010 -1.585023865775526e-02 +1023 1011 -1.939104886145126e-02 +1023 1012 -2.415034675252917e-02 +1023 1013 -3.072751892616543e-02 +1023 1014 -4.012781031912993e-02 +1023 1015 -5.413421453123168e-02 +1023 1016 -7.613960933881185e-02 +1023 1017 -1.132183869282773e-01 +1023 1018 -1.820810586422670e-01 +1023 1019 -3.301555353436779e-01 +1023 1020 -7.412185823610409e-01 +1023 1021 -3.165206906282896e+00 +1023 1022 -1.502055215866009e+01 diff --git a/packages/muelu/research/caglusa/CMakeLists.txt b/packages/muelu/research/caglusa/CMakeLists.txt new file mode 100644 index 000000000000..0e96e0382f05 --- /dev/null +++ b/packages/muelu/research/caglusa/CMakeLists.txt @@ -0,0 +1,29 @@ +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../test/unit_tests) + +IF (${PACKAGE_NAME}_ENABLE_Tpetra AND ${PACKAGE_NAME}_ENABLE_Belos AND ${PACKAGE_NAME}_ENABLE_Ifpack2 AND ${PACKAGE_NAME}_ENABLE_Amesos2) + + TRIBITS_ADD_EXECUTABLE( + HierarchicalDriver + SOURCES main.cpp + COMM mpi + ) + + TRIBITS_ADD_TEST( + HierarchicalDriver + NAME "HierarchicalDriver-fractionalLaplacian1D" + COMM mpi + NUM_MPI_PROCS 4 + ) + + TRIBITS_COPY_FILES_TO_BINARY_DIR(caglusa_cp + SOURCE_FILES + hierarchical.xml aux.xml + rowmap.mtx coeffmap.mtx ghosted_coeffmap.mtx + Anear.mtx basismatrix.mtx kernelApproximations.mtx + transfer0.mtx transfer1.mtx transfer2.mtx transfer3.mtx transfer4.mtx + X_ex.mtx RHS.mtx + aux.mtx coords.mtx + ) + +ENDIF() diff --git a/packages/muelu/research/caglusa/RHS.mtx b/packages/muelu/research/caglusa/RHS.mtx new file mode 100644 index 000000000000..ea7f84b0567b --- /dev/null +++ b/packages/muelu/research/caglusa/RHS.mtx @@ -0,0 +1,1026 @@ +%%MatrixMarket matrix array real general +% +1023 1 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 +9.7656250000000000e-04 diff --git a/packages/muelu/research/caglusa/X_ex.mtx b/packages/muelu/research/caglusa/X_ex.mtx new file mode 100644 index 000000000000..a5929261cfea --- /dev/null +++ b/packages/muelu/research/caglusa/X_ex.mtx @@ -0,0 +1,1026 @@ +%%MatrixMarket matrix array real general +% +1023 1 +4.1471248665632702e-03 +6.9058473917915754e-03 +9.3786505553296404e-03 +1.1645955497068818e-02 +1.3771868350983742e-02 +1.5790146063222290e-02 +1.7722377020394111e-02 +1.9583331595063057e-02 +2.1383698963667208e-02 +2.3131537721495603e-02 +2.4833119484097464e-02 +2.6493450487440527e-02 +2.8116610654855226e-02 +2.9705982998868789e-02 +3.1264413750259297e-02 +3.2794327061747508e-02 +3.4297810737215752e-02 +3.5776679232969441e-02 +3.7232523388854716e-02 +3.8666748010919023e-02 +4.0080601582763255e-02 +4.1475200328572860e-02 +4.2851547819616545e-02 +4.4210550915483017e-02 +4.5553032711989898e-02 +4.6879743156484570e-02 +4.8191367964952284e-02 +4.9488536348239666e-02 +5.0771827796936328e-02 +5.2041777824947476e-02 +5.3298882341092202e-02 +5.4543600971590112e-02 +5.5776362475634583e-02 +5.6997566205636244e-02 +5.8207585727379753e-02 +5.9406771057951197e-02 +6.0595450577214140e-02 +6.1773932913132226e-02 +6.2942508756151289e-02 +6.4101452448735302e-02 +6.5251023258003846e-02 +6.6391466387980977e-02 +6.7523013911686636e-02 +6.8645885814077559e-02 +6.9760291175222172e-02 +7.0866429215076160e-02 +7.1964489664325879e-02 +7.3054652536166984e-02 +7.4137090248162271e-02 +7.5211967214233857e-02 +7.6279440669789561e-02 +7.7339661086837097e-02 +7.8392772455055673e-02 +7.9438912656548941e-02 +8.0478213953551925e-02 +8.1510803446249003e-02 +8.2536803368564948e-02 +8.3556331219260080e-02 +8.4569499869415365e-02 +8.5576417828977319e-02 +8.6577189722550810e-02 +8.7571916714313469e-02 +8.8560696347302625e-02 +8.9543621954883745e-02 +9.0520784683641428e-02 +9.1492272159260549e-02 +9.2458169049791289e-02 +9.3418557323709572e-02 +9.4373516292505788e-02 +9.5323122671116658e-02 +9.6267450767660842e-02 +9.7206572697672119e-02 +9.8140558478450046e-02 +9.9069475979365551e-02 +9.9993390859429737e-02 +1.0091236669011190e-01 +1.0182646533127954e-01 +1.0273574729219830e-01 +1.0364027146753073e-01 +1.0454009423986069e-01 +1.0543527113254042e-01 +1.0632585609766541e-01 +1.0721190148880960e-01 +1.0809345833124570e-01 +1.0897057631595816e-01 +1.0984330376109407e-01 +1.1071168772182578e-01 +1.1157577416469273e-01 +1.1243560804417427e-01 +1.1329123322327013e-01 +1.1414269235184275e-01 +1.1499002690273413e-01 +1.1583327745572136e-01 +1.1667248397584805e-01 +1.1750768548000320e-01 +1.1833891918170483e-01 +1.1916622241420106e-01 +1.1998963147423905e-01 +1.2080918162985881e-01 +1.2162490744880765e-01 +1.2243684280380267e-01 +1.2324502077513597e-01 +1.2404947369648556e-01 +1.2485023328776021e-01 +1.2564733070338679e-01 +1.2644079642674391e-01 +1.2723066012313372e-01 +1.2801695067083721e-01 +1.2879969647607215e-01 +1.2957892580882183e-01 +1.3035466648093730e-01 +1.3112694480408693e-01 +1.3189578729204329e-01 +1.3266122001445335e-01 +1.3342326820886510e-01 +1.3418195671041963e-01 +1.3493730996582706e-01 +1.3568935189443451e-01 +1.3643810590774663e-01 +1.3718359504935274e-01 +1.3792584206870109e-01 +1.3866486932856381e-01 +1.3940069864316776e-01 +1.4013335126655638e-01 +1.4086284815658234e-01 +1.4158921026542373e-01 +1.4231245818866370e-01 +1.4303261125359487e-01 +1.4374968941260369e-01 +1.4446371221327886e-01 +1.4517469848860201e-01 +1.4588266683294460e-01 +1.4658763565293773e-01 +1.4728962300872347e-01 +1.4798864660460453e-01 +1.4868472391265838e-01 +1.4937787223468463e-01 +1.5006810859664452e-01 +1.5075544957447209e-01 +1.5143991129102508e-01 +1.5212150972209412e-01 +1.5280026104985747e-01 +1.5347618132264343e-01 +1.5414928531480371e-01 +1.5481958831576151e-01 +1.5548710555949102e-01 +1.5615185156284148e-01 +1.5681384071661103e-01 +1.5747308734194748e-01 +1.5812960549262564e-01 +1.5878340892475837e-01 +1.5943451123356900e-01 +1.6008292594897855e-01 +1.6072866645391007e-01 +1.6137174580820418e-01 +1.6201217671409254e-01 +1.6264997177672308e-01 +1.6328514380893550e-01 +1.6391770545241302e-01 +1.6454766813361218e-01 +1.6517504409640149e-01 +1.6579984551551397e-01 +1.6642208388088725e-01 +1.6704177060612985e-01 +1.6765891712294129e-01 +1.6827353467629949e-01 +1.6888563427570591e-01 +1.6949522681929891e-01 +1.7010232317574475e-01 +1.7070693408660539e-01 +1.7130906997692397e-01 +1.7190874093176431e-01 +1.7250595700423177e-01 +1.7310072859344211e-01 +1.7369306609538557e-01 +1.7428297868293444e-01 +1.7487047618201271e-01 +1.7545556857032946e-01 +1.7603826508499390e-01 +1.7661857495796307e-01 +1.7719650751244923e-01 +1.7777207191654443e-01 +1.7834527711118436e-01 +1.7891613194458697e-01 +1.7948464528617525e-01 +1.8005082595326405e-01 +1.8061468252231877e-01 +1.8117622327660277e-01 +1.8173545647021794e-01 +1.8229239065938457e-01 +1.8284703432448654e-01 +1.8339939479835768e-01 +1.8394948031057756e-01 +1.8449729916401983e-01 +1.8504285893953959e-01 +1.8558616721202678e-01 +1.8612723168679854e-01 +1.8666605995797955e-01 +1.8720265942863465e-01 +1.8773703743821990e-01 +1.8826920136425190e-01 +1.8879915853338891e-01 +1.8932691601999727e-01 +1.8985248060573695e-01 +1.9037585908988200e-01 +1.9089705868886409e-01 +1.9141608667900836e-01 +1.9193294910612119e-01 +1.9244765273824868e-01 +1.9296020462523414e-01 +1.9347061100468596e-01 +1.9397887816552134e-01 +1.9448501258185560e-01 +1.9498902062724269e-01 +1.9549090847021680e-01 +1.9599068221174354e-01 +1.9648834802093612e-01 +1.9698391207494681e-01 +1.9747738036422616e-01 +1.9796875862751731e-01 +1.9845805261783736e-01 +1.9894526844845550e-01 +1.9943041219583457e-01 +1.9991348872688186e-01 +2.0039450384654448e-01 +2.0087346361779615e-01 +2.0135037329530311e-01 +2.0182523816084613e-01 +2.0229806369910366e-01 +2.0276885532489372e-01 +2.0323761827601375e-01 +2.0370435774340503e-01 +2.0416907899021064e-01 +2.0463178727093831e-01 +2.0509248762023763e-01 +2.0555118479854215e-01 +2.0600788360549985e-01 +2.0646258929998565e-01 +2.0691530723818521e-01 +2.0736604152455615e-01 +2.0781479703192551e-01 +2.0826157901775252e-01 +2.0870639185302858e-01 +2.0914923999922092e-01 +2.0959012817500811e-01 +2.1002906103439362e-01 +2.1046604303097283e-01 +2.1090107855446075e-01 +2.1133417208169694e-01 +2.1176532812445678e-01 +2.1219455102649815e-01 +2.1262184488625782e-01 +2.1304721382716812e-01 +2.1347066236717108e-01 +2.1389219502841758e-01 +2.1431181517070344e-01 +2.1472952705870452e-01 +2.1514533530244218e-01 +2.1555924364827742e-01 +2.1597125589082986e-01 +2.1638137608032335e-01 +2.1678960822132060e-01 +2.1719595614183171e-01 +2.1760042362691104e-01 +2.1800301455456611e-01 +2.1840373282367703e-01 +2.1880258213532150e-01 +2.1919956592628323e-01 +2.1959468768424253e-01 +2.1998795138444777e-01 +2.2037936112343021e-01 +2.2076891971924514e-01 +2.2115663078579090e-01 +2.2154249840041063e-01 +2.2192652567526952e-01 +2.2230871583441658e-01 +2.2268907241077265e-01 +2.2306759889428296e-01 +2.2344429857104536e-01 +2.2381917466228796e-01 +2.2419223049305087e-01 +2.2456346945159089e-01 +2.2493289478291489e-01 +2.2530050950157757e-01 +2.2566631666167666e-01 +2.2603031973476390e-01 +2.2639252220269734e-01 +2.2675292629243118e-01 +2.2711153520076582e-01 +2.2746835258714906e-01 +2.2782338115434947e-01 +2.2817662366137564e-01 +2.2852808316495513e-01 +2.2887776269559101e-01 +2.2922566510536754e-01 +2.2957179320309978e-01 +2.2991614990371631e-01 +2.3025873816310591e-01 +2.3059956075248719e-01 +2.3093862018075675e-01 +2.3127591901055178e-01 +2.3161146030958163e-01 +2.3194524728298613e-01 +2.3227728183366064e-01 +2.3260756668075452e-01 +2.3293610507708842e-01 +2.3326289924218710e-01 +2.3358795152783027e-01 +2.3391126464171941e-01 +2.3423284126798460e-01 +2.3455268388135025e-01 +2.3487079488445636e-01 +2.3518717678811007e-01 +2.3550183217729720e-01 +2.3581476349875752e-01 +2.3612597296354196e-01 +2.3643546281835148e-01 +2.3674323574020795e-01 +2.3704929443751355e-01 +2.3735364039319098e-01 +2.3765627604532977e-01 +2.3795720433408568e-01 +2.3825642720676501e-01 +2.3855394667715926e-01 +2.3884976509010170e-01 +2.3914388477481771e-01 +2.3943630787365050e-01 +2.3972703647951890e-01 +2.4001607279907863e-01 +2.4030341909606703e-01 +2.4058907746152283e-01 +2.4087304972683882e-01 +2.4115533777934978e-01 +2.4143594402471996e-01 +2.4171487101830164e-01 +2.4199211999276496e-01 +2.4226769300712397e-01 +2.4254159270995998e-01 +2.4281382064932183e-01 +2.4308437851505477e-01 +2.4335326838667420e-01 +2.4362049233116953e-01 +2.4388605219722212e-01 +2.4414994975389773e-01 +2.4441218688516558e-01 +2.4467276556676459e-01 +2.4493168765318682e-01 +2.4518895477335467e-01 +2.4544456860049965e-01 +2.4569853125198288e-01 +2.4595084487982846e-01 +2.4620151034601578e-01 +2.4645052948051571e-01 +2.4669790472862788e-01 +2.4694363745281689e-01 +2.4718772908184788e-01 +2.4743018140493833e-01 +2.4767099620934613e-01 +2.4791017509227969e-01 +2.4814771959841825e-01 +2.4838363139308214e-01 +2.4861791221166657e-01 +2.4885056362534194e-01 +2.4908158694480956e-01 +2.4931098353378525e-01 +2.4953875528015063e-01 +2.4976490422919215e-01 +2.4998943108890176e-01 +2.5021233739951299e-01 +2.5043362534248292e-01 +2.5065329594389091e-01 +2.5087135038377428e-01 +2.5108779026541556e-01 +2.5130261719248770e-01 +2.5151583254319620e-01 +2.5172743760631966e-01 +2.5193743378420014e-01 +2.5214582257567097e-01 +2.5235260535982096e-01 +2.5255778328392409e-01 +2.5276135753281626e-01 +2.5296332974133595e-01 +2.5316370159796514e-01 +2.5336247355254549e-01 +2.5355964696915045e-01 +2.5375522384656396e-01 +2.5394920508944485e-01 +2.5414159167676775e-01 +2.5433238497113769e-01 +2.5452158633824767e-01 +2.5470919694316424e-01 +2.5489521788872110e-01 +2.5507965039969133e-01 +2.5526249578071453e-01 +2.5544375518095574e-01 +2.5562342949091876e-01 +2.5580151965296333e-01 +2.5597802713819656e-01 +2.5615295358241430e-01 +2.5632629927629891e-01 +2.5649806534196462e-01 +2.5666825358474710e-01 +2.5683686460320870e-01 +2.5700389915486849e-01 +2.5716935844463962e-01 +2.5733324368561689e-01 +2.5749555585744716e-01 +2.5765629584228733e-01 +2.5781546463866134e-01 +2.5797306335426384e-01 +2.5812909299112713e-01 +2.5828355432810624e-01 +2.5843644818568323e-01 +2.5858777583780562e-01 +2.5873753860796883e-01 +2.5888573651644103e-01 +2.5903237052573647e-01 +2.5917744233212614e-01 +2.5932095245102793e-01 +2.5946290146591278e-01 +2.5960329036398194e-01 +2.5974212014638198e-01 +2.5987939161169432e-01 +2.6001510549302753e-01 +2.6014926264925842e-01 +2.6028186402863035e-01 +2.6041291043136544e-01 +2.6054240239879317e-01 +2.6067034051865395e-01 +2.6079672590508968e-01 +2.6092155983995496e-01 +2.6104484225793939e-01 +2.6116657392001136e-01 +2.6128675630880710e-01 +2.6140538966042703e-01 +2.6152247437791482e-01 +2.6163801133661702e-01 +2.6175200143065536e-01 +2.6186444531541131e-01 +2.6197534353964902e-01 +2.6208469676488466e-01 +2.6219250576366437e-01 +2.6229877120368833e-01 +2.6240349352392883e-01 +2.6250667319559484e-01 +2.6260831114040917e-01 +2.6270840834176351e-01 +2.6280696452983532e-01 +2.6290398032787515e-01 +2.6299945710554251e-01 +2.6309339505454454e-01 +2.6318579443948553e-01 +2.6327665594314514e-01 +2.6336598026369706e-01 +2.6345376788608788e-01 +2.6354001921882286e-01 +2.6362473479383863e-01 +2.6370791523882581e-01 +2.6378956104177098e-01 +2.6386967243508652e-01 +2.6394824969507741e-01 +2.6402529362224797e-01 +2.6410080518895385e-01 +2.6417478402653727e-01 +2.6424723058190469e-01 +2.6431814605397103e-01 +2.6438753035880291e-01 +2.6445538358057358e-01 +2.6452170629143562e-01 +2.6458649908737170e-01 +2.6464976231851722e-01 +2.6471149621972356e-01 +2.6477170113781662e-01 +2.6483037753936534e-01 +2.6488752579878760e-01 +2.6494314607117297e-01 +2.6499723854681589e-01 +2.6504980386549426e-01 +2.6510084272637047e-01 +2.6515035453812547e-01 +2.6519833960483008e-01 +2.6524479905631260e-01 +2.6528973277284223e-01 +2.6533314070031705e-01 +2.6537502321758782e-01 +2.6541538072956139e-01 +2.6545421342881059e-01 +2.6549152142929316e-01 +2.6552730497035820e-01 +2.6556156439439521e-01 +2.6559429991168898e-01 +2.6562551147820218e-01 +2.6565519908647778e-01 +2.6568336324335895e-01 +2.6571000462658489e-01 +2.6573512258394277e-01 +2.6575871726274597e-01 +2.6578078958885870e-01 +2.6580133917964938e-01 +2.6582036582461444e-01 +2.6583786981807461e-01 +2.6585385148664675e-01 +2.6586831090748575e-01 +2.6588124803387020e-01 +2.6589266292543118e-01 +2.6590255576138516e-01 +2.6591092663036131e-01 +2.6591777539890954e-01 +2.6592310195991714e-01 +2.6592690664907925e-01 +2.6592918987459913e-01 +2.6592995082640042e-01 +2.6592918950915639e-01 +2.6592690674121311e-01 +2.6592310212318981e-01 +2.6591777532829103e-01 +2.6591092647227471e-01 +2.6590255569710242e-01 +2.6589266292277464e-01 +2.6588124797892382e-01 +2.6586831081486334e-01 +2.6585385148612822e-01 +2.6583786992412300e-01 +2.6582036581066132e-01 +2.6580133886004931e-01 +2.6578078929181748e-01 +2.6575871749766522e-01 +2.6573512256006582e-01 +2.6571000434077036e-01 +2.6568336350048294e-01 +2.6565519937045184e-01 +2.6562551145282520e-01 +2.6559429976375426e-01 +2.6556156435579609e-01 +2.6552730502728550e-01 +2.6549152144470439e-01 +2.6545421337774960e-01 +2.6541538072146009e-01 +2.6537502329205320e-01 +2.6533314069328151e-01 +2.6528973255511623e-01 +2.6524479894083142e-01 +2.6519833997926257e-01 +2.6515035454883867e-01 +2.6510084235499082e-01 +2.6504980399763722e-01 +2.6499723878662873e-01 +2.6494314609132241e-01 +2.6488752573039831e-01 +2.6483037755761940e-01 +2.6477170120750204e-01 +2.6471149622261830e-01 +2.6464976226540715e-01 +2.6458649911017779e-01 +2.6452170641568612e-01 +2.6445538359467863e-01 +2.6438753008395011e-01 +2.6431814580878960e-01 +2.6424723086268487e-01 +2.6417478405532313e-01 +2.6410080494929750e-01 +2.6402529392235669e-01 +2.6394825001151878e-01 +2.6386967242570958e-01 +2.6378956089786948e-01 +2.6370791520468034e-01 +2.6362473486732013e-01 +2.6354001926750553e-01 +2.6345376788290958e-01 +2.6336598031461728e-01 +2.6327665608704898e-01 +2.6318579451122731e-01 +2.6309339491374123e-01 +2.6299945703980088e-01 +2.6290398070748333e-01 +2.6280696455590524e-01 +2.6270840797207501e-01 +2.6260831123526751e-01 +2.6250667337170991e-01 +2.6240349346944464e-01 +2.6229877106696847e-01 +2.6219250573492459e-01 +2.6208469681530017e-01 +2.6197534354545926e-01 +2.6186444527396985e-01 +2.6175200146209038e-01 +2.6163801146418908e-01 +2.6152247439570220e-01 +2.6140538939108471e-01 +2.6128675605772145e-01 +2.6116657417007638e-01 +2.6104484225488500e-01 +2.6092155956161239e-01 +2.6079672616574001e-01 +2.6067034079564094e-01 +2.6054240234750159e-01 +2.6041291024382662e-01 +2.6028186395340047e-01 +2.6014926268615873e-01 +2.6001510550426238e-01 +2.5987939155949147e-01 +2.5974212012942605e-01 +2.5960329042596814e-01 +2.5946290145827783e-01 +2.5932095224967516e-01 +2.5917744222776912e-01 +2.5903237088821229e-01 +2.5888573654450969e-01 +2.5873753824555162e-01 +2.5858777598190280e-01 +2.5843644844089847e-01 +2.5828355435960915e-01 +2.5812909292860747e-01 +2.5797306338001774e-01 +2.5781546472283162e-01 +2.5765629586059957e-01 +2.5749555580625533e-01 +2.5733324368907096e-01 +2.5716935854054618e-01 +2.5700389915851318e-01 +2.5683686434926239e-01 +2.5666825336723420e-01 +2.5649806562602262e-01 +2.5632629933102730e-01 +2.5615295337212185e-01 +2.5597802747051845e-01 +2.5580152000216727e-01 +2.5562342950787059e-01 +2.5544375505721345e-01 +2.5526249577153359e-01 +2.5507965051353076e-01 +2.5489521799067727e-01 +2.5470919699060285e-01 +2.5452158642294292e-01 +2.5433238513488282e-01 +2.5414159177276985e-01 +2.5394920498627538e-01 +2.5375522380937465e-01 +2.5355964735041003e-01 +2.5336247362218989e-01 +2.5316370127404575e-01 +2.5296332986911085e-01 +2.5276135773162950e-01 +2.5255778323970829e-01 +2.5235260522159969e-01 +2.5214582254307910e-01 +2.5193743383815187e-01 +2.5172743762132799e-01 +2.5151583250388515e-01 +2.5130261721069269e-01 +2.5108779037691425e-01 +2.5087135041201086e-01 +2.5065329572615414e-01 +2.5043362515365430e-01 +2.5021233768303924e-01 +2.4998943114579567e-01 +2.4976490401608215e-01 +2.4953875560036540e-01 +2.4931098386746064e-01 +2.4908158694381116e-01 +2.4885056348017856e-01 +2.4861791218027149e-01 +2.4838363148734330e-01 +2.4814771968069510e-01 +2.4791017511006422e-01 +2.4767099624596856e-01 +2.4743018150621077e-01 +2.4718772911834219e-01 +2.4694363730825208e-01 +2.4669790466308886e-01 +2.4645052983637686e-01 +2.4620151039705376e-01 +2.4595084453147109e-01 +2.4569853139374054e-01 +2.4544456884753860e-01 +2.4518895479149280e-01 +2.4493168756862252e-01 +2.4467276556625403e-01 +2.4441218694618438e-01 +2.4414994974923657e-01 +2.4388605210834202e-01 +2.4362049227141516e-01 +2.4335326840648414e-01 +2.4308437846302125e-01 +2.4281382037835098e-01 +2.4254159248052382e-01 +2.4226769323973313e-01 +2.4199212002374762e-01 +2.4171487079158929e-01 +2.4143594432888124e-01 +2.4115533809802794e-01 +2.4087304971143980e-01 +2.4058907730015627e-01 +2.4030341905114741e-01 +2.4001607289176005e-01 +2.3972703657694888e-01 +2.3943630791918569e-01 +2.3914388484488036e-01 +2.3884976523084442e-01 +2.3855394676679387e-01 +2.3825642712718434e-01 +2.3795720431847039e-01 +2.3765627641375361e-01 +2.3735364049141530e-01 +2.3704929413430176e-01 +2.3674323588028245e-01 +2.3643546304118454e-01 +2.3612597296058191e-01 +2.3581476341277885e-01 +2.3550183220780210e-01 +2.3518717692006549e-01 +2.3487079498608116e-01 +2.3455268391698356e-01 +2.3423284133224678e-01 +2.3391126477902846e-01 +2.3358795159484996e-01 +2.3326289909412901e-01 +2.3293610494845307e-01 +2.3260756696211835e-01 +2.3227728190400276e-01 +2.3194524707860290e-01 +2.3161146060712520e-01 +2.3127591930782529e-01 +2.3093862013681349e-01 +2.3059956055573269e-01 +2.3025873808003072e-01 +2.2991614996289533e-01 +2.2957179327322941e-01 +2.2922566512145939e-01 +2.2887776272445448e-01 +2.2852808325572316e-01 +2.2817662371020683e-01 +2.2782338105709835e-01 +2.2746835256447925e-01 +2.2711153555692323e-01 +2.2675292640014916e-01 +2.2639252192523132e-01 +2.2603031993327413e-01 +2.2566631696979622e-01 +2.2530050959111728e-01 +2.2493289477160430e-01 +2.2456346952534051e-01 +2.2419223063609695e-01 +2.2381917474483870e-01 +2.2344429855633061e-01 +2.2306759887944658e-01 +2.2268907245802994e-01 +2.2230871583190470e-01 +2.2192652549852832e-01 +2.2154249826573813e-01 +2.2115663105387898e-01 +2.2076891981581140e-01 +2.2037936097013885e-01 +2.1998795173203681e-01 +2.1959468803740079e-01 +2.1919956594401910e-01 +2.1880258199794297e-01 +2.1840373279632758e-01 +2.1800301467219643e-01 +2.1760042376128813e-01 +2.1719595622095195e-01 +2.1678960830197783e-01 +2.1638137621221029e-01 +2.1597125598287384e-01 +2.1555924360017029e-01 +2.1514533530735522e-01 +2.1472952739640985e-01 +2.1431181529344426e-01 +2.1389219477336832e-01 +2.1347066251586225e-01 +2.1304721403763943e-01 +2.1262184486034597e-01 +2.1219455090101830e-01 +2.1176532810206905e-01 +2.1133417216090516e-01 +2.1090107860757321e-01 +2.1046604300789379e-01 +2.1002906101534188e-01 +2.0959012821952469e-01 +2.0914924000962790e-01 +2.0870639171101915e-01 +2.0826157890815922e-01 +2.0781479727688007e-01 +2.0736604160411515e-01 +2.0691530706419961e-01 +2.0646258960092698e-01 +2.0600788390555450e-01 +2.0555118476754430e-01 +2.0509248743662187e-01 +2.0463178720218783e-01 +2.0416907907981566e-01 +2.0370435786601995e-01 +2.0323761834975498e-01 +2.0276885539299688e-01 +2.0229806381115797e-01 +2.0182523824283000e-01 +2.0135037325773236e-01 +2.0087346363038314e-01 +2.0039450416317617e-01 +1.9991348884782997e-01 +1.9943041193790217e-01 +1.9894526862589801e-01 +1.9845805289415058e-01 +1.9796875868927857e-01 +1.9747738031946147e-01 +1.9698391210788455e-01 +1.9648834812666860e-01 +1.9599068226227215e-01 +1.9549090841045835e-01 +1.9498902053607858e-01 +1.9448501253678258e-01 +1.9397887810553494e-01 +1.9347061083606551e-01 +1.9296020450980264e-01 +1.9244765296089100e-01 +1.9193294920889287e-01 +1.9141608655870426e-01 +1.9089705903917412e-01 +1.9037585944809385e-01 +1.8985248064461677e-01 +1.8932691590671466e-01 +1.8879915853096968e-01 +1.8826920152215840e-01 +1.8773703763413149e-01 +1.8720265957157523e-01 +1.8666606007865497e-01 +1.8612723183675597e-01 +1.8558616733693045e-01 +1.8504285896066811e-01 +1.8449729922258554e-01 +1.8394948063280142e-01 +1.8339939497748536e-01 +1.8284703412104847e-01 +1.8229239082619100e-01 +1.8173545670795815e-01 +1.8117622330744945e-01 +1.8061468247006274e-01 +1.8005082601357131e-01 +1.7948464546399304e-01 +1.7891613210840995e-01 +1.7834527718399418e-01 +1.7777207195097861e-01 +1.7719650757810126e-01 +1.7661857500814432e-01 +1.7603826503110917e-01 +1.7545556853194672e-01 +1.7487047639293604e-01 +1.7428297875399176e-01 +1.7369306591174802e-01 +1.7310072881880262e-01 +1.7250595720497744e-01 +1.7190874079964269e-01 +1.7130906968111329e-01 +1.7070693389795288e-01 +1.7010232316087553e-01 +1.6949522686677959e-01 +1.6888563428858036e-01 +1.6827353467257916e-01 +1.6765891715594616e-01 +1.6704177064252884e-01 +1.6642208385267199e-01 +1.6579984552926910e-01 +1.6517504434194061e-01 +1.6454766827458892e-01 +1.6391770524907584e-01 +1.6328514400814936e-01 +1.6264997208081255e-01 +1.6201217682872487e-01 +1.6137174582541691e-01 +1.6072866655083140e-01 +1.6008292613075098e-01 +1.5943451137191803e-01 +1.5878340893850404e-01 +1.5812960543347643e-01 +1.5747308730235762e-01 +1.5681384069650200e-01 +1.5615185150476785e-01 +1.5548710555287182e-01 +1.5481958854567782e-01 +1.5414928547134940e-01 +1.5347618127079274e-01 +1.5280026140591255e-01 +1.5212151006778132e-01 +1.5143991131949364e-01 +1.5075544943677757e-01 +1.5006810855381636e-01 +1.4937787235726852e-01 +1.4868472409008254e-01 +1.4798864672626524e-01 +1.4728962307624002e-01 +1.4658763572429226e-01 +1.4588266690500126e-01 +1.4517469851396758e-01 +1.4446371226815444e-01 +1.4374968965360507e-01 +1.4303261144510687e-01 +1.4231245802620229e-01 +1.4158921041201317e-01 +1.4086284835686566e-01 +1.4013335126812360e-01 +1.3940069855759790e-01 +1.3866486935040281e-01 +1.3792584222112284e-01 +1.3718359520635240e-01 +1.3643810596722378e-01 +1.3568935188178760e-01 +1.3493730997073849e-01 +1.3418195675784120e-01 +1.3342326825232931e-01 +1.3266122009004011e-01 +1.3189578751821518e-01 +1.3112694496057847e-01 +1.3035466641476079e-01 +1.2957892609608462e-01 +1.2879969673272296e-01 +1.2801695061117352e-01 +1.2723065989895924e-01 +1.2644079630847110e-01 +1.2564733078260726e-01 +1.2485023346515908e-01 +1.2404947384904462e-01 +1.2324502088218499e-01 +1.2243684291910975e-01 +1.2162490758883412e-01 +1.2080918175136807e-01 +1.1998963159767308e-01 +1.1916622264338551e-01 +1.1833891939595748e-01 +1.1750768535923142e-01 +1.1667248418490690e-01 +1.1583327774885450e-01 +1.1499002701047979e-01 +1.1414269234777064e-01 +1.1329123327949309e-01 +1.1243560818276514e-01 +1.1157577425934373e-01 +1.1071168765940058e-01 +1.0984330356216919e-01 +1.0897057610033521e-01 +1.0809345818784676e-01 +1.0721190141421202e-01 +1.0632585608761556e-01 +1.0543527124141062e-01 +1.0454009435973428e-01 +1.0364027141870140e-01 +1.0273574759744368e-01 +1.0182646562573584e-01 +1.0091236668800901e-01 +9.9993390691209383e-02 +9.9069475906892593e-02 +9.8140558599815811e-02 +9.7206572910827710e-02 +9.6267450924881925e-02 +9.5323122725512369e-02 +9.4373516305190377e-02 +9.3418557357324183e-02 +9.2458169095194082e-02 +9.1492272200881589e-02 +9.0520784788002670e-02 +8.9543622145882698e-02 +8.8560696197044153e-02 +8.7571916834802602e-02 +8.6577189915804931e-02 +8.5576417859246176e-02 +8.4569499819801205e-02 +8.3556331275854934e-02 +8.2536803569677367e-02 +8.1510803659077952e-02 +8.0478214028935430e-02 +7.9438912579520404e-02 +7.8392772351776149e-02 +7.7339661094439627e-02 +7.6279440806365728e-02 +7.5211967394887475e-02 +7.4137090425319643e-02 +7.3054652733735459e-02 +7.1964489658780259e-02 +7.0866429487953950e-02 +6.9760291387380699e-02 +6.8645885689441438e-02 +6.7523013585441424e-02 +6.6391466152607825e-02 +6.5251023253811782e-02 +6.4101452588797764e-02 +6.2942508867361233e-02 +6.1773932915109783e-02 +6.0595450535730122e-02 +5.9406771078812703e-02 +5.8207585809871856e-02 +5.6997566237402951e-02 +5.5776362438815993e-02 +5.4543601096160514e-02 +5.3298882186681558e-02 +5.2041777975995046e-02 +5.0771828018043107e-02 +4.9488536368053726e-02 +4.8191367864621901e-02 +4.6879743167796750e-02 +4.5553032920553842e-02 +4.4210551179221645e-02 +4.2851547919463065e-02 +4.1475200183522493e-02 +4.0080601333621874e-02 +3.8666747889063539e-02 +3.7232523469437867e-02 +3.5776679327228174e-02 +3.4297810667814017e-02 +3.2794327104022969e-02 +3.1264413679425347e-02 +2.9705983134345838e-02 +2.8116610824184526e-02 +2.6493450505715051e-02 +2.4833119375714186e-02 +2.3131537620341945e-02 +2.1383698957103285e-02 +1.9583331664725527e-02 +1.7722377088985063e-02 +1.5790146076929322e-02 +1.3771868322340052e-02 +1.1645955478497741e-02 +9.3786505739632039e-03 +6.9058474155568239e-03 +4.1471248584590203e-03 diff --git a/packages/muelu/research/caglusa/aux.mtx b/packages/muelu/research/caglusa/aux.mtx new file mode 100644 index 000000000000..4703d2dd7987 --- /dev/null +++ b/packages/muelu/research/caglusa/aux.mtx @@ -0,0 +1,3070 @@ +%%MatrixMarket matrix coordinate real general +% +1023 1023 3067 +1 1 2.048000000000000e+03 +1 2 -1.024000000000000e+03 +2 1 -1.024000000000000e+03 +2 2 2.048000000000000e+03 +2 3 -1.024000000000000e+03 +3 2 -1.024000000000000e+03 +3 3 2.048000000000000e+03 +3 4 -1.024000000000000e+03 +4 3 -1.024000000000000e+03 +4 4 2.048000000000000e+03 +4 5 -1.024000000000000e+03 +5 4 -1.024000000000000e+03 +5 5 2.048000000000000e+03 +5 6 -1.024000000000000e+03 +6 5 -1.024000000000000e+03 +6 6 2.048000000000000e+03 +6 7 -1.024000000000000e+03 +7 6 -1.024000000000000e+03 +7 7 2.048000000000000e+03 +7 8 -1.024000000000000e+03 +8 7 -1.024000000000000e+03 +8 8 2.048000000000000e+03 +8 9 -1.024000000000000e+03 +9 8 -1.024000000000000e+03 +9 9 2.048000000000000e+03 +9 10 -1.024000000000000e+03 +10 9 -1.024000000000000e+03 +10 10 2.048000000000000e+03 +10 11 -1.024000000000000e+03 +11 10 -1.024000000000000e+03 +11 11 2.048000000000000e+03 +11 12 -1.024000000000000e+03 +12 11 -1.024000000000000e+03 +12 12 2.048000000000000e+03 +12 13 -1.024000000000000e+03 +13 12 -1.024000000000000e+03 +13 13 2.048000000000000e+03 +13 14 -1.024000000000000e+03 +14 13 -1.024000000000000e+03 +14 14 2.048000000000000e+03 +14 15 -1.024000000000000e+03 +15 14 -1.024000000000000e+03 +15 15 2.048000000000000e+03 +15 16 -1.024000000000000e+03 +16 15 -1.024000000000000e+03 +16 16 2.048000000000000e+03 +16 17 -1.024000000000000e+03 +17 16 -1.024000000000000e+03 +17 17 2.048000000000000e+03 +17 18 -1.024000000000000e+03 +18 17 -1.024000000000000e+03 +18 18 2.048000000000000e+03 +18 19 -1.024000000000000e+03 +19 18 -1.024000000000000e+03 +19 19 2.048000000000000e+03 +19 20 -1.024000000000000e+03 +20 19 -1.024000000000000e+03 +20 20 2.048000000000000e+03 +20 21 -1.024000000000000e+03 +21 20 -1.024000000000000e+03 +21 21 2.048000000000000e+03 +21 22 -1.024000000000000e+03 +22 21 -1.024000000000000e+03 +22 22 2.048000000000000e+03 +22 23 -1.024000000000000e+03 +23 22 -1.024000000000000e+03 +23 23 2.048000000000000e+03 +23 24 -1.024000000000000e+03 +24 23 -1.024000000000000e+03 +24 24 2.048000000000000e+03 +24 25 -1.024000000000000e+03 +25 24 -1.024000000000000e+03 +25 25 2.048000000000000e+03 +25 26 -1.024000000000000e+03 +26 25 -1.024000000000000e+03 +26 26 2.048000000000000e+03 +26 27 -1.024000000000000e+03 +27 26 -1.024000000000000e+03 +27 27 2.048000000000000e+03 +27 28 -1.024000000000000e+03 +28 27 -1.024000000000000e+03 +28 28 2.048000000000000e+03 +28 29 -1.024000000000000e+03 +29 28 -1.024000000000000e+03 +29 29 2.048000000000000e+03 +29 30 -1.024000000000000e+03 +30 29 -1.024000000000000e+03 +30 30 2.048000000000000e+03 +30 31 -1.024000000000000e+03 +31 30 -1.024000000000000e+03 +31 31 2.048000000000000e+03 +31 32 -1.024000000000000e+03 +32 31 -1.024000000000000e+03 +32 32 2.048000000000000e+03 +32 33 -1.024000000000000e+03 +33 32 -1.024000000000000e+03 +33 33 2.048000000000000e+03 +33 34 -1.024000000000000e+03 +34 33 -1.024000000000000e+03 +34 34 2.048000000000000e+03 +34 35 -1.024000000000000e+03 +35 34 -1.024000000000000e+03 +35 35 2.048000000000000e+03 +35 36 -1.024000000000000e+03 +36 35 -1.024000000000000e+03 +36 36 2.048000000000000e+03 +36 37 -1.024000000000000e+03 +37 36 -1.024000000000000e+03 +37 37 2.048000000000000e+03 +37 38 -1.024000000000000e+03 +38 37 -1.024000000000000e+03 +38 38 2.048000000000000e+03 +38 39 -1.024000000000000e+03 +39 38 -1.024000000000000e+03 +39 39 2.048000000000000e+03 +39 40 -1.024000000000000e+03 +40 39 -1.024000000000000e+03 +40 40 2.048000000000000e+03 +40 41 -1.024000000000000e+03 +41 40 -1.024000000000000e+03 +41 41 2.048000000000000e+03 +41 42 -1.024000000000000e+03 +42 41 -1.024000000000000e+03 +42 42 2.048000000000000e+03 +42 43 -1.024000000000000e+03 +43 42 -1.024000000000000e+03 +43 43 2.048000000000000e+03 +43 44 -1.024000000000000e+03 +44 43 -1.024000000000000e+03 +44 44 2.048000000000000e+03 +44 45 -1.024000000000000e+03 +45 44 -1.024000000000000e+03 +45 45 2.048000000000000e+03 +45 46 -1.024000000000000e+03 +46 45 -1.024000000000000e+03 +46 46 2.048000000000000e+03 +46 47 -1.024000000000000e+03 +47 46 -1.024000000000000e+03 +47 47 2.048000000000000e+03 +47 48 -1.024000000000000e+03 +48 47 -1.024000000000000e+03 +48 48 2.048000000000000e+03 +48 49 -1.024000000000000e+03 +49 48 -1.024000000000000e+03 +49 49 2.048000000000000e+03 +49 50 -1.024000000000000e+03 +50 49 -1.024000000000000e+03 +50 50 2.048000000000000e+03 +50 51 -1.024000000000000e+03 +51 50 -1.024000000000000e+03 +51 51 2.048000000000000e+03 +51 52 -1.024000000000000e+03 +52 51 -1.024000000000000e+03 +52 52 2.048000000000000e+03 +52 53 -1.024000000000000e+03 +53 52 -1.024000000000000e+03 +53 53 2.048000000000000e+03 +53 54 -1.024000000000000e+03 +54 53 -1.024000000000000e+03 +54 54 2.048000000000000e+03 +54 55 -1.024000000000000e+03 +55 54 -1.024000000000000e+03 +55 55 2.048000000000000e+03 +55 56 -1.024000000000000e+03 +56 55 -1.024000000000000e+03 +56 56 2.048000000000000e+03 +56 57 -1.024000000000000e+03 +57 56 -1.024000000000000e+03 +57 57 2.048000000000000e+03 +57 58 -1.024000000000000e+03 +58 57 -1.024000000000000e+03 +58 58 2.048000000000000e+03 +58 59 -1.024000000000000e+03 +59 58 -1.024000000000000e+03 +59 59 2.048000000000000e+03 +59 60 -1.024000000000000e+03 +60 59 -1.024000000000000e+03 +60 60 2.048000000000000e+03 +60 61 -1.024000000000000e+03 +61 60 -1.024000000000000e+03 +61 61 2.048000000000000e+03 +61 62 -1.024000000000000e+03 +62 61 -1.024000000000000e+03 +62 62 2.048000000000000e+03 +62 63 -1.024000000000000e+03 +63 62 -1.024000000000000e+03 +63 63 2.048000000000000e+03 +63 64 -1.024000000000000e+03 +64 63 -1.024000000000000e+03 +64 64 2.048000000000000e+03 +64 65 -1.024000000000000e+03 +65 64 -1.024000000000000e+03 +65 65 2.048000000000000e+03 +65 66 -1.024000000000000e+03 +66 65 -1.024000000000000e+03 +66 66 2.048000000000000e+03 +66 67 -1.024000000000000e+03 +67 66 -1.024000000000000e+03 +67 67 2.048000000000000e+03 +67 68 -1.024000000000000e+03 +68 67 -1.024000000000000e+03 +68 68 2.048000000000000e+03 +68 69 -1.024000000000000e+03 +69 68 -1.024000000000000e+03 +69 69 2.048000000000000e+03 +69 70 -1.024000000000000e+03 +70 69 -1.024000000000000e+03 +70 70 2.048000000000000e+03 +70 71 -1.024000000000000e+03 +71 70 -1.024000000000000e+03 +71 71 2.048000000000000e+03 +71 72 -1.024000000000000e+03 +72 71 -1.024000000000000e+03 +72 72 2.048000000000000e+03 +72 73 -1.024000000000000e+03 +73 72 -1.024000000000000e+03 +73 73 2.048000000000000e+03 +73 74 -1.024000000000000e+03 +74 73 -1.024000000000000e+03 +74 74 2.048000000000000e+03 +74 75 -1.024000000000000e+03 +75 74 -1.024000000000000e+03 +75 75 2.048000000000000e+03 +75 76 -1.024000000000000e+03 +76 75 -1.024000000000000e+03 +76 76 2.048000000000000e+03 +76 77 -1.024000000000000e+03 +77 76 -1.024000000000000e+03 +77 77 2.048000000000000e+03 +77 78 -1.024000000000000e+03 +78 77 -1.024000000000000e+03 +78 78 2.048000000000000e+03 +78 79 -1.024000000000000e+03 +79 78 -1.024000000000000e+03 +79 79 2.048000000000000e+03 +79 80 -1.024000000000000e+03 +80 79 -1.024000000000000e+03 +80 80 2.048000000000000e+03 +80 81 -1.024000000000000e+03 +81 80 -1.024000000000000e+03 +81 81 2.048000000000000e+03 +81 82 -1.024000000000000e+03 +82 81 -1.024000000000000e+03 +82 82 2.048000000000000e+03 +82 83 -1.024000000000000e+03 +83 82 -1.024000000000000e+03 +83 83 2.048000000000000e+03 +83 84 -1.024000000000000e+03 +84 83 -1.024000000000000e+03 +84 84 2.048000000000000e+03 +84 85 -1.024000000000000e+03 +85 84 -1.024000000000000e+03 +85 85 2.048000000000000e+03 +85 86 -1.024000000000000e+03 +86 85 -1.024000000000000e+03 +86 86 2.048000000000000e+03 +86 87 -1.024000000000000e+03 +87 86 -1.024000000000000e+03 +87 87 2.048000000000000e+03 +87 88 -1.024000000000000e+03 +88 87 -1.024000000000000e+03 +88 88 2.048000000000000e+03 +88 89 -1.024000000000000e+03 +89 88 -1.024000000000000e+03 +89 89 2.048000000000000e+03 +89 90 -1.024000000000000e+03 +90 89 -1.024000000000000e+03 +90 90 2.048000000000000e+03 +90 91 -1.024000000000000e+03 +91 90 -1.024000000000000e+03 +91 91 2.048000000000000e+03 +91 92 -1.024000000000000e+03 +92 91 -1.024000000000000e+03 +92 92 2.048000000000000e+03 +92 93 -1.024000000000000e+03 +93 92 -1.024000000000000e+03 +93 93 2.048000000000000e+03 +93 94 -1.024000000000000e+03 +94 93 -1.024000000000000e+03 +94 94 2.048000000000000e+03 +94 95 -1.024000000000000e+03 +95 94 -1.024000000000000e+03 +95 95 2.048000000000000e+03 +95 96 -1.024000000000000e+03 +96 95 -1.024000000000000e+03 +96 96 2.048000000000000e+03 +96 97 -1.024000000000000e+03 +97 96 -1.024000000000000e+03 +97 97 2.048000000000000e+03 +97 98 -1.024000000000000e+03 +98 97 -1.024000000000000e+03 +98 98 2.048000000000000e+03 +98 99 -1.024000000000000e+03 +99 98 -1.024000000000000e+03 +99 99 2.048000000000000e+03 +99 100 -1.024000000000000e+03 +100 99 -1.024000000000000e+03 +100 100 2.048000000000000e+03 +100 101 -1.024000000000000e+03 +101 100 -1.024000000000000e+03 +101 101 2.048000000000000e+03 +101 102 -1.024000000000000e+03 +102 101 -1.024000000000000e+03 +102 102 2.048000000000000e+03 +102 103 -1.024000000000000e+03 +103 102 -1.024000000000000e+03 +103 103 2.048000000000000e+03 +103 104 -1.024000000000000e+03 +104 103 -1.024000000000000e+03 +104 104 2.048000000000000e+03 +104 105 -1.024000000000000e+03 +105 104 -1.024000000000000e+03 +105 105 2.048000000000000e+03 +105 106 -1.024000000000000e+03 +106 105 -1.024000000000000e+03 +106 106 2.048000000000000e+03 +106 107 -1.024000000000000e+03 +107 106 -1.024000000000000e+03 +107 107 2.048000000000000e+03 +107 108 -1.024000000000000e+03 +108 107 -1.024000000000000e+03 +108 108 2.048000000000000e+03 +108 109 -1.024000000000000e+03 +109 108 -1.024000000000000e+03 +109 109 2.048000000000000e+03 +109 110 -1.024000000000000e+03 +110 109 -1.024000000000000e+03 +110 110 2.048000000000000e+03 +110 111 -1.024000000000000e+03 +111 110 -1.024000000000000e+03 +111 111 2.048000000000000e+03 +111 112 -1.024000000000000e+03 +112 111 -1.024000000000000e+03 +112 112 2.048000000000000e+03 +112 113 -1.024000000000000e+03 +113 112 -1.024000000000000e+03 +113 113 2.048000000000000e+03 +113 114 -1.024000000000000e+03 +114 113 -1.024000000000000e+03 +114 114 2.048000000000000e+03 +114 115 -1.024000000000000e+03 +115 114 -1.024000000000000e+03 +115 115 2.048000000000000e+03 +115 116 -1.024000000000000e+03 +116 115 -1.024000000000000e+03 +116 116 2.048000000000000e+03 +116 117 -1.024000000000000e+03 +117 116 -1.024000000000000e+03 +117 117 2.048000000000000e+03 +117 118 -1.024000000000000e+03 +118 117 -1.024000000000000e+03 +118 118 2.048000000000000e+03 +118 119 -1.024000000000000e+03 +119 118 -1.024000000000000e+03 +119 119 2.048000000000000e+03 +119 120 -1.024000000000000e+03 +120 119 -1.024000000000000e+03 +120 120 2.048000000000000e+03 +120 121 -1.024000000000000e+03 +121 120 -1.024000000000000e+03 +121 121 2.048000000000000e+03 +121 122 -1.024000000000000e+03 +122 121 -1.024000000000000e+03 +122 122 2.048000000000000e+03 +122 123 -1.024000000000000e+03 +123 122 -1.024000000000000e+03 +123 123 2.048000000000000e+03 +123 124 -1.024000000000000e+03 +124 123 -1.024000000000000e+03 +124 124 2.048000000000000e+03 +124 125 -1.024000000000000e+03 +125 124 -1.024000000000000e+03 +125 125 2.048000000000000e+03 +125 126 -1.024000000000000e+03 +126 125 -1.024000000000000e+03 +126 126 2.048000000000000e+03 +126 127 -1.024000000000000e+03 +127 126 -1.024000000000000e+03 +127 127 2.048000000000000e+03 +127 128 -1.024000000000000e+03 +128 127 -1.024000000000000e+03 +128 128 2.048000000000000e+03 +128 129 -1.024000000000000e+03 +129 128 -1.024000000000000e+03 +129 129 2.048000000000000e+03 +129 130 -1.024000000000000e+03 +130 129 -1.024000000000000e+03 +130 130 2.048000000000000e+03 +130 131 -1.024000000000000e+03 +131 130 -1.024000000000000e+03 +131 131 2.048000000000000e+03 +131 132 -1.024000000000000e+03 +132 131 -1.024000000000000e+03 +132 132 2.048000000000000e+03 +132 133 -1.024000000000000e+03 +133 132 -1.024000000000000e+03 +133 133 2.048000000000000e+03 +133 134 -1.024000000000000e+03 +134 133 -1.024000000000000e+03 +134 134 2.048000000000000e+03 +134 135 -1.024000000000000e+03 +135 134 -1.024000000000000e+03 +135 135 2.048000000000000e+03 +135 136 -1.024000000000000e+03 +136 135 -1.024000000000000e+03 +136 136 2.048000000000000e+03 +136 137 -1.024000000000000e+03 +137 136 -1.024000000000000e+03 +137 137 2.048000000000000e+03 +137 138 -1.024000000000000e+03 +138 137 -1.024000000000000e+03 +138 138 2.048000000000000e+03 +138 139 -1.024000000000000e+03 +139 138 -1.024000000000000e+03 +139 139 2.048000000000000e+03 +139 140 -1.024000000000000e+03 +140 139 -1.024000000000000e+03 +140 140 2.048000000000000e+03 +140 141 -1.024000000000000e+03 +141 140 -1.024000000000000e+03 +141 141 2.048000000000000e+03 +141 142 -1.024000000000000e+03 +142 141 -1.024000000000000e+03 +142 142 2.048000000000000e+03 +142 143 -1.024000000000000e+03 +143 142 -1.024000000000000e+03 +143 143 2.048000000000000e+03 +143 144 -1.024000000000000e+03 +144 143 -1.024000000000000e+03 +144 144 2.048000000000000e+03 +144 145 -1.024000000000000e+03 +145 144 -1.024000000000000e+03 +145 145 2.048000000000000e+03 +145 146 -1.024000000000000e+03 +146 145 -1.024000000000000e+03 +146 146 2.048000000000000e+03 +146 147 -1.024000000000000e+03 +147 146 -1.024000000000000e+03 +147 147 2.048000000000000e+03 +147 148 -1.024000000000000e+03 +148 147 -1.024000000000000e+03 +148 148 2.048000000000000e+03 +148 149 -1.024000000000000e+03 +149 148 -1.024000000000000e+03 +149 149 2.048000000000000e+03 +149 150 -1.024000000000000e+03 +150 149 -1.024000000000000e+03 +150 150 2.048000000000000e+03 +150 151 -1.024000000000000e+03 +151 150 -1.024000000000000e+03 +151 151 2.048000000000000e+03 +151 152 -1.024000000000000e+03 +152 151 -1.024000000000000e+03 +152 152 2.048000000000000e+03 +152 153 -1.024000000000000e+03 +153 152 -1.024000000000000e+03 +153 153 2.048000000000000e+03 +153 154 -1.024000000000000e+03 +154 153 -1.024000000000000e+03 +154 154 2.048000000000000e+03 +154 155 -1.024000000000000e+03 +155 154 -1.024000000000000e+03 +155 155 2.048000000000000e+03 +155 156 -1.024000000000000e+03 +156 155 -1.024000000000000e+03 +156 156 2.048000000000000e+03 +156 157 -1.024000000000000e+03 +157 156 -1.024000000000000e+03 +157 157 2.048000000000000e+03 +157 158 -1.024000000000000e+03 +158 157 -1.024000000000000e+03 +158 158 2.048000000000000e+03 +158 159 -1.024000000000000e+03 +159 158 -1.024000000000000e+03 +159 159 2.048000000000000e+03 +159 160 -1.024000000000000e+03 +160 159 -1.024000000000000e+03 +160 160 2.048000000000000e+03 +160 161 -1.024000000000000e+03 +161 160 -1.024000000000000e+03 +161 161 2.048000000000000e+03 +161 162 -1.024000000000000e+03 +162 161 -1.024000000000000e+03 +162 162 2.048000000000000e+03 +162 163 -1.024000000000000e+03 +163 162 -1.024000000000000e+03 +163 163 2.048000000000000e+03 +163 164 -1.024000000000000e+03 +164 163 -1.024000000000000e+03 +164 164 2.048000000000000e+03 +164 165 -1.024000000000000e+03 +165 164 -1.024000000000000e+03 +165 165 2.048000000000000e+03 +165 166 -1.024000000000000e+03 +166 165 -1.024000000000000e+03 +166 166 2.048000000000000e+03 +166 167 -1.024000000000000e+03 +167 166 -1.024000000000000e+03 +167 167 2.048000000000000e+03 +167 168 -1.024000000000000e+03 +168 167 -1.024000000000000e+03 +168 168 2.048000000000000e+03 +168 169 -1.024000000000000e+03 +169 168 -1.024000000000000e+03 +169 169 2.048000000000000e+03 +169 170 -1.024000000000000e+03 +170 169 -1.024000000000000e+03 +170 170 2.048000000000000e+03 +170 171 -1.024000000000000e+03 +171 170 -1.024000000000000e+03 +171 171 2.048000000000000e+03 +171 172 -1.024000000000000e+03 +172 171 -1.024000000000000e+03 +172 172 2.048000000000000e+03 +172 173 -1.024000000000000e+03 +173 172 -1.024000000000000e+03 +173 173 2.048000000000000e+03 +173 174 -1.024000000000000e+03 +174 173 -1.024000000000000e+03 +174 174 2.048000000000000e+03 +174 175 -1.024000000000000e+03 +175 174 -1.024000000000000e+03 +175 175 2.048000000000000e+03 +175 176 -1.024000000000000e+03 +176 175 -1.024000000000000e+03 +176 176 2.048000000000000e+03 +176 177 -1.024000000000000e+03 +177 176 -1.024000000000000e+03 +177 177 2.048000000000000e+03 +177 178 -1.024000000000000e+03 +178 177 -1.024000000000000e+03 +178 178 2.048000000000000e+03 +178 179 -1.024000000000000e+03 +179 178 -1.024000000000000e+03 +179 179 2.048000000000000e+03 +179 180 -1.024000000000000e+03 +180 179 -1.024000000000000e+03 +180 180 2.048000000000000e+03 +180 181 -1.024000000000000e+03 +181 180 -1.024000000000000e+03 +181 181 2.048000000000000e+03 +181 182 -1.024000000000000e+03 +182 181 -1.024000000000000e+03 +182 182 2.048000000000000e+03 +182 183 -1.024000000000000e+03 +183 182 -1.024000000000000e+03 +183 183 2.048000000000000e+03 +183 184 -1.024000000000000e+03 +184 183 -1.024000000000000e+03 +184 184 2.048000000000000e+03 +184 185 -1.024000000000000e+03 +185 184 -1.024000000000000e+03 +185 185 2.048000000000000e+03 +185 186 -1.024000000000000e+03 +186 185 -1.024000000000000e+03 +186 186 2.048000000000000e+03 +186 187 -1.024000000000000e+03 +187 186 -1.024000000000000e+03 +187 187 2.048000000000000e+03 +187 188 -1.024000000000000e+03 +188 187 -1.024000000000000e+03 +188 188 2.048000000000000e+03 +188 189 -1.024000000000000e+03 +189 188 -1.024000000000000e+03 +189 189 2.048000000000000e+03 +189 190 -1.024000000000000e+03 +190 189 -1.024000000000000e+03 +190 190 2.048000000000000e+03 +190 191 -1.024000000000000e+03 +191 190 -1.024000000000000e+03 +191 191 2.048000000000000e+03 +191 192 -1.024000000000000e+03 +192 191 -1.024000000000000e+03 +192 192 2.048000000000000e+03 +192 193 -1.024000000000000e+03 +193 192 -1.024000000000000e+03 +193 193 2.048000000000000e+03 +193 194 -1.024000000000000e+03 +194 193 -1.024000000000000e+03 +194 194 2.048000000000000e+03 +194 195 -1.024000000000000e+03 +195 194 -1.024000000000000e+03 +195 195 2.048000000000000e+03 +195 196 -1.024000000000000e+03 +196 195 -1.024000000000000e+03 +196 196 2.048000000000000e+03 +196 197 -1.024000000000000e+03 +197 196 -1.024000000000000e+03 +197 197 2.048000000000000e+03 +197 198 -1.024000000000000e+03 +198 197 -1.024000000000000e+03 +198 198 2.048000000000000e+03 +198 199 -1.024000000000000e+03 +199 198 -1.024000000000000e+03 +199 199 2.048000000000000e+03 +199 200 -1.024000000000000e+03 +200 199 -1.024000000000000e+03 +200 200 2.048000000000000e+03 +200 201 -1.024000000000000e+03 +201 200 -1.024000000000000e+03 +201 201 2.048000000000000e+03 +201 202 -1.024000000000000e+03 +202 201 -1.024000000000000e+03 +202 202 2.048000000000000e+03 +202 203 -1.024000000000000e+03 +203 202 -1.024000000000000e+03 +203 203 2.048000000000000e+03 +203 204 -1.024000000000000e+03 +204 203 -1.024000000000000e+03 +204 204 2.048000000000000e+03 +204 205 -1.024000000000000e+03 +205 204 -1.024000000000000e+03 +205 205 2.048000000000000e+03 +205 206 -1.024000000000000e+03 +206 205 -1.024000000000000e+03 +206 206 2.048000000000000e+03 +206 207 -1.024000000000000e+03 +207 206 -1.024000000000000e+03 +207 207 2.048000000000000e+03 +207 208 -1.024000000000000e+03 +208 207 -1.024000000000000e+03 +208 208 2.048000000000000e+03 +208 209 -1.024000000000000e+03 +209 208 -1.024000000000000e+03 +209 209 2.048000000000000e+03 +209 210 -1.024000000000000e+03 +210 209 -1.024000000000000e+03 +210 210 2.048000000000000e+03 +210 211 -1.024000000000000e+03 +211 210 -1.024000000000000e+03 +211 211 2.048000000000000e+03 +211 212 -1.024000000000000e+03 +212 211 -1.024000000000000e+03 +212 212 2.048000000000000e+03 +212 213 -1.024000000000000e+03 +213 212 -1.024000000000000e+03 +213 213 2.048000000000000e+03 +213 214 -1.024000000000000e+03 +214 213 -1.024000000000000e+03 +214 214 2.048000000000000e+03 +214 215 -1.024000000000000e+03 +215 214 -1.024000000000000e+03 +215 215 2.048000000000000e+03 +215 216 -1.024000000000000e+03 +216 215 -1.024000000000000e+03 +216 216 2.048000000000000e+03 +216 217 -1.024000000000000e+03 +217 216 -1.024000000000000e+03 +217 217 2.048000000000000e+03 +217 218 -1.024000000000000e+03 +218 217 -1.024000000000000e+03 +218 218 2.048000000000000e+03 +218 219 -1.024000000000000e+03 +219 218 -1.024000000000000e+03 +219 219 2.048000000000000e+03 +219 220 -1.024000000000000e+03 +220 219 -1.024000000000000e+03 +220 220 2.048000000000000e+03 +220 221 -1.024000000000000e+03 +221 220 -1.024000000000000e+03 +221 221 2.048000000000000e+03 +221 222 -1.024000000000000e+03 +222 221 -1.024000000000000e+03 +222 222 2.048000000000000e+03 +222 223 -1.024000000000000e+03 +223 222 -1.024000000000000e+03 +223 223 2.048000000000000e+03 +223 224 -1.024000000000000e+03 +224 223 -1.024000000000000e+03 +224 224 2.048000000000000e+03 +224 225 -1.024000000000000e+03 +225 224 -1.024000000000000e+03 +225 225 2.048000000000000e+03 +225 226 -1.024000000000000e+03 +226 225 -1.024000000000000e+03 +226 226 2.048000000000000e+03 +226 227 -1.024000000000000e+03 +227 226 -1.024000000000000e+03 +227 227 2.048000000000000e+03 +227 228 -1.024000000000000e+03 +228 227 -1.024000000000000e+03 +228 228 2.048000000000000e+03 +228 229 -1.024000000000000e+03 +229 228 -1.024000000000000e+03 +229 229 2.048000000000000e+03 +229 230 -1.024000000000000e+03 +230 229 -1.024000000000000e+03 +230 230 2.048000000000000e+03 +230 231 -1.024000000000000e+03 +231 230 -1.024000000000000e+03 +231 231 2.048000000000000e+03 +231 232 -1.024000000000000e+03 +232 231 -1.024000000000000e+03 +232 232 2.048000000000000e+03 +232 233 -1.024000000000000e+03 +233 232 -1.024000000000000e+03 +233 233 2.048000000000000e+03 +233 234 -1.024000000000000e+03 +234 233 -1.024000000000000e+03 +234 234 2.048000000000000e+03 +234 235 -1.024000000000000e+03 +235 234 -1.024000000000000e+03 +235 235 2.048000000000000e+03 +235 236 -1.024000000000000e+03 +236 235 -1.024000000000000e+03 +236 236 2.048000000000000e+03 +236 237 -1.024000000000000e+03 +237 236 -1.024000000000000e+03 +237 237 2.048000000000000e+03 +237 238 -1.024000000000000e+03 +238 237 -1.024000000000000e+03 +238 238 2.048000000000000e+03 +238 239 -1.024000000000000e+03 +239 238 -1.024000000000000e+03 +239 239 2.048000000000000e+03 +239 240 -1.024000000000000e+03 +240 239 -1.024000000000000e+03 +240 240 2.048000000000000e+03 +240 241 -1.024000000000000e+03 +241 240 -1.024000000000000e+03 +241 241 2.048000000000000e+03 +241 242 -1.024000000000000e+03 +242 241 -1.024000000000000e+03 +242 242 2.048000000000000e+03 +242 243 -1.024000000000000e+03 +243 242 -1.024000000000000e+03 +243 243 2.048000000000000e+03 +243 244 -1.024000000000000e+03 +244 243 -1.024000000000000e+03 +244 244 2.048000000000000e+03 +244 245 -1.024000000000000e+03 +245 244 -1.024000000000000e+03 +245 245 2.048000000000000e+03 +245 246 -1.024000000000000e+03 +246 245 -1.024000000000000e+03 +246 246 2.048000000000000e+03 +246 247 -1.024000000000000e+03 +247 246 -1.024000000000000e+03 +247 247 2.048000000000000e+03 +247 248 -1.024000000000000e+03 +248 247 -1.024000000000000e+03 +248 248 2.048000000000000e+03 +248 249 -1.024000000000000e+03 +249 248 -1.024000000000000e+03 +249 249 2.048000000000000e+03 +249 250 -1.024000000000000e+03 +250 249 -1.024000000000000e+03 +250 250 2.048000000000000e+03 +250 251 -1.024000000000000e+03 +251 250 -1.024000000000000e+03 +251 251 2.048000000000000e+03 +251 252 -1.024000000000000e+03 +252 251 -1.024000000000000e+03 +252 252 2.048000000000000e+03 +252 253 -1.024000000000000e+03 +253 252 -1.024000000000000e+03 +253 253 2.048000000000000e+03 +253 254 -1.024000000000000e+03 +254 253 -1.024000000000000e+03 +254 254 2.048000000000000e+03 +254 255 -1.024000000000000e+03 +255 254 -1.024000000000000e+03 +255 255 2.048000000000000e+03 +255 256 -1.024000000000000e+03 +256 255 -1.024000000000000e+03 +256 256 2.048000000000000e+03 +256 257 -1.024000000000000e+03 +257 256 -1.024000000000000e+03 +257 257 2.048000000000000e+03 +257 258 -1.024000000000000e+03 +258 257 -1.024000000000000e+03 +258 258 2.048000000000000e+03 +258 259 -1.024000000000000e+03 +259 258 -1.024000000000000e+03 +259 259 2.048000000000000e+03 +259 260 -1.024000000000000e+03 +260 259 -1.024000000000000e+03 +260 260 2.048000000000000e+03 +260 261 -1.024000000000000e+03 +261 260 -1.024000000000000e+03 +261 261 2.048000000000000e+03 +261 262 -1.024000000000000e+03 +262 261 -1.024000000000000e+03 +262 262 2.048000000000000e+03 +262 263 -1.024000000000000e+03 +263 262 -1.024000000000000e+03 +263 263 2.048000000000000e+03 +263 264 -1.024000000000000e+03 +264 263 -1.024000000000000e+03 +264 264 2.048000000000000e+03 +264 265 -1.024000000000000e+03 +265 264 -1.024000000000000e+03 +265 265 2.048000000000000e+03 +265 266 -1.024000000000000e+03 +266 265 -1.024000000000000e+03 +266 266 2.048000000000000e+03 +266 267 -1.024000000000000e+03 +267 266 -1.024000000000000e+03 +267 267 2.048000000000000e+03 +267 268 -1.024000000000000e+03 +268 267 -1.024000000000000e+03 +268 268 2.048000000000000e+03 +268 269 -1.024000000000000e+03 +269 268 -1.024000000000000e+03 +269 269 2.048000000000000e+03 +269 270 -1.024000000000000e+03 +270 269 -1.024000000000000e+03 +270 270 2.048000000000000e+03 +270 271 -1.024000000000000e+03 +271 270 -1.024000000000000e+03 +271 271 2.048000000000000e+03 +271 272 -1.024000000000000e+03 +272 271 -1.024000000000000e+03 +272 272 2.048000000000000e+03 +272 273 -1.024000000000000e+03 +273 272 -1.024000000000000e+03 +273 273 2.048000000000000e+03 +273 274 -1.024000000000000e+03 +274 273 -1.024000000000000e+03 +274 274 2.048000000000000e+03 +274 275 -1.024000000000000e+03 +275 274 -1.024000000000000e+03 +275 275 2.048000000000000e+03 +275 276 -1.024000000000000e+03 +276 275 -1.024000000000000e+03 +276 276 2.048000000000000e+03 +276 277 -1.024000000000000e+03 +277 276 -1.024000000000000e+03 +277 277 2.048000000000000e+03 +277 278 -1.024000000000000e+03 +278 277 -1.024000000000000e+03 +278 278 2.048000000000000e+03 +278 279 -1.024000000000000e+03 +279 278 -1.024000000000000e+03 +279 279 2.048000000000000e+03 +279 280 -1.024000000000000e+03 +280 279 -1.024000000000000e+03 +280 280 2.048000000000000e+03 +280 281 -1.024000000000000e+03 +281 280 -1.024000000000000e+03 +281 281 2.048000000000000e+03 +281 282 -1.024000000000000e+03 +282 281 -1.024000000000000e+03 +282 282 2.048000000000000e+03 +282 283 -1.024000000000000e+03 +283 282 -1.024000000000000e+03 +283 283 2.048000000000000e+03 +283 284 -1.024000000000000e+03 +284 283 -1.024000000000000e+03 +284 284 2.048000000000000e+03 +284 285 -1.024000000000000e+03 +285 284 -1.024000000000000e+03 +285 285 2.048000000000000e+03 +285 286 -1.024000000000000e+03 +286 285 -1.024000000000000e+03 +286 286 2.048000000000000e+03 +286 287 -1.024000000000000e+03 +287 286 -1.024000000000000e+03 +287 287 2.048000000000000e+03 +287 288 -1.024000000000000e+03 +288 287 -1.024000000000000e+03 +288 288 2.048000000000000e+03 +288 289 -1.024000000000000e+03 +289 288 -1.024000000000000e+03 +289 289 2.048000000000000e+03 +289 290 -1.024000000000000e+03 +290 289 -1.024000000000000e+03 +290 290 2.048000000000000e+03 +290 291 -1.024000000000000e+03 +291 290 -1.024000000000000e+03 +291 291 2.048000000000000e+03 +291 292 -1.024000000000000e+03 +292 291 -1.024000000000000e+03 +292 292 2.048000000000000e+03 +292 293 -1.024000000000000e+03 +293 292 -1.024000000000000e+03 +293 293 2.048000000000000e+03 +293 294 -1.024000000000000e+03 +294 293 -1.024000000000000e+03 +294 294 2.048000000000000e+03 +294 295 -1.024000000000000e+03 +295 294 -1.024000000000000e+03 +295 295 2.048000000000000e+03 +295 296 -1.024000000000000e+03 +296 295 -1.024000000000000e+03 +296 296 2.048000000000000e+03 +296 297 -1.024000000000000e+03 +297 296 -1.024000000000000e+03 +297 297 2.048000000000000e+03 +297 298 -1.024000000000000e+03 +298 297 -1.024000000000000e+03 +298 298 2.048000000000000e+03 +298 299 -1.024000000000000e+03 +299 298 -1.024000000000000e+03 +299 299 2.048000000000000e+03 +299 300 -1.024000000000000e+03 +300 299 -1.024000000000000e+03 +300 300 2.048000000000000e+03 +300 301 -1.024000000000000e+03 +301 300 -1.024000000000000e+03 +301 301 2.048000000000000e+03 +301 302 -1.024000000000000e+03 +302 301 -1.024000000000000e+03 +302 302 2.048000000000000e+03 +302 303 -1.024000000000000e+03 +303 302 -1.024000000000000e+03 +303 303 2.048000000000000e+03 +303 304 -1.024000000000000e+03 +304 303 -1.024000000000000e+03 +304 304 2.048000000000000e+03 +304 305 -1.024000000000000e+03 +305 304 -1.024000000000000e+03 +305 305 2.048000000000000e+03 +305 306 -1.024000000000000e+03 +306 305 -1.024000000000000e+03 +306 306 2.048000000000000e+03 +306 307 -1.024000000000000e+03 +307 306 -1.024000000000000e+03 +307 307 2.048000000000000e+03 +307 308 -1.024000000000000e+03 +308 307 -1.024000000000000e+03 +308 308 2.048000000000000e+03 +308 309 -1.024000000000000e+03 +309 308 -1.024000000000000e+03 +309 309 2.048000000000000e+03 +309 310 -1.024000000000000e+03 +310 309 -1.024000000000000e+03 +310 310 2.048000000000000e+03 +310 311 -1.024000000000000e+03 +311 310 -1.024000000000000e+03 +311 311 2.048000000000000e+03 +311 312 -1.024000000000000e+03 +312 311 -1.024000000000000e+03 +312 312 2.048000000000000e+03 +312 313 -1.024000000000000e+03 +313 312 -1.024000000000000e+03 +313 313 2.048000000000000e+03 +313 314 -1.024000000000000e+03 +314 313 -1.024000000000000e+03 +314 314 2.048000000000000e+03 +314 315 -1.024000000000000e+03 +315 314 -1.024000000000000e+03 +315 315 2.048000000000000e+03 +315 316 -1.024000000000000e+03 +316 315 -1.024000000000000e+03 +316 316 2.048000000000000e+03 +316 317 -1.024000000000000e+03 +317 316 -1.024000000000000e+03 +317 317 2.048000000000000e+03 +317 318 -1.024000000000000e+03 +318 317 -1.024000000000000e+03 +318 318 2.048000000000000e+03 +318 319 -1.024000000000000e+03 +319 318 -1.024000000000000e+03 +319 319 2.048000000000000e+03 +319 320 -1.024000000000000e+03 +320 319 -1.024000000000000e+03 +320 320 2.048000000000000e+03 +320 321 -1.024000000000000e+03 +321 320 -1.024000000000000e+03 +321 321 2.048000000000000e+03 +321 322 -1.024000000000000e+03 +322 321 -1.024000000000000e+03 +322 322 2.048000000000000e+03 +322 323 -1.024000000000000e+03 +323 322 -1.024000000000000e+03 +323 323 2.048000000000000e+03 +323 324 -1.024000000000000e+03 +324 323 -1.024000000000000e+03 +324 324 2.048000000000000e+03 +324 325 -1.024000000000000e+03 +325 324 -1.024000000000000e+03 +325 325 2.048000000000000e+03 +325 326 -1.024000000000000e+03 +326 325 -1.024000000000000e+03 +326 326 2.048000000000000e+03 +326 327 -1.024000000000000e+03 +327 326 -1.024000000000000e+03 +327 327 2.048000000000000e+03 +327 328 -1.024000000000000e+03 +328 327 -1.024000000000000e+03 +328 328 2.048000000000000e+03 +328 329 -1.024000000000000e+03 +329 328 -1.024000000000000e+03 +329 329 2.048000000000000e+03 +329 330 -1.024000000000000e+03 +330 329 -1.024000000000000e+03 +330 330 2.048000000000000e+03 +330 331 -1.024000000000000e+03 +331 330 -1.024000000000000e+03 +331 331 2.048000000000000e+03 +331 332 -1.024000000000000e+03 +332 331 -1.024000000000000e+03 +332 332 2.048000000000000e+03 +332 333 -1.024000000000000e+03 +333 332 -1.024000000000000e+03 +333 333 2.048000000000000e+03 +333 334 -1.024000000000000e+03 +334 333 -1.024000000000000e+03 +334 334 2.048000000000000e+03 +334 335 -1.024000000000000e+03 +335 334 -1.024000000000000e+03 +335 335 2.048000000000000e+03 +335 336 -1.024000000000000e+03 +336 335 -1.024000000000000e+03 +336 336 2.048000000000000e+03 +336 337 -1.024000000000000e+03 +337 336 -1.024000000000000e+03 +337 337 2.048000000000000e+03 +337 338 -1.024000000000000e+03 +338 337 -1.024000000000000e+03 +338 338 2.048000000000000e+03 +338 339 -1.024000000000000e+03 +339 338 -1.024000000000000e+03 +339 339 2.048000000000000e+03 +339 340 -1.024000000000000e+03 +340 339 -1.024000000000000e+03 +340 340 2.048000000000000e+03 +340 341 -1.024000000000000e+03 +341 340 -1.024000000000000e+03 +341 341 2.048000000000000e+03 +341 342 -1.024000000000000e+03 +342 341 -1.024000000000000e+03 +342 342 2.048000000000000e+03 +342 343 -1.024000000000000e+03 +343 342 -1.024000000000000e+03 +343 343 2.048000000000000e+03 +343 344 -1.024000000000000e+03 +344 343 -1.024000000000000e+03 +344 344 2.048000000000000e+03 +344 345 -1.024000000000000e+03 +345 344 -1.024000000000000e+03 +345 345 2.048000000000000e+03 +345 346 -1.024000000000000e+03 +346 345 -1.024000000000000e+03 +346 346 2.048000000000000e+03 +346 347 -1.024000000000000e+03 +347 346 -1.024000000000000e+03 +347 347 2.048000000000000e+03 +347 348 -1.024000000000000e+03 +348 347 -1.024000000000000e+03 +348 348 2.048000000000000e+03 +348 349 -1.024000000000000e+03 +349 348 -1.024000000000000e+03 +349 349 2.048000000000000e+03 +349 350 -1.024000000000000e+03 +350 349 -1.024000000000000e+03 +350 350 2.048000000000000e+03 +350 351 -1.024000000000000e+03 +351 350 -1.024000000000000e+03 +351 351 2.048000000000000e+03 +351 352 -1.024000000000000e+03 +352 351 -1.024000000000000e+03 +352 352 2.048000000000000e+03 +352 353 -1.024000000000000e+03 +353 352 -1.024000000000000e+03 +353 353 2.048000000000000e+03 +353 354 -1.024000000000000e+03 +354 353 -1.024000000000000e+03 +354 354 2.048000000000000e+03 +354 355 -1.024000000000000e+03 +355 354 -1.024000000000000e+03 +355 355 2.048000000000000e+03 +355 356 -1.024000000000000e+03 +356 355 -1.024000000000000e+03 +356 356 2.048000000000000e+03 +356 357 -1.024000000000000e+03 +357 356 -1.024000000000000e+03 +357 357 2.048000000000000e+03 +357 358 -1.024000000000000e+03 +358 357 -1.024000000000000e+03 +358 358 2.048000000000000e+03 +358 359 -1.024000000000000e+03 +359 358 -1.024000000000000e+03 +359 359 2.048000000000000e+03 +359 360 -1.024000000000000e+03 +360 359 -1.024000000000000e+03 +360 360 2.048000000000000e+03 +360 361 -1.024000000000000e+03 +361 360 -1.024000000000000e+03 +361 361 2.048000000000000e+03 +361 362 -1.024000000000000e+03 +362 361 -1.024000000000000e+03 +362 362 2.048000000000000e+03 +362 363 -1.024000000000000e+03 +363 362 -1.024000000000000e+03 +363 363 2.048000000000000e+03 +363 364 -1.024000000000000e+03 +364 363 -1.024000000000000e+03 +364 364 2.048000000000000e+03 +364 365 -1.024000000000000e+03 +365 364 -1.024000000000000e+03 +365 365 2.048000000000000e+03 +365 366 -1.024000000000000e+03 +366 365 -1.024000000000000e+03 +366 366 2.048000000000000e+03 +366 367 -1.024000000000000e+03 +367 366 -1.024000000000000e+03 +367 367 2.048000000000000e+03 +367 368 -1.024000000000000e+03 +368 367 -1.024000000000000e+03 +368 368 2.048000000000000e+03 +368 369 -1.024000000000000e+03 +369 368 -1.024000000000000e+03 +369 369 2.048000000000000e+03 +369 370 -1.024000000000000e+03 +370 369 -1.024000000000000e+03 +370 370 2.048000000000000e+03 +370 371 -1.024000000000000e+03 +371 370 -1.024000000000000e+03 +371 371 2.048000000000000e+03 +371 372 -1.024000000000000e+03 +372 371 -1.024000000000000e+03 +372 372 2.048000000000000e+03 +372 373 -1.024000000000000e+03 +373 372 -1.024000000000000e+03 +373 373 2.048000000000000e+03 +373 374 -1.024000000000000e+03 +374 373 -1.024000000000000e+03 +374 374 2.048000000000000e+03 +374 375 -1.024000000000000e+03 +375 374 -1.024000000000000e+03 +375 375 2.048000000000000e+03 +375 376 -1.024000000000000e+03 +376 375 -1.024000000000000e+03 +376 376 2.048000000000000e+03 +376 377 -1.024000000000000e+03 +377 376 -1.024000000000000e+03 +377 377 2.048000000000000e+03 +377 378 -1.024000000000000e+03 +378 377 -1.024000000000000e+03 +378 378 2.048000000000000e+03 +378 379 -1.024000000000000e+03 +379 378 -1.024000000000000e+03 +379 379 2.048000000000000e+03 +379 380 -1.024000000000000e+03 +380 379 -1.024000000000000e+03 +380 380 2.048000000000000e+03 +380 381 -1.024000000000000e+03 +381 380 -1.024000000000000e+03 +381 381 2.048000000000000e+03 +381 382 -1.024000000000000e+03 +382 381 -1.024000000000000e+03 +382 382 2.048000000000000e+03 +382 383 -1.024000000000000e+03 +383 382 -1.024000000000000e+03 +383 383 2.048000000000000e+03 +383 384 -1.024000000000000e+03 +384 383 -1.024000000000000e+03 +384 384 2.048000000000000e+03 +384 385 -1.024000000000000e+03 +385 384 -1.024000000000000e+03 +385 385 2.048000000000000e+03 +385 386 -1.024000000000000e+03 +386 385 -1.024000000000000e+03 +386 386 2.048000000000000e+03 +386 387 -1.024000000000000e+03 +387 386 -1.024000000000000e+03 +387 387 2.048000000000000e+03 +387 388 -1.024000000000000e+03 +388 387 -1.024000000000000e+03 +388 388 2.048000000000000e+03 +388 389 -1.024000000000000e+03 +389 388 -1.024000000000000e+03 +389 389 2.048000000000000e+03 +389 390 -1.024000000000000e+03 +390 389 -1.024000000000000e+03 +390 390 2.048000000000000e+03 +390 391 -1.024000000000000e+03 +391 390 -1.024000000000000e+03 +391 391 2.048000000000000e+03 +391 392 -1.024000000000000e+03 +392 391 -1.024000000000000e+03 +392 392 2.048000000000000e+03 +392 393 -1.024000000000000e+03 +393 392 -1.024000000000000e+03 +393 393 2.048000000000000e+03 +393 394 -1.024000000000000e+03 +394 393 -1.024000000000000e+03 +394 394 2.048000000000000e+03 +394 395 -1.024000000000000e+03 +395 394 -1.024000000000000e+03 +395 395 2.048000000000000e+03 +395 396 -1.024000000000000e+03 +396 395 -1.024000000000000e+03 +396 396 2.048000000000000e+03 +396 397 -1.024000000000000e+03 +397 396 -1.024000000000000e+03 +397 397 2.048000000000000e+03 +397 398 -1.024000000000000e+03 +398 397 -1.024000000000000e+03 +398 398 2.048000000000000e+03 +398 399 -1.024000000000000e+03 +399 398 -1.024000000000000e+03 +399 399 2.048000000000000e+03 +399 400 -1.024000000000000e+03 +400 399 -1.024000000000000e+03 +400 400 2.048000000000000e+03 +400 401 -1.024000000000000e+03 +401 400 -1.024000000000000e+03 +401 401 2.048000000000000e+03 +401 402 -1.024000000000000e+03 +402 401 -1.024000000000000e+03 +402 402 2.048000000000000e+03 +402 403 -1.024000000000000e+03 +403 402 -1.024000000000000e+03 +403 403 2.048000000000000e+03 +403 404 -1.024000000000000e+03 +404 403 -1.024000000000000e+03 +404 404 2.048000000000000e+03 +404 405 -1.024000000000000e+03 +405 404 -1.024000000000000e+03 +405 405 2.048000000000000e+03 +405 406 -1.024000000000000e+03 +406 405 -1.024000000000000e+03 +406 406 2.048000000000000e+03 +406 407 -1.024000000000000e+03 +407 406 -1.024000000000000e+03 +407 407 2.048000000000000e+03 +407 408 -1.024000000000000e+03 +408 407 -1.024000000000000e+03 +408 408 2.048000000000000e+03 +408 409 -1.024000000000000e+03 +409 408 -1.024000000000000e+03 +409 409 2.048000000000000e+03 +409 410 -1.024000000000000e+03 +410 409 -1.024000000000000e+03 +410 410 2.048000000000000e+03 +410 411 -1.024000000000000e+03 +411 410 -1.024000000000000e+03 +411 411 2.048000000000000e+03 +411 412 -1.024000000000000e+03 +412 411 -1.024000000000000e+03 +412 412 2.048000000000000e+03 +412 413 -1.024000000000000e+03 +413 412 -1.024000000000000e+03 +413 413 2.048000000000000e+03 +413 414 -1.024000000000000e+03 +414 413 -1.024000000000000e+03 +414 414 2.048000000000000e+03 +414 415 -1.024000000000000e+03 +415 414 -1.024000000000000e+03 +415 415 2.048000000000000e+03 +415 416 -1.024000000000000e+03 +416 415 -1.024000000000000e+03 +416 416 2.048000000000000e+03 +416 417 -1.024000000000000e+03 +417 416 -1.024000000000000e+03 +417 417 2.048000000000000e+03 +417 418 -1.024000000000000e+03 +418 417 -1.024000000000000e+03 +418 418 2.048000000000000e+03 +418 419 -1.024000000000000e+03 +419 418 -1.024000000000000e+03 +419 419 2.048000000000000e+03 +419 420 -1.024000000000000e+03 +420 419 -1.024000000000000e+03 +420 420 2.048000000000000e+03 +420 421 -1.024000000000000e+03 +421 420 -1.024000000000000e+03 +421 421 2.048000000000000e+03 +421 422 -1.024000000000000e+03 +422 421 -1.024000000000000e+03 +422 422 2.048000000000000e+03 +422 423 -1.024000000000000e+03 +423 422 -1.024000000000000e+03 +423 423 2.048000000000000e+03 +423 424 -1.024000000000000e+03 +424 423 -1.024000000000000e+03 +424 424 2.048000000000000e+03 +424 425 -1.024000000000000e+03 +425 424 -1.024000000000000e+03 +425 425 2.048000000000000e+03 +425 426 -1.024000000000000e+03 +426 425 -1.024000000000000e+03 +426 426 2.048000000000000e+03 +426 427 -1.024000000000000e+03 +427 426 -1.024000000000000e+03 +427 427 2.048000000000000e+03 +427 428 -1.024000000000000e+03 +428 427 -1.024000000000000e+03 +428 428 2.048000000000000e+03 +428 429 -1.024000000000000e+03 +429 428 -1.024000000000000e+03 +429 429 2.048000000000000e+03 +429 430 -1.024000000000000e+03 +430 429 -1.024000000000000e+03 +430 430 2.048000000000000e+03 +430 431 -1.024000000000000e+03 +431 430 -1.024000000000000e+03 +431 431 2.048000000000000e+03 +431 432 -1.024000000000000e+03 +432 431 -1.024000000000000e+03 +432 432 2.048000000000000e+03 +432 433 -1.024000000000000e+03 +433 432 -1.024000000000000e+03 +433 433 2.048000000000000e+03 +433 434 -1.024000000000000e+03 +434 433 -1.024000000000000e+03 +434 434 2.048000000000000e+03 +434 435 -1.024000000000000e+03 +435 434 -1.024000000000000e+03 +435 435 2.048000000000000e+03 +435 436 -1.024000000000000e+03 +436 435 -1.024000000000000e+03 +436 436 2.048000000000000e+03 +436 437 -1.024000000000000e+03 +437 436 -1.024000000000000e+03 +437 437 2.048000000000000e+03 +437 438 -1.024000000000000e+03 +438 437 -1.024000000000000e+03 +438 438 2.048000000000000e+03 +438 439 -1.024000000000000e+03 +439 438 -1.024000000000000e+03 +439 439 2.048000000000000e+03 +439 440 -1.024000000000000e+03 +440 439 -1.024000000000000e+03 +440 440 2.048000000000000e+03 +440 441 -1.024000000000000e+03 +441 440 -1.024000000000000e+03 +441 441 2.048000000000000e+03 +441 442 -1.024000000000000e+03 +442 441 -1.024000000000000e+03 +442 442 2.048000000000000e+03 +442 443 -1.024000000000000e+03 +443 442 -1.024000000000000e+03 +443 443 2.048000000000000e+03 +443 444 -1.024000000000000e+03 +444 443 -1.024000000000000e+03 +444 444 2.048000000000000e+03 +444 445 -1.024000000000000e+03 +445 444 -1.024000000000000e+03 +445 445 2.048000000000000e+03 +445 446 -1.024000000000000e+03 +446 445 -1.024000000000000e+03 +446 446 2.048000000000000e+03 +446 447 -1.024000000000000e+03 +447 446 -1.024000000000000e+03 +447 447 2.048000000000000e+03 +447 448 -1.024000000000000e+03 +448 447 -1.024000000000000e+03 +448 448 2.048000000000000e+03 +448 449 -1.024000000000000e+03 +449 448 -1.024000000000000e+03 +449 449 2.048000000000000e+03 +449 450 -1.024000000000000e+03 +450 449 -1.024000000000000e+03 +450 450 2.048000000000000e+03 +450 451 -1.024000000000000e+03 +451 450 -1.024000000000000e+03 +451 451 2.048000000000000e+03 +451 452 -1.024000000000000e+03 +452 451 -1.024000000000000e+03 +452 452 2.048000000000000e+03 +452 453 -1.024000000000000e+03 +453 452 -1.024000000000000e+03 +453 453 2.048000000000000e+03 +453 454 -1.024000000000000e+03 +454 453 -1.024000000000000e+03 +454 454 2.048000000000000e+03 +454 455 -1.024000000000000e+03 +455 454 -1.024000000000000e+03 +455 455 2.048000000000000e+03 +455 456 -1.024000000000000e+03 +456 455 -1.024000000000000e+03 +456 456 2.048000000000000e+03 +456 457 -1.024000000000000e+03 +457 456 -1.024000000000000e+03 +457 457 2.048000000000000e+03 +457 458 -1.024000000000000e+03 +458 457 -1.024000000000000e+03 +458 458 2.048000000000000e+03 +458 459 -1.024000000000000e+03 +459 458 -1.024000000000000e+03 +459 459 2.048000000000000e+03 +459 460 -1.024000000000000e+03 +460 459 -1.024000000000000e+03 +460 460 2.048000000000000e+03 +460 461 -1.024000000000000e+03 +461 460 -1.024000000000000e+03 +461 461 2.048000000000000e+03 +461 462 -1.024000000000000e+03 +462 461 -1.024000000000000e+03 +462 462 2.048000000000000e+03 +462 463 -1.024000000000000e+03 +463 462 -1.024000000000000e+03 +463 463 2.048000000000000e+03 +463 464 -1.024000000000000e+03 +464 463 -1.024000000000000e+03 +464 464 2.048000000000000e+03 +464 465 -1.024000000000000e+03 +465 464 -1.024000000000000e+03 +465 465 2.048000000000000e+03 +465 466 -1.024000000000000e+03 +466 465 -1.024000000000000e+03 +466 466 2.048000000000000e+03 +466 467 -1.024000000000000e+03 +467 466 -1.024000000000000e+03 +467 467 2.048000000000000e+03 +467 468 -1.024000000000000e+03 +468 467 -1.024000000000000e+03 +468 468 2.048000000000000e+03 +468 469 -1.024000000000000e+03 +469 468 -1.024000000000000e+03 +469 469 2.048000000000000e+03 +469 470 -1.024000000000000e+03 +470 469 -1.024000000000000e+03 +470 470 2.048000000000000e+03 +470 471 -1.024000000000000e+03 +471 470 -1.024000000000000e+03 +471 471 2.048000000000000e+03 +471 472 -1.024000000000000e+03 +472 471 -1.024000000000000e+03 +472 472 2.048000000000000e+03 +472 473 -1.024000000000000e+03 +473 472 -1.024000000000000e+03 +473 473 2.048000000000000e+03 +473 474 -1.024000000000000e+03 +474 473 -1.024000000000000e+03 +474 474 2.048000000000000e+03 +474 475 -1.024000000000000e+03 +475 474 -1.024000000000000e+03 +475 475 2.048000000000000e+03 +475 476 -1.024000000000000e+03 +476 475 -1.024000000000000e+03 +476 476 2.048000000000000e+03 +476 477 -1.024000000000000e+03 +477 476 -1.024000000000000e+03 +477 477 2.048000000000000e+03 +477 478 -1.024000000000000e+03 +478 477 -1.024000000000000e+03 +478 478 2.048000000000000e+03 +478 479 -1.024000000000000e+03 +479 478 -1.024000000000000e+03 +479 479 2.048000000000000e+03 +479 480 -1.024000000000000e+03 +480 479 -1.024000000000000e+03 +480 480 2.048000000000000e+03 +480 481 -1.024000000000000e+03 +481 480 -1.024000000000000e+03 +481 481 2.048000000000000e+03 +481 482 -1.024000000000000e+03 +482 481 -1.024000000000000e+03 +482 482 2.048000000000000e+03 +482 483 -1.024000000000000e+03 +483 482 -1.024000000000000e+03 +483 483 2.048000000000000e+03 +483 484 -1.024000000000000e+03 +484 483 -1.024000000000000e+03 +484 484 2.048000000000000e+03 +484 485 -1.024000000000000e+03 +485 484 -1.024000000000000e+03 +485 485 2.048000000000000e+03 +485 486 -1.024000000000000e+03 +486 485 -1.024000000000000e+03 +486 486 2.048000000000000e+03 +486 487 -1.024000000000000e+03 +487 486 -1.024000000000000e+03 +487 487 2.048000000000000e+03 +487 488 -1.024000000000000e+03 +488 487 -1.024000000000000e+03 +488 488 2.048000000000000e+03 +488 489 -1.024000000000000e+03 +489 488 -1.024000000000000e+03 +489 489 2.048000000000000e+03 +489 490 -1.024000000000000e+03 +490 489 -1.024000000000000e+03 +490 490 2.048000000000000e+03 +490 491 -1.024000000000000e+03 +491 490 -1.024000000000000e+03 +491 491 2.048000000000000e+03 +491 492 -1.024000000000000e+03 +492 491 -1.024000000000000e+03 +492 492 2.048000000000000e+03 +492 493 -1.024000000000000e+03 +493 492 -1.024000000000000e+03 +493 493 2.048000000000000e+03 +493 494 -1.024000000000000e+03 +494 493 -1.024000000000000e+03 +494 494 2.048000000000000e+03 +494 495 -1.024000000000000e+03 +495 494 -1.024000000000000e+03 +495 495 2.048000000000000e+03 +495 496 -1.024000000000000e+03 +496 495 -1.024000000000000e+03 +496 496 2.048000000000000e+03 +496 497 -1.024000000000000e+03 +497 496 -1.024000000000000e+03 +497 497 2.048000000000000e+03 +497 498 -1.024000000000000e+03 +498 497 -1.024000000000000e+03 +498 498 2.048000000000000e+03 +498 499 -1.024000000000000e+03 +499 498 -1.024000000000000e+03 +499 499 2.048000000000000e+03 +499 500 -1.024000000000000e+03 +500 499 -1.024000000000000e+03 +500 500 2.048000000000000e+03 +500 501 -1.024000000000000e+03 +501 500 -1.024000000000000e+03 +501 501 2.048000000000000e+03 +501 502 -1.024000000000000e+03 +502 501 -1.024000000000000e+03 +502 502 2.048000000000000e+03 +502 503 -1.024000000000000e+03 +503 502 -1.024000000000000e+03 +503 503 2.048000000000000e+03 +503 504 -1.024000000000000e+03 +504 503 -1.024000000000000e+03 +504 504 2.048000000000000e+03 +504 505 -1.024000000000000e+03 +505 504 -1.024000000000000e+03 +505 505 2.048000000000000e+03 +505 506 -1.024000000000000e+03 +506 505 -1.024000000000000e+03 +506 506 2.048000000000000e+03 +506 507 -1.024000000000000e+03 +507 506 -1.024000000000000e+03 +507 507 2.048000000000000e+03 +507 508 -1.024000000000000e+03 +508 507 -1.024000000000000e+03 +508 508 2.048000000000000e+03 +508 509 -1.024000000000000e+03 +509 508 -1.024000000000000e+03 +509 509 2.048000000000000e+03 +509 510 -1.024000000000000e+03 +510 509 -1.024000000000000e+03 +510 510 2.048000000000000e+03 +510 511 -1.024000000000000e+03 +511 510 -1.024000000000000e+03 +511 511 2.048000000000000e+03 +511 512 -1.024000000000000e+03 +512 511 -1.024000000000000e+03 +512 512 2.048000000000000e+03 +512 513 -1.024000000000000e+03 +513 512 -1.024000000000000e+03 +513 513 2.048000000000000e+03 +513 514 -1.024000000000000e+03 +514 513 -1.024000000000000e+03 +514 514 2.048000000000000e+03 +514 515 -1.024000000000000e+03 +515 514 -1.024000000000000e+03 +515 515 2.048000000000000e+03 +515 516 -1.024000000000000e+03 +516 515 -1.024000000000000e+03 +516 516 2.048000000000000e+03 +516 517 -1.024000000000000e+03 +517 516 -1.024000000000000e+03 +517 517 2.048000000000000e+03 +517 518 -1.024000000000000e+03 +518 517 -1.024000000000000e+03 +518 518 2.048000000000000e+03 +518 519 -1.024000000000000e+03 +519 518 -1.024000000000000e+03 +519 519 2.048000000000000e+03 +519 520 -1.024000000000000e+03 +520 519 -1.024000000000000e+03 +520 520 2.048000000000000e+03 +520 521 -1.024000000000000e+03 +521 520 -1.024000000000000e+03 +521 521 2.048000000000000e+03 +521 522 -1.024000000000000e+03 +522 521 -1.024000000000000e+03 +522 522 2.048000000000000e+03 +522 523 -1.024000000000000e+03 +523 522 -1.024000000000000e+03 +523 523 2.048000000000000e+03 +523 524 -1.024000000000000e+03 +524 523 -1.024000000000000e+03 +524 524 2.048000000000000e+03 +524 525 -1.024000000000000e+03 +525 524 -1.024000000000000e+03 +525 525 2.048000000000000e+03 +525 526 -1.024000000000000e+03 +526 525 -1.024000000000000e+03 +526 526 2.048000000000000e+03 +526 527 -1.024000000000000e+03 +527 526 -1.024000000000000e+03 +527 527 2.048000000000000e+03 +527 528 -1.024000000000000e+03 +528 527 -1.024000000000000e+03 +528 528 2.048000000000000e+03 +528 529 -1.024000000000000e+03 +529 528 -1.024000000000000e+03 +529 529 2.048000000000000e+03 +529 530 -1.024000000000000e+03 +530 529 -1.024000000000000e+03 +530 530 2.048000000000000e+03 +530 531 -1.024000000000000e+03 +531 530 -1.024000000000000e+03 +531 531 2.048000000000000e+03 +531 532 -1.024000000000000e+03 +532 531 -1.024000000000000e+03 +532 532 2.048000000000000e+03 +532 533 -1.024000000000000e+03 +533 532 -1.024000000000000e+03 +533 533 2.048000000000000e+03 +533 534 -1.024000000000000e+03 +534 533 -1.024000000000000e+03 +534 534 2.048000000000000e+03 +534 535 -1.024000000000000e+03 +535 534 -1.024000000000000e+03 +535 535 2.048000000000000e+03 +535 536 -1.024000000000000e+03 +536 535 -1.024000000000000e+03 +536 536 2.048000000000000e+03 +536 537 -1.024000000000000e+03 +537 536 -1.024000000000000e+03 +537 537 2.048000000000000e+03 +537 538 -1.024000000000000e+03 +538 537 -1.024000000000000e+03 +538 538 2.048000000000000e+03 +538 539 -1.024000000000000e+03 +539 538 -1.024000000000000e+03 +539 539 2.048000000000000e+03 +539 540 -1.024000000000000e+03 +540 539 -1.024000000000000e+03 +540 540 2.048000000000000e+03 +540 541 -1.024000000000000e+03 +541 540 -1.024000000000000e+03 +541 541 2.048000000000000e+03 +541 542 -1.024000000000000e+03 +542 541 -1.024000000000000e+03 +542 542 2.048000000000000e+03 +542 543 -1.024000000000000e+03 +543 542 -1.024000000000000e+03 +543 543 2.048000000000000e+03 +543 544 -1.024000000000000e+03 +544 543 -1.024000000000000e+03 +544 544 2.048000000000000e+03 +544 545 -1.024000000000000e+03 +545 544 -1.024000000000000e+03 +545 545 2.048000000000000e+03 +545 546 -1.024000000000000e+03 +546 545 -1.024000000000000e+03 +546 546 2.048000000000000e+03 +546 547 -1.024000000000000e+03 +547 546 -1.024000000000000e+03 +547 547 2.048000000000000e+03 +547 548 -1.024000000000000e+03 +548 547 -1.024000000000000e+03 +548 548 2.048000000000000e+03 +548 549 -1.024000000000000e+03 +549 548 -1.024000000000000e+03 +549 549 2.048000000000000e+03 +549 550 -1.024000000000000e+03 +550 549 -1.024000000000000e+03 +550 550 2.048000000000000e+03 +550 551 -1.024000000000000e+03 +551 550 -1.024000000000000e+03 +551 551 2.048000000000000e+03 +551 552 -1.024000000000000e+03 +552 551 -1.024000000000000e+03 +552 552 2.048000000000000e+03 +552 553 -1.024000000000000e+03 +553 552 -1.024000000000000e+03 +553 553 2.048000000000000e+03 +553 554 -1.024000000000000e+03 +554 553 -1.024000000000000e+03 +554 554 2.048000000000000e+03 +554 555 -1.024000000000000e+03 +555 554 -1.024000000000000e+03 +555 555 2.048000000000000e+03 +555 556 -1.024000000000000e+03 +556 555 -1.024000000000000e+03 +556 556 2.048000000000000e+03 +556 557 -1.024000000000000e+03 +557 556 -1.024000000000000e+03 +557 557 2.048000000000000e+03 +557 558 -1.024000000000000e+03 +558 557 -1.024000000000000e+03 +558 558 2.048000000000000e+03 +558 559 -1.024000000000000e+03 +559 558 -1.024000000000000e+03 +559 559 2.048000000000000e+03 +559 560 -1.024000000000000e+03 +560 559 -1.024000000000000e+03 +560 560 2.048000000000000e+03 +560 561 -1.024000000000000e+03 +561 560 -1.024000000000000e+03 +561 561 2.048000000000000e+03 +561 562 -1.024000000000000e+03 +562 561 -1.024000000000000e+03 +562 562 2.048000000000000e+03 +562 563 -1.024000000000000e+03 +563 562 -1.024000000000000e+03 +563 563 2.048000000000000e+03 +563 564 -1.024000000000000e+03 +564 563 -1.024000000000000e+03 +564 564 2.048000000000000e+03 +564 565 -1.024000000000000e+03 +565 564 -1.024000000000000e+03 +565 565 2.048000000000000e+03 +565 566 -1.024000000000000e+03 +566 565 -1.024000000000000e+03 +566 566 2.048000000000000e+03 +566 567 -1.024000000000000e+03 +567 566 -1.024000000000000e+03 +567 567 2.048000000000000e+03 +567 568 -1.024000000000000e+03 +568 567 -1.024000000000000e+03 +568 568 2.048000000000000e+03 +568 569 -1.024000000000000e+03 +569 568 -1.024000000000000e+03 +569 569 2.048000000000000e+03 +569 570 -1.024000000000000e+03 +570 569 -1.024000000000000e+03 +570 570 2.048000000000000e+03 +570 571 -1.024000000000000e+03 +571 570 -1.024000000000000e+03 +571 571 2.048000000000000e+03 +571 572 -1.024000000000000e+03 +572 571 -1.024000000000000e+03 +572 572 2.048000000000000e+03 +572 573 -1.024000000000000e+03 +573 572 -1.024000000000000e+03 +573 573 2.048000000000000e+03 +573 574 -1.024000000000000e+03 +574 573 -1.024000000000000e+03 +574 574 2.048000000000000e+03 +574 575 -1.024000000000000e+03 +575 574 -1.024000000000000e+03 +575 575 2.048000000000000e+03 +575 576 -1.024000000000000e+03 +576 575 -1.024000000000000e+03 +576 576 2.048000000000000e+03 +576 577 -1.024000000000000e+03 +577 576 -1.024000000000000e+03 +577 577 2.048000000000000e+03 +577 578 -1.024000000000000e+03 +578 577 -1.024000000000000e+03 +578 578 2.048000000000000e+03 +578 579 -1.024000000000000e+03 +579 578 -1.024000000000000e+03 +579 579 2.048000000000000e+03 +579 580 -1.024000000000000e+03 +580 579 -1.024000000000000e+03 +580 580 2.048000000000000e+03 +580 581 -1.024000000000000e+03 +581 580 -1.024000000000000e+03 +581 581 2.048000000000000e+03 +581 582 -1.024000000000000e+03 +582 581 -1.024000000000000e+03 +582 582 2.048000000000000e+03 +582 583 -1.024000000000000e+03 +583 582 -1.024000000000000e+03 +583 583 2.048000000000000e+03 +583 584 -1.024000000000000e+03 +584 583 -1.024000000000000e+03 +584 584 2.048000000000000e+03 +584 585 -1.024000000000000e+03 +585 584 -1.024000000000000e+03 +585 585 2.048000000000000e+03 +585 586 -1.024000000000000e+03 +586 585 -1.024000000000000e+03 +586 586 2.048000000000000e+03 +586 587 -1.024000000000000e+03 +587 586 -1.024000000000000e+03 +587 587 2.048000000000000e+03 +587 588 -1.024000000000000e+03 +588 587 -1.024000000000000e+03 +588 588 2.048000000000000e+03 +588 589 -1.024000000000000e+03 +589 588 -1.024000000000000e+03 +589 589 2.048000000000000e+03 +589 590 -1.024000000000000e+03 +590 589 -1.024000000000000e+03 +590 590 2.048000000000000e+03 +590 591 -1.024000000000000e+03 +591 590 -1.024000000000000e+03 +591 591 2.048000000000000e+03 +591 592 -1.024000000000000e+03 +592 591 -1.024000000000000e+03 +592 592 2.048000000000000e+03 +592 593 -1.024000000000000e+03 +593 592 -1.024000000000000e+03 +593 593 2.048000000000000e+03 +593 594 -1.024000000000000e+03 +594 593 -1.024000000000000e+03 +594 594 2.048000000000000e+03 +594 595 -1.024000000000000e+03 +595 594 -1.024000000000000e+03 +595 595 2.048000000000000e+03 +595 596 -1.024000000000000e+03 +596 595 -1.024000000000000e+03 +596 596 2.048000000000000e+03 +596 597 -1.024000000000000e+03 +597 596 -1.024000000000000e+03 +597 597 2.048000000000000e+03 +597 598 -1.024000000000000e+03 +598 597 -1.024000000000000e+03 +598 598 2.048000000000000e+03 +598 599 -1.024000000000000e+03 +599 598 -1.024000000000000e+03 +599 599 2.048000000000000e+03 +599 600 -1.024000000000000e+03 +600 599 -1.024000000000000e+03 +600 600 2.048000000000000e+03 +600 601 -1.024000000000000e+03 +601 600 -1.024000000000000e+03 +601 601 2.048000000000000e+03 +601 602 -1.024000000000000e+03 +602 601 -1.024000000000000e+03 +602 602 2.048000000000000e+03 +602 603 -1.024000000000000e+03 +603 602 -1.024000000000000e+03 +603 603 2.048000000000000e+03 +603 604 -1.024000000000000e+03 +604 603 -1.024000000000000e+03 +604 604 2.048000000000000e+03 +604 605 -1.024000000000000e+03 +605 604 -1.024000000000000e+03 +605 605 2.048000000000000e+03 +605 606 -1.024000000000000e+03 +606 605 -1.024000000000000e+03 +606 606 2.048000000000000e+03 +606 607 -1.024000000000000e+03 +607 606 -1.024000000000000e+03 +607 607 2.048000000000000e+03 +607 608 -1.024000000000000e+03 +608 607 -1.024000000000000e+03 +608 608 2.048000000000000e+03 +608 609 -1.024000000000000e+03 +609 608 -1.024000000000000e+03 +609 609 2.048000000000000e+03 +609 610 -1.024000000000000e+03 +610 609 -1.024000000000000e+03 +610 610 2.048000000000000e+03 +610 611 -1.024000000000000e+03 +611 610 -1.024000000000000e+03 +611 611 2.048000000000000e+03 +611 612 -1.024000000000000e+03 +612 611 -1.024000000000000e+03 +612 612 2.048000000000000e+03 +612 613 -1.024000000000000e+03 +613 612 -1.024000000000000e+03 +613 613 2.048000000000000e+03 +613 614 -1.024000000000000e+03 +614 613 -1.024000000000000e+03 +614 614 2.048000000000000e+03 +614 615 -1.024000000000000e+03 +615 614 -1.024000000000000e+03 +615 615 2.048000000000000e+03 +615 616 -1.024000000000000e+03 +616 615 -1.024000000000000e+03 +616 616 2.048000000000000e+03 +616 617 -1.024000000000000e+03 +617 616 -1.024000000000000e+03 +617 617 2.048000000000000e+03 +617 618 -1.024000000000000e+03 +618 617 -1.024000000000000e+03 +618 618 2.048000000000000e+03 +618 619 -1.024000000000000e+03 +619 618 -1.024000000000000e+03 +619 619 2.048000000000000e+03 +619 620 -1.024000000000000e+03 +620 619 -1.024000000000000e+03 +620 620 2.048000000000000e+03 +620 621 -1.024000000000000e+03 +621 620 -1.024000000000000e+03 +621 621 2.048000000000000e+03 +621 622 -1.024000000000000e+03 +622 621 -1.024000000000000e+03 +622 622 2.048000000000000e+03 +622 623 -1.024000000000000e+03 +623 622 -1.024000000000000e+03 +623 623 2.048000000000000e+03 +623 624 -1.024000000000000e+03 +624 623 -1.024000000000000e+03 +624 624 2.048000000000000e+03 +624 625 -1.024000000000000e+03 +625 624 -1.024000000000000e+03 +625 625 2.048000000000000e+03 +625 626 -1.024000000000000e+03 +626 625 -1.024000000000000e+03 +626 626 2.048000000000000e+03 +626 627 -1.024000000000000e+03 +627 626 -1.024000000000000e+03 +627 627 2.048000000000000e+03 +627 628 -1.024000000000000e+03 +628 627 -1.024000000000000e+03 +628 628 2.048000000000000e+03 +628 629 -1.024000000000000e+03 +629 628 -1.024000000000000e+03 +629 629 2.048000000000000e+03 +629 630 -1.024000000000000e+03 +630 629 -1.024000000000000e+03 +630 630 2.048000000000000e+03 +630 631 -1.024000000000000e+03 +631 630 -1.024000000000000e+03 +631 631 2.048000000000000e+03 +631 632 -1.024000000000000e+03 +632 631 -1.024000000000000e+03 +632 632 2.048000000000000e+03 +632 633 -1.024000000000000e+03 +633 632 -1.024000000000000e+03 +633 633 2.048000000000000e+03 +633 634 -1.024000000000000e+03 +634 633 -1.024000000000000e+03 +634 634 2.048000000000000e+03 +634 635 -1.024000000000000e+03 +635 634 -1.024000000000000e+03 +635 635 2.048000000000000e+03 +635 636 -1.024000000000000e+03 +636 635 -1.024000000000000e+03 +636 636 2.048000000000000e+03 +636 637 -1.024000000000000e+03 +637 636 -1.024000000000000e+03 +637 637 2.048000000000000e+03 +637 638 -1.024000000000000e+03 +638 637 -1.024000000000000e+03 +638 638 2.048000000000000e+03 +638 639 -1.024000000000000e+03 +639 638 -1.024000000000000e+03 +639 639 2.048000000000000e+03 +639 640 -1.024000000000000e+03 +640 639 -1.024000000000000e+03 +640 640 2.048000000000000e+03 +640 641 -1.024000000000000e+03 +641 640 -1.024000000000000e+03 +641 641 2.048000000000000e+03 +641 642 -1.024000000000000e+03 +642 641 -1.024000000000000e+03 +642 642 2.048000000000000e+03 +642 643 -1.024000000000000e+03 +643 642 -1.024000000000000e+03 +643 643 2.048000000000000e+03 +643 644 -1.024000000000000e+03 +644 643 -1.024000000000000e+03 +644 644 2.048000000000000e+03 +644 645 -1.024000000000000e+03 +645 644 -1.024000000000000e+03 +645 645 2.048000000000000e+03 +645 646 -1.024000000000000e+03 +646 645 -1.024000000000000e+03 +646 646 2.048000000000000e+03 +646 647 -1.024000000000000e+03 +647 646 -1.024000000000000e+03 +647 647 2.048000000000000e+03 +647 648 -1.024000000000000e+03 +648 647 -1.024000000000000e+03 +648 648 2.048000000000000e+03 +648 649 -1.024000000000000e+03 +649 648 -1.024000000000000e+03 +649 649 2.048000000000000e+03 +649 650 -1.024000000000000e+03 +650 649 -1.024000000000000e+03 +650 650 2.048000000000000e+03 +650 651 -1.024000000000000e+03 +651 650 -1.024000000000000e+03 +651 651 2.048000000000000e+03 +651 652 -1.024000000000000e+03 +652 651 -1.024000000000000e+03 +652 652 2.048000000000000e+03 +652 653 -1.024000000000000e+03 +653 652 -1.024000000000000e+03 +653 653 2.048000000000000e+03 +653 654 -1.024000000000000e+03 +654 653 -1.024000000000000e+03 +654 654 2.048000000000000e+03 +654 655 -1.024000000000000e+03 +655 654 -1.024000000000000e+03 +655 655 2.048000000000000e+03 +655 656 -1.024000000000000e+03 +656 655 -1.024000000000000e+03 +656 656 2.048000000000000e+03 +656 657 -1.024000000000000e+03 +657 656 -1.024000000000000e+03 +657 657 2.048000000000000e+03 +657 658 -1.024000000000000e+03 +658 657 -1.024000000000000e+03 +658 658 2.048000000000000e+03 +658 659 -1.024000000000000e+03 +659 658 -1.024000000000000e+03 +659 659 2.048000000000000e+03 +659 660 -1.024000000000000e+03 +660 659 -1.024000000000000e+03 +660 660 2.048000000000000e+03 +660 661 -1.024000000000000e+03 +661 660 -1.024000000000000e+03 +661 661 2.048000000000000e+03 +661 662 -1.024000000000000e+03 +662 661 -1.024000000000000e+03 +662 662 2.048000000000000e+03 +662 663 -1.024000000000000e+03 +663 662 -1.024000000000000e+03 +663 663 2.048000000000000e+03 +663 664 -1.024000000000000e+03 +664 663 -1.024000000000000e+03 +664 664 2.048000000000000e+03 +664 665 -1.024000000000000e+03 +665 664 -1.024000000000000e+03 +665 665 2.048000000000000e+03 +665 666 -1.024000000000000e+03 +666 665 -1.024000000000000e+03 +666 666 2.048000000000000e+03 +666 667 -1.024000000000000e+03 +667 666 -1.024000000000000e+03 +667 667 2.048000000000000e+03 +667 668 -1.024000000000000e+03 +668 667 -1.024000000000000e+03 +668 668 2.048000000000000e+03 +668 669 -1.024000000000000e+03 +669 668 -1.024000000000000e+03 +669 669 2.048000000000000e+03 +669 670 -1.024000000000000e+03 +670 669 -1.024000000000000e+03 +670 670 2.048000000000000e+03 +670 671 -1.024000000000000e+03 +671 670 -1.024000000000000e+03 +671 671 2.048000000000000e+03 +671 672 -1.024000000000000e+03 +672 671 -1.024000000000000e+03 +672 672 2.048000000000000e+03 +672 673 -1.024000000000000e+03 +673 672 -1.024000000000000e+03 +673 673 2.048000000000000e+03 +673 674 -1.024000000000000e+03 +674 673 -1.024000000000000e+03 +674 674 2.048000000000000e+03 +674 675 -1.024000000000000e+03 +675 674 -1.024000000000000e+03 +675 675 2.048000000000000e+03 +675 676 -1.024000000000000e+03 +676 675 -1.024000000000000e+03 +676 676 2.048000000000000e+03 +676 677 -1.024000000000000e+03 +677 676 -1.024000000000000e+03 +677 677 2.048000000000000e+03 +677 678 -1.024000000000000e+03 +678 677 -1.024000000000000e+03 +678 678 2.048000000000000e+03 +678 679 -1.024000000000000e+03 +679 678 -1.024000000000000e+03 +679 679 2.048000000000000e+03 +679 680 -1.024000000000000e+03 +680 679 -1.024000000000000e+03 +680 680 2.048000000000000e+03 +680 681 -1.024000000000000e+03 +681 680 -1.024000000000000e+03 +681 681 2.048000000000000e+03 +681 682 -1.024000000000000e+03 +682 681 -1.024000000000000e+03 +682 682 2.048000000000000e+03 +682 683 -1.024000000000000e+03 +683 682 -1.024000000000000e+03 +683 683 2.048000000000000e+03 +683 684 -1.024000000000000e+03 +684 683 -1.024000000000000e+03 +684 684 2.048000000000000e+03 +684 685 -1.024000000000000e+03 +685 684 -1.024000000000000e+03 +685 685 2.048000000000000e+03 +685 686 -1.024000000000000e+03 +686 685 -1.024000000000000e+03 +686 686 2.048000000000000e+03 +686 687 -1.024000000000000e+03 +687 686 -1.024000000000000e+03 +687 687 2.048000000000000e+03 +687 688 -1.024000000000000e+03 +688 687 -1.024000000000000e+03 +688 688 2.048000000000000e+03 +688 689 -1.024000000000000e+03 +689 688 -1.024000000000000e+03 +689 689 2.048000000000000e+03 +689 690 -1.024000000000000e+03 +690 689 -1.024000000000000e+03 +690 690 2.048000000000000e+03 +690 691 -1.024000000000000e+03 +691 690 -1.024000000000000e+03 +691 691 2.048000000000000e+03 +691 692 -1.024000000000000e+03 +692 691 -1.024000000000000e+03 +692 692 2.048000000000000e+03 +692 693 -1.024000000000000e+03 +693 692 -1.024000000000000e+03 +693 693 2.048000000000000e+03 +693 694 -1.024000000000000e+03 +694 693 -1.024000000000000e+03 +694 694 2.048000000000000e+03 +694 695 -1.024000000000000e+03 +695 694 -1.024000000000000e+03 +695 695 2.048000000000000e+03 +695 696 -1.024000000000000e+03 +696 695 -1.024000000000000e+03 +696 696 2.048000000000000e+03 +696 697 -1.024000000000000e+03 +697 696 -1.024000000000000e+03 +697 697 2.048000000000000e+03 +697 698 -1.024000000000000e+03 +698 697 -1.024000000000000e+03 +698 698 2.048000000000000e+03 +698 699 -1.024000000000000e+03 +699 698 -1.024000000000000e+03 +699 699 2.048000000000000e+03 +699 700 -1.024000000000000e+03 +700 699 -1.024000000000000e+03 +700 700 2.048000000000000e+03 +700 701 -1.024000000000000e+03 +701 700 -1.024000000000000e+03 +701 701 2.048000000000000e+03 +701 702 -1.024000000000000e+03 +702 701 -1.024000000000000e+03 +702 702 2.048000000000000e+03 +702 703 -1.024000000000000e+03 +703 702 -1.024000000000000e+03 +703 703 2.048000000000000e+03 +703 704 -1.024000000000000e+03 +704 703 -1.024000000000000e+03 +704 704 2.048000000000000e+03 +704 705 -1.024000000000000e+03 +705 704 -1.024000000000000e+03 +705 705 2.048000000000000e+03 +705 706 -1.024000000000000e+03 +706 705 -1.024000000000000e+03 +706 706 2.048000000000000e+03 +706 707 -1.024000000000000e+03 +707 706 -1.024000000000000e+03 +707 707 2.048000000000000e+03 +707 708 -1.024000000000000e+03 +708 707 -1.024000000000000e+03 +708 708 2.048000000000000e+03 +708 709 -1.024000000000000e+03 +709 708 -1.024000000000000e+03 +709 709 2.048000000000000e+03 +709 710 -1.024000000000000e+03 +710 709 -1.024000000000000e+03 +710 710 2.048000000000000e+03 +710 711 -1.024000000000000e+03 +711 710 -1.024000000000000e+03 +711 711 2.048000000000000e+03 +711 712 -1.024000000000000e+03 +712 711 -1.024000000000000e+03 +712 712 2.048000000000000e+03 +712 713 -1.024000000000000e+03 +713 712 -1.024000000000000e+03 +713 713 2.048000000000000e+03 +713 714 -1.024000000000000e+03 +714 713 -1.024000000000000e+03 +714 714 2.048000000000000e+03 +714 715 -1.024000000000000e+03 +715 714 -1.024000000000000e+03 +715 715 2.048000000000000e+03 +715 716 -1.024000000000000e+03 +716 715 -1.024000000000000e+03 +716 716 2.048000000000000e+03 +716 717 -1.024000000000000e+03 +717 716 -1.024000000000000e+03 +717 717 2.048000000000000e+03 +717 718 -1.024000000000000e+03 +718 717 -1.024000000000000e+03 +718 718 2.048000000000000e+03 +718 719 -1.024000000000000e+03 +719 718 -1.024000000000000e+03 +719 719 2.048000000000000e+03 +719 720 -1.024000000000000e+03 +720 719 -1.024000000000000e+03 +720 720 2.048000000000000e+03 +720 721 -1.024000000000000e+03 +721 720 -1.024000000000000e+03 +721 721 2.048000000000000e+03 +721 722 -1.024000000000000e+03 +722 721 -1.024000000000000e+03 +722 722 2.048000000000000e+03 +722 723 -1.024000000000000e+03 +723 722 -1.024000000000000e+03 +723 723 2.048000000000000e+03 +723 724 -1.024000000000000e+03 +724 723 -1.024000000000000e+03 +724 724 2.048000000000000e+03 +724 725 -1.024000000000000e+03 +725 724 -1.024000000000000e+03 +725 725 2.048000000000000e+03 +725 726 -1.024000000000000e+03 +726 725 -1.024000000000000e+03 +726 726 2.048000000000000e+03 +726 727 -1.024000000000000e+03 +727 726 -1.024000000000000e+03 +727 727 2.048000000000000e+03 +727 728 -1.024000000000000e+03 +728 727 -1.024000000000000e+03 +728 728 2.048000000000000e+03 +728 729 -1.024000000000000e+03 +729 728 -1.024000000000000e+03 +729 729 2.048000000000000e+03 +729 730 -1.024000000000000e+03 +730 729 -1.024000000000000e+03 +730 730 2.048000000000000e+03 +730 731 -1.024000000000000e+03 +731 730 -1.024000000000000e+03 +731 731 2.048000000000000e+03 +731 732 -1.024000000000000e+03 +732 731 -1.024000000000000e+03 +732 732 2.048000000000000e+03 +732 733 -1.024000000000000e+03 +733 732 -1.024000000000000e+03 +733 733 2.048000000000000e+03 +733 734 -1.024000000000000e+03 +734 733 -1.024000000000000e+03 +734 734 2.048000000000000e+03 +734 735 -1.024000000000000e+03 +735 734 -1.024000000000000e+03 +735 735 2.048000000000000e+03 +735 736 -1.024000000000000e+03 +736 735 -1.024000000000000e+03 +736 736 2.048000000000000e+03 +736 737 -1.024000000000000e+03 +737 736 -1.024000000000000e+03 +737 737 2.048000000000000e+03 +737 738 -1.024000000000000e+03 +738 737 -1.024000000000000e+03 +738 738 2.048000000000000e+03 +738 739 -1.024000000000000e+03 +739 738 -1.024000000000000e+03 +739 739 2.048000000000000e+03 +739 740 -1.024000000000000e+03 +740 739 -1.024000000000000e+03 +740 740 2.048000000000000e+03 +740 741 -1.024000000000000e+03 +741 740 -1.024000000000000e+03 +741 741 2.048000000000000e+03 +741 742 -1.024000000000000e+03 +742 741 -1.024000000000000e+03 +742 742 2.048000000000000e+03 +742 743 -1.024000000000000e+03 +743 742 -1.024000000000000e+03 +743 743 2.048000000000000e+03 +743 744 -1.024000000000000e+03 +744 743 -1.024000000000000e+03 +744 744 2.048000000000000e+03 +744 745 -1.024000000000000e+03 +745 744 -1.024000000000000e+03 +745 745 2.048000000000000e+03 +745 746 -1.024000000000000e+03 +746 745 -1.024000000000000e+03 +746 746 2.048000000000000e+03 +746 747 -1.024000000000000e+03 +747 746 -1.024000000000000e+03 +747 747 2.048000000000000e+03 +747 748 -1.024000000000000e+03 +748 747 -1.024000000000000e+03 +748 748 2.048000000000000e+03 +748 749 -1.024000000000000e+03 +749 748 -1.024000000000000e+03 +749 749 2.048000000000000e+03 +749 750 -1.024000000000000e+03 +750 749 -1.024000000000000e+03 +750 750 2.048000000000000e+03 +750 751 -1.024000000000000e+03 +751 750 -1.024000000000000e+03 +751 751 2.048000000000000e+03 +751 752 -1.024000000000000e+03 +752 751 -1.024000000000000e+03 +752 752 2.048000000000000e+03 +752 753 -1.024000000000000e+03 +753 752 -1.024000000000000e+03 +753 753 2.048000000000000e+03 +753 754 -1.024000000000000e+03 +754 753 -1.024000000000000e+03 +754 754 2.048000000000000e+03 +754 755 -1.024000000000000e+03 +755 754 -1.024000000000000e+03 +755 755 2.048000000000000e+03 +755 756 -1.024000000000000e+03 +756 755 -1.024000000000000e+03 +756 756 2.048000000000000e+03 +756 757 -1.024000000000000e+03 +757 756 -1.024000000000000e+03 +757 757 2.048000000000000e+03 +757 758 -1.024000000000000e+03 +758 757 -1.024000000000000e+03 +758 758 2.048000000000000e+03 +758 759 -1.024000000000000e+03 +759 758 -1.024000000000000e+03 +759 759 2.048000000000000e+03 +759 760 -1.024000000000000e+03 +760 759 -1.024000000000000e+03 +760 760 2.048000000000000e+03 +760 761 -1.024000000000000e+03 +761 760 -1.024000000000000e+03 +761 761 2.048000000000000e+03 +761 762 -1.024000000000000e+03 +762 761 -1.024000000000000e+03 +762 762 2.048000000000000e+03 +762 763 -1.024000000000000e+03 +763 762 -1.024000000000000e+03 +763 763 2.048000000000000e+03 +763 764 -1.024000000000000e+03 +764 763 -1.024000000000000e+03 +764 764 2.048000000000000e+03 +764 765 -1.024000000000000e+03 +765 764 -1.024000000000000e+03 +765 765 2.048000000000000e+03 +765 766 -1.024000000000000e+03 +766 765 -1.024000000000000e+03 +766 766 2.048000000000000e+03 +766 767 -1.024000000000000e+03 +767 766 -1.024000000000000e+03 +767 767 2.048000000000000e+03 +767 768 -1.024000000000000e+03 +768 767 -1.024000000000000e+03 +768 768 2.048000000000000e+03 +768 769 -1.024000000000000e+03 +769 768 -1.024000000000000e+03 +769 769 2.048000000000000e+03 +769 770 -1.024000000000000e+03 +770 769 -1.024000000000000e+03 +770 770 2.048000000000000e+03 +770 771 -1.024000000000000e+03 +771 770 -1.024000000000000e+03 +771 771 2.048000000000000e+03 +771 772 -1.024000000000000e+03 +772 771 -1.024000000000000e+03 +772 772 2.048000000000000e+03 +772 773 -1.024000000000000e+03 +773 772 -1.024000000000000e+03 +773 773 2.048000000000000e+03 +773 774 -1.024000000000000e+03 +774 773 -1.024000000000000e+03 +774 774 2.048000000000000e+03 +774 775 -1.024000000000000e+03 +775 774 -1.024000000000000e+03 +775 775 2.048000000000000e+03 +775 776 -1.024000000000000e+03 +776 775 -1.024000000000000e+03 +776 776 2.048000000000000e+03 +776 777 -1.024000000000000e+03 +777 776 -1.024000000000000e+03 +777 777 2.048000000000000e+03 +777 778 -1.024000000000000e+03 +778 777 -1.024000000000000e+03 +778 778 2.048000000000000e+03 +778 779 -1.024000000000000e+03 +779 778 -1.024000000000000e+03 +779 779 2.048000000000000e+03 +779 780 -1.024000000000000e+03 +780 779 -1.024000000000000e+03 +780 780 2.048000000000000e+03 +780 781 -1.024000000000000e+03 +781 780 -1.024000000000000e+03 +781 781 2.048000000000000e+03 +781 782 -1.024000000000000e+03 +782 781 -1.024000000000000e+03 +782 782 2.048000000000000e+03 +782 783 -1.024000000000000e+03 +783 782 -1.024000000000000e+03 +783 783 2.048000000000000e+03 +783 784 -1.024000000000000e+03 +784 783 -1.024000000000000e+03 +784 784 2.048000000000000e+03 +784 785 -1.024000000000000e+03 +785 784 -1.024000000000000e+03 +785 785 2.048000000000000e+03 +785 786 -1.024000000000000e+03 +786 785 -1.024000000000000e+03 +786 786 2.048000000000000e+03 +786 787 -1.024000000000000e+03 +787 786 -1.024000000000000e+03 +787 787 2.048000000000000e+03 +787 788 -1.024000000000000e+03 +788 787 -1.024000000000000e+03 +788 788 2.048000000000000e+03 +788 789 -1.024000000000000e+03 +789 788 -1.024000000000000e+03 +789 789 2.048000000000000e+03 +789 790 -1.024000000000000e+03 +790 789 -1.024000000000000e+03 +790 790 2.048000000000000e+03 +790 791 -1.024000000000000e+03 +791 790 -1.024000000000000e+03 +791 791 2.048000000000000e+03 +791 792 -1.024000000000000e+03 +792 791 -1.024000000000000e+03 +792 792 2.048000000000000e+03 +792 793 -1.024000000000000e+03 +793 792 -1.024000000000000e+03 +793 793 2.048000000000000e+03 +793 794 -1.024000000000000e+03 +794 793 -1.024000000000000e+03 +794 794 2.048000000000000e+03 +794 795 -1.024000000000000e+03 +795 794 -1.024000000000000e+03 +795 795 2.048000000000000e+03 +795 796 -1.024000000000000e+03 +796 795 -1.024000000000000e+03 +796 796 2.048000000000000e+03 +796 797 -1.024000000000000e+03 +797 796 -1.024000000000000e+03 +797 797 2.048000000000000e+03 +797 798 -1.024000000000000e+03 +798 797 -1.024000000000000e+03 +798 798 2.048000000000000e+03 +798 799 -1.024000000000000e+03 +799 798 -1.024000000000000e+03 +799 799 2.048000000000000e+03 +799 800 -1.024000000000000e+03 +800 799 -1.024000000000000e+03 +800 800 2.048000000000000e+03 +800 801 -1.024000000000000e+03 +801 800 -1.024000000000000e+03 +801 801 2.048000000000000e+03 +801 802 -1.024000000000000e+03 +802 801 -1.024000000000000e+03 +802 802 2.048000000000000e+03 +802 803 -1.024000000000000e+03 +803 802 -1.024000000000000e+03 +803 803 2.048000000000000e+03 +803 804 -1.024000000000000e+03 +804 803 -1.024000000000000e+03 +804 804 2.048000000000000e+03 +804 805 -1.024000000000000e+03 +805 804 -1.024000000000000e+03 +805 805 2.048000000000000e+03 +805 806 -1.024000000000000e+03 +806 805 -1.024000000000000e+03 +806 806 2.048000000000000e+03 +806 807 -1.024000000000000e+03 +807 806 -1.024000000000000e+03 +807 807 2.048000000000000e+03 +807 808 -1.024000000000000e+03 +808 807 -1.024000000000000e+03 +808 808 2.048000000000000e+03 +808 809 -1.024000000000000e+03 +809 808 -1.024000000000000e+03 +809 809 2.048000000000000e+03 +809 810 -1.024000000000000e+03 +810 809 -1.024000000000000e+03 +810 810 2.048000000000000e+03 +810 811 -1.024000000000000e+03 +811 810 -1.024000000000000e+03 +811 811 2.048000000000000e+03 +811 812 -1.024000000000000e+03 +812 811 -1.024000000000000e+03 +812 812 2.048000000000000e+03 +812 813 -1.024000000000000e+03 +813 812 -1.024000000000000e+03 +813 813 2.048000000000000e+03 +813 814 -1.024000000000000e+03 +814 813 -1.024000000000000e+03 +814 814 2.048000000000000e+03 +814 815 -1.024000000000000e+03 +815 814 -1.024000000000000e+03 +815 815 2.048000000000000e+03 +815 816 -1.024000000000000e+03 +816 815 -1.024000000000000e+03 +816 816 2.048000000000000e+03 +816 817 -1.024000000000000e+03 +817 816 -1.024000000000000e+03 +817 817 2.048000000000000e+03 +817 818 -1.024000000000000e+03 +818 817 -1.024000000000000e+03 +818 818 2.048000000000000e+03 +818 819 -1.024000000000000e+03 +819 818 -1.024000000000000e+03 +819 819 2.048000000000000e+03 +819 820 -1.024000000000000e+03 +820 819 -1.024000000000000e+03 +820 820 2.048000000000000e+03 +820 821 -1.024000000000000e+03 +821 820 -1.024000000000000e+03 +821 821 2.048000000000000e+03 +821 822 -1.024000000000000e+03 +822 821 -1.024000000000000e+03 +822 822 2.048000000000000e+03 +822 823 -1.024000000000000e+03 +823 822 -1.024000000000000e+03 +823 823 2.048000000000000e+03 +823 824 -1.024000000000000e+03 +824 823 -1.024000000000000e+03 +824 824 2.048000000000000e+03 +824 825 -1.024000000000000e+03 +825 824 -1.024000000000000e+03 +825 825 2.048000000000000e+03 +825 826 -1.024000000000000e+03 +826 825 -1.024000000000000e+03 +826 826 2.048000000000000e+03 +826 827 -1.024000000000000e+03 +827 826 -1.024000000000000e+03 +827 827 2.048000000000000e+03 +827 828 -1.024000000000000e+03 +828 827 -1.024000000000000e+03 +828 828 2.048000000000000e+03 +828 829 -1.024000000000000e+03 +829 828 -1.024000000000000e+03 +829 829 2.048000000000000e+03 +829 830 -1.024000000000000e+03 +830 829 -1.024000000000000e+03 +830 830 2.048000000000000e+03 +830 831 -1.024000000000000e+03 +831 830 -1.024000000000000e+03 +831 831 2.048000000000000e+03 +831 832 -1.024000000000000e+03 +832 831 -1.024000000000000e+03 +832 832 2.048000000000000e+03 +832 833 -1.024000000000000e+03 +833 832 -1.024000000000000e+03 +833 833 2.048000000000000e+03 +833 834 -1.024000000000000e+03 +834 833 -1.024000000000000e+03 +834 834 2.048000000000000e+03 +834 835 -1.024000000000000e+03 +835 834 -1.024000000000000e+03 +835 835 2.048000000000000e+03 +835 836 -1.024000000000000e+03 +836 835 -1.024000000000000e+03 +836 836 2.048000000000000e+03 +836 837 -1.024000000000000e+03 +837 836 -1.024000000000000e+03 +837 837 2.048000000000000e+03 +837 838 -1.024000000000000e+03 +838 837 -1.024000000000000e+03 +838 838 2.048000000000000e+03 +838 839 -1.024000000000000e+03 +839 838 -1.024000000000000e+03 +839 839 2.048000000000000e+03 +839 840 -1.024000000000000e+03 +840 839 -1.024000000000000e+03 +840 840 2.048000000000000e+03 +840 841 -1.024000000000000e+03 +841 840 -1.024000000000000e+03 +841 841 2.048000000000000e+03 +841 842 -1.024000000000000e+03 +842 841 -1.024000000000000e+03 +842 842 2.048000000000000e+03 +842 843 -1.024000000000000e+03 +843 842 -1.024000000000000e+03 +843 843 2.048000000000000e+03 +843 844 -1.024000000000000e+03 +844 843 -1.024000000000000e+03 +844 844 2.048000000000000e+03 +844 845 -1.024000000000000e+03 +845 844 -1.024000000000000e+03 +845 845 2.048000000000000e+03 +845 846 -1.024000000000000e+03 +846 845 -1.024000000000000e+03 +846 846 2.048000000000000e+03 +846 847 -1.024000000000000e+03 +847 846 -1.024000000000000e+03 +847 847 2.048000000000000e+03 +847 848 -1.024000000000000e+03 +848 847 -1.024000000000000e+03 +848 848 2.048000000000000e+03 +848 849 -1.024000000000000e+03 +849 848 -1.024000000000000e+03 +849 849 2.048000000000000e+03 +849 850 -1.024000000000000e+03 +850 849 -1.024000000000000e+03 +850 850 2.048000000000000e+03 +850 851 -1.024000000000000e+03 +851 850 -1.024000000000000e+03 +851 851 2.048000000000000e+03 +851 852 -1.024000000000000e+03 +852 851 -1.024000000000000e+03 +852 852 2.048000000000000e+03 +852 853 -1.024000000000000e+03 +853 852 -1.024000000000000e+03 +853 853 2.048000000000000e+03 +853 854 -1.024000000000000e+03 +854 853 -1.024000000000000e+03 +854 854 2.048000000000000e+03 +854 855 -1.024000000000000e+03 +855 854 -1.024000000000000e+03 +855 855 2.048000000000000e+03 +855 856 -1.024000000000000e+03 +856 855 -1.024000000000000e+03 +856 856 2.048000000000000e+03 +856 857 -1.024000000000000e+03 +857 856 -1.024000000000000e+03 +857 857 2.048000000000000e+03 +857 858 -1.024000000000000e+03 +858 857 -1.024000000000000e+03 +858 858 2.048000000000000e+03 +858 859 -1.024000000000000e+03 +859 858 -1.024000000000000e+03 +859 859 2.048000000000000e+03 +859 860 -1.024000000000000e+03 +860 859 -1.024000000000000e+03 +860 860 2.048000000000000e+03 +860 861 -1.024000000000000e+03 +861 860 -1.024000000000000e+03 +861 861 2.048000000000000e+03 +861 862 -1.024000000000000e+03 +862 861 -1.024000000000000e+03 +862 862 2.048000000000000e+03 +862 863 -1.024000000000000e+03 +863 862 -1.024000000000000e+03 +863 863 2.048000000000000e+03 +863 864 -1.024000000000000e+03 +864 863 -1.024000000000000e+03 +864 864 2.048000000000000e+03 +864 865 -1.024000000000000e+03 +865 864 -1.024000000000000e+03 +865 865 2.048000000000000e+03 +865 866 -1.024000000000000e+03 +866 865 -1.024000000000000e+03 +866 866 2.048000000000000e+03 +866 867 -1.024000000000000e+03 +867 866 -1.024000000000000e+03 +867 867 2.048000000000000e+03 +867 868 -1.024000000000000e+03 +868 867 -1.024000000000000e+03 +868 868 2.048000000000000e+03 +868 869 -1.024000000000000e+03 +869 868 -1.024000000000000e+03 +869 869 2.048000000000000e+03 +869 870 -1.024000000000000e+03 +870 869 -1.024000000000000e+03 +870 870 2.048000000000000e+03 +870 871 -1.024000000000000e+03 +871 870 -1.024000000000000e+03 +871 871 2.048000000000000e+03 +871 872 -1.024000000000000e+03 +872 871 -1.024000000000000e+03 +872 872 2.048000000000000e+03 +872 873 -1.024000000000000e+03 +873 872 -1.024000000000000e+03 +873 873 2.048000000000000e+03 +873 874 -1.024000000000000e+03 +874 873 -1.024000000000000e+03 +874 874 2.048000000000000e+03 +874 875 -1.024000000000000e+03 +875 874 -1.024000000000000e+03 +875 875 2.048000000000000e+03 +875 876 -1.024000000000000e+03 +876 875 -1.024000000000000e+03 +876 876 2.048000000000000e+03 +876 877 -1.024000000000000e+03 +877 876 -1.024000000000000e+03 +877 877 2.048000000000000e+03 +877 878 -1.024000000000000e+03 +878 877 -1.024000000000000e+03 +878 878 2.048000000000000e+03 +878 879 -1.024000000000000e+03 +879 878 -1.024000000000000e+03 +879 879 2.048000000000000e+03 +879 880 -1.024000000000000e+03 +880 879 -1.024000000000000e+03 +880 880 2.048000000000000e+03 +880 881 -1.024000000000000e+03 +881 880 -1.024000000000000e+03 +881 881 2.048000000000000e+03 +881 882 -1.024000000000000e+03 +882 881 -1.024000000000000e+03 +882 882 2.048000000000000e+03 +882 883 -1.024000000000000e+03 +883 882 -1.024000000000000e+03 +883 883 2.048000000000000e+03 +883 884 -1.024000000000000e+03 +884 883 -1.024000000000000e+03 +884 884 2.048000000000000e+03 +884 885 -1.024000000000000e+03 +885 884 -1.024000000000000e+03 +885 885 2.048000000000000e+03 +885 886 -1.024000000000000e+03 +886 885 -1.024000000000000e+03 +886 886 2.048000000000000e+03 +886 887 -1.024000000000000e+03 +887 886 -1.024000000000000e+03 +887 887 2.048000000000000e+03 +887 888 -1.024000000000000e+03 +888 887 -1.024000000000000e+03 +888 888 2.048000000000000e+03 +888 889 -1.024000000000000e+03 +889 888 -1.024000000000000e+03 +889 889 2.048000000000000e+03 +889 890 -1.024000000000000e+03 +890 889 -1.024000000000000e+03 +890 890 2.048000000000000e+03 +890 891 -1.024000000000000e+03 +891 890 -1.024000000000000e+03 +891 891 2.048000000000000e+03 +891 892 -1.024000000000000e+03 +892 891 -1.024000000000000e+03 +892 892 2.048000000000000e+03 +892 893 -1.024000000000000e+03 +893 892 -1.024000000000000e+03 +893 893 2.048000000000000e+03 +893 894 -1.024000000000000e+03 +894 893 -1.024000000000000e+03 +894 894 2.048000000000000e+03 +894 895 -1.024000000000000e+03 +895 894 -1.024000000000000e+03 +895 895 2.048000000000000e+03 +895 896 -1.024000000000000e+03 +896 895 -1.024000000000000e+03 +896 896 2.048000000000000e+03 +896 897 -1.024000000000000e+03 +897 896 -1.024000000000000e+03 +897 897 2.048000000000000e+03 +897 898 -1.024000000000000e+03 +898 897 -1.024000000000000e+03 +898 898 2.048000000000000e+03 +898 899 -1.024000000000000e+03 +899 898 -1.024000000000000e+03 +899 899 2.048000000000000e+03 +899 900 -1.024000000000000e+03 +900 899 -1.024000000000000e+03 +900 900 2.048000000000000e+03 +900 901 -1.024000000000000e+03 +901 900 -1.024000000000000e+03 +901 901 2.048000000000000e+03 +901 902 -1.024000000000000e+03 +902 901 -1.024000000000000e+03 +902 902 2.048000000000000e+03 +902 903 -1.024000000000000e+03 +903 902 -1.024000000000000e+03 +903 903 2.048000000000000e+03 +903 904 -1.024000000000000e+03 +904 903 -1.024000000000000e+03 +904 904 2.048000000000000e+03 +904 905 -1.024000000000000e+03 +905 904 -1.024000000000000e+03 +905 905 2.048000000000000e+03 +905 906 -1.024000000000000e+03 +906 905 -1.024000000000000e+03 +906 906 2.048000000000000e+03 +906 907 -1.024000000000000e+03 +907 906 -1.024000000000000e+03 +907 907 2.048000000000000e+03 +907 908 -1.024000000000000e+03 +908 907 -1.024000000000000e+03 +908 908 2.048000000000000e+03 +908 909 -1.024000000000000e+03 +909 908 -1.024000000000000e+03 +909 909 2.048000000000000e+03 +909 910 -1.024000000000000e+03 +910 909 -1.024000000000000e+03 +910 910 2.048000000000000e+03 +910 911 -1.024000000000000e+03 +911 910 -1.024000000000000e+03 +911 911 2.048000000000000e+03 +911 912 -1.024000000000000e+03 +912 911 -1.024000000000000e+03 +912 912 2.048000000000000e+03 +912 913 -1.024000000000000e+03 +913 912 -1.024000000000000e+03 +913 913 2.048000000000000e+03 +913 914 -1.024000000000000e+03 +914 913 -1.024000000000000e+03 +914 914 2.048000000000000e+03 +914 915 -1.024000000000000e+03 +915 914 -1.024000000000000e+03 +915 915 2.048000000000000e+03 +915 916 -1.024000000000000e+03 +916 915 -1.024000000000000e+03 +916 916 2.048000000000000e+03 +916 917 -1.024000000000000e+03 +917 916 -1.024000000000000e+03 +917 917 2.048000000000000e+03 +917 918 -1.024000000000000e+03 +918 917 -1.024000000000000e+03 +918 918 2.048000000000000e+03 +918 919 -1.024000000000000e+03 +919 918 -1.024000000000000e+03 +919 919 2.048000000000000e+03 +919 920 -1.024000000000000e+03 +920 919 -1.024000000000000e+03 +920 920 2.048000000000000e+03 +920 921 -1.024000000000000e+03 +921 920 -1.024000000000000e+03 +921 921 2.048000000000000e+03 +921 922 -1.024000000000000e+03 +922 921 -1.024000000000000e+03 +922 922 2.048000000000000e+03 +922 923 -1.024000000000000e+03 +923 922 -1.024000000000000e+03 +923 923 2.048000000000000e+03 +923 924 -1.024000000000000e+03 +924 923 -1.024000000000000e+03 +924 924 2.048000000000000e+03 +924 925 -1.024000000000000e+03 +925 924 -1.024000000000000e+03 +925 925 2.048000000000000e+03 +925 926 -1.024000000000000e+03 +926 925 -1.024000000000000e+03 +926 926 2.048000000000000e+03 +926 927 -1.024000000000000e+03 +927 926 -1.024000000000000e+03 +927 927 2.048000000000000e+03 +927 928 -1.024000000000000e+03 +928 927 -1.024000000000000e+03 +928 928 2.048000000000000e+03 +928 929 -1.024000000000000e+03 +929 928 -1.024000000000000e+03 +929 929 2.048000000000000e+03 +929 930 -1.024000000000000e+03 +930 929 -1.024000000000000e+03 +930 930 2.048000000000000e+03 +930 931 -1.024000000000000e+03 +931 930 -1.024000000000000e+03 +931 931 2.048000000000000e+03 +931 932 -1.024000000000000e+03 +932 931 -1.024000000000000e+03 +932 932 2.048000000000000e+03 +932 933 -1.024000000000000e+03 +933 932 -1.024000000000000e+03 +933 933 2.048000000000000e+03 +933 934 -1.024000000000000e+03 +934 933 -1.024000000000000e+03 +934 934 2.048000000000000e+03 +934 935 -1.024000000000000e+03 +935 934 -1.024000000000000e+03 +935 935 2.048000000000000e+03 +935 936 -1.024000000000000e+03 +936 935 -1.024000000000000e+03 +936 936 2.048000000000000e+03 +936 937 -1.024000000000000e+03 +937 936 -1.024000000000000e+03 +937 937 2.048000000000000e+03 +937 938 -1.024000000000000e+03 +938 937 -1.024000000000000e+03 +938 938 2.048000000000000e+03 +938 939 -1.024000000000000e+03 +939 938 -1.024000000000000e+03 +939 939 2.048000000000000e+03 +939 940 -1.024000000000000e+03 +940 939 -1.024000000000000e+03 +940 940 2.048000000000000e+03 +940 941 -1.024000000000000e+03 +941 940 -1.024000000000000e+03 +941 941 2.048000000000000e+03 +941 942 -1.024000000000000e+03 +942 941 -1.024000000000000e+03 +942 942 2.048000000000000e+03 +942 943 -1.024000000000000e+03 +943 942 -1.024000000000000e+03 +943 943 2.048000000000000e+03 +943 944 -1.024000000000000e+03 +944 943 -1.024000000000000e+03 +944 944 2.048000000000000e+03 +944 945 -1.024000000000000e+03 +945 944 -1.024000000000000e+03 +945 945 2.048000000000000e+03 +945 946 -1.024000000000000e+03 +946 945 -1.024000000000000e+03 +946 946 2.048000000000000e+03 +946 947 -1.024000000000000e+03 +947 946 -1.024000000000000e+03 +947 947 2.048000000000000e+03 +947 948 -1.024000000000000e+03 +948 947 -1.024000000000000e+03 +948 948 2.048000000000000e+03 +948 949 -1.024000000000000e+03 +949 948 -1.024000000000000e+03 +949 949 2.048000000000000e+03 +949 950 -1.024000000000000e+03 +950 949 -1.024000000000000e+03 +950 950 2.048000000000000e+03 +950 951 -1.024000000000000e+03 +951 950 -1.024000000000000e+03 +951 951 2.048000000000000e+03 +951 952 -1.024000000000000e+03 +952 951 -1.024000000000000e+03 +952 952 2.048000000000000e+03 +952 953 -1.024000000000000e+03 +953 952 -1.024000000000000e+03 +953 953 2.048000000000000e+03 +953 954 -1.024000000000000e+03 +954 953 -1.024000000000000e+03 +954 954 2.048000000000000e+03 +954 955 -1.024000000000000e+03 +955 954 -1.024000000000000e+03 +955 955 2.048000000000000e+03 +955 956 -1.024000000000000e+03 +956 955 -1.024000000000000e+03 +956 956 2.048000000000000e+03 +956 957 -1.024000000000000e+03 +957 956 -1.024000000000000e+03 +957 957 2.048000000000000e+03 +957 958 -1.024000000000000e+03 +958 957 -1.024000000000000e+03 +958 958 2.048000000000000e+03 +958 959 -1.024000000000000e+03 +959 958 -1.024000000000000e+03 +959 959 2.048000000000000e+03 +959 960 -1.024000000000000e+03 +960 959 -1.024000000000000e+03 +960 960 2.048000000000000e+03 +960 961 -1.024000000000000e+03 +961 960 -1.024000000000000e+03 +961 961 2.048000000000000e+03 +961 962 -1.024000000000000e+03 +962 961 -1.024000000000000e+03 +962 962 2.048000000000000e+03 +962 963 -1.024000000000000e+03 +963 962 -1.024000000000000e+03 +963 963 2.048000000000000e+03 +963 964 -1.024000000000000e+03 +964 963 -1.024000000000000e+03 +964 964 2.048000000000000e+03 +964 965 -1.024000000000000e+03 +965 964 -1.024000000000000e+03 +965 965 2.048000000000000e+03 +965 966 -1.024000000000000e+03 +966 965 -1.024000000000000e+03 +966 966 2.048000000000000e+03 +966 967 -1.024000000000000e+03 +967 966 -1.024000000000000e+03 +967 967 2.048000000000000e+03 +967 968 -1.024000000000000e+03 +968 967 -1.024000000000000e+03 +968 968 2.048000000000000e+03 +968 969 -1.024000000000000e+03 +969 968 -1.024000000000000e+03 +969 969 2.048000000000000e+03 +969 970 -1.024000000000000e+03 +970 969 -1.024000000000000e+03 +970 970 2.048000000000000e+03 +970 971 -1.024000000000000e+03 +971 970 -1.024000000000000e+03 +971 971 2.048000000000000e+03 +971 972 -1.024000000000000e+03 +972 971 -1.024000000000000e+03 +972 972 2.048000000000000e+03 +972 973 -1.024000000000000e+03 +973 972 -1.024000000000000e+03 +973 973 2.048000000000000e+03 +973 974 -1.024000000000000e+03 +974 973 -1.024000000000000e+03 +974 974 2.048000000000000e+03 +974 975 -1.024000000000000e+03 +975 974 -1.024000000000000e+03 +975 975 2.048000000000000e+03 +975 976 -1.024000000000000e+03 +976 975 -1.024000000000000e+03 +976 976 2.048000000000000e+03 +976 977 -1.024000000000000e+03 +977 976 -1.024000000000000e+03 +977 977 2.048000000000000e+03 +977 978 -1.024000000000000e+03 +978 977 -1.024000000000000e+03 +978 978 2.048000000000000e+03 +978 979 -1.024000000000000e+03 +979 978 -1.024000000000000e+03 +979 979 2.048000000000000e+03 +979 980 -1.024000000000000e+03 +980 979 -1.024000000000000e+03 +980 980 2.048000000000000e+03 +980 981 -1.024000000000000e+03 +981 980 -1.024000000000000e+03 +981 981 2.048000000000000e+03 +981 982 -1.024000000000000e+03 +982 981 -1.024000000000000e+03 +982 982 2.048000000000000e+03 +982 983 -1.024000000000000e+03 +983 982 -1.024000000000000e+03 +983 983 2.048000000000000e+03 +983 984 -1.024000000000000e+03 +984 983 -1.024000000000000e+03 +984 984 2.048000000000000e+03 +984 985 -1.024000000000000e+03 +985 984 -1.024000000000000e+03 +985 985 2.048000000000000e+03 +985 986 -1.024000000000000e+03 +986 985 -1.024000000000000e+03 +986 986 2.048000000000000e+03 +986 987 -1.024000000000000e+03 +987 986 -1.024000000000000e+03 +987 987 2.048000000000000e+03 +987 988 -1.024000000000000e+03 +988 987 -1.024000000000000e+03 +988 988 2.048000000000000e+03 +988 989 -1.024000000000000e+03 +989 988 -1.024000000000000e+03 +989 989 2.048000000000000e+03 +989 990 -1.024000000000000e+03 +990 989 -1.024000000000000e+03 +990 990 2.048000000000000e+03 +990 991 -1.024000000000000e+03 +991 990 -1.024000000000000e+03 +991 991 2.048000000000000e+03 +991 992 -1.024000000000000e+03 +992 991 -1.024000000000000e+03 +992 992 2.048000000000000e+03 +992 993 -1.024000000000000e+03 +993 992 -1.024000000000000e+03 +993 993 2.048000000000000e+03 +993 994 -1.024000000000000e+03 +994 993 -1.024000000000000e+03 +994 994 2.048000000000000e+03 +994 995 -1.024000000000000e+03 +995 994 -1.024000000000000e+03 +995 995 2.048000000000000e+03 +995 996 -1.024000000000000e+03 +996 995 -1.024000000000000e+03 +996 996 2.048000000000000e+03 +996 997 -1.024000000000000e+03 +997 996 -1.024000000000000e+03 +997 997 2.048000000000000e+03 +997 998 -1.024000000000000e+03 +998 997 -1.024000000000000e+03 +998 998 2.048000000000000e+03 +998 999 -1.024000000000000e+03 +999 998 -1.024000000000000e+03 +999 999 2.048000000000000e+03 +999 1000 -1.024000000000000e+03 +1000 999 -1.024000000000000e+03 +1000 1000 2.048000000000000e+03 +1000 1001 -1.024000000000000e+03 +1001 1000 -1.024000000000000e+03 +1001 1001 2.048000000000000e+03 +1001 1002 -1.024000000000000e+03 +1002 1001 -1.024000000000000e+03 +1002 1002 2.048000000000000e+03 +1002 1003 -1.024000000000000e+03 +1003 1002 -1.024000000000000e+03 +1003 1003 2.048000000000000e+03 +1003 1004 -1.024000000000000e+03 +1004 1003 -1.024000000000000e+03 +1004 1004 2.048000000000000e+03 +1004 1005 -1.024000000000000e+03 +1005 1004 -1.024000000000000e+03 +1005 1005 2.048000000000000e+03 +1005 1006 -1.024000000000000e+03 +1006 1005 -1.024000000000000e+03 +1006 1006 2.048000000000000e+03 +1006 1007 -1.024000000000000e+03 +1007 1006 -1.024000000000000e+03 +1007 1007 2.048000000000000e+03 +1007 1008 -1.024000000000000e+03 +1008 1007 -1.024000000000000e+03 +1008 1008 2.048000000000000e+03 +1008 1009 -1.024000000000000e+03 +1009 1008 -1.024000000000000e+03 +1009 1009 2.048000000000000e+03 +1009 1010 -1.024000000000000e+03 +1010 1009 -1.024000000000000e+03 +1010 1010 2.048000000000000e+03 +1010 1011 -1.024000000000000e+03 +1011 1010 -1.024000000000000e+03 +1011 1011 2.048000000000000e+03 +1011 1012 -1.024000000000000e+03 +1012 1011 -1.024000000000000e+03 +1012 1012 2.048000000000000e+03 +1012 1013 -1.024000000000000e+03 +1013 1012 -1.024000000000000e+03 +1013 1013 2.048000000000000e+03 +1013 1014 -1.024000000000000e+03 +1014 1013 -1.024000000000000e+03 +1014 1014 2.048000000000000e+03 +1014 1015 -1.024000000000000e+03 +1015 1014 -1.024000000000000e+03 +1015 1015 2.048000000000000e+03 +1015 1016 -1.024000000000000e+03 +1016 1015 -1.024000000000000e+03 +1016 1016 2.048000000000000e+03 +1016 1017 -1.024000000000000e+03 +1017 1016 -1.024000000000000e+03 +1017 1017 2.048000000000000e+03 +1017 1018 -1.024000000000000e+03 +1018 1017 -1.024000000000000e+03 +1018 1018 2.048000000000000e+03 +1018 1019 -1.024000000000000e+03 +1019 1018 -1.024000000000000e+03 +1019 1019 2.048000000000000e+03 +1019 1020 -1.024000000000000e+03 +1020 1019 -1.024000000000000e+03 +1020 1020 2.048000000000000e+03 +1020 1021 -1.024000000000000e+03 +1021 1020 -1.024000000000000e+03 +1021 1021 2.048000000000000e+03 +1021 1022 -1.024000000000000e+03 +1022 1021 -1.024000000000000e+03 +1022 1022 2.048000000000000e+03 +1022 1023 -1.024000000000000e+03 +1023 1022 -1.024000000000000e+03 +1023 1023 2.048000000000000e+03 diff --git a/packages/muelu/research/caglusa/aux.xml b/packages/muelu/research/caglusa/aux.xml new file mode 100644 index 000000000000..0d68843495b1 --- /dev/null +++ b/packages/muelu/research/caglusa/aux.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + diff --git a/packages/muelu/research/caglusa/basismatrix.mtx b/packages/muelu/research/caglusa/basismatrix.mtx new file mode 100644 index 000000000000..7ef23fa95af9 --- /dev/null +++ b/packages/muelu/research/caglusa/basismatrix.mtx @@ -0,0 +1,9210 @@ +%%MatrixMarket matrix coordinate real general +% +1023 2268 9207 +1 46 -2.396653659681340e-06 +1 47 4.399295576049860e-04 +1 48 5.813143208777283e-04 +1 49 -6.880700996405499e-05 +1 50 4.388449263530643e-05 +1 51 -2.883772200967687e-05 +1 52 1.855092899267574e-05 +1 53 -1.046461525145331e-05 +1 54 3.389200774170093e-06 +2 46 2.059169274815951e-05 +2 47 -7.688110588536418e-05 +2 48 5.439304072675908e-04 +2 49 5.674473689708014e-04 +2 50 -1.200062047026567e-04 +2 51 6.654561214594455e-05 +2 52 -3.986146317492419e-05 +2 53 2.173821042060990e-05 +2 54 -6.942017790160872e-06 +3 46 -1.054736242183934e-05 +3 47 3.510392048891706e-05 +3 48 -7.307450370350698e-05 +3 49 7.479472740145660e-04 +3 50 3.411483091862321e-04 +3 51 -9.568420460249935e-05 +3 52 4.886728492475121e-05 +3 53 -2.497310718631015e-05 +3 54 7.774889299689377e-06 +4 46 -1.313395910191431e-06 +4 47 4.924121567391413e-06 +4 48 -1.404827200930972e-05 +4 49 7.241863987820650e-05 +4 50 8.526003129478064e-04 +4 51 7.241863987820656e-05 +4 52 -1.404827200930976e-05 +4 53 4.924121567391430e-06 +4 54 -1.313395910191434e-06 +5 46 7.774889299689405e-06 +5 47 -2.497310718631026e-05 +5 48 4.886728492475135e-05 +5 49 -9.568420460249963e-05 +5 50 3.411483091862328e-04 +5 51 7.479472740145660e-04 +5 52 -7.307450370350738e-05 +5 53 3.510392048891719e-05 +5 54 -1.054736242183938e-05 +6 46 -6.942017790160853e-06 +6 47 2.173821042060985e-05 +6 48 -3.986146317492404e-05 +6 49 6.654561214594433e-05 +6 50 -1.200062047026562e-04 +6 51 5.674473689708011e-04 +6 52 5.439304072675903e-04 +6 53 -7.688110588536382e-05 +6 54 2.059169274815942e-05 +7 46 3.389200774170111e-06 +7 47 -1.046461525145336e-05 +7 48 1.855092899267583e-05 +7 49 -2.883772200967701e-05 +7 50 4.388449263530665e-05 +7 51 -6.880700996405543e-05 +7 52 5.813143208777287e-04 +7 53 4.399295576049860e-04 +7 54 -2.396653659681518e-06 +8 55 -3.092742551775957e-07 +8 56 5.376012869668943e-04 +8 57 5.028688547500629e-04 +8 58 -9.844594048838114e-05 +8 59 5.705134647634815e-05 +8 60 -3.672666032322796e-05 +8 61 2.343321932570180e-05 +8 62 -1.316860931849270e-05 +8 63 4.258276866272574e-06 +9 55 1.765275231247697e-05 +9 56 -6.119691313295238e-05 +9 57 7.076249207781904e-04 +9 58 3.849668443894226e-04 +9 59 -1.104912573429354e-04 +9 60 6.092043978102763e-05 +9 61 -3.642594225309452e-05 +9 62 1.984761106267134e-05 +9 63 -6.335955594806478e-06 +10 55 1.148247091498631e-06 +10 56 -6.380257597874949e-06 +10 57 4.800413127075300e-05 +10 58 8.634705252154628e-04 +10 59 8.525740288516746e-05 +10 60 -2.132703484629258e-05 +10 61 9.575317381091835e-06 +10 62 -4.563719592096795e-06 +10 63 1.377888192290738e-06 +11 55 -1.361668801094942e-05 +11 56 4.587104641602075e-05 +11 57 -1.034397545291466e-04 +11 58 3.790325123654135e-04 +11 59 7.486490616400391e-04 +11 60 -1.196774105566794e-04 +11 61 6.132507092318035e-05 +11 62 -3.133670432002743e-05 +11 63 9.755366072149250e-06 +12 55 9.755366072149296e-06 +12 56 -3.133670432002752e-05 +12 57 6.132507092318040e-05 +12 58 -1.196774105566797e-04 +12 59 7.486490616400399e-04 +12 60 3.790325123654132e-04 +12 61 -1.034397545291469e-04 +12 62 4.587104641602082e-05 +12 63 -1.361668801094941e-05 +13 55 1.377888192290801e-06 +13 56 -4.563719592096986e-06 +13 57 9.575317381092181e-06 +13 58 -2.132703484629324e-05 +13 59 8.525740288516894e-05 +13 60 8.634705252154623e-04 +13 61 4.800413127075185e-05 +13 62 -6.380257597874523e-06 +13 63 1.148247091498504e-06 +14 55 -6.335955594806478e-06 +14 56 1.984761106267130e-05 +14 57 -3.642594225309439e-05 +14 58 6.092043978102751e-05 +14 59 -1.104912573429350e-04 +14 60 3.849668443894227e-04 +14 61 7.076249207781898e-04 +14 62 -6.119691313295228e-05 +14 63 1.765275231247690e-05 +15 55 4.258276866272576e-06 +15 56 -1.316860931849269e-05 +15 57 2.343321932570172e-05 +15 58 -3.672666032322789e-05 +15 59 5.705134647634805e-05 +15 60 -9.844594048838106e-05 +15 61 5.028688547500630e-04 +15 62 5.376012869668939e-04 +15 63 -3.092742551774941e-07 +16 73 -3.092742551775720e-07 +16 74 5.376012869668942e-04 +16 75 5.028688547500629e-04 +16 76 -9.844594048838117e-05 +16 77 5.705134647634817e-05 +16 78 -3.672666032322798e-05 +16 79 2.343321932570184e-05 +16 80 -1.316860931849270e-05 +16 81 4.258276866272558e-06 +17 73 1.765275231247705e-05 +17 74 -6.119691313295251e-05 +17 75 7.076249207781905e-04 +17 76 3.849668443894226e-04 +17 77 -1.104912573429353e-04 +17 78 6.092043978102764e-05 +17 79 -3.642594225309458e-05 +17 80 1.984761106267131e-05 +17 81 -6.335955594806448e-06 +18 73 1.148247091498602e-06 +18 74 -6.380257597874851e-06 +18 75 4.800413127075274e-05 +18 76 8.634705252154626e-04 +18 77 8.525740288516780e-05 +18 78 -2.132703484629274e-05 +18 79 9.575317381091940e-06 +18 80 -4.563719592096834e-06 +18 81 1.377888192290745e-06 +19 73 -1.361668801094945e-05 +19 74 4.587104641602077e-05 +19 75 -1.034397545291466e-04 +19 76 3.790325123654128e-04 +19 77 7.486490616400395e-04 +19 78 -1.196774105566793e-04 +19 79 6.132507092318037e-05 +19 80 -3.133670432002736e-05 +19 81 9.755366072149193e-06 +20 73 9.755366072149337e-06 +20 74 -3.133670432002758e-05 +20 75 6.132507092318048e-05 +20 76 -1.196774105566798e-04 +20 77 7.486490616400407e-04 +20 78 3.790325123654125e-04 +20 79 -1.034397545291471e-04 +20 80 4.587104641602074e-05 +20 81 -1.361668801094934e-05 +21 73 1.377888192290822e-06 +21 74 -4.563719592097044e-06 +21 75 9.575317381092282e-06 +21 76 -2.132703484629341e-05 +21 77 8.525740288516924e-05 +21 78 8.634705252154628e-04 +21 79 4.800413127075139e-05 +21 80 -6.380257597874370e-06 +21 81 1.148247091498453e-06 +22 73 -6.335955594806492e-06 +22 74 1.984761106267131e-05 +22 75 -3.642594225309438e-05 +22 76 6.092043978102743e-05 +22 77 -1.104912573429349e-04 +22 78 3.849668443894236e-04 +22 79 7.076249207781885e-04 +22 80 -6.119691313295188e-05 +22 81 1.765275231247675e-05 +23 73 4.258276866272580e-06 +23 74 -1.316860931849267e-05 +23 75 2.343321932570167e-05 +23 76 -3.672666032322779e-05 +23 77 5.705134647634786e-05 +23 78 -9.844594048838090e-05 +23 79 5.028688547500618e-04 +23 80 5.376012869668951e-04 +23 81 -3.092742551777042e-07 +24 82 -3.092742551777245e-07 +24 83 5.376012869668953e-04 +24 84 5.028688547500618e-04 +24 85 -9.844594048838086e-05 +24 86 5.705134647634799e-05 +24 87 -3.672666032322787e-05 +24 88 2.343321932570177e-05 +24 89 -1.316860931849266e-05 +24 90 4.258276866272545e-06 +25 82 1.765275231247707e-05 +25 83 -6.119691313295255e-05 +25 84 7.076249207781896e-04 +25 85 3.849668443894234e-04 +25 86 -1.104912573429356e-04 +25 87 6.092043978102776e-05 +25 88 -3.642594225309466e-05 +25 89 1.984761106267135e-05 +25 90 -6.335955594806460e-06 +26 82 1.148247091498663e-06 +26 83 -6.380257597875065e-06 +26 84 4.800413127075322e-05 +26 85 8.634705252154628e-04 +26 86 8.525740288516706e-05 +26 87 -2.132703484629240e-05 +26 88 9.575317381091757e-06 +26 89 -4.563719592096735e-06 +26 90 1.377888192290714e-06 +27 82 -1.361668801094945e-05 +27 83 4.587104641602075e-05 +27 84 -1.034397545291465e-04 +27 85 3.790325123654128e-04 +27 86 7.486490616400393e-04 +27 87 -1.196774105566792e-04 +27 88 6.132507092318036e-05 +27 89 -3.133670432002734e-05 +27 90 9.755366072149189e-06 +28 82 9.755366072149337e-06 +28 83 -3.133670432002758e-05 +28 84 6.132507092318048e-05 +28 85 -1.196774105566798e-04 +28 86 7.486490616400407e-04 +28 87 3.790325123654125e-04 +28 88 -1.034397545291471e-04 +28 89 4.587104641602074e-05 +28 90 -1.361668801094934e-05 +29 82 1.377888192290823e-06 +29 83 -4.563719592097047e-06 +29 84 9.575317381092289e-06 +29 85 -2.132703484629342e-05 +29 86 8.525740288516925e-05 +29 87 8.634705252154626e-04 +29 88 4.800413127075148e-05 +29 89 -6.380257597874370e-06 +29 90 1.148247091498453e-06 +30 82 -6.335955594806483e-06 +30 83 1.984761106267128e-05 +30 84 -3.642594225309432e-05 +30 85 6.092043978102733e-05 +30 86 -1.104912573429347e-04 +30 87 3.849668443894227e-04 +30 88 7.076249207781892e-04 +30 89 -6.119691313295184e-05 +30 90 1.765275231247673e-05 +31 82 4.258276866272585e-06 +31 83 -1.316860931849269e-05 +31 84 2.343321932570169e-05 +31 85 -3.672666032322783e-05 +31 86 5.705134647634793e-05 +31 87 -9.844594048838100e-05 +31 88 5.028688547500620e-04 +31 89 5.376012869668947e-04 +31 90 -3.092742551774060e-07 +32 109 -3.092742551777855e-07 +32 110 5.376012869668942e-04 +32 111 5.028688547500632e-04 +32 112 -9.844594048838144e-05 +32 113 5.705134647634805e-05 +32 114 -3.672666032322793e-05 +32 115 2.343321932570182e-05 +32 116 -1.316860931849268e-05 +32 117 4.258276866272554e-06 +33 109 1.765275231247687e-05 +33 110 -6.119691313295185e-05 +33 111 7.076249207781898e-04 +33 112 3.849668443894214e-04 +33 113 -1.104912573429339e-04 +33 114 6.092043978102690e-05 +33 115 -3.642594225309417e-05 +33 116 1.984761106267108e-05 +33 117 -6.335955594806377e-06 +34 109 1.148247091498409e-06 +34 110 -6.380257597874170e-06 +34 111 4.800413127075088e-05 +34 112 8.634705252154628e-04 +34 113 8.525740288516955e-05 +34 114 -2.132703484629366e-05 +34 115 9.575317381092472e-06 +34 116 -4.563719592097117e-06 +34 117 1.377888192290835e-06 +35 109 -1.361668801094957e-05 +35 110 4.587104641602120e-05 +35 111 -1.034397545291476e-04 +35 112 3.790325123654143e-04 +35 113 7.486490616400391e-04 +35 114 -1.196774105566798e-04 +35 115 6.132507092318073e-05 +35 116 -3.133670432002752e-05 +35 117 9.755366072149250e-06 +36 109 9.755366072149377e-06 +36 110 -3.133670432002772e-05 +36 111 6.132507092318078e-05 +36 112 -1.196774105566799e-04 +36 113 7.486490616400406e-04 +36 114 3.790325123654128e-04 +36 115 -1.034397545291473e-04 +36 116 4.587104641602083e-05 +36 117 -1.361668801094937e-05 +37 109 1.377888192290865e-06 +37 110 -4.563719592097183e-06 +37 111 9.575317381092560e-06 +37 112 -2.132703484629381e-05 +37 113 8.525740288517016e-05 +37 114 8.634705252154623e-04 +37 115 4.800413127075083e-05 +37 116 -6.380257597874116e-06 +37 117 1.148247091498383e-06 +38 109 -6.335955594806494e-06 +38 110 1.984761106267132e-05 +38 111 -3.642594225309442e-05 +38 112 6.092043978102728e-05 +38 113 -1.104912573429345e-04 +38 114 3.849668443894226e-04 +38 115 7.076249207781892e-04 +38 116 -6.119691313295182e-05 +38 117 1.765275231247673e-05 +39 109 4.258276866272572e-06 +39 110 -1.316860931849265e-05 +39 111 2.343321932570165e-05 +39 112 -3.672666032322764e-05 +39 113 5.705134647634756e-05 +39 114 -9.844594048838052e-05 +39 115 5.028688547500613e-04 +39 116 5.376012869668955e-04 +39 117 -3.092742551779007e-07 +40 118 -3.092742551779380e-07 +40 119 5.376012869668964e-04 +40 120 5.028688547500607e-04 +40 121 -9.844594048838042e-05 +40 122 5.705134647634749e-05 +40 123 -3.672666032322760e-05 +40 124 2.343321932570160e-05 +40 125 -1.316860931849256e-05 +40 126 4.258276866272515e-06 +41 118 1.765275231247676e-05 +41 119 -6.119691313295192e-05 +41 120 7.076249207781890e-04 +41 121 3.849668443894233e-04 +41 122 -1.104912573429346e-04 +41 123 6.092043978102736e-05 +41 124 -3.642594225309444e-05 +41 125 1.984761106267123e-05 +41 126 -6.335955594806422e-06 +42 118 1.148247091498399e-06 +42 119 -6.380257597874163e-06 +42 120 4.800413127075093e-05 +42 121 8.634705252154628e-04 +42 122 8.525740288516968e-05 +42 123 -2.132703484629366e-05 +42 124 9.575317381092469e-06 +42 125 -4.563719592097118e-06 +42 126 1.377888192290834e-06 +43 118 -1.361668801094933e-05 +43 119 4.587104641602069e-05 +43 120 -1.034397545291470e-04 +43 121 3.790325123654123e-04 +43 122 7.486490616400406e-04 +43 123 -1.196774105566796e-04 +43 124 6.132507092318054e-05 +43 125 -3.133670432002744e-05 +43 126 9.755366072149218e-06 +44 118 9.755366072149211e-06 +44 119 -3.133670432002740e-05 +44 120 6.132507092318051e-05 +44 121 -1.196774105566795e-04 +44 122 7.486490616400408e-04 +44 123 3.790325123654117e-04 +44 124 -1.034397545291468e-04 +44 125 4.587104641602065e-05 +44 126 -1.361668801094932e-05 +45 118 1.377888192290816e-06 +45 119 -4.563719592097059e-06 +45 120 9.575317381092364e-06 +45 121 -2.132703484629346e-05 +45 122 8.525740288516929e-05 +45 123 8.634705252154628e-04 +45 124 4.800413127075122e-05 +45 125 -6.380257597874285e-06 +45 126 1.148247091498434e-06 +46 118 -6.335955594806384e-06 +46 119 1.984761106267110e-05 +46 120 -3.642594225309422e-05 +46 121 6.092043978102699e-05 +46 122 -1.104912573429340e-04 +46 123 3.849668443894215e-04 +46 124 7.076249207781898e-04 +46 125 -6.119691313295150e-05 +46 126 1.765275231247664e-05 +47 118 4.258276866272522e-06 +47 119 -1.316860931849258e-05 +47 120 2.343321932570165e-05 +47 121 -3.672666032322768e-05 +47 122 5.705134647634761e-05 +47 123 -9.844594048838075e-05 +47 124 5.028688547500614e-04 +47 125 5.376012869668958e-04 +47 126 -3.092742551779108e-07 +48 136 -3.092742551778092e-07 +48 137 5.376012869668951e-04 +48 138 5.028688547500619e-04 +48 139 -9.844594048838053e-05 +48 140 5.705134647634748e-05 +48 141 -3.672666032322758e-05 +48 142 2.343321932570159e-05 +48 143 -1.316860931849255e-05 +48 144 4.258276866272511e-06 +49 136 1.765275231247668e-05 +49 137 -6.119691313295175e-05 +49 138 7.076249207781904e-04 +49 139 3.849668443894215e-04 +49 140 -1.104912573429340e-04 +49 141 6.092043978102700e-05 +49 142 -3.642594225309423e-05 +49 143 1.984761106267111e-05 +49 144 -6.335955594806385e-06 +50 136 1.148247091498343e-06 +50 137 -6.380257597873974e-06 +50 138 4.800413127075052e-05 +50 139 8.634705252154626e-04 +50 140 8.525740288517039e-05 +50 141 -2.132703484629402e-05 +50 142 9.575317381092659e-06 +50 143 -4.563719592097215e-06 +50 144 1.377888192290866e-06 +51 136 -1.361668801094943e-05 +51 137 4.587104641602105e-05 +51 138 -1.034397545291478e-04 +51 139 3.790325123654147e-04 +51 140 7.486490616400394e-04 +51 141 -1.196774105566805e-04 +51 142 6.132507092318100e-05 +51 143 -3.133670432002768e-05 +51 144 9.755366072149292e-06 +52 136 9.755366072149201e-06 +52 137 -3.133670432002737e-05 +52 138 6.132507092318041e-05 +52 139 -1.196774105566792e-04 +52 140 7.486490616400408e-04 +52 141 3.790325123654114e-04 +52 142 -1.034397545291469e-04 +52 143 4.587104641602068e-05 +52 144 -1.361668801094932e-05 +53 136 1.377888192290875e-06 +53 137 -4.563719592097249e-06 +53 138 9.575317381092719e-06 +53 139 -2.132703484629415e-05 +53 140 8.525740288517101e-05 +53 141 8.634705252154619e-04 +53 142 4.800413127075041e-05 +53 143 -6.380257597873943e-06 +53 144 1.148247091498332e-06 +54 136 -6.335955594806375e-06 +54 137 1.984761106267108e-05 +54 138 -3.642594225309416e-05 +54 139 6.092043978102691e-05 +54 140 -1.104912573429338e-04 +54 141 3.849668443894210e-04 +54 142 7.076249207781905e-04 +54 143 -6.119691313295170e-05 +54 144 1.765275231247665e-05 +55 136 4.258276866272539e-06 +55 137 -1.316860931849264e-05 +55 138 2.343321932570174e-05 +55 139 -3.672666032322782e-05 +55 140 5.705134647634786e-05 +55 141 -9.844594048838121e-05 +55 142 5.028688547500641e-04 +55 143 5.376012869668934e-04 +55 144 -3.092742551779142e-07 +56 145 -3.092742551773145e-07 +56 146 5.376012869668949e-04 +56 147 5.028688547500617e-04 +56 148 -9.844594048838071e-05 +56 149 5.705134647634765e-05 +56 150 -3.672666032322770e-05 +56 151 2.343321932570167e-05 +56 152 -1.316860931849260e-05 +56 153 4.258276866272527e-06 +57 145 1.765275231247668e-05 +57 146 -6.119691313295156e-05 +57 147 7.076249207781881e-04 +57 148 3.849668443894239e-04 +57 149 -1.104912573429344e-04 +57 150 6.092043978102717e-05 +57 151 -3.642594225309432e-05 +57 152 1.984761106267117e-05 +57 153 -6.335955594806403e-06 +58 145 1.148247091498249e-06 +58 146 -6.380257597873628e-06 +58 147 4.800413127074923e-05 +58 148 8.634705252154621e-04 +58 149 8.525740288517222e-05 +58 150 -2.132703484629461e-05 +58 151 9.575317381092963e-06 +58 152 -4.563719592097372e-06 +58 153 1.377888192290915e-06 +59 145 -1.361668801094941e-05 +59 146 4.587104641602096e-05 +59 147 -1.034397545291476e-04 +59 148 3.790325123654127e-04 +59 149 7.486490616400409e-04 +59 150 -1.196774105566802e-04 +59 151 6.132507092318086e-05 +59 152 -3.133670432002762e-05 +59 153 9.755366072149272e-06 +60 145 9.755366072149262e-06 +60 146 -3.133670432002757e-05 +60 147 6.132507092318083e-05 +60 148 -1.196774105566801e-04 +60 149 7.486490616400415e-04 +60 150 3.790325123654118e-04 +60 151 -1.034397545291473e-04 +60 152 4.587104641602088e-05 +60 153 -1.361668801094938e-05 +61 145 1.377888192290838e-06 +61 146 -4.563719592097127e-06 +61 147 9.575317381092503e-06 +61 148 -2.132703484629379e-05 +61 149 8.525740288517059e-05 +61 150 8.634705252154619e-04 +61 151 4.800413127075094e-05 +61 152 -6.380257597874214e-06 +61 153 1.148247091498412e-06 +62 145 -6.335955594806375e-06 +62 146 1.984761106267108e-05 +62 147 -3.642594225309416e-05 +62 148 6.092043978102693e-05 +62 149 -1.104912573429339e-04 +62 150 3.849668443894218e-04 +62 151 7.076249207781897e-04 +62 152 -6.119691313295158e-05 +62 153 1.765275231247662e-05 +63 145 4.258276866272549e-06 +63 146 -1.316860931849266e-05 +63 147 2.343321932570179e-05 +63 148 -3.672666032322789e-05 +63 149 5.705134647634797e-05 +63 150 -9.844594048838138e-05 +63 151 5.028688547500644e-04 +63 152 5.376012869668927e-04 +63 153 -3.092742551773179e-07 +64 181 -3.092742551773925e-07 +64 182 5.376012869668930e-04 +64 183 5.028688547500638e-04 +64 184 -9.844594048838092e-05 +64 185 5.705134647634784e-05 +64 186 -3.672666032322783e-05 +64 187 2.343321932570176e-05 +64 188 -1.316860931849265e-05 +64 189 4.258276866272542e-06 +65 181 1.765275231247691e-05 +65 182 -6.119691313295251e-05 +65 183 7.076249207781883e-04 +65 184 3.849668443894250e-04 +65 185 -1.104912573429353e-04 +65 186 6.092043978102774e-05 +65 187 -3.642594225309467e-05 +65 188 1.984761106267136e-05 +65 189 -6.335955594806465e-06 +66 181 1.148247091498444e-06 +66 182 -6.380257597874333e-06 +66 183 4.800413127075141e-05 +66 184 8.634705252154623e-04 +66 185 8.525740288516977e-05 +66 186 -2.132703484629354e-05 +66 187 9.575317381092381e-06 +66 188 -4.563719592097066e-06 +66 189 1.377888192290818e-06 +67 181 -1.361668801094939e-05 +67 182 4.587104641602090e-05 +67 183 -1.034397545291474e-04 +67 184 3.790325123654132e-04 +67 185 7.486490616400400e-04 +67 186 -1.196774105566797e-04 +67 187 6.132507092318069e-05 +67 188 -3.133670432002752e-05 +67 189 9.755366072149247e-06 +68 181 9.755366072149279e-06 +68 182 -3.133670432002763e-05 +68 183 6.132507092318092e-05 +68 184 -1.196774105566803e-04 +68 185 7.486490616400387e-04 +68 186 3.790325123654148e-04 +68 187 -1.034397545291477e-04 +68 188 4.587104641602101e-05 +68 189 -1.361668801094942e-05 +69 181 1.377888192290816e-06 +69 182 -4.563719592097056e-06 +69 183 9.575317381092337e-06 +69 184 -2.132703484629340e-05 +69 185 8.525740288516876e-05 +69 186 8.634705252154641e-04 +69 187 4.800413127075022e-05 +69 188 -6.380257597874136e-06 +69 189 1.148247091498400e-06 +70 181 -6.335955594806482e-06 +70 182 1.984761106267141e-05 +70 183 -3.642594225309477e-05 +70 184 6.092043978102792e-05 +70 185 -1.104912573429356e-04 +70 186 3.849668443894272e-04 +70 187 7.076249207781868e-04 +70 188 -6.119691313295339e-05 +70 189 1.765275231247705e-05 +71 181 4.258276866272534e-06 +71 182 -1.316860931849262e-05 +71 183 2.343321932570171e-05 +71 184 -3.672666032322777e-05 +71 185 5.705134647634773e-05 +71 186 -9.844594048838075e-05 +71 187 5.028688547500670e-04 +71 188 5.376012869668896e-04 +71 189 -3.092742551774365e-07 +72 190 -3.092742551763964e-07 +72 191 5.376012869668936e-04 +72 192 5.028688547500620e-04 +72 193 -9.844594048838079e-05 +72 194 5.705134647634784e-05 +72 195 -3.672666032322785e-05 +72 196 2.343321932570177e-05 +72 197 -1.316860931849266e-05 +72 198 4.258276866272546e-06 +73 190 1.765275231247696e-05 +73 191 -6.119691313295266e-05 +73 192 7.076249207781874e-04 +73 193 3.849668443894263e-04 +73 194 -1.104912573429357e-04 +73 195 6.092043978102797e-05 +73 196 -3.642594225309481e-05 +73 197 1.984761106267143e-05 +73 198 -6.335955594806488e-06 +74 190 1.148247091498502e-06 +74 191 -6.380257597874523e-06 +74 192 4.800413127075181e-05 +74 193 8.634705252154634e-04 +74 194 8.525740288516798e-05 +74 195 -2.132703484629297e-05 +74 196 9.575317381092089e-06 +74 197 -4.563719592096917e-06 +74 198 1.377888192290773e-06 +75 190 -1.361668801094927e-05 +75 191 4.587104641602049e-05 +75 192 -1.034397545291466e-04 +75 193 3.790325123654121e-04 +75 194 7.486490616400395e-04 +75 195 -1.196774105566783e-04 +75 196 6.132507092318003e-05 +75 197 -3.133670432002721e-05 +75 198 9.755366072149147e-06 +76 190 9.755366072149321e-06 +76 191 -3.133670432002777e-05 +76 192 6.132507092318119e-05 +76 193 -1.196774105566809e-04 +76 194 7.486490616400369e-04 +76 195 3.790325123654174e-04 +76 196 -1.034397545291481e-04 +76 197 4.587104641602118e-05 +76 198 -1.361668801094947e-05 +77 190 1.377888192290730e-06 +77 191 -4.563719592096786e-06 +77 192 9.575317381091828e-06 +77 193 -2.132703484629248e-05 +77 194 8.525740288516638e-05 +77 195 8.634705252154639e-04 +77 196 4.800413127075273e-05 +77 197 -6.380257597874827e-06 +77 198 1.148247091498588e-06 +78 190 -6.335955594806437e-06 +78 191 1.984761106267127e-05 +78 192 -3.642594225309451e-05 +78 193 6.092043978102747e-05 +78 194 -1.104912573429348e-04 +78 195 3.849668443894223e-04 +78 196 7.076249207781909e-04 +78 197 -6.119691313295304e-05 +78 198 1.765275231247694e-05 +79 190 4.258276866272525e-06 +79 191 -1.316860931849259e-05 +79 192 2.343321932570166e-05 +79 193 -3.672666032322768e-05 +79 194 5.705134647634759e-05 +79 195 -9.844594048838053e-05 +79 196 5.028688547500647e-04 +79 197 5.376012869668934e-04 +79 198 -3.092742551790255e-07 +80 208 -3.092742551765895e-07 +80 209 5.376012869668971e-04 +80 210 5.028688547500578e-04 +80 211 -9.844594048837935e-05 +80 212 5.705134647634690e-05 +80 213 -3.672666032322722e-05 +80 214 2.343321932570136e-05 +80 215 -1.316860931849242e-05 +80 216 4.258276866272469e-06 +81 208 1.765275231247681e-05 +81 209 -6.119691313295190e-05 +81 210 7.076249207781888e-04 +81 211 3.849668443894238e-04 +81 212 -1.104912573429349e-04 +81 213 6.092043978102752e-05 +81 214 -3.642594225309454e-05 +81 215 1.984761106267129e-05 +81 216 -6.335955594806441e-06 +82 208 1.148247091498502e-06 +82 209 -6.380257597874523e-06 +82 210 4.800413127075183e-05 +82 211 8.634705252154634e-04 +82 212 8.525740288516799e-05 +82 213 -2.132703484629298e-05 +82 214 9.575317381092093e-06 +82 215 -4.563719592096917e-06 +82 216 1.377888192290774e-06 +83 208 -1.361668801094942e-05 +83 209 4.587104641602102e-05 +83 210 -1.034397545291477e-04 +83 211 3.790325123654152e-04 +83 212 7.486490616400384e-04 +83 213 -1.196774105566800e-04 +83 214 6.132507092318086e-05 +83 215 -3.133670432002761e-05 +83 216 9.755366072149276e-06 +84 208 9.755366072149287e-06 +84 209 -3.133670432002765e-05 +84 210 6.132507092318094e-05 +84 211 -1.196774105566802e-04 +84 212 7.486490616400387e-04 +84 213 3.790325123654150e-04 +84 214 -1.034397545291479e-04 +84 215 4.587104641602109e-05 +84 216 -1.361668801094944e-05 +85 208 1.377888192290897e-06 +85 209 -4.563719592097315e-06 +85 210 9.575317381092835e-06 +85 211 -2.132703484629430e-05 +85 212 8.525740288517097e-05 +85 213 8.634705252154626e-04 +85 214 4.800413127074984e-05 +85 215 -6.380257597873679e-06 +85 216 1.148247091498260e-06 +86 208 -6.335955594806350e-06 +86 209 1.984761106267100e-05 +86 210 -3.642594225309402e-05 +86 211 6.092043978102665e-05 +86 212 -1.104912573429333e-04 +86 213 3.849668443894195e-04 +86 214 7.076249207781917e-04 +86 215 -6.119691313295171e-05 +86 216 1.765275231247662e-05 +87 208 4.258276866272530e-06 +87 209 -1.316860931849261e-05 +87 210 2.343321932570170e-05 +87 211 -3.672666032322775e-05 +87 212 5.705134647634775e-05 +87 213 -9.844594048838113e-05 +87 214 5.028688547500641e-04 +87 215 5.376012869668928e-04 +87 216 -3.092742551773416e-07 +88 217 -3.092742551778024e-07 +88 218 5.376012869668962e-04 +88 219 5.028688547500609e-04 +88 220 -9.844594048838096e-05 +88 221 5.705134647634793e-05 +88 222 -3.672666032322791e-05 +88 223 2.343321932570181e-05 +88 224 -1.316860931849268e-05 +88 225 4.258276866272552e-06 +89 217 1.765275231247681e-05 +89 218 -6.119691313295189e-05 +89 219 7.076249207781888e-04 +89 220 3.849668443894238e-04 +89 221 -1.104912573429349e-04 +89 222 6.092043978102751e-05 +89 223 -3.642594225309453e-05 +89 224 1.984761106267128e-05 +89 225 -6.335955594806441e-06 +90 217 1.148247091498327e-06 +90 218 -6.380257597873913e-06 +90 219 4.800413127075033e-05 +90 220 8.634705252154627e-04 +90 221 8.525740288517052e-05 +90 222 -2.132703484629404e-05 +90 223 9.575317381092682e-06 +90 224 -4.563719592097225e-06 +90 225 1.377888192290870e-06 +91 217 -1.361668801094944e-05 +91 218 4.587104641602109e-05 +91 219 -1.034397545291479e-04 +91 220 3.790325123654150e-04 +91 221 7.486490616400387e-04 +91 222 -1.196774105566802e-04 +91 223 6.132507092318094e-05 +91 224 -3.133670432002765e-05 +91 225 9.755366072149287e-06 +92 217 9.755366072149287e-06 +92 218 -3.133670432002765e-05 +92 219 6.132507092318094e-05 +92 220 -1.196774105566802e-04 +92 221 7.486490616400387e-04 +92 222 3.790325123654150e-04 +92 223 -1.034397545291479e-04 +92 224 4.587104641602109e-05 +92 225 -1.361668801094944e-05 +93 217 1.377888192290897e-06 +93 218 -4.563719592097315e-06 +93 219 9.575317381092835e-06 +93 220 -2.132703484629430e-05 +93 221 8.525740288517097e-05 +93 222 8.634705252154626e-04 +93 223 4.800413127074984e-05 +93 224 -6.380257597873679e-06 +93 225 1.148247091498260e-06 +94 217 -6.335955594806377e-06 +94 218 1.984761106267108e-05 +94 219 -3.642594225309417e-05 +94 220 6.092043978102690e-05 +94 221 -1.104912573429337e-04 +94 222 3.849668443894206e-04 +94 223 7.076249207781905e-04 +94 224 -6.119691313295129e-05 +94 225 1.765275231247663e-05 +95 217 4.258276866272564e-06 +95 218 -1.316860931849271e-05 +95 219 2.343321932570187e-05 +95 220 -3.672666032322802e-05 +95 221 5.705134647634811e-05 +95 222 -9.844594048838141e-05 +95 223 5.028688547500611e-04 +95 224 5.376012869668964e-04 +95 225 -3.092742551778329e-07 +96 244 -3.092742551776229e-07 +96 245 5.376012869668951e-04 +96 246 5.028688547500620e-04 +96 247 -9.844594048838096e-05 +96 248 5.705134647634782e-05 +96 249 -3.672666032322782e-05 +96 250 2.343321932570174e-05 +96 251 -1.316860931849264e-05 +96 252 4.258276866272541e-06 +97 244 1.765275231247675e-05 +97 245 -6.119691313295184e-05 +97 246 7.076249207781885e-04 +97 247 3.849668443894238e-04 +97 248 -1.104912573429345e-04 +97 249 6.092043978102730e-05 +97 250 -3.642594225309440e-05 +97 251 1.984761106267121e-05 +97 252 -6.335955594806417e-06 +98 244 1.148247091498326e-06 +98 245 -6.380257597873899e-06 +98 246 4.800413127075010e-05 +98 247 8.634705252154633e-04 +98 248 8.525740288517004e-05 +98 249 -2.132703484629389e-05 +98 250 9.575317381092604e-06 +98 251 -4.563719592097189e-06 +98 252 1.377888192290858e-06 +99 244 -1.361668801094944e-05 +99 245 4.587104641602107e-05 +99 246 -1.034397545291478e-04 +99 247 3.790325123654150e-04 +99 248 7.486490616400387e-04 +99 249 -1.196774105566801e-04 +99 250 6.132507092318094e-05 +99 251 -3.133670432002765e-05 +99 252 9.755366072149287e-06 +100 244 9.755366072149287e-06 +100 245 -3.133670432002765e-05 +100 246 6.132507092318094e-05 +100 247 -1.196774105566802e-04 +100 248 7.486490616400387e-04 +100 249 3.790325123654150e-04 +100 250 -1.034397545291479e-04 +100 251 4.587104641602109e-05 +100 252 -1.361668801094944e-05 +101 244 1.377888192290894e-06 +101 245 -4.563719592097305e-06 +101 246 9.575317381092818e-06 +101 247 -2.132703484629427e-05 +101 248 8.525740288517089e-05 +101 249 8.634705252154630e-04 +101 250 4.800413127074946e-05 +101 251 -6.380257597873665e-06 +101 252 1.148247091498260e-06 +102 244 -6.335955594806447e-06 +102 245 1.984761106267131e-05 +102 246 -3.642594225309458e-05 +102 247 6.092043978102759e-05 +102 248 -1.104912573429350e-04 +102 249 3.849668443894249e-04 +102 250 7.076249207781874e-04 +102 251 -6.119691313295193e-05 +102 252 1.765275231247681e-05 +103 244 4.258276866272586e-06 +103 245 -1.316860931849278e-05 +103 246 2.343321932570199e-05 +103 247 -3.672666032322819e-05 +103 248 5.705134647634832e-05 +103 249 -9.844594048838151e-05 +103 250 5.028688547500616e-04 +103 251 5.376012869668977e-04 +103 252 -3.092742551796591e-07 +104 253 -3.092742551765895e-07 +104 254 5.376012869668971e-04 +104 255 5.028688547500578e-04 +104 256 -9.844594048837935e-05 +104 257 5.705134647634690e-05 +104 258 -3.672666032322722e-05 +104 259 2.343321932570136e-05 +104 260 -1.316860931849242e-05 +104 261 4.258276866272469e-06 +105 253 1.765275231247681e-05 +105 254 -6.119691313295188e-05 +105 255 7.076249207781868e-04 +105 256 3.849668443894260e-04 +105 257 -1.104912573429353e-04 +105 258 6.092043978102772e-05 +105 259 -3.642594225309465e-05 +105 260 1.984761106267134e-05 +105 261 -6.335955594806461e-06 +106 253 1.148247091498405e-06 +106 254 -6.380257597874174e-06 +106 255 4.800413127075067e-05 +106 256 8.634705252154632e-04 +106 257 8.525740288516944e-05 +106 258 -2.132703484629355e-05 +106 259 9.575317381092404e-06 +106 260 -4.563719592097083e-06 +106 261 1.377888192290823e-06 +107 253 -1.361668801094933e-05 +107 254 4.587104641602071e-05 +107 255 -1.034397545291470e-04 +107 256 3.790325123654126e-04 +107 257 7.486490616400397e-04 +107 258 -1.196774105566790e-04 +107 259 6.132507092318037e-05 +107 260 -3.133670432002737e-05 +107 261 9.755366072149199e-06 +108 253 9.755366072149337e-06 +108 254 -3.133670432002782e-05 +108 255 6.132507092318130e-05 +108 256 -1.196774105566810e-04 +108 257 7.486490616400389e-04 +108 258 3.790325123654156e-04 +108 259 -1.034397545291481e-04 +108 260 4.587104641602124e-05 +108 261 -1.361668801094949e-05 +109 253 1.377888192290852e-06 +109 254 -4.563719592097174e-06 +109 255 9.575317381092577e-06 +109 256 -2.132703484629387e-05 +109 257 8.525740288517021e-05 +109 258 8.634705252154619e-04 +109 259 4.800413127075120e-05 +109 260 -6.380257597874153e-06 +109 261 1.148247091498388e-06 +110 253 -6.335955594806505e-06 +110 254 1.984761106267149e-05 +110 255 -3.642594225309490e-05 +110 256 6.092043978102810e-05 +110 257 -1.104912573429358e-04 +110 258 3.849668443894250e-04 +110 259 7.076249207781891e-04 +110 260 -6.119691313295343e-05 +110 261 1.765275231247712e-05 +111 253 4.258276866272502e-06 +111 254 -1.316860931849252e-05 +111 255 2.343321932570153e-05 +111 256 -3.672666032322748e-05 +111 257 5.705134647634725e-05 +111 258 -9.844594048837981e-05 +111 259 5.028688547500617e-04 +111 260 5.376012869668943e-04 +111 261 -3.092742551774331e-07 +112 271 -3.092742551780193e-07 +112 272 5.376012869668971e-04 +112 273 5.028688547500614e-04 +112 274 -9.844594048838256e-05 +112 275 5.705134647634868e-05 +112 276 -3.672666032322836e-05 +112 277 2.343321932570208e-05 +112 278 -1.316860931849283e-05 +112 279 4.258276866272602e-06 +113 271 1.765275231247634e-05 +113 272 -6.119691313295003e-05 +113 273 7.076249207781908e-04 +113 274 3.849668443894189e-04 +113 275 -1.104912573429328e-04 +113 276 6.092043978102633e-05 +113 277 -3.642594225309382e-05 +113 278 1.984761106267089e-05 +113 279 -6.335955594806315e-06 +114 271 1.148247091498209e-06 +114 272 -6.380257597873493e-06 +114 273 4.800413127074946e-05 +114 274 8.634705252154625e-04 +114 275 8.525740288517172e-05 +114 276 -2.132703484629468e-05 +114 277 9.575317381093038e-06 +114 278 -4.563719592097421e-06 +114 279 1.377888192290931e-06 +115 271 -1.361668801094951e-05 +115 272 4.587104641602130e-05 +115 273 -1.034397545291484e-04 +115 274 3.790325123654168e-04 +115 275 7.486490616400374e-04 +115 276 -1.196774105566804e-04 +115 277 6.132507092318109e-05 +115 278 -3.133670432002774e-05 +115 279 9.755366072149316e-06 +116 271 9.755366072149276e-06 +116 272 -3.133670432002761e-05 +116 273 6.132507092318085e-05 +116 274 -1.196774105566799e-04 +116 275 7.486490616400358e-04 +116 276 3.790325123654176e-04 +116 277 -1.034397545291480e-04 +116 278 4.587104641602112e-05 +116 279 -1.361668801094945e-05 +117 271 1.377888192290761e-06 +117 272 -4.563719592096881e-06 +117 273 9.575317381092008e-06 +117 274 -2.132703484629277e-05 +117 275 8.525740288516691e-05 +117 276 8.634705252154643e-04 +117 277 4.800413127075175e-05 +117 278 -6.380257597874536e-06 +117 279 1.148247091498509e-06 +118 271 -6.335955594806398e-06 +118 272 1.984761106267115e-05 +118 273 -3.642594225309430e-05 +118 274 6.092043978102716e-05 +118 275 -1.104912573429343e-04 +118 276 3.849668443894230e-04 +118 277 7.076249207781881e-04 +118 278 -6.119691313295075e-05 +118 279 1.765275231247655e-05 +119 271 4.258276866272624e-06 +119 272 -1.316860931849290e-05 +119 273 2.343321932570220e-05 +119 274 -3.672666032322852e-05 +119 275 5.705134647634887e-05 +119 276 -9.844594048838264e-05 +119 277 5.028688547500618e-04 +119 278 5.376012869668985e-04 +119 279 -3.092742551798387e-07 +120 280 -3.092742551766267e-07 +120 281 5.376012869668974e-04 +120 282 5.028688547500580e-04 +120 283 -9.844594048837981e-05 +120 284 5.705134647634709e-05 +120 285 -3.672666032322732e-05 +120 286 2.343321932570142e-05 +120 287 -1.316860931849246e-05 +120 288 4.258276866272480e-06 +121 280 1.765275231247671e-05 +121 281 -6.119691313295161e-05 +121 282 7.076249207781916e-04 +121 283 3.849668443894201e-04 +121 284 -1.104912573429341e-04 +121 285 6.092043978102714e-05 +121 286 -3.642594225309431e-05 +121 287 1.984761106267116e-05 +121 288 -6.335955594806404e-06 +122 280 1.148247091498390e-06 +122 281 -6.380257597874163e-06 +122 282 4.800413127075160e-05 +122 283 8.634705252154617e-04 +122 284 8.525740288517031e-05 +122 285 -2.132703484629391e-05 +122 286 9.575317381092598e-06 +122 287 -4.563719592097181e-06 +122 288 1.377888192290855e-06 +123 280 -1.361668801094941e-05 +123 281 4.587104641602096e-05 +123 282 -1.034397545291476e-04 +123 283 3.790325123654143e-04 +123 284 7.486490616400391e-04 +123 285 -1.196774105566799e-04 +123 286 6.132507092318079e-05 +123 287 -3.133670432002758e-05 +123 288 9.755366072149264e-06 +124 280 9.755366072149272e-06 +124 281 -3.133670432002761e-05 +124 282 6.132507092318086e-05 +124 283 -1.196774105566801e-04 +124 284 7.486490616400382e-04 +124 285 3.790325123654154e-04 +124 286 -1.034397545291477e-04 +124 287 4.587104641602102e-05 +124 288 -1.361668801094942e-05 +125 280 1.377888192290730e-06 +125 281 -4.563719592096790e-06 +125 282 9.575317381091849e-06 +125 283 -2.132703484629258e-05 +125 284 8.525740288516729e-05 +125 285 8.634705252154623e-04 +125 286 4.800413127075353e-05 +125 287 -6.380257597875017e-06 +125 288 1.148247091498632e-06 +126 280 -6.335955594806486e-06 +126 281 1.984761106267143e-05 +126 282 -3.642594225309480e-05 +126 283 6.092043978102795e-05 +126 284 -1.104912573429357e-04 +126 285 3.849668443894243e-04 +126 286 7.076249207781888e-04 +126 287 -6.119691313295234e-05 +126 288 1.765275231247692e-05 +127 280 4.258276866272469e-06 +127 281 -1.316860931849242e-05 +127 282 2.343321932570136e-05 +127 283 -3.672666032322722e-05 +127 284 5.705134647634691e-05 +127 285 -9.844594048837936e-05 +127 286 5.028688547500577e-04 +127 287 5.376012869668973e-04 +127 288 -3.092742551765827e-07 +128 325 -3.092742551790425e-07 +128 326 5.376012869668950e-04 +128 327 5.028688547500615e-04 +128 328 -9.844594048837819e-05 +128 329 5.705134647634653e-05 +128 330 -3.672666032322691e-05 +128 331 2.343321932570144e-05 +128 332 -1.316860931849295e-05 +128 333 4.258276866272733e-06 +129 325 1.765275231247736e-05 +129 326 -6.119691313295459e-05 +129 327 7.076249207781909e-04 +129 328 3.849668443894238e-04 +129 329 -1.104912573429355e-04 +129 330 6.092043978102774e-05 +129 331 -3.642594225309509e-05 +129 332 1.984761106267232e-05 +129 333 -6.335955594806912e-06 +130 325 1.148247091498271e-06 +130 326 -6.380257597873804e-06 +130 327 4.800413127074895e-05 +130 328 8.634705252154641e-04 +130 329 8.525740288517058e-05 +130 330 -2.132703484629434e-05 +130 331 9.575317381092957e-06 +130 332 -4.563719592097555e-06 +130 333 1.377888192291004e-06 +131 325 -1.361668801094967e-05 +131 326 4.587104641602209e-05 +131 327 -1.034397545291478e-04 +131 328 3.790325123654152e-04 +131 329 7.486490616400382e-04 +131 330 -1.196774105566802e-04 +131 331 6.132507092318149e-05 +131 332 -3.133670432002911e-05 +131 333 9.755366072149963e-06 +132 325 9.755366072149325e-06 +132 326 -3.133670432002793e-05 +132 327 6.132507092318024e-05 +132 328 -1.196774105566782e-04 +132 329 7.486490616400408e-04 +132 330 3.790325123654109e-04 +132 331 -1.034397545291473e-04 +132 332 4.587104641602269e-05 +132 333 -1.361668801095024e-05 +133 325 1.377888192290901e-06 +133 326 -4.563719592097357e-06 +133 327 9.575317381092736e-06 +133 328 -2.132703484629406e-05 +133 329 8.525740288517073e-05 +133 330 8.634705252154631e-04 +133 331 4.800413127074988e-05 +133 332 -6.380257597874214e-06 +133 333 1.148247091498419e-06 +134 325 -6.335955594806669e-06 +134 326 1.984761106267209e-05 +134 327 -3.642594225309530e-05 +134 328 6.092043978102839e-05 +134 329 -1.104912573429368e-04 +134 330 3.849668443894276e-04 +134 331 7.076249207781896e-04 +134 332 -6.119691313295739e-05 +134 333 1.765275231247865e-05 +135 325 4.258276866272424e-06 +135 326 -1.316860931849234e-05 +135 327 2.343321932570077e-05 +135 328 -3.672666032322601e-05 +135 329 5.705134647634521e-05 +135 330 -9.844594048837580e-05 +135 331 5.028688547500576e-04 +135 332 5.376012869668942e-04 +135 333 -3.092742551756442e-07 +136 334 -3.092742551776195e-07 +136 335 5.376012869668874e-04 +136 336 5.028688547500651e-04 +136 337 -9.844594048837393e-05 +136 338 5.705134647634412e-05 +136 339 -3.672666032322538e-05 +136 340 2.343321932570045e-05 +136 341 -1.316860931849239e-05 +136 342 4.258276866272554e-06 +137 334 1.765275231247945e-05 +137 335 -6.119691313296148e-05 +137 336 7.076249207781945e-04 +137 337 3.849668443894271e-04 +137 338 -1.104912573429386e-04 +137 339 6.092043978102967e-05 +137 340 -3.642594225309627e-05 +137 341 1.984761106267297e-05 +137 342 -6.335955594807120e-06 +138 334 1.148247091498583e-06 +138 335 -6.380257597874855e-06 +138 336 4.800413127075251e-05 +138 337 8.634705252154603e-04 +138 338 8.525740288517135e-05 +138 339 -2.132703484629394e-05 +138 340 9.575317381092648e-06 +138 341 -4.563719592097376e-06 +138 342 1.377888192290945e-06 +139 334 -1.361668801095047e-05 +139 335 4.587104641602343e-05 +139 336 -1.034397545291489e-04 +139 337 3.790325123654137e-04 +139 338 7.486490616400417e-04 +139 339 -1.196774105566824e-04 +139 340 6.132507092318233e-05 +139 341 -3.133670432002950e-05 +139 342 9.755366072150079e-06 +140 334 9.755366072149665e-06 +140 335 -3.133670432002814e-05 +140 336 6.132507092317961e-05 +140 337 -1.196774105566763e-04 +140 338 7.486490616400425e-04 +140 339 3.790325123654063e-04 +140 340 -1.034397545291455e-04 +140 341 4.587104641602189e-05 +140 342 -1.361668801095000e-05 +141 334 1.377888192290838e-06 +141 335 -4.563719592097030e-06 +141 336 9.575317381091988e-06 +141 337 -2.132703484629267e-05 +141 338 8.525740288516802e-05 +141 339 8.634705252154635e-04 +141 340 4.800413127075185e-05 +141 341 -6.380257597875139e-06 +141 342 1.148247091498685e-06 +142 334 -6.335955594807142e-06 +142 335 1.984761106267303e-05 +142 336 -3.642594225309642e-05 +142 337 6.092043978102994e-05 +142 338 -1.104912573429394e-04 +142 339 3.849668443894335e-04 +142 340 7.076249207781872e-04 +142 341 -6.119691313295982e-05 +142 342 1.765275231247921e-05 +143 334 4.258276866272400e-06 +143 335 -1.316860931849192e-05 +143 336 2.343321932569961e-05 +143 337 -3.672666032322407e-05 +143 338 5.705134647634210e-05 +143 339 -9.844594048837037e-05 +143 340 5.028688547500511e-04 +143 341 5.376012869668942e-04 +143 342 -3.092742551728524e-07 +144 352 -3.092742551820647e-07 +144 353 5.376012869668940e-04 +144 354 5.028688547500650e-04 +144 355 -9.844594048837732e-05 +144 356 5.705134647634623e-05 +144 357 -3.672666032322679e-05 +144 358 2.343321932570137e-05 +144 359 -1.316860931849291e-05 +144 360 4.258276866272722e-06 +145 352 1.765275231247861e-05 +145 353 -6.119691313295757e-05 +145 354 7.076249207781893e-04 +145 355 3.849668443894277e-04 +145 356 -1.104912573429360e-04 +145 357 6.092043978102805e-05 +145 358 -3.642594225309527e-05 +145 359 1.984761106267241e-05 +145 360 -6.335955594806943e-06 +146 352 1.148247091498229e-06 +146 353 -6.380257597873472e-06 +146 354 4.800413127074672e-05 +146 355 8.634705252154658e-04 +146 356 8.525740288517069e-05 +146 357 -2.132703484629449e-05 +146 358 9.575317381093068e-06 +146 359 -4.563719592097615e-06 +146 360 1.377888192291023e-06 +147 352 -1.361668801095037e-05 +147 353 4.587104641602311e-05 +147 354 -1.034397545291484e-04 +147 355 3.790325123654155e-04 +147 356 7.486490616400378e-04 +147 357 -1.196774105566800e-04 +147 358 6.132507092318135e-05 +147 359 -3.133670432002904e-05 +147 360 9.755366072149940e-06 +148 352 9.755366072149867e-06 +148 353 -3.133670432002880e-05 +148 354 6.132507092318093e-05 +148 355 -1.196774105566791e-04 +148 356 7.486490616400441e-04 +148 357 3.790325123654077e-04 +148 358 -1.034397545291471e-04 +148 359 4.587104641602266e-05 +148 360 -1.361668801095024e-05 +149 352 1.377888192290876e-06 +149 353 -4.563719592097161e-06 +149 354 9.575317381092259e-06 +149 355 -2.132703484629328e-05 +149 356 8.525740288517047e-05 +149 357 8.634705252154604e-04 +149 358 4.800413127075290e-05 +149 359 -6.380257597875227e-06 +149 360 1.148247091498697e-06 +150 352 -6.335955594807091e-06 +150 353 1.984761106267287e-05 +150 354 -3.642594225309610e-05 +150 355 6.092043978102941e-05 +150 356 -1.104912573429383e-04 +150 357 3.849668443894291e-04 +150 358 7.076249207781920e-04 +150 359 -6.119691313296096e-05 +150 360 1.765275231247926e-05 +151 352 4.258276866272605e-06 +151 353 -1.316860931849255e-05 +151 354 2.343321932570075e-05 +151 355 -3.672666032322584e-05 +151 356 5.705134647634487e-05 +151 357 -9.844594048837543e-05 +151 358 5.028688547500699e-04 +151 359 5.376012869668807e-04 +151 360 -3.092742551749090e-07 +152 361 -3.092742551751732e-07 +152 362 5.376012869668839e-04 +152 363 5.028688547500658e-04 +152 364 -9.844594048837371e-05 +152 365 5.705134647634422e-05 +152 366 -3.672666032322549e-05 +152 367 2.343321932570054e-05 +152 368 -1.316860931849244e-05 +152 369 4.258276866272570e-06 +153 361 1.765275231247966e-05 +153 362 -6.119691313296227e-05 +153 363 7.076249207781900e-04 +153 364 3.849668443894328e-04 +153 365 -1.104912573429395e-04 +153 366 6.092043978103021e-05 +153 367 -3.642594225309660e-05 +153 368 1.984761106267315e-05 +153 369 -6.335955594807180e-06 +154 361 1.148247091498210e-06 +154 362 -6.380257597873506e-06 +154 363 4.800413127074826e-05 +154 364 8.634705252154597e-04 +154 365 8.525740288517628e-05 +154 366 -2.132703484629587e-05 +154 367 9.575317381093712e-06 +154 368 -4.563719592097933e-06 +154 369 1.377888192291120e-06 +155 361 -1.361668801095052e-05 +155 362 4.587104641602359e-05 +155 363 -1.034397545291492e-04 +155 364 3.790325123654120e-04 +155 365 7.486490616400435e-04 +155 366 -1.196774105566824e-04 +155 367 6.132507092318245e-05 +155 368 -3.133670432002957e-05 +155 369 9.755366072150102e-06 +156 361 9.755366072149818e-06 +156 362 -3.133670432002864e-05 +156 363 6.132507092318054e-05 +156 364 -1.196774105566780e-04 +156 365 7.486490616400383e-04 +156 366 3.790325123654129e-04 +156 367 -1.034397545291476e-04 +156 368 4.587104641602279e-05 +156 369 -1.361668801095027e-05 +157 361 1.377888192291048e-06 +157 362 -4.563719592097699e-06 +157 363 9.575317381093241e-06 +157 364 -2.132703484629486e-05 +157 365 8.525740288517218e-05 +157 366 8.634705252154647e-04 +157 367 4.800413127074656e-05 +157 368 -6.380257597873401e-06 +157 369 1.148247091498207e-06 +158 361 -6.335955594807092e-06 +158 362 1.984761106267287e-05 +158 363 -3.642594225309612e-05 +158 364 6.092043978102946e-05 +158 365 -1.104912573429385e-04 +158 366 3.849668443894347e-04 +158 367 7.076249207781850e-04 +158 368 -6.119691313295922e-05 +158 369 1.765275231247905e-05 +159 361 4.258276866272428e-06 +159 362 -1.316860931849200e-05 +159 363 2.343321932569976e-05 +159 364 -3.672666032322428e-05 +159 365 5.705134647634241e-05 +159 366 -9.844594048837077e-05 +159 367 5.028688547500515e-04 +159 368 5.376012869669002e-04 +159 369 -3.092742551789510e-07 +160 388 -3.092742551789408e-07 +160 389 5.376012869669001e-04 +160 390 5.028688547500516e-04 +160 391 -9.844594048837079e-05 +160 392 5.705134647634240e-05 +160 393 -3.672666032322428e-05 +160 394 2.343321932569976e-05 +160 395 -1.316860931849201e-05 +160 396 4.258276866272427e-06 +161 388 1.765275231247905e-05 +161 389 -6.119691313295919e-05 +161 390 7.076249207781853e-04 +161 391 3.849668443894347e-04 +161 392 -1.104912573429385e-04 +161 393 6.092043978102946e-05 +161 394 -3.642594225309611e-05 +161 395 1.984761106267288e-05 +161 396 -6.335955594807090e-06 +162 388 1.148247091498346e-06 +162 389 -6.380257597873889e-06 +162 390 4.800413127074778e-05 +162 391 8.634705252154652e-04 +162 392 8.525740288517044e-05 +162 393 -2.132703484629410e-05 +162 394 9.575317381092811e-06 +162 395 -4.563719592097474e-06 +162 396 1.377888192290978e-06 +163 388 -1.361668801095026e-05 +163 389 4.587104641602277e-05 +163 390 -1.034397545291476e-04 +163 391 3.790325123654130e-04 +163 392 7.486490616400384e-04 +163 393 -1.196774105566779e-04 +163 394 6.132507092318051e-05 +163 395 -3.133670432002864e-05 +163 396 9.755366072149819e-06 +164 388 9.755366072150077e-06 +164 389 -3.133670432002948e-05 +164 390 6.132507092318231e-05 +164 391 -1.196774105566821e-04 +164 392 7.486490616400428e-04 +164 393 3.790325123654123e-04 +164 394 -1.034397545291488e-04 +164 395 4.587104641602346e-05 +164 396 -1.361668801095048e-05 +165 388 1.377888192290870e-06 +165 389 -4.563719592097140e-06 +165 390 9.575317381092221e-06 +165 391 -2.132703484629321e-05 +165 392 8.525740288517032e-05 +165 393 8.634705252154613e-04 +165 394 4.800413127075213e-05 +165 395 -6.380257597875200e-06 +165 396 1.148247091498695e-06 +166 388 -6.335955594807246e-06 +166 389 1.984761106267335e-05 +166 390 -3.642594225309698e-05 +166 391 6.092043978103087e-05 +166 392 -1.104912573429409e-04 +166 393 3.849668443894369e-04 +166 394 7.076249207781875e-04 +166 395 -6.119691313296337e-05 +166 396 1.765275231247984e-05 +167 388 4.258276866272529e-06 +167 389 -1.316860931849231e-05 +167 390 2.343321932570032e-05 +167 391 -3.672666032322515e-05 +167 392 5.705134647634374e-05 +167 393 -9.844594048837316e-05 +167 394 5.028688547500696e-04 +167 395 5.376012869668792e-04 +167 396 -3.092742551745532e-07 +168 397 -3.092742551749157e-07 +168 398 5.376012869668806e-04 +168 399 5.028688547500703e-04 +168 400 -9.844594048837542e-05 +168 401 5.705134647634487e-05 +168 402 -3.672666032322583e-05 +168 403 2.343321932570074e-05 +168 404 -1.316860931849255e-05 +168 405 4.258276866272605e-06 +169 397 1.765275231247925e-05 +169 398 -6.119691313296082e-05 +169 399 7.076249207781883e-04 +169 400 3.849668443894332e-04 +169 401 -1.104912573429391e-04 +169 402 6.092043978102974e-05 +169 403 -3.642594225309629e-05 +169 404 1.984761106267297e-05 +169 405 -6.335955594807120e-06 +170 397 1.148247091498705e-06 +170 398 -6.380257597875220e-06 +170 399 4.800413127075210e-05 +170 400 8.634705252154632e-04 +170 401 8.525740288516817e-05 +170 402 -2.132703484629281e-05 +170 403 9.575317381092059e-06 +170 404 -4.563719592097062e-06 +170 405 1.377888192290846e-06 +171 397 -1.361668801095038e-05 +171 398 4.587104641602313e-05 +171 399 -1.034397545291484e-04 +171 400 3.790325123654142e-04 +171 401 7.486490616400389e-04 +171 402 -1.196774105566798e-04 +171 403 6.132507092318132e-05 +171 404 -3.133670432002903e-05 +171 405 9.755366072149940e-06 +172 397 9.755366072149984e-06 +172 398 -3.133670432002916e-05 +172 399 6.132507092318157e-05 +172 400 -1.196774105566801e-04 +172 401 7.486490616400364e-04 +172 402 3.790325123654174e-04 +172 403 -1.034397545291493e-04 +172 404 4.587104641602353e-05 +172 405 -1.361668801095049e-05 +173 397 1.377888192291034e-06 +173 398 -4.563719592097652e-06 +173 399 9.575317381093174e-06 +173 400 -2.132703484629482e-05 +173 401 8.525740288517230e-05 +173 402 8.634705252154625e-04 +173 403 4.800413127074926e-05 +173 404 -6.380257597874031e-06 +173 405 1.148247091498360e-06 +174 397 -6.335955594807142e-06 +174 398 1.984761106267303e-05 +174 399 -3.642594225309642e-05 +174 400 6.092043978102994e-05 +174 401 -1.104912573429394e-04 +174 402 3.849668443894335e-04 +174 403 7.076249207781872e-04 +174 404 -6.119691313295982e-05 +174 405 1.765275231247921e-05 +175 397 4.258276866272428e-06 +175 398 -1.316860931849200e-05 +175 399 2.343321932569976e-05 +175 400 -3.672666032322428e-05 +175 401 5.705134647634241e-05 +175 402 -9.844594048837077e-05 +175 403 5.028688547500515e-04 +175 404 5.376012869669002e-04 +175 405 -3.092742551789510e-07 +176 415 -3.092742551789408e-07 +176 416 5.376012869669001e-04 +176 417 5.028688547500516e-04 +176 418 -9.844594048837079e-05 +176 419 5.705134647634240e-05 +176 420 -3.672666032322428e-05 +176 421 2.343321932569976e-05 +176 422 -1.316860931849201e-05 +176 423 4.258276866272427e-06 +177 415 1.765275231247921e-05 +177 416 -6.119691313295980e-05 +177 417 7.076249207781874e-04 +177 418 3.849668443894335e-04 +177 419 -1.104912573429393e-04 +177 420 6.092043978102994e-05 +177 421 -3.642594225309641e-05 +177 422 1.984761106267303e-05 +177 423 -6.335955594807142e-06 +178 415 1.148247091498468e-06 +178 416 -6.380257597874387e-06 +178 417 4.800413127075006e-05 +178 418 8.634705252154630e-04 +178 419 8.525740288517082e-05 +178 420 -2.132703484629408e-05 +178 421 9.575317381092757e-06 +178 422 -4.563719592097437e-06 +178 423 1.377888192290965e-06 +179 415 -1.361668801095043e-05 +179 416 4.587104641602332e-05 +179 417 -1.034397545291488e-04 +179 418 3.790325123654161e-04 +179 419 7.486490616400376e-04 +179 420 -1.196774105566801e-04 +179 421 6.132507092318147e-05 +179 422 -3.133670432002910e-05 +179 423 9.755366072149963e-06 +180 415 9.755366072149872e-06 +180 416 -3.133670432002881e-05 +180 417 6.132507092318097e-05 +180 418 -1.196774105566793e-04 +180 419 7.486490616400410e-04 +180 420 3.790325123654109e-04 +180 421 -1.034397545291472e-04 +180 422 4.587104641602269e-05 +180 423 -1.361668801095024e-05 +181 415 1.377888192290712e-06 +181 416 -4.563719592096635e-06 +181 417 9.575317381091249e-06 +181 418 -2.132703484629140e-05 +181 419 8.525740288516548e-05 +181 420 8.634705252154638e-04 +181 421 4.800413127075406e-05 +181 422 -6.380257597876128e-06 +181 423 1.148247091498968e-06 +182 415 -6.335955594807136e-06 +182 416 1.984761106267302e-05 +182 417 -3.642594225309639e-05 +182 418 6.092043978102997e-05 +182 419 -1.104912573429396e-04 +182 420 3.849668443894351e-04 +182 421 7.076249207781857e-04 +182 422 -6.119691313295974e-05 +182 423 1.765275231247912e-05 +183 415 4.258276866272647e-06 +183 416 -1.316860931849268e-05 +183 417 2.343321932570097e-05 +183 418 -3.672666032322617e-05 +183 419 5.705134647634534e-05 +183 420 -9.844594048837600e-05 +183 421 5.028688547500660e-04 +183 422 5.376012869668857e-04 +183 423 -3.092742551755290e-07 +184 424 -3.092742551749903e-07 +184 425 5.376012869668808e-04 +184 426 5.028688547500707e-04 +184 427 -9.844594048837633e-05 +184 428 5.705134647634523e-05 +184 429 -3.672666032322604e-05 +184 430 2.343321932570087e-05 +184 431 -1.316860931849262e-05 +184 432 4.258276866272627e-06 +185 424 1.765275231247889e-05 +185 425 -6.119691313295953e-05 +185 426 7.076249207781944e-04 +185 427 3.849668443894246e-04 +185 428 -1.104912573429365e-04 +185 429 6.092043978102837e-05 +185 430 -3.642594225309547e-05 +185 431 1.984761106267252e-05 +185 432 -6.335955594806977e-06 +186 424 1.148247091498707e-06 +186 425 -6.380257597875248e-06 +186 426 4.800413127075286e-05 +186 427 8.634705252154623e-04 +186 428 8.525740288516833e-05 +186 429 -2.132703484629289e-05 +186 430 9.575317381092096e-06 +186 431 -4.563719592097083e-06 +186 432 1.377888192290853e-06 +187 424 -1.361668801095023e-05 +187 425 4.587104641602262e-05 +187 426 -1.034397545291472e-04 +187 427 3.790325123654108e-04 +187 428 7.486490616400406e-04 +187 429 -1.196774105566784e-04 +187 430 6.132507092318063e-05 +187 431 -3.133670432002868e-05 +187 432 9.755366072149828e-06 +188 424 9.755366072150014e-06 +188 425 -3.133670432002927e-05 +188 426 6.132507092318181e-05 +188 427 -1.196774105566808e-04 +188 428 7.486490616400368e-04 +188 429 3.790325123654176e-04 +188 430 -1.034397545291494e-04 +188 431 4.587104641602361e-05 +188 432 -1.361668801095051e-05 +189 424 1.377888192291100e-06 +189 425 -4.563719592097864e-06 +189 426 9.575317381093567e-06 +189 427 -2.132703484629548e-05 +189 428 8.525740288517352e-05 +189 429 8.634705252154623e-04 +189 430 4.800413127074809e-05 +189 431 -6.380257597873462e-06 +189 432 1.148247091498202e-06 +190 424 -6.335955594806948e-06 +190 425 1.984761106267242e-05 +190 426 -3.642594225309529e-05 +190 427 6.092043978102805e-05 +190 428 -1.104912573429359e-04 +190 429 3.849668443894246e-04 +190 430 7.076249207781926e-04 +190 431 -6.119691313295835e-05 +190 432 1.765275231247871e-05 +191 424 4.258276866272524e-06 +191 425 -1.316860931849230e-05 +191 426 2.343321932570031e-05 +191 427 -3.672666032322515e-05 +191 428 5.705134647634384e-05 +191 429 -9.844594048837378e-05 +191 430 5.028688547500587e-04 +191 431 5.376012869668935e-04 +191 432 -3.092742551773620e-07 +192 460 -3.092742551772807e-07 +192 461 5.376012869668931e-04 +192 462 5.028688547500583e-04 +192 463 -9.844594048837286e-05 +192 464 5.705134647634346e-05 +192 465 -3.672666032322494e-05 +192 466 2.343321932570017e-05 +192 467 -1.316860931849223e-05 +192 468 4.258276866272502e-06 +193 460 1.765275231247906e-05 +193 461 -6.119691313295953e-05 +193 462 7.076249207781855e-04 +193 463 3.849668443894353e-04 +193 464 -1.104912573429391e-04 +193 465 6.092043978102970e-05 +193 466 -3.642594225309624e-05 +193 467 1.984761106267294e-05 +193 468 -6.335955594807111e-06 +194 460 1.148247091498466e-06 +194 461 -6.380257597874360e-06 +194 462 4.800413127074930e-05 +194 463 8.634705252154636e-04 +194 464 8.525740288517067e-05 +194 465 -2.132703484629400e-05 +194 466 9.575317381092719e-06 +194 467 -4.563719592097416e-06 +194 468 1.377888192290959e-06 +195 460 -1.361668801095036e-05 +195 461 4.587104641602308e-05 +195 462 -1.034397545291483e-04 +195 463 3.790325123654142e-04 +195 464 7.486490616400389e-04 +195 465 -1.196774105566797e-04 +195 466 6.132507092318123e-05 +195 467 -3.133670432002898e-05 +195 468 9.755366072149921e-06 +196 460 9.755366072149843e-06 +196 461 -3.133670432002872e-05 +196 462 6.132507092318081e-05 +196 463 -1.196774105566791e-04 +196 464 7.486490616400426e-04 +196 465 3.790325123654089e-04 +196 466 -1.034397545291468e-04 +196 467 4.587104641602249e-05 +196 468 -1.361668801095018e-05 +197 460 1.377888192290711e-06 +197 461 -4.563719592096632e-06 +197 462 9.575317381091242e-06 +197 463 -2.132703484629139e-05 +197 464 8.525740288516554e-05 +197 465 8.634705252154636e-04 +197 466 4.800413127075407e-05 +197 467 -6.380257597876135e-06 +197 468 1.148247091498971e-06 +198 460 -6.335955594807198e-06 +198 461 1.984761106267321e-05 +198 462 -3.642594225309675e-05 +198 463 6.092043978103054e-05 +198 464 -1.104912573429406e-04 +198 465 3.849668443894375e-04 +198 466 7.076249207781841e-04 +198 467 -6.119691313295989e-05 +198 468 1.765275231247926e-05 +199 460 4.258276866272573e-06 +199 461 -1.316860931849245e-05 +199 462 2.343321932570056e-05 +199 463 -3.672666032322551e-05 +199 464 5.705134647634429e-05 +199 465 -9.844594048837389e-05 +199 466 5.028688547500593e-04 +199 467 5.376012869668925e-04 +199 468 -3.092742551771959e-07 +200 469 -3.092742551766505e-07 +200 470 5.376012869668877e-04 +200 471 5.028688547500639e-04 +200 472 -9.844594048837426e-05 +200 473 5.705134647634418e-05 +200 474 -3.672666032322539e-05 +200 475 2.343321932570046e-05 +200 476 -1.316860931849239e-05 +200 477 4.258276866272553e-06 +201 469 1.765275231247902e-05 +201 470 -6.119691313295960e-05 +201 471 7.076249207781911e-04 +201 472 3.849668443894290e-04 +201 473 -1.104912573429381e-04 +201 474 6.092043978102923e-05 +201 475 -3.642594225309597e-05 +201 476 1.984761106267279e-05 +201 477 -6.335955594807064e-06 +202 469 1.148247091498863e-06 +202 470 -6.380257597875803e-06 +202 471 4.800413127075403e-05 +202 472 8.634705252154626e-04 +202 473 8.525740288516710e-05 +202 474 -2.132703484629223e-05 +202 475 9.575317381091706e-06 +202 476 -4.563719592096871e-06 +202 477 1.377888192290786e-06 +203 469 -1.361668801095025e-05 +203 470 4.587104641602269e-05 +203 471 -1.034397545291474e-04 +203 472 3.790325123654111e-04 +203 473 7.486490616400410e-04 +203 474 -1.196774105566791e-04 +203 475 6.132507092318086e-05 +203 476 -3.133670432002879e-05 +203 477 9.755366072149860e-06 +204 469 9.755366072149885e-06 +204 470 -3.133670432002886e-05 +204 471 6.132507092318102e-05 +204 472 -1.196774105566794e-04 +204 473 7.486490616400417e-04 +204 474 3.790325123654107e-04 +204 475 -1.034397545291477e-04 +204 476 4.587104641602285e-05 +204 477 -1.361668801095029e-05 +205 469 1.377888192291096e-06 +205 470 -4.563719592097852e-06 +205 471 9.575317381093546e-06 +205 472 -2.132703484629548e-05 +205 473 8.525740288517414e-05 +205 474 8.634705252154616e-04 +205 475 4.800413127074823e-05 +205 476 -6.380257597873509e-06 +205 477 1.148247091498216e-06 +206 469 -6.335955594806885e-06 +206 470 1.984761106267222e-05 +206 471 -3.642594225309495e-05 +206 472 6.092043978102752e-05 +206 473 -1.104912573429351e-04 +206 474 3.849668443894232e-04 +206 475 7.076249207781917e-04 +206 476 -6.119691313295596e-05 +206 477 1.765275231247826e-05 +207 469 4.258276866272527e-06 +207 470 -1.316860931849231e-05 +207 471 2.343321932570032e-05 +207 472 -3.672666032322518e-05 +207 473 5.705134647634390e-05 +207 474 -9.844594048837397e-05 +207 475 5.028688547500523e-04 +207 476 5.376012869669020e-04 +207 477 -3.092742551793847e-07 +208 487 -3.092742551793000e-07 +208 488 5.376012869669016e-04 +208 489 5.028688547500519e-04 +208 490 -9.844594048837304e-05 +208 491 5.705134647634352e-05 +208 492 -3.672666032322497e-05 +208 493 2.343321932570018e-05 +208 494 -1.316860931849224e-05 +208 495 4.258276866272504e-06 +209 487 1.765275231247863e-05 +209 488 -6.119691313295722e-05 +209 489 7.076249207781859e-04 +209 490 3.849668443894318e-04 +209 491 -1.104912573429376e-04 +209 492 6.092043978102890e-05 +209 493 -3.642594225309576e-05 +209 494 1.984761106267267e-05 +209 495 -6.335955594807024e-06 +210 487 1.148247091498202e-06 +210 488 -6.380257597873448e-06 +210 489 4.800413127074733e-05 +210 490 8.634705252154632e-04 +210 491 8.525740288517336e-05 +210 492 -2.132703484629543e-05 +210 493 9.575317381093529e-06 +210 494 -4.563719592097845e-06 +210 495 1.377888192291093e-06 +211 487 -1.361668801095058e-05 +211 488 4.587104641602381e-05 +211 489 -1.034397545291499e-04 +211 490 3.790325123654186e-04 +211 491 7.486490616400369e-04 +211 492 -1.196774105566818e-04 +211 493 6.132507092318226e-05 +211 494 -3.133670432002949e-05 +211 495 9.755366072150082e-06 +212 487 9.755366072149794e-06 +212 488 -3.133670432002855e-05 +212 489 6.132507092318039e-05 +212 490 -1.196774105566777e-04 +212 491 7.486490616400376e-04 +212 492 3.790325123654132e-04 +212 493 -1.034397545291473e-04 +212 494 4.587104641602265e-05 +212 495 -1.361668801095023e-05 +213 487 1.377888192290771e-06 +213 488 -4.563719592096823e-06 +213 489 9.575317381091615e-06 +213 490 -2.132703484629204e-05 +213 491 8.525740288516635e-05 +213 492 8.634705252154623e-04 +213 493 4.800413127075496e-05 +213 494 -6.380257597875979e-06 +213 495 1.148247091498905e-06 +214 487 -6.335955594807125e-06 +214 488 1.984761106267297e-05 +214 489 -3.642594225309631e-05 +214 490 6.092043978102978e-05 +214 491 -1.104912573429390e-04 +214 492 3.849668443894295e-04 +214 493 7.076249207781913e-04 +214 494 -6.119691313296018e-05 +214 495 1.765275231247921e-05 +215 487 4.258276866272713e-06 +215 488 -1.316860931849288e-05 +215 489 2.343321932570133e-05 +215 490 -3.672666032322671e-05 +215 491 5.705134647634611e-05 +215 492 -9.844594048837709e-05 +215 493 5.028688547500677e-04 +215 494 5.376012869668884e-04 +215 495 -3.092742551792559e-07 +216 496 -3.092742551729303e-07 +216 497 5.376012869668850e-04 +216 498 5.028688547500622e-04 +216 499 -9.844594048837316e-05 +216 500 5.705134647634341e-05 +216 501 -3.672666032322485e-05 +216 502 2.343321932570010e-05 +216 503 -1.316860931849219e-05 +216 504 4.258276866272486e-06 +217 496 1.765275231247881e-05 +217 497 -6.119691313295879e-05 +217 498 7.076249207781883e-04 +217 499 3.849668443894303e-04 +217 500 -1.104912573429368e-04 +217 501 6.092043978102849e-05 +217 502 -3.642594225309553e-05 +217 503 1.984761106267256e-05 +217 504 -6.335955594806988e-06 +218 496 1.148247091498322e-06 +218 497 -6.380257597873804e-06 +218 498 4.800413127074755e-05 +218 499 8.634705252154649e-04 +218 500 8.525740288517082e-05 +218 501 -2.132703484629423e-05 +218 502 9.575317381092889e-06 +218 503 -4.563719592097513e-06 +218 504 1.377888192290990e-06 +219 496 -1.361668801095034e-05 +219 497 4.587104641602298e-05 +219 498 -1.034397545291480e-04 +219 499 3.790325123654123e-04 +219 500 7.486490616400415e-04 +219 501 -1.196774105566809e-04 +219 502 6.132507092318157e-05 +219 503 -3.133670432002911e-05 +219 504 9.755366072149960e-06 +220 496 9.755366072149682e-06 +220 497 -3.133670432002820e-05 +220 498 6.132507092317972e-05 +220 499 -1.196774105566767e-04 +220 500 7.486490616400400e-04 +220 501 3.790325123654093e-04 +220 502 -1.034397545291461e-04 +220 503 4.587104641602208e-05 +220 504 -1.361668801095005e-05 +221 496 1.377888192290938e-06 +221 497 -4.563719592097345e-06 +221 498 9.575317381092577e-06 +221 499 -2.132703484629368e-05 +221 500 8.525740288516932e-05 +221 501 8.634705252154641e-04 +221 502 4.800413127075015e-05 +221 503 -6.380257597874458e-06 +221 504 1.148247091498488e-06 +222 496 -6.335955594807103e-06 +222 497 1.984761106267291e-05 +222 498 -3.642594225309618e-05 +222 499 6.092043978102952e-05 +222 500 -1.104912573429385e-04 +222 501 3.849668443894305e-04 +222 502 7.076249207781913e-04 +222 503 -6.119691313296181e-05 +222 504 1.765275231247941e-05 +223 496 4.258276866272512e-06 +223 497 -1.316860931849226e-05 +223 498 2.343321932570024e-05 +223 499 -3.672666032322504e-05 +223 500 5.705134647634365e-05 +223 501 -9.844594048837339e-05 +223 502 5.028688547500689e-04 +223 503 5.376012869668825e-04 +223 504 -3.092742551770062e-07 +224 523 -3.092742551745498e-07 +224 524 5.376012869668885e-04 +224 525 5.028688547500591e-04 +224 526 -9.844594048837129e-05 +224 527 5.705134647634279e-05 +224 528 -3.672666032322457e-05 +224 529 2.343321932569995e-05 +224 530 -1.316860931849212e-05 +224 531 4.258276866272464e-06 +225 523 1.765275231247970e-05 +225 524 -6.119691313296227e-05 +225 525 7.076249207781854e-04 +225 526 3.849668443894389e-04 +225 527 -1.104912573429414e-04 +225 528 6.092043978103106e-05 +225 529 -3.642594225309708e-05 +225 530 1.984761106267341e-05 +225 531 -6.335955594807260e-06 +226 523 1.148247091498963e-06 +226 524 -6.380257597876098e-06 +226 525 4.800413127075391e-05 +226 526 8.634705252154665e-04 +226 527 8.525740288516272e-05 +226 528 -2.132703484629102e-05 +226 529 9.575317381091103e-06 +226 530 -4.563719592096568e-06 +226 531 1.377888192290691e-06 +227 523 -1.361668801095037e-05 +227 524 4.587104641602315e-05 +227 525 -1.034397545291485e-04 +227 526 3.790325123654191e-04 +227 527 7.486490616400337e-04 +227 528 -1.196774105566791e-04 +227 529 6.132507092318105e-05 +227 530 -3.133670432002891e-05 +227 531 9.755366072149902e-06 +228 523 9.755366072149958e-06 +228 524 -3.133670432002908e-05 +228 525 6.132507092318143e-05 +228 526 -1.196774105566798e-04 +228 527 7.486490616400356e-04 +228 528 3.790325123654176e-04 +228 529 -1.034397545291490e-04 +228 530 4.587104641602339e-05 +228 531 -1.361668801095045e-05 +229 523 1.377888192290868e-06 +229 524 -4.563719592097125e-06 +229 525 9.575317381092160e-06 +229 526 -2.132703484629295e-05 +229 527 8.525740288516765e-05 +229 528 8.634705252154658e-04 +229 529 4.800413127074962e-05 +229 530 -6.380257597874746e-06 +229 531 1.148247091498588e-06 +230 523 -6.335955594807194e-06 +230 524 1.984761106267319e-05 +230 525 -3.642594225309673e-05 +230 526 6.092043978103051e-05 +230 527 -1.104912573429406e-04 +230 528 3.849668443894411e-04 +230 529 7.076249207781801e-04 +230 530 -6.119691313295957e-05 +230 531 1.765275231247921e-05 +231 523 4.258276866272390e-06 +231 524 -1.316860931849189e-05 +231 525 2.343321932569956e-05 +231 526 -3.672666032322396e-05 +231 527 5.705134647634193e-05 +231 528 -9.844594048836989e-05 +231 529 5.028688547500479e-04 +231 530 5.376012869668970e-04 +231 531 -3.092742551730218e-07 +232 532 -3.092742551810889e-07 +232 533 5.376012869668866e-04 +232 534 5.028688547500711e-04 +232 535 -9.844594048837674e-05 +232 536 5.705134647634554e-05 +232 537 -3.672666032322626e-05 +232 538 2.343321932570102e-05 +232 539 -1.316860931849271e-05 +232 540 4.258276866272655e-06 +233 532 1.765275231247900e-05 +233 533 -6.119691313295994e-05 +233 534 7.076249207781959e-04 +233 535 3.849668443894235e-04 +233 536 -1.104912573429369e-04 +233 537 6.092043978102862e-05 +233 538 -3.642594225309562e-05 +233 539 1.984761106267261e-05 +233 540 -6.335955594807004e-06 +234 532 1.148247091498788e-06 +234 533 -6.380257597875552e-06 +234 534 4.800413127075418e-05 +234 535 8.634705252154617e-04 +234 536 8.525740288516788e-05 +234 537 -2.132703484629255e-05 +234 538 9.575317381091903e-06 +234 539 -4.563719592096983e-06 +234 540 1.377888192290822e-06 +235 532 -1.361668801095003e-05 +235 533 4.587104641602195e-05 +235 534 -1.034397545291457e-04 +235 535 3.790325123654066e-04 +235 536 7.486490616400429e-04 +235 537 -1.196774105566770e-04 +235 538 6.132507092317983e-05 +235 539 -3.133670432002826e-05 +235 540 9.755366072149697e-06 +236 532 9.755366072149960e-06 +236 533 -3.133670432002910e-05 +236 534 6.132507092318157e-05 +236 535 -1.196774105566809e-04 +236 536 7.486490616400413e-04 +236 537 3.790325123654123e-04 +236 538 -1.034397545291479e-04 +236 539 4.587104641602300e-05 +236 540 -1.361668801095033e-05 +237 532 1.377888192290989e-06 +237 533 -4.563719592097511e-06 +237 534 9.575317381092882e-06 +237 535 -2.132703484629422e-05 +237 536 8.525740288517080e-05 +237 537 8.634705252154649e-04 +237 538 4.800413127074755e-05 +237 539 -6.380257597873791e-06 +237 540 1.148247091498319e-06 +238 532 -6.335955594806865e-06 +238 533 1.984761106267217e-05 +238 534 -3.642594225309485e-05 +238 535 6.092043978102738e-05 +238 536 -1.104912573429350e-04 +238 537 3.849668443894266e-04 +238 538 7.076249207781887e-04 +238 539 -6.119691313295628e-05 +238 540 1.765275231247823e-05 +239 532 4.258276866272591e-06 +239 533 -1.316860931849251e-05 +239 534 2.343321932570068e-05 +239 535 -3.672666032322575e-05 +239 536 5.705134647634484e-05 +239 537 -9.844594048837583e-05 +239 538 5.028688547500629e-04 +239 539 5.376012869668925e-04 +239 540 -3.092742551793881e-07 +240 550 -3.092742551769283e-07 +240 551 5.376012869668985e-04 +240 552 5.028688547500531e-04 +240 553 -9.844594048837374e-05 +240 554 5.705134647634398e-05 +240 555 -3.672666032322528e-05 +240 556 2.343321932570039e-05 +240 557 -1.316860931849236e-05 +240 558 4.258276866272543e-06 +241 550 1.765275231247868e-05 +241 551 -6.119691313295742e-05 +241 552 7.076249207781866e-04 +241 553 3.849668443894317e-04 +241 554 -1.104912573429381e-04 +241 555 6.092043978102915e-05 +241 556 -3.642594225309590e-05 +241 557 1.984761106267275e-05 +241 558 -6.335955594807048e-06 +242 550 1.148247091498681e-06 +242 551 -6.380257597875153e-06 +242 552 4.800413127075201e-05 +242 553 8.634705252154621e-04 +242 554 8.525740288516968e-05 +242 555 -2.132703484629320e-05 +242 556 9.575317381092238e-06 +242 557 -4.563719592097152e-06 +242 558 1.377888192290874e-06 +243 550 -1.361668801095038e-05 +243 551 4.587104641602316e-05 +243 552 -1.034397545291484e-04 +243 553 3.790325123654131e-04 +243 554 7.486490616400404e-04 +243 555 -1.196774105566801e-04 +243 556 6.132507092318143e-05 +243 557 -3.133670432002908e-05 +243 558 9.755366072149951e-06 +244 550 9.755366072149974e-06 +244 551 -3.133670432002914e-05 +244 552 6.132507092318159e-05 +244 553 -1.196774105566804e-04 +244 554 7.486490616400410e-04 +244 555 3.790325123654128e-04 +244 556 -1.034397545291487e-04 +244 557 4.587104641602332e-05 +244 558 -1.361668801095043e-05 +245 550 1.377888192291118e-06 +245 551 -4.563719592097923e-06 +245 552 9.575317381093695e-06 +245 553 -2.132703484629581e-05 +245 554 8.525740288517550e-05 +245 555 8.634705252154613e-04 +245 556 4.800413127074735e-05 +245 557 -6.380257597873415e-06 +245 558 1.148247091498192e-06 +246 550 -6.335955594807089e-06 +246 551 1.984761106267286e-05 +246 552 -3.642594225309611e-05 +246 553 6.092043978102944e-05 +246 554 -1.104912573429385e-04 +246 555 3.849668443894333e-04 +246 556 7.076249207781868e-04 +246 557 -6.119691313295961e-05 +246 558 1.765275231247907e-05 +247 550 4.258276866272607e-06 +247 551 -1.316860931849255e-05 +247 552 2.343321932570074e-05 +247 553 -3.672666032322579e-05 +247 554 5.705134647634471e-05 +247 555 -9.844594048837466e-05 +247 556 5.028688547500609e-04 +247 557 5.376012869668929e-04 +247 558 -3.092742551786325e-07 +248 559 -3.092742551753020e-07 +248 560 5.376012869668882e-04 +248 561 5.028688547500612e-04 +248 562 -9.844594048837247e-05 +248 563 5.705134647634295e-05 +248 564 -3.672666032322453e-05 +248 565 2.343321932569989e-05 +248 566 -1.316860931849207e-05 +248 567 4.258276866272447e-06 +249 559 1.765275231247881e-05 +249 560 -6.119691313295879e-05 +249 561 7.076249207781883e-04 +249 562 3.849668443894303e-04 +249 563 -1.104912573429368e-04 +249 564 6.092043978102849e-05 +249 565 -3.642594225309553e-05 +249 566 1.984761106267256e-05 +249 567 -6.335955594806988e-06 +250 559 1.148247091498117e-06 +250 560 -6.380257597873106e-06 +250 561 4.800413127074588e-05 +250 562 8.634705252154636e-04 +250 563 8.525740288517426e-05 +250 564 -2.132703484629562e-05 +250 565 9.575317381093641e-06 +250 566 -4.563719592097906e-06 +250 567 1.377888192291114e-06 +251 559 -1.361668801095038e-05 +251 560 4.587104641602312e-05 +251 561 -1.034397545291483e-04 +251 562 3.790325123654120e-04 +251 563 7.486490616400421e-04 +251 564 -1.196774105566811e-04 +251 565 6.132507092318173e-05 +251 566 -3.133670432002919e-05 +251 567 9.755366072149984e-06 +252 559 9.755366072149696e-06 +252 560 -3.133670432002824e-05 +252 561 6.132507092317985e-05 +252 562 -1.196774105566770e-04 +252 563 7.486490616400428e-04 +252 564 3.790325123654066e-04 +252 565 -1.034397545291457e-04 +252 566 4.587104641602197e-05 +252 567 -1.361668801095002e-05 +253 559 1.377888192290821e-06 +253 560 -4.563719592096979e-06 +253 561 9.575317381091900e-06 +253 562 -2.132703484629255e-05 +253 563 8.525740288516790e-05 +253 564 8.634705252154615e-04 +253 565 4.800413127075418e-05 +253 566 -6.380257597875559e-06 +253 567 1.148247091498786e-06 +254 559 -6.335955594807008e-06 +254 560 1.984761106267260e-05 +254 561 -3.642594225309563e-05 +254 562 6.092043978102862e-05 +254 563 -1.104912573429369e-04 +254 564 3.849668443894236e-04 +254 565 7.076249207781957e-04 +254 566 -6.119691313295995e-05 +254 567 1.765275231247900e-05 +255 559 4.258276866272695e-06 +255 560 -1.316860931849283e-05 +255 561 2.343321932570123e-05 +255 562 -3.672666032322658e-05 +255 563 5.705134647634601e-05 +255 564 -9.844594048837743e-05 +255 565 5.028688547500720e-04 +255 566 5.376012869668837e-04 +255 567 -3.092742551787138e-07 +256 613 -3.092742551719715e-07 +256 614 5.376012869668801e-04 +256 615 5.028688547500621e-04 +256 616 -9.844594048836917e-05 +256 617 5.705134647634380e-05 +256 618 -3.672666032322455e-05 +256 619 2.343321932569957e-05 +256 620 -1.316860931849182e-05 +256 621 4.258276866272083e-06 +257 613 1.765275231248067e-05 +257 614 -6.119691313296669e-05 +257 615 7.076249207781938e-04 +257 616 3.849668443894395e-04 +257 617 -1.104912573429506e-04 +257 618 6.092043978103532e-05 +257 619 -3.642594225309904e-05 +257 620 1.984761106267438e-05 +257 621 -6.335955594807142e-06 +258 613 1.148247091500464e-06 +258 614 -6.380257597881394e-06 +258 615 4.800413127076793e-05 +258 616 8.634705252154682e-04 +258 617 8.525740288514612e-05 +258 618 -2.132703484628342e-05 +258 619 9.575317381086587e-06 +258 620 -4.563719592094176e-06 +258 621 1.377888192289840e-06 +259 613 -1.361668801094946e-05 +259 614 4.587104641602000e-05 +259 615 -1.034397545291406e-04 +259 616 3.790325123654177e-04 +259 617 7.486490616400285e-04 +259 618 -1.196774105566757e-04 +259 619 6.132507092317799e-05 +259 620 -3.133670432002723e-05 +259 621 9.755366072148705e-06 +260 613 9.755366072149235e-06 +260 614 -3.133670432002671e-05 +260 615 6.132507092317634e-05 +260 616 -1.196774105566746e-04 +260 617 7.486490616400275e-04 +260 618 3.790325123654192e-04 +260 619 -1.034397545291428e-04 +260 620 4.587104641602061e-05 +260 621 -1.361668801094864e-05 +261 613 1.377888192289934e-06 +261 614 -4.563719592094154e-06 +261 615 9.575317381086435e-06 +261 616 -2.132703484628338e-05 +261 617 8.525740288514613e-05 +261 618 8.634705252154682e-04 +261 619 4.800413127076819e-05 +261 620 -6.380257597881444e-06 +261 621 1.148247091500342e-06 +262 613 -6.335955594807439e-06 +262 614 1.984761106267393e-05 +262 615 -3.642594225309778e-05 +262 616 6.092043978103425e-05 +262 617 -1.104912573429494e-04 +262 618 3.849668443894379e-04 +262 619 7.076249207781966e-04 +262 620 -6.119691313296739e-05 +262 621 1.765275231247955e-05 +263 613 4.258276866271811e-06 +263 614 -1.316860931849008e-05 +263 615 2.343321932569621e-05 +263 616 -3.672666032321996e-05 +263 617 5.705134647633722e-05 +263 618 -9.844594048835909e-05 +263 619 5.028688547500419e-04 +263 620 5.376012869668873e-04 +263 621 -3.092742551649512e-07 +264 622 -3.092742551860220e-07 +264 623 5.376012869668853e-04 +264 624 5.028688547500802e-04 +264 625 -9.844594048838466e-05 +264 626 5.705134647635402e-05 +264 627 -3.672666032323149e-05 +264 628 2.343321932570412e-05 +264 629 -1.316860931849441e-05 +264 630 4.258276866272928e-06 +265 622 1.765275231248155e-05 +265 623 -6.119691313296398e-05 +265 624 7.076249207781894e-04 +265 625 3.849668443894406e-04 +265 626 -1.104912573429513e-04 +265 627 6.092043978103577e-05 +265 628 -3.642594225309932e-05 +265 629 1.984761106267455e-05 +265 630 -6.335955594807201e-06 +266 622 1.148247091500591e-06 +266 623 -6.380257597881387e-06 +266 624 4.800413127076800e-05 +266 625 8.634705252154630e-04 +266 626 8.525740288515152e-05 +266 627 -2.132703484628412e-05 +266 628 9.575317381086855e-06 +266 629 -4.563719592094293e-06 +266 630 1.377888192289874e-06 +267 622 -1.361668801094987e-05 +267 623 4.587104641601799e-05 +267 624 -1.034397545291350e-04 +267 625 3.790325123653978e-04 +267 626 7.486490616400436e-04 +267 627 -1.196774105566733e-04 +267 628 6.132507092317674e-05 +267 629 -3.133670432002659e-05 +267 630 9.755366072148513e-06 +268 622 9.755366072150124e-06 +268 623 -3.133670432002738e-05 +268 624 6.132507092317707e-05 +268 625 -1.196774105566787e-04 +268 626 7.486490616400322e-04 +268 627 3.790325123654190e-04 +268 628 -1.034397545291451e-04 +268 629 4.587104641602176e-05 +268 630 -1.361668801094901e-05 +269 622 1.377888192290369e-06 +269 623 -4.563719592095217e-06 +269 624 9.575317381088362e-06 +269 625 -2.132703484628715e-05 +269 626 8.525740288515598e-05 +269 627 8.634705252154671e-04 +269 628 4.800413127075965e-05 +269 629 -6.380257597878724e-06 +269 630 1.148247091499588e-06 +270 622 -6.335955594807579e-06 +270 623 1.984761106267301e-05 +270 624 -3.642594225309563e-05 +270 625 6.092043978103176e-05 +270 626 -1.104912573429458e-04 +270 627 3.849668443894371e-04 +270 628 7.076249207781903e-04 +270 629 -6.119691313296147e-05 +270 630 1.765275231247838e-05 +271 622 4.258276866271926e-06 +271 623 -1.316860931848955e-05 +271 624 2.343321932569495e-05 +271 625 -3.672666032321864e-05 +271 626 5.705134647633561e-05 +271 627 -9.844594048835711e-05 +271 628 5.028688547500257e-04 +271 629 5.376012869668987e-04 +271 630 -3.092742551615529e-07 +272 640 -3.092742551929372e-07 +272 641 5.376012869668840e-04 +272 642 5.028688547500922e-04 +272 643 -9.844594048839029e-05 +272 644 5.705134647635686e-05 +272 645 -3.672666032323326e-05 +272 646 2.343321932570524e-05 +272 647 -1.316860931849503e-05 +272 648 4.258276866273128e-06 +273 640 1.765275231248097e-05 +273 641 -6.119691313296228e-05 +273 642 7.076249207781998e-04 +273 643 3.849668443894271e-04 +273 644 -1.104912573429482e-04 +273 645 6.092043978103409e-05 +273 646 -3.642594225309832e-05 +273 647 1.984761106267399e-05 +273 648 -6.335955594807026e-06 +274 640 1.148247091500535e-06 +274 641 -6.380257597881370e-06 +274 642 4.800413127077085e-05 +274 643 8.634705252154559e-04 +274 644 8.525740288515723e-05 +274 645 -2.132703484628616e-05 +274 646 9.575317381087864e-06 +274 647 -4.563719592094799e-06 +274 648 1.377888192290030e-06 +275 640 -1.361668801095033e-05 +275 641 4.587104641601952e-05 +275 642 -1.034397545291384e-04 +275 643 3.790325123654045e-04 +275 644 7.486490616400427e-04 +275 645 -1.196774105566782e-04 +275 646 6.132507092317900e-05 +275 647 -3.133670432002772e-05 +275 648 9.755366072148862e-06 +276 640 9.755366072149913e-06 +276 641 -3.133670432002670e-05 +276 642 6.132507092317570e-05 +276 643 -1.196774105566759e-04 +276 644 7.486490616400404e-04 +276 645 3.790325123654072e-04 +276 646 -1.034397545291427e-04 +276 647 4.587104641602075e-05 +276 648 -1.361668801094871e-05 +277 640 1.377888192290382e-06 +277 641 -4.563719592095273e-06 +277 642 9.575317381088511e-06 +277 643 -2.132703484628766e-05 +277 644 8.525740288516002e-05 +277 645 8.634705252154594e-04 +277 646 4.800413127076440e-05 +277 647 -6.380257597879530e-06 +277 648 1.148247091499771e-06 +278 640 -6.335955594807386e-06 +278 641 1.984761106267240e-05 +278 642 -3.642594225309454e-05 +278 643 6.092043978102994e-05 +278 644 -1.104912573429426e-04 +278 645 3.849668443894234e-04 +278 646 7.076249207781990e-04 +278 647 -6.119691313295776e-05 +278 648 1.765275231247754e-05 +279 640 4.258276866272212e-06 +279 641 -1.316860931849043e-05 +279 642 2.343321932569651e-05 +279 643 -3.672666032322108e-05 +279 644 5.705134647633939e-05 +279 645 -9.844594048836383e-05 +279 646 5.028688547500297e-04 +279 647 5.376012869669073e-04 +279 648 -3.092742551697150e-07 +280 649 -3.092742551895355e-07 +280 650 5.376012869668955e-04 +280 651 5.028688547500763e-04 +280 652 -9.844594048838845e-05 +280 653 5.705134647635546e-05 +280 654 -3.672666032323224e-05 +280 655 2.343321932570455e-05 +280 656 -1.316860931849464e-05 +280 657 4.258276866273000e-06 +281 649 1.765275231247976e-05 +281 650 -6.119691313295629e-05 +281 651 7.076249207781934e-04 +281 652 3.849668443894266e-04 +281 653 -1.104912573429449e-04 +281 654 6.092043978103206e-05 +281 655 -3.642594225309704e-05 +281 656 1.984761106267329e-05 +281 657 -6.335955594806797e-06 +282 649 1.148247091500018e-06 +282 650 -6.380257597879412e-06 +282 651 4.800413127076388e-05 +282 652 8.634705252154597e-04 +282 653 8.525740288515994e-05 +282 654 -2.132703484628775e-05 +282 655 9.575317381088827e-06 +282 656 -4.563719592095326e-06 +282 657 1.377888192290199e-06 +283 649 -1.361668801095063e-05 +283 650 4.587104641602054e-05 +283 651 -1.034397545291406e-04 +283 652 3.790325123654113e-04 +283 653 7.486490616400392e-04 +283 654 -1.196774105566808e-04 +283 655 6.132507092318039e-05 +283 656 -3.133670432002843e-05 +283 657 9.755366072149082e-06 +284 649 9.755366072149738e-06 +284 650 -3.133670432002613e-05 +284 651 6.132507092317452e-05 +284 652 -1.196774105566731e-04 +284 653 7.486490616400352e-04 +284 654 3.790325123654096e-04 +284 655 -1.034397545291415e-04 +284 656 4.587104641602014e-05 +284 657 -1.361668801094852e-05 +285 649 1.377888192290044e-06 +285 650 -4.563719592094198e-06 +285 651 9.575317381086465e-06 +285 652 -2.132703484628394e-05 +285 653 8.525740288515039e-05 +285 654 8.634705252154587e-04 +285 655 4.800413127077443e-05 +285 656 -6.380257597882281e-06 +285 657 1.148247091500520e-06 +286 649 -6.335955594807552e-06 +286 650 1.984761106267291e-05 +286 651 -3.642594225309543e-05 +286 652 6.092043978103129e-05 +286 653 -1.104912573429444e-04 +286 654 3.849668443894155e-04 +286 655 7.076249207782128e-04 +286 656 -6.119691313296399e-05 +286 657 1.765275231247876e-05 +287 649 4.258276866272341e-06 +287 650 -1.316860931849082e-05 +287 651 2.343321932569720e-05 +287 652 -3.672666032322209e-05 +287 653 5.705134647634079e-05 +287 654 -9.844594048836568e-05 +287 655 5.028688547500455e-04 +287 656 5.376012869668958e-04 +287 657 -3.092742551731166e-07 +288 676 -3.092742551813871e-07 +288 677 5.376012869668868e-04 +288 678 5.028688547500724e-04 +288 679 -9.844594048838171e-05 +288 680 5.705134647635168e-05 +288 681 -3.672666032322980e-05 +288 682 2.343321932570299e-05 +288 683 -1.316860931849376e-05 +288 684 4.258276866272713e-06 +289 676 1.765275231248060e-05 +289 677 -6.119691313296002e-05 +289 678 7.076249207781846e-04 +289 679 3.849668443894403e-04 +289 680 -1.104912573429482e-04 +289 681 6.092043978103386e-05 +289 682 -3.642594225309814e-05 +289 683 1.984761106267389e-05 +289 684 -6.335955594806990e-06 +290 676 1.148247091500106e-06 +290 677 -6.380257597879567e-06 +290 678 4.800413127076159e-05 +290 679 8.634705252154681e-04 +290 680 8.525740288515250e-05 +290 681 -2.132703484628568e-05 +290 682 9.575317381087817e-06 +290 683 -4.563719592094816e-06 +290 684 1.377888192290042e-06 +291 676 -1.361668801095062e-05 +291 677 4.587104641602050e-05 +291 678 -1.034397545291406e-04 +291 679 3.790325123654164e-04 +291 680 7.486490616400343e-04 +291 681 -1.196774105566810e-04 +291 682 6.132507092318035e-05 +291 683 -3.133670432002839e-05 +291 684 9.755366072149069e-06 +292 676 9.755366072149523e-06 +292 677 -3.133670432002542e-05 +292 678 6.132507092317306e-05 +292 679 -1.196774105566697e-04 +292 680 7.486490616400283e-04 +292 681 3.790325123654138e-04 +292 682 -1.034397545291407e-04 +292 683 4.587104641601965e-05 +292 684 -1.361668801094836e-05 +293 676 1.377888192290017e-06 +293 677 -4.563719592094101e-06 +293 678 9.575317381086238e-06 +293 679 -2.132703484628328e-05 +293 680 8.525740288514605e-05 +293 681 8.634705252154680e-04 +293 682 4.800413127076815e-05 +293 683 -6.380257597881434e-06 +293 684 1.148247091500333e-06 +294 676 -6.335955594807807e-06 +294 677 1.984761106267372e-05 +294 678 -3.642594225309692e-05 +294 679 6.092043978103380e-05 +294 680 -1.104912573429491e-04 +294 681 3.849668443894376e-04 +294 682 7.076249207781966e-04 +294 683 -6.119691313296746e-05 +294 684 1.765275231247959e-05 +295 676 4.258276866272054e-06 +295 677 -1.316860931848994e-05 +295 678 2.343321932569563e-05 +295 679 -3.672666032321965e-05 +295 680 5.705134647633703e-05 +295 681 -9.844594048835894e-05 +295 682 5.028688547500415e-04 +295 683 5.376012869668872e-04 +295 684 -3.092742551649546e-07 +296 685 -3.092742551847888e-07 +296 686 5.376012869668754e-04 +296 687 5.028688547500883e-04 +296 688 -9.844594048838355e-05 +296 689 5.705134647635309e-05 +296 690 -3.672666032323082e-05 +296 691 2.343321932570367e-05 +296 692 -1.316860931849415e-05 +296 693 4.258276866272843e-06 +297 685 1.765275231248180e-05 +297 686 -6.119691313296600e-05 +297 687 7.076249207781909e-04 +297 688 3.849668443894408e-04 +297 689 -1.104912573429515e-04 +297 690 6.092043978103591e-05 +297 691 -3.642594225309942e-05 +297 692 1.984761106267460e-05 +297 693 -6.335955594807219e-06 +298 685 1.148247091500579e-06 +298 686 -6.380257597881322e-06 +298 687 4.800413127076768e-05 +298 688 8.634705252154683e-04 +298 689 8.525740288514599e-05 +298 690 -2.132703484628335e-05 +298 691 9.575317381086556e-06 +298 692 -4.563719592094155e-06 +298 693 1.377888192289833e-06 +299 685 -1.361668801095031e-05 +299 686 4.587104641601949e-05 +299 687 -1.034397545291386e-04 +299 688 3.790325123654167e-04 +299 689 7.486490616400292e-04 +299 690 -1.196774105566762e-04 +299 691 6.132507092317827e-05 +299 692 -3.133670432002739e-05 +299 693 9.755366072148762e-06 +300 685 9.755366072149814e-06 +300 686 -3.133670432002637e-05 +300 687 6.132507092317498e-05 +300 688 -1.196774105566738e-04 +300 689 7.486490616400270e-04 +300 690 3.790325123654194e-04 +300 691 -1.034397545291430e-04 +300 692 4.587104641602072e-05 +300 693 -1.361668801094869e-05 +301 685 1.377888192290017e-06 +301 686 -4.563719592094101e-06 +301 687 9.575317381086238e-06 +301 688 -2.132703484628328e-05 +301 689 8.525740288514605e-05 +301 690 8.634705252154680e-04 +301 691 4.800413127076815e-05 +301 692 -6.380257597881434e-06 +301 693 1.148247091500333e-06 +302 685 -6.335955594807902e-06 +302 686 1.984761106267402e-05 +302 687 -3.642594225309748e-05 +302 688 6.092043978103479e-05 +302 689 -1.104912573429510e-04 +302 690 3.849668443894437e-04 +302 691 7.076249207781900e-04 +302 692 -6.119691313296548e-05 +302 693 1.765275231247943e-05 +303 685 4.258276866271881e-06 +303 686 -1.316860931848941e-05 +303 687 2.343321932569469e-05 +303 688 -3.672666032321822e-05 +303 689 5.705134647633489e-05 +303 690 -9.844594048835530e-05 +303 691 5.028688547500248e-04 +303 692 5.376012869668981e-04 +303 693 -3.092742551614039e-07 +304 703 -3.092742551929372e-07 +304 704 5.376012869668840e-04 +304 705 5.028688547500922e-04 +304 706 -9.844594048839029e-05 +304 707 5.705134647635686e-05 +304 708 -3.672666032323326e-05 +304 709 2.343321932570524e-05 +304 710 -1.316860931849503e-05 +304 711 4.258276866273128e-06 +305 703 1.765275231248098e-05 +305 704 -6.119691313296253e-05 +305 705 7.076249207782072e-04 +305 706 3.849668443894188e-04 +305 707 -1.104912573429467e-04 +305 708 6.092043978103340e-05 +305 709 -3.642594225309794e-05 +305 710 1.984761106267380e-05 +305 711 -6.335955594806963e-06 +306 703 1.148247091500767e-06 +306 704 -6.380257597882176e-06 +306 705 4.800413127077390e-05 +306 706 8.634705252154589e-04 +306 707 8.525740288515033e-05 +306 708 -2.132703484628401e-05 +306 709 9.575317381086783e-06 +306 710 -4.563719592094250e-06 +306 711 1.377888192289860e-06 +307 703 -1.361668801094997e-05 +307 704 4.587104641601834e-05 +307 705 -1.034397545291360e-04 +307 706 3.790325123654043e-04 +307 707 7.486490616400367e-04 +307 708 -1.196774105566719e-04 +307 709 6.132507092317644e-05 +307 710 -3.133670432002649e-05 +307 711 9.755366072148488e-06 +308 703 9.755366072150294e-06 +308 704 -3.133670432002793e-05 +308 705 6.132507092317814e-05 +308 706 -1.196774105566808e-04 +308 707 7.486490616400274e-04 +308 708 3.790325123654264e-04 +308 709 -1.034397545291467e-04 +308 710 4.587104641602250e-05 +308 711 -1.361668801094923e-05 +309 703 1.377888192290121e-06 +309 704 -4.563719592094431e-06 +309 705 9.575317381086858e-06 +309 706 -2.132703484628437e-05 +309 707 8.525740288514904e-05 +309 708 8.634705252154699e-04 +309 709 4.800413127076295e-05 +309 710 -6.380257597880123e-06 +309 711 1.148247091499998e-06 +310 703 -6.335955594807330e-06 +310 704 1.984761106267224e-05 +310 705 -3.642594225309425e-05 +310 706 6.092043978102953e-05 +310 707 -1.104912573429422e-04 +310 708 3.849668443894297e-04 +310 709 7.076249207781914e-04 +310 710 -6.119691313295639e-05 +310 711 1.765275231247722e-05 +311 703 4.258276866272502e-06 +311 704 -1.316860931849132e-05 +311 705 2.343321932569810e-05 +311 706 -3.672666032322355e-05 +311 707 5.705134647634315e-05 +311 708 -9.844594048837007e-05 +311 709 5.028688547500453e-04 +311 710 5.376012869668922e-04 +311 711 -3.092742551662218e-07 +312 712 -3.092742551860458e-07 +312 713 5.376012869668803e-04 +312 714 5.028688547500921e-04 +312 715 -9.844594048839468e-05 +312 716 5.705134647635922e-05 +312 717 -3.672666032323470e-05 +312 718 2.343321932570614e-05 +312 719 -1.316860931849553e-05 +312 720 4.258276866273290e-06 +313 712 1.765275231247976e-05 +313 713 -6.119691313295629e-05 +313 714 7.076249207781934e-04 +313 715 3.849668443894266e-04 +313 716 -1.104912573429449e-04 +313 717 6.092043978103206e-05 +313 718 -3.642594225309704e-05 +313 719 1.984761106267329e-05 +313 720 -6.335955594806797e-06 +314 712 1.148247091500455e-06 +314 713 -6.380257597880909e-06 +314 714 4.800413127076746e-05 +314 715 8.634705252154610e-04 +314 716 8.525740288515430e-05 +314 717 -2.132703484628495e-05 +314 718 9.575317381087288e-06 +314 719 -4.563719592094518e-06 +314 720 1.377888192289945e-06 +315 712 -1.361668801095011e-05 +315 713 4.587104641601875e-05 +315 714 -1.034397545291364e-04 +315 715 3.790325123653981e-04 +315 716 7.486490616400474e-04 +315 717 -1.196774105566776e-04 +315 718 6.132507092317853e-05 +315 719 -3.133670432002745e-05 +315 720 9.755366072148774e-06 +316 712 9.755366072149913e-06 +316 713 -3.133670432002670e-05 +316 714 6.132507092317570e-05 +316 715 -1.196774105566759e-04 +316 716 7.486490616400404e-04 +316 717 3.790325123654072e-04 +316 718 -1.034397545291427e-04 +316 719 4.587104641602075e-05 +316 720 -1.361668801094871e-05 +317 712 1.377888192290635e-06 +317 713 -4.563719592096070e-06 +317 714 9.575317381089995e-06 +317 715 -2.132703484629022e-05 +317 716 8.525740288516508e-05 +317 717 8.634705252154590e-04 +317 718 4.800413127075991e-05 +317 719 -6.380257597877524e-06 +317 720 1.148247091499205e-06 +318 712 -6.335955594807274e-06 +318 713 1.984761106267205e-05 +318 714 -3.642594225309387e-05 +318 715 6.092043978102875e-05 +318 716 -1.104912573429401e-04 +318 717 3.849668443894154e-04 +318 718 7.076249207782052e-04 +318 719 -6.119691313295760e-05 +318 720 1.765275231247744e-05 +319 712 4.258276866272212e-06 +319 713 -1.316860931849043e-05 +319 714 2.343321932569651e-05 +319 715 -3.672666032322108e-05 +319 716 5.705134647633939e-05 +319 717 -9.844594048836383e-05 +319 718 5.028688547500297e-04 +319 719 5.376012869669073e-04 +319 720 -3.092742551697150e-07 +320 748 -3.092742551899048e-07 +320 749 5.376012869669017e-04 +320 750 5.028688547500667e-04 +320 751 -9.844594048838319e-05 +320 752 5.705134647635342e-05 +320 753 -3.672666032323113e-05 +320 754 2.343321932570390e-05 +320 755 -1.316860931849428e-05 +320 756 4.258276866272887e-06 +321 748 1.765275231248108e-05 +321 749 -6.119691313296082e-05 +321 750 7.076249207781784e-04 +321 751 3.849668443894490e-04 +321 752 -1.104912573429516e-04 +321 753 6.092043978103579e-05 +321 754 -3.642594225309930e-05 +321 755 1.984761106267453e-05 +321 756 -6.335955594807193e-06 +322 748 1.148247091499832e-06 +322 749 -6.380257597878612e-06 +322 750 4.800413127075915e-05 +322 751 8.634705252154674e-04 +322 752 8.525740288515594e-05 +322 753 -2.132703484628722e-05 +322 754 9.575317381088674e-06 +322 755 -4.563719592095270e-06 +322 756 1.377888192290185e-06 +323 748 -1.361668801095089e-05 +323 749 4.587104641602141e-05 +323 750 -1.034397545291427e-04 +323 751 3.790325123654226e-04 +323 752 7.486490616400302e-04 +323 753 -1.196774105566823e-04 +323 754 6.132507092318128e-05 +323 755 -3.133670432002890e-05 +323 756 9.755366072149233e-06 +324 748 9.755366072149696e-06 +324 749 -3.133670432002598e-05 +324 750 6.132507092317415e-05 +324 751 -1.196774105566717e-04 +324 752 7.486490616400339e-04 +324 753 3.790325123654099e-04 +324 754 -1.034397545291416e-04 +324 755 4.587104641602017e-05 +324 756 -1.361668801094853e-05 +325 748 1.377888192290029e-06 +325 749 -4.563719592094149e-06 +325 750 9.575317381086377e-06 +325 751 -2.132703484628378e-05 +325 752 8.525740288515018e-05 +325 753 8.634705252154602e-04 +325 754 4.800413127077295e-05 +325 755 -6.380257597882247e-06 +325 756 1.148247091500523e-06 +326 748 -6.335955594807817e-06 +326 749 1.984761106267375e-05 +326 750 -3.642594225309698e-05 +326 751 6.092043978103391e-05 +326 752 -1.104912573429493e-04 +326 753 3.849668443894325e-04 +326 754 7.076249207781991e-04 +326 755 -6.119691313296455e-05 +326 756 1.765275231247923e-05 +327 748 4.258276866272380e-06 +327 749 -1.316860931849094e-05 +327 750 2.343321932569739e-05 +327 751 -3.672666032322234e-05 +327 752 5.705134647634101e-05 +327 753 -9.844594048836494e-05 +327 754 5.028688547500365e-04 +327 755 5.376012869669052e-04 +327 756 -3.092742551742008e-07 +328 757 -3.092742551813871e-07 +328 758 5.376012869668868e-04 +328 759 5.028688547500724e-04 +328 760 -9.844594048838171e-05 +328 761 5.705134647635168e-05 +328 762 -3.672666032322980e-05 +328 763 2.343321932570299e-05 +328 764 -1.316860931849376e-05 +328 765 4.258276866272713e-06 +329 757 1.765275231248093e-05 +329 758 -6.119691313296146e-05 +329 759 7.076249207781963e-04 +329 760 3.849668443894297e-04 +329 761 -1.104912573429483e-04 +329 762 6.092043978103413e-05 +329 763 -3.642594225309835e-05 +329 764 1.984761106267401e-05 +329 765 -6.335955594807031e-06 +330 757 1.148247091500580e-06 +330 758 -6.380257597881370e-06 +330 759 4.800413127076919e-05 +330 760 8.634705252154667e-04 +330 761 8.525740288514631e-05 +330 762 -2.132703484628349e-05 +330 763 9.575317381086631e-06 +330 764 -4.563719592094196e-06 +330 765 1.377888192289846e-06 +331 757 -1.361668801095031e-05 +331 758 4.587104641601949e-05 +331 759 -1.034397545291386e-04 +331 760 3.790325123654167e-04 +331 761 7.486490616400292e-04 +331 762 -1.196774105566762e-04 +331 763 6.132507092317827e-05 +331 764 -3.133670432002739e-05 +331 765 9.755366072148762e-06 +332 757 9.755366072149774e-06 +332 758 -3.133670432002626e-05 +332 759 6.132507092317482e-05 +332 760 -1.196774105566738e-04 +332 761 7.486490616400332e-04 +332 762 3.790325123654123e-04 +332 763 -1.034397545291417e-04 +332 764 4.587104641602023e-05 +332 765 -1.361668801094855e-05 +333 757 1.377888192290010e-06 +333 758 -4.563719592094081e-06 +333 759 9.575317381086208e-06 +333 760 -2.132703484628328e-05 +333 761 8.525740288514732e-05 +333 762 8.634705252154666e-04 +333 763 4.800413127076841e-05 +333 764 -6.380257597881536e-06 +333 765 1.148247091500360e-06 +334 757 -6.335955594807790e-06 +334 758 1.984761106267366e-05 +334 759 -3.642594225309682e-05 +334 760 6.092043978103367e-05 +334 761 -1.104912573429489e-04 +334 762 3.849668443894374e-04 +334 763 7.076249207781950e-04 +334 764 -6.119691313296546e-05 +334 765 1.765275231247933e-05 +335 757 4.258276866272139e-06 +335 758 -1.316860931849020e-05 +335 759 2.343321932569608e-05 +335 760 -3.672666032322032e-05 +335 761 5.705134647633796e-05 +335 762 -9.844594048836004e-05 +335 763 5.028688547500335e-04 +335 764 5.376012869668970e-04 +335 765 -3.092742551661879e-07 +336 775 -3.092742551862321e-07 +336 776 5.376012869668832e-04 +336 777 5.028688547500849e-04 +336 778 -9.844594048838812e-05 +336 779 5.705134647635578e-05 +336 780 -3.672666032323256e-05 +336 781 2.343321932570478e-05 +336 782 -1.316860931849478e-05 +336 783 4.258276866273045e-06 +337 775 1.765275231248081e-05 +337 776 -6.119691313296079e-05 +337 777 7.076249207781877e-04 +337 778 3.849668443894383e-04 +337 779 -1.104912573429489e-04 +337 780 6.092043978103434e-05 +337 781 -3.642594225309844e-05 +337 782 1.984761106267406e-05 +337 783 -6.335955594807044e-06 +338 775 1.148247091499996e-06 +338 776 -6.380257597879242e-06 +338 777 4.800413127076175e-05 +338 778 8.634705252154658e-04 +338 779 8.525740288515502e-05 +338 780 -2.132703484628655e-05 +338 781 9.575317381088291e-06 +338 782 -4.563719592095068e-06 +338 783 1.377888192290121e-06 +339 775 -1.361668801095033e-05 +339 776 4.587104641601955e-05 +339 777 -1.034397545291385e-04 +339 778 3.790325123654105e-04 +339 779 7.486490616400362e-04 +339 780 -1.196774105566774e-04 +339 781 6.132507092317882e-05 +339 782 -3.133670432002765e-05 +339 783 9.755366072148840e-06 +340 775 9.755366072149875e-06 +340 776 -3.133670432002657e-05 +340 777 6.132507092317539e-05 +340 778 -1.196774105566747e-04 +340 779 7.486490616400300e-04 +340 780 3.790325123654171e-04 +340 781 -1.034397545291433e-04 +340 782 4.587104641602090e-05 +340 783 -1.361668801094874e-05 +341 775 1.377888192290087e-06 +341 776 -4.563719592094326e-06 +341 777 9.575317381086675e-06 +341 778 -2.132703484628411e-05 +341 779 8.525740288514880e-05 +341 780 8.634705252154660e-04 +341 781 4.800413127076761e-05 +341 782 -6.380257597880963e-06 +341 783 1.148247091500198e-06 +342 775 -6.335955594807635e-06 +342 776 1.984761106267318e-05 +342 777 -3.642594225309593e-05 +342 778 6.092043978103217e-05 +342 779 -1.104912573429462e-04 +342 780 3.849668443894308e-04 +342 781 7.076249207781978e-04 +342 782 -6.119691313296284e-05 +342 783 1.765275231247871e-05 +343 775 4.258276866272549e-06 +343 776 -1.316860931849146e-05 +343 777 2.343321932569833e-05 +343 778 -3.672666032322386e-05 +343 779 5.705134647634347e-05 +343 780 -9.844594048836974e-05 +343 781 5.028688547500539e-04 +343 782 5.376012869668798e-04 +343 783 -3.092742551629048e-07 +344 784 -3.092742551820071e-07 +344 785 5.376012869668633e-04 +344 786 5.028688547501047e-04 +344 787 -9.844594048839434e-05 +344 788 5.705134647635910e-05 +344 789 -3.672666032323465e-05 +344 790 2.343321932570611e-05 +344 791 -1.316860931849552e-05 +344 792 4.258276866273286e-06 +345 784 1.765275231248065e-05 +345 785 -6.119691313296108e-05 +345 786 7.076249207781955e-04 +345 787 3.849668443894294e-04 +345 788 -1.104912573429466e-04 +345 789 6.092043978103313e-05 +345 790 -3.642594225309773e-05 +345 791 1.984761106267367e-05 +345 792 -6.335955594806922e-06 +346 784 1.148247091500684e-06 +346 785 -6.380257597881661e-06 +346 786 4.800413127076899e-05 +346 787 8.634705252154657e-04 +346 788 8.525740288514709e-05 +346 789 -2.132703484628267e-05 +346 790 9.575317381086130e-06 +346 791 -4.563719592093928e-06 +346 792 1.377888192289762e-06 +347 784 -1.361668801094997e-05 +347 785 4.587104641601829e-05 +347 786 -1.034397545291355e-04 +347 787 3.790325123654009e-04 +347 788 7.486490616400430e-04 +347 789 -1.196774105566762e-04 +347 790 6.132507092317783e-05 +347 791 -3.133670432002708e-05 +347 792 9.755366072148661e-06 +348 784 9.755366072149801e-06 +348 785 -3.133670432002634e-05 +348 786 6.132507092317498e-05 +348 787 -1.196774105566745e-04 +348 788 7.486490616400361e-04 +348 789 3.790325123654101e-04 +348 790 -1.034397545291418e-04 +348 791 4.587104641602029e-05 +348 792 -1.361668801094857e-05 +349 784 1.377888192290453e-06 +349 785 -4.563719592095480e-06 +349 786 9.575317381088830e-06 +349 787 -2.132703484628794e-05 +349 788 8.525740288515784e-05 +349 789 8.634705252154636e-04 +349 790 4.800413127076144e-05 +349 791 -6.380257597878277e-06 +349 792 1.148247091499434e-06 +350 784 -6.335955594807523e-06 +350 785 1.984761106267283e-05 +350 786 -3.642594225309527e-05 +350 787 6.092043978103098e-05 +350 788 -1.104912573429437e-04 +350 789 3.849668443894227e-04 +350 790 7.076249207782041e-04 +350 791 -6.119691313296268e-05 +350 792 1.765275231247860e-05 +351 784 4.258276866272059e-06 +351 785 -1.316860931848995e-05 +351 786 2.343321932569566e-05 +351 787 -3.672666032321971e-05 +351 788 5.705134647633714e-05 +351 789 -9.844594048835929e-05 +351 790 5.028688547500290e-04 +351 791 5.376012869669042e-04 +351 792 -3.092742551690001e-07 +352 811 -3.092742551899048e-07 +352 812 5.376012869669017e-04 +352 813 5.028688547500667e-04 +352 814 -9.844594048838319e-05 +352 815 5.705134647635342e-05 +352 816 -3.672666032323113e-05 +352 817 2.343321932570390e-05 +352 818 -1.316860931849428e-05 +352 819 4.258276866272887e-06 +353 811 1.765275231248141e-05 +353 812 -6.119691313296218e-05 +353 813 7.076249207781860e-04 +353 814 3.849668443894426e-04 +353 815 -1.104912573429520e-04 +353 816 6.092043978103621e-05 +353 817 -3.642594225309960e-05 +353 818 1.984761106267470e-05 +353 819 -6.335955594807249e-06 +354 811 1.148247091500247e-06 +354 812 -6.380257597880164e-06 +354 813 4.800413127076541e-05 +354 814 8.634705252154644e-04 +354 815 8.525740288515273e-05 +354 816 -2.132703484628546e-05 +354 817 9.575317381087668e-06 +354 818 -4.563719592094736e-06 +354 819 1.377888192290016e-06 +355 811 -1.361668801095045e-05 +355 812 4.587104641601993e-05 +355 813 -1.034397545291394e-04 +355 814 3.790325123654136e-04 +355 815 7.486490616400341e-04 +355 816 -1.196774105566780e-04 +355 817 6.132507092317921e-05 +355 818 -3.133670432002786e-05 +355 819 9.755366072148906e-06 +356 811 9.755366072149958e-06 +356 812 -3.133670432002683e-05 +356 813 6.132507092317590e-05 +356 814 -1.196774105566757e-04 +356 815 7.486490616400317e-04 +356 816 3.790325123654163e-04 +356 817 -1.034397545291438e-04 +356 818 4.587104641602117e-05 +356 819 -1.361668801094883e-05 +357 811 1.377888192290200e-06 +357 812 -4.563719592094684e-06 +357 813 9.575317381087346e-06 +357 814 -2.132703484628538e-05 +357 815 8.525740288515278e-05 +357 816 8.634705252154641e-04 +357 817 4.800413127076593e-05 +357 818 -6.380257597880282e-06 +357 819 1.148247091499999e-06 +358 811 -6.335955594807806e-06 +358 812 1.984761106267372e-05 +358 813 -3.642594225309692e-05 +358 814 6.092043978103384e-05 +358 815 -1.104912573429492e-04 +358 816 3.849668443894398e-04 +358 817 7.076249207781917e-04 +358 818 -6.119691313296411e-05 +358 819 1.765275231247914e-05 +359 811 4.258276866272244e-06 +359 812 -1.316860931849052e-05 +359 813 2.343321932569666e-05 +359 814 -3.672666032322125e-05 +359 815 5.705134647633941e-05 +359 816 -9.844594048836260e-05 +359 817 5.028688547500332e-04 +359 818 5.376012869668996e-04 +359 819 -3.092742551667470e-07 +360 820 -3.092742551862321e-07 +360 821 5.376012869668832e-04 +360 822 5.028688547500849e-04 +360 823 -9.844594048838812e-05 +360 824 5.705134647635578e-05 +360 825 -3.672666032323256e-05 +360 826 2.343321932570478e-05 +360 827 -1.316860931849478e-05 +360 828 4.258276866273045e-06 +361 820 1.765275231248082e-05 +361 821 -6.119691313296120e-05 +361 822 7.076249207781985e-04 +361 823 3.849668443894259e-04 +361 824 -1.104912573429461e-04 +361 825 6.092043978103309e-05 +361 826 -3.642594225309777e-05 +361 827 1.984761106267371e-05 +361 828 -6.335955594806934e-06 +362 820 1.148247091499467e-06 +362 821 -6.380257597877453e-06 +362 822 4.800413127075934e-05 +362 823 8.634705252154631e-04 +362 824 8.525740288516074e-05 +362 825 -2.132703484628952e-05 +362 826 9.575317381089972e-06 +362 827 -4.563719592095961e-06 +362 828 1.377888192290403e-06 +363 820 -1.361668801095045e-05 +363 821 4.587104641601996e-05 +363 822 -1.034397545291396e-04 +363 823 3.790325123654138e-04 +363 824 7.486490616400337e-04 +363 825 -1.196774105566776e-04 +363 826 6.132507092317898e-05 +363 827 -3.133670432002776e-05 +363 828 9.755366072148876e-06 +364 820 9.755366072149801e-06 +364 821 -3.133670432002636e-05 +364 822 6.132507092317505e-05 +364 823 -1.196774105566745e-04 +364 824 7.486490616400387e-04 +364 825 3.790325123654067e-04 +364 826 -1.034397545291409e-04 +364 827 4.587104641602000e-05 +364 828 -1.361668801094849e-05 +365 820 1.377888192289811e-06 +365 821 -4.563719592093454e-06 +365 822 9.575317381085035e-06 +365 823 -2.132703484628127e-05 +365 824 8.525740288514467e-05 +365 825 8.634705252154656e-04 +365 826 4.800413127077178e-05 +365 827 -6.380257597882901e-06 +365 828 1.148247091500755e-06 +366 820 -6.335955594807682e-06 +366 821 1.984761106267333e-05 +366 822 -3.642594225309623e-05 +366 823 6.092043978103273e-05 +366 824 -1.104912573429475e-04 +366 825 3.849668443894348e-04 +366 826 7.076249207781946e-04 +366 827 -6.119691313296268e-05 +366 828 1.765275231247870e-05 +367 820 4.258276866272471e-06 +367 821 -1.316860931849122e-05 +367 822 2.343321932569791e-05 +367 823 -3.672666032322323e-05 +367 824 5.705134647634255e-05 +367 825 -9.844594048836837e-05 +367 826 5.028688547500516e-04 +367 827 5.376012869668860e-04 +367 828 -3.092742551676482e-07 +368 838 -3.092742551814887e-07 +368 839 5.376012869668769e-04 +368 840 5.028688547500872e-04 +368 841 -9.844594048838949e-05 +368 842 5.705134647635671e-05 +368 843 -3.672666032323319e-05 +368 844 2.343321932570520e-05 +368 845 -1.316860931849502e-05 +368 846 4.258276866273123e-06 +369 838 1.765275231248092e-05 +369 839 -6.119691313296121e-05 +369 840 7.076249207781890e-04 +369 841 3.849668443894380e-04 +369 842 -1.104912573429498e-04 +369 843 6.092043978103484e-05 +369 844 -3.642594225309872e-05 +369 845 1.984761106267421e-05 +369 846 -6.335955594807093e-06 +370 838 1.148247091500974e-06 +370 839 -6.380257597882685e-06 +370 840 4.800413127077105e-05 +370 841 8.634705252154672e-04 +370 842 8.525740288514337e-05 +370 843 -2.132703484628135e-05 +370 844 9.575317381085384e-06 +370 845 -4.563719592093528e-06 +370 846 1.377888192289635e-06 +371 838 -1.361668801095025e-05 +371 839 4.587104641601926e-05 +371 840 -1.034397545291378e-04 +371 841 3.790325123654111e-04 +371 842 7.486490616400348e-04 +371 843 -1.196774105566769e-04 +371 844 6.132507092317852e-05 +371 845 -3.133670432002748e-05 +371 846 9.755366072148791e-06 +372 838 9.755366072149892e-06 +372 839 -3.133670432002662e-05 +372 840 6.132507092317552e-05 +372 841 -1.196774105566751e-04 +372 842 7.486490616400339e-04 +372 843 3.790325123654132e-04 +372 844 -1.034397545291428e-04 +372 845 4.587104641602078e-05 +372 846 -1.361668801094871e-05 +373 838 1.377888192290306e-06 +373 839 -4.563719592095018e-06 +373 840 9.575317381087973e-06 +373 841 -2.132703484628647e-05 +373 842 8.525740288515507e-05 +373 843 8.634705252154654e-04 +373 844 4.800413127076227e-05 +373 845 -6.380257597879347e-06 +373 846 1.148247091499750e-06 +374 838 -6.335955594807633e-06 +374 839 1.984761106267318e-05 +374 840 -3.642594225309595e-05 +374 841 6.092043978103224e-05 +374 842 -1.104912573429465e-04 +374 843 3.849668443894350e-04 +374 844 7.076249207781934e-04 +374 845 -6.119691313296226e-05 +374 846 1.765275231247859e-05 +375 838 4.258276866272336e-06 +375 839 -1.316860931849081e-05 +375 840 2.343321932569716e-05 +375 841 -3.672666032322203e-05 +375 842 5.705134647634064e-05 +375 843 -9.844594048836489e-05 +375 844 5.028688547500406e-04 +375 845 5.376012869668888e-04 +375 846 -3.092742551616546e-07 +376 847 -3.092742551867505e-07 +376 848 5.376012869668695e-04 +376 849 5.028688547501024e-04 +376 850 -9.844594048839296e-05 +376 851 5.705134647635818e-05 +376 852 -3.672666032323402e-05 +376 853 2.343321932570569e-05 +376 854 -1.316860931849528e-05 +376 855 4.258276866273208e-06 +377 847 1.765275231248065e-05 +377 848 -6.119691313296108e-05 +377 849 7.076249207781955e-04 +377 850 3.849668443894294e-04 +377 851 -1.104912573429466e-04 +377 852 6.092043978103313e-05 +377 853 -3.642594225309773e-05 +377 854 1.984761106267367e-05 +377 855 -6.335955594806922e-06 +378 847 1.148247091500274e-06 +378 848 -6.380257597880262e-06 +378 849 4.800413127076567e-05 +378 850 8.634705252154630e-04 +378 851 8.525740288515398e-05 +378 852 -2.132703484628545e-05 +378 853 9.575317381087634e-06 +378 854 -4.563719592094714e-06 +378 855 1.377888192290008e-06 +379 847 -1.361668801095019e-05 +379 848 4.587104641601906e-05 +379 849 -1.034397545291372e-04 +379 850 3.790325123654034e-04 +379 851 7.486490616400423e-04 +379 852 -1.196774105566774e-04 +379 853 6.132507092317865e-05 +379 854 -3.133670432002754e-05 +379 855 9.755366072148803e-06 +380 847 9.755366072149926e-06 +380 848 -3.133670432002673e-05 +380 849 6.132507092317568e-05 +380 850 -1.196774105566752e-04 +380 851 7.486490616400315e-04 +380 852 3.790325123654165e-04 +380 853 -1.034397545291439e-04 +380 854 4.587104641602118e-05 +380 855 -1.361668801094883e-05 +381 847 1.377888192290347e-06 +381 848 -4.563719592095153e-06 +381 849 9.575317381088257e-06 +381 850 -2.132703484628703e-05 +381 851 8.525740288515605e-05 +381 852 8.634705252154616e-04 +381 853 4.800413127076582e-05 +381 854 -6.380257597879611e-06 +381 855 1.148247091499789e-06 +382 847 -6.335955594807572e-06 +382 848 1.984761106267298e-05 +382 849 -3.642594225309555e-05 +382 850 6.092043978103148e-05 +382 851 -1.104912573429447e-04 +382 852 3.849668443894225e-04 +382 853 7.076249207782053e-04 +382 854 -6.119691313296310e-05 +382 855 1.765275231247872e-05 +383 847 4.258276866272258e-06 +383 848 -1.316860931849057e-05 +383 849 2.343321932569675e-05 +383 850 -3.672666032322140e-05 +383 851 5.705134647633972e-05 +383 852 -9.844594048836352e-05 +383 853 5.028688547500382e-04 +383 854 5.376012869668950e-04 +383 855 -3.092742551663980e-07 +384 892 -3.092742551853546e-07 +384 893 5.376012869668780e-04 +384 894 5.028688547500880e-04 +384 895 -9.844594048838629e-05 +384 896 5.705134647635461e-05 +384 897 -3.672666032323177e-05 +384 898 2.343321932570427e-05 +384 899 -1.316860931849448e-05 +384 900 4.258276866272951e-06 +385 892 1.765275231248138e-05 +385 893 -6.119691313296388e-05 +385 894 7.076249207781910e-04 +385 895 3.849668443894383e-04 +385 896 -1.104912573429502e-04 +385 897 6.092043978103519e-05 +385 898 -3.642594225309898e-05 +385 899 1.984761106267436e-05 +385 900 -6.335955594807142e-06 +386 892 1.148247091500247e-06 +386 893 -6.380257597880164e-06 +386 894 4.800413127076541e-05 +386 895 8.634705252154644e-04 +386 896 8.525740288515273e-05 +386 897 -2.132703484628546e-05 +386 898 9.575317381087668e-06 +386 899 -4.563719592094736e-06 +386 900 1.377888192290016e-06 +387 892 -1.361668801095014e-05 +387 893 4.587104641601892e-05 +387 894 -1.034397545291371e-04 +387 895 3.790325123654068e-04 +387 896 7.486490616400376e-04 +387 897 -1.196774105566754e-04 +387 898 6.132507092317784e-05 +387 899 -3.133670432002715e-05 +387 900 9.755366072148686e-06 +388 892 9.755366072150021e-06 +388 893 -3.133670432002704e-05 +388 894 6.132507092317636e-05 +388 895 -1.196774105566771e-04 +388 896 7.486490616400326e-04 +388 897 3.790325123654169e-04 +388 898 -1.034397545291440e-04 +388 899 4.587104641602131e-05 +388 900 -1.361668801094887e-05 +389 892 1.377888192290200e-06 +389 893 -4.563719592094684e-06 +389 894 9.575317381087346e-06 +389 895 -2.132703484628538e-05 +389 896 8.525740288515278e-05 +389 897 8.634705252154641e-04 +389 898 4.800413127076593e-05 +389 899 -6.380257597880282e-06 +389 900 1.148247091499999e-06 +390 892 -6.335955594807838e-06 +390 893 1.984761106267381e-05 +390 894 -3.642594225309709e-05 +390 895 6.092043978103410e-05 +390 896 -1.104912573429496e-04 +390 897 3.849668443894394e-04 +390 898 7.076249207781918e-04 +390 899 -6.119691313296364e-05 +390 900 1.765275231247919e-05 +391 892 4.258276866272098e-06 +391 893 -1.316860931849007e-05 +391 894 2.343321932569586e-05 +391 895 -3.672666032321997e-05 +391 896 5.705134647633735e-05 +391 897 -9.844594048835858e-05 +391 898 5.028688547500200e-04 +391 899 5.376012869669135e-04 +391 900 -3.092742551700843e-07 +392 901 -3.092742551888206e-07 +392 902 5.376012869668924e-04 +392 903 5.028688547500756e-04 +392 904 -9.844594048838389e-05 +392 905 5.705134647635321e-05 +392 906 -3.672666032323087e-05 +392 907 2.343321932570369e-05 +392 908 -1.316860931849416e-05 +392 909 4.258276866272847e-06 +393 901 1.765275231248082e-05 +393 902 -6.119691313296120e-05 +393 903 7.076249207781985e-04 +393 904 3.849668443894259e-04 +393 905 -1.104912573429461e-04 +393 906 6.092043978103309e-05 +393 907 -3.642594225309777e-05 +393 908 1.984761106267371e-05 +393 909 -6.335955594806934e-06 +394 901 1.148247091499467e-06 +394 902 -6.380257597877453e-06 +394 903 4.800413127075934e-05 +394 904 8.634705252154631e-04 +394 905 8.525740288516074e-05 +394 906 -2.132703484628952e-05 +394 907 9.575317381089972e-06 +394 908 -4.563719592095961e-06 +394 909 1.377888192290403e-06 +395 901 -1.361668801095045e-05 +395 902 4.587104641601996e-05 +395 903 -1.034397545291396e-04 +395 904 3.790325123654138e-04 +395 905 7.486490616400337e-04 +395 906 -1.196774105566776e-04 +395 907 6.132507092317898e-05 +395 908 -3.133670432002776e-05 +395 909 9.755366072148876e-06 +396 901 9.755366072149801e-06 +396 902 -3.133670432002636e-05 +396 903 6.132507092317505e-05 +396 904 -1.196774105566745e-04 +396 905 7.486490616400387e-04 +396 906 3.790325123654067e-04 +396 907 -1.034397545291409e-04 +396 908 4.587104641602000e-05 +396 909 -1.361668801094849e-05 +397 901 1.377888192289946e-06 +397 902 -4.563719592093876e-06 +397 903 9.575317381085811e-06 +397 904 -2.132703484628259e-05 +397 905 8.525740288514712e-05 +397 906 8.634705252154654e-04 +397 907 4.800413127076948e-05 +397 908 -6.380257597881783e-06 +397 909 1.148247091500438e-06 +398 901 -6.335955594807511e-06 +398 902 1.984761106267279e-05 +398 903 -3.642594225309523e-05 +398 904 6.092043978103102e-05 +398 905 -1.104912573429442e-04 +398 906 3.849668443894262e-04 +398 907 7.076249207782011e-04 +398 908 -6.119691313296254e-05 +398 909 1.765275231247843e-05 +399 901 4.258276866272420e-06 +399 902 -1.316860931849107e-05 +399 903 2.343321932569766e-05 +399 904 -3.672666032322285e-05 +399 905 5.705134647634210e-05 +399 906 -9.844594048836835e-05 +399 907 5.028688547500557e-04 +399 908 5.376012869668814e-04 +399 909 -3.092742551669197e-07 +400 919 -3.092742551814887e-07 +400 920 5.376012869668769e-04 +400 921 5.028688547500872e-04 +400 922 -9.844594048838949e-05 +400 923 5.705134647635671e-05 +400 924 -3.672666032323319e-05 +400 925 2.343321932570520e-05 +400 926 -1.316860931849502e-05 +400 927 4.258276866273123e-06 +401 919 1.765275231248093e-05 +401 920 -6.119691313296138e-05 +401 921 7.076249207781922e-04 +401 922 3.849668443894340e-04 +401 923 -1.104912573429486e-04 +401 924 6.092043978103428e-05 +401 925 -3.642594225309843e-05 +401 926 1.984761106267406e-05 +401 927 -6.335955594807046e-06 +402 919 1.148247091500443e-06 +402 920 -6.380257597880841e-06 +402 921 4.800413127076712e-05 +402 922 8.634705252154662e-04 +402 923 8.525740288514875e-05 +402 924 -2.132703484628418e-05 +402 925 9.575317381086990e-06 +402 926 -4.563719592094381e-06 +402 927 1.377888192289904e-06 +403 919 -1.361668801095036e-05 +403 920 4.587104641601967e-05 +403 921 -1.034397545291389e-04 +403 922 3.790325123654144e-04 +403 923 7.486490616400323e-04 +403 924 -1.196774105566770e-04 +403 925 6.132507092317868e-05 +403 926 -3.133670432002759e-05 +403 927 9.755366072148825e-06 +404 919 9.755366072149892e-06 +404 920 -3.133670432002662e-05 +404 921 6.132507092317552e-05 +404 922 -1.196774105566751e-04 +404 923 7.486490616400339e-04 +404 924 3.790325123654132e-04 +404 925 -1.034397545291428e-04 +404 926 4.587104641602078e-05 +404 927 -1.361668801094871e-05 +405 919 1.377888192290306e-06 +405 920 -4.563719592095018e-06 +405 921 9.575317381087973e-06 +405 922 -2.132703484628647e-05 +405 923 8.525740288515507e-05 +405 924 8.634705252154654e-04 +405 925 4.800413127076227e-05 +405 926 -6.380257597879347e-06 +405 927 1.148247091499750e-06 +406 919 -6.335955594807633e-06 +406 920 1.984761106267318e-05 +406 921 -3.642594225309595e-05 +406 922 6.092043978103224e-05 +406 923 -1.104912573429465e-04 +406 924 3.849668443894350e-04 +406 925 7.076249207781934e-04 +406 926 -6.119691313296226e-05 +406 927 1.765275231247859e-05 +407 919 4.258276866272258e-06 +407 920 -1.316860931849057e-05 +407 921 2.343321932569675e-05 +407 922 -3.672666032322140e-05 +407 923 5.705134647633972e-05 +407 924 -9.844594048836352e-05 +407 925 5.028688547500382e-04 +407 926 5.376012869668950e-04 +407 927 -3.092742551663980e-07 +408 928 -3.092742551874654e-07 +408 929 5.376012869668930e-04 +408 930 5.028688547500769e-04 +408 931 -9.844594048838923e-05 +408 932 5.705134647635672e-05 +408 933 -3.672666032323323e-05 +408 934 2.343321932570524e-05 +408 935 -1.316860931849504e-05 +408 936 4.258276866273130e-06 +409 928 1.765275231248067e-05 +409 929 -6.119691313295921e-05 +409 930 7.076249207781872e-04 +409 931 3.849668443894378e-04 +409 932 -1.104912573429496e-04 +409 933 6.092043978103470e-05 +409 934 -3.642594225309864e-05 +409 935 1.984761106267416e-05 +409 936 -6.335955594807076e-06 +410 928 1.148247091500564e-06 +410 929 -6.380257597881289e-06 +410 930 4.800413127076774e-05 +410 931 8.634705252154645e-04 +410 932 8.525740288515028e-05 +410 933 -2.132703484628413e-05 +410 934 9.575317381086889e-06 +410 935 -4.563719592094315e-06 +410 936 1.377888192289882e-06 +411 928 -1.361668801095064e-05 +411 929 4.587104641602057e-05 +411 930 -1.034397545291408e-04 +411 931 3.790325123654173e-04 +411 932 7.486490616400327e-04 +411 933 -1.196774105566800e-04 +411 934 6.132507092318020e-05 +411 935 -3.133670432002835e-05 +411 936 9.755366072149060e-06 +412 928 9.755366072149863e-06 +412 929 -3.133670432002652e-05 +412 930 6.132507092317522e-05 +412 931 -1.196774105566739e-04 +412 932 7.486490616400306e-04 +412 933 3.790325123654160e-04 +412 934 -1.034397545291436e-04 +412 935 4.587104641602104e-05 +412 936 -1.361668801094878e-05 +413 928 1.377888192290347e-06 +413 929 -4.563719592095153e-06 +413 930 9.575317381088257e-06 +413 931 -2.132703484628703e-05 +413 932 8.525740288515605e-05 +413 933 8.634705252154616e-04 +413 934 4.800413127076582e-05 +413 935 -6.380257597879611e-06 +413 936 1.148247091499789e-06 +414 928 -6.335955594807323e-06 +414 929 1.984761106267220e-05 +414 930 -3.642594225309416e-05 +414 931 6.092043978102925e-05 +414 932 -1.104912573429410e-04 +414 933 3.849668443894151e-04 +414 934 7.076249207782065e-04 +414 935 -6.119691313295802e-05 +414 936 1.765275231247755e-05 +415 928 4.258276866272544e-06 +415 929 -1.316860931849145e-05 +415 930 2.343321932569831e-05 +415 931 -3.672666032322383e-05 +415 932 5.705134647634349e-05 +415 933 -9.844594048837024e-05 +415 934 5.028688547500422e-04 +415 935 5.376012869669037e-04 +415 936 -3.092742551745600e-07 +416 955 -3.092742551812380e-07 +416 956 5.376012869668863e-04 +416 957 5.028688547500715e-04 +416 958 -9.844594048837989e-05 +416 959 5.705134647635096e-05 +416 960 -3.672666032322938e-05 +416 961 2.343321932570273e-05 +416 962 -1.316860931849361e-05 +416 963 4.258276866272669e-06 +417 955 1.765275231248133e-05 +417 956 -6.119691313296284e-05 +417 957 7.076249207781802e-04 +417 958 3.849668443894492e-04 +417 959 -1.104912573429517e-04 +417 960 6.092043978103593e-05 +417 961 -3.642594225309939e-05 +417 962 1.984761106267458e-05 +417 963 -6.335955594807210e-06 +418 955 1.148247091500060e-06 +418 956 -6.380257597879364e-06 +418 957 4.800413127076068e-05 +418 958 8.634705252154721e-04 +418 959 8.525740288514870e-05 +418 960 -2.132703484628494e-05 +418 961 9.575317381087515e-06 +418 962 -4.563719592094680e-06 +418 963 1.377888192290002e-06 +419 955 -1.361668801095026e-05 +419 956 4.587104641601935e-05 +419 957 -1.034397545291383e-04 +419 958 3.790325123654162e-04 +419 959 7.486490616400285e-04 +419 960 -1.196774105566748e-04 +419 961 6.132507092317781e-05 +419 962 -3.133670432002718e-05 +419 963 9.755366072148700e-06 +420 955 9.755366072150146e-06 +420 956 -3.133670432002743e-05 +420 957 6.132507092317707e-05 +420 958 -1.196774105566779e-04 +420 959 7.486490616400280e-04 +420 960 3.790325123654233e-04 +420 961 -1.034397545291462e-04 +420 962 4.587104641602220e-05 +420 963 -1.361668801094913e-05 +421 955 1.377888192290369e-06 +421 956 -4.563719592095217e-06 +421 957 9.575317381088362e-06 +421 958 -2.132703484628715e-05 +421 959 8.525740288515598e-05 +421 960 8.634705252154671e-04 +421 961 4.800413127075965e-05 +421 962 -6.380257597878724e-06 +421 963 1.148247091499588e-06 +422 955 -6.335955594807562e-06 +422 956 1.984761106267296e-05 +422 957 -3.642594225309555e-05 +422 958 6.092043978103163e-05 +422 959 -1.104912573429456e-04 +422 960 3.849668443894369e-04 +422 961 7.076249207781887e-04 +422 962 -6.119691313295947e-05 +422 963 1.765275231247813e-05 +423 955 4.258276866272143e-06 +423 956 -1.316860931849021e-05 +423 957 2.343321932569611e-05 +423 958 -3.672666032322039e-05 +423 959 5.705134647633808e-05 +423 960 -9.844594048836038e-05 +423 961 5.028688547500208e-04 +423 962 5.376012869669141e-04 +423 963 -3.092742551702333e-07 +424 964 -3.092742551888206e-07 +424 965 5.376012869668924e-04 +424 966 5.028688547500756e-04 +424 967 -9.844594048838389e-05 +424 968 5.705134647635321e-05 +424 969 -3.672666032323087e-05 +424 970 2.343321932570369e-05 +424 971 -1.316860931849416e-05 +424 972 4.258276866272847e-06 +425 964 1.765275231248049e-05 +425 965 -6.119691313295960e-05 +425 966 7.076249207781834e-04 +425 967 3.849668443894406e-04 +425 968 -1.104912573429472e-04 +425 969 6.092043978103337e-05 +425 970 -3.642594225309785e-05 +425 971 1.984761106267374e-05 +425 972 -6.335955594806941e-06 +426 964 1.148247091499498e-06 +426 965 -6.380257597877331e-06 +426 966 4.800413127075473e-05 +426 967 8.634705252154732e-04 +426 968 8.525740288515356e-05 +426 969 -2.132703484628734e-05 +426 970 9.575317381088908e-06 +426 971 -4.563719592095428e-06 +426 972 1.377888192290239e-06 +427 964 -1.361668801095018e-05 +427 965 4.587104641601907e-05 +427 966 -1.034397545291376e-04 +427 967 3.790325123654128e-04 +427 968 7.486490616400322e-04 +427 969 -1.196774105566756e-04 +427 970 6.132507092317791e-05 +427 971 -3.133670432002719e-05 +427 972 9.755366072148700e-06 +428 964 9.755366072149723e-06 +428 965 -3.133670432002610e-05 +428 966 6.132507092317451e-05 +428 967 -1.196774105566733e-04 +428 968 7.486490616400317e-04 +428 969 3.790325123654129e-04 +428 970 -1.034397545291410e-04 +428 971 4.587104641601995e-05 +428 972 -1.361668801094847e-05 +429 964 1.377888192289932e-06 +429 965 -4.563719592093822e-06 +429 966 9.575317381085662e-06 +429 967 -2.132703484628208e-05 +429 968 8.525740288514308e-05 +429 969 8.634705252154732e-04 +429 970 4.800413127076475e-05 +429 971 -6.380257597880977e-06 +429 972 1.148247091500254e-06 +430 964 -6.335955594807579e-06 +430 965 1.984761106267301e-05 +430 966 -3.642594225309563e-05 +430 967 6.092043978103176e-05 +430 968 -1.104912573429458e-04 +430 969 3.849668443894371e-04 +430 970 7.076249207781903e-04 +430 971 -6.119691313296147e-05 +430 972 1.765275231247838e-05 +431 964 4.258276866272217e-06 +431 965 -1.316860931849044e-05 +431 966 2.343321932569653e-05 +431 967 -3.672666032322111e-05 +431 968 5.705134647633938e-05 +431 969 -9.844594048836333e-05 +431 970 5.028688547500414e-04 +431 971 5.376012869668835e-04 +431 972 -3.092742551580598e-07 +432 982 -3.092742551908908e-07 +432 983 5.376012869668767e-04 +432 984 5.028688547501045e-04 +432 985 -9.844594048840109e-05 +432 986 5.705134647636332e-05 +432 987 -3.672666032323746e-05 +432 988 2.343321932570794e-05 +432 989 -1.316860931849656e-05 +432 990 4.258276866273621e-06 +433 982 1.765275231247976e-05 +433 983 -6.119691313295629e-05 +433 984 7.076249207781934e-04 +433 985 3.849668443894266e-04 +433 986 -1.104912573429449e-04 +433 987 6.092043978103206e-05 +433 988 -3.642594225309704e-05 +433 989 1.984761106267329e-05 +433 990 -6.335955594806797e-06 +434 982 1.148247091500470e-06 +434 983 -6.380257597880943e-06 +434 984 4.800413127076739e-05 +434 985 8.634705252154648e-04 +434 986 8.525740288515002e-05 +434 987 -2.132703484628417e-05 +434 988 9.575317381086956e-06 +434 989 -4.563719592094359e-06 +434 990 1.377888192289897e-06 +435 982 -1.361668801095023e-05 +435 983 4.587104641601919e-05 +435 984 -1.034397545291376e-04 +435 985 3.790325123654073e-04 +435 986 7.486490616400384e-04 +435 987 -1.196774105566770e-04 +435 988 6.132507092317852e-05 +435 989 -3.133670432002747e-05 +435 990 9.755366072148788e-06 +436 982 9.755366072149814e-06 +436 983 -3.133670432002637e-05 +436 984 6.132507092317498e-05 +436 985 -1.196774105566738e-04 +436 986 7.486490616400270e-04 +436 987 3.790325123654194e-04 +436 988 -1.034397545291430e-04 +436 989 4.587104641602072e-05 +436 990 -1.361668801094869e-05 +437 982 1.377888192290439e-06 +437 983 -4.563719592095424e-06 +437 984 9.575317381088681e-06 +437 985 -2.132703484628741e-05 +437 986 8.525740288515380e-05 +437 987 8.634705252154715e-04 +437 988 4.800413127075670e-05 +437 989 -6.380257597877477e-06 +437 990 1.148247091499251e-06 +438 982 -6.335955594807467e-06 +438 983 1.984761106267266e-05 +438 984 -3.642594225309497e-05 +438 985 6.092043978103058e-05 +438 986 -1.104912573429433e-04 +438 987 3.849668443894291e-04 +438 988 7.076249207781965e-04 +438 989 -6.119691313296131e-05 +438 990 1.765275231247828e-05 +439 982 4.258276866271926e-06 +439 983 -1.316860931848955e-05 +439 984 2.343321932569495e-05 +439 985 -3.672666032321864e-05 +439 986 5.705134647633561e-05 +439 987 -9.844594048835711e-05 +439 988 5.028688547500257e-04 +439 989 5.376012869668987e-04 +439 990 -3.092742551615529e-07 +440 991 -3.092742551956138e-07 +440 992 5.376012869669017e-04 +440 993 5.028688547500809e-04 +440 994 -9.844594048839597e-05 +440 995 5.705134647636049e-05 +440 996 -3.672666032323567e-05 +440 997 2.343321932570680e-05 +440 998 -1.316860931849592e-05 +440 999 4.258276866273416e-06 +441 991 1.765275231247951e-05 +441 992 -6.119691313295427e-05 +441 993 7.076249207781918e-04 +441 994 3.849668443894264e-04 +441 995 -1.104912573429447e-04 +441 996 6.092043978103192e-05 +441 997 -3.642594225309695e-05 +441 998 1.984761106267323e-05 +441 999 -6.335955594806780e-06 +442 991 1.148247091500018e-06 +442 992 -6.380257597879412e-06 +442 993 4.800413127076388e-05 +442 994 8.634705252154597e-04 +442 995 8.525740288515994e-05 +442 996 -2.132703484628775e-05 +442 997 9.575317381088827e-06 +442 998 -4.563719592095326e-06 +442 999 1.377888192290199e-06 +443 991 -1.361668801095096e-05 +443 992 4.587104641602162e-05 +443 993 -1.034397545291429e-04 +443 994 3.790325123654169e-04 +443 995 7.486490616400379e-04 +443 996 -1.196774105566849e-04 +443 997 6.132507092318230e-05 +443 998 -3.133670432002937e-05 +443 999 9.755366072149374e-06 +444 991 9.755366072149540e-06 +444 992 -3.133670432002547e-05 +444 993 6.132507092317314e-05 +444 994 -1.196774105566696e-04 +444 995 7.486490616400345e-04 +444 996 3.790325123654071e-04 +444 997 -1.034397545291403e-04 +444 998 4.587104641601956e-05 +444 999 -1.361668801094834e-05 +445 991 1.377888192290065e-06 +445 992 -4.563719592094262e-06 +445 993 9.575317381086570e-06 +445 994 -2.132703484628406e-05 +445 995 8.525740288515033e-05 +445 996 8.634705252154642e-04 +445 997 4.800413127076823e-05 +445 998 -6.380257597881400e-06 +445 999 1.148247091500316e-06 +446 991 -6.335955594807902e-06 +446 992 1.984761106267402e-05 +446 993 -3.642594225309748e-05 +446 994 6.092043978103479e-05 +446 995 -1.104912573429510e-04 +446 996 3.849668443894437e-04 +446 997 7.076249207781900e-04 +446 998 -6.119691313296548e-05 +446 999 1.765275231247943e-05 +447 991 4.258276866271881e-06 +447 992 -1.316860931848941e-05 +447 993 2.343321932569469e-05 +447 994 -3.672666032321822e-05 +447 995 5.705134647633489e-05 +447 996 -9.844594048835530e-05 +447 997 5.028688547500248e-04 +447 998 5.376012869668981e-04 +447 999 -3.092742551614039e-07 +448 1027 -3.092742551929372e-07 +448 1028 5.376012869668840e-04 +448 1029 5.028688547500922e-04 +448 1030 -9.844594048839029e-05 +448 1031 5.705134647635686e-05 +448 1032 -3.672666032323326e-05 +448 1033 2.343321932570524e-05 +448 1034 -1.316860931849503e-05 +448 1035 4.258276866273128e-06 +449 1027 1.765275231248066e-05 +449 1028 -6.119691313296132e-05 +449 1029 7.076249207782028e-04 +449 1030 3.849668443894211e-04 +449 1031 -1.104912573429451e-04 +449 1032 6.092043978103242e-05 +449 1033 -3.642594225309735e-05 +449 1034 1.984761106267347e-05 +449 1035 -6.335955594806859e-06 +450 1027 1.148247091500020e-06 +450 1028 -6.380257597879466e-06 +450 1029 4.800413127076540e-05 +450 1030 8.634705252154580e-04 +450 1031 8.525740288516025e-05 +450 1032 -2.132703484628789e-05 +450 1033 9.575317381088901e-06 +450 1034 -4.563719592095367e-06 +450 1035 1.377888192290212e-06 +451 1027 -1.361668801095065e-05 +451 1028 4.587104641602059e-05 +451 1029 -1.034397545291406e-04 +451 1030 3.790325123654101e-04 +451 1031 7.486490616400414e-04 +451 1032 -1.196774105566823e-04 +451 1033 6.132507092318092e-05 +451 1034 -3.133670432002866e-05 +451 1035 9.755366072149154e-06 +452 1027 9.755366072149562e-06 +452 1028 -3.133670432002557e-05 +452 1029 6.132507092317343e-05 +452 1030 -1.196774105566710e-04 +452 1031 7.486490616400413e-04 +452 1032 3.790325123654006e-04 +452 1033 -1.034397545291393e-04 +452 1034 4.587104641601922e-05 +452 1035 -1.361668801094825e-05 +453 1027 1.377888192290024e-06 +453 1028 -4.563719592094135e-06 +453 1029 9.575317381086357e-06 +453 1030 -2.132703484628379e-05 +453 1031 8.525740288515135e-05 +453 1032 8.634705252154589e-04 +453 1033 4.800413127077318e-05 +453 1034 -6.380257597882336e-06 +453 1035 1.148247091500547e-06 +454 1027 -6.335955594807845e-06 +454 1028 1.984761106267383e-05 +454 1029 -3.642594225309711e-05 +454 1030 6.092043978103408e-05 +454 1031 -1.104912573429493e-04 +454 1032 3.849668443894310e-04 +454 1033 7.076249207782026e-04 +454 1034 -6.119691313296682e-05 +454 1035 1.765275231247966e-05 +455 1027 4.258276866272139e-06 +455 1028 -1.316860931849020e-05 +455 1029 2.343321932569608e-05 +455 1030 -3.672666032322032e-05 +455 1031 5.705134647633796e-05 +455 1032 -9.844594048836004e-05 +455 1033 5.028688547500335e-04 +455 1034 5.376012869668970e-04 +455 1035 -3.092742551661879e-07 +456 1036 -3.092742551855036e-07 +456 1037 5.376012869668785e-04 +456 1038 5.028688547500890e-04 +456 1039 -9.844594048838811e-05 +456 1040 5.705134647635534e-05 +456 1041 -3.672666032323219e-05 +456 1042 2.343321932570452e-05 +456 1043 -1.316860931849462e-05 +456 1044 4.258276866272996e-06 +457 1036 1.765275231248085e-05 +457 1037 -6.119691313296186e-05 +457 1038 7.076249207781985e-04 +457 1039 3.849668443894273e-04 +457 1040 -1.104912573429473e-04 +457 1041 6.092043978103360e-05 +457 1042 -3.642594225309803e-05 +457 1043 1.984761106267384e-05 +457 1044 -6.335955594806976e-06 +458 1036 1.148247091500196e-06 +458 1037 -6.380257597880076e-06 +458 1038 4.800413127076640e-05 +458 1039 8.634705252154619e-04 +458 1040 8.525740288515476e-05 +458 1041 -2.132703484628629e-05 +458 1042 9.575317381088108e-06 +458 1043 -4.563719592094963e-06 +458 1044 1.377888192290087e-06 +459 1036 -1.361668801095019e-05 +459 1037 4.587104641601906e-05 +459 1038 -1.034397545291374e-04 +459 1039 3.790325123654074e-04 +459 1040 7.486490616400382e-04 +459 1041 -1.196774105566768e-04 +459 1042 6.132507092317830e-05 +459 1043 -3.133670432002736e-05 +459 1044 9.755366072148749e-06 +460 1036 9.755366072149745e-06 +460 1037 -3.133670432002616e-05 +460 1038 6.132507092317465e-05 +460 1039 -1.196774105566738e-04 +460 1040 7.486490616400345e-04 +460 1041 3.790325123654107e-04 +460 1042 -1.034397545291410e-04 +460 1043 4.587104641601997e-05 +460 1044 -1.361668801094847e-05 +461 1036 1.377888192289642e-06 +461 1037 -4.563719592092917e-06 +461 1038 9.575317381084026e-06 +461 1039 -2.132703484627948e-05 +461 1040 8.525740288513969e-05 +461 1041 8.634705252154638e-04 +461 1042 4.800413127077867e-05 +461 1043 -6.380257597884592e-06 +461 1044 1.148247091501202e-06 +462 1036 -6.335955594807863e-06 +462 1037 1.984761106267389e-05 +462 1038 -3.642594225309721e-05 +462 1039 6.092043978103421e-05 +462 1040 -1.104912573429495e-04 +462 1041 3.849668443894312e-04 +462 1042 7.076249207782042e-04 +462 1043 -6.119691313296883e-05 +462 1044 1.765275231247991e-05 +463 1036 4.258276866272132e-06 +463 1037 -1.316860931849018e-05 +463 1038 2.343321932569605e-05 +463 1039 -3.672666032322028e-05 +463 1040 5.705134647633796e-05 +463 1041 -9.844594048836031e-05 +463 1042 5.028688547500438e-04 +463 1043 5.376012869668810e-04 +463 1044 -3.092742551602112e-07 +464 1054 -3.092742551860356e-07 +464 1055 5.376012869668664e-04 +464 1056 5.028688547501016e-04 +464 1057 -9.844594048838840e-05 +464 1058 5.705134647635593e-05 +464 1059 -3.672666032323264e-05 +464 1060 2.343321932570484e-05 +464 1061 -1.316860931849481e-05 +464 1062 4.258276866273056e-06 +465 1054 1.765275231248213e-05 +465 1055 -6.119691313296737e-05 +465 1056 7.076249207781985e-04 +465 1057 3.849668443894344e-04 +465 1058 -1.104912573429519e-04 +465 1059 6.092043978103633e-05 +465 1060 -3.642594225309971e-05 +465 1061 1.984761106267477e-05 +465 1062 -6.335955594807275e-06 +466 1054 1.148247091500791e-06 +466 1055 -6.380257597882220e-06 +466 1056 4.800413127077264e-05 +466 1057 8.634705252154591e-04 +466 1058 8.525740288515127e-05 +466 1059 -2.132703484628387e-05 +466 1060 9.575317381086672e-06 +466 1061 -4.563719592094187e-06 +466 1062 1.377888192289840e-06 +467 1054 -1.361668801094987e-05 +467 1055 4.587104641601799e-05 +467 1056 -1.034397545291350e-04 +467 1057 3.790325123653978e-04 +467 1058 7.486490616400436e-04 +467 1059 -1.196774105566733e-04 +467 1060 6.132507092317674e-05 +467 1061 -3.133670432002659e-05 +467 1062 9.755366072148513e-06 +468 1054 9.755366072150202e-06 +468 1055 -3.133670432002765e-05 +468 1056 6.132507092317761e-05 +468 1057 -1.196774105566800e-04 +468 1058 7.486490616400391e-04 +468 1059 3.790325123654129e-04 +468 1060 -1.034397545291450e-04 +468 1061 4.587104641602182e-05 +468 1062 -1.361668801094903e-05 +469 1054 1.377888192290635e-06 +469 1055 -4.563719592096070e-06 +469 1056 9.575317381089995e-06 +469 1057 -2.132703484629022e-05 +469 1058 8.525740288516508e-05 +469 1059 8.634705252154590e-04 +469 1060 4.800413127075991e-05 +469 1061 -6.380257597877524e-06 +469 1062 1.148247091499205e-06 +470 1054 -6.335955594807399e-06 +470 1055 1.984761106267244e-05 +470 1056 -3.642594225309456e-05 +470 1057 6.092043978102982e-05 +470 1058 -1.104912573429417e-04 +470 1059 3.849668443894181e-04 +470 1060 7.076249207782073e-04 +470 1061 -6.119691313296238e-05 +470 1062 1.765275231247833e-05 +471 1054 4.258276866272207e-06 +471 1055 -1.316860931849041e-05 +471 1056 2.343321932569648e-05 +471 1057 -3.672666032322102e-05 +471 1058 5.705134647633926e-05 +471 1059 -9.844594048836349e-05 +471 1060 5.028688547500423e-04 +471 1061 5.376012869668903e-04 +471 1062 -3.092742551656695e-07 +472 1063 -3.092742551858730e-07 +472 1064 5.376012869668847e-04 +472 1065 5.028688547500794e-04 +472 1066 -9.844594048838285e-05 +472 1067 5.705134647635330e-05 +472 1068 -3.672666032323107e-05 +472 1069 2.343321932570387e-05 +472 1070 -1.316860931849427e-05 +472 1071 4.258276866272883e-06 +473 1063 1.765275231248261e-05 +473 1064 -6.119691313296817e-05 +473 1065 7.076249207781924e-04 +473 1066 3.849668443894431e-04 +473 1067 -1.104912573429553e-04 +473 1068 6.092043978103825e-05 +473 1069 -3.642594225310087e-05 +473 1070 1.984761106267541e-05 +473 1071 -6.335955594807478e-06 +474 1063 1.148247091500763e-06 +474 1064 -6.380257597882122e-06 +474 1065 4.800413127077238e-05 +474 1066 8.634705252154606e-04 +474 1067 8.525740288515002e-05 +474 1068 -2.132703484628387e-05 +474 1069 9.575317381086706e-06 +474 1070 -4.563719592094209e-06 +474 1071 1.377888192289847e-06 +475 1063 -1.361668801095027e-05 +475 1064 4.587104641601936e-05 +475 1065 -1.034397545291382e-04 +475 1066 3.790325123654111e-04 +475 1067 7.486490616400332e-04 +475 1068 -1.196774105566746e-04 +475 1069 6.132507092317783e-05 +475 1070 -3.133670432002720e-05 +475 1071 9.755366072148708e-06 +476 1063 9.755366072150360e-06 +476 1064 -3.133670432002814e-05 +476 1065 6.132507092317853e-05 +476 1066 -1.196774105566812e-04 +476 1067 7.486490616400350e-04 +476 1068 3.790325123654191e-04 +476 1069 -1.034397545291470e-04 +476 1070 4.587104641602270e-05 +476 1071 -1.361668801094929e-05 +477 1063 1.377888192290382e-06 +477 1064 -4.563719592095273e-06 +477 1065 9.575317381088511e-06 +477 1066 -2.132703484628766e-05 +477 1067 8.525740288516002e-05 +477 1068 8.634705252154594e-04 +477 1069 4.800413127076440e-05 +477 1070 -6.380257597879530e-06 +477 1071 1.148247091499771e-06 +478 1063 -6.335955594807606e-06 +478 1064 1.984761106267309e-05 +478 1065 -3.642594225309580e-05 +478 1066 6.092043978103200e-05 +478 1067 -1.104912573429461e-04 +478 1068 3.849668443894323e-04 +478 1069 7.076249207781945e-04 +478 1070 -6.119691313296056e-05 +478 1071 1.765275231247827e-05 +479 1063 4.258276866272499e-06 +479 1064 -1.316860931849131e-05 +479 1065 2.343321932569806e-05 +479 1066 -3.672666032322341e-05 +479 1067 5.705134647634275e-05 +479 1068 -9.844594048836843e-05 +479 1069 5.028688547500412e-04 +479 1070 5.376012869669031e-04 +479 1071 -3.092742551744075e-07 +480 1090 -3.092742551813871e-07 +480 1091 5.376012869668868e-04 +480 1092 5.028688547500724e-04 +480 1093 -9.844594048838171e-05 +480 1094 5.705134647635168e-05 +480 1095 -3.672666032322980e-05 +480 1096 2.343321932570299e-05 +480 1097 -1.316860931849376e-05 +480 1098 4.258276866272713e-06 +481 1090 1.765275231248093e-05 +481 1091 -6.119691313296146e-05 +481 1092 7.076249207781963e-04 +481 1093 3.849668443894297e-04 +481 1094 -1.104912573429483e-04 +481 1095 6.092043978103413e-05 +481 1096 -3.642594225309835e-05 +481 1097 1.984761106267401e-05 +481 1098 -6.335955594807031e-06 +482 1090 1.148247091500565e-06 +482 1091 -6.380257597881336e-06 +482 1092 4.800413127076926e-05 +482 1093 8.634705252154628e-04 +482 1094 8.525740288515059e-05 +482 1095 -2.132703484628427e-05 +482 1096 9.575317381086963e-06 +482 1097 -4.563719592094355e-06 +482 1098 1.377888192289894e-06 +483 1090 -1.361668801095001e-05 +483 1091 4.587104641601848e-05 +483 1092 -1.034397545291362e-04 +483 1093 3.790325123654049e-04 +483 1094 7.486490616400374e-04 +483 1095 -1.196774105566733e-04 +483 1096 6.132507092317690e-05 +483 1097 -3.133670432002671e-05 +483 1098 9.755366072148550e-06 +484 1090 9.755366072150085e-06 +484 1091 -3.133670432002727e-05 +484 1092 6.132507092317690e-05 +484 1093 -1.196774105566787e-04 +484 1094 7.486490616400384e-04 +484 1095 3.790325123654119e-04 +484 1096 -1.034397545291438e-04 +484 1097 4.587104641602128e-05 +484 1098 -1.361668801094887e-05 +485 1090 1.377888192290326e-06 +485 1091 -4.563719592095092e-06 +485 1092 9.575317381088146e-06 +485 1093 -2.132703484628688e-05 +485 1094 8.525740288515699e-05 +485 1095 8.634705252154618e-04 +485 1096 4.800413127076457e-05 +485 1097 -6.380257597879666e-06 +485 1098 1.148247091499815e-06 +486 1090 -6.335955594807386e-06 +486 1091 1.984761106267240e-05 +486 1092 -3.642594225309454e-05 +486 1093 6.092043978102994e-05 +486 1094 -1.104912573429426e-04 +486 1095 3.849668443894234e-04 +486 1096 7.076249207781990e-04 +486 1097 -6.119691313295776e-05 +486 1098 1.765275231247754e-05 +487 1090 4.258276866272757e-06 +487 1091 -1.316860931849211e-05 +487 1092 2.343321932569948e-05 +487 1093 -3.672666032322566e-05 +487 1094 5.705134647634632e-05 +487 1095 -9.844594048837510e-05 +487 1096 5.028688547500555e-04 +487 1097 5.376012869668947e-04 +487 1098 -3.092742551758102e-07 +488 1099 -3.092742551766437e-07 +488 1100 5.376012869668806e-04 +488 1101 5.028688547500747e-04 +488 1102 -9.844594048838309e-05 +488 1103 5.705134647635261e-05 +488 1104 -3.672666032323043e-05 +488 1105 2.343321932570340e-05 +488 1106 -1.316860931849399e-05 +488 1107 4.258276866272791e-06 +489 1099 1.765275231248060e-05 +489 1100 -6.119691313296002e-05 +489 1101 7.076249207781846e-04 +489 1102 3.849668443894403e-04 +489 1103 -1.104912573429482e-04 +489 1104 6.092043978103386e-05 +489 1105 -3.642594225309814e-05 +489 1106 1.984761106267389e-05 +489 1107 -6.335955594806990e-06 +490 1099 1.148247091500470e-06 +490 1100 -6.380257597880760e-06 +490 1101 4.800413127076400e-05 +490 1102 8.634705252154748e-04 +490 1103 8.525740288514179e-05 +490 1104 -2.132703484628216e-05 +490 1105 9.575317381086011e-06 +490 1106 -4.563719592093894e-06 +490 1107 1.377888192289755e-06 +491 1099 -1.361668801095023e-05 +491 1100 4.587104641601921e-05 +491 1101 -1.034397545291379e-04 +491 1102 3.790325123654173e-04 +491 1103 7.486490616400278e-04 +491 1104 -1.196774105566756e-04 +491 1105 6.132507092317796e-05 +491 1106 -3.133670432002723e-05 +491 1107 9.755366072148713e-06 +492 1099 9.755366072149875e-06 +492 1100 -3.133670432002657e-05 +492 1101 6.132507092317539e-05 +492 1102 -1.196774105566747e-04 +492 1103 7.486490616400300e-04 +492 1104 3.790325123654171e-04 +492 1105 -1.034397545291433e-04 +492 1106 4.587104641602090e-05 +492 1107 -1.361668801094874e-05 +493 1099 1.377888192290121e-06 +493 1100 -4.563719592094431e-06 +493 1101 9.575317381086858e-06 +493 1102 -2.132703484628437e-05 +493 1103 8.525740288514904e-05 +493 1104 8.634705252154699e-04 +493 1105 4.800413127076295e-05 +493 1106 -6.380257597880123e-06 +493 1107 1.148247091499998e-06 +494 1099 -6.335955594807579e-06 +494 1100 1.984761106267301e-05 +494 1101 -3.642594225309563e-05 +494 1102 6.092043978103176e-05 +494 1103 -1.104912573429458e-04 +494 1104 3.849668443894371e-04 +494 1105 7.076249207781903e-04 +494 1106 -6.119691313296147e-05 +494 1107 1.765275231247838e-05 +495 1099 4.258276866272137e-06 +495 1100 -1.316860931849019e-05 +495 1101 2.343321932569608e-05 +495 1102 -3.672666032322035e-05 +495 1103 5.705134647633806e-05 +495 1104 -9.844594048836068e-05 +495 1105 5.028688547500312e-04 +495 1106 5.376012869668979e-04 +495 1107 -3.092742551642567e-07 +496 1117 -3.092742551900675e-07 +496 1118 5.376012869668834e-04 +496 1119 5.028688547500890e-04 +496 1120 -9.844594048838876e-05 +496 1121 5.705134647635604e-05 +496 1122 -3.672666032323270e-05 +496 1123 2.343321932570486e-05 +496 1124 -1.316860931849482e-05 +496 1125 4.258276866273059e-06 +497 1117 1.765275231248060e-05 +497 1118 -6.119691313296002e-05 +497 1119 7.076249207781846e-04 +497 1120 3.849668443894403e-04 +497 1121 -1.104912573429482e-04 +497 1122 6.092043978103386e-05 +497 1123 -3.642594225309814e-05 +497 1124 1.984761106267389e-05 +497 1125 -6.335955594806990e-06 +498 1117 1.148247091500088e-06 +498 1118 -6.380257597879462e-06 +498 1119 4.800413127076094e-05 +498 1120 8.634705252154706e-04 +498 1121 8.525740288514995e-05 +498 1122 -2.132703484628493e-05 +498 1123 9.575317381087481e-06 +498 1124 -4.563719592094658e-06 +498 1125 1.377888192289994e-06 +499 1117 -1.361668801095017e-05 +499 1118 4.587104641601901e-05 +499 1119 -1.034397545291373e-04 +499 1120 3.790325123654097e-04 +499 1121 7.486490616400354e-04 +499 1122 -1.196774105566761e-04 +499 1123 6.132507092317811e-05 +499 1124 -3.133670432002728e-05 +499 1125 9.755366072148725e-06 +500 1117 9.755366072149814e-06 +500 1118 -3.133670432002637e-05 +500 1119 6.132507092317498e-05 +500 1120 -1.196774105566738e-04 +500 1121 7.486490616400270e-04 +500 1122 3.790325123654194e-04 +500 1123 -1.034397545291430e-04 +500 1124 4.587104641602072e-05 +500 1125 -1.361668801094869e-05 +501 1117 1.377888192290198e-06 +501 1118 -4.563719592094669e-06 +501 1119 9.575317381087275e-06 +501 1120 -2.132703484628500e-05 +501 1121 8.525740288514906e-05 +501 1122 8.634705252154702e-04 +501 1123 4.800413127076269e-05 +501 1124 -6.380257597879523e-06 +501 1125 1.148247091499818e-06 +502 1117 -6.335955594807516e-06 +502 1118 1.984761106267281e-05 +502 1119 -3.642594225309526e-05 +502 1120 6.092043978103106e-05 +502 1121 -1.104912573429443e-04 +502 1122 3.849668443894288e-04 +502 1123 7.076249207781977e-04 +502 1124 -6.119691313296173e-05 +502 1125 1.765275231247839e-05 +503 1117 4.258276866271926e-06 +503 1118 -1.316860931848955e-05 +503 1119 2.343321932569495e-05 +503 1120 -3.672666032321864e-05 +503 1121 5.705134647633561e-05 +503 1122 -9.844594048835711e-05 +503 1123 5.028688547500257e-04 +503 1124 5.376012869668987e-04 +503 1125 -3.092742551615529e-07 +504 1126 -3.092742551942315e-07 +504 1127 5.376012869668913e-04 +504 1128 5.028688547500879e-04 +504 1129 -9.844594048839304e-05 +504 1130 5.705134647635883e-05 +504 1131 -3.672666032323458e-05 +504 1132 2.343321932570610e-05 +504 1133 -1.316860931849552e-05 +504 1134 4.258276866273287e-06 +505 1126 1.765275231248050e-05 +505 1127 -6.119691313295910e-05 +505 1128 7.076249207781890e-04 +505 1129 3.849668443894355e-04 +505 1130 -1.104912573429485e-04 +505 1131 6.092043978103412e-05 +505 1132 -3.642594225309830e-05 +505 1133 1.984761106267398e-05 +505 1134 -6.335955594807018e-06 +506 1126 1.148247091500033e-06 +506 1127 -6.380257597879445e-06 +506 1128 4.800413127076381e-05 +506 1129 8.634705252154635e-04 +506 1130 8.525740288515568e-05 +506 1131 -2.132703484628696e-05 +506 1132 9.575317381088494e-06 +506 1133 -4.563719592095167e-06 +506 1134 1.377888192290151e-06 +507 1126 -1.361668801095071e-05 +507 1127 4.587104641602084e-05 +507 1128 -1.034397545291415e-04 +507 1129 3.790325123654201e-04 +507 1130 7.486490616400296e-04 +507 1131 -1.196774105566788e-04 +507 1132 6.132507092317990e-05 +507 1133 -3.133670432002825e-05 +507 1134 9.755366072149033e-06 +508 1126 9.755366072149970e-06 +508 1127 -3.133670432002686e-05 +508 1128 6.132507092317589e-05 +508 1129 -1.196774105566751e-04 +508 1130 7.486490616400228e-04 +508 1131 3.790325123654256e-04 +508 1132 -1.034397545291449e-04 +508 1133 4.587104641602160e-05 +508 1134 -1.361668801094895e-05 +509 1126 1.377888192290186e-06 +509 1127 -4.563719592094628e-06 +509 1128 9.575317381087197e-06 +509 1129 -2.132703484628486e-05 +509 1130 8.525740288514875e-05 +509 1131 8.634705252154719e-04 +509 1132 4.800413127076118e-05 +509 1133 -6.380257597879476e-06 +509 1134 1.148247091499816e-06 +510 1126 -6.335955594807782e-06 +510 1127 1.984761106267364e-05 +510 1128 -3.642594225309680e-05 +510 1129 6.092043978103369e-05 +510 1130 -1.104912573429492e-04 +510 1131 3.849668443894458e-04 +510 1132 7.076249207781842e-04 +510 1133 -6.119691313296227e-05 +510 1134 1.765275231247886e-05 +511 1126 4.258276866271965e-06 +511 1127 -1.316860931848967e-05 +511 1128 2.343321932569515e-05 +511 1129 -3.672666032321889e-05 +511 1130 5.705134647633582e-05 +511 1131 -9.844594048835639e-05 +511 1132 5.028688547500167e-04 +511 1133 5.376012869669079e-04 +511 1134 -3.092742551626371e-07 +512 1180 -3.092742551934048e-07 +512 1181 5.376012869668877e-04 +512 1182 5.028688547500911e-04 +512 1183 -9.844594048838916e-05 +512 1184 5.705134647635169e-05 +512 1185 -3.672666032323126e-05 +512 1186 2.343321932570502e-05 +512 1187 -1.316860931849380e-05 +512 1188 4.258276866272261e-06 +513 1180 1.765275231247967e-05 +513 1181 -6.119691313295689e-05 +513 1182 7.076249207781801e-04 +513 1183 3.849668443894316e-04 +513 1184 -1.104912573429306e-04 +513 1185 6.092043978102634e-05 +513 1186 -3.642594225309546e-05 +513 1187 1.984761106267075e-05 +513 1188 -6.335955594805283e-06 +514 1180 1.148247091497065e-06 +514 1181 -6.380257597868946e-06 +514 1182 4.800413127073557e-05 +514 1183 8.634705252154628e-04 +514 1184 8.525740288518572e-05 +514 1185 -2.132703484630121e-05 +514 1186 9.575317381097202e-06 +514 1187 -4.563719592099390e-06 +514 1188 1.377888192291329e-06 +515 1180 -1.361668801095198e-05 +515 1181 4.587104641602526e-05 +515 1182 -1.034397545291531e-04 +515 1183 3.790325123654123e-04 +515 1184 7.486490616400456e-04 +515 1185 -1.196774105566831e-04 +515 1186 6.132507092318529e-05 +515 1187 -3.133670432002830e-05 +515 1188 9.755366072147930e-06 +516 1180 9.755366072151078e-06 +516 1181 -3.133670432003053e-05 +516 1182 6.132507092318405e-05 +516 1183 -1.196774105566825e-04 +516 1184 7.486490616400452e-04 +516 1185 3.790325123654130e-04 +516 1186 -1.034397545291549e-04 +516 1187 4.587104641602214e-05 +516 1188 -1.361668801094749e-05 +517 1180 1.377888192291788e-06 +517 1181 -4.563719592099739e-06 +517 1182 9.575317381097080e-06 +517 1183 -2.132703484630123e-05 +517 1184 8.525740288518578e-05 +517 1185 8.634705252154625e-04 +517 1186 4.800413127073592e-05 +517 1187 -6.380257597868725e-06 +517 1188 1.148247091496593e-06 +518 1180 -6.335955594807291e-06 +518 1181 1.984761106267216e-05 +518 1182 -3.642594225309460e-05 +518 1183 6.092043978102584e-05 +518 1184 -1.104912573429300e-04 +518 1185 3.849668443894306e-04 +518 1186 7.076249207781823e-04 +518 1187 -6.119691313295285e-05 +518 1188 1.765275231247378e-05 +519 1180 4.258276866272219e-06 +519 1181 -1.316860931849050e-05 +519 1182 2.343321932569699e-05 +519 1183 -3.672666032321950e-05 +519 1184 5.705134647633444e-05 +519 1185 -9.844594048836260e-05 +519 1186 5.028688547500412e-04 +519 1187 5.376012869668938e-04 +519 1188 -3.092742551660422e-07 +520 1189 -3.092742551660456e-07 +520 1190 5.376012869668938e-04 +520 1191 5.028688547500412e-04 +520 1192 -9.844594048836264e-05 +520 1193 5.705134647633449e-05 +520 1194 -3.672666032321964e-05 +520 1195 2.343321932569743e-05 +520 1196 -1.316860931848948e-05 +520 1197 4.258276866270857e-06 +521 1189 1.765275231247376e-05 +521 1190 -6.119691313295281e-05 +521 1191 7.076249207781823e-04 +521 1192 3.849668443894305e-04 +521 1193 -1.104912573429301e-04 +521 1194 6.092043978102605e-05 +521 1195 -3.642594225309528e-05 +521 1196 1.984761106267066e-05 +521 1197 -6.335955594805252e-06 +522 1189 1.148247091496596e-06 +522 1190 -6.380257597868736e-06 +522 1191 4.800413127073594e-05 +522 1192 8.634705252154623e-04 +522 1193 8.525740288518580e-05 +522 1194 -2.132703484630127e-05 +522 1195 9.575317381097236e-06 +522 1196 -4.563719592099414e-06 +522 1197 1.377888192291335e-06 +523 1189 -1.361668801094748e-05 +523 1190 4.587104641602209e-05 +523 1191 -1.034397545291548e-04 +523 1192 3.790325123654129e-04 +523 1193 7.486490616400452e-04 +523 1194 -1.196774105566829e-04 +523 1195 6.132507092318516e-05 +523 1196 -3.133670432002823e-05 +523 1197 9.755366072147912e-06 +524 1189 9.755366072147908e-06 +524 1190 -3.133670432002823e-05 +524 1191 6.132507092318517e-05 +524 1192 -1.196774105566829e-04 +524 1193 7.486490616400453e-04 +524 1194 3.790325123654129e-04 +524 1195 -1.034397545291548e-04 +524 1196 4.587104641602210e-05 +524 1197 -1.361668801094748e-05 +525 1189 1.377888192291336e-06 +525 1190 -4.563719592099415e-06 +525 1191 9.575317381097243e-06 +525 1192 -2.132703484630127e-05 +525 1193 8.525740288518581e-05 +525 1194 8.634705252154623e-04 +525 1195 4.800413127073595e-05 +525 1196 -6.380257597868736e-06 +525 1197 1.148247091496593e-06 +526 1189 -6.335955594805249e-06 +526 1190 1.984761106267065e-05 +526 1191 -3.642594225309528e-05 +526 1192 6.092043978102606e-05 +526 1193 -1.104912573429301e-04 +526 1194 3.849668443894307e-04 +526 1195 7.076249207781824e-04 +526 1196 -6.119691313295284e-05 +526 1197 1.765275231247377e-05 +527 1189 4.258276866270855e-06 +527 1190 -1.316860931848948e-05 +527 1191 2.343321932569743e-05 +527 1192 -3.672666032321964e-05 +527 1193 5.705134647633450e-05 +527 1194 -9.844594048836265e-05 +527 1195 5.028688547500413e-04 +527 1196 5.376012869668938e-04 +527 1197 -3.092742551660388e-07 +528 1207 -3.092742551660456e-07 +528 1208 5.376012869668938e-04 +528 1209 5.028688547500412e-04 +528 1210 -9.844594048836264e-05 +528 1211 5.705134647633449e-05 +528 1212 -3.672666032321964e-05 +528 1213 2.343321932569743e-05 +528 1214 -1.316860931848948e-05 +528 1215 4.258276866270857e-06 +529 1207 1.765275231247376e-05 +529 1208 -6.119691313295281e-05 +529 1209 7.076249207781823e-04 +529 1210 3.849668443894305e-04 +529 1211 -1.104912573429301e-04 +529 1212 6.092043978102605e-05 +529 1213 -3.642594225309528e-05 +529 1214 1.984761106267066e-05 +529 1215 -6.335955594805252e-06 +530 1207 1.148247091496596e-06 +530 1208 -6.380257597868736e-06 +530 1209 4.800413127073594e-05 +530 1210 8.634705252154623e-04 +530 1211 8.525740288518580e-05 +530 1212 -2.132703484630127e-05 +530 1213 9.575317381097236e-06 +530 1214 -4.563719592099414e-06 +530 1215 1.377888192291335e-06 +531 1207 -1.361668801094748e-05 +531 1208 4.587104641602209e-05 +531 1209 -1.034397545291548e-04 +531 1210 3.790325123654129e-04 +531 1211 7.486490616400452e-04 +531 1212 -1.196774105566829e-04 +531 1213 6.132507092318516e-05 +531 1214 -3.133670432002823e-05 +531 1215 9.755366072147912e-06 +532 1207 9.755366072147908e-06 +532 1208 -3.133670432002823e-05 +532 1209 6.132507092318517e-05 +532 1210 -1.196774105566829e-04 +532 1211 7.486490616400453e-04 +532 1212 3.790325123654129e-04 +532 1213 -1.034397545291548e-04 +532 1214 4.587104641602210e-05 +532 1215 -1.361668801094748e-05 +533 1207 1.377888192291336e-06 +533 1208 -4.563719592099415e-06 +533 1209 9.575317381097243e-06 +533 1210 -2.132703484630127e-05 +533 1211 8.525740288518581e-05 +533 1212 8.634705252154623e-04 +533 1213 4.800413127073595e-05 +533 1214 -6.380257597868736e-06 +533 1215 1.148247091496593e-06 +534 1207 -6.335955594805249e-06 +534 1208 1.984761106267065e-05 +534 1209 -3.642594225309528e-05 +534 1210 6.092043978102606e-05 +534 1211 -1.104912573429301e-04 +534 1212 3.849668443894307e-04 +534 1213 7.076249207781824e-04 +534 1214 -6.119691313295284e-05 +534 1215 1.765275231247377e-05 +535 1207 4.258276866270855e-06 +535 1208 -1.316860931848948e-05 +535 1209 2.343321932569743e-05 +535 1210 -3.672666032321964e-05 +535 1211 5.705134647633450e-05 +535 1212 -9.844594048836265e-05 +535 1213 5.028688547500413e-04 +535 1214 5.376012869668938e-04 +535 1215 -3.092742551660388e-07 +536 1216 -3.092742551660456e-07 +536 1217 5.376012869668938e-04 +536 1218 5.028688547500412e-04 +536 1219 -9.844594048836264e-05 +536 1220 5.705134647633449e-05 +536 1221 -3.672666032321964e-05 +536 1222 2.343321932569743e-05 +536 1223 -1.316860931848948e-05 +536 1224 4.258276866270857e-06 +537 1216 1.765275231247376e-05 +537 1217 -6.119691313295281e-05 +537 1218 7.076249207781823e-04 +537 1219 3.849668443894305e-04 +537 1220 -1.104912573429301e-04 +537 1221 6.092043978102605e-05 +537 1222 -3.642594225309528e-05 +537 1223 1.984761106267066e-05 +537 1224 -6.335955594805252e-06 +538 1216 1.148247091496596e-06 +538 1217 -6.380257597868736e-06 +538 1218 4.800413127073594e-05 +538 1219 8.634705252154623e-04 +538 1220 8.525740288518580e-05 +538 1221 -2.132703484630127e-05 +538 1222 9.575317381097236e-06 +538 1223 -4.563719592099414e-06 +538 1224 1.377888192291335e-06 +539 1216 -1.361668801094748e-05 +539 1217 4.587104641602209e-05 +539 1218 -1.034397545291548e-04 +539 1219 3.790325123654129e-04 +539 1220 7.486490616400452e-04 +539 1221 -1.196774105566829e-04 +539 1222 6.132507092318516e-05 +539 1223 -3.133670432002823e-05 +539 1224 9.755366072147912e-06 +540 1216 9.755366072147908e-06 +540 1217 -3.133670432002823e-05 +540 1218 6.132507092318517e-05 +540 1219 -1.196774105566829e-04 +540 1220 7.486490616400453e-04 +540 1221 3.790325123654129e-04 +540 1222 -1.034397545291548e-04 +540 1223 4.587104641602210e-05 +540 1224 -1.361668801094748e-05 +541 1216 1.377888192291336e-06 +541 1217 -4.563719592099415e-06 +541 1218 9.575317381097243e-06 +541 1219 -2.132703484630127e-05 +541 1220 8.525740288518581e-05 +541 1221 8.634705252154623e-04 +541 1222 4.800413127073595e-05 +541 1223 -6.380257597868736e-06 +541 1224 1.148247091496593e-06 +542 1216 -6.335955594805249e-06 +542 1217 1.984761106267065e-05 +542 1218 -3.642594225309528e-05 +542 1219 6.092043978102606e-05 +542 1220 -1.104912573429301e-04 +542 1221 3.849668443894307e-04 +542 1222 7.076249207781824e-04 +542 1223 -6.119691313295284e-05 +542 1224 1.765275231247377e-05 +543 1216 4.258276866270855e-06 +543 1217 -1.316860931848948e-05 +543 1218 2.343321932569743e-05 +543 1219 -3.672666032321964e-05 +543 1220 5.705134647633450e-05 +543 1221 -9.844594048836265e-05 +543 1222 5.028688547500413e-04 +543 1223 5.376012869668938e-04 +543 1224 -3.092742551660388e-07 +544 1243 -3.092742551660456e-07 +544 1244 5.376012869668938e-04 +544 1245 5.028688547500412e-04 +544 1246 -9.844594048836264e-05 +544 1247 5.705134647633449e-05 +544 1248 -3.672666032321964e-05 +544 1249 2.343321932569743e-05 +544 1250 -1.316860931848948e-05 +544 1251 4.258276866270857e-06 +545 1243 1.765275231247376e-05 +545 1244 -6.119691313295281e-05 +545 1245 7.076249207781823e-04 +545 1246 3.849668443894305e-04 +545 1247 -1.104912573429301e-04 +545 1248 6.092043978102605e-05 +545 1249 -3.642594225309528e-05 +545 1250 1.984761106267066e-05 +545 1251 -6.335955594805252e-06 +546 1243 1.148247091496596e-06 +546 1244 -6.380257597868736e-06 +546 1245 4.800413127073594e-05 +546 1246 8.634705252154623e-04 +546 1247 8.525740288518580e-05 +546 1248 -2.132703484630127e-05 +546 1249 9.575317381097236e-06 +546 1250 -4.563719592099414e-06 +546 1251 1.377888192291335e-06 +547 1243 -1.361668801094748e-05 +547 1244 4.587104641602209e-05 +547 1245 -1.034397545291548e-04 +547 1246 3.790325123654129e-04 +547 1247 7.486490616400452e-04 +547 1248 -1.196774105566829e-04 +547 1249 6.132507092318516e-05 +547 1250 -3.133670432002823e-05 +547 1251 9.755366072147912e-06 +548 1243 9.755366072147908e-06 +548 1244 -3.133670432002823e-05 +548 1245 6.132507092318517e-05 +548 1246 -1.196774105566829e-04 +548 1247 7.486490616400453e-04 +548 1248 3.790325123654129e-04 +548 1249 -1.034397545291548e-04 +548 1250 4.587104641602210e-05 +548 1251 -1.361668801094748e-05 +549 1243 1.377888192291336e-06 +549 1244 -4.563719592099415e-06 +549 1245 9.575317381097243e-06 +549 1246 -2.132703484630127e-05 +549 1247 8.525740288518581e-05 +549 1248 8.634705252154623e-04 +549 1249 4.800413127073595e-05 +549 1250 -6.380257597868736e-06 +549 1251 1.148247091496593e-06 +550 1243 -6.335955594805249e-06 +550 1244 1.984761106267065e-05 +550 1245 -3.642594225309528e-05 +550 1246 6.092043978102606e-05 +550 1247 -1.104912573429301e-04 +550 1248 3.849668443894307e-04 +550 1249 7.076249207781824e-04 +550 1250 -6.119691313295284e-05 +550 1251 1.765275231247377e-05 +551 1243 4.258276866270855e-06 +551 1244 -1.316860931848948e-05 +551 1245 2.343321932569743e-05 +551 1246 -3.672666032321964e-05 +551 1247 5.705134647633450e-05 +551 1248 -9.844594048836265e-05 +551 1249 5.028688547500413e-04 +551 1250 5.376012869668938e-04 +551 1251 -3.092742551660388e-07 +552 1252 -3.092742551660456e-07 +552 1253 5.376012869668938e-04 +552 1254 5.028688547500412e-04 +552 1255 -9.844594048836264e-05 +552 1256 5.705134647633449e-05 +552 1257 -3.672666032321964e-05 +552 1258 2.343321932569743e-05 +552 1259 -1.316860931848948e-05 +552 1260 4.258276866270857e-06 +553 1252 1.765275231247376e-05 +553 1253 -6.119691313295281e-05 +553 1254 7.076249207781823e-04 +553 1255 3.849668443894305e-04 +553 1256 -1.104912573429301e-04 +553 1257 6.092043978102605e-05 +553 1258 -3.642594225309528e-05 +553 1259 1.984761106267066e-05 +553 1260 -6.335955594805252e-06 +554 1252 1.148247091496596e-06 +554 1253 -6.380257597868736e-06 +554 1254 4.800413127073594e-05 +554 1255 8.634705252154623e-04 +554 1256 8.525740288518580e-05 +554 1257 -2.132703484630127e-05 +554 1258 9.575317381097236e-06 +554 1259 -4.563719592099414e-06 +554 1260 1.377888192291335e-06 +555 1252 -1.361668801094748e-05 +555 1253 4.587104641602209e-05 +555 1254 -1.034397545291548e-04 +555 1255 3.790325123654129e-04 +555 1256 7.486490616400452e-04 +555 1257 -1.196774105566829e-04 +555 1258 6.132507092318516e-05 +555 1259 -3.133670432002823e-05 +555 1260 9.755366072147912e-06 +556 1252 9.755366072147908e-06 +556 1253 -3.133670432002823e-05 +556 1254 6.132507092318517e-05 +556 1255 -1.196774105566829e-04 +556 1256 7.486490616400453e-04 +556 1257 3.790325123654129e-04 +556 1258 -1.034397545291548e-04 +556 1259 4.587104641602210e-05 +556 1260 -1.361668801094748e-05 +557 1252 1.377888192291336e-06 +557 1253 -4.563719592099415e-06 +557 1254 9.575317381097243e-06 +557 1255 -2.132703484630127e-05 +557 1256 8.525740288518581e-05 +557 1257 8.634705252154623e-04 +557 1258 4.800413127073595e-05 +557 1259 -6.380257597868736e-06 +557 1260 1.148247091496593e-06 +558 1252 -6.335955594805249e-06 +558 1253 1.984761106267065e-05 +558 1254 -3.642594225309528e-05 +558 1255 6.092043978102606e-05 +558 1256 -1.104912573429301e-04 +558 1257 3.849668443894307e-04 +558 1258 7.076249207781824e-04 +558 1259 -6.119691313295284e-05 +558 1260 1.765275231247377e-05 +559 1252 4.258276866270855e-06 +559 1253 -1.316860931848948e-05 +559 1254 2.343321932569743e-05 +559 1255 -3.672666032321964e-05 +559 1256 5.705134647633450e-05 +559 1257 -9.844594048836265e-05 +559 1258 5.028688547500413e-04 +559 1259 5.376012869668938e-04 +559 1260 -3.092742551660388e-07 +560 1270 -3.092742551660456e-07 +560 1271 5.376012869668938e-04 +560 1272 5.028688547500412e-04 +560 1273 -9.844594048836264e-05 +560 1274 5.705134647633449e-05 +560 1275 -3.672666032321964e-05 +560 1276 2.343321932569743e-05 +560 1277 -1.316860931848948e-05 +560 1278 4.258276866270857e-06 +561 1270 1.765275231247376e-05 +561 1271 -6.119691313295281e-05 +561 1272 7.076249207781823e-04 +561 1273 3.849668443894305e-04 +561 1274 -1.104912573429301e-04 +561 1275 6.092043978102605e-05 +561 1276 -3.642594225309528e-05 +561 1277 1.984761106267066e-05 +561 1278 -6.335955594805252e-06 +562 1270 1.148247091496596e-06 +562 1271 -6.380257597868736e-06 +562 1272 4.800413127073594e-05 +562 1273 8.634705252154623e-04 +562 1274 8.525740288518580e-05 +562 1275 -2.132703484630127e-05 +562 1276 9.575317381097236e-06 +562 1277 -4.563719592099414e-06 +562 1278 1.377888192291335e-06 +563 1270 -1.361668801094748e-05 +563 1271 4.587104641602209e-05 +563 1272 -1.034397545291548e-04 +563 1273 3.790325123654129e-04 +563 1274 7.486490616400452e-04 +563 1275 -1.196774105566829e-04 +563 1276 6.132507092318516e-05 +563 1277 -3.133670432002823e-05 +563 1278 9.755366072147912e-06 +564 1270 9.755366072147908e-06 +564 1271 -3.133670432002823e-05 +564 1272 6.132507092318517e-05 +564 1273 -1.196774105566829e-04 +564 1274 7.486490616400453e-04 +564 1275 3.790325123654129e-04 +564 1276 -1.034397545291548e-04 +564 1277 4.587104641602210e-05 +564 1278 -1.361668801094748e-05 +565 1270 1.377888192291336e-06 +565 1271 -4.563719592099415e-06 +565 1272 9.575317381097243e-06 +565 1273 -2.132703484630127e-05 +565 1274 8.525740288518581e-05 +565 1275 8.634705252154623e-04 +565 1276 4.800413127073595e-05 +565 1277 -6.380257597868736e-06 +565 1278 1.148247091496593e-06 +566 1270 -6.335955594805249e-06 +566 1271 1.984761106267065e-05 +566 1272 -3.642594225309528e-05 +566 1273 6.092043978102606e-05 +566 1274 -1.104912573429301e-04 +566 1275 3.849668443894307e-04 +566 1276 7.076249207781824e-04 +566 1277 -6.119691313295284e-05 +566 1278 1.765275231247377e-05 +567 1270 4.258276866270855e-06 +567 1271 -1.316860931848948e-05 +567 1272 2.343321932569743e-05 +567 1273 -3.672666032321964e-05 +567 1274 5.705134647633450e-05 +567 1275 -9.844594048836265e-05 +567 1276 5.028688547500413e-04 +567 1277 5.376012869668938e-04 +567 1278 -3.092742551660388e-07 +568 1279 -3.092742551660456e-07 +568 1280 5.376012869668938e-04 +568 1281 5.028688547500412e-04 +568 1282 -9.844594048836264e-05 +568 1283 5.705134647633449e-05 +568 1284 -3.672666032321964e-05 +568 1285 2.343321932569743e-05 +568 1286 -1.316860931848948e-05 +568 1287 4.258276866270857e-06 +569 1279 1.765275231247376e-05 +569 1280 -6.119691313295281e-05 +569 1281 7.076249207781823e-04 +569 1282 3.849668443894305e-04 +569 1283 -1.104912573429301e-04 +569 1284 6.092043978102605e-05 +569 1285 -3.642594225309528e-05 +569 1286 1.984761106267066e-05 +569 1287 -6.335955594805252e-06 +570 1279 1.148247091496596e-06 +570 1280 -6.380257597868736e-06 +570 1281 4.800413127073594e-05 +570 1282 8.634705252154623e-04 +570 1283 8.525740288518580e-05 +570 1284 -2.132703484630127e-05 +570 1285 9.575317381097236e-06 +570 1286 -4.563719592099414e-06 +570 1287 1.377888192291335e-06 +571 1279 -1.361668801094748e-05 +571 1280 4.587104641602209e-05 +571 1281 -1.034397545291548e-04 +571 1282 3.790325123654129e-04 +571 1283 7.486490616400452e-04 +571 1284 -1.196774105566829e-04 +571 1285 6.132507092318516e-05 +571 1286 -3.133670432002823e-05 +571 1287 9.755366072147912e-06 +572 1279 9.755366072147908e-06 +572 1280 -3.133670432002823e-05 +572 1281 6.132507092318517e-05 +572 1282 -1.196774105566829e-04 +572 1283 7.486490616400453e-04 +572 1284 3.790325123654129e-04 +572 1285 -1.034397545291548e-04 +572 1286 4.587104641602210e-05 +572 1287 -1.361668801094748e-05 +573 1279 1.377888192291336e-06 +573 1280 -4.563719592099415e-06 +573 1281 9.575317381097243e-06 +573 1282 -2.132703484630127e-05 +573 1283 8.525740288518581e-05 +573 1284 8.634705252154623e-04 +573 1285 4.800413127073595e-05 +573 1286 -6.380257597868736e-06 +573 1287 1.148247091496593e-06 +574 1279 -6.335955594805249e-06 +574 1280 1.984761106267065e-05 +574 1281 -3.642594225309528e-05 +574 1282 6.092043978102606e-05 +574 1283 -1.104912573429301e-04 +574 1284 3.849668443894307e-04 +574 1285 7.076249207781824e-04 +574 1286 -6.119691313295284e-05 +574 1287 1.765275231247377e-05 +575 1279 4.258276866270855e-06 +575 1280 -1.316860931848948e-05 +575 1281 2.343321932569743e-05 +575 1282 -3.672666032321964e-05 +575 1283 5.705134647633450e-05 +575 1284 -9.844594048836265e-05 +575 1285 5.028688547500413e-04 +575 1286 5.376012869668938e-04 +575 1287 -3.092742551660388e-07 +576 1315 -3.092742551660456e-07 +576 1316 5.376012869668938e-04 +576 1317 5.028688547500412e-04 +576 1318 -9.844594048836264e-05 +576 1319 5.705134647633449e-05 +576 1320 -3.672666032321964e-05 +576 1321 2.343321932569743e-05 +576 1322 -1.316860931848948e-05 +576 1323 4.258276866270857e-06 +577 1315 1.765275231247376e-05 +577 1316 -6.119691313295281e-05 +577 1317 7.076249207781823e-04 +577 1318 3.849668443894305e-04 +577 1319 -1.104912573429301e-04 +577 1320 6.092043978102605e-05 +577 1321 -3.642594225309528e-05 +577 1322 1.984761106267066e-05 +577 1323 -6.335955594805252e-06 +578 1315 1.148247091496596e-06 +578 1316 -6.380257597868736e-06 +578 1317 4.800413127073594e-05 +578 1318 8.634705252154623e-04 +578 1319 8.525740288518580e-05 +578 1320 -2.132703484630127e-05 +578 1321 9.575317381097236e-06 +578 1322 -4.563719592099414e-06 +578 1323 1.377888192291335e-06 +579 1315 -1.361668801094748e-05 +579 1316 4.587104641602209e-05 +579 1317 -1.034397545291548e-04 +579 1318 3.790325123654129e-04 +579 1319 7.486490616400452e-04 +579 1320 -1.196774105566829e-04 +579 1321 6.132507092318516e-05 +579 1322 -3.133670432002823e-05 +579 1323 9.755366072147912e-06 +580 1315 9.755366072147908e-06 +580 1316 -3.133670432002823e-05 +580 1317 6.132507092318517e-05 +580 1318 -1.196774105566829e-04 +580 1319 7.486490616400453e-04 +580 1320 3.790325123654129e-04 +580 1321 -1.034397545291548e-04 +580 1322 4.587104641602210e-05 +580 1323 -1.361668801094748e-05 +581 1315 1.377888192291336e-06 +581 1316 -4.563719592099415e-06 +581 1317 9.575317381097243e-06 +581 1318 -2.132703484630127e-05 +581 1319 8.525740288518581e-05 +581 1320 8.634705252154623e-04 +581 1321 4.800413127073595e-05 +581 1322 -6.380257597868736e-06 +581 1323 1.148247091496593e-06 +582 1315 -6.335955594805249e-06 +582 1316 1.984761106267065e-05 +582 1317 -3.642594225309528e-05 +582 1318 6.092043978102606e-05 +582 1319 -1.104912573429301e-04 +582 1320 3.849668443894307e-04 +582 1321 7.076249207781824e-04 +582 1322 -6.119691313295284e-05 +582 1323 1.765275231247377e-05 +583 1315 4.258276866270855e-06 +583 1316 -1.316860931848948e-05 +583 1317 2.343321932569743e-05 +583 1318 -3.672666032321964e-05 +583 1319 5.705134647633450e-05 +583 1320 -9.844594048836265e-05 +583 1321 5.028688547500413e-04 +583 1322 5.376012869668938e-04 +583 1323 -3.092742551660388e-07 +584 1324 -3.092742551660456e-07 +584 1325 5.376012869668938e-04 +584 1326 5.028688547500412e-04 +584 1327 -9.844594048836264e-05 +584 1328 5.705134647633449e-05 +584 1329 -3.672666032321964e-05 +584 1330 2.343321932569743e-05 +584 1331 -1.316860931848948e-05 +584 1332 4.258276866270857e-06 +585 1324 1.765275231247376e-05 +585 1325 -6.119691313295281e-05 +585 1326 7.076249207781823e-04 +585 1327 3.849668443894305e-04 +585 1328 -1.104912573429301e-04 +585 1329 6.092043978102605e-05 +585 1330 -3.642594225309528e-05 +585 1331 1.984761106267066e-05 +585 1332 -6.335955594805252e-06 +586 1324 1.148247091496596e-06 +586 1325 -6.380257597868736e-06 +586 1326 4.800413127073594e-05 +586 1327 8.634705252154623e-04 +586 1328 8.525740288518580e-05 +586 1329 -2.132703484630127e-05 +586 1330 9.575317381097236e-06 +586 1331 -4.563719592099414e-06 +586 1332 1.377888192291335e-06 +587 1324 -1.361668801094748e-05 +587 1325 4.587104641602209e-05 +587 1326 -1.034397545291548e-04 +587 1327 3.790325123654129e-04 +587 1328 7.486490616400452e-04 +587 1329 -1.196774105566829e-04 +587 1330 6.132507092318516e-05 +587 1331 -3.133670432002823e-05 +587 1332 9.755366072147912e-06 +588 1324 9.755366072147908e-06 +588 1325 -3.133670432002823e-05 +588 1326 6.132507092318517e-05 +588 1327 -1.196774105566829e-04 +588 1328 7.486490616400453e-04 +588 1329 3.790325123654129e-04 +588 1330 -1.034397545291548e-04 +588 1331 4.587104641602210e-05 +588 1332 -1.361668801094748e-05 +589 1324 1.377888192291336e-06 +589 1325 -4.563719592099415e-06 +589 1326 9.575317381097243e-06 +589 1327 -2.132703484630127e-05 +589 1328 8.525740288518581e-05 +589 1329 8.634705252154623e-04 +589 1330 4.800413127073595e-05 +589 1331 -6.380257597868736e-06 +589 1332 1.148247091496593e-06 +590 1324 -6.335955594805249e-06 +590 1325 1.984761106267065e-05 +590 1326 -3.642594225309528e-05 +590 1327 6.092043978102606e-05 +590 1328 -1.104912573429301e-04 +590 1329 3.849668443894307e-04 +590 1330 7.076249207781824e-04 +590 1331 -6.119691313295284e-05 +590 1332 1.765275231247377e-05 +591 1324 4.258276866270855e-06 +591 1325 -1.316860931848948e-05 +591 1326 2.343321932569743e-05 +591 1327 -3.672666032321964e-05 +591 1328 5.705134647633450e-05 +591 1329 -9.844594048836265e-05 +591 1330 5.028688547500413e-04 +591 1331 5.376012869668938e-04 +591 1332 -3.092742551660388e-07 +592 1342 -3.092742551660456e-07 +592 1343 5.376012869668938e-04 +592 1344 5.028688547500412e-04 +592 1345 -9.844594048836264e-05 +592 1346 5.705134647633449e-05 +592 1347 -3.672666032321964e-05 +592 1348 2.343321932569743e-05 +592 1349 -1.316860931848948e-05 +592 1350 4.258276866270857e-06 +593 1342 1.765275231247376e-05 +593 1343 -6.119691313295281e-05 +593 1344 7.076249207781823e-04 +593 1345 3.849668443894305e-04 +593 1346 -1.104912573429301e-04 +593 1347 6.092043978102605e-05 +593 1348 -3.642594225309528e-05 +593 1349 1.984761106267066e-05 +593 1350 -6.335955594805252e-06 +594 1342 1.148247091496596e-06 +594 1343 -6.380257597868736e-06 +594 1344 4.800413127073594e-05 +594 1345 8.634705252154623e-04 +594 1346 8.525740288518580e-05 +594 1347 -2.132703484630127e-05 +594 1348 9.575317381097236e-06 +594 1349 -4.563719592099414e-06 +594 1350 1.377888192291335e-06 +595 1342 -1.361668801094748e-05 +595 1343 4.587104641602209e-05 +595 1344 -1.034397545291548e-04 +595 1345 3.790325123654129e-04 +595 1346 7.486490616400452e-04 +595 1347 -1.196774105566829e-04 +595 1348 6.132507092318516e-05 +595 1349 -3.133670432002823e-05 +595 1350 9.755366072147912e-06 +596 1342 9.755366072147908e-06 +596 1343 -3.133670432002823e-05 +596 1344 6.132507092318517e-05 +596 1345 -1.196774105566829e-04 +596 1346 7.486490616400453e-04 +596 1347 3.790325123654129e-04 +596 1348 -1.034397545291548e-04 +596 1349 4.587104641602210e-05 +596 1350 -1.361668801094748e-05 +597 1342 1.377888192291336e-06 +597 1343 -4.563719592099415e-06 +597 1344 9.575317381097243e-06 +597 1345 -2.132703484630127e-05 +597 1346 8.525740288518581e-05 +597 1347 8.634705252154623e-04 +597 1348 4.800413127073595e-05 +597 1349 -6.380257597868736e-06 +597 1350 1.148247091496593e-06 +598 1342 -6.335955594805249e-06 +598 1343 1.984761106267065e-05 +598 1344 -3.642594225309528e-05 +598 1345 6.092043978102606e-05 +598 1346 -1.104912573429301e-04 +598 1347 3.849668443894307e-04 +598 1348 7.076249207781824e-04 +598 1349 -6.119691313295284e-05 +598 1350 1.765275231247377e-05 +599 1342 4.258276866270855e-06 +599 1343 -1.316860931848948e-05 +599 1344 2.343321932569743e-05 +599 1345 -3.672666032321964e-05 +599 1346 5.705134647633450e-05 +599 1347 -9.844594048836265e-05 +599 1348 5.028688547500413e-04 +599 1349 5.376012869668938e-04 +599 1350 -3.092742551660388e-07 +600 1351 -3.092742551660456e-07 +600 1352 5.376012869668938e-04 +600 1353 5.028688547500412e-04 +600 1354 -9.844594048836264e-05 +600 1355 5.705134647633449e-05 +600 1356 -3.672666032321964e-05 +600 1357 2.343321932569743e-05 +600 1358 -1.316860931848948e-05 +600 1359 4.258276866270857e-06 +601 1351 1.765275231247376e-05 +601 1352 -6.119691313295281e-05 +601 1353 7.076249207781823e-04 +601 1354 3.849668443894305e-04 +601 1355 -1.104912573429301e-04 +601 1356 6.092043978102605e-05 +601 1357 -3.642594225309528e-05 +601 1358 1.984761106267066e-05 +601 1359 -6.335955594805252e-06 +602 1351 1.148247091496596e-06 +602 1352 -6.380257597868736e-06 +602 1353 4.800413127073594e-05 +602 1354 8.634705252154623e-04 +602 1355 8.525740288518580e-05 +602 1356 -2.132703484630127e-05 +602 1357 9.575317381097236e-06 +602 1358 -4.563719592099414e-06 +602 1359 1.377888192291335e-06 +603 1351 -1.361668801094748e-05 +603 1352 4.587104641602209e-05 +603 1353 -1.034397545291548e-04 +603 1354 3.790325123654129e-04 +603 1355 7.486490616400452e-04 +603 1356 -1.196774105566829e-04 +603 1357 6.132507092318516e-05 +603 1358 -3.133670432002823e-05 +603 1359 9.755366072147912e-06 +604 1351 9.755366072147908e-06 +604 1352 -3.133670432002823e-05 +604 1353 6.132507092318517e-05 +604 1354 -1.196774105566829e-04 +604 1355 7.486490616400453e-04 +604 1356 3.790325123654129e-04 +604 1357 -1.034397545291548e-04 +604 1358 4.587104641602210e-05 +604 1359 -1.361668801094748e-05 +605 1351 1.377888192291336e-06 +605 1352 -4.563719592099415e-06 +605 1353 9.575317381097243e-06 +605 1354 -2.132703484630127e-05 +605 1355 8.525740288518581e-05 +605 1356 8.634705252154623e-04 +605 1357 4.800413127073595e-05 +605 1358 -6.380257597868736e-06 +605 1359 1.148247091496593e-06 +606 1351 -6.335955594805249e-06 +606 1352 1.984761106267065e-05 +606 1353 -3.642594225309528e-05 +606 1354 6.092043978102606e-05 +606 1355 -1.104912573429301e-04 +606 1356 3.849668443894307e-04 +606 1357 7.076249207781824e-04 +606 1358 -6.119691313295284e-05 +606 1359 1.765275231247377e-05 +607 1351 4.258276866270855e-06 +607 1352 -1.316860931848948e-05 +607 1353 2.343321932569743e-05 +607 1354 -3.672666032321964e-05 +607 1355 5.705134647633450e-05 +607 1356 -9.844594048836265e-05 +607 1357 5.028688547500413e-04 +607 1358 5.376012869668938e-04 +607 1359 -3.092742551660388e-07 +608 1378 -3.092742551660456e-07 +608 1379 5.376012869668938e-04 +608 1380 5.028688547500412e-04 +608 1381 -9.844594048836264e-05 +608 1382 5.705134647633449e-05 +608 1383 -3.672666032321964e-05 +608 1384 2.343321932569743e-05 +608 1385 -1.316860931848948e-05 +608 1386 4.258276866270857e-06 +609 1378 1.765275231247376e-05 +609 1379 -6.119691313295281e-05 +609 1380 7.076249207781823e-04 +609 1381 3.849668443894305e-04 +609 1382 -1.104912573429301e-04 +609 1383 6.092043978102605e-05 +609 1384 -3.642594225309528e-05 +609 1385 1.984761106267066e-05 +609 1386 -6.335955594805252e-06 +610 1378 1.148247091496596e-06 +610 1379 -6.380257597868736e-06 +610 1380 4.800413127073594e-05 +610 1381 8.634705252154623e-04 +610 1382 8.525740288518580e-05 +610 1383 -2.132703484630127e-05 +610 1384 9.575317381097236e-06 +610 1385 -4.563719592099414e-06 +610 1386 1.377888192291335e-06 +611 1378 -1.361668801094748e-05 +611 1379 4.587104641602209e-05 +611 1380 -1.034397545291548e-04 +611 1381 3.790325123654129e-04 +611 1382 7.486490616400452e-04 +611 1383 -1.196774105566829e-04 +611 1384 6.132507092318516e-05 +611 1385 -3.133670432002823e-05 +611 1386 9.755366072147912e-06 +612 1378 9.755366072147908e-06 +612 1379 -3.133670432002823e-05 +612 1380 6.132507092318517e-05 +612 1381 -1.196774105566829e-04 +612 1382 7.486490616400453e-04 +612 1383 3.790325123654129e-04 +612 1384 -1.034397545291548e-04 +612 1385 4.587104641602210e-05 +612 1386 -1.361668801094748e-05 +613 1378 1.377888192291336e-06 +613 1379 -4.563719592099415e-06 +613 1380 9.575317381097243e-06 +613 1381 -2.132703484630127e-05 +613 1382 8.525740288518581e-05 +613 1383 8.634705252154623e-04 +613 1384 4.800413127073595e-05 +613 1385 -6.380257597868736e-06 +613 1386 1.148247091496593e-06 +614 1378 -6.335955594805249e-06 +614 1379 1.984761106267065e-05 +614 1380 -3.642594225309528e-05 +614 1381 6.092043978102606e-05 +614 1382 -1.104912573429301e-04 +614 1383 3.849668443894307e-04 +614 1384 7.076249207781824e-04 +614 1385 -6.119691313295284e-05 +614 1386 1.765275231247377e-05 +615 1378 4.258276866270855e-06 +615 1379 -1.316860931848948e-05 +615 1380 2.343321932569743e-05 +615 1381 -3.672666032321964e-05 +615 1382 5.705134647633450e-05 +615 1383 -9.844594048836265e-05 +615 1384 5.028688547500413e-04 +615 1385 5.376012869668938e-04 +615 1386 -3.092742551660388e-07 +616 1387 -3.092742551660456e-07 +616 1388 5.376012869668938e-04 +616 1389 5.028688547500412e-04 +616 1390 -9.844594048836264e-05 +616 1391 5.705134647633449e-05 +616 1392 -3.672666032321964e-05 +616 1393 2.343321932569743e-05 +616 1394 -1.316860931848948e-05 +616 1395 4.258276866270857e-06 +617 1387 1.765275231247356e-05 +617 1388 -6.119691313295249e-05 +617 1389 7.076249207781948e-04 +617 1390 3.849668443894146e-04 +617 1391 -1.104912573429251e-04 +617 1392 6.092043978102367e-05 +617 1393 -3.642594225309394e-05 +617 1394 1.984761106266995e-05 +617 1395 -6.335955594805030e-06 +618 1387 1.148247091495464e-06 +618 1388 -6.380257597864738e-06 +618 1389 4.800413127072702e-05 +618 1390 8.634705252154615e-04 +618 1391 8.525740288519592e-05 +618 1392 -2.132703484630639e-05 +618 1393 9.575317381100200e-06 +618 1394 -4.563719592101006e-06 +618 1395 1.377888192291840e-06 +619 1387 -1.361668801094748e-05 +619 1388 4.587104641602209e-05 +619 1389 -1.034397545291548e-04 +619 1390 3.790325123654129e-04 +619 1391 7.486490616400452e-04 +619 1392 -1.196774105566829e-04 +619 1393 6.132507092318516e-05 +619 1394 -3.133670432002823e-05 +619 1395 9.755366072147912e-06 +620 1387 9.755366072147908e-06 +620 1388 -3.133670432002823e-05 +620 1389 6.132507092318517e-05 +620 1390 -1.196774105566829e-04 +620 1391 7.486490616400453e-04 +620 1392 3.790325123654129e-04 +620 1393 -1.034397545291548e-04 +620 1394 4.587104641602210e-05 +620 1395 -1.361668801094748e-05 +621 1387 1.377888192291336e-06 +621 1388 -4.563719592099415e-06 +621 1389 9.575317381097243e-06 +621 1390 -2.132703484630127e-05 +621 1391 8.525740288518581e-05 +621 1392 8.634705252154623e-04 +621 1393 4.800413127073595e-05 +621 1394 -6.380257597868736e-06 +621 1395 1.148247091496593e-06 +622 1387 -6.335955594805691e-06 +622 1388 1.984761106267203e-05 +622 1389 -3.642594225309779e-05 +622 1390 6.092043978103018e-05 +622 1391 -1.104912573429373e-04 +622 1392 3.849668443894484e-04 +622 1393 7.076249207781733e-04 +622 1394 -6.119691313295844e-05 +622 1395 1.765275231247524e-05 +623 1387 4.258276866271346e-06 +623 1388 -1.316860931849099e-05 +623 1389 2.343321932570010e-05 +623 1390 -3.672666032322374e-05 +623 1391 5.705134647634056e-05 +623 1392 -9.844594048837149e-05 +623 1393 5.028688547500707e-04 +623 1394 5.376012869668622e-04 +623 1395 -3.092742551587408e-07 +624 1405 -3.092742551590390e-07 +624 1406 5.376012869668633e-04 +624 1407 5.028688547500725e-04 +624 1408 -9.844594048837510e-05 +624 1409 5.705134647634201e-05 +624 1410 -3.672666032322457e-05 +624 1411 2.343321932570061e-05 +624 1412 -1.316860931849127e-05 +624 1413 4.258276866271438e-06 +625 1405 1.765275231247376e-05 +625 1406 -6.119691313295281e-05 +625 1407 7.076249207781823e-04 +625 1408 3.849668443894305e-04 +625 1409 -1.104912573429301e-04 +625 1410 6.092043978102605e-05 +625 1411 -3.642594225309528e-05 +625 1412 1.984761106267066e-05 +625 1413 -6.335955594805252e-06 +626 1405 1.148247091496596e-06 +626 1406 -6.380257597868736e-06 +626 1407 4.800413127073594e-05 +626 1408 8.634705252154623e-04 +626 1409 8.525740288518580e-05 +626 1410 -2.132703484630127e-05 +626 1411 9.575317381097236e-06 +626 1412 -4.563719592099414e-06 +626 1413 1.377888192291335e-06 +627 1405 -1.361668801094748e-05 +627 1406 4.587104641602209e-05 +627 1407 -1.034397545291548e-04 +627 1408 3.790325123654129e-04 +627 1409 7.486490616400452e-04 +627 1410 -1.196774105566829e-04 +627 1411 6.132507092318516e-05 +627 1412 -3.133670432002823e-05 +627 1413 9.755366072147912e-06 +628 1405 9.755366072147834e-06 +628 1406 -3.133670432002801e-05 +628 1407 6.132507092318485e-05 +628 1408 -1.196774105566828e-04 +628 1409 7.486490616400576e-04 +628 1410 3.790325123653988e-04 +628 1411 -1.034397545291522e-04 +628 1412 4.587104641602113e-05 +628 1413 -1.361668801094721e-05 +629 1405 1.377888192291826e-06 +629 1406 -4.563719592100962e-06 +629 1407 9.575317381100146e-06 +629 1408 -2.132703484630639e-05 +629 1409 8.525740288519848e-05 +629 1410 8.634705252154587e-04 +629 1411 4.800413127072753e-05 +629 1412 -6.380257597864934e-06 +629 1413 1.148247091495519e-06 +630 1405 -6.335955594805027e-06 +630 1406 1.984761106266995e-05 +630 1407 -3.642594225309395e-05 +630 1408 6.092043978102368e-05 +630 1409 -1.104912573429251e-04 +630 1410 3.849668443894146e-04 +630 1411 7.076249207781948e-04 +630 1412 -6.119691313295251e-05 +630 1413 1.765275231247357e-05 +631 1405 4.258276866270855e-06 +631 1406 -1.316860931848948e-05 +631 1407 2.343321932569743e-05 +631 1408 -3.672666032321964e-05 +631 1409 5.705134647633450e-05 +631 1410 -9.844594048836265e-05 +631 1411 5.028688547500413e-04 +631 1412 5.376012869668938e-04 +631 1413 -3.092742551660388e-07 +632 1414 -3.092742551660456e-07 +632 1415 5.376012869668938e-04 +632 1416 5.028688547500412e-04 +632 1417 -9.844594048836264e-05 +632 1418 5.705134647633449e-05 +632 1419 -3.672666032321964e-05 +632 1420 2.343321932569743e-05 +632 1421 -1.316860931848948e-05 +632 1422 4.258276866270857e-06 +633 1414 1.765275231247376e-05 +633 1415 -6.119691313295281e-05 +633 1416 7.076249207781823e-04 +633 1417 3.849668443894305e-04 +633 1418 -1.104912573429301e-04 +633 1419 6.092043978102605e-05 +633 1420 -3.642594225309528e-05 +633 1421 1.984761106267066e-05 +633 1422 -6.335955594805252e-06 +634 1414 1.148247091497468e-06 +634 1415 -6.380257597871737e-06 +634 1416 4.800413127074308e-05 +634 1417 8.634705252154652e-04 +634 1418 8.525740288517452e-05 +634 1419 -2.132703484629570e-05 +634 1420 9.575317381094163e-06 +634 1421 -4.563719592097798e-06 +634 1422 1.377888192290828e-06 +635 1414 -1.361668801094695e-05 +635 1415 4.587104641602026e-05 +635 1416 -1.034397545291503e-04 +635 1417 3.790325123653988e-04 +635 1418 7.486490616400534e-04 +635 1419 -1.196774105566789e-04 +635 1420 6.132507092318331e-05 +635 1421 -3.133670432002728e-05 +635 1422 9.755366072147612e-06 +636 1414 9.755366072148349e-06 +636 1415 -3.133670432002964e-05 +636 1416 6.132507092318791e-05 +636 1417 -1.196774105566881e-04 +636 1418 7.486490616400383e-04 +636 1419 3.790325123654264e-04 +636 1420 -1.034397545291594e-04 +636 1421 4.587104641602415e-05 +636 1422 -1.361668801094809e-05 +637 1414 1.377888192291336e-06 +637 1415 -4.563719592099415e-06 +637 1416 9.575317381097243e-06 +637 1417 -2.132703484630127e-05 +637 1418 8.525740288518581e-05 +637 1419 8.634705252154623e-04 +637 1420 4.800413127073595e-05 +637 1421 -6.380257597868736e-06 +637 1422 1.148247091496593e-06 +638 1414 -6.335955594805249e-06 +638 1415 1.984761106267065e-05 +638 1416 -3.642594225309528e-05 +638 1417 6.092043978102606e-05 +638 1418 -1.104912573429301e-04 +638 1419 3.849668443894307e-04 +638 1420 7.076249207781824e-04 +638 1421 -6.119691313295284e-05 +638 1422 1.765275231247377e-05 +639 1414 4.258276866270855e-06 +639 1415 -1.316860931848948e-05 +639 1416 2.343321932569743e-05 +639 1417 -3.672666032321964e-05 +639 1418 5.705134647633450e-05 +639 1419 -9.844594048836265e-05 +639 1420 5.028688547500413e-04 +639 1421 5.376012869668938e-04 +639 1422 -3.092742551660388e-07 +640 1459 -3.092742551682140e-07 +640 1460 5.376012869669123e-04 +640 1461 5.028688547500232e-04 +640 1462 -9.844594048836125e-05 +640 1463 5.705134647633492e-05 +640 1464 -3.672666032322016e-05 +640 1465 2.343321932569782e-05 +640 1466 -1.316860931848972e-05 +640 1467 4.258276866270936e-06 +641 1459 1.765275231247450e-05 +641 1460 -6.119691313295354e-05 +641 1461 7.076249207781675e-04 +641 1462 3.849668443894484e-04 +641 1463 -1.104912573429350e-04 +641 1464 6.092043978102891e-05 +641 1465 -3.642594225309703e-05 +641 1466 1.984761106267162e-05 +641 1467 -6.335955594805561e-06 +642 1459 1.148247091495461e-06 +642 1460 -6.380257597864636e-06 +642 1461 4.800413127072398e-05 +642 1462 8.634705252154649e-04 +642 1463 8.525740288519530e-05 +642 1464 -2.132703484630611e-05 +642 1465 9.575317381100045e-06 +642 1466 -4.563719592100925e-06 +642 1467 1.377888192291815e-06 +643 1459 -1.361668801094748e-05 +643 1460 4.587104641602209e-05 +643 1461 -1.034397545291548e-04 +643 1462 3.790325123654129e-04 +643 1463 7.486490616400452e-04 +643 1464 -1.196774105566829e-04 +643 1465 6.132507092318516e-05 +643 1466 -3.133670432002823e-05 +643 1467 9.755366072147912e-06 +644 1459 9.755366072147908e-06 +644 1460 -3.133670432002823e-05 +644 1461 6.132507092318517e-05 +644 1462 -1.196774105566829e-04 +644 1463 7.486490616400453e-04 +644 1464 3.790325123654129e-04 +644 1465 -1.034397545291548e-04 +644 1466 4.587104641602210e-05 +644 1467 -1.361668801094748e-05 +645 1459 1.377888192291336e-06 +645 1460 -4.563719592099415e-06 +645 1461 9.575317381097243e-06 +645 1462 -2.132703484630127e-05 +645 1463 8.525740288518581e-05 +645 1464 8.634705252154623e-04 +645 1465 4.800413127073595e-05 +645 1466 -6.380257597868736e-06 +645 1467 1.148247091496593e-06 +646 1459 -6.335955594805657e-06 +646 1460 1.984761106267192e-05 +646 1461 -3.642594225309761e-05 +646 1462 6.092043978102990e-05 +646 1463 -1.104912573429369e-04 +646 1464 3.849668443894479e-04 +646 1465 7.076249207781701e-04 +646 1466 -6.119691313295441e-05 +646 1467 1.765275231247473e-05 +647 1459 4.258276866270935e-06 +647 1460 -1.316860931848972e-05 +647 1461 2.343321932569782e-05 +647 1462 -3.672666032322016e-05 +647 1463 5.705134647633492e-05 +647 1464 -9.844594048836125e-05 +647 1465 5.028688547500233e-04 +647 1466 5.376012869669124e-04 +647 1467 -3.092742551682106e-07 +648 1468 -3.092742551660456e-07 +648 1469 5.376012869668938e-04 +648 1470 5.028688547500412e-04 +648 1471 -9.844594048836264e-05 +648 1472 5.705134647633449e-05 +648 1473 -3.672666032321964e-05 +648 1474 2.343321932569743e-05 +648 1475 -1.316860931848948e-05 +648 1476 4.258276866270857e-06 +649 1468 1.765275231247376e-05 +649 1469 -6.119691313295281e-05 +649 1470 7.076249207781823e-04 +649 1471 3.849668443894305e-04 +649 1472 -1.104912573429301e-04 +649 1473 6.092043978102605e-05 +649 1474 -3.642594225309528e-05 +649 1475 1.984761106267066e-05 +649 1476 -6.335955594805252e-06 +650 1468 1.148247091496596e-06 +650 1469 -6.380257597868736e-06 +650 1470 4.800413127073594e-05 +650 1471 8.634705252154623e-04 +650 1472 8.525740288518580e-05 +650 1473 -2.132703484630127e-05 +650 1474 9.575317381097236e-06 +650 1475 -4.563719592099414e-06 +650 1476 1.377888192291335e-06 +651 1468 -1.361668801094748e-05 +651 1469 4.587104641602209e-05 +651 1470 -1.034397545291548e-04 +651 1471 3.790325123654129e-04 +651 1472 7.486490616400452e-04 +651 1473 -1.196774105566829e-04 +651 1474 6.132507092318516e-05 +651 1475 -3.133670432002823e-05 +651 1476 9.755366072147912e-06 +652 1468 9.755366072147734e-06 +652 1469 -3.133670432002769e-05 +652 1470 6.132507092318422e-05 +652 1471 -1.196774105566817e-04 +652 1472 7.486490616400548e-04 +652 1473 3.790325123653998e-04 +652 1474 -1.034397545291509e-04 +652 1475 4.587104641602056e-05 +652 1476 -1.361668801094704e-05 +653 1468 1.377888192290828e-06 +653 1469 -4.563719592097799e-06 +653 1470 9.575317381094173e-06 +653 1471 -2.132703484629570e-05 +653 1472 8.525740288517451e-05 +653 1473 8.634705252154651e-04 +653 1474 4.800413127074308e-05 +653 1475 -6.380257597871731e-06 +653 1476 1.148247091497467e-06 +654 1468 -6.335955594805249e-06 +654 1469 1.984761106267065e-05 +654 1470 -3.642594225309528e-05 +654 1471 6.092043978102606e-05 +654 1472 -1.104912573429301e-04 +654 1473 3.849668443894307e-04 +654 1474 7.076249207781824e-04 +654 1475 -6.119691313295284e-05 +654 1476 1.765275231247377e-05 +655 1468 4.258276866270855e-06 +655 1469 -1.316860931848948e-05 +655 1470 2.343321932569743e-05 +655 1471 -3.672666032321964e-05 +655 1472 5.705134647633450e-05 +655 1473 -9.844594048836265e-05 +655 1474 5.028688547500413e-04 +655 1475 5.376012869668938e-04 +655 1476 -3.092742551660388e-07 +656 1486 -3.092742551660456e-07 +656 1487 5.376012869668938e-04 +656 1488 5.028688547500412e-04 +656 1489 -9.844594048836264e-05 +656 1490 5.705134647633449e-05 +656 1491 -3.672666032321964e-05 +656 1492 2.343321932569743e-05 +656 1493 -1.316860931848948e-05 +656 1494 4.258276866270857e-06 +657 1486 1.765275231247379e-05 +657 1487 -6.119691313295333e-05 +657 1488 7.076249207781972e-04 +657 1489 3.849668443894141e-04 +657 1490 -1.104912573429271e-04 +657 1491 6.092043978102465e-05 +657 1492 -3.642594225309452e-05 +657 1493 1.984761106267026e-05 +657 1494 -6.335955594805128e-06 +658 1486 1.148247091497472e-06 +658 1487 -6.380257597871839e-06 +658 1488 4.800413127074611e-05 +658 1489 8.634705252154617e-04 +658 1490 8.525740288517516e-05 +658 1491 -2.132703484629598e-05 +658 1492 9.575317381094319e-06 +658 1493 -4.563719592097879e-06 +658 1494 1.377888192290853e-06 +659 1486 -1.361668801094704e-05 +659 1487 4.587104641602054e-05 +659 1488 -1.034397545291509e-04 +659 1489 3.790325123653999e-04 +659 1490 7.486490616400549e-04 +659 1491 -1.196774105566817e-04 +659 1492 6.132507092318424e-05 +659 1493 -3.133670432002769e-05 +659 1494 9.755366072147736e-06 +660 1486 9.755366072147908e-06 +660 1487 -3.133670432002823e-05 +660 1488 6.132507092318517e-05 +660 1489 -1.196774105566829e-04 +660 1490 7.486490616400453e-04 +660 1491 3.790325123654129e-04 +660 1492 -1.034397545291548e-04 +660 1493 4.587104641602210e-05 +660 1494 -1.361668801094748e-05 +661 1486 1.377888192291336e-06 +661 1487 -4.563719592099415e-06 +661 1488 9.575317381097243e-06 +661 1489 -2.132703484630127e-05 +661 1490 8.525740288518581e-05 +661 1491 8.634705252154623e-04 +661 1492 4.800413127073595e-05 +661 1493 -6.380257597868736e-06 +661 1494 1.148247091496593e-06 +662 1486 -6.335955594805249e-06 +662 1487 1.984761106267065e-05 +662 1488 -3.642594225309528e-05 +662 1489 6.092043978102606e-05 +662 1490 -1.104912573429301e-04 +662 1491 3.849668443894307e-04 +662 1492 7.076249207781824e-04 +662 1493 -6.119691313295284e-05 +662 1494 1.765275231247377e-05 +663 1486 4.258276866271280e-06 +663 1487 -1.316860931849079e-05 +663 1488 2.343321932569977e-05 +663 1489 -3.672666032322331e-05 +663 1490 5.705134647634017e-05 +663 1491 -9.844594048837236e-05 +663 1492 5.028688547500680e-04 +663 1493 5.376012869668758e-04 +663 1494 -3.092742551685359e-07 +664 1495 -3.092742551587137e-07 +664 1496 5.376012869668999e-04 +664 1497 5.028688547500278e-04 +664 1498 -9.844594048836400e-05 +664 1499 5.705134647633676e-05 +664 1500 -3.672666032322142e-05 +664 1501 2.343321932569866e-05 +664 1502 -1.316860931849019e-05 +664 1503 4.258276866271092e-06 +665 1495 1.765275231247473e-05 +665 1496 -6.119691313295438e-05 +665 1497 7.076249207781700e-04 +665 1498 3.849668443894479e-04 +665 1499 -1.104912573429369e-04 +665 1500 6.092043978102990e-05 +665 1501 -3.642594225309760e-05 +665 1502 1.984761106267193e-05 +665 1503 -6.335955594805658e-06 +666 1495 1.148247091496596e-06 +666 1496 -6.380257597868736e-06 +666 1497 4.800413127073594e-05 +666 1498 8.634705252154623e-04 +666 1499 8.525740288518580e-05 +666 1500 -2.132703484630127e-05 +666 1501 9.575317381097236e-06 +666 1502 -4.563719592099414e-06 +666 1503 1.377888192291335e-06 +667 1495 -1.361668801094748e-05 +667 1496 4.587104641602209e-05 +667 1497 -1.034397545291548e-04 +667 1498 3.790325123654129e-04 +667 1499 7.486490616400452e-04 +667 1500 -1.196774105566829e-04 +667 1501 6.132507092318516e-05 +667 1502 -3.133670432002823e-05 +667 1503 9.755366072147912e-06 +668 1495 9.755366072147908e-06 +668 1496 -3.133670432002823e-05 +668 1497 6.132507092318517e-05 +668 1498 -1.196774105566829e-04 +668 1499 7.486490616400453e-04 +668 1500 3.790325123654129e-04 +668 1501 -1.034397545291548e-04 +668 1502 4.587104641602210e-05 +668 1503 -1.361668801094748e-05 +669 1495 1.377888192291841e-06 +669 1496 -4.563719592101006e-06 +669 1497 9.575317381100207e-06 +669 1498 -2.132703484630640e-05 +669 1499 8.525740288519594e-05 +669 1500 8.634705252154616e-04 +669 1501 4.800413127072702e-05 +669 1502 -6.380257597864738e-06 +669 1503 1.148247091495463e-06 +670 1495 -6.335955594804993e-06 +670 1496 1.984761106266985e-05 +670 1497 -3.642594225309376e-05 +670 1498 6.092043978102340e-05 +670 1499 -1.104912573429247e-04 +670 1500 3.849668443894141e-04 +670 1501 7.076249207781916e-04 +670 1502 -6.119691313294849e-05 +670 1503 1.765275231247306e-05 +671 1495 4.258276866271024e-06 +671 1496 -1.316860931849000e-05 +671 1497 2.343321932569833e-05 +671 1498 -3.672666032322100e-05 +671 1499 5.705134647633637e-05 +671 1500 -9.844594048836488e-05 +671 1501 5.028688547500252e-04 +671 1502 5.376012869669135e-04 +671 1503 -3.092742551685088e-07 +672 1522 -3.092742551660456e-07 +672 1523 5.376012869668938e-04 +672 1524 5.028688547500412e-04 +672 1525 -9.844594048836264e-05 +672 1526 5.705134647633449e-05 +672 1527 -3.672666032321964e-05 +672 1528 2.343321932569743e-05 +672 1529 -1.316860931848948e-05 +672 1530 4.258276866270857e-06 +673 1522 1.765275231247376e-05 +673 1523 -6.119691313295281e-05 +673 1524 7.076249207781823e-04 +673 1525 3.849668443894305e-04 +673 1526 -1.104912573429301e-04 +673 1527 6.092043978102605e-05 +673 1528 -3.642594225309528e-05 +673 1529 1.984761106267066e-05 +673 1530 -6.335955594805252e-06 +674 1522 1.148247091496596e-06 +674 1523 -6.380257597868736e-06 +674 1524 4.800413127073594e-05 +674 1525 8.634705252154623e-04 +674 1526 8.525740288518580e-05 +674 1527 -2.132703484630127e-05 +674 1528 9.575317381097236e-06 +674 1529 -4.563719592099414e-06 +674 1530 1.377888192291335e-06 +675 1522 -1.361668801094800e-05 +675 1523 4.587104641602385e-05 +675 1524 -1.034397545291588e-04 +675 1525 3.790325123654253e-04 +675 1526 7.486490616400369e-04 +675 1527 -1.196774105566854e-04 +675 1528 6.132507092318699e-05 +675 1529 -3.133670432002923e-05 +675 1530 9.755366072148229e-06 +676 1522 9.755366072148124e-06 +676 1523 -3.133670432002891e-05 +676 1524 6.132507092318638e-05 +676 1525 -1.196774105566842e-04 +676 1526 7.486490616400341e-04 +676 1527 3.790325123654265e-04 +676 1528 -1.034397545291574e-04 +676 1529 4.587104641602330e-05 +676 1530 -1.361668801094783e-05 +677 1522 1.377888192290843e-06 +677 1523 -4.563719592097843e-06 +677 1524 9.575317381094234e-06 +677 1525 -2.132703484629571e-05 +677 1526 8.525740288517196e-05 +677 1527 8.634705252154680e-04 +677 1528 4.800413127074256e-05 +677 1529 -6.380257597871534e-06 +677 1530 1.148247091497411e-06 +678 1522 -6.335955594805249e-06 +678 1523 1.984761106267065e-05 +678 1524 -3.642594225309528e-05 +678 1525 6.092043978102606e-05 +678 1526 -1.104912573429301e-04 +678 1527 3.849668443894307e-04 +678 1528 7.076249207781824e-04 +678 1529 -6.119691313295284e-05 +678 1530 1.765275231247377e-05 +679 1522 4.258276866270855e-06 +679 1523 -1.316860931848948e-05 +679 1524 2.343321932569743e-05 +679 1525 -3.672666032321964e-05 +679 1526 5.705134647633450e-05 +679 1527 -9.844594048836265e-05 +679 1528 5.028688547500413e-04 +679 1529 5.376012869668938e-04 +679 1530 -3.092742551660388e-07 +680 1531 -3.092742551660456e-07 +680 1532 5.376012869668938e-04 +680 1533 5.028688547500412e-04 +680 1534 -9.844594048836264e-05 +680 1535 5.705134647633449e-05 +680 1536 -3.672666032321964e-05 +680 1537 2.343321932569743e-05 +680 1538 -1.316860931848948e-05 +680 1539 4.258276866270857e-06 +681 1531 1.765275231247356e-05 +681 1532 -6.119691313295249e-05 +681 1533 7.076249207781948e-04 +681 1534 3.849668443894146e-04 +681 1535 -1.104912573429251e-04 +681 1536 6.092043978102367e-05 +681 1537 -3.642594225309394e-05 +681 1538 1.984761106266995e-05 +681 1539 -6.335955594805030e-06 +682 1531 1.148247091495520e-06 +682 1532 -6.380257597864937e-06 +682 1533 4.800413127072755e-05 +682 1534 8.634705252154587e-04 +682 1535 8.525740288519847e-05 +682 1536 -2.132703484630638e-05 +682 1537 9.575317381100136e-06 +682 1538 -4.563719592100962e-06 +682 1539 1.377888192291826e-06 +683 1531 -1.361668801094720e-05 +683 1532 4.587104641602111e-05 +683 1533 -1.034397545291522e-04 +683 1534 3.790325123653987e-04 +683 1535 7.486490616400577e-04 +683 1536 -1.196774105566828e-04 +683 1537 6.132507092318485e-05 +683 1538 -3.133670432002801e-05 +683 1539 9.755366072147836e-06 +684 1531 9.755366072147908e-06 +684 1532 -3.133670432002823e-05 +684 1533 6.132507092318517e-05 +684 1534 -1.196774105566829e-04 +684 1535 7.486490616400453e-04 +684 1536 3.790325123654129e-04 +684 1537 -1.034397545291548e-04 +684 1538 4.587104641602210e-05 +684 1539 -1.361668801094748e-05 +685 1531 1.377888192291336e-06 +685 1532 -4.563719592099415e-06 +685 1533 9.575317381097243e-06 +685 1534 -2.132703484630127e-05 +685 1535 8.525740288518581e-05 +685 1536 8.634705252154623e-04 +685 1537 4.800413127073595e-05 +685 1538 -6.380257597868736e-06 +685 1539 1.148247091496593e-06 +686 1531 -6.335955594805249e-06 +686 1532 1.984761106267065e-05 +686 1533 -3.642594225309528e-05 +686 1534 6.092043978102606e-05 +686 1535 -1.104912573429301e-04 +686 1536 3.849668443894307e-04 +686 1537 7.076249207781824e-04 +686 1538 -6.119691313295284e-05 +686 1539 1.765275231247377e-05 +687 1531 4.258276866271436e-06 +687 1532 -1.316860931849127e-05 +687 1533 2.343321932570061e-05 +687 1534 -3.672666032322458e-05 +687 1535 5.705134647634201e-05 +687 1536 -9.844594048837511e-05 +687 1537 5.028688547500727e-04 +687 1538 5.376012869668634e-04 +687 1539 -3.092742551590390e-07 +688 1549 -3.092742551590390e-07 +688 1550 5.376012869668633e-04 +688 1551 5.028688547500725e-04 +688 1552 -9.844594048837510e-05 +688 1553 5.705134647634201e-05 +688 1554 -3.672666032322457e-05 +688 1555 2.343321932570061e-05 +688 1556 -1.316860931849127e-05 +688 1557 4.258276866271438e-06 +689 1549 1.765275231247376e-05 +689 1550 -6.119691313295281e-05 +689 1551 7.076249207781823e-04 +689 1552 3.849668443894305e-04 +689 1553 -1.104912573429301e-04 +689 1554 6.092043978102605e-05 +689 1555 -3.642594225309528e-05 +689 1556 1.984761106267066e-05 +689 1557 -6.335955594805252e-06 +690 1549 1.148247091496596e-06 +690 1550 -6.380257597868736e-06 +690 1551 4.800413127073594e-05 +690 1552 8.634705252154623e-04 +690 1553 8.525740288518580e-05 +690 1554 -2.132703484630127e-05 +690 1555 9.575317381097236e-06 +690 1556 -4.563719592099414e-06 +690 1557 1.377888192291335e-06 +691 1549 -1.361668801094748e-05 +691 1550 4.587104641602209e-05 +691 1551 -1.034397545291548e-04 +691 1552 3.790325123654129e-04 +691 1553 7.486490616400452e-04 +691 1554 -1.196774105566829e-04 +691 1555 6.132507092318516e-05 +691 1556 -3.133670432002823e-05 +691 1557 9.755366072147912e-06 +692 1549 9.755366072147908e-06 +692 1550 -3.133670432002823e-05 +692 1551 6.132507092318517e-05 +692 1552 -1.196774105566829e-04 +692 1553 7.486490616400453e-04 +692 1554 3.790325123654129e-04 +692 1555 -1.034397545291548e-04 +692 1556 4.587104641602210e-05 +692 1557 -1.361668801094748e-05 +693 1549 1.377888192291841e-06 +693 1550 -4.563719592101006e-06 +693 1551 9.575317381100207e-06 +693 1552 -2.132703484630640e-05 +693 1553 8.525740288519594e-05 +693 1554 8.634705252154616e-04 +693 1555 4.800413127072702e-05 +693 1556 -6.380257597864738e-06 +693 1557 1.148247091495463e-06 +694 1549 -6.335955594805027e-06 +694 1550 1.984761106266995e-05 +694 1551 -3.642594225309395e-05 +694 1552 6.092043978102368e-05 +694 1553 -1.104912573429251e-04 +694 1554 3.849668443894146e-04 +694 1555 7.076249207781948e-04 +694 1556 -6.119691313295251e-05 +694 1557 1.765275231247357e-05 +695 1549 4.258276866270855e-06 +695 1550 -1.316860931848948e-05 +695 1551 2.343321932569743e-05 +695 1552 -3.672666032321964e-05 +695 1553 5.705134647633450e-05 +695 1554 -9.844594048836265e-05 +695 1555 5.028688547500413e-04 +695 1556 5.376012869668938e-04 +695 1557 -3.092742551660388e-07 +696 1558 -3.092742551660456e-07 +696 1559 5.376012869668938e-04 +696 1560 5.028688547500412e-04 +696 1561 -9.844594048836264e-05 +696 1562 5.705134647633449e-05 +696 1563 -3.672666032321964e-05 +696 1564 2.343321932569743e-05 +696 1565 -1.316860931848948e-05 +696 1566 4.258276866270857e-06 +697 1558 1.765275231247376e-05 +697 1559 -6.119691313295281e-05 +697 1560 7.076249207781823e-04 +697 1561 3.849668443894305e-04 +697 1562 -1.104912573429301e-04 +697 1563 6.092043978102605e-05 +697 1564 -3.642594225309528e-05 +697 1565 1.984761106267066e-05 +697 1566 -6.335955594805252e-06 +698 1558 1.148247091497413e-06 +698 1559 -6.380257597871538e-06 +698 1560 4.800413127074256e-05 +698 1561 8.634705252154680e-04 +698 1562 8.525740288517197e-05 +698 1563 -2.132703484629570e-05 +698 1564 9.575317381094227e-06 +698 1565 -4.563719592097842e-06 +698 1566 1.377888192290842e-06 +699 1558 -1.361668801094783e-05 +699 1559 4.587104641602328e-05 +699 1560 -1.034397545291574e-04 +699 1561 3.790325123654264e-04 +699 1562 7.486490616400341e-04 +699 1563 -1.196774105566842e-04 +699 1564 6.132507092318638e-05 +699 1565 -3.133670432002891e-05 +699 1566 9.755366072148127e-06 +700 1558 9.755366072148225e-06 +700 1559 -3.133670432002923e-05 +700 1560 6.132507092318699e-05 +700 1561 -1.196774105566853e-04 +700 1562 7.486490616400369e-04 +700 1563 3.790325123654253e-04 +700 1564 -1.034397545291588e-04 +700 1565 4.587104641602387e-05 +700 1566 -1.361668801094800e-05 +701 1558 1.377888192291336e-06 +701 1559 -4.563719592099415e-06 +701 1560 9.575317381097243e-06 +701 1561 -2.132703484630127e-05 +701 1562 8.525740288518581e-05 +701 1563 8.634705252154623e-04 +701 1564 4.800413127073595e-05 +701 1565 -6.380257597868736e-06 +701 1566 1.148247091496593e-06 +702 1558 -6.335955594805249e-06 +702 1559 1.984761106267065e-05 +702 1560 -3.642594225309528e-05 +702 1561 6.092043978102606e-05 +702 1562 -1.104912573429301e-04 +702 1563 3.849668443894307e-04 +702 1564 7.076249207781824e-04 +702 1565 -6.119691313295284e-05 +702 1566 1.765275231247377e-05 +703 1558 4.258276866270855e-06 +703 1559 -1.316860931848948e-05 +703 1560 2.343321932569743e-05 +703 1561 -3.672666032321964e-05 +703 1562 5.705134647633450e-05 +703 1563 -9.844594048836265e-05 +703 1564 5.028688547500413e-04 +703 1565 5.376012869668938e-04 +703 1566 -3.092742551660388e-07 +704 1594 -3.092742551685156e-07 +704 1595 5.376012869669135e-04 +704 1596 5.028688547500251e-04 +704 1597 -9.844594048836486e-05 +704 1598 5.705134647633637e-05 +704 1599 -3.672666032322100e-05 +704 1600 2.343321932569834e-05 +704 1601 -1.316860931849000e-05 +704 1602 4.258276866271026e-06 +705 1594 1.765275231247305e-05 +705 1595 -6.119691313294845e-05 +705 1596 7.076249207781914e-04 +705 1597 3.849668443894142e-04 +705 1598 -1.104912573429247e-04 +705 1599 6.092043978102339e-05 +705 1600 -3.642594225309376e-05 +705 1601 1.984761106266984e-05 +705 1602 -6.335955594804996e-06 +706 1594 1.148247091495464e-06 +706 1595 -6.380257597864738e-06 +706 1596 4.800413127072702e-05 +706 1597 8.634705252154615e-04 +706 1598 8.525740288519592e-05 +706 1599 -2.132703484630639e-05 +706 1600 9.575317381100200e-06 +706 1601 -4.563719592101006e-06 +706 1602 1.377888192291840e-06 +707 1594 -1.361668801094748e-05 +707 1595 4.587104641602209e-05 +707 1596 -1.034397545291548e-04 +707 1597 3.790325123654129e-04 +707 1598 7.486490616400452e-04 +707 1599 -1.196774105566829e-04 +707 1600 6.132507092318516e-05 +707 1601 -3.133670432002823e-05 +707 1602 9.755366072147912e-06 +708 1594 9.755366072147908e-06 +708 1595 -3.133670432002823e-05 +708 1596 6.132507092318517e-05 +708 1597 -1.196774105566829e-04 +708 1598 7.486490616400453e-04 +708 1599 3.790325123654129e-04 +708 1600 -1.034397545291548e-04 +708 1601 4.587104641602210e-05 +708 1602 -1.361668801094748e-05 +709 1594 1.377888192291336e-06 +709 1595 -4.563719592099415e-06 +709 1596 9.575317381097243e-06 +709 1597 -2.132703484630127e-05 +709 1598 8.525740288518581e-05 +709 1599 8.634705252154623e-04 +709 1600 4.800413127073595e-05 +709 1601 -6.380257597868736e-06 +709 1602 1.148247091496593e-06 +710 1594 -6.335955594805657e-06 +710 1595 1.984761106267192e-05 +710 1596 -3.642594225309761e-05 +710 1597 6.092043978102990e-05 +710 1598 -1.104912573429369e-04 +710 1599 3.849668443894479e-04 +710 1600 7.076249207781701e-04 +710 1601 -6.119691313295441e-05 +710 1602 1.765275231247473e-05 +711 1594 4.258276866271090e-06 +711 1595 -1.316860931849019e-05 +711 1596 2.343321932569865e-05 +711 1597 -3.672666032322142e-05 +711 1598 5.705134647633676e-05 +711 1599 -9.844594048836400e-05 +711 1600 5.028688547500280e-04 +711 1601 5.376012869669000e-04 +711 1602 -3.092742551587137e-07 +712 1603 -3.092742551685393e-07 +712 1604 5.376012869668758e-04 +712 1605 5.028688547500679e-04 +712 1606 -9.844594048837236e-05 +712 1607 5.705134647634017e-05 +712 1608 -3.672666032322331e-05 +712 1609 2.343321932569977e-05 +712 1610 -1.316860931849080e-05 +712 1611 4.258276866271282e-06 +713 1603 1.765275231247376e-05 +713 1604 -6.119691313295281e-05 +713 1605 7.076249207781823e-04 +713 1606 3.849668443894305e-04 +713 1607 -1.104912573429301e-04 +713 1608 6.092043978102605e-05 +713 1609 -3.642594225309528e-05 +713 1610 1.984761106267066e-05 +713 1611 -6.335955594805252e-06 +714 1603 1.148247091496596e-06 +714 1604 -6.380257597868736e-06 +714 1605 4.800413127073594e-05 +714 1606 8.634705252154623e-04 +714 1607 8.525740288518580e-05 +714 1608 -2.132703484630127e-05 +714 1609 9.575317381097236e-06 +714 1610 -4.563719592099414e-06 +714 1611 1.377888192291335e-06 +715 1603 -1.361668801094748e-05 +715 1604 4.587104641602209e-05 +715 1605 -1.034397545291548e-04 +715 1606 3.790325123654129e-04 +715 1607 7.486490616400452e-04 +715 1608 -1.196774105566829e-04 +715 1609 6.132507092318516e-05 +715 1610 -3.133670432002823e-05 +715 1611 9.755366072147912e-06 +716 1603 9.755366072147734e-06 +716 1604 -3.133670432002769e-05 +716 1605 6.132507092318422e-05 +716 1606 -1.196774105566817e-04 +716 1607 7.486490616400548e-04 +716 1608 3.790325123653998e-04 +716 1609 -1.034397545291509e-04 +716 1610 4.587104641602056e-05 +716 1611 -1.361668801094704e-05 +717 1603 1.377888192290853e-06 +717 1604 -4.563719592097881e-06 +717 1605 9.575317381094329e-06 +717 1606 -2.132703484629599e-05 +717 1607 8.525740288517513e-05 +717 1608 8.634705252154617e-04 +717 1609 4.800413127074611e-05 +717 1610 -6.380257597871832e-06 +717 1611 1.148247091497472e-06 +718 1603 -6.335955594805126e-06 +718 1604 1.984761106267026e-05 +718 1605 -3.642594225309452e-05 +718 1606 6.092043978102466e-05 +718 1607 -1.104912573429270e-04 +718 1608 3.849668443894141e-04 +718 1609 7.076249207781973e-04 +718 1610 -6.119691313295334e-05 +718 1611 1.765275231247380e-05 +719 1603 4.258276866270855e-06 +719 1604 -1.316860931848948e-05 +719 1605 2.343321932569743e-05 +719 1606 -3.672666032321964e-05 +719 1607 5.705134647633450e-05 +719 1608 -9.844594048836265e-05 +719 1609 5.028688547500413e-04 +719 1610 5.376012869668938e-04 +719 1611 -3.092742551660388e-07 +720 1621 -3.092742551660456e-07 +720 1622 5.376012869668938e-04 +720 1623 5.028688547500412e-04 +720 1624 -9.844594048836264e-05 +720 1625 5.705134647633449e-05 +720 1626 -3.672666032321964e-05 +720 1627 2.343321932569743e-05 +720 1628 -1.316860931848948e-05 +720 1629 4.258276866270857e-06 +721 1621 1.765275231247376e-05 +721 1622 -6.119691313295281e-05 +721 1623 7.076249207781823e-04 +721 1624 3.849668443894305e-04 +721 1625 -1.104912573429301e-04 +721 1626 6.092043978102605e-05 +721 1627 -3.642594225309528e-05 +721 1628 1.984761106267066e-05 +721 1629 -6.335955594805252e-06 +722 1621 1.148247091497468e-06 +722 1622 -6.380257597871737e-06 +722 1623 4.800413127074308e-05 +722 1624 8.634705252154652e-04 +722 1625 8.525740288517452e-05 +722 1626 -2.132703484629570e-05 +722 1627 9.575317381094163e-06 +722 1628 -4.563719592097798e-06 +722 1629 1.377888192290828e-06 +723 1621 -1.361668801094695e-05 +723 1622 4.587104641602026e-05 +723 1623 -1.034397545291503e-04 +723 1624 3.790325123653988e-04 +723 1625 7.486490616400534e-04 +723 1626 -1.196774105566789e-04 +723 1627 6.132507092318331e-05 +723 1628 -3.133670432002728e-05 +723 1629 9.755366072147612e-06 +724 1621 9.755366072148349e-06 +724 1622 -3.133670432002964e-05 +724 1623 6.132507092318791e-05 +724 1624 -1.196774105566881e-04 +724 1625 7.486490616400383e-04 +724 1626 3.790325123654264e-04 +724 1627 -1.034397545291594e-04 +724 1628 4.587104641602415e-05 +724 1629 -1.361668801094809e-05 +725 1621 1.377888192291336e-06 +725 1622 -4.563719592099415e-06 +725 1623 9.575317381097243e-06 +725 1624 -2.132703484630127e-05 +725 1625 8.525740288518581e-05 +725 1626 8.634705252154623e-04 +725 1627 4.800413127073595e-05 +725 1628 -6.380257597868736e-06 +725 1629 1.148247091496593e-06 +726 1621 -6.335955594805249e-06 +726 1622 1.984761106267065e-05 +726 1623 -3.642594225309528e-05 +726 1624 6.092043978102606e-05 +726 1625 -1.104912573429301e-04 +726 1626 3.849668443894307e-04 +726 1627 7.076249207781824e-04 +726 1628 -6.119691313295284e-05 +726 1629 1.765275231247377e-05 +727 1621 4.258276866270855e-06 +727 1622 -1.316860931848948e-05 +727 1623 2.343321932569743e-05 +727 1624 -3.672666032321964e-05 +727 1625 5.705134647633450e-05 +727 1626 -9.844594048836265e-05 +727 1627 5.028688547500413e-04 +727 1628 5.376012869668938e-04 +727 1629 -3.092742551660388e-07 +728 1630 -3.092742551682140e-07 +728 1631 5.376012869669123e-04 +728 1632 5.028688547500232e-04 +728 1633 -9.844594048836125e-05 +728 1634 5.705134647633492e-05 +728 1635 -3.672666032322016e-05 +728 1636 2.343321932569782e-05 +728 1637 -1.316860931848972e-05 +728 1638 4.258276866270936e-06 +729 1630 1.765275231247473e-05 +729 1631 -6.119691313295438e-05 +729 1632 7.076249207781700e-04 +729 1633 3.849668443894479e-04 +729 1634 -1.104912573429369e-04 +729 1635 6.092043978102990e-05 +729 1636 -3.642594225309760e-05 +729 1637 1.984761106267193e-05 +729 1638 -6.335955594805658e-06 +730 1630 1.148247091496596e-06 +730 1631 -6.380257597868736e-06 +730 1632 4.800413127073594e-05 +730 1633 8.634705252154623e-04 +730 1634 8.525740288518580e-05 +730 1635 -2.132703484630127e-05 +730 1636 9.575317381097236e-06 +730 1637 -4.563719592099414e-06 +730 1638 1.377888192291335e-06 +731 1630 -1.361668801094748e-05 +731 1631 4.587104641602209e-05 +731 1632 -1.034397545291548e-04 +731 1633 3.790325123654129e-04 +731 1634 7.486490616400452e-04 +731 1635 -1.196774105566829e-04 +731 1636 6.132507092318516e-05 +731 1637 -3.133670432002823e-05 +731 1638 9.755366072147912e-06 +732 1630 9.755366072147908e-06 +732 1631 -3.133670432002823e-05 +732 1632 6.132507092318517e-05 +732 1633 -1.196774105566829e-04 +732 1634 7.486490616400453e-04 +732 1635 3.790325123654129e-04 +732 1636 -1.034397545291548e-04 +732 1637 4.587104641602210e-05 +732 1638 -1.361668801094748e-05 +733 1630 1.377888192291815e-06 +733 1631 -4.563719592100925e-06 +733 1632 9.575317381100051e-06 +733 1633 -2.132703484630611e-05 +733 1634 8.525740288519531e-05 +733 1635 8.634705252154649e-04 +733 1636 4.800413127072397e-05 +733 1637 -6.380257597864636e-06 +733 1638 1.148247091495458e-06 +734 1630 -6.335955594805559e-06 +734 1631 1.984761106267162e-05 +734 1632 -3.642594225309704e-05 +734 1633 6.092043978102891e-05 +734 1634 -1.104912573429349e-04 +734 1635 3.849668443894485e-04 +734 1636 7.076249207781677e-04 +734 1637 -6.119691313295357e-05 +734 1638 1.765275231247450e-05 +735 1630 4.258276866270935e-06 +735 1631 -1.316860931848972e-05 +735 1632 2.343321932569782e-05 +735 1633 -3.672666032322016e-05 +735 1634 5.705134647633492e-05 +735 1635 -9.844594048836125e-05 +735 1636 5.028688547500233e-04 +735 1637 5.376012869669124e-04 +735 1638 -3.092742551682106e-07 +736 1657 -3.092742551660456e-07 +736 1658 5.376012869668938e-04 +736 1659 5.028688547500412e-04 +736 1660 -9.844594048836264e-05 +736 1661 5.705134647633449e-05 +736 1662 -3.672666032321964e-05 +736 1663 2.343321932569743e-05 +736 1664 -1.316860931848948e-05 +736 1665 4.258276866270857e-06 +737 1657 1.765275231247376e-05 +737 1658 -6.119691313295281e-05 +737 1659 7.076249207781823e-04 +737 1660 3.849668443894305e-04 +737 1661 -1.104912573429301e-04 +737 1662 6.092043978102605e-05 +737 1663 -3.642594225309528e-05 +737 1664 1.984761106267066e-05 +737 1665 -6.335955594805252e-06 +738 1657 1.148247091496596e-06 +738 1658 -6.380257597868736e-06 +738 1659 4.800413127073594e-05 +738 1660 8.634705252154623e-04 +738 1661 8.525740288518580e-05 +738 1662 -2.132703484630127e-05 +738 1663 9.575317381097236e-06 +738 1664 -4.563719592099414e-06 +738 1665 1.377888192291335e-06 +739 1657 -1.361668801094809e-05 +739 1658 4.587104641602414e-05 +739 1659 -1.034397545291593e-04 +739 1660 3.790325123654264e-04 +739 1661 7.486490616400382e-04 +739 1662 -1.196774105566881e-04 +739 1663 6.132507092318791e-05 +739 1664 -3.133670432002965e-05 +739 1665 9.755366072148352e-06 +740 1657 9.755366072147609e-06 +740 1658 -3.133670432002727e-05 +740 1659 6.132507092318330e-05 +740 1660 -1.196774105566789e-04 +740 1661 7.486490616400534e-04 +740 1662 3.790325123653988e-04 +740 1663 -1.034397545291503e-04 +740 1664 4.587104641602027e-05 +740 1665 -1.361668801094695e-05 +741 1657 1.377888192290828e-06 +741 1658 -4.563719592097799e-06 +741 1659 9.575317381094173e-06 +741 1660 -2.132703484629570e-05 +741 1661 8.525740288517451e-05 +741 1662 8.634705252154651e-04 +741 1663 4.800413127074308e-05 +741 1664 -6.380257597871731e-06 +741 1665 1.148247091497467e-06 +742 1657 -6.335955594805249e-06 +742 1658 1.984761106267065e-05 +742 1659 -3.642594225309528e-05 +742 1660 6.092043978102606e-05 +742 1661 -1.104912573429301e-04 +742 1662 3.849668443894307e-04 +742 1663 7.076249207781824e-04 +742 1664 -6.119691313295284e-05 +742 1665 1.765275231247377e-05 +743 1657 4.258276866270855e-06 +743 1658 -1.316860931848948e-05 +743 1659 2.343321932569743e-05 +743 1660 -3.672666032321964e-05 +743 1661 5.705134647633450e-05 +743 1662 -9.844594048836265e-05 +743 1663 5.028688547500413e-04 +743 1664 5.376012869668938e-04 +743 1665 -3.092742551660388e-07 +744 1666 -3.092742551660456e-07 +744 1667 5.376012869668938e-04 +744 1668 5.028688547500412e-04 +744 1669 -9.844594048836264e-05 +744 1670 5.705134647633449e-05 +744 1671 -3.672666032321964e-05 +744 1672 2.343321932569743e-05 +744 1673 -1.316860931848948e-05 +744 1674 4.258276866270857e-06 +745 1666 1.765275231247379e-05 +745 1667 -6.119691313295333e-05 +745 1668 7.076249207781972e-04 +745 1669 3.849668443894141e-04 +745 1670 -1.104912573429271e-04 +745 1671 6.092043978102465e-05 +745 1672 -3.642594225309452e-05 +745 1673 1.984761106267026e-05 +745 1674 -6.335955594805128e-06 +746 1666 1.148247091497472e-06 +746 1667 -6.380257597871839e-06 +746 1668 4.800413127074611e-05 +746 1669 8.634705252154617e-04 +746 1670 8.525740288517516e-05 +746 1671 -2.132703484629598e-05 +746 1672 9.575317381094319e-06 +746 1673 -4.563719592097879e-06 +746 1674 1.377888192290853e-06 +747 1666 -1.361668801094704e-05 +747 1667 4.587104641602054e-05 +747 1668 -1.034397545291509e-04 +747 1669 3.790325123653999e-04 +747 1670 7.486490616400549e-04 +747 1671 -1.196774105566817e-04 +747 1672 6.132507092318424e-05 +747 1673 -3.133670432002769e-05 +747 1674 9.755366072147736e-06 +748 1666 9.755366072147908e-06 +748 1667 -3.133670432002823e-05 +748 1668 6.132507092318517e-05 +748 1669 -1.196774105566829e-04 +748 1670 7.486490616400453e-04 +748 1671 3.790325123654129e-04 +748 1672 -1.034397545291548e-04 +748 1673 4.587104641602210e-05 +748 1674 -1.361668801094748e-05 +749 1666 1.377888192291336e-06 +749 1667 -4.563719592099415e-06 +749 1668 9.575317381097243e-06 +749 1669 -2.132703484630127e-05 +749 1670 8.525740288518581e-05 +749 1671 8.634705252154623e-04 +749 1672 4.800413127073595e-05 +749 1673 -6.380257597868736e-06 +749 1674 1.148247091496593e-06 +750 1666 -6.335955594805249e-06 +750 1667 1.984761106267065e-05 +750 1668 -3.642594225309528e-05 +750 1669 6.092043978102606e-05 +750 1670 -1.104912573429301e-04 +750 1671 3.849668443894307e-04 +750 1672 7.076249207781824e-04 +750 1673 -6.119691313295284e-05 +750 1674 1.765275231247377e-05 +751 1666 4.258276866271436e-06 +751 1667 -1.316860931849127e-05 +751 1668 2.343321932570061e-05 +751 1669 -3.672666032322458e-05 +751 1670 5.705134647634201e-05 +751 1671 -9.844594048837511e-05 +751 1672 5.028688547500727e-04 +751 1673 5.376012869668634e-04 +751 1674 -3.092742551590390e-07 +752 1684 -3.092742551587374e-07 +752 1685 5.376012869668621e-04 +752 1686 5.028688547500707e-04 +752 1687 -9.844594048837149e-05 +752 1688 5.705134647634055e-05 +752 1689 -3.672666032322373e-05 +752 1690 2.343321932570010e-05 +752 1691 -1.316860931849099e-05 +752 1692 4.258276866271348e-06 +753 1684 1.765275231247523e-05 +753 1685 -6.119691313295842e-05 +753 1686 7.076249207781732e-04 +753 1687 3.849668443894483e-04 +753 1688 -1.104912573429373e-04 +753 1689 6.092043978103018e-05 +753 1690 -3.642594225309779e-05 +753 1691 1.984761106267204e-05 +753 1692 -6.335955594805693e-06 +754 1684 1.148247091496596e-06 +754 1685 -6.380257597868736e-06 +754 1686 4.800413127073594e-05 +754 1687 8.634705252154623e-04 +754 1688 8.525740288518580e-05 +754 1689 -2.132703484630127e-05 +754 1690 9.575317381097236e-06 +754 1691 -4.563719592099414e-06 +754 1692 1.377888192291335e-06 +755 1684 -1.361668801094748e-05 +755 1685 4.587104641602209e-05 +755 1686 -1.034397545291548e-04 +755 1687 3.790325123654129e-04 +755 1688 7.486490616400452e-04 +755 1689 -1.196774105566829e-04 +755 1690 6.132507092318516e-05 +755 1691 -3.133670432002823e-05 +755 1692 9.755366072147912e-06 +756 1684 9.755366072147908e-06 +756 1685 -3.133670432002823e-05 +756 1686 6.132507092318517e-05 +756 1687 -1.196774105566829e-04 +756 1688 7.486490616400453e-04 +756 1689 3.790325123654129e-04 +756 1690 -1.034397545291548e-04 +756 1691 4.587104641602210e-05 +756 1692 -1.361668801094748e-05 +757 1684 1.377888192291841e-06 +757 1685 -4.563719592101006e-06 +757 1686 9.575317381100207e-06 +757 1687 -2.132703484630640e-05 +757 1688 8.525740288519594e-05 +757 1689 8.634705252154616e-04 +757 1690 4.800413127072702e-05 +757 1691 -6.380257597864738e-06 +757 1692 1.148247091495463e-06 +758 1684 -6.335955594804993e-06 +758 1685 1.984761106266985e-05 +758 1686 -3.642594225309376e-05 +758 1687 6.092043978102340e-05 +758 1688 -1.104912573429247e-04 +758 1689 3.849668443894141e-04 +758 1690 7.076249207781916e-04 +758 1691 -6.119691313294849e-05 +758 1692 1.765275231247306e-05 +759 1684 4.258276866271024e-06 +759 1685 -1.316860931849000e-05 +759 1686 2.343321932569833e-05 +759 1687 -3.672666032322100e-05 +759 1688 5.705134647633637e-05 +759 1689 -9.844594048836488e-05 +759 1690 5.028688547500252e-04 +759 1691 5.376012869669135e-04 +759 1692 -3.092742551685088e-07 +760 1693 -3.092742551660456e-07 +760 1694 5.376012869668938e-04 +760 1695 5.028688547500412e-04 +760 1696 -9.844594048836264e-05 +760 1697 5.705134647633449e-05 +760 1698 -3.672666032321964e-05 +760 1699 2.343321932569743e-05 +760 1700 -1.316860931848948e-05 +760 1701 4.258276866270857e-06 +761 1693 1.765275231247376e-05 +761 1694 -6.119691313295281e-05 +761 1695 7.076249207781823e-04 +761 1696 3.849668443894305e-04 +761 1697 -1.104912573429301e-04 +761 1698 6.092043978102605e-05 +761 1699 -3.642594225309528e-05 +761 1700 1.984761106267066e-05 +761 1701 -6.335955594805252e-06 +762 1693 1.148247091497413e-06 +762 1694 -6.380257597871538e-06 +762 1695 4.800413127074256e-05 +762 1696 8.634705252154680e-04 +762 1697 8.525740288517197e-05 +762 1698 -2.132703484629570e-05 +762 1699 9.575317381094227e-06 +762 1700 -4.563719592097842e-06 +762 1701 1.377888192290842e-06 +763 1693 -1.361668801094783e-05 +763 1694 4.587104641602328e-05 +763 1695 -1.034397545291574e-04 +763 1696 3.790325123654264e-04 +763 1697 7.486490616400341e-04 +763 1698 -1.196774105566842e-04 +763 1699 6.132507092318638e-05 +763 1700 -3.133670432002891e-05 +763 1701 9.755366072148127e-06 +764 1693 9.755366072148124e-06 +764 1694 -3.133670432002891e-05 +764 1695 6.132507092318638e-05 +764 1696 -1.196774105566842e-04 +764 1697 7.486490616400341e-04 +764 1698 3.790325123654265e-04 +764 1699 -1.034397545291574e-04 +764 1700 4.587104641602330e-05 +764 1701 -1.361668801094783e-05 +765 1693 1.377888192290843e-06 +765 1694 -4.563719592097843e-06 +765 1695 9.575317381094234e-06 +765 1696 -2.132703484629571e-05 +765 1697 8.525740288517196e-05 +765 1698 8.634705252154680e-04 +765 1699 4.800413127074256e-05 +765 1700 -6.380257597871534e-06 +765 1701 1.148247091497411e-06 +766 1693 -6.335955594805249e-06 +766 1694 1.984761106267065e-05 +766 1695 -3.642594225309528e-05 +766 1696 6.092043978102606e-05 +766 1697 -1.104912573429301e-04 +766 1698 3.849668443894307e-04 +766 1699 7.076249207781824e-04 +766 1700 -6.119691313295284e-05 +766 1701 1.765275231247377e-05 +767 1693 4.258276866270855e-06 +767 1694 -1.316860931848948e-05 +767 1695 2.343321932569743e-05 +767 1696 -3.672666032321964e-05 +767 1697 5.705134647633450e-05 +767 1698 -9.844594048836265e-05 +767 1699 5.028688547500413e-04 +767 1700 5.376012869668938e-04 +767 1701 -3.092742551660388e-07 +768 1747 -3.092742551685156e-07 +768 1748 5.376012869669135e-04 +768 1749 5.028688547500251e-04 +768 1750 -9.844594048836486e-05 +768 1751 5.705134647633637e-05 +768 1752 -3.672666032322100e-05 +768 1753 2.343321932569834e-05 +768 1754 -1.316860931849000e-05 +768 1755 4.258276866271026e-06 +769 1747 1.765275231247305e-05 +769 1748 -6.119691313294845e-05 +769 1749 7.076249207781914e-04 +769 1750 3.849668443894142e-04 +769 1751 -1.104912573429247e-04 +769 1752 6.092043978102339e-05 +769 1753 -3.642594225309376e-05 +769 1754 1.984761106266984e-05 +769 1755 -6.335955594804996e-06 +770 1747 1.148247091495520e-06 +770 1748 -6.380257597864937e-06 +770 1749 4.800413127072755e-05 +770 1750 8.634705252154587e-04 +770 1751 8.525740288519847e-05 +770 1752 -2.132703484630638e-05 +770 1753 9.575317381100136e-06 +770 1754 -4.563719592100962e-06 +770 1755 1.377888192291826e-06 +771 1747 -1.361668801094720e-05 +771 1748 4.587104641602111e-05 +771 1749 -1.034397545291522e-04 +771 1750 3.790325123653987e-04 +771 1751 7.486490616400577e-04 +771 1752 -1.196774105566828e-04 +771 1753 6.132507092318485e-05 +771 1754 -3.133670432002801e-05 +771 1755 9.755366072147836e-06 +772 1747 9.755366072147908e-06 +772 1748 -3.133670432002823e-05 +772 1749 6.132507092318517e-05 +772 1750 -1.196774105566829e-04 +772 1751 7.486490616400453e-04 +772 1752 3.790325123654129e-04 +772 1753 -1.034397545291548e-04 +772 1754 4.587104641602210e-05 +772 1755 -1.361668801094748e-05 +773 1747 1.377888192291336e-06 +773 1748 -4.563719592099415e-06 +773 1749 9.575317381097243e-06 +773 1750 -2.132703484630127e-05 +773 1751 8.525740288518581e-05 +773 1752 8.634705252154623e-04 +773 1753 4.800413127073595e-05 +773 1754 -6.380257597868736e-06 +773 1755 1.148247091496593e-06 +774 1747 -6.335955594805691e-06 +774 1748 1.984761106267203e-05 +774 1749 -3.642594225309779e-05 +774 1750 6.092043978103018e-05 +774 1751 -1.104912573429373e-04 +774 1752 3.849668443894484e-04 +774 1753 7.076249207781733e-04 +774 1754 -6.119691313295844e-05 +774 1755 1.765275231247524e-05 +775 1747 4.258276866271346e-06 +775 1748 -1.316860931849099e-05 +775 1749 2.343321932570010e-05 +775 1750 -3.672666032322374e-05 +775 1751 5.705134647634056e-05 +775 1752 -9.844594048837149e-05 +775 1753 5.028688547500707e-04 +775 1754 5.376012869668622e-04 +775 1755 -3.092742551587408e-07 +776 1756 -3.092742551587374e-07 +776 1757 5.376012869668621e-04 +776 1758 5.028688547500707e-04 +776 1759 -9.844594048837149e-05 +776 1760 5.705134647634055e-05 +776 1761 -3.672666032322373e-05 +776 1762 2.343321932570010e-05 +776 1763 -1.316860931849099e-05 +776 1764 4.258276866271348e-06 +777 1756 1.765275231247523e-05 +777 1757 -6.119691313295842e-05 +777 1758 7.076249207781732e-04 +777 1759 3.849668443894483e-04 +777 1760 -1.104912573429373e-04 +777 1761 6.092043978103018e-05 +777 1762 -3.642594225309779e-05 +777 1763 1.984761106267204e-05 +777 1764 -6.335955594805693e-06 +778 1756 1.148247091496596e-06 +778 1757 -6.380257597868736e-06 +778 1758 4.800413127073594e-05 +778 1759 8.634705252154623e-04 +778 1760 8.525740288518580e-05 +778 1761 -2.132703484630127e-05 +778 1762 9.575317381097236e-06 +778 1763 -4.563719592099414e-06 +778 1764 1.377888192291335e-06 +779 1756 -1.361668801094748e-05 +779 1757 4.587104641602209e-05 +779 1758 -1.034397545291548e-04 +779 1759 3.790325123654129e-04 +779 1760 7.486490616400452e-04 +779 1761 -1.196774105566829e-04 +779 1762 6.132507092318516e-05 +779 1763 -3.133670432002823e-05 +779 1764 9.755366072147912e-06 +780 1756 9.755366072147834e-06 +780 1757 -3.133670432002801e-05 +780 1758 6.132507092318485e-05 +780 1759 -1.196774105566828e-04 +780 1760 7.486490616400576e-04 +780 1761 3.790325123653988e-04 +780 1762 -1.034397545291522e-04 +780 1763 4.587104641602113e-05 +780 1764 -1.361668801094721e-05 +781 1756 1.377888192291826e-06 +781 1757 -4.563719592100962e-06 +781 1758 9.575317381100146e-06 +781 1759 -2.132703484630639e-05 +781 1760 8.525740288519848e-05 +781 1761 8.634705252154587e-04 +781 1762 4.800413127072753e-05 +781 1763 -6.380257597864934e-06 +781 1764 1.148247091495519e-06 +782 1756 -6.335955594805027e-06 +782 1757 1.984761106266995e-05 +782 1758 -3.642594225309395e-05 +782 1759 6.092043978102368e-05 +782 1760 -1.104912573429251e-04 +782 1761 3.849668443894146e-04 +782 1762 7.076249207781948e-04 +782 1763 -6.119691313295251e-05 +782 1764 1.765275231247357e-05 +783 1756 4.258276866270855e-06 +783 1757 -1.316860931848948e-05 +783 1758 2.343321932569743e-05 +783 1759 -3.672666032321964e-05 +783 1760 5.705134647633450e-05 +783 1761 -9.844594048836265e-05 +783 1762 5.028688547500413e-04 +783 1763 5.376012869668938e-04 +783 1764 -3.092742551660388e-07 +784 1774 -3.092742551660456e-07 +784 1775 5.376012869668938e-04 +784 1776 5.028688547500412e-04 +784 1777 -9.844594048836264e-05 +784 1778 5.705134647633449e-05 +784 1779 -3.672666032321964e-05 +784 1780 2.343321932569743e-05 +784 1781 -1.316860931848948e-05 +784 1782 4.258276866270857e-06 +785 1774 1.765275231247376e-05 +785 1775 -6.119691313295281e-05 +785 1776 7.076249207781823e-04 +785 1777 3.849668443894305e-04 +785 1778 -1.104912573429301e-04 +785 1779 6.092043978102605e-05 +785 1780 -3.642594225309528e-05 +785 1781 1.984761106267066e-05 +785 1782 -6.335955594805252e-06 +786 1774 1.148247091497413e-06 +786 1775 -6.380257597871538e-06 +786 1776 4.800413127074256e-05 +786 1777 8.634705252154680e-04 +786 1778 8.525740288517197e-05 +786 1779 -2.132703484629570e-05 +786 1780 9.575317381094227e-06 +786 1781 -4.563719592097842e-06 +786 1782 1.377888192290842e-06 +787 1774 -1.361668801094783e-05 +787 1775 4.587104641602328e-05 +787 1776 -1.034397545291574e-04 +787 1777 3.790325123654264e-04 +787 1778 7.486490616400341e-04 +787 1779 -1.196774105566842e-04 +787 1780 6.132507092318638e-05 +787 1781 -3.133670432002891e-05 +787 1782 9.755366072148127e-06 +788 1774 9.755366072148225e-06 +788 1775 -3.133670432002923e-05 +788 1776 6.132507092318699e-05 +788 1777 -1.196774105566853e-04 +788 1778 7.486490616400369e-04 +788 1779 3.790325123654253e-04 +788 1780 -1.034397545291588e-04 +788 1781 4.587104641602387e-05 +788 1782 -1.361668801094800e-05 +789 1774 1.377888192291336e-06 +789 1775 -4.563719592099415e-06 +789 1776 9.575317381097243e-06 +789 1777 -2.132703484630127e-05 +789 1778 8.525740288518581e-05 +789 1779 8.634705252154623e-04 +789 1780 4.800413127073595e-05 +789 1781 -6.380257597868736e-06 +789 1782 1.148247091496593e-06 +790 1774 -6.335955594805249e-06 +790 1775 1.984761106267065e-05 +790 1776 -3.642594225309528e-05 +790 1777 6.092043978102606e-05 +790 1778 -1.104912573429301e-04 +790 1779 3.849668443894307e-04 +790 1780 7.076249207781824e-04 +790 1781 -6.119691313295284e-05 +790 1782 1.765275231247377e-05 +791 1774 4.258276866270855e-06 +791 1775 -1.316860931848948e-05 +791 1776 2.343321932569743e-05 +791 1777 -3.672666032321964e-05 +791 1778 5.705134647633450e-05 +791 1779 -9.844594048836265e-05 +791 1780 5.028688547500413e-04 +791 1781 5.376012869668938e-04 +791 1782 -3.092742551660388e-07 +792 1783 -3.092742551682140e-07 +792 1784 5.376012869669123e-04 +792 1785 5.028688547500232e-04 +792 1786 -9.844594048836125e-05 +792 1787 5.705134647633492e-05 +792 1788 -3.672666032322016e-05 +792 1789 2.343321932569782e-05 +792 1790 -1.316860931848972e-05 +792 1791 4.258276866270936e-06 +793 1783 1.765275231247450e-05 +793 1784 -6.119691313295354e-05 +793 1785 7.076249207781675e-04 +793 1786 3.849668443894484e-04 +793 1787 -1.104912573429350e-04 +793 1788 6.092043978102891e-05 +793 1789 -3.642594225309703e-05 +793 1790 1.984761106267162e-05 +793 1791 -6.335955594805561e-06 +794 1783 1.148247091495461e-06 +794 1784 -6.380257597864636e-06 +794 1785 4.800413127072398e-05 +794 1786 8.634705252154649e-04 +794 1787 8.525740288519530e-05 +794 1788 -2.132703484630611e-05 +794 1789 9.575317381100045e-06 +794 1790 -4.563719592100925e-06 +794 1791 1.377888192291815e-06 +795 1783 -1.361668801094748e-05 +795 1784 4.587104641602209e-05 +795 1785 -1.034397545291548e-04 +795 1786 3.790325123654129e-04 +795 1787 7.486490616400452e-04 +795 1788 -1.196774105566829e-04 +795 1789 6.132507092318516e-05 +795 1790 -3.133670432002823e-05 +795 1791 9.755366072147912e-06 +796 1783 9.755366072147908e-06 +796 1784 -3.133670432002823e-05 +796 1785 6.132507092318517e-05 +796 1786 -1.196774105566829e-04 +796 1787 7.486490616400453e-04 +796 1788 3.790325123654129e-04 +796 1789 -1.034397545291548e-04 +796 1790 4.587104641602210e-05 +796 1791 -1.361668801094748e-05 +797 1783 1.377888192291815e-06 +797 1784 -4.563719592100925e-06 +797 1785 9.575317381100051e-06 +797 1786 -2.132703484630611e-05 +797 1787 8.525740288519531e-05 +797 1788 8.634705252154649e-04 +797 1789 4.800413127072397e-05 +797 1790 -6.380257597864636e-06 +797 1791 1.148247091495458e-06 +798 1783 -6.335955594805559e-06 +798 1784 1.984761106267162e-05 +798 1785 -3.642594225309704e-05 +798 1786 6.092043978102891e-05 +798 1787 -1.104912573429349e-04 +798 1788 3.849668443894485e-04 +798 1789 7.076249207781677e-04 +798 1790 -6.119691313295357e-05 +798 1791 1.765275231247450e-05 +799 1783 4.258276866271090e-06 +799 1784 -1.316860931849019e-05 +799 1785 2.343321932569865e-05 +799 1786 -3.672666032322142e-05 +799 1787 5.705134647633676e-05 +799 1788 -9.844594048836400e-05 +799 1789 5.028688547500280e-04 +799 1790 5.376012869669000e-04 +799 1791 -3.092742551587137e-07 +800 1810 -3.092742551685393e-07 +800 1811 5.376012869668758e-04 +800 1812 5.028688547500679e-04 +800 1813 -9.844594048837236e-05 +800 1814 5.705134647634017e-05 +800 1815 -3.672666032322331e-05 +800 1816 2.343321932569977e-05 +800 1817 -1.316860931849080e-05 +800 1818 4.258276866271282e-06 +801 1810 1.765275231247376e-05 +801 1811 -6.119691313295281e-05 +801 1812 7.076249207781823e-04 +801 1813 3.849668443894305e-04 +801 1814 -1.104912573429301e-04 +801 1815 6.092043978102605e-05 +801 1816 -3.642594225309528e-05 +801 1817 1.984761106267066e-05 +801 1818 -6.335955594805252e-06 +802 1810 1.148247091496596e-06 +802 1811 -6.380257597868736e-06 +802 1812 4.800413127073594e-05 +802 1813 8.634705252154623e-04 +802 1814 8.525740288518580e-05 +802 1815 -2.132703484630127e-05 +802 1816 9.575317381097236e-06 +802 1817 -4.563719592099414e-06 +802 1818 1.377888192291335e-06 +803 1810 -1.361668801094809e-05 +803 1811 4.587104641602414e-05 +803 1812 -1.034397545291593e-04 +803 1813 3.790325123654264e-04 +803 1814 7.486490616400382e-04 +803 1815 -1.196774105566881e-04 +803 1816 6.132507092318791e-05 +803 1817 -3.133670432002965e-05 +803 1818 9.755366072148352e-06 +804 1810 9.755366072147609e-06 +804 1811 -3.133670432002727e-05 +804 1812 6.132507092318330e-05 +804 1813 -1.196774105566789e-04 +804 1814 7.486490616400534e-04 +804 1815 3.790325123653988e-04 +804 1816 -1.034397545291503e-04 +804 1817 4.587104641602027e-05 +804 1818 -1.361668801094695e-05 +805 1810 1.377888192290853e-06 +805 1811 -4.563719592097881e-06 +805 1812 9.575317381094329e-06 +805 1813 -2.132703484629599e-05 +805 1814 8.525740288517513e-05 +805 1815 8.634705252154617e-04 +805 1816 4.800413127074611e-05 +805 1817 -6.380257597871832e-06 +805 1818 1.148247091497472e-06 +806 1810 -6.335955594805126e-06 +806 1811 1.984761106267026e-05 +806 1812 -3.642594225309452e-05 +806 1813 6.092043978102466e-05 +806 1814 -1.104912573429270e-04 +806 1815 3.849668443894141e-04 +806 1816 7.076249207781973e-04 +806 1817 -6.119691313295334e-05 +806 1818 1.765275231247380e-05 +807 1810 4.258276866270855e-06 +807 1811 -1.316860931848948e-05 +807 1812 2.343321932569743e-05 +807 1813 -3.672666032321964e-05 +807 1814 5.705134647633450e-05 +807 1815 -9.844594048836265e-05 +807 1816 5.028688547500413e-04 +807 1817 5.376012869668938e-04 +807 1818 -3.092742551660388e-07 +808 1819 -3.092742551660456e-07 +808 1820 5.376012869668938e-04 +808 1821 5.028688547500412e-04 +808 1822 -9.844594048836264e-05 +808 1823 5.705134647633449e-05 +808 1824 -3.672666032321964e-05 +808 1825 2.343321932569743e-05 +808 1826 -1.316860931848948e-05 +808 1827 4.258276866270857e-06 +809 1819 1.765275231247379e-05 +809 1820 -6.119691313295333e-05 +809 1821 7.076249207781972e-04 +809 1822 3.849668443894141e-04 +809 1823 -1.104912573429271e-04 +809 1824 6.092043978102465e-05 +809 1825 -3.642594225309452e-05 +809 1826 1.984761106267026e-05 +809 1827 -6.335955594805128e-06 +810 1819 1.148247091497472e-06 +810 1820 -6.380257597871839e-06 +810 1821 4.800413127074611e-05 +810 1822 8.634705252154617e-04 +810 1823 8.525740288517516e-05 +810 1824 -2.132703484629598e-05 +810 1825 9.575317381094319e-06 +810 1826 -4.563719592097879e-06 +810 1827 1.377888192290853e-06 +811 1819 -1.361668801094695e-05 +811 1820 4.587104641602026e-05 +811 1821 -1.034397545291503e-04 +811 1822 3.790325123653988e-04 +811 1823 7.486490616400534e-04 +811 1824 -1.196774105566789e-04 +811 1825 6.132507092318331e-05 +811 1826 -3.133670432002728e-05 +811 1827 9.755366072147612e-06 +812 1819 9.755366072148349e-06 +812 1820 -3.133670432002964e-05 +812 1821 6.132507092318791e-05 +812 1822 -1.196774105566881e-04 +812 1823 7.486490616400383e-04 +812 1824 3.790325123654264e-04 +812 1825 -1.034397545291594e-04 +812 1826 4.587104641602415e-05 +812 1827 -1.361668801094809e-05 +813 1819 1.377888192291336e-06 +813 1820 -4.563719592099415e-06 +813 1821 9.575317381097243e-06 +813 1822 -2.132703484630127e-05 +813 1823 8.525740288518581e-05 +813 1824 8.634705252154623e-04 +813 1825 4.800413127073595e-05 +813 1826 -6.380257597868736e-06 +813 1827 1.148247091496593e-06 +814 1819 -6.335955594805249e-06 +814 1820 1.984761106267065e-05 +814 1821 -3.642594225309528e-05 +814 1822 6.092043978102606e-05 +814 1823 -1.104912573429301e-04 +814 1824 3.849668443894307e-04 +814 1825 7.076249207781824e-04 +814 1826 -6.119691313295284e-05 +814 1827 1.765275231247377e-05 +815 1819 4.258276866271280e-06 +815 1820 -1.316860931849079e-05 +815 1821 2.343321932569977e-05 +815 1822 -3.672666032322331e-05 +815 1823 5.705134647634017e-05 +815 1824 -9.844594048837236e-05 +815 1825 5.028688547500680e-04 +815 1826 5.376012869668758e-04 +815 1827 -3.092742551685359e-07 +816 1837 -3.092742551587137e-07 +816 1838 5.376012869668999e-04 +816 1839 5.028688547500278e-04 +816 1840 -9.844594048836400e-05 +816 1841 5.705134647633676e-05 +816 1842 -3.672666032322142e-05 +816 1843 2.343321932569866e-05 +816 1844 -1.316860931849019e-05 +816 1845 4.258276866271092e-06 +817 1837 1.765275231247450e-05 +817 1838 -6.119691313295354e-05 +817 1839 7.076249207781675e-04 +817 1840 3.849668443894484e-04 +817 1841 -1.104912573429350e-04 +817 1842 6.092043978102891e-05 +817 1843 -3.642594225309703e-05 +817 1844 1.984761106267162e-05 +817 1845 -6.335955594805561e-06 +818 1837 1.148247091495461e-06 +818 1838 -6.380257597864636e-06 +818 1839 4.800413127072398e-05 +818 1840 8.634705252154649e-04 +818 1841 8.525740288519530e-05 +818 1842 -2.132703484630611e-05 +818 1843 9.575317381100045e-06 +818 1844 -4.563719592100925e-06 +818 1845 1.377888192291815e-06 +819 1837 -1.361668801094748e-05 +819 1838 4.587104641602209e-05 +819 1839 -1.034397545291548e-04 +819 1840 3.790325123654129e-04 +819 1841 7.486490616400452e-04 +819 1842 -1.196774105566829e-04 +819 1843 6.132507092318516e-05 +819 1844 -3.133670432002823e-05 +819 1845 9.755366072147912e-06 +820 1837 9.755366072147908e-06 +820 1838 -3.133670432002823e-05 +820 1839 6.132507092318517e-05 +820 1840 -1.196774105566829e-04 +820 1841 7.486490616400453e-04 +820 1842 3.790325123654129e-04 +820 1843 -1.034397545291548e-04 +820 1844 4.587104641602210e-05 +820 1845 -1.361668801094748e-05 +821 1837 1.377888192291815e-06 +821 1838 -4.563719592100925e-06 +821 1839 9.575317381100051e-06 +821 1840 -2.132703484630611e-05 +821 1841 8.525740288519531e-05 +821 1842 8.634705252154649e-04 +821 1843 4.800413127072397e-05 +821 1844 -6.380257597864636e-06 +821 1845 1.148247091495458e-06 +822 1837 -6.335955594805559e-06 +822 1838 1.984761106267162e-05 +822 1839 -3.642594225309704e-05 +822 1840 6.092043978102891e-05 +822 1841 -1.104912573429349e-04 +822 1842 3.849668443894485e-04 +822 1843 7.076249207781677e-04 +822 1844 -6.119691313295357e-05 +822 1845 1.765275231247450e-05 +823 1837 4.258276866270935e-06 +823 1838 -1.316860931848972e-05 +823 1839 2.343321932569782e-05 +823 1840 -3.672666032322016e-05 +823 1841 5.705134647633492e-05 +823 1842 -9.844594048836125e-05 +823 1843 5.028688547500233e-04 +823 1844 5.376012869669124e-04 +823 1845 -3.092742551682106e-07 +824 1846 -3.092742551660456e-07 +824 1847 5.376012869668938e-04 +824 1848 5.028688547500412e-04 +824 1849 -9.844594048836264e-05 +824 1850 5.705134647633449e-05 +824 1851 -3.672666032321964e-05 +824 1852 2.343321932569743e-05 +824 1853 -1.316860931848948e-05 +824 1854 4.258276866270857e-06 +825 1846 1.765275231247376e-05 +825 1847 -6.119691313295281e-05 +825 1848 7.076249207781823e-04 +825 1849 3.849668443894305e-04 +825 1850 -1.104912573429301e-04 +825 1851 6.092043978102605e-05 +825 1852 -3.642594225309528e-05 +825 1853 1.984761106267066e-05 +825 1854 -6.335955594805252e-06 +826 1846 1.148247091496596e-06 +826 1847 -6.380257597868736e-06 +826 1848 4.800413127073594e-05 +826 1849 8.634705252154623e-04 +826 1850 8.525740288518580e-05 +826 1851 -2.132703484630127e-05 +826 1852 9.575317381097236e-06 +826 1853 -4.563719592099414e-06 +826 1854 1.377888192291335e-06 +827 1846 -1.361668801094800e-05 +827 1847 4.587104641602385e-05 +827 1848 -1.034397545291588e-04 +827 1849 3.790325123654253e-04 +827 1850 7.486490616400369e-04 +827 1851 -1.196774105566854e-04 +827 1852 6.132507092318699e-05 +827 1853 -3.133670432002923e-05 +827 1854 9.755366072148229e-06 +828 1846 9.755366072148124e-06 +828 1847 -3.133670432002891e-05 +828 1848 6.132507092318638e-05 +828 1849 -1.196774105566842e-04 +828 1850 7.486490616400341e-04 +828 1851 3.790325123654265e-04 +828 1852 -1.034397545291574e-04 +828 1853 4.587104641602330e-05 +828 1854 -1.361668801094783e-05 +829 1846 1.377888192290843e-06 +829 1847 -4.563719592097843e-06 +829 1848 9.575317381094234e-06 +829 1849 -2.132703484629571e-05 +829 1850 8.525740288517196e-05 +829 1851 8.634705252154680e-04 +829 1852 4.800413127074256e-05 +829 1853 -6.380257597871534e-06 +829 1854 1.148247091497411e-06 +830 1846 -6.335955594805249e-06 +830 1847 1.984761106267065e-05 +830 1848 -3.642594225309528e-05 +830 1849 6.092043978102606e-05 +830 1850 -1.104912573429301e-04 +830 1851 3.849668443894307e-04 +830 1852 7.076249207781824e-04 +830 1853 -6.119691313295284e-05 +830 1854 1.765275231247377e-05 +831 1846 4.258276866270855e-06 +831 1847 -1.316860931848948e-05 +831 1848 2.343321932569743e-05 +831 1849 -3.672666032321964e-05 +831 1850 5.705134647633450e-05 +831 1851 -9.844594048836265e-05 +831 1852 5.028688547500413e-04 +831 1853 5.376012869668938e-04 +831 1854 -3.092742551660388e-07 +832 1882 -3.092742551660456e-07 +832 1883 5.376012869668938e-04 +832 1884 5.028688547500412e-04 +832 1885 -9.844594048836264e-05 +832 1886 5.705134647633449e-05 +832 1887 -3.672666032321964e-05 +832 1888 2.343321932569743e-05 +832 1889 -1.316860931848948e-05 +832 1890 4.258276866270857e-06 +833 1882 1.765275231247356e-05 +833 1883 -6.119691313295249e-05 +833 1884 7.076249207781948e-04 +833 1885 3.849668443894146e-04 +833 1886 -1.104912573429251e-04 +833 1887 6.092043978102367e-05 +833 1888 -3.642594225309394e-05 +833 1889 1.984761106266995e-05 +833 1890 -6.335955594805030e-06 +834 1882 1.148247091495520e-06 +834 1883 -6.380257597864937e-06 +834 1884 4.800413127072755e-05 +834 1885 8.634705252154587e-04 +834 1886 8.525740288519847e-05 +834 1887 -2.132703484630638e-05 +834 1888 9.575317381100136e-06 +834 1889 -4.563719592100962e-06 +834 1890 1.377888192291826e-06 +835 1882 -1.361668801094720e-05 +835 1883 4.587104641602111e-05 +835 1884 -1.034397545291522e-04 +835 1885 3.790325123653987e-04 +835 1886 7.486490616400577e-04 +835 1887 -1.196774105566828e-04 +835 1888 6.132507092318485e-05 +835 1889 -3.133670432002801e-05 +835 1890 9.755366072147836e-06 +836 1882 9.755366072147908e-06 +836 1883 -3.133670432002823e-05 +836 1884 6.132507092318517e-05 +836 1885 -1.196774105566829e-04 +836 1886 7.486490616400453e-04 +836 1887 3.790325123654129e-04 +836 1888 -1.034397545291548e-04 +836 1889 4.587104641602210e-05 +836 1890 -1.361668801094748e-05 +837 1882 1.377888192291336e-06 +837 1883 -4.563719592099415e-06 +837 1884 9.575317381097243e-06 +837 1885 -2.132703484630127e-05 +837 1886 8.525740288518581e-05 +837 1887 8.634705252154623e-04 +837 1888 4.800413127073595e-05 +837 1889 -6.380257597868736e-06 +837 1890 1.148247091496593e-06 +838 1882 -6.335955594805691e-06 +838 1883 1.984761106267203e-05 +838 1884 -3.642594225309779e-05 +838 1885 6.092043978103018e-05 +838 1886 -1.104912573429373e-04 +838 1887 3.849668443894484e-04 +838 1888 7.076249207781733e-04 +838 1889 -6.119691313295844e-05 +838 1890 1.765275231247524e-05 +839 1882 4.258276866271346e-06 +839 1883 -1.316860931849099e-05 +839 1884 2.343321932570010e-05 +839 1885 -3.672666032322374e-05 +839 1886 5.705134647634056e-05 +839 1887 -9.844594048837149e-05 +839 1888 5.028688547500707e-04 +839 1889 5.376012869668622e-04 +839 1890 -3.092742551587408e-07 +840 1891 -3.092742551601672e-07 +840 1892 5.376012869668684e-04 +840 1893 5.028688547500722e-04 +840 1894 -9.844594048838057e-05 +840 1895 5.705134647634504e-05 +840 1896 -3.672666032322648e-05 +840 1897 2.343321932570181e-05 +840 1898 -1.316860931849194e-05 +840 1899 4.258276866271654e-06 +841 1891 1.765275231247290e-05 +841 1892 -6.119691313294824e-05 +841 1893 7.076249207781756e-04 +841 1894 3.849668443894335e-04 +841 1895 -1.104912573429300e-04 +841 1896 6.092043978102571e-05 +841 1897 -3.642594225309500e-05 +841 1898 1.984761106267049e-05 +841 1899 -6.335955594805196e-06 +842 1891 1.148247091496596e-06 +842 1892 -6.380257597868736e-06 +842 1893 4.800413127073594e-05 +842 1894 8.634705252154623e-04 +842 1895 8.525740288518580e-05 +842 1896 -2.132703484630127e-05 +842 1897 9.575317381097236e-06 +842 1898 -4.563719592099414e-06 +842 1899 1.377888192291335e-06 +843 1891 -1.361668801094784e-05 +843 1892 4.587104641602325e-05 +843 1893 -1.034397545291571e-04 +843 1894 3.790325123654180e-04 +843 1895 7.486490616400467e-04 +843 1896 -1.196774105566898e-04 +843 1897 6.132507092318794e-05 +843 1898 -3.133670432002954e-05 +843 1899 9.755366072148310e-06 +844 1891 9.755366072147253e-06 +844 1892 -3.133670432002613e-05 +844 1893 6.132507092318102e-05 +844 1894 -1.196774105566746e-04 +844 1895 7.486490616400602e-04 +844 1896 3.790325123653875e-04 +844 1897 -1.034397545291477e-04 +844 1898 4.587104641601899e-05 +844 1899 -1.361668801094656e-05 +845 1891 1.377888192291826e-06 +845 1892 -4.563719592100962e-06 +845 1893 9.575317381100146e-06 +845 1894 -2.132703484630639e-05 +845 1895 8.525740288519848e-05 +845 1896 8.634705252154587e-04 +845 1897 4.800413127072753e-05 +845 1898 -6.380257597864934e-06 +845 1899 1.148247091495519e-06 +846 1891 -6.335955594804993e-06 +846 1892 1.984761106266985e-05 +846 1893 -3.642594225309376e-05 +846 1894 6.092043978102340e-05 +846 1895 -1.104912573429247e-04 +846 1896 3.849668443894141e-04 +846 1897 7.076249207781916e-04 +846 1898 -6.119691313294849e-05 +846 1899 1.765275231247306e-05 +847 1891 4.258276866270360e-06 +847 1892 -1.316860931848796e-05 +847 1893 2.343321932569474e-05 +847 1894 -3.672666032321548e-05 +847 1895 5.705134647632817e-05 +847 1896 -9.844594048835207e-05 +847 1897 5.028688547500002e-04 +847 1898 5.376012869669209e-04 +847 1899 -3.092742551588153e-07 +848 1909 -3.092742551809398e-07 +848 1910 5.376012869669048e-04 +848 1911 5.028688547500476e-04 +848 1912 -9.844594048836702e-05 +848 1913 5.705134647633755e-05 +848 1914 -3.672666032322178e-05 +848 1915 2.343321932569886e-05 +848 1916 -1.316860931849029e-05 +848 1917 4.258276866271123e-06 +849 1909 1.765275231247376e-05 +849 1910 -6.119691313295281e-05 +849 1911 7.076249207781823e-04 +849 1912 3.849668443894305e-04 +849 1913 -1.104912573429301e-04 +849 1914 6.092043978102605e-05 +849 1915 -3.642594225309528e-05 +849 1916 1.984761106267066e-05 +849 1917 -6.335955594805252e-06 +850 1909 1.148247091496957e-06 +850 1910 -6.380257597870030e-06 +850 1911 4.800413127073947e-05 +850 1912 8.634705252154587e-04 +850 1913 8.525740288518639e-05 +850 1914 -2.132703484630026e-05 +850 1915 9.575317381096538e-06 +850 1916 -4.563719592099017e-06 +850 1917 1.377888192291208e-06 +851 1909 -1.361668801094811e-05 +851 1910 4.587104641602420e-05 +851 1911 -1.034397545291593e-04 +851 1912 3.790325123654207e-04 +851 1913 7.486490616400430e-04 +851 1914 -1.196774105566870e-04 +851 1915 6.132507092318780e-05 +851 1916 -3.133670432002963e-05 +851 1917 9.755366072148352e-06 +852 1909 9.755366072148124e-06 +852 1910 -3.133670432002891e-05 +852 1911 6.132507092318638e-05 +852 1912 -1.196774105566842e-04 +852 1913 7.486490616400341e-04 +852 1914 3.790325123654265e-04 +852 1915 -1.034397545291574e-04 +852 1916 4.587104641602330e-05 +852 1917 -1.361668801094783e-05 +853 1909 1.377888192290843e-06 +853 1910 -4.563719592097843e-06 +853 1911 9.575317381094234e-06 +853 1912 -2.132703484629571e-05 +853 1913 8.525740288517196e-05 +853 1914 8.634705252154680e-04 +853 1915 4.800413127074256e-05 +853 1916 -6.380257597871534e-06 +853 1917 1.148247091497411e-06 +854 1909 -6.335955594805249e-06 +854 1910 1.984761106267065e-05 +854 1911 -3.642594225309528e-05 +854 1912 6.092043978102606e-05 +854 1913 -1.104912573429301e-04 +854 1914 3.849668443894307e-04 +854 1915 7.076249207781824e-04 +854 1916 -6.119691313295284e-05 +854 1917 1.765275231247377e-05 +855 1909 4.258276866270855e-06 +855 1910 -1.316860931848948e-05 +855 1911 2.343321932569743e-05 +855 1912 -3.672666032321964e-05 +855 1913 5.705134647633450e-05 +855 1914 -9.844594048836265e-05 +855 1915 5.028688547500413e-04 +855 1916 5.376012869668938e-04 +855 1917 -3.092742551660388e-07 +856 1918 -3.092742551685156e-07 +856 1919 5.376012869669135e-04 +856 1920 5.028688547500251e-04 +856 1921 -9.844594048836486e-05 +856 1922 5.705134647633637e-05 +856 1923 -3.672666032322100e-05 +856 1924 2.343321932569834e-05 +856 1925 -1.316860931849000e-05 +856 1926 4.258276866271026e-06 +857 1918 1.765275231247305e-05 +857 1919 -6.119691313294845e-05 +857 1920 7.076249207781914e-04 +857 1921 3.849668443894142e-04 +857 1922 -1.104912573429247e-04 +857 1923 6.092043978102339e-05 +857 1924 -3.642594225309376e-05 +857 1925 1.984761106266984e-05 +857 1926 -6.335955594804996e-06 +858 1918 1.148247091495464e-06 +858 1919 -6.380257597864738e-06 +858 1920 4.800413127072702e-05 +858 1921 8.634705252154615e-04 +858 1922 8.525740288519592e-05 +858 1923 -2.132703484630639e-05 +858 1924 9.575317381100200e-06 +858 1925 -4.563719592101006e-06 +858 1926 1.377888192291840e-06 +859 1918 -1.361668801094748e-05 +859 1919 4.587104641602209e-05 +859 1920 -1.034397545291548e-04 +859 1921 3.790325123654129e-04 +859 1922 7.486490616400452e-04 +859 1923 -1.196774105566829e-04 +859 1924 6.132507092318516e-05 +859 1925 -3.133670432002823e-05 +859 1926 9.755366072147912e-06 +860 1918 9.755366072147908e-06 +860 1919 -3.133670432002823e-05 +860 1920 6.132507092318517e-05 +860 1921 -1.196774105566829e-04 +860 1922 7.486490616400453e-04 +860 1923 3.790325123654129e-04 +860 1924 -1.034397545291548e-04 +860 1925 4.587104641602210e-05 +860 1926 -1.361668801094748e-05 +861 1918 1.377888192291336e-06 +861 1919 -4.563719592099415e-06 +861 1920 9.575317381097243e-06 +861 1921 -2.132703484630127e-05 +861 1922 8.525740288518581e-05 +861 1923 8.634705252154623e-04 +861 1924 4.800413127073595e-05 +861 1925 -6.380257597868736e-06 +861 1926 1.148247091496593e-06 +862 1918 -6.335955594805691e-06 +862 1919 1.984761106267203e-05 +862 1920 -3.642594225309779e-05 +862 1921 6.092043978103018e-05 +862 1922 -1.104912573429373e-04 +862 1923 3.849668443894484e-04 +862 1924 7.076249207781733e-04 +862 1925 -6.119691313295844e-05 +862 1926 1.765275231247524e-05 +863 1918 4.258276866271346e-06 +863 1919 -1.316860931849099e-05 +863 1920 2.343321932570010e-05 +863 1921 -3.672666032322374e-05 +863 1922 5.705134647634056e-05 +863 1923 -9.844594048837149e-05 +863 1924 5.028688547500707e-04 +863 1925 5.376012869668622e-04 +863 1926 -3.092742551587408e-07 +864 1945 -3.092742551590390e-07 +864 1946 5.376012869668633e-04 +864 1947 5.028688547500725e-04 +864 1948 -9.844594048837510e-05 +864 1949 5.705134647634201e-05 +864 1950 -3.672666032322457e-05 +864 1951 2.343321932570061e-05 +864 1952 -1.316860931849127e-05 +864 1953 4.258276866271438e-06 +865 1945 1.765275231247440e-05 +865 1946 -6.119691313295520e-05 +865 1947 7.076249207781909e-04 +865 1948 3.849668443894259e-04 +865 1949 -1.104912573429335e-04 +865 1950 6.092043978102799e-05 +865 1951 -3.642594225309645e-05 +865 1952 1.984761106267130e-05 +865 1953 -6.335955594805459e-06 +866 1945 1.148247091497631e-06 +866 1946 -6.380257597872645e-06 +866 1947 4.800413127074990e-05 +866 1948 8.634705252154548e-04 +866 1949 8.525740288518038e-05 +866 1950 -2.132703484629811e-05 +866 1951 9.575317381095322e-06 +866 1952 -4.563719592098363e-06 +866 1953 1.377888192290999e-06 +867 1945 -1.361668801094748e-05 +867 1946 4.587104641602209e-05 +867 1947 -1.034397545291548e-04 +867 1948 3.790325123654129e-04 +867 1949 7.486490616400452e-04 +867 1950 -1.196774105566829e-04 +867 1951 6.132507092318516e-05 +867 1952 -3.133670432002823e-05 +867 1953 9.755366072147912e-06 +868 1945 9.755366072147958e-06 +868 1946 -3.133670432002842e-05 +868 1947 6.132507092318566e-05 +868 1948 -1.196774105566845e-04 +868 1949 7.486490616400637e-04 +868 1950 3.790325123653941e-04 +868 1951 -1.034397545291528e-04 +868 1952 4.587104641602149e-05 +868 1953 -1.361668801094732e-05 +869 1945 1.377888192291219e-06 +869 1946 -4.563719592099060e-06 +869 1947 9.575317381096640e-06 +869 1948 -2.132703484630056e-05 +869 1949 8.525740288518955e-05 +869 1950 8.634705252154524e-04 +869 1951 4.800413127074305e-05 +869 1952 -6.380257597870328e-06 +869 1953 1.148247091497014e-06 +870 1945 -6.335955594805126e-06 +870 1946 1.984761106267026e-05 +870 1947 -3.642594225309452e-05 +870 1948 6.092043978102466e-05 +870 1949 -1.104912573429270e-04 +870 1950 3.849668443894141e-04 +870 1951 7.076249207781973e-04 +870 1952 -6.119691313295334e-05 +870 1953 1.765275231247380e-05 +871 1945 4.258276866270855e-06 +871 1946 -1.316860931848948e-05 +871 1947 2.343321932569743e-05 +871 1948 -3.672666032321964e-05 +871 1949 5.705134647633450e-05 +871 1950 -9.844594048836265e-05 +871 1951 5.028688547500413e-04 +871 1952 5.376012869668938e-04 +871 1953 -3.092742551660388e-07 +872 1954 -3.092742551631589e-07 +872 1955 5.376012869668782e-04 +872 1956 5.028688547500479e-04 +872 1957 -9.844594048835349e-05 +872 1958 5.705134647632909e-05 +872 1959 -3.672666032321615e-05 +872 1960 2.343321932569520e-05 +872 1961 -1.316860931848822e-05 +872 1962 4.258276866270450e-06 +873 1954 1.765275231247554e-05 +873 1955 -6.119691313296238e-05 +873 1956 7.076249207781865e-04 +873 1957 3.849668443894362e-04 +873 1958 -1.104912573429334e-04 +873 1959 6.092043978102820e-05 +873 1960 -3.642594225309665e-05 +873 1961 1.984761106267143e-05 +873 1962 -6.335955594805503e-06 +874 1954 1.148247091497468e-06 +874 1955 -6.380257597871737e-06 +874 1956 4.800413127074308e-05 +874 1957 8.634705252154652e-04 +874 1958 8.525740288517452e-05 +874 1959 -2.132703484629570e-05 +874 1960 9.575317381094163e-06 +874 1961 -4.563719592097798e-06 +874 1962 1.377888192290828e-06 +875 1954 -1.361668801094695e-05 +875 1955 4.587104641602026e-05 +875 1956 -1.034397545291503e-04 +875 1957 3.790325123653988e-04 +875 1958 7.486490616400534e-04 +875 1959 -1.196774105566789e-04 +875 1960 6.132507092318331e-05 +875 1961 -3.133670432002728e-05 +875 1962 9.755366072147612e-06 +876 1954 9.755366072148349e-06 +876 1955 -3.133670432002964e-05 +876 1956 6.132507092318791e-05 +876 1957 -1.196774105566881e-04 +876 1958 7.486490616400383e-04 +876 1959 3.790325123654264e-04 +876 1960 -1.034397545291594e-04 +876 1961 4.587104641602415e-05 +876 1962 -1.361668801094809e-05 +877 1954 1.377888192291336e-06 +877 1955 -4.563719592099415e-06 +877 1956 9.575317381097243e-06 +877 1957 -2.132703484630127e-05 +877 1958 8.525740288518581e-05 +877 1959 8.634705252154623e-04 +877 1960 4.800413127073595e-05 +877 1961 -6.380257597868736e-06 +877 1962 1.148247091496593e-06 +878 1954 -6.335955594805249e-06 +878 1955 1.984761106267065e-05 +878 1956 -3.642594225309528e-05 +878 1957 6.092043978102606e-05 +878 1958 -1.104912573429301e-04 +878 1959 3.849668443894307e-04 +878 1960 7.076249207781824e-04 +878 1961 -6.119691313295284e-05 +878 1962 1.765275231247377e-05 +879 1954 4.258276866271280e-06 +879 1955 -1.316860931849079e-05 +879 1956 2.343321932569977e-05 +879 1957 -3.672666032322331e-05 +879 1958 5.705134647634017e-05 +879 1959 -9.844594048837236e-05 +879 1960 5.028688547500680e-04 +879 1961 5.376012869668758e-04 +879 1962 -3.092742551685359e-07 +880 1972 -3.092742551587137e-07 +880 1973 5.376012869668999e-04 +880 1974 5.028688547500278e-04 +880 1975 -9.844594048836400e-05 +880 1976 5.705134647633676e-05 +880 1977 -3.672666032322142e-05 +880 1978 2.343321932569866e-05 +880 1979 -1.316860931849019e-05 +880 1980 4.258276866271092e-06 +881 1972 1.765275231247450e-05 +881 1973 -6.119691313295354e-05 +881 1974 7.076249207781675e-04 +881 1975 3.849668443894484e-04 +881 1976 -1.104912573429350e-04 +881 1977 6.092043978102891e-05 +881 1978 -3.642594225309703e-05 +881 1979 1.984761106267162e-05 +881 1980 -6.335955594805561e-06 +882 1972 1.148247091495461e-06 +882 1973 -6.380257597864636e-06 +882 1974 4.800413127072398e-05 +882 1975 8.634705252154649e-04 +882 1976 8.525740288519530e-05 +882 1977 -2.132703484630611e-05 +882 1978 9.575317381100045e-06 +882 1979 -4.563719592100925e-06 +882 1980 1.377888192291815e-06 +883 1972 -1.361668801094748e-05 +883 1973 4.587104641602209e-05 +883 1974 -1.034397545291548e-04 +883 1975 3.790325123654129e-04 +883 1976 7.486490616400452e-04 +883 1977 -1.196774105566829e-04 +883 1978 6.132507092318516e-05 +883 1979 -3.133670432002823e-05 +883 1980 9.755366072147912e-06 +884 1972 9.755366072147908e-06 +884 1973 -3.133670432002823e-05 +884 1974 6.132507092318517e-05 +884 1975 -1.196774105566829e-04 +884 1976 7.486490616400453e-04 +884 1977 3.790325123654129e-04 +884 1978 -1.034397545291548e-04 +884 1979 4.587104641602210e-05 +884 1980 -1.361668801094748e-05 +885 1972 1.377888192291815e-06 +885 1973 -4.563719592100925e-06 +885 1974 9.575317381100051e-06 +885 1975 -2.132703484630611e-05 +885 1976 8.525740288519531e-05 +885 1977 8.634705252154649e-04 +885 1978 4.800413127072397e-05 +885 1979 -6.380257597864636e-06 +885 1980 1.148247091495458e-06 +886 1972 -6.335955594805559e-06 +886 1973 1.984761106267162e-05 +886 1974 -3.642594225309704e-05 +886 1975 6.092043978102891e-05 +886 1976 -1.104912573429349e-04 +886 1977 3.849668443894485e-04 +886 1978 7.076249207781677e-04 +886 1979 -6.119691313295357e-05 +886 1980 1.765275231247450e-05 +887 1972 4.258276866271090e-06 +887 1973 -1.316860931849019e-05 +887 1974 2.343321932569865e-05 +887 1975 -3.672666032322142e-05 +887 1976 5.705134647633676e-05 +887 1977 -9.844594048836400e-05 +887 1978 5.028688547500280e-04 +887 1979 5.376012869669000e-04 +887 1980 -3.092742551587137e-07 +888 1981 -3.092742551685393e-07 +888 1982 5.376012869668758e-04 +888 1983 5.028688547500679e-04 +888 1984 -9.844594048837236e-05 +888 1985 5.705134647634017e-05 +888 1986 -3.672666032322331e-05 +888 1987 2.343321932569977e-05 +888 1988 -1.316860931849080e-05 +888 1989 4.258276866271282e-06 +889 1981 1.765275231247376e-05 +889 1982 -6.119691313295281e-05 +889 1983 7.076249207781823e-04 +889 1984 3.849668443894305e-04 +889 1985 -1.104912573429301e-04 +889 1986 6.092043978102605e-05 +889 1987 -3.642594225309528e-05 +889 1988 1.984761106267066e-05 +889 1989 -6.335955594805252e-06 +890 1981 1.148247091496628e-06 +890 1982 -6.380257597868803e-06 +890 1983 4.800413127073579e-05 +890 1984 8.634705252154699e-04 +890 1985 8.525740288517729e-05 +890 1986 -2.132703484629971e-05 +890 1987 9.575317381096565e-06 +890 1988 -4.563719592099093e-06 +890 1989 1.377888192291240e-06 +891 1981 -1.361668801094804e-05 +891 1982 4.587104641602402e-05 +891 1983 -1.034397545291596e-04 +891 1984 3.790325123654388e-04 +891 1985 7.486490616400244e-04 +891 1986 -1.196774105566856e-04 +891 1987 6.132507092318682e-05 +891 1988 -3.133670432002912e-05 +891 1989 9.755366072148195e-06 +892 1981 9.755366072147609e-06 +892 1982 -3.133670432002727e-05 +892 1983 6.132507092318330e-05 +892 1984 -1.196774105566789e-04 +892 1985 7.486490616400534e-04 +892 1986 3.790325123653988e-04 +892 1987 -1.034397545291503e-04 +892 1988 4.587104641602027e-05 +892 1989 -1.361668801094695e-05 +893 1981 1.377888192290853e-06 +893 1982 -4.563719592097881e-06 +893 1983 9.575317381094329e-06 +893 1984 -2.132703484629599e-05 +893 1985 8.525740288517513e-05 +893 1986 8.634705252154617e-04 +893 1987 4.800413127074611e-05 +893 1988 -6.380257597871832e-06 +893 1989 1.148247091497472e-06 +894 1981 -6.335955594804628e-06 +894 1982 1.984761106266871e-05 +894 1983 -3.642594225309174e-05 +894 1984 6.092043978102020e-05 +894 1985 -1.104912573429198e-04 +894 1986 3.849668443893993e-04 +894 1987 7.076249207781997e-04 +894 1988 -6.119691313294316e-05 +894 1989 1.765275231247147e-05 +895 1981 4.258276866271162e-06 +895 1982 -1.316860931849043e-05 +895 1983 2.343321932569914e-05 +895 1984 -3.672666032322238e-05 +895 1985 5.705134647633899e-05 +895 1986 -9.844594048837173e-05 +895 1987 5.028688547500427e-04 +895 1988 5.376012869669001e-04 +895 1989 -3.092742551674686e-07 +896 2026 -3.092742551660456e-07 +896 2027 5.376012869668938e-04 +896 2028 5.028688547500412e-04 +896 2029 -9.844594048836264e-05 +896 2030 5.705134647633449e-05 +896 2031 -3.672666032321964e-05 +896 2032 2.343321932569743e-05 +896 2033 -1.316860931848948e-05 +896 2034 4.258276866270857e-06 +897 2026 1.765275231247313e-05 +897 2027 -6.119691313295059e-05 +897 2028 7.076249207781820e-04 +897 2029 3.849668443894267e-04 +897 2030 -1.104912573429262e-04 +897 2031 6.092043978102381e-05 +897 2032 -3.642594225309393e-05 +897 2033 1.984761106266992e-05 +897 2034 -6.335955594805016e-06 +898 2026 1.148247091497070e-06 +898 2027 -6.380257597870165e-06 +898 2028 4.800413127073679e-05 +898 2029 8.634705252154695e-04 +898 2030 8.525740288517566e-05 +898 2031 -2.132703484629650e-05 +898 2032 9.575317381094678e-06 +898 2033 -4.563719592098089e-06 +898 2034 1.377888192290922e-06 +899 2026 -1.361668801094704e-05 +899 2027 4.587104641602054e-05 +899 2028 -1.034397545291509e-04 +899 2029 3.790325123653999e-04 +899 2030 7.486490616400549e-04 +899 2031 -1.196774105566817e-04 +899 2032 6.132507092318424e-05 +899 2033 -3.133670432002769e-05 +899 2034 9.755366072147736e-06 +900 2026 9.755366072147908e-06 +900 2027 -3.133670432002823e-05 +900 2028 6.132507092318517e-05 +900 2029 -1.196774105566829e-04 +900 2030 7.486490616400453e-04 +900 2031 3.790325123654129e-04 +900 2032 -1.034397545291548e-04 +900 2033 4.587104641602210e-05 +900 2034 -1.361668801094748e-05 +901 2026 1.377888192291336e-06 +901 2027 -4.563719592099415e-06 +901 2028 9.575317381097243e-06 +901 2029 -2.132703484630127e-05 +901 2030 8.525740288518581e-05 +901 2031 8.634705252154623e-04 +901 2032 4.800413127073595e-05 +901 2033 -6.380257597868736e-06 +901 2034 1.148247091496593e-06 +902 2026 -6.335955594805249e-06 +902 2027 1.984761106267065e-05 +902 2028 -3.642594225309528e-05 +902 2029 6.092043978102606e-05 +902 2030 -1.104912573429301e-04 +902 2031 3.849668443894307e-04 +902 2032 7.076249207781824e-04 +902 2033 -6.119691313295284e-05 +902 2034 1.765275231247377e-05 +903 2026 4.258276866271280e-06 +903 2027 -1.316860931849079e-05 +903 2028 2.343321932569977e-05 +903 2029 -3.672666032322331e-05 +903 2030 5.705134647634017e-05 +903 2031 -9.844594048837236e-05 +903 2032 5.028688547500680e-04 +903 2033 5.376012869668758e-04 +903 2034 -3.092742551685359e-07 +904 2035 -3.092742551587137e-07 +904 2036 5.376012869668999e-04 +904 2037 5.028688547500278e-04 +904 2038 -9.844594048836400e-05 +904 2039 5.705134647633676e-05 +904 2040 -3.672666032322142e-05 +904 2041 2.343321932569866e-05 +904 2042 -1.316860931849019e-05 +904 2043 4.258276866271092e-06 +905 2035 1.765275231247473e-05 +905 2036 -6.119691313295438e-05 +905 2037 7.076249207781700e-04 +905 2038 3.849668443894479e-04 +905 2039 -1.104912573429369e-04 +905 2040 6.092043978102990e-05 +905 2041 -3.642594225309760e-05 +905 2042 1.984761106267193e-05 +905 2043 -6.335955594805658e-06 +906 2035 1.148247091496596e-06 +906 2036 -6.380257597868736e-06 +906 2037 4.800413127073594e-05 +906 2038 8.634705252154623e-04 +906 2039 8.525740288518580e-05 +906 2040 -2.132703484630127e-05 +906 2041 9.575317381097236e-06 +906 2042 -4.563719592099414e-06 +906 2043 1.377888192291335e-06 +907 2035 -1.361668801094748e-05 +907 2036 4.587104641602209e-05 +907 2037 -1.034397545291548e-04 +907 2038 3.790325123654129e-04 +907 2039 7.486490616400452e-04 +907 2040 -1.196774105566829e-04 +907 2041 6.132507092318516e-05 +907 2042 -3.133670432002823e-05 +907 2043 9.755366072147912e-06 +908 2035 9.755366072147908e-06 +908 2036 -3.133670432002823e-05 +908 2037 6.132507092318517e-05 +908 2038 -1.196774105566829e-04 +908 2039 7.486490616400453e-04 +908 2040 3.790325123654129e-04 +908 2041 -1.034397545291548e-04 +908 2042 4.587104641602210e-05 +908 2043 -1.361668801094748e-05 +909 2035 1.377888192291841e-06 +909 2036 -4.563719592101006e-06 +909 2037 9.575317381100207e-06 +909 2038 -2.132703484630640e-05 +909 2039 8.525740288519594e-05 +909 2040 8.634705252154616e-04 +909 2041 4.800413127072702e-05 +909 2042 -6.380257597864738e-06 +909 2043 1.148247091495463e-06 +910 2035 -6.335955594804993e-06 +910 2036 1.984761106266985e-05 +910 2037 -3.642594225309376e-05 +910 2038 6.092043978102340e-05 +910 2039 -1.104912573429247e-04 +910 2040 3.849668443894141e-04 +910 2041 7.076249207781916e-04 +910 2042 -6.119691313294849e-05 +910 2043 1.765275231247306e-05 +911 2035 4.258276866271024e-06 +911 2036 -1.316860931849000e-05 +911 2037 2.343321932569833e-05 +911 2038 -3.672666032322100e-05 +911 2039 5.705134647633637e-05 +911 2040 -9.844594048836488e-05 +911 2041 5.028688547500252e-04 +911 2042 5.376012869669135e-04 +911 2043 -3.092742551685088e-07 +912 2053 -3.092742551674754e-07 +912 2054 5.376012869669000e-04 +912 2055 5.028688547500427e-04 +912 2056 -9.844594048837173e-05 +912 2057 5.705134647633897e-05 +912 2058 -3.672666032322238e-05 +912 2059 2.343321932569914e-05 +912 2060 -1.316860931849043e-05 +912 2061 4.258276866271162e-06 +913 2053 1.765275231247144e-05 +913 2054 -6.119691313294263e-05 +913 2055 7.076249207781847e-04 +913 2056 3.849668443894157e-04 +913 2057 -1.104912573429228e-04 +913 2058 6.092043978102158e-05 +913 2059 -3.642594225309250e-05 +913 2060 1.984761106266911e-05 +913 2061 -6.335955594804755e-06 +914 2053 1.148247091496596e-06 +914 2054 -6.380257597868736e-06 +914 2055 4.800413127073594e-05 +914 2056 8.634705252154623e-04 +914 2057 8.525740288518580e-05 +914 2058 -2.132703484630127e-05 +914 2059 9.575317381097236e-06 +914 2060 -4.563719592099414e-06 +914 2061 1.377888192291335e-06 +915 2053 -1.361668801094836e-05 +915 2054 4.587104641602500e-05 +915 2055 -1.034397545291611e-04 +915 2056 3.790325123654304e-04 +915 2057 7.486490616400384e-04 +915 2058 -1.196774105566923e-04 +915 2059 6.132507092318977e-05 +915 2060 -3.133670432003054e-05 +915 2061 9.755366072148625e-06 +916 2053 9.755366072147544e-06 +916 2054 -3.133670432002702e-05 +916 2055 6.132507092318257e-05 +916 2056 -1.196774105566760e-04 +916 2057 7.486490616400366e-04 +916 2058 3.790325123654152e-04 +916 2059 -1.034397545291529e-04 +916 2060 4.587104641602115e-05 +916 2061 -1.361668801094719e-05 +917 2053 1.377888192290843e-06 +917 2054 -4.563719592097843e-06 +917 2055 9.575317381094234e-06 +917 2056 -2.132703484629571e-05 +917 2057 8.525740288517196e-05 +917 2058 8.634705252154680e-04 +917 2059 4.800413127074256e-05 +917 2060 -6.380257597871534e-06 +917 2061 1.148247091497411e-06 +918 2053 -6.335955594805249e-06 +918 2054 1.984761106267065e-05 +918 2055 -3.642594225309528e-05 +918 2056 6.092043978102606e-05 +918 2057 -1.104912573429301e-04 +918 2058 3.849668443894307e-04 +918 2059 7.076249207781824e-04 +918 2060 -6.119691313295284e-05 +918 2061 1.765275231247377e-05 +919 2053 4.258276866270191e-06 +919 2054 -1.316860931848744e-05 +919 2055 2.343321932569384e-05 +919 2056 -3.672666032321412e-05 +919 2057 5.705134647632629e-05 +919 2058 -9.844594048834983e-05 +919 2059 5.028688547500163e-04 +919 2060 5.376012869669012e-04 +919 2061 -3.092742551563454e-07 +920 2062 -3.092742551834098e-07 +920 2063 5.376012869669246e-04 +920 2064 5.028688547500315e-04 +920 2065 -9.844594048836924e-05 +920 2066 5.705134647633943e-05 +920 2067 -3.672666032322314e-05 +920 2068 2.343321932569976e-05 +920 2069 -1.316860931849081e-05 +920 2070 4.258276866271292e-06 +921 2062 1.765275231247305e-05 +921 2063 -6.119691313294845e-05 +921 2064 7.076249207781914e-04 +921 2065 3.849668443894142e-04 +921 2066 -1.104912573429247e-04 +921 2067 6.092043978102339e-05 +921 2068 -3.642594225309376e-05 +921 2069 1.984761106266984e-05 +921 2070 -6.335955594804996e-06 +922 2062 1.148247091495520e-06 +922 2063 -6.380257597864937e-06 +922 2064 4.800413127072755e-05 +922 2065 8.634705252154587e-04 +922 2066 8.525740288519847e-05 +922 2067 -2.132703484630638e-05 +922 2068 9.575317381100136e-06 +922 2069 -4.563719592100962e-06 +922 2070 1.377888192291826e-06 +923 2062 -1.361668801094720e-05 +923 2063 4.587104641602111e-05 +923 2064 -1.034397545291522e-04 +923 2065 3.790325123653987e-04 +923 2066 7.486490616400577e-04 +923 2067 -1.196774105566828e-04 +923 2068 6.132507092318485e-05 +923 2069 -3.133670432002801e-05 +923 2070 9.755366072147836e-06 +924 2062 9.755366072147908e-06 +924 2063 -3.133670432002823e-05 +924 2064 6.132507092318517e-05 +924 2065 -1.196774105566829e-04 +924 2066 7.486490616400453e-04 +924 2067 3.790325123654129e-04 +924 2068 -1.034397545291548e-04 +924 2069 4.587104641602210e-05 +924 2070 -1.361668801094748e-05 +925 2062 1.377888192291336e-06 +925 2063 -4.563719592099415e-06 +925 2064 9.575317381097243e-06 +925 2065 -2.132703484630127e-05 +925 2066 8.525740288518581e-05 +925 2067 8.634705252154623e-04 +925 2068 4.800413127073595e-05 +925 2069 -6.380257597868736e-06 +925 2070 1.148247091496593e-06 +926 2062 -6.335955594805691e-06 +926 2063 1.984761106267203e-05 +926 2064 -3.642594225309779e-05 +926 2065 6.092043978103018e-05 +926 2066 -1.104912573429373e-04 +926 2067 3.849668443894484e-04 +926 2068 7.076249207781733e-04 +926 2069 -6.119691313295844e-05 +926 2070 1.765275231247524e-05 +927 2062 4.258276866271346e-06 +927 2063 -1.316860931849099e-05 +927 2064 2.343321932570010e-05 +927 2065 -3.672666032322374e-05 +927 2066 5.705134647634056e-05 +927 2067 -9.844594048837149e-05 +927 2068 5.028688547500707e-04 +927 2069 5.376012869668622e-04 +927 2070 -3.092742551587408e-07 +928 2089 -3.092742551587374e-07 +928 2090 5.376012869668621e-04 +928 2091 5.028688547500707e-04 +928 2092 -9.844594048837149e-05 +928 2093 5.705134647634055e-05 +928 2094 -3.672666032322373e-05 +928 2095 2.343321932570010e-05 +928 2096 -1.316860931849099e-05 +928 2097 4.258276866271348e-06 +929 2089 1.765275231247523e-05 +929 2090 -6.119691313295842e-05 +929 2091 7.076249207781732e-04 +929 2092 3.849668443894483e-04 +929 2093 -1.104912573429373e-04 +929 2094 6.092043978103018e-05 +929 2095 -3.642594225309779e-05 +929 2096 1.984761106267204e-05 +929 2097 -6.335955594805693e-06 +930 2089 1.148247091496596e-06 +930 2090 -6.380257597868736e-06 +930 2091 4.800413127073594e-05 +930 2092 8.634705252154623e-04 +930 2093 8.525740288518580e-05 +930 2094 -2.132703484630127e-05 +930 2095 9.575317381097236e-06 +930 2096 -4.563719592099414e-06 +930 2097 1.377888192291335e-06 +931 2089 -1.361668801094748e-05 +931 2090 4.587104641602209e-05 +931 2091 -1.034397545291548e-04 +931 2092 3.790325123654129e-04 +931 2093 7.486490616400452e-04 +931 2094 -1.196774105566829e-04 +931 2095 6.132507092318516e-05 +931 2096 -3.133670432002823e-05 +931 2097 9.755366072147912e-06 +932 2089 9.755366072147834e-06 +932 2090 -3.133670432002801e-05 +932 2091 6.132507092318485e-05 +932 2092 -1.196774105566828e-04 +932 2093 7.486490616400576e-04 +932 2094 3.790325123653988e-04 +932 2095 -1.034397545291522e-04 +932 2096 4.587104641602113e-05 +932 2097 -1.361668801094721e-05 +933 2089 1.377888192291826e-06 +933 2090 -4.563719592100962e-06 +933 2091 9.575317381100146e-06 +933 2092 -2.132703484630639e-05 +933 2093 8.525740288519848e-05 +933 2094 8.634705252154587e-04 +933 2095 4.800413127072753e-05 +933 2096 -6.380257597864934e-06 +933 2097 1.148247091495519e-06 +934 2089 -6.335955594804993e-06 +934 2090 1.984761106266985e-05 +934 2091 -3.642594225309376e-05 +934 2092 6.092043978102340e-05 +934 2093 -1.104912573429247e-04 +934 2094 3.849668443894141e-04 +934 2095 7.076249207781916e-04 +934 2096 -6.119691313294849e-05 +934 2097 1.765275231247306e-05 +935 2089 4.258276866271024e-06 +935 2090 -1.316860931849000e-05 +935 2091 2.343321932569833e-05 +935 2092 -3.672666032322100e-05 +935 2093 5.705134647633637e-05 +935 2094 -9.844594048836488e-05 +935 2095 5.028688547500252e-04 +935 2096 5.376012869669135e-04 +935 2097 -3.092742551685088e-07 +936 2098 -3.092742551660456e-07 +936 2099 5.376012869668938e-04 +936 2100 5.028688547500412e-04 +936 2101 -9.844594048836264e-05 +936 2102 5.705134647633449e-05 +936 2103 -3.672666032321964e-05 +936 2104 2.343321932569743e-05 +936 2105 -1.316860931848948e-05 +936 2106 4.258276866270857e-06 +937 2098 1.765275231247440e-05 +937 2099 -6.119691313295520e-05 +937 2100 7.076249207781909e-04 +937 2101 3.849668443894259e-04 +937 2102 -1.104912573429335e-04 +937 2103 6.092043978102799e-05 +937 2104 -3.642594225309645e-05 +937 2105 1.984761106267130e-05 +937 2106 -6.335955594805459e-06 +938 2098 1.148247091498448e-06 +938 2099 -6.380257597875447e-06 +938 2100 4.800413127075652e-05 +938 2101 8.634705252154604e-04 +938 2102 8.525740288516655e-05 +938 2103 -2.132703484629255e-05 +938 2104 9.575317381092313e-06 +938 2105 -4.563719592096791e-06 +938 2106 1.377888192290506e-06 +939 2098 -1.361668801094783e-05 +939 2099 4.587104641602328e-05 +939 2100 -1.034397545291574e-04 +939 2101 3.790325123654264e-04 +939 2102 7.486490616400341e-04 +939 2103 -1.196774105566842e-04 +939 2104 6.132507092318638e-05 +939 2105 -3.133670432002891e-05 +939 2106 9.755366072148127e-06 +940 2098 9.755366072148225e-06 +940 2099 -3.133670432002923e-05 +940 2100 6.132507092318699e-05 +940 2101 -1.196774105566853e-04 +940 2102 7.486490616400369e-04 +940 2103 3.790325123654253e-04 +940 2104 -1.034397545291588e-04 +940 2105 4.587104641602387e-05 +940 2106 -1.361668801094800e-05 +941 2098 1.377888192290999e-06 +941 2099 -4.563719592098363e-06 +941 2100 9.575317381095325e-06 +941 2101 -2.132703484629812e-05 +941 2102 8.525740288518038e-05 +941 2103 8.634705252154548e-04 +941 2104 4.800413127074991e-05 +941 2105 -6.380257597872645e-06 +941 2106 1.148247091497628e-06 +942 2098 -6.335955594805457e-06 +942 2099 1.984761106267130e-05 +942 2100 -3.642594225309646e-05 +942 2101 6.092043978102799e-05 +942 2102 -1.104912573429334e-04 +942 2103 3.849668443894259e-04 +942 2104 7.076249207781909e-04 +942 2105 -6.119691313295524e-05 +942 2106 1.765275231247441e-05 +943 2098 4.258276866270855e-06 +943 2099 -1.316860931848948e-05 +943 2100 2.343321932569743e-05 +943 2101 -3.672666032321964e-05 +943 2102 5.705134647633450e-05 +943 2103 -9.844594048836265e-05 +943 2104 5.028688547500413e-04 +943 2105 5.376012869668938e-04 +943 2106 -3.092742551660388e-07 +944 2116 -3.092742551656255e-07 +944 2117 5.376012869668979e-04 +944 2118 5.028688547500319e-04 +944 2119 -9.844594048835573e-05 +944 2120 5.705134647633098e-05 +944 2121 -3.672666032321751e-05 +944 2122 2.343321932569610e-05 +944 2123 -1.316860931848874e-05 +944 2124 4.258276866270620e-06 +945 2116 1.765275231247483e-05 +945 2117 -6.119691313295803e-05 +945 2118 7.076249207781957e-04 +945 2119 3.849668443894198e-04 +945 2120 -1.104912573429281e-04 +945 2121 6.092043978102554e-05 +945 2122 -3.642594225309513e-05 +945 2123 1.984761106267062e-05 +945 2124 -6.335955594805246e-06 +946 2116 1.148247091495464e-06 +946 2117 -6.380257597864738e-06 +946 2118 4.800413127072702e-05 +946 2119 8.634705252154615e-04 +946 2120 8.525740288519592e-05 +946 2121 -2.132703484630639e-05 +946 2122 9.575317381100200e-06 +946 2123 -4.563719592101006e-06 +946 2124 1.377888192291840e-06 +947 2116 -1.361668801094748e-05 +947 2117 4.587104641602209e-05 +947 2118 -1.034397545291548e-04 +947 2119 3.790325123654129e-04 +947 2120 7.486490616400452e-04 +947 2121 -1.196774105566829e-04 +947 2122 6.132507092318516e-05 +947 2123 -3.133670432002823e-05 +947 2124 9.755366072147912e-06 +948 2116 9.755366072147908e-06 +948 2117 -3.133670432002823e-05 +948 2118 6.132507092318517e-05 +948 2119 -1.196774105566829e-04 +948 2120 7.486490616400453e-04 +948 2121 3.790325123654129e-04 +948 2122 -1.034397545291548e-04 +948 2123 4.587104641602210e-05 +948 2124 -1.361668801094748e-05 +949 2116 1.377888192291336e-06 +949 2117 -4.563719592099415e-06 +949 2118 9.575317381097243e-06 +949 2119 -2.132703484630127e-05 +949 2120 8.525740288518581e-05 +949 2121 8.634705252154623e-04 +949 2122 4.800413127073595e-05 +949 2123 -6.380257597868736e-06 +949 2124 1.148247091496593e-06 +950 2116 -6.335955594805657e-06 +950 2117 1.984761106267192e-05 +950 2118 -3.642594225309761e-05 +950 2119 6.092043978102990e-05 +950 2120 -1.104912573429369e-04 +950 2121 3.849668443894479e-04 +950 2122 7.076249207781701e-04 +950 2123 -6.119691313295441e-05 +950 2124 1.765275231247473e-05 +951 2116 4.258276866271090e-06 +951 2117 -1.316860931849019e-05 +951 2118 2.343321932569865e-05 +951 2119 -3.672666032322142e-05 +951 2120 5.705134647633676e-05 +951 2121 -9.844594048836400e-05 +951 2122 5.028688547500280e-04 +951 2123 5.376012869669000e-04 +951 2124 -3.092742551587137e-07 +952 2125 -3.092742551685393e-07 +952 2126 5.376012869668758e-04 +952 2127 5.028688547500679e-04 +952 2128 -9.844594048837236e-05 +952 2129 5.705134647634017e-05 +952 2130 -3.672666032322331e-05 +952 2131 2.343321932569977e-05 +952 2132 -1.316860931849080e-05 +952 2133 4.258276866271282e-06 +953 2125 1.765275231247376e-05 +953 2126 -6.119691313295281e-05 +953 2127 7.076249207781823e-04 +953 2128 3.849668443894305e-04 +953 2129 -1.104912573429301e-04 +953 2130 6.092043978102605e-05 +953 2131 -3.642594225309528e-05 +953 2132 1.984761106267066e-05 +953 2133 -6.335955594805252e-06 +954 2125 1.148247091496596e-06 +954 2126 -6.380257597868736e-06 +954 2127 4.800413127073594e-05 +954 2128 8.634705252154623e-04 +954 2129 8.525740288518580e-05 +954 2130 -2.132703484630127e-05 +954 2131 9.575317381097236e-06 +954 2132 -4.563719592099414e-06 +954 2133 1.377888192291335e-06 +955 2125 -1.361668801094809e-05 +955 2126 4.587104641602414e-05 +955 2127 -1.034397545291593e-04 +955 2128 3.790325123654264e-04 +955 2129 7.486490616400382e-04 +955 2130 -1.196774105566881e-04 +955 2131 6.132507092318791e-05 +955 2132 -3.133670432002965e-05 +955 2133 9.755366072148352e-06 +956 2125 9.755366072147609e-06 +956 2126 -3.133670432002727e-05 +956 2127 6.132507092318330e-05 +956 2128 -1.196774105566789e-04 +956 2129 7.486490616400534e-04 +956 2130 3.790325123653988e-04 +956 2131 -1.034397545291503e-04 +956 2132 4.587104641602027e-05 +956 2133 -1.361668801094695e-05 +957 2125 1.377888192290853e-06 +957 2126 -4.563719592097881e-06 +957 2127 9.575317381094329e-06 +957 2128 -2.132703484629599e-05 +957 2129 8.525740288517513e-05 +957 2130 8.634705252154617e-04 +957 2131 4.800413127074611e-05 +957 2132 -6.380257597871832e-06 +957 2133 1.148247091497472e-06 +958 2125 -6.335955594805126e-06 +958 2126 1.984761106267026e-05 +958 2127 -3.642594225309452e-05 +958 2128 6.092043978102466e-05 +958 2129 -1.104912573429270e-04 +958 2130 3.849668443894141e-04 +958 2131 7.076249207781973e-04 +958 2132 -6.119691313295334e-05 +958 2133 1.765275231247380e-05 +959 2125 4.258276866271122e-06 +959 2126 -1.316860931849030e-05 +959 2127 2.343321932569886e-05 +959 2128 -3.672666032322178e-05 +959 2129 5.705134647633756e-05 +959 2130 -9.844594048836702e-05 +959 2131 5.028688547500477e-04 +959 2132 5.376012869669048e-04 +959 2133 -3.092742551809297e-07 +960 2161 -3.092742551563488e-07 +960 2162 5.376012869669012e-04 +960 2163 5.028688547500163e-04 +960 2164 -9.844594048834983e-05 +960 2165 5.705134647632629e-05 +960 2166 -3.672666032321413e-05 +960 2167 2.343321932569384e-05 +960 2168 -1.316860931848744e-05 +960 2169 4.258276866270193e-06 +961 2161 1.765275231247379e-05 +961 2162 -6.119691313295333e-05 +961 2163 7.076249207781972e-04 +961 2164 3.849668443894141e-04 +961 2165 -1.104912573429271e-04 +961 2166 6.092043978102465e-05 +961 2167 -3.642594225309452e-05 +961 2168 1.984761106267026e-05 +961 2169 -6.335955594805128e-06 +962 2161 1.148247091497506e-06 +962 2162 -6.380257597871907e-06 +962 2163 4.800413127074598e-05 +962 2164 8.634705252154693e-04 +962 2165 8.525740288516662e-05 +962 2166 -2.132703484629442e-05 +962 2167 9.575317381093648e-06 +962 2168 -4.563719592097559e-06 +962 2169 1.377888192290758e-06 +963 2161 -1.361668801094689e-05 +963 2162 4.587104641602014e-05 +963 2163 -1.034397545291506e-04 +963 2164 3.790325123654112e-04 +963 2165 7.486490616400395e-04 +963 2166 -1.196774105566764e-04 +963 2167 6.132507092318222e-05 +963 2168 -3.133670432002676e-05 +963 2169 9.755366072147456e-06 +964 2161 9.755366072148349e-06 +964 2162 -3.133670432002964e-05 +964 2163 6.132507092318791e-05 +964 2164 -1.196774105566881e-04 +964 2165 7.486490616400383e-04 +964 2166 3.790325123654264e-04 +964 2167 -1.034397545291594e-04 +964 2168 4.587104641602415e-05 +964 2169 -1.361668801094809e-05 +965 2161 1.377888192291336e-06 +965 2162 -4.563719592099415e-06 +965 2163 9.575317381097243e-06 +965 2164 -2.132703484630127e-05 +965 2165 8.525740288518581e-05 +965 2166 8.634705252154623e-04 +965 2167 4.800413127073595e-05 +965 2168 -6.380257597868736e-06 +965 2169 1.148247091496593e-06 +966 2161 -6.335955594804751e-06 +966 2162 1.984761106266910e-05 +966 2163 -3.642594225309250e-05 +966 2164 6.092043978102160e-05 +966 2165 -1.104912573429228e-04 +966 2166 3.849668443894159e-04 +966 2167 7.076249207781848e-04 +966 2168 -6.119691313294266e-05 +966 2169 1.765275231247145e-05 +967 2161 4.258276866271587e-06 +967 2162 -1.316860931849174e-05 +967 2163 2.343321932570148e-05 +967 2164 -3.672666032322605e-05 +967 2165 5.705134647634465e-05 +967 2166 -9.844594048838147e-05 +967 2167 5.028688547500694e-04 +967 2168 5.376012869668821e-04 +967 2169 -3.092742551699657e-07 +968 2170 -3.092742551587137e-07 +968 2171 5.376012869668999e-04 +968 2172 5.028688547500278e-04 +968 2173 -9.844594048836400e-05 +968 2174 5.705134647633676e-05 +968 2175 -3.672666032322142e-05 +968 2176 2.343321932569866e-05 +968 2177 -1.316860931849019e-05 +968 2178 4.258276866271092e-06 +969 2170 1.765275231247385e-05 +969 2171 -6.119691313295083e-05 +969 2172 7.076249207781523e-04 +969 2173 3.849668443894612e-04 +969 2174 -1.104912573429341e-04 +969 2175 6.092043978102807e-05 +969 2176 -3.642594225309645e-05 +969 2177 1.984761106267128e-05 +969 2178 -6.335955594805449e-06 +970 2170 1.148247091495058e-06 +970 2171 -6.380257597862955e-06 +970 2172 4.800413127071466e-05 +970 2173 8.634705252154728e-04 +970 2174 8.525740288519581e-05 +970 2175 -2.132703484630662e-05 +970 2176 9.575317381100407e-06 +970 2177 -4.563719592101135e-06 +970 2178 1.377888192291883e-06 +971 2170 -1.361668801094748e-05 +971 2171 4.587104641602209e-05 +971 2172 -1.034397545291548e-04 +971 2173 3.790325123654129e-04 +971 2174 7.486490616400452e-04 +971 2175 -1.196774105566829e-04 +971 2176 6.132507092318516e-05 +971 2177 -3.133670432002823e-05 +971 2178 9.755366072147912e-06 +972 2170 9.755366072147908e-06 +972 2171 -3.133670432002823e-05 +972 2172 6.132507092318517e-05 +972 2173 -1.196774105566829e-04 +972 2174 7.486490616400453e-04 +972 2175 3.790325123654129e-04 +972 2176 -1.034397545291548e-04 +972 2177 4.587104641602210e-05 +972 2178 -1.361668801094748e-05 +973 2170 1.377888192291815e-06 +973 2171 -4.563719592100925e-06 +973 2172 9.575317381100051e-06 +973 2173 -2.132703484630611e-05 +973 2174 8.525740288519531e-05 +973 2175 8.634705252154649e-04 +973 2176 4.800413127072397e-05 +973 2177 -6.380257597864636e-06 +973 2178 1.148247091495458e-06 +974 2170 -6.335955594805559e-06 +974 2171 1.984761106267162e-05 +974 2172 -3.642594225309704e-05 +974 2173 6.092043978102891e-05 +974 2174 -1.104912573429349e-04 +974 2175 3.849668443894485e-04 +974 2176 7.076249207781677e-04 +974 2177 -6.119691313295357e-05 +974 2178 1.765275231247450e-05 +975 2170 4.258276866270935e-06 +975 2171 -1.316860931848972e-05 +975 2172 2.343321932569782e-05 +975 2173 -3.672666032322016e-05 +975 2174 5.705134647633492e-05 +975 2175 -9.844594048836125e-05 +975 2176 5.028688547500233e-04 +975 2177 5.376012869669124e-04 +975 2178 -3.092742551682106e-07 +976 2188 -3.092742551660456e-07 +976 2189 5.376012869668938e-04 +976 2190 5.028688547500412e-04 +976 2191 -9.844594048836264e-05 +976 2192 5.705134647633449e-05 +976 2193 -3.672666032321964e-05 +976 2194 2.343321932569743e-05 +976 2195 -1.316860931848948e-05 +976 2196 4.258276866270857e-06 +977 2188 1.765275231247376e-05 +977 2189 -6.119691313295281e-05 +977 2190 7.076249207781823e-04 +977 2191 3.849668443894305e-04 +977 2192 -1.104912573429301e-04 +977 2193 6.092043978102605e-05 +977 2194 -3.642594225309528e-05 +977 2195 1.984761106267066e-05 +977 2196 -6.335955594805252e-06 +978 2188 1.148247091496596e-06 +978 2189 -6.380257597868736e-06 +978 2190 4.800413127073594e-05 +978 2191 8.634705252154623e-04 +978 2192 8.525740288518580e-05 +978 2193 -2.132703484630127e-05 +978 2194 9.575317381097236e-06 +978 2195 -4.563719592099414e-06 +978 2196 1.377888192291335e-06 +979 2188 -1.361668801094809e-05 +979 2189 4.587104641602414e-05 +979 2190 -1.034397545291593e-04 +979 2191 3.790325123654264e-04 +979 2192 7.486490616400382e-04 +979 2193 -1.196774105566881e-04 +979 2194 6.132507092318791e-05 +979 2195 -3.133670432002965e-05 +979 2196 9.755366072148352e-06 +980 2188 9.755366072147609e-06 +980 2189 -3.133670432002727e-05 +980 2190 6.132507092318330e-05 +980 2191 -1.196774105566789e-04 +980 2192 7.486490616400534e-04 +980 2193 3.790325123653988e-04 +980 2194 -1.034397545291503e-04 +980 2195 4.587104641602027e-05 +980 2196 -1.361668801094695e-05 +981 2188 1.377888192290828e-06 +981 2189 -4.563719592097799e-06 +981 2190 9.575317381094173e-06 +981 2191 -2.132703484629570e-05 +981 2192 8.525740288517451e-05 +981 2193 8.634705252154651e-04 +981 2194 4.800413127074308e-05 +981 2195 -6.380257597871731e-06 +981 2196 1.148247091497467e-06 +982 2188 -6.335955594805249e-06 +982 2189 1.984761106267065e-05 +982 2190 -3.642594225309528e-05 +982 2191 6.092043978102606e-05 +982 2192 -1.104912573429301e-04 +982 2193 3.849668443894307e-04 +982 2194 7.076249207781824e-04 +982 2195 -6.119691313295284e-05 +982 2196 1.765275231247377e-05 +983 2188 4.258276866270855e-06 +983 2189 -1.316860931848948e-05 +983 2190 2.343321932569743e-05 +983 2191 -3.672666032321964e-05 +983 2192 5.705134647633450e-05 +983 2193 -9.844594048836265e-05 +983 2194 5.028688547500413e-04 +983 2195 5.376012869668938e-04 +983 2196 -3.092742551660388e-07 +984 2197 -3.092742551674754e-07 +984 2198 5.376012869669000e-04 +984 2199 5.028688547500427e-04 +984 2200 -9.844594048837173e-05 +984 2201 5.705134647633897e-05 +984 2202 -3.672666032322238e-05 +984 2203 2.343321932569914e-05 +984 2204 -1.316860931849043e-05 +984 2205 4.258276866271162e-06 +985 2197 1.765275231247123e-05 +985 2198 -6.119691313294231e-05 +985 2199 7.076249207781972e-04 +985 2200 3.849668443893998e-04 +985 2201 -1.104912573429178e-04 +985 2202 6.092043978101921e-05 +985 2203 -3.642594225309116e-05 +985 2204 1.984761106266840e-05 +985 2205 -6.335955594804533e-06 +986 2197 1.148247091495520e-06 +986 2198 -6.380257597864937e-06 +986 2199 4.800413127072755e-05 +986 2200 8.634705252154587e-04 +986 2201 8.525740288519847e-05 +986 2202 -2.132703484630638e-05 +986 2203 9.575317381100136e-06 +986 2204 -4.563719592100962e-06 +986 2205 1.377888192291826e-06 +987 2197 -1.361668801094756e-05 +987 2198 4.587104641602227e-05 +987 2199 -1.034397545291546e-04 +987 2200 3.790325123654038e-04 +987 2201 7.486490616400593e-04 +987 2202 -1.196774105566897e-04 +987 2203 6.132507092318762e-05 +987 2204 -3.133670432002933e-05 +987 2205 9.755366072148234e-06 +988 2197 9.755366072147327e-06 +988 2198 -3.133670432002635e-05 +988 2199 6.132507092318135e-05 +988 2200 -1.196774105566746e-04 +988 2201 7.486490616400479e-04 +988 2202 3.790325123654017e-04 +988 2203 -1.034397545291503e-04 +988 2204 4.587104641601997e-05 +988 2205 -1.361668801094683e-05 +989 2197 1.377888192291336e-06 +989 2198 -4.563719592099415e-06 +989 2199 9.575317381097243e-06 +989 2200 -2.132703484630127e-05 +989 2201 8.525740288518581e-05 +989 2202 8.634705252154623e-04 +989 2203 4.800413127073595e-05 +989 2204 -6.380257597868736e-06 +989 2205 1.148247091496593e-06 +990 2197 -6.335955594805249e-06 +990 2198 1.984761106267065e-05 +990 2199 -3.642594225309528e-05 +990 2200 6.092043978102606e-05 +990 2201 -1.104912573429301e-04 +990 2202 3.849668443894307e-04 +990 2203 7.076249207781824e-04 +990 2204 -6.119691313295284e-05 +990 2205 1.765275231247377e-05 +991 2197 4.258276866270772e-06 +991 2198 -1.316860931848923e-05 +991 2199 2.343321932569702e-05 +991 2200 -3.672666032321906e-05 +991 2201 5.705134647633381e-05 +991 2202 -9.844594048836230e-05 +991 2203 5.028688547500476e-04 +991 2204 5.376012869668708e-04 +991 2205 -3.092742551493455e-07 +992 2224 -3.092742551736316e-07 +992 2225 5.376012869668733e-04 +992 2226 5.028688547500771e-04 +992 2227 -9.844594048837585e-05 +992 2228 5.705134647634361e-05 +992 2229 -3.672666032322587e-05 +992 2230 2.343321932570152e-05 +992 2231 -1.316860931849181e-05 +992 2232 4.258276866271614e-06 +993 2224 1.765275231247523e-05 +993 2225 -6.119691313295842e-05 +993 2226 7.076249207781732e-04 +993 2227 3.849668443894483e-04 +993 2228 -1.104912573429373e-04 +993 2229 6.092043978103018e-05 +993 2230 -3.642594225309779e-05 +993 2231 1.984761106267204e-05 +993 2232 -6.335955594805693e-06 +994 2224 1.148247091496596e-06 +994 2225 -6.380257597868736e-06 +994 2226 4.800413127073594e-05 +994 2227 8.634705252154623e-04 +994 2228 8.525740288518580e-05 +994 2229 -2.132703484630127e-05 +994 2230 9.575317381097236e-06 +994 2231 -4.563719592099414e-06 +994 2232 1.377888192291335e-06 +995 2224 -1.361668801094748e-05 +995 2225 4.587104641602209e-05 +995 2226 -1.034397545291548e-04 +995 2227 3.790325123654129e-04 +995 2228 7.486490616400452e-04 +995 2229 -1.196774105566829e-04 +995 2230 6.132507092318516e-05 +995 2231 -3.133670432002823e-05 +995 2232 9.755366072147912e-06 +996 2224 9.755366072147834e-06 +996 2225 -3.133670432002801e-05 +996 2226 6.132507092318485e-05 +996 2227 -1.196774105566828e-04 +996 2228 7.486490616400576e-04 +996 2229 3.790325123653988e-04 +996 2230 -1.034397545291522e-04 +996 2231 4.587104641602113e-05 +996 2232 -1.361668801094721e-05 +997 2224 1.377888192291826e-06 +997 2225 -4.563719592100962e-06 +997 2226 9.575317381100146e-06 +997 2227 -2.132703484630639e-05 +997 2228 8.525740288519848e-05 +997 2229 8.634705252154587e-04 +997 2230 4.800413127072753e-05 +997 2231 -6.380257597864934e-06 +997 2232 1.148247091495519e-06 +998 2224 -6.335955594804993e-06 +998 2225 1.984761106266985e-05 +998 2226 -3.642594225309376e-05 +998 2227 6.092043978102340e-05 +998 2228 -1.104912573429247e-04 +998 2229 3.849668443894141e-04 +998 2230 7.076249207781916e-04 +998 2231 -6.119691313294849e-05 +998 2232 1.765275231247306e-05 +999 2224 4.258276866271024e-06 +999 2225 -1.316860931849000e-05 +999 2226 2.343321932569833e-05 +999 2227 -3.672666032322100e-05 +999 2228 5.705134647633637e-05 +999 2229 -9.844594048836488e-05 +999 2230 5.028688547500252e-04 +999 2231 5.376012869669135e-04 +999 2232 -3.092742551685088e-07 +1000 2233 -3.092742551660456e-07 +1000 2234 5.376012869668938e-04 +1000 2235 5.028688547500412e-04 +1000 2236 -9.844594048836264e-05 +1000 2237 5.705134647633449e-05 +1000 2238 -3.672666032321964e-05 +1000 2239 2.343321932569743e-05 +1000 2240 -1.316860931848948e-05 +1000 2241 4.258276866270857e-06 +1001 2233 1.765275231247376e-05 +1001 2234 -6.119691313295281e-05 +1001 2235 7.076249207781823e-04 +1001 2236 3.849668443894305e-04 +1001 2237 -1.104912573429301e-04 +1001 2238 6.092043978102605e-05 +1001 2239 -3.642594225309528e-05 +1001 2240 1.984761106267066e-05 +1001 2241 -6.335955594805252e-06 +1002 2233 1.148247091497413e-06 +1002 2234 -6.380257597871538e-06 +1002 2235 4.800413127074256e-05 +1002 2236 8.634705252154680e-04 +1002 2237 8.525740288517197e-05 +1002 2238 -2.132703484629570e-05 +1002 2239 9.575317381094227e-06 +1002 2240 -4.563719592097842e-06 +1002 2241 1.377888192290842e-06 +1003 2233 -1.361668801094783e-05 +1003 2234 4.587104641602328e-05 +1003 2235 -1.034397545291574e-04 +1003 2236 3.790325123654264e-04 +1003 2237 7.486490616400341e-04 +1003 2238 -1.196774105566842e-04 +1003 2239 6.132507092318638e-05 +1003 2240 -3.133670432002891e-05 +1003 2241 9.755366072148127e-06 +1004 2233 9.755366072148124e-06 +1004 2234 -3.133670432002891e-05 +1004 2235 6.132507092318638e-05 +1004 2236 -1.196774105566842e-04 +1004 2237 7.486490616400341e-04 +1004 2238 3.790325123654265e-04 +1004 2239 -1.034397545291574e-04 +1004 2240 4.587104641602330e-05 +1004 2241 -1.361668801094783e-05 +1005 2233 1.377888192290843e-06 +1005 2234 -4.563719592097843e-06 +1005 2235 9.575317381094234e-06 +1005 2236 -2.132703484629571e-05 +1005 2237 8.525740288517196e-05 +1005 2238 8.634705252154680e-04 +1005 2239 4.800413127074256e-05 +1005 2240 -6.380257597871534e-06 +1005 2241 1.148247091497411e-06 +1006 2233 -6.335955594805249e-06 +1006 2234 1.984761106267065e-05 +1006 2235 -3.642594225309528e-05 +1006 2236 6.092043978102606e-05 +1006 2237 -1.104912573429301e-04 +1006 2238 3.849668443894307e-04 +1006 2239 7.076249207781824e-04 +1006 2240 -6.119691313295284e-05 +1006 2241 1.765275231247377e-05 +1007 2233 4.258276866270855e-06 +1007 2234 -1.316860931848948e-05 +1007 2235 2.343321932569743e-05 +1007 2236 -3.672666032321964e-05 +1007 2237 5.705134647633450e-05 +1007 2238 -9.844594048836265e-05 +1007 2239 5.028688547500413e-04 +1007 2240 5.376012869668938e-04 +1007 2241 -3.092742551660388e-07 +1008 2251 -3.092742551685156e-07 +1008 2252 5.376012869669135e-04 +1008 2253 5.028688547500251e-04 +1008 2254 -9.844594048836486e-05 +1008 2255 5.705134647633637e-05 +1008 2256 -3.672666032322100e-05 +1008 2257 2.343321932569834e-05 +1008 2258 -1.316860931849000e-05 +1008 2259 4.258276866271026e-06 +1009 2251 1.765275231247369e-05 +1009 2252 -6.119691313295086e-05 +1009 2253 7.076249207782000e-04 +1009 2254 3.849668443894095e-04 +1009 2255 -1.104912573429281e-04 +1009 2256 6.092043978102534e-05 +1009 2257 -3.642594225309494e-05 +1009 2258 1.984761106267049e-05 +1009 2259 -6.335955594805203e-06 +1010 2251 1.148247091496555e-06 +1010 2252 -6.380257597868847e-06 +1010 2253 4.800413127074151e-05 +1010 2254 8.634705252154511e-04 +1010 2255 8.525740288519305e-05 +1010 2256 -2.132703484630323e-05 +1010 2257 9.575317381098222e-06 +1010 2258 -4.563719592099912e-06 +1010 2259 1.377888192291489e-06 +1011 2251 -1.361668801094720e-05 +1011 2252 4.587104641602111e-05 +1011 2253 -1.034397545291522e-04 +1011 2254 3.790325123653987e-04 +1011 2255 7.486490616400577e-04 +1011 2256 -1.196774105566828e-04 +1011 2257 6.132507092318485e-05 +1011 2258 -3.133670432002801e-05 +1011 2259 9.755366072147836e-06 +1012 2251 9.755366072147908e-06 +1012 2252 -3.133670432002823e-05 +1012 2253 6.132507092318517e-05 +1012 2254 -1.196774105566829e-04 +1012 2255 7.486490616400453e-04 +1012 2256 3.790325123654129e-04 +1012 2257 -1.034397545291548e-04 +1012 2258 4.587104641602210e-05 +1012 2259 -1.361668801094748e-05 +1013 2251 1.377888192290999e-06 +1013 2252 -4.563719592098363e-06 +1013 2253 9.575317381095325e-06 +1013 2254 -2.132703484629812e-05 +1013 2255 8.525740288518038e-05 +1013 2256 8.634705252154548e-04 +1013 2257 4.800413127074991e-05 +1013 2258 -6.380257597872645e-06 +1013 2259 1.148247091497628e-06 +1014 2251 -6.335955594805899e-06 +1014 2252 1.984761106267268e-05 +1014 2253 -3.642594225309897e-05 +1014 2254 6.092043978103212e-05 +1014 2255 -1.104912573429406e-04 +1014 2256 3.849668443894437e-04 +1014 2257 7.076249207781820e-04 +1014 2258 -6.119691313296083e-05 +1014 2259 1.765275231247588e-05 +1015 2251 4.258276866271346e-06 +1015 2252 -1.316860931849099e-05 +1015 2253 2.343321932570010e-05 +1015 2254 -3.672666032322374e-05 +1015 2255 5.705134647634056e-05 +1015 2256 -9.844594048837149e-05 +1015 2257 5.028688547500707e-04 +1015 2258 5.376012869668622e-04 +1015 2259 -3.092742551587408e-07 +1016 2260 -3.092742551561523e-07 +1016 2261 5.376012869668477e-04 +1016 2262 5.028688547500793e-04 +1016 2263 -9.844594048836596e-05 +1016 2264 5.705134647633661e-05 +1016 2265 -3.672666032322108e-05 +1016 2266 2.343321932569838e-05 +1016 2267 -1.316860931849002e-05 +1016 2268 4.258276866271031e-06 +1017 2260 1.765275231247554e-05 +1017 2261 -6.119691313296238e-05 +1017 2262 7.076249207781865e-04 +1017 2263 3.849668443894362e-04 +1017 2264 -1.104912573429334e-04 +1017 2265 6.092043978102820e-05 +1017 2266 -3.642594225309665e-05 +1017 2267 1.984761106267143e-05 +1017 2268 -6.335955594805503e-06 +1018 2260 1.148247091496596e-06 +1018 2261 -6.380257597868736e-06 +1018 2262 4.800413127073594e-05 +1018 2263 8.634705252154623e-04 +1018 2264 8.525740288518580e-05 +1018 2265 -2.132703484630127e-05 +1018 2266 9.575317381097236e-06 +1018 2267 -4.563719592099414e-06 +1018 2268 1.377888192291335e-06 +1019 2260 -1.361668801094748e-05 +1019 2261 4.587104641602209e-05 +1019 2262 -1.034397545291548e-04 +1019 2263 3.790325123654129e-04 +1019 2264 7.486490616400452e-04 +1019 2265 -1.196774105566829e-04 +1019 2266 6.132507092318516e-05 +1019 2267 -3.133670432002823e-05 +1019 2268 9.755366072147912e-06 +1020 2260 9.755366072147834e-06 +1020 2261 -3.133670432002801e-05 +1020 2262 6.132507092318485e-05 +1020 2263 -1.196774105566828e-04 +1020 2264 7.486490616400576e-04 +1020 2265 3.790325123653988e-04 +1020 2266 -1.034397545291522e-04 +1020 2267 4.587104641602113e-05 +1020 2268 -1.361668801094721e-05 +1021 2260 1.377888192291826e-06 +1021 2261 -4.563719592100962e-06 +1021 2262 9.575317381100146e-06 +1021 2263 -2.132703484630639e-05 +1021 2264 8.525740288519848e-05 +1021 2265 8.634705252154587e-04 +1021 2266 4.800413127072753e-05 +1021 2267 -6.380257597864934e-06 +1021 2268 1.148247091495519e-06 +1022 2260 -6.335955594805027e-06 +1022 2261 1.984761106266995e-05 +1022 2262 -3.642594225309395e-05 +1022 2263 6.092043978102368e-05 +1022 2264 -1.104912573429251e-04 +1022 2265 3.849668443894146e-04 +1022 2266 7.076249207781948e-04 +1022 2267 -6.119691313295251e-05 +1022 2268 1.765275231247357e-05 +1023 2260 4.258276866270855e-06 +1023 2261 -1.316860931848948e-05 +1023 2262 2.343321932569743e-05 +1023 2263 -3.672666032321964e-05 +1023 2264 5.705134647633450e-05 +1023 2265 -9.844594048836265e-05 +1023 2266 5.028688547500413e-04 +1023 2267 5.376012869668938e-04 +1023 2268 -3.092742551660388e-07 diff --git a/packages/muelu/research/caglusa/coeffmap.mtx b/packages/muelu/research/caglusa/coeffmap.mtx new file mode 100644 index 000000000000..2d1963cc69b3 --- /dev/null +++ b/packages/muelu/research/caglusa/coeffmap.mtx @@ -0,0 +1,4539 @@ +%%MatrixMarket matrix array integer general +% +4536 1 +0 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +0 +7 +0 +8 +0 +9 +0 +10 +0 +11 +0 +12 +0 +13 +0 +14 +0 +15 +0 +16 +0 +17 +0 +18 +0 +19 +0 +20 +0 +21 +0 +22 +0 +23 +0 +24 +0 +25 +0 +26 +0 +27 +0 +28 +0 +29 +0 +30 +0 +31 +0 +32 +0 +33 +0 +34 +0 +35 +0 +36 +0 +37 +0 +38 +0 +39 +0 +40 +0 +41 +0 +42 +0 +43 +0 +44 +0 +45 +0 +46 +0 +47 +0 +48 +0 +49 +0 +50 +0 +51 +0 +52 +0 +53 +0 +54 +0 +55 +0 +56 +0 +57 +0 +58 +0 +59 +0 +60 +0 +61 +0 +62 +0 +63 +0 +64 +0 +65 +0 +66 +0 +67 +0 +68 +0 +69 +0 +70 +0 +71 +0 +72 +0 +73 +0 +74 +0 +75 +0 +76 +0 +77 +0 +78 +0 +79 +0 +80 +0 +81 +0 +82 +0 +83 +0 +84 +0 +85 +0 +86 +0 +87 +0 +88 +0 +89 +0 +90 +0 +91 +0 +92 +0 +93 +0 +94 +0 +95 +0 +96 +0 +97 +0 +98 +0 +99 +0 +100 +0 +101 +0 +102 +0 +103 +0 +104 +0 +105 +0 +106 +0 +107 +0 +108 +0 +109 +0 +110 +0 +111 +0 +112 +0 +113 +0 +114 +0 +115 +0 +116 +0 +117 +0 +118 +0 +119 +0 +120 +0 +121 +0 +122 +0 +123 +0 +124 +0 +125 +0 +126 +0 +127 +0 +128 +0 +129 +0 +130 +0 +131 +0 +132 +0 +133 +0 +134 +0 +135 +0 +136 +0 +137 +0 +138 +0 +139 +0 +140 +0 +141 +0 +142 +0 +143 +0 +144 +0 +145 +0 +146 +0 +147 +0 +148 +0 +149 +0 +150 +0 +151 +0 +152 +0 +153 +0 +154 +0 +155 +0 +156 +0 +157 +0 +158 +0 +159 +0 +160 +0 +161 +0 +162 +0 +163 +0 +164 +0 +165 +0 +166 +0 +167 +0 +168 +0 +169 +0 +170 +0 +171 +0 +172 +0 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +180 +0 +181 +0 +182 +0 +183 +0 +184 +0 +185 +0 +186 +0 +187 +0 +188 +0 +189 +0 +190 +0 +191 +0 +192 +0 +193 +0 +194 +0 +195 +0 +196 +0 +197 +0 +198 +0 +199 +0 +200 +0 +201 +0 +202 +0 +203 +0 +204 +0 +205 +0 +206 +0 +207 +0 +208 +0 +209 +0 +210 +0 +211 +0 +212 +0 +213 +0 +214 +0 +215 +0 +216 +0 +217 +0 +218 +0 +219 +0 +220 +0 +221 +0 +222 +0 +223 +0 +224 +0 +225 +0 +226 +0 +227 +0 +228 +0 +229 +0 +230 +0 +231 +0 +232 +0 +233 +0 +234 +0 +235 +0 +236 +0 +237 +0 +238 +0 +239 +0 +240 +0 +241 +0 +242 +0 +243 +0 +244 +0 +245 +0 +246 +0 +247 +0 +248 +0 +249 +0 +250 +0 +251 +0 +252 +0 +253 +0 +254 +0 +255 +0 +256 +0 +257 +0 +258 +0 +259 +0 +260 +0 +261 +0 +262 +0 +263 +0 +264 +0 +265 +0 +266 +0 +267 +0 +268 +0 +269 +0 +270 +0 +271 +0 +272 +0 +273 +0 +274 +0 +275 +0 +276 +0 +277 +0 +278 +0 +279 +0 +280 +0 +281 +0 +282 +0 +283 +0 +284 +0 +285 +0 +286 +0 +287 +0 +288 +0 +289 +0 +290 +0 +291 +0 +292 +0 +293 +0 +294 +0 +295 +0 +296 +0 +297 +0 +298 +0 +299 +0 +300 +0 +301 +0 +302 +0 +303 +0 +304 +0 +305 +0 +306 +0 +307 +0 +308 +0 +309 +0 +310 +0 +311 +0 +312 +0 +313 +0 +314 +0 +315 +0 +316 +0 +317 +0 +318 +0 +319 +0 +320 +0 +321 +0 +322 +0 +323 +0 +324 +0 +325 +0 +326 +0 +327 +0 +328 +0 +329 +0 +330 +0 +331 +0 +332 +0 +333 +0 +334 +0 +335 +0 +336 +0 +337 +0 +338 +0 +339 +0 +340 +0 +341 +0 +342 +0 +343 +0 +344 +0 +345 +0 +346 +0 +347 +0 +348 +0 +349 +0 +350 +0 +351 +0 +352 +0 +353 +0 +354 +0 +355 +0 +356 +0 +357 +0 +358 +0 +359 +0 +360 +0 +361 +0 +362 +0 +363 +0 +364 +0 +365 +0 +366 +0 +367 +0 +368 +0 +369 +0 +370 +0 +371 +0 +372 +0 +373 +0 +374 +0 +375 +0 +376 +0 +377 +0 +378 +0 +379 +0 +380 +0 +381 +0 +382 +0 +383 +0 +384 +0 +385 +0 +386 +0 +387 +0 +388 +0 +389 +0 +390 +0 +391 +0 +392 +0 +393 +0 +394 +0 +395 +0 +396 +0 +397 +0 +398 +0 +399 +0 +400 +0 +401 +0 +402 +0 +403 +0 +404 +0 +405 +0 +406 +0 +407 +0 +408 +0 +409 +0 +410 +0 +411 +0 +412 +0 +413 +0 +414 +0 +415 +0 +416 +0 +417 +0 +418 +0 +419 +0 +420 +0 +421 +0 +422 +0 +423 +0 +424 +0 +425 +0 +426 +0 +427 +0 +428 +0 +429 +0 +430 +0 +431 +0 +432 +0 +433 +0 +434 +0 +435 +0 +436 +0 +437 +0 +438 +0 +439 +0 +440 +0 +441 +0 +442 +0 +443 +0 +444 +0 +445 +0 +446 +0 +447 +0 +448 +0 +449 +0 +450 +0 +451 +0 +452 +0 +453 +0 +454 +0 +455 +0 +456 +0 +457 +0 +458 +0 +459 +0 +460 +0 +461 +0 +462 +0 +463 +0 +464 +0 +465 +0 +466 +0 +467 +0 +468 +0 +469 +0 +470 +0 +471 +0 +472 +0 +473 +0 +474 +0 +475 +0 +476 +0 +477 +0 +478 +0 +479 +0 +480 +0 +481 +0 +482 +0 +483 +0 +484 +0 +485 +0 +486 +0 +487 +0 +488 +0 +489 +0 +490 +0 +491 +0 +492 +0 +493 +0 +494 +0 +495 +0 +496 +0 +497 +0 +498 +0 +499 +0 +500 +0 +501 +0 +502 +0 +503 +0 +504 +0 +505 +0 +506 +0 +507 +0 +508 +0 +509 +0 +510 +0 +511 +0 +512 +0 +513 +0 +514 +0 +515 +0 +516 +0 +517 +0 +518 +0 +519 +0 +520 +0 +521 +0 +522 +0 +523 +0 +524 +0 +525 +0 +526 +0 +527 +0 +528 +0 +529 +0 +530 +0 +531 +0 +532 +0 +533 +0 +534 +0 +535 +0 +536 +0 +537 +0 +538 +0 +539 +0 +540 +0 +541 +0 +542 +0 +543 +0 +544 +0 +545 +0 +546 +0 +547 +0 +548 +0 +549 +0 +550 +0 +551 +0 +552 +0 +553 +0 +554 +0 +555 +0 +556 +0 +557 +0 +558 +0 +559 +0 +560 +0 +561 +0 +562 +0 +563 +0 +564 +0 +565 +0 +566 +0 +567 +1 +568 +1 +569 +1 +570 +1 +571 +1 +572 +1 +573 +1 +574 +1 +575 +1 +576 +1 +577 +1 +578 +1 +579 +1 +580 +1 +581 +1 +582 +1 +583 +1 +584 +1 +585 +1 +586 +1 +587 +1 +588 +1 +589 +1 +590 +1 +591 +1 +592 +1 +593 +1 +594 +1 +595 +1 +596 +1 +597 +1 +598 +1 +599 +1 +600 +1 +601 +1 +602 +1 +603 +1 +604 +1 +605 +1 +606 +1 +607 +1 +608 +1 +609 +1 +610 +1 +611 +1 +612 +1 +613 +1 +614 +1 +615 +1 +616 +1 +617 +1 +618 +1 +619 +1 +620 +1 +621 +1 +622 +1 +623 +1 +624 +1 +625 +1 +626 +1 +627 +1 +628 +1 +629 +1 +630 +1 +631 +1 +632 +1 +633 +1 +634 +1 +635 +1 +636 +1 +637 +1 +638 +1 +639 +1 +640 +1 +641 +1 +642 +1 +643 +1 +644 +1 +645 +1 +646 +1 +647 +1 +648 +1 +649 +1 +650 +1 +651 +1 +652 +1 +653 +1 +654 +1 +655 +1 +656 +1 +657 +1 +658 +1 +659 +1 +660 +1 +661 +1 +662 +1 +663 +1 +664 +1 +665 +1 +666 +1 +667 +1 +668 +1 +669 +1 +670 +1 +671 +1 +672 +1 +673 +1 +674 +1 +675 +1 +676 +1 +677 +1 +678 +1 +679 +1 +680 +1 +681 +1 +682 +1 +683 +1 +684 +1 +685 +1 +686 +1 +687 +1 +688 +1 +689 +1 +690 +1 +691 +1 +692 +1 +693 +1 +694 +1 +695 +1 +696 +1 +697 +1 +698 +1 +699 +1 +700 +1 +701 +1 +702 +1 +703 +1 +704 +1 +705 +1 +706 +1 +707 +1 +708 +1 +709 +1 +710 +1 +711 +1 +712 +1 +713 +1 +714 +1 +715 +1 +716 +1 +717 +1 +718 +1 +719 +1 +720 +1 +721 +1 +722 +1 +723 +1 +724 +1 +725 +1 +726 +1 +727 +1 +728 +1 +729 +1 +730 +1 +731 +1 +732 +1 +733 +1 +734 +1 +735 +1 +736 +1 +737 +1 +738 +1 +739 +1 +740 +1 +741 +1 +742 +1 +743 +1 +744 +1 +745 +1 +746 +1 +747 +1 +748 +1 +749 +1 +750 +1 +751 +1 +752 +1 +753 +1 +754 +1 +755 +1 +756 +1 +757 +1 +758 +1 +759 +1 +760 +1 +761 +1 +762 +1 +763 +1 +764 +1 +765 +1 +766 +1 +767 +1 +768 +1 +769 +1 +770 +1 +771 +1 +772 +1 +773 +1 +774 +1 +775 +1 +776 +1 +777 +1 +778 +1 +779 +1 +780 +1 +781 +1 +782 +1 +783 +1 +784 +1 +785 +1 +786 +1 +787 +1 +788 +1 +789 +1 +790 +1 +791 +1 +792 +1 +793 +1 +794 +1 +795 +1 +796 +1 +797 +1 +798 +1 +799 +1 +800 +1 +801 +1 +802 +1 +803 +1 +804 +1 +805 +1 +806 +1 +807 +1 +808 +1 +809 +1 +810 +1 +811 +1 +812 +1 +813 +1 +814 +1 +815 +1 +816 +1 +817 +1 +818 +1 +819 +1 +820 +1 +821 +1 +822 +1 +823 +1 +824 +1 +825 +1 +826 +1 +827 +1 +828 +1 +829 +1 +830 +1 +831 +1 +832 +1 +833 +1 +834 +1 +835 +1 +836 +1 +837 +1 +838 +1 +839 +1 +840 +1 +841 +1 +842 +1 +843 +1 +844 +1 +845 +1 +846 +1 +847 +1 +848 +1 +849 +1 +850 +1 +851 +1 +852 +1 +853 +1 +854 +1 +855 +1 +856 +1 +857 +1 +858 +1 +859 +1 +860 +1 +861 +1 +862 +1 +863 +1 +864 +1 +865 +1 +866 +1 +867 +1 +868 +1 +869 +1 +870 +1 +871 +1 +872 +1 +873 +1 +874 +1 +875 +1 +876 +1 +877 +1 +878 +1 +879 +1 +880 +1 +881 +1 +882 +1 +883 +1 +884 +1 +885 +1 +886 +1 +887 +1 +888 +1 +889 +1 +890 +1 +891 +1 +892 +1 +893 +1 +894 +1 +895 +1 +896 +1 +897 +1 +898 +1 +899 +1 +900 +1 +901 +1 +902 +1 +903 +1 +904 +1 +905 +1 +906 +1 +907 +1 +908 +1 +909 +1 +910 +1 +911 +1 +912 +1 +913 +1 +914 +1 +915 +1 +916 +1 +917 +1 +918 +1 +919 +1 +920 +1 +921 +1 +922 +1 +923 +1 +924 +1 +925 +1 +926 +1 +927 +1 +928 +1 +929 +1 +930 +1 +931 +1 +932 +1 +933 +1 +934 +1 +935 +1 +936 +1 +937 +1 +938 +1 +939 +1 +940 +1 +941 +1 +942 +1 +943 +1 +944 +1 +945 +1 +946 +1 +947 +1 +948 +1 +949 +1 +950 +1 +951 +1 +952 +1 +953 +1 +954 +1 +955 +1 +956 +1 +957 +1 +958 +1 +959 +1 +960 +1 +961 +1 +962 +1 +963 +1 +964 +1 +965 +1 +966 +1 +967 +1 +968 +1 +969 +1 +970 +1 +971 +1 +972 +1 +973 +1 +974 +1 +975 +1 +976 +1 +977 +1 +978 +1 +979 +1 +980 +1 +981 +1 +982 +1 +983 +1 +984 +1 +985 +1 +986 +1 +987 +1 +988 +1 +989 +1 +990 +1 +991 +1 +992 +1 +993 +1 +994 +1 +995 +1 +996 +1 +997 +1 +998 +1 +999 +1 +1000 +1 +1001 +1 +1002 +1 +1003 +1 +1004 +1 +1005 +1 +1006 +1 +1007 +1 +1008 +1 +1009 +1 +1010 +1 +1011 +1 +1012 +1 +1013 +1 +1014 +1 +1015 +1 +1016 +1 +1017 +1 +1018 +1 +1019 +1 +1020 +1 +1021 +1 +1022 +1 +1023 +1 +1024 +1 +1025 +1 +1026 +1 +1027 +1 +1028 +1 +1029 +1 +1030 +1 +1031 +1 +1032 +1 +1033 +1 +1034 +1 +1035 +1 +1036 +1 +1037 +1 +1038 +1 +1039 +1 +1040 +1 +1041 +1 +1042 +1 +1043 +1 +1044 +1 +1045 +1 +1046 +1 +1047 +1 +1048 +1 +1049 +1 +1050 +1 +1051 +1 +1052 +1 +1053 +1 +1054 +1 +1055 +1 +1056 +1 +1057 +1 +1058 +1 +1059 +1 +1060 +1 +1061 +1 +1062 +1 +1063 +1 +1064 +1 +1065 +1 +1066 +1 +1067 +1 +1068 +1 +1069 +1 +1070 +1 +1071 +1 +1072 +1 +1073 +1 +1074 +1 +1075 +1 +1076 +1 +1077 +1 +1078 +1 +1079 +1 +1080 +1 +1081 +1 +1082 +1 +1083 +1 +1084 +1 +1085 +1 +1086 +1 +1087 +1 +1088 +1 +1089 +1 +1090 +1 +1091 +1 +1092 +1 +1093 +1 +1094 +1 +1095 +1 +1096 +1 +1097 +1 +1098 +1 +1099 +1 +1100 +1 +1101 +1 +1102 +1 +1103 +1 +1104 +1 +1105 +1 +1106 +1 +1107 +1 +1108 +1 +1109 +1 +1110 +1 +1111 +1 +1112 +1 +1113 +1 +1114 +1 +1115 +1 +1116 +1 +1117 +1 +1118 +1 +1119 +1 +1120 +1 +1121 +1 +1122 +1 +1123 +1 +1124 +1 +1125 +1 +1126 +1 +1127 +1 +1128 +1 +1129 +1 +1130 +1 +1131 +1 +1132 +1 +1133 +1 +1134 +2 +1135 +2 +1136 +2 +1137 +2 +1138 +2 +1139 +2 +1140 +2 +1141 +2 +1142 +2 +1143 +2 +1144 +2 +1145 +2 +1146 +2 +1147 +2 +1148 +2 +1149 +2 +1150 +2 +1151 +2 +1152 +2 +1153 +2 +1154 +2 +1155 +2 +1156 +2 +1157 +2 +1158 +2 +1159 +2 +1160 +2 +1161 +2 +1162 +2 +1163 +2 +1164 +2 +1165 +2 +1166 +2 +1167 +2 +1168 +2 +1169 +2 +1170 +2 +1171 +2 +1172 +2 +1173 +2 +1174 +2 +1175 +2 +1176 +2 +1177 +2 +1178 +2 +1179 +2 +1180 +2 +1181 +2 +1182 +2 +1183 +2 +1184 +2 +1185 +2 +1186 +2 +1187 +2 +1188 +2 +1189 +2 +1190 +2 +1191 +2 +1192 +2 +1193 +2 +1194 +2 +1195 +2 +1196 +2 +1197 +2 +1198 +2 +1199 +2 +1200 +2 +1201 +2 +1202 +2 +1203 +2 +1204 +2 +1205 +2 +1206 +2 +1207 +2 +1208 +2 +1209 +2 +1210 +2 +1211 +2 +1212 +2 +1213 +2 +1214 +2 +1215 +2 +1216 +2 +1217 +2 +1218 +2 +1219 +2 +1220 +2 +1221 +2 +1222 +2 +1223 +2 +1224 +2 +1225 +2 +1226 +2 +1227 +2 +1228 +2 +1229 +2 +1230 +2 +1231 +2 +1232 +2 +1233 +2 +1234 +2 +1235 +2 +1236 +2 +1237 +2 +1238 +2 +1239 +2 +1240 +2 +1241 +2 +1242 +2 +1243 +2 +1244 +2 +1245 +2 +1246 +2 +1247 +2 +1248 +2 +1249 +2 +1250 +2 +1251 +2 +1252 +2 +1253 +2 +1254 +2 +1255 +2 +1256 +2 +1257 +2 +1258 +2 +1259 +2 +1260 +2 +1261 +2 +1262 +2 +1263 +2 +1264 +2 +1265 +2 +1266 +2 +1267 +2 +1268 +2 +1269 +2 +1270 +2 +1271 +2 +1272 +2 +1273 +2 +1274 +2 +1275 +2 +1276 +2 +1277 +2 +1278 +2 +1279 +2 +1280 +2 +1281 +2 +1282 +2 +1283 +2 +1284 +2 +1285 +2 +1286 +2 +1287 +2 +1288 +2 +1289 +2 +1290 +2 +1291 +2 +1292 +2 +1293 +2 +1294 +2 +1295 +2 +1296 +2 +1297 +2 +1298 +2 +1299 +2 +1300 +2 +1301 +2 +1302 +2 +1303 +2 +1304 +2 +1305 +2 +1306 +2 +1307 +2 +1308 +2 +1309 +2 +1310 +2 +1311 +2 +1312 +2 +1313 +2 +1314 +2 +1315 +2 +1316 +2 +1317 +2 +1318 +2 +1319 +2 +1320 +2 +1321 +2 +1322 +2 +1323 +2 +1324 +2 +1325 +2 +1326 +2 +1327 +2 +1328 +2 +1329 +2 +1330 +2 +1331 +2 +1332 +2 +1333 +2 +1334 +2 +1335 +2 +1336 +2 +1337 +2 +1338 +2 +1339 +2 +1340 +2 +1341 +2 +1342 +2 +1343 +2 +1344 +2 +1345 +2 +1346 +2 +1347 +2 +1348 +2 +1349 +2 +1350 +2 +1351 +2 +1352 +2 +1353 +2 +1354 +2 +1355 +2 +1356 +2 +1357 +2 +1358 +2 +1359 +2 +1360 +2 +1361 +2 +1362 +2 +1363 +2 +1364 +2 +1365 +2 +1366 +2 +1367 +2 +1368 +2 +1369 +2 +1370 +2 +1371 +2 +1372 +2 +1373 +2 +1374 +2 +1375 +2 +1376 +2 +1377 +2 +1378 +2 +1379 +2 +1380 +2 +1381 +2 +1382 +2 +1383 +2 +1384 +2 +1385 +2 +1386 +2 +1387 +2 +1388 +2 +1389 +2 +1390 +2 +1391 +2 +1392 +2 +1393 +2 +1394 +2 +1395 +2 +1396 +2 +1397 +2 +1398 +2 +1399 +2 +1400 +2 +1401 +2 +1402 +2 +1403 +2 +1404 +2 +1405 +2 +1406 +2 +1407 +2 +1408 +2 +1409 +2 +1410 +2 +1411 +2 +1412 +2 +1413 +2 +1414 +2 +1415 +2 +1416 +2 +1417 +2 +1418 +2 +1419 +2 +1420 +2 +1421 +2 +1422 +2 +1423 +2 +1424 +2 +1425 +2 +1426 +2 +1427 +2 +1428 +2 +1429 +2 +1430 +2 +1431 +2 +1432 +2 +1433 +2 +1434 +2 +1435 +2 +1436 +2 +1437 +2 +1438 +2 +1439 +2 +1440 +2 +1441 +2 +1442 +2 +1443 +2 +1444 +2 +1445 +2 +1446 +2 +1447 +2 +1448 +2 +1449 +2 +1450 +2 +1451 +2 +1452 +2 +1453 +2 +1454 +2 +1455 +2 +1456 +2 +1457 +2 +1458 +2 +1459 +2 +1460 +2 +1461 +2 +1462 +2 +1463 +2 +1464 +2 +1465 +2 +1466 +2 +1467 +2 +1468 +2 +1469 +2 +1470 +2 +1471 +2 +1472 +2 +1473 +2 +1474 +2 +1475 +2 +1476 +2 +1477 +2 +1478 +2 +1479 +2 +1480 +2 +1481 +2 +1482 +2 +1483 +2 +1484 +2 +1485 +2 +1486 +2 +1487 +2 +1488 +2 +1489 +2 +1490 +2 +1491 +2 +1492 +2 +1493 +2 +1494 +2 +1495 +2 +1496 +2 +1497 +2 +1498 +2 +1499 +2 +1500 +2 +1501 +2 +1502 +2 +1503 +2 +1504 +2 +1505 +2 +1506 +2 +1507 +2 +1508 +2 +1509 +2 +1510 +2 +1511 +2 +1512 +2 +1513 +2 +1514 +2 +1515 +2 +1516 +2 +1517 +2 +1518 +2 +1519 +2 +1520 +2 +1521 +2 +1522 +2 +1523 +2 +1524 +2 +1525 +2 +1526 +2 +1527 +2 +1528 +2 +1529 +2 +1530 +2 +1531 +2 +1532 +2 +1533 +2 +1534 +2 +1535 +2 +1536 +2 +1537 +2 +1538 +2 +1539 +2 +1540 +2 +1541 +2 +1542 +2 +1543 +2 +1544 +2 +1545 +2 +1546 +2 +1547 +2 +1548 +2 +1549 +2 +1550 +2 +1551 +2 +1552 +2 +1553 +2 +1554 +2 +1555 +2 +1556 +2 +1557 +2 +1558 +2 +1559 +2 +1560 +2 +1561 +2 +1562 +2 +1563 +2 +1564 +2 +1565 +2 +1566 +2 +1567 +2 +1568 +2 +1569 +2 +1570 +2 +1571 +2 +1572 +2 +1573 +2 +1574 +2 +1575 +2 +1576 +2 +1577 +2 +1578 +2 +1579 +2 +1580 +2 +1581 +2 +1582 +2 +1583 +2 +1584 +2 +1585 +2 +1586 +2 +1587 +2 +1588 +2 +1589 +2 +1590 +2 +1591 +2 +1592 +2 +1593 +2 +1594 +2 +1595 +2 +1596 +2 +1597 +2 +1598 +2 +1599 +2 +1600 +2 +1601 +2 +1602 +2 +1603 +2 +1604 +2 +1605 +2 +1606 +2 +1607 +2 +1608 +2 +1609 +2 +1610 +2 +1611 +2 +1612 +2 +1613 +2 +1614 +2 +1615 +2 +1616 +2 +1617 +2 +1618 +2 +1619 +2 +1620 +2 +1621 +2 +1622 +2 +1623 +2 +1624 +2 +1625 +2 +1626 +2 +1627 +2 +1628 +2 +1629 +2 +1630 +2 +1631 +2 +1632 +2 +1633 +2 +1634 +2 +1635 +2 +1636 +2 +1637 +2 +1638 +2 +1639 +2 +1640 +2 +1641 +2 +1642 +2 +1643 +2 +1644 +2 +1645 +2 +1646 +2 +1647 +2 +1648 +2 +1649 +2 +1650 +2 +1651 +2 +1652 +2 +1653 +2 +1654 +2 +1655 +2 +1656 +2 +1657 +2 +1658 +2 +1659 +2 +1660 +2 +1661 +2 +1662 +2 +1663 +2 +1664 +2 +1665 +2 +1666 +2 +1667 +2 +1668 +2 +1669 +2 +1670 +2 +1671 +2 +1672 +2 +1673 +2 +1674 +2 +1675 +2 +1676 +2 +1677 +2 +1678 +2 +1679 +2 +1680 +2 +1681 +2 +1682 +2 +1683 +2 +1684 +2 +1685 +2 +1686 +2 +1687 +2 +1688 +2 +1689 +2 +1690 +2 +1691 +2 +1692 +2 +1693 +2 +1694 +2 +1695 +2 +1696 +2 +1697 +2 +1698 +2 +1699 +2 +1700 +2 +1701 +3 +1702 +3 +1703 +3 +1704 +3 +1705 +3 +1706 +3 +1707 +3 +1708 +3 +1709 +3 +1710 +3 +1711 +3 +1712 +3 +1713 +3 +1714 +3 +1715 +3 +1716 +3 +1717 +3 +1718 +3 +1719 +3 +1720 +3 +1721 +3 +1722 +3 +1723 +3 +1724 +3 +1725 +3 +1726 +3 +1727 +3 +1728 +3 +1729 +3 +1730 +3 +1731 +3 +1732 +3 +1733 +3 +1734 +3 +1735 +3 +1736 +3 +1737 +3 +1738 +3 +1739 +3 +1740 +3 +1741 +3 +1742 +3 +1743 +3 +1744 +3 +1745 +3 +1746 +3 +1747 +3 +1748 +3 +1749 +3 +1750 +3 +1751 +3 +1752 +3 +1753 +3 +1754 +3 +1755 +3 +1756 +3 +1757 +3 +1758 +3 +1759 +3 +1760 +3 +1761 +3 +1762 +3 +1763 +3 +1764 +3 +1765 +3 +1766 +3 +1767 +3 +1768 +3 +1769 +3 +1770 +3 +1771 +3 +1772 +3 +1773 +3 +1774 +3 +1775 +3 +1776 +3 +1777 +3 +1778 +3 +1779 +3 +1780 +3 +1781 +3 +1782 +3 +1783 +3 +1784 +3 +1785 +3 +1786 +3 +1787 +3 +1788 +3 +1789 +3 +1790 +3 +1791 +3 +1792 +3 +1793 +3 +1794 +3 +1795 +3 +1796 +3 +1797 +3 +1798 +3 +1799 +3 +1800 +3 +1801 +3 +1802 +3 +1803 +3 +1804 +3 +1805 +3 +1806 +3 +1807 +3 +1808 +3 +1809 +3 +1810 +3 +1811 +3 +1812 +3 +1813 +3 +1814 +3 +1815 +3 +1816 +3 +1817 +3 +1818 +3 +1819 +3 +1820 +3 +1821 +3 +1822 +3 +1823 +3 +1824 +3 +1825 +3 +1826 +3 +1827 +3 +1828 +3 +1829 +3 +1830 +3 +1831 +3 +1832 +3 +1833 +3 +1834 +3 +1835 +3 +1836 +3 +1837 +3 +1838 +3 +1839 +3 +1840 +3 +1841 +3 +1842 +3 +1843 +3 +1844 +3 +1845 +3 +1846 +3 +1847 +3 +1848 +3 +1849 +3 +1850 +3 +1851 +3 +1852 +3 +1853 +3 +1854 +3 +1855 +3 +1856 +3 +1857 +3 +1858 +3 +1859 +3 +1860 +3 +1861 +3 +1862 +3 +1863 +3 +1864 +3 +1865 +3 +1866 +3 +1867 +3 +1868 +3 +1869 +3 +1870 +3 +1871 +3 +1872 +3 +1873 +3 +1874 +3 +1875 +3 +1876 +3 +1877 +3 +1878 +3 +1879 +3 +1880 +3 +1881 +3 +1882 +3 +1883 +3 +1884 +3 +1885 +3 +1886 +3 +1887 +3 +1888 +3 +1889 +3 +1890 +3 +1891 +3 +1892 +3 +1893 +3 +1894 +3 +1895 +3 +1896 +3 +1897 +3 +1898 +3 +1899 +3 +1900 +3 +1901 +3 +1902 +3 +1903 +3 +1904 +3 +1905 +3 +1906 +3 +1907 +3 +1908 +3 +1909 +3 +1910 +3 +1911 +3 +1912 +3 +1913 +3 +1914 +3 +1915 +3 +1916 +3 +1917 +3 +1918 +3 +1919 +3 +1920 +3 +1921 +3 +1922 +3 +1923 +3 +1924 +3 +1925 +3 +1926 +3 +1927 +3 +1928 +3 +1929 +3 +1930 +3 +1931 +3 +1932 +3 +1933 +3 +1934 +3 +1935 +3 +1936 +3 +1937 +3 +1938 +3 +1939 +3 +1940 +3 +1941 +3 +1942 +3 +1943 +3 +1944 +3 +1945 +3 +1946 +3 +1947 +3 +1948 +3 +1949 +3 +1950 +3 +1951 +3 +1952 +3 +1953 +3 +1954 +3 +1955 +3 +1956 +3 +1957 +3 +1958 +3 +1959 +3 +1960 +3 +1961 +3 +1962 +3 +1963 +3 +1964 +3 +1965 +3 +1966 +3 +1967 +3 +1968 +3 +1969 +3 +1970 +3 +1971 +3 +1972 +3 +1973 +3 +1974 +3 +1975 +3 +1976 +3 +1977 +3 +1978 +3 +1979 +3 +1980 +3 +1981 +3 +1982 +3 +1983 +3 +1984 +3 +1985 +3 +1986 +3 +1987 +3 +1988 +3 +1989 +3 +1990 +3 +1991 +3 +1992 +3 +1993 +3 +1994 +3 +1995 +3 +1996 +3 +1997 +3 +1998 +3 +1999 +3 +2000 +3 +2001 +3 +2002 +3 +2003 +3 +2004 +3 +2005 +3 +2006 +3 +2007 +3 +2008 +3 +2009 +3 +2010 +3 +2011 +3 +2012 +3 +2013 +3 +2014 +3 +2015 +3 +2016 +3 +2017 +3 +2018 +3 +2019 +3 +2020 +3 +2021 +3 +2022 +3 +2023 +3 +2024 +3 +2025 +3 +2026 +3 +2027 +3 +2028 +3 +2029 +3 +2030 +3 +2031 +3 +2032 +3 +2033 +3 +2034 +3 +2035 +3 +2036 +3 +2037 +3 +2038 +3 +2039 +3 +2040 +3 +2041 +3 +2042 +3 +2043 +3 +2044 +3 +2045 +3 +2046 +3 +2047 +3 +2048 +3 +2049 +3 +2050 +3 +2051 +3 +2052 +3 +2053 +3 +2054 +3 +2055 +3 +2056 +3 +2057 +3 +2058 +3 +2059 +3 +2060 +3 +2061 +3 +2062 +3 +2063 +3 +2064 +3 +2065 +3 +2066 +3 +2067 +3 +2068 +3 +2069 +3 +2070 +3 +2071 +3 +2072 +3 +2073 +3 +2074 +3 +2075 +3 +2076 +3 +2077 +3 +2078 +3 +2079 +3 +2080 +3 +2081 +3 +2082 +3 +2083 +3 +2084 +3 +2085 +3 +2086 +3 +2087 +3 +2088 +3 +2089 +3 +2090 +3 +2091 +3 +2092 +3 +2093 +3 +2094 +3 +2095 +3 +2096 +3 +2097 +3 +2098 +3 +2099 +3 +2100 +3 +2101 +3 +2102 +3 +2103 +3 +2104 +3 +2105 +3 +2106 +3 +2107 +3 +2108 +3 +2109 +3 +2110 +3 +2111 +3 +2112 +3 +2113 +3 +2114 +3 +2115 +3 +2116 +3 +2117 +3 +2118 +3 +2119 +3 +2120 +3 +2121 +3 +2122 +3 +2123 +3 +2124 +3 +2125 +3 +2126 +3 +2127 +3 +2128 +3 +2129 +3 +2130 +3 +2131 +3 +2132 +3 +2133 +3 +2134 +3 +2135 +3 +2136 +3 +2137 +3 +2138 +3 +2139 +3 +2140 +3 +2141 +3 +2142 +3 +2143 +3 +2144 +3 +2145 +3 +2146 +3 +2147 +3 +2148 +3 +2149 +3 +2150 +3 +2151 +3 +2152 +3 +2153 +3 +2154 +3 +2155 +3 +2156 +3 +2157 +3 +2158 +3 +2159 +3 +2160 +3 +2161 +3 +2162 +3 +2163 +3 +2164 +3 +2165 +3 +2166 +3 +2167 +3 +2168 +3 +2169 +3 +2170 +3 +2171 +3 +2172 +3 +2173 +3 +2174 +3 +2175 +3 +2176 +3 +2177 +3 +2178 +3 +2179 +3 +2180 +3 +2181 +3 +2182 +3 +2183 +3 +2184 +3 +2185 +3 +2186 +3 +2187 +3 +2188 +3 +2189 +3 +2190 +3 +2191 +3 +2192 +3 +2193 +3 +2194 +3 +2195 +3 +2196 +3 +2197 +3 +2198 +3 +2199 +3 +2200 +3 +2201 +3 +2202 +3 +2203 +3 +2204 +3 +2205 +3 +2206 +3 +2207 +3 +2208 +3 +2209 +3 +2210 +3 +2211 +3 +2212 +3 +2213 +3 +2214 +3 +2215 +3 +2216 +3 +2217 +3 +2218 +3 +2219 +3 +2220 +3 +2221 +3 +2222 +3 +2223 +3 +2224 +3 +2225 +3 +2226 +3 +2227 +3 +2228 +3 +2229 +3 +2230 +3 +2231 +3 +2232 +3 +2233 +3 +2234 +3 +2235 +3 +2236 +3 +2237 +3 +2238 +3 +2239 +3 +2240 +3 +2241 +3 +2242 +3 +2243 +3 +2244 +3 +2245 +3 +2246 +3 +2247 +3 +2248 +3 +2249 +3 +2250 +3 +2251 +3 +2252 +3 +2253 +3 +2254 +3 +2255 +3 +2256 +3 +2257 +3 +2258 +3 +2259 +3 +2260 +3 +2261 +3 +2262 +3 +2263 +3 +2264 +3 +2265 +3 +2266 +3 +2267 +3 diff --git a/packages/muelu/research/caglusa/coords.mtx b/packages/muelu/research/caglusa/coords.mtx new file mode 100644 index 000000000000..04b8b7223365 --- /dev/null +++ b/packages/muelu/research/caglusa/coords.mtx @@ -0,0 +1,1026 @@ +%%MatrixMarket matrix array real general +% +1023 1 +9.7656250000000000e-04 +1.9531250000000000e-03 +2.9296875000000000e-03 +3.9062500000000000e-03 +4.8828125000000000e-03 +5.8593750000000000e-03 +6.8359375000000000e-03 +7.8125000000000000e-03 +8.7890625000000000e-03 +9.7656250000000000e-03 +1.0742187500000000e-02 +1.1718750000000000e-02 +1.2695312500000000e-02 +1.3671875000000000e-02 +1.4648437500000000e-02 +1.5625000000000000e-02 +1.6601562500000000e-02 +1.7578125000000000e-02 +1.8554687500000000e-02 +1.9531250000000000e-02 +2.0507812500000000e-02 +2.1484375000000000e-02 +2.2460937500000000e-02 +2.3437500000000000e-02 +2.4414062500000000e-02 +2.5390625000000000e-02 +2.6367187500000000e-02 +2.7343750000000000e-02 +2.8320312500000000e-02 +2.9296875000000000e-02 +3.0273437500000000e-02 +3.1250000000000000e-02 +3.2226562500000000e-02 +3.3203125000000000e-02 +3.4179687500000000e-02 +3.5156250000000000e-02 +3.6132812500000000e-02 +3.7109375000000000e-02 +3.8085937500000000e-02 +3.9062500000000000e-02 +4.0039062500000000e-02 +4.1015625000000000e-02 +4.1992187500000000e-02 +4.2968750000000000e-02 +4.3945312500000000e-02 +4.4921875000000000e-02 +4.5898437500000000e-02 +4.6875000000000000e-02 +4.7851562500000000e-02 +4.8828125000000000e-02 +4.9804687500000000e-02 +5.0781250000000000e-02 +5.1757812500000000e-02 +5.2734375000000000e-02 +5.3710937500000000e-02 +5.4687500000000000e-02 +5.5664062500000000e-02 +5.6640625000000000e-02 +5.7617187500000000e-02 +5.8593750000000000e-02 +5.9570312500000000e-02 +6.0546875000000000e-02 +6.1523437500000000e-02 +6.2500000000000000e-02 +6.3476562500000000e-02 +6.4453125000000000e-02 +6.5429687500000000e-02 +6.6406250000000000e-02 +6.7382812500000000e-02 +6.8359375000000000e-02 +6.9335937500000000e-02 +7.0312500000000000e-02 +7.1289062500000000e-02 +7.2265625000000000e-02 +7.3242187500000000e-02 +7.4218750000000000e-02 +7.5195312500000000e-02 +7.6171875000000000e-02 +7.7148437500000000e-02 +7.8125000000000000e-02 +7.9101562500000000e-02 +8.0078125000000000e-02 +8.1054687500000000e-02 +8.2031250000000000e-02 +8.3007812500000000e-02 +8.3984375000000000e-02 +8.4960937500000000e-02 +8.5937500000000000e-02 +8.6914062500000000e-02 +8.7890625000000000e-02 +8.8867187500000000e-02 +8.9843750000000000e-02 +9.0820312500000000e-02 +9.1796875000000000e-02 +9.2773437500000000e-02 +9.3750000000000000e-02 +9.4726562500000000e-02 +9.5703125000000000e-02 +9.6679687500000000e-02 +9.7656250000000000e-02 +9.8632812500000000e-02 +9.9609375000000000e-02 +1.0058593750000000e-01 +1.0156250000000000e-01 +1.0253906250000000e-01 +1.0351562500000000e-01 +1.0449218750000000e-01 +1.0546875000000000e-01 +1.0644531250000000e-01 +1.0742187500000000e-01 +1.0839843750000000e-01 +1.0937500000000000e-01 +1.1035156250000000e-01 +1.1132812500000000e-01 +1.1230468750000000e-01 +1.1328125000000000e-01 +1.1425781250000000e-01 +1.1523437500000000e-01 +1.1621093750000000e-01 +1.1718750000000000e-01 +1.1816406250000000e-01 +1.1914062500000000e-01 +1.2011718750000000e-01 +1.2109375000000000e-01 +1.2207031250000000e-01 +1.2304687500000000e-01 +1.2402343750000000e-01 +1.2500000000000000e-01 +1.2597656250000000e-01 +1.2695312500000000e-01 +1.2792968750000000e-01 +1.2890625000000000e-01 +1.2988281250000000e-01 +1.3085937500000000e-01 +1.3183593750000000e-01 +1.3281250000000000e-01 +1.3378906250000000e-01 +1.3476562500000000e-01 +1.3574218750000000e-01 +1.3671875000000000e-01 +1.3769531250000000e-01 +1.3867187500000000e-01 +1.3964843750000000e-01 +1.4062500000000000e-01 +1.4160156250000000e-01 +1.4257812500000000e-01 +1.4355468750000000e-01 +1.4453125000000000e-01 +1.4550781250000000e-01 +1.4648437500000000e-01 +1.4746093750000000e-01 +1.4843750000000000e-01 +1.4941406250000000e-01 +1.5039062500000000e-01 +1.5136718750000000e-01 +1.5234375000000000e-01 +1.5332031250000000e-01 +1.5429687500000000e-01 +1.5527343750000000e-01 +1.5625000000000000e-01 +1.5722656250000000e-01 +1.5820312500000000e-01 +1.5917968750000000e-01 +1.6015625000000000e-01 +1.6113281250000000e-01 +1.6210937500000000e-01 +1.6308593750000000e-01 +1.6406250000000000e-01 +1.6503906250000000e-01 +1.6601562500000000e-01 +1.6699218750000000e-01 +1.6796875000000000e-01 +1.6894531250000000e-01 +1.6992187500000000e-01 +1.7089843750000000e-01 +1.7187500000000000e-01 +1.7285156250000000e-01 +1.7382812500000000e-01 +1.7480468750000000e-01 +1.7578125000000000e-01 +1.7675781250000000e-01 +1.7773437500000000e-01 +1.7871093750000000e-01 +1.7968750000000000e-01 +1.8066406250000000e-01 +1.8164062500000000e-01 +1.8261718750000000e-01 +1.8359375000000000e-01 +1.8457031250000000e-01 +1.8554687500000000e-01 +1.8652343750000000e-01 +1.8750000000000000e-01 +1.8847656250000000e-01 +1.8945312500000000e-01 +1.9042968750000000e-01 +1.9140625000000000e-01 +1.9238281250000000e-01 +1.9335937500000000e-01 +1.9433593750000000e-01 +1.9531250000000000e-01 +1.9628906250000000e-01 +1.9726562500000000e-01 +1.9824218750000000e-01 +1.9921875000000000e-01 +2.0019531250000000e-01 +2.0117187500000000e-01 +2.0214843750000000e-01 +2.0312500000000000e-01 +2.0410156250000000e-01 +2.0507812500000000e-01 +2.0605468750000000e-01 +2.0703125000000000e-01 +2.0800781250000000e-01 +2.0898437500000000e-01 +2.0996093750000000e-01 +2.1093750000000000e-01 +2.1191406250000000e-01 +2.1289062500000000e-01 +2.1386718750000000e-01 +2.1484375000000000e-01 +2.1582031250000000e-01 +2.1679687500000000e-01 +2.1777343750000000e-01 +2.1875000000000000e-01 +2.1972656250000000e-01 +2.2070312500000000e-01 +2.2167968750000000e-01 +2.2265625000000000e-01 +2.2363281250000000e-01 +2.2460937500000000e-01 +2.2558593750000000e-01 +2.2656250000000000e-01 +2.2753906250000000e-01 +2.2851562500000000e-01 +2.2949218750000000e-01 +2.3046875000000000e-01 +2.3144531250000000e-01 +2.3242187500000000e-01 +2.3339843750000000e-01 +2.3437500000000000e-01 +2.3535156250000000e-01 +2.3632812500000000e-01 +2.3730468750000000e-01 +2.3828125000000000e-01 +2.3925781250000000e-01 +2.4023437500000000e-01 +2.4121093750000000e-01 +2.4218750000000000e-01 +2.4316406250000000e-01 +2.4414062500000000e-01 +2.4511718750000000e-01 +2.4609375000000000e-01 +2.4707031250000000e-01 +2.4804687500000000e-01 +2.4902343750000000e-01 +2.5000000000000000e-01 +2.5097656250000000e-01 +2.5195312500000000e-01 +2.5292968750000000e-01 +2.5390625000000000e-01 +2.5488281250000000e-01 +2.5585937500000000e-01 +2.5683593750000000e-01 +2.5781250000000000e-01 +2.5878906250000000e-01 +2.5976562500000000e-01 +2.6074218750000000e-01 +2.6171875000000000e-01 +2.6269531250000000e-01 +2.6367187500000000e-01 +2.6464843750000000e-01 +2.6562500000000000e-01 +2.6660156250000000e-01 +2.6757812500000000e-01 +2.6855468750000000e-01 +2.6953125000000000e-01 +2.7050781250000000e-01 +2.7148437500000000e-01 +2.7246093750000000e-01 +2.7343750000000000e-01 +2.7441406250000000e-01 +2.7539062500000000e-01 +2.7636718750000000e-01 +2.7734375000000000e-01 +2.7832031250000000e-01 +2.7929687500000000e-01 +2.8027343750000000e-01 +2.8125000000000000e-01 +2.8222656250000000e-01 +2.8320312500000000e-01 +2.8417968750000000e-01 +2.8515625000000000e-01 +2.8613281250000000e-01 +2.8710937500000000e-01 +2.8808593750000000e-01 +2.8906250000000000e-01 +2.9003906250000000e-01 +2.9101562500000000e-01 +2.9199218750000000e-01 +2.9296875000000000e-01 +2.9394531250000000e-01 +2.9492187500000000e-01 +2.9589843750000000e-01 +2.9687500000000000e-01 +2.9785156250000000e-01 +2.9882812500000000e-01 +2.9980468750000000e-01 +3.0078125000000000e-01 +3.0175781250000000e-01 +3.0273437500000000e-01 +3.0371093750000000e-01 +3.0468750000000000e-01 +3.0566406250000000e-01 +3.0664062500000000e-01 +3.0761718750000000e-01 +3.0859375000000000e-01 +3.0957031250000000e-01 +3.1054687500000000e-01 +3.1152343750000000e-01 +3.1250000000000000e-01 +3.1347656250000000e-01 +3.1445312500000000e-01 +3.1542968750000000e-01 +3.1640625000000000e-01 +3.1738281250000000e-01 +3.1835937500000000e-01 +3.1933593750000000e-01 +3.2031250000000000e-01 +3.2128906250000000e-01 +3.2226562500000000e-01 +3.2324218750000000e-01 +3.2421875000000000e-01 +3.2519531250000000e-01 +3.2617187500000000e-01 +3.2714843750000000e-01 +3.2812500000000000e-01 +3.2910156250000000e-01 +3.3007812500000000e-01 +3.3105468750000000e-01 +3.3203125000000000e-01 +3.3300781250000000e-01 +3.3398437500000000e-01 +3.3496093750000000e-01 +3.3593750000000000e-01 +3.3691406250000000e-01 +3.3789062500000000e-01 +3.3886718750000000e-01 +3.3984375000000000e-01 +3.4082031250000000e-01 +3.4179687500000000e-01 +3.4277343750000000e-01 +3.4375000000000000e-01 +3.4472656250000000e-01 +3.4570312500000000e-01 +3.4667968750000000e-01 +3.4765625000000000e-01 +3.4863281250000000e-01 +3.4960937500000000e-01 +3.5058593750000000e-01 +3.5156250000000000e-01 +3.5253906250000000e-01 +3.5351562500000000e-01 +3.5449218750000000e-01 +3.5546875000000000e-01 +3.5644531250000000e-01 +3.5742187500000000e-01 +3.5839843750000000e-01 +3.5937500000000000e-01 +3.6035156250000000e-01 +3.6132812500000000e-01 +3.6230468750000000e-01 +3.6328125000000000e-01 +3.6425781250000000e-01 +3.6523437500000000e-01 +3.6621093750000000e-01 +3.6718750000000000e-01 +3.6816406250000000e-01 +3.6914062500000000e-01 +3.7011718750000000e-01 +3.7109375000000000e-01 +3.7207031250000000e-01 +3.7304687500000000e-01 +3.7402343750000000e-01 +3.7500000000000000e-01 +3.7597656250000000e-01 +3.7695312500000000e-01 +3.7792968750000000e-01 +3.7890625000000000e-01 +3.7988281250000000e-01 +3.8085937500000000e-01 +3.8183593750000000e-01 +3.8281250000000000e-01 +3.8378906250000000e-01 +3.8476562500000000e-01 +3.8574218750000000e-01 +3.8671875000000000e-01 +3.8769531250000000e-01 +3.8867187500000000e-01 +3.8964843750000000e-01 +3.9062500000000000e-01 +3.9160156250000000e-01 +3.9257812500000000e-01 +3.9355468750000000e-01 +3.9453125000000000e-01 +3.9550781250000000e-01 +3.9648437500000000e-01 +3.9746093750000000e-01 +3.9843750000000000e-01 +3.9941406250000000e-01 +4.0039062500000000e-01 +4.0136718750000000e-01 +4.0234375000000000e-01 +4.0332031250000000e-01 +4.0429687500000000e-01 +4.0527343750000000e-01 +4.0625000000000000e-01 +4.0722656250000000e-01 +4.0820312500000000e-01 +4.0917968750000000e-01 +4.1015625000000000e-01 +4.1113281250000000e-01 +4.1210937500000000e-01 +4.1308593750000000e-01 +4.1406250000000000e-01 +4.1503906250000000e-01 +4.1601562500000000e-01 +4.1699218750000000e-01 +4.1796875000000000e-01 +4.1894531250000000e-01 +4.1992187500000000e-01 +4.2089843750000000e-01 +4.2187500000000000e-01 +4.2285156250000000e-01 +4.2382812500000000e-01 +4.2480468750000000e-01 +4.2578125000000000e-01 +4.2675781250000000e-01 +4.2773437500000000e-01 +4.2871093750000000e-01 +4.2968750000000000e-01 +4.3066406250000000e-01 +4.3164062500000000e-01 +4.3261718750000000e-01 +4.3359375000000000e-01 +4.3457031250000000e-01 +4.3554687500000000e-01 +4.3652343750000000e-01 +4.3750000000000000e-01 +4.3847656250000000e-01 +4.3945312500000000e-01 +4.4042968750000000e-01 +4.4140625000000000e-01 +4.4238281250000000e-01 +4.4335937500000000e-01 +4.4433593750000000e-01 +4.4531250000000000e-01 +4.4628906250000000e-01 +4.4726562500000000e-01 +4.4824218750000000e-01 +4.4921875000000000e-01 +4.5019531250000000e-01 +4.5117187500000000e-01 +4.5214843750000000e-01 +4.5312500000000000e-01 +4.5410156250000000e-01 +4.5507812500000000e-01 +4.5605468750000000e-01 +4.5703125000000000e-01 +4.5800781250000000e-01 +4.5898437500000000e-01 +4.5996093750000000e-01 +4.6093750000000000e-01 +4.6191406250000000e-01 +4.6289062500000000e-01 +4.6386718750000000e-01 +4.6484375000000000e-01 +4.6582031250000000e-01 +4.6679687500000000e-01 +4.6777343750000000e-01 +4.6875000000000000e-01 +4.6972656250000000e-01 +4.7070312500000000e-01 +4.7167968750000000e-01 +4.7265625000000000e-01 +4.7363281250000000e-01 +4.7460937500000000e-01 +4.7558593750000000e-01 +4.7656250000000000e-01 +4.7753906250000000e-01 +4.7851562500000000e-01 +4.7949218750000000e-01 +4.8046875000000000e-01 +4.8144531250000000e-01 +4.8242187500000000e-01 +4.8339843750000000e-01 +4.8437500000000000e-01 +4.8535156250000000e-01 +4.8632812500000000e-01 +4.8730468750000000e-01 +4.8828125000000000e-01 +4.8925781250000000e-01 +4.9023437500000000e-01 +4.9121093750000000e-01 +4.9218750000000000e-01 +4.9316406250000000e-01 +4.9414062500000000e-01 +4.9511718750000000e-01 +4.9609375000000000e-01 +4.9707031250000000e-01 +4.9804687500000000e-01 +4.9902343750000000e-01 +5.0000000000000000e-01 +5.0097656250000000e-01 +5.0195312500000000e-01 +5.0292968750000000e-01 +5.0390625000000000e-01 +5.0488281250000000e-01 +5.0585937500000000e-01 +5.0683593750000000e-01 +5.0781250000000000e-01 +5.0878906250000000e-01 +5.0976562500000000e-01 +5.1074218750000000e-01 +5.1171875000000000e-01 +5.1269531250000000e-01 +5.1367187500000000e-01 +5.1464843750000000e-01 +5.1562500000000000e-01 +5.1660156250000000e-01 +5.1757812500000000e-01 +5.1855468750000000e-01 +5.1953125000000000e-01 +5.2050781250000000e-01 +5.2148437500000000e-01 +5.2246093750000000e-01 +5.2343750000000000e-01 +5.2441406250000000e-01 +5.2539062500000000e-01 +5.2636718750000000e-01 +5.2734375000000000e-01 +5.2832031250000000e-01 +5.2929687500000000e-01 +5.3027343750000000e-01 +5.3125000000000000e-01 +5.3222656250000000e-01 +5.3320312500000000e-01 +5.3417968750000000e-01 +5.3515625000000000e-01 +5.3613281250000000e-01 +5.3710937500000000e-01 +5.3808593750000000e-01 +5.3906250000000000e-01 +5.4003906250000000e-01 +5.4101562500000000e-01 +5.4199218750000000e-01 +5.4296875000000000e-01 +5.4394531250000000e-01 +5.4492187500000000e-01 +5.4589843750000000e-01 +5.4687500000000000e-01 +5.4785156250000000e-01 +5.4882812500000000e-01 +5.4980468750000000e-01 +5.5078125000000000e-01 +5.5175781250000000e-01 +5.5273437500000000e-01 +5.5371093750000000e-01 +5.5468750000000000e-01 +5.5566406250000000e-01 +5.5664062500000000e-01 +5.5761718750000000e-01 +5.5859375000000000e-01 +5.5957031250000000e-01 +5.6054687500000000e-01 +5.6152343750000000e-01 +5.6250000000000000e-01 +5.6347656250000000e-01 +5.6445312500000000e-01 +5.6542968750000000e-01 +5.6640625000000000e-01 +5.6738281250000000e-01 +5.6835937500000000e-01 +5.6933593750000000e-01 +5.7031250000000000e-01 +5.7128906250000000e-01 +5.7226562500000000e-01 +5.7324218750000000e-01 +5.7421875000000000e-01 +5.7519531250000000e-01 +5.7617187500000000e-01 +5.7714843750000000e-01 +5.7812500000000000e-01 +5.7910156250000000e-01 +5.8007812500000000e-01 +5.8105468750000000e-01 +5.8203125000000000e-01 +5.8300781250000000e-01 +5.8398437500000000e-01 +5.8496093750000000e-01 +5.8593750000000000e-01 +5.8691406250000000e-01 +5.8789062500000000e-01 +5.8886718750000000e-01 +5.8984375000000000e-01 +5.9082031250000000e-01 +5.9179687500000000e-01 +5.9277343750000000e-01 +5.9375000000000000e-01 +5.9472656250000000e-01 +5.9570312500000000e-01 +5.9667968750000000e-01 +5.9765625000000000e-01 +5.9863281250000000e-01 +5.9960937500000000e-01 +6.0058593750000000e-01 +6.0156250000000000e-01 +6.0253906250000000e-01 +6.0351562500000000e-01 +6.0449218750000000e-01 +6.0546875000000000e-01 +6.0644531250000000e-01 +6.0742187500000000e-01 +6.0839843750000000e-01 +6.0937500000000000e-01 +6.1035156250000000e-01 +6.1132812500000000e-01 +6.1230468750000000e-01 +6.1328125000000000e-01 +6.1425781250000000e-01 +6.1523437500000000e-01 +6.1621093750000000e-01 +6.1718750000000000e-01 +6.1816406250000000e-01 +6.1914062500000000e-01 +6.2011718750000000e-01 +6.2109375000000000e-01 +6.2207031250000000e-01 +6.2304687500000000e-01 +6.2402343750000000e-01 +6.2500000000000000e-01 +6.2597656250000000e-01 +6.2695312500000000e-01 +6.2792968750000000e-01 +6.2890625000000000e-01 +6.2988281250000000e-01 +6.3085937500000000e-01 +6.3183593750000000e-01 +6.3281250000000000e-01 +6.3378906250000000e-01 +6.3476562500000000e-01 +6.3574218750000000e-01 +6.3671875000000000e-01 +6.3769531250000000e-01 +6.3867187500000000e-01 +6.3964843750000000e-01 +6.4062500000000000e-01 +6.4160156250000000e-01 +6.4257812500000000e-01 +6.4355468750000000e-01 +6.4453125000000000e-01 +6.4550781250000000e-01 +6.4648437500000000e-01 +6.4746093750000000e-01 +6.4843750000000000e-01 +6.4941406250000000e-01 +6.5039062500000000e-01 +6.5136718750000000e-01 +6.5234375000000000e-01 +6.5332031250000000e-01 +6.5429687500000000e-01 +6.5527343750000000e-01 +6.5625000000000000e-01 +6.5722656250000000e-01 +6.5820312500000000e-01 +6.5917968750000000e-01 +6.6015625000000000e-01 +6.6113281250000000e-01 +6.6210937500000000e-01 +6.6308593750000000e-01 +6.6406250000000000e-01 +6.6503906250000000e-01 +6.6601562500000000e-01 +6.6699218750000000e-01 +6.6796875000000000e-01 +6.6894531250000000e-01 +6.6992187500000000e-01 +6.7089843750000000e-01 +6.7187500000000000e-01 +6.7285156250000000e-01 +6.7382812500000000e-01 +6.7480468750000000e-01 +6.7578125000000000e-01 +6.7675781250000000e-01 +6.7773437500000000e-01 +6.7871093750000000e-01 +6.7968750000000000e-01 +6.8066406250000000e-01 +6.8164062500000000e-01 +6.8261718750000000e-01 +6.8359375000000000e-01 +6.8457031250000000e-01 +6.8554687500000000e-01 +6.8652343750000000e-01 +6.8750000000000000e-01 +6.8847656250000000e-01 +6.8945312500000000e-01 +6.9042968750000000e-01 +6.9140625000000000e-01 +6.9238281250000000e-01 +6.9335937500000000e-01 +6.9433593750000000e-01 +6.9531250000000000e-01 +6.9628906250000000e-01 +6.9726562500000000e-01 +6.9824218750000000e-01 +6.9921875000000000e-01 +7.0019531250000000e-01 +7.0117187500000000e-01 +7.0214843750000000e-01 +7.0312500000000000e-01 +7.0410156250000000e-01 +7.0507812500000000e-01 +7.0605468750000000e-01 +7.0703125000000000e-01 +7.0800781250000000e-01 +7.0898437500000000e-01 +7.0996093750000000e-01 +7.1093750000000000e-01 +7.1191406250000000e-01 +7.1289062500000000e-01 +7.1386718750000000e-01 +7.1484375000000000e-01 +7.1582031250000000e-01 +7.1679687500000000e-01 +7.1777343750000000e-01 +7.1875000000000000e-01 +7.1972656250000000e-01 +7.2070312500000000e-01 +7.2167968750000000e-01 +7.2265625000000000e-01 +7.2363281250000000e-01 +7.2460937500000000e-01 +7.2558593750000000e-01 +7.2656250000000000e-01 +7.2753906250000000e-01 +7.2851562500000000e-01 +7.2949218750000000e-01 +7.3046875000000000e-01 +7.3144531250000000e-01 +7.3242187500000000e-01 +7.3339843750000000e-01 +7.3437500000000000e-01 +7.3535156250000000e-01 +7.3632812500000000e-01 +7.3730468750000000e-01 +7.3828125000000000e-01 +7.3925781250000000e-01 +7.4023437500000000e-01 +7.4121093750000000e-01 +7.4218750000000000e-01 +7.4316406250000000e-01 +7.4414062500000000e-01 +7.4511718750000000e-01 +7.4609375000000000e-01 +7.4707031250000000e-01 +7.4804687500000000e-01 +7.4902343750000000e-01 +7.5000000000000000e-01 +7.5097656250000000e-01 +7.5195312500000000e-01 +7.5292968750000000e-01 +7.5390625000000000e-01 +7.5488281250000000e-01 +7.5585937500000000e-01 +7.5683593750000000e-01 +7.5781250000000000e-01 +7.5878906250000000e-01 +7.5976562500000000e-01 +7.6074218750000000e-01 +7.6171875000000000e-01 +7.6269531250000000e-01 +7.6367187500000000e-01 +7.6464843750000000e-01 +7.6562500000000000e-01 +7.6660156250000000e-01 +7.6757812500000000e-01 +7.6855468750000000e-01 +7.6953125000000000e-01 +7.7050781250000000e-01 +7.7148437500000000e-01 +7.7246093750000000e-01 +7.7343750000000000e-01 +7.7441406250000000e-01 +7.7539062500000000e-01 +7.7636718750000000e-01 +7.7734375000000000e-01 +7.7832031250000000e-01 +7.7929687500000000e-01 +7.8027343750000000e-01 +7.8125000000000000e-01 +7.8222656250000000e-01 +7.8320312500000000e-01 +7.8417968750000000e-01 +7.8515625000000000e-01 +7.8613281250000000e-01 +7.8710937500000000e-01 +7.8808593750000000e-01 +7.8906250000000000e-01 +7.9003906250000000e-01 +7.9101562500000000e-01 +7.9199218750000000e-01 +7.9296875000000000e-01 +7.9394531250000000e-01 +7.9492187500000000e-01 +7.9589843750000000e-01 +7.9687500000000000e-01 +7.9785156250000000e-01 +7.9882812500000000e-01 +7.9980468750000000e-01 +8.0078125000000000e-01 +8.0175781250000000e-01 +8.0273437500000000e-01 +8.0371093750000000e-01 +8.0468750000000000e-01 +8.0566406250000000e-01 +8.0664062500000000e-01 +8.0761718750000000e-01 +8.0859375000000000e-01 +8.0957031250000000e-01 +8.1054687500000000e-01 +8.1152343750000000e-01 +8.1250000000000000e-01 +8.1347656250000000e-01 +8.1445312500000000e-01 +8.1542968750000000e-01 +8.1640625000000000e-01 +8.1738281250000000e-01 +8.1835937500000000e-01 +8.1933593750000000e-01 +8.2031250000000000e-01 +8.2128906250000000e-01 +8.2226562500000000e-01 +8.2324218750000000e-01 +8.2421875000000000e-01 +8.2519531250000000e-01 +8.2617187500000000e-01 +8.2714843750000000e-01 +8.2812500000000000e-01 +8.2910156250000000e-01 +8.3007812500000000e-01 +8.3105468750000000e-01 +8.3203125000000000e-01 +8.3300781250000000e-01 +8.3398437500000000e-01 +8.3496093750000000e-01 +8.3593750000000000e-01 +8.3691406250000000e-01 +8.3789062500000000e-01 +8.3886718750000000e-01 +8.3984375000000000e-01 +8.4082031250000000e-01 +8.4179687500000000e-01 +8.4277343750000000e-01 +8.4375000000000000e-01 +8.4472656250000000e-01 +8.4570312500000000e-01 +8.4667968750000000e-01 +8.4765625000000000e-01 +8.4863281250000000e-01 +8.4960937500000000e-01 +8.5058593750000000e-01 +8.5156250000000000e-01 +8.5253906250000000e-01 +8.5351562500000000e-01 +8.5449218750000000e-01 +8.5546875000000000e-01 +8.5644531250000000e-01 +8.5742187500000000e-01 +8.5839843750000000e-01 +8.5937500000000000e-01 +8.6035156250000000e-01 +8.6132812500000000e-01 +8.6230468750000000e-01 +8.6328125000000000e-01 +8.6425781250000000e-01 +8.6523437500000000e-01 +8.6621093750000000e-01 +8.6718750000000000e-01 +8.6816406250000000e-01 +8.6914062500000000e-01 +8.7011718750000000e-01 +8.7109375000000000e-01 +8.7207031250000000e-01 +8.7304687500000000e-01 +8.7402343750000000e-01 +8.7500000000000000e-01 +8.7597656250000000e-01 +8.7695312500000000e-01 +8.7792968750000000e-01 +8.7890625000000000e-01 +8.7988281250000000e-01 +8.8085937500000000e-01 +8.8183593750000000e-01 +8.8281250000000000e-01 +8.8378906250000000e-01 +8.8476562500000000e-01 +8.8574218750000000e-01 +8.8671875000000000e-01 +8.8769531250000000e-01 +8.8867187500000000e-01 +8.8964843750000000e-01 +8.9062500000000000e-01 +8.9160156250000000e-01 +8.9257812500000000e-01 +8.9355468750000000e-01 +8.9453125000000000e-01 +8.9550781250000000e-01 +8.9648437500000000e-01 +8.9746093750000000e-01 +8.9843750000000000e-01 +8.9941406250000000e-01 +9.0039062500000000e-01 +9.0136718750000000e-01 +9.0234375000000000e-01 +9.0332031250000000e-01 +9.0429687500000000e-01 +9.0527343750000000e-01 +9.0625000000000000e-01 +9.0722656250000000e-01 +9.0820312500000000e-01 +9.0917968750000000e-01 +9.1015625000000000e-01 +9.1113281250000000e-01 +9.1210937500000000e-01 +9.1308593750000000e-01 +9.1406250000000000e-01 +9.1503906250000000e-01 +9.1601562500000000e-01 +9.1699218750000000e-01 +9.1796875000000000e-01 +9.1894531250000000e-01 +9.1992187500000000e-01 +9.2089843750000000e-01 +9.2187500000000000e-01 +9.2285156250000000e-01 +9.2382812500000000e-01 +9.2480468750000000e-01 +9.2578125000000000e-01 +9.2675781250000000e-01 +9.2773437500000000e-01 +9.2871093750000000e-01 +9.2968750000000000e-01 +9.3066406250000000e-01 +9.3164062500000000e-01 +9.3261718750000000e-01 +9.3359375000000000e-01 +9.3457031250000000e-01 +9.3554687500000000e-01 +9.3652343750000000e-01 +9.3750000000000000e-01 +9.3847656250000000e-01 +9.3945312500000000e-01 +9.4042968750000000e-01 +9.4140625000000000e-01 +9.4238281250000000e-01 +9.4335937500000000e-01 +9.4433593750000000e-01 +9.4531250000000000e-01 +9.4628906250000000e-01 +9.4726562500000000e-01 +9.4824218750000000e-01 +9.4921875000000000e-01 +9.5019531250000000e-01 +9.5117187500000000e-01 +9.5214843750000000e-01 +9.5312500000000000e-01 +9.5410156250000000e-01 +9.5507812500000000e-01 +9.5605468750000000e-01 +9.5703125000000000e-01 +9.5800781250000000e-01 +9.5898437500000000e-01 +9.5996093750000000e-01 +9.6093750000000000e-01 +9.6191406250000000e-01 +9.6289062500000000e-01 +9.6386718750000000e-01 +9.6484375000000000e-01 +9.6582031250000000e-01 +9.6679687500000000e-01 +9.6777343750000000e-01 +9.6875000000000000e-01 +9.6972656250000000e-01 +9.7070312500000000e-01 +9.7167968750000000e-01 +9.7265625000000000e-01 +9.7363281250000000e-01 +9.7460937500000000e-01 +9.7558593750000000e-01 +9.7656250000000000e-01 +9.7753906250000000e-01 +9.7851562500000000e-01 +9.7949218750000000e-01 +9.8046875000000000e-01 +9.8144531250000000e-01 +9.8242187500000000e-01 +9.8339843750000000e-01 +9.8437500000000000e-01 +9.8535156250000000e-01 +9.8632812500000000e-01 +9.8730468750000000e-01 +9.8828125000000000e-01 +9.8925781250000000e-01 +9.9023437500000000e-01 +9.9121093750000000e-01 +9.9218750000000000e-01 +9.9316406250000000e-01 +9.9414062500000000e-01 +9.9511718750000000e-01 +9.9609375000000000e-01 +9.9707031250000000e-01 +9.9804687500000000e-01 +9.9902343750000000e-01 diff --git a/packages/muelu/research/caglusa/ghosted_coeffmap.mtx b/packages/muelu/research/caglusa/ghosted_coeffmap.mtx new file mode 100644 index 000000000000..e0b5e1c68efc --- /dev/null +++ b/packages/muelu/research/caglusa/ghosted_coeffmap.mtx @@ -0,0 +1,5511 @@ +%%MatrixMarket matrix array integer general +% +5508 1 +0 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +0 +7 +0 +8 +0 +9 +0 +10 +0 +11 +0 +12 +0 +13 +0 +14 +0 +15 +0 +16 +0 +17 +0 +18 +0 +19 +0 +20 +0 +21 +0 +22 +0 +23 +0 +24 +0 +25 +0 +26 +0 +27 +0 +28 +0 +29 +0 +30 +0 +31 +0 +32 +0 +33 +0 +34 +0 +35 +0 +36 +0 +37 +0 +38 +0 +39 +0 +40 +0 +41 +0 +42 +0 +43 +0 +44 +0 +45 +0 +46 +0 +47 +0 +48 +0 +49 +0 +50 +0 +51 +0 +52 +0 +53 +0 +54 +0 +55 +0 +56 +0 +57 +0 +58 +0 +59 +0 +60 +0 +61 +0 +62 +0 +63 +0 +64 +0 +65 +0 +66 +0 +67 +0 +68 +0 +69 +0 +70 +0 +71 +0 +72 +0 +73 +0 +74 +0 +75 +0 +76 +0 +77 +0 +78 +0 +79 +0 +80 +0 +81 +0 +82 +0 +83 +0 +84 +0 +85 +0 +86 +0 +87 +0 +88 +0 +89 +0 +90 +0 +91 +0 +92 +0 +93 +0 +94 +0 +95 +0 +96 +0 +97 +0 +98 +0 +99 +0 +100 +0 +101 +0 +102 +0 +103 +0 +104 +0 +105 +0 +106 +0 +107 +0 +108 +0 +109 +0 +110 +0 +111 +0 +112 +0 +113 +0 +114 +0 +115 +0 +116 +0 +117 +0 +118 +0 +119 +0 +120 +0 +121 +0 +122 +0 +123 +0 +124 +0 +125 +0 +126 +0 +127 +0 +128 +0 +129 +0 +130 +0 +131 +0 +132 +0 +133 +0 +134 +0 +135 +0 +136 +0 +137 +0 +138 +0 +139 +0 +140 +0 +141 +0 +142 +0 +143 +0 +144 +0 +145 +0 +146 +0 +147 +0 +148 +0 +149 +0 +150 +0 +151 +0 +152 +0 +153 +0 +154 +0 +155 +0 +156 +0 +157 +0 +158 +0 +159 +0 +160 +0 +161 +0 +162 +0 +163 +0 +164 +0 +165 +0 +166 +0 +167 +0 +168 +0 +169 +0 +170 +0 +171 +0 +172 +0 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +180 +0 +181 +0 +182 +0 +183 +0 +184 +0 +185 +0 +186 +0 +187 +0 +188 +0 +189 +0 +190 +0 +191 +0 +192 +0 +193 +0 +194 +0 +195 +0 +196 +0 +197 +0 +198 +0 +199 +0 +200 +0 +201 +0 +202 +0 +203 +0 +204 +0 +205 +0 +206 +0 +207 +0 +208 +0 +209 +0 +210 +0 +211 +0 +212 +0 +213 +0 +214 +0 +215 +0 +216 +0 +217 +0 +218 +0 +219 +0 +220 +0 +221 +0 +222 +0 +223 +0 +224 +0 +225 +0 +226 +0 +227 +0 +228 +0 +229 +0 +230 +0 +231 +0 +232 +0 +233 +0 +234 +0 +235 +0 +236 +0 +237 +0 +238 +0 +239 +0 +240 +0 +241 +0 +242 +0 +243 +0 +244 +0 +245 +0 +246 +0 +247 +0 +248 +0 +249 +0 +250 +0 +251 +0 +252 +0 +253 +0 +254 +0 +255 +0 +256 +0 +257 +0 +258 +0 +259 +0 +260 +0 +261 +0 +262 +0 +263 +0 +264 +0 +265 +0 +266 +0 +267 +0 +268 +0 +269 +0 +270 +0 +271 +0 +272 +0 +273 +0 +274 +0 +275 +0 +276 +0 +277 +0 +278 +0 +279 +0 +280 +0 +281 +0 +282 +0 +283 +0 +284 +0 +285 +0 +286 +0 +287 +0 +288 +0 +289 +0 +290 +0 +291 +0 +292 +0 +293 +0 +294 +0 +295 +0 +296 +0 +297 +0 +298 +0 +299 +0 +300 +0 +301 +0 +302 +0 +303 +0 +304 +0 +305 +0 +306 +0 +307 +0 +308 +0 +309 +0 +310 +0 +311 +0 +312 +0 +313 +0 +314 +0 +315 +0 +316 +0 +317 +0 +318 +0 +319 +0 +320 +0 +321 +0 +322 +0 +323 +0 +324 +0 +325 +0 +326 +0 +327 +0 +328 +0 +329 +0 +330 +0 +331 +0 +332 +0 +333 +0 +334 +0 +335 +0 +336 +0 +337 +0 +338 +0 +339 +0 +340 +0 +341 +0 +342 +0 +343 +0 +344 +0 +345 +0 +346 +0 +347 +0 +348 +0 +349 +0 +350 +0 +351 +0 +352 +0 +353 +0 +354 +0 +355 +0 +356 +0 +357 +0 +358 +0 +359 +0 +360 +0 +361 +0 +362 +0 +363 +0 +364 +0 +365 +0 +366 +0 +367 +0 +368 +0 +369 +0 +370 +0 +371 +0 +372 +0 +373 +0 +374 +0 +375 +0 +376 +0 +377 +0 +378 +0 +379 +0 +380 +0 +381 +0 +382 +0 +383 +0 +384 +0 +385 +0 +386 +0 +387 +0 +388 +0 +389 +0 +390 +0 +391 +0 +392 +0 +393 +0 +394 +0 +395 +0 +396 +0 +397 +0 +398 +0 +399 +0 +400 +0 +401 +0 +402 +0 +403 +0 +404 +0 +405 +0 +406 +0 +407 +0 +408 +0 +409 +0 +410 +0 +411 +0 +412 +0 +413 +0 +414 +0 +415 +0 +416 +0 +417 +0 +418 +0 +419 +0 +420 +0 +421 +0 +422 +0 +423 +0 +424 +0 +425 +0 +426 +0 +427 +0 +428 +0 +429 +0 +430 +0 +431 +0 +432 +0 +433 +0 +434 +0 +435 +0 +436 +0 +437 +0 +438 +0 +439 +0 +440 +0 +441 +0 +442 +0 +443 +0 +444 +0 +445 +0 +446 +0 +447 +0 +448 +0 +449 +0 +450 +0 +451 +0 +452 +0 +453 +0 +454 +0 +455 +0 +456 +0 +457 +0 +458 +0 +459 +0 +460 +0 +461 +0 +462 +0 +463 +0 +464 +0 +465 +0 +466 +0 +467 +0 +468 +0 +469 +0 +470 +0 +471 +0 +472 +0 +473 +0 +474 +0 +475 +0 +476 +0 +477 +0 +478 +0 +479 +0 +480 +0 +481 +0 +482 +0 +483 +0 +484 +0 +485 +0 +486 +0 +487 +0 +488 +0 +489 +0 +490 +0 +491 +0 +492 +0 +493 +0 +494 +0 +495 +0 +496 +0 +497 +0 +498 +0 +499 +0 +500 +0 +501 +0 +502 +0 +503 +0 +504 +0 +505 +0 +506 +0 +507 +0 +508 +0 +509 +0 +510 +0 +511 +0 +512 +0 +513 +0 +514 +0 +515 +0 +516 +0 +517 +0 +518 +0 +519 +0 +520 +0 +521 +0 +522 +0 +523 +0 +524 +0 +525 +0 +526 +0 +527 +0 +528 +0 +529 +0 +530 +0 +531 +0 +532 +0 +533 +0 +534 +0 +535 +0 +536 +0 +537 +0 +538 +0 +539 +0 +540 +0 +541 +0 +542 +0 +543 +0 +544 +0 +545 +0 +546 +0 +547 +0 +548 +0 +549 +0 +550 +0 +551 +0 +552 +0 +553 +0 +554 +0 +555 +0 +556 +0 +557 +0 +558 +0 +559 +0 +560 +0 +561 +0 +562 +0 +563 +0 +564 +0 +565 +0 +566 +0 +576 +0 +577 +0 +578 +0 +579 +0 +580 +0 +581 +0 +582 +0 +583 +0 +584 +0 +585 +0 +586 +0 +587 +0 +588 +0 +589 +0 +590 +0 +591 +0 +592 +0 +593 +0 +594 +0 +595 +0 +596 +0 +597 +0 +598 +0 +599 +0 +600 +0 +601 +0 +602 +0 +603 +0 +604 +0 +605 +0 +606 +0 +607 +0 +608 +0 +609 +0 +610 +0 +611 +0 +1134 +0 +1135 +0 +1136 +0 +1137 +0 +1138 +0 +1139 +0 +1140 +0 +1141 +0 +630 +0 +631 +0 +632 +0 +633 +0 +634 +0 +635 +0 +636 +0 +637 +0 +638 +0 +1142 +0 +657 +0 +658 +0 +659 +0 +660 +0 +661 +0 +662 +0 +663 +0 +664 +0 +665 +0 +1701 +0 +1702 +0 +1703 +0 +1704 +0 +1705 +0 +1706 +0 +1707 +0 +1708 +0 +1709 +0 +720 +0 +721 +0 +722 +0 +723 +0 +724 +0 +725 +0 +726 +0 +727 +0 +728 +0 +855 +0 +856 +0 +857 +0 +858 +0 +859 +0 +860 +0 +861 +0 +862 +0 +863 +0 +567 +1 +568 +1 +569 +1 +570 +1 +571 +1 +572 +1 +573 +1 +574 +1 +575 +1 +576 +1 +577 +1 +578 +1 +579 +1 +580 +1 +581 +1 +582 +1 +583 +1 +584 +1 +585 +1 +586 +1 +587 +1 +588 +1 +589 +1 +590 +1 +591 +1 +592 +1 +593 +1 +594 +1 +595 +1 +596 +1 +597 +1 +598 +1 +599 +1 +600 +1 +601 +1 +602 +1 +603 +1 +604 +1 +605 +1 +606 +1 +607 +1 +608 +1 +609 +1 +610 +1 +611 +1 +612 +1 +613 +1 +614 +1 +615 +1 +616 +1 +617 +1 +618 +1 +619 +1 +620 +1 +621 +1 +622 +1 +623 +1 +624 +1 +625 +1 +626 +1 +627 +1 +628 +1 +629 +1 +630 +1 +631 +1 +632 +1 +633 +1 +634 +1 +635 +1 +636 +1 +637 +1 +638 +1 +639 +1 +640 +1 +641 +1 +642 +1 +643 +1 +644 +1 +645 +1 +646 +1 +647 +1 +648 +1 +649 +1 +650 +1 +651 +1 +652 +1 +653 +1 +654 +1 +655 +1 +656 +1 +657 +1 +658 +1 +659 +1 +660 +1 +661 +1 +662 +1 +663 +1 +664 +1 +665 +1 +666 +1 +667 +1 +668 +1 +669 +1 +670 +1 +671 +1 +672 +1 +673 +1 +674 +1 +675 +1 +676 +1 +677 +1 +678 +1 +679 +1 +680 +1 +681 +1 +682 +1 +683 +1 +684 +1 +685 +1 +686 +1 +687 +1 +688 +1 +689 +1 +690 +1 +691 +1 +692 +1 +693 +1 +694 +1 +695 +1 +696 +1 +697 +1 +698 +1 +699 +1 +700 +1 +701 +1 +702 +1 +703 +1 +704 +1 +705 +1 +706 +1 +707 +1 +708 +1 +709 +1 +710 +1 +711 +1 +712 +1 +713 +1 +714 +1 +715 +1 +716 +1 +717 +1 +718 +1 +719 +1 +720 +1 +721 +1 +722 +1 +723 +1 +724 +1 +725 +1 +726 +1 +727 +1 +728 +1 +729 +1 +730 +1 +731 +1 +732 +1 +733 +1 +734 +1 +735 +1 +736 +1 +737 +1 +738 +1 +739 +1 +740 +1 +741 +1 +742 +1 +743 +1 +744 +1 +745 +1 +746 +1 +747 +1 +748 +1 +749 +1 +750 +1 +751 +1 +752 +1 +753 +1 +754 +1 +755 +1 +756 +1 +757 +1 +758 +1 +759 +1 +760 +1 +761 +1 +762 +1 +763 +1 +764 +1 +765 +1 +766 +1 +767 +1 +768 +1 +769 +1 +770 +1 +771 +1 +772 +1 +773 +1 +774 +1 +775 +1 +776 +1 +777 +1 +778 +1 +779 +1 +780 +1 +781 +1 +782 +1 +783 +1 +784 +1 +785 +1 +786 +1 +787 +1 +788 +1 +789 +1 +790 +1 +791 +1 +792 +1 +793 +1 +794 +1 +795 +1 +796 +1 +797 +1 +798 +1 +799 +1 +800 +1 +801 +1 +802 +1 +803 +1 +804 +1 +805 +1 +806 +1 +807 +1 +808 +1 +809 +1 +810 +1 +811 +1 +812 +1 +813 +1 +814 +1 +815 +1 +816 +1 +817 +1 +818 +1 +819 +1 +820 +1 +821 +1 +822 +1 +823 +1 +824 +1 +825 +1 +826 +1 +827 +1 +828 +1 +829 +1 +830 +1 +831 +1 +832 +1 +833 +1 +834 +1 +835 +1 +836 +1 +837 +1 +838 +1 +839 +1 +840 +1 +841 +1 +842 +1 +843 +1 +844 +1 +845 +1 +846 +1 +847 +1 +848 +1 +849 +1 +850 +1 +851 +1 +852 +1 +853 +1 +854 +1 +855 +1 +856 +1 +857 +1 +858 +1 +859 +1 +860 +1 +861 +1 +862 +1 +863 +1 +864 +1 +865 +1 +866 +1 +867 +1 +868 +1 +869 +1 +870 +1 +871 +1 +872 +1 +873 +1 +874 +1 +875 +1 +876 +1 +877 +1 +878 +1 +879 +1 +880 +1 +881 +1 +882 +1 +883 +1 +884 +1 +885 +1 +886 +1 +887 +1 +888 +1 +889 +1 +890 +1 +891 +1 +892 +1 +893 +1 +894 +1 +895 +1 +896 +1 +897 +1 +898 +1 +899 +1 +900 +1 +901 +1 +902 +1 +903 +1 +904 +1 +905 +1 +906 +1 +907 +1 +908 +1 +909 +1 +910 +1 +911 +1 +912 +1 +913 +1 +914 +1 +915 +1 +916 +1 +917 +1 +918 +1 +919 +1 +920 +1 +921 +1 +922 +1 +923 +1 +924 +1 +925 +1 +926 +1 +927 +1 +928 +1 +929 +1 +930 +1 +931 +1 +932 +1 +933 +1 +934 +1 +935 +1 +936 +1 +937 +1 +938 +1 +939 +1 +940 +1 +941 +1 +942 +1 +943 +1 +944 +1 +945 +1 +946 +1 +947 +1 +948 +1 +949 +1 +950 +1 +951 +1 +952 +1 +953 +1 +954 +1 +955 +1 +956 +1 +957 +1 +958 +1 +959 +1 +960 +1 +961 +1 +962 +1 +963 +1 +964 +1 +965 +1 +966 +1 +967 +1 +968 +1 +969 +1 +970 +1 +971 +1 +972 +1 +973 +1 +974 +1 +975 +1 +976 +1 +977 +1 +978 +1 +979 +1 +980 +1 +981 +1 +982 +1 +983 +1 +984 +1 +985 +1 +986 +1 +987 +1 +988 +1 +989 +1 +990 +1 +991 +1 +992 +1 +993 +1 +994 +1 +995 +1 +996 +1 +997 +1 +998 +1 +999 +1 +1000 +1 +1001 +1 +1002 +1 +1003 +1 +1004 +1 +1005 +1 +1006 +1 +1007 +1 +1008 +1 +1009 +1 +1010 +1 +1011 +1 +1012 +1 +1013 +1 +1014 +1 +1015 +1 +1016 +1 +1017 +1 +1018 +1 +1019 +1 +1020 +1 +1021 +1 +1022 +1 +1023 +1 +1024 +1 +1025 +1 +1026 +1 +1027 +1 +1028 +1 +1029 +1 +1030 +1 +1031 +1 +1032 +1 +1033 +1 +1034 +1 +1035 +1 +1036 +1 +1037 +1 +1038 +1 +1039 +1 +1040 +1 +1041 +1 +1042 +1 +1043 +1 +1044 +1 +1045 +1 +1046 +1 +1047 +1 +1048 +1 +1049 +1 +1050 +1 +1051 +1 +1052 +1 +1053 +1 +1054 +1 +1055 +1 +1056 +1 +1057 +1 +1058 +1 +1059 +1 +1060 +1 +1061 +1 +1062 +1 +1063 +1 +1064 +1 +1065 +1 +1066 +1 +1067 +1 +1068 +1 +1069 +1 +1070 +1 +1071 +1 +1072 +1 +1073 +1 +1074 +1 +1075 +1 +1076 +1 +1077 +1 +1078 +1 +1079 +1 +1080 +1 +1081 +1 +1082 +1 +1083 +1 +1084 +1 +1085 +1 +1086 +1 +1087 +1 +1088 +1 +1089 +1 +1090 +1 +1091 +1 +1092 +1 +1093 +1 +1094 +1 +1095 +1 +1096 +1 +1097 +1 +1098 +1 +1099 +1 +1100 +1 +1101 +1 +1102 +1 +1103 +1 +1104 +1 +1105 +1 +1106 +1 +1107 +1 +1108 +1 +1109 +1 +1110 +1 +1111 +1 +1112 +1 +1113 +1 +1114 +1 +1115 +1 +1116 +1 +1117 +1 +1118 +1 +1119 +1 +1120 +1 +1121 +1 +1122 +1 +1123 +1 +1124 +1 +1125 +1 +1126 +1 +1127 +1 +1128 +1 +1129 +1 +1130 +1 +1131 +1 +1132 +1 +1133 +1 +512 +1 +513 +1 +514 +1 +515 +1 +516 +1 +517 +1 +518 +1 +519 +1 +520 +1 +521 +1 +9 +1 +10 +1 +11 +1 +12 +1 +13 +1 +14 +1 +15 +1 +16 +1 +17 +1 +540 +1 +541 +1 +542 +1 +543 +1 +544 +1 +545 +1 +546 +1 +547 +1 +548 +1 +1143 +1 +1144 +1 +1145 +1 +1146 +1 +1147 +1 +1148 +1 +1149 +1 +1150 +1 +1151 +1 +1152 +1 +1153 +1 +1154 +1 +1155 +1 +1156 +1 +1157 +1 +1158 +1 +1159 +1 +1160 +1 +1161 +1 +1162 +1 +1163 +1 +1164 +1 +1165 +1 +1166 +1 +1167 +1 +1168 +1 +1169 +1 +1170 +1 +1171 +1 +1172 +1 +1173 +1 +1174 +1 +1175 +1 +1176 +1 +1177 +1 +1178 +1 +1701 +1 +1702 +1 +1703 +1 +1704 +1 +1705 +1 +1706 +1 +1707 +1 +1708 +1 +1197 +1 +1198 +1 +1199 +1 +1200 +1 +1201 +1 +1202 +1 +1203 +1 +1204 +1 +1205 +1 +1709 +1 +1224 +1 +1225 +1 +1226 +1 +1227 +1 +1228 +1 +1229 +1 +1230 +1 +1231 +1 +1232 +1 +1287 +1 +1288 +1 +1289 +1 +1290 +1 +1291 +1 +1292 +1 +1293 +1 +1294 +1 +1295 +1 +288 +1 +289 +1 +290 +1 +291 +1 +292 +1 +293 +1 +294 +1 +295 +1 +296 +1 +297 +1 +298 +1 +299 +1 +300 +1 +301 +1 +302 +1 +303 +1 +304 +1 +305 +1 +1422 +1 +1423 +1 +1424 +1 +1425 +1 +1426 +1 +1427 +1 +1428 +1 +1429 +1 +1430 +1 +432 +1 +433 +1 +434 +1 +435 +1 +436 +1 +437 +1 +438 +1 +439 +1 +440 +1 +441 +1 +442 +1 +443 +1 +444 +1 +445 +1 +446 +1 +447 +1 +448 +1 +449 +1 +504 +1 +505 +1 +506 +1 +507 +1 +508 +1 +509 +1 +510 +1 +511 +1 +1134 +2 +1135 +2 +1136 +2 +1137 +2 +1138 +2 +1139 +2 +1140 +2 +1141 +2 +1142 +2 +1143 +2 +1144 +2 +1145 +2 +1146 +2 +1147 +2 +1148 +2 +1149 +2 +1150 +2 +1151 +2 +1152 +2 +1153 +2 +1154 +2 +1155 +2 +1156 +2 +1157 +2 +1158 +2 +1159 +2 +1160 +2 +1161 +2 +1162 +2 +1163 +2 +1164 +2 +1165 +2 +1166 +2 +1167 +2 +1168 +2 +1169 +2 +1170 +2 +1171 +2 +1172 +2 +1173 +2 +1174 +2 +1175 +2 +1176 +2 +1177 +2 +1178 +2 +1179 +2 +1180 +2 +1181 +2 +1182 +2 +1183 +2 +1184 +2 +1185 +2 +1186 +2 +1187 +2 +1188 +2 +1189 +2 +1190 +2 +1191 +2 +1192 +2 +1193 +2 +1194 +2 +1195 +2 +1196 +2 +1197 +2 +1198 +2 +1199 +2 +1200 +2 +1201 +2 +1202 +2 +1203 +2 +1204 +2 +1205 +2 +1206 +2 +1207 +2 +1208 +2 +1209 +2 +1210 +2 +1211 +2 +1212 +2 +1213 +2 +1214 +2 +1215 +2 +1216 +2 +1217 +2 +1218 +2 +1219 +2 +1220 +2 +1221 +2 +1222 +2 +1223 +2 +1224 +2 +1225 +2 +1226 +2 +1227 +2 +1228 +2 +1229 +2 +1230 +2 +1231 +2 +1232 +2 +1233 +2 +1234 +2 +1235 +2 +1236 +2 +1237 +2 +1238 +2 +1239 +2 +1240 +2 +1241 +2 +1242 +2 +1243 +2 +1244 +2 +1245 +2 +1246 +2 +1247 +2 +1248 +2 +1249 +2 +1250 +2 +1251 +2 +1252 +2 +1253 +2 +1254 +2 +1255 +2 +1256 +2 +1257 +2 +1258 +2 +1259 +2 +1260 +2 +1261 +2 +1262 +2 +1263 +2 +1264 +2 +1265 +2 +1266 +2 +1267 +2 +1268 +2 +1269 +2 +1270 +2 +1271 +2 +1272 +2 +1273 +2 +1274 +2 +1275 +2 +1276 +2 +1277 +2 +1278 +2 +1279 +2 +1280 +2 +1281 +2 +1282 +2 +1283 +2 +1284 +2 +1285 +2 +1286 +2 +1287 +2 +1288 +2 +1289 +2 +1290 +2 +1291 +2 +1292 +2 +1293 +2 +1294 +2 +1295 +2 +1296 +2 +1297 +2 +1298 +2 +1299 +2 +1300 +2 +1301 +2 +1302 +2 +1303 +2 +1304 +2 +1305 +2 +1306 +2 +1307 +2 +1308 +2 +1309 +2 +1310 +2 +1311 +2 +1312 +2 +1313 +2 +1314 +2 +1315 +2 +1316 +2 +1317 +2 +1318 +2 +1319 +2 +1320 +2 +1321 +2 +1322 +2 +1323 +2 +1324 +2 +1325 +2 +1326 +2 +1327 +2 +1328 +2 +1329 +2 +1330 +2 +1331 +2 +1332 +2 +1333 +2 +1334 +2 +1335 +2 +1336 +2 +1337 +2 +1338 +2 +1339 +2 +1340 +2 +1341 +2 +1342 +2 +1343 +2 +1344 +2 +1345 +2 +1346 +2 +1347 +2 +1348 +2 +1349 +2 +1350 +2 +1351 +2 +1352 +2 +1353 +2 +1354 +2 +1355 +2 +1356 +2 +1357 +2 +1358 +2 +1359 +2 +1360 +2 +1361 +2 +1362 +2 +1363 +2 +1364 +2 +1365 +2 +1366 +2 +1367 +2 +1368 +2 +1369 +2 +1370 +2 +1371 +2 +1372 +2 +1373 +2 +1374 +2 +1375 +2 +1376 +2 +1377 +2 +1378 +2 +1379 +2 +1380 +2 +1381 +2 +1382 +2 +1383 +2 +1384 +2 +1385 +2 +1386 +2 +1387 +2 +1388 +2 +1389 +2 +1390 +2 +1391 +2 +1392 +2 +1393 +2 +1394 +2 +1395 +2 +1396 +2 +1397 +2 +1398 +2 +1399 +2 +1400 +2 +1401 +2 +1402 +2 +1403 +2 +1404 +2 +1405 +2 +1406 +2 +1407 +2 +1408 +2 +1409 +2 +1410 +2 +1411 +2 +1412 +2 +1413 +2 +1414 +2 +1415 +2 +1416 +2 +1417 +2 +1418 +2 +1419 +2 +1420 +2 +1421 +2 +1422 +2 +1423 +2 +1424 +2 +1425 +2 +1426 +2 +1427 +2 +1428 +2 +1429 +2 +1430 +2 +1431 +2 +1432 +2 +1433 +2 +1434 +2 +1435 +2 +1436 +2 +1437 +2 +1438 +2 +1439 +2 +1440 +2 +1441 +2 +1442 +2 +1443 +2 +1444 +2 +1445 +2 +1446 +2 +1447 +2 +1448 +2 +1449 +2 +1450 +2 +1451 +2 +1452 +2 +1453 +2 +1454 +2 +1455 +2 +1456 +2 +1457 +2 +1458 +2 +1459 +2 +1460 +2 +1461 +2 +1462 +2 +1463 +2 +1464 +2 +1465 +2 +1466 +2 +1467 +2 +1468 +2 +1469 +2 +1470 +2 +1471 +2 +1472 +2 +1473 +2 +1474 +2 +1475 +2 +1476 +2 +1477 +2 +1478 +2 +1479 +2 +1480 +2 +1481 +2 +1482 +2 +1483 +2 +1484 +2 +1485 +2 +1486 +2 +1487 +2 +1488 +2 +1489 +2 +1490 +2 +1491 +2 +1492 +2 +1493 +2 +1494 +2 +1495 +2 +1496 +2 +1497 +2 +1498 +2 +1499 +2 +1500 +2 +1501 +2 +1502 +2 +1503 +2 +1504 +2 +1505 +2 +1506 +2 +1507 +2 +1508 +2 +1509 +2 +1510 +2 +1511 +2 +1512 +2 +1513 +2 +1514 +2 +1515 +2 +1516 +2 +1517 +2 +1518 +2 +1519 +2 +1520 +2 +1521 +2 +1522 +2 +1523 +2 +1524 +2 +1525 +2 +1526 +2 +1527 +2 +1528 +2 +1529 +2 +1530 +2 +1531 +2 +1532 +2 +1533 +2 +1534 +2 +1535 +2 +1536 +2 +1537 +2 +1538 +2 +1539 +2 +1540 +2 +1541 +2 +1542 +2 +1543 +2 +1544 +2 +1545 +2 +1546 +2 +1547 +2 +1548 +2 +1549 +2 +1550 +2 +1551 +2 +1552 +2 +1553 +2 +1554 +2 +1555 +2 +1556 +2 +1557 +2 +1558 +2 +1559 +2 +1560 +2 +1561 +2 +1562 +2 +1563 +2 +1564 +2 +1565 +2 +1566 +2 +1567 +2 +1568 +2 +1569 +2 +1570 +2 +1571 +2 +1572 +2 +1573 +2 +1574 +2 +1575 +2 +1576 +2 +1577 +2 +1578 +2 +1579 +2 +1580 +2 +1581 +2 +1582 +2 +1583 +2 +1584 +2 +1585 +2 +1586 +2 +1587 +2 +1588 +2 +1589 +2 +1590 +2 +1591 +2 +1592 +2 +1593 +2 +1594 +2 +1595 +2 +1596 +2 +1597 +2 +1598 +2 +1599 +2 +1600 +2 +1601 +2 +1602 +2 +1603 +2 +1604 +2 +1605 +2 +1606 +2 +1607 +2 +1608 +2 +1609 +2 +1610 +2 +1611 +2 +1612 +2 +1613 +2 +1614 +2 +1615 +2 +1616 +2 +1617 +2 +1618 +2 +1619 +2 +1620 +2 +1621 +2 +1622 +2 +1623 +2 +1624 +2 +1625 +2 +1626 +2 +1627 +2 +1628 +2 +1629 +2 +1630 +2 +1631 +2 +1632 +2 +1633 +2 +1634 +2 +1635 +2 +1636 +2 +1637 +2 +1638 +2 +1639 +2 +1640 +2 +1641 +2 +1642 +2 +1643 +2 +1644 +2 +1645 +2 +1646 +2 +1647 +2 +1648 +2 +1649 +2 +1650 +2 +1651 +2 +1652 +2 +1653 +2 +1654 +2 +1655 +2 +1656 +2 +1657 +2 +1658 +2 +1659 +2 +1660 +2 +1661 +2 +1662 +2 +1663 +2 +1664 +2 +1665 +2 +1666 +2 +1667 +2 +1668 +2 +1669 +2 +1670 +2 +1671 +2 +1672 +2 +1673 +2 +1674 +2 +1675 +2 +1676 +2 +1677 +2 +1678 +2 +1679 +2 +1680 +2 +1681 +2 +1682 +2 +1683 +2 +1684 +2 +1685 +2 +1686 +2 +1687 +2 +1688 +2 +1689 +2 +1690 +2 +1691 +2 +1692 +2 +1693 +2 +1694 +2 +1695 +2 +1696 +2 +1697 +2 +1698 +2 +1699 +2 +1700 +2 +0 +2 +1 +2 +2 +2 +3 +2 +4 +2 +5 +2 +6 +2 +7 +2 +8 +2 +1071 +2 +1072 +2 +1073 +2 +1074 +2 +1075 +2 +1076 +2 +1077 +2 +1078 +2 +1079 +2 +1080 +2 +1081 +2 +1082 +2 +1083 +2 +1084 +2 +1085 +2 +1086 +2 +1087 +2 +1088 +2 +576 +2 +577 +2 +578 +2 +579 +2 +580 +2 +581 +2 +582 +2 +583 +2 +584 +2 +1107 +2 +1108 +2 +1109 +2 +1110 +2 +1111 +2 +1112 +2 +1113 +2 +1114 +2 +1115 +2 +1710 +2 +1711 +2 +1712 +2 +1713 +2 +1714 +2 +1715 +2 +1716 +2 +1717 +2 +1718 +2 +1719 +2 +1720 +2 +1721 +2 +1722 +2 +1723 +2 +1724 +2 +1725 +2 +1726 +2 +1727 +2 +1728 +2 +1729 +2 +1730 +2 +1731 +2 +1732 +2 +1733 +2 +1734 +2 +1735 +2 +1736 +2 +1737 +2 +1738 +2 +1739 +2 +1740 +2 +1741 +2 +1742 +2 +1743 +2 +1744 +2 +1745 +2 +1764 +2 +1765 +2 +1766 +2 +1767 +2 +1768 +2 +1769 +2 +1770 +2 +1771 +2 +1772 +2 +1791 +2 +1792 +2 +1793 +2 +1794 +2 +1795 +2 +1796 +2 +1797 +2 +1798 +2 +1799 +2 +1854 +2 +1855 +2 +1856 +2 +1857 +2 +1858 +2 +1859 +2 +1860 +2 +1861 +2 +1862 +2 +855 +2 +856 +2 +857 +2 +858 +2 +859 +2 +860 +2 +861 +2 +862 +2 +863 +2 +864 +2 +865 +2 +866 +2 +867 +2 +868 +2 +869 +2 +870 +2 +871 +2 +872 +2 +1989 +2 +1990 +2 +1991 +2 +1992 +2 +1993 +2 +1994 +2 +1995 +2 +1996 +2 +1997 +2 +999 +2 +1000 +2 +1001 +2 +1002 +2 +1003 +2 +1004 +2 +1005 +2 +1006 +2 +1007 +2 +1008 +2 +1009 +2 +1010 +2 +1011 +2 +1012 +2 +1013 +2 +1014 +2 +1015 +2 +1016 +2 +1701 +3 +1702 +3 +1703 +3 +1704 +3 +1705 +3 +1706 +3 +1707 +3 +1708 +3 +1709 +3 +1710 +3 +1711 +3 +1712 +3 +1713 +3 +1714 +3 +1715 +3 +1716 +3 +1717 +3 +1718 +3 +1719 +3 +1720 +3 +1721 +3 +1722 +3 +1723 +3 +1724 +3 +1725 +3 +1726 +3 +1727 +3 +1728 +3 +1729 +3 +1730 +3 +1731 +3 +1732 +3 +1733 +3 +1734 +3 +1735 +3 +1736 +3 +1737 +3 +1738 +3 +1739 +3 +1740 +3 +1741 +3 +1742 +3 +1743 +3 +1744 +3 +1745 +3 +1746 +3 +1747 +3 +1748 +3 +1749 +3 +1750 +3 +1751 +3 +1752 +3 +1753 +3 +1754 +3 +1755 +3 +1756 +3 +1757 +3 +1758 +3 +1759 +3 +1760 +3 +1761 +3 +1762 +3 +1763 +3 +1764 +3 +1765 +3 +1766 +3 +1767 +3 +1768 +3 +1769 +3 +1770 +3 +1771 +3 +1772 +3 +1773 +3 +1774 +3 +1775 +3 +1776 +3 +1777 +3 +1778 +3 +1779 +3 +1780 +3 +1781 +3 +1782 +3 +1783 +3 +1784 +3 +1785 +3 +1786 +3 +1787 +3 +1788 +3 +1789 +3 +1790 +3 +1791 +3 +1792 +3 +1793 +3 +1794 +3 +1795 +3 +1796 +3 +1797 +3 +1798 +3 +1799 +3 +1800 +3 +1801 +3 +1802 +3 +1803 +3 +1804 +3 +1805 +3 +1806 +3 +1807 +3 +1808 +3 +1809 +3 +1810 +3 +1811 +3 +1812 +3 +1813 +3 +1814 +3 +1815 +3 +1816 +3 +1817 +3 +1818 +3 +1819 +3 +1820 +3 +1821 +3 +1822 +3 +1823 +3 +1824 +3 +1825 +3 +1826 +3 +1827 +3 +1828 +3 +1829 +3 +1830 +3 +1831 +3 +1832 +3 +1833 +3 +1834 +3 +1835 +3 +1836 +3 +1837 +3 +1838 +3 +1839 +3 +1840 +3 +1841 +3 +1842 +3 +1843 +3 +1844 +3 +1845 +3 +1846 +3 +1847 +3 +1848 +3 +1849 +3 +1850 +3 +1851 +3 +1852 +3 +1853 +3 +1854 +3 +1855 +3 +1856 +3 +1857 +3 +1858 +3 +1859 +3 +1860 +3 +1861 +3 +1862 +3 +1863 +3 +1864 +3 +1865 +3 +1866 +3 +1867 +3 +1868 +3 +1869 +3 +1870 +3 +1871 +3 +1872 +3 +1873 +3 +1874 +3 +1875 +3 +1876 +3 +1877 +3 +1878 +3 +1879 +3 +1880 +3 +1881 +3 +1882 +3 +1883 +3 +1884 +3 +1885 +3 +1886 +3 +1887 +3 +1888 +3 +1889 +3 +1890 +3 +1891 +3 +1892 +3 +1893 +3 +1894 +3 +1895 +3 +1896 +3 +1897 +3 +1898 +3 +1899 +3 +1900 +3 +1901 +3 +1902 +3 +1903 +3 +1904 +3 +1905 +3 +1906 +3 +1907 +3 +1908 +3 +1909 +3 +1910 +3 +1911 +3 +1912 +3 +1913 +3 +1914 +3 +1915 +3 +1916 +3 +1917 +3 +1918 +3 +1919 +3 +1920 +3 +1921 +3 +1922 +3 +1923 +3 +1924 +3 +1925 +3 +1926 +3 +1927 +3 +1928 +3 +1929 +3 +1930 +3 +1931 +3 +1932 +3 +1933 +3 +1934 +3 +1935 +3 +1936 +3 +1937 +3 +1938 +3 +1939 +3 +1940 +3 +1941 +3 +1942 +3 +1943 +3 +1944 +3 +1945 +3 +1946 +3 +1947 +3 +1948 +3 +1949 +3 +1950 +3 +1951 +3 +1952 +3 +1953 +3 +1954 +3 +1955 +3 +1956 +3 +1957 +3 +1958 +3 +1959 +3 +1960 +3 +1961 +3 +1962 +3 +1963 +3 +1964 +3 +1965 +3 +1966 +3 +1967 +3 +1968 +3 +1969 +3 +1970 +3 +1971 +3 +1972 +3 +1973 +3 +1974 +3 +1975 +3 +1976 +3 +1977 +3 +1978 +3 +1979 +3 +1980 +3 +1981 +3 +1982 +3 +1983 +3 +1984 +3 +1985 +3 +1986 +3 +1987 +3 +1988 +3 +1989 +3 +1990 +3 +1991 +3 +1992 +3 +1993 +3 +1994 +3 +1995 +3 +1996 +3 +1997 +3 +1998 +3 +1999 +3 +2000 +3 +2001 +3 +2002 +3 +2003 +3 +2004 +3 +2005 +3 +2006 +3 +2007 +3 +2008 +3 +2009 +3 +2010 +3 +2011 +3 +2012 +3 +2013 +3 +2014 +3 +2015 +3 +2016 +3 +2017 +3 +2018 +3 +2019 +3 +2020 +3 +2021 +3 +2022 +3 +2023 +3 +2024 +3 +2025 +3 +2026 +3 +2027 +3 +2028 +3 +2029 +3 +2030 +3 +2031 +3 +2032 +3 +2033 +3 +2034 +3 +2035 +3 +2036 +3 +2037 +3 +2038 +3 +2039 +3 +2040 +3 +2041 +3 +2042 +3 +2043 +3 +2044 +3 +2045 +3 +2046 +3 +2047 +3 +2048 +3 +2049 +3 +2050 +3 +2051 +3 +2052 +3 +2053 +3 +2054 +3 +2055 +3 +2056 +3 +2057 +3 +2058 +3 +2059 +3 +2060 +3 +2061 +3 +2062 +3 +2063 +3 +2064 +3 +2065 +3 +2066 +3 +2067 +3 +2068 +3 +2069 +3 +2070 +3 +2071 +3 +2072 +3 +2073 +3 +2074 +3 +2075 +3 +2076 +3 +2077 +3 +2078 +3 +2079 +3 +2080 +3 +2081 +3 +2082 +3 +2083 +3 +2084 +3 +2085 +3 +2086 +3 +2087 +3 +2088 +3 +2089 +3 +2090 +3 +2091 +3 +2092 +3 +2093 +3 +2094 +3 +2095 +3 +2096 +3 +2097 +3 +2098 +3 +2099 +3 +2100 +3 +2101 +3 +2102 +3 +2103 +3 +2104 +3 +2105 +3 +2106 +3 +2107 +3 +2108 +3 +2109 +3 +2110 +3 +2111 +3 +2112 +3 +2113 +3 +2114 +3 +2115 +3 +2116 +3 +2117 +3 +2118 +3 +2119 +3 +2120 +3 +2121 +3 +2122 +3 +2123 +3 +2124 +3 +2125 +3 +2126 +3 +2127 +3 +2128 +3 +2129 +3 +2130 +3 +2131 +3 +2132 +3 +2133 +3 +2134 +3 +2135 +3 +2136 +3 +2137 +3 +2138 +3 +2139 +3 +2140 +3 +2141 +3 +2142 +3 +2143 +3 +2144 +3 +2145 +3 +2146 +3 +2147 +3 +2148 +3 +2149 +3 +2150 +3 +2151 +3 +2152 +3 +2153 +3 +2154 +3 +2155 +3 +2156 +3 +2157 +3 +2158 +3 +2159 +3 +2160 +3 +2161 +3 +2162 +3 +2163 +3 +2164 +3 +2165 +3 +2166 +3 +2167 +3 +2168 +3 +2169 +3 +2170 +3 +2171 +3 +2172 +3 +2173 +3 +2174 +3 +2175 +3 +2176 +3 +2177 +3 +2178 +3 +2179 +3 +2180 +3 +2181 +3 +2182 +3 +2183 +3 +2184 +3 +2185 +3 +2186 +3 +2187 +3 +2188 +3 +2189 +3 +2190 +3 +2191 +3 +2192 +3 +2193 +3 +2194 +3 +2195 +3 +2196 +3 +2197 +3 +2198 +3 +2199 +3 +2200 +3 +2201 +3 +2202 +3 +2203 +3 +2204 +3 +2205 +3 +2206 +3 +2207 +3 +2208 +3 +2209 +3 +2210 +3 +2211 +3 +2212 +3 +2213 +3 +2214 +3 +2215 +3 +2216 +3 +2217 +3 +2218 +3 +2219 +3 +2220 +3 +2221 +3 +2222 +3 +2223 +3 +2224 +3 +2225 +3 +2226 +3 +2227 +3 +2228 +3 +2229 +3 +2230 +3 +2231 +3 +2232 +3 +2233 +3 +2234 +3 +2235 +3 +2236 +3 +2237 +3 +2238 +3 +2239 +3 +2240 +3 +2241 +3 +2242 +3 +2243 +3 +2244 +3 +2245 +3 +2246 +3 +2247 +3 +2248 +3 +2249 +3 +2250 +3 +2251 +3 +2252 +3 +2253 +3 +2254 +3 +2255 +3 +2256 +3 +2257 +3 +2258 +3 +2259 +3 +2260 +3 +2261 +3 +2262 +3 +2263 +3 +2264 +3 +2265 +3 +2266 +3 +2267 +3 +0 +3 +1 +3 +2 +3 +3 +3 +4 +3 +5 +3 +6 +3 +7 +3 +8 +3 +1566 +3 +1567 +3 +1568 +3 +1569 +3 +1570 +3 +1571 +3 +1572 +3 +1573 +3 +1574 +3 +1575 +3 +1576 +3 +1577 +3 +1578 +3 +1579 +3 +1580 +3 +1581 +3 +1582 +3 +1583 +3 +567 +3 +568 +3 +569 +3 +570 +3 +571 +3 +572 +3 +573 +3 +574 +3 +575 +3 +1638 +3 +1639 +3 +1640 +3 +1641 +3 +1642 +3 +1643 +3 +1644 +3 +1645 +3 +1646 +3 +1647 +3 +1648 +3 +1649 +3 +1650 +3 +1651 +3 +1652 +3 +1653 +3 +1654 +3 +1143 +3 +1655 +3 +1145 +3 +1146 +3 +1147 +3 +1148 +3 +1144 +3 +1150 +3 +1149 +3 +1151 +3 +1674 +3 +1675 +3 +1676 +3 +1677 +3 +1678 +3 +1679 +3 +1680 +3 +1681 +3 +1682 +3 +1422 +3 +1423 +3 +1424 +3 +1425 +3 +1426 +3 +1427 +3 +1428 +3 +1429 +3 +1430 +3 +1431 +3 +1432 +3 +1433 +3 +1434 +3 +1435 +3 +1436 +3 +1437 +3 +1438 +3 +1439 +3 diff --git a/packages/muelu/research/caglusa/hierarchical.xml b/packages/muelu/research/caglusa/hierarchical.xml new file mode 100644 index 000000000000..586ab5345428 --- /dev/null +++ b/packages/muelu/research/caglusa/hierarchical.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/muelu/research/caglusa/kernelApproximations.mtx b/packages/muelu/research/caglusa/kernelApproximations.mtx new file mode 100644 index 000000000000..f01b528b3f3b --- /dev/null +++ b/packages/muelu/research/caglusa/kernelApproximations.mtx @@ -0,0 +1,27705 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 27702 +1 1135 -1.700798369737711e+00 +1 1136 -1.580146520641762e+00 +1 1137 -1.383797447945426e+00 +1 1138 -1.169434425459564e+00 +1 1139 -9.781971935804883e-01 +1 1140 -8.280348874333169e-01 +1 1141 -7.213705036951628e-01 +1 1142 -6.542581359308065e-01 +1 1143 -6.220727691019352e-01 +1 1702 -6.162005167844603e-01 +1 1703 -5.865809664013769e-01 +1 1704 -5.360760519950343e-01 +1 1705 -4.771748485999386e-01 +1 1706 -4.206467334735816e-01 +1 1707 -3.730673665120094e-01 +1 1708 -3.372297028644913e-01 +1 1709 -3.136745651272539e-01 +1 1710 -3.020723387778803e-01 +2 1135 -1.834202782095809e+00 +2 1136 -1.700304287691523e+00 +2 1137 -1.483315279803830e+00 +2 1138 -1.247806914653008e+00 +2 1139 -1.039040084931998e+00 +2 1140 -8.760831322739783e-01 +2 1141 -7.608976907202907e-01 +2 1142 -6.886845676773539e-01 +2 1143 -6.541284293696698e-01 +2 1702 -6.478290624440273e-01 +2 1703 -6.160812483634749e-01 +2 1704 -5.620506436757026e-01 +2 1705 -4.992100478166410e-01 +2 1706 -4.390870812134406e-01 +2 1707 -3.886330314655431e-01 +2 1708 -3.507275275451662e-01 +2 1709 -3.258614897260794e-01 +2 1710 -3.136282204841275e-01 +3 1135 -2.127632926075190e+00 +3 1136 -1.963336279373048e+00 +3 1137 -1.699376260738821e+00 +3 1138 -1.416301185435251e+00 +3 1139 -1.168592602973062e+00 +3 1140 -9.775415521883353e-01 +3 1141 -8.438248644838543e-01 +3 1142 -7.605965803633626e-01 +3 1143 -7.209424339906940e-01 +3 1702 -7.137261578095764e-01 +3 1703 -6.774167410319347e-01 +3 1704 -6.158571844841060e-01 +3 1705 -5.446485853551305e-01 +3 1706 -4.769348167824555e-01 +3 1707 -4.204455407347000e-01 +3 1708 -3.782201346679643e-01 +3 1709 -3.506257015251436e-01 +3 1710 -3.370820519210149e-01 +4 1135 -2.637907455781169e+00 +4 1136 -2.417005841266988e+00 +4 1137 -2.066818321041631e+00 +4 1138 -1.698127054340231e+00 +4 1139 -1.381795971117338e+00 +4 1140 -1.142196099558672e+00 +4 1141 -9.769654991054337e-01 +4 1142 -8.752224916572976e-01 +4 1143 -8.270594513937112e-01 +4 1702 -8.183170326055945e-01 +4 1703 -7.744349425866087e-01 +4 1704 -7.004522660564482e-01 +4 1705 -6.155554843954473e-01 +4 1706 -5.355452838374449e-01 +4 1707 -4.693709761542122e-01 +4 1708 -4.202687261188718e-01 +4 1709 -3.883571662753673e-01 +4 1710 -3.727478224907735e-01 +5 1135 -3.453060562076191e+00 +5 1136 -3.133183425269243e+00 +5 1137 -2.635278801261590e+00 +5 1138 -2.123978477656216e+00 +5 1139 -1.696708070875342e+00 +5 1140 -1.380732659198229e+00 +5 1141 -1.167012788191864e+00 +5 1142 -1.037234953557933e+00 +5 1143 -9.763110130362493e-01 +5 1702 -9.652884463905012e-01 +5 1703 -9.101324942258833e-01 +5 1704 -8.178063234380492e-01 +5 1705 -7.129338469046965e-01 +5 1706 -6.152126550891496e-01 +5 1707 -5.352631678456060e-01 +5 1708 -4.764841616901885e-01 +5 1709 -4.385463909860715e-01 +5 1710 -4.200677864283204e-01 +6 1135 -4.669631336599156e+00 +6 1136 -4.185658502884530e+00 +6 1137 -3.449228596936940e+00 +6 1138 -2.715757595785386e+00 +6 1139 -2.122037567431335e+00 +6 1140 -1.695290746872716e+00 +6 1141 -1.413135187769625e+00 +6 1142 -1.244555158183441e+00 +6 1143 -1.166173404860229e+00 +6 1702 -1.152045612945678e+00 +6 1703 -1.081601773927926e+00 +6 1704 -9.646448843535066e-01 +6 1705 -8.333228824564292e-01 +6 1706 -7.125127689213320e-01 +6 1707 -6.148700930342391e-01 +6 1708 -5.438174501422909e-01 +6 1709 -4.983077465792363e-01 +6 1710 -4.762446160907916e-01 +7 1135 -6.299099162391054e+00 +7 1136 -5.570087003404034e+00 +7 1137 -4.488193608069785e+00 +7 1138 -3.445863741183363e+00 +7 1139 -2.630348460087113e+00 +7 1140 -2.061445467603243e+00 +7 1141 -1.694045742383499e+00 +7 1142 -1.478144899756304e+00 +7 1143 -1.378737383755040e+00 +7 1702 -1.360887952118583e+00 +7 1703 -1.272204792965373e+00 +7 1704 -1.126168560851712e+00 +7 1705 -9.640794416705641e-01 +7 1706 -8.168477108343095e-01 +7 1707 -6.992703419664850e-01 +7 1708 -6.145690696500914e-01 +7 1709 -5.607207329882316e-01 +7 1710 -5.347335258930616e-01 +8 1135 -8.071325480070072e+00 +8 1136 -7.048685880176444e+00 +8 1137 -5.565201275718212e+00 +8 1138 -4.177976612941944e+00 +8 1139 -3.124724590079223e+00 +8 1140 -2.408804959610721e+00 +8 1141 -1.955682739591197e+00 +8 1142 -1.693122493671797e+00 +8 1143 -1.573221355670595e+00 +8 1702 -1.551760741373023e+00 +8 1703 -1.445453388306640e+00 +8 1704 -1.271586461572002e+00 +8 1705 -1.080445857413130e+00 +8 1706 -9.086328186273338e-01 +8 1707 -7.727668187490034e-01 +8 1708 -6.756897927034838e-01 +8 1709 -6.143457752911261e-01 +8 1710 -5.848497573061521e-01 +9 1135 -9.309030792769882e+00 +9 1136 -8.066954975435394e+00 +9 1137 -6.290210553864870e+00 +9 1138 -4.658652176388032e+00 +9 1139 -3.442042950044956e+00 +9 1140 -2.627730342898523e+00 +9 1141 -2.118396562240783e+00 +9 1142 -1.825671816950789e+00 +9 1143 -1.692631530404347e+00 +9 1702 -1.668863110826555e+00 +9 1703 -1.551326188170236e+00 +9 1704 -1.359847093049060e+00 +9 1705 -1.150497018599473e+00 +9 1706 -9.634370076687800e-01 +9 1707 -8.163382848445681e-01 +9 1708 -7.117223427415745e-01 +9 1709 -6.458397702064286e-01 +9 1710 -6.142270091391578e-01 +10 577 -9.668039754076972e+00 +10 578 -8.978399604437477e+00 +10 579 -7.856981062192605e+00 +10 580 -6.634051984848504e+00 +10 581 -5.544382952983630e+00 +10 582 -4.689730427554420e+00 +10 583 -4.083219039039204e+00 +10 584 -3.701870736183997e+00 +10 585 -3.519062446235008e+00 +10 856 -3.497057332908938e+00 +10 857 -3.328117750400732e+00 +10 858 -3.040196551698948e+00 +10 859 -2.704645661687464e+00 +10 860 -2.382869273101415e+00 +10 861 -2.112240302167759e+00 +10 862 -1.908532165158310e+00 +10 863 -1.774707057533898e+00 +10 864 -1.708811004431284e+00 +11 577 -1.042792100350136e+01 +11 578 -9.662412840408463e+00 +11 579 -8.422906634430152e+00 +11 580 -7.079175558726460e+00 +11 581 -5.889520365817942e+00 +11 582 -4.961997359580787e+00 +11 583 -4.307014883097344e+00 +11 584 -3.896677663646664e+00 +11 585 -3.700403018148985e+00 +11 856 -3.676796287632870e+00 +11 857 -3.495702020396280e+00 +11 858 -3.187658132160805e+00 +11 859 -2.829643915278643e+00 +11 860 -2.487389966690326e+00 +11 861 -2.200402130339840e+00 +11 862 -1.984936698198691e+00 +11 863 -1.843662925660271e+00 +11 864 -1.774182659637364e+00 +12 577 -1.209985789967807e+01 +12 578 -1.116018103363464e+01 +12 579 -9.651850100750547e+00 +12 580 -8.036305744509786e+00 +12 581 -6.624494901154130e+00 +12 582 -5.536948315121283e+00 +12 583 -4.776546929488968e+00 +12 584 -4.303606130517534e+00 +12 585 -4.078373790891477e+00 +12 856 -4.051328477707510e+00 +12 857 -3.844178119978570e+00 +12 858 -3.493156855057107e+00 +12 859 -3.087420867912321e+00 +12 860 -2.701923451741463e+00 +12 861 -2.380589337846679e+00 +12 862 -2.140561146000859e+00 +12 863 -1.983784152891550e+00 +12 864 -1.906861127622349e+00 +13 577 -1.500896220047154e+01 +13 578 -1.374474424990905e+01 +13 579 -1.174263755165606e+01 +13 580 -9.637644505224026e+00 +13 581 -7.834242340577331e+00 +13 582 -6.470113803193435e+00 +13 583 -5.530421932699210e+00 +13 584 -4.952250188147252e+00 +13 585 -4.678685082400162e+00 +13 856 -4.645915602732410e+00 +13 857 -4.395497701990171e+00 +13 858 -3.973544706450117e+00 +13 859 -3.489731863548668e+00 +13 860 -3.034174442493727e+00 +13 861 -2.657718397344528e+00 +13 862 -2.378586919341656e+00 +13 863 -2.197278725725720e+00 +13 864 -2.108622801479843e+00 +14 577 -1.965992326532715e+01 +14 578 -1.782768342968988e+01 +14 579 -1.497900117091537e+01 +14 580 -1.205825395701952e+01 +14 581 -9.621526041147485e+00 +14 582 -7.822180859388926e+00 +14 583 -6.606585543239607e+00 +14 584 -5.869065033700025e+00 +14 585 -5.523013483700748e+00 +14 856 -5.481690043876853e+00 +14 857 -5.166832897209201e+00 +14 858 -4.640110726087141e+00 +14 859 -4.042328334364181e+00 +14 860 -3.485842817105866e+00 +14 861 -3.030976950601266e+00 +14 862 -2.696817739646272e+00 +14 863 -2.481265838526340e+00 +14 864 -2.376312717242079e+00 +15 577 -2.660849856174327e+01 +15 578 -2.383331974207469e+01 +15 579 -1.961621021304433e+01 +15 580 -1.542362772574222e+01 +15 581 -1.203619855902307e+01 +15 582 -9.605445292059736e+00 +15 583 -8.000389526637228e+00 +15 584 -7.042303833662651e+00 +15 585 -6.597083793558924e+00 +15 856 -6.544108310365247e+00 +15 857 -6.141828675612725e+00 +15 858 -5.474372801723790e+00 +15 859 -4.725639279727730e+00 +15 860 -4.037550864621233e+00 +15 861 -3.481959835633282e+00 +15 862 -3.078000274328088e+00 +15 863 -2.819419720917045e+00 +15 864 -2.694106551358419e+00 +16 577 -3.592685206197134e+01 +16 578 -3.174152706236970e+01 +16 579 -2.554009355249086e+01 +16 580 -1.957788196141608e+01 +16 581 -1.492291899173448e+01 +16 582 -1.168159105370509e+01 +16 583 -9.591335194548829e+00 +16 584 -8.364241553301335e+00 +16 585 -7.799582931832361e+00 +16 856 -7.732638770567269e+00 +16 857 -7.226008345631073e+00 +16 858 -6.392331439386213e+00 +16 859 -5.467949421894374e+00 +16 860 -4.629228569183997e+00 +16 861 -3.960135753049273e+00 +16 862 -3.478550201190774e+00 +16 863 -3.172582464744437e+00 +16 864 -3.024980383213743e+00 +17 577 -4.607421833807318e+01 +17 578 -4.019662561844805e+01 +17 579 -3.168571433859092e+01 +17 580 -2.374572131423626e+01 +17 581 -1.773138064861567e+01 +17 582 -1.365149884527924e+01 +17 583 -1.107324094707686e+01 +17 584 -9.580881051770410e+00 +17 585 -8.899804490345403e+00 +17 856 -8.819303027900290e+00 +17 857 -8.211796059840133e+00 +17 858 -7.218975176414133e+00 +17 859 -6.128690863981327e+00 +17 860 -5.149801011776296e+00 +17 861 -4.376565368298302e+00 +17 862 -3.824588361404598e+00 +17 863 -3.476022499301393e+00 +17 864 -3.308490055907092e+00 +18 577 -5.316787460965344e+01 +18 578 -4.602415911097979e+01 +18 579 -3.582522742282774e+01 +18 580 -2.648321815661042e+01 +18 581 -1.953442396449330e+01 +18 582 -1.489319805507063e+01 +18 583 -1.199490052317238e+01 +18 584 -1.033104205346347e+01 +18 585 -9.575325019992611e+00 +18 856 -9.486158000817367e+00 +18 857 -8.814355243007814e+00 +18 858 -7.720795651611272e+00 +18 859 -6.526502305649259e+00 +18 860 -5.460657838389004e+00 +18 861 -4.623452853935656e+00 +18 862 -4.028593523449520e+00 +18 863 -3.654234393854455e+00 +18 864 -3.474678585268307e+00 +19 298 -5.522643130536942e+01 +19 299 -5.124333316670127e+01 +19 300 -4.477692267878420e+01 +19 301 -3.774105602429018e+01 +19 302 -3.148718617288097e+01 +19 303 -2.659329425858586e+01 +19 304 -2.312685000863098e+01 +19 305 -2.095031331575352e+01 +19 306 -1.990781288876159e+01 +19 433 -1.991107111565965e+01 +19 434 -1.893955522946071e+01 +19 435 -1.728544380971680e+01 +19 436 -1.536041981565910e+01 +19 437 -1.351735258598665e+01 +19 438 -1.196963380328471e+01 +19 439 -1.080617337674904e+01 +19 440 -1.004260648334986e+01 +19 441 -9.666854708275386e+00 +20 298 -5.958495730566376e+01 +20 299 -5.516192177004281e+01 +20 300 -4.801219971282303e+01 +20 301 -4.027937103023840e+01 +20 302 -3.345047556908959e+01 +20 303 -2.813874702670443e+01 +20 304 -2.439505521678533e+01 +20 305 -2.205300529587110e+01 +20 306 -2.093370219102624e+01 +20 433 -2.093719788835411e+01 +20 434 -1.989560185214644e+01 +20 435 -1.812561732539474e+01 +20 436 -1.607147906097268e+01 +20 437 -1.411095423929573e+01 +20 438 -1.246959003743170e+01 +20 439 -1.123894121450387e+01 +20 440 -1.043286327914096e+01 +20 441 -1.003667205670584e+01 +21 298 -6.918105714127374e+01 +21 299 -6.374726972360534e+01 +21 300 -5.504096863216979e+01 +21 301 -4.573913998629141e+01 +21 302 -3.763217937951340e+01 +21 303 -3.140268868468856e+01 +21 304 -2.705594756469628e+01 +21 305 -2.435644250991363e+01 +21 306 -2.307198262201355e+01 +21 433 -2.307598824675226e+01 +21 434 -2.188410977607283e+01 +21 435 -1.986657463968434e+01 +21 436 -1.753807892477654e+01 +21 437 -1.532947239370201e+01 +21 438 -1.349147409209131e+01 +21 439 -1.212045029813403e+01 +21 440 -1.122588997995913e+01 +21 441 -1.078725511314278e+01 +22 298 -8.589649687269581e+01 +22 299 -7.857675058311507e+01 +22 300 -6.700809257675368e+01 +22 301 -5.487859524413308e+01 +22 302 -4.451750529325304e+01 +22 303 -3.670121207176243e+01 +22 304 -3.132864493944531e+01 +22 305 -2.802824052759152e+01 +22 306 -2.646811396827297e+01 +22 433 -2.647296871472281e+01 +22 434 -2.503139824866494e+01 +22 435 -2.260509745887257e+01 +22 436 -1.982756005143804e+01 +22 437 -1.721692110798160e+01 +22 438 -1.506329283501405e+01 +22 439 -1.346877420701742e+01 +22 440 -1.243419956984991e+01 +22 441 -1.192865494651639e+01 +23 298 -1.126636644081421e+02 +23 299 -1.020365870824703e+02 +23 300 -8.555244891615339e+01 +23 301 -6.870443946573934e+01 +23 302 -5.469476477230946e+01 +23 303 -4.438032924384423e+01 +23 304 -3.742874483001901e+01 +23 305 -3.321830948822916e+01 +23 306 -3.124474216775443e+01 +23 433 -3.125086631899855e+01 +23 434 -2.943714101946019e+01 +23 435 -2.640668072821098e+01 +23 436 -2.297333837373615e+01 +23 437 -1.978332451793855e+01 +23 438 -1.718061587490500e+01 +23 439 -1.527154601379911e+01 +23 440 -1.404151072673463e+01 +23 441 -1.344302577202160e+01 +24 298 -1.527385643115993e+02 +24 299 -1.366071776948801e+02 +24 300 -1.121608460588695e+02 +24 301 -8.794493030534279e+01 +24 302 -6.845270874373485e+01 +24 303 -5.451179525147976e+01 +24 304 -4.533058573402736e+01 +24 305 -3.986034298205158e+01 +24 306 -3.732112672456255e+01 +24 433 -3.732898087506940e+01 +24 434 -3.500990342666080e+01 +24 435 -3.116725487037769e+01 +24 436 -2.686477956635888e+01 +24 437 -2.291897994803823e+01 +24 438 -1.973922702727213e+01 +24 439 -1.743110242959431e+01 +24 440 -1.595544620225204e+01 +24 441 -1.524084888303110e+01 +25 298 -2.066145692548484e+02 +25 299 -1.822270203368904e+02 +25 300 -1.462068441840802e+02 +25 301 -1.117212673918284e+02 +25 302 -8.491105099838946e+01 +25 303 -6.631150465440314e+01 +25 304 -5.435160189645630e+01 +25 305 -4.734463162469855e+01 +25 306 -4.412411921265567e+01 +25 433 -4.413404839473380e+01 +25 434 -4.121117314784707e+01 +25 435 -3.640844585123290e+01 +25 436 -3.109398676867848e+01 +25 437 -2.628272736093493e+01 +25 438 -2.245255029988596e+01 +25 439 -1.970056197777982e+01 +25 440 -1.795438621453205e+01 +25 441 -1.711267378841840e+01 +26 298 -2.654314201109839e+02 +26 299 -2.311062255032451e+02 +26 300 -1.815831901601255e+02 +26 301 -1.356003110667490e+02 +26 302 -1.009332528608720e+02 +26 303 -7.751121321005053e+01 +26 304 -6.275565989096646e+01 +26 305 -5.423312785043374e+01 +26 306 -5.034852406404291e+01 +26 433 -5.036046812896164e+01 +26 434 -4.685337395180393e+01 +26 435 -4.113074346035618e+01 +26 436 -3.485989373031347e+01 +26 437 -2.924296537776258e+01 +26 438 -2.481584434765892e+01 +26 439 -2.166130322083090e+01 +26 440 -1.967193224966084e+01 +26 441 -1.871655367510611e+01 +27 298 -3.066283666510955e+02 +27 299 -2.648508681185572e+02 +27 300 -2.054403037140962e+02 +27 301 -1.512966646837479e+02 +27 302 -1.112243222529277e+02 +27 303 -8.457251187584423e+01 +27 304 -6.798309172560241e+01 +27 305 -5.848062905316222e+01 +27 306 -5.417023645596455e+01 +27 433 -5.418346883337077e+01 +27 434 -5.030377157426124e+01 +27 435 -4.399852269562553e+01 +27 436 -3.712783483139469e+01 +27 437 -3.101096203863813e+01 +27 438 -2.621710498981521e+01 +27 439 -2.281730567555881e+01 +27 440 -2.068067308410458e+01 +27 441 -1.965672242765773e+01 +28 163 -3.185949915155906e+02 +28 164 -2.951078427558438e+02 +28 165 -2.571018386235475e+02 +28 166 -2.159365711771960e+02 +28 167 -1.795263442452015e+02 +28 168 -1.511641185819216e+02 +28 169 -1.311504875731257e+02 +28 170 -1.186189792674009e+02 +28 171 -1.126267924233399e+02 +28 226 -1.141104443336769e+02 +28 227 -1.084315507615241e+02 +28 228 -9.878175936820709e+01 +28 229 -8.758337773570206e+01 +28 230 -7.689597342670373e+01 +28 231 -6.794892048403183e+01 +28 232 -6.124100002381031e+01 +28 233 -5.684745832723304e+01 +28 234 -5.468806044199793e+01 +29 163 -3.439477067470149e+02 +29 164 -3.178454563978018e+02 +29 165 -2.757949833234031e+02 +29 166 -2.305288966853525e+02 +29 167 -1.907570089368379e+02 +29 168 -1.599666339328591e+02 +29 169 -1.383497950453837e+02 +29 170 -1.248646489909731e+02 +29 171 -1.184309147085536e+02 +29 226 -1.200229981926134e+02 +29 227 -1.139323073580841e+02 +29 228 -1.036033843083449e+02 +29 229 -9.165105173433192e+01 +29 230 -8.028060644024262e+01 +29 231 -7.079116927375263e+01 +29 232 -6.369543942071494e+01 +29 233 -5.905716209239919e+01 +29 234 -5.678028304808357e+01 +30 163 -3.998395590460265e+02 +30 164 -3.677195470576132e+02 +30 165 -3.164434563350800e+02 +30 166 -2.619362897572149e+02 +30 167 -2.146875584166403e+02 +30 168 -1.785615937298684e+02 +30 169 -1.534567756335945e+02 +30 170 -1.379118742926998e+02 +30 171 -1.305286077257164e+02 +30 226 -1.323536142708755e+02 +30 227 -1.253792450156107e+02 +30 228 -1.135985712390459e+02 +30 229 -1.000434109112309e+02 +30 230 -8.722984128405791e+01 +30 231 -7.660127951093797e+01 +30 232 -6.869521361333243e+01 +30 233 -6.354751694192804e+01 +30 234 -6.102667800147356e+01 +31 163 -4.974174896700122e+02 +31 164 -4.540381155501299e+02 +31 165 -3.857583326106442e+02 +31 166 -3.145682002862656e+02 +31 167 -2.541172217455341e+02 +31 168 -2.087595425387009e+02 +31 169 -1.777191936617241e+02 +31 170 -1.587111708505125e+02 +31 171 -1.497429456103046e+02 +31 226 -1.519560441708244e+02 +31 227 -1.435117964143268e+02 +31 228 -1.293315992553847e+02 +31 229 -1.131510900876764e+02 +31 230 -9.799758170421848e+01 +31 231 -8.553990741673539e+01 +31 232 -7.634343495921600e+01 +31 233 -7.038956454437437e+01 +31 234 -6.748412844494335e+01 +32 163 -6.541859996822101e+02 +32 164 -5.909830065177898e+02 +32 165 -4.934067681037748e+02 +32 166 -3.943098996958960e+02 +32 167 -3.124545890557372e+02 +32 168 -2.525488844183091e+02 +32 169 -2.123674027242826e+02 +32 170 -1.881134719040971e+02 +32 171 -1.767679971916822e+02 +32 226 -1.795617527855330e+02 +32 227 -1.689233475000208e+02 +32 228 -1.511919511178824e+02 +32 229 -1.311733014639336e+02 +32 230 -1.126452263036225e+02 +32 231 -9.758387849948195e+01 +32 232 -8.657079572203122e+01 +32 233 -7.949137370073241e+01 +32 234 -7.605169906643890e+01 +33 163 -8.899037087533450e+02 +33 164 -7.935375863967956e+02 +33 165 -6.483041962836987e+02 +33 166 -5.054956454877199e+02 +33 167 -3.914111969292455e+02 +33 168 -3.103608066686783e+02 +33 169 -2.572634643085092e+02 +33 170 -2.257453236303342e+02 +33 171 -2.111471637576030e+02 +33 226 -2.147330428340353e+02 +33 227 -2.011096605556943e+02 +33 228 -1.785967361533239e+02 +33 229 -1.534852009567454e+02 +33 230 -1.305512703068963e+02 +33 231 -1.121425230527331e+02 +33 232 -9.882410901895769e+01 +33 233 -9.033009985354941e+01 +33 234 -8.622296374516748e+01 +34 163 -1.208406374254620e+03 +34 164 -1.061994722297375e+03 +34 165 -8.471447143627422e+02 +34 166 -6.431928259089628e+02 +34 167 -4.859906672046191e+02 +34 168 -3.777408836461634e+02 +34 169 -3.085357616669019e+02 +34 170 -2.681540147946965e+02 +34 171 -2.496378310788914e+02 +34 226 -2.541748168062170e+02 +34 227 -2.369779136990108e+02 +34 228 -2.088032783475078e+02 +34 229 -1.777541041873153e+02 +34 230 -1.497704124875112e+02 +34 231 -1.275864513775853e+02 +34 232 -1.117030448392068e+02 +34 233 -1.016508356069023e+02 +34 234 -9.681296068498868e+01 +35 163 -1.557906817650854e+03 +35 164 -1.350888397614685e+03 +35 165 -1.054419678838069e+03 +35 166 -7.817773521818433e+02 +35 167 -5.781801706476442e+02 +35 168 -4.417383595334794e+02 +35 169 -3.563165521884243e+02 +35 170 -3.071908641223830e+02 +35 171 -2.848553057492978e+02 +35 226 -2.903167232403405e+02 +35 227 -2.696559009041458e+02 +35 228 -2.360481226141748e+02 +35 229 -1.993808802203061e+02 +35 230 -1.666924543137945e+02 +35 231 -1.410419241572607e+02 +35 232 -1.228316030691313e+02 +35 233 -1.113784096510094e+02 +35 234 -1.058870860464278e+02 +36 163 -1.803683571360670e+03 +36 164 -1.551001537080487e+03 +36 165 -1.194543106324051e+03 +36 166 -8.730167855570571e+02 +36 167 -6.374486870708147e+02 +36 168 -4.821081368418356e+02 +36 169 -3.860435908762174e+02 +36 170 -3.312631259798876e+02 +36 171 -3.064786026796347e+02 +36 226 -3.125315100891904e+02 +36 227 -2.896586042023723e+02 +36 228 -2.526059824277440e+02 +36 229 -2.124122004253198e+02 +36 230 -1.768026463978692e+02 +36 231 -1.490216460686691e+02 +36 232 -1.293933587470326e+02 +36 233 -1.170917564087816e+02 +36 234 -1.112062130731024e+02 +37 100 -1.875214593207217e+03 +37 101 -1.730857385626374e+03 +37 102 -1.498818743487980e+03 +37 103 -1.249808244053868e+03 +37 104 -1.031749685784701e+03 +37 105 -8.634538376624832e+02 +37 106 -7.455984400515516e+02 +37 107 -6.722130378543866e+02 +37 108 -6.372400495496646e+02 +37 127 -6.626758042696414e+02 +37 128 -6.283883131647560e+02 +37 129 -5.703593861252671e+02 +37 130 -5.034042185411838e+02 +37 131 -4.399152273596404e+02 +37 132 -3.870948761897490e+02 +37 133 -3.477040265152328e+02 +37 134 -3.220071447431197e+02 +37 135 -3.094084671995307e+02 +38 100 -2.026958968234969e+03 +38 101 -1.866265256986404e+03 +38 102 -1.609180300097002e+03 +38 103 -1.335079978604864e+03 +38 104 -1.096720657356302e+03 +38 105 -9.139375695751897e+02 +38 106 -7.866115514805227e+02 +38 107 -7.076334997204448e+02 +38 108 -6.700823581497979e+02 +38 127 -6.973874916391821e+02 +38 128 -6.605872992673299e+02 +38 129 -5.984360133243326e+02 +38 130 -5.269383854919138e+02 +38 131 -4.593685160820336e+02 +38 132 -4.033337719681110e+02 +38 133 -3.616604611210839e+02 +38 134 -3.345306689243866e+02 +38 135 -3.212463524241288e+02 +39 100 -2.362389965973710e+03 +39 101 -2.163980333657909e+03 +39 102 -1.849607080293399e+03 +39 103 -1.518851315266989e+03 +39 104 -1.235277069371932e+03 +39 105 -1.020632735067506e+03 +39 106 -8.726927539431827e+02 +39 107 -7.816327591622450e+02 +39 108 -7.385370745662030e+02 +39 127 -7.698608292520822e+02 +39 128 -7.276611032571822e+02 +39 129 -6.566870545947479e+02 +39 130 -5.755235304740637e+02 +39 131 -4.993258651509061e+02 +39 132 -4.365373227942237e+02 +39 133 -3.900936262054902e+02 +39 134 -3.599808995889908e+02 +39 135 -3.452727498922125e+02 +40 100 -2.950717419015133e+03 +40 101 -2.681342252360432e+03 +40 102 -2.260885088238843e+03 +40 103 -1.827490963045520e+03 +40 104 -1.463890411205563e+03 +40 105 -1.194040505461214e+03 +40 106 -1.010994741688824e+03 +40 107 -8.996143060351790e+02 +40 108 -8.472628048196102e+02 +40 127 -8.852905431068602e+02 +40 128 -8.340887729851524e+02 +40 129 -7.485032169845201e+02 +40 130 -6.514830645843684e+02 +40 131 -5.612806994918460e+02 +40 132 -4.876399321332831e+02 +40 133 -4.335967747934762e+02 +40 134 -3.987626324596288e+02 +40 135 -3.818097302446305e+02 +41 100 -3.902319153506661e+03 +41 101 -3.506975616748959e+03 +41 102 -2.902504030970242e+03 +41 103 -2.296563254192874e+03 +41 104 -1.802788737847520e+03 +41 105 -1.445768636635675e+03 +41 106 -1.208600542781177e+03 +41 107 -1.066424853434982e+03 +41 108 -1.000188949067807e+03 +41 127 -1.048263894006156e+03 +41 128 -9.835822672581361e+02 +41 129 -8.763142550909371e+02 +41 130 -7.560641803472511e+02 +41 131 -6.456351950588639e+02 +41 132 -5.565323391800148e+02 +41 133 -4.917852936655349e+02 +41 134 -4.503577579145714e+02 +41 135 -4.302864947716844e+02 +42 100 -5.345888085958337e+03 +42 101 -4.737549064776493e+03 +42 102 -3.831110691687742e+03 +42 103 -2.953179454461659e+03 +42 104 -2.262580830692423e+03 +42 105 -1.778551457626303e+03 +42 106 -1.464813079544667e+03 +42 107 -1.279970424612407e+03 +42 108 -1.194734163325080e+03 +42 127 -1.256543083877371e+03 +42 128 -1.173454010484044e+03 +42 129 -1.036897582387275e+03 +42 130 -8.857468099070314e+02 +42 131 -7.488639282292589e+02 +42 132 -6.398605511468007e+02 +42 133 -5.615217592749217e+02 +42 134 -5.118054541360788e+02 +42 135 -4.878379044359882e+02 +43 100 -7.317023524682052e+03 +43 101 -6.383196319293265e+03 +43 102 -5.031147086146988e+03 +43 103 -3.769985340508684e+03 +43 104 -2.814832005713082e+03 +43 105 -2.166979037144105e+03 +43 106 -1.757612875198001e+03 +43 107 -1.520677920320649e+03 +43 108 -1.412550957935134e+03 +43 127 -1.490886114306899e+03 +43 128 -1.385671263409127e+03 +43 129 -1.214316039685789e+03 +43 130 -1.027044291768042e+03 +43 131 -8.597858986976537e+02 +43 132 -7.283129281165164e+02 +43 133 -6.348419924070901e+02 +43 134 -5.759928774566611e+02 +43 135 -5.477593218561533e+02 +44 100 -9.503231277515253e+03 +44 101 -8.170194622707234e+03 +44 102 -6.290386615628129e+03 +44 103 -4.595610922291185e+03 +44 104 -3.354508789434319e+03 +44 105 -2.536414197409889e+03 +44 106 -2.030646676802453e+03 +44 107 -1.742294182285274e+03 +44 108 -1.611849440900473e+03 +44 127 -1.706279427316851e+03 +44 128 -1.579537869618796e+03 +44 129 -1.374683878336056e+03 +44 130 -1.153153404034721e+03 +44 131 -9.575481408155945e+02 +44 132 -8.054213782683447e+02 +44 133 -6.982151391788542e+02 +44 134 -6.311526429035280e+02 +44 135 -5.991040264672794e+02 +45 100 -1.105347322826421e+04 +45 101 -9.416691958996571e+03 +45 102 -7.145959681498171e+03 +45 103 -5.140934461915783e+03 +45 104 -3.702122576585435e+03 +45 105 -2.769688470575545e+03 +45 106 -2.200593700681703e+03 +45 107 -1.878975758420800e+03 +45 108 -1.734219384986952e+03 +45 127 -1.838962260127833e+03 +45 128 -1.698437126483816e+03 +45 129 -1.472295946378348e+03 +45 130 -1.229224240033788e+03 +45 131 -1.015998103623359e+03 +45 132 -8.511688414898261e+02 +45 133 -7.355893501902642e+02 +45 134 -6.635521292324264e+02 +45 135 -6.292018074604183e+02 +64 127 -1.733190400658708e+03 +64 128 -1.603684467943636e+03 +64 129 -1.394551574360514e+03 +64 130 -1.168677565678393e+03 +64 131 -9.695072463564453e+02 +64 132 -8.148024630667954e+02 +64 133 -7.058924559832883e+02 +64 134 -6.378158089920685e+02 +64 135 -6.052974323170218e+02 +65 127 -1.877824568765013e+03 +65 128 -1.733190400658708e+03 +65 129 -1.500725861549674e+03 +65 130 -1.251286952144482e+03 +65 131 -1.032880208377978e+03 +65 132 -8.643348602446098e+02 +65 133 -7.463158073460694e+02 +65 134 -6.728335244699305e+02 +65 135 -6.378158089920685e+02 +66 127 -2.199157547087194e+03 +66 128 -2.019368486704434e+03 +66 129 -1.733190400658708e+03 +66 130 -1.430197816180118e+03 +66 131 -1.168677565678393e+03 +66 132 -9.695072463564451e+02 +66 133 -8.315436028021828e+02 +66 134 -7.463158073460691e+02 +66 135 -7.058924559832883e+02 +67 127 -2.767706810094291e+03 +67 128 -2.521021940438006e+03 +67 129 -2.134265778758333e+03 +67 130 -1.733190400658708e+03 +67 131 -1.394551574360514e+03 +67 132 -1.141773184361047e+03 +67 133 -9.695072463564453e+02 +67 134 -8.643348602446098e+02 +67 135 -8.148024630667958e+02 +68 127 -3.699147964795167e+03 +68 128 -3.331754877699592e+03 +68 129 -2.767706810094291e+03 +68 130 -2.199157547087194e+03 +68 131 -1.733190400658708e+03 +68 132 -1.394551574360513e+03 +68 133 -1.168677565678393e+03 +68 134 -1.032880208377977e+03 +68 135 -9.695072463564453e+02 +69 127 -5.136224430633841e+03 +69 128 -4.560278038130803e+03 +69 129 -3.699147964795168e+03 +69 130 -2.861294172280328e+03 +69 131 -2.199157547087194e+03 +69 132 -1.733190400658708e+03 +69 133 -1.430197816180119e+03 +69 134 -1.251286952144482e+03 +69 135 -1.168677565678393e+03 +70 127 -7.138491575686247e+03 +70 128 -6.235592529048596e+03 +70 129 -4.925216936196723e+03 +70 130 -3.699147964795167e+03 +70 131 -2.767706810094291e+03 +70 132 -2.134265778758331e+03 +70 133 -1.733190400658708e+03 +70 134 -1.500725861549673e+03 +70 135 -1.394551574360514e+03 +71 127 -9.405703259334579e+03 +71 128 -8.091232579773138e+03 +71 129 -6.235592529048596e+03 +71 130 -4.560278038130800e+03 +71 131 -3.331754877699592e+03 +71 132 -2.521021940438005e+03 +71 133 -2.019368486704434e+03 +71 134 -1.733190400658708e+03 +71 135 -1.603684467943636e+03 +72 127 -1.103972130715913e+04 +72 128 -9.405703259334579e+03 +72 129 -7.138491575686247e+03 +72 130 -5.136224430633838e+03 +72 131 -3.699147964795167e+03 +72 132 -2.767706810094289e+03 +72 133 -2.199157547087194e+03 +72 134 -1.877824568765012e+03 +72 135 -1.733190400658708e+03 +91 226 -3.063876713483004e+02 +91 227 -2.841326260213859e+02 +91 228 -2.480403651673274e+02 +91 229 -2.088271183655455e+02 +91 230 -1.740274317161708e+02 +91 231 -1.468355065336025e+02 +91 232 -1.275984131219178e+02 +91 233 -1.155304899028561e+02 +91 234 -1.097534196790493e+02 +92 226 -3.311617365195742e+02 +92 227 -3.063876713483004e+02 +92 228 -2.663884709281895e+02 +92 229 -2.231981844606888e+02 +92 230 -1.851243485745372e+02 +92 231 -1.555580782497810e+02 +92 232 -1.347481526436476e+02 +92 233 -1.217424124188380e+02 +92 234 -1.155304899028561e+02 +93 226 -3.859179776157598e+02 +93 227 -3.553280674768354e+02 +93 228 -3.063876713483004e+02 +93 229 -2.542062119667732e+02 +93 230 -2.088271183655455e+02 +93 231 -1.740274317161707e+02 +93 232 -1.497853840269158e+02 +93 233 -1.347481526436476e+02 +93 234 -1.275984131219178e+02 +94 226 -4.819366867771671e+02 +94 227 -4.404031329187425e+02 +94 228 -3.748904053829397e+02 +94 229 -3.063876713483004e+02 +94 230 -2.480403651673274e+02 +94 231 -2.041390437321798e+02 +94 232 -1.740274317161708e+02 +94 233 -1.555580782497811e+02 +94 234 -1.468355065336025e+02 +95 226 -6.371952057562397e+02 +95 227 -5.762343277298875e+02 +95 228 -4.819366867771671e+02 +95 229 -3.859179776157598e+02 +95 230 -3.063876713483004e+02 +95 231 -2.480403651673273e+02 +95 232 -2.088271183655455e+02 +95 233 -1.851243485745372e+02 +95 234 -1.740274317161708e+02 +96 226 -8.726231103602333e+02 +96 227 -7.788097592344265e+02 +96 228 -6.371952057562399e+02 +96 229 -4.976453857371588e+02 +96 230 -3.859179776157599e+02 +96 231 -3.063876713483004e+02 +96 232 -2.542062119667733e+02 +96 233 -2.231981844606889e+02 +96 234 -2.088271183655455e+02 +97 226 -1.193932486839835e+03 +97 227 -1.049909849375152e+03 +97 228 -8.383319685358460e+02 +97 229 -6.371952057562395e+02 +97 230 -4.819366867771669e+02 +97 231 -3.748904053829394e+02 +97 232 -3.063876713483004e+02 +97 233 -2.663884709281895e+02 +97 234 -2.480403651673273e+02 +98 226 -1.550121445008506e+03 +98 227 -1.344510568096307e+03 +98 228 -1.049909849375152e+03 +98 229 -7.788097592344261e+02 +98 230 -5.762343277298875e+02 +98 231 -4.404031329187421e+02 +98 232 -3.553280674768354e+02 +98 233 -3.063876713483004e+02 +98 234 -2.841326260213859e+02 +99 226 -1.802596433195452e+03 +99 227 -1.550121445008506e+03 +99 228 -1.193932486839835e+03 +99 229 -8.726231103602329e+02 +99 230 -6.371952057562397e+02 +99 231 -4.819366867771668e+02 +99 232 -3.859179776157598e+02 +99 233 -3.311617365195742e+02 +99 234 -3.063876713483004e+02 +100 37 -1.875214593207217e+03 +100 38 -2.026958968234969e+03 +100 39 -2.362389965973710e+03 +100 40 -2.950717419015133e+03 +100 41 -3.902319153506661e+03 +100 42 -5.345888085958337e+03 +100 43 -7.317023524682052e+03 +100 44 -9.503231277515253e+03 +100 45 -1.105347322826421e+04 +100 172 -1.733190400658708e+03 +100 173 -1.603684467943635e+03 +100 174 -1.394551574360514e+03 +100 175 -1.168677565678394e+03 +100 176 -9.695072463564453e+02 +100 177 -8.148024630667954e+02 +100 178 -7.058924559832883e+02 +100 179 -6.378158089920688e+02 +100 180 -6.052974323170215e+02 +100 199 -6.289529049931516e+02 +100 200 -5.970589583440832e+02 +100 201 -5.429674662554831e+02 +100 202 -4.803677035258847e+02 +100 203 -4.208084537187719e+02 +100 204 -3.710963518270341e+02 +100 205 -3.339204550667993e+02 +100 206 -3.096178268240471e+02 +100 207 -2.976873911031304e+02 +101 37 -1.730857385626374e+03 +101 38 -1.866265256986404e+03 +101 39 -2.163980333657909e+03 +101 40 -2.681342252360432e+03 +101 41 -3.506975616748959e+03 +101 42 -4.737549064776493e+03 +101 43 -6.383196319293265e+03 +101 44 -8.170194622707234e+03 +101 45 -9.416691958996571e+03 +101 172 -1.877824568765012e+03 +101 173 -1.733190400658707e+03 +101 174 -1.500725861549673e+03 +101 175 -1.251286952144482e+03 +101 176 -1.032880208377977e+03 +101 177 -8.643348602446093e+02 +101 178 -7.463158073460691e+02 +101 179 -6.728335244699306e+02 +101 180 -6.378158089920682e+02 +101 199 -6.632839990295106e+02 +101 200 -6.289529049931510e+02 +101 201 -5.708523475060542e+02 +101 202 -5.038180997021785e+02 +101 203 -4.402579127124382e+02 +101 204 -3.873813675510150e+02 +101 205 -3.479505460244111e+02 +101 206 -3.222285372305480e+02 +101 207 -3.096178268240469e+02 +102 37 -1.498818743487980e+03 +102 38 -1.609180300097002e+03 +102 39 -1.849607080293399e+03 +102 40 -2.260885088238843e+03 +102 41 -2.902504030970242e+03 +102 42 -3.831110691687742e+03 +102 43 -5.031147086146988e+03 +102 44 -6.290386615628129e+03 +102 45 -7.145959681498171e+03 +102 172 -2.199157547087194e+03 +102 173 -2.019368486704433e+03 +102 174 -1.733190400658708e+03 +102 175 -1.430197816180119e+03 +102 176 -1.168677565678393e+03 +102 177 -9.695072463564451e+02 +102 178 -8.315436028021828e+02 +102 179 -7.463158073460694e+02 +102 180 -7.058924559832880e+02 +102 199 -7.352796046183671e+02 +102 200 -6.956816209337395e+02 +102 201 -6.289529049931513e+02 +102 202 -5.524312223207843e+02 +102 203 -4.803677035258846e+02 +102 204 -4.208084537187718e+02 +102 205 -3.766415408901786e+02 +102 206 -3.479505460244112e+02 +102 207 -3.339204550667992e+02 +103 37 -1.249808244053868e+03 +103 38 -1.335079978604864e+03 +103 39 -1.518851315266989e+03 +103 40 -1.827490963045520e+03 +103 41 -2.296563254192874e+03 +103 42 -2.953179454461659e+03 +103 43 -3.769985340508684e+03 +103 44 -4.595610922291185e+03 +103 45 -5.140934461915783e+03 +103 172 -2.767706810094291e+03 +103 173 -2.521021940438005e+03 +103 174 -2.134265778758333e+03 +103 175 -1.733190400658709e+03 +103 176 -1.394551574360514e+03 +103 177 -1.141773184361047e+03 +103 178 -9.695072463564453e+02 +103 179 -8.643348602446100e+02 +103 180 -8.148024630667954e+02 +103 199 -8.507888885505203e+02 +103 200 -8.023274760830685e+02 +103 201 -7.211778000851814e+02 +103 202 -6.289529049931516e+02 +103 203 -5.429674662554831e+02 +103 204 -4.725808574370899e+02 +103 205 -4.208084537187719e+02 +103 206 -3.873813675510153e+02 +103 207 -3.710963518270341e+02 +104 37 -1.031749685784701e+03 +104 38 -1.096720657356302e+03 +104 39 -1.235277069371932e+03 +104 40 -1.463890411205563e+03 +104 41 -1.802788737847520e+03 +104 42 -2.262580830692423e+03 +104 43 -2.814832005713082e+03 +104 44 -3.354508789434319e+03 +104 45 -3.702122576585435e+03 +104 172 -3.699147964795167e+03 +104 173 -3.331754877699590e+03 +104 174 -2.767706810094291e+03 +104 175 -2.199157547087195e+03 +104 176 -1.733190400658708e+03 +104 177 -1.394551574360513e+03 +104 178 -1.168677565678393e+03 +104 179 -1.032880208377978e+03 +104 180 -9.695072463564451e+02 +104 199 -1.015511306612465e+03 +104 200 -9.536070604341742e+02 +104 201 -8.507888885505199e+02 +104 202 -7.352796046183671e+02 +104 203 -6.289529049931513e+02 +104 204 -5.429674662554829e+02 +104 205 -4.803677035258846e+02 +104 206 -4.402579127124384e+02 +104 207 -4.208084537187718e+02 +105 37 -8.634538376624832e+02 +105 38 -9.139375695751897e+02 +105 39 -1.020632735067506e+03 +105 40 -1.194040505461214e+03 +105 41 -1.445768636635675e+03 +105 42 -1.778551457626303e+03 +105 43 -2.166979037144105e+03 +105 44 -2.536414197409889e+03 +105 45 -2.769688470575545e+03 +105 172 -5.136224430633843e+03 +105 173 -4.560278038130800e+03 +105 174 -3.699147964795170e+03 +105 175 -2.861294172280330e+03 +105 176 -2.199157547087195e+03 +105 177 -1.733190400658708e+03 +105 178 -1.430197816180119e+03 +105 179 -1.251286952144483e+03 +105 180 -1.168677565678393e+03 +105 199 -1.228588660544048e+03 +105 200 -1.148042053110077e+03 +105 201 -1.015511306612465e+03 +105 202 -8.685786765383772e+02 +105 203 -7.352796046183671e+02 +105 204 -6.289529049931513e+02 +105 205 -5.524312223207843e+02 +105 206 -5.038180997021786e+02 +105 207 -4.803677035258846e+02 +106 37 -7.455984400515516e+02 +106 38 -7.866115514805227e+02 +106 39 -8.726927539431827e+02 +106 40 -1.010994741688824e+03 +106 41 -1.208600542781177e+03 +106 42 -1.464813079544667e+03 +106 43 -1.757612875198001e+03 +106 44 -2.030646676802453e+03 +106 45 -2.200593700681703e+03 +106 172 -7.138491575686247e+03 +106 173 -6.235592529048589e+03 +106 174 -4.925216936196723e+03 +106 175 -3.699147964795170e+03 +106 176 -2.767706810094291e+03 +106 177 -2.134265778758331e+03 +106 178 -1.733190400658708e+03 +106 179 -1.500725861549674e+03 +106 180 -1.394551574360513e+03 +106 199 -1.471477730866024e+03 +106 200 -1.368148367306962e+03 +106 201 -1.199743197084304e+03 +106 202 -1.015511306612465e+03 +106 203 -8.507888885505199e+02 +106 204 -7.211778000851810e+02 +106 205 -6.289529049931513e+02 +106 206 -5.708523475060545e+02 +106 207 -5.429674662554829e+02 +107 37 -6.722130378543866e+02 +107 38 -7.076334997204448e+02 +107 39 -7.816327591622450e+02 +107 40 -8.996143060351790e+02 +107 41 -1.066424853434982e+03 +107 42 -1.279970424612407e+03 +107 43 -1.520677920320649e+03 +107 44 -1.742294182285274e+03 +107 45 -1.878975758420800e+03 +107 172 -9.405703259334579e+03 +107 173 -8.091232579773130e+03 +107 174 -6.235592529048596e+03 +107 175 -4.560278038130805e+03 +107 176 -3.331754877699592e+03 +107 177 -2.521021940438005e+03 +107 178 -2.019368486704434e+03 +107 179 -1.733190400658709e+03 +107 180 -1.603684467943635e+03 +107 199 -1.697437739078445e+03 +107 200 -1.571600895131402e+03 +107 201 -1.368148367306963e+03 +107 202 -1.148042053110077e+03 +107 203 -9.536070604341747e+02 +107 204 -8.023274760830685e+02 +107 205 -6.956816209337397e+02 +107 206 -6.289529049931516e+02 +107 207 -5.970589583440832e+02 +108 37 -6.372400495496646e+02 +108 38 -6.700823581497979e+02 +108 39 -7.385370745662030e+02 +108 40 -8.472628048196102e+02 +108 41 -1.000188949067807e+03 +108 42 -1.194734163325080e+03 +108 43 -1.412550957935134e+03 +108 44 -1.611849440900473e+03 +108 45 -1.734219384986952e+03 +108 172 -1.103972130715913e+04 +108 173 -9.405703259334568e+03 +108 174 -7.138491575686247e+03 +108 175 -5.136224430633843e+03 +108 176 -3.699147964795167e+03 +108 177 -2.767706810094289e+03 +108 178 -2.199157547087194e+03 +108 179 -1.877824568765014e+03 +108 180 -1.733190400658707e+03 +108 199 -1.837845240586530e+03 +108 200 -1.697437739078443e+03 +108 201 -1.471477730866023e+03 +108 202 -1.228588660544047e+03 +108 203 -1.015511306612465e+03 +108 204 -8.507888885505196e+02 +108 205 -7.352796046183668e+02 +108 206 -6.632839990295106e+02 +108 207 -6.289529049931510e+02 +127 37 -6.626758042696414e+02 +127 38 -6.973874916391821e+02 +127 39 -7.698608292520822e+02 +127 40 -8.852905431068602e+02 +127 41 -1.048263894006156e+03 +127 42 -1.256543083877371e+03 +127 43 -1.490886114306899e+03 +127 44 -1.706279427316851e+03 +127 45 -1.838962260127833e+03 +127 64 -1.733190400658708e+03 +127 65 -1.877824568765013e+03 +127 66 -2.199157547087194e+03 +127 67 -2.767706810094291e+03 +127 68 -3.699147964795167e+03 +127 69 -5.136224430633841e+03 +127 70 -7.138491575686247e+03 +127 71 -9.405703259334579e+03 +127 72 -1.103972130715913e+04 +127 199 -1.733190400658709e+03 +127 200 -1.603684467943635e+03 +127 201 -1.394551574360514e+03 +127 202 -1.168677565678394e+03 +127 203 -9.695072463564453e+02 +127 204 -8.148024630667954e+02 +127 205 -7.058924559832883e+02 +127 206 -6.378158089920688e+02 +127 207 -6.052974323170215e+02 +128 37 -6.283883131647560e+02 +128 38 -6.605872992673299e+02 +128 39 -7.276611032571822e+02 +128 40 -8.340887729851524e+02 +128 41 -9.835822672581361e+02 +128 42 -1.173454010484044e+03 +128 43 -1.385671263409127e+03 +128 44 -1.579537869618796e+03 +128 45 -1.698437126483816e+03 +128 64 -1.603684467943636e+03 +128 65 -1.733190400658708e+03 +128 66 -2.019368486704434e+03 +128 67 -2.521021940438006e+03 +128 68 -3.331754877699592e+03 +128 69 -4.560278038130803e+03 +128 70 -6.235592529048596e+03 +128 71 -8.091232579773138e+03 +128 72 -9.405703259334579e+03 +128 199 -1.877824568765014e+03 +128 200 -1.733190400658707e+03 +128 201 -1.500725861549673e+03 +128 202 -1.251286952144482e+03 +128 203 -1.032880208377977e+03 +128 204 -8.643348602446093e+02 +128 205 -7.463158073460691e+02 +128 206 -6.728335244699306e+02 +128 207 -6.378158089920682e+02 +129 37 -5.703593861252671e+02 +129 38 -5.984360133243326e+02 +129 39 -6.566870545947479e+02 +129 40 -7.485032169845201e+02 +129 41 -8.763142550909371e+02 +129 42 -1.036897582387275e+03 +129 43 -1.214316039685789e+03 +129 44 -1.374683878336056e+03 +129 45 -1.472295946378348e+03 +129 64 -1.394551574360514e+03 +129 65 -1.500725861549674e+03 +129 66 -1.733190400658708e+03 +129 67 -2.134265778758333e+03 +129 68 -2.767706810094291e+03 +129 69 -3.699147964795168e+03 +129 70 -4.925216936196723e+03 +129 71 -6.235592529048596e+03 +129 72 -7.138491575686247e+03 +129 199 -2.199157547087195e+03 +129 200 -2.019368486704433e+03 +129 201 -1.733190400658708e+03 +129 202 -1.430197816180119e+03 +129 203 -1.168677565678393e+03 +129 204 -9.695072463564451e+02 +129 205 -8.315436028021828e+02 +129 206 -7.463158073460694e+02 +129 207 -7.058924559832880e+02 +130 37 -5.034042185411838e+02 +130 38 -5.269383854919138e+02 +130 39 -5.755235304740637e+02 +130 40 -6.514830645843684e+02 +130 41 -7.560641803472511e+02 +130 42 -8.857468099070314e+02 +130 43 -1.027044291768042e+03 +130 44 -1.153153404034721e+03 +130 45 -1.229224240033788e+03 +130 64 -1.168677565678393e+03 +130 65 -1.251286952144482e+03 +130 66 -1.430197816180118e+03 +130 67 -1.733190400658708e+03 +130 68 -2.199157547087194e+03 +130 69 -2.861294172280328e+03 +130 70 -3.699147964795167e+03 +130 71 -4.560278038130800e+03 +130 72 -5.136224430633838e+03 +130 199 -2.767706810094292e+03 +130 200 -2.521021940438005e+03 +130 201 -2.134265778758333e+03 +130 202 -1.733190400658709e+03 +130 203 -1.394551574360514e+03 +130 204 -1.141773184361047e+03 +130 205 -9.695072463564453e+02 +130 206 -8.643348602446100e+02 +130 207 -8.148024630667954e+02 +131 37 -4.399152273596404e+02 +131 38 -4.593685160820336e+02 +131 39 -4.993258651509061e+02 +131 40 -5.612806994918460e+02 +131 41 -6.456351950588639e+02 +131 42 -7.488639282292589e+02 +131 43 -8.597858986976537e+02 +131 44 -9.575481408155945e+02 +131 45 -1.015998103623359e+03 +131 64 -9.695072463564453e+02 +131 65 -1.032880208377978e+03 +131 66 -1.168677565678393e+03 +131 67 -1.394551574360514e+03 +131 68 -1.733190400658708e+03 +131 69 -2.199157547087194e+03 +131 70 -2.767706810094291e+03 +131 71 -3.331754877699592e+03 +131 72 -3.699147964795167e+03 +131 199 -3.699147964795170e+03 +131 200 -3.331754877699590e+03 +131 201 -2.767706810094291e+03 +131 202 -2.199157547087195e+03 +131 203 -1.733190400658708e+03 +131 204 -1.394551574360513e+03 +131 205 -1.168677565678393e+03 +131 206 -1.032880208377978e+03 +131 207 -9.695072463564451e+02 +132 37 -3.870948761897490e+02 +132 38 -4.033337719681110e+02 +132 39 -4.365373227942237e+02 +132 40 -4.876399321332831e+02 +132 41 -5.565323391800148e+02 +132 42 -6.398605511468007e+02 +132 43 -7.283129281165164e+02 +132 44 -8.054213782683447e+02 +132 45 -8.511688414898261e+02 +132 64 -8.148024630667954e+02 +132 65 -8.643348602446098e+02 +132 66 -9.695072463564451e+02 +132 67 -1.141773184361047e+03 +132 68 -1.394551574360513e+03 +132 69 -1.733190400658708e+03 +132 70 -2.134265778758331e+03 +132 71 -2.521021940438005e+03 +132 72 -2.767706810094289e+03 +132 199 -5.136224430633847e+03 +132 200 -4.560278038130800e+03 +132 201 -3.699147964795170e+03 +132 202 -2.861294172280330e+03 +132 203 -2.199157547087195e+03 +132 204 -1.733190400658708e+03 +132 205 -1.430197816180119e+03 +132 206 -1.251286952144483e+03 +132 207 -1.168677565678393e+03 +133 37 -3.477040265152328e+02 +133 38 -3.616604611210839e+02 +133 39 -3.900936262054902e+02 +133 40 -4.335967747934762e+02 +133 41 -4.917852936655349e+02 +133 42 -5.615217592749217e+02 +133 43 -6.348419924070901e+02 +133 44 -6.982151391788542e+02 +133 45 -7.355893501902642e+02 +133 64 -7.058924559832883e+02 +133 65 -7.463158073460694e+02 +133 66 -8.315436028021828e+02 +133 67 -9.695072463564453e+02 +133 68 -1.168677565678393e+03 +133 69 -1.430197816180119e+03 +133 70 -1.733190400658708e+03 +133 71 -2.019368486704434e+03 +133 72 -2.199157547087194e+03 +133 199 -7.138491575686255e+03 +133 200 -6.235592529048589e+03 +133 201 -4.925216936196723e+03 +133 202 -3.699147964795170e+03 +133 203 -2.767706810094291e+03 +133 204 -2.134265778758331e+03 +133 205 -1.733190400658708e+03 +133 206 -1.500725861549674e+03 +133 207 -1.394551574360513e+03 +134 37 -3.220071447431197e+02 +134 38 -3.345306689243866e+02 +134 39 -3.599808995889908e+02 +134 40 -3.987626324596288e+02 +134 41 -4.503577579145714e+02 +134 42 -5.118054541360788e+02 +134 43 -5.759928774566611e+02 +134 44 -6.311526429035280e+02 +134 45 -6.635521292324264e+02 +134 64 -6.378158089920685e+02 +134 65 -6.728335244699305e+02 +134 66 -7.463158073460691e+02 +134 67 -8.643348602446098e+02 +134 68 -1.032880208377977e+03 +134 69 -1.251286952144482e+03 +134 70 -1.500725861549673e+03 +134 71 -1.733190400658708e+03 +134 72 -1.877824568765012e+03 +134 199 -9.405703259334590e+03 +134 200 -8.091232579773130e+03 +134 201 -6.235592529048596e+03 +134 202 -4.560278038130805e+03 +134 203 -3.331754877699592e+03 +134 204 -2.521021940438005e+03 +134 205 -2.019368486704434e+03 +134 206 -1.733190400658709e+03 +134 207 -1.603684467943635e+03 +135 37 -3.094084671995307e+02 +135 38 -3.212463524241288e+02 +135 39 -3.452727498922125e+02 +135 40 -3.818097302446305e+02 +135 41 -4.302864947716844e+02 +135 42 -4.878379044359882e+02 +135 43 -5.477593218561533e+02 +135 44 -5.991040264672794e+02 +135 45 -6.292018074604183e+02 +135 64 -6.052974323170218e+02 +135 65 -6.378158089920685e+02 +135 66 -7.058924559832883e+02 +135 67 -8.148024630667958e+02 +135 68 -9.695072463564453e+02 +135 69 -1.168677565678393e+03 +135 70 -1.394551574360514e+03 +135 71 -1.603684467943636e+03 +135 72 -1.733190400658708e+03 +135 199 -1.103972130715914e+04 +135 200 -9.405703259334568e+03 +135 201 -7.138491575686247e+03 +135 202 -5.136224430633843e+03 +135 203 -3.699147964795167e+03 +135 204 -2.767706810094289e+03 +135 205 -2.199157547087194e+03 +135 206 -1.877824568765014e+03 +135 207 -1.733190400658707e+03 +154 433 -5.416220002058462e+01 +154 434 -5.028460369863168e+01 +154 435 -4.398263164573862e+01 +154 436 -3.711530555640484e+01 +154 437 -3.100122392289862e+01 +154 438 -2.620940698061743e+01 +154 439 -2.281096793104269e+01 +154 440 -2.067515029553632e+01 +154 441 -1.965157861598589e+01 +155 433 -5.847168336242219e+01 +155 434 -5.416220002058463e+01 +155 435 -4.718848846240646e+01 +155 436 -3.963467701820886e+01 +155 437 -3.295302401855845e+01 +155 438 -2.774798050936781e+01 +155 439 -2.407490908992508e+01 +155 440 -2.177494503977683e+01 +155 441 -2.067515029553633e+01 +156 433 -6.797204698756194e+01 +156 434 -6.266865647386101e+01 +156 435 -5.416220002058463e+01 +156 436 -4.506046026496942e+01 +156 437 -3.711530555640486e+01 +156 438 -3.100122392289864e+01 +156 439 -2.672989532903560e+01 +156 440 -2.407490908992508e+01 +156 441 -2.281096793104268e+01 +157 433 -8.455751811576003e+01 +157 434 -7.739429142416689e+01 +157 435 -6.606134132672690e+01 +157 436 -5.416220002058462e+01 +157 437 -4.398263164573862e+01 +157 438 -3.629276779865594e+01 +157 439 -3.100122392289864e+01 +157 440 -2.774798050936781e+01 +157 441 -2.620940698061743e+01 +158 433 -1.112023202068744e+02 +158 434 -1.007640600234616e+02 +158 435 -8.455751811576003e+01 +158 436 -6.797204698756194e+01 +158 437 -5.416220002058462e+01 +158 438 -4.398263164573862e+01 +158 439 -3.711530555640486e+01 +158 440 -3.295302401855845e+01 +158 441 -3.100122392289862e+01 +159 433 -1.512628164030905e+02 +159 434 -1.353445496343035e+02 +159 435 -1.112023202068745e+02 +159 436 -8.726265053974946e+01 +159 437 -6.797204698756194e+01 +159 438 -5.416220002058463e+01 +159 439 -4.506046026496942e+01 +159 440 -3.963467701820886e+01 +159 441 -3.711530555640486e+01 +160 433 -2.053883607687488e+02 +160 434 -1.811983282511273e+02 +160 435 -1.454508347890308e+02 +160 436 -1.112023202068744e+02 +160 437 -8.455751811576002e+01 +160 438 -6.606134132672689e+01 +160 439 -5.416220002058463e+01 +160 440 -4.718848846240642e+01 +160 441 -4.398263164573862e+01 +161 433 -2.647767438527633e+02 +161 434 -2.305668762810884e+02 +161 435 -1.811983282511274e+02 +161 436 -1.353445496343034e+02 +161 437 -1.007640600234616e+02 +161 438 -7.739429142416689e+01 +161 439 -6.266865647386102e+01 +161 440 -5.416220002058462e+01 +161 441 -5.028460369863168e+01 +162 433 -3.065373731090124e+02 +162 434 -2.647767438527633e+02 +162 435 -2.053883607687489e+02 +162 436 -1.512628164030904e+02 +162 437 -1.112023202068744e+02 +162 438 -8.455751811576003e+01 +162 439 -6.797204698756197e+01 +162 440 -5.847168336242218e+01 +162 441 -5.416220002058462e+01 +163 28 -3.185949915155906e+02 +163 29 -3.439477067470149e+02 +163 30 -3.998395590460265e+02 +163 31 -4.974174896700122e+02 +163 32 -6.541859996822101e+02 +163 33 -8.899037087533450e+02 +163 34 -1.208406374254620e+03 +163 35 -1.557906817650854e+03 +163 36 -1.803683571360670e+03 +163 307 -3.063876713483004e+02 +163 308 -2.841326260213859e+02 +163 309 -2.480403651673274e+02 +163 310 -2.088271183655456e+02 +163 311 -1.740274317161708e+02 +163 312 -1.468355065336025e+02 +163 313 -1.275984131219178e+02 +163 314 -1.155304899028561e+02 +163 315 -1.097534196790493e+02 +163 370 -1.111842160419089e+02 +163 371 -1.057061586526019e+02 +163 372 -9.638822517401599e+01 +163 373 -8.555928471614153e+01 +163 374 -7.520762033775922e+01 +163 375 -6.652797451218331e+01 +163 376 -6.001174723167333e+01 +163 377 -5.573941364116938e+01 +163 378 -5.363826960242956e+01 +164 28 -2.951078427558438e+02 +164 29 -3.178454563978018e+02 +164 30 -3.677195470576132e+02 +164 31 -4.540381155501299e+02 +164 32 -5.909830065177898e+02 +164 33 -7.935375863967956e+02 +164 34 -1.061994722297375e+03 +164 35 -1.350888397614685e+03 +164 36 -1.551001537080487e+03 +164 307 -3.311617365195742e+02 +164 308 -3.063876713483004e+02 +164 309 -2.663884709281895e+02 +164 310 -2.231981844606889e+02 +164 311 -1.851243485745372e+02 +164 312 -1.555580782497810e+02 +164 313 -1.347481526436476e+02 +164 314 -1.217424124188380e+02 +164 315 -1.155304899028560e+02 +164 370 -1.170681125153374e+02 +164 371 -1.111842160419089e+02 +164 372 -1.011961191083175e+02 +164 373 -8.962181586287879e+01 +164 374 -7.859349409841366e+01 +164 375 -6.937545782864687e+01 +164 376 -6.247361649834816e+01 +164 377 -5.795761808209195e+01 +164 378 -5.573941364116936e+01 +165 28 -2.571018386235475e+02 +165 29 -2.757949833234031e+02 +165 30 -3.164434563350800e+02 +165 31 -3.857583326106442e+02 +165 32 -4.934067681037748e+02 +165 33 -6.483041962836987e+02 +165 34 -8.471447143627422e+02 +165 35 -1.054419678838069e+03 +165 36 -1.194543106324051e+03 +165 307 -3.859179776157598e+02 +165 308 -3.553280674768354e+02 +165 309 -3.063876713483004e+02 +165 310 -2.542062119667733e+02 +165 311 -2.088271183655455e+02 +165 312 -1.740274317161707e+02 +165 313 -1.497853840269158e+02 +165 314 -1.347481526436476e+02 +165 315 -1.275984131219178e+02 +165 370 -1.293661657908650e+02 +165 371 -1.226088998409724e+02 +165 372 -1.111842160419089e+02 +165 373 -9.802102195827709e+01 +165 374 -8.555928471614152e+01 +165 375 -7.520762033775921e+01 +165 376 -6.749803222962944e+01 +165 377 -6.247361649834816e+01 +165 378 -6.001174723167332e+01 +166 28 -2.159365711771960e+02 +166 29 -2.305288966853525e+02 +166 30 -2.619362897572149e+02 +166 31 -3.145682002862656e+02 +166 32 -3.943098996958960e+02 +166 33 -5.054956454877199e+02 +166 34 -6.431928259089628e+02 +166 35 -7.817773521818433e+02 +166 36 -8.730167855570571e+02 +166 307 -4.819366867771671e+02 +166 308 -4.404031329187425e+02 +166 309 -3.748904053829397e+02 +166 310 -3.063876713483005e+02 +166 311 -2.480403651673274e+02 +166 312 -2.041390437321798e+02 +166 313 -1.740274317161708e+02 +166 314 -1.555580782497811e+02 +166 315 -1.468355065336025e+02 +166 370 -1.489885081652993e+02 +166 371 -1.407716848553631e+02 +166 372 -1.269615920628683e+02 +166 373 -1.111842160419090e+02 +166 374 -9.638822517401599e+01 +166 375 -8.420868002944918e+01 +166 376 -7.520762033775922e+01 +166 377 -6.937545782864690e+01 +166 378 -6.652797451218331e+01 +167 28 -1.795263442452015e+02 +167 29 -1.907570089368379e+02 +167 30 -2.146875584166403e+02 +167 31 -2.541172217455341e+02 +167 32 -3.124545890557372e+02 +167 33 -3.914111969292455e+02 +167 34 -4.859906672046191e+02 +167 35 -5.781801706476442e+02 +167 36 -6.374486870708147e+02 +167 307 -6.371952057562397e+02 +167 308 -5.762343277298875e+02 +167 309 -4.819366867771671e+02 +167 310 -3.859179776157600e+02 +167 311 -3.063876713483004e+02 +167 312 -2.480403651673273e+02 +167 313 -2.088271183655455e+02 +167 314 -1.851243485745372e+02 +167 315 -1.740274317161707e+02 +167 370 -1.767605489846855e+02 +167 371 -1.663510232448634e+02 +167 372 -1.489885081652993e+02 +167 373 -1.293661657908651e+02 +167 374 -1.111842160419089e+02 +167 375 -9.638822517401596e+01 +167 376 -8.555928471614152e+01 +167 377 -7.859349409841366e+01 +167 378 -7.520762033775921e+01 +168 28 -1.511641185819216e+02 +168 29 -1.599666339328591e+02 +168 30 -1.785615937298684e+02 +168 31 -2.087595425387009e+02 +168 32 -2.525488844183091e+02 +168 33 -3.103608066686783e+02 +168 34 -3.777408836461634e+02 +168 35 -4.417383595334794e+02 +168 36 -4.821081368418356e+02 +168 307 -8.726231103602338e+02 +168 308 -7.788097592344268e+02 +168 309 -6.371952057562402e+02 +168 310 -4.976453857371593e+02 +168 311 -3.859179776157600e+02 +168 312 -3.063876713483004e+02 +168 313 -2.542062119667733e+02 +168 314 -2.231981844606889e+02 +168 315 -2.088271183655455e+02 +168 370 -2.123577731150844e+02 +168 371 -1.989422168423268e+02 +168 372 -1.767605489846857e+02 +168 373 -1.519993633210927e+02 +168 374 -1.293661657908651e+02 +168 375 -1.111842160419089e+02 +168 376 -9.802102195827709e+01 +168 377 -8.962181586287879e+01 +168 378 -8.555928471614152e+01 +169 28 -1.311504875731257e+02 +169 29 -1.383497950453837e+02 +169 30 -1.534567756335945e+02 +169 31 -1.777191936617241e+02 +169 32 -2.123674027242826e+02 +169 33 -2.572634643085092e+02 +169 34 -3.085357616669019e+02 +169 35 -3.563165521884243e+02 +169 36 -3.860435908762174e+02 +169 307 -1.193932486839835e+03 +169 308 -1.049909849375152e+03 +169 309 -8.383319685358463e+02 +169 310 -6.371952057562402e+02 +169 311 -4.819366867771671e+02 +169 312 -3.748904053829394e+02 +169 313 -3.063876713483004e+02 +169 314 -2.663884709281895e+02 +169 315 -2.480403651673273e+02 +169 370 -2.525366109215767e+02 +169 371 -2.354925657825778e+02 +169 372 -2.075588680195233e+02 +169 373 -1.767605489846857e+02 +169 374 -1.489885081652993e+02 +169 375 -1.269615920628683e+02 +169 376 -1.111842160419089e+02 +169 377 -1.011961191083175e+02 +169 378 -9.638822517401596e+01 +170 28 -1.186189792674009e+02 +170 29 -1.248646489909731e+02 +170 30 -1.379118742926998e+02 +170 31 -1.587111708505125e+02 +170 32 -1.881134719040971e+02 +170 33 -2.257453236303342e+02 +170 34 -2.681540147946965e+02 +170 35 -3.071908641223830e+02 +170 36 -3.312631259798876e+02 +170 307 -1.550121445008506e+03 +170 308 -1.344510568096307e+03 +170 309 -1.049909849375152e+03 +170 310 -7.788097592344268e+02 +170 311 -5.762343277298875e+02 +170 312 -4.404031329187421e+02 +170 313 -3.553280674768354e+02 +170 314 -3.063876713483004e+02 +170 315 -2.841326260213858e+02 +170 370 -2.895745815575320e+02 +170 371 -2.689865983609323e+02 +170 372 -2.354925657825778e+02 +170 373 -1.989422168423268e+02 +170 374 -1.663510232448634e+02 +170 375 -1.407716848553630e+02 +170 376 -1.226088998409724e+02 +170 377 -1.111842160419089e+02 +170 378 -1.057061586526019e+02 +171 28 -1.126267924233399e+02 +171 29 -1.184309147085536e+02 +171 30 -1.305286077257164e+02 +171 31 -1.497429456103046e+02 +171 32 -1.767679971916822e+02 +171 33 -2.111471637576030e+02 +171 34 -2.496378310788914e+02 +171 35 -2.848553057492978e+02 +171 36 -3.064786026796347e+02 +171 307 -1.802596433195452e+03 +171 308 -1.550121445008506e+03 +171 309 -1.193932486839835e+03 +171 310 -8.726231103602338e+02 +171 311 -6.371952057562397e+02 +171 312 -4.819366867771668e+02 +171 313 -3.859179776157598e+02 +171 314 -3.311617365195742e+02 +171 315 -3.063876713483002e+02 +171 370 -3.124380547854540e+02 +171 371 -2.895745815575322e+02 +171 372 -2.525366109215768e+02 +171 373 -2.123577731150846e+02 +171 374 -1.767605489846856e+02 +171 375 -1.489885081652993e+02 +171 376 -1.293661657908650e+02 +171 377 -1.170681125153375e+02 +171 378 -1.111842160419089e+02 +172 100 -1.733190400658708e+03 +172 101 -1.877824568765012e+03 +172 102 -2.199157547087194e+03 +172 103 -2.767706810094291e+03 +172 104 -3.699147964795167e+03 +172 105 -5.136224430633843e+03 +172 106 -7.138491575686247e+03 +172 107 -9.405703259334579e+03 +172 108 -1.103972130715913e+04 +172 235 -1.733190400658709e+03 +172 236 -1.603684467943635e+03 +172 237 -1.394551574360514e+03 +172 238 -1.168677565678394e+03 +172 239 -9.695072463564453e+02 +172 240 -8.148024630667954e+02 +172 241 -7.058924559832883e+02 +172 242 -6.378158089920688e+02 +172 243 -6.052974323170215e+02 +172 262 -6.289529049931516e+02 +172 263 -5.970589583440832e+02 +172 264 -5.429674662554831e+02 +172 265 -4.803677035258847e+02 +172 266 -4.208084537187719e+02 +172 267 -3.710963518270341e+02 +172 268 -3.339204550667993e+02 +172 269 -3.096178268240471e+02 +172 270 -2.976873911031304e+02 +173 100 -1.603684467943635e+03 +173 101 -1.733190400658707e+03 +173 102 -2.019368486704433e+03 +173 103 -2.521021940438005e+03 +173 104 -3.331754877699590e+03 +173 105 -4.560278038130800e+03 +173 106 -6.235592529048589e+03 +173 107 -8.091232579773130e+03 +173 108 -9.405703259334568e+03 +173 235 -1.877824568765015e+03 +173 236 -1.733190400658708e+03 +173 237 -1.500725861549674e+03 +173 238 -1.251286952144483e+03 +173 239 -1.032880208377978e+03 +173 240 -8.643348602446098e+02 +173 241 -7.463158073460694e+02 +173 242 -6.728335244699310e+02 +173 243 -6.378158089920685e+02 +173 262 -6.632839990295108e+02 +173 263 -6.289529049931513e+02 +173 264 -5.708523475060545e+02 +173 265 -5.038180997021786e+02 +173 266 -4.402579127124384e+02 +173 267 -3.873813675510152e+02 +173 268 -3.479505460244112e+02 +173 269 -3.222285372305481e+02 +173 270 -3.096178268240470e+02 +174 100 -1.394551574360514e+03 +174 101 -1.500725861549673e+03 +174 102 -1.733190400658708e+03 +174 103 -2.134265778758333e+03 +174 104 -2.767706810094291e+03 +174 105 -3.699147964795170e+03 +174 106 -4.925216936196723e+03 +174 107 -6.235592529048596e+03 +174 108 -7.138491575686247e+03 +174 235 -2.199157547087195e+03 +174 236 -2.019368486704433e+03 +174 237 -1.733190400658708e+03 +174 238 -1.430197816180119e+03 +174 239 -1.168677565678393e+03 +174 240 -9.695072463564451e+02 +174 241 -8.315436028021828e+02 +174 242 -7.463158073460694e+02 +174 243 -7.058924559832880e+02 +174 262 -7.352796046183671e+02 +174 263 -6.956816209337395e+02 +174 264 -6.289529049931513e+02 +174 265 -5.524312223207843e+02 +174 266 -4.803677035258846e+02 +174 267 -4.208084537187718e+02 +174 268 -3.766415408901786e+02 +174 269 -3.479505460244112e+02 +174 270 -3.339204550667992e+02 +175 100 -1.168677565678394e+03 +175 101 -1.251286952144482e+03 +175 102 -1.430197816180119e+03 +175 103 -1.733190400658709e+03 +175 104 -2.199157547087195e+03 +175 105 -2.861294172280330e+03 +175 106 -3.699147964795170e+03 +175 107 -4.560278038130805e+03 +175 108 -5.136224430633843e+03 +175 235 -2.767706810094291e+03 +175 236 -2.521021940438003e+03 +175 237 -2.134265778758331e+03 +175 238 -1.733190400658708e+03 +175 239 -1.394551574360513e+03 +175 240 -1.141773184361047e+03 +175 241 -9.695072463564451e+02 +175 242 -8.643348602446098e+02 +175 243 -8.148024630667953e+02 +175 262 -8.507888885505199e+02 +175 263 -8.023274760830682e+02 +175 264 -7.211778000851810e+02 +175 265 -6.289529049931513e+02 +175 266 -5.429674662554829e+02 +175 267 -4.725808574370898e+02 +175 268 -4.208084537187718e+02 +175 269 -3.873813675510152e+02 +175 270 -3.710963518270340e+02 +176 100 -9.695072463564453e+02 +176 101 -1.032880208377977e+03 +176 102 -1.168677565678393e+03 +176 103 -1.394551574360514e+03 +176 104 -1.733190400658708e+03 +176 105 -2.199157547087195e+03 +176 106 -2.767706810094291e+03 +176 107 -3.331754877699592e+03 +176 108 -3.699147964795167e+03 +176 235 -3.699147964795170e+03 +176 236 -3.331754877699590e+03 +176 237 -2.767706810094291e+03 +176 238 -2.199157547087195e+03 +176 239 -1.733190400658708e+03 +176 240 -1.394551574360513e+03 +176 241 -1.168677565678393e+03 +176 242 -1.032880208377978e+03 +176 243 -9.695072463564451e+02 +176 262 -1.015511306612465e+03 +176 263 -9.536070604341742e+02 +176 264 -8.507888885505199e+02 +176 265 -7.352796046183671e+02 +176 266 -6.289529049931513e+02 +176 267 -5.429674662554829e+02 +176 268 -4.803677035258846e+02 +176 269 -4.402579127124384e+02 +176 270 -4.208084537187718e+02 +177 100 -8.148024630667954e+02 +177 101 -8.643348602446093e+02 +177 102 -9.695072463564451e+02 +177 103 -1.141773184361047e+03 +177 104 -1.394551574360513e+03 +177 105 -1.733190400658708e+03 +177 106 -2.134265778758331e+03 +177 107 -2.521021940438005e+03 +177 108 -2.767706810094289e+03 +177 235 -5.136224430633847e+03 +177 236 -4.560278038130800e+03 +177 237 -3.699147964795170e+03 +177 238 -2.861294172280330e+03 +177 239 -2.199157547087195e+03 +177 240 -1.733190400658708e+03 +177 241 -1.430197816180119e+03 +177 242 -1.251286952144483e+03 +177 243 -1.168677565678393e+03 +177 262 -1.228588660544048e+03 +177 263 -1.148042053110077e+03 +177 264 -1.015511306612465e+03 +177 265 -8.685786765383772e+02 +177 266 -7.352796046183671e+02 +177 267 -6.289529049931513e+02 +177 268 -5.524312223207843e+02 +177 269 -5.038180997021786e+02 +177 270 -4.803677035258846e+02 +178 100 -7.058924559832883e+02 +178 101 -7.463158073460691e+02 +178 102 -8.315436028021828e+02 +178 103 -9.695072463564453e+02 +178 104 -1.168677565678393e+03 +178 105 -1.430197816180119e+03 +178 106 -1.733190400658708e+03 +178 107 -2.019368486704434e+03 +178 108 -2.199157547087194e+03 +178 235 -7.138491575686255e+03 +178 236 -6.235592529048589e+03 +178 237 -4.925216936196723e+03 +178 238 -3.699147964795170e+03 +178 239 -2.767706810094291e+03 +178 240 -2.134265778758331e+03 +178 241 -1.733190400658708e+03 +178 242 -1.500725861549674e+03 +178 243 -1.394551574360513e+03 +178 262 -1.471477730866024e+03 +178 263 -1.368148367306962e+03 +178 264 -1.199743197084304e+03 +178 265 -1.015511306612465e+03 +178 266 -8.507888885505199e+02 +178 267 -7.211778000851810e+02 +178 268 -6.289529049931513e+02 +178 269 -5.708523475060545e+02 +178 270 -5.429674662554829e+02 +179 100 -6.378158089920688e+02 +179 101 -6.728335244699306e+02 +179 102 -7.463158073460694e+02 +179 103 -8.643348602446100e+02 +179 104 -1.032880208377978e+03 +179 105 -1.251286952144483e+03 +179 106 -1.500725861549674e+03 +179 107 -1.733190400658709e+03 +179 108 -1.877824568765014e+03 +179 235 -9.405703259334579e+03 +179 236 -8.091232579773123e+03 +179 237 -6.235592529048589e+03 +179 238 -4.560278038130800e+03 +179 239 -3.331754877699590e+03 +179 240 -2.521021940438003e+03 +179 241 -2.019368486704433e+03 +179 242 -1.733190400658708e+03 +179 243 -1.603684467943634e+03 +179 262 -1.697437739078444e+03 +179 263 -1.571600895131401e+03 +179 264 -1.368148367306962e+03 +179 265 -1.148042053110077e+03 +179 266 -9.536070604341742e+02 +179 267 -8.023274760830682e+02 +179 268 -6.956816209337395e+02 +179 269 -6.289529049931513e+02 +179 270 -5.970589583440830e+02 +180 100 -6.052974323170215e+02 +180 101 -6.378158089920682e+02 +180 102 -7.058924559832880e+02 +180 103 -8.148024630667954e+02 +180 104 -9.695072463564451e+02 +180 105 -1.168677565678393e+03 +180 106 -1.394551574360513e+03 +180 107 -1.603684467943635e+03 +180 108 -1.733190400658707e+03 +180 235 -1.103972130715916e+04 +180 236 -9.405703259334579e+03 +180 237 -7.138491575686255e+03 +180 238 -5.136224430633847e+03 +180 239 -3.699147964795170e+03 +180 240 -2.767706810094291e+03 +180 241 -2.199157547087195e+03 +180 242 -1.877824568765015e+03 +180 243 -1.733190400658708e+03 +180 262 -1.837845240586531e+03 +180 263 -1.697437739078444e+03 +180 264 -1.471477730866024e+03 +180 265 -1.228588660544048e+03 +180 266 -1.015511306612465e+03 +180 267 -8.507888885505199e+02 +180 268 -7.352796046183671e+02 +180 269 -6.632839990295108e+02 +180 270 -6.289529049931513e+02 +199 100 -6.289529049931516e+02 +199 101 -6.632839990295106e+02 +199 102 -7.352796046183671e+02 +199 103 -8.507888885505203e+02 +199 104 -1.015511306612465e+03 +199 105 -1.228588660544048e+03 +199 106 -1.471477730866024e+03 +199 107 -1.697437739078445e+03 +199 108 -1.837845240586530e+03 +199 127 -1.733190400658709e+03 +199 128 -1.877824568765014e+03 +199 129 -2.199157547087195e+03 +199 130 -2.767706810094292e+03 +199 131 -3.699147964795170e+03 +199 132 -5.136224430633847e+03 +199 133 -7.138491575686255e+03 +199 134 -9.405703259334590e+03 +199 135 -1.103972130715914e+04 +199 262 -1.733190400658708e+03 +199 263 -1.603684467943634e+03 +199 264 -1.394551574360513e+03 +199 265 -1.168677565678393e+03 +199 266 -9.695072463564451e+02 +199 267 -8.148024630667953e+02 +199 268 -7.058924559832880e+02 +199 269 -6.378158089920685e+02 +199 270 -6.052974323170214e+02 +200 100 -5.970589583440832e+02 +200 101 -6.289529049931510e+02 +200 102 -6.956816209337395e+02 +200 103 -8.023274760830685e+02 +200 104 -9.536070604341742e+02 +200 105 -1.148042053110077e+03 +200 106 -1.368148367306962e+03 +200 107 -1.571600895131402e+03 +200 108 -1.697437739078443e+03 +200 127 -1.603684467943635e+03 +200 128 -1.733190400658707e+03 +200 129 -2.019368486704433e+03 +200 130 -2.521021940438005e+03 +200 131 -3.331754877699590e+03 +200 132 -4.560278038130800e+03 +200 133 -6.235592529048589e+03 +200 134 -8.091232579773130e+03 +200 135 -9.405703259334568e+03 +200 262 -1.877824568765015e+03 +200 263 -1.733190400658708e+03 +200 264 -1.500725861549674e+03 +200 265 -1.251286952144483e+03 +200 266 -1.032880208377978e+03 +200 267 -8.643348602446098e+02 +200 268 -7.463158073460694e+02 +200 269 -6.728335244699310e+02 +200 270 -6.378158089920685e+02 +201 100 -5.429674662554831e+02 +201 101 -5.708523475060542e+02 +201 102 -6.289529049931513e+02 +201 103 -7.211778000851814e+02 +201 104 -8.507888885505199e+02 +201 105 -1.015511306612465e+03 +201 106 -1.199743197084304e+03 +201 107 -1.368148367306963e+03 +201 108 -1.471477730866023e+03 +201 127 -1.394551574360514e+03 +201 128 -1.500725861549673e+03 +201 129 -1.733190400658708e+03 +201 130 -2.134265778758333e+03 +201 131 -2.767706810094291e+03 +201 132 -3.699147964795170e+03 +201 133 -4.925216936196723e+03 +201 134 -6.235592529048596e+03 +201 135 -7.138491575686247e+03 +201 262 -2.199157547087195e+03 +201 263 -2.019368486704433e+03 +201 264 -1.733190400658708e+03 +201 265 -1.430197816180119e+03 +201 266 -1.168677565678393e+03 +201 267 -9.695072463564451e+02 +201 268 -8.315436028021828e+02 +201 269 -7.463158073460694e+02 +201 270 -7.058924559832880e+02 +202 100 -4.803677035258847e+02 +202 101 -5.038180997021785e+02 +202 102 -5.524312223207843e+02 +202 103 -6.289529049931516e+02 +202 104 -7.352796046183671e+02 +202 105 -8.685786765383772e+02 +202 106 -1.015511306612465e+03 +202 107 -1.148042053110077e+03 +202 108 -1.228588660544047e+03 +202 127 -1.168677565678394e+03 +202 128 -1.251286952144482e+03 +202 129 -1.430197816180119e+03 +202 130 -1.733190400658709e+03 +202 131 -2.199157547087195e+03 +202 132 -2.861294172280330e+03 +202 133 -3.699147964795170e+03 +202 134 -4.560278038130805e+03 +202 135 -5.136224430633843e+03 +202 262 -2.767706810094291e+03 +202 263 -2.521021940438003e+03 +202 264 -2.134265778758331e+03 +202 265 -1.733190400658708e+03 +202 266 -1.394551574360513e+03 +202 267 -1.141773184361047e+03 +202 268 -9.695072463564451e+02 +202 269 -8.643348602446098e+02 +202 270 -8.148024630667953e+02 +203 100 -4.208084537187719e+02 +203 101 -4.402579127124382e+02 +203 102 -4.803677035258846e+02 +203 103 -5.429674662554831e+02 +203 104 -6.289529049931513e+02 +203 105 -7.352796046183671e+02 +203 106 -8.507888885505199e+02 +203 107 -9.536070604341747e+02 +203 108 -1.015511306612465e+03 +203 127 -9.695072463564453e+02 +203 128 -1.032880208377977e+03 +203 129 -1.168677565678393e+03 +203 130 -1.394551574360514e+03 +203 131 -1.733190400658708e+03 +203 132 -2.199157547087195e+03 +203 133 -2.767706810094291e+03 +203 134 -3.331754877699592e+03 +203 135 -3.699147964795167e+03 +203 262 -3.699147964795170e+03 +203 263 -3.331754877699590e+03 +203 264 -2.767706810094291e+03 +203 265 -2.199157547087195e+03 +203 266 -1.733190400658708e+03 +203 267 -1.394551574360513e+03 +203 268 -1.168677565678393e+03 +203 269 -1.032880208377978e+03 +203 270 -9.695072463564451e+02 +204 100 -3.710963518270341e+02 +204 101 -3.873813675510150e+02 +204 102 -4.208084537187718e+02 +204 103 -4.725808574370899e+02 +204 104 -5.429674662554829e+02 +204 105 -6.289529049931513e+02 +204 106 -7.211778000851810e+02 +204 107 -8.023274760830685e+02 +204 108 -8.507888885505196e+02 +204 127 -8.148024630667954e+02 +204 128 -8.643348602446093e+02 +204 129 -9.695072463564451e+02 +204 130 -1.141773184361047e+03 +204 131 -1.394551574360513e+03 +204 132 -1.733190400658708e+03 +204 133 -2.134265778758331e+03 +204 134 -2.521021940438005e+03 +204 135 -2.767706810094289e+03 +204 262 -5.136224430633847e+03 +204 263 -4.560278038130800e+03 +204 264 -3.699147964795170e+03 +204 265 -2.861294172280330e+03 +204 266 -2.199157547087195e+03 +204 267 -1.733190400658708e+03 +204 268 -1.430197816180119e+03 +204 269 -1.251286952144483e+03 +204 270 -1.168677565678393e+03 +205 100 -3.339204550667993e+02 +205 101 -3.479505460244111e+02 +205 102 -3.766415408901786e+02 +205 103 -4.208084537187719e+02 +205 104 -4.803677035258846e+02 +205 105 -5.524312223207843e+02 +205 106 -6.289529049931513e+02 +205 107 -6.956816209337397e+02 +205 108 -7.352796046183668e+02 +205 127 -7.058924559832883e+02 +205 128 -7.463158073460691e+02 +205 129 -8.315436028021828e+02 +205 130 -9.695072463564453e+02 +205 131 -1.168677565678393e+03 +205 132 -1.430197816180119e+03 +205 133 -1.733190400658708e+03 +205 134 -2.019368486704434e+03 +205 135 -2.199157547087194e+03 +205 262 -7.138491575686255e+03 +205 263 -6.235592529048589e+03 +205 264 -4.925216936196723e+03 +205 265 -3.699147964795170e+03 +205 266 -2.767706810094291e+03 +205 267 -2.134265778758331e+03 +205 268 -1.733190400658708e+03 +205 269 -1.500725861549674e+03 +205 270 -1.394551574360513e+03 +206 100 -3.096178268240471e+02 +206 101 -3.222285372305480e+02 +206 102 -3.479505460244112e+02 +206 103 -3.873813675510153e+02 +206 104 -4.402579127124384e+02 +206 105 -5.038180997021786e+02 +206 106 -5.708523475060545e+02 +206 107 -6.289529049931516e+02 +206 108 -6.632839990295106e+02 +206 127 -6.378158089920688e+02 +206 128 -6.728335244699306e+02 +206 129 -7.463158073460694e+02 +206 130 -8.643348602446100e+02 +206 131 -1.032880208377978e+03 +206 132 -1.251286952144483e+03 +206 133 -1.500725861549674e+03 +206 134 -1.733190400658709e+03 +206 135 -1.877824568765014e+03 +206 262 -9.405703259334579e+03 +206 263 -8.091232579773123e+03 +206 264 -6.235592529048589e+03 +206 265 -4.560278038130800e+03 +206 266 -3.331754877699590e+03 +206 267 -2.521021940438003e+03 +206 268 -2.019368486704433e+03 +206 269 -1.733190400658708e+03 +206 270 -1.603684467943634e+03 +207 100 -2.976873911031304e+02 +207 101 -3.096178268240469e+02 +207 102 -3.339204550667992e+02 +207 103 -3.710963518270341e+02 +207 104 -4.208084537187718e+02 +207 105 -4.803677035258846e+02 +207 106 -5.429674662554829e+02 +207 107 -5.970589583440832e+02 +207 108 -6.289529049931510e+02 +207 127 -6.052974323170215e+02 +207 128 -6.378158089920682e+02 +207 129 -7.058924559832880e+02 +207 130 -8.148024630667954e+02 +207 131 -9.695072463564451e+02 +207 132 -1.168677565678393e+03 +207 133 -1.394551574360513e+03 +207 134 -1.603684467943635e+03 +207 135 -1.733190400658707e+03 +207 262 -1.103972130715916e+04 +207 263 -9.405703259334579e+03 +207 264 -7.138491575686255e+03 +207 265 -5.136224430633847e+03 +207 266 -3.699147964795170e+03 +207 267 -2.767706810094291e+03 +207 268 -2.199157547087195e+03 +207 269 -1.877824568765015e+03 +207 270 -1.733190400658708e+03 +226 28 -1.141104443336769e+02 +226 29 -1.200229981926134e+02 +226 30 -1.323536142708755e+02 +226 31 -1.519560441708244e+02 +226 32 -1.795617527855330e+02 +226 33 -2.147330428340353e+02 +226 34 -2.541748168062170e+02 +226 35 -2.903167232403405e+02 +226 36 -3.125315100891904e+02 +226 91 -3.063876713483004e+02 +226 92 -3.311617365195742e+02 +226 93 -3.859179776157598e+02 +226 94 -4.819366867771671e+02 +226 95 -6.371952057562397e+02 +226 96 -8.726231103602333e+02 +226 97 -1.193932486839835e+03 +226 98 -1.550121445008506e+03 +226 99 -1.802596433195452e+03 +226 370 -3.063876713483002e+02 +226 371 -2.841326260213859e+02 +226 372 -2.480403651673274e+02 +226 373 -2.088271183655456e+02 +226 374 -1.740274317161708e+02 +226 375 -1.468355065336025e+02 +226 376 -1.275984131219178e+02 +226 377 -1.155304899028561e+02 +226 378 -1.097534196790493e+02 +227 28 -1.084315507615241e+02 +227 29 -1.139323073580841e+02 +227 30 -1.253792450156107e+02 +227 31 -1.435117964143268e+02 +227 32 -1.689233475000208e+02 +227 33 -2.011096605556943e+02 +227 34 -2.369779136990108e+02 +227 35 -2.696559009041458e+02 +227 36 -2.896586042023723e+02 +227 91 -2.841326260213859e+02 +227 92 -3.063876713483004e+02 +227 93 -3.553280674768354e+02 +227 94 -4.404031329187425e+02 +227 95 -5.762343277298875e+02 +227 96 -7.788097592344265e+02 +227 97 -1.049909849375152e+03 +227 98 -1.344510568096307e+03 +227 99 -1.550121445008506e+03 +227 370 -3.311617365195740e+02 +227 371 -3.063876713483004e+02 +227 372 -2.663884709281895e+02 +227 373 -2.231981844606889e+02 +227 374 -1.851243485745372e+02 +227 375 -1.555580782497810e+02 +227 376 -1.347481526436476e+02 +227 377 -1.217424124188380e+02 +227 378 -1.155304899028560e+02 +228 28 -9.878175936820709e+01 +228 29 -1.036033843083449e+02 +228 30 -1.135985712390459e+02 +228 31 -1.293315992553847e+02 +228 32 -1.511919511178824e+02 +228 33 -1.785967361533239e+02 +228 34 -2.088032783475078e+02 +228 35 -2.360481226141748e+02 +228 36 -2.526059824277440e+02 +228 91 -2.480403651673274e+02 +228 92 -2.663884709281895e+02 +228 93 -3.063876713483004e+02 +228 94 -3.748904053829397e+02 +228 95 -4.819366867771671e+02 +228 96 -6.371952057562399e+02 +228 97 -8.383319685358460e+02 +228 98 -1.049909849375152e+03 +228 99 -1.193932486839835e+03 +228 370 -3.859179776157595e+02 +228 371 -3.553280674768354e+02 +228 372 -3.063876713483004e+02 +228 373 -2.542062119667733e+02 +228 374 -2.088271183655455e+02 +228 375 -1.740274317161707e+02 +228 376 -1.497853840269158e+02 +228 377 -1.347481526436476e+02 +228 378 -1.275984131219178e+02 +229 28 -8.758337773570206e+01 +229 29 -9.165105173433192e+01 +229 30 -1.000434109112309e+02 +229 31 -1.131510900876764e+02 +229 32 -1.311733014639336e+02 +229 33 -1.534852009567454e+02 +229 34 -1.777541041873153e+02 +229 35 -1.993808802203061e+02 +229 36 -2.124122004253198e+02 +229 91 -2.088271183655455e+02 +229 92 -2.231981844606888e+02 +229 93 -2.542062119667732e+02 +229 94 -3.063876713483004e+02 +229 95 -3.859179776157598e+02 +229 96 -4.976453857371588e+02 +229 97 -6.371952057562395e+02 +229 98 -7.788097592344261e+02 +229 99 -8.726231103602329e+02 +229 370 -4.819366867771668e+02 +229 371 -4.404031329187425e+02 +229 372 -3.748904053829397e+02 +229 373 -3.063876713483005e+02 +229 374 -2.480403651673274e+02 +229 375 -2.041390437321798e+02 +229 376 -1.740274317161708e+02 +229 377 -1.555580782497811e+02 +229 378 -1.468355065336025e+02 +230 28 -7.689597342670373e+01 +230 29 -8.028060644024262e+01 +230 30 -8.722984128405791e+01 +230 31 -9.799758170421848e+01 +230 32 -1.126452263036225e+02 +230 33 -1.305512703068963e+02 +230 34 -1.497704124875112e+02 +230 35 -1.666924543137945e+02 +230 36 -1.768026463978692e+02 +230 91 -1.740274317161708e+02 +230 92 -1.851243485745372e+02 +230 93 -2.088271183655455e+02 +230 94 -2.480403651673274e+02 +230 95 -3.063876713483004e+02 +230 96 -3.859179776157599e+02 +230 97 -4.819366867771669e+02 +230 98 -5.762343277298875e+02 +230 99 -6.371952057562397e+02 +230 370 -6.371952057562393e+02 +230 371 -5.762343277298875e+02 +230 372 -4.819366867771671e+02 +230 373 -3.859179776157600e+02 +230 374 -3.063876713483004e+02 +230 375 -2.480403651673273e+02 +230 376 -2.088271183655455e+02 +230 377 -1.851243485745372e+02 +230 378 -1.740274317161707e+02 +231 28 -6.794892048403183e+01 +231 29 -7.079116927375263e+01 +231 30 -7.660127951093797e+01 +231 31 -8.553990741673539e+01 +231 32 -9.758387849948195e+01 +231 33 -1.121425230527331e+02 +231 34 -1.275864513775853e+02 +231 35 -1.410419241572607e+02 +231 36 -1.490216460686691e+02 +231 91 -1.468355065336025e+02 +231 92 -1.555580782497810e+02 +231 93 -1.740274317161707e+02 +231 94 -2.041390437321798e+02 +231 95 -2.480403651673273e+02 +231 96 -3.063876713483004e+02 +231 97 -3.748904053829394e+02 +231 98 -4.404031329187421e+02 +231 99 -4.819366867771668e+02 +231 370 -8.726231103602329e+02 +231 371 -7.788097592344268e+02 +231 372 -6.371952057562402e+02 +231 373 -4.976453857371593e+02 +231 374 -3.859179776157600e+02 +231 375 -3.063876713483004e+02 +231 376 -2.542062119667733e+02 +231 377 -2.231981844606889e+02 +231 378 -2.088271183655455e+02 +232 28 -6.124100002381031e+01 +232 29 -6.369543942071494e+01 +232 30 -6.869521361333243e+01 +232 31 -7.634343495921600e+01 +232 32 -8.657079572203122e+01 +232 33 -9.882410901895769e+01 +232 34 -1.117030448392068e+02 +232 35 -1.228316030691313e+02 +232 36 -1.293933587470326e+02 +232 91 -1.275984131219178e+02 +232 92 -1.347481526436476e+02 +232 93 -1.497853840269158e+02 +232 94 -1.740274317161708e+02 +232 95 -2.088271183655455e+02 +232 96 -2.542062119667733e+02 +232 97 -3.063876713483004e+02 +232 98 -3.553280674768354e+02 +232 99 -3.859179776157598e+02 +232 370 -1.193932486839834e+03 +232 371 -1.049909849375152e+03 +232 372 -8.383319685358463e+02 +232 373 -6.371952057562402e+02 +232 374 -4.819366867771671e+02 +232 375 -3.748904053829394e+02 +232 376 -3.063876713483004e+02 +232 377 -2.663884709281895e+02 +232 378 -2.480403651673273e+02 +233 28 -5.684745832723304e+01 +233 29 -5.905716209239919e+01 +233 30 -6.354751694192804e+01 +233 31 -7.038956454437437e+01 +233 32 -7.949137370073241e+01 +233 33 -9.033009985354941e+01 +233 34 -1.016508356069023e+02 +233 35 -1.113784096510094e+02 +233 36 -1.170917564087816e+02 +233 91 -1.155304899028561e+02 +233 92 -1.217424124188380e+02 +233 93 -1.347481526436476e+02 +233 94 -1.555580782497811e+02 +233 95 -1.851243485745372e+02 +233 96 -2.231981844606889e+02 +233 97 -2.663884709281895e+02 +233 98 -3.063876713483004e+02 +233 99 -3.311617365195742e+02 +233 370 -1.550121445008505e+03 +233 371 -1.344510568096307e+03 +233 372 -1.049909849375152e+03 +233 373 -7.788097592344268e+02 +233 374 -5.762343277298875e+02 +233 375 -4.404031329187421e+02 +233 376 -3.553280674768354e+02 +233 377 -3.063876713483004e+02 +233 378 -2.841326260213858e+02 +234 28 -5.468806044199793e+01 +234 29 -5.678028304808357e+01 +234 30 -6.102667800147356e+01 +234 31 -6.748412844494335e+01 +234 32 -7.605169906643890e+01 +234 33 -8.622296374516748e+01 +234 34 -9.681296068498868e+01 +234 35 -1.058870860464278e+02 +234 36 -1.112062130731024e+02 +234 91 -1.097534196790493e+02 +234 92 -1.155304899028561e+02 +234 93 -1.275984131219178e+02 +234 94 -1.468355065336025e+02 +234 95 -1.740274317161708e+02 +234 96 -2.088271183655455e+02 +234 97 -2.480403651673273e+02 +234 98 -2.841326260213859e+02 +234 99 -3.063876713483004e+02 +234 370 -1.802596433195449e+03 +234 371 -1.550121445008506e+03 +234 372 -1.193932486839835e+03 +234 373 -8.726231103602338e+02 +234 374 -6.371952057562397e+02 +234 375 -4.819366867771668e+02 +234 376 -3.859179776157598e+02 +234 377 -3.311617365195742e+02 +234 378 -3.063876713483002e+02 +235 172 -1.733190400658709e+03 +235 173 -1.877824568765015e+03 +235 174 -2.199157547087195e+03 +235 175 -2.767706810094291e+03 +235 176 -3.699147964795170e+03 +235 177 -5.136224430633847e+03 +235 178 -7.138491575686255e+03 +235 179 -9.405703259334579e+03 +235 180 -1.103972130715916e+04 +235 316 -1.733190400658708e+03 +235 317 -1.603684467943636e+03 +235 318 -1.394551574360513e+03 +235 319 -1.168677565678393e+03 +235 320 -9.695072463564451e+02 +235 321 -8.148024630667953e+02 +235 322 -7.058924559832880e+02 +235 323 -6.378158089920680e+02 +235 324 -6.052974323170214e+02 +235 343 -6.289529049931513e+02 +235 344 -5.970589583440833e+02 +235 345 -5.429674662554829e+02 +235 346 -4.803677035258846e+02 +235 347 -4.208084537187718e+02 +235 348 -3.710963518270340e+02 +235 349 -3.339204550667992e+02 +235 350 -3.096178268240468e+02 +235 351 -2.976873911031304e+02 +236 172 -1.603684467943635e+03 +236 173 -1.733190400658708e+03 +236 174 -2.019368486704433e+03 +236 175 -2.521021940438003e+03 +236 176 -3.331754877699590e+03 +236 177 -4.560278038130800e+03 +236 178 -6.235592529048589e+03 +236 179 -8.091232579773123e+03 +236 180 -9.405703259334579e+03 +236 316 -1.877824568765015e+03 +236 317 -1.733190400658710e+03 +236 318 -1.500725861549674e+03 +236 319 -1.251286952144483e+03 +236 320 -1.032880208377978e+03 +236 321 -8.643348602446098e+02 +236 322 -7.463158073460694e+02 +236 323 -6.728335244699305e+02 +236 324 -6.378158089920685e+02 +236 343 -6.632839990295108e+02 +236 344 -6.289529049931518e+02 +236 345 -5.708523475060545e+02 +236 346 -5.038180997021786e+02 +236 347 -4.402579127124384e+02 +236 348 -3.873813675510152e+02 +236 349 -3.479505460244112e+02 +236 350 -3.222285372305479e+02 +236 351 -3.096178268240470e+02 +237 172 -1.394551574360514e+03 +237 173 -1.500725861549674e+03 +237 174 -1.733190400658708e+03 +237 175 -2.134265778758331e+03 +237 176 -2.767706810094291e+03 +237 177 -3.699147964795170e+03 +237 178 -4.925216936196723e+03 +237 179 -6.235592529048589e+03 +237 180 -7.138491575686255e+03 +237 316 -2.199157547087195e+03 +237 317 -2.019368486704435e+03 +237 318 -1.733190400658708e+03 +237 319 -1.430197816180119e+03 +237 320 -1.168677565678393e+03 +237 321 -9.695072463564451e+02 +237 322 -8.315436028021828e+02 +237 323 -7.463158073460687e+02 +237 324 -7.058924559832880e+02 +237 343 -7.352796046183671e+02 +237 344 -6.956816209337401e+02 +237 345 -6.289529049931513e+02 +237 346 -5.524312223207843e+02 +237 347 -4.803677035258846e+02 +237 348 -4.208084537187718e+02 +237 349 -3.766415408901786e+02 +237 350 -3.479505460244110e+02 +237 351 -3.339204550667992e+02 +238 172 -1.168677565678394e+03 +238 173 -1.251286952144483e+03 +238 174 -1.430197816180119e+03 +238 175 -1.733190400658708e+03 +238 176 -2.199157547087195e+03 +238 177 -2.861294172280330e+03 +238 178 -3.699147964795170e+03 +238 179 -4.560278038130800e+03 +238 180 -5.136224430633847e+03 +238 316 -2.767706810094291e+03 +238 317 -2.521021940438006e+03 +238 318 -2.134265778758331e+03 +238 319 -1.733190400658708e+03 +238 320 -1.394551574360513e+03 +238 321 -1.141773184361047e+03 +238 322 -9.695072463564451e+02 +238 323 -8.643348602446090e+02 +238 324 -8.148024630667953e+02 +238 343 -8.507888885505199e+02 +238 344 -8.023274760830689e+02 +238 345 -7.211778000851810e+02 +238 346 -6.289529049931513e+02 +238 347 -5.429674662554829e+02 +238 348 -4.725808574370898e+02 +238 349 -4.208084537187718e+02 +238 350 -3.873813675510149e+02 +238 351 -3.710963518270340e+02 +239 172 -9.695072463564453e+02 +239 173 -1.032880208377978e+03 +239 174 -1.168677565678393e+03 +239 175 -1.394551574360513e+03 +239 176 -1.733190400658708e+03 +239 177 -2.199157547087195e+03 +239 178 -2.767706810094291e+03 +239 179 -3.331754877699590e+03 +239 180 -3.699147964795170e+03 +239 316 -3.699147964795170e+03 +239 317 -3.331754877699595e+03 +239 318 -2.767706810094291e+03 +239 319 -2.199157547087195e+03 +239 320 -1.733190400658708e+03 +239 321 -1.394551574360513e+03 +239 322 -1.168677565678393e+03 +239 323 -1.032880208377977e+03 +239 324 -9.695072463564451e+02 +239 343 -1.015511306612465e+03 +239 344 -9.536070604341750e+02 +239 345 -8.507888885505199e+02 +239 346 -7.352796046183671e+02 +239 347 -6.289529049931513e+02 +239 348 -5.429674662554829e+02 +239 349 -4.803677035258846e+02 +239 350 -4.402579127124382e+02 +239 351 -4.208084537187718e+02 +240 172 -8.148024630667954e+02 +240 173 -8.643348602446098e+02 +240 174 -9.695072463564451e+02 +240 175 -1.141773184361047e+03 +240 176 -1.394551574360513e+03 +240 177 -1.733190400658708e+03 +240 178 -2.134265778758331e+03 +240 179 -2.521021940438003e+03 +240 180 -2.767706810094291e+03 +240 316 -5.136224430633847e+03 +240 317 -4.560278038130808e+03 +240 318 -3.699147964795170e+03 +240 319 -2.861294172280330e+03 +240 320 -2.199157547087195e+03 +240 321 -1.733190400658708e+03 +240 322 -1.430197816180119e+03 +240 323 -1.251286952144482e+03 +240 324 -1.168677565678393e+03 +240 343 -1.228588660544048e+03 +240 344 -1.148042053110078e+03 +240 345 -1.015511306612465e+03 +240 346 -8.685786765383772e+02 +240 347 -7.352796046183671e+02 +240 348 -6.289529049931513e+02 +240 349 -5.524312223207843e+02 +240 350 -5.038180997021782e+02 +240 351 -4.803677035258846e+02 +241 172 -7.058924559832883e+02 +241 173 -7.463158073460694e+02 +241 174 -8.315436028021828e+02 +241 175 -9.695072463564451e+02 +241 176 -1.168677565678393e+03 +241 177 -1.430197816180119e+03 +241 178 -1.733190400658708e+03 +241 179 -2.019368486704433e+03 +241 180 -2.199157547087195e+03 +241 316 -7.138491575686255e+03 +241 317 -6.235592529048601e+03 +241 318 -4.925216936196723e+03 +241 319 -3.699147964795170e+03 +241 320 -2.767706810094291e+03 +241 321 -2.134265778758331e+03 +241 322 -1.733190400658708e+03 +241 323 -1.500725861549673e+03 +241 324 -1.394551574360513e+03 +241 343 -1.471477730866024e+03 +241 344 -1.368148367306964e+03 +241 345 -1.199743197084304e+03 +241 346 -1.015511306612465e+03 +241 347 -8.507888885505199e+02 +241 348 -7.211778000851810e+02 +241 349 -6.289529049931513e+02 +241 350 -5.708523475060541e+02 +241 351 -5.429674662554829e+02 +242 172 -6.378158089920688e+02 +242 173 -6.728335244699310e+02 +242 174 -7.463158073460694e+02 +242 175 -8.643348602446098e+02 +242 176 -1.032880208377978e+03 +242 177 -1.251286952144483e+03 +242 178 -1.500725861549674e+03 +242 179 -1.733190400658708e+03 +242 180 -1.877824568765015e+03 +242 316 -9.405703259334579e+03 +242 317 -8.091232579773138e+03 +242 318 -6.235592529048589e+03 +242 319 -4.560278038130800e+03 +242 320 -3.331754877699590e+03 +242 321 -2.521021940438003e+03 +242 322 -2.019368486704433e+03 +242 323 -1.733190400658706e+03 +242 324 -1.603684467943634e+03 +242 343 -1.697437739078444e+03 +242 344 -1.571600895131402e+03 +242 345 -1.368148367306962e+03 +242 346 -1.148042053110077e+03 +242 347 -9.536070604341742e+02 +242 348 -8.023274760830682e+02 +242 349 -6.956816209337395e+02 +242 350 -6.289529049931509e+02 +242 351 -5.970589583440830e+02 +243 172 -6.052974323170215e+02 +243 173 -6.378158089920685e+02 +243 174 -7.058924559832880e+02 +243 175 -8.148024630667953e+02 +243 176 -9.695072463564451e+02 +243 177 -1.168677565678393e+03 +243 178 -1.394551574360513e+03 +243 179 -1.603684467943634e+03 +243 180 -1.733190400658708e+03 +243 316 -1.103972130715916e+04 +243 317 -9.405703259334599e+03 +243 318 -7.138491575686255e+03 +243 319 -5.136224430633847e+03 +243 320 -3.699147964795170e+03 +243 321 -2.767706810094291e+03 +243 322 -2.199157547087195e+03 +243 323 -1.877824568765012e+03 +243 324 -1.733190400658708e+03 +243 343 -1.837845240586531e+03 +243 344 -1.697437739078445e+03 +243 345 -1.471477730866024e+03 +243 346 -1.228588660544048e+03 +243 347 -1.015511306612465e+03 +243 348 -8.507888885505199e+02 +243 349 -7.352796046183671e+02 +243 350 -6.632839990295103e+02 +243 351 -6.289529049931513e+02 +262 172 -6.289529049931516e+02 +262 173 -6.632839990295108e+02 +262 174 -7.352796046183671e+02 +262 175 -8.507888885505199e+02 +262 176 -1.015511306612465e+03 +262 177 -1.228588660544048e+03 +262 178 -1.471477730866024e+03 +262 179 -1.697437739078444e+03 +262 180 -1.837845240586531e+03 +262 199 -1.733190400658708e+03 +262 200 -1.877824568765015e+03 +262 201 -2.199157547087195e+03 +262 202 -2.767706810094291e+03 +262 203 -3.699147964795170e+03 +262 204 -5.136224430633847e+03 +262 205 -7.138491575686255e+03 +262 206 -9.405703259334579e+03 +262 207 -1.103972130715916e+04 +262 343 -1.733190400658708e+03 +262 344 -1.603684467943636e+03 +262 345 -1.394551574360513e+03 +262 346 -1.168677565678393e+03 +262 347 -9.695072463564451e+02 +262 348 -8.148024630667953e+02 +262 349 -7.058924559832880e+02 +262 350 -6.378158089920680e+02 +262 351 -6.052974323170214e+02 +263 172 -5.970589583440832e+02 +263 173 -6.289529049931513e+02 +263 174 -6.956816209337395e+02 +263 175 -8.023274760830682e+02 +263 176 -9.536070604341742e+02 +263 177 -1.148042053110077e+03 +263 178 -1.368148367306962e+03 +263 179 -1.571600895131401e+03 +263 180 -1.697437739078444e+03 +263 199 -1.603684467943634e+03 +263 200 -1.733190400658708e+03 +263 201 -2.019368486704433e+03 +263 202 -2.521021940438003e+03 +263 203 -3.331754877699590e+03 +263 204 -4.560278038130800e+03 +263 205 -6.235592529048589e+03 +263 206 -8.091232579773123e+03 +263 207 -9.405703259334579e+03 +263 343 -1.877824568765015e+03 +263 344 -1.733190400658710e+03 +263 345 -1.500725861549674e+03 +263 346 -1.251286952144483e+03 +263 347 -1.032880208377978e+03 +263 348 -8.643348602446098e+02 +263 349 -7.463158073460694e+02 +263 350 -6.728335244699305e+02 +263 351 -6.378158089920685e+02 +264 172 -5.429674662554831e+02 +264 173 -5.708523475060545e+02 +264 174 -6.289529049931513e+02 +264 175 -7.211778000851810e+02 +264 176 -8.507888885505199e+02 +264 177 -1.015511306612465e+03 +264 178 -1.199743197084304e+03 +264 179 -1.368148367306962e+03 +264 180 -1.471477730866024e+03 +264 199 -1.394551574360513e+03 +264 200 -1.500725861549674e+03 +264 201 -1.733190400658708e+03 +264 202 -2.134265778758331e+03 +264 203 -2.767706810094291e+03 +264 204 -3.699147964795170e+03 +264 205 -4.925216936196723e+03 +264 206 -6.235592529048589e+03 +264 207 -7.138491575686255e+03 +264 343 -2.199157547087195e+03 +264 344 -2.019368486704435e+03 +264 345 -1.733190400658708e+03 +264 346 -1.430197816180119e+03 +264 347 -1.168677565678393e+03 +264 348 -9.695072463564451e+02 +264 349 -8.315436028021828e+02 +264 350 -7.463158073460687e+02 +264 351 -7.058924559832880e+02 +265 172 -4.803677035258847e+02 +265 173 -5.038180997021786e+02 +265 174 -5.524312223207843e+02 +265 175 -6.289529049931513e+02 +265 176 -7.352796046183671e+02 +265 177 -8.685786765383772e+02 +265 178 -1.015511306612465e+03 +265 179 -1.148042053110077e+03 +265 180 -1.228588660544048e+03 +265 199 -1.168677565678393e+03 +265 200 -1.251286952144483e+03 +265 201 -1.430197816180119e+03 +265 202 -1.733190400658708e+03 +265 203 -2.199157547087195e+03 +265 204 -2.861294172280330e+03 +265 205 -3.699147964795170e+03 +265 206 -4.560278038130800e+03 +265 207 -5.136224430633847e+03 +265 343 -2.767706810094291e+03 +265 344 -2.521021940438006e+03 +265 345 -2.134265778758331e+03 +265 346 -1.733190400658708e+03 +265 347 -1.394551574360513e+03 +265 348 -1.141773184361047e+03 +265 349 -9.695072463564451e+02 +265 350 -8.643348602446090e+02 +265 351 -8.148024630667953e+02 +266 172 -4.208084537187719e+02 +266 173 -4.402579127124384e+02 +266 174 -4.803677035258846e+02 +266 175 -5.429674662554829e+02 +266 176 -6.289529049931513e+02 +266 177 -7.352796046183671e+02 +266 178 -8.507888885505199e+02 +266 179 -9.536070604341742e+02 +266 180 -1.015511306612465e+03 +266 199 -9.695072463564451e+02 +266 200 -1.032880208377978e+03 +266 201 -1.168677565678393e+03 +266 202 -1.394551574360513e+03 +266 203 -1.733190400658708e+03 +266 204 -2.199157547087195e+03 +266 205 -2.767706810094291e+03 +266 206 -3.331754877699590e+03 +266 207 -3.699147964795170e+03 +266 343 -3.699147964795170e+03 +266 344 -3.331754877699595e+03 +266 345 -2.767706810094291e+03 +266 346 -2.199157547087195e+03 +266 347 -1.733190400658708e+03 +266 348 -1.394551574360513e+03 +266 349 -1.168677565678393e+03 +266 350 -1.032880208377977e+03 +266 351 -9.695072463564451e+02 +267 172 -3.710963518270341e+02 +267 173 -3.873813675510152e+02 +267 174 -4.208084537187718e+02 +267 175 -4.725808574370898e+02 +267 176 -5.429674662554829e+02 +267 177 -6.289529049931513e+02 +267 178 -7.211778000851810e+02 +267 179 -8.023274760830682e+02 +267 180 -8.507888885505199e+02 +267 199 -8.148024630667953e+02 +267 200 -8.643348602446098e+02 +267 201 -9.695072463564451e+02 +267 202 -1.141773184361047e+03 +267 203 -1.394551574360513e+03 +267 204 -1.733190400658708e+03 +267 205 -2.134265778758331e+03 +267 206 -2.521021940438003e+03 +267 207 -2.767706810094291e+03 +267 343 -5.136224430633847e+03 +267 344 -4.560278038130808e+03 +267 345 -3.699147964795170e+03 +267 346 -2.861294172280330e+03 +267 347 -2.199157547087195e+03 +267 348 -1.733190400658708e+03 +267 349 -1.430197816180119e+03 +267 350 -1.251286952144482e+03 +267 351 -1.168677565678393e+03 +268 172 -3.339204550667993e+02 +268 173 -3.479505460244112e+02 +268 174 -3.766415408901786e+02 +268 175 -4.208084537187718e+02 +268 176 -4.803677035258846e+02 +268 177 -5.524312223207843e+02 +268 178 -6.289529049931513e+02 +268 179 -6.956816209337395e+02 +268 180 -7.352796046183671e+02 +268 199 -7.058924559832880e+02 +268 200 -7.463158073460694e+02 +268 201 -8.315436028021828e+02 +268 202 -9.695072463564451e+02 +268 203 -1.168677565678393e+03 +268 204 -1.430197816180119e+03 +268 205 -1.733190400658708e+03 +268 206 -2.019368486704433e+03 +268 207 -2.199157547087195e+03 +268 343 -7.138491575686255e+03 +268 344 -6.235592529048601e+03 +268 345 -4.925216936196723e+03 +268 346 -3.699147964795170e+03 +268 347 -2.767706810094291e+03 +268 348 -2.134265778758331e+03 +268 349 -1.733190400658708e+03 +268 350 -1.500725861549673e+03 +268 351 -1.394551574360513e+03 +269 172 -3.096178268240471e+02 +269 173 -3.222285372305481e+02 +269 174 -3.479505460244112e+02 +269 175 -3.873813675510152e+02 +269 176 -4.402579127124384e+02 +269 177 -5.038180997021786e+02 +269 178 -5.708523475060545e+02 +269 179 -6.289529049931513e+02 +269 180 -6.632839990295108e+02 +269 199 -6.378158089920685e+02 +269 200 -6.728335244699310e+02 +269 201 -7.463158073460694e+02 +269 202 -8.643348602446098e+02 +269 203 -1.032880208377978e+03 +269 204 -1.251286952144483e+03 +269 205 -1.500725861549674e+03 +269 206 -1.733190400658708e+03 +269 207 -1.877824568765015e+03 +269 343 -9.405703259334579e+03 +269 344 -8.091232579773138e+03 +269 345 -6.235592529048589e+03 +269 346 -4.560278038130800e+03 +269 347 -3.331754877699590e+03 +269 348 -2.521021940438003e+03 +269 349 -2.019368486704433e+03 +269 350 -1.733190400658706e+03 +269 351 -1.603684467943634e+03 +270 172 -2.976873911031304e+02 +270 173 -3.096178268240470e+02 +270 174 -3.339204550667992e+02 +270 175 -3.710963518270340e+02 +270 176 -4.208084537187718e+02 +270 177 -4.803677035258846e+02 +270 178 -5.429674662554829e+02 +270 179 -5.970589583440830e+02 +270 180 -6.289529049931513e+02 +270 199 -6.052974323170214e+02 +270 200 -6.378158089920685e+02 +270 201 -7.058924559832880e+02 +270 202 -8.148024630667953e+02 +270 203 -9.695072463564451e+02 +270 204 -1.168677565678393e+03 +270 205 -1.394551574360513e+03 +270 206 -1.603684467943634e+03 +270 207 -1.733190400658708e+03 +270 343 -1.103972130715916e+04 +270 344 -9.405703259334599e+03 +270 345 -7.138491575686255e+03 +270 346 -5.136224430633847e+03 +270 347 -3.699147964795170e+03 +270 348 -2.767706810094291e+03 +270 349 -2.199157547087195e+03 +270 350 -1.877824568765012e+03 +270 351 -1.733190400658708e+03 +289 856 -9.574614729634387e+00 +289 857 -8.894152732809218e+00 +289 858 -7.787064219095077e+00 +289 859 -6.578858018778782e+00 +289 860 -5.501432160761325e+00 +289 861 -4.655741575368515e+00 +289 862 -4.055212971361418e+00 +289 863 -3.677452266447852e+00 +289 864 -3.496313214985748e+00 +290 856 -1.033025206259608e+01 +290 857 -9.574614729634389e+00 +290 858 -8.350436340807194e+00 +290 859 -7.022334130042162e+00 +290 860 -5.845568772761844e+00 +290 861 -4.927408805516033e+00 +290 862 -4.278637194083233e+00 +290 863 -3.872006983680972e+00 +290 864 -3.677452266447854e+00 +291 856 -1.199392684783545e+01 +291 857 -1.106556701616915e+01 +291 858 -9.574614729634387e+00 +291 859 -7.976517934049897e+00 +291 860 -6.578858018778782e+00 +291 861 -5.501432160761325e+00 +291 862 -4.747658828821052e+00 +291 863 -4.278637194083233e+00 +291 864 -4.055212971361418e+00 +292 856 -1.489187979900571e+01 +292 857 -1.364121235299754e+01 +292 858 -1.165955788548229e+01 +292 859 -9.574614729634387e+00 +292 860 -7.787064219095077e+00 +292 861 -6.434009698761963e+00 +292 862 -5.501432160761325e+00 +292 863 -4.927408805516033e+00 +292 864 -4.655741575368515e+00 +293 856 -1.953249673072867e+01 +293 857 -1.771654764348815e+01 +293 858 -1.489187979900571e+01 +293 859 -1.199392684783545e+01 +293 860 -9.574614729634387e+00 +293 861 -7.787064219095077e+00 +293 862 -6.578858018778782e+00 +293 863 -5.845568772761842e+00 +293 864 -5.501432160761325e+00 +294 856 -2.648026715992624e+01 +294 857 -2.372339702886329e+01 +294 858 -1.953249673072867e+01 +294 859 -1.536382589350013e+01 +294 860 -1.199392684783545e+01 +294 861 -9.574614729634387e+00 +294 862 -7.976517934049897e+00 +294 863 -7.022334130042162e+00 +294 864 -6.578858018778782e+00 +295 856 -3.582072268161383e+01 +295 857 -3.165228467591599e+01 +295 858 -2.547425580969110e+01 +295 859 -1.953249673072867e+01 +295 860 -1.489187979900571e+01 +295 861 -1.165955788548229e+01 +295 862 -9.574614729634387e+00 +295 863 -8.350436340807194e+00 +295 864 -7.787064219095077e+00 +296 856 -4.601776203532707e+01 +296 857 -4.014998583800271e+01 +296 858 -3.165228467591599e+01 +296 859 -2.372339702886329e+01 +296 860 -1.771654764348815e+01 +296 861 -1.364121235299754e+01 +296 862 -1.106556701616915e+01 +296 863 -9.574614729634387e+00 +296 864 -8.894152732809218e+00 +297 856 -5.316004558269722e+01 +297 857 -4.601776203532707e+01 +297 858 -3.582072268161383e+01 +297 859 -2.648026715992624e+01 +297 860 -1.953249673072867e+01 +297 861 -1.489187979900571e+01 +297 862 -1.199392684783545e+01 +297 863 -1.033025206259608e+01 +297 864 -9.574614729634387e+00 +298 19 -5.522643130536942e+01 +298 20 -5.958495730566376e+01 +298 21 -6.918105714127374e+01 +298 22 -8.589649687269581e+01 +298 23 -1.126636644081421e+02 +298 24 -1.527385643115993e+02 +298 25 -2.066145692548484e+02 +298 26 -2.654314201109839e+02 +298 27 -3.066283666510955e+02 +298 586 -5.416220002058462e+01 +298 587 -5.028460369863168e+01 +298 588 -4.398263164573861e+01 +298 589 -3.711530555640484e+01 +298 590 -3.100122392289862e+01 +298 591 -2.620940698061743e+01 +298 592 -2.281096793104269e+01 +298 593 -2.067515029553632e+01 +298 594 -1.965157861598589e+01 +298 721 -1.965477828103597e+01 +298 722 -1.870055440211150e+01 +298 723 -1.707507926940497e+01 +298 724 -1.518203609416467e+01 +298 725 -1.336813651340294e+01 +298 726 -1.184372960400065e+01 +298 727 -1.069703031088084e+01 +298 728 -9.944085360683061e+00 +298 729 -9.573445684409064e+00 +299 19 -5.124333316670127e+01 +299 20 -5.516192177004281e+01 +299 21 -6.374726972360534e+01 +299 22 -7.857675058311507e+01 +299 23 -1.020365870824703e+02 +299 24 -1.366071776948801e+02 +299 25 -1.822270203368904e+02 +299 26 -2.311062255032451e+02 +299 27 -2.648508681185572e+02 +299 586 -5.847168336242218e+01 +299 587 -5.416220002058462e+01 +299 588 -4.718848846240642e+01 +299 589 -3.963467701820886e+01 +299 590 -3.295302401855845e+01 +299 591 -2.774798050936781e+01 +299 592 -2.407490908992508e+01 +299 593 -2.177494503977683e+01 +299 594 -2.067515029553633e+01 +299 721 -2.067858569511584e+01 +299 722 -1.965477828103598e+01 +299 723 -1.791417887437395e+01 +299 724 -1.589274010473517e+01 +299 725 -1.396191802264486e+01 +299 726 -1.234420052045070e+01 +299 727 -1.113049648221347e+01 +299 728 -1.033512964800000e+01 +299 729 -9.944085360683063e+00 +300 19 -4.477692267878420e+01 +300 20 -4.801219971282303e+01 +300 21 -5.504096863216979e+01 +300 22 -6.700809257675368e+01 +300 23 -8.555244891615339e+01 +300 24 -1.121608460588695e+02 +300 25 -1.462068441840802e+02 +300 26 -1.815831901601255e+02 +300 27 -2.054403037140962e+02 +300 586 -6.797204698756194e+01 +300 587 -6.266865647386100e+01 +300 588 -5.416220002058459e+01 +300 589 -4.506046026496939e+01 +300 590 -3.711530555640484e+01 +300 591 -3.100122392289862e+01 +300 592 -2.672989532903559e+01 +300 593 -2.407490908992507e+01 +300 594 -2.281096793104269e+01 +300 721 -2.281491025526308e+01 +300 722 -2.164167292784032e+01 +300 723 -1.965477828103597e+01 +300 724 -1.736013665098131e+01 +300 725 -1.518203609416467e+01 +300 726 -1.336813651340294e+01 +300 727 -1.201426721054982e+01 +300 728 -1.113049648221347e+01 +300 729 -1.069703031088084e+01 +301 19 -3.774105602429018e+01 +301 20 -4.027937103023840e+01 +301 21 -4.573913998629141e+01 +301 22 -5.487859524413308e+01 +301 23 -6.870443946573934e+01 +301 24 -8.794493030534279e+01 +301 25 -1.117212673918284e+02 +301 26 -1.356003110667490e+02 +301 27 -1.512966646837479e+02 +301 586 -8.455751811576003e+01 +301 587 -7.739429142416689e+01 +301 588 -6.606134132672688e+01 +301 589 -5.416220002058462e+01 +301 590 -4.398263164573862e+01 +301 591 -3.629276779865594e+01 +301 592 -3.100122392289864e+01 +301 593 -2.774798050936781e+01 +301 594 -2.620940698061744e+01 +301 721 -2.621419542240645e+01 +301 722 -2.479209926714915e+01 +301 723 -2.239757409043196e+01 +301 724 -1.965477828103598e+01 +301 725 -1.707507926940498e+01 +301 726 -1.494561758129199e+01 +301 727 -1.336813651340294e+01 +301 728 -1.234420052045070e+01 +301 729 -1.184372960400065e+01 +302 19 -3.148718617288097e+01 +302 20 -3.345047556908959e+01 +302 21 -3.763217937951340e+01 +302 22 -4.451750529325304e+01 +302 23 -5.469476477230946e+01 +302 24 -6.845270874373485e+01 +302 25 -8.491105099838946e+01 +302 26 -1.009332528608720e+02 +302 27 -1.112243222529277e+02 +302 586 -1.112023202068744e+02 +302 587 -1.007640600234616e+02 +302 588 -8.455751811575999e+01 +302 589 -6.797204698756194e+01 +302 590 -5.416220002058462e+01 +302 591 -4.398263164573862e+01 +302 592 -3.711530555640486e+01 +302 593 -3.295302401855845e+01 +302 594 -3.100122392289864e+01 +302 721 -3.100728135248165e+01 +302 722 -2.921308657465229e+01 +302 723 -2.621419542240645e+01 +302 724 -2.281491025526309e+01 +302 725 -1.965477828103598e+01 +302 726 -1.707507926940498e+01 +302 727 -1.518203609416467e+01 +302 728 -1.396191802264486e+01 +302 729 -1.336813651340294e+01 +303 19 -2.659329425858586e+01 +303 20 -2.813874702670443e+01 +303 21 -3.140268868468856e+01 +303 22 -3.670121207176243e+01 +303 23 -4.438032924384423e+01 +303 24 -5.451179525147976e+01 +303 25 -6.631150465440314e+01 +303 26 -7.751121321005053e+01 +303 27 -8.457251187584423e+01 +303 586 -1.512628164030904e+02 +303 587 -1.353445496343034e+02 +303 588 -1.112023202068744e+02 +303 589 -8.726265053974943e+01 +303 590 -6.797204698756194e+01 +303 591 -5.416220002058462e+01 +303 592 -4.506046026496942e+01 +303 593 -3.963467701820886e+01 +303 594 -3.711530555640486e+01 +303 721 -3.712309913086534e+01 +303 722 -3.482168460593338e+01 +303 723 -3.100728135248165e+01 +303 724 -2.673481743251408e+01 +303 725 -2.281491025526309e+01 +303 726 -1.965477828103598e+01 +303 727 -1.736013665098131e+01 +303 728 -1.589274010473517e+01 +303 729 -1.518203609416467e+01 +304 19 -2.312685000863098e+01 +304 20 -2.439505521678533e+01 +304 21 -2.705594756469628e+01 +304 22 -3.132864493944531e+01 +304 23 -3.742874483001901e+01 +304 24 -4.533058573402736e+01 +304 25 -5.435160189645630e+01 +304 26 -6.275565989096646e+01 +304 27 -6.798309172560241e+01 +304 586 -2.053883607687487e+02 +304 587 -1.811983282511272e+02 +304 588 -1.454508347890306e+02 +304 589 -1.112023202068744e+02 +304 590 -8.455751811575999e+01 +304 591 -6.606134132672688e+01 +304 592 -5.416220002058462e+01 +304 593 -4.718848846240642e+01 +304 594 -4.398263164573862e+01 +304 721 -4.399251628020362e+01 +304 722 -4.108257963331432e+01 +304 723 -3.630032063351617e+01 +304 724 -3.100728135248165e+01 +304 725 -2.621419542240645e+01 +304 726 -2.239757409043196e+01 +304 727 -1.965477828103598e+01 +304 728 -1.791417887437395e+01 +304 729 -1.707507926940498e+01 +305 19 -2.095031331575352e+01 +305 20 -2.205300529587110e+01 +305 21 -2.435644250991363e+01 +305 22 -2.802824052759152e+01 +305 23 -3.321830948822916e+01 +305 24 -3.986034298205158e+01 +305 25 -4.734463162469855e+01 +305 26 -5.423312785043374e+01 +305 27 -5.848062905316222e+01 +305 586 -2.647767438527633e+02 +305 587 -2.305668762810884e+02 +305 588 -1.811983282511272e+02 +305 589 -1.353445496343034e+02 +305 590 -1.007640600234616e+02 +305 591 -7.739429142416689e+01 +305 592 -6.266865647386102e+01 +305 593 -5.416220002058462e+01 +305 594 -5.028460369863171e+01 +305 721 -5.029652653878190e+01 +305 722 -4.679557686118159e+01 +305 723 -4.108257963331432e+01 +305 724 -3.482168460593338e+01 +305 725 -2.921308657465229e+01 +305 726 -2.479209926714915e+01 +305 727 -2.164167292784033e+01 +305 728 -1.965477828103598e+01 +305 729 -1.870055440211151e+01 +306 19 -1.990781288876159e+01 +306 20 -2.093370219102624e+01 +306 21 -2.307198262201355e+01 +306 22 -2.646811396827297e+01 +306 23 -3.124474216775443e+01 +306 24 -3.732112672456255e+01 +306 25 -4.412411921265567e+01 +306 26 -5.034852406404291e+01 +306 27 -5.417023645596455e+01 +306 586 -3.065373731090124e+02 +306 587 -2.647767438527633e+02 +306 588 -2.053883607687487e+02 +306 589 -1.512628164030904e+02 +306 590 -1.112023202068744e+02 +306 591 -8.455751811576003e+01 +306 592 -6.797204698756197e+01 +306 593 -5.847168336242218e+01 +306 594 -5.416220002058465e+01 +306 721 -5.417542964960963e+01 +306 722 -5.029652653878193e+01 +306 723 -4.399251628020364e+01 +306 724 -3.712309913086536e+01 +306 725 -3.100728135248166e+01 +306 726 -2.621419542240646e+01 +306 727 -2.281491025526310e+01 +306 728 -2.067858569511585e+01 +306 729 -1.965477828103599e+01 +307 163 -3.063876713483004e+02 +307 164 -3.311617365195742e+02 +307 165 -3.859179776157598e+02 +307 166 -4.819366867771671e+02 +307 167 -6.371952057562397e+02 +307 168 -8.726231103602338e+02 +307 169 -1.193932486839835e+03 +307 170 -1.550121445008506e+03 +307 171 -1.802596433195452e+03 +307 442 -3.063876713483002e+02 +307 443 -2.841326260213859e+02 +307 444 -2.480403651673274e+02 +307 445 -2.088271183655456e+02 +307 446 -1.740274317161708e+02 +307 447 -1.468355065336025e+02 +307 448 -1.275984131219178e+02 +307 449 -1.155304899028561e+02 +307 450 -1.097534196790493e+02 +307 505 -1.111842160419089e+02 +307 506 -1.057061586526019e+02 +307 507 -9.638822517401599e+01 +307 508 -8.555928471614153e+01 +307 509 -7.520762033775922e+01 +307 510 -6.652797451218331e+01 +307 511 -6.001174723167333e+01 +307 512 -5.573941364116938e+01 +307 513 -5.363826960242956e+01 +308 163 -2.841326260213859e+02 +308 164 -3.063876713483004e+02 +308 165 -3.553280674768354e+02 +308 166 -4.404031329187425e+02 +308 167 -5.762343277298875e+02 +308 168 -7.788097592344268e+02 +308 169 -1.049909849375152e+03 +308 170 -1.344510568096307e+03 +308 171 -1.550121445008506e+03 +308 442 -3.311617365195740e+02 +308 443 -3.063876713483004e+02 +308 444 -2.663884709281895e+02 +308 445 -2.231981844606889e+02 +308 446 -1.851243485745372e+02 +308 447 -1.555580782497810e+02 +308 448 -1.347481526436476e+02 +308 449 -1.217424124188380e+02 +308 450 -1.155304899028560e+02 +308 505 -1.170681125153374e+02 +308 506 -1.111842160419089e+02 +308 507 -1.011961191083175e+02 +308 508 -8.962181586287879e+01 +308 509 -7.859349409841366e+01 +308 510 -6.937545782864687e+01 +308 511 -6.247361649834816e+01 +308 512 -5.795761808209195e+01 +308 513 -5.573941364116936e+01 +309 163 -2.480403651673274e+02 +309 164 -2.663884709281895e+02 +309 165 -3.063876713483004e+02 +309 166 -3.748904053829397e+02 +309 167 -4.819366867771671e+02 +309 168 -6.371952057562402e+02 +309 169 -8.383319685358463e+02 +309 170 -1.049909849375152e+03 +309 171 -1.193932486839835e+03 +309 442 -3.859179776157595e+02 +309 443 -3.553280674768354e+02 +309 444 -3.063876713483004e+02 +309 445 -2.542062119667733e+02 +309 446 -2.088271183655455e+02 +309 447 -1.740274317161707e+02 +309 448 -1.497853840269158e+02 +309 449 -1.347481526436476e+02 +309 450 -1.275984131219178e+02 +309 505 -1.293661657908650e+02 +309 506 -1.226088998409724e+02 +309 507 -1.111842160419089e+02 +309 508 -9.802102195827709e+01 +309 509 -8.555928471614152e+01 +309 510 -7.520762033775921e+01 +309 511 -6.749803222962944e+01 +309 512 -6.247361649834816e+01 +309 513 -6.001174723167332e+01 +310 163 -2.088271183655456e+02 +310 164 -2.231981844606889e+02 +310 165 -2.542062119667733e+02 +310 166 -3.063876713483005e+02 +310 167 -3.859179776157600e+02 +310 168 -4.976453857371593e+02 +310 169 -6.371952057562402e+02 +310 170 -7.788097592344268e+02 +310 171 -8.726231103602338e+02 +310 442 -4.819366867771664e+02 +310 443 -4.404031329187421e+02 +310 444 -3.748904053829394e+02 +310 445 -3.063876713483004e+02 +310 446 -2.480403651673273e+02 +310 447 -2.041390437321797e+02 +310 448 -1.740274317161707e+02 +310 449 -1.555580782497810e+02 +310 450 -1.468355065336024e+02 +310 505 -1.489885081652992e+02 +310 506 -1.407716848553630e+02 +310 507 -1.269615920628683e+02 +310 508 -1.111842160419089e+02 +310 509 -9.638822517401596e+01 +310 510 -8.420868002944914e+01 +310 511 -7.520762033775921e+01 +310 512 -6.937545782864687e+01 +310 513 -6.652797451218328e+01 +311 163 -1.740274317161708e+02 +311 164 -1.851243485745372e+02 +311 165 -2.088271183655455e+02 +311 166 -2.480403651673274e+02 +311 167 -3.063876713483004e+02 +311 168 -3.859179776157600e+02 +311 169 -4.819366867771671e+02 +311 170 -5.762343277298875e+02 +311 171 -6.371952057562397e+02 +311 442 -6.371952057562393e+02 +311 443 -5.762343277298875e+02 +311 444 -4.819366867771671e+02 +311 445 -3.859179776157600e+02 +311 446 -3.063876713483004e+02 +311 447 -2.480403651673273e+02 +311 448 -2.088271183655455e+02 +311 449 -1.851243485745372e+02 +311 450 -1.740274317161707e+02 +311 505 -1.767605489846855e+02 +311 506 -1.663510232448634e+02 +311 507 -1.489885081652993e+02 +311 508 -1.293661657908651e+02 +311 509 -1.111842160419089e+02 +311 510 -9.638822517401596e+01 +311 511 -8.555928471614152e+01 +311 512 -7.859349409841366e+01 +311 513 -7.520762033775921e+01 +312 163 -1.468355065336025e+02 +312 164 -1.555580782497810e+02 +312 165 -1.740274317161707e+02 +312 166 -2.041390437321798e+02 +312 167 -2.480403651673273e+02 +312 168 -3.063876713483004e+02 +312 169 -3.748904053829394e+02 +312 170 -4.404031329187421e+02 +312 171 -4.819366867771668e+02 +312 442 -8.726231103602329e+02 +312 443 -7.788097592344268e+02 +312 444 -6.371952057562402e+02 +312 445 -4.976453857371593e+02 +312 446 -3.859179776157600e+02 +312 447 -3.063876713483004e+02 +312 448 -2.542062119667733e+02 +312 449 -2.231981844606889e+02 +312 450 -2.088271183655455e+02 +312 505 -2.123577731150844e+02 +312 506 -1.989422168423268e+02 +312 507 -1.767605489846857e+02 +312 508 -1.519993633210927e+02 +312 509 -1.293661657908651e+02 +312 510 -1.111842160419089e+02 +312 511 -9.802102195827709e+01 +312 512 -8.962181586287879e+01 +312 513 -8.555928471614152e+01 +313 163 -1.275984131219178e+02 +313 164 -1.347481526436476e+02 +313 165 -1.497853840269158e+02 +313 166 -1.740274317161708e+02 +313 167 -2.088271183655455e+02 +313 168 -2.542062119667733e+02 +313 169 -3.063876713483004e+02 +313 170 -3.553280674768354e+02 +313 171 -3.859179776157598e+02 +313 442 -1.193932486839834e+03 +313 443 -1.049909849375152e+03 +313 444 -8.383319685358463e+02 +313 445 -6.371952057562402e+02 +313 446 -4.819366867771671e+02 +313 447 -3.748904053829394e+02 +313 448 -3.063876713483004e+02 +313 449 -2.663884709281895e+02 +313 450 -2.480403651673273e+02 +313 505 -2.525366109215767e+02 +313 506 -2.354925657825778e+02 +313 507 -2.075588680195233e+02 +313 508 -1.767605489846857e+02 +313 509 -1.489885081652993e+02 +313 510 -1.269615920628683e+02 +313 511 -1.111842160419089e+02 +313 512 -1.011961191083175e+02 +313 513 -9.638822517401596e+01 +314 163 -1.155304899028561e+02 +314 164 -1.217424124188380e+02 +314 165 -1.347481526436476e+02 +314 166 -1.555580782497811e+02 +314 167 -1.851243485745372e+02 +314 168 -2.231981844606889e+02 +314 169 -2.663884709281895e+02 +314 170 -3.063876713483004e+02 +314 171 -3.311617365195742e+02 +314 442 -1.550121445008505e+03 +314 443 -1.344510568096307e+03 +314 444 -1.049909849375152e+03 +314 445 -7.788097592344268e+02 +314 446 -5.762343277298875e+02 +314 447 -4.404031329187421e+02 +314 448 -3.553280674768354e+02 +314 449 -3.063876713483004e+02 +314 450 -2.841326260213858e+02 +314 505 -2.895745815575320e+02 +314 506 -2.689865983609323e+02 +314 507 -2.354925657825778e+02 +314 508 -1.989422168423268e+02 +314 509 -1.663510232448634e+02 +314 510 -1.407716848553630e+02 +314 511 -1.226088998409724e+02 +314 512 -1.111842160419089e+02 +314 513 -1.057061586526019e+02 +315 163 -1.097534196790493e+02 +315 164 -1.155304899028560e+02 +315 165 -1.275984131219178e+02 +315 166 -1.468355065336025e+02 +315 167 -1.740274317161707e+02 +315 168 -2.088271183655455e+02 +315 169 -2.480403651673273e+02 +315 170 -2.841326260213858e+02 +315 171 -3.063876713483002e+02 +315 442 -1.802596433195452e+03 +315 443 -1.550121445008508e+03 +315 444 -1.193932486839836e+03 +315 445 -8.726231103602345e+02 +315 446 -6.371952057562402e+02 +315 447 -4.819366867771671e+02 +315 448 -3.859179776157600e+02 +315 449 -3.311617365195743e+02 +315 450 -3.063876713483004e+02 +315 505 -3.124380547854541e+02 +315 506 -2.895745815575323e+02 +315 507 -2.525366109215769e+02 +315 508 -2.123577731150847e+02 +315 509 -1.767605489846857e+02 +315 510 -1.489885081652993e+02 +315 511 -1.293661657908651e+02 +315 512 -1.170681125153375e+02 +315 513 -1.111842160419089e+02 +316 235 -1.733190400658708e+03 +316 236 -1.877824568765015e+03 +316 237 -2.199157547087195e+03 +316 238 -2.767706810094291e+03 +316 239 -3.699147964795170e+03 +316 240 -5.136224430633847e+03 +316 241 -7.138491575686255e+03 +316 242 -9.405703259334579e+03 +316 243 -1.103972130715916e+04 +316 379 -1.733190400658708e+03 +316 380 -1.603684467943636e+03 +316 381 -1.394551574360513e+03 +316 382 -1.168677565678393e+03 +316 383 -9.695072463564451e+02 +316 384 -8.148024630667953e+02 +316 385 -7.058924559832880e+02 +316 386 -6.378158089920680e+02 +316 387 -6.052974323170214e+02 +316 406 -6.289529049931513e+02 +316 407 -5.970589583440833e+02 +316 408 -5.429674662554829e+02 +316 409 -4.803677035258846e+02 +316 410 -4.208084537187718e+02 +316 411 -3.710963518270340e+02 +316 412 -3.339204550667992e+02 +316 413 -3.096178268240468e+02 +316 414 -2.976873911031304e+02 +317 235 -1.603684467943636e+03 +317 236 -1.733190400658710e+03 +317 237 -2.019368486704435e+03 +317 238 -2.521021940438006e+03 +317 239 -3.331754877699595e+03 +317 240 -4.560278038130808e+03 +317 241 -6.235592529048601e+03 +317 242 -8.091232579773138e+03 +317 243 -9.405703259334599e+03 +317 379 -1.877824568765012e+03 +317 380 -1.733190400658708e+03 +317 381 -1.500725861549673e+03 +317 382 -1.251286952144482e+03 +317 383 -1.032880208377977e+03 +317 384 -8.643348602446090e+02 +317 385 -7.463158073460687e+02 +317 386 -6.728335244699299e+02 +317 387 -6.378158089920680e+02 +317 406 -6.632839990295103e+02 +317 407 -6.289529049931513e+02 +317 408 -5.708523475060541e+02 +317 409 -5.038180997021782e+02 +317 410 -4.402579127124382e+02 +317 411 -3.873813675510149e+02 +317 412 -3.479505460244110e+02 +317 413 -3.222285372305477e+02 +317 414 -3.096178268240468e+02 +318 235 -1.394551574360513e+03 +318 236 -1.500725861549674e+03 +318 237 -1.733190400658708e+03 +318 238 -2.134265778758331e+03 +318 239 -2.767706810094291e+03 +318 240 -3.699147964795170e+03 +318 241 -4.925216936196723e+03 +318 242 -6.235592529048589e+03 +318 243 -7.138491575686255e+03 +318 379 -2.199157547087195e+03 +318 380 -2.019368486704435e+03 +318 381 -1.733190400658708e+03 +318 382 -1.430197816180119e+03 +318 383 -1.168677565678393e+03 +318 384 -9.695072463564451e+02 +318 385 -8.315436028021828e+02 +318 386 -7.463158073460687e+02 +318 387 -7.058924559832880e+02 +318 406 -7.352796046183671e+02 +318 407 -6.956816209337401e+02 +318 408 -6.289529049931513e+02 +318 409 -5.524312223207843e+02 +318 410 -4.803677035258846e+02 +318 411 -4.208084537187718e+02 +318 412 -3.766415408901786e+02 +318 413 -3.479505460244110e+02 +318 414 -3.339204550667992e+02 +319 235 -1.168677565678393e+03 +319 236 -1.251286952144483e+03 +319 237 -1.430197816180119e+03 +319 238 -1.733190400658708e+03 +319 239 -2.199157547087195e+03 +319 240 -2.861294172280330e+03 +319 241 -3.699147964795170e+03 +319 242 -4.560278038130800e+03 +319 243 -5.136224430633847e+03 +319 379 -2.767706810094291e+03 +319 380 -2.521021940438006e+03 +319 381 -2.134265778758331e+03 +319 382 -1.733190400658708e+03 +319 383 -1.394551574360513e+03 +319 384 -1.141773184361047e+03 +319 385 -9.695072463564451e+02 +319 386 -8.643348602446090e+02 +319 387 -8.148024630667953e+02 +319 406 -8.507888885505199e+02 +319 407 -8.023274760830689e+02 +319 408 -7.211778000851810e+02 +319 409 -6.289529049931513e+02 +319 410 -5.429674662554829e+02 +319 411 -4.725808574370898e+02 +319 412 -4.208084537187718e+02 +319 413 -3.873813675510149e+02 +319 414 -3.710963518270340e+02 +320 235 -9.695072463564451e+02 +320 236 -1.032880208377978e+03 +320 237 -1.168677565678393e+03 +320 238 -1.394551574360513e+03 +320 239 -1.733190400658708e+03 +320 240 -2.199157547087195e+03 +320 241 -2.767706810094291e+03 +320 242 -3.331754877699590e+03 +320 243 -3.699147964795170e+03 +320 379 -3.699147964795170e+03 +320 380 -3.331754877699595e+03 +320 381 -2.767706810094291e+03 +320 382 -2.199157547087195e+03 +320 383 -1.733190400658708e+03 +320 384 -1.394551574360513e+03 +320 385 -1.168677565678393e+03 +320 386 -1.032880208377977e+03 +320 387 -9.695072463564451e+02 +320 406 -1.015511306612465e+03 +320 407 -9.536070604341750e+02 +320 408 -8.507888885505199e+02 +320 409 -7.352796046183671e+02 +320 410 -6.289529049931513e+02 +320 411 -5.429674662554829e+02 +320 412 -4.803677035258846e+02 +320 413 -4.402579127124382e+02 +320 414 -4.208084537187718e+02 +321 235 -8.148024630667953e+02 +321 236 -8.643348602446098e+02 +321 237 -9.695072463564451e+02 +321 238 -1.141773184361047e+03 +321 239 -1.394551574360513e+03 +321 240 -1.733190400658708e+03 +321 241 -2.134265778758331e+03 +321 242 -2.521021940438003e+03 +321 243 -2.767706810094291e+03 +321 379 -5.136224430633847e+03 +321 380 -4.560278038130808e+03 +321 381 -3.699147964795170e+03 +321 382 -2.861294172280330e+03 +321 383 -2.199157547087195e+03 +321 384 -1.733190400658708e+03 +321 385 -1.430197816180119e+03 +321 386 -1.251286952144482e+03 +321 387 -1.168677565678393e+03 +321 406 -1.228588660544048e+03 +321 407 -1.148042053110078e+03 +321 408 -1.015511306612465e+03 +321 409 -8.685786765383772e+02 +321 410 -7.352796046183671e+02 +321 411 -6.289529049931513e+02 +321 412 -5.524312223207843e+02 +321 413 -5.038180997021782e+02 +321 414 -4.803677035258846e+02 +322 235 -7.058924559832880e+02 +322 236 -7.463158073460694e+02 +322 237 -8.315436028021828e+02 +322 238 -9.695072463564451e+02 +322 239 -1.168677565678393e+03 +322 240 -1.430197816180119e+03 +322 241 -1.733190400658708e+03 +322 242 -2.019368486704433e+03 +322 243 -2.199157547087195e+03 +322 379 -7.138491575686255e+03 +322 380 -6.235592529048601e+03 +322 381 -4.925216936196723e+03 +322 382 -3.699147964795170e+03 +322 383 -2.767706810094291e+03 +322 384 -2.134265778758331e+03 +322 385 -1.733190400658708e+03 +322 386 -1.500725861549673e+03 +322 387 -1.394551574360513e+03 +322 406 -1.471477730866024e+03 +322 407 -1.368148367306964e+03 +322 408 -1.199743197084304e+03 +322 409 -1.015511306612465e+03 +322 410 -8.507888885505199e+02 +322 411 -7.211778000851810e+02 +322 412 -6.289529049931513e+02 +322 413 -5.708523475060541e+02 +322 414 -5.429674662554829e+02 +323 235 -6.378158089920680e+02 +323 236 -6.728335244699305e+02 +323 237 -7.463158073460687e+02 +323 238 -8.643348602446090e+02 +323 239 -1.032880208377977e+03 +323 240 -1.251286952144482e+03 +323 241 -1.500725861549673e+03 +323 242 -1.733190400658706e+03 +323 243 -1.877824568765012e+03 +323 379 -9.405703259334599e+03 +323 380 -8.091232579773156e+03 +323 381 -6.235592529048601e+03 +323 382 -4.560278038130808e+03 +323 383 -3.331754877699595e+03 +323 384 -2.521021940438006e+03 +323 385 -2.019368486704435e+03 +323 386 -1.733190400658708e+03 +323 387 -1.603684467943636e+03 +323 406 -1.697437739078445e+03 +323 407 -1.571600895131404e+03 +323 408 -1.368148367306964e+03 +323 409 -1.148042053110078e+03 +323 410 -9.536070604341750e+02 +323 411 -8.023274760830689e+02 +323 412 -6.956816209337401e+02 +323 413 -6.289529049931513e+02 +323 414 -5.970589583440833e+02 +324 235 -6.052974323170214e+02 +324 236 -6.378158089920685e+02 +324 237 -7.058924559832880e+02 +324 238 -8.148024630667953e+02 +324 239 -9.695072463564451e+02 +324 240 -1.168677565678393e+03 +324 241 -1.394551574360513e+03 +324 242 -1.603684467943634e+03 +324 243 -1.733190400658708e+03 +324 379 -1.103972130715916e+04 +324 380 -9.405703259334599e+03 +324 381 -7.138491575686255e+03 +324 382 -5.136224430633847e+03 +324 383 -3.699147964795170e+03 +324 384 -2.767706810094291e+03 +324 385 -2.199157547087195e+03 +324 386 -1.877824568765012e+03 +324 387 -1.733190400658708e+03 +324 406 -1.837845240586531e+03 +324 407 -1.697437739078445e+03 +324 408 -1.471477730866024e+03 +324 409 -1.228588660544048e+03 +324 410 -1.015511306612465e+03 +324 411 -8.507888885505199e+02 +324 412 -7.352796046183671e+02 +324 413 -6.632839990295103e+02 +324 414 -6.289529049931513e+02 +343 235 -6.289529049931513e+02 +343 236 -6.632839990295108e+02 +343 237 -7.352796046183671e+02 +343 238 -8.507888885505199e+02 +343 239 -1.015511306612465e+03 +343 240 -1.228588660544048e+03 +343 241 -1.471477730866024e+03 +343 242 -1.697437739078444e+03 +343 243 -1.837845240586531e+03 +343 262 -1.733190400658708e+03 +343 263 -1.877824568765015e+03 +343 264 -2.199157547087195e+03 +343 265 -2.767706810094291e+03 +343 266 -3.699147964795170e+03 +343 267 -5.136224430633847e+03 +343 268 -7.138491575686255e+03 +343 269 -9.405703259334579e+03 +343 270 -1.103972130715916e+04 +343 406 -1.733190400658708e+03 +343 407 -1.603684467943636e+03 +343 408 -1.394551574360513e+03 +343 409 -1.168677565678393e+03 +343 410 -9.695072463564451e+02 +343 411 -8.148024630667953e+02 +343 412 -7.058924559832880e+02 +343 413 -6.378158089920680e+02 +343 414 -6.052974323170214e+02 +344 235 -5.970589583440833e+02 +344 236 -6.289529049931518e+02 +344 237 -6.956816209337401e+02 +344 238 -8.023274760830689e+02 +344 239 -9.536070604341750e+02 +344 240 -1.148042053110078e+03 +344 241 -1.368148367306964e+03 +344 242 -1.571600895131402e+03 +344 243 -1.697437739078445e+03 +344 262 -1.603684467943636e+03 +344 263 -1.733190400658710e+03 +344 264 -2.019368486704435e+03 +344 265 -2.521021940438006e+03 +344 266 -3.331754877699595e+03 +344 267 -4.560278038130808e+03 +344 268 -6.235592529048601e+03 +344 269 -8.091232579773138e+03 +344 270 -9.405703259334599e+03 +344 406 -1.877824568765012e+03 +344 407 -1.733190400658708e+03 +344 408 -1.500725861549673e+03 +344 409 -1.251286952144482e+03 +344 410 -1.032880208377977e+03 +344 411 -8.643348602446090e+02 +344 412 -7.463158073460687e+02 +344 413 -6.728335244699299e+02 +344 414 -6.378158089920680e+02 +345 235 -5.429674662554829e+02 +345 236 -5.708523475060545e+02 +345 237 -6.289529049931513e+02 +345 238 -7.211778000851810e+02 +345 239 -8.507888885505199e+02 +345 240 -1.015511306612465e+03 +345 241 -1.199743197084304e+03 +345 242 -1.368148367306962e+03 +345 243 -1.471477730866024e+03 +345 262 -1.394551574360513e+03 +345 263 -1.500725861549674e+03 +345 264 -1.733190400658708e+03 +345 265 -2.134265778758331e+03 +345 266 -2.767706810094291e+03 +345 267 -3.699147964795170e+03 +345 268 -4.925216936196723e+03 +345 269 -6.235592529048589e+03 +345 270 -7.138491575686255e+03 +345 406 -2.199157547087195e+03 +345 407 -2.019368486704435e+03 +345 408 -1.733190400658708e+03 +345 409 -1.430197816180119e+03 +345 410 -1.168677565678393e+03 +345 411 -9.695072463564451e+02 +345 412 -8.315436028021828e+02 +345 413 -7.463158073460687e+02 +345 414 -7.058924559832880e+02 +346 235 -4.803677035258846e+02 +346 236 -5.038180997021786e+02 +346 237 -5.524312223207843e+02 +346 238 -6.289529049931513e+02 +346 239 -7.352796046183671e+02 +346 240 -8.685786765383772e+02 +346 241 -1.015511306612465e+03 +346 242 -1.148042053110077e+03 +346 243 -1.228588660544048e+03 +346 262 -1.168677565678393e+03 +346 263 -1.251286952144483e+03 +346 264 -1.430197816180119e+03 +346 265 -1.733190400658708e+03 +346 266 -2.199157547087195e+03 +346 267 -2.861294172280330e+03 +346 268 -3.699147964795170e+03 +346 269 -4.560278038130800e+03 +346 270 -5.136224430633847e+03 +346 406 -2.767706810094291e+03 +346 407 -2.521021940438006e+03 +346 408 -2.134265778758331e+03 +346 409 -1.733190400658708e+03 +346 410 -1.394551574360513e+03 +346 411 -1.141773184361047e+03 +346 412 -9.695072463564451e+02 +346 413 -8.643348602446090e+02 +346 414 -8.148024630667953e+02 +347 235 -4.208084537187718e+02 +347 236 -4.402579127124384e+02 +347 237 -4.803677035258846e+02 +347 238 -5.429674662554829e+02 +347 239 -6.289529049931513e+02 +347 240 -7.352796046183671e+02 +347 241 -8.507888885505199e+02 +347 242 -9.536070604341742e+02 +347 243 -1.015511306612465e+03 +347 262 -9.695072463564451e+02 +347 263 -1.032880208377978e+03 +347 264 -1.168677565678393e+03 +347 265 -1.394551574360513e+03 +347 266 -1.733190400658708e+03 +347 267 -2.199157547087195e+03 +347 268 -2.767706810094291e+03 +347 269 -3.331754877699590e+03 +347 270 -3.699147964795170e+03 +347 406 -3.699147964795170e+03 +347 407 -3.331754877699595e+03 +347 408 -2.767706810094291e+03 +347 409 -2.199157547087195e+03 +347 410 -1.733190400658708e+03 +347 411 -1.394551574360513e+03 +347 412 -1.168677565678393e+03 +347 413 -1.032880208377977e+03 +347 414 -9.695072463564451e+02 +348 235 -3.710963518270340e+02 +348 236 -3.873813675510152e+02 +348 237 -4.208084537187718e+02 +348 238 -4.725808574370898e+02 +348 239 -5.429674662554829e+02 +348 240 -6.289529049931513e+02 +348 241 -7.211778000851810e+02 +348 242 -8.023274760830682e+02 +348 243 -8.507888885505199e+02 +348 262 -8.148024630667953e+02 +348 263 -8.643348602446098e+02 +348 264 -9.695072463564451e+02 +348 265 -1.141773184361047e+03 +348 266 -1.394551574360513e+03 +348 267 -1.733190400658708e+03 +348 268 -2.134265778758331e+03 +348 269 -2.521021940438003e+03 +348 270 -2.767706810094291e+03 +348 406 -5.136224430633847e+03 +348 407 -4.560278038130808e+03 +348 408 -3.699147964795170e+03 +348 409 -2.861294172280330e+03 +348 410 -2.199157547087195e+03 +348 411 -1.733190400658708e+03 +348 412 -1.430197816180119e+03 +348 413 -1.251286952144482e+03 +348 414 -1.168677565678393e+03 +349 235 -3.339204550667992e+02 +349 236 -3.479505460244112e+02 +349 237 -3.766415408901786e+02 +349 238 -4.208084537187718e+02 +349 239 -4.803677035258846e+02 +349 240 -5.524312223207843e+02 +349 241 -6.289529049931513e+02 +349 242 -6.956816209337395e+02 +349 243 -7.352796046183671e+02 +349 262 -7.058924559832880e+02 +349 263 -7.463158073460694e+02 +349 264 -8.315436028021828e+02 +349 265 -9.695072463564451e+02 +349 266 -1.168677565678393e+03 +349 267 -1.430197816180119e+03 +349 268 -1.733190400658708e+03 +349 269 -2.019368486704433e+03 +349 270 -2.199157547087195e+03 +349 406 -7.138491575686255e+03 +349 407 -6.235592529048601e+03 +349 408 -4.925216936196723e+03 +349 409 -3.699147964795170e+03 +349 410 -2.767706810094291e+03 +349 411 -2.134265778758331e+03 +349 412 -1.733190400658708e+03 +349 413 -1.500725861549673e+03 +349 414 -1.394551574360513e+03 +350 235 -3.096178268240468e+02 +350 236 -3.222285372305479e+02 +350 237 -3.479505460244110e+02 +350 238 -3.873813675510149e+02 +350 239 -4.402579127124382e+02 +350 240 -5.038180997021782e+02 +350 241 -5.708523475060541e+02 +350 242 -6.289529049931509e+02 +350 243 -6.632839990295103e+02 +350 262 -6.378158089920680e+02 +350 263 -6.728335244699305e+02 +350 264 -7.463158073460687e+02 +350 265 -8.643348602446090e+02 +350 266 -1.032880208377977e+03 +350 267 -1.251286952144482e+03 +350 268 -1.500725861549673e+03 +350 269 -1.733190400658706e+03 +350 270 -1.877824568765012e+03 +350 406 -9.405703259334599e+03 +350 407 -8.091232579773156e+03 +350 408 -6.235592529048601e+03 +350 409 -4.560278038130808e+03 +350 410 -3.331754877699595e+03 +350 411 -2.521021940438006e+03 +350 412 -2.019368486704435e+03 +350 413 -1.733190400658708e+03 +350 414 -1.603684467943636e+03 +351 235 -2.976873911031304e+02 +351 236 -3.096178268240470e+02 +351 237 -3.339204550667992e+02 +351 238 -3.710963518270340e+02 +351 239 -4.208084537187718e+02 +351 240 -4.803677035258846e+02 +351 241 -5.429674662554829e+02 +351 242 -5.970589583440830e+02 +351 243 -6.289529049931513e+02 +351 262 -6.052974323170214e+02 +351 263 -6.378158089920685e+02 +351 264 -7.058924559832880e+02 +351 265 -8.148024630667953e+02 +351 266 -9.695072463564451e+02 +351 267 -1.168677565678393e+03 +351 268 -1.394551574360513e+03 +351 269 -1.603684467943634e+03 +351 270 -1.733190400658708e+03 +351 406 -1.103972130715916e+04 +351 407 -9.405703259334599e+03 +351 408 -7.138491575686255e+03 +351 409 -5.136224430633847e+03 +351 410 -3.699147964795170e+03 +351 411 -2.767706810094291e+03 +351 412 -2.199157547087195e+03 +351 413 -1.877824568765012e+03 +351 414 -1.733190400658708e+03 +370 163 -1.111842160419089e+02 +370 164 -1.170681125153374e+02 +370 165 -1.293661657908650e+02 +370 166 -1.489885081652993e+02 +370 167 -1.767605489846855e+02 +370 168 -2.123577731150844e+02 +370 169 -2.525366109215767e+02 +370 170 -2.895745815575320e+02 +370 171 -3.124380547854540e+02 +370 226 -3.063876713483002e+02 +370 227 -3.311617365195740e+02 +370 228 -3.859179776157595e+02 +370 229 -4.819366867771668e+02 +370 230 -6.371952057562393e+02 +370 231 -8.726231103602329e+02 +370 232 -1.193932486839834e+03 +370 233 -1.550121445008505e+03 +370 234 -1.802596433195449e+03 +370 505 -3.063876713483004e+02 +370 506 -2.841326260213861e+02 +370 507 -2.480403651673276e+02 +370 508 -2.088271183655457e+02 +370 509 -1.740274317161709e+02 +370 510 -1.468355065336025e+02 +370 511 -1.275984131219179e+02 +370 512 -1.155304899028561e+02 +370 513 -1.097534196790493e+02 +371 163 -1.057061586526019e+02 +371 164 -1.111842160419089e+02 +371 165 -1.226088998409724e+02 +371 166 -1.407716848553631e+02 +371 167 -1.663510232448634e+02 +371 168 -1.989422168423268e+02 +371 169 -2.354925657825778e+02 +371 170 -2.689865983609323e+02 +371 171 -2.895745815575322e+02 +371 226 -2.841326260213859e+02 +371 227 -3.063876713483004e+02 +371 228 -3.553280674768354e+02 +371 229 -4.404031329187425e+02 +371 230 -5.762343277298875e+02 +371 231 -7.788097592344268e+02 +371 232 -1.049909849375152e+03 +371 233 -1.344510568096307e+03 +371 234 -1.550121445008506e+03 +371 505 -3.311617365195740e+02 +371 506 -3.063876713483004e+02 +371 507 -2.663884709281895e+02 +371 508 -2.231981844606889e+02 +371 509 -1.851243485745372e+02 +371 510 -1.555580782497810e+02 +371 511 -1.347481526436476e+02 +371 512 -1.217424124188380e+02 +371 513 -1.155304899028560e+02 +372 163 -9.638822517401599e+01 +372 164 -1.011961191083175e+02 +372 165 -1.111842160419089e+02 +372 166 -1.269615920628683e+02 +372 167 -1.489885081652993e+02 +372 168 -1.767605489846857e+02 +372 169 -2.075588680195233e+02 +372 170 -2.354925657825778e+02 +372 171 -2.525366109215768e+02 +372 226 -2.480403651673274e+02 +372 227 -2.663884709281895e+02 +372 228 -3.063876713483004e+02 +372 229 -3.748904053829397e+02 +372 230 -4.819366867771671e+02 +372 231 -6.371952057562402e+02 +372 232 -8.383319685358463e+02 +372 233 -1.049909849375152e+03 +372 234 -1.193932486839835e+03 +372 505 -3.859179776157595e+02 +372 506 -3.553280674768354e+02 +372 507 -3.063876713483004e+02 +372 508 -2.542062119667733e+02 +372 509 -2.088271183655455e+02 +372 510 -1.740274317161707e+02 +372 511 -1.497853840269158e+02 +372 512 -1.347481526436476e+02 +372 513 -1.275984131219178e+02 +373 163 -8.555928471614153e+01 +373 164 -8.962181586287879e+01 +373 165 -9.802102195827709e+01 +373 166 -1.111842160419090e+02 +373 167 -1.293661657908651e+02 +373 168 -1.519993633210927e+02 +373 169 -1.767605489846857e+02 +373 170 -1.989422168423268e+02 +373 171 -2.123577731150846e+02 +373 226 -2.088271183655456e+02 +373 227 -2.231981844606889e+02 +373 228 -2.542062119667733e+02 +373 229 -3.063876713483005e+02 +373 230 -3.859179776157600e+02 +373 231 -4.976453857371593e+02 +373 232 -6.371952057562402e+02 +373 233 -7.788097592344268e+02 +373 234 -8.726231103602338e+02 +373 505 -4.819366867771664e+02 +373 506 -4.404031329187421e+02 +373 507 -3.748904053829394e+02 +373 508 -3.063876713483004e+02 +373 509 -2.480403651673273e+02 +373 510 -2.041390437321797e+02 +373 511 -1.740274317161707e+02 +373 512 -1.555580782497810e+02 +373 513 -1.468355065336024e+02 +374 163 -7.520762033775922e+01 +374 164 -7.859349409841366e+01 +374 165 -8.555928471614152e+01 +374 166 -9.638822517401599e+01 +374 167 -1.111842160419089e+02 +374 168 -1.293661657908651e+02 +374 169 -1.489885081652993e+02 +374 170 -1.663510232448634e+02 +374 171 -1.767605489846856e+02 +374 226 -1.740274317161708e+02 +374 227 -1.851243485745372e+02 +374 228 -2.088271183655455e+02 +374 229 -2.480403651673274e+02 +374 230 -3.063876713483004e+02 +374 231 -3.859179776157600e+02 +374 232 -4.819366867771671e+02 +374 233 -5.762343277298875e+02 +374 234 -6.371952057562397e+02 +374 505 -6.371952057562393e+02 +374 506 -5.762343277298875e+02 +374 507 -4.819366867771671e+02 +374 508 -3.859179776157600e+02 +374 509 -3.063876713483004e+02 +374 510 -2.480403651673273e+02 +374 511 -2.088271183655455e+02 +374 512 -1.851243485745372e+02 +374 513 -1.740274317161707e+02 +375 163 -6.652797451218331e+01 +375 164 -6.937545782864687e+01 +375 165 -7.520762033775921e+01 +375 166 -8.420868002944918e+01 +375 167 -9.638822517401596e+01 +375 168 -1.111842160419089e+02 +375 169 -1.269615920628683e+02 +375 170 -1.407716848553630e+02 +375 171 -1.489885081652993e+02 +375 226 -1.468355065336025e+02 +375 227 -1.555580782497810e+02 +375 228 -1.740274317161707e+02 +375 229 -2.041390437321798e+02 +375 230 -2.480403651673273e+02 +375 231 -3.063876713483004e+02 +375 232 -3.748904053829394e+02 +375 233 -4.404031329187421e+02 +375 234 -4.819366867771668e+02 +375 505 -8.726231103602329e+02 +375 506 -7.788097592344268e+02 +375 507 -6.371952057562402e+02 +375 508 -4.976453857371593e+02 +375 509 -3.859179776157600e+02 +375 510 -3.063876713483004e+02 +375 511 -2.542062119667733e+02 +375 512 -2.231981844606889e+02 +375 513 -2.088271183655455e+02 +376 163 -6.001174723167333e+01 +376 164 -6.247361649834816e+01 +376 165 -6.749803222962944e+01 +376 166 -7.520762033775922e+01 +376 167 -8.555928471614152e+01 +376 168 -9.802102195827709e+01 +376 169 -1.111842160419089e+02 +376 170 -1.226088998409724e+02 +376 171 -1.293661657908650e+02 +376 226 -1.275984131219178e+02 +376 227 -1.347481526436476e+02 +376 228 -1.497853840269158e+02 +376 229 -1.740274317161708e+02 +376 230 -2.088271183655455e+02 +376 231 -2.542062119667733e+02 +376 232 -3.063876713483004e+02 +376 233 -3.553280674768354e+02 +376 234 -3.859179776157598e+02 +376 505 -1.193932486839834e+03 +376 506 -1.049909849375152e+03 +376 507 -8.383319685358463e+02 +376 508 -6.371952057562402e+02 +376 509 -4.819366867771671e+02 +376 510 -3.748904053829394e+02 +376 511 -3.063876713483004e+02 +376 512 -2.663884709281895e+02 +376 513 -2.480403651673273e+02 +377 163 -5.573941364116938e+01 +377 164 -5.795761808209195e+01 +377 165 -6.247361649834816e+01 +377 166 -6.937545782864690e+01 +377 167 -7.859349409841366e+01 +377 168 -8.962181586287879e+01 +377 169 -1.011961191083175e+02 +377 170 -1.111842160419089e+02 +377 171 -1.170681125153375e+02 +377 226 -1.155304899028561e+02 +377 227 -1.217424124188380e+02 +377 228 -1.347481526436476e+02 +377 229 -1.555580782497811e+02 +377 230 -1.851243485745372e+02 +377 231 -2.231981844606889e+02 +377 232 -2.663884709281895e+02 +377 233 -3.063876713483004e+02 +377 234 -3.311617365195742e+02 +377 505 -1.550121445008505e+03 +377 506 -1.344510568096307e+03 +377 507 -1.049909849375152e+03 +377 508 -7.788097592344268e+02 +377 509 -5.762343277298875e+02 +377 510 -4.404031329187421e+02 +377 511 -3.553280674768354e+02 +377 512 -3.063876713483004e+02 +377 513 -2.841326260213858e+02 +378 163 -5.363826960242956e+01 +378 164 -5.573941364116936e+01 +378 165 -6.001174723167332e+01 +378 166 -6.652797451218331e+01 +378 167 -7.520762033775921e+01 +378 168 -8.555928471614152e+01 +378 169 -9.638822517401596e+01 +378 170 -1.057061586526019e+02 +378 171 -1.111842160419089e+02 +378 226 -1.097534196790493e+02 +378 227 -1.155304899028560e+02 +378 228 -1.275984131219178e+02 +378 229 -1.468355065336025e+02 +378 230 -1.740274317161707e+02 +378 231 -2.088271183655455e+02 +378 232 -2.480403651673273e+02 +378 233 -2.841326260213858e+02 +378 234 -3.063876713483002e+02 +378 505 -1.802596433195452e+03 +378 506 -1.550121445008508e+03 +378 507 -1.193932486839836e+03 +378 508 -8.726231103602345e+02 +378 509 -6.371952057562402e+02 +378 510 -4.819366867771671e+02 +378 511 -3.859179776157600e+02 +378 512 -3.311617365195743e+02 +378 513 -3.063876713483004e+02 +379 316 -1.733190400658708e+03 +379 317 -1.877824568765012e+03 +379 318 -2.199157547087195e+03 +379 319 -2.767706810094291e+03 +379 320 -3.699147964795170e+03 +379 321 -5.136224430633847e+03 +379 322 -7.138491575686255e+03 +379 323 -9.405703259334599e+03 +379 324 -1.103972130715916e+04 +379 451 -1.733190400658708e+03 +379 452 -1.603684467943636e+03 +379 453 -1.394551574360513e+03 +379 454 -1.168677565678393e+03 +379 455 -9.695072463564451e+02 +379 456 -8.148024630667953e+02 +379 457 -7.058924559832880e+02 +379 458 -6.378158089920680e+02 +379 459 -6.052974323170214e+02 +379 478 -6.289529049931513e+02 +379 479 -5.970589583440833e+02 +379 480 -5.429674662554829e+02 +379 481 -4.803677035258846e+02 +379 482 -4.208084537187718e+02 +379 483 -3.710963518270340e+02 +379 484 -3.339204550667992e+02 +379 485 -3.096178268240468e+02 +379 486 -2.976873911031304e+02 +380 316 -1.603684467943636e+03 +380 317 -1.733190400658708e+03 +380 318 -2.019368486704435e+03 +380 319 -2.521021940438006e+03 +380 320 -3.331754877699595e+03 +380 321 -4.560278038130808e+03 +380 322 -6.235592529048601e+03 +380 323 -8.091232579773156e+03 +380 324 -9.405703259334599e+03 +380 451 -1.877824568765012e+03 +380 452 -1.733190400658708e+03 +380 453 -1.500725861549673e+03 +380 454 -1.251286952144482e+03 +380 455 -1.032880208377977e+03 +380 456 -8.643348602446090e+02 +380 457 -7.463158073460687e+02 +380 458 -6.728335244699299e+02 +380 459 -6.378158089920680e+02 +380 478 -6.632839990295103e+02 +380 479 -6.289529049931513e+02 +380 480 -5.708523475060541e+02 +380 481 -5.038180997021782e+02 +380 482 -4.402579127124382e+02 +380 483 -3.873813675510149e+02 +380 484 -3.479505460244110e+02 +380 485 -3.222285372305477e+02 +380 486 -3.096178268240468e+02 +381 316 -1.394551574360513e+03 +381 317 -1.500725861549673e+03 +381 318 -1.733190400658708e+03 +381 319 -2.134265778758331e+03 +381 320 -2.767706810094291e+03 +381 321 -3.699147964795170e+03 +381 322 -4.925216936196723e+03 +381 323 -6.235592529048601e+03 +381 324 -7.138491575686255e+03 +381 451 -2.199157547087195e+03 +381 452 -2.019368486704435e+03 +381 453 -1.733190400658708e+03 +381 454 -1.430197816180119e+03 +381 455 -1.168677565678393e+03 +381 456 -9.695072463564451e+02 +381 457 -8.315436028021828e+02 +381 458 -7.463158073460687e+02 +381 459 -7.058924559832880e+02 +381 478 -7.352796046183671e+02 +381 479 -6.956816209337401e+02 +381 480 -6.289529049931513e+02 +381 481 -5.524312223207843e+02 +381 482 -4.803677035258846e+02 +381 483 -4.208084537187718e+02 +381 484 -3.766415408901786e+02 +381 485 -3.479505460244110e+02 +381 486 -3.339204550667992e+02 +382 316 -1.168677565678393e+03 +382 317 -1.251286952144482e+03 +382 318 -1.430197816180119e+03 +382 319 -1.733190400658708e+03 +382 320 -2.199157547087195e+03 +382 321 -2.861294172280330e+03 +382 322 -3.699147964795170e+03 +382 323 -4.560278038130808e+03 +382 324 -5.136224430633847e+03 +382 451 -2.767706810094291e+03 +382 452 -2.521021940438006e+03 +382 453 -2.134265778758331e+03 +382 454 -1.733190400658708e+03 +382 455 -1.394551574360513e+03 +382 456 -1.141773184361047e+03 +382 457 -9.695072463564451e+02 +382 458 -8.643348602446090e+02 +382 459 -8.148024630667953e+02 +382 478 -8.507888885505199e+02 +382 479 -8.023274760830689e+02 +382 480 -7.211778000851810e+02 +382 481 -6.289529049931513e+02 +382 482 -5.429674662554829e+02 +382 483 -4.725808574370898e+02 +382 484 -4.208084537187718e+02 +382 485 -3.873813675510149e+02 +382 486 -3.710963518270340e+02 +383 316 -9.695072463564451e+02 +383 317 -1.032880208377977e+03 +383 318 -1.168677565678393e+03 +383 319 -1.394551574360513e+03 +383 320 -1.733190400658708e+03 +383 321 -2.199157547087195e+03 +383 322 -2.767706810094291e+03 +383 323 -3.331754877699595e+03 +383 324 -3.699147964795170e+03 +383 451 -3.699147964795170e+03 +383 452 -3.331754877699595e+03 +383 453 -2.767706810094291e+03 +383 454 -2.199157547087195e+03 +383 455 -1.733190400658708e+03 +383 456 -1.394551574360513e+03 +383 457 -1.168677565678393e+03 +383 458 -1.032880208377977e+03 +383 459 -9.695072463564451e+02 +383 478 -1.015511306612465e+03 +383 479 -9.536070604341750e+02 +383 480 -8.507888885505199e+02 +383 481 -7.352796046183671e+02 +383 482 -6.289529049931513e+02 +383 483 -5.429674662554829e+02 +383 484 -4.803677035258846e+02 +383 485 -4.402579127124382e+02 +383 486 -4.208084537187718e+02 +384 316 -8.148024630667953e+02 +384 317 -8.643348602446090e+02 +384 318 -9.695072463564451e+02 +384 319 -1.141773184361047e+03 +384 320 -1.394551574360513e+03 +384 321 -1.733190400658708e+03 +384 322 -2.134265778758331e+03 +384 323 -2.521021940438006e+03 +384 324 -2.767706810094291e+03 +384 451 -5.136224430633847e+03 +384 452 -4.560278038130808e+03 +384 453 -3.699147964795170e+03 +384 454 -2.861294172280330e+03 +384 455 -2.199157547087195e+03 +384 456 -1.733190400658708e+03 +384 457 -1.430197816180119e+03 +384 458 -1.251286952144482e+03 +384 459 -1.168677565678393e+03 +384 478 -1.228588660544048e+03 +384 479 -1.148042053110078e+03 +384 480 -1.015511306612465e+03 +384 481 -8.685786765383772e+02 +384 482 -7.352796046183671e+02 +384 483 -6.289529049931513e+02 +384 484 -5.524312223207843e+02 +384 485 -5.038180997021782e+02 +384 486 -4.803677035258846e+02 +385 316 -7.058924559832880e+02 +385 317 -7.463158073460687e+02 +385 318 -8.315436028021828e+02 +385 319 -9.695072463564451e+02 +385 320 -1.168677565678393e+03 +385 321 -1.430197816180119e+03 +385 322 -1.733190400658708e+03 +385 323 -2.019368486704435e+03 +385 324 -2.199157547087195e+03 +385 451 -7.138491575686255e+03 +385 452 -6.235592529048601e+03 +385 453 -4.925216936196723e+03 +385 454 -3.699147964795170e+03 +385 455 -2.767706810094291e+03 +385 456 -2.134265778758331e+03 +385 457 -1.733190400658708e+03 +385 458 -1.500725861549673e+03 +385 459 -1.394551574360513e+03 +385 478 -1.471477730866024e+03 +385 479 -1.368148367306964e+03 +385 480 -1.199743197084304e+03 +385 481 -1.015511306612465e+03 +385 482 -8.507888885505199e+02 +385 483 -7.211778000851810e+02 +385 484 -6.289529049931513e+02 +385 485 -5.708523475060541e+02 +385 486 -5.429674662554829e+02 +386 316 -6.378158089920680e+02 +386 317 -6.728335244699299e+02 +386 318 -7.463158073460687e+02 +386 319 -8.643348602446090e+02 +386 320 -1.032880208377977e+03 +386 321 -1.251286952144482e+03 +386 322 -1.500725861549673e+03 +386 323 -1.733190400658708e+03 +386 324 -1.877824568765012e+03 +386 451 -9.405703259334599e+03 +386 452 -8.091232579773156e+03 +386 453 -6.235592529048601e+03 +386 454 -4.560278038130808e+03 +386 455 -3.331754877699595e+03 +386 456 -2.521021940438006e+03 +386 457 -2.019368486704435e+03 +386 458 -1.733190400658708e+03 +386 459 -1.603684467943636e+03 +386 478 -1.697437739078445e+03 +386 479 -1.571600895131404e+03 +386 480 -1.368148367306964e+03 +386 481 -1.148042053110078e+03 +386 482 -9.536070604341750e+02 +386 483 -8.023274760830689e+02 +386 484 -6.956816209337401e+02 +386 485 -6.289529049931513e+02 +386 486 -5.970589583440833e+02 +387 316 -6.052974323170214e+02 +387 317 -6.378158089920680e+02 +387 318 -7.058924559832880e+02 +387 319 -8.148024630667953e+02 +387 320 -9.695072463564451e+02 +387 321 -1.168677565678393e+03 +387 322 -1.394551574360513e+03 +387 323 -1.603684467943636e+03 +387 324 -1.733190400658708e+03 +387 451 -1.103972130715916e+04 +387 452 -9.405703259334599e+03 +387 453 -7.138491575686255e+03 +387 454 -5.136224430633847e+03 +387 455 -3.699147964795170e+03 +387 456 -2.767706810094291e+03 +387 457 -2.199157547087195e+03 +387 458 -1.877824568765012e+03 +387 459 -1.733190400658708e+03 +387 478 -1.837845240586531e+03 +387 479 -1.697437739078445e+03 +387 480 -1.471477730866024e+03 +387 481 -1.228588660544048e+03 +387 482 -1.015511306612465e+03 +387 483 -8.507888885505199e+02 +387 484 -7.352796046183671e+02 +387 485 -6.632839990295103e+02 +387 486 -6.289529049931513e+02 +406 316 -6.289529049931513e+02 +406 317 -6.632839990295103e+02 +406 318 -7.352796046183671e+02 +406 319 -8.507888885505199e+02 +406 320 -1.015511306612465e+03 +406 321 -1.228588660544048e+03 +406 322 -1.471477730866024e+03 +406 323 -1.697437739078445e+03 +406 324 -1.837845240586531e+03 +406 343 -1.733190400658708e+03 +406 344 -1.877824568765012e+03 +406 345 -2.199157547087195e+03 +406 346 -2.767706810094291e+03 +406 347 -3.699147964795170e+03 +406 348 -5.136224430633847e+03 +406 349 -7.138491575686255e+03 +406 350 -9.405703259334599e+03 +406 351 -1.103972130715916e+04 +406 478 -1.733190400658708e+03 +406 479 -1.603684467943636e+03 +406 480 -1.394551574360513e+03 +406 481 -1.168677565678393e+03 +406 482 -9.695072463564451e+02 +406 483 -8.148024630667953e+02 +406 484 -7.058924559832880e+02 +406 485 -6.378158089920680e+02 +406 486 -6.052974323170214e+02 +407 316 -5.970589583440833e+02 +407 317 -6.289529049931513e+02 +407 318 -6.956816209337401e+02 +407 319 -8.023274760830689e+02 +407 320 -9.536070604341750e+02 +407 321 -1.148042053110078e+03 +407 322 -1.368148367306964e+03 +407 323 -1.571600895131404e+03 +407 324 -1.697437739078445e+03 +407 343 -1.603684467943636e+03 +407 344 -1.733190400658708e+03 +407 345 -2.019368486704435e+03 +407 346 -2.521021940438006e+03 +407 347 -3.331754877699595e+03 +407 348 -4.560278038130808e+03 +407 349 -6.235592529048601e+03 +407 350 -8.091232579773156e+03 +407 351 -9.405703259334599e+03 +407 478 -1.877824568765012e+03 +407 479 -1.733190400658708e+03 +407 480 -1.500725861549673e+03 +407 481 -1.251286952144482e+03 +407 482 -1.032880208377977e+03 +407 483 -8.643348602446090e+02 +407 484 -7.463158073460687e+02 +407 485 -6.728335244699299e+02 +407 486 -6.378158089920680e+02 +408 316 -5.429674662554829e+02 +408 317 -5.708523475060541e+02 +408 318 -6.289529049931513e+02 +408 319 -7.211778000851810e+02 +408 320 -8.507888885505199e+02 +408 321 -1.015511306612465e+03 +408 322 -1.199743197084304e+03 +408 323 -1.368148367306964e+03 +408 324 -1.471477730866024e+03 +408 343 -1.394551574360513e+03 +408 344 -1.500725861549673e+03 +408 345 -1.733190400658708e+03 +408 346 -2.134265778758331e+03 +408 347 -2.767706810094291e+03 +408 348 -3.699147964795170e+03 +408 349 -4.925216936196723e+03 +408 350 -6.235592529048601e+03 +408 351 -7.138491575686255e+03 +408 478 -2.199157547087195e+03 +408 479 -2.019368486704435e+03 +408 480 -1.733190400658708e+03 +408 481 -1.430197816180119e+03 +408 482 -1.168677565678393e+03 +408 483 -9.695072463564451e+02 +408 484 -8.315436028021828e+02 +408 485 -7.463158073460687e+02 +408 486 -7.058924559832880e+02 +409 316 -4.803677035258846e+02 +409 317 -5.038180997021782e+02 +409 318 -5.524312223207843e+02 +409 319 -6.289529049931513e+02 +409 320 -7.352796046183671e+02 +409 321 -8.685786765383772e+02 +409 322 -1.015511306612465e+03 +409 323 -1.148042053110078e+03 +409 324 -1.228588660544048e+03 +409 343 -1.168677565678393e+03 +409 344 -1.251286952144482e+03 +409 345 -1.430197816180119e+03 +409 346 -1.733190400658708e+03 +409 347 -2.199157547087195e+03 +409 348 -2.861294172280330e+03 +409 349 -3.699147964795170e+03 +409 350 -4.560278038130808e+03 +409 351 -5.136224430633847e+03 +409 478 -2.767706810094291e+03 +409 479 -2.521021940438006e+03 +409 480 -2.134265778758331e+03 +409 481 -1.733190400658708e+03 +409 482 -1.394551574360513e+03 +409 483 -1.141773184361047e+03 +409 484 -9.695072463564451e+02 +409 485 -8.643348602446090e+02 +409 486 -8.148024630667953e+02 +410 316 -4.208084537187718e+02 +410 317 -4.402579127124382e+02 +410 318 -4.803677035258846e+02 +410 319 -5.429674662554829e+02 +410 320 -6.289529049931513e+02 +410 321 -7.352796046183671e+02 +410 322 -8.507888885505199e+02 +410 323 -9.536070604341750e+02 +410 324 -1.015511306612465e+03 +410 343 -9.695072463564451e+02 +410 344 -1.032880208377977e+03 +410 345 -1.168677565678393e+03 +410 346 -1.394551574360513e+03 +410 347 -1.733190400658708e+03 +410 348 -2.199157547087195e+03 +410 349 -2.767706810094291e+03 +410 350 -3.331754877699595e+03 +410 351 -3.699147964795170e+03 +410 478 -3.699147964795170e+03 +410 479 -3.331754877699595e+03 +410 480 -2.767706810094291e+03 +410 481 -2.199157547087195e+03 +410 482 -1.733190400658708e+03 +410 483 -1.394551574360513e+03 +410 484 -1.168677565678393e+03 +410 485 -1.032880208377977e+03 +410 486 -9.695072463564451e+02 +411 316 -3.710963518270340e+02 +411 317 -3.873813675510149e+02 +411 318 -4.208084537187718e+02 +411 319 -4.725808574370898e+02 +411 320 -5.429674662554829e+02 +411 321 -6.289529049931513e+02 +411 322 -7.211778000851810e+02 +411 323 -8.023274760830689e+02 +411 324 -8.507888885505199e+02 +411 343 -8.148024630667953e+02 +411 344 -8.643348602446090e+02 +411 345 -9.695072463564451e+02 +411 346 -1.141773184361047e+03 +411 347 -1.394551574360513e+03 +411 348 -1.733190400658708e+03 +411 349 -2.134265778758331e+03 +411 350 -2.521021940438006e+03 +411 351 -2.767706810094291e+03 +411 478 -5.136224430633847e+03 +411 479 -4.560278038130808e+03 +411 480 -3.699147964795170e+03 +411 481 -2.861294172280330e+03 +411 482 -2.199157547087195e+03 +411 483 -1.733190400658708e+03 +411 484 -1.430197816180119e+03 +411 485 -1.251286952144482e+03 +411 486 -1.168677565678393e+03 +412 316 -3.339204550667992e+02 +412 317 -3.479505460244110e+02 +412 318 -3.766415408901786e+02 +412 319 -4.208084537187718e+02 +412 320 -4.803677035258846e+02 +412 321 -5.524312223207843e+02 +412 322 -6.289529049931513e+02 +412 323 -6.956816209337401e+02 +412 324 -7.352796046183671e+02 +412 343 -7.058924559832880e+02 +412 344 -7.463158073460687e+02 +412 345 -8.315436028021828e+02 +412 346 -9.695072463564451e+02 +412 347 -1.168677565678393e+03 +412 348 -1.430197816180119e+03 +412 349 -1.733190400658708e+03 +412 350 -2.019368486704435e+03 +412 351 -2.199157547087195e+03 +412 478 -7.138491575686255e+03 +412 479 -6.235592529048601e+03 +412 480 -4.925216936196723e+03 +412 481 -3.699147964795170e+03 +412 482 -2.767706810094291e+03 +412 483 -2.134265778758331e+03 +412 484 -1.733190400658708e+03 +412 485 -1.500725861549673e+03 +412 486 -1.394551574360513e+03 +413 316 -3.096178268240468e+02 +413 317 -3.222285372305477e+02 +413 318 -3.479505460244110e+02 +413 319 -3.873813675510149e+02 +413 320 -4.402579127124382e+02 +413 321 -5.038180997021782e+02 +413 322 -5.708523475060541e+02 +413 323 -6.289529049931513e+02 +413 324 -6.632839990295103e+02 +413 343 -6.378158089920680e+02 +413 344 -6.728335244699299e+02 +413 345 -7.463158073460687e+02 +413 346 -8.643348602446090e+02 +413 347 -1.032880208377977e+03 +413 348 -1.251286952144482e+03 +413 349 -1.500725861549673e+03 +413 350 -1.733190400658708e+03 +413 351 -1.877824568765012e+03 +413 478 -9.405703259334599e+03 +413 479 -8.091232579773156e+03 +413 480 -6.235592529048601e+03 +413 481 -4.560278038130808e+03 +413 482 -3.331754877699595e+03 +413 483 -2.521021940438006e+03 +413 484 -2.019368486704435e+03 +413 485 -1.733190400658708e+03 +413 486 -1.603684467943636e+03 +414 316 -2.976873911031304e+02 +414 317 -3.096178268240468e+02 +414 318 -3.339204550667992e+02 +414 319 -3.710963518270340e+02 +414 320 -4.208084537187718e+02 +414 321 -4.803677035258846e+02 +414 322 -5.429674662554829e+02 +414 323 -5.970589583440833e+02 +414 324 -6.289529049931513e+02 +414 343 -6.052974323170214e+02 +414 344 -6.378158089920680e+02 +414 345 -7.058924559832880e+02 +414 346 -8.148024630667953e+02 +414 347 -9.695072463564451e+02 +414 348 -1.168677565678393e+03 +414 349 -1.394551574360513e+03 +414 350 -1.603684467943636e+03 +414 351 -1.733190400658708e+03 +414 478 -1.103972130715916e+04 +414 479 -9.405703259334599e+03 +414 480 -7.138491575686255e+03 +414 481 -5.136224430633847e+03 +414 482 -3.699147964795170e+03 +414 483 -2.767706810094291e+03 +414 484 -2.199157547087195e+03 +414 485 -1.877824568765012e+03 +414 486 -1.733190400658708e+03 +433 19 -1.991107111565965e+01 +433 20 -2.093719788835411e+01 +433 21 -2.307598824675226e+01 +433 22 -2.647296871472281e+01 +433 23 -3.125086631899855e+01 +433 24 -3.732898087506940e+01 +433 25 -4.413404839473380e+01 +433 26 -5.036046812896164e+01 +433 27 -5.418346883337077e+01 +433 154 -5.416220002058462e+01 +433 155 -5.847168336242219e+01 +433 156 -6.797204698756194e+01 +433 157 -8.455751811576003e+01 +433 158 -1.112023202068744e+02 +433 159 -1.512628164030905e+02 +433 160 -2.053883607687488e+02 +433 161 -2.647767438527633e+02 +433 162 -3.065373731090124e+02 +433 721 -5.416220002058459e+01 +433 722 -5.028460369863168e+01 +433 723 -4.398263164573861e+01 +433 724 -3.711530555640484e+01 +433 725 -3.100122392289862e+01 +433 726 -2.620940698061743e+01 +433 727 -2.281096793104269e+01 +433 728 -2.067515029553632e+01 +433 729 -1.965157861598589e+01 +434 19 -1.893955522946071e+01 +434 20 -1.989560185214644e+01 +434 21 -2.188410977607283e+01 +434 22 -2.503139824866494e+01 +434 23 -2.943714101946019e+01 +434 24 -3.500990342666080e+01 +434 25 -4.121117314784707e+01 +434 26 -4.685337395180393e+01 +434 27 -5.030377157426124e+01 +434 154 -5.028460369863168e+01 +434 155 -5.416220002058463e+01 +434 156 -6.266865647386101e+01 +434 157 -7.739429142416689e+01 +434 158 -1.007640600234616e+02 +434 159 -1.353445496343035e+02 +434 160 -1.811983282511273e+02 +434 161 -2.305668762810884e+02 +434 162 -2.647767438527633e+02 +434 721 -5.847168336242214e+01 +434 722 -5.416220002058462e+01 +434 723 -4.718848846240642e+01 +434 724 -3.963467701820886e+01 +434 725 -3.295302401855845e+01 +434 726 -2.774798050936781e+01 +434 727 -2.407490908992508e+01 +434 728 -2.177494503977683e+01 +434 729 -2.067515029553633e+01 +435 19 -1.728544380971680e+01 +435 20 -1.812561732539474e+01 +435 21 -1.986657463968434e+01 +435 22 -2.260509745887257e+01 +435 23 -2.640668072821098e+01 +435 24 -3.116725487037769e+01 +435 25 -3.640844585123290e+01 +435 26 -4.113074346035618e+01 +435 27 -4.399852269562553e+01 +435 154 -4.398263164573862e+01 +435 155 -4.718848846240646e+01 +435 156 -5.416220002058463e+01 +435 157 -6.606134132672690e+01 +435 158 -8.455751811576003e+01 +435 159 -1.112023202068745e+02 +435 160 -1.454508347890308e+02 +435 161 -1.811983282511274e+02 +435 162 -2.053883607687489e+02 +435 721 -6.797204698756190e+01 +435 722 -6.266865647386100e+01 +435 723 -5.416220002058459e+01 +435 724 -4.506046026496939e+01 +435 725 -3.711530555640484e+01 +435 726 -3.100122392289862e+01 +435 727 -2.672989532903559e+01 +435 728 -2.407490908992507e+01 +435 729 -2.281096793104269e+01 +436 19 -1.536041981565910e+01 +436 20 -1.607147906097268e+01 +436 21 -1.753807892477654e+01 +436 22 -1.982756005143804e+01 +436 23 -2.297333837373615e+01 +436 24 -2.686477956635888e+01 +436 25 -3.109398676867848e+01 +436 26 -3.485989373031347e+01 +436 27 -3.712783483139469e+01 +436 154 -3.711530555640484e+01 +436 155 -3.963467701820886e+01 +436 156 -4.506046026496942e+01 +436 157 -5.416220002058462e+01 +436 158 -6.797204698756194e+01 +436 159 -8.726265053974946e+01 +436 160 -1.112023202068744e+02 +436 161 -1.353445496343034e+02 +436 162 -1.512628164030904e+02 +436 721 -8.455751811575999e+01 +436 722 -7.739429142416689e+01 +436 723 -6.606134132672688e+01 +436 724 -5.416220002058462e+01 +436 725 -4.398263164573862e+01 +436 726 -3.629276779865594e+01 +436 727 -3.100122392289864e+01 +436 728 -2.774798050936781e+01 +436 729 -2.620940698061744e+01 +437 19 -1.351735258598665e+01 +437 20 -1.411095423929573e+01 +437 21 -1.532947239370201e+01 +437 22 -1.721692110798160e+01 +437 23 -1.978332451793855e+01 +437 24 -2.291897994803823e+01 +437 25 -2.628272736093493e+01 +437 26 -2.924296537776258e+01 +437 27 -3.101096203863813e+01 +437 154 -3.100122392289862e+01 +437 155 -3.295302401855845e+01 +437 156 -3.711530555640486e+01 +437 157 -4.398263164573862e+01 +437 158 -5.416220002058462e+01 +437 159 -6.797204698756194e+01 +437 160 -8.455751811576002e+01 +437 161 -1.007640600234616e+02 +437 162 -1.112023202068744e+02 +437 721 -1.112023202068744e+02 +437 722 -1.007640600234616e+02 +437 723 -8.455751811575999e+01 +437 724 -6.797204698756194e+01 +437 725 -5.416220002058462e+01 +437 726 -4.398263164573862e+01 +437 727 -3.711530555640486e+01 +437 728 -3.295302401855845e+01 +437 729 -3.100122392289864e+01 +438 19 -1.196963380328471e+01 +438 20 -1.246959003743170e+01 +438 21 -1.349147409209131e+01 +438 22 -1.506329283501405e+01 +438 23 -1.718061587490500e+01 +438 24 -1.973922702727213e+01 +438 25 -2.245255029988596e+01 +438 26 -2.481584434765892e+01 +438 27 -2.621710498981521e+01 +438 154 -2.620940698061743e+01 +438 155 -2.774798050936781e+01 +438 156 -3.100122392289864e+01 +438 157 -3.629276779865594e+01 +438 158 -4.398263164573862e+01 +438 159 -5.416220002058463e+01 +438 160 -6.606134132672689e+01 +438 161 -7.739429142416689e+01 +438 162 -8.455751811576003e+01 +438 721 -1.512628164030903e+02 +438 722 -1.353445496343034e+02 +438 723 -1.112023202068744e+02 +438 724 -8.726265053974943e+01 +438 725 -6.797204698756194e+01 +438 726 -5.416220002058462e+01 +438 727 -4.506046026496942e+01 +438 728 -3.963467701820886e+01 +438 729 -3.711530555640486e+01 +439 19 -1.080617337674904e+01 +439 20 -1.123894121450387e+01 +439 21 -1.212045029813403e+01 +439 22 -1.346877420701742e+01 +439 23 -1.527154601379911e+01 +439 24 -1.743110242959431e+01 +439 25 -1.970056197777982e+01 +439 26 -2.166130322083090e+01 +439 27 -2.281730567555881e+01 +439 154 -2.281096793104269e+01 +439 155 -2.407490908992508e+01 +439 156 -2.672989532903560e+01 +439 157 -3.100122392289864e+01 +439 158 -3.711530555640486e+01 +439 159 -4.506046026496942e+01 +439 160 -5.416220002058463e+01 +439 161 -6.266865647386102e+01 +439 162 -6.797204698756197e+01 +439 721 -2.053883607687485e+02 +439 722 -1.811983282511272e+02 +439 723 -1.454508347890306e+02 +439 724 -1.112023202068744e+02 +439 725 -8.455751811575999e+01 +439 726 -6.606134132672688e+01 +439 727 -5.416220002058462e+01 +439 728 -4.718848846240642e+01 +439 729 -4.398263164573862e+01 +440 19 -1.004260648334986e+01 +440 20 -1.043286327914096e+01 +440 21 -1.122588997995913e+01 +440 22 -1.243419956984991e+01 +440 23 -1.404151072673463e+01 +440 24 -1.595544620225204e+01 +440 25 -1.795438621453205e+01 +440 26 -1.967193224966084e+01 +440 27 -2.068067308410458e+01 +440 154 -2.067515029553632e+01 +440 155 -2.177494503977683e+01 +440 156 -2.407490908992508e+01 +440 157 -2.774798050936781e+01 +440 158 -3.295302401855845e+01 +440 159 -3.963467701820886e+01 +440 160 -4.718848846240642e+01 +440 161 -5.416220002058462e+01 +440 162 -5.847168336242218e+01 +440 721 -2.647767438527630e+02 +440 722 -2.305668762810884e+02 +440 723 -1.811983282511272e+02 +440 724 -1.353445496343034e+02 +440 725 -1.007640600234616e+02 +440 726 -7.739429142416689e+01 +440 727 -6.266865647386102e+01 +440 728 -5.416220002058462e+01 +440 729 -5.028460369863171e+01 +441 19 -9.666854708275386e+00 +441 20 -1.003667205670584e+01 +441 21 -1.078725511314278e+01 +441 22 -1.192865494651639e+01 +441 23 -1.344302577202160e+01 +441 24 -1.524084888303110e+01 +441 25 -1.711267378841840e+01 +441 26 -1.871655367510611e+01 +441 27 -1.965672242765773e+01 +441 154 -1.965157861598589e+01 +441 155 -2.067515029553633e+01 +441 156 -2.281096793104268e+01 +441 157 -2.620940698061743e+01 +441 158 -3.100122392289862e+01 +441 159 -3.711530555640486e+01 +441 160 -4.398263164573862e+01 +441 161 -5.028460369863168e+01 +441 162 -5.416220002058462e+01 +441 721 -3.065373731090121e+02 +441 722 -2.647767438527633e+02 +441 723 -2.053883607687487e+02 +441 724 -1.512628164030904e+02 +441 725 -1.112023202068744e+02 +441 726 -8.455751811576003e+01 +441 727 -6.797204698756197e+01 +441 728 -5.847168336242218e+01 +441 729 -5.416220002058465e+01 +442 307 -3.063876713483002e+02 +442 308 -3.311617365195740e+02 +442 309 -3.859179776157595e+02 +442 310 -4.819366867771664e+02 +442 311 -6.371952057562393e+02 +442 312 -8.726231103602329e+02 +442 313 -1.193932486839834e+03 +442 314 -1.550121445008505e+03 +442 315 -1.802596433195452e+03 +442 595 -3.063876713483004e+02 +442 596 -2.841326260213864e+02 +442 597 -2.480403651673273e+02 +442 598 -2.088271183655455e+02 +442 599 -1.740274317161709e+02 +442 600 -1.468355065336027e+02 +442 601 -1.275984131219180e+02 +442 602 -1.155304899028560e+02 +442 603 -1.097534196790493e+02 +442 658 -1.111842160419090e+02 +442 659 -1.057061586526020e+02 +442 660 -9.638822517401596e+01 +442 661 -8.555928471614152e+01 +442 662 -7.520762033775924e+01 +442 663 -6.652797451218335e+01 +442 664 -6.001174723167340e+01 +442 665 -5.573941364116936e+01 +442 666 -5.363826960242958e+01 +443 307 -2.841326260213859e+02 +443 308 -3.063876713483004e+02 +443 309 -3.553280674768354e+02 +443 310 -4.404031329187421e+02 +443 311 -5.762343277298875e+02 +443 312 -7.788097592344268e+02 +443 313 -1.049909849375152e+03 +443 314 -1.344510568096307e+03 +443 315 -1.550121445008508e+03 +443 595 -3.311617365195740e+02 +443 596 -3.063876713483007e+02 +443 597 -2.663884709281892e+02 +443 598 -2.231981844606887e+02 +443 599 -1.851243485745372e+02 +443 600 -1.555580782497811e+02 +443 601 -1.347481526436477e+02 +443 602 -1.217424124188380e+02 +443 603 -1.155304899028560e+02 +443 658 -1.170681125153375e+02 +443 659 -1.111842160419090e+02 +443 660 -1.011961191083175e+02 +443 661 -8.962181586287872e+01 +443 662 -7.859349409841366e+01 +443 663 -6.937545782864693e+01 +443 664 -6.247361649834820e+01 +443 665 -5.795761808209192e+01 +443 666 -5.573941364116936e+01 +444 307 -2.480403651673274e+02 +444 308 -2.663884709281895e+02 +444 309 -3.063876713483004e+02 +444 310 -3.748904053829394e+02 +444 311 -4.819366867771671e+02 +444 312 -6.371952057562402e+02 +444 313 -8.383319685358463e+02 +444 314 -1.049909849375152e+03 +444 315 -1.193932486839836e+03 +444 595 -3.859179776157595e+02 +444 596 -3.553280674768358e+02 +444 597 -3.063876713483000e+02 +444 598 -2.542062119667730e+02 +444 599 -2.088271183655455e+02 +444 600 -1.740274317161709e+02 +444 601 -1.497853840269158e+02 +444 602 -1.347481526436475e+02 +444 603 -1.275984131219178e+02 +444 658 -1.293661657908651e+02 +444 659 -1.226088998409725e+02 +444 660 -1.111842160419088e+02 +444 661 -9.802102195827702e+01 +444 662 -8.555928471614152e+01 +444 663 -7.520762033775924e+01 +444 664 -6.749803222962949e+01 +444 665 -6.247361649834813e+01 +444 666 -6.001174723167332e+01 +445 307 -2.088271183655456e+02 +445 308 -2.231981844606889e+02 +445 309 -2.542062119667733e+02 +445 310 -3.063876713483004e+02 +445 311 -3.859179776157600e+02 +445 312 -4.976453857371593e+02 +445 313 -6.371952057562402e+02 +445 314 -7.788097592344268e+02 +445 315 -8.726231103602345e+02 +445 595 -4.819366867771664e+02 +445 596 -4.404031329187428e+02 +445 597 -3.748904053829390e+02 +445 598 -3.063876713483000e+02 +445 599 -2.480403651673273e+02 +445 600 -2.041390437321799e+02 +445 601 -1.740274317161709e+02 +445 602 -1.555580782497809e+02 +445 603 -1.468355065336024e+02 +445 658 -1.489885081652993e+02 +445 659 -1.407716848553632e+02 +445 660 -1.269615920628682e+02 +445 661 -1.111842160419088e+02 +445 662 -9.638822517401596e+01 +445 663 -8.420868002944921e+01 +445 664 -7.520762033775924e+01 +445 665 -6.937545782864684e+01 +445 666 -6.652797451218328e+01 +446 307 -1.740274317161708e+02 +446 308 -1.851243485745372e+02 +446 309 -2.088271183655455e+02 +446 310 -2.480403651673273e+02 +446 311 -3.063876713483004e+02 +446 312 -3.859179776157600e+02 +446 313 -4.819366867771671e+02 +446 314 -5.762343277298875e+02 +446 315 -6.371952057562402e+02 +446 595 -6.371952057562393e+02 +446 596 -5.762343277298883e+02 +446 597 -4.819366867771664e+02 +446 598 -3.859179776157595e+02 +446 599 -3.063876713483004e+02 +446 600 -2.480403651673276e+02 +446 601 -2.088271183655457e+02 +446 602 -1.851243485745370e+02 +446 603 -1.740274317161707e+02 +446 658 -1.767605489846857e+02 +446 659 -1.663510232448635e+02 +446 660 -1.489885081652992e+02 +446 661 -1.293661657908650e+02 +446 662 -1.111842160419089e+02 +446 663 -9.638822517401600e+01 +446 664 -8.555928471614156e+01 +446 665 -7.859349409841361e+01 +446 666 -7.520762033775921e+01 +447 307 -1.468355065336025e+02 +447 308 -1.555580782497810e+02 +447 309 -1.740274317161707e+02 +447 310 -2.041390437321797e+02 +447 311 -2.480403651673273e+02 +447 312 -3.063876713483004e+02 +447 313 -3.748904053829394e+02 +447 314 -4.404031329187421e+02 +447 315 -4.819366867771671e+02 +447 595 -8.726231103602329e+02 +447 596 -7.788097592344280e+02 +447 597 -6.371952057562393e+02 +447 598 -4.976453857371587e+02 +447 599 -3.859179776157600e+02 +447 600 -3.063876713483007e+02 +447 601 -2.542062119667736e+02 +447 602 -2.231981844606887e+02 +447 603 -2.088271183655455e+02 +447 658 -2.123577731150847e+02 +447 659 -1.989422168423270e+02 +447 660 -1.767605489846855e+02 +447 661 -1.519993633210926e+02 +447 662 -1.293661657908651e+02 +447 663 -1.111842160419090e+02 +447 664 -9.802102195827715e+01 +447 665 -8.962181586287872e+01 +447 666 -8.555928471614152e+01 +448 307 -1.275984131219178e+02 +448 308 -1.347481526436476e+02 +448 309 -1.497853840269158e+02 +448 310 -1.740274317161707e+02 +448 311 -2.088271183655455e+02 +448 312 -2.542062119667733e+02 +448 313 -3.063876713483004e+02 +448 314 -3.553280674768354e+02 +448 315 -3.859179776157600e+02 +448 595 -1.193932486839834e+03 +448 596 -1.049909849375154e+03 +448 597 -8.383319685358450e+02 +448 598 -6.371952057562393e+02 +448 599 -4.819366867771671e+02 +448 600 -3.748904053829399e+02 +448 601 -3.063876713483007e+02 +448 602 -2.663884709281892e+02 +448 603 -2.480403651673273e+02 +448 658 -2.525366109215769e+02 +448 659 -2.354925657825781e+02 +448 660 -2.075588680195231e+02 +448 661 -1.767605489846855e+02 +448 662 -1.489885081652993e+02 +448 663 -1.269615920628684e+02 +448 664 -1.111842160419090e+02 +448 665 -1.011961191083175e+02 +448 666 -9.638822517401596e+01 +449 307 -1.155304899028561e+02 +449 308 -1.217424124188380e+02 +449 309 -1.347481526436476e+02 +449 310 -1.555580782497810e+02 +449 311 -1.851243485745372e+02 +449 312 -2.231981844606889e+02 +449 313 -2.663884709281895e+02 +449 314 -3.063876713483004e+02 +449 315 -3.311617365195743e+02 +449 595 -1.550121445008505e+03 +449 596 -1.344510568096310e+03 +449 597 -1.049909849375151e+03 +449 598 -7.788097592344254e+02 +449 599 -5.762343277298875e+02 +449 600 -4.404031329187428e+02 +449 601 -3.553280674768358e+02 +449 602 -3.063876713483000e+02 +449 603 -2.841326260213858e+02 +449 658 -2.895745815575323e+02 +449 659 -2.689865983609326e+02 +449 660 -2.354925657825776e+02 +449 661 -1.989422168423266e+02 +449 662 -1.663510232448634e+02 +449 663 -1.407716848553632e+02 +449 664 -1.226088998409725e+02 +449 665 -1.111842160419088e+02 +449 666 -1.057061586526019e+02 +450 307 -1.097534196790493e+02 +450 308 -1.155304899028560e+02 +450 309 -1.275984131219178e+02 +450 310 -1.468355065336024e+02 +450 311 -1.740274317161707e+02 +450 312 -2.088271183655455e+02 +450 313 -2.480403651673273e+02 +450 314 -2.841326260213858e+02 +450 315 -3.063876713483004e+02 +450 595 -1.802596433195452e+03 +450 596 -1.550121445008512e+03 +450 597 -1.193932486839834e+03 +450 598 -8.726231103602329e+02 +450 599 -6.371952057562402e+02 +450 600 -4.819366867771678e+02 +450 601 -3.859179776157605e+02 +450 602 -3.311617365195740e+02 +450 603 -3.063876713483004e+02 +450 658 -3.124380547854544e+02 +450 659 -2.895745815575327e+02 +450 660 -2.525366109215767e+02 +450 661 -2.123577731150844e+02 +450 662 -1.767605489846857e+02 +450 663 -1.489885081652994e+02 +450 664 -1.293661657908652e+02 +450 665 -1.170681125153374e+02 +450 666 -1.111842160419089e+02 +451 379 -1.733190400658708e+03 +451 380 -1.877824568765012e+03 +451 381 -2.199157547087195e+03 +451 382 -2.767706810094291e+03 +451 383 -3.699147964795170e+03 +451 384 -5.136224430633847e+03 +451 385 -7.138491575686255e+03 +451 386 -9.405703259334599e+03 +451 387 -1.103972130715916e+04 +451 514 -1.733190400658708e+03 +451 515 -1.603684467943636e+03 +451 516 -1.394551574360513e+03 +451 517 -1.168677565678393e+03 +451 518 -9.695072463564451e+02 +451 519 -8.148024630667953e+02 +451 520 -7.058924559832880e+02 +451 521 -6.378158089920680e+02 +451 522 -6.052974323170214e+02 +451 541 -6.289529049931513e+02 +451 542 -5.970589583440833e+02 +451 543 -5.429674662554829e+02 +451 544 -4.803677035258846e+02 +451 545 -4.208084537187718e+02 +451 546 -3.710963518270340e+02 +451 547 -3.339204550667992e+02 +451 548 -3.096178268240468e+02 +451 549 -2.976873911031304e+02 +452 379 -1.603684467943636e+03 +452 380 -1.733190400658708e+03 +452 381 -2.019368486704435e+03 +452 382 -2.521021940438006e+03 +452 383 -3.331754877699595e+03 +452 384 -4.560278038130808e+03 +452 385 -6.235592529048601e+03 +452 386 -8.091232579773156e+03 +452 387 -9.405703259334599e+03 +452 514 -1.877824568765012e+03 +452 515 -1.733190400658708e+03 +452 516 -1.500725861549673e+03 +452 517 -1.251286952144482e+03 +452 518 -1.032880208377977e+03 +452 519 -8.643348602446090e+02 +452 520 -7.463158073460687e+02 +452 521 -6.728335244699299e+02 +452 522 -6.378158089920680e+02 +452 541 -6.632839990295103e+02 +452 542 -6.289529049931513e+02 +452 543 -5.708523475060541e+02 +452 544 -5.038180997021782e+02 +452 545 -4.402579127124382e+02 +452 546 -3.873813675510149e+02 +452 547 -3.479505460244110e+02 +452 548 -3.222285372305477e+02 +452 549 -3.096178268240468e+02 +453 379 -1.394551574360513e+03 +453 380 -1.500725861549673e+03 +453 381 -1.733190400658708e+03 +453 382 -2.134265778758331e+03 +453 383 -2.767706810094291e+03 +453 384 -3.699147964795170e+03 +453 385 -4.925216936196723e+03 +453 386 -6.235592529048601e+03 +453 387 -7.138491575686255e+03 +453 514 -2.199157547087195e+03 +453 515 -2.019368486704435e+03 +453 516 -1.733190400658708e+03 +453 517 -1.430197816180119e+03 +453 518 -1.168677565678393e+03 +453 519 -9.695072463564451e+02 +453 520 -8.315436028021828e+02 +453 521 -7.463158073460687e+02 +453 522 -7.058924559832880e+02 +453 541 -7.352796046183671e+02 +453 542 -6.956816209337401e+02 +453 543 -6.289529049931513e+02 +453 544 -5.524312223207843e+02 +453 545 -4.803677035258846e+02 +453 546 -4.208084537187718e+02 +453 547 -3.766415408901786e+02 +453 548 -3.479505460244110e+02 +453 549 -3.339204550667992e+02 +454 379 -1.168677565678393e+03 +454 380 -1.251286952144482e+03 +454 381 -1.430197816180119e+03 +454 382 -1.733190400658708e+03 +454 383 -2.199157547087195e+03 +454 384 -2.861294172280330e+03 +454 385 -3.699147964795170e+03 +454 386 -4.560278038130808e+03 +454 387 -5.136224430633847e+03 +454 514 -2.767706810094291e+03 +454 515 -2.521021940438006e+03 +454 516 -2.134265778758331e+03 +454 517 -1.733190400658708e+03 +454 518 -1.394551574360513e+03 +454 519 -1.141773184361047e+03 +454 520 -9.695072463564451e+02 +454 521 -8.643348602446090e+02 +454 522 -8.148024630667953e+02 +454 541 -8.507888885505199e+02 +454 542 -8.023274760830689e+02 +454 543 -7.211778000851810e+02 +454 544 -6.289529049931513e+02 +454 545 -5.429674662554829e+02 +454 546 -4.725808574370898e+02 +454 547 -4.208084537187718e+02 +454 548 -3.873813675510149e+02 +454 549 -3.710963518270340e+02 +455 379 -9.695072463564451e+02 +455 380 -1.032880208377977e+03 +455 381 -1.168677565678393e+03 +455 382 -1.394551574360513e+03 +455 383 -1.733190400658708e+03 +455 384 -2.199157547087195e+03 +455 385 -2.767706810094291e+03 +455 386 -3.331754877699595e+03 +455 387 -3.699147964795170e+03 +455 514 -3.699147964795170e+03 +455 515 -3.331754877699595e+03 +455 516 -2.767706810094291e+03 +455 517 -2.199157547087195e+03 +455 518 -1.733190400658708e+03 +455 519 -1.394551574360513e+03 +455 520 -1.168677565678393e+03 +455 521 -1.032880208377977e+03 +455 522 -9.695072463564451e+02 +455 541 -1.015511306612465e+03 +455 542 -9.536070604341750e+02 +455 543 -8.507888885505199e+02 +455 544 -7.352796046183671e+02 +455 545 -6.289529049931513e+02 +455 546 -5.429674662554829e+02 +455 547 -4.803677035258846e+02 +455 548 -4.402579127124382e+02 +455 549 -4.208084537187718e+02 +456 379 -8.148024630667953e+02 +456 380 -8.643348602446090e+02 +456 381 -9.695072463564451e+02 +456 382 -1.141773184361047e+03 +456 383 -1.394551574360513e+03 +456 384 -1.733190400658708e+03 +456 385 -2.134265778758331e+03 +456 386 -2.521021940438006e+03 +456 387 -2.767706810094291e+03 +456 514 -5.136224430633847e+03 +456 515 -4.560278038130808e+03 +456 516 -3.699147964795170e+03 +456 517 -2.861294172280330e+03 +456 518 -2.199157547087195e+03 +456 519 -1.733190400658708e+03 +456 520 -1.430197816180119e+03 +456 521 -1.251286952144482e+03 +456 522 -1.168677565678393e+03 +456 541 -1.228588660544048e+03 +456 542 -1.148042053110078e+03 +456 543 -1.015511306612465e+03 +456 544 -8.685786765383772e+02 +456 545 -7.352796046183671e+02 +456 546 -6.289529049931513e+02 +456 547 -5.524312223207843e+02 +456 548 -5.038180997021782e+02 +456 549 -4.803677035258846e+02 +457 379 -7.058924559832880e+02 +457 380 -7.463158073460687e+02 +457 381 -8.315436028021828e+02 +457 382 -9.695072463564451e+02 +457 383 -1.168677565678393e+03 +457 384 -1.430197816180119e+03 +457 385 -1.733190400658708e+03 +457 386 -2.019368486704435e+03 +457 387 -2.199157547087195e+03 +457 514 -7.138491575686255e+03 +457 515 -6.235592529048601e+03 +457 516 -4.925216936196723e+03 +457 517 -3.699147964795170e+03 +457 518 -2.767706810094291e+03 +457 519 -2.134265778758331e+03 +457 520 -1.733190400658708e+03 +457 521 -1.500725861549673e+03 +457 522 -1.394551574360513e+03 +457 541 -1.471477730866024e+03 +457 542 -1.368148367306964e+03 +457 543 -1.199743197084304e+03 +457 544 -1.015511306612465e+03 +457 545 -8.507888885505199e+02 +457 546 -7.211778000851810e+02 +457 547 -6.289529049931513e+02 +457 548 -5.708523475060541e+02 +457 549 -5.429674662554829e+02 +458 379 -6.378158089920680e+02 +458 380 -6.728335244699299e+02 +458 381 -7.463158073460687e+02 +458 382 -8.643348602446090e+02 +458 383 -1.032880208377977e+03 +458 384 -1.251286952144482e+03 +458 385 -1.500725861549673e+03 +458 386 -1.733190400658708e+03 +458 387 -1.877824568765012e+03 +458 514 -9.405703259334599e+03 +458 515 -8.091232579773156e+03 +458 516 -6.235592529048601e+03 +458 517 -4.560278038130808e+03 +458 518 -3.331754877699595e+03 +458 519 -2.521021940438006e+03 +458 520 -2.019368486704435e+03 +458 521 -1.733190400658708e+03 +458 522 -1.603684467943636e+03 +458 541 -1.697437739078445e+03 +458 542 -1.571600895131404e+03 +458 543 -1.368148367306964e+03 +458 544 -1.148042053110078e+03 +458 545 -9.536070604341750e+02 +458 546 -8.023274760830689e+02 +458 547 -6.956816209337401e+02 +458 548 -6.289529049931513e+02 +458 549 -5.970589583440833e+02 +459 379 -6.052974323170214e+02 +459 380 -6.378158089920680e+02 +459 381 -7.058924559832880e+02 +459 382 -8.148024630667953e+02 +459 383 -9.695072463564451e+02 +459 384 -1.168677565678393e+03 +459 385 -1.394551574360513e+03 +459 386 -1.603684467943636e+03 +459 387 -1.733190400658708e+03 +459 514 -1.103972130715916e+04 +459 515 -9.405703259334599e+03 +459 516 -7.138491575686255e+03 +459 517 -5.136224430633847e+03 +459 518 -3.699147964795170e+03 +459 519 -2.767706810094291e+03 +459 520 -2.199157547087195e+03 +459 521 -1.877824568765012e+03 +459 522 -1.733190400658708e+03 +459 541 -1.837845240586531e+03 +459 542 -1.697437739078445e+03 +459 543 -1.471477730866024e+03 +459 544 -1.228588660544048e+03 +459 545 -1.015511306612465e+03 +459 546 -8.507888885505199e+02 +459 547 -7.352796046183671e+02 +459 548 -6.632839990295103e+02 +459 549 -6.289529049931513e+02 +478 379 -6.289529049931513e+02 +478 380 -6.632839990295103e+02 +478 381 -7.352796046183671e+02 +478 382 -8.507888885505199e+02 +478 383 -1.015511306612465e+03 +478 384 -1.228588660544048e+03 +478 385 -1.471477730866024e+03 +478 386 -1.697437739078445e+03 +478 387 -1.837845240586531e+03 +478 406 -1.733190400658708e+03 +478 407 -1.877824568765012e+03 +478 408 -2.199157547087195e+03 +478 409 -2.767706810094291e+03 +478 410 -3.699147964795170e+03 +478 411 -5.136224430633847e+03 +478 412 -7.138491575686255e+03 +478 413 -9.405703259334599e+03 +478 414 -1.103972130715916e+04 +478 541 -1.733190400658708e+03 +478 542 -1.603684467943636e+03 +478 543 -1.394551574360513e+03 +478 544 -1.168677565678393e+03 +478 545 -9.695072463564451e+02 +478 546 -8.148024630667953e+02 +478 547 -7.058924559832880e+02 +478 548 -6.378158089920680e+02 +478 549 -6.052974323170214e+02 +479 379 -5.970589583440833e+02 +479 380 -6.289529049931513e+02 +479 381 -6.956816209337401e+02 +479 382 -8.023274760830689e+02 +479 383 -9.536070604341750e+02 +479 384 -1.148042053110078e+03 +479 385 -1.368148367306964e+03 +479 386 -1.571600895131404e+03 +479 387 -1.697437739078445e+03 +479 406 -1.603684467943636e+03 +479 407 -1.733190400658708e+03 +479 408 -2.019368486704435e+03 +479 409 -2.521021940438006e+03 +479 410 -3.331754877699595e+03 +479 411 -4.560278038130808e+03 +479 412 -6.235592529048601e+03 +479 413 -8.091232579773156e+03 +479 414 -9.405703259334599e+03 +479 541 -1.877824568765012e+03 +479 542 -1.733190400658708e+03 +479 543 -1.500725861549673e+03 +479 544 -1.251286952144482e+03 +479 545 -1.032880208377977e+03 +479 546 -8.643348602446090e+02 +479 547 -7.463158073460687e+02 +479 548 -6.728335244699299e+02 +479 549 -6.378158089920680e+02 +480 379 -5.429674662554829e+02 +480 380 -5.708523475060541e+02 +480 381 -6.289529049931513e+02 +480 382 -7.211778000851810e+02 +480 383 -8.507888885505199e+02 +480 384 -1.015511306612465e+03 +480 385 -1.199743197084304e+03 +480 386 -1.368148367306964e+03 +480 387 -1.471477730866024e+03 +480 406 -1.394551574360513e+03 +480 407 -1.500725861549673e+03 +480 408 -1.733190400658708e+03 +480 409 -2.134265778758331e+03 +480 410 -2.767706810094291e+03 +480 411 -3.699147964795170e+03 +480 412 -4.925216936196723e+03 +480 413 -6.235592529048601e+03 +480 414 -7.138491575686255e+03 +480 541 -2.199157547087195e+03 +480 542 -2.019368486704435e+03 +480 543 -1.733190400658708e+03 +480 544 -1.430197816180119e+03 +480 545 -1.168677565678393e+03 +480 546 -9.695072463564451e+02 +480 547 -8.315436028021828e+02 +480 548 -7.463158073460687e+02 +480 549 -7.058924559832880e+02 +481 379 -4.803677035258846e+02 +481 380 -5.038180997021782e+02 +481 381 -5.524312223207843e+02 +481 382 -6.289529049931513e+02 +481 383 -7.352796046183671e+02 +481 384 -8.685786765383772e+02 +481 385 -1.015511306612465e+03 +481 386 -1.148042053110078e+03 +481 387 -1.228588660544048e+03 +481 406 -1.168677565678393e+03 +481 407 -1.251286952144482e+03 +481 408 -1.430197816180119e+03 +481 409 -1.733190400658708e+03 +481 410 -2.199157547087195e+03 +481 411 -2.861294172280330e+03 +481 412 -3.699147964795170e+03 +481 413 -4.560278038130808e+03 +481 414 -5.136224430633847e+03 +481 541 -2.767706810094291e+03 +481 542 -2.521021940438006e+03 +481 543 -2.134265778758331e+03 +481 544 -1.733190400658708e+03 +481 545 -1.394551574360513e+03 +481 546 -1.141773184361047e+03 +481 547 -9.695072463564451e+02 +481 548 -8.643348602446090e+02 +481 549 -8.148024630667953e+02 +482 379 -4.208084537187718e+02 +482 380 -4.402579127124382e+02 +482 381 -4.803677035258846e+02 +482 382 -5.429674662554829e+02 +482 383 -6.289529049931513e+02 +482 384 -7.352796046183671e+02 +482 385 -8.507888885505199e+02 +482 386 -9.536070604341750e+02 +482 387 -1.015511306612465e+03 +482 406 -9.695072463564451e+02 +482 407 -1.032880208377977e+03 +482 408 -1.168677565678393e+03 +482 409 -1.394551574360513e+03 +482 410 -1.733190400658708e+03 +482 411 -2.199157547087195e+03 +482 412 -2.767706810094291e+03 +482 413 -3.331754877699595e+03 +482 414 -3.699147964795170e+03 +482 541 -3.699147964795170e+03 +482 542 -3.331754877699595e+03 +482 543 -2.767706810094291e+03 +482 544 -2.199157547087195e+03 +482 545 -1.733190400658708e+03 +482 546 -1.394551574360513e+03 +482 547 -1.168677565678393e+03 +482 548 -1.032880208377977e+03 +482 549 -9.695072463564451e+02 +483 379 -3.710963518270340e+02 +483 380 -3.873813675510149e+02 +483 381 -4.208084537187718e+02 +483 382 -4.725808574370898e+02 +483 383 -5.429674662554829e+02 +483 384 -6.289529049931513e+02 +483 385 -7.211778000851810e+02 +483 386 -8.023274760830689e+02 +483 387 -8.507888885505199e+02 +483 406 -8.148024630667953e+02 +483 407 -8.643348602446090e+02 +483 408 -9.695072463564451e+02 +483 409 -1.141773184361047e+03 +483 410 -1.394551574360513e+03 +483 411 -1.733190400658708e+03 +483 412 -2.134265778758331e+03 +483 413 -2.521021940438006e+03 +483 414 -2.767706810094291e+03 +483 541 -5.136224430633847e+03 +483 542 -4.560278038130808e+03 +483 543 -3.699147964795170e+03 +483 544 -2.861294172280330e+03 +483 545 -2.199157547087195e+03 +483 546 -1.733190400658708e+03 +483 547 -1.430197816180119e+03 +483 548 -1.251286952144482e+03 +483 549 -1.168677565678393e+03 +484 379 -3.339204550667992e+02 +484 380 -3.479505460244110e+02 +484 381 -3.766415408901786e+02 +484 382 -4.208084537187718e+02 +484 383 -4.803677035258846e+02 +484 384 -5.524312223207843e+02 +484 385 -6.289529049931513e+02 +484 386 -6.956816209337401e+02 +484 387 -7.352796046183671e+02 +484 406 -7.058924559832880e+02 +484 407 -7.463158073460687e+02 +484 408 -8.315436028021828e+02 +484 409 -9.695072463564451e+02 +484 410 -1.168677565678393e+03 +484 411 -1.430197816180119e+03 +484 412 -1.733190400658708e+03 +484 413 -2.019368486704435e+03 +484 414 -2.199157547087195e+03 +484 541 -7.138491575686255e+03 +484 542 -6.235592529048601e+03 +484 543 -4.925216936196723e+03 +484 544 -3.699147964795170e+03 +484 545 -2.767706810094291e+03 +484 546 -2.134265778758331e+03 +484 547 -1.733190400658708e+03 +484 548 -1.500725861549673e+03 +484 549 -1.394551574360513e+03 +485 379 -3.096178268240468e+02 +485 380 -3.222285372305477e+02 +485 381 -3.479505460244110e+02 +485 382 -3.873813675510149e+02 +485 383 -4.402579127124382e+02 +485 384 -5.038180997021782e+02 +485 385 -5.708523475060541e+02 +485 386 -6.289529049931513e+02 +485 387 -6.632839990295103e+02 +485 406 -6.378158089920680e+02 +485 407 -6.728335244699299e+02 +485 408 -7.463158073460687e+02 +485 409 -8.643348602446090e+02 +485 410 -1.032880208377977e+03 +485 411 -1.251286952144482e+03 +485 412 -1.500725861549673e+03 +485 413 -1.733190400658708e+03 +485 414 -1.877824568765012e+03 +485 541 -9.405703259334599e+03 +485 542 -8.091232579773156e+03 +485 543 -6.235592529048601e+03 +485 544 -4.560278038130808e+03 +485 545 -3.331754877699595e+03 +485 546 -2.521021940438006e+03 +485 547 -2.019368486704435e+03 +485 548 -1.733190400658708e+03 +485 549 -1.603684467943636e+03 +486 379 -2.976873911031304e+02 +486 380 -3.096178268240468e+02 +486 381 -3.339204550667992e+02 +486 382 -3.710963518270340e+02 +486 383 -4.208084537187718e+02 +486 384 -4.803677035258846e+02 +486 385 -5.429674662554829e+02 +486 386 -5.970589583440833e+02 +486 387 -6.289529049931513e+02 +486 406 -6.052974323170214e+02 +486 407 -6.378158089920680e+02 +486 408 -7.058924559832880e+02 +486 409 -8.148024630667953e+02 +486 410 -9.695072463564451e+02 +486 411 -1.168677565678393e+03 +486 412 -1.394551574360513e+03 +486 413 -1.603684467943636e+03 +486 414 -1.733190400658708e+03 +486 541 -1.103972130715916e+04 +486 542 -9.405703259334599e+03 +486 543 -7.138491575686255e+03 +486 544 -5.136224430633847e+03 +486 545 -3.699147964795170e+03 +486 546 -2.767706810094291e+03 +486 547 -2.199157547087195e+03 +486 548 -1.877824568765012e+03 +486 549 -1.733190400658708e+03 +505 307 -1.111842160419089e+02 +505 308 -1.170681125153374e+02 +505 309 -1.293661657908650e+02 +505 310 -1.489885081652992e+02 +505 311 -1.767605489846855e+02 +505 312 -2.123577731150844e+02 +505 313 -2.525366109215767e+02 +505 314 -2.895745815575320e+02 +505 315 -3.124380547854541e+02 +505 370 -3.063876713483004e+02 +505 371 -3.311617365195740e+02 +505 372 -3.859179776157595e+02 +505 373 -4.819366867771664e+02 +505 374 -6.371952057562393e+02 +505 375 -8.726231103602329e+02 +505 376 -1.193932486839834e+03 +505 377 -1.550121445008505e+03 +505 378 -1.802596433195452e+03 +505 658 -3.063876713483007e+02 +505 659 -2.841326260213864e+02 +505 660 -2.480403651673273e+02 +505 661 -2.088271183655455e+02 +505 662 -1.740274317161709e+02 +505 663 -1.468355065336027e+02 +505 664 -1.275984131219180e+02 +505 665 -1.155304899028560e+02 +505 666 -1.097534196790493e+02 +506 307 -1.057061586526019e+02 +506 308 -1.111842160419089e+02 +506 309 -1.226088998409724e+02 +506 310 -1.407716848553630e+02 +506 311 -1.663510232448634e+02 +506 312 -1.989422168423268e+02 +506 313 -2.354925657825778e+02 +506 314 -2.689865983609323e+02 +506 315 -2.895745815575323e+02 +506 370 -2.841326260213861e+02 +506 371 -3.063876713483004e+02 +506 372 -3.553280674768354e+02 +506 373 -4.404031329187421e+02 +506 374 -5.762343277298875e+02 +506 375 -7.788097592344268e+02 +506 376 -1.049909849375152e+03 +506 377 -1.344510568096307e+03 +506 378 -1.550121445008508e+03 +506 658 -3.311617365195743e+02 +506 659 -3.063876713483007e+02 +506 660 -2.663884709281892e+02 +506 661 -2.231981844606887e+02 +506 662 -1.851243485745372e+02 +506 663 -1.555580782497811e+02 +506 664 -1.347481526436477e+02 +506 665 -1.217424124188380e+02 +506 666 -1.155304899028560e+02 +507 307 -9.638822517401599e+01 +507 308 -1.011961191083175e+02 +507 309 -1.111842160419089e+02 +507 310 -1.269615920628683e+02 +507 311 -1.489885081652993e+02 +507 312 -1.767605489846857e+02 +507 313 -2.075588680195233e+02 +507 314 -2.354925657825778e+02 +507 315 -2.525366109215769e+02 +507 370 -2.480403651673276e+02 +507 371 -2.663884709281895e+02 +507 372 -3.063876713483004e+02 +507 373 -3.748904053829394e+02 +507 374 -4.819366867771671e+02 +507 375 -6.371952057562402e+02 +507 376 -8.383319685358463e+02 +507 377 -1.049909849375152e+03 +507 378 -1.193932486839836e+03 +507 658 -3.859179776157600e+02 +507 659 -3.553280674768358e+02 +507 660 -3.063876713483000e+02 +507 661 -2.542062119667730e+02 +507 662 -2.088271183655455e+02 +507 663 -1.740274317161709e+02 +507 664 -1.497853840269158e+02 +507 665 -1.347481526436475e+02 +507 666 -1.275984131219178e+02 +508 307 -8.555928471614153e+01 +508 308 -8.962181586287879e+01 +508 309 -9.802102195827709e+01 +508 310 -1.111842160419089e+02 +508 311 -1.293661657908651e+02 +508 312 -1.519993633210927e+02 +508 313 -1.767605489846857e+02 +508 314 -1.989422168423268e+02 +508 315 -2.123577731150847e+02 +508 370 -2.088271183655457e+02 +508 371 -2.231981844606889e+02 +508 372 -2.542062119667733e+02 +508 373 -3.063876713483004e+02 +508 374 -3.859179776157600e+02 +508 375 -4.976453857371593e+02 +508 376 -6.371952057562402e+02 +508 377 -7.788097592344268e+02 +508 378 -8.726231103602345e+02 +508 658 -4.819366867771671e+02 +508 659 -4.404031329187428e+02 +508 660 -3.748904053829390e+02 +508 661 -3.063876713483000e+02 +508 662 -2.480403651673273e+02 +508 663 -2.041390437321799e+02 +508 664 -1.740274317161709e+02 +508 665 -1.555580782497809e+02 +508 666 -1.468355065336024e+02 +509 307 -7.520762033775922e+01 +509 308 -7.859349409841366e+01 +509 309 -8.555928471614152e+01 +509 310 -9.638822517401596e+01 +509 311 -1.111842160419089e+02 +509 312 -1.293661657908651e+02 +509 313 -1.489885081652993e+02 +509 314 -1.663510232448634e+02 +509 315 -1.767605489846857e+02 +509 370 -1.740274317161709e+02 +509 371 -1.851243485745372e+02 +509 372 -2.088271183655455e+02 +509 373 -2.480403651673273e+02 +509 374 -3.063876713483004e+02 +509 375 -3.859179776157600e+02 +509 376 -4.819366867771671e+02 +509 377 -5.762343277298875e+02 +509 378 -6.371952057562402e+02 +509 658 -6.371952057562402e+02 +509 659 -5.762343277298883e+02 +509 660 -4.819366867771664e+02 +509 661 -3.859179776157595e+02 +509 662 -3.063876713483004e+02 +509 663 -2.480403651673276e+02 +509 664 -2.088271183655457e+02 +509 665 -1.851243485745370e+02 +509 666 -1.740274317161707e+02 +510 307 -6.652797451218331e+01 +510 308 -6.937545782864687e+01 +510 309 -7.520762033775921e+01 +510 310 -8.420868002944914e+01 +510 311 -9.638822517401596e+01 +510 312 -1.111842160419089e+02 +510 313 -1.269615920628683e+02 +510 314 -1.407716848553630e+02 +510 315 -1.489885081652993e+02 +510 370 -1.468355065336025e+02 +510 371 -1.555580782497810e+02 +510 372 -1.740274317161707e+02 +510 373 -2.041390437321797e+02 +510 374 -2.480403651673273e+02 +510 375 -3.063876713483004e+02 +510 376 -3.748904053829394e+02 +510 377 -4.404031329187421e+02 +510 378 -4.819366867771671e+02 +510 658 -8.726231103602345e+02 +510 659 -7.788097592344280e+02 +510 660 -6.371952057562393e+02 +510 661 -4.976453857371587e+02 +510 662 -3.859179776157600e+02 +510 663 -3.063876713483007e+02 +510 664 -2.542062119667736e+02 +510 665 -2.231981844606887e+02 +510 666 -2.088271183655455e+02 +511 307 -6.001174723167333e+01 +511 308 -6.247361649834816e+01 +511 309 -6.749803222962944e+01 +511 310 -7.520762033775921e+01 +511 311 -8.555928471614152e+01 +511 312 -9.802102195827709e+01 +511 313 -1.111842160419089e+02 +511 314 -1.226088998409724e+02 +511 315 -1.293661657908651e+02 +511 370 -1.275984131219179e+02 +511 371 -1.347481526436476e+02 +511 372 -1.497853840269158e+02 +511 373 -1.740274317161707e+02 +511 374 -2.088271183655455e+02 +511 375 -2.542062119667733e+02 +511 376 -3.063876713483004e+02 +511 377 -3.553280674768354e+02 +511 378 -3.859179776157600e+02 +511 658 -1.193932486839836e+03 +511 659 -1.049909849375154e+03 +511 660 -8.383319685358450e+02 +511 661 -6.371952057562393e+02 +511 662 -4.819366867771671e+02 +511 663 -3.748904053829399e+02 +511 664 -3.063876713483007e+02 +511 665 -2.663884709281892e+02 +511 666 -2.480403651673273e+02 +512 307 -5.573941364116938e+01 +512 308 -5.795761808209195e+01 +512 309 -6.247361649834816e+01 +512 310 -6.937545782864687e+01 +512 311 -7.859349409841366e+01 +512 312 -8.962181586287879e+01 +512 313 -1.011961191083175e+02 +512 314 -1.111842160419089e+02 +512 315 -1.170681125153375e+02 +512 370 -1.155304899028561e+02 +512 371 -1.217424124188380e+02 +512 372 -1.347481526436476e+02 +512 373 -1.555580782497810e+02 +512 374 -1.851243485745372e+02 +512 375 -2.231981844606889e+02 +512 376 -2.663884709281895e+02 +512 377 -3.063876713483004e+02 +512 378 -3.311617365195743e+02 +512 658 -1.550121445008508e+03 +512 659 -1.344510568096310e+03 +512 660 -1.049909849375151e+03 +512 661 -7.788097592344254e+02 +512 662 -5.762343277298875e+02 +512 663 -4.404031329187428e+02 +512 664 -3.553280674768358e+02 +512 665 -3.063876713483000e+02 +512 666 -2.841326260213858e+02 +513 307 -5.363826960242956e+01 +513 308 -5.573941364116936e+01 +513 309 -6.001174723167332e+01 +513 310 -6.652797451218328e+01 +513 311 -7.520762033775921e+01 +513 312 -8.555928471614152e+01 +513 313 -9.638822517401596e+01 +513 314 -1.057061586526019e+02 +513 315 -1.111842160419089e+02 +513 370 -1.097534196790493e+02 +513 371 -1.155304899028560e+02 +513 372 -1.275984131219178e+02 +513 373 -1.468355065336024e+02 +513 374 -1.740274317161707e+02 +513 375 -2.088271183655455e+02 +513 376 -2.480403651673273e+02 +513 377 -2.841326260213858e+02 +513 378 -3.063876713483004e+02 +513 658 -1.802596433195456e+03 +513 659 -1.550121445008512e+03 +513 660 -1.193932486839834e+03 +513 661 -8.726231103602329e+02 +513 662 -6.371952057562402e+02 +513 663 -4.819366867771678e+02 +513 664 -3.859179776157605e+02 +513 665 -3.311617365195740e+02 +513 666 -3.063876713483004e+02 +514 451 -1.733190400658708e+03 +514 452 -1.877824568765012e+03 +514 453 -2.199157547087195e+03 +514 454 -2.767706810094291e+03 +514 455 -3.699147964795170e+03 +514 456 -5.136224430633847e+03 +514 457 -7.138491575686255e+03 +514 458 -9.405703259334599e+03 +514 459 -1.103972130715916e+04 +514 604 -1.733190400658708e+03 +514 605 -1.603684467943636e+03 +514 606 -1.394551574360513e+03 +514 607 -1.168677565678391e+03 +514 608 -9.695072463564451e+02 +514 609 -8.148024630667965e+02 +514 610 -7.058924559832880e+02 +514 611 -6.378158089920680e+02 +514 612 -6.052974323170223e+02 +514 631 -6.289529049931505e+02 +514 632 -5.970589583440833e+02 +514 633 -5.429674662554829e+02 +514 634 -4.803677035258839e+02 +514 635 -4.208084537187718e+02 +514 636 -3.710963518270344e+02 +514 637 -3.339204550667992e+02 +514 638 -3.096178268240468e+02 +514 639 -2.976873911031307e+02 +515 451 -1.603684467943636e+03 +515 452 -1.733190400658708e+03 +515 453 -2.019368486704435e+03 +515 454 -2.521021940438006e+03 +515 455 -3.331754877699595e+03 +515 456 -4.560278038130808e+03 +515 457 -6.235592529048601e+03 +515 458 -8.091232579773156e+03 +515 459 -9.405703259334599e+03 +515 604 -1.877824568765012e+03 +515 605 -1.733190400658708e+03 +515 606 -1.500725861549673e+03 +515 607 -1.251286952144480e+03 +515 608 -1.032880208377977e+03 +515 609 -8.643348602446105e+02 +515 610 -7.463158073460687e+02 +515 611 -6.728335244699299e+02 +515 612 -6.378158089920689e+02 +515 631 -6.632839990295092e+02 +515 632 -6.289529049931513e+02 +515 633 -5.708523475060541e+02 +515 634 -5.038180997021776e+02 +515 635 -4.402579127124382e+02 +515 636 -3.873813675510154e+02 +515 637 -3.479505460244110e+02 +515 638 -3.222285372305477e+02 +515 639 -3.096178268240471e+02 +516 451 -1.394551574360513e+03 +516 452 -1.500725861549673e+03 +516 453 -1.733190400658708e+03 +516 454 -2.134265778758331e+03 +516 455 -2.767706810094291e+03 +516 456 -3.699147964795170e+03 +516 457 -4.925216936196723e+03 +516 458 -6.235592529048601e+03 +516 459 -7.138491575686255e+03 +516 604 -2.199157547087195e+03 +516 605 -2.019368486704435e+03 +516 606 -1.733190400658708e+03 +516 607 -1.430197816180116e+03 +516 608 -1.168677565678393e+03 +516 609 -9.695072463564467e+02 +516 610 -8.315436028021828e+02 +516 611 -7.463158073460687e+02 +516 612 -7.058924559832891e+02 +516 631 -7.352796046183660e+02 +516 632 -6.956816209337401e+02 +516 633 -6.289529049931513e+02 +516 634 -5.524312223207834e+02 +516 635 -4.803677035258846e+02 +516 636 -4.208084537187723e+02 +516 637 -3.766415408901786e+02 +516 638 -3.479505460244110e+02 +516 639 -3.339204550667995e+02 +517 451 -1.168677565678393e+03 +517 452 -1.251286952144482e+03 +517 453 -1.430197816180119e+03 +517 454 -1.733190400658708e+03 +517 455 -2.199157547087195e+03 +517 456 -2.861294172280330e+03 +517 457 -3.699147964795170e+03 +517 458 -4.560278038130808e+03 +517 459 -5.136224430633847e+03 +517 604 -2.767706810094291e+03 +517 605 -2.521021940438006e+03 +517 606 -2.134265778758331e+03 +517 607 -1.733190400658704e+03 +517 608 -1.394551574360513e+03 +517 609 -1.141773184361049e+03 +517 610 -9.695072463564451e+02 +517 611 -8.643348602446090e+02 +517 612 -8.148024630667965e+02 +517 631 -8.507888885505185e+02 +517 632 -8.023274760830689e+02 +517 633 -7.211778000851810e+02 +517 634 -6.289529049931505e+02 +517 635 -5.429674662554829e+02 +517 636 -4.725808574370903e+02 +517 637 -4.208084537187718e+02 +517 638 -3.873813675510149e+02 +517 639 -3.710963518270344e+02 +518 451 -9.695072463564451e+02 +518 452 -1.032880208377977e+03 +518 453 -1.168677565678393e+03 +518 454 -1.394551574360513e+03 +518 455 -1.733190400658708e+03 +518 456 -2.199157547087195e+03 +518 457 -2.767706810094291e+03 +518 458 -3.331754877699595e+03 +518 459 -3.699147964795170e+03 +518 604 -3.699147964795170e+03 +518 605 -3.331754877699595e+03 +518 606 -2.767706810094291e+03 +518 607 -2.199157547087190e+03 +518 608 -1.733190400658708e+03 +518 609 -1.394551574360516e+03 +518 610 -1.168677565678393e+03 +518 611 -1.032880208377977e+03 +518 612 -9.695072463564467e+02 +518 631 -1.015511306612463e+03 +518 632 -9.536070604341750e+02 +518 633 -8.507888885505199e+02 +518 634 -7.352796046183660e+02 +518 635 -6.289529049931513e+02 +518 636 -5.429674662554836e+02 +518 637 -4.803677035258846e+02 +518 638 -4.402579127124382e+02 +518 639 -4.208084537187723e+02 +519 451 -8.148024630667953e+02 +519 452 -8.643348602446090e+02 +519 453 -9.695072463564451e+02 +519 454 -1.141773184361047e+03 +519 455 -1.394551574360513e+03 +519 456 -1.733190400658708e+03 +519 457 -2.134265778758331e+03 +519 458 -2.521021940438006e+03 +519 459 -2.767706810094291e+03 +519 604 -5.136224430633847e+03 +519 605 -4.560278038130808e+03 +519 606 -3.699147964795170e+03 +519 607 -2.861294172280323e+03 +519 608 -2.199157547087195e+03 +519 609 -1.733190400658712e+03 +519 610 -1.430197816180119e+03 +519 611 -1.251286952144482e+03 +519 612 -1.168677565678395e+03 +519 631 -1.228588660544045e+03 +519 632 -1.148042053110078e+03 +519 633 -1.015511306612465e+03 +519 634 -8.685786765383756e+02 +519 635 -7.352796046183671e+02 +519 636 -6.289529049931523e+02 +519 637 -5.524312223207843e+02 +519 638 -5.038180997021782e+02 +519 639 -4.803677035258852e+02 +520 451 -7.058924559832880e+02 +520 452 -7.463158073460687e+02 +520 453 -8.315436028021828e+02 +520 454 -9.695072463564451e+02 +520 455 -1.168677565678393e+03 +520 456 -1.430197816180119e+03 +520 457 -1.733190400658708e+03 +520 458 -2.019368486704435e+03 +520 459 -2.199157547087195e+03 +520 604 -7.138491575686255e+03 +520 605 -6.235592529048601e+03 +520 606 -4.925216936196723e+03 +520 607 -3.699147964795159e+03 +520 608 -2.767706810094291e+03 +520 609 -2.134265778758337e+03 +520 610 -1.733190400658708e+03 +520 611 -1.500725861549673e+03 +520 612 -1.394551574360516e+03 +520 631 -1.471477730866021e+03 +520 632 -1.368148367306964e+03 +520 633 -1.199743197084304e+03 +520 634 -1.015511306612463e+03 +520 635 -8.507888885505199e+02 +520 636 -7.211778000851822e+02 +520 637 -6.289529049931513e+02 +520 638 -5.708523475060541e+02 +520 639 -5.429674662554836e+02 +521 451 -6.378158089920680e+02 +521 452 -6.728335244699299e+02 +521 453 -7.463158073460687e+02 +521 454 -8.643348602446090e+02 +521 455 -1.032880208377977e+03 +521 456 -1.251286952144482e+03 +521 457 -1.500725861549673e+03 +521 458 -1.733190400658708e+03 +521 459 -1.877824568765012e+03 +521 604 -9.405703259334599e+03 +521 605 -8.091232579773156e+03 +521 606 -6.235592529048601e+03 +521 607 -4.560278038130793e+03 +521 608 -3.331754877699595e+03 +521 609 -2.521021940438013e+03 +521 610 -2.019368486704435e+03 +521 611 -1.733190400658708e+03 +521 612 -1.603684467943639e+03 +521 631 -1.697437739078442e+03 +521 632 -1.571600895131404e+03 +521 633 -1.368148367306964e+03 +521 634 -1.148042053110076e+03 +521 635 -9.536070604341750e+02 +521 636 -8.023274760830702e+02 +521 637 -6.956816209337401e+02 +521 638 -6.289529049931513e+02 +521 639 -5.970589583440841e+02 +522 451 -6.052974323170214e+02 +522 452 -6.378158089920680e+02 +522 453 -7.058924559832880e+02 +522 454 -8.148024630667953e+02 +522 455 -9.695072463564451e+02 +522 456 -1.168677565678393e+03 +522 457 -1.394551574360513e+03 +522 458 -1.603684467943636e+03 +522 459 -1.733190400658708e+03 +522 604 -1.103972130715916e+04 +522 605 -9.405703259334599e+03 +522 606 -7.138491575686255e+03 +522 607 -5.136224430633830e+03 +522 608 -3.699147964795170e+03 +522 609 -2.767706810094298e+03 +522 610 -2.199157547087195e+03 +522 611 -1.877824568765012e+03 +522 612 -1.733190400658712e+03 +522 631 -1.837845240586527e+03 +522 632 -1.697437739078445e+03 +522 633 -1.471477730866024e+03 +522 634 -1.228588660544045e+03 +522 635 -1.015511306612465e+03 +522 636 -8.507888885505214e+02 +522 637 -7.352796046183671e+02 +522 638 -6.632839990295103e+02 +522 639 -6.289529049931523e+02 +541 451 -6.289529049931513e+02 +541 452 -6.632839990295103e+02 +541 453 -7.352796046183671e+02 +541 454 -8.507888885505199e+02 +541 455 -1.015511306612465e+03 +541 456 -1.228588660544048e+03 +541 457 -1.471477730866024e+03 +541 458 -1.697437739078445e+03 +541 459 -1.837845240586531e+03 +541 478 -1.733190400658708e+03 +541 479 -1.877824568765012e+03 +541 480 -2.199157547087195e+03 +541 481 -2.767706810094291e+03 +541 482 -3.699147964795170e+03 +541 483 -5.136224430633847e+03 +541 484 -7.138491575686255e+03 +541 485 -9.405703259334599e+03 +541 486 -1.103972130715916e+04 +541 631 -1.733190400658704e+03 +541 632 -1.603684467943636e+03 +541 633 -1.394551574360513e+03 +541 634 -1.168677565678391e+03 +541 635 -9.695072463564451e+02 +541 636 -8.148024630667965e+02 +541 637 -7.058924559832880e+02 +541 638 -6.378158089920680e+02 +541 639 -6.052974323170223e+02 +542 451 -5.970589583440833e+02 +542 452 -6.289529049931513e+02 +542 453 -6.956816209337401e+02 +542 454 -8.023274760830689e+02 +542 455 -9.536070604341750e+02 +542 456 -1.148042053110078e+03 +542 457 -1.368148367306964e+03 +542 458 -1.571600895131404e+03 +542 459 -1.697437739078445e+03 +542 478 -1.603684467943636e+03 +542 479 -1.733190400658708e+03 +542 480 -2.019368486704435e+03 +542 481 -2.521021940438006e+03 +542 482 -3.331754877699595e+03 +542 483 -4.560278038130808e+03 +542 484 -6.235592529048601e+03 +542 485 -8.091232579773156e+03 +542 486 -9.405703259334599e+03 +542 631 -1.877824568765008e+03 +542 632 -1.733190400658708e+03 +542 633 -1.500725861549673e+03 +542 634 -1.251286952144480e+03 +542 635 -1.032880208377977e+03 +542 636 -8.643348602446105e+02 +542 637 -7.463158073460687e+02 +542 638 -6.728335244699299e+02 +542 639 -6.378158089920689e+02 +543 451 -5.429674662554829e+02 +543 452 -5.708523475060541e+02 +543 453 -6.289529049931513e+02 +543 454 -7.211778000851810e+02 +543 455 -8.507888885505199e+02 +543 456 -1.015511306612465e+03 +543 457 -1.199743197084304e+03 +543 458 -1.368148367306964e+03 +543 459 -1.471477730866024e+03 +543 478 -1.394551574360513e+03 +543 479 -1.500725861549673e+03 +543 480 -1.733190400658708e+03 +543 481 -2.134265778758331e+03 +543 482 -2.767706810094291e+03 +543 483 -3.699147964795170e+03 +543 484 -4.925216936196723e+03 +543 485 -6.235592529048601e+03 +543 486 -7.138491575686255e+03 +543 631 -2.199157547087190e+03 +543 632 -2.019368486704435e+03 +543 633 -1.733190400658708e+03 +543 634 -1.430197816180116e+03 +543 635 -1.168677565678393e+03 +543 636 -9.695072463564467e+02 +543 637 -8.315436028021828e+02 +543 638 -7.463158073460687e+02 +543 639 -7.058924559832891e+02 +544 451 -4.803677035258846e+02 +544 452 -5.038180997021782e+02 +544 453 -5.524312223207843e+02 +544 454 -6.289529049931513e+02 +544 455 -7.352796046183671e+02 +544 456 -8.685786765383772e+02 +544 457 -1.015511306612465e+03 +544 458 -1.148042053110078e+03 +544 459 -1.228588660544048e+03 +544 478 -1.168677565678393e+03 +544 479 -1.251286952144482e+03 +544 480 -1.430197816180119e+03 +544 481 -1.733190400658708e+03 +544 482 -2.199157547087195e+03 +544 483 -2.861294172280330e+03 +544 484 -3.699147964795170e+03 +544 485 -4.560278038130808e+03 +544 486 -5.136224430633847e+03 +544 631 -2.767706810094283e+03 +544 632 -2.521021940438006e+03 +544 633 -2.134265778758331e+03 +544 634 -1.733190400658704e+03 +544 635 -1.394551574360513e+03 +544 636 -1.141773184361049e+03 +544 637 -9.695072463564451e+02 +544 638 -8.643348602446090e+02 +544 639 -8.148024630667965e+02 +545 451 -4.208084537187718e+02 +545 452 -4.402579127124382e+02 +545 453 -4.803677035258846e+02 +545 454 -5.429674662554829e+02 +545 455 -6.289529049931513e+02 +545 456 -7.352796046183671e+02 +545 457 -8.507888885505199e+02 +545 458 -9.536070604341750e+02 +545 459 -1.015511306612465e+03 +545 478 -9.695072463564451e+02 +545 479 -1.032880208377977e+03 +545 480 -1.168677565678393e+03 +545 481 -1.394551574360513e+03 +545 482 -1.733190400658708e+03 +545 483 -2.199157547087195e+03 +545 484 -2.767706810094291e+03 +545 485 -3.331754877699595e+03 +545 486 -3.699147964795170e+03 +545 631 -3.699147964795159e+03 +545 632 -3.331754877699595e+03 +545 633 -2.767706810094291e+03 +545 634 -2.199157547087190e+03 +545 635 -1.733190400658708e+03 +545 636 -1.394551574360516e+03 +545 637 -1.168677565678393e+03 +545 638 -1.032880208377977e+03 +545 639 -9.695072463564467e+02 +546 451 -3.710963518270340e+02 +546 452 -3.873813675510149e+02 +546 453 -4.208084537187718e+02 +546 454 -4.725808574370898e+02 +546 455 -5.429674662554829e+02 +546 456 -6.289529049931513e+02 +546 457 -7.211778000851810e+02 +546 458 -8.023274760830689e+02 +546 459 -8.507888885505199e+02 +546 478 -8.148024630667953e+02 +546 479 -8.643348602446090e+02 +546 480 -9.695072463564451e+02 +546 481 -1.141773184361047e+03 +546 482 -1.394551574360513e+03 +546 483 -1.733190400658708e+03 +546 484 -2.134265778758331e+03 +546 485 -2.521021940438006e+03 +546 486 -2.767706810094291e+03 +546 631 -5.136224430633830e+03 +546 632 -4.560278038130808e+03 +546 633 -3.699147964795170e+03 +546 634 -2.861294172280323e+03 +546 635 -2.199157547087195e+03 +546 636 -1.733190400658712e+03 +546 637 -1.430197816180119e+03 +546 638 -1.251286952144482e+03 +546 639 -1.168677565678395e+03 +547 451 -3.339204550667992e+02 +547 452 -3.479505460244110e+02 +547 453 -3.766415408901786e+02 +547 454 -4.208084537187718e+02 +547 455 -4.803677035258846e+02 +547 456 -5.524312223207843e+02 +547 457 -6.289529049931513e+02 +547 458 -6.956816209337401e+02 +547 459 -7.352796046183671e+02 +547 478 -7.058924559832880e+02 +547 479 -7.463158073460687e+02 +547 480 -8.315436028021828e+02 +547 481 -9.695072463564451e+02 +547 482 -1.168677565678393e+03 +547 483 -1.430197816180119e+03 +547 484 -1.733190400658708e+03 +547 485 -2.019368486704435e+03 +547 486 -2.199157547087195e+03 +547 631 -7.138491575686227e+03 +547 632 -6.235592529048601e+03 +547 633 -4.925216936196723e+03 +547 634 -3.699147964795159e+03 +547 635 -2.767706810094291e+03 +547 636 -2.134265778758337e+03 +547 637 -1.733190400658708e+03 +547 638 -1.500725861549673e+03 +547 639 -1.394551574360516e+03 +548 451 -3.096178268240468e+02 +548 452 -3.222285372305477e+02 +548 453 -3.479505460244110e+02 +548 454 -3.873813675510149e+02 +548 455 -4.402579127124382e+02 +548 456 -5.038180997021782e+02 +548 457 -5.708523475060541e+02 +548 458 -6.289529049931513e+02 +548 459 -6.632839990295103e+02 +548 478 -6.378158089920680e+02 +548 479 -6.728335244699299e+02 +548 480 -7.463158073460687e+02 +548 481 -8.643348602446090e+02 +548 482 -1.032880208377977e+03 +548 483 -1.251286952144482e+03 +548 484 -1.500725861549673e+03 +548 485 -1.733190400658708e+03 +548 486 -1.877824568765012e+03 +548 631 -9.405703259334558e+03 +548 632 -8.091232579773156e+03 +548 633 -6.235592529048601e+03 +548 634 -4.560278038130793e+03 +548 635 -3.331754877699595e+03 +548 636 -2.521021940438013e+03 +548 637 -2.019368486704435e+03 +548 638 -1.733190400658708e+03 +548 639 -1.603684467943639e+03 +549 451 -2.976873911031304e+02 +549 452 -3.096178268240468e+02 +549 453 -3.339204550667992e+02 +549 454 -3.710963518270340e+02 +549 455 -4.208084537187718e+02 +549 456 -4.803677035258846e+02 +549 457 -5.429674662554829e+02 +549 458 -5.970589583440833e+02 +549 459 -6.289529049931513e+02 +549 478 -6.052974323170214e+02 +549 479 -6.378158089920680e+02 +549 480 -7.058924559832880e+02 +549 481 -8.148024630667953e+02 +549 482 -9.695072463564451e+02 +549 483 -1.168677565678393e+03 +549 484 -1.394551574360513e+03 +549 485 -1.603684467943636e+03 +549 486 -1.733190400658708e+03 +549 631 -1.103972130715910e+04 +549 632 -9.405703259334599e+03 +549 633 -7.138491575686255e+03 +549 634 -5.136224430633830e+03 +549 635 -3.699147964795170e+03 +549 636 -2.767706810094298e+03 +549 637 -2.199157547087195e+03 +549 638 -1.877824568765012e+03 +549 639 -1.733190400658712e+03 +568 1702 -1.692568750643269e+00 +568 1703 -1.572721720288759e+00 +568 1704 -1.377630306274569e+00 +568 1705 -1.164560971009494e+00 +568 1706 -9.744009411995010e-01 +568 1707 -8.250281026921222e-01 +568 1708 -7.188912825296515e-01 +568 1709 -6.520955051698261e-01 +568 1710 -6.200575078934891e-01 +569 1702 -1.825602022047363e+00 +569 1703 -1.692568750643269e+00 +569 1704 -1.476924503791048e+00 +569 1705 -1.242789029898726e+00 +569 1706 -1.035156024564130e+00 +569 1707 -8.730237114863630e-01 +569 1708 -7.583858575750241e-01 +569 1709 -6.864998175457022e-01 +569 1710 -6.520955051698263e-01 +570 1702 -2.118310613133422e+00 +570 1703 -1.955005166107604e+00 +570 1704 -1.692568750643269e+00 +570 1705 -1.411025407928763e+00 +570 1706 -1.164560971009494e+00 +570 1707 -9.744009411995010e-01 +570 1708 -8.412684343873768e-01 +570 1709 -7.583858575750239e-01 +570 1710 -7.188912825296515e-01 +571 1702 -2.627614132977349e+00 +571 1703 -2.407897866700162e+00 +571 1704 -2.059501442724468e+00 +571 1705 -1.692568750643269e+00 +571 1706 -1.377630306274569e+00 +571 1707 -1.139004803923774e+00 +571 1708 -9.744009411995010e-01 +571 1709 -8.730237114863630e-01 +571 1710 -8.250281026921222e-01 +572 1702 -3.441873371322745e+00 +572 1703 -3.123418860129884e+00 +572 1704 -2.627614132977349e+00 +572 1705 -2.118310613133423e+00 +572 1706 -1.692568750643269e+00 +572 1707 -1.377630306274569e+00 +572 1708 -1.164560971009494e+00 +572 1709 -1.035156024564130e+00 +572 1710 -9.744009411995010e-01 +573 1702 -4.658393121952510e+00 +573 1703 -4.176015720938289e+00 +573 1704 -3.441873371322745e+00 +573 1705 -2.710493887836724e+00 +573 1706 -2.118310613133423e+00 +573 1707 -1.692568750643269e+00 +573 1708 -1.411025407928763e+00 +573 1709 -1.242789029898726e+00 +573 1710 -1.164560971009494e+00 +574 1702 -6.289816136769566e+00 +574 1703 -5.562272020881102e+00 +574 1704 -4.482417214623956e+00 +574 1705 -3.441873371322745e+00 +574 1706 -2.627614132977349e+00 +574 1707 -2.059501442724468e+00 +574 1708 -1.692568750643269e+00 +574 1709 -1.476924503791048e+00 +574 1710 -1.377630306274569e+00 +575 1702 -8.066396227455577e+00 +575 1703 -7.044608140614899e+00 +575 1704 -5.562272020881102e+00 +575 1705 -4.176015720938289e+00 +575 1706 -3.123418860129884e+00 +575 1707 -2.407897866700162e+00 +575 1708 -1.955005166107604e+00 +575 1709 -1.692568750643269e+00 +575 1710 -1.572721720288760e+00 +576 1702 -9.308348002235288e+00 +576 1703 -8.066396227455581e+00 +576 1704 -6.289816136769567e+00 +576 1705 -4.658393121952511e+00 +576 1706 -3.441873371322747e+00 +576 1707 -2.627614132977350e+00 +576 1708 -2.118310613133424e+00 +576 1709 -1.825602022047363e+00 +576 1710 -1.692568750643270e+00 +577 10 -9.668039754076972e+00 +577 11 -1.042792100350136e+01 +577 12 -1.209985789967807e+01 +577 13 -1.500896220047154e+01 +577 14 -1.965992326532715e+01 +577 15 -2.660849856174327e+01 +577 16 -3.592685206197134e+01 +577 17 -4.607421833807318e+01 +577 18 -5.316787460965344e+01 +577 1144 -9.574614729634387e+00 +577 1145 -8.894152732809214e+00 +577 1146 -7.787064219095081e+00 +577 1147 -6.578858018778778e+00 +577 1148 -5.501432160761325e+00 +577 1149 -4.655741575368517e+00 +577 1150 -4.055212971361419e+00 +577 1151 -3.677452266447854e+00 +577 1152 -3.496313214985748e+00 +577 1423 -3.474506751309654e+00 +577 1424 -3.307075579356515e+00 +577 1425 -3.021655125742912e+00 +577 1426 -2.688901476974079e+00 +577 1427 -2.369680831172465e+00 +577 1428 -2.101098045763917e+00 +577 1429 -1.898863298003203e+00 +577 1430 -1.765972963745819e+00 +577 1431 -1.700527108287443e+00 +578 10 -8.978399604437477e+00 +578 11 -9.662412840408463e+00 +578 12 -1.116018103363464e+01 +578 13 -1.374474424990905e+01 +578 14 -1.782768342968988e+01 +578 15 -2.383331974207469e+01 +578 16 -3.174152706236970e+01 +578 17 -4.019662561844805e+01 +578 18 -4.602415911097979e+01 +578 1144 -1.033025206259608e+01 +578 1145 -9.574614729634382e+00 +578 1146 -8.350436340807200e+00 +578 1147 -7.022334130042159e+00 +578 1148 -5.845568772761842e+00 +578 1149 -4.927408805516035e+00 +578 1150 -4.278637194083235e+00 +578 1151 -3.872006983680973e+00 +578 1152 -3.677452266447852e+00 +578 1423 -3.654050001394687e+00 +578 1424 -3.474506751309652e+00 +578 1425 -3.169027908859174e+00 +578 1426 -2.813872708878961e+00 +578 1427 -2.474220532866515e+00 +578 1428 -2.189307683194851e+00 +578 1429 -1.975331417147858e+00 +578 1430 -1.835000056862136e+00 +578 1431 -1.765972963745819e+00 +579 10 -7.856981062192605e+00 +579 11 -8.422906634430152e+00 +579 12 -9.651850100750547e+00 +579 13 -1.174263755165606e+01 +579 14 -1.497900117091537e+01 +579 15 -1.961621021304433e+01 +579 16 -2.554009355249086e+01 +579 17 -3.168571433859092e+01 +579 18 -3.582522742282774e+01 +579 1144 -1.199392684783545e+01 +579 1145 -1.106556701616914e+01 +579 1146 -9.574614729634391e+00 +579 1147 -7.976517934049893e+00 +579 1148 -6.578858018778782e+00 +579 1149 -5.501432160761327e+00 +579 1150 -4.747658828821055e+00 +579 1151 -4.278637194083235e+00 +579 1152 -4.055212971361418e+00 +579 1423 -4.028382153902574e+00 +579 1424 -3.822855655704618e+00 +579 1425 -3.474506751309655e+00 +579 1426 -3.071728502881821e+00 +579 1427 -2.688901476974080e+00 +579 1428 -2.369680831172466e+00 +579 1429 -2.131159503067380e+00 +579 1430 -1.975331417147858e+00 +579 1431 -1.898863298003203e+00 +580 10 -6.634051984848504e+00 +580 11 -7.079175558726460e+00 +580 12 -8.036305744509786e+00 +580 13 -9.637644505224026e+00 +580 14 -1.205825395701952e+01 +580 15 -1.542362772574222e+01 +580 16 -1.957788196141608e+01 +580 17 -2.374572131423626e+01 +580 18 -2.648321815661042e+01 +580 1144 -1.489187979900571e+01 +580 1145 -1.364121235299753e+01 +580 1146 -1.165955788548229e+01 +580 1147 -9.574614729634382e+00 +580 1148 -7.787064219095077e+00 +580 1149 -6.434009698761967e+00 +580 1150 -5.501432160761327e+00 +580 1151 -4.927408805516035e+00 +580 1152 -4.655741575368515e+00 +580 1423 -4.623196535591006e+00 +580 1424 -4.374472772345655e+00 +580 1425 -3.955287673172522e+00 +580 1426 -3.474506751309652e+00 +580 1427 -3.021655125742911e+00 +580 1428 -2.647316772054514e+00 +580 1429 -2.369680831172466e+00 +580 1430 -2.189307683194851e+00 +580 1431 -2.101098045763916e+00 +581 10 -5.544382952983630e+00 +581 11 -5.889520365817942e+00 +581 12 -6.624494901154130e+00 +581 13 -7.834242340577331e+00 +581 14 -9.621526041147485e+00 +581 15 -1.203619855902307e+01 +581 16 -1.492291899173448e+01 +581 17 -1.773138064861567e+01 +581 18 -1.953442396449330e+01 +581 1144 -1.953249673072867e+01 +581 1145 -1.771654764348813e+01 +581 1146 -1.489187979900572e+01 +581 1147 -1.199392684783545e+01 +581 1148 -9.574614729634387e+00 +581 1149 -7.787064219095081e+00 +581 1150 -6.578858018778784e+00 +581 1151 -5.845568772761844e+00 +581 1152 -5.501432160761325e+00 +581 1423 -5.460334268221786e+00 +581 1424 -5.147173192788435e+00 +581 1425 -4.623196535591008e+00 +581 1426 -4.028382153902572e+00 +581 1427 -3.474506751309654e+00 +581 1428 -3.021655125742912e+00 +581 1429 -2.688901476974081e+00 +581 1430 -2.474220532866516e+00 +581 1431 -2.369680831172465e+00 +582 10 -4.689730427554420e+00 +582 11 -4.961997359580787e+00 +582 12 -5.536948315121283e+00 +582 13 -6.470113803193435e+00 +582 14 -7.822180859388926e+00 +582 15 -9.605445292059736e+00 +582 16 -1.168159105370509e+01 +582 17 -1.365149884527924e+01 +582 18 -1.489319805507063e+01 +582 1144 -2.648026715992624e+01 +582 1145 -2.372339702886327e+01 +582 1146 -1.953249673072868e+01 +582 1147 -1.536382589350012e+01 +582 1148 -1.199392684783545e+01 +582 1149 -9.574614729634391e+00 +582 1150 -7.976517934049901e+00 +582 1151 -7.022334130042167e+00 +582 1152 -6.578858018778782e+00 +582 1423 -6.526086991349065e+00 +582 1424 -6.125338181409235e+00 +582 1425 -5.460334268221787e+00 +582 1426 -4.714211996655914e+00 +582 1427 -4.028382153902574e+00 +582 1428 -3.474506751309655e+00 +582 1429 -3.071728502881823e+00 +582 1430 -2.813872708878962e+00 +582 1431 -2.688901476974080e+00 +583 10 -4.083219039039204e+00 +583 11 -4.307014883097344e+00 +583 12 -4.776546929488968e+00 +583 13 -5.530421932699210e+00 +583 14 -6.606585543239607e+00 +583 15 -8.000389526637228e+00 +583 16 -9.591335194548829e+00 +583 17 -1.107324094707686e+01 +583 18 -1.199490052317238e+01 +583 1144 -3.582072268161383e+01 +583 1145 -3.165228467591596e+01 +583 1146 -2.547425580969112e+01 +583 1147 -1.953249673072865e+01 +583 1148 -1.489187979900571e+01 +583 1149 -1.165955788548229e+01 +583 1150 -9.574614729634391e+00 +583 1151 -8.350436340807200e+00 +583 1152 -7.787064219095077e+00 +583 1423 -7.720270179432527e+00 +583 1424 -7.214758870193814e+00 +583 1425 -6.382855547803864e+00 +583 1426 -5.460334268221782e+00 +583 1427 -4.623196535591006e+00 +583 1428 -3.955287673172522e+00 +583 1429 -3.474506751309655e+00 +583 1430 -3.169027908859174e+00 +583 1431 -3.021655125742911e+00 +584 10 -3.701870736183997e+00 +584 11 -3.896677663646664e+00 +584 12 -4.303606130517534e+00 +584 13 -4.952250188147252e+00 +584 14 -5.869065033700025e+00 +584 15 -7.042303833662651e+00 +584 16 -8.364241553301335e+00 +584 17 -9.580881051770410e+00 +584 18 -1.033104205346347e+01 +584 1144 -4.601776203532707e+01 +584 1145 -4.014998583800268e+01 +584 1146 -3.165228467591601e+01 +584 1147 -2.372339702886327e+01 +584 1148 -1.771654764348815e+01 +584 1149 -1.364121235299755e+01 +584 1150 -1.106556701616916e+01 +584 1151 -9.574614729634391e+00 +584 1152 -8.894152732809218e+00 +584 1423 -8.813722702286100e+00 +584 1424 -8.206746303750590e+00 +584 1425 -7.214758870193821e+00 +584 1426 -6.125338181409235e+00 +584 1427 -5.147173192788438e+00 +584 1428 -4.374472772345658e+00 +584 1429 -3.822855655704620e+00 +584 1430 -3.474506751309655e+00 +584 1431 -3.307075579356516e+00 +585 10 -3.519062446235008e+00 +585 11 -3.700403018148985e+00 +585 12 -4.078373790891477e+00 +585 13 -4.678685082400162e+00 +585 14 -5.523013483700748e+00 +585 15 -6.597083793558924e+00 +585 16 -7.799582931832361e+00 +585 17 -8.899804490345403e+00 +585 18 -9.575325019992611e+00 +585 1144 -5.316004558269722e+01 +585 1145 -4.601776203532702e+01 +585 1146 -3.582072268161387e+01 +585 1147 -2.648026715992622e+01 +585 1148 -1.953249673072867e+01 +585 1149 -1.489187979900572e+01 +585 1150 -1.199392684783546e+01 +585 1151 -1.033025206259609e+01 +585 1152 -9.574614729634387e+00 +585 1423 -9.485456953123382e+00 +585 1424 -8.813722702286093e+00 +585 1425 -7.720270179432532e+00 +585 1426 -6.526086991349062e+00 +585 1427 -5.460334268221786e+00 +585 1428 -4.623196535591008e+00 +585 1429 -4.028382153902576e+00 +585 1430 -3.654050001394688e+00 +585 1431 -3.474506751309654e+00 +586 298 -5.416220002058462e+01 +586 299 -5.847168336242218e+01 +586 300 -6.797204698756194e+01 +586 301 -8.455751811576003e+01 +586 302 -1.112023202068744e+02 +586 303 -1.512628164030904e+02 +586 304 -2.053883607687487e+02 +586 305 -2.647767438527633e+02 +586 306 -3.065373731090124e+02 +586 865 -5.416220002058459e+01 +586 866 -5.028460369863168e+01 +586 867 -4.398263164573861e+01 +586 868 -3.711530555640484e+01 +586 869 -3.100122392289862e+01 +586 870 -2.620940698061743e+01 +586 871 -2.281096793104269e+01 +586 872 -2.067515029553632e+01 +586 873 -1.965157861598589e+01 +586 1000 -1.965477828103597e+01 +586 1001 -1.870055440211150e+01 +586 1002 -1.707507926940497e+01 +586 1003 -1.518203609416467e+01 +586 1004 -1.336813651340294e+01 +586 1005 -1.184372960400065e+01 +586 1006 -1.069703031088084e+01 +586 1007 -9.944085360683061e+00 +586 1008 -9.573445684409064e+00 +587 298 -5.028460369863168e+01 +587 299 -5.416220002058462e+01 +587 300 -6.266865647386100e+01 +587 301 -7.739429142416689e+01 +587 302 -1.007640600234616e+02 +587 303 -1.353445496343034e+02 +587 304 -1.811983282511272e+02 +587 305 -2.305668762810884e+02 +587 306 -2.647767438527633e+02 +587 865 -5.847168336242214e+01 +587 866 -5.416220002058462e+01 +587 867 -4.718848846240642e+01 +587 868 -3.963467701820886e+01 +587 869 -3.295302401855845e+01 +587 870 -2.774798050936781e+01 +587 871 -2.407490908992508e+01 +587 872 -2.177494503977683e+01 +587 873 -2.067515029553633e+01 +587 1000 -2.067858569511584e+01 +587 1001 -1.965477828103598e+01 +587 1002 -1.791417887437395e+01 +587 1003 -1.589274010473517e+01 +587 1004 -1.396191802264486e+01 +587 1005 -1.234420052045070e+01 +587 1006 -1.113049648221347e+01 +587 1007 -1.033512964800000e+01 +587 1008 -9.944085360683063e+00 +588 298 -4.398263164573861e+01 +588 299 -4.718848846240642e+01 +588 300 -5.416220002058459e+01 +588 301 -6.606134132672688e+01 +588 302 -8.455751811575999e+01 +588 303 -1.112023202068744e+02 +588 304 -1.454508347890306e+02 +588 305 -1.811983282511272e+02 +588 306 -2.053883607687487e+02 +588 865 -6.797204698756194e+01 +588 866 -6.266865647386102e+01 +588 867 -5.416220002058462e+01 +588 868 -4.506046026496942e+01 +588 869 -3.711530555640486e+01 +588 870 -3.100122392289864e+01 +588 871 -2.672989532903560e+01 +588 872 -2.407490908992508e+01 +588 873 -2.281096793104269e+01 +588 1000 -2.281491025526309e+01 +588 1001 -2.164167292784033e+01 +588 1002 -1.965477828103598e+01 +588 1003 -1.736013665098131e+01 +588 1004 -1.518203609416467e+01 +588 1005 -1.336813651340294e+01 +588 1006 -1.201426721054982e+01 +588 1007 -1.113049648221347e+01 +588 1008 -1.069703031088085e+01 +589 298 -3.711530555640484e+01 +589 299 -3.963467701820886e+01 +589 300 -4.506046026496939e+01 +589 301 -5.416220002058462e+01 +589 302 -6.797204698756194e+01 +589 303 -8.726265053974943e+01 +589 304 -1.112023202068744e+02 +589 305 -1.353445496343034e+02 +589 306 -1.512628164030904e+02 +589 865 -8.455751811575999e+01 +589 866 -7.739429142416689e+01 +589 867 -6.606134132672688e+01 +589 868 -5.416220002058462e+01 +589 869 -4.398263164573862e+01 +589 870 -3.629276779865594e+01 +589 871 -3.100122392289864e+01 +589 872 -2.774798050936781e+01 +589 873 -2.620940698061744e+01 +589 1000 -2.621419542240645e+01 +589 1001 -2.479209926714915e+01 +589 1002 -2.239757409043196e+01 +589 1003 -1.965477828103598e+01 +589 1004 -1.707507926940498e+01 +589 1005 -1.494561758129199e+01 +589 1006 -1.336813651340294e+01 +589 1007 -1.234420052045070e+01 +589 1008 -1.184372960400065e+01 +590 298 -3.100122392289862e+01 +590 299 -3.295302401855845e+01 +590 300 -3.711530555640484e+01 +590 301 -4.398263164573862e+01 +590 302 -5.416220002058462e+01 +590 303 -6.797204698756194e+01 +590 304 -8.455751811575999e+01 +590 305 -1.007640600234616e+02 +590 306 -1.112023202068744e+02 +590 865 -1.112023202068744e+02 +590 866 -1.007640600234616e+02 +590 867 -8.455751811575999e+01 +590 868 -6.797204698756194e+01 +590 869 -5.416220002058462e+01 +590 870 -4.398263164573862e+01 +590 871 -3.711530555640486e+01 +590 872 -3.295302401855845e+01 +590 873 -3.100122392289864e+01 +590 1000 -3.100728135248165e+01 +590 1001 -2.921308657465229e+01 +590 1002 -2.621419542240645e+01 +590 1003 -2.281491025526309e+01 +590 1004 -1.965477828103598e+01 +590 1005 -1.707507926940498e+01 +590 1006 -1.518203609416467e+01 +590 1007 -1.396191802264486e+01 +590 1008 -1.336813651340294e+01 +591 298 -2.620940698061743e+01 +591 299 -2.774798050936781e+01 +591 300 -3.100122392289862e+01 +591 301 -3.629276779865594e+01 +591 302 -4.398263164573862e+01 +591 303 -5.416220002058462e+01 +591 304 -6.606134132672688e+01 +591 305 -7.739429142416689e+01 +591 306 -8.455751811576003e+01 +591 865 -1.512628164030903e+02 +591 866 -1.353445496343034e+02 +591 867 -1.112023202068744e+02 +591 868 -8.726265053974943e+01 +591 869 -6.797204698756194e+01 +591 870 -5.416220002058462e+01 +591 871 -4.506046026496942e+01 +591 872 -3.963467701820886e+01 +591 873 -3.711530555640486e+01 +591 1000 -3.712309913086534e+01 +591 1001 -3.482168460593338e+01 +591 1002 -3.100728135248165e+01 +591 1003 -2.673481743251408e+01 +591 1004 -2.281491025526309e+01 +591 1005 -1.965477828103598e+01 +591 1006 -1.736013665098131e+01 +591 1007 -1.589274010473517e+01 +591 1008 -1.518203609416467e+01 +592 298 -2.281096793104269e+01 +592 299 -2.407490908992508e+01 +592 300 -2.672989532903559e+01 +592 301 -3.100122392289864e+01 +592 302 -3.711530555640486e+01 +592 303 -4.506046026496942e+01 +592 304 -5.416220002058462e+01 +592 305 -6.266865647386102e+01 +592 306 -6.797204698756197e+01 +592 865 -2.053883607687485e+02 +592 866 -1.811983282511272e+02 +592 867 -1.454508347890306e+02 +592 868 -1.112023202068744e+02 +592 869 -8.455751811575999e+01 +592 870 -6.606134132672688e+01 +592 871 -5.416220002058462e+01 +592 872 -4.718848846240642e+01 +592 873 -4.398263164573862e+01 +592 1000 -4.399251628020362e+01 +592 1001 -4.108257963331432e+01 +592 1002 -3.630032063351617e+01 +592 1003 -3.100728135248165e+01 +592 1004 -2.621419542240645e+01 +592 1005 -2.239757409043196e+01 +592 1006 -1.965477828103598e+01 +592 1007 -1.791417887437395e+01 +592 1008 -1.707507926940498e+01 +593 298 -2.067515029553632e+01 +593 299 -2.177494503977683e+01 +593 300 -2.407490908992507e+01 +593 301 -2.774798050936781e+01 +593 302 -3.295302401855845e+01 +593 303 -3.963467701820886e+01 +593 304 -4.718848846240642e+01 +593 305 -5.416220002058462e+01 +593 306 -5.847168336242218e+01 +593 865 -2.647767438527630e+02 +593 866 -2.305668762810884e+02 +593 867 -1.811983282511272e+02 +593 868 -1.353445496343034e+02 +593 869 -1.007640600234616e+02 +593 870 -7.739429142416689e+01 +593 871 -6.266865647386102e+01 +593 872 -5.416220002058462e+01 +593 873 -5.028460369863171e+01 +593 1000 -5.029652653878190e+01 +593 1001 -4.679557686118159e+01 +593 1002 -4.108257963331432e+01 +593 1003 -3.482168460593338e+01 +593 1004 -2.921308657465229e+01 +593 1005 -2.479209926714915e+01 +593 1006 -2.164167292784033e+01 +593 1007 -1.965477828103598e+01 +593 1008 -1.870055440211151e+01 +594 298 -1.965157861598589e+01 +594 299 -2.067515029553633e+01 +594 300 -2.281096793104269e+01 +594 301 -2.620940698061744e+01 +594 302 -3.100122392289864e+01 +594 303 -3.711530555640486e+01 +594 304 -4.398263164573862e+01 +594 305 -5.028460369863171e+01 +594 306 -5.416220002058465e+01 +594 865 -3.065373731090118e+02 +594 866 -2.647767438527630e+02 +594 867 -2.053883607687485e+02 +594 868 -1.512628164030903e+02 +594 869 -1.112023202068744e+02 +594 870 -8.455751811575999e+01 +594 871 -6.797204698756194e+01 +594 872 -5.847168336242214e+01 +594 873 -5.416220002058462e+01 +594 1000 -5.417542964960961e+01 +594 1001 -5.029652653878190e+01 +594 1002 -4.399251628020362e+01 +594 1003 -3.712309913086534e+01 +594 1004 -3.100728135248165e+01 +594 1005 -2.621419542240645e+01 +594 1006 -2.281491025526309e+01 +594 1007 -2.067858569511584e+01 +594 1008 -1.965477828103598e+01 +595 442 -3.063876713483004e+02 +595 443 -3.311617365195740e+02 +595 444 -3.859179776157595e+02 +595 445 -4.819366867771664e+02 +595 446 -6.371952057562393e+02 +595 447 -8.726231103602329e+02 +595 448 -1.193932486839834e+03 +595 449 -1.550121445008505e+03 +595 450 -1.802596433195452e+03 +595 730 -3.063876713483007e+02 +595 731 -2.841326260213864e+02 +595 732 -2.480403651673273e+02 +595 733 -2.088271183655455e+02 +595 734 -1.740274317161709e+02 +595 735 -1.468355065336027e+02 +595 736 -1.275984131219180e+02 +595 737 -1.155304899028560e+02 +595 738 -1.097534196790493e+02 +595 793 -1.111842160419090e+02 +595 794 -1.057061586526020e+02 +595 795 -9.638822517401596e+01 +595 796 -8.555928471614152e+01 +595 797 -7.520762033775924e+01 +595 798 -6.652797451218335e+01 +595 799 -6.001174723167340e+01 +595 800 -5.573941364116936e+01 +595 801 -5.363826960242958e+01 +596 442 -2.841326260213864e+02 +596 443 -3.063876713483007e+02 +596 444 -3.553280674768358e+02 +596 445 -4.404031329187428e+02 +596 446 -5.762343277298883e+02 +596 447 -7.788097592344280e+02 +596 448 -1.049909849375154e+03 +596 449 -1.344510568096310e+03 +596 450 -1.550121445008512e+03 +596 730 -3.311617365195740e+02 +596 731 -3.063876713483004e+02 +596 732 -2.663884709281890e+02 +596 733 -2.231981844606885e+02 +596 734 -1.851243485745370e+02 +596 735 -1.555580782497810e+02 +596 736 -1.347481526436476e+02 +596 737 -1.217424124188379e+02 +596 738 -1.155304899028560e+02 +596 793 -1.170681125153374e+02 +596 794 -1.111842160419089e+02 +596 795 -1.011961191083174e+02 +596 796 -8.962181586287865e+01 +596 797 -7.859349409841361e+01 +596 798 -6.937545782864687e+01 +596 799 -6.247361649834816e+01 +596 800 -5.795761808209188e+01 +596 801 -5.573941364116933e+01 +597 442 -2.480403651673273e+02 +597 443 -2.663884709281892e+02 +597 444 -3.063876713483000e+02 +597 445 -3.748904053829390e+02 +597 446 -4.819366867771664e+02 +597 447 -6.371952057562393e+02 +597 448 -8.383319685358450e+02 +597 449 -1.049909849375151e+03 +597 450 -1.193932486839834e+03 +597 730 -3.859179776157605e+02 +597 731 -3.553280674768362e+02 +597 732 -3.063876713483004e+02 +597 733 -2.542062119667733e+02 +597 734 -2.088271183655457e+02 +597 735 -1.740274317161710e+02 +597 736 -1.497853840269160e+02 +597 737 -1.347481526436476e+02 +597 738 -1.275984131219179e+02 +597 793 -1.293661657908652e+02 +597 794 -1.226088998409726e+02 +597 795 -1.111842160419089e+02 +597 796 -9.802102195827709e+01 +597 797 -8.555928471614156e+01 +597 798 -7.520762033775929e+01 +597 799 -6.749803222962952e+01 +597 800 -6.247361649834816e+01 +597 801 -6.001174723167335e+01 +598 442 -2.088271183655455e+02 +598 443 -2.231981844606887e+02 +598 444 -2.542062119667730e+02 +598 445 -3.063876713483000e+02 +598 446 -3.859179776157595e+02 +598 447 -4.976453857371587e+02 +598 448 -6.371952057562393e+02 +598 449 -7.788097592344254e+02 +598 450 -8.726231103602329e+02 +598 730 -4.819366867771678e+02 +598 731 -4.404031329187433e+02 +598 732 -3.748904053829394e+02 +598 733 -3.063876713483004e+02 +598 734 -2.480403651673276e+02 +598 735 -2.041390437321801e+02 +598 736 -1.740274317161710e+02 +598 737 -1.555580782497810e+02 +598 738 -1.468355065336025e+02 +598 793 -1.489885081652994e+02 +598 794 -1.407716848553633e+02 +598 795 -1.269615920628683e+02 +598 796 -1.111842160419089e+02 +598 797 -9.638822517401600e+01 +598 798 -8.420868002944924e+01 +598 799 -7.520762033775929e+01 +598 800 -6.937545782864687e+01 +598 801 -6.652797451218332e+01 +599 442 -1.740274317161709e+02 +599 443 -1.851243485745372e+02 +599 444 -2.088271183655455e+02 +599 445 -2.480403651673273e+02 +599 446 -3.063876713483004e+02 +599 447 -3.859179776157600e+02 +599 448 -4.819366867771671e+02 +599 449 -5.762343277298875e+02 +599 450 -6.371952057562402e+02 +599 730 -6.371952057562402e+02 +599 731 -5.762343277298883e+02 +599 732 -4.819366867771664e+02 +599 733 -3.859179776157595e+02 +599 734 -3.063876713483004e+02 +599 735 -2.480403651673276e+02 +599 736 -2.088271183655457e+02 +599 737 -1.851243485745370e+02 +599 738 -1.740274317161707e+02 +599 793 -1.767605489846857e+02 +599 794 -1.663510232448635e+02 +599 795 -1.489885081652992e+02 +599 796 -1.293661657908650e+02 +599 797 -1.111842160419089e+02 +599 798 -9.638822517401600e+01 +599 799 -8.555928471614156e+01 +599 800 -7.859349409841361e+01 +599 801 -7.520762033775921e+01 +600 442 -1.468355065336027e+02 +600 443 -1.555580782497811e+02 +600 444 -1.740274317161709e+02 +600 445 -2.041390437321799e+02 +600 446 -2.480403651673276e+02 +600 447 -3.063876713483007e+02 +600 448 -3.748904053829399e+02 +600 449 -4.404031329187428e+02 +600 450 -4.819366867771678e+02 +600 730 -8.726231103602329e+02 +600 731 -7.788097592344268e+02 +600 732 -6.371952057562384e+02 +600 733 -4.976453857371580e+02 +600 734 -3.859179776157595e+02 +600 735 -3.063876713483004e+02 +600 736 -2.542062119667733e+02 +600 737 -2.231981844606885e+02 +600 738 -2.088271183655453e+02 +600 793 -2.123577731150844e+02 +600 794 -1.989422168423268e+02 +600 795 -1.767605489846853e+02 +600 796 -1.519993633210925e+02 +600 797 -1.293661657908650e+02 +600 798 -1.111842160419089e+02 +600 799 -9.802102195827709e+01 +600 800 -8.962181586287865e+01 +600 801 -8.555928471614145e+01 +601 442 -1.275984131219180e+02 +601 443 -1.347481526436477e+02 +601 444 -1.497853840269158e+02 +601 445 -1.740274317161709e+02 +601 446 -2.088271183655457e+02 +601 447 -2.542062119667736e+02 +601 448 -3.063876713483007e+02 +601 449 -3.553280674768358e+02 +601 450 -3.859179776157605e+02 +601 730 -1.193932486839834e+03 +601 731 -1.049909849375152e+03 +601 732 -8.383319685358435e+02 +601 733 -6.371952057562384e+02 +601 734 -4.819366867771664e+02 +601 735 -3.748904053829394e+02 +601 736 -3.063876713483004e+02 +601 737 -2.663884709281890e+02 +601 738 -2.480403651673271e+02 +601 793 -2.525366109215767e+02 +601 794 -2.354925657825778e+02 +601 795 -2.075588680195229e+02 +601 796 -1.767605489846853e+02 +601 797 -1.489885081652992e+02 +601 798 -1.269615920628683e+02 +601 799 -1.111842160419089e+02 +601 800 -1.011961191083174e+02 +601 801 -9.638822517401589e+01 +602 442 -1.155304899028560e+02 +602 443 -1.217424124188380e+02 +602 444 -1.347481526436475e+02 +602 445 -1.555580782497809e+02 +602 446 -1.851243485745370e+02 +602 447 -2.231981844606887e+02 +602 448 -2.663884709281892e+02 +602 449 -3.063876713483000e+02 +602 450 -3.311617365195740e+02 +602 730 -1.550121445008512e+03 +602 731 -1.344510568096313e+03 +602 732 -1.049909849375152e+03 +602 733 -7.788097592344268e+02 +602 734 -5.762343277298883e+02 +602 735 -4.404031329187433e+02 +602 736 -3.553280674768362e+02 +602 737 -3.063876713483004e+02 +602 738 -2.841326260213861e+02 +602 793 -2.895745815575327e+02 +602 794 -2.689865983609328e+02 +602 795 -2.354925657825778e+02 +602 796 -1.989422168423268e+02 +602 797 -1.663510232448635e+02 +602 798 -1.407716848553633e+02 +602 799 -1.226088998409726e+02 +602 800 -1.111842160419089e+02 +602 801 -1.057061586526020e+02 +603 442 -1.097534196790493e+02 +603 443 -1.155304899028560e+02 +603 444 -1.275984131219178e+02 +603 445 -1.468355065336024e+02 +603 446 -1.740274317161707e+02 +603 447 -2.088271183655455e+02 +603 448 -2.480403651673273e+02 +603 449 -2.841326260213858e+02 +603 450 -3.063876713483004e+02 +603 730 -1.802596433195456e+03 +603 731 -1.550121445008512e+03 +603 732 -1.193932486839834e+03 +603 733 -8.726231103602329e+02 +603 734 -6.371952057562402e+02 +603 735 -4.819366867771678e+02 +603 736 -3.859179776157605e+02 +603 737 -3.311617365195740e+02 +603 738 -3.063876713483004e+02 +603 793 -3.124380547854544e+02 +603 794 -2.895745815575327e+02 +603 795 -2.525366109215767e+02 +603 796 -2.123577731150844e+02 +603 797 -1.767605489846857e+02 +603 798 -1.489885081652994e+02 +603 799 -1.293661657908652e+02 +603 800 -1.170681125153374e+02 +603 801 -1.111842160419089e+02 +604 514 -1.733190400658708e+03 +604 515 -1.877824568765012e+03 +604 516 -2.199157547087195e+03 +604 517 -2.767706810094291e+03 +604 518 -3.699147964795170e+03 +604 519 -5.136224430633847e+03 +604 520 -7.138491575686255e+03 +604 521 -9.405703259334599e+03 +604 522 -1.103972130715916e+04 +604 667 -1.733190400658704e+03 +604 668 -1.603684467943636e+03 +604 669 -1.394551574360513e+03 +604 670 -1.168677565678391e+03 +604 671 -9.695072463564451e+02 +604 672 -8.148024630667965e+02 +604 673 -7.058924559832880e+02 +604 674 -6.378158089920680e+02 +604 675 -6.052974323170223e+02 +604 694 -6.289529049931505e+02 +604 695 -5.970589583440833e+02 +604 696 -5.429674662554829e+02 +604 697 -4.803677035258839e+02 +604 698 -4.208084537187718e+02 +604 699 -3.710963518270344e+02 +604 700 -3.339204550667992e+02 +604 701 -3.096178268240468e+02 +604 702 -2.976873911031307e+02 +605 514 -1.603684467943636e+03 +605 515 -1.733190400658708e+03 +605 516 -2.019368486704435e+03 +605 517 -2.521021940438006e+03 +605 518 -3.331754877699595e+03 +605 519 -4.560278038130808e+03 +605 520 -6.235592529048601e+03 +605 521 -8.091232579773156e+03 +605 522 -9.405703259334599e+03 +605 667 -1.877824568765008e+03 +605 668 -1.733190400658708e+03 +605 669 -1.500725861549673e+03 +605 670 -1.251286952144480e+03 +605 671 -1.032880208377977e+03 +605 672 -8.643348602446105e+02 +605 673 -7.463158073460687e+02 +605 674 -6.728335244699299e+02 +605 675 -6.378158089920689e+02 +605 694 -6.632839990295092e+02 +605 695 -6.289529049931513e+02 +605 696 -5.708523475060541e+02 +605 697 -5.038180997021776e+02 +605 698 -4.402579127124382e+02 +605 699 -3.873813675510154e+02 +605 700 -3.479505460244110e+02 +605 701 -3.222285372305477e+02 +605 702 -3.096178268240471e+02 +606 514 -1.394551574360513e+03 +606 515 -1.500725861549673e+03 +606 516 -1.733190400658708e+03 +606 517 -2.134265778758331e+03 +606 518 -2.767706810094291e+03 +606 519 -3.699147964795170e+03 +606 520 -4.925216936196723e+03 +606 521 -6.235592529048601e+03 +606 522 -7.138491575686255e+03 +606 667 -2.199157547087190e+03 +606 668 -2.019368486704435e+03 +606 669 -1.733190400658708e+03 +606 670 -1.430197816180116e+03 +606 671 -1.168677565678393e+03 +606 672 -9.695072463564467e+02 +606 673 -8.315436028021828e+02 +606 674 -7.463158073460687e+02 +606 675 -7.058924559832891e+02 +606 694 -7.352796046183660e+02 +606 695 -6.956816209337401e+02 +606 696 -6.289529049931513e+02 +606 697 -5.524312223207834e+02 +606 698 -4.803677035258846e+02 +606 699 -4.208084537187723e+02 +606 700 -3.766415408901786e+02 +606 701 -3.479505460244110e+02 +606 702 -3.339204550667995e+02 +607 514 -1.168677565678391e+03 +607 515 -1.251286952144480e+03 +607 516 -1.430197816180116e+03 +607 517 -1.733190400658704e+03 +607 518 -2.199157547087190e+03 +607 519 -2.861294172280323e+03 +607 520 -3.699147964795159e+03 +607 521 -4.560278038130793e+03 +607 522 -5.136224430633830e+03 +607 667 -2.767706810094291e+03 +607 668 -2.521021940438013e+03 +607 669 -2.134265778758337e+03 +607 670 -1.733190400658708e+03 +607 671 -1.394551574360516e+03 +607 672 -1.141773184361051e+03 +607 673 -9.695072463564467e+02 +607 674 -8.643348602446105e+02 +607 675 -8.148024630667978e+02 +607 694 -8.507888885505199e+02 +607 695 -8.023274760830702e+02 +607 696 -7.211778000851822e+02 +607 697 -6.289529049931513e+02 +607 698 -5.429674662554836e+02 +607 699 -4.725808574370910e+02 +607 700 -4.208084537187723e+02 +607 701 -3.873813675510154e+02 +607 702 -3.710963518270349e+02 +608 514 -9.695072463564451e+02 +608 515 -1.032880208377977e+03 +608 516 -1.168677565678393e+03 +608 517 -1.394551574360513e+03 +608 518 -1.733190400658708e+03 +608 519 -2.199157547087195e+03 +608 520 -2.767706810094291e+03 +608 521 -3.331754877699595e+03 +608 522 -3.699147964795170e+03 +608 667 -3.699147964795159e+03 +608 668 -3.331754877699595e+03 +608 669 -2.767706810094291e+03 +608 670 -2.199157547087190e+03 +608 671 -1.733190400658708e+03 +608 672 -1.394551574360516e+03 +608 673 -1.168677565678393e+03 +608 674 -1.032880208377977e+03 +608 675 -9.695072463564467e+02 +608 694 -1.015511306612463e+03 +608 695 -9.536070604341750e+02 +608 696 -8.507888885505199e+02 +608 697 -7.352796046183660e+02 +608 698 -6.289529049931513e+02 +608 699 -5.429674662554836e+02 +608 700 -4.803677035258846e+02 +608 701 -4.402579127124382e+02 +608 702 -4.208084537187723e+02 +609 514 -8.148024630667965e+02 +609 515 -8.643348602446105e+02 +609 516 -9.695072463564467e+02 +609 517 -1.141773184361049e+03 +609 518 -1.394551574360516e+03 +609 519 -1.733190400658712e+03 +609 520 -2.134265778758337e+03 +609 521 -2.521021940438013e+03 +609 522 -2.767706810094298e+03 +609 667 -5.136224430633812e+03 +609 668 -4.560278038130793e+03 +609 669 -3.699147964795159e+03 +609 670 -2.861294172280315e+03 +609 671 -2.199157547087190e+03 +609 672 -1.733190400658708e+03 +609 673 -1.430197816180116e+03 +609 674 -1.251286952144480e+03 +609 675 -1.168677565678393e+03 +609 694 -1.228588660544043e+03 +609 695 -1.148042053110076e+03 +609 696 -1.015511306612463e+03 +609 697 -8.685786765383741e+02 +609 698 -7.352796046183660e+02 +609 699 -6.289529049931513e+02 +609 700 -5.524312223207834e+02 +609 701 -5.038180997021776e+02 +609 702 -4.803677035258846e+02 +610 514 -7.058924559832880e+02 +610 515 -7.463158073460687e+02 +610 516 -8.315436028021828e+02 +610 517 -9.695072463564451e+02 +610 518 -1.168677565678393e+03 +610 519 -1.430197816180119e+03 +610 520 -1.733190400658708e+03 +610 521 -2.019368486704435e+03 +610 522 -2.199157547087195e+03 +610 667 -7.138491575686227e+03 +610 668 -6.235592529048601e+03 +610 669 -4.925216936196723e+03 +610 670 -3.699147964795159e+03 +610 671 -2.767706810094291e+03 +610 672 -2.134265778758337e+03 +610 673 -1.733190400658708e+03 +610 674 -1.500725861549673e+03 +610 675 -1.394551574360516e+03 +610 694 -1.471477730866021e+03 +610 695 -1.368148367306964e+03 +610 696 -1.199743197084304e+03 +610 697 -1.015511306612463e+03 +610 698 -8.507888885505199e+02 +610 699 -7.211778000851822e+02 +610 700 -6.289529049931513e+02 +610 701 -5.708523475060541e+02 +610 702 -5.429674662554836e+02 +611 514 -6.378158089920680e+02 +611 515 -6.728335244699299e+02 +611 516 -7.463158073460687e+02 +611 517 -8.643348602446090e+02 +611 518 -1.032880208377977e+03 +611 519 -1.251286952144482e+03 +611 520 -1.500725861549673e+03 +611 521 -1.733190400658708e+03 +611 522 -1.877824568765012e+03 +611 667 -9.405703259334558e+03 +611 668 -8.091232579773156e+03 +611 669 -6.235592529048601e+03 +611 670 -4.560278038130793e+03 +611 671 -3.331754877699595e+03 +611 672 -2.521021940438013e+03 +611 673 -2.019368486704435e+03 +611 674 -1.733190400658708e+03 +611 675 -1.603684467943639e+03 +611 694 -1.697437739078442e+03 +611 695 -1.571600895131404e+03 +611 696 -1.368148367306964e+03 +611 697 -1.148042053110076e+03 +611 698 -9.536070604341750e+02 +611 699 -8.023274760830702e+02 +611 700 -6.956816209337401e+02 +611 701 -6.289529049931513e+02 +611 702 -5.970589583440841e+02 +612 514 -6.052974323170223e+02 +612 515 -6.378158089920689e+02 +612 516 -7.058924559832891e+02 +612 517 -8.148024630667965e+02 +612 518 -9.695072463564467e+02 +612 519 -1.168677565678395e+03 +612 520 -1.394551574360516e+03 +612 521 -1.603684467943639e+03 +612 522 -1.733190400658712e+03 +612 667 -1.103972130715905e+04 +612 668 -9.405703259334558e+03 +612 669 -7.138491575686227e+03 +612 670 -5.136224430633812e+03 +612 671 -3.699147964795159e+03 +612 672 -2.767706810094291e+03 +612 673 -2.199157547087190e+03 +612 674 -1.877824568765008e+03 +612 675 -1.733190400658708e+03 +612 694 -1.837845240586523e+03 +612 695 -1.697437739078442e+03 +612 696 -1.471477730866021e+03 +612 697 -1.228588660544043e+03 +612 698 -1.015511306612463e+03 +612 699 -8.507888885505199e+02 +612 700 -7.352796046183660e+02 +612 701 -6.632839990295092e+02 +612 702 -6.289529049931513e+02 +631 514 -6.289529049931505e+02 +631 515 -6.632839990295092e+02 +631 516 -7.352796046183660e+02 +631 517 -8.507888885505185e+02 +631 518 -1.015511306612463e+03 +631 519 -1.228588660544045e+03 +631 520 -1.471477730866021e+03 +631 521 -1.697437739078442e+03 +631 522 -1.837845240586527e+03 +631 541 -1.733190400658704e+03 +631 542 -1.877824568765008e+03 +631 543 -2.199157547087190e+03 +631 544 -2.767706810094283e+03 +631 545 -3.699147964795159e+03 +631 546 -5.136224430633830e+03 +631 547 -7.138491575686227e+03 +631 548 -9.405703259334558e+03 +631 549 -1.103972130715910e+04 +631 694 -1.733190400658708e+03 +631 695 -1.603684467943639e+03 +631 696 -1.394551574360516e+03 +631 697 -1.168677565678393e+03 +631 698 -9.695072463564467e+02 +631 699 -8.148024630667978e+02 +631 700 -7.058924559832891e+02 +631 701 -6.378158089920689e+02 +631 702 -6.052974323170231e+02 +632 514 -5.970589583440833e+02 +632 515 -6.289529049931513e+02 +632 516 -6.956816209337401e+02 +632 517 -8.023274760830689e+02 +632 518 -9.536070604341750e+02 +632 519 -1.148042053110078e+03 +632 520 -1.368148367306964e+03 +632 521 -1.571600895131404e+03 +632 522 -1.697437739078445e+03 +632 541 -1.603684467943636e+03 +632 542 -1.733190400658708e+03 +632 543 -2.019368486704435e+03 +632 544 -2.521021940438006e+03 +632 545 -3.331754877699595e+03 +632 546 -4.560278038130808e+03 +632 547 -6.235592529048601e+03 +632 548 -8.091232579773156e+03 +632 549 -9.405703259334599e+03 +632 694 -1.877824568765008e+03 +632 695 -1.733190400658708e+03 +632 696 -1.500725861549673e+03 +632 697 -1.251286952144480e+03 +632 698 -1.032880208377977e+03 +632 699 -8.643348602446105e+02 +632 700 -7.463158073460687e+02 +632 701 -6.728335244699299e+02 +632 702 -6.378158089920689e+02 +633 514 -5.429674662554829e+02 +633 515 -5.708523475060541e+02 +633 516 -6.289529049931513e+02 +633 517 -7.211778000851810e+02 +633 518 -8.507888885505199e+02 +633 519 -1.015511306612465e+03 +633 520 -1.199743197084304e+03 +633 521 -1.368148367306964e+03 +633 522 -1.471477730866024e+03 +633 541 -1.394551574360513e+03 +633 542 -1.500725861549673e+03 +633 543 -1.733190400658708e+03 +633 544 -2.134265778758331e+03 +633 545 -2.767706810094291e+03 +633 546 -3.699147964795170e+03 +633 547 -4.925216936196723e+03 +633 548 -6.235592529048601e+03 +633 549 -7.138491575686255e+03 +633 694 -2.199157547087190e+03 +633 695 -2.019368486704435e+03 +633 696 -1.733190400658708e+03 +633 697 -1.430197816180116e+03 +633 698 -1.168677565678393e+03 +633 699 -9.695072463564467e+02 +633 700 -8.315436028021828e+02 +633 701 -7.463158073460687e+02 +633 702 -7.058924559832891e+02 +634 514 -4.803677035258839e+02 +634 515 -5.038180997021776e+02 +634 516 -5.524312223207834e+02 +634 517 -6.289529049931505e+02 +634 518 -7.352796046183660e+02 +634 519 -8.685786765383756e+02 +634 520 -1.015511306612463e+03 +634 521 -1.148042053110076e+03 +634 522 -1.228588660544045e+03 +634 541 -1.168677565678391e+03 +634 542 -1.251286952144480e+03 +634 543 -1.430197816180116e+03 +634 544 -1.733190400658704e+03 +634 545 -2.199157547087190e+03 +634 546 -2.861294172280323e+03 +634 547 -3.699147964795159e+03 +634 548 -4.560278038130793e+03 +634 549 -5.136224430633830e+03 +634 694 -2.767706810094291e+03 +634 695 -2.521021940438013e+03 +634 696 -2.134265778758337e+03 +634 697 -1.733190400658708e+03 +634 698 -1.394551574360516e+03 +634 699 -1.141773184361051e+03 +634 700 -9.695072463564467e+02 +634 701 -8.643348602446105e+02 +634 702 -8.148024630667978e+02 +635 514 -4.208084537187718e+02 +635 515 -4.402579127124382e+02 +635 516 -4.803677035258846e+02 +635 517 -5.429674662554829e+02 +635 518 -6.289529049931513e+02 +635 519 -7.352796046183671e+02 +635 520 -8.507888885505199e+02 +635 521 -9.536070604341750e+02 +635 522 -1.015511306612465e+03 +635 541 -9.695072463564451e+02 +635 542 -1.032880208377977e+03 +635 543 -1.168677565678393e+03 +635 544 -1.394551574360513e+03 +635 545 -1.733190400658708e+03 +635 546 -2.199157547087195e+03 +635 547 -2.767706810094291e+03 +635 548 -3.331754877699595e+03 +635 549 -3.699147964795170e+03 +635 694 -3.699147964795159e+03 +635 695 -3.331754877699595e+03 +635 696 -2.767706810094291e+03 +635 697 -2.199157547087190e+03 +635 698 -1.733190400658708e+03 +635 699 -1.394551574360516e+03 +635 700 -1.168677565678393e+03 +635 701 -1.032880208377977e+03 +635 702 -9.695072463564467e+02 +636 514 -3.710963518270344e+02 +636 515 -3.873813675510154e+02 +636 516 -4.208084537187723e+02 +636 517 -4.725808574370903e+02 +636 518 -5.429674662554836e+02 +636 519 -6.289529049931523e+02 +636 520 -7.211778000851822e+02 +636 521 -8.023274760830702e+02 +636 522 -8.507888885505214e+02 +636 541 -8.148024630667965e+02 +636 542 -8.643348602446105e+02 +636 543 -9.695072463564467e+02 +636 544 -1.141773184361049e+03 +636 545 -1.394551574360516e+03 +636 546 -1.733190400658712e+03 +636 547 -2.134265778758337e+03 +636 548 -2.521021940438013e+03 +636 549 -2.767706810094298e+03 +636 694 -5.136224430633812e+03 +636 695 -4.560278038130793e+03 +636 696 -3.699147964795159e+03 +636 697 -2.861294172280315e+03 +636 698 -2.199157547087190e+03 +636 699 -1.733190400658708e+03 +636 700 -1.430197816180116e+03 +636 701 -1.251286952144480e+03 +636 702 -1.168677565678393e+03 +637 514 -3.339204550667992e+02 +637 515 -3.479505460244110e+02 +637 516 -3.766415408901786e+02 +637 517 -4.208084537187718e+02 +637 518 -4.803677035258846e+02 +637 519 -5.524312223207843e+02 +637 520 -6.289529049931513e+02 +637 521 -6.956816209337401e+02 +637 522 -7.352796046183671e+02 +637 541 -7.058924559832880e+02 +637 542 -7.463158073460687e+02 +637 543 -8.315436028021828e+02 +637 544 -9.695072463564451e+02 +637 545 -1.168677565678393e+03 +637 546 -1.430197816180119e+03 +637 547 -1.733190400658708e+03 +637 548 -2.019368486704435e+03 +637 549 -2.199157547087195e+03 +637 694 -7.138491575686227e+03 +637 695 -6.235592529048601e+03 +637 696 -4.925216936196723e+03 +637 697 -3.699147964795159e+03 +637 698 -2.767706810094291e+03 +637 699 -2.134265778758337e+03 +637 700 -1.733190400658708e+03 +637 701 -1.500725861549673e+03 +637 702 -1.394551574360516e+03 +638 514 -3.096178268240468e+02 +638 515 -3.222285372305477e+02 +638 516 -3.479505460244110e+02 +638 517 -3.873813675510149e+02 +638 518 -4.402579127124382e+02 +638 519 -5.038180997021782e+02 +638 520 -5.708523475060541e+02 +638 521 -6.289529049931513e+02 +638 522 -6.632839990295103e+02 +638 541 -6.378158089920680e+02 +638 542 -6.728335244699299e+02 +638 543 -7.463158073460687e+02 +638 544 -8.643348602446090e+02 +638 545 -1.032880208377977e+03 +638 546 -1.251286952144482e+03 +638 547 -1.500725861549673e+03 +638 548 -1.733190400658708e+03 +638 549 -1.877824568765012e+03 +638 694 -9.405703259334558e+03 +638 695 -8.091232579773156e+03 +638 696 -6.235592529048601e+03 +638 697 -4.560278038130793e+03 +638 698 -3.331754877699595e+03 +638 699 -2.521021940438013e+03 +638 700 -2.019368486704435e+03 +638 701 -1.733190400658708e+03 +638 702 -1.603684467943639e+03 +639 514 -2.976873911031307e+02 +639 515 -3.096178268240471e+02 +639 516 -3.339204550667995e+02 +639 517 -3.710963518270344e+02 +639 518 -4.208084537187723e+02 +639 519 -4.803677035258852e+02 +639 520 -5.429674662554836e+02 +639 521 -5.970589583440841e+02 +639 522 -6.289529049931523e+02 +639 541 -6.052974323170223e+02 +639 542 -6.378158089920689e+02 +639 543 -7.058924559832891e+02 +639 544 -8.148024630667965e+02 +639 545 -9.695072463564467e+02 +639 546 -1.168677565678395e+03 +639 547 -1.394551574360516e+03 +639 548 -1.603684467943639e+03 +639 549 -1.733190400658712e+03 +639 694 -1.103972130715905e+04 +639 695 -9.405703259334558e+03 +639 696 -7.138491575686227e+03 +639 697 -5.136224430633812e+03 +639 698 -3.699147964795159e+03 +639 699 -2.767706810094291e+03 +639 700 -2.199157547087190e+03 +639 701 -1.877824568765008e+03 +639 702 -1.733190400658708e+03 +658 442 -1.111842160419090e+02 +658 443 -1.170681125153375e+02 +658 444 -1.293661657908651e+02 +658 445 -1.489885081652993e+02 +658 446 -1.767605489846857e+02 +658 447 -2.123577731150847e+02 +658 448 -2.525366109215769e+02 +658 449 -2.895745815575323e+02 +658 450 -3.124380547854544e+02 +658 505 -3.063876713483007e+02 +658 506 -3.311617365195743e+02 +658 507 -3.859179776157600e+02 +658 508 -4.819366867771671e+02 +658 509 -6.371952057562402e+02 +658 510 -8.726231103602345e+02 +658 511 -1.193932486839836e+03 +658 512 -1.550121445008508e+03 +658 513 -1.802596433195456e+03 +658 793 -3.063876713483004e+02 +658 794 -2.841326260213861e+02 +658 795 -2.480403651673271e+02 +658 796 -2.088271183655453e+02 +658 797 -1.740274317161707e+02 +658 798 -1.468355065336025e+02 +658 799 -1.275984131219179e+02 +658 800 -1.155304899028560e+02 +658 801 -1.097534196790493e+02 +659 442 -1.057061586526020e+02 +659 443 -1.111842160419090e+02 +659 444 -1.226088998409725e+02 +659 445 -1.407716848553632e+02 +659 446 -1.663510232448635e+02 +659 447 -1.989422168423270e+02 +659 448 -2.354925657825781e+02 +659 449 -2.689865983609326e+02 +659 450 -2.895745815575327e+02 +659 505 -2.841326260213864e+02 +659 506 -3.063876713483007e+02 +659 507 -3.553280674768358e+02 +659 508 -4.404031329187428e+02 +659 509 -5.762343277298883e+02 +659 510 -7.788097592344280e+02 +659 511 -1.049909849375154e+03 +659 512 -1.344510568096310e+03 +659 513 -1.550121445008512e+03 +659 793 -3.311617365195740e+02 +659 794 -3.063876713483004e+02 +659 795 -2.663884709281890e+02 +659 796 -2.231981844606885e+02 +659 797 -1.851243485745370e+02 +659 798 -1.555580782497810e+02 +659 799 -1.347481526436476e+02 +659 800 -1.217424124188379e+02 +659 801 -1.155304899028560e+02 +660 442 -9.638822517401596e+01 +660 443 -1.011961191083175e+02 +660 444 -1.111842160419088e+02 +660 445 -1.269615920628682e+02 +660 446 -1.489885081652992e+02 +660 447 -1.767605489846855e+02 +660 448 -2.075588680195231e+02 +660 449 -2.354925657825776e+02 +660 450 -2.525366109215767e+02 +660 505 -2.480403651673273e+02 +660 506 -2.663884709281892e+02 +660 507 -3.063876713483000e+02 +660 508 -3.748904053829390e+02 +660 509 -4.819366867771664e+02 +660 510 -6.371952057562393e+02 +660 511 -8.383319685358450e+02 +660 512 -1.049909849375151e+03 +660 513 -1.193932486839834e+03 +660 793 -3.859179776157605e+02 +660 794 -3.553280674768362e+02 +660 795 -3.063876713483004e+02 +660 796 -2.542062119667733e+02 +660 797 -2.088271183655457e+02 +660 798 -1.740274317161710e+02 +660 799 -1.497853840269160e+02 +660 800 -1.347481526436476e+02 +660 801 -1.275984131219179e+02 +661 442 -8.555928471614152e+01 +661 443 -8.962181586287872e+01 +661 444 -9.802102195827702e+01 +661 445 -1.111842160419088e+02 +661 446 -1.293661657908650e+02 +661 447 -1.519993633210926e+02 +661 448 -1.767605489846855e+02 +661 449 -1.989422168423266e+02 +661 450 -2.123577731150844e+02 +661 505 -2.088271183655455e+02 +661 506 -2.231981844606887e+02 +661 507 -2.542062119667730e+02 +661 508 -3.063876713483000e+02 +661 509 -3.859179776157595e+02 +661 510 -4.976453857371587e+02 +661 511 -6.371952057562393e+02 +661 512 -7.788097592344254e+02 +661 513 -8.726231103602329e+02 +661 793 -4.819366867771678e+02 +661 794 -4.404031329187433e+02 +661 795 -3.748904053829394e+02 +661 796 -3.063876713483004e+02 +661 797 -2.480403651673276e+02 +661 798 -2.041390437321801e+02 +661 799 -1.740274317161710e+02 +661 800 -1.555580782497810e+02 +661 801 -1.468355065336025e+02 +662 442 -7.520762033775924e+01 +662 443 -7.859349409841366e+01 +662 444 -8.555928471614152e+01 +662 445 -9.638822517401596e+01 +662 446 -1.111842160419089e+02 +662 447 -1.293661657908651e+02 +662 448 -1.489885081652993e+02 +662 449 -1.663510232448634e+02 +662 450 -1.767605489846857e+02 +662 505 -1.740274317161709e+02 +662 506 -1.851243485745372e+02 +662 507 -2.088271183655455e+02 +662 508 -2.480403651673273e+02 +662 509 -3.063876713483004e+02 +662 510 -3.859179776157600e+02 +662 511 -4.819366867771671e+02 +662 512 -5.762343277298875e+02 +662 513 -6.371952057562402e+02 +662 793 -6.371952057562402e+02 +662 794 -5.762343277298883e+02 +662 795 -4.819366867771664e+02 +662 796 -3.859179776157595e+02 +662 797 -3.063876713483004e+02 +662 798 -2.480403651673276e+02 +662 799 -2.088271183655457e+02 +662 800 -1.851243485745370e+02 +662 801 -1.740274317161707e+02 +663 442 -6.652797451218335e+01 +663 443 -6.937545782864693e+01 +663 444 -7.520762033775924e+01 +663 445 -8.420868002944921e+01 +663 446 -9.638822517401600e+01 +663 447 -1.111842160419090e+02 +663 448 -1.269615920628684e+02 +663 449 -1.407716848553632e+02 +663 450 -1.489885081652994e+02 +663 505 -1.468355065336027e+02 +663 506 -1.555580782497811e+02 +663 507 -1.740274317161709e+02 +663 508 -2.041390437321799e+02 +663 509 -2.480403651673276e+02 +663 510 -3.063876713483007e+02 +663 511 -3.748904053829399e+02 +663 512 -4.404031329187428e+02 +663 513 -4.819366867771678e+02 +663 793 -8.726231103602329e+02 +663 794 -7.788097592344268e+02 +663 795 -6.371952057562384e+02 +663 796 -4.976453857371580e+02 +663 797 -3.859179776157595e+02 +663 798 -3.063876713483004e+02 +663 799 -2.542062119667733e+02 +663 800 -2.231981844606885e+02 +663 801 -2.088271183655453e+02 +664 442 -6.001174723167340e+01 +664 443 -6.247361649834820e+01 +664 444 -6.749803222962949e+01 +664 445 -7.520762033775924e+01 +664 446 -8.555928471614156e+01 +664 447 -9.802102195827715e+01 +664 448 -1.111842160419090e+02 +664 449 -1.226088998409725e+02 +664 450 -1.293661657908652e+02 +664 505 -1.275984131219180e+02 +664 506 -1.347481526436477e+02 +664 507 -1.497853840269158e+02 +664 508 -1.740274317161709e+02 +664 509 -2.088271183655457e+02 +664 510 -2.542062119667736e+02 +664 511 -3.063876713483007e+02 +664 512 -3.553280674768358e+02 +664 513 -3.859179776157605e+02 +664 793 -1.193932486839834e+03 +664 794 -1.049909849375152e+03 +664 795 -8.383319685358435e+02 +664 796 -6.371952057562384e+02 +664 797 -4.819366867771664e+02 +664 798 -3.748904053829394e+02 +664 799 -3.063876713483004e+02 +664 800 -2.663884709281890e+02 +664 801 -2.480403651673271e+02 +665 442 -5.573941364116936e+01 +665 443 -5.795761808209192e+01 +665 444 -6.247361649834813e+01 +665 445 -6.937545782864684e+01 +665 446 -7.859349409841361e+01 +665 447 -8.962181586287872e+01 +665 448 -1.011961191083175e+02 +665 449 -1.111842160419088e+02 +665 450 -1.170681125153374e+02 +665 505 -1.155304899028560e+02 +665 506 -1.217424124188380e+02 +665 507 -1.347481526436475e+02 +665 508 -1.555580782497809e+02 +665 509 -1.851243485745370e+02 +665 510 -2.231981844606887e+02 +665 511 -2.663884709281892e+02 +665 512 -3.063876713483000e+02 +665 513 -3.311617365195740e+02 +665 793 -1.550121445008512e+03 +665 794 -1.344510568096313e+03 +665 795 -1.049909849375152e+03 +665 796 -7.788097592344268e+02 +665 797 -5.762343277298883e+02 +665 798 -4.404031329187433e+02 +665 799 -3.553280674768362e+02 +665 800 -3.063876713483004e+02 +665 801 -2.841326260213861e+02 +666 442 -5.363826960242958e+01 +666 443 -5.573941364116936e+01 +666 444 -6.001174723167332e+01 +666 445 -6.652797451218328e+01 +666 446 -7.520762033775921e+01 +666 447 -8.555928471614152e+01 +666 448 -9.638822517401596e+01 +666 449 -1.057061586526019e+02 +666 450 -1.111842160419089e+02 +666 505 -1.097534196790493e+02 +666 506 -1.155304899028560e+02 +666 507 -1.275984131219178e+02 +666 508 -1.468355065336024e+02 +666 509 -1.740274317161707e+02 +666 510 -2.088271183655455e+02 +666 511 -2.480403651673273e+02 +666 512 -2.841326260213858e+02 +666 513 -3.063876713483004e+02 +666 793 -1.802596433195456e+03 +666 794 -1.550121445008512e+03 +666 795 -1.193932486839834e+03 +666 796 -8.726231103602329e+02 +666 797 -6.371952057562402e+02 +666 798 -4.819366867771678e+02 +666 799 -3.859179776157605e+02 +666 800 -3.311617365195740e+02 +666 801 -3.063876713483004e+02 +667 604 -1.733190400658704e+03 +667 605 -1.877824568765008e+03 +667 606 -2.199157547087190e+03 +667 607 -2.767706810094291e+03 +667 608 -3.699147964795159e+03 +667 609 -5.136224430633812e+03 +667 610 -7.138491575686227e+03 +667 611 -9.405703259334558e+03 +667 612 -1.103972130715905e+04 +667 739 -1.733190400658708e+03 +667 740 -1.603684467943639e+03 +667 741 -1.394551574360516e+03 +667 742 -1.168677565678393e+03 +667 743 -9.695072463564467e+02 +667 744 -8.148024630667978e+02 +667 745 -7.058924559832891e+02 +667 746 -6.378158089920689e+02 +667 747 -6.052974323170231e+02 +667 766 -6.289529049931513e+02 +667 767 -5.970589583440841e+02 +667 768 -5.429674662554836e+02 +667 769 -4.803677035258846e+02 +667 770 -4.208084537187723e+02 +667 771 -3.710963518270349e+02 +667 772 -3.339204550667995e+02 +667 773 -3.096178268240471e+02 +667 774 -2.976873911031311e+02 +668 604 -1.603684467943636e+03 +668 605 -1.733190400658708e+03 +668 606 -2.019368486704435e+03 +668 607 -2.521021940438013e+03 +668 608 -3.331754877699595e+03 +668 609 -4.560278038130793e+03 +668 610 -6.235592529048601e+03 +668 611 -8.091232579773156e+03 +668 612 -9.405703259334558e+03 +668 739 -1.877824568765008e+03 +668 740 -1.733190400658708e+03 +668 741 -1.500725861549673e+03 +668 742 -1.251286952144480e+03 +668 743 -1.032880208377977e+03 +668 744 -8.643348602446105e+02 +668 745 -7.463158073460687e+02 +668 746 -6.728335244699299e+02 +668 747 -6.378158089920689e+02 +668 766 -6.632839990295092e+02 +668 767 -6.289529049931513e+02 +668 768 -5.708523475060541e+02 +668 769 -5.038180997021776e+02 +668 770 -4.402579127124382e+02 +668 771 -3.873813675510154e+02 +668 772 -3.479505460244110e+02 +668 773 -3.222285372305477e+02 +668 774 -3.096178268240471e+02 +669 604 -1.394551574360513e+03 +669 605 -1.500725861549673e+03 +669 606 -1.733190400658708e+03 +669 607 -2.134265778758337e+03 +669 608 -2.767706810094291e+03 +669 609 -3.699147964795159e+03 +669 610 -4.925216936196723e+03 +669 611 -6.235592529048601e+03 +669 612 -7.138491575686227e+03 +669 739 -2.199157547087190e+03 +669 740 -2.019368486704435e+03 +669 741 -1.733190400658708e+03 +669 742 -1.430197816180116e+03 +669 743 -1.168677565678393e+03 +669 744 -9.695072463564467e+02 +669 745 -8.315436028021828e+02 +669 746 -7.463158073460687e+02 +669 747 -7.058924559832891e+02 +669 766 -7.352796046183660e+02 +669 767 -6.956816209337401e+02 +669 768 -6.289529049931513e+02 +669 769 -5.524312223207834e+02 +669 770 -4.803677035258846e+02 +669 771 -4.208084537187723e+02 +669 772 -3.766415408901786e+02 +669 773 -3.479505460244110e+02 +669 774 -3.339204550667995e+02 +670 604 -1.168677565678391e+03 +670 605 -1.251286952144480e+03 +670 606 -1.430197816180116e+03 +670 607 -1.733190400658708e+03 +670 608 -2.199157547087190e+03 +670 609 -2.861294172280315e+03 +670 610 -3.699147964795159e+03 +670 611 -4.560278038130793e+03 +670 612 -5.136224430633812e+03 +670 739 -2.767706810094291e+03 +670 740 -2.521021940438013e+03 +670 741 -2.134265778758337e+03 +670 742 -1.733190400658708e+03 +670 743 -1.394551574360516e+03 +670 744 -1.141773184361051e+03 +670 745 -9.695072463564467e+02 +670 746 -8.643348602446105e+02 +670 747 -8.148024630667978e+02 +670 766 -8.507888885505199e+02 +670 767 -8.023274760830702e+02 +670 768 -7.211778000851822e+02 +670 769 -6.289529049931513e+02 +670 770 -5.429674662554836e+02 +670 771 -4.725808574370910e+02 +670 772 -4.208084537187723e+02 +670 773 -3.873813675510154e+02 +670 774 -3.710963518270349e+02 +671 604 -9.695072463564451e+02 +671 605 -1.032880208377977e+03 +671 606 -1.168677565678393e+03 +671 607 -1.394551574360516e+03 +671 608 -1.733190400658708e+03 +671 609 -2.199157547087190e+03 +671 610 -2.767706810094291e+03 +671 611 -3.331754877699595e+03 +671 612 -3.699147964795159e+03 +671 739 -3.699147964795159e+03 +671 740 -3.331754877699595e+03 +671 741 -2.767706810094291e+03 +671 742 -2.199157547087190e+03 +671 743 -1.733190400658708e+03 +671 744 -1.394551574360516e+03 +671 745 -1.168677565678393e+03 +671 746 -1.032880208377977e+03 +671 747 -9.695072463564467e+02 +671 766 -1.015511306612463e+03 +671 767 -9.536070604341750e+02 +671 768 -8.507888885505199e+02 +671 769 -7.352796046183660e+02 +671 770 -6.289529049931513e+02 +671 771 -5.429674662554836e+02 +671 772 -4.803677035258846e+02 +671 773 -4.402579127124382e+02 +671 774 -4.208084537187723e+02 +672 604 -8.148024630667965e+02 +672 605 -8.643348602446105e+02 +672 606 -9.695072463564467e+02 +672 607 -1.141773184361051e+03 +672 608 -1.394551574360516e+03 +672 609 -1.733190400658708e+03 +672 610 -2.134265778758337e+03 +672 611 -2.521021940438013e+03 +672 612 -2.767706810094291e+03 +672 739 -5.136224430633812e+03 +672 740 -4.560278038130793e+03 +672 741 -3.699147964795159e+03 +672 742 -2.861294172280315e+03 +672 743 -2.199157547087190e+03 +672 744 -1.733190400658708e+03 +672 745 -1.430197816180116e+03 +672 746 -1.251286952144480e+03 +672 747 -1.168677565678393e+03 +672 766 -1.228588660544043e+03 +672 767 -1.148042053110076e+03 +672 768 -1.015511306612463e+03 +672 769 -8.685786765383741e+02 +672 770 -7.352796046183660e+02 +672 771 -6.289529049931513e+02 +672 772 -5.524312223207834e+02 +672 773 -5.038180997021776e+02 +672 774 -4.803677035258846e+02 +673 604 -7.058924559832880e+02 +673 605 -7.463158073460687e+02 +673 606 -8.315436028021828e+02 +673 607 -9.695072463564467e+02 +673 608 -1.168677565678393e+03 +673 609 -1.430197816180116e+03 +673 610 -1.733190400658708e+03 +673 611 -2.019368486704435e+03 +673 612 -2.199157547087190e+03 +673 739 -7.138491575686227e+03 +673 740 -6.235592529048601e+03 +673 741 -4.925216936196723e+03 +673 742 -3.699147964795159e+03 +673 743 -2.767706810094291e+03 +673 744 -2.134265778758337e+03 +673 745 -1.733190400658708e+03 +673 746 -1.500725861549673e+03 +673 747 -1.394551574360516e+03 +673 766 -1.471477730866021e+03 +673 767 -1.368148367306964e+03 +673 768 -1.199743197084304e+03 +673 769 -1.015511306612463e+03 +673 770 -8.507888885505199e+02 +673 771 -7.211778000851822e+02 +673 772 -6.289529049931513e+02 +673 773 -5.708523475060541e+02 +673 774 -5.429674662554836e+02 +674 604 -6.378158089920680e+02 +674 605 -6.728335244699299e+02 +674 606 -7.463158073460687e+02 +674 607 -8.643348602446105e+02 +674 608 -1.032880208377977e+03 +674 609 -1.251286952144480e+03 +674 610 -1.500725861549673e+03 +674 611 -1.733190400658708e+03 +674 612 -1.877824568765008e+03 +674 739 -9.405703259334558e+03 +674 740 -8.091232579773156e+03 +674 741 -6.235592529048601e+03 +674 742 -4.560278038130793e+03 +674 743 -3.331754877699595e+03 +674 744 -2.521021940438013e+03 +674 745 -2.019368486704435e+03 +674 746 -1.733190400658708e+03 +674 747 -1.603684467943639e+03 +674 766 -1.697437739078442e+03 +674 767 -1.571600895131404e+03 +674 768 -1.368148367306964e+03 +674 769 -1.148042053110076e+03 +674 770 -9.536070604341750e+02 +674 771 -8.023274760830702e+02 +674 772 -6.956816209337401e+02 +674 773 -6.289529049931513e+02 +674 774 -5.970589583440841e+02 +675 604 -6.052974323170223e+02 +675 605 -6.378158089920689e+02 +675 606 -7.058924559832891e+02 +675 607 -8.148024630667978e+02 +675 608 -9.695072463564467e+02 +675 609 -1.168677565678393e+03 +675 610 -1.394551574360516e+03 +675 611 -1.603684467943639e+03 +675 612 -1.733190400658708e+03 +675 739 -1.103972130715905e+04 +675 740 -9.405703259334558e+03 +675 741 -7.138491575686227e+03 +675 742 -5.136224430633812e+03 +675 743 -3.699147964795159e+03 +675 744 -2.767706810094291e+03 +675 745 -2.199157547087190e+03 +675 746 -1.877824568765008e+03 +675 747 -1.733190400658708e+03 +675 766 -1.837845240586523e+03 +675 767 -1.697437739078442e+03 +675 768 -1.471477730866021e+03 +675 769 -1.228588660544043e+03 +675 770 -1.015511306612463e+03 +675 771 -8.507888885505199e+02 +675 772 -7.352796046183660e+02 +675 773 -6.632839990295092e+02 +675 774 -6.289529049931513e+02 +694 604 -6.289529049931505e+02 +694 605 -6.632839990295092e+02 +694 606 -7.352796046183660e+02 +694 607 -8.507888885505199e+02 +694 608 -1.015511306612463e+03 +694 609 -1.228588660544043e+03 +694 610 -1.471477730866021e+03 +694 611 -1.697437739078442e+03 +694 612 -1.837845240586523e+03 +694 631 -1.733190400658708e+03 +694 632 -1.877824568765008e+03 +694 633 -2.199157547087190e+03 +694 634 -2.767706810094291e+03 +694 635 -3.699147964795159e+03 +694 636 -5.136224430633812e+03 +694 637 -7.138491575686227e+03 +694 638 -9.405703259334558e+03 +694 639 -1.103972130715905e+04 +694 766 -1.733190400658708e+03 +694 767 -1.603684467943639e+03 +694 768 -1.394551574360516e+03 +694 769 -1.168677565678393e+03 +694 770 -9.695072463564467e+02 +694 771 -8.148024630667978e+02 +694 772 -7.058924559832891e+02 +694 773 -6.378158089920689e+02 +694 774 -6.052974323170231e+02 +695 604 -5.970589583440833e+02 +695 605 -6.289529049931513e+02 +695 606 -6.956816209337401e+02 +695 607 -8.023274760830702e+02 +695 608 -9.536070604341750e+02 +695 609 -1.148042053110076e+03 +695 610 -1.368148367306964e+03 +695 611 -1.571600895131404e+03 +695 612 -1.697437739078442e+03 +695 631 -1.603684467943639e+03 +695 632 -1.733190400658708e+03 +695 633 -2.019368486704435e+03 +695 634 -2.521021940438013e+03 +695 635 -3.331754877699595e+03 +695 636 -4.560278038130793e+03 +695 637 -6.235592529048601e+03 +695 638 -8.091232579773156e+03 +695 639 -9.405703259334558e+03 +695 766 -1.877824568765008e+03 +695 767 -1.733190400658708e+03 +695 768 -1.500725861549673e+03 +695 769 -1.251286952144480e+03 +695 770 -1.032880208377977e+03 +695 771 -8.643348602446105e+02 +695 772 -7.463158073460687e+02 +695 773 -6.728335244699299e+02 +695 774 -6.378158089920689e+02 +696 604 -5.429674662554829e+02 +696 605 -5.708523475060541e+02 +696 606 -6.289529049931513e+02 +696 607 -7.211778000851822e+02 +696 608 -8.507888885505199e+02 +696 609 -1.015511306612463e+03 +696 610 -1.199743197084304e+03 +696 611 -1.368148367306964e+03 +696 612 -1.471477730866021e+03 +696 631 -1.394551574360516e+03 +696 632 -1.500725861549673e+03 +696 633 -1.733190400658708e+03 +696 634 -2.134265778758337e+03 +696 635 -2.767706810094291e+03 +696 636 -3.699147964795159e+03 +696 637 -4.925216936196723e+03 +696 638 -6.235592529048601e+03 +696 639 -7.138491575686227e+03 +696 766 -2.199157547087190e+03 +696 767 -2.019368486704435e+03 +696 768 -1.733190400658708e+03 +696 769 -1.430197816180116e+03 +696 770 -1.168677565678393e+03 +696 771 -9.695072463564467e+02 +696 772 -8.315436028021828e+02 +696 773 -7.463158073460687e+02 +696 774 -7.058924559832891e+02 +697 604 -4.803677035258839e+02 +697 605 -5.038180997021776e+02 +697 606 -5.524312223207834e+02 +697 607 -6.289529049931513e+02 +697 608 -7.352796046183660e+02 +697 609 -8.685786765383741e+02 +697 610 -1.015511306612463e+03 +697 611 -1.148042053110076e+03 +697 612 -1.228588660544043e+03 +697 631 -1.168677565678393e+03 +697 632 -1.251286952144480e+03 +697 633 -1.430197816180116e+03 +697 634 -1.733190400658708e+03 +697 635 -2.199157547087190e+03 +697 636 -2.861294172280315e+03 +697 637 -3.699147964795159e+03 +697 638 -4.560278038130793e+03 +697 639 -5.136224430633812e+03 +697 766 -2.767706810094291e+03 +697 767 -2.521021940438013e+03 +697 768 -2.134265778758337e+03 +697 769 -1.733190400658708e+03 +697 770 -1.394551574360516e+03 +697 771 -1.141773184361051e+03 +697 772 -9.695072463564467e+02 +697 773 -8.643348602446105e+02 +697 774 -8.148024630667978e+02 +698 604 -4.208084537187718e+02 +698 605 -4.402579127124382e+02 +698 606 -4.803677035258846e+02 +698 607 -5.429674662554836e+02 +698 608 -6.289529049931513e+02 +698 609 -7.352796046183660e+02 +698 610 -8.507888885505199e+02 +698 611 -9.536070604341750e+02 +698 612 -1.015511306612463e+03 +698 631 -9.695072463564467e+02 +698 632 -1.032880208377977e+03 +698 633 -1.168677565678393e+03 +698 634 -1.394551574360516e+03 +698 635 -1.733190400658708e+03 +698 636 -2.199157547087190e+03 +698 637 -2.767706810094291e+03 +698 638 -3.331754877699595e+03 +698 639 -3.699147964795159e+03 +698 766 -3.699147964795159e+03 +698 767 -3.331754877699595e+03 +698 768 -2.767706810094291e+03 +698 769 -2.199157547087190e+03 +698 770 -1.733190400658708e+03 +698 771 -1.394551574360516e+03 +698 772 -1.168677565678393e+03 +698 773 -1.032880208377977e+03 +698 774 -9.695072463564467e+02 +699 604 -3.710963518270344e+02 +699 605 -3.873813675510154e+02 +699 606 -4.208084537187723e+02 +699 607 -4.725808574370910e+02 +699 608 -5.429674662554836e+02 +699 609 -6.289529049931513e+02 +699 610 -7.211778000851822e+02 +699 611 -8.023274760830702e+02 +699 612 -8.507888885505199e+02 +699 631 -8.148024630667978e+02 +699 632 -8.643348602446105e+02 +699 633 -9.695072463564467e+02 +699 634 -1.141773184361051e+03 +699 635 -1.394551574360516e+03 +699 636 -1.733190400658708e+03 +699 637 -2.134265778758337e+03 +699 638 -2.521021940438013e+03 +699 639 -2.767706810094291e+03 +699 766 -5.136224430633812e+03 +699 767 -4.560278038130793e+03 +699 768 -3.699147964795159e+03 +699 769 -2.861294172280315e+03 +699 770 -2.199157547087190e+03 +699 771 -1.733190400658708e+03 +699 772 -1.430197816180116e+03 +699 773 -1.251286952144480e+03 +699 774 -1.168677565678393e+03 +700 604 -3.339204550667992e+02 +700 605 -3.479505460244110e+02 +700 606 -3.766415408901786e+02 +700 607 -4.208084537187723e+02 +700 608 -4.803677035258846e+02 +700 609 -5.524312223207834e+02 +700 610 -6.289529049931513e+02 +700 611 -6.956816209337401e+02 +700 612 -7.352796046183660e+02 +700 631 -7.058924559832891e+02 +700 632 -7.463158073460687e+02 +700 633 -8.315436028021828e+02 +700 634 -9.695072463564467e+02 +700 635 -1.168677565678393e+03 +700 636 -1.430197816180116e+03 +700 637 -1.733190400658708e+03 +700 638 -2.019368486704435e+03 +700 639 -2.199157547087190e+03 +700 766 -7.138491575686227e+03 +700 767 -6.235592529048601e+03 +700 768 -4.925216936196723e+03 +700 769 -3.699147964795159e+03 +700 770 -2.767706810094291e+03 +700 771 -2.134265778758337e+03 +700 772 -1.733190400658708e+03 +700 773 -1.500725861549673e+03 +700 774 -1.394551574360516e+03 +701 604 -3.096178268240468e+02 +701 605 -3.222285372305477e+02 +701 606 -3.479505460244110e+02 +701 607 -3.873813675510154e+02 +701 608 -4.402579127124382e+02 +701 609 -5.038180997021776e+02 +701 610 -5.708523475060541e+02 +701 611 -6.289529049931513e+02 +701 612 -6.632839990295092e+02 +701 631 -6.378158089920689e+02 +701 632 -6.728335244699299e+02 +701 633 -7.463158073460687e+02 +701 634 -8.643348602446105e+02 +701 635 -1.032880208377977e+03 +701 636 -1.251286952144480e+03 +701 637 -1.500725861549673e+03 +701 638 -1.733190400658708e+03 +701 639 -1.877824568765008e+03 +701 766 -9.405703259334558e+03 +701 767 -8.091232579773156e+03 +701 768 -6.235592529048601e+03 +701 769 -4.560278038130793e+03 +701 770 -3.331754877699595e+03 +701 771 -2.521021940438013e+03 +701 772 -2.019368486704435e+03 +701 773 -1.733190400658708e+03 +701 774 -1.603684467943639e+03 +702 604 -2.976873911031307e+02 +702 605 -3.096178268240471e+02 +702 606 -3.339204550667995e+02 +702 607 -3.710963518270349e+02 +702 608 -4.208084537187723e+02 +702 609 -4.803677035258846e+02 +702 610 -5.429674662554836e+02 +702 611 -5.970589583440841e+02 +702 612 -6.289529049931513e+02 +702 631 -6.052974323170231e+02 +702 632 -6.378158089920689e+02 +702 633 -7.058924559832891e+02 +702 634 -8.148024630667978e+02 +702 635 -9.695072463564467e+02 +702 636 -1.168677565678393e+03 +702 637 -1.394551574360516e+03 +702 638 -1.603684467943639e+03 +702 639 -1.733190400658708e+03 +702 766 -1.103972130715905e+04 +702 767 -9.405703259334558e+03 +702 768 -7.138491575686227e+03 +702 769 -5.136224430633812e+03 +702 770 -3.699147964795159e+03 +702 771 -2.767706810094291e+03 +702 772 -2.199157547087190e+03 +702 773 -1.877824568765008e+03 +702 774 -1.733190400658708e+03 +721 298 -1.965477828103597e+01 +721 299 -2.067858569511584e+01 +721 300 -2.281491025526308e+01 +721 301 -2.621419542240645e+01 +721 302 -3.100728135248165e+01 +721 303 -3.712309913086534e+01 +721 304 -4.399251628020362e+01 +721 305 -5.029652653878190e+01 +721 306 -5.417542964960963e+01 +721 433 -5.416220002058459e+01 +721 434 -5.847168336242214e+01 +721 435 -6.797204698756190e+01 +721 436 -8.455751811575999e+01 +721 437 -1.112023202068744e+02 +721 438 -1.512628164030903e+02 +721 439 -2.053883607687485e+02 +721 440 -2.647767438527630e+02 +721 441 -3.065373731090121e+02 +721 1000 -5.416220002058462e+01 +721 1001 -5.028460369863171e+01 +721 1002 -4.398263164573862e+01 +721 1003 -3.711530555640486e+01 +721 1004 -3.100122392289864e+01 +721 1005 -2.620940698061744e+01 +721 1006 -2.281096793104269e+01 +721 1007 -2.067515029553633e+01 +721 1008 -1.965157861598590e+01 +722 298 -1.870055440211150e+01 +722 299 -1.965477828103598e+01 +722 300 -2.164167292784032e+01 +722 301 -2.479209926714915e+01 +722 302 -2.921308657465229e+01 +722 303 -3.482168460593338e+01 +722 304 -4.108257963331432e+01 +722 305 -4.679557686118159e+01 +722 306 -5.029652653878193e+01 +722 433 -5.028460369863168e+01 +722 434 -5.416220002058462e+01 +722 435 -6.266865647386100e+01 +722 436 -7.739429142416689e+01 +722 437 -1.007640600234616e+02 +722 438 -1.353445496343034e+02 +722 439 -1.811983282511272e+02 +722 440 -2.305668762810884e+02 +722 441 -2.647767438527633e+02 +722 1000 -5.847168336242214e+01 +722 1001 -5.416220002058462e+01 +722 1002 -4.718848846240642e+01 +722 1003 -3.963467701820886e+01 +722 1004 -3.295302401855845e+01 +722 1005 -2.774798050936781e+01 +722 1006 -2.407490908992508e+01 +722 1007 -2.177494503977683e+01 +722 1008 -2.067515029553633e+01 +723 298 -1.707507926940497e+01 +723 299 -1.791417887437395e+01 +723 300 -1.965477828103597e+01 +723 301 -2.239757409043196e+01 +723 302 -2.621419542240645e+01 +723 303 -3.100728135248165e+01 +723 304 -3.630032063351617e+01 +723 305 -4.108257963331432e+01 +723 306 -4.399251628020364e+01 +723 433 -4.398263164573861e+01 +723 434 -4.718848846240642e+01 +723 435 -5.416220002058459e+01 +723 436 -6.606134132672688e+01 +723 437 -8.455751811575999e+01 +723 438 -1.112023202068744e+02 +723 439 -1.454508347890306e+02 +723 440 -1.811983282511272e+02 +723 441 -2.053883607687487e+02 +723 1000 -6.797204698756194e+01 +723 1001 -6.266865647386102e+01 +723 1002 -5.416220002058462e+01 +723 1003 -4.506046026496942e+01 +723 1004 -3.711530555640486e+01 +723 1005 -3.100122392289864e+01 +723 1006 -2.672989532903560e+01 +723 1007 -2.407490908992508e+01 +723 1008 -2.281096793104269e+01 +724 298 -1.518203609416467e+01 +724 299 -1.589274010473517e+01 +724 300 -1.736013665098131e+01 +724 301 -1.965477828103598e+01 +724 302 -2.281491025526309e+01 +724 303 -2.673481743251408e+01 +724 304 -3.100728135248165e+01 +724 305 -3.482168460593338e+01 +724 306 -3.712309913086536e+01 +724 433 -3.711530555640484e+01 +724 434 -3.963467701820886e+01 +724 435 -4.506046026496939e+01 +724 436 -5.416220002058462e+01 +724 437 -6.797204698756194e+01 +724 438 -8.726265053974943e+01 +724 439 -1.112023202068744e+02 +724 440 -1.353445496343034e+02 +724 441 -1.512628164030904e+02 +724 1000 -8.455751811575999e+01 +724 1001 -7.739429142416689e+01 +724 1002 -6.606134132672688e+01 +724 1003 -5.416220002058462e+01 +724 1004 -4.398263164573862e+01 +724 1005 -3.629276779865594e+01 +724 1006 -3.100122392289864e+01 +724 1007 -2.774798050936781e+01 +724 1008 -2.620940698061744e+01 +725 298 -1.336813651340294e+01 +725 299 -1.396191802264486e+01 +725 300 -1.518203609416467e+01 +725 301 -1.707507926940498e+01 +725 302 -1.965477828103598e+01 +725 303 -2.281491025526309e+01 +725 304 -2.621419542240645e+01 +725 305 -2.921308657465229e+01 +725 306 -3.100728135248166e+01 +725 433 -3.100122392289862e+01 +725 434 -3.295302401855845e+01 +725 435 -3.711530555640484e+01 +725 436 -4.398263164573862e+01 +725 437 -5.416220002058462e+01 +725 438 -6.797204698756194e+01 +725 439 -8.455751811575999e+01 +725 440 -1.007640600234616e+02 +725 441 -1.112023202068744e+02 +725 1000 -1.112023202068744e+02 +725 1001 -1.007640600234616e+02 +725 1002 -8.455751811575999e+01 +725 1003 -6.797204698756194e+01 +725 1004 -5.416220002058462e+01 +725 1005 -4.398263164573862e+01 +725 1006 -3.711530555640486e+01 +725 1007 -3.295302401855845e+01 +725 1008 -3.100122392289864e+01 +726 298 -1.184372960400065e+01 +726 299 -1.234420052045070e+01 +726 300 -1.336813651340294e+01 +726 301 -1.494561758129199e+01 +726 302 -1.707507926940498e+01 +726 303 -1.965477828103598e+01 +726 304 -2.239757409043196e+01 +726 305 -2.479209926714915e+01 +726 306 -2.621419542240646e+01 +726 433 -2.620940698061743e+01 +726 434 -2.774798050936781e+01 +726 435 -3.100122392289862e+01 +726 436 -3.629276779865594e+01 +726 437 -4.398263164573862e+01 +726 438 -5.416220002058462e+01 +726 439 -6.606134132672688e+01 +726 440 -7.739429142416689e+01 +726 441 -8.455751811576003e+01 +726 1000 -1.512628164030903e+02 +726 1001 -1.353445496343034e+02 +726 1002 -1.112023202068744e+02 +726 1003 -8.726265053974943e+01 +726 1004 -6.797204698756194e+01 +726 1005 -5.416220002058462e+01 +726 1006 -4.506046026496942e+01 +726 1007 -3.963467701820886e+01 +726 1008 -3.711530555640486e+01 +727 298 -1.069703031088084e+01 +727 299 -1.113049648221347e+01 +727 300 -1.201426721054982e+01 +727 301 -1.336813651340294e+01 +727 302 -1.518203609416467e+01 +727 303 -1.736013665098131e+01 +727 304 -1.965477828103598e+01 +727 305 -2.164167292784033e+01 +727 306 -2.281491025526310e+01 +727 433 -2.281096793104269e+01 +727 434 -2.407490908992508e+01 +727 435 -2.672989532903559e+01 +727 436 -3.100122392289864e+01 +727 437 -3.711530555640486e+01 +727 438 -4.506046026496942e+01 +727 439 -5.416220002058462e+01 +727 440 -6.266865647386102e+01 +727 441 -6.797204698756197e+01 +727 1000 -2.053883607687485e+02 +727 1001 -1.811983282511272e+02 +727 1002 -1.454508347890306e+02 +727 1003 -1.112023202068744e+02 +727 1004 -8.455751811575999e+01 +727 1005 -6.606134132672688e+01 +727 1006 -5.416220002058462e+01 +727 1007 -4.718848846240642e+01 +727 1008 -4.398263164573862e+01 +728 298 -9.944085360683061e+00 +728 299 -1.033512964800000e+01 +728 300 -1.113049648221347e+01 +728 301 -1.234420052045070e+01 +728 302 -1.396191802264486e+01 +728 303 -1.589274010473517e+01 +728 304 -1.791417887437395e+01 +728 305 -1.965477828103598e+01 +728 306 -2.067858569511585e+01 +728 433 -2.067515029553632e+01 +728 434 -2.177494503977683e+01 +728 435 -2.407490908992507e+01 +728 436 -2.774798050936781e+01 +728 437 -3.295302401855845e+01 +728 438 -3.963467701820886e+01 +728 439 -4.718848846240642e+01 +728 440 -5.416220002058462e+01 +728 441 -5.847168336242218e+01 +728 1000 -2.647767438527630e+02 +728 1001 -2.305668762810884e+02 +728 1002 -1.811983282511272e+02 +728 1003 -1.353445496343034e+02 +728 1004 -1.007640600234616e+02 +728 1005 -7.739429142416689e+01 +728 1006 -6.266865647386102e+01 +728 1007 -5.416220002058462e+01 +728 1008 -5.028460369863171e+01 +729 298 -9.573445684409064e+00 +729 299 -9.944085360683063e+00 +729 300 -1.069703031088084e+01 +729 301 -1.184372960400065e+01 +729 302 -1.336813651340294e+01 +729 303 -1.518203609416467e+01 +729 304 -1.707507926940498e+01 +729 305 -1.870055440211151e+01 +729 306 -1.965477828103599e+01 +729 433 -1.965157861598589e+01 +729 434 -2.067515029553633e+01 +729 435 -2.281096793104269e+01 +729 436 -2.620940698061744e+01 +729 437 -3.100122392289864e+01 +729 438 -3.711530555640486e+01 +729 439 -4.398263164573862e+01 +729 440 -5.028460369863171e+01 +729 441 -5.416220002058465e+01 +729 1000 -3.065373731090118e+02 +729 1001 -2.647767438527630e+02 +729 1002 -2.053883607687485e+02 +729 1003 -1.512628164030903e+02 +729 1004 -1.112023202068744e+02 +729 1005 -8.455751811575999e+01 +729 1006 -6.797204698756194e+01 +729 1007 -5.847168336242214e+01 +729 1008 -5.416220002058462e+01 +730 595 -3.063876713483007e+02 +730 596 -3.311617365195740e+02 +730 597 -3.859179776157605e+02 +730 598 -4.819366867771678e+02 +730 599 -6.371952057562402e+02 +730 600 -8.726231103602329e+02 +730 601 -1.193932486839834e+03 +730 602 -1.550121445008512e+03 +730 603 -1.802596433195456e+03 +730 874 -3.063876713483004e+02 +730 875 -2.841326260213861e+02 +730 876 -2.480403651673271e+02 +730 877 -2.088271183655453e+02 +730 878 -1.740274317161707e+02 +730 879 -1.468355065336025e+02 +730 880 -1.275984131219179e+02 +730 881 -1.155304899028560e+02 +730 882 -1.097534196790493e+02 +730 937 -1.111842160419089e+02 +730 938 -1.057061586526020e+02 +730 939 -9.638822517401589e+01 +730 940 -8.555928471614145e+01 +730 941 -7.520762033775921e+01 +730 942 -6.652797451218332e+01 +730 943 -6.001174723167335e+01 +730 944 -5.573941364116933e+01 +730 945 -5.363826960242956e+01 +731 595 -2.841326260213864e+02 +731 596 -3.063876713483004e+02 +731 597 -3.553280674768362e+02 +731 598 -4.404031329187433e+02 +731 599 -5.762343277298883e+02 +731 600 -7.788097592344268e+02 +731 601 -1.049909849375152e+03 +731 602 -1.344510568096313e+03 +731 603 -1.550121445008512e+03 +731 874 -3.311617365195740e+02 +731 875 -3.063876713483004e+02 +731 876 -2.663884709281890e+02 +731 877 -2.231981844606885e+02 +731 878 -1.851243485745370e+02 +731 879 -1.555580782497810e+02 +731 880 -1.347481526436476e+02 +731 881 -1.217424124188379e+02 +731 882 -1.155304899028560e+02 +731 937 -1.170681125153374e+02 +731 938 -1.111842160419089e+02 +731 939 -1.011961191083174e+02 +731 940 -8.962181586287865e+01 +731 941 -7.859349409841361e+01 +731 942 -6.937545782864687e+01 +731 943 -6.247361649834816e+01 +731 944 -5.795761808209188e+01 +731 945 -5.573941364116933e+01 +732 595 -2.480403651673273e+02 +732 596 -2.663884709281890e+02 +732 597 -3.063876713483004e+02 +732 598 -3.748904053829394e+02 +732 599 -4.819366867771664e+02 +732 600 -6.371952057562384e+02 +732 601 -8.383319685358435e+02 +732 602 -1.049909849375152e+03 +732 603 -1.193932486839834e+03 +732 874 -3.859179776157605e+02 +732 875 -3.553280674768362e+02 +732 876 -3.063876713483004e+02 +732 877 -2.542062119667733e+02 +732 878 -2.088271183655457e+02 +732 879 -1.740274317161710e+02 +732 880 -1.497853840269160e+02 +732 881 -1.347481526436476e+02 +732 882 -1.275984131219179e+02 +732 937 -1.293661657908652e+02 +732 938 -1.226088998409726e+02 +732 939 -1.111842160419089e+02 +732 940 -9.802102195827709e+01 +732 941 -8.555928471614156e+01 +732 942 -7.520762033775929e+01 +732 943 -6.749803222962952e+01 +732 944 -6.247361649834816e+01 +732 945 -6.001174723167335e+01 +733 595 -2.088271183655455e+02 +733 596 -2.231981844606885e+02 +733 597 -2.542062119667733e+02 +733 598 -3.063876713483004e+02 +733 599 -3.859179776157595e+02 +733 600 -4.976453857371580e+02 +733 601 -6.371952057562384e+02 +733 602 -7.788097592344268e+02 +733 603 -8.726231103602329e+02 +733 874 -4.819366867771678e+02 +733 875 -4.404031329187433e+02 +733 876 -3.748904053829394e+02 +733 877 -3.063876713483004e+02 +733 878 -2.480403651673276e+02 +733 879 -2.041390437321801e+02 +733 880 -1.740274317161710e+02 +733 881 -1.555580782497810e+02 +733 882 -1.468355065336025e+02 +733 937 -1.489885081652994e+02 +733 938 -1.407716848553633e+02 +733 939 -1.269615920628683e+02 +733 940 -1.111842160419089e+02 +733 941 -9.638822517401600e+01 +733 942 -8.420868002944924e+01 +733 943 -7.520762033775929e+01 +733 944 -6.937545782864687e+01 +733 945 -6.652797451218332e+01 +734 595 -1.740274317161709e+02 +734 596 -1.851243485745370e+02 +734 597 -2.088271183655457e+02 +734 598 -2.480403651673276e+02 +734 599 -3.063876713483004e+02 +734 600 -3.859179776157595e+02 +734 601 -4.819366867771664e+02 +734 602 -5.762343277298883e+02 +734 603 -6.371952057562402e+02 +734 874 -6.371952057562402e+02 +734 875 -5.762343277298883e+02 +734 876 -4.819366867771664e+02 +734 877 -3.859179776157595e+02 +734 878 -3.063876713483004e+02 +734 879 -2.480403651673276e+02 +734 880 -2.088271183655457e+02 +734 881 -1.851243485745370e+02 +734 882 -1.740274317161707e+02 +734 937 -1.767605489846857e+02 +734 938 -1.663510232448635e+02 +734 939 -1.489885081652992e+02 +734 940 -1.293661657908650e+02 +734 941 -1.111842160419089e+02 +734 942 -9.638822517401600e+01 +734 943 -8.555928471614156e+01 +734 944 -7.859349409841361e+01 +734 945 -7.520762033775921e+01 +735 595 -1.468355065336027e+02 +735 596 -1.555580782497810e+02 +735 597 -1.740274317161710e+02 +735 598 -2.041390437321801e+02 +735 599 -2.480403651673276e+02 +735 600 -3.063876713483004e+02 +735 601 -3.748904053829394e+02 +735 602 -4.404031329187433e+02 +735 603 -4.819366867771678e+02 +735 874 -8.726231103602329e+02 +735 875 -7.788097592344268e+02 +735 876 -6.371952057562384e+02 +735 877 -4.976453857371580e+02 +735 878 -3.859179776157595e+02 +735 879 -3.063876713483004e+02 +735 880 -2.542062119667733e+02 +735 881 -2.231981844606885e+02 +735 882 -2.088271183655453e+02 +735 937 -2.123577731150844e+02 +735 938 -1.989422168423268e+02 +735 939 -1.767605489846853e+02 +735 940 -1.519993633210925e+02 +735 941 -1.293661657908650e+02 +735 942 -1.111842160419089e+02 +735 943 -9.802102195827709e+01 +735 944 -8.962181586287865e+01 +735 945 -8.555928471614145e+01 +736 595 -1.275984131219180e+02 +736 596 -1.347481526436476e+02 +736 597 -1.497853840269160e+02 +736 598 -1.740274317161710e+02 +736 599 -2.088271183655457e+02 +736 600 -2.542062119667733e+02 +736 601 -3.063876713483004e+02 +736 602 -3.553280674768362e+02 +736 603 -3.859179776157605e+02 +736 874 -1.193932486839834e+03 +736 875 -1.049909849375152e+03 +736 876 -8.383319685358435e+02 +736 877 -6.371952057562384e+02 +736 878 -4.819366867771664e+02 +736 879 -3.748904053829394e+02 +736 880 -3.063876713483004e+02 +736 881 -2.663884709281890e+02 +736 882 -2.480403651673271e+02 +736 937 -2.525366109215767e+02 +736 938 -2.354925657825778e+02 +736 939 -2.075588680195229e+02 +736 940 -1.767605489846853e+02 +736 941 -1.489885081652992e+02 +736 942 -1.269615920628683e+02 +736 943 -1.111842160419089e+02 +736 944 -1.011961191083174e+02 +736 945 -9.638822517401589e+01 +737 595 -1.155304899028560e+02 +737 596 -1.217424124188379e+02 +737 597 -1.347481526436476e+02 +737 598 -1.555580782497810e+02 +737 599 -1.851243485745370e+02 +737 600 -2.231981844606885e+02 +737 601 -2.663884709281890e+02 +737 602 -3.063876713483004e+02 +737 603 -3.311617365195740e+02 +737 874 -1.550121445008512e+03 +737 875 -1.344510568096313e+03 +737 876 -1.049909849375152e+03 +737 877 -7.788097592344268e+02 +737 878 -5.762343277298883e+02 +737 879 -4.404031329187433e+02 +737 880 -3.553280674768362e+02 +737 881 -3.063876713483004e+02 +737 882 -2.841326260213861e+02 +737 937 -2.895745815575327e+02 +737 938 -2.689865983609328e+02 +737 939 -2.354925657825778e+02 +737 940 -1.989422168423268e+02 +737 941 -1.663510232448635e+02 +737 942 -1.407716848553633e+02 +737 943 -1.226088998409726e+02 +737 944 -1.111842160419089e+02 +737 945 -1.057061586526020e+02 +738 595 -1.097534196790493e+02 +738 596 -1.155304899028560e+02 +738 597 -1.275984131219179e+02 +738 598 -1.468355065336025e+02 +738 599 -1.740274317161707e+02 +738 600 -2.088271183655453e+02 +738 601 -2.480403651673271e+02 +738 602 -2.841326260213861e+02 +738 603 -3.063876713483004e+02 +738 874 -1.802596433195456e+03 +738 875 -1.550121445008512e+03 +738 876 -1.193932486839834e+03 +738 877 -8.726231103602329e+02 +738 878 -6.371952057562402e+02 +738 879 -4.819366867771678e+02 +738 880 -3.859179776157605e+02 +738 881 -3.311617365195740e+02 +738 882 -3.063876713483004e+02 +738 937 -3.124380547854544e+02 +738 938 -2.895745815575327e+02 +738 939 -2.525366109215767e+02 +738 940 -2.123577731150844e+02 +738 941 -1.767605489846857e+02 +738 942 -1.489885081652994e+02 +738 943 -1.293661657908652e+02 +738 944 -1.170681125153374e+02 +738 945 -1.111842160419089e+02 +739 667 -1.733190400658708e+03 +739 668 -1.877824568765008e+03 +739 669 -2.199157547087190e+03 +739 670 -2.767706810094291e+03 +739 671 -3.699147964795159e+03 +739 672 -5.136224430633812e+03 +739 673 -7.138491575686227e+03 +739 674 -9.405703259334558e+03 +739 675 -1.103972130715905e+04 +739 802 -1.733190400658708e+03 +739 803 -1.603684467943639e+03 +739 804 -1.394551574360516e+03 +739 805 -1.168677565678393e+03 +739 806 -9.695072463564467e+02 +739 807 -8.148024630667978e+02 +739 808 -7.058924559832891e+02 +739 809 -6.378158089920689e+02 +739 810 -6.052974323170231e+02 +739 829 -6.289529049931513e+02 +739 830 -5.970589583440841e+02 +739 831 -5.429674662554836e+02 +739 832 -4.803677035258846e+02 +739 833 -4.208084537187723e+02 +739 834 -3.710963518270349e+02 +739 835 -3.339204550667995e+02 +739 836 -3.096178268240471e+02 +739 837 -2.976873911031311e+02 +740 667 -1.603684467943639e+03 +740 668 -1.733190400658708e+03 +740 669 -2.019368486704435e+03 +740 670 -2.521021940438013e+03 +740 671 -3.331754877699595e+03 +740 672 -4.560278038130793e+03 +740 673 -6.235592529048601e+03 +740 674 -8.091232579773156e+03 +740 675 -9.405703259334558e+03 +740 802 -1.877824568765008e+03 +740 803 -1.733190400658708e+03 +740 804 -1.500725861549673e+03 +740 805 -1.251286952144480e+03 +740 806 -1.032880208377977e+03 +740 807 -8.643348602446105e+02 +740 808 -7.463158073460687e+02 +740 809 -6.728335244699299e+02 +740 810 -6.378158089920689e+02 +740 829 -6.632839990295092e+02 +740 830 -6.289529049931513e+02 +740 831 -5.708523475060541e+02 +740 832 -5.038180997021776e+02 +740 833 -4.402579127124382e+02 +740 834 -3.873813675510154e+02 +740 835 -3.479505460244110e+02 +740 836 -3.222285372305477e+02 +740 837 -3.096178268240471e+02 +741 667 -1.394551574360516e+03 +741 668 -1.500725861549673e+03 +741 669 -1.733190400658708e+03 +741 670 -2.134265778758337e+03 +741 671 -2.767706810094291e+03 +741 672 -3.699147964795159e+03 +741 673 -4.925216936196723e+03 +741 674 -6.235592529048601e+03 +741 675 -7.138491575686227e+03 +741 802 -2.199157547087190e+03 +741 803 -2.019368486704435e+03 +741 804 -1.733190400658708e+03 +741 805 -1.430197816180116e+03 +741 806 -1.168677565678393e+03 +741 807 -9.695072463564467e+02 +741 808 -8.315436028021828e+02 +741 809 -7.463158073460687e+02 +741 810 -7.058924559832891e+02 +741 829 -7.352796046183660e+02 +741 830 -6.956816209337401e+02 +741 831 -6.289529049931513e+02 +741 832 -5.524312223207834e+02 +741 833 -4.803677035258846e+02 +741 834 -4.208084537187723e+02 +741 835 -3.766415408901786e+02 +741 836 -3.479505460244110e+02 +741 837 -3.339204550667995e+02 +742 667 -1.168677565678393e+03 +742 668 -1.251286952144480e+03 +742 669 -1.430197816180116e+03 +742 670 -1.733190400658708e+03 +742 671 -2.199157547087190e+03 +742 672 -2.861294172280315e+03 +742 673 -3.699147964795159e+03 +742 674 -4.560278038130793e+03 +742 675 -5.136224430633812e+03 +742 802 -2.767706810094291e+03 +742 803 -2.521021940438013e+03 +742 804 -2.134265778758337e+03 +742 805 -1.733190400658708e+03 +742 806 -1.394551574360516e+03 +742 807 -1.141773184361051e+03 +742 808 -9.695072463564467e+02 +742 809 -8.643348602446105e+02 +742 810 -8.148024630667978e+02 +742 829 -8.507888885505199e+02 +742 830 -8.023274760830702e+02 +742 831 -7.211778000851822e+02 +742 832 -6.289529049931513e+02 +742 833 -5.429674662554836e+02 +742 834 -4.725808574370910e+02 +742 835 -4.208084537187723e+02 +742 836 -3.873813675510154e+02 +742 837 -3.710963518270349e+02 +743 667 -9.695072463564467e+02 +743 668 -1.032880208377977e+03 +743 669 -1.168677565678393e+03 +743 670 -1.394551574360516e+03 +743 671 -1.733190400658708e+03 +743 672 -2.199157547087190e+03 +743 673 -2.767706810094291e+03 +743 674 -3.331754877699595e+03 +743 675 -3.699147964795159e+03 +743 802 -3.699147964795159e+03 +743 803 -3.331754877699595e+03 +743 804 -2.767706810094291e+03 +743 805 -2.199157547087190e+03 +743 806 -1.733190400658708e+03 +743 807 -1.394551574360516e+03 +743 808 -1.168677565678393e+03 +743 809 -1.032880208377977e+03 +743 810 -9.695072463564467e+02 +743 829 -1.015511306612463e+03 +743 830 -9.536070604341750e+02 +743 831 -8.507888885505199e+02 +743 832 -7.352796046183660e+02 +743 833 -6.289529049931513e+02 +743 834 -5.429674662554836e+02 +743 835 -4.803677035258846e+02 +743 836 -4.402579127124382e+02 +743 837 -4.208084537187723e+02 +744 667 -8.148024630667978e+02 +744 668 -8.643348602446105e+02 +744 669 -9.695072463564467e+02 +744 670 -1.141773184361051e+03 +744 671 -1.394551574360516e+03 +744 672 -1.733190400658708e+03 +744 673 -2.134265778758337e+03 +744 674 -2.521021940438013e+03 +744 675 -2.767706810094291e+03 +744 802 -5.136224430633812e+03 +744 803 -4.560278038130793e+03 +744 804 -3.699147964795159e+03 +744 805 -2.861294172280315e+03 +744 806 -2.199157547087190e+03 +744 807 -1.733190400658708e+03 +744 808 -1.430197816180116e+03 +744 809 -1.251286952144480e+03 +744 810 -1.168677565678393e+03 +744 829 -1.228588660544043e+03 +744 830 -1.148042053110076e+03 +744 831 -1.015511306612463e+03 +744 832 -8.685786765383741e+02 +744 833 -7.352796046183660e+02 +744 834 -6.289529049931513e+02 +744 835 -5.524312223207834e+02 +744 836 -5.038180997021776e+02 +744 837 -4.803677035258846e+02 +745 667 -7.058924559832891e+02 +745 668 -7.463158073460687e+02 +745 669 -8.315436028021828e+02 +745 670 -9.695072463564467e+02 +745 671 -1.168677565678393e+03 +745 672 -1.430197816180116e+03 +745 673 -1.733190400658708e+03 +745 674 -2.019368486704435e+03 +745 675 -2.199157547087190e+03 +745 802 -7.138491575686227e+03 +745 803 -6.235592529048601e+03 +745 804 -4.925216936196723e+03 +745 805 -3.699147964795159e+03 +745 806 -2.767706810094291e+03 +745 807 -2.134265778758337e+03 +745 808 -1.733190400658708e+03 +745 809 -1.500725861549673e+03 +745 810 -1.394551574360516e+03 +745 829 -1.471477730866021e+03 +745 830 -1.368148367306964e+03 +745 831 -1.199743197084304e+03 +745 832 -1.015511306612463e+03 +745 833 -8.507888885505199e+02 +745 834 -7.211778000851822e+02 +745 835 -6.289529049931513e+02 +745 836 -5.708523475060541e+02 +745 837 -5.429674662554836e+02 +746 667 -6.378158089920689e+02 +746 668 -6.728335244699299e+02 +746 669 -7.463158073460687e+02 +746 670 -8.643348602446105e+02 +746 671 -1.032880208377977e+03 +746 672 -1.251286952144480e+03 +746 673 -1.500725861549673e+03 +746 674 -1.733190400658708e+03 +746 675 -1.877824568765008e+03 +746 802 -9.405703259334558e+03 +746 803 -8.091232579773156e+03 +746 804 -6.235592529048601e+03 +746 805 -4.560278038130793e+03 +746 806 -3.331754877699595e+03 +746 807 -2.521021940438013e+03 +746 808 -2.019368486704435e+03 +746 809 -1.733190400658708e+03 +746 810 -1.603684467943639e+03 +746 829 -1.697437739078442e+03 +746 830 -1.571600895131404e+03 +746 831 -1.368148367306964e+03 +746 832 -1.148042053110076e+03 +746 833 -9.536070604341750e+02 +746 834 -8.023274760830702e+02 +746 835 -6.956816209337401e+02 +746 836 -6.289529049931513e+02 +746 837 -5.970589583440841e+02 +747 667 -6.052974323170231e+02 +747 668 -6.378158089920689e+02 +747 669 -7.058924559832891e+02 +747 670 -8.148024630667978e+02 +747 671 -9.695072463564467e+02 +747 672 -1.168677565678393e+03 +747 673 -1.394551574360516e+03 +747 674 -1.603684467943639e+03 +747 675 -1.733190400658708e+03 +747 802 -1.103972130715905e+04 +747 803 -9.405703259334558e+03 +747 804 -7.138491575686227e+03 +747 805 -5.136224430633812e+03 +747 806 -3.699147964795159e+03 +747 807 -2.767706810094291e+03 +747 808 -2.199157547087190e+03 +747 809 -1.877824568765008e+03 +747 810 -1.733190400658708e+03 +747 829 -1.837845240586523e+03 +747 830 -1.697437739078442e+03 +747 831 -1.471477730866021e+03 +747 832 -1.228588660544043e+03 +747 833 -1.015511306612463e+03 +747 834 -8.507888885505199e+02 +747 835 -7.352796046183660e+02 +747 836 -6.632839990295092e+02 +747 837 -6.289529049931513e+02 +766 667 -6.289529049931513e+02 +766 668 -6.632839990295092e+02 +766 669 -7.352796046183660e+02 +766 670 -8.507888885505199e+02 +766 671 -1.015511306612463e+03 +766 672 -1.228588660544043e+03 +766 673 -1.471477730866021e+03 +766 674 -1.697437739078442e+03 +766 675 -1.837845240586523e+03 +766 694 -1.733190400658708e+03 +766 695 -1.877824568765008e+03 +766 696 -2.199157547087190e+03 +766 697 -2.767706810094291e+03 +766 698 -3.699147964795159e+03 +766 699 -5.136224430633812e+03 +766 700 -7.138491575686227e+03 +766 701 -9.405703259334558e+03 +766 702 -1.103972130715905e+04 +766 829 -1.733190400658708e+03 +766 830 -1.603684467943639e+03 +766 831 -1.394551574360516e+03 +766 832 -1.168677565678393e+03 +766 833 -9.695072463564467e+02 +766 834 -8.148024630667978e+02 +766 835 -7.058924559832891e+02 +766 836 -6.378158089920689e+02 +766 837 -6.052974323170231e+02 +767 667 -5.970589583440841e+02 +767 668 -6.289529049931513e+02 +767 669 -6.956816209337401e+02 +767 670 -8.023274760830702e+02 +767 671 -9.536070604341750e+02 +767 672 -1.148042053110076e+03 +767 673 -1.368148367306964e+03 +767 674 -1.571600895131404e+03 +767 675 -1.697437739078442e+03 +767 694 -1.603684467943639e+03 +767 695 -1.733190400658708e+03 +767 696 -2.019368486704435e+03 +767 697 -2.521021940438013e+03 +767 698 -3.331754877699595e+03 +767 699 -4.560278038130793e+03 +767 700 -6.235592529048601e+03 +767 701 -8.091232579773156e+03 +767 702 -9.405703259334558e+03 +767 829 -1.877824568765008e+03 +767 830 -1.733190400658708e+03 +767 831 -1.500725861549673e+03 +767 832 -1.251286952144480e+03 +767 833 -1.032880208377977e+03 +767 834 -8.643348602446105e+02 +767 835 -7.463158073460687e+02 +767 836 -6.728335244699299e+02 +767 837 -6.378158089920689e+02 +768 667 -5.429674662554836e+02 +768 668 -5.708523475060541e+02 +768 669 -6.289529049931513e+02 +768 670 -7.211778000851822e+02 +768 671 -8.507888885505199e+02 +768 672 -1.015511306612463e+03 +768 673 -1.199743197084304e+03 +768 674 -1.368148367306964e+03 +768 675 -1.471477730866021e+03 +768 694 -1.394551574360516e+03 +768 695 -1.500725861549673e+03 +768 696 -1.733190400658708e+03 +768 697 -2.134265778758337e+03 +768 698 -2.767706810094291e+03 +768 699 -3.699147964795159e+03 +768 700 -4.925216936196723e+03 +768 701 -6.235592529048601e+03 +768 702 -7.138491575686227e+03 +768 829 -2.199157547087190e+03 +768 830 -2.019368486704435e+03 +768 831 -1.733190400658708e+03 +768 832 -1.430197816180116e+03 +768 833 -1.168677565678393e+03 +768 834 -9.695072463564467e+02 +768 835 -8.315436028021828e+02 +768 836 -7.463158073460687e+02 +768 837 -7.058924559832891e+02 +769 667 -4.803677035258846e+02 +769 668 -5.038180997021776e+02 +769 669 -5.524312223207834e+02 +769 670 -6.289529049931513e+02 +769 671 -7.352796046183660e+02 +769 672 -8.685786765383741e+02 +769 673 -1.015511306612463e+03 +769 674 -1.148042053110076e+03 +769 675 -1.228588660544043e+03 +769 694 -1.168677565678393e+03 +769 695 -1.251286952144480e+03 +769 696 -1.430197816180116e+03 +769 697 -1.733190400658708e+03 +769 698 -2.199157547087190e+03 +769 699 -2.861294172280315e+03 +769 700 -3.699147964795159e+03 +769 701 -4.560278038130793e+03 +769 702 -5.136224430633812e+03 +769 829 -2.767706810094291e+03 +769 830 -2.521021940438013e+03 +769 831 -2.134265778758337e+03 +769 832 -1.733190400658708e+03 +769 833 -1.394551574360516e+03 +769 834 -1.141773184361051e+03 +769 835 -9.695072463564467e+02 +769 836 -8.643348602446105e+02 +769 837 -8.148024630667978e+02 +770 667 -4.208084537187723e+02 +770 668 -4.402579127124382e+02 +770 669 -4.803677035258846e+02 +770 670 -5.429674662554836e+02 +770 671 -6.289529049931513e+02 +770 672 -7.352796046183660e+02 +770 673 -8.507888885505199e+02 +770 674 -9.536070604341750e+02 +770 675 -1.015511306612463e+03 +770 694 -9.695072463564467e+02 +770 695 -1.032880208377977e+03 +770 696 -1.168677565678393e+03 +770 697 -1.394551574360516e+03 +770 698 -1.733190400658708e+03 +770 699 -2.199157547087190e+03 +770 700 -2.767706810094291e+03 +770 701 -3.331754877699595e+03 +770 702 -3.699147964795159e+03 +770 829 -3.699147964795159e+03 +770 830 -3.331754877699595e+03 +770 831 -2.767706810094291e+03 +770 832 -2.199157547087190e+03 +770 833 -1.733190400658708e+03 +770 834 -1.394551574360516e+03 +770 835 -1.168677565678393e+03 +770 836 -1.032880208377977e+03 +770 837 -9.695072463564467e+02 +771 667 -3.710963518270349e+02 +771 668 -3.873813675510154e+02 +771 669 -4.208084537187723e+02 +771 670 -4.725808574370910e+02 +771 671 -5.429674662554836e+02 +771 672 -6.289529049931513e+02 +771 673 -7.211778000851822e+02 +771 674 -8.023274760830702e+02 +771 675 -8.507888885505199e+02 +771 694 -8.148024630667978e+02 +771 695 -8.643348602446105e+02 +771 696 -9.695072463564467e+02 +771 697 -1.141773184361051e+03 +771 698 -1.394551574360516e+03 +771 699 -1.733190400658708e+03 +771 700 -2.134265778758337e+03 +771 701 -2.521021940438013e+03 +771 702 -2.767706810094291e+03 +771 829 -5.136224430633812e+03 +771 830 -4.560278038130793e+03 +771 831 -3.699147964795159e+03 +771 832 -2.861294172280315e+03 +771 833 -2.199157547087190e+03 +771 834 -1.733190400658708e+03 +771 835 -1.430197816180116e+03 +771 836 -1.251286952144480e+03 +771 837 -1.168677565678393e+03 +772 667 -3.339204550667995e+02 +772 668 -3.479505460244110e+02 +772 669 -3.766415408901786e+02 +772 670 -4.208084537187723e+02 +772 671 -4.803677035258846e+02 +772 672 -5.524312223207834e+02 +772 673 -6.289529049931513e+02 +772 674 -6.956816209337401e+02 +772 675 -7.352796046183660e+02 +772 694 -7.058924559832891e+02 +772 695 -7.463158073460687e+02 +772 696 -8.315436028021828e+02 +772 697 -9.695072463564467e+02 +772 698 -1.168677565678393e+03 +772 699 -1.430197816180116e+03 +772 700 -1.733190400658708e+03 +772 701 -2.019368486704435e+03 +772 702 -2.199157547087190e+03 +772 829 -7.138491575686227e+03 +772 830 -6.235592529048601e+03 +772 831 -4.925216936196723e+03 +772 832 -3.699147964795159e+03 +772 833 -2.767706810094291e+03 +772 834 -2.134265778758337e+03 +772 835 -1.733190400658708e+03 +772 836 -1.500725861549673e+03 +772 837 -1.394551574360516e+03 +773 667 -3.096178268240471e+02 +773 668 -3.222285372305477e+02 +773 669 -3.479505460244110e+02 +773 670 -3.873813675510154e+02 +773 671 -4.402579127124382e+02 +773 672 -5.038180997021776e+02 +773 673 -5.708523475060541e+02 +773 674 -6.289529049931513e+02 +773 675 -6.632839990295092e+02 +773 694 -6.378158089920689e+02 +773 695 -6.728335244699299e+02 +773 696 -7.463158073460687e+02 +773 697 -8.643348602446105e+02 +773 698 -1.032880208377977e+03 +773 699 -1.251286952144480e+03 +773 700 -1.500725861549673e+03 +773 701 -1.733190400658708e+03 +773 702 -1.877824568765008e+03 +773 829 -9.405703259334558e+03 +773 830 -8.091232579773156e+03 +773 831 -6.235592529048601e+03 +773 832 -4.560278038130793e+03 +773 833 -3.331754877699595e+03 +773 834 -2.521021940438013e+03 +773 835 -2.019368486704435e+03 +773 836 -1.733190400658708e+03 +773 837 -1.603684467943639e+03 +774 667 -2.976873911031311e+02 +774 668 -3.096178268240471e+02 +774 669 -3.339204550667995e+02 +774 670 -3.710963518270349e+02 +774 671 -4.208084537187723e+02 +774 672 -4.803677035258846e+02 +774 673 -5.429674662554836e+02 +774 674 -5.970589583440841e+02 +774 675 -6.289529049931513e+02 +774 694 -6.052974323170231e+02 +774 695 -6.378158089920689e+02 +774 696 -7.058924559832891e+02 +774 697 -8.148024630667978e+02 +774 698 -9.695072463564467e+02 +774 699 -1.168677565678393e+03 +774 700 -1.394551574360516e+03 +774 701 -1.603684467943639e+03 +774 702 -1.733190400658708e+03 +774 829 -1.103972130715905e+04 +774 830 -9.405703259334558e+03 +774 831 -7.138491575686227e+03 +774 832 -5.136224430633812e+03 +774 833 -3.699147964795159e+03 +774 834 -2.767706810094291e+03 +774 835 -2.199157547087190e+03 +774 836 -1.877824568765008e+03 +774 837 -1.733190400658708e+03 +793 595 -1.111842160419090e+02 +793 596 -1.170681125153374e+02 +793 597 -1.293661657908652e+02 +793 598 -1.489885081652994e+02 +793 599 -1.767605489846857e+02 +793 600 -2.123577731150844e+02 +793 601 -2.525366109215767e+02 +793 602 -2.895745815575327e+02 +793 603 -3.124380547854544e+02 +793 658 -3.063876713483004e+02 +793 659 -3.311617365195740e+02 +793 660 -3.859179776157605e+02 +793 661 -4.819366867771678e+02 +793 662 -6.371952057562402e+02 +793 663 -8.726231103602329e+02 +793 664 -1.193932486839834e+03 +793 665 -1.550121445008512e+03 +793 666 -1.802596433195456e+03 +793 937 -3.063876713483004e+02 +793 938 -2.841326260213861e+02 +793 939 -2.480403651673271e+02 +793 940 -2.088271183655453e+02 +793 941 -1.740274317161707e+02 +793 942 -1.468355065336025e+02 +793 943 -1.275984131219179e+02 +793 944 -1.155304899028560e+02 +793 945 -1.097534196790493e+02 +794 595 -1.057061586526020e+02 +794 596 -1.111842160419089e+02 +794 597 -1.226088998409726e+02 +794 598 -1.407716848553633e+02 +794 599 -1.663510232448635e+02 +794 600 -1.989422168423268e+02 +794 601 -2.354925657825778e+02 +794 602 -2.689865983609328e+02 +794 603 -2.895745815575327e+02 +794 658 -2.841326260213861e+02 +794 659 -3.063876713483004e+02 +794 660 -3.553280674768362e+02 +794 661 -4.404031329187433e+02 +794 662 -5.762343277298883e+02 +794 663 -7.788097592344268e+02 +794 664 -1.049909849375152e+03 +794 665 -1.344510568096313e+03 +794 666 -1.550121445008512e+03 +794 937 -3.311617365195740e+02 +794 938 -3.063876713483004e+02 +794 939 -2.663884709281890e+02 +794 940 -2.231981844606885e+02 +794 941 -1.851243485745370e+02 +794 942 -1.555580782497810e+02 +794 943 -1.347481526436476e+02 +794 944 -1.217424124188379e+02 +794 945 -1.155304899028560e+02 +795 595 -9.638822517401596e+01 +795 596 -1.011961191083174e+02 +795 597 -1.111842160419089e+02 +795 598 -1.269615920628683e+02 +795 599 -1.489885081652992e+02 +795 600 -1.767605489846853e+02 +795 601 -2.075588680195229e+02 +795 602 -2.354925657825778e+02 +795 603 -2.525366109215767e+02 +795 658 -2.480403651673271e+02 +795 659 -2.663884709281890e+02 +795 660 -3.063876713483004e+02 +795 661 -3.748904053829394e+02 +795 662 -4.819366867771664e+02 +795 663 -6.371952057562384e+02 +795 664 -8.383319685358435e+02 +795 665 -1.049909849375152e+03 +795 666 -1.193932486839834e+03 +795 937 -3.859179776157605e+02 +795 938 -3.553280674768362e+02 +795 939 -3.063876713483004e+02 +795 940 -2.542062119667733e+02 +795 941 -2.088271183655457e+02 +795 942 -1.740274317161710e+02 +795 943 -1.497853840269160e+02 +795 944 -1.347481526436476e+02 +795 945 -1.275984131219179e+02 +796 595 -8.555928471614152e+01 +796 596 -8.962181586287865e+01 +796 597 -9.802102195827709e+01 +796 598 -1.111842160419089e+02 +796 599 -1.293661657908650e+02 +796 600 -1.519993633210925e+02 +796 601 -1.767605489846853e+02 +796 602 -1.989422168423268e+02 +796 603 -2.123577731150844e+02 +796 658 -2.088271183655453e+02 +796 659 -2.231981844606885e+02 +796 660 -2.542062119667733e+02 +796 661 -3.063876713483004e+02 +796 662 -3.859179776157595e+02 +796 663 -4.976453857371580e+02 +796 664 -6.371952057562384e+02 +796 665 -7.788097592344268e+02 +796 666 -8.726231103602329e+02 +796 937 -4.819366867771678e+02 +796 938 -4.404031329187433e+02 +796 939 -3.748904053829394e+02 +796 940 -3.063876713483004e+02 +796 941 -2.480403651673276e+02 +796 942 -2.041390437321801e+02 +796 943 -1.740274317161710e+02 +796 944 -1.555580782497810e+02 +796 945 -1.468355065336025e+02 +797 595 -7.520762033775924e+01 +797 596 -7.859349409841361e+01 +797 597 -8.555928471614156e+01 +797 598 -9.638822517401600e+01 +797 599 -1.111842160419089e+02 +797 600 -1.293661657908650e+02 +797 601 -1.489885081652992e+02 +797 602 -1.663510232448635e+02 +797 603 -1.767605489846857e+02 +797 658 -1.740274317161707e+02 +797 659 -1.851243485745370e+02 +797 660 -2.088271183655457e+02 +797 661 -2.480403651673276e+02 +797 662 -3.063876713483004e+02 +797 663 -3.859179776157595e+02 +797 664 -4.819366867771664e+02 +797 665 -5.762343277298883e+02 +797 666 -6.371952057562402e+02 +797 937 -6.371952057562402e+02 +797 938 -5.762343277298883e+02 +797 939 -4.819366867771664e+02 +797 940 -3.859179776157595e+02 +797 941 -3.063876713483004e+02 +797 942 -2.480403651673276e+02 +797 943 -2.088271183655457e+02 +797 944 -1.851243485745370e+02 +797 945 -1.740274317161707e+02 +798 595 -6.652797451218335e+01 +798 596 -6.937545782864687e+01 +798 597 -7.520762033775929e+01 +798 598 -8.420868002944924e+01 +798 599 -9.638822517401600e+01 +798 600 -1.111842160419089e+02 +798 601 -1.269615920628683e+02 +798 602 -1.407716848553633e+02 +798 603 -1.489885081652994e+02 +798 658 -1.468355065336025e+02 +798 659 -1.555580782497810e+02 +798 660 -1.740274317161710e+02 +798 661 -2.041390437321801e+02 +798 662 -2.480403651673276e+02 +798 663 -3.063876713483004e+02 +798 664 -3.748904053829394e+02 +798 665 -4.404031329187433e+02 +798 666 -4.819366867771678e+02 +798 937 -8.726231103602329e+02 +798 938 -7.788097592344268e+02 +798 939 -6.371952057562384e+02 +798 940 -4.976453857371580e+02 +798 941 -3.859179776157595e+02 +798 942 -3.063876713483004e+02 +798 943 -2.542062119667733e+02 +798 944 -2.231981844606885e+02 +798 945 -2.088271183655453e+02 +799 595 -6.001174723167340e+01 +799 596 -6.247361649834816e+01 +799 597 -6.749803222962952e+01 +799 598 -7.520762033775929e+01 +799 599 -8.555928471614156e+01 +799 600 -9.802102195827709e+01 +799 601 -1.111842160419089e+02 +799 602 -1.226088998409726e+02 +799 603 -1.293661657908652e+02 +799 658 -1.275984131219179e+02 +799 659 -1.347481526436476e+02 +799 660 -1.497853840269160e+02 +799 661 -1.740274317161710e+02 +799 662 -2.088271183655457e+02 +799 663 -2.542062119667733e+02 +799 664 -3.063876713483004e+02 +799 665 -3.553280674768362e+02 +799 666 -3.859179776157605e+02 +799 937 -1.193932486839834e+03 +799 938 -1.049909849375152e+03 +799 939 -8.383319685358435e+02 +799 940 -6.371952057562384e+02 +799 941 -4.819366867771664e+02 +799 942 -3.748904053829394e+02 +799 943 -3.063876713483004e+02 +799 944 -2.663884709281890e+02 +799 945 -2.480403651673271e+02 +800 595 -5.573941364116936e+01 +800 596 -5.795761808209188e+01 +800 597 -6.247361649834816e+01 +800 598 -6.937545782864687e+01 +800 599 -7.859349409841361e+01 +800 600 -8.962181586287865e+01 +800 601 -1.011961191083174e+02 +800 602 -1.111842160419089e+02 +800 603 -1.170681125153374e+02 +800 658 -1.155304899028560e+02 +800 659 -1.217424124188379e+02 +800 660 -1.347481526436476e+02 +800 661 -1.555580782497810e+02 +800 662 -1.851243485745370e+02 +800 663 -2.231981844606885e+02 +800 664 -2.663884709281890e+02 +800 665 -3.063876713483004e+02 +800 666 -3.311617365195740e+02 +800 937 -1.550121445008512e+03 +800 938 -1.344510568096313e+03 +800 939 -1.049909849375152e+03 +800 940 -7.788097592344268e+02 +800 941 -5.762343277298883e+02 +800 942 -4.404031329187433e+02 +800 943 -3.553280674768362e+02 +800 944 -3.063876713483004e+02 +800 945 -2.841326260213861e+02 +801 595 -5.363826960242958e+01 +801 596 -5.573941364116933e+01 +801 597 -6.001174723167335e+01 +801 598 -6.652797451218332e+01 +801 599 -7.520762033775921e+01 +801 600 -8.555928471614145e+01 +801 601 -9.638822517401589e+01 +801 602 -1.057061586526020e+02 +801 603 -1.111842160419089e+02 +801 658 -1.097534196790493e+02 +801 659 -1.155304899028560e+02 +801 660 -1.275984131219179e+02 +801 661 -1.468355065336025e+02 +801 662 -1.740274317161707e+02 +801 663 -2.088271183655453e+02 +801 664 -2.480403651673271e+02 +801 665 -2.841326260213861e+02 +801 666 -3.063876713483004e+02 +801 937 -1.802596433195456e+03 +801 938 -1.550121445008512e+03 +801 939 -1.193932486839834e+03 +801 940 -8.726231103602329e+02 +801 941 -6.371952057562402e+02 +801 942 -4.819366867771678e+02 +801 943 -3.859179776157605e+02 +801 944 -3.311617365195740e+02 +801 945 -3.063876713483004e+02 +802 739 -1.733190400658708e+03 +802 740 -1.877824568765008e+03 +802 741 -2.199157547087190e+03 +802 742 -2.767706810094291e+03 +802 743 -3.699147964795159e+03 +802 744 -5.136224430633812e+03 +802 745 -7.138491575686227e+03 +802 746 -9.405703259334558e+03 +802 747 -1.103972130715905e+04 +802 883 -1.733190400658708e+03 +802 884 -1.603684467943639e+03 +802 885 -1.394551574360516e+03 +802 886 -1.168677565678393e+03 +802 887 -9.695072463564467e+02 +802 888 -8.148024630667978e+02 +802 889 -7.058924559832891e+02 +802 890 -6.378158089920689e+02 +802 891 -6.052974323170231e+02 +802 910 -6.289529049931513e+02 +802 911 -5.970589583440841e+02 +802 912 -5.429674662554836e+02 +802 913 -4.803677035258846e+02 +802 914 -4.208084537187723e+02 +802 915 -3.710963518270349e+02 +802 916 -3.339204550667995e+02 +802 917 -3.096178268240471e+02 +802 918 -2.976873911031311e+02 +803 739 -1.603684467943639e+03 +803 740 -1.733190400658708e+03 +803 741 -2.019368486704435e+03 +803 742 -2.521021940438013e+03 +803 743 -3.331754877699595e+03 +803 744 -4.560278038130793e+03 +803 745 -6.235592529048601e+03 +803 746 -8.091232579773156e+03 +803 747 -9.405703259334558e+03 +803 883 -1.877824568765008e+03 +803 884 -1.733190400658708e+03 +803 885 -1.500725861549673e+03 +803 886 -1.251286952144480e+03 +803 887 -1.032880208377977e+03 +803 888 -8.643348602446105e+02 +803 889 -7.463158073460687e+02 +803 890 -6.728335244699299e+02 +803 891 -6.378158089920689e+02 +803 910 -6.632839990295092e+02 +803 911 -6.289529049931513e+02 +803 912 -5.708523475060541e+02 +803 913 -5.038180997021776e+02 +803 914 -4.402579127124382e+02 +803 915 -3.873813675510154e+02 +803 916 -3.479505460244110e+02 +803 917 -3.222285372305477e+02 +803 918 -3.096178268240471e+02 +804 739 -1.394551574360516e+03 +804 740 -1.500725861549673e+03 +804 741 -1.733190400658708e+03 +804 742 -2.134265778758337e+03 +804 743 -2.767706810094291e+03 +804 744 -3.699147964795159e+03 +804 745 -4.925216936196723e+03 +804 746 -6.235592529048601e+03 +804 747 -7.138491575686227e+03 +804 883 -2.199157547087190e+03 +804 884 -2.019368486704435e+03 +804 885 -1.733190400658708e+03 +804 886 -1.430197816180116e+03 +804 887 -1.168677565678393e+03 +804 888 -9.695072463564467e+02 +804 889 -8.315436028021828e+02 +804 890 -7.463158073460687e+02 +804 891 -7.058924559832891e+02 +804 910 -7.352796046183660e+02 +804 911 -6.956816209337401e+02 +804 912 -6.289529049931513e+02 +804 913 -5.524312223207834e+02 +804 914 -4.803677035258846e+02 +804 915 -4.208084537187723e+02 +804 916 -3.766415408901786e+02 +804 917 -3.479505460244110e+02 +804 918 -3.339204550667995e+02 +805 739 -1.168677565678393e+03 +805 740 -1.251286952144480e+03 +805 741 -1.430197816180116e+03 +805 742 -1.733190400658708e+03 +805 743 -2.199157547087190e+03 +805 744 -2.861294172280315e+03 +805 745 -3.699147964795159e+03 +805 746 -4.560278038130793e+03 +805 747 -5.136224430633812e+03 +805 883 -2.767706810094291e+03 +805 884 -2.521021940438013e+03 +805 885 -2.134265778758337e+03 +805 886 -1.733190400658708e+03 +805 887 -1.394551574360516e+03 +805 888 -1.141773184361051e+03 +805 889 -9.695072463564467e+02 +805 890 -8.643348602446105e+02 +805 891 -8.148024630667978e+02 +805 910 -8.507888885505199e+02 +805 911 -8.023274760830702e+02 +805 912 -7.211778000851822e+02 +805 913 -6.289529049931513e+02 +805 914 -5.429674662554836e+02 +805 915 -4.725808574370910e+02 +805 916 -4.208084537187723e+02 +805 917 -3.873813675510154e+02 +805 918 -3.710963518270349e+02 +806 739 -9.695072463564467e+02 +806 740 -1.032880208377977e+03 +806 741 -1.168677565678393e+03 +806 742 -1.394551574360516e+03 +806 743 -1.733190400658708e+03 +806 744 -2.199157547087190e+03 +806 745 -2.767706810094291e+03 +806 746 -3.331754877699595e+03 +806 747 -3.699147964795159e+03 +806 883 -3.699147964795159e+03 +806 884 -3.331754877699595e+03 +806 885 -2.767706810094291e+03 +806 886 -2.199157547087190e+03 +806 887 -1.733190400658708e+03 +806 888 -1.394551574360516e+03 +806 889 -1.168677565678393e+03 +806 890 -1.032880208377977e+03 +806 891 -9.695072463564467e+02 +806 910 -1.015511306612463e+03 +806 911 -9.536070604341750e+02 +806 912 -8.507888885505199e+02 +806 913 -7.352796046183660e+02 +806 914 -6.289529049931513e+02 +806 915 -5.429674662554836e+02 +806 916 -4.803677035258846e+02 +806 917 -4.402579127124382e+02 +806 918 -4.208084537187723e+02 +807 739 -8.148024630667978e+02 +807 740 -8.643348602446105e+02 +807 741 -9.695072463564467e+02 +807 742 -1.141773184361051e+03 +807 743 -1.394551574360516e+03 +807 744 -1.733190400658708e+03 +807 745 -2.134265778758337e+03 +807 746 -2.521021940438013e+03 +807 747 -2.767706810094291e+03 +807 883 -5.136224430633812e+03 +807 884 -4.560278038130793e+03 +807 885 -3.699147964795159e+03 +807 886 -2.861294172280315e+03 +807 887 -2.199157547087190e+03 +807 888 -1.733190400658708e+03 +807 889 -1.430197816180116e+03 +807 890 -1.251286952144480e+03 +807 891 -1.168677565678393e+03 +807 910 -1.228588660544043e+03 +807 911 -1.148042053110076e+03 +807 912 -1.015511306612463e+03 +807 913 -8.685786765383741e+02 +807 914 -7.352796046183660e+02 +807 915 -6.289529049931513e+02 +807 916 -5.524312223207834e+02 +807 917 -5.038180997021776e+02 +807 918 -4.803677035258846e+02 +808 739 -7.058924559832891e+02 +808 740 -7.463158073460687e+02 +808 741 -8.315436028021828e+02 +808 742 -9.695072463564467e+02 +808 743 -1.168677565678393e+03 +808 744 -1.430197816180116e+03 +808 745 -1.733190400658708e+03 +808 746 -2.019368486704435e+03 +808 747 -2.199157547087190e+03 +808 883 -7.138491575686227e+03 +808 884 -6.235592529048601e+03 +808 885 -4.925216936196723e+03 +808 886 -3.699147964795159e+03 +808 887 -2.767706810094291e+03 +808 888 -2.134265778758337e+03 +808 889 -1.733190400658708e+03 +808 890 -1.500725861549673e+03 +808 891 -1.394551574360516e+03 +808 910 -1.471477730866021e+03 +808 911 -1.368148367306964e+03 +808 912 -1.199743197084304e+03 +808 913 -1.015511306612463e+03 +808 914 -8.507888885505199e+02 +808 915 -7.211778000851822e+02 +808 916 -6.289529049931513e+02 +808 917 -5.708523475060541e+02 +808 918 -5.429674662554836e+02 +809 739 -6.378158089920689e+02 +809 740 -6.728335244699299e+02 +809 741 -7.463158073460687e+02 +809 742 -8.643348602446105e+02 +809 743 -1.032880208377977e+03 +809 744 -1.251286952144480e+03 +809 745 -1.500725861549673e+03 +809 746 -1.733190400658708e+03 +809 747 -1.877824568765008e+03 +809 883 -9.405703259334558e+03 +809 884 -8.091232579773156e+03 +809 885 -6.235592529048601e+03 +809 886 -4.560278038130793e+03 +809 887 -3.331754877699595e+03 +809 888 -2.521021940438013e+03 +809 889 -2.019368486704435e+03 +809 890 -1.733190400658708e+03 +809 891 -1.603684467943639e+03 +809 910 -1.697437739078442e+03 +809 911 -1.571600895131404e+03 +809 912 -1.368148367306964e+03 +809 913 -1.148042053110076e+03 +809 914 -9.536070604341750e+02 +809 915 -8.023274760830702e+02 +809 916 -6.956816209337401e+02 +809 917 -6.289529049931513e+02 +809 918 -5.970589583440841e+02 +810 739 -6.052974323170231e+02 +810 740 -6.378158089920689e+02 +810 741 -7.058924559832891e+02 +810 742 -8.148024630667978e+02 +810 743 -9.695072463564467e+02 +810 744 -1.168677565678393e+03 +810 745 -1.394551574360516e+03 +810 746 -1.603684467943639e+03 +810 747 -1.733190400658708e+03 +810 883 -1.103972130715905e+04 +810 884 -9.405703259334558e+03 +810 885 -7.138491575686227e+03 +810 886 -5.136224430633812e+03 +810 887 -3.699147964795159e+03 +810 888 -2.767706810094291e+03 +810 889 -2.199157547087190e+03 +810 890 -1.877824568765008e+03 +810 891 -1.733190400658708e+03 +810 910 -1.837845240586523e+03 +810 911 -1.697437739078442e+03 +810 912 -1.471477730866021e+03 +810 913 -1.228588660544043e+03 +810 914 -1.015511306612463e+03 +810 915 -8.507888885505199e+02 +810 916 -7.352796046183660e+02 +810 917 -6.632839990295092e+02 +810 918 -6.289529049931513e+02 +829 739 -6.289529049931513e+02 +829 740 -6.632839990295092e+02 +829 741 -7.352796046183660e+02 +829 742 -8.507888885505199e+02 +829 743 -1.015511306612463e+03 +829 744 -1.228588660544043e+03 +829 745 -1.471477730866021e+03 +829 746 -1.697437739078442e+03 +829 747 -1.837845240586523e+03 +829 766 -1.733190400658708e+03 +829 767 -1.877824568765008e+03 +829 768 -2.199157547087190e+03 +829 769 -2.767706810094291e+03 +829 770 -3.699147964795159e+03 +829 771 -5.136224430633812e+03 +829 772 -7.138491575686227e+03 +829 773 -9.405703259334558e+03 +829 774 -1.103972130715905e+04 +829 910 -1.733190400658708e+03 +829 911 -1.603684467943639e+03 +829 912 -1.394551574360516e+03 +829 913 -1.168677565678393e+03 +829 914 -9.695072463564467e+02 +829 915 -8.148024630667978e+02 +829 916 -7.058924559832891e+02 +829 917 -6.378158089920689e+02 +829 918 -6.052974323170231e+02 +830 739 -5.970589583440841e+02 +830 740 -6.289529049931513e+02 +830 741 -6.956816209337401e+02 +830 742 -8.023274760830702e+02 +830 743 -9.536070604341750e+02 +830 744 -1.148042053110076e+03 +830 745 -1.368148367306964e+03 +830 746 -1.571600895131404e+03 +830 747 -1.697437739078442e+03 +830 766 -1.603684467943639e+03 +830 767 -1.733190400658708e+03 +830 768 -2.019368486704435e+03 +830 769 -2.521021940438013e+03 +830 770 -3.331754877699595e+03 +830 771 -4.560278038130793e+03 +830 772 -6.235592529048601e+03 +830 773 -8.091232579773156e+03 +830 774 -9.405703259334558e+03 +830 910 -1.877824568765008e+03 +830 911 -1.733190400658708e+03 +830 912 -1.500725861549673e+03 +830 913 -1.251286952144480e+03 +830 914 -1.032880208377977e+03 +830 915 -8.643348602446105e+02 +830 916 -7.463158073460687e+02 +830 917 -6.728335244699299e+02 +830 918 -6.378158089920689e+02 +831 739 -5.429674662554836e+02 +831 740 -5.708523475060541e+02 +831 741 -6.289529049931513e+02 +831 742 -7.211778000851822e+02 +831 743 -8.507888885505199e+02 +831 744 -1.015511306612463e+03 +831 745 -1.199743197084304e+03 +831 746 -1.368148367306964e+03 +831 747 -1.471477730866021e+03 +831 766 -1.394551574360516e+03 +831 767 -1.500725861549673e+03 +831 768 -1.733190400658708e+03 +831 769 -2.134265778758337e+03 +831 770 -2.767706810094291e+03 +831 771 -3.699147964795159e+03 +831 772 -4.925216936196723e+03 +831 773 -6.235592529048601e+03 +831 774 -7.138491575686227e+03 +831 910 -2.199157547087190e+03 +831 911 -2.019368486704435e+03 +831 912 -1.733190400658708e+03 +831 913 -1.430197816180116e+03 +831 914 -1.168677565678393e+03 +831 915 -9.695072463564467e+02 +831 916 -8.315436028021828e+02 +831 917 -7.463158073460687e+02 +831 918 -7.058924559832891e+02 +832 739 -4.803677035258846e+02 +832 740 -5.038180997021776e+02 +832 741 -5.524312223207834e+02 +832 742 -6.289529049931513e+02 +832 743 -7.352796046183660e+02 +832 744 -8.685786765383741e+02 +832 745 -1.015511306612463e+03 +832 746 -1.148042053110076e+03 +832 747 -1.228588660544043e+03 +832 766 -1.168677565678393e+03 +832 767 -1.251286952144480e+03 +832 768 -1.430197816180116e+03 +832 769 -1.733190400658708e+03 +832 770 -2.199157547087190e+03 +832 771 -2.861294172280315e+03 +832 772 -3.699147964795159e+03 +832 773 -4.560278038130793e+03 +832 774 -5.136224430633812e+03 +832 910 -2.767706810094291e+03 +832 911 -2.521021940438013e+03 +832 912 -2.134265778758337e+03 +832 913 -1.733190400658708e+03 +832 914 -1.394551574360516e+03 +832 915 -1.141773184361051e+03 +832 916 -9.695072463564467e+02 +832 917 -8.643348602446105e+02 +832 918 -8.148024630667978e+02 +833 739 -4.208084537187723e+02 +833 740 -4.402579127124382e+02 +833 741 -4.803677035258846e+02 +833 742 -5.429674662554836e+02 +833 743 -6.289529049931513e+02 +833 744 -7.352796046183660e+02 +833 745 -8.507888885505199e+02 +833 746 -9.536070604341750e+02 +833 747 -1.015511306612463e+03 +833 766 -9.695072463564467e+02 +833 767 -1.032880208377977e+03 +833 768 -1.168677565678393e+03 +833 769 -1.394551574360516e+03 +833 770 -1.733190400658708e+03 +833 771 -2.199157547087190e+03 +833 772 -2.767706810094291e+03 +833 773 -3.331754877699595e+03 +833 774 -3.699147964795159e+03 +833 910 -3.699147964795159e+03 +833 911 -3.331754877699595e+03 +833 912 -2.767706810094291e+03 +833 913 -2.199157547087190e+03 +833 914 -1.733190400658708e+03 +833 915 -1.394551574360516e+03 +833 916 -1.168677565678393e+03 +833 917 -1.032880208377977e+03 +833 918 -9.695072463564467e+02 +834 739 -3.710963518270349e+02 +834 740 -3.873813675510154e+02 +834 741 -4.208084537187723e+02 +834 742 -4.725808574370910e+02 +834 743 -5.429674662554836e+02 +834 744 -6.289529049931513e+02 +834 745 -7.211778000851822e+02 +834 746 -8.023274760830702e+02 +834 747 -8.507888885505199e+02 +834 766 -8.148024630667978e+02 +834 767 -8.643348602446105e+02 +834 768 -9.695072463564467e+02 +834 769 -1.141773184361051e+03 +834 770 -1.394551574360516e+03 +834 771 -1.733190400658708e+03 +834 772 -2.134265778758337e+03 +834 773 -2.521021940438013e+03 +834 774 -2.767706810094291e+03 +834 910 -5.136224430633812e+03 +834 911 -4.560278038130793e+03 +834 912 -3.699147964795159e+03 +834 913 -2.861294172280315e+03 +834 914 -2.199157547087190e+03 +834 915 -1.733190400658708e+03 +834 916 -1.430197816180116e+03 +834 917 -1.251286952144480e+03 +834 918 -1.168677565678393e+03 +835 739 -3.339204550667995e+02 +835 740 -3.479505460244110e+02 +835 741 -3.766415408901786e+02 +835 742 -4.208084537187723e+02 +835 743 -4.803677035258846e+02 +835 744 -5.524312223207834e+02 +835 745 -6.289529049931513e+02 +835 746 -6.956816209337401e+02 +835 747 -7.352796046183660e+02 +835 766 -7.058924559832891e+02 +835 767 -7.463158073460687e+02 +835 768 -8.315436028021828e+02 +835 769 -9.695072463564467e+02 +835 770 -1.168677565678393e+03 +835 771 -1.430197816180116e+03 +835 772 -1.733190400658708e+03 +835 773 -2.019368486704435e+03 +835 774 -2.199157547087190e+03 +835 910 -7.138491575686227e+03 +835 911 -6.235592529048601e+03 +835 912 -4.925216936196723e+03 +835 913 -3.699147964795159e+03 +835 914 -2.767706810094291e+03 +835 915 -2.134265778758337e+03 +835 916 -1.733190400658708e+03 +835 917 -1.500725861549673e+03 +835 918 -1.394551574360516e+03 +836 739 -3.096178268240471e+02 +836 740 -3.222285372305477e+02 +836 741 -3.479505460244110e+02 +836 742 -3.873813675510154e+02 +836 743 -4.402579127124382e+02 +836 744 -5.038180997021776e+02 +836 745 -5.708523475060541e+02 +836 746 -6.289529049931513e+02 +836 747 -6.632839990295092e+02 +836 766 -6.378158089920689e+02 +836 767 -6.728335244699299e+02 +836 768 -7.463158073460687e+02 +836 769 -8.643348602446105e+02 +836 770 -1.032880208377977e+03 +836 771 -1.251286952144480e+03 +836 772 -1.500725861549673e+03 +836 773 -1.733190400658708e+03 +836 774 -1.877824568765008e+03 +836 910 -9.405703259334558e+03 +836 911 -8.091232579773156e+03 +836 912 -6.235592529048601e+03 +836 913 -4.560278038130793e+03 +836 914 -3.331754877699595e+03 +836 915 -2.521021940438013e+03 +836 916 -2.019368486704435e+03 +836 917 -1.733190400658708e+03 +836 918 -1.603684467943639e+03 +837 739 -2.976873911031311e+02 +837 740 -3.096178268240471e+02 +837 741 -3.339204550667995e+02 +837 742 -3.710963518270349e+02 +837 743 -4.208084537187723e+02 +837 744 -4.803677035258846e+02 +837 745 -5.429674662554836e+02 +837 746 -5.970589583440841e+02 +837 747 -6.289529049931513e+02 +837 766 -6.052974323170231e+02 +837 767 -6.378158089920689e+02 +837 768 -7.058924559832891e+02 +837 769 -8.148024630667978e+02 +837 770 -9.695072463564467e+02 +837 771 -1.168677565678393e+03 +837 772 -1.394551574360516e+03 +837 773 -1.603684467943639e+03 +837 774 -1.733190400658708e+03 +837 910 -1.103972130715905e+04 +837 911 -9.405703259334558e+03 +837 912 -7.138491575686227e+03 +837 913 -5.136224430633812e+03 +837 914 -3.699147964795159e+03 +837 915 -2.767706810094291e+03 +837 916 -2.199157547087190e+03 +837 917 -1.877824568765008e+03 +837 918 -1.733190400658708e+03 +856 10 -3.497057332908938e+00 +856 11 -3.676796287632870e+00 +856 12 -4.051328477707510e+00 +856 13 -4.645915602732410e+00 +856 14 -5.481690043876853e+00 +856 15 -6.544108310365247e+00 +856 16 -7.732638770567269e+00 +856 17 -8.819303027900290e+00 +856 18 -9.486158000817367e+00 +856 289 -9.574614729634387e+00 +856 290 -1.033025206259608e+01 +856 291 -1.199392684783545e+01 +856 292 -1.489187979900571e+01 +856 293 -1.953249673072867e+01 +856 294 -2.648026715992624e+01 +856 295 -3.582072268161383e+01 +856 296 -4.601776203532707e+01 +856 297 -5.316004558269722e+01 +856 1423 -9.574614729634387e+00 +856 1424 -8.894152732809214e+00 +856 1425 -7.787064219095081e+00 +856 1426 -6.578858018778778e+00 +856 1427 -5.501432160761325e+00 +856 1428 -4.655741575368517e+00 +856 1429 -4.055212971361419e+00 +856 1430 -3.677452266447854e+00 +856 1431 -3.496313214985748e+00 +857 10 -3.328117750400732e+00 +857 11 -3.495702020396280e+00 +857 12 -3.844178119978570e+00 +857 13 -4.395497701990171e+00 +857 14 -5.166832897209201e+00 +857 15 -6.141828675612725e+00 +857 16 -7.226008345631073e+00 +857 17 -8.211796059840133e+00 +857 18 -8.814355243007814e+00 +857 289 -8.894152732809218e+00 +857 290 -9.574614729634389e+00 +857 291 -1.106556701616915e+01 +857 292 -1.364121235299754e+01 +857 293 -1.771654764348815e+01 +857 294 -2.372339702886329e+01 +857 295 -3.165228467591599e+01 +857 296 -4.014998583800271e+01 +857 297 -4.601776203532707e+01 +857 1423 -1.033025206259608e+01 +857 1424 -9.574614729634382e+00 +857 1425 -8.350436340807200e+00 +857 1426 -7.022334130042159e+00 +857 1427 -5.845568772761842e+00 +857 1428 -4.927408805516035e+00 +857 1429 -4.278637194083235e+00 +857 1430 -3.872006983680973e+00 +857 1431 -3.677452266447852e+00 +858 10 -3.040196551698948e+00 +858 11 -3.187658132160805e+00 +858 12 -3.493156855057107e+00 +858 13 -3.973544706450117e+00 +858 14 -4.640110726087141e+00 +858 15 -5.474372801723790e+00 +858 16 -6.392331439386213e+00 +858 17 -7.218975176414133e+00 +858 18 -7.720795651611272e+00 +858 289 -7.787064219095077e+00 +858 290 -8.350436340807194e+00 +858 291 -9.574614729634387e+00 +858 292 -1.165955788548229e+01 +858 293 -1.489187979900571e+01 +858 294 -1.953249673072867e+01 +858 295 -2.547425580969110e+01 +858 296 -3.165228467591599e+01 +858 297 -3.582072268161383e+01 +858 1423 -1.199392684783545e+01 +858 1424 -1.106556701616914e+01 +858 1425 -9.574614729634391e+00 +858 1426 -7.976517934049893e+00 +858 1427 -6.578858018778782e+00 +858 1428 -5.501432160761327e+00 +858 1429 -4.747658828821055e+00 +858 1430 -4.278637194083235e+00 +858 1431 -4.055212971361418e+00 +859 10 -2.704645661687464e+00 +859 11 -2.829643915278643e+00 +859 12 -3.087420867912321e+00 +859 13 -3.489731863548668e+00 +859 14 -4.042328334364181e+00 +859 15 -4.725639279727730e+00 +859 16 -5.467949421894374e+00 +859 17 -6.128690863981327e+00 +859 18 -6.526502305649259e+00 +859 289 -6.578858018778782e+00 +859 290 -7.022334130042162e+00 +859 291 -7.976517934049897e+00 +859 292 -9.574614729634387e+00 +859 293 -1.199392684783545e+01 +859 294 -1.536382589350013e+01 +859 295 -1.953249673072867e+01 +859 296 -2.372339702886329e+01 +859 297 -2.648026715992624e+01 +859 1423 -1.489187979900571e+01 +859 1424 -1.364121235299753e+01 +859 1425 -1.165955788548229e+01 +859 1426 -9.574614729634382e+00 +859 1427 -7.787064219095077e+00 +859 1428 -6.434009698761967e+00 +859 1429 -5.501432160761327e+00 +859 1430 -4.927408805516035e+00 +859 1431 -4.655741575368515e+00 +860 10 -2.382869273101415e+00 +860 11 -2.487389966690326e+00 +860 12 -2.701923451741463e+00 +860 13 -3.034174442493727e+00 +860 14 -3.485842817105866e+00 +860 15 -4.037550864621233e+00 +860 16 -4.629228569183997e+00 +860 17 -5.149801011776296e+00 +860 18 -5.460657838389004e+00 +860 289 -5.501432160761325e+00 +860 290 -5.845568772761844e+00 +860 291 -6.578858018778782e+00 +860 292 -7.787064219095077e+00 +860 293 -9.574614729634387e+00 +860 294 -1.199392684783545e+01 +860 295 -1.489187979900571e+01 +860 296 -1.771654764348815e+01 +860 297 -1.953249673072867e+01 +860 1423 -1.953249673072867e+01 +860 1424 -1.771654764348813e+01 +860 1425 -1.489187979900572e+01 +860 1426 -1.199392684783545e+01 +860 1427 -9.574614729634387e+00 +860 1428 -7.787064219095081e+00 +860 1429 -6.578858018778784e+00 +860 1430 -5.845568772761844e+00 +860 1431 -5.501432160761325e+00 +861 10 -2.112240302167759e+00 +861 11 -2.200402130339840e+00 +861 12 -2.380589337846679e+00 +861 13 -2.657718397344528e+00 +861 14 -3.030976950601266e+00 +861 15 -3.481959835633282e+00 +861 16 -3.960135753049273e+00 +861 17 -4.376565368298302e+00 +861 18 -4.623452853935656e+00 +861 289 -4.655741575368515e+00 +861 290 -4.927408805516033e+00 +861 291 -5.501432160761325e+00 +861 292 -6.434009698761963e+00 +861 293 -7.787064219095077e+00 +861 294 -9.574614729634387e+00 +861 295 -1.165955788548229e+01 +861 296 -1.364121235299754e+01 +861 297 -1.489187979900571e+01 +861 1423 -2.648026715992624e+01 +861 1424 -2.372339702886327e+01 +861 1425 -1.953249673072868e+01 +861 1426 -1.536382589350012e+01 +861 1427 -1.199392684783545e+01 +861 1428 -9.574614729634391e+00 +861 1429 -7.976517934049901e+00 +861 1430 -7.022334130042167e+00 +861 1431 -6.578858018778782e+00 +862 10 -1.908532165158310e+00 +862 11 -1.984936698198691e+00 +862 12 -2.140561146000859e+00 +862 13 -2.378586919341656e+00 +862 14 -2.696817739646272e+00 +862 15 -3.078000274328088e+00 +862 16 -3.478550201190774e+00 +862 17 -3.824588361404598e+00 +862 18 -4.028593523449520e+00 +862 289 -4.055212971361418e+00 +862 290 -4.278637194083233e+00 +862 291 -4.747658828821052e+00 +862 292 -5.501432160761325e+00 +862 293 -6.578858018778782e+00 +862 294 -7.976517934049897e+00 +862 295 -9.574614729634387e+00 +862 296 -1.106556701616915e+01 +862 297 -1.199392684783545e+01 +862 1423 -3.582072268161383e+01 +862 1424 -3.165228467591596e+01 +862 1425 -2.547425580969112e+01 +862 1426 -1.953249673072865e+01 +862 1427 -1.489187979900571e+01 +862 1428 -1.165955788548229e+01 +862 1429 -9.574614729634391e+00 +862 1430 -8.350436340807200e+00 +862 1431 -7.787064219095077e+00 +863 10 -1.774707057533898e+00 +863 11 -1.843662925660271e+00 +863 12 -1.983784152891550e+00 +863 13 -2.197278725725720e+00 +863 14 -2.481265838526340e+00 +863 15 -2.819419720917045e+00 +863 16 -3.172582464744437e+00 +863 17 -3.476022499301393e+00 +863 18 -3.654234393854455e+00 +863 289 -3.677452266447852e+00 +863 290 -3.872006983680972e+00 +863 291 -4.278637194083233e+00 +863 292 -4.927408805516033e+00 +863 293 -5.845568772761842e+00 +863 294 -7.022334130042162e+00 +863 295 -8.350436340807194e+00 +863 296 -9.574614729634387e+00 +863 297 -1.033025206259608e+01 +863 1423 -4.601776203532707e+01 +863 1424 -4.014998583800268e+01 +863 1425 -3.165228467591601e+01 +863 1426 -2.372339702886327e+01 +863 1427 -1.771654764348815e+01 +863 1428 -1.364121235299755e+01 +863 1429 -1.106556701616916e+01 +863 1430 -9.574614729634391e+00 +863 1431 -8.894152732809218e+00 +864 10 -1.708811004431284e+00 +864 11 -1.774182659637364e+00 +864 12 -1.906861127622349e+00 +864 13 -2.108622801479843e+00 +864 14 -2.376312717242079e+00 +864 15 -2.694106551358419e+00 +864 16 -3.024980383213743e+00 +864 17 -3.308490055907092e+00 +864 18 -3.474678585268307e+00 +864 289 -3.496313214985748e+00 +864 290 -3.677452266447854e+00 +864 291 -4.055212971361418e+00 +864 292 -4.655741575368515e+00 +864 293 -5.501432160761325e+00 +864 294 -6.578858018778782e+00 +864 295 -7.787064219095077e+00 +864 296 -8.894152732809218e+00 +864 297 -9.574614729634387e+00 +864 1423 -5.316004558269722e+01 +864 1424 -4.601776203532702e+01 +864 1425 -3.582072268161387e+01 +864 1426 -2.648026715992622e+01 +864 1427 -1.953249673072867e+01 +864 1428 -1.489187979900572e+01 +864 1429 -1.199392684783546e+01 +864 1430 -1.033025206259609e+01 +864 1431 -9.574614729634387e+00 +865 586 -5.416220002058459e+01 +865 587 -5.847168336242214e+01 +865 588 -6.797204698756194e+01 +865 589 -8.455751811575999e+01 +865 590 -1.112023202068744e+02 +865 591 -1.512628164030903e+02 +865 592 -2.053883607687485e+02 +865 593 -2.647767438527630e+02 +865 594 -3.065373731090118e+02 +865 1153 -5.416220002058462e+01 +865 1154 -5.028460369863171e+01 +865 1155 -4.398263164573866e+01 +865 1156 -3.711530555640490e+01 +865 1157 -3.100122392289864e+01 +865 1158 -2.620940698061742e+01 +865 1159 -2.281096793104268e+01 +865 1160 -2.067515029553633e+01 +865 1161 -1.965157861598590e+01 +865 1288 -1.965477828103598e+01 +865 1289 -1.870055440211151e+01 +865 1290 -1.707507926940499e+01 +865 1291 -1.518203609416468e+01 +865 1292 -1.336813651340294e+01 +865 1293 -1.184372960400065e+01 +865 1294 -1.069703031088084e+01 +865 1295 -9.944085360683063e+00 +865 1296 -9.573445684409064e+00 +866 586 -5.028460369863168e+01 +866 587 -5.416220002058462e+01 +866 588 -6.266865647386102e+01 +866 589 -7.739429142416689e+01 +866 590 -1.007640600234616e+02 +866 591 -1.353445496343034e+02 +866 592 -1.811983282511272e+02 +866 593 -2.305668762810884e+02 +866 594 -2.647767438527630e+02 +866 1153 -5.847168336242214e+01 +866 1154 -5.416220002058462e+01 +866 1155 -4.718848846240646e+01 +866 1156 -3.963467701820890e+01 +866 1157 -3.295302401855845e+01 +866 1158 -2.774798050936779e+01 +866 1159 -2.407490908992506e+01 +866 1160 -2.177494503977683e+01 +866 1161 -2.067515029553633e+01 +866 1288 -2.067858569511584e+01 +866 1289 -1.965477828103598e+01 +866 1290 -1.791417887437397e+01 +866 1291 -1.589274010473518e+01 +866 1292 -1.396191802264486e+01 +866 1293 -1.234420052045069e+01 +866 1294 -1.113049648221346e+01 +866 1295 -1.033512964800000e+01 +866 1296 -9.944085360683063e+00 +867 586 -4.398263164573861e+01 +867 587 -4.718848846240642e+01 +867 588 -5.416220002058462e+01 +867 589 -6.606134132672688e+01 +867 590 -8.455751811575999e+01 +867 591 -1.112023202068744e+02 +867 592 -1.454508347890306e+02 +867 593 -1.811983282511272e+02 +867 594 -2.053883607687485e+02 +867 1153 -6.797204698756194e+01 +867 1154 -6.266865647386102e+01 +867 1155 -5.416220002058468e+01 +867 1156 -4.506046026496946e+01 +867 1157 -3.711530555640486e+01 +867 1158 -3.100122392289861e+01 +867 1159 -2.672989532903557e+01 +867 1160 -2.407490908992508e+01 +867 1161 -2.281096793104269e+01 +867 1288 -2.281491025526309e+01 +867 1289 -2.164167292784033e+01 +867 1290 -1.965477828103599e+01 +867 1291 -1.736013665098132e+01 +867 1292 -1.518203609416467e+01 +867 1293 -1.336813651340293e+01 +867 1294 -1.201426721054981e+01 +867 1295 -1.113049648221347e+01 +867 1296 -1.069703031088085e+01 +868 586 -3.711530555640484e+01 +868 587 -3.963467701820886e+01 +868 588 -4.506046026496942e+01 +868 589 -5.416220002058462e+01 +868 590 -6.797204698756194e+01 +868 591 -8.726265053974943e+01 +868 592 -1.112023202068744e+02 +868 593 -1.353445496343034e+02 +868 594 -1.512628164030903e+02 +868 1153 -8.455751811575999e+01 +868 1154 -7.739429142416689e+01 +868 1155 -6.606134132672695e+01 +868 1156 -5.416220002058468e+01 +868 1157 -4.398263164573862e+01 +868 1158 -3.629276779865592e+01 +868 1159 -3.100122392289861e+01 +868 1160 -2.774798050936781e+01 +868 1161 -2.620940698061744e+01 +868 1288 -2.621419542240645e+01 +868 1289 -2.479209926714915e+01 +868 1290 -2.239757409043197e+01 +868 1291 -1.965477828103599e+01 +868 1292 -1.707507926940498e+01 +868 1293 -1.494561758129198e+01 +868 1294 -1.336813651340293e+01 +868 1295 -1.234420052045070e+01 +868 1296 -1.184372960400065e+01 +869 586 -3.100122392289862e+01 +869 587 -3.295302401855845e+01 +869 588 -3.711530555640486e+01 +869 589 -4.398263164573862e+01 +869 590 -5.416220002058462e+01 +869 591 -6.797204698756194e+01 +869 592 -8.455751811575999e+01 +869 593 -1.007640600234616e+02 +869 594 -1.112023202068744e+02 +869 1153 -1.112023202068744e+02 +869 1154 -1.007640600234616e+02 +869 1155 -8.455751811576010e+01 +869 1156 -6.797204698756201e+01 +869 1157 -5.416220002058462e+01 +869 1158 -4.398263164573857e+01 +869 1159 -3.711530555640482e+01 +869 1160 -3.295302401855845e+01 +869 1161 -3.100122392289864e+01 +869 1288 -3.100728135248165e+01 +869 1289 -2.921308657465229e+01 +869 1290 -2.621419542240647e+01 +869 1291 -2.281491025526310e+01 +869 1292 -1.965477828103598e+01 +869 1293 -1.707507926940496e+01 +869 1294 -1.518203609416466e+01 +869 1295 -1.396191802264486e+01 +869 1296 -1.336813651340294e+01 +870 586 -2.620940698061743e+01 +870 587 -2.774798050936781e+01 +870 588 -3.100122392289864e+01 +870 589 -3.629276779865594e+01 +870 590 -4.398263164573862e+01 +870 591 -5.416220002058462e+01 +870 592 -6.606134132672688e+01 +870 593 -7.739429142416689e+01 +870 594 -8.455751811575999e+01 +870 1153 -1.512628164030903e+02 +870 1154 -1.353445496343034e+02 +870 1155 -1.112023202068745e+02 +870 1156 -8.726265053974954e+01 +870 1157 -6.797204698756194e+01 +870 1158 -5.416220002058456e+01 +870 1159 -4.506046026496937e+01 +870 1160 -3.963467701820886e+01 +870 1161 -3.711530555640486e+01 +870 1288 -3.712309913086534e+01 +870 1289 -3.482168460593338e+01 +870 1290 -3.100728135248167e+01 +870 1291 -2.673481743251410e+01 +870 1292 -2.281491025526309e+01 +870 1293 -1.965477828103597e+01 +870 1294 -1.736013665098130e+01 +870 1295 -1.589274010473517e+01 +870 1296 -1.518203609416467e+01 +871 586 -2.281096793104269e+01 +871 587 -2.407490908992508e+01 +871 588 -2.672989532903560e+01 +871 589 -3.100122392289864e+01 +871 590 -3.711530555640486e+01 +871 591 -4.506046026496942e+01 +871 592 -5.416220002058462e+01 +871 593 -6.266865647386102e+01 +871 594 -6.797204698756194e+01 +871 1153 -2.053883607687485e+02 +871 1154 -1.811983282511272e+02 +871 1155 -1.454508347890308e+02 +871 1156 -1.112023202068745e+02 +871 1157 -8.455751811575999e+01 +871 1158 -6.606134132672679e+01 +871 1159 -5.416220002058456e+01 +871 1160 -4.718848846240642e+01 +871 1161 -4.398263164573862e+01 +871 1288 -4.399251628020362e+01 +871 1289 -4.108257963331432e+01 +871 1290 -3.630032063351620e+01 +871 1291 -3.100728135248167e+01 +871 1292 -2.621419542240645e+01 +871 1293 -2.239757409043194e+01 +871 1294 -1.965477828103597e+01 +871 1295 -1.791417887437395e+01 +871 1296 -1.707507926940498e+01 +872 586 -2.067515029553632e+01 +872 587 -2.177494503977683e+01 +872 588 -2.407490908992508e+01 +872 589 -2.774798050936781e+01 +872 590 -3.295302401855845e+01 +872 591 -3.963467701820886e+01 +872 592 -4.718848846240642e+01 +872 593 -5.416220002058462e+01 +872 594 -5.847168336242214e+01 +872 1153 -2.647767438527630e+02 +872 1154 -2.305668762810884e+02 +872 1155 -1.811983282511275e+02 +872 1156 -1.353445496343036e+02 +872 1157 -1.007640600234616e+02 +872 1158 -7.739429142416682e+01 +872 1159 -6.266865647386096e+01 +872 1160 -5.416220002058462e+01 +872 1161 -5.028460369863171e+01 +872 1288 -5.029652653878190e+01 +872 1289 -4.679557686118159e+01 +872 1290 -4.108257963331437e+01 +872 1291 -3.482168460593341e+01 +872 1292 -2.921308657465229e+01 +872 1293 -2.479209926714913e+01 +872 1294 -2.164167292784031e+01 +872 1295 -1.965477828103598e+01 +872 1296 -1.870055440211151e+01 +873 586 -1.965157861598589e+01 +873 587 -2.067515029553633e+01 +873 588 -2.281096793104269e+01 +873 589 -2.620940698061744e+01 +873 590 -3.100122392289864e+01 +873 591 -3.711530555640486e+01 +873 592 -4.398263164573862e+01 +873 593 -5.028460369863171e+01 +873 594 -5.416220002058462e+01 +873 1153 -3.065373731090118e+02 +873 1154 -2.647767438527630e+02 +873 1155 -2.053883607687489e+02 +873 1156 -1.512628164030906e+02 +873 1157 -1.112023202068744e+02 +873 1158 -8.455751811575986e+01 +873 1159 -6.797204698756184e+01 +873 1160 -5.847168336242214e+01 +873 1161 -5.416220002058462e+01 +873 1288 -5.417542964960961e+01 +873 1289 -5.029652653878190e+01 +873 1290 -4.399251628020367e+01 +873 1291 -3.712309913086538e+01 +873 1292 -3.100728135248165e+01 +873 1293 -2.621419542240643e+01 +873 1294 -2.281491025526307e+01 +873 1295 -2.067858569511584e+01 +873 1296 -1.965477828103598e+01 +874 730 -3.063876713483004e+02 +874 731 -3.311617365195740e+02 +874 732 -3.859179776157605e+02 +874 733 -4.819366867771678e+02 +874 734 -6.371952057562402e+02 +874 735 -8.726231103602329e+02 +874 736 -1.193932486839834e+03 +874 737 -1.550121445008512e+03 +874 738 -1.802596433195456e+03 +874 1009 -3.063876713483004e+02 +874 1010 -2.841326260213861e+02 +874 1011 -2.480403651673271e+02 +874 1012 -2.088271183655453e+02 +874 1013 -1.740274317161707e+02 +874 1014 -1.468355065336025e+02 +874 1015 -1.275984131219179e+02 +874 1016 -1.155304899028560e+02 +874 1017 -1.097534196790493e+02 +874 1072 -1.111842160419089e+02 +874 1073 -1.057061586526020e+02 +874 1074 -9.638822517401589e+01 +874 1075 -8.555928471614145e+01 +874 1076 -7.520762033775921e+01 +874 1077 -6.652797451218332e+01 +874 1078 -6.001174723167335e+01 +874 1079 -5.573941364116933e+01 +874 1080 -5.363826960242956e+01 +875 730 -2.841326260213861e+02 +875 731 -3.063876713483004e+02 +875 732 -3.553280674768362e+02 +875 733 -4.404031329187433e+02 +875 734 -5.762343277298883e+02 +875 735 -7.788097592344268e+02 +875 736 -1.049909849375152e+03 +875 737 -1.344510568096313e+03 +875 738 -1.550121445008512e+03 +875 1009 -3.311617365195740e+02 +875 1010 -3.063876713483004e+02 +875 1011 -2.663884709281890e+02 +875 1012 -2.231981844606885e+02 +875 1013 -1.851243485745370e+02 +875 1014 -1.555580782497810e+02 +875 1015 -1.347481526436476e+02 +875 1016 -1.217424124188379e+02 +875 1017 -1.155304899028560e+02 +875 1072 -1.170681125153374e+02 +875 1073 -1.111842160419089e+02 +875 1074 -1.011961191083174e+02 +875 1075 -8.962181586287865e+01 +875 1076 -7.859349409841361e+01 +875 1077 -6.937545782864687e+01 +875 1078 -6.247361649834816e+01 +875 1079 -5.795761808209188e+01 +875 1080 -5.573941364116933e+01 +876 730 -2.480403651673271e+02 +876 731 -2.663884709281890e+02 +876 732 -3.063876713483004e+02 +876 733 -3.748904053829394e+02 +876 734 -4.819366867771664e+02 +876 735 -6.371952057562384e+02 +876 736 -8.383319685358435e+02 +876 737 -1.049909849375152e+03 +876 738 -1.193932486839834e+03 +876 1009 -3.859179776157605e+02 +876 1010 -3.553280674768362e+02 +876 1011 -3.063876713483004e+02 +876 1012 -2.542062119667733e+02 +876 1013 -2.088271183655457e+02 +876 1014 -1.740274317161710e+02 +876 1015 -1.497853840269160e+02 +876 1016 -1.347481526436476e+02 +876 1017 -1.275984131219179e+02 +876 1072 -1.293661657908652e+02 +876 1073 -1.226088998409726e+02 +876 1074 -1.111842160419089e+02 +876 1075 -9.802102195827709e+01 +876 1076 -8.555928471614156e+01 +876 1077 -7.520762033775929e+01 +876 1078 -6.749803222962952e+01 +876 1079 -6.247361649834816e+01 +876 1080 -6.001174723167335e+01 +877 730 -2.088271183655453e+02 +877 731 -2.231981844606885e+02 +877 732 -2.542062119667733e+02 +877 733 -3.063876713483004e+02 +877 734 -3.859179776157595e+02 +877 735 -4.976453857371580e+02 +877 736 -6.371952057562384e+02 +877 737 -7.788097592344268e+02 +877 738 -8.726231103602329e+02 +877 1009 -4.819366867771678e+02 +877 1010 -4.404031329187433e+02 +877 1011 -3.748904053829394e+02 +877 1012 -3.063876713483004e+02 +877 1013 -2.480403651673276e+02 +877 1014 -2.041390437321801e+02 +877 1015 -1.740274317161710e+02 +877 1016 -1.555580782497810e+02 +877 1017 -1.468355065336025e+02 +877 1072 -1.489885081652994e+02 +877 1073 -1.407716848553633e+02 +877 1074 -1.269615920628683e+02 +877 1075 -1.111842160419089e+02 +877 1076 -9.638822517401600e+01 +877 1077 -8.420868002944924e+01 +877 1078 -7.520762033775929e+01 +877 1079 -6.937545782864687e+01 +877 1080 -6.652797451218332e+01 +878 730 -1.740274317161707e+02 +878 731 -1.851243485745370e+02 +878 732 -2.088271183655457e+02 +878 733 -2.480403651673276e+02 +878 734 -3.063876713483004e+02 +878 735 -3.859179776157595e+02 +878 736 -4.819366867771664e+02 +878 737 -5.762343277298883e+02 +878 738 -6.371952057562402e+02 +878 1009 -6.371952057562402e+02 +878 1010 -5.762343277298883e+02 +878 1011 -4.819366867771664e+02 +878 1012 -3.859179776157595e+02 +878 1013 -3.063876713483004e+02 +878 1014 -2.480403651673276e+02 +878 1015 -2.088271183655457e+02 +878 1016 -1.851243485745370e+02 +878 1017 -1.740274317161707e+02 +878 1072 -1.767605489846857e+02 +878 1073 -1.663510232448635e+02 +878 1074 -1.489885081652992e+02 +878 1075 -1.293661657908650e+02 +878 1076 -1.111842160419089e+02 +878 1077 -9.638822517401600e+01 +878 1078 -8.555928471614156e+01 +878 1079 -7.859349409841361e+01 +878 1080 -7.520762033775921e+01 +879 730 -1.468355065336025e+02 +879 731 -1.555580782497810e+02 +879 732 -1.740274317161710e+02 +879 733 -2.041390437321801e+02 +879 734 -2.480403651673276e+02 +879 735 -3.063876713483004e+02 +879 736 -3.748904053829394e+02 +879 737 -4.404031329187433e+02 +879 738 -4.819366867771678e+02 +879 1009 -8.726231103602329e+02 +879 1010 -7.788097592344268e+02 +879 1011 -6.371952057562384e+02 +879 1012 -4.976453857371580e+02 +879 1013 -3.859179776157595e+02 +879 1014 -3.063876713483004e+02 +879 1015 -2.542062119667733e+02 +879 1016 -2.231981844606885e+02 +879 1017 -2.088271183655453e+02 +879 1072 -2.123577731150844e+02 +879 1073 -1.989422168423268e+02 +879 1074 -1.767605489846853e+02 +879 1075 -1.519993633210925e+02 +879 1076 -1.293661657908650e+02 +879 1077 -1.111842160419089e+02 +879 1078 -9.802102195827709e+01 +879 1079 -8.962181586287865e+01 +879 1080 -8.555928471614145e+01 +880 730 -1.275984131219179e+02 +880 731 -1.347481526436476e+02 +880 732 -1.497853840269160e+02 +880 733 -1.740274317161710e+02 +880 734 -2.088271183655457e+02 +880 735 -2.542062119667733e+02 +880 736 -3.063876713483004e+02 +880 737 -3.553280674768362e+02 +880 738 -3.859179776157605e+02 +880 1009 -1.193932486839834e+03 +880 1010 -1.049909849375152e+03 +880 1011 -8.383319685358435e+02 +880 1012 -6.371952057562384e+02 +880 1013 -4.819366867771664e+02 +880 1014 -3.748904053829394e+02 +880 1015 -3.063876713483004e+02 +880 1016 -2.663884709281890e+02 +880 1017 -2.480403651673271e+02 +880 1072 -2.525366109215767e+02 +880 1073 -2.354925657825778e+02 +880 1074 -2.075588680195229e+02 +880 1075 -1.767605489846853e+02 +880 1076 -1.489885081652992e+02 +880 1077 -1.269615920628683e+02 +880 1078 -1.111842160419089e+02 +880 1079 -1.011961191083174e+02 +880 1080 -9.638822517401589e+01 +881 730 -1.155304899028560e+02 +881 731 -1.217424124188379e+02 +881 732 -1.347481526436476e+02 +881 733 -1.555580782497810e+02 +881 734 -1.851243485745370e+02 +881 735 -2.231981844606885e+02 +881 736 -2.663884709281890e+02 +881 737 -3.063876713483004e+02 +881 738 -3.311617365195740e+02 +881 1009 -1.550121445008512e+03 +881 1010 -1.344510568096313e+03 +881 1011 -1.049909849375152e+03 +881 1012 -7.788097592344268e+02 +881 1013 -5.762343277298883e+02 +881 1014 -4.404031329187433e+02 +881 1015 -3.553280674768362e+02 +881 1016 -3.063876713483004e+02 +881 1017 -2.841326260213861e+02 +881 1072 -2.895745815575327e+02 +881 1073 -2.689865983609328e+02 +881 1074 -2.354925657825778e+02 +881 1075 -1.989422168423268e+02 +881 1076 -1.663510232448635e+02 +881 1077 -1.407716848553633e+02 +881 1078 -1.226088998409726e+02 +881 1079 -1.111842160419089e+02 +881 1080 -1.057061586526020e+02 +882 730 -1.097534196790493e+02 +882 731 -1.155304899028560e+02 +882 732 -1.275984131219179e+02 +882 733 -1.468355065336025e+02 +882 734 -1.740274317161707e+02 +882 735 -2.088271183655453e+02 +882 736 -2.480403651673271e+02 +882 737 -2.841326260213861e+02 +882 738 -3.063876713483004e+02 +882 1009 -1.802596433195456e+03 +882 1010 -1.550121445008512e+03 +882 1011 -1.193932486839834e+03 +882 1012 -8.726231103602329e+02 +882 1013 -6.371952057562402e+02 +882 1014 -4.819366867771678e+02 +882 1015 -3.859179776157605e+02 +882 1016 -3.311617365195740e+02 +882 1017 -3.063876713483004e+02 +882 1072 -3.124380547854544e+02 +882 1073 -2.895745815575327e+02 +882 1074 -2.525366109215767e+02 +882 1075 -2.123577731150844e+02 +882 1076 -1.767605489846857e+02 +882 1077 -1.489885081652994e+02 +882 1078 -1.293661657908652e+02 +882 1079 -1.170681125153374e+02 +882 1080 -1.111842160419089e+02 +883 802 -1.733190400658708e+03 +883 803 -1.877824568765008e+03 +883 804 -2.199157547087190e+03 +883 805 -2.767706810094291e+03 +883 806 -3.699147964795159e+03 +883 807 -5.136224430633812e+03 +883 808 -7.138491575686227e+03 +883 809 -9.405703259334558e+03 +883 810 -1.103972130715905e+04 +883 946 -1.733190400658708e+03 +883 947 -1.603684467943639e+03 +883 948 -1.394551574360516e+03 +883 949 -1.168677565678393e+03 +883 950 -9.695072463564467e+02 +883 951 -8.148024630667978e+02 +883 952 -7.058924559832891e+02 +883 953 -6.378158089920689e+02 +883 954 -6.052974323170231e+02 +883 973 -6.289529049931513e+02 +883 974 -5.970589583440841e+02 +883 975 -5.429674662554836e+02 +883 976 -4.803677035258846e+02 +883 977 -4.208084537187723e+02 +883 978 -3.710963518270349e+02 +883 979 -3.339204550667995e+02 +883 980 -3.096178268240471e+02 +883 981 -2.976873911031311e+02 +884 802 -1.603684467943639e+03 +884 803 -1.733190400658708e+03 +884 804 -2.019368486704435e+03 +884 805 -2.521021940438013e+03 +884 806 -3.331754877699595e+03 +884 807 -4.560278038130793e+03 +884 808 -6.235592529048601e+03 +884 809 -8.091232579773156e+03 +884 810 -9.405703259334558e+03 +884 946 -1.877824568765008e+03 +884 947 -1.733190400658708e+03 +884 948 -1.500725861549673e+03 +884 949 -1.251286952144480e+03 +884 950 -1.032880208377977e+03 +884 951 -8.643348602446105e+02 +884 952 -7.463158073460687e+02 +884 953 -6.728335244699299e+02 +884 954 -6.378158089920689e+02 +884 973 -6.632839990295092e+02 +884 974 -6.289529049931513e+02 +884 975 -5.708523475060541e+02 +884 976 -5.038180997021776e+02 +884 977 -4.402579127124382e+02 +884 978 -3.873813675510154e+02 +884 979 -3.479505460244110e+02 +884 980 -3.222285372305477e+02 +884 981 -3.096178268240471e+02 +885 802 -1.394551574360516e+03 +885 803 -1.500725861549673e+03 +885 804 -1.733190400658708e+03 +885 805 -2.134265778758337e+03 +885 806 -2.767706810094291e+03 +885 807 -3.699147964795159e+03 +885 808 -4.925216936196723e+03 +885 809 -6.235592529048601e+03 +885 810 -7.138491575686227e+03 +885 946 -2.199157547087190e+03 +885 947 -2.019368486704435e+03 +885 948 -1.733190400658708e+03 +885 949 -1.430197816180116e+03 +885 950 -1.168677565678393e+03 +885 951 -9.695072463564467e+02 +885 952 -8.315436028021828e+02 +885 953 -7.463158073460687e+02 +885 954 -7.058924559832891e+02 +885 973 -7.352796046183660e+02 +885 974 -6.956816209337401e+02 +885 975 -6.289529049931513e+02 +885 976 -5.524312223207834e+02 +885 977 -4.803677035258846e+02 +885 978 -4.208084537187723e+02 +885 979 -3.766415408901786e+02 +885 980 -3.479505460244110e+02 +885 981 -3.339204550667995e+02 +886 802 -1.168677565678393e+03 +886 803 -1.251286952144480e+03 +886 804 -1.430197816180116e+03 +886 805 -1.733190400658708e+03 +886 806 -2.199157547087190e+03 +886 807 -2.861294172280315e+03 +886 808 -3.699147964795159e+03 +886 809 -4.560278038130793e+03 +886 810 -5.136224430633812e+03 +886 946 -2.767706810094291e+03 +886 947 -2.521021940438013e+03 +886 948 -2.134265778758337e+03 +886 949 -1.733190400658708e+03 +886 950 -1.394551574360516e+03 +886 951 -1.141773184361051e+03 +886 952 -9.695072463564467e+02 +886 953 -8.643348602446105e+02 +886 954 -8.148024630667978e+02 +886 973 -8.507888885505199e+02 +886 974 -8.023274760830702e+02 +886 975 -7.211778000851822e+02 +886 976 -6.289529049931513e+02 +886 977 -5.429674662554836e+02 +886 978 -4.725808574370910e+02 +886 979 -4.208084537187723e+02 +886 980 -3.873813675510154e+02 +886 981 -3.710963518270349e+02 +887 802 -9.695072463564467e+02 +887 803 -1.032880208377977e+03 +887 804 -1.168677565678393e+03 +887 805 -1.394551574360516e+03 +887 806 -1.733190400658708e+03 +887 807 -2.199157547087190e+03 +887 808 -2.767706810094291e+03 +887 809 -3.331754877699595e+03 +887 810 -3.699147964795159e+03 +887 946 -3.699147964795159e+03 +887 947 -3.331754877699595e+03 +887 948 -2.767706810094291e+03 +887 949 -2.199157547087190e+03 +887 950 -1.733190400658708e+03 +887 951 -1.394551574360516e+03 +887 952 -1.168677565678393e+03 +887 953 -1.032880208377977e+03 +887 954 -9.695072463564467e+02 +887 973 -1.015511306612463e+03 +887 974 -9.536070604341750e+02 +887 975 -8.507888885505199e+02 +887 976 -7.352796046183660e+02 +887 977 -6.289529049931513e+02 +887 978 -5.429674662554836e+02 +887 979 -4.803677035258846e+02 +887 980 -4.402579127124382e+02 +887 981 -4.208084537187723e+02 +888 802 -8.148024630667978e+02 +888 803 -8.643348602446105e+02 +888 804 -9.695072463564467e+02 +888 805 -1.141773184361051e+03 +888 806 -1.394551574360516e+03 +888 807 -1.733190400658708e+03 +888 808 -2.134265778758337e+03 +888 809 -2.521021940438013e+03 +888 810 -2.767706810094291e+03 +888 946 -5.136224430633812e+03 +888 947 -4.560278038130793e+03 +888 948 -3.699147964795159e+03 +888 949 -2.861294172280315e+03 +888 950 -2.199157547087190e+03 +888 951 -1.733190400658708e+03 +888 952 -1.430197816180116e+03 +888 953 -1.251286952144480e+03 +888 954 -1.168677565678393e+03 +888 973 -1.228588660544043e+03 +888 974 -1.148042053110076e+03 +888 975 -1.015511306612463e+03 +888 976 -8.685786765383741e+02 +888 977 -7.352796046183660e+02 +888 978 -6.289529049931513e+02 +888 979 -5.524312223207834e+02 +888 980 -5.038180997021776e+02 +888 981 -4.803677035258846e+02 +889 802 -7.058924559832891e+02 +889 803 -7.463158073460687e+02 +889 804 -8.315436028021828e+02 +889 805 -9.695072463564467e+02 +889 806 -1.168677565678393e+03 +889 807 -1.430197816180116e+03 +889 808 -1.733190400658708e+03 +889 809 -2.019368486704435e+03 +889 810 -2.199157547087190e+03 +889 946 -7.138491575686227e+03 +889 947 -6.235592529048601e+03 +889 948 -4.925216936196723e+03 +889 949 -3.699147964795159e+03 +889 950 -2.767706810094291e+03 +889 951 -2.134265778758337e+03 +889 952 -1.733190400658708e+03 +889 953 -1.500725861549673e+03 +889 954 -1.394551574360516e+03 +889 973 -1.471477730866021e+03 +889 974 -1.368148367306964e+03 +889 975 -1.199743197084304e+03 +889 976 -1.015511306612463e+03 +889 977 -8.507888885505199e+02 +889 978 -7.211778000851822e+02 +889 979 -6.289529049931513e+02 +889 980 -5.708523475060541e+02 +889 981 -5.429674662554836e+02 +890 802 -6.378158089920689e+02 +890 803 -6.728335244699299e+02 +890 804 -7.463158073460687e+02 +890 805 -8.643348602446105e+02 +890 806 -1.032880208377977e+03 +890 807 -1.251286952144480e+03 +890 808 -1.500725861549673e+03 +890 809 -1.733190400658708e+03 +890 810 -1.877824568765008e+03 +890 946 -9.405703259334558e+03 +890 947 -8.091232579773156e+03 +890 948 -6.235592529048601e+03 +890 949 -4.560278038130793e+03 +890 950 -3.331754877699595e+03 +890 951 -2.521021940438013e+03 +890 952 -2.019368486704435e+03 +890 953 -1.733190400658708e+03 +890 954 -1.603684467943639e+03 +890 973 -1.697437739078442e+03 +890 974 -1.571600895131404e+03 +890 975 -1.368148367306964e+03 +890 976 -1.148042053110076e+03 +890 977 -9.536070604341750e+02 +890 978 -8.023274760830702e+02 +890 979 -6.956816209337401e+02 +890 980 -6.289529049931513e+02 +890 981 -5.970589583440841e+02 +891 802 -6.052974323170231e+02 +891 803 -6.378158089920689e+02 +891 804 -7.058924559832891e+02 +891 805 -8.148024630667978e+02 +891 806 -9.695072463564467e+02 +891 807 -1.168677565678393e+03 +891 808 -1.394551574360516e+03 +891 809 -1.603684467943639e+03 +891 810 -1.733190400658708e+03 +891 946 -1.103972130715905e+04 +891 947 -9.405703259334558e+03 +891 948 -7.138491575686227e+03 +891 949 -5.136224430633812e+03 +891 950 -3.699147964795159e+03 +891 951 -2.767706810094291e+03 +891 952 -2.199157547087190e+03 +891 953 -1.877824568765008e+03 +891 954 -1.733190400658708e+03 +891 973 -1.837845240586523e+03 +891 974 -1.697437739078442e+03 +891 975 -1.471477730866021e+03 +891 976 -1.228588660544043e+03 +891 977 -1.015511306612463e+03 +891 978 -8.507888885505199e+02 +891 979 -7.352796046183660e+02 +891 980 -6.632839990295092e+02 +891 981 -6.289529049931513e+02 +910 802 -6.289529049931513e+02 +910 803 -6.632839990295092e+02 +910 804 -7.352796046183660e+02 +910 805 -8.507888885505199e+02 +910 806 -1.015511306612463e+03 +910 807 -1.228588660544043e+03 +910 808 -1.471477730866021e+03 +910 809 -1.697437739078442e+03 +910 810 -1.837845240586523e+03 +910 829 -1.733190400658708e+03 +910 830 -1.877824568765008e+03 +910 831 -2.199157547087190e+03 +910 832 -2.767706810094291e+03 +910 833 -3.699147964795159e+03 +910 834 -5.136224430633812e+03 +910 835 -7.138491575686227e+03 +910 836 -9.405703259334558e+03 +910 837 -1.103972130715905e+04 +910 973 -1.733190400658708e+03 +910 974 -1.603684467943639e+03 +910 975 -1.394551574360516e+03 +910 976 -1.168677565678393e+03 +910 977 -9.695072463564467e+02 +910 978 -8.148024630667978e+02 +910 979 -7.058924559832891e+02 +910 980 -6.378158089920689e+02 +910 981 -6.052974323170231e+02 +911 802 -5.970589583440841e+02 +911 803 -6.289529049931513e+02 +911 804 -6.956816209337401e+02 +911 805 -8.023274760830702e+02 +911 806 -9.536070604341750e+02 +911 807 -1.148042053110076e+03 +911 808 -1.368148367306964e+03 +911 809 -1.571600895131404e+03 +911 810 -1.697437739078442e+03 +911 829 -1.603684467943639e+03 +911 830 -1.733190400658708e+03 +911 831 -2.019368486704435e+03 +911 832 -2.521021940438013e+03 +911 833 -3.331754877699595e+03 +911 834 -4.560278038130793e+03 +911 835 -6.235592529048601e+03 +911 836 -8.091232579773156e+03 +911 837 -9.405703259334558e+03 +911 973 -1.877824568765008e+03 +911 974 -1.733190400658708e+03 +911 975 -1.500725861549673e+03 +911 976 -1.251286952144480e+03 +911 977 -1.032880208377977e+03 +911 978 -8.643348602446105e+02 +911 979 -7.463158073460687e+02 +911 980 -6.728335244699299e+02 +911 981 -6.378158089920689e+02 +912 802 -5.429674662554836e+02 +912 803 -5.708523475060541e+02 +912 804 -6.289529049931513e+02 +912 805 -7.211778000851822e+02 +912 806 -8.507888885505199e+02 +912 807 -1.015511306612463e+03 +912 808 -1.199743197084304e+03 +912 809 -1.368148367306964e+03 +912 810 -1.471477730866021e+03 +912 829 -1.394551574360516e+03 +912 830 -1.500725861549673e+03 +912 831 -1.733190400658708e+03 +912 832 -2.134265778758337e+03 +912 833 -2.767706810094291e+03 +912 834 -3.699147964795159e+03 +912 835 -4.925216936196723e+03 +912 836 -6.235592529048601e+03 +912 837 -7.138491575686227e+03 +912 973 -2.199157547087190e+03 +912 974 -2.019368486704435e+03 +912 975 -1.733190400658708e+03 +912 976 -1.430197816180116e+03 +912 977 -1.168677565678393e+03 +912 978 -9.695072463564467e+02 +912 979 -8.315436028021828e+02 +912 980 -7.463158073460687e+02 +912 981 -7.058924559832891e+02 +913 802 -4.803677035258846e+02 +913 803 -5.038180997021776e+02 +913 804 -5.524312223207834e+02 +913 805 -6.289529049931513e+02 +913 806 -7.352796046183660e+02 +913 807 -8.685786765383741e+02 +913 808 -1.015511306612463e+03 +913 809 -1.148042053110076e+03 +913 810 -1.228588660544043e+03 +913 829 -1.168677565678393e+03 +913 830 -1.251286952144480e+03 +913 831 -1.430197816180116e+03 +913 832 -1.733190400658708e+03 +913 833 -2.199157547087190e+03 +913 834 -2.861294172280315e+03 +913 835 -3.699147964795159e+03 +913 836 -4.560278038130793e+03 +913 837 -5.136224430633812e+03 +913 973 -2.767706810094291e+03 +913 974 -2.521021940438013e+03 +913 975 -2.134265778758337e+03 +913 976 -1.733190400658708e+03 +913 977 -1.394551574360516e+03 +913 978 -1.141773184361051e+03 +913 979 -9.695072463564467e+02 +913 980 -8.643348602446105e+02 +913 981 -8.148024630667978e+02 +914 802 -4.208084537187723e+02 +914 803 -4.402579127124382e+02 +914 804 -4.803677035258846e+02 +914 805 -5.429674662554836e+02 +914 806 -6.289529049931513e+02 +914 807 -7.352796046183660e+02 +914 808 -8.507888885505199e+02 +914 809 -9.536070604341750e+02 +914 810 -1.015511306612463e+03 +914 829 -9.695072463564467e+02 +914 830 -1.032880208377977e+03 +914 831 -1.168677565678393e+03 +914 832 -1.394551574360516e+03 +914 833 -1.733190400658708e+03 +914 834 -2.199157547087190e+03 +914 835 -2.767706810094291e+03 +914 836 -3.331754877699595e+03 +914 837 -3.699147964795159e+03 +914 973 -3.699147964795159e+03 +914 974 -3.331754877699595e+03 +914 975 -2.767706810094291e+03 +914 976 -2.199157547087190e+03 +914 977 -1.733190400658708e+03 +914 978 -1.394551574360516e+03 +914 979 -1.168677565678393e+03 +914 980 -1.032880208377977e+03 +914 981 -9.695072463564467e+02 +915 802 -3.710963518270349e+02 +915 803 -3.873813675510154e+02 +915 804 -4.208084537187723e+02 +915 805 -4.725808574370910e+02 +915 806 -5.429674662554836e+02 +915 807 -6.289529049931513e+02 +915 808 -7.211778000851822e+02 +915 809 -8.023274760830702e+02 +915 810 -8.507888885505199e+02 +915 829 -8.148024630667978e+02 +915 830 -8.643348602446105e+02 +915 831 -9.695072463564467e+02 +915 832 -1.141773184361051e+03 +915 833 -1.394551574360516e+03 +915 834 -1.733190400658708e+03 +915 835 -2.134265778758337e+03 +915 836 -2.521021940438013e+03 +915 837 -2.767706810094291e+03 +915 973 -5.136224430633812e+03 +915 974 -4.560278038130793e+03 +915 975 -3.699147964795159e+03 +915 976 -2.861294172280315e+03 +915 977 -2.199157547087190e+03 +915 978 -1.733190400658708e+03 +915 979 -1.430197816180116e+03 +915 980 -1.251286952144480e+03 +915 981 -1.168677565678393e+03 +916 802 -3.339204550667995e+02 +916 803 -3.479505460244110e+02 +916 804 -3.766415408901786e+02 +916 805 -4.208084537187723e+02 +916 806 -4.803677035258846e+02 +916 807 -5.524312223207834e+02 +916 808 -6.289529049931513e+02 +916 809 -6.956816209337401e+02 +916 810 -7.352796046183660e+02 +916 829 -7.058924559832891e+02 +916 830 -7.463158073460687e+02 +916 831 -8.315436028021828e+02 +916 832 -9.695072463564467e+02 +916 833 -1.168677565678393e+03 +916 834 -1.430197816180116e+03 +916 835 -1.733190400658708e+03 +916 836 -2.019368486704435e+03 +916 837 -2.199157547087190e+03 +916 973 -7.138491575686227e+03 +916 974 -6.235592529048601e+03 +916 975 -4.925216936196723e+03 +916 976 -3.699147964795159e+03 +916 977 -2.767706810094291e+03 +916 978 -2.134265778758337e+03 +916 979 -1.733190400658708e+03 +916 980 -1.500725861549673e+03 +916 981 -1.394551574360516e+03 +917 802 -3.096178268240471e+02 +917 803 -3.222285372305477e+02 +917 804 -3.479505460244110e+02 +917 805 -3.873813675510154e+02 +917 806 -4.402579127124382e+02 +917 807 -5.038180997021776e+02 +917 808 -5.708523475060541e+02 +917 809 -6.289529049931513e+02 +917 810 -6.632839990295092e+02 +917 829 -6.378158089920689e+02 +917 830 -6.728335244699299e+02 +917 831 -7.463158073460687e+02 +917 832 -8.643348602446105e+02 +917 833 -1.032880208377977e+03 +917 834 -1.251286952144480e+03 +917 835 -1.500725861549673e+03 +917 836 -1.733190400658708e+03 +917 837 -1.877824568765008e+03 +917 973 -9.405703259334558e+03 +917 974 -8.091232579773156e+03 +917 975 -6.235592529048601e+03 +917 976 -4.560278038130793e+03 +917 977 -3.331754877699595e+03 +917 978 -2.521021940438013e+03 +917 979 -2.019368486704435e+03 +917 980 -1.733190400658708e+03 +917 981 -1.603684467943639e+03 +918 802 -2.976873911031311e+02 +918 803 -3.096178268240471e+02 +918 804 -3.339204550667995e+02 +918 805 -3.710963518270349e+02 +918 806 -4.208084537187723e+02 +918 807 -4.803677035258846e+02 +918 808 -5.429674662554836e+02 +918 809 -5.970589583440841e+02 +918 810 -6.289529049931513e+02 +918 829 -6.052974323170231e+02 +918 830 -6.378158089920689e+02 +918 831 -7.058924559832891e+02 +918 832 -8.148024630667978e+02 +918 833 -9.695072463564467e+02 +918 834 -1.168677565678393e+03 +918 835 -1.394551574360516e+03 +918 836 -1.603684467943639e+03 +918 837 -1.733190400658708e+03 +918 973 -1.103972130715905e+04 +918 974 -9.405703259334558e+03 +918 975 -7.138491575686227e+03 +918 976 -5.136224430633812e+03 +918 977 -3.699147964795159e+03 +918 978 -2.767706810094291e+03 +918 979 -2.199157547087190e+03 +918 980 -1.877824568765008e+03 +918 981 -1.733190400658708e+03 +937 730 -1.111842160419089e+02 +937 731 -1.170681125153374e+02 +937 732 -1.293661657908652e+02 +937 733 -1.489885081652994e+02 +937 734 -1.767605489846857e+02 +937 735 -2.123577731150844e+02 +937 736 -2.525366109215767e+02 +937 737 -2.895745815575327e+02 +937 738 -3.124380547854544e+02 +937 793 -3.063876713483004e+02 +937 794 -3.311617365195740e+02 +937 795 -3.859179776157605e+02 +937 796 -4.819366867771678e+02 +937 797 -6.371952057562402e+02 +937 798 -8.726231103602329e+02 +937 799 -1.193932486839834e+03 +937 800 -1.550121445008512e+03 +937 801 -1.802596433195456e+03 +937 1072 -3.063876713483004e+02 +937 1073 -2.841326260213861e+02 +937 1074 -2.480403651673271e+02 +937 1075 -2.088271183655453e+02 +937 1076 -1.740274317161707e+02 +937 1077 -1.468355065336025e+02 +937 1078 -1.275984131219179e+02 +937 1079 -1.155304899028560e+02 +937 1080 -1.097534196790493e+02 +938 730 -1.057061586526020e+02 +938 731 -1.111842160419089e+02 +938 732 -1.226088998409726e+02 +938 733 -1.407716848553633e+02 +938 734 -1.663510232448635e+02 +938 735 -1.989422168423268e+02 +938 736 -2.354925657825778e+02 +938 737 -2.689865983609328e+02 +938 738 -2.895745815575327e+02 +938 793 -2.841326260213861e+02 +938 794 -3.063876713483004e+02 +938 795 -3.553280674768362e+02 +938 796 -4.404031329187433e+02 +938 797 -5.762343277298883e+02 +938 798 -7.788097592344268e+02 +938 799 -1.049909849375152e+03 +938 800 -1.344510568096313e+03 +938 801 -1.550121445008512e+03 +938 1072 -3.311617365195740e+02 +938 1073 -3.063876713483004e+02 +938 1074 -2.663884709281890e+02 +938 1075 -2.231981844606885e+02 +938 1076 -1.851243485745370e+02 +938 1077 -1.555580782497810e+02 +938 1078 -1.347481526436476e+02 +938 1079 -1.217424124188379e+02 +938 1080 -1.155304899028560e+02 +939 730 -9.638822517401589e+01 +939 731 -1.011961191083174e+02 +939 732 -1.111842160419089e+02 +939 733 -1.269615920628683e+02 +939 734 -1.489885081652992e+02 +939 735 -1.767605489846853e+02 +939 736 -2.075588680195229e+02 +939 737 -2.354925657825778e+02 +939 738 -2.525366109215767e+02 +939 793 -2.480403651673271e+02 +939 794 -2.663884709281890e+02 +939 795 -3.063876713483004e+02 +939 796 -3.748904053829394e+02 +939 797 -4.819366867771664e+02 +939 798 -6.371952057562384e+02 +939 799 -8.383319685358435e+02 +939 800 -1.049909849375152e+03 +939 801 -1.193932486839834e+03 +939 1072 -3.859179776157605e+02 +939 1073 -3.553280674768362e+02 +939 1074 -3.063876713483004e+02 +939 1075 -2.542062119667733e+02 +939 1076 -2.088271183655457e+02 +939 1077 -1.740274317161710e+02 +939 1078 -1.497853840269160e+02 +939 1079 -1.347481526436476e+02 +939 1080 -1.275984131219179e+02 +940 730 -8.555928471614145e+01 +940 731 -8.962181586287865e+01 +940 732 -9.802102195827709e+01 +940 733 -1.111842160419089e+02 +940 734 -1.293661657908650e+02 +940 735 -1.519993633210925e+02 +940 736 -1.767605489846853e+02 +940 737 -1.989422168423268e+02 +940 738 -2.123577731150844e+02 +940 793 -2.088271183655453e+02 +940 794 -2.231981844606885e+02 +940 795 -2.542062119667733e+02 +940 796 -3.063876713483004e+02 +940 797 -3.859179776157595e+02 +940 798 -4.976453857371580e+02 +940 799 -6.371952057562384e+02 +940 800 -7.788097592344268e+02 +940 801 -8.726231103602329e+02 +940 1072 -4.819366867771678e+02 +940 1073 -4.404031329187433e+02 +940 1074 -3.748904053829394e+02 +940 1075 -3.063876713483004e+02 +940 1076 -2.480403651673276e+02 +940 1077 -2.041390437321801e+02 +940 1078 -1.740274317161710e+02 +940 1079 -1.555580782497810e+02 +940 1080 -1.468355065336025e+02 +941 730 -7.520762033775921e+01 +941 731 -7.859349409841361e+01 +941 732 -8.555928471614156e+01 +941 733 -9.638822517401600e+01 +941 734 -1.111842160419089e+02 +941 735 -1.293661657908650e+02 +941 736 -1.489885081652992e+02 +941 737 -1.663510232448635e+02 +941 738 -1.767605489846857e+02 +941 793 -1.740274317161707e+02 +941 794 -1.851243485745370e+02 +941 795 -2.088271183655457e+02 +941 796 -2.480403651673276e+02 +941 797 -3.063876713483004e+02 +941 798 -3.859179776157595e+02 +941 799 -4.819366867771664e+02 +941 800 -5.762343277298883e+02 +941 801 -6.371952057562402e+02 +941 1072 -6.371952057562402e+02 +941 1073 -5.762343277298883e+02 +941 1074 -4.819366867771664e+02 +941 1075 -3.859179776157595e+02 +941 1076 -3.063876713483004e+02 +941 1077 -2.480403651673276e+02 +941 1078 -2.088271183655457e+02 +941 1079 -1.851243485745370e+02 +941 1080 -1.740274317161707e+02 +942 730 -6.652797451218332e+01 +942 731 -6.937545782864687e+01 +942 732 -7.520762033775929e+01 +942 733 -8.420868002944924e+01 +942 734 -9.638822517401600e+01 +942 735 -1.111842160419089e+02 +942 736 -1.269615920628683e+02 +942 737 -1.407716848553633e+02 +942 738 -1.489885081652994e+02 +942 793 -1.468355065336025e+02 +942 794 -1.555580782497810e+02 +942 795 -1.740274317161710e+02 +942 796 -2.041390437321801e+02 +942 797 -2.480403651673276e+02 +942 798 -3.063876713483004e+02 +942 799 -3.748904053829394e+02 +942 800 -4.404031329187433e+02 +942 801 -4.819366867771678e+02 +942 1072 -8.726231103602329e+02 +942 1073 -7.788097592344268e+02 +942 1074 -6.371952057562384e+02 +942 1075 -4.976453857371580e+02 +942 1076 -3.859179776157595e+02 +942 1077 -3.063876713483004e+02 +942 1078 -2.542062119667733e+02 +942 1079 -2.231981844606885e+02 +942 1080 -2.088271183655453e+02 +943 730 -6.001174723167335e+01 +943 731 -6.247361649834816e+01 +943 732 -6.749803222962952e+01 +943 733 -7.520762033775929e+01 +943 734 -8.555928471614156e+01 +943 735 -9.802102195827709e+01 +943 736 -1.111842160419089e+02 +943 737 -1.226088998409726e+02 +943 738 -1.293661657908652e+02 +943 793 -1.275984131219179e+02 +943 794 -1.347481526436476e+02 +943 795 -1.497853840269160e+02 +943 796 -1.740274317161710e+02 +943 797 -2.088271183655457e+02 +943 798 -2.542062119667733e+02 +943 799 -3.063876713483004e+02 +943 800 -3.553280674768362e+02 +943 801 -3.859179776157605e+02 +943 1072 -1.193932486839834e+03 +943 1073 -1.049909849375152e+03 +943 1074 -8.383319685358435e+02 +943 1075 -6.371952057562384e+02 +943 1076 -4.819366867771664e+02 +943 1077 -3.748904053829394e+02 +943 1078 -3.063876713483004e+02 +943 1079 -2.663884709281890e+02 +943 1080 -2.480403651673271e+02 +944 730 -5.573941364116933e+01 +944 731 -5.795761808209188e+01 +944 732 -6.247361649834816e+01 +944 733 -6.937545782864687e+01 +944 734 -7.859349409841361e+01 +944 735 -8.962181586287865e+01 +944 736 -1.011961191083174e+02 +944 737 -1.111842160419089e+02 +944 738 -1.170681125153374e+02 +944 793 -1.155304899028560e+02 +944 794 -1.217424124188379e+02 +944 795 -1.347481526436476e+02 +944 796 -1.555580782497810e+02 +944 797 -1.851243485745370e+02 +944 798 -2.231981844606885e+02 +944 799 -2.663884709281890e+02 +944 800 -3.063876713483004e+02 +944 801 -3.311617365195740e+02 +944 1072 -1.550121445008512e+03 +944 1073 -1.344510568096313e+03 +944 1074 -1.049909849375152e+03 +944 1075 -7.788097592344268e+02 +944 1076 -5.762343277298883e+02 +944 1077 -4.404031329187433e+02 +944 1078 -3.553280674768362e+02 +944 1079 -3.063876713483004e+02 +944 1080 -2.841326260213861e+02 +945 730 -5.363826960242956e+01 +945 731 -5.573941364116933e+01 +945 732 -6.001174723167335e+01 +945 733 -6.652797451218332e+01 +945 734 -7.520762033775921e+01 +945 735 -8.555928471614145e+01 +945 736 -9.638822517401589e+01 +945 737 -1.057061586526020e+02 +945 738 -1.111842160419089e+02 +945 793 -1.097534196790493e+02 +945 794 -1.155304899028560e+02 +945 795 -1.275984131219179e+02 +945 796 -1.468355065336025e+02 +945 797 -1.740274317161707e+02 +945 798 -2.088271183655453e+02 +945 799 -2.480403651673271e+02 +945 800 -2.841326260213861e+02 +945 801 -3.063876713483004e+02 +945 1072 -1.802596433195456e+03 +945 1073 -1.550121445008512e+03 +945 1074 -1.193932486839834e+03 +945 1075 -8.726231103602329e+02 +945 1076 -6.371952057562402e+02 +945 1077 -4.819366867771678e+02 +945 1078 -3.859179776157605e+02 +945 1079 -3.311617365195740e+02 +945 1080 -3.063876713483004e+02 +946 883 -1.733190400658708e+03 +946 884 -1.877824568765008e+03 +946 885 -2.199157547087190e+03 +946 886 -2.767706810094291e+03 +946 887 -3.699147964795159e+03 +946 888 -5.136224430633812e+03 +946 889 -7.138491575686227e+03 +946 890 -9.405703259334558e+03 +946 891 -1.103972130715905e+04 +946 1018 -1.733190400658708e+03 +946 1019 -1.603684467943639e+03 +946 1020 -1.394551574360516e+03 +946 1021 -1.168677565678393e+03 +946 1022 -9.695072463564467e+02 +946 1023 -8.148024630667978e+02 +946 1024 -7.058924559832891e+02 +946 1025 -6.378158089920689e+02 +946 1026 -6.052974323170231e+02 +946 1045 -6.289529049931513e+02 +946 1046 -5.970589583440841e+02 +946 1047 -5.429674662554836e+02 +946 1048 -4.803677035258846e+02 +946 1049 -4.208084537187723e+02 +946 1050 -3.710963518270349e+02 +946 1051 -3.339204550667995e+02 +946 1052 -3.096178268240471e+02 +946 1053 -2.976873911031311e+02 +947 883 -1.603684467943639e+03 +947 884 -1.733190400658708e+03 +947 885 -2.019368486704435e+03 +947 886 -2.521021940438013e+03 +947 887 -3.331754877699595e+03 +947 888 -4.560278038130793e+03 +947 889 -6.235592529048601e+03 +947 890 -8.091232579773156e+03 +947 891 -9.405703259334558e+03 +947 1018 -1.877824568765008e+03 +947 1019 -1.733190400658708e+03 +947 1020 -1.500725861549673e+03 +947 1021 -1.251286952144480e+03 +947 1022 -1.032880208377977e+03 +947 1023 -8.643348602446105e+02 +947 1024 -7.463158073460687e+02 +947 1025 -6.728335244699299e+02 +947 1026 -6.378158089920689e+02 +947 1045 -6.632839990295092e+02 +947 1046 -6.289529049931513e+02 +947 1047 -5.708523475060541e+02 +947 1048 -5.038180997021776e+02 +947 1049 -4.402579127124382e+02 +947 1050 -3.873813675510154e+02 +947 1051 -3.479505460244110e+02 +947 1052 -3.222285372305477e+02 +947 1053 -3.096178268240471e+02 +948 883 -1.394551574360516e+03 +948 884 -1.500725861549673e+03 +948 885 -1.733190400658708e+03 +948 886 -2.134265778758337e+03 +948 887 -2.767706810094291e+03 +948 888 -3.699147964795159e+03 +948 889 -4.925216936196723e+03 +948 890 -6.235592529048601e+03 +948 891 -7.138491575686227e+03 +948 1018 -2.199157547087190e+03 +948 1019 -2.019368486704435e+03 +948 1020 -1.733190400658708e+03 +948 1021 -1.430197816180116e+03 +948 1022 -1.168677565678393e+03 +948 1023 -9.695072463564467e+02 +948 1024 -8.315436028021828e+02 +948 1025 -7.463158073460687e+02 +948 1026 -7.058924559832891e+02 +948 1045 -7.352796046183660e+02 +948 1046 -6.956816209337401e+02 +948 1047 -6.289529049931513e+02 +948 1048 -5.524312223207834e+02 +948 1049 -4.803677035258846e+02 +948 1050 -4.208084537187723e+02 +948 1051 -3.766415408901786e+02 +948 1052 -3.479505460244110e+02 +948 1053 -3.339204550667995e+02 +949 883 -1.168677565678393e+03 +949 884 -1.251286952144480e+03 +949 885 -1.430197816180116e+03 +949 886 -1.733190400658708e+03 +949 887 -2.199157547087190e+03 +949 888 -2.861294172280315e+03 +949 889 -3.699147964795159e+03 +949 890 -4.560278038130793e+03 +949 891 -5.136224430633812e+03 +949 1018 -2.767706810094291e+03 +949 1019 -2.521021940438013e+03 +949 1020 -2.134265778758337e+03 +949 1021 -1.733190400658708e+03 +949 1022 -1.394551574360516e+03 +949 1023 -1.141773184361051e+03 +949 1024 -9.695072463564467e+02 +949 1025 -8.643348602446105e+02 +949 1026 -8.148024630667978e+02 +949 1045 -8.507888885505199e+02 +949 1046 -8.023274760830702e+02 +949 1047 -7.211778000851822e+02 +949 1048 -6.289529049931513e+02 +949 1049 -5.429674662554836e+02 +949 1050 -4.725808574370910e+02 +949 1051 -4.208084537187723e+02 +949 1052 -3.873813675510154e+02 +949 1053 -3.710963518270349e+02 +950 883 -9.695072463564467e+02 +950 884 -1.032880208377977e+03 +950 885 -1.168677565678393e+03 +950 886 -1.394551574360516e+03 +950 887 -1.733190400658708e+03 +950 888 -2.199157547087190e+03 +950 889 -2.767706810094291e+03 +950 890 -3.331754877699595e+03 +950 891 -3.699147964795159e+03 +950 1018 -3.699147964795159e+03 +950 1019 -3.331754877699595e+03 +950 1020 -2.767706810094291e+03 +950 1021 -2.199157547087190e+03 +950 1022 -1.733190400658708e+03 +950 1023 -1.394551574360516e+03 +950 1024 -1.168677565678393e+03 +950 1025 -1.032880208377977e+03 +950 1026 -9.695072463564467e+02 +950 1045 -1.015511306612463e+03 +950 1046 -9.536070604341750e+02 +950 1047 -8.507888885505199e+02 +950 1048 -7.352796046183660e+02 +950 1049 -6.289529049931513e+02 +950 1050 -5.429674662554836e+02 +950 1051 -4.803677035258846e+02 +950 1052 -4.402579127124382e+02 +950 1053 -4.208084537187723e+02 +951 883 -8.148024630667978e+02 +951 884 -8.643348602446105e+02 +951 885 -9.695072463564467e+02 +951 886 -1.141773184361051e+03 +951 887 -1.394551574360516e+03 +951 888 -1.733190400658708e+03 +951 889 -2.134265778758337e+03 +951 890 -2.521021940438013e+03 +951 891 -2.767706810094291e+03 +951 1018 -5.136224430633812e+03 +951 1019 -4.560278038130793e+03 +951 1020 -3.699147964795159e+03 +951 1021 -2.861294172280315e+03 +951 1022 -2.199157547087190e+03 +951 1023 -1.733190400658708e+03 +951 1024 -1.430197816180116e+03 +951 1025 -1.251286952144480e+03 +951 1026 -1.168677565678393e+03 +951 1045 -1.228588660544043e+03 +951 1046 -1.148042053110076e+03 +951 1047 -1.015511306612463e+03 +951 1048 -8.685786765383741e+02 +951 1049 -7.352796046183660e+02 +951 1050 -6.289529049931513e+02 +951 1051 -5.524312223207834e+02 +951 1052 -5.038180997021776e+02 +951 1053 -4.803677035258846e+02 +952 883 -7.058924559832891e+02 +952 884 -7.463158073460687e+02 +952 885 -8.315436028021828e+02 +952 886 -9.695072463564467e+02 +952 887 -1.168677565678393e+03 +952 888 -1.430197816180116e+03 +952 889 -1.733190400658708e+03 +952 890 -2.019368486704435e+03 +952 891 -2.199157547087190e+03 +952 1018 -7.138491575686227e+03 +952 1019 -6.235592529048601e+03 +952 1020 -4.925216936196723e+03 +952 1021 -3.699147964795159e+03 +952 1022 -2.767706810094291e+03 +952 1023 -2.134265778758337e+03 +952 1024 -1.733190400658708e+03 +952 1025 -1.500725861549673e+03 +952 1026 -1.394551574360516e+03 +952 1045 -1.471477730866021e+03 +952 1046 -1.368148367306964e+03 +952 1047 -1.199743197084304e+03 +952 1048 -1.015511306612463e+03 +952 1049 -8.507888885505199e+02 +952 1050 -7.211778000851822e+02 +952 1051 -6.289529049931513e+02 +952 1052 -5.708523475060541e+02 +952 1053 -5.429674662554836e+02 +953 883 -6.378158089920689e+02 +953 884 -6.728335244699299e+02 +953 885 -7.463158073460687e+02 +953 886 -8.643348602446105e+02 +953 887 -1.032880208377977e+03 +953 888 -1.251286952144480e+03 +953 889 -1.500725861549673e+03 +953 890 -1.733190400658708e+03 +953 891 -1.877824568765008e+03 +953 1018 -9.405703259334558e+03 +953 1019 -8.091232579773156e+03 +953 1020 -6.235592529048601e+03 +953 1021 -4.560278038130793e+03 +953 1022 -3.331754877699595e+03 +953 1023 -2.521021940438013e+03 +953 1024 -2.019368486704435e+03 +953 1025 -1.733190400658708e+03 +953 1026 -1.603684467943639e+03 +953 1045 -1.697437739078442e+03 +953 1046 -1.571600895131404e+03 +953 1047 -1.368148367306964e+03 +953 1048 -1.148042053110076e+03 +953 1049 -9.536070604341750e+02 +953 1050 -8.023274760830702e+02 +953 1051 -6.956816209337401e+02 +953 1052 -6.289529049931513e+02 +953 1053 -5.970589583440841e+02 +954 883 -6.052974323170231e+02 +954 884 -6.378158089920689e+02 +954 885 -7.058924559832891e+02 +954 886 -8.148024630667978e+02 +954 887 -9.695072463564467e+02 +954 888 -1.168677565678393e+03 +954 889 -1.394551574360516e+03 +954 890 -1.603684467943639e+03 +954 891 -1.733190400658708e+03 +954 1018 -1.103972130715905e+04 +954 1019 -9.405703259334558e+03 +954 1020 -7.138491575686227e+03 +954 1021 -5.136224430633812e+03 +954 1022 -3.699147964795159e+03 +954 1023 -2.767706810094291e+03 +954 1024 -2.199157547087190e+03 +954 1025 -1.877824568765008e+03 +954 1026 -1.733190400658708e+03 +954 1045 -1.837845240586523e+03 +954 1046 -1.697437739078442e+03 +954 1047 -1.471477730866021e+03 +954 1048 -1.228588660544043e+03 +954 1049 -1.015511306612463e+03 +954 1050 -8.507888885505199e+02 +954 1051 -7.352796046183660e+02 +954 1052 -6.632839990295092e+02 +954 1053 -6.289529049931513e+02 +973 883 -6.289529049931513e+02 +973 884 -6.632839990295092e+02 +973 885 -7.352796046183660e+02 +973 886 -8.507888885505199e+02 +973 887 -1.015511306612463e+03 +973 888 -1.228588660544043e+03 +973 889 -1.471477730866021e+03 +973 890 -1.697437739078442e+03 +973 891 -1.837845240586523e+03 +973 910 -1.733190400658708e+03 +973 911 -1.877824568765008e+03 +973 912 -2.199157547087190e+03 +973 913 -2.767706810094291e+03 +973 914 -3.699147964795159e+03 +973 915 -5.136224430633812e+03 +973 916 -7.138491575686227e+03 +973 917 -9.405703259334558e+03 +973 918 -1.103972130715905e+04 +973 1045 -1.733190400658708e+03 +973 1046 -1.603684467943639e+03 +973 1047 -1.394551574360516e+03 +973 1048 -1.168677565678393e+03 +973 1049 -9.695072463564467e+02 +973 1050 -8.148024630667978e+02 +973 1051 -7.058924559832891e+02 +973 1052 -6.378158089920689e+02 +973 1053 -6.052974323170231e+02 +974 883 -5.970589583440841e+02 +974 884 -6.289529049931513e+02 +974 885 -6.956816209337401e+02 +974 886 -8.023274760830702e+02 +974 887 -9.536070604341750e+02 +974 888 -1.148042053110076e+03 +974 889 -1.368148367306964e+03 +974 890 -1.571600895131404e+03 +974 891 -1.697437739078442e+03 +974 910 -1.603684467943639e+03 +974 911 -1.733190400658708e+03 +974 912 -2.019368486704435e+03 +974 913 -2.521021940438013e+03 +974 914 -3.331754877699595e+03 +974 915 -4.560278038130793e+03 +974 916 -6.235592529048601e+03 +974 917 -8.091232579773156e+03 +974 918 -9.405703259334558e+03 +974 1045 -1.877824568765008e+03 +974 1046 -1.733190400658708e+03 +974 1047 -1.500725861549673e+03 +974 1048 -1.251286952144480e+03 +974 1049 -1.032880208377977e+03 +974 1050 -8.643348602446105e+02 +974 1051 -7.463158073460687e+02 +974 1052 -6.728335244699299e+02 +974 1053 -6.378158089920689e+02 +975 883 -5.429674662554836e+02 +975 884 -5.708523475060541e+02 +975 885 -6.289529049931513e+02 +975 886 -7.211778000851822e+02 +975 887 -8.507888885505199e+02 +975 888 -1.015511306612463e+03 +975 889 -1.199743197084304e+03 +975 890 -1.368148367306964e+03 +975 891 -1.471477730866021e+03 +975 910 -1.394551574360516e+03 +975 911 -1.500725861549673e+03 +975 912 -1.733190400658708e+03 +975 913 -2.134265778758337e+03 +975 914 -2.767706810094291e+03 +975 915 -3.699147964795159e+03 +975 916 -4.925216936196723e+03 +975 917 -6.235592529048601e+03 +975 918 -7.138491575686227e+03 +975 1045 -2.199157547087190e+03 +975 1046 -2.019368486704435e+03 +975 1047 -1.733190400658708e+03 +975 1048 -1.430197816180116e+03 +975 1049 -1.168677565678393e+03 +975 1050 -9.695072463564467e+02 +975 1051 -8.315436028021828e+02 +975 1052 -7.463158073460687e+02 +975 1053 -7.058924559832891e+02 +976 883 -4.803677035258846e+02 +976 884 -5.038180997021776e+02 +976 885 -5.524312223207834e+02 +976 886 -6.289529049931513e+02 +976 887 -7.352796046183660e+02 +976 888 -8.685786765383741e+02 +976 889 -1.015511306612463e+03 +976 890 -1.148042053110076e+03 +976 891 -1.228588660544043e+03 +976 910 -1.168677565678393e+03 +976 911 -1.251286952144480e+03 +976 912 -1.430197816180116e+03 +976 913 -1.733190400658708e+03 +976 914 -2.199157547087190e+03 +976 915 -2.861294172280315e+03 +976 916 -3.699147964795159e+03 +976 917 -4.560278038130793e+03 +976 918 -5.136224430633812e+03 +976 1045 -2.767706810094291e+03 +976 1046 -2.521021940438013e+03 +976 1047 -2.134265778758337e+03 +976 1048 -1.733190400658708e+03 +976 1049 -1.394551574360516e+03 +976 1050 -1.141773184361051e+03 +976 1051 -9.695072463564467e+02 +976 1052 -8.643348602446105e+02 +976 1053 -8.148024630667978e+02 +977 883 -4.208084537187723e+02 +977 884 -4.402579127124382e+02 +977 885 -4.803677035258846e+02 +977 886 -5.429674662554836e+02 +977 887 -6.289529049931513e+02 +977 888 -7.352796046183660e+02 +977 889 -8.507888885505199e+02 +977 890 -9.536070604341750e+02 +977 891 -1.015511306612463e+03 +977 910 -9.695072463564467e+02 +977 911 -1.032880208377977e+03 +977 912 -1.168677565678393e+03 +977 913 -1.394551574360516e+03 +977 914 -1.733190400658708e+03 +977 915 -2.199157547087190e+03 +977 916 -2.767706810094291e+03 +977 917 -3.331754877699595e+03 +977 918 -3.699147964795159e+03 +977 1045 -3.699147964795159e+03 +977 1046 -3.331754877699595e+03 +977 1047 -2.767706810094291e+03 +977 1048 -2.199157547087190e+03 +977 1049 -1.733190400658708e+03 +977 1050 -1.394551574360516e+03 +977 1051 -1.168677565678393e+03 +977 1052 -1.032880208377977e+03 +977 1053 -9.695072463564467e+02 +978 883 -3.710963518270349e+02 +978 884 -3.873813675510154e+02 +978 885 -4.208084537187723e+02 +978 886 -4.725808574370910e+02 +978 887 -5.429674662554836e+02 +978 888 -6.289529049931513e+02 +978 889 -7.211778000851822e+02 +978 890 -8.023274760830702e+02 +978 891 -8.507888885505199e+02 +978 910 -8.148024630667978e+02 +978 911 -8.643348602446105e+02 +978 912 -9.695072463564467e+02 +978 913 -1.141773184361051e+03 +978 914 -1.394551574360516e+03 +978 915 -1.733190400658708e+03 +978 916 -2.134265778758337e+03 +978 917 -2.521021940438013e+03 +978 918 -2.767706810094291e+03 +978 1045 -5.136224430633812e+03 +978 1046 -4.560278038130793e+03 +978 1047 -3.699147964795159e+03 +978 1048 -2.861294172280315e+03 +978 1049 -2.199157547087190e+03 +978 1050 -1.733190400658708e+03 +978 1051 -1.430197816180116e+03 +978 1052 -1.251286952144480e+03 +978 1053 -1.168677565678393e+03 +979 883 -3.339204550667995e+02 +979 884 -3.479505460244110e+02 +979 885 -3.766415408901786e+02 +979 886 -4.208084537187723e+02 +979 887 -4.803677035258846e+02 +979 888 -5.524312223207834e+02 +979 889 -6.289529049931513e+02 +979 890 -6.956816209337401e+02 +979 891 -7.352796046183660e+02 +979 910 -7.058924559832891e+02 +979 911 -7.463158073460687e+02 +979 912 -8.315436028021828e+02 +979 913 -9.695072463564467e+02 +979 914 -1.168677565678393e+03 +979 915 -1.430197816180116e+03 +979 916 -1.733190400658708e+03 +979 917 -2.019368486704435e+03 +979 918 -2.199157547087190e+03 +979 1045 -7.138491575686227e+03 +979 1046 -6.235592529048601e+03 +979 1047 -4.925216936196723e+03 +979 1048 -3.699147964795159e+03 +979 1049 -2.767706810094291e+03 +979 1050 -2.134265778758337e+03 +979 1051 -1.733190400658708e+03 +979 1052 -1.500725861549673e+03 +979 1053 -1.394551574360516e+03 +980 883 -3.096178268240471e+02 +980 884 -3.222285372305477e+02 +980 885 -3.479505460244110e+02 +980 886 -3.873813675510154e+02 +980 887 -4.402579127124382e+02 +980 888 -5.038180997021776e+02 +980 889 -5.708523475060541e+02 +980 890 -6.289529049931513e+02 +980 891 -6.632839990295092e+02 +980 910 -6.378158089920689e+02 +980 911 -6.728335244699299e+02 +980 912 -7.463158073460687e+02 +980 913 -8.643348602446105e+02 +980 914 -1.032880208377977e+03 +980 915 -1.251286952144480e+03 +980 916 -1.500725861549673e+03 +980 917 -1.733190400658708e+03 +980 918 -1.877824568765008e+03 +980 1045 -9.405703259334558e+03 +980 1046 -8.091232579773156e+03 +980 1047 -6.235592529048601e+03 +980 1048 -4.560278038130793e+03 +980 1049 -3.331754877699595e+03 +980 1050 -2.521021940438013e+03 +980 1051 -2.019368486704435e+03 +980 1052 -1.733190400658708e+03 +980 1053 -1.603684467943639e+03 +981 883 -2.976873911031311e+02 +981 884 -3.096178268240471e+02 +981 885 -3.339204550667995e+02 +981 886 -3.710963518270349e+02 +981 887 -4.208084537187723e+02 +981 888 -4.803677035258846e+02 +981 889 -5.429674662554836e+02 +981 890 -5.970589583440841e+02 +981 891 -6.289529049931513e+02 +981 910 -6.052974323170231e+02 +981 911 -6.378158089920689e+02 +981 912 -7.058924559832891e+02 +981 913 -8.148024630667978e+02 +981 914 -9.695072463564467e+02 +981 915 -1.168677565678393e+03 +981 916 -1.394551574360516e+03 +981 917 -1.603684467943639e+03 +981 918 -1.733190400658708e+03 +981 1045 -1.103972130715905e+04 +981 1046 -9.405703259334558e+03 +981 1047 -7.138491575686227e+03 +981 1048 -5.136224430633812e+03 +981 1049 -3.699147964795159e+03 +981 1050 -2.767706810094291e+03 +981 1051 -2.199157547087190e+03 +981 1052 -1.877824568765008e+03 +981 1053 -1.733190400658708e+03 +1000 586 -1.965477828103597e+01 +1000 587 -2.067858569511584e+01 +1000 588 -2.281491025526309e+01 +1000 589 -2.621419542240645e+01 +1000 590 -3.100728135248165e+01 +1000 591 -3.712309913086534e+01 +1000 592 -4.399251628020362e+01 +1000 593 -5.029652653878190e+01 +1000 594 -5.417542964960961e+01 +1000 721 -5.416220002058462e+01 +1000 722 -5.847168336242214e+01 +1000 723 -6.797204698756194e+01 +1000 724 -8.455751811575999e+01 +1000 725 -1.112023202068744e+02 +1000 726 -1.512628164030903e+02 +1000 727 -2.053883607687485e+02 +1000 728 -2.647767438527630e+02 +1000 729 -3.065373731090118e+02 +1000 1288 -5.416220002058462e+01 +1000 1289 -5.028460369863171e+01 +1000 1290 -4.398263164573866e+01 +1000 1291 -3.711530555640490e+01 +1000 1292 -3.100122392289864e+01 +1000 1293 -2.620940698061742e+01 +1000 1294 -2.281096793104268e+01 +1000 1295 -2.067515029553633e+01 +1000 1296 -1.965157861598590e+01 +1001 586 -1.870055440211150e+01 +1001 587 -1.965477828103598e+01 +1001 588 -2.164167292784033e+01 +1001 589 -2.479209926714915e+01 +1001 590 -2.921308657465229e+01 +1001 591 -3.482168460593338e+01 +1001 592 -4.108257963331432e+01 +1001 593 -4.679557686118159e+01 +1001 594 -5.029652653878190e+01 +1001 721 -5.028460369863171e+01 +1001 722 -5.416220002058462e+01 +1001 723 -6.266865647386102e+01 +1001 724 -7.739429142416689e+01 +1001 725 -1.007640600234616e+02 +1001 726 -1.353445496343034e+02 +1001 727 -1.811983282511272e+02 +1001 728 -2.305668762810884e+02 +1001 729 -2.647767438527630e+02 +1001 1288 -5.847168336242214e+01 +1001 1289 -5.416220002058462e+01 +1001 1290 -4.718848846240646e+01 +1001 1291 -3.963467701820890e+01 +1001 1292 -3.295302401855845e+01 +1001 1293 -2.774798050936779e+01 +1001 1294 -2.407490908992506e+01 +1001 1295 -2.177494503977683e+01 +1001 1296 -2.067515029553633e+01 +1002 586 -1.707507926940497e+01 +1002 587 -1.791417887437395e+01 +1002 588 -1.965477828103598e+01 +1002 589 -2.239757409043196e+01 +1002 590 -2.621419542240645e+01 +1002 591 -3.100728135248165e+01 +1002 592 -3.630032063351617e+01 +1002 593 -4.108257963331432e+01 +1002 594 -4.399251628020362e+01 +1002 721 -4.398263164573862e+01 +1002 722 -4.718848846240642e+01 +1002 723 -5.416220002058462e+01 +1002 724 -6.606134132672688e+01 +1002 725 -8.455751811575999e+01 +1002 726 -1.112023202068744e+02 +1002 727 -1.454508347890306e+02 +1002 728 -1.811983282511272e+02 +1002 729 -2.053883607687485e+02 +1002 1288 -6.797204698756194e+01 +1002 1289 -6.266865647386102e+01 +1002 1290 -5.416220002058468e+01 +1002 1291 -4.506046026496946e+01 +1002 1292 -3.711530555640486e+01 +1002 1293 -3.100122392289861e+01 +1002 1294 -2.672989532903557e+01 +1002 1295 -2.407490908992508e+01 +1002 1296 -2.281096793104269e+01 +1003 586 -1.518203609416467e+01 +1003 587 -1.589274010473517e+01 +1003 588 -1.736013665098131e+01 +1003 589 -1.965477828103598e+01 +1003 590 -2.281491025526309e+01 +1003 591 -2.673481743251408e+01 +1003 592 -3.100728135248165e+01 +1003 593 -3.482168460593338e+01 +1003 594 -3.712309913086534e+01 +1003 721 -3.711530555640486e+01 +1003 722 -3.963467701820886e+01 +1003 723 -4.506046026496942e+01 +1003 724 -5.416220002058462e+01 +1003 725 -6.797204698756194e+01 +1003 726 -8.726265053974943e+01 +1003 727 -1.112023202068744e+02 +1003 728 -1.353445496343034e+02 +1003 729 -1.512628164030903e+02 +1003 1288 -8.455751811575999e+01 +1003 1289 -7.739429142416689e+01 +1003 1290 -6.606134132672695e+01 +1003 1291 -5.416220002058468e+01 +1003 1292 -4.398263164573862e+01 +1003 1293 -3.629276779865592e+01 +1003 1294 -3.100122392289861e+01 +1003 1295 -2.774798050936781e+01 +1003 1296 -2.620940698061744e+01 +1004 586 -1.336813651340294e+01 +1004 587 -1.396191802264486e+01 +1004 588 -1.518203609416467e+01 +1004 589 -1.707507926940498e+01 +1004 590 -1.965477828103598e+01 +1004 591 -2.281491025526309e+01 +1004 592 -2.621419542240645e+01 +1004 593 -2.921308657465229e+01 +1004 594 -3.100728135248165e+01 +1004 721 -3.100122392289864e+01 +1004 722 -3.295302401855845e+01 +1004 723 -3.711530555640486e+01 +1004 724 -4.398263164573862e+01 +1004 725 -5.416220002058462e+01 +1004 726 -6.797204698756194e+01 +1004 727 -8.455751811575999e+01 +1004 728 -1.007640600234616e+02 +1004 729 -1.112023202068744e+02 +1004 1288 -1.112023202068744e+02 +1004 1289 -1.007640600234616e+02 +1004 1290 -8.455751811576010e+01 +1004 1291 -6.797204698756201e+01 +1004 1292 -5.416220002058462e+01 +1004 1293 -4.398263164573857e+01 +1004 1294 -3.711530555640482e+01 +1004 1295 -3.295302401855845e+01 +1004 1296 -3.100122392289864e+01 +1005 586 -1.184372960400065e+01 +1005 587 -1.234420052045070e+01 +1005 588 -1.336813651340294e+01 +1005 589 -1.494561758129199e+01 +1005 590 -1.707507926940498e+01 +1005 591 -1.965477828103598e+01 +1005 592 -2.239757409043196e+01 +1005 593 -2.479209926714915e+01 +1005 594 -2.621419542240645e+01 +1005 721 -2.620940698061744e+01 +1005 722 -2.774798050936781e+01 +1005 723 -3.100122392289864e+01 +1005 724 -3.629276779865594e+01 +1005 725 -4.398263164573862e+01 +1005 726 -5.416220002058462e+01 +1005 727 -6.606134132672688e+01 +1005 728 -7.739429142416689e+01 +1005 729 -8.455751811575999e+01 +1005 1288 -1.512628164030903e+02 +1005 1289 -1.353445496343034e+02 +1005 1290 -1.112023202068745e+02 +1005 1291 -8.726265053974954e+01 +1005 1292 -6.797204698756194e+01 +1005 1293 -5.416220002058456e+01 +1005 1294 -4.506046026496937e+01 +1005 1295 -3.963467701820886e+01 +1005 1296 -3.711530555640486e+01 +1006 586 -1.069703031088084e+01 +1006 587 -1.113049648221347e+01 +1006 588 -1.201426721054982e+01 +1006 589 -1.336813651340294e+01 +1006 590 -1.518203609416467e+01 +1006 591 -1.736013665098131e+01 +1006 592 -1.965477828103598e+01 +1006 593 -2.164167292784033e+01 +1006 594 -2.281491025526309e+01 +1006 721 -2.281096793104269e+01 +1006 722 -2.407490908992508e+01 +1006 723 -2.672989532903560e+01 +1006 724 -3.100122392289864e+01 +1006 725 -3.711530555640486e+01 +1006 726 -4.506046026496942e+01 +1006 727 -5.416220002058462e+01 +1006 728 -6.266865647386102e+01 +1006 729 -6.797204698756194e+01 +1006 1288 -2.053883607687485e+02 +1006 1289 -1.811983282511272e+02 +1006 1290 -1.454508347890308e+02 +1006 1291 -1.112023202068745e+02 +1006 1292 -8.455751811575999e+01 +1006 1293 -6.606134132672679e+01 +1006 1294 -5.416220002058456e+01 +1006 1295 -4.718848846240642e+01 +1006 1296 -4.398263164573862e+01 +1007 586 -9.944085360683061e+00 +1007 587 -1.033512964800000e+01 +1007 588 -1.113049648221347e+01 +1007 589 -1.234420052045070e+01 +1007 590 -1.396191802264486e+01 +1007 591 -1.589274010473517e+01 +1007 592 -1.791417887437395e+01 +1007 593 -1.965477828103598e+01 +1007 594 -2.067858569511584e+01 +1007 721 -2.067515029553633e+01 +1007 722 -2.177494503977683e+01 +1007 723 -2.407490908992508e+01 +1007 724 -2.774798050936781e+01 +1007 725 -3.295302401855845e+01 +1007 726 -3.963467701820886e+01 +1007 727 -4.718848846240642e+01 +1007 728 -5.416220002058462e+01 +1007 729 -5.847168336242214e+01 +1007 1288 -2.647767438527630e+02 +1007 1289 -2.305668762810884e+02 +1007 1290 -1.811983282511275e+02 +1007 1291 -1.353445496343036e+02 +1007 1292 -1.007640600234616e+02 +1007 1293 -7.739429142416682e+01 +1007 1294 -6.266865647386096e+01 +1007 1295 -5.416220002058462e+01 +1007 1296 -5.028460369863171e+01 +1008 586 -9.573445684409064e+00 +1008 587 -9.944085360683063e+00 +1008 588 -1.069703031088085e+01 +1008 589 -1.184372960400065e+01 +1008 590 -1.336813651340294e+01 +1008 591 -1.518203609416467e+01 +1008 592 -1.707507926940498e+01 +1008 593 -1.870055440211151e+01 +1008 594 -1.965477828103598e+01 +1008 721 -1.965157861598590e+01 +1008 722 -2.067515029553633e+01 +1008 723 -2.281096793104269e+01 +1008 724 -2.620940698061744e+01 +1008 725 -3.100122392289864e+01 +1008 726 -3.711530555640486e+01 +1008 727 -4.398263164573862e+01 +1008 728 -5.028460369863171e+01 +1008 729 -5.416220002058462e+01 +1008 1288 -3.065373731090118e+02 +1008 1289 -2.647767438527630e+02 +1008 1290 -2.053883607687489e+02 +1008 1291 -1.512628164030906e+02 +1008 1292 -1.112023202068744e+02 +1008 1293 -8.455751811575986e+01 +1008 1294 -6.797204698756184e+01 +1008 1295 -5.847168336242214e+01 +1008 1296 -5.416220002058462e+01 +1009 874 -3.063876713483004e+02 +1009 875 -3.311617365195740e+02 +1009 876 -3.859179776157605e+02 +1009 877 -4.819366867771678e+02 +1009 878 -6.371952057562402e+02 +1009 879 -8.726231103602329e+02 +1009 880 -1.193932486839834e+03 +1009 881 -1.550121445008512e+03 +1009 882 -1.802596433195456e+03 +1009 1162 -3.063876713483004e+02 +1009 1163 -2.841326260213855e+02 +1009 1164 -2.480403651673271e+02 +1009 1165 -2.088271183655457e+02 +1009 1166 -1.740274317161707e+02 +1009 1167 -1.468355065336023e+02 +1009 1168 -1.275984131219179e+02 +1009 1169 -1.155304899028561e+02 +1009 1170 -1.097534196790493e+02 +1009 1225 -1.111842160419089e+02 +1009 1226 -1.057061586526018e+02 +1009 1227 -9.638822517401589e+01 +1009 1228 -8.555928471614156e+01 +1009 1229 -7.520762033775921e+01 +1009 1230 -6.652797451218323e+01 +1009 1231 -6.001174723167335e+01 +1009 1232 -5.573941364116940e+01 +1009 1233 -5.363826960242956e+01 +1010 874 -2.841326260213861e+02 +1010 875 -3.063876713483004e+02 +1010 876 -3.553280674768362e+02 +1010 877 -4.404031329187433e+02 +1010 878 -5.762343277298883e+02 +1010 879 -7.788097592344268e+02 +1010 880 -1.049909849375152e+03 +1010 881 -1.344510568096313e+03 +1010 882 -1.550121445008512e+03 +1010 1162 -3.311617365195740e+02 +1010 1163 -3.063876713482997e+02 +1010 1164 -2.663884709281890e+02 +1010 1165 -2.231981844606889e+02 +1010 1166 -1.851243485745370e+02 +1010 1167 -1.555580782497807e+02 +1010 1168 -1.347481526436476e+02 +1010 1169 -1.217424124188380e+02 +1010 1170 -1.155304899028560e+02 +1010 1225 -1.170681125153374e+02 +1010 1226 -1.111842160419088e+02 +1010 1227 -1.011961191083174e+02 +1010 1228 -8.962181586287879e+01 +1010 1229 -7.859349409841361e+01 +1010 1230 -6.937545782864680e+01 +1010 1231 -6.247361649834816e+01 +1010 1232 -5.795761808209195e+01 +1010 1233 -5.573941364116933e+01 +1011 874 -2.480403651673271e+02 +1011 875 -2.663884709281890e+02 +1011 876 -3.063876713483004e+02 +1011 877 -3.748904053829394e+02 +1011 878 -4.819366867771664e+02 +1011 879 -6.371952057562384e+02 +1011 880 -8.383319685358435e+02 +1011 881 -1.049909849375152e+03 +1011 882 -1.193932486839834e+03 +1011 1162 -3.859179776157605e+02 +1011 1163 -3.553280674768354e+02 +1011 1164 -3.063876713483004e+02 +1011 1165 -2.542062119667738e+02 +1011 1166 -2.088271183655457e+02 +1011 1167 -1.740274317161707e+02 +1011 1168 -1.497853840269160e+02 +1011 1169 -1.347481526436478e+02 +1011 1170 -1.275984131219179e+02 +1011 1225 -1.293661657908652e+02 +1011 1226 -1.226088998409724e+02 +1011 1227 -1.111842160419089e+02 +1011 1228 -9.802102195827720e+01 +1011 1229 -8.555928471614156e+01 +1011 1230 -7.520762033775921e+01 +1011 1231 -6.749803222962952e+01 +1011 1232 -6.247361649834824e+01 +1011 1233 -6.001174723167335e+01 +1012 874 -2.088271183655453e+02 +1012 875 -2.231981844606885e+02 +1012 876 -2.542062119667733e+02 +1012 877 -3.063876713483004e+02 +1012 878 -3.859179776157595e+02 +1012 879 -4.976453857371580e+02 +1012 880 -6.371952057562384e+02 +1012 881 -7.788097592344268e+02 +1012 882 -8.726231103602329e+02 +1012 1162 -4.819366867771678e+02 +1012 1163 -4.404031329187421e+02 +1012 1164 -3.748904053829394e+02 +1012 1165 -3.063876713483011e+02 +1012 1166 -2.480403651673276e+02 +1012 1167 -2.041390437321797e+02 +1012 1168 -1.740274317161710e+02 +1012 1169 -1.555580782497813e+02 +1012 1170 -1.468355065336025e+02 +1012 1225 -1.489885081652994e+02 +1012 1226 -1.407716848553630e+02 +1012 1227 -1.269615920628683e+02 +1012 1228 -1.111842160419091e+02 +1012 1229 -9.638822517401600e+01 +1012 1230 -8.420868002944914e+01 +1012 1231 -7.520762033775929e+01 +1012 1232 -6.937545782864697e+01 +1012 1233 -6.652797451218332e+01 +1013 874 -1.740274317161707e+02 +1013 875 -1.851243485745370e+02 +1013 876 -2.088271183655457e+02 +1013 877 -2.480403651673276e+02 +1013 878 -3.063876713483004e+02 +1013 879 -3.859179776157595e+02 +1013 880 -4.819366867771664e+02 +1013 881 -5.762343277298883e+02 +1013 882 -6.371952057562402e+02 +1013 1162 -6.371952057562402e+02 +1013 1163 -5.762343277298867e+02 +1013 1164 -4.819366867771664e+02 +1013 1165 -3.859179776157605e+02 +1013 1166 -3.063876713483004e+02 +1013 1167 -2.480403651673271e+02 +1013 1168 -2.088271183655457e+02 +1013 1169 -1.851243485745373e+02 +1013 1170 -1.740274317161707e+02 +1013 1225 -1.767605489846857e+02 +1013 1226 -1.663510232448633e+02 +1013 1227 -1.489885081652992e+02 +1013 1228 -1.293661657908652e+02 +1013 1229 -1.111842160419089e+02 +1013 1230 -9.638822517401589e+01 +1013 1231 -8.555928471614156e+01 +1013 1232 -7.859349409841370e+01 +1013 1233 -7.520762033775921e+01 +1014 874 -1.468355065336025e+02 +1014 875 -1.555580782497810e+02 +1014 876 -1.740274317161710e+02 +1014 877 -2.041390437321801e+02 +1014 878 -2.480403651673276e+02 +1014 879 -3.063876713483004e+02 +1014 880 -3.748904053829394e+02 +1014 881 -4.404031329187433e+02 +1014 882 -4.819366867771678e+02 +1014 1162 -8.726231103602329e+02 +1014 1163 -7.788097592344243e+02 +1014 1164 -6.371952057562384e+02 +1014 1165 -4.976453857371593e+02 +1014 1166 -3.859179776157595e+02 +1014 1167 -3.063876713482997e+02 +1014 1168 -2.542062119667733e+02 +1014 1169 -2.231981844606889e+02 +1014 1170 -2.088271183655453e+02 +1014 1225 -2.123577731150844e+02 +1014 1226 -1.989422168423264e+02 +1014 1227 -1.767605489846853e+02 +1014 1228 -1.519993633210927e+02 +1014 1229 -1.293661657908650e+02 +1014 1230 -1.111842160419088e+02 +1014 1231 -9.802102195827709e+01 +1014 1232 -8.962181586287879e+01 +1014 1233 -8.555928471614145e+01 +1015 874 -1.275984131219179e+02 +1015 875 -1.347481526436476e+02 +1015 876 -1.497853840269160e+02 +1015 877 -1.740274317161710e+02 +1015 878 -2.088271183655457e+02 +1015 879 -2.542062119667733e+02 +1015 880 -3.063876713483004e+02 +1015 881 -3.553280674768362e+02 +1015 882 -3.859179776157605e+02 +1015 1162 -1.193932486839834e+03 +1015 1163 -1.049909849375148e+03 +1015 1164 -8.383319685358435e+02 +1015 1165 -6.371952057562402e+02 +1015 1166 -4.819366867771664e+02 +1015 1167 -3.748904053829385e+02 +1015 1168 -3.063876713483004e+02 +1015 1169 -2.663884709281895e+02 +1015 1170 -2.480403651673271e+02 +1015 1225 -2.525366109215767e+02 +1015 1226 -2.354925657825773e+02 +1015 1227 -2.075588680195229e+02 +1015 1228 -1.767605489846857e+02 +1015 1229 -1.489885081652992e+02 +1015 1230 -1.269615920628681e+02 +1015 1231 -1.111842160419089e+02 +1015 1232 -1.011961191083175e+02 +1015 1233 -9.638822517401589e+01 +1016 874 -1.155304899028560e+02 +1016 875 -1.217424124188379e+02 +1016 876 -1.347481526436476e+02 +1016 877 -1.555580782497810e+02 +1016 878 -1.851243485745370e+02 +1016 879 -2.231981844606885e+02 +1016 880 -2.663884709281890e+02 +1016 881 -3.063876713483004e+02 +1016 882 -3.311617365195740e+02 +1016 1162 -1.550121445008512e+03 +1016 1163 -1.344510568096307e+03 +1016 1164 -1.049909849375152e+03 +1016 1165 -7.788097592344293e+02 +1016 1166 -5.762343277298883e+02 +1016 1167 -4.404031329187421e+02 +1016 1168 -3.553280674768362e+02 +1016 1169 -3.063876713483011e+02 +1016 1170 -2.841326260213861e+02 +1016 1225 -2.895745815575327e+02 +1016 1226 -2.689865983609323e+02 +1016 1227 -2.354925657825778e+02 +1016 1228 -1.989422168423272e+02 +1016 1229 -1.663510232448635e+02 +1016 1230 -1.407716848553630e+02 +1016 1231 -1.226088998409726e+02 +1016 1232 -1.111842160419091e+02 +1016 1233 -1.057061586526020e+02 +1017 874 -1.097534196790493e+02 +1017 875 -1.155304899028560e+02 +1017 876 -1.275984131219179e+02 +1017 877 -1.468355065336025e+02 +1017 878 -1.740274317161707e+02 +1017 879 -2.088271183655453e+02 +1017 880 -2.480403651673271e+02 +1017 881 -2.841326260213861e+02 +1017 882 -3.063876713483004e+02 +1017 1162 -1.802596433195456e+03 +1017 1163 -1.550121445008505e+03 +1017 1164 -1.193932486839834e+03 +1017 1165 -8.726231103602357e+02 +1017 1166 -6.371952057562402e+02 +1017 1167 -4.819366867771664e+02 +1017 1168 -3.859179776157605e+02 +1017 1169 -3.311617365195747e+02 +1017 1170 -3.063876713483004e+02 +1017 1225 -3.124380547854544e+02 +1017 1226 -2.895745815575320e+02 +1017 1227 -2.525366109215767e+02 +1017 1228 -2.123577731150849e+02 +1017 1229 -1.767605489846857e+02 +1017 1230 -1.489885081652992e+02 +1017 1231 -1.293661657908652e+02 +1017 1232 -1.170681125153376e+02 +1017 1233 -1.111842160419089e+02 +1018 946 -1.733190400658708e+03 +1018 947 -1.877824568765008e+03 +1018 948 -2.199157547087190e+03 +1018 949 -2.767706810094291e+03 +1018 950 -3.699147964795159e+03 +1018 951 -5.136224430633812e+03 +1018 952 -7.138491575686227e+03 +1018 953 -9.405703259334558e+03 +1018 954 -1.103972130715905e+04 +1018 1081 -1.733190400658708e+03 +1018 1082 -1.603684467943639e+03 +1018 1083 -1.394551574360516e+03 +1018 1084 -1.168677565678393e+03 +1018 1085 -9.695072463564467e+02 +1018 1086 -8.148024630667978e+02 +1018 1087 -7.058924559832891e+02 +1018 1088 -6.378158089920689e+02 +1018 1089 -6.052974323170231e+02 +1018 1108 -6.289529049931513e+02 +1018 1109 -5.970589583440841e+02 +1018 1110 -5.429674662554836e+02 +1018 1111 -4.803677035258846e+02 +1018 1112 -4.208084537187723e+02 +1018 1113 -3.710963518270349e+02 +1018 1114 -3.339204550667995e+02 +1018 1115 -3.096178268240471e+02 +1018 1116 -2.976873911031311e+02 +1019 946 -1.603684467943639e+03 +1019 947 -1.733190400658708e+03 +1019 948 -2.019368486704435e+03 +1019 949 -2.521021940438013e+03 +1019 950 -3.331754877699595e+03 +1019 951 -4.560278038130793e+03 +1019 952 -6.235592529048601e+03 +1019 953 -8.091232579773156e+03 +1019 954 -9.405703259334558e+03 +1019 1081 -1.877824568765008e+03 +1019 1082 -1.733190400658708e+03 +1019 1083 -1.500725861549673e+03 +1019 1084 -1.251286952144480e+03 +1019 1085 -1.032880208377977e+03 +1019 1086 -8.643348602446105e+02 +1019 1087 -7.463158073460687e+02 +1019 1088 -6.728335244699299e+02 +1019 1089 -6.378158089920689e+02 +1019 1108 -6.632839990295092e+02 +1019 1109 -6.289529049931513e+02 +1019 1110 -5.708523475060541e+02 +1019 1111 -5.038180997021776e+02 +1019 1112 -4.402579127124382e+02 +1019 1113 -3.873813675510154e+02 +1019 1114 -3.479505460244110e+02 +1019 1115 -3.222285372305477e+02 +1019 1116 -3.096178268240471e+02 +1020 946 -1.394551574360516e+03 +1020 947 -1.500725861549673e+03 +1020 948 -1.733190400658708e+03 +1020 949 -2.134265778758337e+03 +1020 950 -2.767706810094291e+03 +1020 951 -3.699147964795159e+03 +1020 952 -4.925216936196723e+03 +1020 953 -6.235592529048601e+03 +1020 954 -7.138491575686227e+03 +1020 1081 -2.199157547087190e+03 +1020 1082 -2.019368486704435e+03 +1020 1083 -1.733190400658708e+03 +1020 1084 -1.430197816180116e+03 +1020 1085 -1.168677565678393e+03 +1020 1086 -9.695072463564467e+02 +1020 1087 -8.315436028021828e+02 +1020 1088 -7.463158073460687e+02 +1020 1089 -7.058924559832891e+02 +1020 1108 -7.352796046183660e+02 +1020 1109 -6.956816209337401e+02 +1020 1110 -6.289529049931513e+02 +1020 1111 -5.524312223207834e+02 +1020 1112 -4.803677035258846e+02 +1020 1113 -4.208084537187723e+02 +1020 1114 -3.766415408901786e+02 +1020 1115 -3.479505460244110e+02 +1020 1116 -3.339204550667995e+02 +1021 946 -1.168677565678393e+03 +1021 947 -1.251286952144480e+03 +1021 948 -1.430197816180116e+03 +1021 949 -1.733190400658708e+03 +1021 950 -2.199157547087190e+03 +1021 951 -2.861294172280315e+03 +1021 952 -3.699147964795159e+03 +1021 953 -4.560278038130793e+03 +1021 954 -5.136224430633812e+03 +1021 1081 -2.767706810094291e+03 +1021 1082 -2.521021940438013e+03 +1021 1083 -2.134265778758337e+03 +1021 1084 -1.733190400658708e+03 +1021 1085 -1.394551574360516e+03 +1021 1086 -1.141773184361051e+03 +1021 1087 -9.695072463564467e+02 +1021 1088 -8.643348602446105e+02 +1021 1089 -8.148024630667978e+02 +1021 1108 -8.507888885505199e+02 +1021 1109 -8.023274760830702e+02 +1021 1110 -7.211778000851822e+02 +1021 1111 -6.289529049931513e+02 +1021 1112 -5.429674662554836e+02 +1021 1113 -4.725808574370910e+02 +1021 1114 -4.208084537187723e+02 +1021 1115 -3.873813675510154e+02 +1021 1116 -3.710963518270349e+02 +1022 946 -9.695072463564467e+02 +1022 947 -1.032880208377977e+03 +1022 948 -1.168677565678393e+03 +1022 949 -1.394551574360516e+03 +1022 950 -1.733190400658708e+03 +1022 951 -2.199157547087190e+03 +1022 952 -2.767706810094291e+03 +1022 953 -3.331754877699595e+03 +1022 954 -3.699147964795159e+03 +1022 1081 -3.699147964795159e+03 +1022 1082 -3.331754877699595e+03 +1022 1083 -2.767706810094291e+03 +1022 1084 -2.199157547087190e+03 +1022 1085 -1.733190400658708e+03 +1022 1086 -1.394551574360516e+03 +1022 1087 -1.168677565678393e+03 +1022 1088 -1.032880208377977e+03 +1022 1089 -9.695072463564467e+02 +1022 1108 -1.015511306612463e+03 +1022 1109 -9.536070604341750e+02 +1022 1110 -8.507888885505199e+02 +1022 1111 -7.352796046183660e+02 +1022 1112 -6.289529049931513e+02 +1022 1113 -5.429674662554836e+02 +1022 1114 -4.803677035258846e+02 +1022 1115 -4.402579127124382e+02 +1022 1116 -4.208084537187723e+02 +1023 946 -8.148024630667978e+02 +1023 947 -8.643348602446105e+02 +1023 948 -9.695072463564467e+02 +1023 949 -1.141773184361051e+03 +1023 950 -1.394551574360516e+03 +1023 951 -1.733190400658708e+03 +1023 952 -2.134265778758337e+03 +1023 953 -2.521021940438013e+03 +1023 954 -2.767706810094291e+03 +1023 1081 -5.136224430633812e+03 +1023 1082 -4.560278038130793e+03 +1023 1083 -3.699147964795159e+03 +1023 1084 -2.861294172280315e+03 +1023 1085 -2.199157547087190e+03 +1023 1086 -1.733190400658708e+03 +1023 1087 -1.430197816180116e+03 +1023 1088 -1.251286952144480e+03 +1023 1089 -1.168677565678393e+03 +1023 1108 -1.228588660544043e+03 +1023 1109 -1.148042053110076e+03 +1023 1110 -1.015511306612463e+03 +1023 1111 -8.685786765383741e+02 +1023 1112 -7.352796046183660e+02 +1023 1113 -6.289529049931513e+02 +1023 1114 -5.524312223207834e+02 +1023 1115 -5.038180997021776e+02 +1023 1116 -4.803677035258846e+02 +1024 946 -7.058924559832891e+02 +1024 947 -7.463158073460687e+02 +1024 948 -8.315436028021828e+02 +1024 949 -9.695072463564467e+02 +1024 950 -1.168677565678393e+03 +1024 951 -1.430197816180116e+03 +1024 952 -1.733190400658708e+03 +1024 953 -2.019368486704435e+03 +1024 954 -2.199157547087190e+03 +1024 1081 -7.138491575686227e+03 +1024 1082 -6.235592529048601e+03 +1024 1083 -4.925216936196723e+03 +1024 1084 -3.699147964795159e+03 +1024 1085 -2.767706810094291e+03 +1024 1086 -2.134265778758337e+03 +1024 1087 -1.733190400658708e+03 +1024 1088 -1.500725861549673e+03 +1024 1089 -1.394551574360516e+03 +1024 1108 -1.471477730866021e+03 +1024 1109 -1.368148367306964e+03 +1024 1110 -1.199743197084304e+03 +1024 1111 -1.015511306612463e+03 +1024 1112 -8.507888885505199e+02 +1024 1113 -7.211778000851822e+02 +1024 1114 -6.289529049931513e+02 +1024 1115 -5.708523475060541e+02 +1024 1116 -5.429674662554836e+02 +1025 946 -6.378158089920689e+02 +1025 947 -6.728335244699299e+02 +1025 948 -7.463158073460687e+02 +1025 949 -8.643348602446105e+02 +1025 950 -1.032880208377977e+03 +1025 951 -1.251286952144480e+03 +1025 952 -1.500725861549673e+03 +1025 953 -1.733190400658708e+03 +1025 954 -1.877824568765008e+03 +1025 1081 -9.405703259334558e+03 +1025 1082 -8.091232579773156e+03 +1025 1083 -6.235592529048601e+03 +1025 1084 -4.560278038130793e+03 +1025 1085 -3.331754877699595e+03 +1025 1086 -2.521021940438013e+03 +1025 1087 -2.019368486704435e+03 +1025 1088 -1.733190400658708e+03 +1025 1089 -1.603684467943639e+03 +1025 1108 -1.697437739078442e+03 +1025 1109 -1.571600895131404e+03 +1025 1110 -1.368148367306964e+03 +1025 1111 -1.148042053110076e+03 +1025 1112 -9.536070604341750e+02 +1025 1113 -8.023274760830702e+02 +1025 1114 -6.956816209337401e+02 +1025 1115 -6.289529049931513e+02 +1025 1116 -5.970589583440841e+02 +1026 946 -6.052974323170231e+02 +1026 947 -6.378158089920689e+02 +1026 948 -7.058924559832891e+02 +1026 949 -8.148024630667978e+02 +1026 950 -9.695072463564467e+02 +1026 951 -1.168677565678393e+03 +1026 952 -1.394551574360516e+03 +1026 953 -1.603684467943639e+03 +1026 954 -1.733190400658708e+03 +1026 1081 -1.103972130715905e+04 +1026 1082 -9.405703259334558e+03 +1026 1083 -7.138491575686227e+03 +1026 1084 -5.136224430633812e+03 +1026 1085 -3.699147964795159e+03 +1026 1086 -2.767706810094291e+03 +1026 1087 -2.199157547087190e+03 +1026 1088 -1.877824568765008e+03 +1026 1089 -1.733190400658708e+03 +1026 1108 -1.837845240586523e+03 +1026 1109 -1.697437739078442e+03 +1026 1110 -1.471477730866021e+03 +1026 1111 -1.228588660544043e+03 +1026 1112 -1.015511306612463e+03 +1026 1113 -8.507888885505199e+02 +1026 1114 -7.352796046183660e+02 +1026 1115 -6.632839990295092e+02 +1026 1116 -6.289529049931513e+02 +1045 946 -6.289529049931513e+02 +1045 947 -6.632839990295092e+02 +1045 948 -7.352796046183660e+02 +1045 949 -8.507888885505199e+02 +1045 950 -1.015511306612463e+03 +1045 951 -1.228588660544043e+03 +1045 952 -1.471477730866021e+03 +1045 953 -1.697437739078442e+03 +1045 954 -1.837845240586523e+03 +1045 973 -1.733190400658708e+03 +1045 974 -1.877824568765008e+03 +1045 975 -2.199157547087190e+03 +1045 976 -2.767706810094291e+03 +1045 977 -3.699147964795159e+03 +1045 978 -5.136224430633812e+03 +1045 979 -7.138491575686227e+03 +1045 980 -9.405703259334558e+03 +1045 981 -1.103972130715905e+04 +1045 1108 -1.733190400658708e+03 +1045 1109 -1.603684467943639e+03 +1045 1110 -1.394551574360516e+03 +1045 1111 -1.168677565678393e+03 +1045 1112 -9.695072463564467e+02 +1045 1113 -8.148024630667978e+02 +1045 1114 -7.058924559832891e+02 +1045 1115 -6.378158089920689e+02 +1045 1116 -6.052974323170231e+02 +1046 946 -5.970589583440841e+02 +1046 947 -6.289529049931513e+02 +1046 948 -6.956816209337401e+02 +1046 949 -8.023274760830702e+02 +1046 950 -9.536070604341750e+02 +1046 951 -1.148042053110076e+03 +1046 952 -1.368148367306964e+03 +1046 953 -1.571600895131404e+03 +1046 954 -1.697437739078442e+03 +1046 973 -1.603684467943639e+03 +1046 974 -1.733190400658708e+03 +1046 975 -2.019368486704435e+03 +1046 976 -2.521021940438013e+03 +1046 977 -3.331754877699595e+03 +1046 978 -4.560278038130793e+03 +1046 979 -6.235592529048601e+03 +1046 980 -8.091232579773156e+03 +1046 981 -9.405703259334558e+03 +1046 1108 -1.877824568765008e+03 +1046 1109 -1.733190400658708e+03 +1046 1110 -1.500725861549673e+03 +1046 1111 -1.251286952144480e+03 +1046 1112 -1.032880208377977e+03 +1046 1113 -8.643348602446105e+02 +1046 1114 -7.463158073460687e+02 +1046 1115 -6.728335244699299e+02 +1046 1116 -6.378158089920689e+02 +1047 946 -5.429674662554836e+02 +1047 947 -5.708523475060541e+02 +1047 948 -6.289529049931513e+02 +1047 949 -7.211778000851822e+02 +1047 950 -8.507888885505199e+02 +1047 951 -1.015511306612463e+03 +1047 952 -1.199743197084304e+03 +1047 953 -1.368148367306964e+03 +1047 954 -1.471477730866021e+03 +1047 973 -1.394551574360516e+03 +1047 974 -1.500725861549673e+03 +1047 975 -1.733190400658708e+03 +1047 976 -2.134265778758337e+03 +1047 977 -2.767706810094291e+03 +1047 978 -3.699147964795159e+03 +1047 979 -4.925216936196723e+03 +1047 980 -6.235592529048601e+03 +1047 981 -7.138491575686227e+03 +1047 1108 -2.199157547087190e+03 +1047 1109 -2.019368486704435e+03 +1047 1110 -1.733190400658708e+03 +1047 1111 -1.430197816180116e+03 +1047 1112 -1.168677565678393e+03 +1047 1113 -9.695072463564467e+02 +1047 1114 -8.315436028021828e+02 +1047 1115 -7.463158073460687e+02 +1047 1116 -7.058924559832891e+02 +1048 946 -4.803677035258846e+02 +1048 947 -5.038180997021776e+02 +1048 948 -5.524312223207834e+02 +1048 949 -6.289529049931513e+02 +1048 950 -7.352796046183660e+02 +1048 951 -8.685786765383741e+02 +1048 952 -1.015511306612463e+03 +1048 953 -1.148042053110076e+03 +1048 954 -1.228588660544043e+03 +1048 973 -1.168677565678393e+03 +1048 974 -1.251286952144480e+03 +1048 975 -1.430197816180116e+03 +1048 976 -1.733190400658708e+03 +1048 977 -2.199157547087190e+03 +1048 978 -2.861294172280315e+03 +1048 979 -3.699147964795159e+03 +1048 980 -4.560278038130793e+03 +1048 981 -5.136224430633812e+03 +1048 1108 -2.767706810094291e+03 +1048 1109 -2.521021940438013e+03 +1048 1110 -2.134265778758337e+03 +1048 1111 -1.733190400658708e+03 +1048 1112 -1.394551574360516e+03 +1048 1113 -1.141773184361051e+03 +1048 1114 -9.695072463564467e+02 +1048 1115 -8.643348602446105e+02 +1048 1116 -8.148024630667978e+02 +1049 946 -4.208084537187723e+02 +1049 947 -4.402579127124382e+02 +1049 948 -4.803677035258846e+02 +1049 949 -5.429674662554836e+02 +1049 950 -6.289529049931513e+02 +1049 951 -7.352796046183660e+02 +1049 952 -8.507888885505199e+02 +1049 953 -9.536070604341750e+02 +1049 954 -1.015511306612463e+03 +1049 973 -9.695072463564467e+02 +1049 974 -1.032880208377977e+03 +1049 975 -1.168677565678393e+03 +1049 976 -1.394551574360516e+03 +1049 977 -1.733190400658708e+03 +1049 978 -2.199157547087190e+03 +1049 979 -2.767706810094291e+03 +1049 980 -3.331754877699595e+03 +1049 981 -3.699147964795159e+03 +1049 1108 -3.699147964795159e+03 +1049 1109 -3.331754877699595e+03 +1049 1110 -2.767706810094291e+03 +1049 1111 -2.199157547087190e+03 +1049 1112 -1.733190400658708e+03 +1049 1113 -1.394551574360516e+03 +1049 1114 -1.168677565678393e+03 +1049 1115 -1.032880208377977e+03 +1049 1116 -9.695072463564467e+02 +1050 946 -3.710963518270349e+02 +1050 947 -3.873813675510154e+02 +1050 948 -4.208084537187723e+02 +1050 949 -4.725808574370910e+02 +1050 950 -5.429674662554836e+02 +1050 951 -6.289529049931513e+02 +1050 952 -7.211778000851822e+02 +1050 953 -8.023274760830702e+02 +1050 954 -8.507888885505199e+02 +1050 973 -8.148024630667978e+02 +1050 974 -8.643348602446105e+02 +1050 975 -9.695072463564467e+02 +1050 976 -1.141773184361051e+03 +1050 977 -1.394551574360516e+03 +1050 978 -1.733190400658708e+03 +1050 979 -2.134265778758337e+03 +1050 980 -2.521021940438013e+03 +1050 981 -2.767706810094291e+03 +1050 1108 -5.136224430633812e+03 +1050 1109 -4.560278038130793e+03 +1050 1110 -3.699147964795159e+03 +1050 1111 -2.861294172280315e+03 +1050 1112 -2.199157547087190e+03 +1050 1113 -1.733190400658708e+03 +1050 1114 -1.430197816180116e+03 +1050 1115 -1.251286952144480e+03 +1050 1116 -1.168677565678393e+03 +1051 946 -3.339204550667995e+02 +1051 947 -3.479505460244110e+02 +1051 948 -3.766415408901786e+02 +1051 949 -4.208084537187723e+02 +1051 950 -4.803677035258846e+02 +1051 951 -5.524312223207834e+02 +1051 952 -6.289529049931513e+02 +1051 953 -6.956816209337401e+02 +1051 954 -7.352796046183660e+02 +1051 973 -7.058924559832891e+02 +1051 974 -7.463158073460687e+02 +1051 975 -8.315436028021828e+02 +1051 976 -9.695072463564467e+02 +1051 977 -1.168677565678393e+03 +1051 978 -1.430197816180116e+03 +1051 979 -1.733190400658708e+03 +1051 980 -2.019368486704435e+03 +1051 981 -2.199157547087190e+03 +1051 1108 -7.138491575686227e+03 +1051 1109 -6.235592529048601e+03 +1051 1110 -4.925216936196723e+03 +1051 1111 -3.699147964795159e+03 +1051 1112 -2.767706810094291e+03 +1051 1113 -2.134265778758337e+03 +1051 1114 -1.733190400658708e+03 +1051 1115 -1.500725861549673e+03 +1051 1116 -1.394551574360516e+03 +1052 946 -3.096178268240471e+02 +1052 947 -3.222285372305477e+02 +1052 948 -3.479505460244110e+02 +1052 949 -3.873813675510154e+02 +1052 950 -4.402579127124382e+02 +1052 951 -5.038180997021776e+02 +1052 952 -5.708523475060541e+02 +1052 953 -6.289529049931513e+02 +1052 954 -6.632839990295092e+02 +1052 973 -6.378158089920689e+02 +1052 974 -6.728335244699299e+02 +1052 975 -7.463158073460687e+02 +1052 976 -8.643348602446105e+02 +1052 977 -1.032880208377977e+03 +1052 978 -1.251286952144480e+03 +1052 979 -1.500725861549673e+03 +1052 980 -1.733190400658708e+03 +1052 981 -1.877824568765008e+03 +1052 1108 -9.405703259334558e+03 +1052 1109 -8.091232579773156e+03 +1052 1110 -6.235592529048601e+03 +1052 1111 -4.560278038130793e+03 +1052 1112 -3.331754877699595e+03 +1052 1113 -2.521021940438013e+03 +1052 1114 -2.019368486704435e+03 +1052 1115 -1.733190400658708e+03 +1052 1116 -1.603684467943639e+03 +1053 946 -2.976873911031311e+02 +1053 947 -3.096178268240471e+02 +1053 948 -3.339204550667995e+02 +1053 949 -3.710963518270349e+02 +1053 950 -4.208084537187723e+02 +1053 951 -4.803677035258846e+02 +1053 952 -5.429674662554836e+02 +1053 953 -5.970589583440841e+02 +1053 954 -6.289529049931513e+02 +1053 973 -6.052974323170231e+02 +1053 974 -6.378158089920689e+02 +1053 975 -7.058924559832891e+02 +1053 976 -8.148024630667978e+02 +1053 977 -9.695072463564467e+02 +1053 978 -1.168677565678393e+03 +1053 979 -1.394551574360516e+03 +1053 980 -1.603684467943639e+03 +1053 981 -1.733190400658708e+03 +1053 1108 -1.103972130715905e+04 +1053 1109 -9.405703259334558e+03 +1053 1110 -7.138491575686227e+03 +1053 1111 -5.136224430633812e+03 +1053 1112 -3.699147964795159e+03 +1053 1113 -2.767706810094291e+03 +1053 1114 -2.199157547087190e+03 +1053 1115 -1.877824568765008e+03 +1053 1116 -1.733190400658708e+03 +1072 874 -1.111842160419089e+02 +1072 875 -1.170681125153374e+02 +1072 876 -1.293661657908652e+02 +1072 877 -1.489885081652994e+02 +1072 878 -1.767605489846857e+02 +1072 879 -2.123577731150844e+02 +1072 880 -2.525366109215767e+02 +1072 881 -2.895745815575327e+02 +1072 882 -3.124380547854544e+02 +1072 937 -3.063876713483004e+02 +1072 938 -3.311617365195740e+02 +1072 939 -3.859179776157605e+02 +1072 940 -4.819366867771678e+02 +1072 941 -6.371952057562402e+02 +1072 942 -8.726231103602329e+02 +1072 943 -1.193932486839834e+03 +1072 944 -1.550121445008512e+03 +1072 945 -1.802596433195456e+03 +1072 1225 -3.063876713483004e+02 +1072 1226 -2.841326260213855e+02 +1072 1227 -2.480403651673271e+02 +1072 1228 -2.088271183655457e+02 +1072 1229 -1.740274317161707e+02 +1072 1230 -1.468355065336023e+02 +1072 1231 -1.275984131219179e+02 +1072 1232 -1.155304899028561e+02 +1072 1233 -1.097534196790493e+02 +1073 874 -1.057061586526020e+02 +1073 875 -1.111842160419089e+02 +1073 876 -1.226088998409726e+02 +1073 877 -1.407716848553633e+02 +1073 878 -1.663510232448635e+02 +1073 879 -1.989422168423268e+02 +1073 880 -2.354925657825778e+02 +1073 881 -2.689865983609328e+02 +1073 882 -2.895745815575327e+02 +1073 937 -2.841326260213861e+02 +1073 938 -3.063876713483004e+02 +1073 939 -3.553280674768362e+02 +1073 940 -4.404031329187433e+02 +1073 941 -5.762343277298883e+02 +1073 942 -7.788097592344268e+02 +1073 943 -1.049909849375152e+03 +1073 944 -1.344510568096313e+03 +1073 945 -1.550121445008512e+03 +1073 1225 -3.311617365195740e+02 +1073 1226 -3.063876713482997e+02 +1073 1227 -2.663884709281890e+02 +1073 1228 -2.231981844606889e+02 +1073 1229 -1.851243485745370e+02 +1073 1230 -1.555580782497807e+02 +1073 1231 -1.347481526436476e+02 +1073 1232 -1.217424124188380e+02 +1073 1233 -1.155304899028560e+02 +1074 874 -9.638822517401589e+01 +1074 875 -1.011961191083174e+02 +1074 876 -1.111842160419089e+02 +1074 877 -1.269615920628683e+02 +1074 878 -1.489885081652992e+02 +1074 879 -1.767605489846853e+02 +1074 880 -2.075588680195229e+02 +1074 881 -2.354925657825778e+02 +1074 882 -2.525366109215767e+02 +1074 937 -2.480403651673271e+02 +1074 938 -2.663884709281890e+02 +1074 939 -3.063876713483004e+02 +1074 940 -3.748904053829394e+02 +1074 941 -4.819366867771664e+02 +1074 942 -6.371952057562384e+02 +1074 943 -8.383319685358435e+02 +1074 944 -1.049909849375152e+03 +1074 945 -1.193932486839834e+03 +1074 1225 -3.859179776157605e+02 +1074 1226 -3.553280674768354e+02 +1074 1227 -3.063876713483004e+02 +1074 1228 -2.542062119667738e+02 +1074 1229 -2.088271183655457e+02 +1074 1230 -1.740274317161707e+02 +1074 1231 -1.497853840269160e+02 +1074 1232 -1.347481526436478e+02 +1074 1233 -1.275984131219179e+02 +1075 874 -8.555928471614145e+01 +1075 875 -8.962181586287865e+01 +1075 876 -9.802102195827709e+01 +1075 877 -1.111842160419089e+02 +1075 878 -1.293661657908650e+02 +1075 879 -1.519993633210925e+02 +1075 880 -1.767605489846853e+02 +1075 881 -1.989422168423268e+02 +1075 882 -2.123577731150844e+02 +1075 937 -2.088271183655453e+02 +1075 938 -2.231981844606885e+02 +1075 939 -2.542062119667733e+02 +1075 940 -3.063876713483004e+02 +1075 941 -3.859179776157595e+02 +1075 942 -4.976453857371580e+02 +1075 943 -6.371952057562384e+02 +1075 944 -7.788097592344268e+02 +1075 945 -8.726231103602329e+02 +1075 1225 -4.819366867771678e+02 +1075 1226 -4.404031329187421e+02 +1075 1227 -3.748904053829394e+02 +1075 1228 -3.063876713483011e+02 +1075 1229 -2.480403651673276e+02 +1075 1230 -2.041390437321797e+02 +1075 1231 -1.740274317161710e+02 +1075 1232 -1.555580782497813e+02 +1075 1233 -1.468355065336025e+02 +1076 874 -7.520762033775921e+01 +1076 875 -7.859349409841361e+01 +1076 876 -8.555928471614156e+01 +1076 877 -9.638822517401600e+01 +1076 878 -1.111842160419089e+02 +1076 879 -1.293661657908650e+02 +1076 880 -1.489885081652992e+02 +1076 881 -1.663510232448635e+02 +1076 882 -1.767605489846857e+02 +1076 937 -1.740274317161707e+02 +1076 938 -1.851243485745370e+02 +1076 939 -2.088271183655457e+02 +1076 940 -2.480403651673276e+02 +1076 941 -3.063876713483004e+02 +1076 942 -3.859179776157595e+02 +1076 943 -4.819366867771664e+02 +1076 944 -5.762343277298883e+02 +1076 945 -6.371952057562402e+02 +1076 1225 -6.371952057562402e+02 +1076 1226 -5.762343277298867e+02 +1076 1227 -4.819366867771664e+02 +1076 1228 -3.859179776157605e+02 +1076 1229 -3.063876713483004e+02 +1076 1230 -2.480403651673271e+02 +1076 1231 -2.088271183655457e+02 +1076 1232 -1.851243485745373e+02 +1076 1233 -1.740274317161707e+02 +1077 874 -6.652797451218332e+01 +1077 875 -6.937545782864687e+01 +1077 876 -7.520762033775929e+01 +1077 877 -8.420868002944924e+01 +1077 878 -9.638822517401600e+01 +1077 879 -1.111842160419089e+02 +1077 880 -1.269615920628683e+02 +1077 881 -1.407716848553633e+02 +1077 882 -1.489885081652994e+02 +1077 937 -1.468355065336025e+02 +1077 938 -1.555580782497810e+02 +1077 939 -1.740274317161710e+02 +1077 940 -2.041390437321801e+02 +1077 941 -2.480403651673276e+02 +1077 942 -3.063876713483004e+02 +1077 943 -3.748904053829394e+02 +1077 944 -4.404031329187433e+02 +1077 945 -4.819366867771678e+02 +1077 1225 -8.726231103602329e+02 +1077 1226 -7.788097592344243e+02 +1077 1227 -6.371952057562384e+02 +1077 1228 -4.976453857371593e+02 +1077 1229 -3.859179776157595e+02 +1077 1230 -3.063876713482997e+02 +1077 1231 -2.542062119667733e+02 +1077 1232 -2.231981844606889e+02 +1077 1233 -2.088271183655453e+02 +1078 874 -6.001174723167335e+01 +1078 875 -6.247361649834816e+01 +1078 876 -6.749803222962952e+01 +1078 877 -7.520762033775929e+01 +1078 878 -8.555928471614156e+01 +1078 879 -9.802102195827709e+01 +1078 880 -1.111842160419089e+02 +1078 881 -1.226088998409726e+02 +1078 882 -1.293661657908652e+02 +1078 937 -1.275984131219179e+02 +1078 938 -1.347481526436476e+02 +1078 939 -1.497853840269160e+02 +1078 940 -1.740274317161710e+02 +1078 941 -2.088271183655457e+02 +1078 942 -2.542062119667733e+02 +1078 943 -3.063876713483004e+02 +1078 944 -3.553280674768362e+02 +1078 945 -3.859179776157605e+02 +1078 1225 -1.193932486839834e+03 +1078 1226 -1.049909849375148e+03 +1078 1227 -8.383319685358435e+02 +1078 1228 -6.371952057562402e+02 +1078 1229 -4.819366867771664e+02 +1078 1230 -3.748904053829385e+02 +1078 1231 -3.063876713483004e+02 +1078 1232 -2.663884709281895e+02 +1078 1233 -2.480403651673271e+02 +1079 874 -5.573941364116933e+01 +1079 875 -5.795761808209188e+01 +1079 876 -6.247361649834816e+01 +1079 877 -6.937545782864687e+01 +1079 878 -7.859349409841361e+01 +1079 879 -8.962181586287865e+01 +1079 880 -1.011961191083174e+02 +1079 881 -1.111842160419089e+02 +1079 882 -1.170681125153374e+02 +1079 937 -1.155304899028560e+02 +1079 938 -1.217424124188379e+02 +1079 939 -1.347481526436476e+02 +1079 940 -1.555580782497810e+02 +1079 941 -1.851243485745370e+02 +1079 942 -2.231981844606885e+02 +1079 943 -2.663884709281890e+02 +1079 944 -3.063876713483004e+02 +1079 945 -3.311617365195740e+02 +1079 1225 -1.550121445008512e+03 +1079 1226 -1.344510568096307e+03 +1079 1227 -1.049909849375152e+03 +1079 1228 -7.788097592344293e+02 +1079 1229 -5.762343277298883e+02 +1079 1230 -4.404031329187421e+02 +1079 1231 -3.553280674768362e+02 +1079 1232 -3.063876713483011e+02 +1079 1233 -2.841326260213861e+02 +1080 874 -5.363826960242956e+01 +1080 875 -5.573941364116933e+01 +1080 876 -6.001174723167335e+01 +1080 877 -6.652797451218332e+01 +1080 878 -7.520762033775921e+01 +1080 879 -8.555928471614145e+01 +1080 880 -9.638822517401589e+01 +1080 881 -1.057061586526020e+02 +1080 882 -1.111842160419089e+02 +1080 937 -1.097534196790493e+02 +1080 938 -1.155304899028560e+02 +1080 939 -1.275984131219179e+02 +1080 940 -1.468355065336025e+02 +1080 941 -1.740274317161707e+02 +1080 942 -2.088271183655453e+02 +1080 943 -2.480403651673271e+02 +1080 944 -2.841326260213861e+02 +1080 945 -3.063876713483004e+02 +1080 1225 -1.802596433195456e+03 +1080 1226 -1.550121445008505e+03 +1080 1227 -1.193932486839834e+03 +1080 1228 -8.726231103602357e+02 +1080 1229 -6.371952057562402e+02 +1080 1230 -4.819366867771664e+02 +1080 1231 -3.859179776157605e+02 +1080 1232 -3.311617365195747e+02 +1080 1233 -3.063876713483004e+02 +1081 1018 -1.733190400658708e+03 +1081 1019 -1.877824568765008e+03 +1081 1020 -2.199157547087190e+03 +1081 1021 -2.767706810094291e+03 +1081 1022 -3.699147964795159e+03 +1081 1023 -5.136224430633812e+03 +1081 1024 -7.138491575686227e+03 +1081 1025 -9.405703259334558e+03 +1081 1026 -1.103972130715905e+04 +1081 1171 -1.733190400658708e+03 +1081 1172 -1.603684467943639e+03 +1081 1173 -1.394551574360516e+03 +1081 1174 -1.168677565678398e+03 +1081 1175 -9.695072463564467e+02 +1081 1176 -8.148024630667953e+02 +1081 1177 -7.058924559832891e+02 +1081 1178 -6.378158089920689e+02 +1081 1179 -6.052974323170214e+02 +1081 1198 -6.289529049931532e+02 +1081 1199 -5.970589583440841e+02 +1081 1200 -5.429674662554836e+02 +1081 1201 -4.803677035258858e+02 +1081 1202 -4.208084537187723e+02 +1081 1203 -3.710963518270340e+02 +1081 1204 -3.339204550667995e+02 +1081 1205 -3.096178268240471e+02 +1081 1206 -2.976873911031304e+02 +1082 1018 -1.603684467943639e+03 +1082 1019 -1.733190400658708e+03 +1082 1020 -2.019368486704435e+03 +1082 1021 -2.521021940438013e+03 +1082 1022 -3.331754877699595e+03 +1082 1023 -4.560278038130793e+03 +1082 1024 -6.235592529048601e+03 +1082 1025 -8.091232579773156e+03 +1082 1026 -9.405703259334558e+03 +1082 1171 -1.877824568765008e+03 +1082 1172 -1.733190400658708e+03 +1082 1173 -1.500725861549673e+03 +1082 1174 -1.251286952144484e+03 +1082 1175 -1.032880208377977e+03 +1082 1176 -8.643348602446076e+02 +1082 1177 -7.463158073460687e+02 +1082 1178 -6.728335244699299e+02 +1082 1179 -6.378158089920671e+02 +1082 1198 -6.632839990295113e+02 +1082 1199 -6.289529049931513e+02 +1082 1200 -5.708523475060541e+02 +1082 1201 -5.038180997021789e+02 +1082 1202 -4.402579127124382e+02 +1082 1203 -3.873813675510144e+02 +1082 1204 -3.479505460244110e+02 +1082 1205 -3.222285372305477e+02 +1082 1206 -3.096178268240465e+02 +1083 1018 -1.394551574360516e+03 +1083 1019 -1.500725861549673e+03 +1083 1020 -1.733190400658708e+03 +1083 1021 -2.134265778758337e+03 +1083 1022 -2.767706810094291e+03 +1083 1023 -3.699147964795159e+03 +1083 1024 -4.925216936196723e+03 +1083 1025 -6.235592529048601e+03 +1083 1026 -7.138491575686227e+03 +1083 1171 -2.199157547087190e+03 +1083 1172 -2.019368486704435e+03 +1083 1173 -1.733190400658708e+03 +1083 1174 -1.430197816180122e+03 +1083 1175 -1.168677565678393e+03 +1083 1176 -9.695072463564434e+02 +1083 1177 -8.315436028021828e+02 +1083 1178 -7.463158073460687e+02 +1083 1179 -7.058924559832867e+02 +1083 1198 -7.352796046183681e+02 +1083 1199 -6.956816209337401e+02 +1083 1200 -6.289529049931513e+02 +1083 1201 -5.524312223207850e+02 +1083 1202 -4.803677035258846e+02 +1083 1203 -4.208084537187713e+02 +1083 1204 -3.766415408901786e+02 +1083 1205 -3.479505460244110e+02 +1083 1206 -3.339204550667988e+02 +1084 1018 -1.168677565678393e+03 +1084 1019 -1.251286952144480e+03 +1084 1020 -1.430197816180116e+03 +1084 1021 -1.733190400658708e+03 +1084 1022 -2.199157547087190e+03 +1084 1023 -2.861294172280315e+03 +1084 1024 -3.699147964795159e+03 +1084 1025 -4.560278038130793e+03 +1084 1026 -5.136224430633812e+03 +1084 1171 -2.767706810094291e+03 +1084 1172 -2.521021940438013e+03 +1084 1173 -2.134265778758337e+03 +1084 1174 -1.733190400658716e+03 +1084 1175 -1.394551574360516e+03 +1084 1176 -1.141773184361047e+03 +1084 1177 -9.695072463564467e+02 +1084 1178 -8.643348602446105e+02 +1084 1179 -8.148024630667953e+02 +1084 1198 -8.507888885505228e+02 +1084 1199 -8.023274760830702e+02 +1084 1200 -7.211778000851822e+02 +1084 1201 -6.289529049931532e+02 +1084 1202 -5.429674662554836e+02 +1084 1203 -4.725808574370898e+02 +1084 1204 -4.208084537187723e+02 +1084 1205 -3.873813675510154e+02 +1084 1206 -3.710963518270340e+02 +1085 1018 -9.695072463564467e+02 +1085 1019 -1.032880208377977e+03 +1085 1020 -1.168677565678393e+03 +1085 1021 -1.394551574360516e+03 +1085 1022 -1.733190400658708e+03 +1085 1023 -2.199157547087190e+03 +1085 1024 -2.767706810094291e+03 +1085 1025 -3.331754877699595e+03 +1085 1026 -3.699147964795159e+03 +1085 1171 -3.699147964795159e+03 +1085 1172 -3.331754877699595e+03 +1085 1173 -2.767706810094291e+03 +1085 1174 -2.199157547087201e+03 +1085 1175 -1.733190400658708e+03 +1085 1176 -1.394551574360510e+03 +1085 1177 -1.168677565678393e+03 +1085 1178 -1.032880208377977e+03 +1085 1179 -9.695072463564434e+02 +1085 1198 -1.015511306612467e+03 +1085 1199 -9.536070604341750e+02 +1085 1200 -8.507888885505199e+02 +1085 1201 -7.352796046183681e+02 +1085 1202 -6.289529049931513e+02 +1085 1203 -5.429674662554822e+02 +1085 1204 -4.803677035258846e+02 +1085 1205 -4.402579127124382e+02 +1085 1206 -4.208084537187713e+02 +1086 1018 -8.148024630667978e+02 +1086 1019 -8.643348602446105e+02 +1086 1020 -9.695072463564467e+02 +1086 1021 -1.141773184361051e+03 +1086 1022 -1.394551574360516e+03 +1086 1023 -1.733190400658708e+03 +1086 1024 -2.134265778758337e+03 +1086 1025 -2.521021940438013e+03 +1086 1026 -2.767706810094291e+03 +1086 1171 -5.136224430633812e+03 +1086 1172 -4.560278038130793e+03 +1086 1173 -3.699147964795159e+03 +1086 1174 -2.861294172280330e+03 +1086 1175 -2.199157547087190e+03 +1086 1176 -1.733190400658700e+03 +1086 1177 -1.430197816180116e+03 +1086 1178 -1.251286952144480e+03 +1086 1179 -1.168677565678389e+03 +1086 1198 -1.228588660544048e+03 +1086 1199 -1.148042053110076e+03 +1086 1200 -1.015511306612463e+03 +1086 1201 -8.685786765383772e+02 +1086 1202 -7.352796046183660e+02 +1086 1203 -6.289529049931496e+02 +1086 1204 -5.524312223207834e+02 +1086 1205 -5.038180997021776e+02 +1086 1206 -4.803677035258833e+02 +1087 1018 -7.058924559832891e+02 +1087 1019 -7.463158073460687e+02 +1087 1020 -8.315436028021828e+02 +1087 1021 -9.695072463564467e+02 +1087 1022 -1.168677565678393e+03 +1087 1023 -1.430197816180116e+03 +1087 1024 -1.733190400658708e+03 +1087 1025 -2.019368486704435e+03 +1087 1026 -2.199157547087190e+03 +1087 1171 -7.138491575686227e+03 +1087 1172 -6.235592529048601e+03 +1087 1173 -4.925216936196723e+03 +1087 1174 -3.699147964795180e+03 +1087 1175 -2.767706810094291e+03 +1087 1176 -2.134265778758326e+03 +1087 1177 -1.733190400658708e+03 +1087 1178 -1.500725861549673e+03 +1087 1179 -1.394551574360510e+03 +1087 1198 -1.471477730866027e+03 +1087 1199 -1.368148367306964e+03 +1087 1200 -1.199743197084304e+03 +1087 1201 -1.015511306612467e+03 +1087 1202 -8.507888885505199e+02 +1087 1203 -7.211778000851799e+02 +1087 1204 -6.289529049931513e+02 +1087 1205 -5.708523475060541e+02 +1087 1206 -5.429674662554822e+02 +1088 1018 -6.378158089920689e+02 +1088 1019 -6.728335244699299e+02 +1088 1020 -7.463158073460687e+02 +1088 1021 -8.643348602446105e+02 +1088 1022 -1.032880208377977e+03 +1088 1023 -1.251286952144480e+03 +1088 1024 -1.500725861549673e+03 +1088 1025 -1.733190400658708e+03 +1088 1026 -1.877824568765008e+03 +1088 1171 -9.405703259334558e+03 +1088 1172 -8.091232579773156e+03 +1088 1173 -6.235592529048601e+03 +1088 1174 -4.560278038130823e+03 +1088 1175 -3.331754877699595e+03 +1088 1176 -2.521021940438000e+03 +1088 1177 -2.019368486704435e+03 +1088 1178 -1.733190400658708e+03 +1088 1179 -1.603684467943633e+03 +1088 1198 -1.697437739078449e+03 +1088 1199 -1.571600895131404e+03 +1088 1200 -1.368148367306964e+03 +1088 1201 -1.148042053110080e+03 +1088 1202 -9.536070604341750e+02 +1088 1203 -8.023274760830675e+02 +1088 1204 -6.956816209337401e+02 +1088 1205 -6.289529049931513e+02 +1088 1206 -5.970589583440825e+02 +1089 1018 -6.052974323170231e+02 +1089 1019 -6.378158089920689e+02 +1089 1020 -7.058924559832891e+02 +1089 1021 -8.148024630667978e+02 +1089 1022 -9.695072463564467e+02 +1089 1023 -1.168677565678393e+03 +1089 1024 -1.394551574360516e+03 +1089 1025 -1.603684467943639e+03 +1089 1026 -1.733190400658708e+03 +1089 1171 -1.103972130715905e+04 +1089 1172 -9.405703259334558e+03 +1089 1173 -7.138491575686227e+03 +1089 1174 -5.136224430633847e+03 +1089 1175 -3.699147964795159e+03 +1089 1176 -2.767706810094276e+03 +1089 1177 -2.199157547087190e+03 +1089 1178 -1.877824568765008e+03 +1089 1179 -1.733190400658700e+03 +1089 1198 -1.837845240586531e+03 +1089 1199 -1.697437739078442e+03 +1089 1200 -1.471477730866021e+03 +1089 1201 -1.228588660544048e+03 +1089 1202 -1.015511306612463e+03 +1089 1203 -8.507888885505170e+02 +1089 1204 -7.352796046183660e+02 +1089 1205 -6.632839990295092e+02 +1089 1206 -6.289529049931496e+02 +1108 1018 -6.289529049931513e+02 +1108 1019 -6.632839990295092e+02 +1108 1020 -7.352796046183660e+02 +1108 1021 -8.507888885505199e+02 +1108 1022 -1.015511306612463e+03 +1108 1023 -1.228588660544043e+03 +1108 1024 -1.471477730866021e+03 +1108 1025 -1.697437739078442e+03 +1108 1026 -1.837845240586523e+03 +1108 1045 -1.733190400658708e+03 +1108 1046 -1.877824568765008e+03 +1108 1047 -2.199157547087190e+03 +1108 1048 -2.767706810094291e+03 +1108 1049 -3.699147964795159e+03 +1108 1050 -5.136224430633812e+03 +1108 1051 -7.138491575686227e+03 +1108 1052 -9.405703259334558e+03 +1108 1053 -1.103972130715905e+04 +1108 1198 -1.733190400658716e+03 +1108 1199 -1.603684467943639e+03 +1108 1200 -1.394551574360516e+03 +1108 1201 -1.168677565678398e+03 +1108 1202 -9.695072463564467e+02 +1108 1203 -8.148024630667953e+02 +1108 1204 -7.058924559832891e+02 +1108 1205 -6.378158089920689e+02 +1108 1206 -6.052974323170214e+02 +1109 1018 -5.970589583440841e+02 +1109 1019 -6.289529049931513e+02 +1109 1020 -6.956816209337401e+02 +1109 1021 -8.023274760830702e+02 +1109 1022 -9.536070604341750e+02 +1109 1023 -1.148042053110076e+03 +1109 1024 -1.368148367306964e+03 +1109 1025 -1.571600895131404e+03 +1109 1026 -1.697437739078442e+03 +1109 1045 -1.603684467943639e+03 +1109 1046 -1.733190400658708e+03 +1109 1047 -2.019368486704435e+03 +1109 1048 -2.521021940438013e+03 +1109 1049 -3.331754877699595e+03 +1109 1050 -4.560278038130793e+03 +1109 1051 -6.235592529048601e+03 +1109 1052 -8.091232579773156e+03 +1109 1053 -9.405703259334558e+03 +1109 1198 -1.877824568765017e+03 +1109 1199 -1.733190400658708e+03 +1109 1200 -1.500725861549673e+03 +1109 1201 -1.251286952144484e+03 +1109 1202 -1.032880208377977e+03 +1109 1203 -8.643348602446076e+02 +1109 1204 -7.463158073460687e+02 +1109 1205 -6.728335244699299e+02 +1109 1206 -6.378158089920671e+02 +1110 1018 -5.429674662554836e+02 +1110 1019 -5.708523475060541e+02 +1110 1020 -6.289529049931513e+02 +1110 1021 -7.211778000851822e+02 +1110 1022 -8.507888885505199e+02 +1110 1023 -1.015511306612463e+03 +1110 1024 -1.199743197084304e+03 +1110 1025 -1.368148367306964e+03 +1110 1026 -1.471477730866021e+03 +1110 1045 -1.394551574360516e+03 +1110 1046 -1.500725861549673e+03 +1110 1047 -1.733190400658708e+03 +1110 1048 -2.134265778758337e+03 +1110 1049 -2.767706810094291e+03 +1110 1050 -3.699147964795159e+03 +1110 1051 -4.925216936196723e+03 +1110 1052 -6.235592529048601e+03 +1110 1053 -7.138491575686227e+03 +1110 1198 -2.199157547087201e+03 +1110 1199 -2.019368486704435e+03 +1110 1200 -1.733190400658708e+03 +1110 1201 -1.430197816180122e+03 +1110 1202 -1.168677565678393e+03 +1110 1203 -9.695072463564434e+02 +1110 1204 -8.315436028021828e+02 +1110 1205 -7.463158073460687e+02 +1110 1206 -7.058924559832867e+02 +1111 1018 -4.803677035258846e+02 +1111 1019 -5.038180997021776e+02 +1111 1020 -5.524312223207834e+02 +1111 1021 -6.289529049931513e+02 +1111 1022 -7.352796046183660e+02 +1111 1023 -8.685786765383741e+02 +1111 1024 -1.015511306612463e+03 +1111 1025 -1.148042053110076e+03 +1111 1026 -1.228588660544043e+03 +1111 1045 -1.168677565678393e+03 +1111 1046 -1.251286952144480e+03 +1111 1047 -1.430197816180116e+03 +1111 1048 -1.733190400658708e+03 +1111 1049 -2.199157547087190e+03 +1111 1050 -2.861294172280315e+03 +1111 1051 -3.699147964795159e+03 +1111 1052 -4.560278038130793e+03 +1111 1053 -5.136224430633812e+03 +1111 1198 -2.767706810094306e+03 +1111 1199 -2.521021940438013e+03 +1111 1200 -2.134265778758337e+03 +1111 1201 -1.733190400658716e+03 +1111 1202 -1.394551574360516e+03 +1111 1203 -1.141773184361047e+03 +1111 1204 -9.695072463564467e+02 +1111 1205 -8.643348602446105e+02 +1111 1206 -8.148024630667953e+02 +1112 1018 -4.208084537187723e+02 +1112 1019 -4.402579127124382e+02 +1112 1020 -4.803677035258846e+02 +1112 1021 -5.429674662554836e+02 +1112 1022 -6.289529049931513e+02 +1112 1023 -7.352796046183660e+02 +1112 1024 -8.507888885505199e+02 +1112 1025 -9.536070604341750e+02 +1112 1026 -1.015511306612463e+03 +1112 1045 -9.695072463564467e+02 +1112 1046 -1.032880208377977e+03 +1112 1047 -1.168677565678393e+03 +1112 1048 -1.394551574360516e+03 +1112 1049 -1.733190400658708e+03 +1112 1050 -2.199157547087190e+03 +1112 1051 -2.767706810094291e+03 +1112 1052 -3.331754877699595e+03 +1112 1053 -3.699147964795159e+03 +1112 1198 -3.699147964795180e+03 +1112 1199 -3.331754877699595e+03 +1112 1200 -2.767706810094291e+03 +1112 1201 -2.199157547087201e+03 +1112 1202 -1.733190400658708e+03 +1112 1203 -1.394551574360510e+03 +1112 1204 -1.168677565678393e+03 +1112 1205 -1.032880208377977e+03 +1112 1206 -9.695072463564434e+02 +1113 1018 -3.710963518270349e+02 +1113 1019 -3.873813675510154e+02 +1113 1020 -4.208084537187723e+02 +1113 1021 -4.725808574370910e+02 +1113 1022 -5.429674662554836e+02 +1113 1023 -6.289529049931513e+02 +1113 1024 -7.211778000851822e+02 +1113 1025 -8.023274760830702e+02 +1113 1026 -8.507888885505199e+02 +1113 1045 -8.148024630667978e+02 +1113 1046 -8.643348602446105e+02 +1113 1047 -9.695072463564467e+02 +1113 1048 -1.141773184361051e+03 +1113 1049 -1.394551574360516e+03 +1113 1050 -1.733190400658708e+03 +1113 1051 -2.134265778758337e+03 +1113 1052 -2.521021940438013e+03 +1113 1053 -2.767706810094291e+03 +1113 1198 -5.136224430633847e+03 +1113 1199 -4.560278038130793e+03 +1113 1200 -3.699147964795159e+03 +1113 1201 -2.861294172280330e+03 +1113 1202 -2.199157547087190e+03 +1113 1203 -1.733190400658700e+03 +1113 1204 -1.430197816180116e+03 +1113 1205 -1.251286952144480e+03 +1113 1206 -1.168677565678389e+03 +1114 1018 -3.339204550667995e+02 +1114 1019 -3.479505460244110e+02 +1114 1020 -3.766415408901786e+02 +1114 1021 -4.208084537187723e+02 +1114 1022 -4.803677035258846e+02 +1114 1023 -5.524312223207834e+02 +1114 1024 -6.289529049931513e+02 +1114 1025 -6.956816209337401e+02 +1114 1026 -7.352796046183660e+02 +1114 1045 -7.058924559832891e+02 +1114 1046 -7.463158073460687e+02 +1114 1047 -8.315436028021828e+02 +1114 1048 -9.695072463564467e+02 +1114 1049 -1.168677565678393e+03 +1114 1050 -1.430197816180116e+03 +1114 1051 -1.733190400658708e+03 +1114 1052 -2.019368486704435e+03 +1114 1053 -2.199157547087190e+03 +1114 1198 -7.138491575686282e+03 +1114 1199 -6.235592529048601e+03 +1114 1200 -4.925216936196723e+03 +1114 1201 -3.699147964795180e+03 +1114 1202 -2.767706810094291e+03 +1114 1203 -2.134265778758326e+03 +1114 1204 -1.733190400658708e+03 +1114 1205 -1.500725861549673e+03 +1114 1206 -1.394551574360510e+03 +1115 1018 -3.096178268240471e+02 +1115 1019 -3.222285372305477e+02 +1115 1020 -3.479505460244110e+02 +1115 1021 -3.873813675510154e+02 +1115 1022 -4.402579127124382e+02 +1115 1023 -5.038180997021776e+02 +1115 1024 -5.708523475060541e+02 +1115 1025 -6.289529049931513e+02 +1115 1026 -6.632839990295092e+02 +1115 1045 -6.378158089920689e+02 +1115 1046 -6.728335244699299e+02 +1115 1047 -7.463158073460687e+02 +1115 1048 -8.643348602446105e+02 +1115 1049 -1.032880208377977e+03 +1115 1050 -1.251286952144480e+03 +1115 1051 -1.500725861549673e+03 +1115 1052 -1.733190400658708e+03 +1115 1053 -1.877824568765008e+03 +1115 1198 -9.405703259334639e+03 +1115 1199 -8.091232579773156e+03 +1115 1200 -6.235592529048601e+03 +1115 1201 -4.560278038130823e+03 +1115 1202 -3.331754877699595e+03 +1115 1203 -2.521021940438000e+03 +1115 1204 -2.019368486704435e+03 +1115 1205 -1.733190400658708e+03 +1115 1206 -1.603684467943633e+03 +1116 1018 -2.976873911031311e+02 +1116 1019 -3.096178268240471e+02 +1116 1020 -3.339204550667995e+02 +1116 1021 -3.710963518270349e+02 +1116 1022 -4.208084537187723e+02 +1116 1023 -4.803677035258846e+02 +1116 1024 -5.429674662554836e+02 +1116 1025 -5.970589583440841e+02 +1116 1026 -6.289529049931513e+02 +1116 1045 -6.052974323170231e+02 +1116 1046 -6.378158089920689e+02 +1116 1047 -7.058924559832891e+02 +1116 1048 -8.148024630667978e+02 +1116 1049 -9.695072463564467e+02 +1116 1050 -1.168677565678393e+03 +1116 1051 -1.394551574360516e+03 +1116 1052 -1.603684467943639e+03 +1116 1053 -1.733190400658708e+03 +1116 1198 -1.103972130715916e+04 +1116 1199 -9.405703259334558e+03 +1116 1200 -7.138491575686227e+03 +1116 1201 -5.136224430633847e+03 +1116 1202 -3.699147964795159e+03 +1116 1203 -2.767706810094276e+03 +1116 1204 -2.199157547087190e+03 +1116 1205 -1.877824568765008e+03 +1116 1206 -1.733190400658700e+03 +1135 1 -1.700798369737711e+00 +1135 2 -1.834202782095809e+00 +1135 3 -2.127632926075190e+00 +1135 4 -2.637907455781169e+00 +1135 5 -3.453060562076191e+00 +1135 6 -4.669631336599156e+00 +1135 7 -6.299099162391054e+00 +1135 8 -8.071325480070072e+00 +1135 9 -9.309030792769882e+00 +1136 1 -1.580146520641762e+00 +1136 2 -1.700304287691523e+00 +1136 3 -1.963336279373048e+00 +1136 4 -2.417005841266988e+00 +1136 5 -3.133183425269243e+00 +1136 6 -4.185658502884530e+00 +1136 7 -5.570087003404034e+00 +1136 8 -7.048685880176444e+00 +1136 9 -8.066954975435394e+00 +1137 1 -1.383797447945426e+00 +1137 2 -1.483315279803830e+00 +1137 3 -1.699376260738821e+00 +1137 4 -2.066818321041631e+00 +1137 5 -2.635278801261590e+00 +1137 6 -3.449228596936940e+00 +1137 7 -4.488193608069785e+00 +1137 8 -5.565201275718212e+00 +1137 9 -6.290210553864870e+00 +1138 1 -1.169434425459564e+00 +1138 2 -1.247806914653008e+00 +1138 3 -1.416301185435251e+00 +1138 4 -1.698127054340231e+00 +1138 5 -2.123978477656216e+00 +1138 6 -2.715757595785386e+00 +1138 7 -3.445863741183363e+00 +1138 8 -4.177976612941944e+00 +1138 9 -4.658652176388032e+00 +1139 1 -9.781971935804883e-01 +1139 2 -1.039040084931998e+00 +1139 3 -1.168592602973062e+00 +1139 4 -1.381795971117338e+00 +1139 5 -1.696708070875342e+00 +1139 6 -2.122037567431335e+00 +1139 7 -2.630348460087113e+00 +1139 8 -3.124724590079223e+00 +1139 9 -3.442042950044956e+00 +1140 1 -8.280348874333169e-01 +1140 2 -8.760831322739783e-01 +1140 3 -9.775415521883353e-01 +1140 4 -1.142196099558672e+00 +1140 5 -1.380732659198229e+00 +1140 6 -1.695290746872716e+00 +1140 7 -2.061445467603243e+00 +1140 8 -2.408804959610721e+00 +1140 9 -2.627730342898523e+00 +1141 1 -7.213705036951628e-01 +1141 2 -7.608976907202907e-01 +1141 3 -8.438248644838543e-01 +1141 4 -9.769654991054337e-01 +1141 5 -1.167012788191864e+00 +1141 6 -1.413135187769625e+00 +1141 7 -1.694045742383499e+00 +1141 8 -1.955682739591197e+00 +1141 9 -2.118396562240783e+00 +1142 1 -6.542581359308065e-01 +1142 2 -6.886845676773539e-01 +1142 3 -7.605965803633626e-01 +1142 4 -8.752224916572976e-01 +1142 5 -1.037234953557933e+00 +1142 6 -1.244555158183441e+00 +1142 7 -1.478144899756304e+00 +1142 8 -1.693122493671797e+00 +1142 9 -1.825671816950789e+00 +1143 1 -6.220727691019352e-01 +1143 2 -6.541284293696698e-01 +1143 3 -7.209424339906940e-01 +1143 4 -8.270594513937112e-01 +1143 5 -9.763110130362493e-01 +1143 6 -1.166173404860229e+00 +1143 7 -1.378737383755040e+00 +1143 8 -1.573221355670595e+00 +1143 9 -1.692631530404347e+00 +1144 577 -9.574614729634387e+00 +1144 578 -1.033025206259608e+01 +1144 579 -1.199392684783545e+01 +1144 580 -1.489187979900571e+01 +1144 581 -1.953249673072867e+01 +1144 582 -2.648026715992624e+01 +1144 583 -3.582072268161383e+01 +1144 584 -4.601776203532707e+01 +1144 585 -5.316004558269722e+01 +1144 1711 -9.574614729634387e+00 +1144 1712 -8.894152732809214e+00 +1144 1713 -7.787064219095081e+00 +1144 1714 -6.578858018778778e+00 +1144 1715 -5.501432160761325e+00 +1144 1716 -4.655741575368517e+00 +1144 1717 -4.055212971361419e+00 +1144 1718 -3.677452266447854e+00 +1144 1719 -3.496313214985748e+00 +1144 1990 -3.474506751309654e+00 +1144 1991 -3.307075579356515e+00 +1144 1992 -3.021655125742912e+00 +1144 1993 -2.688901476974079e+00 +1144 1994 -2.369680831172465e+00 +1144 1995 -2.101098045763917e+00 +1144 1996 -1.898863298003203e+00 +1144 1997 -1.765972963745819e+00 +1144 1998 -1.700527108287443e+00 +1145 577 -8.894152732809214e+00 +1145 578 -9.574614729634382e+00 +1145 579 -1.106556701616914e+01 +1145 580 -1.364121235299753e+01 +1145 581 -1.771654764348813e+01 +1145 582 -2.372339702886327e+01 +1145 583 -3.165228467591596e+01 +1145 584 -4.014998583800268e+01 +1145 585 -4.601776203532702e+01 +1145 1711 -1.033025206259609e+01 +1145 1712 -9.574614729634387e+00 +1145 1713 -8.350436340807201e+00 +1145 1714 -7.022334130042162e+00 +1145 1715 -5.845568772761844e+00 +1145 1716 -4.927408805516037e+00 +1145 1717 -4.278637194083236e+00 +1145 1718 -3.872006983680974e+00 +1145 1719 -3.677452266447854e+00 +1145 1990 -3.654050001394688e+00 +1145 1991 -3.474506751309654e+00 +1145 1992 -3.169027908859175e+00 +1145 1993 -2.813872708878962e+00 +1145 1994 -2.474220532866516e+00 +1145 1995 -2.189307683194851e+00 +1145 1996 -1.975331417147858e+00 +1145 1997 -1.835000056862136e+00 +1145 1998 -1.765972963745819e+00 +1146 577 -7.787064219095081e+00 +1146 578 -8.350436340807200e+00 +1146 579 -9.574614729634391e+00 +1146 580 -1.165955788548229e+01 +1146 581 -1.489187979900572e+01 +1146 582 -1.953249673072868e+01 +1146 583 -2.547425580969112e+01 +1146 584 -3.165228467591601e+01 +1146 585 -3.582072268161387e+01 +1146 1711 -1.199392684783545e+01 +1146 1712 -1.106556701616914e+01 +1146 1713 -9.574614729634387e+00 +1146 1714 -7.976517934049889e+00 +1146 1715 -6.578858018778778e+00 +1146 1716 -5.501432160761325e+00 +1146 1717 -4.747658828821052e+00 +1146 1718 -4.278637194083233e+00 +1146 1719 -4.055212971361416e+00 +1146 1990 -4.028382153902572e+00 +1146 1991 -3.822855655704617e+00 +1146 1992 -3.474506751309654e+00 +1146 1993 -3.071728502881820e+00 +1146 1994 -2.688901476974079e+00 +1146 1995 -2.369680831172465e+00 +1146 1996 -2.131159503067379e+00 +1146 1997 -1.975331417147857e+00 +1146 1998 -1.898863298003202e+00 +1147 577 -6.578858018778778e+00 +1147 578 -7.022334130042159e+00 +1147 579 -7.976517934049893e+00 +1147 580 -9.574614729634382e+00 +1147 581 -1.199392684783545e+01 +1147 582 -1.536382589350012e+01 +1147 583 -1.953249673072865e+01 +1147 584 -2.372339702886327e+01 +1147 585 -2.648026715992622e+01 +1147 1711 -1.489187979900572e+01 +1147 1712 -1.364121235299754e+01 +1147 1713 -1.165955788548230e+01 +1147 1714 -9.574614729634387e+00 +1147 1715 -7.787064219095081e+00 +1147 1716 -6.434009698761969e+00 +1147 1717 -5.501432160761331e+00 +1147 1718 -4.927408805516037e+00 +1147 1719 -4.655741575368517e+00 +1147 1990 -4.623196535591008e+00 +1147 1991 -4.374472772345656e+00 +1147 1992 -3.955287673172523e+00 +1147 1993 -3.474506751309654e+00 +1147 1994 -3.021655125742912e+00 +1147 1995 -2.647316772054515e+00 +1147 1996 -2.369680831172467e+00 +1147 1997 -2.189307683194851e+00 +1147 1998 -2.101098045763917e+00 +1148 577 -5.501432160761325e+00 +1148 578 -5.845568772761842e+00 +1148 579 -6.578858018778782e+00 +1148 580 -7.787064219095077e+00 +1148 581 -9.574614729634387e+00 +1148 582 -1.199392684783545e+01 +1148 583 -1.489187979900571e+01 +1148 584 -1.771654764348815e+01 +1148 585 -1.953249673072867e+01 +1148 1711 -1.953249673072867e+01 +1148 1712 -1.771654764348813e+01 +1148 1713 -1.489187979900572e+01 +1148 1714 -1.199392684783545e+01 +1148 1715 -9.574614729634387e+00 +1148 1716 -7.787064219095081e+00 +1148 1717 -6.578858018778784e+00 +1148 1718 -5.845568772761844e+00 +1148 1719 -5.501432160761325e+00 +1148 1990 -5.460334268221786e+00 +1148 1991 -5.147173192788435e+00 +1148 1992 -4.623196535591008e+00 +1148 1993 -4.028382153902572e+00 +1148 1994 -3.474506751309654e+00 +1148 1995 -3.021655125742912e+00 +1148 1996 -2.688901476974081e+00 +1148 1997 -2.474220532866516e+00 +1148 1998 -2.369680831172465e+00 +1149 577 -4.655741575368517e+00 +1149 578 -4.927408805516035e+00 +1149 579 -5.501432160761327e+00 +1149 580 -6.434009698761967e+00 +1149 581 -7.787064219095081e+00 +1149 582 -9.574614729634391e+00 +1149 583 -1.165955788548229e+01 +1149 584 -1.364121235299755e+01 +1149 585 -1.489187979900572e+01 +1149 1711 -2.648026715992622e+01 +1149 1712 -2.372339702886325e+01 +1149 1713 -1.953249673072867e+01 +1149 1714 -1.536382589350010e+01 +1149 1715 -1.199392684783545e+01 +1149 1716 -9.574614729634387e+00 +1149 1717 -7.976517934049897e+00 +1149 1718 -7.022334130042162e+00 +1149 1719 -6.578858018778778e+00 +1149 1990 -6.526086991349062e+00 +1149 1991 -6.125338181409234e+00 +1149 1992 -5.460334268221786e+00 +1149 1993 -4.714211996655912e+00 +1149 1994 -4.028382153902572e+00 +1149 1995 -3.474506751309654e+00 +1149 1996 -3.071728502881823e+00 +1149 1997 -2.813872708878962e+00 +1149 1998 -2.688901476974079e+00 +1150 577 -4.055212971361419e+00 +1150 578 -4.278637194083235e+00 +1150 579 -4.747658828821055e+00 +1150 580 -5.501432160761327e+00 +1150 581 -6.578858018778784e+00 +1150 582 -7.976517934049901e+00 +1150 583 -9.574614729634391e+00 +1150 584 -1.106556701616916e+01 +1150 585 -1.199392684783546e+01 +1150 1711 -3.582072268161380e+01 +1150 1712 -3.165228467591593e+01 +1150 1713 -2.547425580969110e+01 +1150 1714 -1.953249673072864e+01 +1150 1715 -1.489187979900570e+01 +1150 1716 -1.165955788548229e+01 +1150 1717 -9.574614729634387e+00 +1150 1718 -8.350436340807194e+00 +1150 1719 -7.787064219095073e+00 +1150 1990 -7.720270179432522e+00 +1150 1991 -7.214758870193810e+00 +1150 1992 -6.382855547803861e+00 +1150 1993 -5.460334268221780e+00 +1150 1994 -4.623196535591005e+00 +1150 1995 -3.955287673172521e+00 +1150 1996 -3.474506751309654e+00 +1150 1997 -3.169027908859173e+00 +1150 1998 -3.021655125742909e+00 +1151 577 -3.677452266447854e+00 +1151 578 -3.872006983680973e+00 +1151 579 -4.278637194083235e+00 +1151 580 -4.927408805516035e+00 +1151 581 -5.845568772761844e+00 +1151 582 -7.022334130042167e+00 +1151 583 -8.350436340807200e+00 +1151 584 -9.574614729634391e+00 +1151 585 -1.033025206259609e+01 +1151 1711 -4.601776203532702e+01 +1151 1712 -4.014998583800264e+01 +1151 1713 -3.165228467591599e+01 +1151 1714 -2.372339702886325e+01 +1151 1715 -1.771654764348813e+01 +1151 1716 -1.364121235299754e+01 +1151 1717 -1.106556701616915e+01 +1151 1718 -9.574614729634387e+00 +1151 1719 -8.894152732809214e+00 +1151 1990 -8.813722702286093e+00 +1151 1991 -8.206746303750586e+00 +1151 1992 -7.214758870193816e+00 +1151 1993 -6.125338181409234e+00 +1151 1994 -5.147173192788435e+00 +1151 1995 -4.374472772345656e+00 +1151 1996 -3.822855655704620e+00 +1151 1997 -3.474506751309654e+00 +1151 1998 -3.307075579356515e+00 +1152 577 -3.496313214985748e+00 +1152 578 -3.677452266447852e+00 +1152 579 -4.055212971361418e+00 +1152 580 -4.655741575368515e+00 +1152 581 -5.501432160761325e+00 +1152 582 -6.578858018778782e+00 +1152 583 -7.787064219095077e+00 +1152 584 -8.894152732809218e+00 +1152 585 -9.574614729634387e+00 +1152 1711 -5.316004558269722e+01 +1152 1712 -4.601776203532702e+01 +1152 1713 -3.582072268161387e+01 +1152 1714 -2.648026715992622e+01 +1152 1715 -1.953249673072867e+01 +1152 1716 -1.489187979900572e+01 +1152 1717 -1.199392684783546e+01 +1152 1718 -1.033025206259609e+01 +1152 1719 -9.574614729634387e+00 +1152 1990 -9.485456953123382e+00 +1152 1991 -8.813722702286093e+00 +1152 1992 -7.720270179432532e+00 +1152 1993 -6.526086991349062e+00 +1152 1994 -5.460334268221786e+00 +1152 1995 -4.623196535591008e+00 +1152 1996 -4.028382153902576e+00 +1152 1997 -3.654050001394688e+00 +1152 1998 -3.474506751309654e+00 +1153 865 -5.416220002058462e+01 +1153 866 -5.847168336242214e+01 +1153 867 -6.797204698756194e+01 +1153 868 -8.455751811575999e+01 +1153 869 -1.112023202068744e+02 +1153 870 -1.512628164030903e+02 +1153 871 -2.053883607687485e+02 +1153 872 -2.647767438527630e+02 +1153 873 -3.065373731090118e+02 +1153 1432 -5.416220002058462e+01 +1153 1433 -5.028460369863171e+01 +1153 1434 -4.398263164573866e+01 +1153 1435 -3.711530555640490e+01 +1153 1436 -3.100122392289864e+01 +1153 1437 -2.620940698061742e+01 +1153 1438 -2.281096793104268e+01 +1153 1439 -2.067515029553633e+01 +1153 1440 -1.965157861598590e+01 +1153 1567 -1.965477828103598e+01 +1153 1568 -1.870055440211151e+01 +1153 1569 -1.707507926940499e+01 +1153 1570 -1.518203609416468e+01 +1153 1571 -1.336813651340294e+01 +1153 1572 -1.184372960400065e+01 +1153 1573 -1.069703031088084e+01 +1153 1574 -9.944085360683063e+00 +1153 1575 -9.573445684409064e+00 +1154 865 -5.028460369863171e+01 +1154 866 -5.416220002058462e+01 +1154 867 -6.266865647386102e+01 +1154 868 -7.739429142416689e+01 +1154 869 -1.007640600234616e+02 +1154 870 -1.353445496343034e+02 +1154 871 -1.811983282511272e+02 +1154 872 -2.305668762810884e+02 +1154 873 -2.647767438527630e+02 +1154 1432 -5.847168336242214e+01 +1154 1433 -5.416220002058462e+01 +1154 1434 -4.718848846240646e+01 +1154 1435 -3.963467701820890e+01 +1154 1436 -3.295302401855845e+01 +1154 1437 -2.774798050936779e+01 +1154 1438 -2.407490908992506e+01 +1154 1439 -2.177494503977683e+01 +1154 1440 -2.067515029553633e+01 +1154 1567 -2.067858569511584e+01 +1154 1568 -1.965477828103598e+01 +1154 1569 -1.791417887437397e+01 +1154 1570 -1.589274010473518e+01 +1154 1571 -1.396191802264486e+01 +1154 1572 -1.234420052045069e+01 +1154 1573 -1.113049648221346e+01 +1154 1574 -1.033512964800000e+01 +1154 1575 -9.944085360683063e+00 +1155 865 -4.398263164573866e+01 +1155 866 -4.718848846240646e+01 +1155 867 -5.416220002058468e+01 +1155 868 -6.606134132672695e+01 +1155 869 -8.455751811576010e+01 +1155 870 -1.112023202068745e+02 +1155 871 -1.454508347890308e+02 +1155 872 -1.811983282511275e+02 +1155 873 -2.053883607687489e+02 +1155 1432 -6.797204698756184e+01 +1155 1433 -6.266865647386096e+01 +1155 1434 -5.416220002058462e+01 +1155 1435 -4.506046026496942e+01 +1155 1436 -3.711530555640482e+01 +1155 1437 -3.100122392289858e+01 +1155 1438 -2.672989532903555e+01 +1155 1439 -2.407490908992506e+01 +1155 1440 -2.281096793104268e+01 +1155 1567 -2.281491025526307e+01 +1155 1568 -2.164167292784031e+01 +1155 1569 -1.965477828103598e+01 +1155 1570 -1.736013665098131e+01 +1155 1571 -1.518203609416466e+01 +1155 1572 -1.336813651340292e+01 +1155 1573 -1.201426721054981e+01 +1155 1574 -1.113049648221346e+01 +1155 1575 -1.069703031088084e+01 +1156 865 -3.711530555640490e+01 +1156 866 -3.963467701820890e+01 +1156 867 -4.506046026496946e+01 +1156 868 -5.416220002058468e+01 +1156 869 -6.797204698756201e+01 +1156 870 -8.726265053974954e+01 +1156 871 -1.112023202068745e+02 +1156 872 -1.353445496343036e+02 +1156 873 -1.512628164030906e+02 +1156 1432 -8.455751811575986e+01 +1156 1433 -7.739429142416682e+01 +1156 1434 -6.606134132672688e+01 +1156 1435 -5.416220002058462e+01 +1156 1436 -4.398263164573857e+01 +1156 1437 -3.629276779865588e+01 +1156 1438 -3.100122392289858e+01 +1156 1439 -2.774798050936779e+01 +1156 1440 -2.620940698061742e+01 +1156 1567 -2.621419542240643e+01 +1156 1568 -2.479209926714913e+01 +1156 1569 -2.239757409043196e+01 +1156 1570 -1.965477828103598e+01 +1156 1571 -1.707507926940496e+01 +1156 1572 -1.494561758129197e+01 +1156 1573 -1.336813651340292e+01 +1156 1574 -1.234420052045069e+01 +1156 1575 -1.184372960400065e+01 +1157 865 -3.100122392289864e+01 +1157 866 -3.295302401855845e+01 +1157 867 -3.711530555640486e+01 +1157 868 -4.398263164573862e+01 +1157 869 -5.416220002058462e+01 +1157 870 -6.797204698756194e+01 +1157 871 -8.455751811575999e+01 +1157 872 -1.007640600234616e+02 +1157 873 -1.112023202068744e+02 +1157 1432 -1.112023202068744e+02 +1157 1433 -1.007640600234616e+02 +1157 1434 -8.455751811576010e+01 +1157 1435 -6.797204698756201e+01 +1157 1436 -5.416220002058462e+01 +1157 1437 -4.398263164573857e+01 +1157 1438 -3.711530555640482e+01 +1157 1439 -3.295302401855845e+01 +1157 1440 -3.100122392289864e+01 +1157 1567 -3.100728135248165e+01 +1157 1568 -2.921308657465229e+01 +1157 1569 -2.621419542240647e+01 +1157 1570 -2.281491025526310e+01 +1157 1571 -1.965477828103598e+01 +1157 1572 -1.707507926940496e+01 +1157 1573 -1.518203609416466e+01 +1157 1574 -1.396191802264486e+01 +1157 1575 -1.336813651340294e+01 +1158 865 -2.620940698061742e+01 +1158 866 -2.774798050936779e+01 +1158 867 -3.100122392289861e+01 +1158 868 -3.629276779865592e+01 +1158 869 -4.398263164573857e+01 +1158 870 -5.416220002058456e+01 +1158 871 -6.606134132672679e+01 +1158 872 -7.739429142416682e+01 +1158 873 -8.455751811575986e+01 +1158 1432 -1.512628164030906e+02 +1158 1433 -1.353445496343036e+02 +1158 1434 -1.112023202068747e+02 +1158 1435 -8.726265053974967e+01 +1158 1436 -6.797204698756201e+01 +1158 1437 -5.416220002058462e+01 +1158 1438 -4.506046026496942e+01 +1158 1439 -3.963467701820890e+01 +1158 1440 -3.711530555640490e+01 +1158 1567 -3.712309913086538e+01 +1158 1568 -3.482168460593341e+01 +1158 1569 -3.100728135248171e+01 +1158 1570 -2.673481743251412e+01 +1158 1571 -2.281491025526310e+01 +1158 1572 -1.965477828103598e+01 +1158 1573 -1.736013665098131e+01 +1158 1574 -1.589274010473518e+01 +1158 1575 -1.518203609416468e+01 +1159 865 -2.281096793104268e+01 +1159 866 -2.407490908992506e+01 +1159 867 -2.672989532903557e+01 +1159 868 -3.100122392289861e+01 +1159 869 -3.711530555640482e+01 +1159 870 -4.506046026496937e+01 +1159 871 -5.416220002058456e+01 +1159 872 -6.266865647386096e+01 +1159 873 -6.797204698756184e+01 +1159 1432 -2.053883607687489e+02 +1159 1433 -1.811983282511275e+02 +1159 1434 -1.454508347890311e+02 +1159 1435 -1.112023202068747e+02 +1159 1436 -8.455751811576010e+01 +1159 1437 -6.606134132672688e+01 +1159 1438 -5.416220002058462e+01 +1159 1439 -4.718848846240646e+01 +1159 1440 -4.398263164573866e+01 +1159 1567 -4.399251628020367e+01 +1159 1568 -4.108257963331437e+01 +1159 1569 -3.630032063351624e+01 +1159 1570 -3.100728135248171e+01 +1159 1571 -2.621419542240647e+01 +1159 1572 -2.239757409043196e+01 +1159 1573 -1.965477828103598e+01 +1159 1574 -1.791417887437397e+01 +1159 1575 -1.707507926940499e+01 +1160 865 -2.067515029553633e+01 +1160 866 -2.177494503977683e+01 +1160 867 -2.407490908992508e+01 +1160 868 -2.774798050936781e+01 +1160 869 -3.295302401855845e+01 +1160 870 -3.963467701820886e+01 +1160 871 -4.718848846240642e+01 +1160 872 -5.416220002058462e+01 +1160 873 -5.847168336242214e+01 +1160 1432 -2.647767438527630e+02 +1160 1433 -2.305668762810884e+02 +1160 1434 -1.811983282511275e+02 +1160 1435 -1.353445496343036e+02 +1160 1436 -1.007640600234616e+02 +1160 1437 -7.739429142416682e+01 +1160 1438 -6.266865647386096e+01 +1160 1439 -5.416220002058462e+01 +1160 1440 -5.028460369863171e+01 +1160 1567 -5.029652653878190e+01 +1160 1568 -4.679557686118159e+01 +1160 1569 -4.108257963331437e+01 +1160 1570 -3.482168460593341e+01 +1160 1571 -2.921308657465229e+01 +1160 1572 -2.479209926714913e+01 +1160 1573 -2.164167292784031e+01 +1160 1574 -1.965477828103598e+01 +1160 1575 -1.870055440211151e+01 +1161 865 -1.965157861598590e+01 +1161 866 -2.067515029553633e+01 +1161 867 -2.281096793104269e+01 +1161 868 -2.620940698061744e+01 +1161 869 -3.100122392289864e+01 +1161 870 -3.711530555640486e+01 +1161 871 -4.398263164573862e+01 +1161 872 -5.028460369863171e+01 +1161 873 -5.416220002058462e+01 +1161 1432 -3.065373731090118e+02 +1161 1433 -2.647767438527630e+02 +1161 1434 -2.053883607687489e+02 +1161 1435 -1.512628164030906e+02 +1161 1436 -1.112023202068744e+02 +1161 1437 -8.455751811575986e+01 +1161 1438 -6.797204698756184e+01 +1161 1439 -5.847168336242214e+01 +1161 1440 -5.416220002058462e+01 +1161 1567 -5.417542964960961e+01 +1161 1568 -5.029652653878190e+01 +1161 1569 -4.399251628020367e+01 +1161 1570 -3.712309913086538e+01 +1161 1571 -3.100728135248165e+01 +1161 1572 -2.621419542240643e+01 +1161 1573 -2.281491025526307e+01 +1161 1574 -2.067858569511584e+01 +1161 1575 -1.965477828103598e+01 +1162 1009 -3.063876713483004e+02 +1162 1010 -3.311617365195740e+02 +1162 1011 -3.859179776157605e+02 +1162 1012 -4.819366867771678e+02 +1162 1013 -6.371952057562402e+02 +1162 1014 -8.726231103602329e+02 +1162 1015 -1.193932486839834e+03 +1162 1016 -1.550121445008512e+03 +1162 1017 -1.802596433195456e+03 +1162 1297 -3.063876713483004e+02 +1162 1298 -2.841326260213855e+02 +1162 1299 -2.480403651673271e+02 +1162 1300 -2.088271183655457e+02 +1162 1301 -1.740274317161707e+02 +1162 1302 -1.468355065336023e+02 +1162 1303 -1.275984131219179e+02 +1162 1304 -1.155304899028561e+02 +1162 1305 -1.097534196790493e+02 +1162 1360 -1.111842160419089e+02 +1162 1361 -1.057061586526018e+02 +1162 1362 -9.638822517401589e+01 +1162 1363 -8.555928471614156e+01 +1162 1364 -7.520762033775921e+01 +1162 1365 -6.652797451218323e+01 +1162 1366 -6.001174723167335e+01 +1162 1367 -5.573941364116940e+01 +1162 1368 -5.363826960242956e+01 +1163 1009 -2.841326260213855e+02 +1163 1010 -3.063876713482997e+02 +1163 1011 -3.553280674768354e+02 +1163 1012 -4.404031329187421e+02 +1163 1013 -5.762343277298867e+02 +1163 1014 -7.788097592344243e+02 +1163 1015 -1.049909849375148e+03 +1163 1016 -1.344510568096307e+03 +1163 1017 -1.550121445008505e+03 +1163 1297 -3.311617365195747e+02 +1163 1298 -3.063876713483004e+02 +1163 1299 -2.663884709281895e+02 +1163 1300 -2.231981844606894e+02 +1163 1301 -1.851243485745373e+02 +1163 1302 -1.555580782497810e+02 +1163 1303 -1.347481526436478e+02 +1163 1304 -1.217424124188383e+02 +1163 1305 -1.155304899028561e+02 +1163 1360 -1.170681125153376e+02 +1163 1361 -1.111842160419089e+02 +1163 1362 -1.011961191083175e+02 +1163 1363 -8.962181586287889e+01 +1163 1364 -7.859349409841370e+01 +1163 1365 -6.937545782864687e+01 +1163 1366 -6.247361649834824e+01 +1163 1367 -5.795761808209202e+01 +1163 1368 -5.573941364116940e+01 +1164 1009 -2.480403651673271e+02 +1164 1010 -2.663884709281890e+02 +1164 1011 -3.063876713483004e+02 +1164 1012 -3.748904053829394e+02 +1164 1013 -4.819366867771664e+02 +1164 1014 -6.371952057562384e+02 +1164 1015 -8.383319685358435e+02 +1164 1016 -1.049909849375152e+03 +1164 1017 -1.193932486839834e+03 +1164 1297 -3.859179776157605e+02 +1164 1298 -3.553280674768354e+02 +1164 1299 -3.063876713483004e+02 +1164 1300 -2.542062119667738e+02 +1164 1301 -2.088271183655457e+02 +1164 1302 -1.740274317161707e+02 +1164 1303 -1.497853840269160e+02 +1164 1304 -1.347481526436478e+02 +1164 1305 -1.275984131219179e+02 +1164 1360 -1.293661657908652e+02 +1164 1361 -1.226088998409724e+02 +1164 1362 -1.111842160419089e+02 +1164 1363 -9.802102195827720e+01 +1164 1364 -8.555928471614156e+01 +1164 1365 -7.520762033775921e+01 +1164 1366 -6.749803222962952e+01 +1164 1367 -6.247361649834824e+01 +1164 1368 -6.001174723167335e+01 +1165 1009 -2.088271183655457e+02 +1165 1010 -2.231981844606889e+02 +1165 1011 -2.542062119667738e+02 +1165 1012 -3.063876713483011e+02 +1165 1013 -3.859179776157605e+02 +1165 1014 -4.976453857371593e+02 +1165 1015 -6.371952057562402e+02 +1165 1016 -7.788097592344293e+02 +1165 1017 -8.726231103602357e+02 +1165 1297 -4.819366867771664e+02 +1165 1298 -4.404031329187411e+02 +1165 1299 -3.748904053829385e+02 +1165 1300 -3.063876713483004e+02 +1165 1301 -2.480403651673271e+02 +1165 1302 -2.041390437321793e+02 +1165 1303 -1.740274317161707e+02 +1165 1304 -1.555580782497810e+02 +1165 1305 -1.468355065336023e+02 +1165 1360 -1.489885081652992e+02 +1165 1361 -1.407716848553628e+02 +1165 1362 -1.269615920628681e+02 +1165 1363 -1.111842160419089e+02 +1165 1364 -9.638822517401589e+01 +1165 1365 -8.420868002944904e+01 +1165 1366 -7.520762033775921e+01 +1165 1367 -6.937545782864687e+01 +1165 1368 -6.652797451218323e+01 +1166 1009 -1.740274317161707e+02 +1166 1010 -1.851243485745370e+02 +1166 1011 -2.088271183655457e+02 +1166 1012 -2.480403651673276e+02 +1166 1013 -3.063876713483004e+02 +1166 1014 -3.859179776157595e+02 +1166 1015 -4.819366867771664e+02 +1166 1016 -5.762343277298883e+02 +1166 1017 -6.371952057562402e+02 +1166 1297 -6.371952057562402e+02 +1166 1298 -5.762343277298867e+02 +1166 1299 -4.819366867771664e+02 +1166 1300 -3.859179776157605e+02 +1166 1301 -3.063876713483004e+02 +1166 1302 -2.480403651673271e+02 +1166 1303 -2.088271183655457e+02 +1166 1304 -1.851243485745373e+02 +1166 1305 -1.740274317161707e+02 +1166 1360 -1.767605489846857e+02 +1166 1361 -1.663510232448633e+02 +1166 1362 -1.489885081652992e+02 +1166 1363 -1.293661657908652e+02 +1166 1364 -1.111842160419089e+02 +1166 1365 -9.638822517401589e+01 +1166 1366 -8.555928471614156e+01 +1166 1367 -7.859349409841370e+01 +1166 1368 -7.520762033775921e+01 +1167 1009 -1.468355065336023e+02 +1167 1010 -1.555580782497807e+02 +1167 1011 -1.740274317161707e+02 +1167 1012 -2.041390437321797e+02 +1167 1013 -2.480403651673271e+02 +1167 1014 -3.063876713482997e+02 +1167 1015 -3.748904053829385e+02 +1167 1016 -4.404031329187421e+02 +1167 1017 -4.819366867771664e+02 +1167 1297 -8.726231103602357e+02 +1167 1298 -7.788097592344268e+02 +1167 1299 -6.371952057562402e+02 +1167 1300 -4.976453857371607e+02 +1167 1301 -3.859179776157605e+02 +1167 1302 -3.063876713483004e+02 +1167 1303 -2.542062119667738e+02 +1167 1304 -2.231981844606894e+02 +1167 1305 -2.088271183655457e+02 +1167 1360 -2.123577731150849e+02 +1167 1361 -1.989422168423268e+02 +1167 1362 -1.767605489846857e+02 +1167 1363 -1.519993633210930e+02 +1167 1364 -1.293661657908652e+02 +1167 1365 -1.111842160419089e+02 +1167 1366 -9.802102195827720e+01 +1167 1367 -8.962181586287889e+01 +1167 1368 -8.555928471614156e+01 +1168 1009 -1.275984131219179e+02 +1168 1010 -1.347481526436476e+02 +1168 1011 -1.497853840269160e+02 +1168 1012 -1.740274317161710e+02 +1168 1013 -2.088271183655457e+02 +1168 1014 -2.542062119667733e+02 +1168 1015 -3.063876713483004e+02 +1168 1016 -3.553280674768362e+02 +1168 1017 -3.859179776157605e+02 +1168 1297 -1.193932486839834e+03 +1168 1298 -1.049909849375148e+03 +1168 1299 -8.383319685358435e+02 +1168 1300 -6.371952057562402e+02 +1168 1301 -4.819366867771664e+02 +1168 1302 -3.748904053829385e+02 +1168 1303 -3.063876713483004e+02 +1168 1304 -2.663884709281895e+02 +1168 1305 -2.480403651673271e+02 +1168 1360 -2.525366109215767e+02 +1168 1361 -2.354925657825773e+02 +1168 1362 -2.075588680195229e+02 +1168 1363 -1.767605489846857e+02 +1168 1364 -1.489885081652992e+02 +1168 1365 -1.269615920628681e+02 +1168 1366 -1.111842160419089e+02 +1168 1367 -1.011961191083175e+02 +1168 1368 -9.638822517401589e+01 +1169 1009 -1.155304899028561e+02 +1169 1010 -1.217424124188380e+02 +1169 1011 -1.347481526436478e+02 +1169 1012 -1.555580782497813e+02 +1169 1013 -1.851243485745373e+02 +1169 1014 -2.231981844606889e+02 +1169 1015 -2.663884709281895e+02 +1169 1016 -3.063876713483011e+02 +1169 1017 -3.311617365195747e+02 +1169 1297 -1.550121445008505e+03 +1169 1298 -1.344510568096302e+03 +1169 1299 -1.049909849375148e+03 +1169 1300 -7.788097592344268e+02 +1169 1301 -5.762343277298867e+02 +1169 1302 -4.404031329187411e+02 +1169 1303 -3.553280674768354e+02 +1169 1304 -3.063876713483004e+02 +1169 1305 -2.841326260213855e+02 +1169 1360 -2.895745815575320e+02 +1169 1361 -2.689865983609317e+02 +1169 1362 -2.354925657825773e+02 +1169 1363 -1.989422168423268e+02 +1169 1364 -1.663510232448633e+02 +1169 1365 -1.407716848553628e+02 +1169 1366 -1.226088998409724e+02 +1169 1367 -1.111842160419089e+02 +1169 1368 -1.057061586526018e+02 +1170 1009 -1.097534196790493e+02 +1170 1010 -1.155304899028560e+02 +1170 1011 -1.275984131219179e+02 +1170 1012 -1.468355065336025e+02 +1170 1013 -1.740274317161707e+02 +1170 1014 -2.088271183655453e+02 +1170 1015 -2.480403651673271e+02 +1170 1016 -2.841326260213861e+02 +1170 1017 -3.063876713483004e+02 +1170 1297 -1.802596433195456e+03 +1170 1298 -1.550121445008505e+03 +1170 1299 -1.193932486839834e+03 +1170 1300 -8.726231103602357e+02 +1170 1301 -6.371952057562402e+02 +1170 1302 -4.819366867771664e+02 +1170 1303 -3.859179776157605e+02 +1170 1304 -3.311617365195747e+02 +1170 1305 -3.063876713483004e+02 +1170 1360 -3.124380547854544e+02 +1170 1361 -2.895745815575320e+02 +1170 1362 -2.525366109215767e+02 +1170 1363 -2.123577731150849e+02 +1170 1364 -1.767605489846857e+02 +1170 1365 -1.489885081652992e+02 +1170 1366 -1.293661657908652e+02 +1170 1367 -1.170681125153376e+02 +1170 1368 -1.111842160419089e+02 +1171 1081 -1.733190400658708e+03 +1171 1082 -1.877824568765008e+03 +1171 1083 -2.199157547087190e+03 +1171 1084 -2.767706810094291e+03 +1171 1085 -3.699147964795159e+03 +1171 1086 -5.136224430633812e+03 +1171 1087 -7.138491575686227e+03 +1171 1088 -9.405703259334558e+03 +1171 1089 -1.103972130715905e+04 +1171 1234 -1.733190400658716e+03 +1171 1235 -1.603684467943639e+03 +1171 1236 -1.394551574360516e+03 +1171 1237 -1.168677565678398e+03 +1171 1238 -9.695072463564467e+02 +1171 1239 -8.148024630667953e+02 +1171 1240 -7.058924559832891e+02 +1171 1241 -6.378158089920689e+02 +1171 1242 -6.052974323170214e+02 +1171 1261 -6.289529049931532e+02 +1171 1262 -5.970589583440841e+02 +1171 1263 -5.429674662554836e+02 +1171 1264 -4.803677035258858e+02 +1171 1265 -4.208084537187723e+02 +1171 1266 -3.710963518270340e+02 +1171 1267 -3.339204550667995e+02 +1171 1268 -3.096178268240471e+02 +1171 1269 -2.976873911031304e+02 +1172 1081 -1.603684467943639e+03 +1172 1082 -1.733190400658708e+03 +1172 1083 -2.019368486704435e+03 +1172 1084 -2.521021940438013e+03 +1172 1085 -3.331754877699595e+03 +1172 1086 -4.560278038130793e+03 +1172 1087 -6.235592529048601e+03 +1172 1088 -8.091232579773156e+03 +1172 1089 -9.405703259334558e+03 +1172 1234 -1.877824568765017e+03 +1172 1235 -1.733190400658708e+03 +1172 1236 -1.500725861549673e+03 +1172 1237 -1.251286952144484e+03 +1172 1238 -1.032880208377977e+03 +1172 1239 -8.643348602446076e+02 +1172 1240 -7.463158073460687e+02 +1172 1241 -6.728335244699299e+02 +1172 1242 -6.378158089920671e+02 +1172 1261 -6.632839990295113e+02 +1172 1262 -6.289529049931513e+02 +1172 1263 -5.708523475060541e+02 +1172 1264 -5.038180997021789e+02 +1172 1265 -4.402579127124382e+02 +1172 1266 -3.873813675510144e+02 +1172 1267 -3.479505460244110e+02 +1172 1268 -3.222285372305477e+02 +1172 1269 -3.096178268240465e+02 +1173 1081 -1.394551574360516e+03 +1173 1082 -1.500725861549673e+03 +1173 1083 -1.733190400658708e+03 +1173 1084 -2.134265778758337e+03 +1173 1085 -2.767706810094291e+03 +1173 1086 -3.699147964795159e+03 +1173 1087 -4.925216936196723e+03 +1173 1088 -6.235592529048601e+03 +1173 1089 -7.138491575686227e+03 +1173 1234 -2.199157547087201e+03 +1173 1235 -2.019368486704435e+03 +1173 1236 -1.733190400658708e+03 +1173 1237 -1.430197816180122e+03 +1173 1238 -1.168677565678393e+03 +1173 1239 -9.695072463564434e+02 +1173 1240 -8.315436028021828e+02 +1173 1241 -7.463158073460687e+02 +1173 1242 -7.058924559832867e+02 +1173 1261 -7.352796046183681e+02 +1173 1262 -6.956816209337401e+02 +1173 1263 -6.289529049931513e+02 +1173 1264 -5.524312223207850e+02 +1173 1265 -4.803677035258846e+02 +1173 1266 -4.208084537187713e+02 +1173 1267 -3.766415408901786e+02 +1173 1268 -3.479505460244110e+02 +1173 1269 -3.339204550667988e+02 +1174 1081 -1.168677565678398e+03 +1174 1082 -1.251286952144484e+03 +1174 1083 -1.430197816180122e+03 +1174 1084 -1.733190400658716e+03 +1174 1085 -2.199157547087201e+03 +1174 1086 -2.861294172280330e+03 +1174 1087 -3.699147964795180e+03 +1174 1088 -4.560278038130823e+03 +1174 1089 -5.136224430633847e+03 +1174 1234 -2.767706810094291e+03 +1174 1235 -2.521021940438000e+03 +1174 1236 -2.134265778758326e+03 +1174 1237 -1.733190400658708e+03 +1174 1238 -1.394551574360510e+03 +1174 1239 -1.141773184361042e+03 +1174 1240 -9.695072463564434e+02 +1174 1241 -8.643348602446076e+02 +1174 1242 -8.148024630667926e+02 +1174 1261 -8.507888885505199e+02 +1174 1262 -8.023274760830675e+02 +1174 1263 -7.211778000851799e+02 +1174 1264 -6.289529049931513e+02 +1174 1265 -5.429674662554822e+02 +1174 1266 -4.725808574370885e+02 +1174 1267 -4.208084537187713e+02 +1174 1268 -3.873813675510144e+02 +1174 1269 -3.710963518270331e+02 +1175 1081 -9.695072463564467e+02 +1175 1082 -1.032880208377977e+03 +1175 1083 -1.168677565678393e+03 +1175 1084 -1.394551574360516e+03 +1175 1085 -1.733190400658708e+03 +1175 1086 -2.199157547087190e+03 +1175 1087 -2.767706810094291e+03 +1175 1088 -3.331754877699595e+03 +1175 1089 -3.699147964795159e+03 +1175 1234 -3.699147964795180e+03 +1175 1235 -3.331754877699595e+03 +1175 1236 -2.767706810094291e+03 +1175 1237 -2.199157547087201e+03 +1175 1238 -1.733190400658708e+03 +1175 1239 -1.394551574360510e+03 +1175 1240 -1.168677565678393e+03 +1175 1241 -1.032880208377977e+03 +1175 1242 -9.695072463564434e+02 +1175 1261 -1.015511306612467e+03 +1175 1262 -9.536070604341750e+02 +1175 1263 -8.507888885505199e+02 +1175 1264 -7.352796046183681e+02 +1175 1265 -6.289529049931513e+02 +1175 1266 -5.429674662554822e+02 +1175 1267 -4.803677035258846e+02 +1175 1268 -4.402579127124382e+02 +1175 1269 -4.208084537187713e+02 +1176 1081 -8.148024630667953e+02 +1176 1082 -8.643348602446076e+02 +1176 1083 -9.695072463564434e+02 +1176 1084 -1.141773184361047e+03 +1176 1085 -1.394551574360510e+03 +1176 1086 -1.733190400658700e+03 +1176 1087 -2.134265778758326e+03 +1176 1088 -2.521021940438000e+03 +1176 1089 -2.767706810094276e+03 +1176 1234 -5.136224430633882e+03 +1176 1235 -4.560278038130823e+03 +1176 1236 -3.699147964795180e+03 +1176 1237 -2.861294172280346e+03 +1176 1238 -2.199157547087201e+03 +1176 1239 -1.733190400658708e+03 +1176 1240 -1.430197816180122e+03 +1176 1241 -1.251286952144484e+03 +1176 1242 -1.168677565678393e+03 +1176 1261 -1.228588660544053e+03 +1176 1262 -1.148042053110080e+03 +1176 1263 -1.015511306612467e+03 +1176 1264 -8.685786765383800e+02 +1176 1265 -7.352796046183681e+02 +1176 1266 -6.289529049931513e+02 +1176 1267 -5.524312223207850e+02 +1176 1268 -5.038180997021789e+02 +1176 1269 -4.803677035258846e+02 +1177 1081 -7.058924559832891e+02 +1177 1082 -7.463158073460687e+02 +1177 1083 -8.315436028021828e+02 +1177 1084 -9.695072463564467e+02 +1177 1085 -1.168677565678393e+03 +1177 1086 -1.430197816180116e+03 +1177 1087 -1.733190400658708e+03 +1177 1088 -2.019368486704435e+03 +1177 1089 -2.199157547087190e+03 +1177 1234 -7.138491575686282e+03 +1177 1235 -6.235592529048601e+03 +1177 1236 -4.925216936196723e+03 +1177 1237 -3.699147964795180e+03 +1177 1238 -2.767706810094291e+03 +1177 1239 -2.134265778758326e+03 +1177 1240 -1.733190400658708e+03 +1177 1241 -1.500725861549673e+03 +1177 1242 -1.394551574360510e+03 +1177 1261 -1.471477730866027e+03 +1177 1262 -1.368148367306964e+03 +1177 1263 -1.199743197084304e+03 +1177 1264 -1.015511306612467e+03 +1177 1265 -8.507888885505199e+02 +1177 1266 -7.211778000851799e+02 +1177 1267 -6.289529049931513e+02 +1177 1268 -5.708523475060541e+02 +1177 1269 -5.429674662554822e+02 +1178 1081 -6.378158089920689e+02 +1178 1082 -6.728335244699299e+02 +1178 1083 -7.463158073460687e+02 +1178 1084 -8.643348602446105e+02 +1178 1085 -1.032880208377977e+03 +1178 1086 -1.251286952144480e+03 +1178 1087 -1.500725861549673e+03 +1178 1088 -1.733190400658708e+03 +1178 1089 -1.877824568765008e+03 +1178 1234 -9.405703259334639e+03 +1178 1235 -8.091232579773156e+03 +1178 1236 -6.235592529048601e+03 +1178 1237 -4.560278038130823e+03 +1178 1238 -3.331754877699595e+03 +1178 1239 -2.521021940438000e+03 +1178 1240 -2.019368486704435e+03 +1178 1241 -1.733190400658708e+03 +1178 1242 -1.603684467943633e+03 +1178 1261 -1.697437739078449e+03 +1178 1262 -1.571600895131404e+03 +1178 1263 -1.368148367306964e+03 +1178 1264 -1.148042053110080e+03 +1178 1265 -9.536070604341750e+02 +1178 1266 -8.023274760830675e+02 +1178 1267 -6.956816209337401e+02 +1178 1268 -6.289529049931513e+02 +1178 1269 -5.970589583440825e+02 +1179 1081 -6.052974323170214e+02 +1179 1082 -6.378158089920671e+02 +1179 1083 -7.058924559832867e+02 +1179 1084 -8.148024630667953e+02 +1179 1085 -9.695072463564434e+02 +1179 1086 -1.168677565678389e+03 +1179 1087 -1.394551574360510e+03 +1179 1088 -1.603684467943633e+03 +1179 1089 -1.733190400658700e+03 +1179 1234 -1.103972130715926e+04 +1179 1235 -9.405703259334639e+03 +1179 1236 -7.138491575686282e+03 +1179 1237 -5.136224430633882e+03 +1179 1238 -3.699147964795180e+03 +1179 1239 -2.767706810094291e+03 +1179 1240 -2.199157547087201e+03 +1179 1241 -1.877824568765017e+03 +1179 1242 -1.733190400658708e+03 +1179 1261 -1.837845240586539e+03 +1179 1262 -1.697437739078449e+03 +1179 1263 -1.471477730866027e+03 +1179 1264 -1.228588660544053e+03 +1179 1265 -1.015511306612467e+03 +1179 1266 -8.507888885505199e+02 +1179 1267 -7.352796046183681e+02 +1179 1268 -6.632839990295113e+02 +1179 1269 -6.289529049931513e+02 +1198 1081 -6.289529049931532e+02 +1198 1082 -6.632839990295113e+02 +1198 1083 -7.352796046183681e+02 +1198 1084 -8.507888885505228e+02 +1198 1085 -1.015511306612467e+03 +1198 1086 -1.228588660544048e+03 +1198 1087 -1.471477730866027e+03 +1198 1088 -1.697437739078449e+03 +1198 1089 -1.837845240586531e+03 +1198 1108 -1.733190400658716e+03 +1198 1109 -1.877824568765017e+03 +1198 1110 -2.199157547087201e+03 +1198 1111 -2.767706810094306e+03 +1198 1112 -3.699147964795180e+03 +1198 1113 -5.136224430633847e+03 +1198 1114 -7.138491575686282e+03 +1198 1115 -9.405703259334639e+03 +1198 1116 -1.103972130715916e+04 +1198 1261 -1.733190400658708e+03 +1198 1262 -1.603684467943633e+03 +1198 1263 -1.394551574360510e+03 +1198 1264 -1.168677565678393e+03 +1198 1265 -9.695072463564434e+02 +1198 1266 -8.148024630667926e+02 +1198 1267 -7.058924559832867e+02 +1198 1268 -6.378158089920671e+02 +1198 1269 -6.052974323170196e+02 +1199 1081 -5.970589583440841e+02 +1199 1082 -6.289529049931513e+02 +1199 1083 -6.956816209337401e+02 +1199 1084 -8.023274760830702e+02 +1199 1085 -9.536070604341750e+02 +1199 1086 -1.148042053110076e+03 +1199 1087 -1.368148367306964e+03 +1199 1088 -1.571600895131404e+03 +1199 1089 -1.697437739078442e+03 +1199 1108 -1.603684467943639e+03 +1199 1109 -1.733190400658708e+03 +1199 1110 -2.019368486704435e+03 +1199 1111 -2.521021940438013e+03 +1199 1112 -3.331754877699595e+03 +1199 1113 -4.560278038130793e+03 +1199 1114 -6.235592529048601e+03 +1199 1115 -8.091232579773156e+03 +1199 1116 -9.405703259334558e+03 +1199 1261 -1.877824568765017e+03 +1199 1262 -1.733190400658708e+03 +1199 1263 -1.500725861549673e+03 +1199 1264 -1.251286952144484e+03 +1199 1265 -1.032880208377977e+03 +1199 1266 -8.643348602446076e+02 +1199 1267 -7.463158073460687e+02 +1199 1268 -6.728335244699299e+02 +1199 1269 -6.378158089920671e+02 +1200 1081 -5.429674662554836e+02 +1200 1082 -5.708523475060541e+02 +1200 1083 -6.289529049931513e+02 +1200 1084 -7.211778000851822e+02 +1200 1085 -8.507888885505199e+02 +1200 1086 -1.015511306612463e+03 +1200 1087 -1.199743197084304e+03 +1200 1088 -1.368148367306964e+03 +1200 1089 -1.471477730866021e+03 +1200 1108 -1.394551574360516e+03 +1200 1109 -1.500725861549673e+03 +1200 1110 -1.733190400658708e+03 +1200 1111 -2.134265778758337e+03 +1200 1112 -2.767706810094291e+03 +1200 1113 -3.699147964795159e+03 +1200 1114 -4.925216936196723e+03 +1200 1115 -6.235592529048601e+03 +1200 1116 -7.138491575686227e+03 +1200 1261 -2.199157547087201e+03 +1200 1262 -2.019368486704435e+03 +1200 1263 -1.733190400658708e+03 +1200 1264 -1.430197816180122e+03 +1200 1265 -1.168677565678393e+03 +1200 1266 -9.695072463564434e+02 +1200 1267 -8.315436028021828e+02 +1200 1268 -7.463158073460687e+02 +1200 1269 -7.058924559832867e+02 +1201 1081 -4.803677035258858e+02 +1201 1082 -5.038180997021789e+02 +1201 1083 -5.524312223207850e+02 +1201 1084 -6.289529049931532e+02 +1201 1085 -7.352796046183681e+02 +1201 1086 -8.685786765383772e+02 +1201 1087 -1.015511306612467e+03 +1201 1088 -1.148042053110080e+03 +1201 1089 -1.228588660544048e+03 +1201 1108 -1.168677565678398e+03 +1201 1109 -1.251286952144484e+03 +1201 1110 -1.430197816180122e+03 +1201 1111 -1.733190400658716e+03 +1201 1112 -2.199157547087201e+03 +1201 1113 -2.861294172280330e+03 +1201 1114 -3.699147964795180e+03 +1201 1115 -4.560278038130823e+03 +1201 1116 -5.136224430633847e+03 +1201 1261 -2.767706810094291e+03 +1201 1262 -2.521021940438000e+03 +1201 1263 -2.134265778758326e+03 +1201 1264 -1.733190400658708e+03 +1201 1265 -1.394551574360510e+03 +1201 1266 -1.141773184361042e+03 +1201 1267 -9.695072463564434e+02 +1201 1268 -8.643348602446076e+02 +1201 1269 -8.148024630667926e+02 +1202 1081 -4.208084537187723e+02 +1202 1082 -4.402579127124382e+02 +1202 1083 -4.803677035258846e+02 +1202 1084 -5.429674662554836e+02 +1202 1085 -6.289529049931513e+02 +1202 1086 -7.352796046183660e+02 +1202 1087 -8.507888885505199e+02 +1202 1088 -9.536070604341750e+02 +1202 1089 -1.015511306612463e+03 +1202 1108 -9.695072463564467e+02 +1202 1109 -1.032880208377977e+03 +1202 1110 -1.168677565678393e+03 +1202 1111 -1.394551574360516e+03 +1202 1112 -1.733190400658708e+03 +1202 1113 -2.199157547087190e+03 +1202 1114 -2.767706810094291e+03 +1202 1115 -3.331754877699595e+03 +1202 1116 -3.699147964795159e+03 +1202 1261 -3.699147964795180e+03 +1202 1262 -3.331754877699595e+03 +1202 1263 -2.767706810094291e+03 +1202 1264 -2.199157547087201e+03 +1202 1265 -1.733190400658708e+03 +1202 1266 -1.394551574360510e+03 +1202 1267 -1.168677565678393e+03 +1202 1268 -1.032880208377977e+03 +1202 1269 -9.695072463564434e+02 +1203 1081 -3.710963518270340e+02 +1203 1082 -3.873813675510144e+02 +1203 1083 -4.208084537187713e+02 +1203 1084 -4.725808574370898e+02 +1203 1085 -5.429674662554822e+02 +1203 1086 -6.289529049931496e+02 +1203 1087 -7.211778000851799e+02 +1203 1088 -8.023274760830675e+02 +1203 1089 -8.507888885505170e+02 +1203 1108 -8.148024630667953e+02 +1203 1109 -8.643348602446076e+02 +1203 1110 -9.695072463564434e+02 +1203 1111 -1.141773184361047e+03 +1203 1112 -1.394551574360510e+03 +1203 1113 -1.733190400658700e+03 +1203 1114 -2.134265778758326e+03 +1203 1115 -2.521021940438000e+03 +1203 1116 -2.767706810094276e+03 +1203 1261 -5.136224430633882e+03 +1203 1262 -4.560278038130823e+03 +1203 1263 -3.699147964795180e+03 +1203 1264 -2.861294172280346e+03 +1203 1265 -2.199157547087201e+03 +1203 1266 -1.733190400658708e+03 +1203 1267 -1.430197816180122e+03 +1203 1268 -1.251286952144484e+03 +1203 1269 -1.168677565678393e+03 +1204 1081 -3.339204550667995e+02 +1204 1082 -3.479505460244110e+02 +1204 1083 -3.766415408901786e+02 +1204 1084 -4.208084537187723e+02 +1204 1085 -4.803677035258846e+02 +1204 1086 -5.524312223207834e+02 +1204 1087 -6.289529049931513e+02 +1204 1088 -6.956816209337401e+02 +1204 1089 -7.352796046183660e+02 +1204 1108 -7.058924559832891e+02 +1204 1109 -7.463158073460687e+02 +1204 1110 -8.315436028021828e+02 +1204 1111 -9.695072463564467e+02 +1204 1112 -1.168677565678393e+03 +1204 1113 -1.430197816180116e+03 +1204 1114 -1.733190400658708e+03 +1204 1115 -2.019368486704435e+03 +1204 1116 -2.199157547087190e+03 +1204 1261 -7.138491575686282e+03 +1204 1262 -6.235592529048601e+03 +1204 1263 -4.925216936196723e+03 +1204 1264 -3.699147964795180e+03 +1204 1265 -2.767706810094291e+03 +1204 1266 -2.134265778758326e+03 +1204 1267 -1.733190400658708e+03 +1204 1268 -1.500725861549673e+03 +1204 1269 -1.394551574360510e+03 +1205 1081 -3.096178268240471e+02 +1205 1082 -3.222285372305477e+02 +1205 1083 -3.479505460244110e+02 +1205 1084 -3.873813675510154e+02 +1205 1085 -4.402579127124382e+02 +1205 1086 -5.038180997021776e+02 +1205 1087 -5.708523475060541e+02 +1205 1088 -6.289529049931513e+02 +1205 1089 -6.632839990295092e+02 +1205 1108 -6.378158089920689e+02 +1205 1109 -6.728335244699299e+02 +1205 1110 -7.463158073460687e+02 +1205 1111 -8.643348602446105e+02 +1205 1112 -1.032880208377977e+03 +1205 1113 -1.251286952144480e+03 +1205 1114 -1.500725861549673e+03 +1205 1115 -1.733190400658708e+03 +1205 1116 -1.877824568765008e+03 +1205 1261 -9.405703259334639e+03 +1205 1262 -8.091232579773156e+03 +1205 1263 -6.235592529048601e+03 +1205 1264 -4.560278038130823e+03 +1205 1265 -3.331754877699595e+03 +1205 1266 -2.521021940438000e+03 +1205 1267 -2.019368486704435e+03 +1205 1268 -1.733190400658708e+03 +1205 1269 -1.603684467943633e+03 +1206 1081 -2.976873911031304e+02 +1206 1082 -3.096178268240465e+02 +1206 1083 -3.339204550667988e+02 +1206 1084 -3.710963518270340e+02 +1206 1085 -4.208084537187713e+02 +1206 1086 -4.803677035258833e+02 +1206 1087 -5.429674662554822e+02 +1206 1088 -5.970589583440825e+02 +1206 1089 -6.289529049931496e+02 +1206 1108 -6.052974323170214e+02 +1206 1109 -6.378158089920671e+02 +1206 1110 -7.058924559832867e+02 +1206 1111 -8.148024630667953e+02 +1206 1112 -9.695072463564434e+02 +1206 1113 -1.168677565678389e+03 +1206 1114 -1.394551574360510e+03 +1206 1115 -1.603684467943633e+03 +1206 1116 -1.733190400658700e+03 +1206 1261 -1.103972130715926e+04 +1206 1262 -9.405703259334639e+03 +1206 1263 -7.138491575686282e+03 +1206 1264 -5.136224430633882e+03 +1206 1265 -3.699147964795180e+03 +1206 1266 -2.767706810094291e+03 +1206 1267 -2.199157547087201e+03 +1206 1268 -1.877824568765017e+03 +1206 1269 -1.733190400658708e+03 +1225 1009 -1.111842160419089e+02 +1225 1010 -1.170681125153374e+02 +1225 1011 -1.293661657908652e+02 +1225 1012 -1.489885081652994e+02 +1225 1013 -1.767605489846857e+02 +1225 1014 -2.123577731150844e+02 +1225 1015 -2.525366109215767e+02 +1225 1016 -2.895745815575327e+02 +1225 1017 -3.124380547854544e+02 +1225 1072 -3.063876713483004e+02 +1225 1073 -3.311617365195740e+02 +1225 1074 -3.859179776157605e+02 +1225 1075 -4.819366867771678e+02 +1225 1076 -6.371952057562402e+02 +1225 1077 -8.726231103602329e+02 +1225 1078 -1.193932486839834e+03 +1225 1079 -1.550121445008512e+03 +1225 1080 -1.802596433195456e+03 +1225 1360 -3.063876713483004e+02 +1225 1361 -2.841326260213855e+02 +1225 1362 -2.480403651673271e+02 +1225 1363 -2.088271183655457e+02 +1225 1364 -1.740274317161707e+02 +1225 1365 -1.468355065336023e+02 +1225 1366 -1.275984131219179e+02 +1225 1367 -1.155304899028561e+02 +1225 1368 -1.097534196790493e+02 +1226 1009 -1.057061586526018e+02 +1226 1010 -1.111842160419088e+02 +1226 1011 -1.226088998409724e+02 +1226 1012 -1.407716848553630e+02 +1226 1013 -1.663510232448633e+02 +1226 1014 -1.989422168423264e+02 +1226 1015 -2.354925657825773e+02 +1226 1016 -2.689865983609323e+02 +1226 1017 -2.895745815575320e+02 +1226 1072 -2.841326260213855e+02 +1226 1073 -3.063876713482997e+02 +1226 1074 -3.553280674768354e+02 +1226 1075 -4.404031329187421e+02 +1226 1076 -5.762343277298867e+02 +1226 1077 -7.788097592344243e+02 +1226 1078 -1.049909849375148e+03 +1226 1079 -1.344510568096307e+03 +1226 1080 -1.550121445008505e+03 +1226 1360 -3.311617365195747e+02 +1226 1361 -3.063876713483004e+02 +1226 1362 -2.663884709281895e+02 +1226 1363 -2.231981844606894e+02 +1226 1364 -1.851243485745373e+02 +1226 1365 -1.555580782497810e+02 +1226 1366 -1.347481526436478e+02 +1226 1367 -1.217424124188383e+02 +1226 1368 -1.155304899028561e+02 +1227 1009 -9.638822517401589e+01 +1227 1010 -1.011961191083174e+02 +1227 1011 -1.111842160419089e+02 +1227 1012 -1.269615920628683e+02 +1227 1013 -1.489885081652992e+02 +1227 1014 -1.767605489846853e+02 +1227 1015 -2.075588680195229e+02 +1227 1016 -2.354925657825778e+02 +1227 1017 -2.525366109215767e+02 +1227 1072 -2.480403651673271e+02 +1227 1073 -2.663884709281890e+02 +1227 1074 -3.063876713483004e+02 +1227 1075 -3.748904053829394e+02 +1227 1076 -4.819366867771664e+02 +1227 1077 -6.371952057562384e+02 +1227 1078 -8.383319685358435e+02 +1227 1079 -1.049909849375152e+03 +1227 1080 -1.193932486839834e+03 +1227 1360 -3.859179776157605e+02 +1227 1361 -3.553280674768354e+02 +1227 1362 -3.063876713483004e+02 +1227 1363 -2.542062119667738e+02 +1227 1364 -2.088271183655457e+02 +1227 1365 -1.740274317161707e+02 +1227 1366 -1.497853840269160e+02 +1227 1367 -1.347481526436478e+02 +1227 1368 -1.275984131219179e+02 +1228 1009 -8.555928471614156e+01 +1228 1010 -8.962181586287879e+01 +1228 1011 -9.802102195827720e+01 +1228 1012 -1.111842160419091e+02 +1228 1013 -1.293661657908652e+02 +1228 1014 -1.519993633210927e+02 +1228 1015 -1.767605489846857e+02 +1228 1016 -1.989422168423272e+02 +1228 1017 -2.123577731150849e+02 +1228 1072 -2.088271183655457e+02 +1228 1073 -2.231981844606889e+02 +1228 1074 -2.542062119667738e+02 +1228 1075 -3.063876713483011e+02 +1228 1076 -3.859179776157605e+02 +1228 1077 -4.976453857371593e+02 +1228 1078 -6.371952057562402e+02 +1228 1079 -7.788097592344293e+02 +1228 1080 -8.726231103602357e+02 +1228 1360 -4.819366867771664e+02 +1228 1361 -4.404031329187411e+02 +1228 1362 -3.748904053829385e+02 +1228 1363 -3.063876713483004e+02 +1228 1364 -2.480403651673271e+02 +1228 1365 -2.041390437321793e+02 +1228 1366 -1.740274317161707e+02 +1228 1367 -1.555580782497810e+02 +1228 1368 -1.468355065336023e+02 +1229 1009 -7.520762033775921e+01 +1229 1010 -7.859349409841361e+01 +1229 1011 -8.555928471614156e+01 +1229 1012 -9.638822517401600e+01 +1229 1013 -1.111842160419089e+02 +1229 1014 -1.293661657908650e+02 +1229 1015 -1.489885081652992e+02 +1229 1016 -1.663510232448635e+02 +1229 1017 -1.767605489846857e+02 +1229 1072 -1.740274317161707e+02 +1229 1073 -1.851243485745370e+02 +1229 1074 -2.088271183655457e+02 +1229 1075 -2.480403651673276e+02 +1229 1076 -3.063876713483004e+02 +1229 1077 -3.859179776157595e+02 +1229 1078 -4.819366867771664e+02 +1229 1079 -5.762343277298883e+02 +1229 1080 -6.371952057562402e+02 +1229 1360 -6.371952057562402e+02 +1229 1361 -5.762343277298867e+02 +1229 1362 -4.819366867771664e+02 +1229 1363 -3.859179776157605e+02 +1229 1364 -3.063876713483004e+02 +1229 1365 -2.480403651673271e+02 +1229 1366 -2.088271183655457e+02 +1229 1367 -1.851243485745373e+02 +1229 1368 -1.740274317161707e+02 +1230 1009 -6.652797451218323e+01 +1230 1010 -6.937545782864680e+01 +1230 1011 -7.520762033775921e+01 +1230 1012 -8.420868002944914e+01 +1230 1013 -9.638822517401589e+01 +1230 1014 -1.111842160419088e+02 +1230 1015 -1.269615920628681e+02 +1230 1016 -1.407716848553630e+02 +1230 1017 -1.489885081652992e+02 +1230 1072 -1.468355065336023e+02 +1230 1073 -1.555580782497807e+02 +1230 1074 -1.740274317161707e+02 +1230 1075 -2.041390437321797e+02 +1230 1076 -2.480403651673271e+02 +1230 1077 -3.063876713482997e+02 +1230 1078 -3.748904053829385e+02 +1230 1079 -4.404031329187421e+02 +1230 1080 -4.819366867771664e+02 +1230 1360 -8.726231103602357e+02 +1230 1361 -7.788097592344268e+02 +1230 1362 -6.371952057562402e+02 +1230 1363 -4.976453857371607e+02 +1230 1364 -3.859179776157605e+02 +1230 1365 -3.063876713483004e+02 +1230 1366 -2.542062119667738e+02 +1230 1367 -2.231981844606894e+02 +1230 1368 -2.088271183655457e+02 +1231 1009 -6.001174723167335e+01 +1231 1010 -6.247361649834816e+01 +1231 1011 -6.749803222962952e+01 +1231 1012 -7.520762033775929e+01 +1231 1013 -8.555928471614156e+01 +1231 1014 -9.802102195827709e+01 +1231 1015 -1.111842160419089e+02 +1231 1016 -1.226088998409726e+02 +1231 1017 -1.293661657908652e+02 +1231 1072 -1.275984131219179e+02 +1231 1073 -1.347481526436476e+02 +1231 1074 -1.497853840269160e+02 +1231 1075 -1.740274317161710e+02 +1231 1076 -2.088271183655457e+02 +1231 1077 -2.542062119667733e+02 +1231 1078 -3.063876713483004e+02 +1231 1079 -3.553280674768362e+02 +1231 1080 -3.859179776157605e+02 +1231 1360 -1.193932486839834e+03 +1231 1361 -1.049909849375148e+03 +1231 1362 -8.383319685358435e+02 +1231 1363 -6.371952057562402e+02 +1231 1364 -4.819366867771664e+02 +1231 1365 -3.748904053829385e+02 +1231 1366 -3.063876713483004e+02 +1231 1367 -2.663884709281895e+02 +1231 1368 -2.480403651673271e+02 +1232 1009 -5.573941364116940e+01 +1232 1010 -5.795761808209195e+01 +1232 1011 -6.247361649834824e+01 +1232 1012 -6.937545782864697e+01 +1232 1013 -7.859349409841370e+01 +1232 1014 -8.962181586287879e+01 +1232 1015 -1.011961191083175e+02 +1232 1016 -1.111842160419091e+02 +1232 1017 -1.170681125153376e+02 +1232 1072 -1.155304899028561e+02 +1232 1073 -1.217424124188380e+02 +1232 1074 -1.347481526436478e+02 +1232 1075 -1.555580782497813e+02 +1232 1076 -1.851243485745373e+02 +1232 1077 -2.231981844606889e+02 +1232 1078 -2.663884709281895e+02 +1232 1079 -3.063876713483011e+02 +1232 1080 -3.311617365195747e+02 +1232 1360 -1.550121445008505e+03 +1232 1361 -1.344510568096302e+03 +1232 1362 -1.049909849375148e+03 +1232 1363 -7.788097592344268e+02 +1232 1364 -5.762343277298867e+02 +1232 1365 -4.404031329187411e+02 +1232 1366 -3.553280674768354e+02 +1232 1367 -3.063876713483004e+02 +1232 1368 -2.841326260213855e+02 +1233 1009 -5.363826960242956e+01 +1233 1010 -5.573941364116933e+01 +1233 1011 -6.001174723167335e+01 +1233 1012 -6.652797451218332e+01 +1233 1013 -7.520762033775921e+01 +1233 1014 -8.555928471614145e+01 +1233 1015 -9.638822517401589e+01 +1233 1016 -1.057061586526020e+02 +1233 1017 -1.111842160419089e+02 +1233 1072 -1.097534196790493e+02 +1233 1073 -1.155304899028560e+02 +1233 1074 -1.275984131219179e+02 +1233 1075 -1.468355065336025e+02 +1233 1076 -1.740274317161707e+02 +1233 1077 -2.088271183655453e+02 +1233 1078 -2.480403651673271e+02 +1233 1079 -2.841326260213861e+02 +1233 1080 -3.063876713483004e+02 +1233 1360 -1.802596433195456e+03 +1233 1361 -1.550121445008505e+03 +1233 1362 -1.193932486839834e+03 +1233 1363 -8.726231103602357e+02 +1233 1364 -6.371952057562402e+02 +1233 1365 -4.819366867771664e+02 +1233 1366 -3.859179776157605e+02 +1233 1367 -3.311617365195747e+02 +1233 1368 -3.063876713483004e+02 +1234 1171 -1.733190400658716e+03 +1234 1172 -1.877824568765017e+03 +1234 1173 -2.199157547087201e+03 +1234 1174 -2.767706810094291e+03 +1234 1175 -3.699147964795180e+03 +1234 1176 -5.136224430633882e+03 +1234 1177 -7.138491575686282e+03 +1234 1178 -9.405703259334639e+03 +1234 1179 -1.103972130715926e+04 +1234 1306 -1.733190400658708e+03 +1234 1307 -1.603684467943633e+03 +1234 1308 -1.394551574360510e+03 +1234 1309 -1.168677565678393e+03 +1234 1310 -9.695072463564434e+02 +1234 1311 -8.148024630667926e+02 +1234 1312 -7.058924559832867e+02 +1234 1313 -6.378158089920671e+02 +1234 1314 -6.052974323170196e+02 +1234 1333 -6.289529049931513e+02 +1234 1334 -5.970589583440825e+02 +1234 1335 -5.429674662554822e+02 +1234 1336 -4.803677035258846e+02 +1234 1337 -4.208084537187713e+02 +1234 1338 -3.710963518270331e+02 +1234 1339 -3.339204550667988e+02 +1234 1340 -3.096178268240465e+02 +1234 1341 -2.976873911031298e+02 +1235 1171 -1.603684467943639e+03 +1235 1172 -1.733190400658708e+03 +1235 1173 -2.019368486704435e+03 +1235 1174 -2.521021940438000e+03 +1235 1175 -3.331754877699595e+03 +1235 1176 -4.560278038130823e+03 +1235 1177 -6.235592529048601e+03 +1235 1178 -8.091232579773156e+03 +1235 1179 -9.405703259334639e+03 +1235 1306 -1.877824568765017e+03 +1235 1307 -1.733190400658708e+03 +1235 1308 -1.500725861549673e+03 +1235 1309 -1.251286952144484e+03 +1235 1310 -1.032880208377977e+03 +1235 1311 -8.643348602446076e+02 +1235 1312 -7.463158073460687e+02 +1235 1313 -6.728335244699299e+02 +1235 1314 -6.378158089920671e+02 +1235 1333 -6.632839990295113e+02 +1235 1334 -6.289529049931513e+02 +1235 1335 -5.708523475060541e+02 +1235 1336 -5.038180997021789e+02 +1235 1337 -4.402579127124382e+02 +1235 1338 -3.873813675510144e+02 +1235 1339 -3.479505460244110e+02 +1235 1340 -3.222285372305477e+02 +1235 1341 -3.096178268240465e+02 +1236 1171 -1.394551574360516e+03 +1236 1172 -1.500725861549673e+03 +1236 1173 -1.733190400658708e+03 +1236 1174 -2.134265778758326e+03 +1236 1175 -2.767706810094291e+03 +1236 1176 -3.699147964795180e+03 +1236 1177 -4.925216936196723e+03 +1236 1178 -6.235592529048601e+03 +1236 1179 -7.138491575686282e+03 +1236 1306 -2.199157547087201e+03 +1236 1307 -2.019368486704435e+03 +1236 1308 -1.733190400658708e+03 +1236 1309 -1.430197816180122e+03 +1236 1310 -1.168677565678393e+03 +1236 1311 -9.695072463564434e+02 +1236 1312 -8.315436028021828e+02 +1236 1313 -7.463158073460687e+02 +1236 1314 -7.058924559832867e+02 +1236 1333 -7.352796046183681e+02 +1236 1334 -6.956816209337401e+02 +1236 1335 -6.289529049931513e+02 +1236 1336 -5.524312223207850e+02 +1236 1337 -4.803677035258846e+02 +1236 1338 -4.208084537187713e+02 +1236 1339 -3.766415408901786e+02 +1236 1340 -3.479505460244110e+02 +1236 1341 -3.339204550667988e+02 +1237 1171 -1.168677565678398e+03 +1237 1172 -1.251286952144484e+03 +1237 1173 -1.430197816180122e+03 +1237 1174 -1.733190400658708e+03 +1237 1175 -2.199157547087201e+03 +1237 1176 -2.861294172280346e+03 +1237 1177 -3.699147964795180e+03 +1237 1178 -4.560278038130823e+03 +1237 1179 -5.136224430633882e+03 +1237 1306 -2.767706810094291e+03 +1237 1307 -2.521021940438000e+03 +1237 1308 -2.134265778758326e+03 +1237 1309 -1.733190400658708e+03 +1237 1310 -1.394551574360510e+03 +1237 1311 -1.141773184361042e+03 +1237 1312 -9.695072463564434e+02 +1237 1313 -8.643348602446076e+02 +1237 1314 -8.148024630667926e+02 +1237 1333 -8.507888885505199e+02 +1237 1334 -8.023274760830675e+02 +1237 1335 -7.211778000851799e+02 +1237 1336 -6.289529049931513e+02 +1237 1337 -5.429674662554822e+02 +1237 1338 -4.725808574370885e+02 +1237 1339 -4.208084537187713e+02 +1237 1340 -3.873813675510144e+02 +1237 1341 -3.710963518270331e+02 +1238 1171 -9.695072463564467e+02 +1238 1172 -1.032880208377977e+03 +1238 1173 -1.168677565678393e+03 +1238 1174 -1.394551574360510e+03 +1238 1175 -1.733190400658708e+03 +1238 1176 -2.199157547087201e+03 +1238 1177 -2.767706810094291e+03 +1238 1178 -3.331754877699595e+03 +1238 1179 -3.699147964795180e+03 +1238 1306 -3.699147964795180e+03 +1238 1307 -3.331754877699595e+03 +1238 1308 -2.767706810094291e+03 +1238 1309 -2.199157547087201e+03 +1238 1310 -1.733190400658708e+03 +1238 1311 -1.394551574360510e+03 +1238 1312 -1.168677565678393e+03 +1238 1313 -1.032880208377977e+03 +1238 1314 -9.695072463564434e+02 +1238 1333 -1.015511306612467e+03 +1238 1334 -9.536070604341750e+02 +1238 1335 -8.507888885505199e+02 +1238 1336 -7.352796046183681e+02 +1238 1337 -6.289529049931513e+02 +1238 1338 -5.429674662554822e+02 +1238 1339 -4.803677035258846e+02 +1238 1340 -4.402579127124382e+02 +1238 1341 -4.208084537187713e+02 +1239 1171 -8.148024630667953e+02 +1239 1172 -8.643348602446076e+02 +1239 1173 -9.695072463564434e+02 +1239 1174 -1.141773184361042e+03 +1239 1175 -1.394551574360510e+03 +1239 1176 -1.733190400658708e+03 +1239 1177 -2.134265778758326e+03 +1239 1178 -2.521021940438000e+03 +1239 1179 -2.767706810094291e+03 +1239 1306 -5.136224430633882e+03 +1239 1307 -4.560278038130823e+03 +1239 1308 -3.699147964795180e+03 +1239 1309 -2.861294172280346e+03 +1239 1310 -2.199157547087201e+03 +1239 1311 -1.733190400658708e+03 +1239 1312 -1.430197816180122e+03 +1239 1313 -1.251286952144484e+03 +1239 1314 -1.168677565678393e+03 +1239 1333 -1.228588660544053e+03 +1239 1334 -1.148042053110080e+03 +1239 1335 -1.015511306612467e+03 +1239 1336 -8.685786765383800e+02 +1239 1337 -7.352796046183681e+02 +1239 1338 -6.289529049931513e+02 +1239 1339 -5.524312223207850e+02 +1239 1340 -5.038180997021789e+02 +1239 1341 -4.803677035258846e+02 +1240 1171 -7.058924559832891e+02 +1240 1172 -7.463158073460687e+02 +1240 1173 -8.315436028021828e+02 +1240 1174 -9.695072463564434e+02 +1240 1175 -1.168677565678393e+03 +1240 1176 -1.430197816180122e+03 +1240 1177 -1.733190400658708e+03 +1240 1178 -2.019368486704435e+03 +1240 1179 -2.199157547087201e+03 +1240 1306 -7.138491575686282e+03 +1240 1307 -6.235592529048601e+03 +1240 1308 -4.925216936196723e+03 +1240 1309 -3.699147964795180e+03 +1240 1310 -2.767706810094291e+03 +1240 1311 -2.134265778758326e+03 +1240 1312 -1.733190400658708e+03 +1240 1313 -1.500725861549673e+03 +1240 1314 -1.394551574360510e+03 +1240 1333 -1.471477730866027e+03 +1240 1334 -1.368148367306964e+03 +1240 1335 -1.199743197084304e+03 +1240 1336 -1.015511306612467e+03 +1240 1337 -8.507888885505199e+02 +1240 1338 -7.211778000851799e+02 +1240 1339 -6.289529049931513e+02 +1240 1340 -5.708523475060541e+02 +1240 1341 -5.429674662554822e+02 +1241 1171 -6.378158089920689e+02 +1241 1172 -6.728335244699299e+02 +1241 1173 -7.463158073460687e+02 +1241 1174 -8.643348602446076e+02 +1241 1175 -1.032880208377977e+03 +1241 1176 -1.251286952144484e+03 +1241 1177 -1.500725861549673e+03 +1241 1178 -1.733190400658708e+03 +1241 1179 -1.877824568765017e+03 +1241 1306 -9.405703259334639e+03 +1241 1307 -8.091232579773156e+03 +1241 1308 -6.235592529048601e+03 +1241 1309 -4.560278038130823e+03 +1241 1310 -3.331754877699595e+03 +1241 1311 -2.521021940438000e+03 +1241 1312 -2.019368486704435e+03 +1241 1313 -1.733190400658708e+03 +1241 1314 -1.603684467943633e+03 +1241 1333 -1.697437739078449e+03 +1241 1334 -1.571600895131404e+03 +1241 1335 -1.368148367306964e+03 +1241 1336 -1.148042053110080e+03 +1241 1337 -9.536070604341750e+02 +1241 1338 -8.023274760830675e+02 +1241 1339 -6.956816209337401e+02 +1241 1340 -6.289529049931513e+02 +1241 1341 -5.970589583440825e+02 +1242 1171 -6.052974323170214e+02 +1242 1172 -6.378158089920671e+02 +1242 1173 -7.058924559832867e+02 +1242 1174 -8.148024630667926e+02 +1242 1175 -9.695072463564434e+02 +1242 1176 -1.168677565678393e+03 +1242 1177 -1.394551574360510e+03 +1242 1178 -1.603684467943633e+03 +1242 1179 -1.733190400658708e+03 +1242 1306 -1.103972130715926e+04 +1242 1307 -9.405703259334639e+03 +1242 1308 -7.138491575686282e+03 +1242 1309 -5.136224430633882e+03 +1242 1310 -3.699147964795180e+03 +1242 1311 -2.767706810094291e+03 +1242 1312 -2.199157547087201e+03 +1242 1313 -1.877824568765017e+03 +1242 1314 -1.733190400658708e+03 +1242 1333 -1.837845240586539e+03 +1242 1334 -1.697437739078449e+03 +1242 1335 -1.471477730866027e+03 +1242 1336 -1.228588660544053e+03 +1242 1337 -1.015511306612467e+03 +1242 1338 -8.507888885505199e+02 +1242 1339 -7.352796046183681e+02 +1242 1340 -6.632839990295113e+02 +1242 1341 -6.289529049931513e+02 +1261 1171 -6.289529049931532e+02 +1261 1172 -6.632839990295113e+02 +1261 1173 -7.352796046183681e+02 +1261 1174 -8.507888885505199e+02 +1261 1175 -1.015511306612467e+03 +1261 1176 -1.228588660544053e+03 +1261 1177 -1.471477730866027e+03 +1261 1178 -1.697437739078449e+03 +1261 1179 -1.837845240586539e+03 +1261 1198 -1.733190400658708e+03 +1261 1199 -1.877824568765017e+03 +1261 1200 -2.199157547087201e+03 +1261 1201 -2.767706810094291e+03 +1261 1202 -3.699147964795180e+03 +1261 1203 -5.136224430633882e+03 +1261 1204 -7.138491575686282e+03 +1261 1205 -9.405703259334639e+03 +1261 1206 -1.103972130715926e+04 +1261 1333 -1.733190400658708e+03 +1261 1334 -1.603684467943633e+03 +1261 1335 -1.394551574360510e+03 +1261 1336 -1.168677565678393e+03 +1261 1337 -9.695072463564434e+02 +1261 1338 -8.148024630667926e+02 +1261 1339 -7.058924559832867e+02 +1261 1340 -6.378158089920671e+02 +1261 1341 -6.052974323170196e+02 +1262 1171 -5.970589583440841e+02 +1262 1172 -6.289529049931513e+02 +1262 1173 -6.956816209337401e+02 +1262 1174 -8.023274760830675e+02 +1262 1175 -9.536070604341750e+02 +1262 1176 -1.148042053110080e+03 +1262 1177 -1.368148367306964e+03 +1262 1178 -1.571600895131404e+03 +1262 1179 -1.697437739078449e+03 +1262 1198 -1.603684467943633e+03 +1262 1199 -1.733190400658708e+03 +1262 1200 -2.019368486704435e+03 +1262 1201 -2.521021940438000e+03 +1262 1202 -3.331754877699595e+03 +1262 1203 -4.560278038130823e+03 +1262 1204 -6.235592529048601e+03 +1262 1205 -8.091232579773156e+03 +1262 1206 -9.405703259334639e+03 +1262 1333 -1.877824568765017e+03 +1262 1334 -1.733190400658708e+03 +1262 1335 -1.500725861549673e+03 +1262 1336 -1.251286952144484e+03 +1262 1337 -1.032880208377977e+03 +1262 1338 -8.643348602446076e+02 +1262 1339 -7.463158073460687e+02 +1262 1340 -6.728335244699299e+02 +1262 1341 -6.378158089920671e+02 +1263 1171 -5.429674662554836e+02 +1263 1172 -5.708523475060541e+02 +1263 1173 -6.289529049931513e+02 +1263 1174 -7.211778000851799e+02 +1263 1175 -8.507888885505199e+02 +1263 1176 -1.015511306612467e+03 +1263 1177 -1.199743197084304e+03 +1263 1178 -1.368148367306964e+03 +1263 1179 -1.471477730866027e+03 +1263 1198 -1.394551574360510e+03 +1263 1199 -1.500725861549673e+03 +1263 1200 -1.733190400658708e+03 +1263 1201 -2.134265778758326e+03 +1263 1202 -2.767706810094291e+03 +1263 1203 -3.699147964795180e+03 +1263 1204 -4.925216936196723e+03 +1263 1205 -6.235592529048601e+03 +1263 1206 -7.138491575686282e+03 +1263 1333 -2.199157547087201e+03 +1263 1334 -2.019368486704435e+03 +1263 1335 -1.733190400658708e+03 +1263 1336 -1.430197816180122e+03 +1263 1337 -1.168677565678393e+03 +1263 1338 -9.695072463564434e+02 +1263 1339 -8.315436028021828e+02 +1263 1340 -7.463158073460687e+02 +1263 1341 -7.058924559832867e+02 +1264 1171 -4.803677035258858e+02 +1264 1172 -5.038180997021789e+02 +1264 1173 -5.524312223207850e+02 +1264 1174 -6.289529049931513e+02 +1264 1175 -7.352796046183681e+02 +1264 1176 -8.685786765383800e+02 +1264 1177 -1.015511306612467e+03 +1264 1178 -1.148042053110080e+03 +1264 1179 -1.228588660544053e+03 +1264 1198 -1.168677565678393e+03 +1264 1199 -1.251286952144484e+03 +1264 1200 -1.430197816180122e+03 +1264 1201 -1.733190400658708e+03 +1264 1202 -2.199157547087201e+03 +1264 1203 -2.861294172280346e+03 +1264 1204 -3.699147964795180e+03 +1264 1205 -4.560278038130823e+03 +1264 1206 -5.136224430633882e+03 +1264 1333 -2.767706810094291e+03 +1264 1334 -2.521021940438000e+03 +1264 1335 -2.134265778758326e+03 +1264 1336 -1.733190400658708e+03 +1264 1337 -1.394551574360510e+03 +1264 1338 -1.141773184361042e+03 +1264 1339 -9.695072463564434e+02 +1264 1340 -8.643348602446076e+02 +1264 1341 -8.148024630667926e+02 +1265 1171 -4.208084537187723e+02 +1265 1172 -4.402579127124382e+02 +1265 1173 -4.803677035258846e+02 +1265 1174 -5.429674662554822e+02 +1265 1175 -6.289529049931513e+02 +1265 1176 -7.352796046183681e+02 +1265 1177 -8.507888885505199e+02 +1265 1178 -9.536070604341750e+02 +1265 1179 -1.015511306612467e+03 +1265 1198 -9.695072463564434e+02 +1265 1199 -1.032880208377977e+03 +1265 1200 -1.168677565678393e+03 +1265 1201 -1.394551574360510e+03 +1265 1202 -1.733190400658708e+03 +1265 1203 -2.199157547087201e+03 +1265 1204 -2.767706810094291e+03 +1265 1205 -3.331754877699595e+03 +1265 1206 -3.699147964795180e+03 +1265 1333 -3.699147964795180e+03 +1265 1334 -3.331754877699595e+03 +1265 1335 -2.767706810094291e+03 +1265 1336 -2.199157547087201e+03 +1265 1337 -1.733190400658708e+03 +1265 1338 -1.394551574360510e+03 +1265 1339 -1.168677565678393e+03 +1265 1340 -1.032880208377977e+03 +1265 1341 -9.695072463564434e+02 +1266 1171 -3.710963518270340e+02 +1266 1172 -3.873813675510144e+02 +1266 1173 -4.208084537187713e+02 +1266 1174 -4.725808574370885e+02 +1266 1175 -5.429674662554822e+02 +1266 1176 -6.289529049931513e+02 +1266 1177 -7.211778000851799e+02 +1266 1178 -8.023274760830675e+02 +1266 1179 -8.507888885505199e+02 +1266 1198 -8.148024630667926e+02 +1266 1199 -8.643348602446076e+02 +1266 1200 -9.695072463564434e+02 +1266 1201 -1.141773184361042e+03 +1266 1202 -1.394551574360510e+03 +1266 1203 -1.733190400658708e+03 +1266 1204 -2.134265778758326e+03 +1266 1205 -2.521021940438000e+03 +1266 1206 -2.767706810094291e+03 +1266 1333 -5.136224430633882e+03 +1266 1334 -4.560278038130823e+03 +1266 1335 -3.699147964795180e+03 +1266 1336 -2.861294172280346e+03 +1266 1337 -2.199157547087201e+03 +1266 1338 -1.733190400658708e+03 +1266 1339 -1.430197816180122e+03 +1266 1340 -1.251286952144484e+03 +1266 1341 -1.168677565678393e+03 +1267 1171 -3.339204550667995e+02 +1267 1172 -3.479505460244110e+02 +1267 1173 -3.766415408901786e+02 +1267 1174 -4.208084537187713e+02 +1267 1175 -4.803677035258846e+02 +1267 1176 -5.524312223207850e+02 +1267 1177 -6.289529049931513e+02 +1267 1178 -6.956816209337401e+02 +1267 1179 -7.352796046183681e+02 +1267 1198 -7.058924559832867e+02 +1267 1199 -7.463158073460687e+02 +1267 1200 -8.315436028021828e+02 +1267 1201 -9.695072463564434e+02 +1267 1202 -1.168677565678393e+03 +1267 1203 -1.430197816180122e+03 +1267 1204 -1.733190400658708e+03 +1267 1205 -2.019368486704435e+03 +1267 1206 -2.199157547087201e+03 +1267 1333 -7.138491575686282e+03 +1267 1334 -6.235592529048601e+03 +1267 1335 -4.925216936196723e+03 +1267 1336 -3.699147964795180e+03 +1267 1337 -2.767706810094291e+03 +1267 1338 -2.134265778758326e+03 +1267 1339 -1.733190400658708e+03 +1267 1340 -1.500725861549673e+03 +1267 1341 -1.394551574360510e+03 +1268 1171 -3.096178268240471e+02 +1268 1172 -3.222285372305477e+02 +1268 1173 -3.479505460244110e+02 +1268 1174 -3.873813675510144e+02 +1268 1175 -4.402579127124382e+02 +1268 1176 -5.038180997021789e+02 +1268 1177 -5.708523475060541e+02 +1268 1178 -6.289529049931513e+02 +1268 1179 -6.632839990295113e+02 +1268 1198 -6.378158089920671e+02 +1268 1199 -6.728335244699299e+02 +1268 1200 -7.463158073460687e+02 +1268 1201 -8.643348602446076e+02 +1268 1202 -1.032880208377977e+03 +1268 1203 -1.251286952144484e+03 +1268 1204 -1.500725861549673e+03 +1268 1205 -1.733190400658708e+03 +1268 1206 -1.877824568765017e+03 +1268 1333 -9.405703259334639e+03 +1268 1334 -8.091232579773156e+03 +1268 1335 -6.235592529048601e+03 +1268 1336 -4.560278038130823e+03 +1268 1337 -3.331754877699595e+03 +1268 1338 -2.521021940438000e+03 +1268 1339 -2.019368486704435e+03 +1268 1340 -1.733190400658708e+03 +1268 1341 -1.603684467943633e+03 +1269 1171 -2.976873911031304e+02 +1269 1172 -3.096178268240465e+02 +1269 1173 -3.339204550667988e+02 +1269 1174 -3.710963518270331e+02 +1269 1175 -4.208084537187713e+02 +1269 1176 -4.803677035258846e+02 +1269 1177 -5.429674662554822e+02 +1269 1178 -5.970589583440825e+02 +1269 1179 -6.289529049931513e+02 +1269 1198 -6.052974323170196e+02 +1269 1199 -6.378158089920671e+02 +1269 1200 -7.058924559832867e+02 +1269 1201 -8.148024630667926e+02 +1269 1202 -9.695072463564434e+02 +1269 1203 -1.168677565678393e+03 +1269 1204 -1.394551574360510e+03 +1269 1205 -1.603684467943633e+03 +1269 1206 -1.733190400658708e+03 +1269 1333 -1.103972130715926e+04 +1269 1334 -9.405703259334639e+03 +1269 1335 -7.138491575686282e+03 +1269 1336 -5.136224430633882e+03 +1269 1337 -3.699147964795180e+03 +1269 1338 -2.767706810094291e+03 +1269 1339 -2.199157547087201e+03 +1269 1340 -1.877824568765017e+03 +1269 1341 -1.733190400658708e+03 +1288 865 -1.965477828103598e+01 +1288 866 -2.067858569511584e+01 +1288 867 -2.281491025526309e+01 +1288 868 -2.621419542240645e+01 +1288 869 -3.100728135248165e+01 +1288 870 -3.712309913086534e+01 +1288 871 -4.399251628020362e+01 +1288 872 -5.029652653878190e+01 +1288 873 -5.417542964960961e+01 +1288 1000 -5.416220002058462e+01 +1288 1001 -5.847168336242214e+01 +1288 1002 -6.797204698756194e+01 +1288 1003 -8.455751811575999e+01 +1288 1004 -1.112023202068744e+02 +1288 1005 -1.512628164030903e+02 +1288 1006 -2.053883607687485e+02 +1288 1007 -2.647767438527630e+02 +1288 1008 -3.065373731090118e+02 +1288 1567 -5.416220002058462e+01 +1288 1568 -5.028460369863171e+01 +1288 1569 -4.398263164573866e+01 +1288 1570 -3.711530555640490e+01 +1288 1571 -3.100122392289864e+01 +1288 1572 -2.620940698061742e+01 +1288 1573 -2.281096793104268e+01 +1288 1574 -2.067515029553633e+01 +1288 1575 -1.965157861598590e+01 +1289 865 -1.870055440211151e+01 +1289 866 -1.965477828103598e+01 +1289 867 -2.164167292784033e+01 +1289 868 -2.479209926714915e+01 +1289 869 -2.921308657465229e+01 +1289 870 -3.482168460593338e+01 +1289 871 -4.108257963331432e+01 +1289 872 -4.679557686118159e+01 +1289 873 -5.029652653878190e+01 +1289 1000 -5.028460369863171e+01 +1289 1001 -5.416220002058462e+01 +1289 1002 -6.266865647386102e+01 +1289 1003 -7.739429142416689e+01 +1289 1004 -1.007640600234616e+02 +1289 1005 -1.353445496343034e+02 +1289 1006 -1.811983282511272e+02 +1289 1007 -2.305668762810884e+02 +1289 1008 -2.647767438527630e+02 +1289 1567 -5.847168336242214e+01 +1289 1568 -5.416220002058462e+01 +1289 1569 -4.718848846240646e+01 +1289 1570 -3.963467701820890e+01 +1289 1571 -3.295302401855845e+01 +1289 1572 -2.774798050936779e+01 +1289 1573 -2.407490908992506e+01 +1289 1574 -2.177494503977683e+01 +1289 1575 -2.067515029553633e+01 +1290 865 -1.707507926940499e+01 +1290 866 -1.791417887437397e+01 +1290 867 -1.965477828103599e+01 +1290 868 -2.239757409043197e+01 +1290 869 -2.621419542240647e+01 +1290 870 -3.100728135248167e+01 +1290 871 -3.630032063351620e+01 +1290 872 -4.108257963331437e+01 +1290 873 -4.399251628020367e+01 +1290 1000 -4.398263164573866e+01 +1290 1001 -4.718848846240646e+01 +1290 1002 -5.416220002058468e+01 +1290 1003 -6.606134132672695e+01 +1290 1004 -8.455751811576010e+01 +1290 1005 -1.112023202068745e+02 +1290 1006 -1.454508347890308e+02 +1290 1007 -1.811983282511275e+02 +1290 1008 -2.053883607687489e+02 +1290 1567 -6.797204698756184e+01 +1290 1568 -6.266865647386096e+01 +1290 1569 -5.416220002058462e+01 +1290 1570 -4.506046026496942e+01 +1290 1571 -3.711530555640482e+01 +1290 1572 -3.100122392289858e+01 +1290 1573 -2.672989532903555e+01 +1290 1574 -2.407490908992506e+01 +1290 1575 -2.281096793104268e+01 +1291 865 -1.518203609416468e+01 +1291 866 -1.589274010473518e+01 +1291 867 -1.736013665098132e+01 +1291 868 -1.965477828103599e+01 +1291 869 -2.281491025526310e+01 +1291 870 -2.673481743251410e+01 +1291 871 -3.100728135248167e+01 +1291 872 -3.482168460593341e+01 +1291 873 -3.712309913086538e+01 +1291 1000 -3.711530555640490e+01 +1291 1001 -3.963467701820890e+01 +1291 1002 -4.506046026496946e+01 +1291 1003 -5.416220002058468e+01 +1291 1004 -6.797204698756201e+01 +1291 1005 -8.726265053974954e+01 +1291 1006 -1.112023202068745e+02 +1291 1007 -1.353445496343036e+02 +1291 1008 -1.512628164030906e+02 +1291 1567 -8.455751811575986e+01 +1291 1568 -7.739429142416682e+01 +1291 1569 -6.606134132672688e+01 +1291 1570 -5.416220002058462e+01 +1291 1571 -4.398263164573857e+01 +1291 1572 -3.629276779865588e+01 +1291 1573 -3.100122392289858e+01 +1291 1574 -2.774798050936779e+01 +1291 1575 -2.620940698061742e+01 +1292 865 -1.336813651340294e+01 +1292 866 -1.396191802264486e+01 +1292 867 -1.518203609416467e+01 +1292 868 -1.707507926940498e+01 +1292 869 -1.965477828103598e+01 +1292 870 -2.281491025526309e+01 +1292 871 -2.621419542240645e+01 +1292 872 -2.921308657465229e+01 +1292 873 -3.100728135248165e+01 +1292 1000 -3.100122392289864e+01 +1292 1001 -3.295302401855845e+01 +1292 1002 -3.711530555640486e+01 +1292 1003 -4.398263164573862e+01 +1292 1004 -5.416220002058462e+01 +1292 1005 -6.797204698756194e+01 +1292 1006 -8.455751811575999e+01 +1292 1007 -1.007640600234616e+02 +1292 1008 -1.112023202068744e+02 +1292 1567 -1.112023202068744e+02 +1292 1568 -1.007640600234616e+02 +1292 1569 -8.455751811576010e+01 +1292 1570 -6.797204698756201e+01 +1292 1571 -5.416220002058462e+01 +1292 1572 -4.398263164573857e+01 +1292 1573 -3.711530555640482e+01 +1292 1574 -3.295302401855845e+01 +1292 1575 -3.100122392289864e+01 +1293 865 -1.184372960400065e+01 +1293 866 -1.234420052045069e+01 +1293 867 -1.336813651340293e+01 +1293 868 -1.494561758129198e+01 +1293 869 -1.707507926940496e+01 +1293 870 -1.965477828103597e+01 +1293 871 -2.239757409043194e+01 +1293 872 -2.479209926714913e+01 +1293 873 -2.621419542240643e+01 +1293 1000 -2.620940698061742e+01 +1293 1001 -2.774798050936779e+01 +1293 1002 -3.100122392289861e+01 +1293 1003 -3.629276779865592e+01 +1293 1004 -4.398263164573857e+01 +1293 1005 -5.416220002058456e+01 +1293 1006 -6.606134132672679e+01 +1293 1007 -7.739429142416682e+01 +1293 1008 -8.455751811575986e+01 +1293 1567 -1.512628164030906e+02 +1293 1568 -1.353445496343036e+02 +1293 1569 -1.112023202068747e+02 +1293 1570 -8.726265053974967e+01 +1293 1571 -6.797204698756201e+01 +1293 1572 -5.416220002058462e+01 +1293 1573 -4.506046026496942e+01 +1293 1574 -3.963467701820890e+01 +1293 1575 -3.711530555640490e+01 +1294 865 -1.069703031088084e+01 +1294 866 -1.113049648221346e+01 +1294 867 -1.201426721054981e+01 +1294 868 -1.336813651340293e+01 +1294 869 -1.518203609416466e+01 +1294 870 -1.736013665098130e+01 +1294 871 -1.965477828103597e+01 +1294 872 -2.164167292784031e+01 +1294 873 -2.281491025526307e+01 +1294 1000 -2.281096793104268e+01 +1294 1001 -2.407490908992506e+01 +1294 1002 -2.672989532903557e+01 +1294 1003 -3.100122392289861e+01 +1294 1004 -3.711530555640482e+01 +1294 1005 -4.506046026496937e+01 +1294 1006 -5.416220002058456e+01 +1294 1007 -6.266865647386096e+01 +1294 1008 -6.797204698756184e+01 +1294 1567 -2.053883607687489e+02 +1294 1568 -1.811983282511275e+02 +1294 1569 -1.454508347890311e+02 +1294 1570 -1.112023202068747e+02 +1294 1571 -8.455751811576010e+01 +1294 1572 -6.606134132672688e+01 +1294 1573 -5.416220002058462e+01 +1294 1574 -4.718848846240646e+01 +1294 1575 -4.398263164573866e+01 +1295 865 -9.944085360683063e+00 +1295 866 -1.033512964800000e+01 +1295 867 -1.113049648221347e+01 +1295 868 -1.234420052045070e+01 +1295 869 -1.396191802264486e+01 +1295 870 -1.589274010473517e+01 +1295 871 -1.791417887437395e+01 +1295 872 -1.965477828103598e+01 +1295 873 -2.067858569511584e+01 +1295 1000 -2.067515029553633e+01 +1295 1001 -2.177494503977683e+01 +1295 1002 -2.407490908992508e+01 +1295 1003 -2.774798050936781e+01 +1295 1004 -3.295302401855845e+01 +1295 1005 -3.963467701820886e+01 +1295 1006 -4.718848846240642e+01 +1295 1007 -5.416220002058462e+01 +1295 1008 -5.847168336242214e+01 +1295 1567 -2.647767438527630e+02 +1295 1568 -2.305668762810884e+02 +1295 1569 -1.811983282511275e+02 +1295 1570 -1.353445496343036e+02 +1295 1571 -1.007640600234616e+02 +1295 1572 -7.739429142416682e+01 +1295 1573 -6.266865647386096e+01 +1295 1574 -5.416220002058462e+01 +1295 1575 -5.028460369863171e+01 +1296 865 -9.573445684409064e+00 +1296 866 -9.944085360683063e+00 +1296 867 -1.069703031088085e+01 +1296 868 -1.184372960400065e+01 +1296 869 -1.336813651340294e+01 +1296 870 -1.518203609416467e+01 +1296 871 -1.707507926940498e+01 +1296 872 -1.870055440211151e+01 +1296 873 -1.965477828103598e+01 +1296 1000 -1.965157861598590e+01 +1296 1001 -2.067515029553633e+01 +1296 1002 -2.281096793104269e+01 +1296 1003 -2.620940698061744e+01 +1296 1004 -3.100122392289864e+01 +1296 1005 -3.711530555640486e+01 +1296 1006 -4.398263164573862e+01 +1296 1007 -5.028460369863171e+01 +1296 1008 -5.416220002058462e+01 +1296 1567 -3.065373731090118e+02 +1296 1568 -2.647767438527630e+02 +1296 1569 -2.053883607687489e+02 +1296 1570 -1.512628164030906e+02 +1296 1571 -1.112023202068744e+02 +1296 1572 -8.455751811575986e+01 +1296 1573 -6.797204698756184e+01 +1296 1574 -5.847168336242214e+01 +1296 1575 -5.416220002058462e+01 +1297 1162 -3.063876713483004e+02 +1297 1163 -3.311617365195747e+02 +1297 1164 -3.859179776157605e+02 +1297 1165 -4.819366867771664e+02 +1297 1166 -6.371952057562402e+02 +1297 1167 -8.726231103602357e+02 +1297 1168 -1.193932486839834e+03 +1297 1169 -1.550121445008505e+03 +1297 1170 -1.802596433195456e+03 +1297 1441 -3.063876713483004e+02 +1297 1442 -2.841326260213855e+02 +1297 1443 -2.480403651673271e+02 +1297 1444 -2.088271183655457e+02 +1297 1445 -1.740274317161707e+02 +1297 1446 -1.468355065336023e+02 +1297 1447 -1.275984131219179e+02 +1297 1448 -1.155304899028561e+02 +1297 1449 -1.097534196790493e+02 +1297 1504 -1.111842160419089e+02 +1297 1505 -1.057061586526018e+02 +1297 1506 -9.638822517401589e+01 +1297 1507 -8.555928471614156e+01 +1297 1508 -7.520762033775921e+01 +1297 1509 -6.652797451218323e+01 +1297 1510 -6.001174723167335e+01 +1297 1511 -5.573941364116940e+01 +1297 1512 -5.363826960242956e+01 +1298 1162 -2.841326260213855e+02 +1298 1163 -3.063876713483004e+02 +1298 1164 -3.553280674768354e+02 +1298 1165 -4.404031329187411e+02 +1298 1166 -5.762343277298867e+02 +1298 1167 -7.788097592344268e+02 +1298 1168 -1.049909849375148e+03 +1298 1169 -1.344510568096302e+03 +1298 1170 -1.550121445008505e+03 +1298 1441 -3.311617365195747e+02 +1298 1442 -3.063876713483004e+02 +1298 1443 -2.663884709281895e+02 +1298 1444 -2.231981844606894e+02 +1298 1445 -1.851243485745373e+02 +1298 1446 -1.555580782497810e+02 +1298 1447 -1.347481526436478e+02 +1298 1448 -1.217424124188383e+02 +1298 1449 -1.155304899028561e+02 +1298 1504 -1.170681125153376e+02 +1298 1505 -1.111842160419089e+02 +1298 1506 -1.011961191083175e+02 +1298 1507 -8.962181586287889e+01 +1298 1508 -7.859349409841370e+01 +1298 1509 -6.937545782864687e+01 +1298 1510 -6.247361649834824e+01 +1298 1511 -5.795761808209202e+01 +1298 1512 -5.573941364116940e+01 +1299 1162 -2.480403651673271e+02 +1299 1163 -2.663884709281895e+02 +1299 1164 -3.063876713483004e+02 +1299 1165 -3.748904053829385e+02 +1299 1166 -4.819366867771664e+02 +1299 1167 -6.371952057562402e+02 +1299 1168 -8.383319685358435e+02 +1299 1169 -1.049909849375148e+03 +1299 1170 -1.193932486839834e+03 +1299 1441 -3.859179776157605e+02 +1299 1442 -3.553280674768354e+02 +1299 1443 -3.063876713483004e+02 +1299 1444 -2.542062119667738e+02 +1299 1445 -2.088271183655457e+02 +1299 1446 -1.740274317161707e+02 +1299 1447 -1.497853840269160e+02 +1299 1448 -1.347481526436478e+02 +1299 1449 -1.275984131219179e+02 +1299 1504 -1.293661657908652e+02 +1299 1505 -1.226088998409724e+02 +1299 1506 -1.111842160419089e+02 +1299 1507 -9.802102195827720e+01 +1299 1508 -8.555928471614156e+01 +1299 1509 -7.520762033775921e+01 +1299 1510 -6.749803222962952e+01 +1299 1511 -6.247361649834824e+01 +1299 1512 -6.001174723167335e+01 +1300 1162 -2.088271183655457e+02 +1300 1163 -2.231981844606894e+02 +1300 1164 -2.542062119667738e+02 +1300 1165 -3.063876713483004e+02 +1300 1166 -3.859179776157605e+02 +1300 1167 -4.976453857371607e+02 +1300 1168 -6.371952057562402e+02 +1300 1169 -7.788097592344268e+02 +1300 1170 -8.726231103602357e+02 +1300 1441 -4.819366867771664e+02 +1300 1442 -4.404031329187411e+02 +1300 1443 -3.748904053829385e+02 +1300 1444 -3.063876713483004e+02 +1300 1445 -2.480403651673271e+02 +1300 1446 -2.041390437321793e+02 +1300 1447 -1.740274317161707e+02 +1300 1448 -1.555580782497810e+02 +1300 1449 -1.468355065336023e+02 +1300 1504 -1.489885081652992e+02 +1300 1505 -1.407716848553628e+02 +1300 1506 -1.269615920628681e+02 +1300 1507 -1.111842160419089e+02 +1300 1508 -9.638822517401589e+01 +1300 1509 -8.420868002944904e+01 +1300 1510 -7.520762033775921e+01 +1300 1511 -6.937545782864687e+01 +1300 1512 -6.652797451218323e+01 +1301 1162 -1.740274317161707e+02 +1301 1163 -1.851243485745373e+02 +1301 1164 -2.088271183655457e+02 +1301 1165 -2.480403651673271e+02 +1301 1166 -3.063876713483004e+02 +1301 1167 -3.859179776157605e+02 +1301 1168 -4.819366867771664e+02 +1301 1169 -5.762343277298867e+02 +1301 1170 -6.371952057562402e+02 +1301 1441 -6.371952057562402e+02 +1301 1442 -5.762343277298867e+02 +1301 1443 -4.819366867771664e+02 +1301 1444 -3.859179776157605e+02 +1301 1445 -3.063876713483004e+02 +1301 1446 -2.480403651673271e+02 +1301 1447 -2.088271183655457e+02 +1301 1448 -1.851243485745373e+02 +1301 1449 -1.740274317161707e+02 +1301 1504 -1.767605489846857e+02 +1301 1505 -1.663510232448633e+02 +1301 1506 -1.489885081652992e+02 +1301 1507 -1.293661657908652e+02 +1301 1508 -1.111842160419089e+02 +1301 1509 -9.638822517401589e+01 +1301 1510 -8.555928471614156e+01 +1301 1511 -7.859349409841370e+01 +1301 1512 -7.520762033775921e+01 +1302 1162 -1.468355065336023e+02 +1302 1163 -1.555580782497810e+02 +1302 1164 -1.740274317161707e+02 +1302 1165 -2.041390437321793e+02 +1302 1166 -2.480403651673271e+02 +1302 1167 -3.063876713483004e+02 +1302 1168 -3.748904053829385e+02 +1302 1169 -4.404031329187411e+02 +1302 1170 -4.819366867771664e+02 +1302 1441 -8.726231103602357e+02 +1302 1442 -7.788097592344268e+02 +1302 1443 -6.371952057562402e+02 +1302 1444 -4.976453857371607e+02 +1302 1445 -3.859179776157605e+02 +1302 1446 -3.063876713483004e+02 +1302 1447 -2.542062119667738e+02 +1302 1448 -2.231981844606894e+02 +1302 1449 -2.088271183655457e+02 +1302 1504 -2.123577731150849e+02 +1302 1505 -1.989422168423268e+02 +1302 1506 -1.767605489846857e+02 +1302 1507 -1.519993633210930e+02 +1302 1508 -1.293661657908652e+02 +1302 1509 -1.111842160419089e+02 +1302 1510 -9.802102195827720e+01 +1302 1511 -8.962181586287889e+01 +1302 1512 -8.555928471614156e+01 +1303 1162 -1.275984131219179e+02 +1303 1163 -1.347481526436478e+02 +1303 1164 -1.497853840269160e+02 +1303 1165 -1.740274317161707e+02 +1303 1166 -2.088271183655457e+02 +1303 1167 -2.542062119667738e+02 +1303 1168 -3.063876713483004e+02 +1303 1169 -3.553280674768354e+02 +1303 1170 -3.859179776157605e+02 +1303 1441 -1.193932486839834e+03 +1303 1442 -1.049909849375148e+03 +1303 1443 -8.383319685358435e+02 +1303 1444 -6.371952057562402e+02 +1303 1445 -4.819366867771664e+02 +1303 1446 -3.748904053829385e+02 +1303 1447 -3.063876713483004e+02 +1303 1448 -2.663884709281895e+02 +1303 1449 -2.480403651673271e+02 +1303 1504 -2.525366109215767e+02 +1303 1505 -2.354925657825773e+02 +1303 1506 -2.075588680195229e+02 +1303 1507 -1.767605489846857e+02 +1303 1508 -1.489885081652992e+02 +1303 1509 -1.269615920628681e+02 +1303 1510 -1.111842160419089e+02 +1303 1511 -1.011961191083175e+02 +1303 1512 -9.638822517401589e+01 +1304 1162 -1.155304899028561e+02 +1304 1163 -1.217424124188383e+02 +1304 1164 -1.347481526436478e+02 +1304 1165 -1.555580782497810e+02 +1304 1166 -1.851243485745373e+02 +1304 1167 -2.231981844606894e+02 +1304 1168 -2.663884709281895e+02 +1304 1169 -3.063876713483004e+02 +1304 1170 -3.311617365195747e+02 +1304 1441 -1.550121445008505e+03 +1304 1442 -1.344510568096302e+03 +1304 1443 -1.049909849375148e+03 +1304 1444 -7.788097592344268e+02 +1304 1445 -5.762343277298867e+02 +1304 1446 -4.404031329187411e+02 +1304 1447 -3.553280674768354e+02 +1304 1448 -3.063876713483004e+02 +1304 1449 -2.841326260213855e+02 +1304 1504 -2.895745815575320e+02 +1304 1505 -2.689865983609317e+02 +1304 1506 -2.354925657825773e+02 +1304 1507 -1.989422168423268e+02 +1304 1508 -1.663510232448633e+02 +1304 1509 -1.407716848553628e+02 +1304 1510 -1.226088998409724e+02 +1304 1511 -1.111842160419089e+02 +1304 1512 -1.057061586526018e+02 +1305 1162 -1.097534196790493e+02 +1305 1163 -1.155304899028561e+02 +1305 1164 -1.275984131219179e+02 +1305 1165 -1.468355065336023e+02 +1305 1166 -1.740274317161707e+02 +1305 1167 -2.088271183655457e+02 +1305 1168 -2.480403651673271e+02 +1305 1169 -2.841326260213855e+02 +1305 1170 -3.063876713483004e+02 +1305 1441 -1.802596433195456e+03 +1305 1442 -1.550121445008505e+03 +1305 1443 -1.193932486839834e+03 +1305 1444 -8.726231103602357e+02 +1305 1445 -6.371952057562402e+02 +1305 1446 -4.819366867771664e+02 +1305 1447 -3.859179776157605e+02 +1305 1448 -3.311617365195747e+02 +1305 1449 -3.063876713483004e+02 +1305 1504 -3.124380547854544e+02 +1305 1505 -2.895745815575320e+02 +1305 1506 -2.525366109215767e+02 +1305 1507 -2.123577731150849e+02 +1305 1508 -1.767605489846857e+02 +1305 1509 -1.489885081652992e+02 +1305 1510 -1.293661657908652e+02 +1305 1511 -1.170681125153376e+02 +1305 1512 -1.111842160419089e+02 +1306 1234 -1.733190400658708e+03 +1306 1235 -1.877824568765017e+03 +1306 1236 -2.199157547087201e+03 +1306 1237 -2.767706810094291e+03 +1306 1238 -3.699147964795180e+03 +1306 1239 -5.136224430633882e+03 +1306 1240 -7.138491575686282e+03 +1306 1241 -9.405703259334639e+03 +1306 1242 -1.103972130715926e+04 +1306 1369 -1.733190400658708e+03 +1306 1370 -1.603684467943633e+03 +1306 1371 -1.394551574360510e+03 +1306 1372 -1.168677565678393e+03 +1306 1373 -9.695072463564434e+02 +1306 1374 -8.148024630667926e+02 +1306 1375 -7.058924559832867e+02 +1306 1376 -6.378158089920671e+02 +1306 1377 -6.052974323170196e+02 +1306 1396 -6.289529049931513e+02 +1306 1397 -5.970589583440825e+02 +1306 1398 -5.429674662554822e+02 +1306 1399 -4.803677035258846e+02 +1306 1400 -4.208084537187713e+02 +1306 1401 -3.710963518270331e+02 +1306 1402 -3.339204550667988e+02 +1306 1403 -3.096178268240465e+02 +1306 1404 -2.976873911031298e+02 +1307 1234 -1.603684467943633e+03 +1307 1235 -1.733190400658708e+03 +1307 1236 -2.019368486704435e+03 +1307 1237 -2.521021940438000e+03 +1307 1238 -3.331754877699595e+03 +1307 1239 -4.560278038130823e+03 +1307 1240 -6.235592529048601e+03 +1307 1241 -8.091232579773156e+03 +1307 1242 -9.405703259334639e+03 +1307 1369 -1.877824568765017e+03 +1307 1370 -1.733190400658708e+03 +1307 1371 -1.500725861549673e+03 +1307 1372 -1.251286952144484e+03 +1307 1373 -1.032880208377977e+03 +1307 1374 -8.643348602446076e+02 +1307 1375 -7.463158073460687e+02 +1307 1376 -6.728335244699299e+02 +1307 1377 -6.378158089920671e+02 +1307 1396 -6.632839990295113e+02 +1307 1397 -6.289529049931513e+02 +1307 1398 -5.708523475060541e+02 +1307 1399 -5.038180997021789e+02 +1307 1400 -4.402579127124382e+02 +1307 1401 -3.873813675510144e+02 +1307 1402 -3.479505460244110e+02 +1307 1403 -3.222285372305477e+02 +1307 1404 -3.096178268240465e+02 +1308 1234 -1.394551574360510e+03 +1308 1235 -1.500725861549673e+03 +1308 1236 -1.733190400658708e+03 +1308 1237 -2.134265778758326e+03 +1308 1238 -2.767706810094291e+03 +1308 1239 -3.699147964795180e+03 +1308 1240 -4.925216936196723e+03 +1308 1241 -6.235592529048601e+03 +1308 1242 -7.138491575686282e+03 +1308 1369 -2.199157547087201e+03 +1308 1370 -2.019368486704435e+03 +1308 1371 -1.733190400658708e+03 +1308 1372 -1.430197816180122e+03 +1308 1373 -1.168677565678393e+03 +1308 1374 -9.695072463564434e+02 +1308 1375 -8.315436028021828e+02 +1308 1376 -7.463158073460687e+02 +1308 1377 -7.058924559832867e+02 +1308 1396 -7.352796046183681e+02 +1308 1397 -6.956816209337401e+02 +1308 1398 -6.289529049931513e+02 +1308 1399 -5.524312223207850e+02 +1308 1400 -4.803677035258846e+02 +1308 1401 -4.208084537187713e+02 +1308 1402 -3.766415408901786e+02 +1308 1403 -3.479505460244110e+02 +1308 1404 -3.339204550667988e+02 +1309 1234 -1.168677565678393e+03 +1309 1235 -1.251286952144484e+03 +1309 1236 -1.430197816180122e+03 +1309 1237 -1.733190400658708e+03 +1309 1238 -2.199157547087201e+03 +1309 1239 -2.861294172280346e+03 +1309 1240 -3.699147964795180e+03 +1309 1241 -4.560278038130823e+03 +1309 1242 -5.136224430633882e+03 +1309 1369 -2.767706810094291e+03 +1309 1370 -2.521021940438000e+03 +1309 1371 -2.134265778758326e+03 +1309 1372 -1.733190400658708e+03 +1309 1373 -1.394551574360510e+03 +1309 1374 -1.141773184361042e+03 +1309 1375 -9.695072463564434e+02 +1309 1376 -8.643348602446076e+02 +1309 1377 -8.148024630667926e+02 +1309 1396 -8.507888885505199e+02 +1309 1397 -8.023274760830675e+02 +1309 1398 -7.211778000851799e+02 +1309 1399 -6.289529049931513e+02 +1309 1400 -5.429674662554822e+02 +1309 1401 -4.725808574370885e+02 +1309 1402 -4.208084537187713e+02 +1309 1403 -3.873813675510144e+02 +1309 1404 -3.710963518270331e+02 +1310 1234 -9.695072463564434e+02 +1310 1235 -1.032880208377977e+03 +1310 1236 -1.168677565678393e+03 +1310 1237 -1.394551574360510e+03 +1310 1238 -1.733190400658708e+03 +1310 1239 -2.199157547087201e+03 +1310 1240 -2.767706810094291e+03 +1310 1241 -3.331754877699595e+03 +1310 1242 -3.699147964795180e+03 +1310 1369 -3.699147964795180e+03 +1310 1370 -3.331754877699595e+03 +1310 1371 -2.767706810094291e+03 +1310 1372 -2.199157547087201e+03 +1310 1373 -1.733190400658708e+03 +1310 1374 -1.394551574360510e+03 +1310 1375 -1.168677565678393e+03 +1310 1376 -1.032880208377977e+03 +1310 1377 -9.695072463564434e+02 +1310 1396 -1.015511306612467e+03 +1310 1397 -9.536070604341750e+02 +1310 1398 -8.507888885505199e+02 +1310 1399 -7.352796046183681e+02 +1310 1400 -6.289529049931513e+02 +1310 1401 -5.429674662554822e+02 +1310 1402 -4.803677035258846e+02 +1310 1403 -4.402579127124382e+02 +1310 1404 -4.208084537187713e+02 +1311 1234 -8.148024630667926e+02 +1311 1235 -8.643348602446076e+02 +1311 1236 -9.695072463564434e+02 +1311 1237 -1.141773184361042e+03 +1311 1238 -1.394551574360510e+03 +1311 1239 -1.733190400658708e+03 +1311 1240 -2.134265778758326e+03 +1311 1241 -2.521021940438000e+03 +1311 1242 -2.767706810094291e+03 +1311 1369 -5.136224430633882e+03 +1311 1370 -4.560278038130823e+03 +1311 1371 -3.699147964795180e+03 +1311 1372 -2.861294172280346e+03 +1311 1373 -2.199157547087201e+03 +1311 1374 -1.733190400658708e+03 +1311 1375 -1.430197816180122e+03 +1311 1376 -1.251286952144484e+03 +1311 1377 -1.168677565678393e+03 +1311 1396 -1.228588660544053e+03 +1311 1397 -1.148042053110080e+03 +1311 1398 -1.015511306612467e+03 +1311 1399 -8.685786765383800e+02 +1311 1400 -7.352796046183681e+02 +1311 1401 -6.289529049931513e+02 +1311 1402 -5.524312223207850e+02 +1311 1403 -5.038180997021789e+02 +1311 1404 -4.803677035258846e+02 +1312 1234 -7.058924559832867e+02 +1312 1235 -7.463158073460687e+02 +1312 1236 -8.315436028021828e+02 +1312 1237 -9.695072463564434e+02 +1312 1238 -1.168677565678393e+03 +1312 1239 -1.430197816180122e+03 +1312 1240 -1.733190400658708e+03 +1312 1241 -2.019368486704435e+03 +1312 1242 -2.199157547087201e+03 +1312 1369 -7.138491575686282e+03 +1312 1370 -6.235592529048601e+03 +1312 1371 -4.925216936196723e+03 +1312 1372 -3.699147964795180e+03 +1312 1373 -2.767706810094291e+03 +1312 1374 -2.134265778758326e+03 +1312 1375 -1.733190400658708e+03 +1312 1376 -1.500725861549673e+03 +1312 1377 -1.394551574360510e+03 +1312 1396 -1.471477730866027e+03 +1312 1397 -1.368148367306964e+03 +1312 1398 -1.199743197084304e+03 +1312 1399 -1.015511306612467e+03 +1312 1400 -8.507888885505199e+02 +1312 1401 -7.211778000851799e+02 +1312 1402 -6.289529049931513e+02 +1312 1403 -5.708523475060541e+02 +1312 1404 -5.429674662554822e+02 +1313 1234 -6.378158089920671e+02 +1313 1235 -6.728335244699299e+02 +1313 1236 -7.463158073460687e+02 +1313 1237 -8.643348602446076e+02 +1313 1238 -1.032880208377977e+03 +1313 1239 -1.251286952144484e+03 +1313 1240 -1.500725861549673e+03 +1313 1241 -1.733190400658708e+03 +1313 1242 -1.877824568765017e+03 +1313 1369 -9.405703259334639e+03 +1313 1370 -8.091232579773156e+03 +1313 1371 -6.235592529048601e+03 +1313 1372 -4.560278038130823e+03 +1313 1373 -3.331754877699595e+03 +1313 1374 -2.521021940438000e+03 +1313 1375 -2.019368486704435e+03 +1313 1376 -1.733190400658708e+03 +1313 1377 -1.603684467943633e+03 +1313 1396 -1.697437739078449e+03 +1313 1397 -1.571600895131404e+03 +1313 1398 -1.368148367306964e+03 +1313 1399 -1.148042053110080e+03 +1313 1400 -9.536070604341750e+02 +1313 1401 -8.023274760830675e+02 +1313 1402 -6.956816209337401e+02 +1313 1403 -6.289529049931513e+02 +1313 1404 -5.970589583440825e+02 +1314 1234 -6.052974323170196e+02 +1314 1235 -6.378158089920671e+02 +1314 1236 -7.058924559832867e+02 +1314 1237 -8.148024630667926e+02 +1314 1238 -9.695072463564434e+02 +1314 1239 -1.168677565678393e+03 +1314 1240 -1.394551574360510e+03 +1314 1241 -1.603684467943633e+03 +1314 1242 -1.733190400658708e+03 +1314 1369 -1.103972130715926e+04 +1314 1370 -9.405703259334639e+03 +1314 1371 -7.138491575686282e+03 +1314 1372 -5.136224430633882e+03 +1314 1373 -3.699147964795180e+03 +1314 1374 -2.767706810094291e+03 +1314 1375 -2.199157547087201e+03 +1314 1376 -1.877824568765017e+03 +1314 1377 -1.733190400658708e+03 +1314 1396 -1.837845240586539e+03 +1314 1397 -1.697437739078449e+03 +1314 1398 -1.471477730866027e+03 +1314 1399 -1.228588660544053e+03 +1314 1400 -1.015511306612467e+03 +1314 1401 -8.507888885505199e+02 +1314 1402 -7.352796046183681e+02 +1314 1403 -6.632839990295113e+02 +1314 1404 -6.289529049931513e+02 +1333 1234 -6.289529049931513e+02 +1333 1235 -6.632839990295113e+02 +1333 1236 -7.352796046183681e+02 +1333 1237 -8.507888885505199e+02 +1333 1238 -1.015511306612467e+03 +1333 1239 -1.228588660544053e+03 +1333 1240 -1.471477730866027e+03 +1333 1241 -1.697437739078449e+03 +1333 1242 -1.837845240586539e+03 +1333 1261 -1.733190400658708e+03 +1333 1262 -1.877824568765017e+03 +1333 1263 -2.199157547087201e+03 +1333 1264 -2.767706810094291e+03 +1333 1265 -3.699147964795180e+03 +1333 1266 -5.136224430633882e+03 +1333 1267 -7.138491575686282e+03 +1333 1268 -9.405703259334639e+03 +1333 1269 -1.103972130715926e+04 +1333 1396 -1.733190400658708e+03 +1333 1397 -1.603684467943633e+03 +1333 1398 -1.394551574360510e+03 +1333 1399 -1.168677565678393e+03 +1333 1400 -9.695072463564434e+02 +1333 1401 -8.148024630667926e+02 +1333 1402 -7.058924559832867e+02 +1333 1403 -6.378158089920671e+02 +1333 1404 -6.052974323170196e+02 +1334 1234 -5.970589583440825e+02 +1334 1235 -6.289529049931513e+02 +1334 1236 -6.956816209337401e+02 +1334 1237 -8.023274760830675e+02 +1334 1238 -9.536070604341750e+02 +1334 1239 -1.148042053110080e+03 +1334 1240 -1.368148367306964e+03 +1334 1241 -1.571600895131404e+03 +1334 1242 -1.697437739078449e+03 +1334 1261 -1.603684467943633e+03 +1334 1262 -1.733190400658708e+03 +1334 1263 -2.019368486704435e+03 +1334 1264 -2.521021940438000e+03 +1334 1265 -3.331754877699595e+03 +1334 1266 -4.560278038130823e+03 +1334 1267 -6.235592529048601e+03 +1334 1268 -8.091232579773156e+03 +1334 1269 -9.405703259334639e+03 +1334 1396 -1.877824568765017e+03 +1334 1397 -1.733190400658708e+03 +1334 1398 -1.500725861549673e+03 +1334 1399 -1.251286952144484e+03 +1334 1400 -1.032880208377977e+03 +1334 1401 -8.643348602446076e+02 +1334 1402 -7.463158073460687e+02 +1334 1403 -6.728335244699299e+02 +1334 1404 -6.378158089920671e+02 +1335 1234 -5.429674662554822e+02 +1335 1235 -5.708523475060541e+02 +1335 1236 -6.289529049931513e+02 +1335 1237 -7.211778000851799e+02 +1335 1238 -8.507888885505199e+02 +1335 1239 -1.015511306612467e+03 +1335 1240 -1.199743197084304e+03 +1335 1241 -1.368148367306964e+03 +1335 1242 -1.471477730866027e+03 +1335 1261 -1.394551574360510e+03 +1335 1262 -1.500725861549673e+03 +1335 1263 -1.733190400658708e+03 +1335 1264 -2.134265778758326e+03 +1335 1265 -2.767706810094291e+03 +1335 1266 -3.699147964795180e+03 +1335 1267 -4.925216936196723e+03 +1335 1268 -6.235592529048601e+03 +1335 1269 -7.138491575686282e+03 +1335 1396 -2.199157547087201e+03 +1335 1397 -2.019368486704435e+03 +1335 1398 -1.733190400658708e+03 +1335 1399 -1.430197816180122e+03 +1335 1400 -1.168677565678393e+03 +1335 1401 -9.695072463564434e+02 +1335 1402 -8.315436028021828e+02 +1335 1403 -7.463158073460687e+02 +1335 1404 -7.058924559832867e+02 +1336 1234 -4.803677035258846e+02 +1336 1235 -5.038180997021789e+02 +1336 1236 -5.524312223207850e+02 +1336 1237 -6.289529049931513e+02 +1336 1238 -7.352796046183681e+02 +1336 1239 -8.685786765383800e+02 +1336 1240 -1.015511306612467e+03 +1336 1241 -1.148042053110080e+03 +1336 1242 -1.228588660544053e+03 +1336 1261 -1.168677565678393e+03 +1336 1262 -1.251286952144484e+03 +1336 1263 -1.430197816180122e+03 +1336 1264 -1.733190400658708e+03 +1336 1265 -2.199157547087201e+03 +1336 1266 -2.861294172280346e+03 +1336 1267 -3.699147964795180e+03 +1336 1268 -4.560278038130823e+03 +1336 1269 -5.136224430633882e+03 +1336 1396 -2.767706810094291e+03 +1336 1397 -2.521021940438000e+03 +1336 1398 -2.134265778758326e+03 +1336 1399 -1.733190400658708e+03 +1336 1400 -1.394551574360510e+03 +1336 1401 -1.141773184361042e+03 +1336 1402 -9.695072463564434e+02 +1336 1403 -8.643348602446076e+02 +1336 1404 -8.148024630667926e+02 +1337 1234 -4.208084537187713e+02 +1337 1235 -4.402579127124382e+02 +1337 1236 -4.803677035258846e+02 +1337 1237 -5.429674662554822e+02 +1337 1238 -6.289529049931513e+02 +1337 1239 -7.352796046183681e+02 +1337 1240 -8.507888885505199e+02 +1337 1241 -9.536070604341750e+02 +1337 1242 -1.015511306612467e+03 +1337 1261 -9.695072463564434e+02 +1337 1262 -1.032880208377977e+03 +1337 1263 -1.168677565678393e+03 +1337 1264 -1.394551574360510e+03 +1337 1265 -1.733190400658708e+03 +1337 1266 -2.199157547087201e+03 +1337 1267 -2.767706810094291e+03 +1337 1268 -3.331754877699595e+03 +1337 1269 -3.699147964795180e+03 +1337 1396 -3.699147964795180e+03 +1337 1397 -3.331754877699595e+03 +1337 1398 -2.767706810094291e+03 +1337 1399 -2.199157547087201e+03 +1337 1400 -1.733190400658708e+03 +1337 1401 -1.394551574360510e+03 +1337 1402 -1.168677565678393e+03 +1337 1403 -1.032880208377977e+03 +1337 1404 -9.695072463564434e+02 +1338 1234 -3.710963518270331e+02 +1338 1235 -3.873813675510144e+02 +1338 1236 -4.208084537187713e+02 +1338 1237 -4.725808574370885e+02 +1338 1238 -5.429674662554822e+02 +1338 1239 -6.289529049931513e+02 +1338 1240 -7.211778000851799e+02 +1338 1241 -8.023274760830675e+02 +1338 1242 -8.507888885505199e+02 +1338 1261 -8.148024630667926e+02 +1338 1262 -8.643348602446076e+02 +1338 1263 -9.695072463564434e+02 +1338 1264 -1.141773184361042e+03 +1338 1265 -1.394551574360510e+03 +1338 1266 -1.733190400658708e+03 +1338 1267 -2.134265778758326e+03 +1338 1268 -2.521021940438000e+03 +1338 1269 -2.767706810094291e+03 +1338 1396 -5.136224430633882e+03 +1338 1397 -4.560278038130823e+03 +1338 1398 -3.699147964795180e+03 +1338 1399 -2.861294172280346e+03 +1338 1400 -2.199157547087201e+03 +1338 1401 -1.733190400658708e+03 +1338 1402 -1.430197816180122e+03 +1338 1403 -1.251286952144484e+03 +1338 1404 -1.168677565678393e+03 +1339 1234 -3.339204550667988e+02 +1339 1235 -3.479505460244110e+02 +1339 1236 -3.766415408901786e+02 +1339 1237 -4.208084537187713e+02 +1339 1238 -4.803677035258846e+02 +1339 1239 -5.524312223207850e+02 +1339 1240 -6.289529049931513e+02 +1339 1241 -6.956816209337401e+02 +1339 1242 -7.352796046183681e+02 +1339 1261 -7.058924559832867e+02 +1339 1262 -7.463158073460687e+02 +1339 1263 -8.315436028021828e+02 +1339 1264 -9.695072463564434e+02 +1339 1265 -1.168677565678393e+03 +1339 1266 -1.430197816180122e+03 +1339 1267 -1.733190400658708e+03 +1339 1268 -2.019368486704435e+03 +1339 1269 -2.199157547087201e+03 +1339 1396 -7.138491575686282e+03 +1339 1397 -6.235592529048601e+03 +1339 1398 -4.925216936196723e+03 +1339 1399 -3.699147964795180e+03 +1339 1400 -2.767706810094291e+03 +1339 1401 -2.134265778758326e+03 +1339 1402 -1.733190400658708e+03 +1339 1403 -1.500725861549673e+03 +1339 1404 -1.394551574360510e+03 +1340 1234 -3.096178268240465e+02 +1340 1235 -3.222285372305477e+02 +1340 1236 -3.479505460244110e+02 +1340 1237 -3.873813675510144e+02 +1340 1238 -4.402579127124382e+02 +1340 1239 -5.038180997021789e+02 +1340 1240 -5.708523475060541e+02 +1340 1241 -6.289529049931513e+02 +1340 1242 -6.632839990295113e+02 +1340 1261 -6.378158089920671e+02 +1340 1262 -6.728335244699299e+02 +1340 1263 -7.463158073460687e+02 +1340 1264 -8.643348602446076e+02 +1340 1265 -1.032880208377977e+03 +1340 1266 -1.251286952144484e+03 +1340 1267 -1.500725861549673e+03 +1340 1268 -1.733190400658708e+03 +1340 1269 -1.877824568765017e+03 +1340 1396 -9.405703259334639e+03 +1340 1397 -8.091232579773156e+03 +1340 1398 -6.235592529048601e+03 +1340 1399 -4.560278038130823e+03 +1340 1400 -3.331754877699595e+03 +1340 1401 -2.521021940438000e+03 +1340 1402 -2.019368486704435e+03 +1340 1403 -1.733190400658708e+03 +1340 1404 -1.603684467943633e+03 +1341 1234 -2.976873911031298e+02 +1341 1235 -3.096178268240465e+02 +1341 1236 -3.339204550667988e+02 +1341 1237 -3.710963518270331e+02 +1341 1238 -4.208084537187713e+02 +1341 1239 -4.803677035258846e+02 +1341 1240 -5.429674662554822e+02 +1341 1241 -5.970589583440825e+02 +1341 1242 -6.289529049931513e+02 +1341 1261 -6.052974323170196e+02 +1341 1262 -6.378158089920671e+02 +1341 1263 -7.058924559832867e+02 +1341 1264 -8.148024630667926e+02 +1341 1265 -9.695072463564434e+02 +1341 1266 -1.168677565678393e+03 +1341 1267 -1.394551574360510e+03 +1341 1268 -1.603684467943633e+03 +1341 1269 -1.733190400658708e+03 +1341 1396 -1.103972130715926e+04 +1341 1397 -9.405703259334639e+03 +1341 1398 -7.138491575686282e+03 +1341 1399 -5.136224430633882e+03 +1341 1400 -3.699147964795180e+03 +1341 1401 -2.767706810094291e+03 +1341 1402 -2.199157547087201e+03 +1341 1403 -1.877824568765017e+03 +1341 1404 -1.733190400658708e+03 +1360 1162 -1.111842160419089e+02 +1360 1163 -1.170681125153376e+02 +1360 1164 -1.293661657908652e+02 +1360 1165 -1.489885081652992e+02 +1360 1166 -1.767605489846857e+02 +1360 1167 -2.123577731150849e+02 +1360 1168 -2.525366109215767e+02 +1360 1169 -2.895745815575320e+02 +1360 1170 -3.124380547854544e+02 +1360 1225 -3.063876713483004e+02 +1360 1226 -3.311617365195747e+02 +1360 1227 -3.859179776157605e+02 +1360 1228 -4.819366867771664e+02 +1360 1229 -6.371952057562402e+02 +1360 1230 -8.726231103602357e+02 +1360 1231 -1.193932486839834e+03 +1360 1232 -1.550121445008505e+03 +1360 1233 -1.802596433195456e+03 +1360 1504 -3.063876713483004e+02 +1360 1505 -2.841326260213855e+02 +1360 1506 -2.480403651673271e+02 +1360 1507 -2.088271183655457e+02 +1360 1508 -1.740274317161707e+02 +1360 1509 -1.468355065336023e+02 +1360 1510 -1.275984131219179e+02 +1360 1511 -1.155304899028561e+02 +1360 1512 -1.097534196790493e+02 +1361 1162 -1.057061586526018e+02 +1361 1163 -1.111842160419089e+02 +1361 1164 -1.226088998409724e+02 +1361 1165 -1.407716848553628e+02 +1361 1166 -1.663510232448633e+02 +1361 1167 -1.989422168423268e+02 +1361 1168 -2.354925657825773e+02 +1361 1169 -2.689865983609317e+02 +1361 1170 -2.895745815575320e+02 +1361 1225 -2.841326260213855e+02 +1361 1226 -3.063876713483004e+02 +1361 1227 -3.553280674768354e+02 +1361 1228 -4.404031329187411e+02 +1361 1229 -5.762343277298867e+02 +1361 1230 -7.788097592344268e+02 +1361 1231 -1.049909849375148e+03 +1361 1232 -1.344510568096302e+03 +1361 1233 -1.550121445008505e+03 +1361 1504 -3.311617365195747e+02 +1361 1505 -3.063876713483004e+02 +1361 1506 -2.663884709281895e+02 +1361 1507 -2.231981844606894e+02 +1361 1508 -1.851243485745373e+02 +1361 1509 -1.555580782497810e+02 +1361 1510 -1.347481526436478e+02 +1361 1511 -1.217424124188383e+02 +1361 1512 -1.155304899028561e+02 +1362 1162 -9.638822517401589e+01 +1362 1163 -1.011961191083175e+02 +1362 1164 -1.111842160419089e+02 +1362 1165 -1.269615920628681e+02 +1362 1166 -1.489885081652992e+02 +1362 1167 -1.767605489846857e+02 +1362 1168 -2.075588680195229e+02 +1362 1169 -2.354925657825773e+02 +1362 1170 -2.525366109215767e+02 +1362 1225 -2.480403651673271e+02 +1362 1226 -2.663884709281895e+02 +1362 1227 -3.063876713483004e+02 +1362 1228 -3.748904053829385e+02 +1362 1229 -4.819366867771664e+02 +1362 1230 -6.371952057562402e+02 +1362 1231 -8.383319685358435e+02 +1362 1232 -1.049909849375148e+03 +1362 1233 -1.193932486839834e+03 +1362 1504 -3.859179776157605e+02 +1362 1505 -3.553280674768354e+02 +1362 1506 -3.063876713483004e+02 +1362 1507 -2.542062119667738e+02 +1362 1508 -2.088271183655457e+02 +1362 1509 -1.740274317161707e+02 +1362 1510 -1.497853840269160e+02 +1362 1511 -1.347481526436478e+02 +1362 1512 -1.275984131219179e+02 +1363 1162 -8.555928471614156e+01 +1363 1163 -8.962181586287889e+01 +1363 1164 -9.802102195827720e+01 +1363 1165 -1.111842160419089e+02 +1363 1166 -1.293661657908652e+02 +1363 1167 -1.519993633210930e+02 +1363 1168 -1.767605489846857e+02 +1363 1169 -1.989422168423268e+02 +1363 1170 -2.123577731150849e+02 +1363 1225 -2.088271183655457e+02 +1363 1226 -2.231981844606894e+02 +1363 1227 -2.542062119667738e+02 +1363 1228 -3.063876713483004e+02 +1363 1229 -3.859179776157605e+02 +1363 1230 -4.976453857371607e+02 +1363 1231 -6.371952057562402e+02 +1363 1232 -7.788097592344268e+02 +1363 1233 -8.726231103602357e+02 +1363 1504 -4.819366867771664e+02 +1363 1505 -4.404031329187411e+02 +1363 1506 -3.748904053829385e+02 +1363 1507 -3.063876713483004e+02 +1363 1508 -2.480403651673271e+02 +1363 1509 -2.041390437321793e+02 +1363 1510 -1.740274317161707e+02 +1363 1511 -1.555580782497810e+02 +1363 1512 -1.468355065336023e+02 +1364 1162 -7.520762033775921e+01 +1364 1163 -7.859349409841370e+01 +1364 1164 -8.555928471614156e+01 +1364 1165 -9.638822517401589e+01 +1364 1166 -1.111842160419089e+02 +1364 1167 -1.293661657908652e+02 +1364 1168 -1.489885081652992e+02 +1364 1169 -1.663510232448633e+02 +1364 1170 -1.767605489846857e+02 +1364 1225 -1.740274317161707e+02 +1364 1226 -1.851243485745373e+02 +1364 1227 -2.088271183655457e+02 +1364 1228 -2.480403651673271e+02 +1364 1229 -3.063876713483004e+02 +1364 1230 -3.859179776157605e+02 +1364 1231 -4.819366867771664e+02 +1364 1232 -5.762343277298867e+02 +1364 1233 -6.371952057562402e+02 +1364 1504 -6.371952057562402e+02 +1364 1505 -5.762343277298867e+02 +1364 1506 -4.819366867771664e+02 +1364 1507 -3.859179776157605e+02 +1364 1508 -3.063876713483004e+02 +1364 1509 -2.480403651673271e+02 +1364 1510 -2.088271183655457e+02 +1364 1511 -1.851243485745373e+02 +1364 1512 -1.740274317161707e+02 +1365 1162 -6.652797451218323e+01 +1365 1163 -6.937545782864687e+01 +1365 1164 -7.520762033775921e+01 +1365 1165 -8.420868002944904e+01 +1365 1166 -9.638822517401589e+01 +1365 1167 -1.111842160419089e+02 +1365 1168 -1.269615920628681e+02 +1365 1169 -1.407716848553628e+02 +1365 1170 -1.489885081652992e+02 +1365 1225 -1.468355065336023e+02 +1365 1226 -1.555580782497810e+02 +1365 1227 -1.740274317161707e+02 +1365 1228 -2.041390437321793e+02 +1365 1229 -2.480403651673271e+02 +1365 1230 -3.063876713483004e+02 +1365 1231 -3.748904053829385e+02 +1365 1232 -4.404031329187411e+02 +1365 1233 -4.819366867771664e+02 +1365 1504 -8.726231103602357e+02 +1365 1505 -7.788097592344268e+02 +1365 1506 -6.371952057562402e+02 +1365 1507 -4.976453857371607e+02 +1365 1508 -3.859179776157605e+02 +1365 1509 -3.063876713483004e+02 +1365 1510 -2.542062119667738e+02 +1365 1511 -2.231981844606894e+02 +1365 1512 -2.088271183655457e+02 +1366 1162 -6.001174723167335e+01 +1366 1163 -6.247361649834824e+01 +1366 1164 -6.749803222962952e+01 +1366 1165 -7.520762033775921e+01 +1366 1166 -8.555928471614156e+01 +1366 1167 -9.802102195827720e+01 +1366 1168 -1.111842160419089e+02 +1366 1169 -1.226088998409724e+02 +1366 1170 -1.293661657908652e+02 +1366 1225 -1.275984131219179e+02 +1366 1226 -1.347481526436478e+02 +1366 1227 -1.497853840269160e+02 +1366 1228 -1.740274317161707e+02 +1366 1229 -2.088271183655457e+02 +1366 1230 -2.542062119667738e+02 +1366 1231 -3.063876713483004e+02 +1366 1232 -3.553280674768354e+02 +1366 1233 -3.859179776157605e+02 +1366 1504 -1.193932486839834e+03 +1366 1505 -1.049909849375148e+03 +1366 1506 -8.383319685358435e+02 +1366 1507 -6.371952057562402e+02 +1366 1508 -4.819366867771664e+02 +1366 1509 -3.748904053829385e+02 +1366 1510 -3.063876713483004e+02 +1366 1511 -2.663884709281895e+02 +1366 1512 -2.480403651673271e+02 +1367 1162 -5.573941364116940e+01 +1367 1163 -5.795761808209202e+01 +1367 1164 -6.247361649834824e+01 +1367 1165 -6.937545782864687e+01 +1367 1166 -7.859349409841370e+01 +1367 1167 -8.962181586287889e+01 +1367 1168 -1.011961191083175e+02 +1367 1169 -1.111842160419089e+02 +1367 1170 -1.170681125153376e+02 +1367 1225 -1.155304899028561e+02 +1367 1226 -1.217424124188383e+02 +1367 1227 -1.347481526436478e+02 +1367 1228 -1.555580782497810e+02 +1367 1229 -1.851243485745373e+02 +1367 1230 -2.231981844606894e+02 +1367 1231 -2.663884709281895e+02 +1367 1232 -3.063876713483004e+02 +1367 1233 -3.311617365195747e+02 +1367 1504 -1.550121445008505e+03 +1367 1505 -1.344510568096302e+03 +1367 1506 -1.049909849375148e+03 +1367 1507 -7.788097592344268e+02 +1367 1508 -5.762343277298867e+02 +1367 1509 -4.404031329187411e+02 +1367 1510 -3.553280674768354e+02 +1367 1511 -3.063876713483004e+02 +1367 1512 -2.841326260213855e+02 +1368 1162 -5.363826960242956e+01 +1368 1163 -5.573941364116940e+01 +1368 1164 -6.001174723167335e+01 +1368 1165 -6.652797451218323e+01 +1368 1166 -7.520762033775921e+01 +1368 1167 -8.555928471614156e+01 +1368 1168 -9.638822517401589e+01 +1368 1169 -1.057061586526018e+02 +1368 1170 -1.111842160419089e+02 +1368 1225 -1.097534196790493e+02 +1368 1226 -1.155304899028561e+02 +1368 1227 -1.275984131219179e+02 +1368 1228 -1.468355065336023e+02 +1368 1229 -1.740274317161707e+02 +1368 1230 -2.088271183655457e+02 +1368 1231 -2.480403651673271e+02 +1368 1232 -2.841326260213855e+02 +1368 1233 -3.063876713483004e+02 +1368 1504 -1.802596433195456e+03 +1368 1505 -1.550121445008505e+03 +1368 1506 -1.193932486839834e+03 +1368 1507 -8.726231103602357e+02 +1368 1508 -6.371952057562402e+02 +1368 1509 -4.819366867771664e+02 +1368 1510 -3.859179776157605e+02 +1368 1511 -3.311617365195747e+02 +1368 1512 -3.063876713483004e+02 +1369 1306 -1.733190400658708e+03 +1369 1307 -1.877824568765017e+03 +1369 1308 -2.199157547087201e+03 +1369 1309 -2.767706810094291e+03 +1369 1310 -3.699147964795180e+03 +1369 1311 -5.136224430633882e+03 +1369 1312 -7.138491575686282e+03 +1369 1313 -9.405703259334639e+03 +1369 1314 -1.103972130715926e+04 +1369 1450 -1.733190400658708e+03 +1369 1451 -1.603684467943633e+03 +1369 1452 -1.394551574360510e+03 +1369 1453 -1.168677565678393e+03 +1369 1454 -9.695072463564434e+02 +1369 1455 -8.148024630667926e+02 +1369 1456 -7.058924559832867e+02 +1369 1457 -6.378158089920671e+02 +1369 1458 -6.052974323170196e+02 +1369 1477 -6.289529049931513e+02 +1369 1478 -5.970589583440825e+02 +1369 1479 -5.429674662554822e+02 +1369 1480 -4.803677035258846e+02 +1369 1481 -4.208084537187713e+02 +1369 1482 -3.710963518270331e+02 +1369 1483 -3.339204550667988e+02 +1369 1484 -3.096178268240465e+02 +1369 1485 -2.976873911031298e+02 +1370 1306 -1.603684467943633e+03 +1370 1307 -1.733190400658708e+03 +1370 1308 -2.019368486704435e+03 +1370 1309 -2.521021940438000e+03 +1370 1310 -3.331754877699595e+03 +1370 1311 -4.560278038130823e+03 +1370 1312 -6.235592529048601e+03 +1370 1313 -8.091232579773156e+03 +1370 1314 -9.405703259334639e+03 +1370 1450 -1.877824568765017e+03 +1370 1451 -1.733190400658708e+03 +1370 1452 -1.500725861549673e+03 +1370 1453 -1.251286952144484e+03 +1370 1454 -1.032880208377977e+03 +1370 1455 -8.643348602446076e+02 +1370 1456 -7.463158073460687e+02 +1370 1457 -6.728335244699299e+02 +1370 1458 -6.378158089920671e+02 +1370 1477 -6.632839990295113e+02 +1370 1478 -6.289529049931513e+02 +1370 1479 -5.708523475060541e+02 +1370 1480 -5.038180997021789e+02 +1370 1481 -4.402579127124382e+02 +1370 1482 -3.873813675510144e+02 +1370 1483 -3.479505460244110e+02 +1370 1484 -3.222285372305477e+02 +1370 1485 -3.096178268240465e+02 +1371 1306 -1.394551574360510e+03 +1371 1307 -1.500725861549673e+03 +1371 1308 -1.733190400658708e+03 +1371 1309 -2.134265778758326e+03 +1371 1310 -2.767706810094291e+03 +1371 1311 -3.699147964795180e+03 +1371 1312 -4.925216936196723e+03 +1371 1313 -6.235592529048601e+03 +1371 1314 -7.138491575686282e+03 +1371 1450 -2.199157547087201e+03 +1371 1451 -2.019368486704435e+03 +1371 1452 -1.733190400658708e+03 +1371 1453 -1.430197816180122e+03 +1371 1454 -1.168677565678393e+03 +1371 1455 -9.695072463564434e+02 +1371 1456 -8.315436028021828e+02 +1371 1457 -7.463158073460687e+02 +1371 1458 -7.058924559832867e+02 +1371 1477 -7.352796046183681e+02 +1371 1478 -6.956816209337401e+02 +1371 1479 -6.289529049931513e+02 +1371 1480 -5.524312223207850e+02 +1371 1481 -4.803677035258846e+02 +1371 1482 -4.208084537187713e+02 +1371 1483 -3.766415408901786e+02 +1371 1484 -3.479505460244110e+02 +1371 1485 -3.339204550667988e+02 +1372 1306 -1.168677565678393e+03 +1372 1307 -1.251286952144484e+03 +1372 1308 -1.430197816180122e+03 +1372 1309 -1.733190400658708e+03 +1372 1310 -2.199157547087201e+03 +1372 1311 -2.861294172280346e+03 +1372 1312 -3.699147964795180e+03 +1372 1313 -4.560278038130823e+03 +1372 1314 -5.136224430633882e+03 +1372 1450 -2.767706810094291e+03 +1372 1451 -2.521021940438000e+03 +1372 1452 -2.134265778758326e+03 +1372 1453 -1.733190400658708e+03 +1372 1454 -1.394551574360510e+03 +1372 1455 -1.141773184361042e+03 +1372 1456 -9.695072463564434e+02 +1372 1457 -8.643348602446076e+02 +1372 1458 -8.148024630667926e+02 +1372 1477 -8.507888885505199e+02 +1372 1478 -8.023274760830675e+02 +1372 1479 -7.211778000851799e+02 +1372 1480 -6.289529049931513e+02 +1372 1481 -5.429674662554822e+02 +1372 1482 -4.725808574370885e+02 +1372 1483 -4.208084537187713e+02 +1372 1484 -3.873813675510144e+02 +1372 1485 -3.710963518270331e+02 +1373 1306 -9.695072463564434e+02 +1373 1307 -1.032880208377977e+03 +1373 1308 -1.168677565678393e+03 +1373 1309 -1.394551574360510e+03 +1373 1310 -1.733190400658708e+03 +1373 1311 -2.199157547087201e+03 +1373 1312 -2.767706810094291e+03 +1373 1313 -3.331754877699595e+03 +1373 1314 -3.699147964795180e+03 +1373 1450 -3.699147964795180e+03 +1373 1451 -3.331754877699595e+03 +1373 1452 -2.767706810094291e+03 +1373 1453 -2.199157547087201e+03 +1373 1454 -1.733190400658708e+03 +1373 1455 -1.394551574360510e+03 +1373 1456 -1.168677565678393e+03 +1373 1457 -1.032880208377977e+03 +1373 1458 -9.695072463564434e+02 +1373 1477 -1.015511306612467e+03 +1373 1478 -9.536070604341750e+02 +1373 1479 -8.507888885505199e+02 +1373 1480 -7.352796046183681e+02 +1373 1481 -6.289529049931513e+02 +1373 1482 -5.429674662554822e+02 +1373 1483 -4.803677035258846e+02 +1373 1484 -4.402579127124382e+02 +1373 1485 -4.208084537187713e+02 +1374 1306 -8.148024630667926e+02 +1374 1307 -8.643348602446076e+02 +1374 1308 -9.695072463564434e+02 +1374 1309 -1.141773184361042e+03 +1374 1310 -1.394551574360510e+03 +1374 1311 -1.733190400658708e+03 +1374 1312 -2.134265778758326e+03 +1374 1313 -2.521021940438000e+03 +1374 1314 -2.767706810094291e+03 +1374 1450 -5.136224430633882e+03 +1374 1451 -4.560278038130823e+03 +1374 1452 -3.699147964795180e+03 +1374 1453 -2.861294172280346e+03 +1374 1454 -2.199157547087201e+03 +1374 1455 -1.733190400658708e+03 +1374 1456 -1.430197816180122e+03 +1374 1457 -1.251286952144484e+03 +1374 1458 -1.168677565678393e+03 +1374 1477 -1.228588660544053e+03 +1374 1478 -1.148042053110080e+03 +1374 1479 -1.015511306612467e+03 +1374 1480 -8.685786765383800e+02 +1374 1481 -7.352796046183681e+02 +1374 1482 -6.289529049931513e+02 +1374 1483 -5.524312223207850e+02 +1374 1484 -5.038180997021789e+02 +1374 1485 -4.803677035258846e+02 +1375 1306 -7.058924559832867e+02 +1375 1307 -7.463158073460687e+02 +1375 1308 -8.315436028021828e+02 +1375 1309 -9.695072463564434e+02 +1375 1310 -1.168677565678393e+03 +1375 1311 -1.430197816180122e+03 +1375 1312 -1.733190400658708e+03 +1375 1313 -2.019368486704435e+03 +1375 1314 -2.199157547087201e+03 +1375 1450 -7.138491575686282e+03 +1375 1451 -6.235592529048601e+03 +1375 1452 -4.925216936196723e+03 +1375 1453 -3.699147964795180e+03 +1375 1454 -2.767706810094291e+03 +1375 1455 -2.134265778758326e+03 +1375 1456 -1.733190400658708e+03 +1375 1457 -1.500725861549673e+03 +1375 1458 -1.394551574360510e+03 +1375 1477 -1.471477730866027e+03 +1375 1478 -1.368148367306964e+03 +1375 1479 -1.199743197084304e+03 +1375 1480 -1.015511306612467e+03 +1375 1481 -8.507888885505199e+02 +1375 1482 -7.211778000851799e+02 +1375 1483 -6.289529049931513e+02 +1375 1484 -5.708523475060541e+02 +1375 1485 -5.429674662554822e+02 +1376 1306 -6.378158089920671e+02 +1376 1307 -6.728335244699299e+02 +1376 1308 -7.463158073460687e+02 +1376 1309 -8.643348602446076e+02 +1376 1310 -1.032880208377977e+03 +1376 1311 -1.251286952144484e+03 +1376 1312 -1.500725861549673e+03 +1376 1313 -1.733190400658708e+03 +1376 1314 -1.877824568765017e+03 +1376 1450 -9.405703259334639e+03 +1376 1451 -8.091232579773156e+03 +1376 1452 -6.235592529048601e+03 +1376 1453 -4.560278038130823e+03 +1376 1454 -3.331754877699595e+03 +1376 1455 -2.521021940438000e+03 +1376 1456 -2.019368486704435e+03 +1376 1457 -1.733190400658708e+03 +1376 1458 -1.603684467943633e+03 +1376 1477 -1.697437739078449e+03 +1376 1478 -1.571600895131404e+03 +1376 1479 -1.368148367306964e+03 +1376 1480 -1.148042053110080e+03 +1376 1481 -9.536070604341750e+02 +1376 1482 -8.023274760830675e+02 +1376 1483 -6.956816209337401e+02 +1376 1484 -6.289529049931513e+02 +1376 1485 -5.970589583440825e+02 +1377 1306 -6.052974323170196e+02 +1377 1307 -6.378158089920671e+02 +1377 1308 -7.058924559832867e+02 +1377 1309 -8.148024630667926e+02 +1377 1310 -9.695072463564434e+02 +1377 1311 -1.168677565678393e+03 +1377 1312 -1.394551574360510e+03 +1377 1313 -1.603684467943633e+03 +1377 1314 -1.733190400658708e+03 +1377 1450 -1.103972130715926e+04 +1377 1451 -9.405703259334639e+03 +1377 1452 -7.138491575686282e+03 +1377 1453 -5.136224430633882e+03 +1377 1454 -3.699147964795180e+03 +1377 1455 -2.767706810094291e+03 +1377 1456 -2.199157547087201e+03 +1377 1457 -1.877824568765017e+03 +1377 1458 -1.733190400658708e+03 +1377 1477 -1.837845240586539e+03 +1377 1478 -1.697437739078449e+03 +1377 1479 -1.471477730866027e+03 +1377 1480 -1.228588660544053e+03 +1377 1481 -1.015511306612467e+03 +1377 1482 -8.507888885505199e+02 +1377 1483 -7.352796046183681e+02 +1377 1484 -6.632839990295113e+02 +1377 1485 -6.289529049931513e+02 +1396 1306 -6.289529049931513e+02 +1396 1307 -6.632839990295113e+02 +1396 1308 -7.352796046183681e+02 +1396 1309 -8.507888885505199e+02 +1396 1310 -1.015511306612467e+03 +1396 1311 -1.228588660544053e+03 +1396 1312 -1.471477730866027e+03 +1396 1313 -1.697437739078449e+03 +1396 1314 -1.837845240586539e+03 +1396 1333 -1.733190400658708e+03 +1396 1334 -1.877824568765017e+03 +1396 1335 -2.199157547087201e+03 +1396 1336 -2.767706810094291e+03 +1396 1337 -3.699147964795180e+03 +1396 1338 -5.136224430633882e+03 +1396 1339 -7.138491575686282e+03 +1396 1340 -9.405703259334639e+03 +1396 1341 -1.103972130715926e+04 +1396 1477 -1.733190400658708e+03 +1396 1478 -1.603684467943633e+03 +1396 1479 -1.394551574360510e+03 +1396 1480 -1.168677565678393e+03 +1396 1481 -9.695072463564434e+02 +1396 1482 -8.148024630667926e+02 +1396 1483 -7.058924559832867e+02 +1396 1484 -6.378158089920671e+02 +1396 1485 -6.052974323170196e+02 +1397 1306 -5.970589583440825e+02 +1397 1307 -6.289529049931513e+02 +1397 1308 -6.956816209337401e+02 +1397 1309 -8.023274760830675e+02 +1397 1310 -9.536070604341750e+02 +1397 1311 -1.148042053110080e+03 +1397 1312 -1.368148367306964e+03 +1397 1313 -1.571600895131404e+03 +1397 1314 -1.697437739078449e+03 +1397 1333 -1.603684467943633e+03 +1397 1334 -1.733190400658708e+03 +1397 1335 -2.019368486704435e+03 +1397 1336 -2.521021940438000e+03 +1397 1337 -3.331754877699595e+03 +1397 1338 -4.560278038130823e+03 +1397 1339 -6.235592529048601e+03 +1397 1340 -8.091232579773156e+03 +1397 1341 -9.405703259334639e+03 +1397 1477 -1.877824568765017e+03 +1397 1478 -1.733190400658708e+03 +1397 1479 -1.500725861549673e+03 +1397 1480 -1.251286952144484e+03 +1397 1481 -1.032880208377977e+03 +1397 1482 -8.643348602446076e+02 +1397 1483 -7.463158073460687e+02 +1397 1484 -6.728335244699299e+02 +1397 1485 -6.378158089920671e+02 +1398 1306 -5.429674662554822e+02 +1398 1307 -5.708523475060541e+02 +1398 1308 -6.289529049931513e+02 +1398 1309 -7.211778000851799e+02 +1398 1310 -8.507888885505199e+02 +1398 1311 -1.015511306612467e+03 +1398 1312 -1.199743197084304e+03 +1398 1313 -1.368148367306964e+03 +1398 1314 -1.471477730866027e+03 +1398 1333 -1.394551574360510e+03 +1398 1334 -1.500725861549673e+03 +1398 1335 -1.733190400658708e+03 +1398 1336 -2.134265778758326e+03 +1398 1337 -2.767706810094291e+03 +1398 1338 -3.699147964795180e+03 +1398 1339 -4.925216936196723e+03 +1398 1340 -6.235592529048601e+03 +1398 1341 -7.138491575686282e+03 +1398 1477 -2.199157547087201e+03 +1398 1478 -2.019368486704435e+03 +1398 1479 -1.733190400658708e+03 +1398 1480 -1.430197816180122e+03 +1398 1481 -1.168677565678393e+03 +1398 1482 -9.695072463564434e+02 +1398 1483 -8.315436028021828e+02 +1398 1484 -7.463158073460687e+02 +1398 1485 -7.058924559832867e+02 +1399 1306 -4.803677035258846e+02 +1399 1307 -5.038180997021789e+02 +1399 1308 -5.524312223207850e+02 +1399 1309 -6.289529049931513e+02 +1399 1310 -7.352796046183681e+02 +1399 1311 -8.685786765383800e+02 +1399 1312 -1.015511306612467e+03 +1399 1313 -1.148042053110080e+03 +1399 1314 -1.228588660544053e+03 +1399 1333 -1.168677565678393e+03 +1399 1334 -1.251286952144484e+03 +1399 1335 -1.430197816180122e+03 +1399 1336 -1.733190400658708e+03 +1399 1337 -2.199157547087201e+03 +1399 1338 -2.861294172280346e+03 +1399 1339 -3.699147964795180e+03 +1399 1340 -4.560278038130823e+03 +1399 1341 -5.136224430633882e+03 +1399 1477 -2.767706810094291e+03 +1399 1478 -2.521021940438000e+03 +1399 1479 -2.134265778758326e+03 +1399 1480 -1.733190400658708e+03 +1399 1481 -1.394551574360510e+03 +1399 1482 -1.141773184361042e+03 +1399 1483 -9.695072463564434e+02 +1399 1484 -8.643348602446076e+02 +1399 1485 -8.148024630667926e+02 +1400 1306 -4.208084537187713e+02 +1400 1307 -4.402579127124382e+02 +1400 1308 -4.803677035258846e+02 +1400 1309 -5.429674662554822e+02 +1400 1310 -6.289529049931513e+02 +1400 1311 -7.352796046183681e+02 +1400 1312 -8.507888885505199e+02 +1400 1313 -9.536070604341750e+02 +1400 1314 -1.015511306612467e+03 +1400 1333 -9.695072463564434e+02 +1400 1334 -1.032880208377977e+03 +1400 1335 -1.168677565678393e+03 +1400 1336 -1.394551574360510e+03 +1400 1337 -1.733190400658708e+03 +1400 1338 -2.199157547087201e+03 +1400 1339 -2.767706810094291e+03 +1400 1340 -3.331754877699595e+03 +1400 1341 -3.699147964795180e+03 +1400 1477 -3.699147964795180e+03 +1400 1478 -3.331754877699595e+03 +1400 1479 -2.767706810094291e+03 +1400 1480 -2.199157547087201e+03 +1400 1481 -1.733190400658708e+03 +1400 1482 -1.394551574360510e+03 +1400 1483 -1.168677565678393e+03 +1400 1484 -1.032880208377977e+03 +1400 1485 -9.695072463564434e+02 +1401 1306 -3.710963518270331e+02 +1401 1307 -3.873813675510144e+02 +1401 1308 -4.208084537187713e+02 +1401 1309 -4.725808574370885e+02 +1401 1310 -5.429674662554822e+02 +1401 1311 -6.289529049931513e+02 +1401 1312 -7.211778000851799e+02 +1401 1313 -8.023274760830675e+02 +1401 1314 -8.507888885505199e+02 +1401 1333 -8.148024630667926e+02 +1401 1334 -8.643348602446076e+02 +1401 1335 -9.695072463564434e+02 +1401 1336 -1.141773184361042e+03 +1401 1337 -1.394551574360510e+03 +1401 1338 -1.733190400658708e+03 +1401 1339 -2.134265778758326e+03 +1401 1340 -2.521021940438000e+03 +1401 1341 -2.767706810094291e+03 +1401 1477 -5.136224430633882e+03 +1401 1478 -4.560278038130823e+03 +1401 1479 -3.699147964795180e+03 +1401 1480 -2.861294172280346e+03 +1401 1481 -2.199157547087201e+03 +1401 1482 -1.733190400658708e+03 +1401 1483 -1.430197816180122e+03 +1401 1484 -1.251286952144484e+03 +1401 1485 -1.168677565678393e+03 +1402 1306 -3.339204550667988e+02 +1402 1307 -3.479505460244110e+02 +1402 1308 -3.766415408901786e+02 +1402 1309 -4.208084537187713e+02 +1402 1310 -4.803677035258846e+02 +1402 1311 -5.524312223207850e+02 +1402 1312 -6.289529049931513e+02 +1402 1313 -6.956816209337401e+02 +1402 1314 -7.352796046183681e+02 +1402 1333 -7.058924559832867e+02 +1402 1334 -7.463158073460687e+02 +1402 1335 -8.315436028021828e+02 +1402 1336 -9.695072463564434e+02 +1402 1337 -1.168677565678393e+03 +1402 1338 -1.430197816180122e+03 +1402 1339 -1.733190400658708e+03 +1402 1340 -2.019368486704435e+03 +1402 1341 -2.199157547087201e+03 +1402 1477 -7.138491575686282e+03 +1402 1478 -6.235592529048601e+03 +1402 1479 -4.925216936196723e+03 +1402 1480 -3.699147964795180e+03 +1402 1481 -2.767706810094291e+03 +1402 1482 -2.134265778758326e+03 +1402 1483 -1.733190400658708e+03 +1402 1484 -1.500725861549673e+03 +1402 1485 -1.394551574360510e+03 +1403 1306 -3.096178268240465e+02 +1403 1307 -3.222285372305477e+02 +1403 1308 -3.479505460244110e+02 +1403 1309 -3.873813675510144e+02 +1403 1310 -4.402579127124382e+02 +1403 1311 -5.038180997021789e+02 +1403 1312 -5.708523475060541e+02 +1403 1313 -6.289529049931513e+02 +1403 1314 -6.632839990295113e+02 +1403 1333 -6.378158089920671e+02 +1403 1334 -6.728335244699299e+02 +1403 1335 -7.463158073460687e+02 +1403 1336 -8.643348602446076e+02 +1403 1337 -1.032880208377977e+03 +1403 1338 -1.251286952144484e+03 +1403 1339 -1.500725861549673e+03 +1403 1340 -1.733190400658708e+03 +1403 1341 -1.877824568765017e+03 +1403 1477 -9.405703259334639e+03 +1403 1478 -8.091232579773156e+03 +1403 1479 -6.235592529048601e+03 +1403 1480 -4.560278038130823e+03 +1403 1481 -3.331754877699595e+03 +1403 1482 -2.521021940438000e+03 +1403 1483 -2.019368486704435e+03 +1403 1484 -1.733190400658708e+03 +1403 1485 -1.603684467943633e+03 +1404 1306 -2.976873911031298e+02 +1404 1307 -3.096178268240465e+02 +1404 1308 -3.339204550667988e+02 +1404 1309 -3.710963518270331e+02 +1404 1310 -4.208084537187713e+02 +1404 1311 -4.803677035258846e+02 +1404 1312 -5.429674662554822e+02 +1404 1313 -5.970589583440825e+02 +1404 1314 -6.289529049931513e+02 +1404 1333 -6.052974323170196e+02 +1404 1334 -6.378158089920671e+02 +1404 1335 -7.058924559832867e+02 +1404 1336 -8.148024630667926e+02 +1404 1337 -9.695072463564434e+02 +1404 1338 -1.168677565678393e+03 +1404 1339 -1.394551574360510e+03 +1404 1340 -1.603684467943633e+03 +1404 1341 -1.733190400658708e+03 +1404 1477 -1.103972130715926e+04 +1404 1478 -9.405703259334639e+03 +1404 1479 -7.138491575686282e+03 +1404 1480 -5.136224430633882e+03 +1404 1481 -3.699147964795180e+03 +1404 1482 -2.767706810094291e+03 +1404 1483 -2.199157547087201e+03 +1404 1484 -1.877824568765017e+03 +1404 1485 -1.733190400658708e+03 +1423 577 -3.474506751309654e+00 +1423 578 -3.654050001394687e+00 +1423 579 -4.028382153902574e+00 +1423 580 -4.623196535591006e+00 +1423 581 -5.460334268221786e+00 +1423 582 -6.526086991349065e+00 +1423 583 -7.720270179432527e+00 +1423 584 -8.813722702286100e+00 +1423 585 -9.485456953123382e+00 +1423 856 -9.574614729634387e+00 +1423 857 -1.033025206259608e+01 +1423 858 -1.199392684783545e+01 +1423 859 -1.489187979900571e+01 +1423 860 -1.953249673072867e+01 +1423 861 -2.648026715992624e+01 +1423 862 -3.582072268161383e+01 +1423 863 -4.601776203532707e+01 +1423 864 -5.316004558269722e+01 +1423 1990 -9.574614729634387e+00 +1423 1991 -8.894152732809214e+00 +1423 1992 -7.787064219095081e+00 +1423 1993 -6.578858018778778e+00 +1423 1994 -5.501432160761325e+00 +1423 1995 -4.655741575368517e+00 +1423 1996 -4.055212971361419e+00 +1423 1997 -3.677452266447854e+00 +1423 1998 -3.496313214985748e+00 +1424 577 -3.307075579356515e+00 +1424 578 -3.474506751309652e+00 +1424 579 -3.822855655704618e+00 +1424 580 -4.374472772345655e+00 +1424 581 -5.147173192788435e+00 +1424 582 -6.125338181409235e+00 +1424 583 -7.214758870193814e+00 +1424 584 -8.206746303750590e+00 +1424 585 -8.813722702286093e+00 +1424 856 -8.894152732809214e+00 +1424 857 -9.574614729634382e+00 +1424 858 -1.106556701616914e+01 +1424 859 -1.364121235299753e+01 +1424 860 -1.771654764348813e+01 +1424 861 -2.372339702886327e+01 +1424 862 -3.165228467591596e+01 +1424 863 -4.014998583800268e+01 +1424 864 -4.601776203532702e+01 +1424 1990 -1.033025206259609e+01 +1424 1991 -9.574614729634387e+00 +1424 1992 -8.350436340807201e+00 +1424 1993 -7.022334130042162e+00 +1424 1994 -5.845568772761844e+00 +1424 1995 -4.927408805516037e+00 +1424 1996 -4.278637194083236e+00 +1424 1997 -3.872006983680974e+00 +1424 1998 -3.677452266447854e+00 +1425 577 -3.021655125742912e+00 +1425 578 -3.169027908859174e+00 +1425 579 -3.474506751309655e+00 +1425 580 -3.955287673172522e+00 +1425 581 -4.623196535591008e+00 +1425 582 -5.460334268221787e+00 +1425 583 -6.382855547803864e+00 +1425 584 -7.214758870193821e+00 +1425 585 -7.720270179432532e+00 +1425 856 -7.787064219095081e+00 +1425 857 -8.350436340807200e+00 +1425 858 -9.574614729634391e+00 +1425 859 -1.165955788548229e+01 +1425 860 -1.489187979900572e+01 +1425 861 -1.953249673072868e+01 +1425 862 -2.547425580969112e+01 +1425 863 -3.165228467591601e+01 +1425 864 -3.582072268161387e+01 +1425 1990 -1.199392684783545e+01 +1425 1991 -1.106556701616914e+01 +1425 1992 -9.574614729634387e+00 +1425 1993 -7.976517934049889e+00 +1425 1994 -6.578858018778778e+00 +1425 1995 -5.501432160761325e+00 +1425 1996 -4.747658828821052e+00 +1425 1997 -4.278637194083233e+00 +1425 1998 -4.055212971361416e+00 +1426 577 -2.688901476974079e+00 +1426 578 -2.813872708878961e+00 +1426 579 -3.071728502881821e+00 +1426 580 -3.474506751309652e+00 +1426 581 -4.028382153902572e+00 +1426 582 -4.714211996655914e+00 +1426 583 -5.460334268221782e+00 +1426 584 -6.125338181409235e+00 +1426 585 -6.526086991349062e+00 +1426 856 -6.578858018778778e+00 +1426 857 -7.022334130042159e+00 +1426 858 -7.976517934049893e+00 +1426 859 -9.574614729634382e+00 +1426 860 -1.199392684783545e+01 +1426 861 -1.536382589350012e+01 +1426 862 -1.953249673072865e+01 +1426 863 -2.372339702886327e+01 +1426 864 -2.648026715992622e+01 +1426 1990 -1.489187979900572e+01 +1426 1991 -1.364121235299754e+01 +1426 1992 -1.165955788548230e+01 +1426 1993 -9.574614729634387e+00 +1426 1994 -7.787064219095081e+00 +1426 1995 -6.434009698761969e+00 +1426 1996 -5.501432160761331e+00 +1426 1997 -4.927408805516037e+00 +1426 1998 -4.655741575368517e+00 +1427 577 -2.369680831172465e+00 +1427 578 -2.474220532866515e+00 +1427 579 -2.688901476974080e+00 +1427 580 -3.021655125742911e+00 +1427 581 -3.474506751309654e+00 +1427 582 -4.028382153902574e+00 +1427 583 -4.623196535591006e+00 +1427 584 -5.147173192788438e+00 +1427 585 -5.460334268221786e+00 +1427 856 -5.501432160761325e+00 +1427 857 -5.845568772761842e+00 +1427 858 -6.578858018778782e+00 +1427 859 -7.787064219095077e+00 +1427 860 -9.574614729634387e+00 +1427 861 -1.199392684783545e+01 +1427 862 -1.489187979900571e+01 +1427 863 -1.771654764348815e+01 +1427 864 -1.953249673072867e+01 +1427 1990 -1.953249673072867e+01 +1427 1991 -1.771654764348813e+01 +1427 1992 -1.489187979900572e+01 +1427 1993 -1.199392684783545e+01 +1427 1994 -9.574614729634387e+00 +1427 1995 -7.787064219095081e+00 +1427 1996 -6.578858018778784e+00 +1427 1997 -5.845568772761844e+00 +1427 1998 -5.501432160761325e+00 +1428 577 -2.101098045763917e+00 +1428 578 -2.189307683194851e+00 +1428 579 -2.369680831172466e+00 +1428 580 -2.647316772054514e+00 +1428 581 -3.021655125742912e+00 +1428 582 -3.474506751309655e+00 +1428 583 -3.955287673172522e+00 +1428 584 -4.374472772345658e+00 +1428 585 -4.623196535591008e+00 +1428 856 -4.655741575368517e+00 +1428 857 -4.927408805516035e+00 +1428 858 -5.501432160761327e+00 +1428 859 -6.434009698761967e+00 +1428 860 -7.787064219095081e+00 +1428 861 -9.574614729634391e+00 +1428 862 -1.165955788548229e+01 +1428 863 -1.364121235299755e+01 +1428 864 -1.489187979900572e+01 +1428 1990 -2.648026715992622e+01 +1428 1991 -2.372339702886325e+01 +1428 1992 -1.953249673072867e+01 +1428 1993 -1.536382589350010e+01 +1428 1994 -1.199392684783545e+01 +1428 1995 -9.574614729634387e+00 +1428 1996 -7.976517934049897e+00 +1428 1997 -7.022334130042162e+00 +1428 1998 -6.578858018778778e+00 +1429 577 -1.898863298003203e+00 +1429 578 -1.975331417147858e+00 +1429 579 -2.131159503067380e+00 +1429 580 -2.369680831172466e+00 +1429 581 -2.688901476974081e+00 +1429 582 -3.071728502881823e+00 +1429 583 -3.474506751309655e+00 +1429 584 -3.822855655704620e+00 +1429 585 -4.028382153902576e+00 +1429 856 -4.055212971361419e+00 +1429 857 -4.278637194083235e+00 +1429 858 -4.747658828821055e+00 +1429 859 -5.501432160761327e+00 +1429 860 -6.578858018778784e+00 +1429 861 -7.976517934049901e+00 +1429 862 -9.574614729634391e+00 +1429 863 -1.106556701616916e+01 +1429 864 -1.199392684783546e+01 +1429 1990 -3.582072268161380e+01 +1429 1991 -3.165228467591593e+01 +1429 1992 -2.547425580969110e+01 +1429 1993 -1.953249673072864e+01 +1429 1994 -1.489187979900570e+01 +1429 1995 -1.165955788548229e+01 +1429 1996 -9.574614729634387e+00 +1429 1997 -8.350436340807194e+00 +1429 1998 -7.787064219095073e+00 +1430 577 -1.765972963745819e+00 +1430 578 -1.835000056862136e+00 +1430 579 -1.975331417147858e+00 +1430 580 -2.189307683194851e+00 +1430 581 -2.474220532866516e+00 +1430 582 -2.813872708878962e+00 +1430 583 -3.169027908859174e+00 +1430 584 -3.474506751309655e+00 +1430 585 -3.654050001394688e+00 +1430 856 -3.677452266447854e+00 +1430 857 -3.872006983680973e+00 +1430 858 -4.278637194083235e+00 +1430 859 -4.927408805516035e+00 +1430 860 -5.845568772761844e+00 +1430 861 -7.022334130042167e+00 +1430 862 -8.350436340807200e+00 +1430 863 -9.574614729634391e+00 +1430 864 -1.033025206259609e+01 +1430 1990 -4.601776203532702e+01 +1430 1991 -4.014998583800264e+01 +1430 1992 -3.165228467591599e+01 +1430 1993 -2.372339702886325e+01 +1430 1994 -1.771654764348813e+01 +1430 1995 -1.364121235299754e+01 +1430 1996 -1.106556701616915e+01 +1430 1997 -9.574614729634387e+00 +1430 1998 -8.894152732809214e+00 +1431 577 -1.700527108287443e+00 +1431 578 -1.765972963745819e+00 +1431 579 -1.898863298003203e+00 +1431 580 -2.101098045763916e+00 +1431 581 -2.369680831172465e+00 +1431 582 -2.688901476974080e+00 +1431 583 -3.021655125742911e+00 +1431 584 -3.307075579356516e+00 +1431 585 -3.474506751309654e+00 +1431 856 -3.496313214985748e+00 +1431 857 -3.677452266447852e+00 +1431 858 -4.055212971361418e+00 +1431 859 -4.655741575368515e+00 +1431 860 -5.501432160761325e+00 +1431 861 -6.578858018778782e+00 +1431 862 -7.787064219095077e+00 +1431 863 -8.894152732809218e+00 +1431 864 -9.574614729634387e+00 +1431 1990 -5.316004558269722e+01 +1431 1991 -4.601776203532702e+01 +1431 1992 -3.582072268161387e+01 +1431 1993 -2.648026715992622e+01 +1431 1994 -1.953249673072867e+01 +1431 1995 -1.489187979900572e+01 +1431 1996 -1.199392684783546e+01 +1431 1997 -1.033025206259609e+01 +1431 1998 -9.574614729634387e+00 +1432 1153 -5.416220002058462e+01 +1432 1154 -5.847168336242214e+01 +1432 1155 -6.797204698756184e+01 +1432 1156 -8.455751811575986e+01 +1432 1157 -1.112023202068744e+02 +1432 1158 -1.512628164030906e+02 +1432 1159 -2.053883607687489e+02 +1432 1160 -2.647767438527630e+02 +1432 1161 -3.065373731090118e+02 +1432 1720 -5.416220002058462e+01 +1432 1721 -5.028460369863171e+01 +1432 1722 -4.398263164573866e+01 +1432 1723 -3.711530555640490e+01 +1432 1724 -3.100122392289864e+01 +1432 1725 -2.620940698061742e+01 +1432 1726 -2.281096793104268e+01 +1432 1727 -2.067515029553633e+01 +1432 1728 -1.965157861598590e+01 +1432 1855 -1.965477828103598e+01 +1432 1856 -1.870055440211151e+01 +1432 1857 -1.707507926940499e+01 +1432 1858 -1.518203609416468e+01 +1432 1859 -1.336813651340294e+01 +1432 1860 -1.184372960400065e+01 +1432 1861 -1.069703031088084e+01 +1432 1862 -9.944085360683063e+00 +1432 1863 -9.573445684409064e+00 +1433 1153 -5.028460369863171e+01 +1433 1154 -5.416220002058462e+01 +1433 1155 -6.266865647386096e+01 +1433 1156 -7.739429142416682e+01 +1433 1157 -1.007640600234616e+02 +1433 1158 -1.353445496343036e+02 +1433 1159 -1.811983282511275e+02 +1433 1160 -2.305668762810884e+02 +1433 1161 -2.647767438527630e+02 +1433 1720 -5.847168336242214e+01 +1433 1721 -5.416220002058462e+01 +1433 1722 -4.718848846240646e+01 +1433 1723 -3.963467701820890e+01 +1433 1724 -3.295302401855845e+01 +1433 1725 -2.774798050936779e+01 +1433 1726 -2.407490908992506e+01 +1433 1727 -2.177494503977683e+01 +1433 1728 -2.067515029553633e+01 +1433 1855 -2.067858569511584e+01 +1433 1856 -1.965477828103598e+01 +1433 1857 -1.791417887437397e+01 +1433 1858 -1.589274010473518e+01 +1433 1859 -1.396191802264486e+01 +1433 1860 -1.234420052045069e+01 +1433 1861 -1.113049648221346e+01 +1433 1862 -1.033512964800000e+01 +1433 1863 -9.944085360683063e+00 +1434 1153 -4.398263164573866e+01 +1434 1154 -4.718848846240646e+01 +1434 1155 -5.416220002058462e+01 +1434 1156 -6.606134132672688e+01 +1434 1157 -8.455751811576010e+01 +1434 1158 -1.112023202068747e+02 +1434 1159 -1.454508347890311e+02 +1434 1160 -1.811983282511275e+02 +1434 1161 -2.053883607687489e+02 +1434 1720 -6.797204698756184e+01 +1434 1721 -6.266865647386096e+01 +1434 1722 -5.416220002058462e+01 +1434 1723 -4.506046026496942e+01 +1434 1724 -3.711530555640482e+01 +1434 1725 -3.100122392289858e+01 +1434 1726 -2.672989532903555e+01 +1434 1727 -2.407490908992506e+01 +1434 1728 -2.281096793104268e+01 +1434 1855 -2.281491025526307e+01 +1434 1856 -2.164167292784031e+01 +1434 1857 -1.965477828103598e+01 +1434 1858 -1.736013665098131e+01 +1434 1859 -1.518203609416466e+01 +1434 1860 -1.336813651340292e+01 +1434 1861 -1.201426721054981e+01 +1434 1862 -1.113049648221346e+01 +1434 1863 -1.069703031088084e+01 +1435 1153 -3.711530555640490e+01 +1435 1154 -3.963467701820890e+01 +1435 1155 -4.506046026496942e+01 +1435 1156 -5.416220002058462e+01 +1435 1157 -6.797204698756201e+01 +1435 1158 -8.726265053974967e+01 +1435 1159 -1.112023202068747e+02 +1435 1160 -1.353445496343036e+02 +1435 1161 -1.512628164030906e+02 +1435 1720 -8.455751811575986e+01 +1435 1721 -7.739429142416682e+01 +1435 1722 -6.606134132672688e+01 +1435 1723 -5.416220002058462e+01 +1435 1724 -4.398263164573857e+01 +1435 1725 -3.629276779865588e+01 +1435 1726 -3.100122392289858e+01 +1435 1727 -2.774798050936779e+01 +1435 1728 -2.620940698061742e+01 +1435 1855 -2.621419542240643e+01 +1435 1856 -2.479209926714913e+01 +1435 1857 -2.239757409043196e+01 +1435 1858 -1.965477828103598e+01 +1435 1859 -1.707507926940496e+01 +1435 1860 -1.494561758129197e+01 +1435 1861 -1.336813651340292e+01 +1435 1862 -1.234420052045069e+01 +1435 1863 -1.184372960400065e+01 +1436 1153 -3.100122392289864e+01 +1436 1154 -3.295302401855845e+01 +1436 1155 -3.711530555640482e+01 +1436 1156 -4.398263164573857e+01 +1436 1157 -5.416220002058462e+01 +1436 1158 -6.797204698756201e+01 +1436 1159 -8.455751811576010e+01 +1436 1160 -1.007640600234616e+02 +1436 1161 -1.112023202068744e+02 +1436 1720 -1.112023202068744e+02 +1436 1721 -1.007640600234616e+02 +1436 1722 -8.455751811576010e+01 +1436 1723 -6.797204698756201e+01 +1436 1724 -5.416220002058462e+01 +1436 1725 -4.398263164573857e+01 +1436 1726 -3.711530555640482e+01 +1436 1727 -3.295302401855845e+01 +1436 1728 -3.100122392289864e+01 +1436 1855 -3.100728135248165e+01 +1436 1856 -2.921308657465229e+01 +1436 1857 -2.621419542240647e+01 +1436 1858 -2.281491025526310e+01 +1436 1859 -1.965477828103598e+01 +1436 1860 -1.707507926940496e+01 +1436 1861 -1.518203609416466e+01 +1436 1862 -1.396191802264486e+01 +1436 1863 -1.336813651340294e+01 +1437 1153 -2.620940698061742e+01 +1437 1154 -2.774798050936779e+01 +1437 1155 -3.100122392289858e+01 +1437 1156 -3.629276779865588e+01 +1437 1157 -4.398263164573857e+01 +1437 1158 -5.416220002058462e+01 +1437 1159 -6.606134132672688e+01 +1437 1160 -7.739429142416682e+01 +1437 1161 -8.455751811575986e+01 +1437 1720 -1.512628164030906e+02 +1437 1721 -1.353445496343036e+02 +1437 1722 -1.112023202068747e+02 +1437 1723 -8.726265053974967e+01 +1437 1724 -6.797204698756201e+01 +1437 1725 -5.416220002058462e+01 +1437 1726 -4.506046026496942e+01 +1437 1727 -3.963467701820890e+01 +1437 1728 -3.711530555640490e+01 +1437 1855 -3.712309913086538e+01 +1437 1856 -3.482168460593341e+01 +1437 1857 -3.100728135248171e+01 +1437 1858 -2.673481743251412e+01 +1437 1859 -2.281491025526310e+01 +1437 1860 -1.965477828103598e+01 +1437 1861 -1.736013665098131e+01 +1437 1862 -1.589274010473518e+01 +1437 1863 -1.518203609416468e+01 +1438 1153 -2.281096793104268e+01 +1438 1154 -2.407490908992506e+01 +1438 1155 -2.672989532903555e+01 +1438 1156 -3.100122392289858e+01 +1438 1157 -3.711530555640482e+01 +1438 1158 -4.506046026496942e+01 +1438 1159 -5.416220002058462e+01 +1438 1160 -6.266865647386096e+01 +1438 1161 -6.797204698756184e+01 +1438 1720 -2.053883607687489e+02 +1438 1721 -1.811983282511275e+02 +1438 1722 -1.454508347890311e+02 +1438 1723 -1.112023202068747e+02 +1438 1724 -8.455751811576010e+01 +1438 1725 -6.606134132672688e+01 +1438 1726 -5.416220002058462e+01 +1438 1727 -4.718848846240646e+01 +1438 1728 -4.398263164573866e+01 +1438 1855 -4.399251628020367e+01 +1438 1856 -4.108257963331437e+01 +1438 1857 -3.630032063351624e+01 +1438 1858 -3.100728135248171e+01 +1438 1859 -2.621419542240647e+01 +1438 1860 -2.239757409043196e+01 +1438 1861 -1.965477828103598e+01 +1438 1862 -1.791417887437397e+01 +1438 1863 -1.707507926940499e+01 +1439 1153 -2.067515029553633e+01 +1439 1154 -2.177494503977683e+01 +1439 1155 -2.407490908992506e+01 +1439 1156 -2.774798050936779e+01 +1439 1157 -3.295302401855845e+01 +1439 1158 -3.963467701820890e+01 +1439 1159 -4.718848846240646e+01 +1439 1160 -5.416220002058462e+01 +1439 1161 -5.847168336242214e+01 +1439 1720 -2.647767438527630e+02 +1439 1721 -2.305668762810884e+02 +1439 1722 -1.811983282511275e+02 +1439 1723 -1.353445496343036e+02 +1439 1724 -1.007640600234616e+02 +1439 1725 -7.739429142416682e+01 +1439 1726 -6.266865647386096e+01 +1439 1727 -5.416220002058462e+01 +1439 1728 -5.028460369863171e+01 +1439 1855 -5.029652653878190e+01 +1439 1856 -4.679557686118159e+01 +1439 1857 -4.108257963331437e+01 +1439 1858 -3.482168460593341e+01 +1439 1859 -2.921308657465229e+01 +1439 1860 -2.479209926714913e+01 +1439 1861 -2.164167292784031e+01 +1439 1862 -1.965477828103598e+01 +1439 1863 -1.870055440211151e+01 +1440 1153 -1.965157861598590e+01 +1440 1154 -2.067515029553633e+01 +1440 1155 -2.281096793104268e+01 +1440 1156 -2.620940698061742e+01 +1440 1157 -3.100122392289864e+01 +1440 1158 -3.711530555640490e+01 +1440 1159 -4.398263164573866e+01 +1440 1160 -5.028460369863171e+01 +1440 1161 -5.416220002058462e+01 +1440 1720 -3.065373731090118e+02 +1440 1721 -2.647767438527630e+02 +1440 1722 -2.053883607687489e+02 +1440 1723 -1.512628164030906e+02 +1440 1724 -1.112023202068744e+02 +1440 1725 -8.455751811575986e+01 +1440 1726 -6.797204698756184e+01 +1440 1727 -5.847168336242214e+01 +1440 1728 -5.416220002058462e+01 +1440 1855 -5.417542964960961e+01 +1440 1856 -5.029652653878190e+01 +1440 1857 -4.399251628020367e+01 +1440 1858 -3.712309913086538e+01 +1440 1859 -3.100728135248165e+01 +1440 1860 -2.621419542240643e+01 +1440 1861 -2.281491025526307e+01 +1440 1862 -2.067858569511584e+01 +1440 1863 -1.965477828103598e+01 +1441 1297 -3.063876713483004e+02 +1441 1298 -3.311617365195747e+02 +1441 1299 -3.859179776157605e+02 +1441 1300 -4.819366867771664e+02 +1441 1301 -6.371952057562402e+02 +1441 1302 -8.726231103602357e+02 +1441 1303 -1.193932486839834e+03 +1441 1304 -1.550121445008505e+03 +1441 1305 -1.802596433195456e+03 +1441 1576 -3.063876713483004e+02 +1441 1577 -2.841326260213855e+02 +1441 1578 -2.480403651673271e+02 +1441 1579 -2.088271183655457e+02 +1441 1580 -1.740274317161707e+02 +1441 1581 -1.468355065336023e+02 +1441 1582 -1.275984131219179e+02 +1441 1583 -1.155304899028561e+02 +1441 1584 -1.097534196790493e+02 +1441 1639 -1.111842160419089e+02 +1441 1640 -1.057061586526018e+02 +1441 1641 -9.638822517401589e+01 +1441 1642 -8.555928471614156e+01 +1441 1643 -7.520762033775921e+01 +1441 1644 -6.652797451218323e+01 +1441 1645 -6.001174723167335e+01 +1441 1646 -5.573941364116940e+01 +1441 1647 -5.363826960242956e+01 +1442 1297 -2.841326260213855e+02 +1442 1298 -3.063876713483004e+02 +1442 1299 -3.553280674768354e+02 +1442 1300 -4.404031329187411e+02 +1442 1301 -5.762343277298867e+02 +1442 1302 -7.788097592344268e+02 +1442 1303 -1.049909849375148e+03 +1442 1304 -1.344510568096302e+03 +1442 1305 -1.550121445008505e+03 +1442 1576 -3.311617365195747e+02 +1442 1577 -3.063876713483004e+02 +1442 1578 -2.663884709281895e+02 +1442 1579 -2.231981844606894e+02 +1442 1580 -1.851243485745373e+02 +1442 1581 -1.555580782497810e+02 +1442 1582 -1.347481526436478e+02 +1442 1583 -1.217424124188383e+02 +1442 1584 -1.155304899028561e+02 +1442 1639 -1.170681125153376e+02 +1442 1640 -1.111842160419089e+02 +1442 1641 -1.011961191083175e+02 +1442 1642 -8.962181586287889e+01 +1442 1643 -7.859349409841370e+01 +1442 1644 -6.937545782864687e+01 +1442 1645 -6.247361649834824e+01 +1442 1646 -5.795761808209202e+01 +1442 1647 -5.573941364116940e+01 +1443 1297 -2.480403651673271e+02 +1443 1298 -2.663884709281895e+02 +1443 1299 -3.063876713483004e+02 +1443 1300 -3.748904053829385e+02 +1443 1301 -4.819366867771664e+02 +1443 1302 -6.371952057562402e+02 +1443 1303 -8.383319685358435e+02 +1443 1304 -1.049909849375148e+03 +1443 1305 -1.193932486839834e+03 +1443 1576 -3.859179776157605e+02 +1443 1577 -3.553280674768354e+02 +1443 1578 -3.063876713483004e+02 +1443 1579 -2.542062119667738e+02 +1443 1580 -2.088271183655457e+02 +1443 1581 -1.740274317161707e+02 +1443 1582 -1.497853840269160e+02 +1443 1583 -1.347481526436478e+02 +1443 1584 -1.275984131219179e+02 +1443 1639 -1.293661657908652e+02 +1443 1640 -1.226088998409724e+02 +1443 1641 -1.111842160419089e+02 +1443 1642 -9.802102195827720e+01 +1443 1643 -8.555928471614156e+01 +1443 1644 -7.520762033775921e+01 +1443 1645 -6.749803222962952e+01 +1443 1646 -6.247361649834824e+01 +1443 1647 -6.001174723167335e+01 +1444 1297 -2.088271183655457e+02 +1444 1298 -2.231981844606894e+02 +1444 1299 -2.542062119667738e+02 +1444 1300 -3.063876713483004e+02 +1444 1301 -3.859179776157605e+02 +1444 1302 -4.976453857371607e+02 +1444 1303 -6.371952057562402e+02 +1444 1304 -7.788097592344268e+02 +1444 1305 -8.726231103602357e+02 +1444 1576 -4.819366867771664e+02 +1444 1577 -4.404031329187411e+02 +1444 1578 -3.748904053829385e+02 +1444 1579 -3.063876713483004e+02 +1444 1580 -2.480403651673271e+02 +1444 1581 -2.041390437321793e+02 +1444 1582 -1.740274317161707e+02 +1444 1583 -1.555580782497810e+02 +1444 1584 -1.468355065336023e+02 +1444 1639 -1.489885081652992e+02 +1444 1640 -1.407716848553628e+02 +1444 1641 -1.269615920628681e+02 +1444 1642 -1.111842160419089e+02 +1444 1643 -9.638822517401589e+01 +1444 1644 -8.420868002944904e+01 +1444 1645 -7.520762033775921e+01 +1444 1646 -6.937545782864687e+01 +1444 1647 -6.652797451218323e+01 +1445 1297 -1.740274317161707e+02 +1445 1298 -1.851243485745373e+02 +1445 1299 -2.088271183655457e+02 +1445 1300 -2.480403651673271e+02 +1445 1301 -3.063876713483004e+02 +1445 1302 -3.859179776157605e+02 +1445 1303 -4.819366867771664e+02 +1445 1304 -5.762343277298867e+02 +1445 1305 -6.371952057562402e+02 +1445 1576 -6.371952057562402e+02 +1445 1577 -5.762343277298867e+02 +1445 1578 -4.819366867771664e+02 +1445 1579 -3.859179776157605e+02 +1445 1580 -3.063876713483004e+02 +1445 1581 -2.480403651673271e+02 +1445 1582 -2.088271183655457e+02 +1445 1583 -1.851243485745373e+02 +1445 1584 -1.740274317161707e+02 +1445 1639 -1.767605489846857e+02 +1445 1640 -1.663510232448633e+02 +1445 1641 -1.489885081652992e+02 +1445 1642 -1.293661657908652e+02 +1445 1643 -1.111842160419089e+02 +1445 1644 -9.638822517401589e+01 +1445 1645 -8.555928471614156e+01 +1445 1646 -7.859349409841370e+01 +1445 1647 -7.520762033775921e+01 +1446 1297 -1.468355065336023e+02 +1446 1298 -1.555580782497810e+02 +1446 1299 -1.740274317161707e+02 +1446 1300 -2.041390437321793e+02 +1446 1301 -2.480403651673271e+02 +1446 1302 -3.063876713483004e+02 +1446 1303 -3.748904053829385e+02 +1446 1304 -4.404031329187411e+02 +1446 1305 -4.819366867771664e+02 +1446 1576 -8.726231103602357e+02 +1446 1577 -7.788097592344268e+02 +1446 1578 -6.371952057562402e+02 +1446 1579 -4.976453857371607e+02 +1446 1580 -3.859179776157605e+02 +1446 1581 -3.063876713483004e+02 +1446 1582 -2.542062119667738e+02 +1446 1583 -2.231981844606894e+02 +1446 1584 -2.088271183655457e+02 +1446 1639 -2.123577731150849e+02 +1446 1640 -1.989422168423268e+02 +1446 1641 -1.767605489846857e+02 +1446 1642 -1.519993633210930e+02 +1446 1643 -1.293661657908652e+02 +1446 1644 -1.111842160419089e+02 +1446 1645 -9.802102195827720e+01 +1446 1646 -8.962181586287889e+01 +1446 1647 -8.555928471614156e+01 +1447 1297 -1.275984131219179e+02 +1447 1298 -1.347481526436478e+02 +1447 1299 -1.497853840269160e+02 +1447 1300 -1.740274317161707e+02 +1447 1301 -2.088271183655457e+02 +1447 1302 -2.542062119667738e+02 +1447 1303 -3.063876713483004e+02 +1447 1304 -3.553280674768354e+02 +1447 1305 -3.859179776157605e+02 +1447 1576 -1.193932486839834e+03 +1447 1577 -1.049909849375148e+03 +1447 1578 -8.383319685358435e+02 +1447 1579 -6.371952057562402e+02 +1447 1580 -4.819366867771664e+02 +1447 1581 -3.748904053829385e+02 +1447 1582 -3.063876713483004e+02 +1447 1583 -2.663884709281895e+02 +1447 1584 -2.480403651673271e+02 +1447 1639 -2.525366109215767e+02 +1447 1640 -2.354925657825773e+02 +1447 1641 -2.075588680195229e+02 +1447 1642 -1.767605489846857e+02 +1447 1643 -1.489885081652992e+02 +1447 1644 -1.269615920628681e+02 +1447 1645 -1.111842160419089e+02 +1447 1646 -1.011961191083175e+02 +1447 1647 -9.638822517401589e+01 +1448 1297 -1.155304899028561e+02 +1448 1298 -1.217424124188383e+02 +1448 1299 -1.347481526436478e+02 +1448 1300 -1.555580782497810e+02 +1448 1301 -1.851243485745373e+02 +1448 1302 -2.231981844606894e+02 +1448 1303 -2.663884709281895e+02 +1448 1304 -3.063876713483004e+02 +1448 1305 -3.311617365195747e+02 +1448 1576 -1.550121445008505e+03 +1448 1577 -1.344510568096302e+03 +1448 1578 -1.049909849375148e+03 +1448 1579 -7.788097592344268e+02 +1448 1580 -5.762343277298867e+02 +1448 1581 -4.404031329187411e+02 +1448 1582 -3.553280674768354e+02 +1448 1583 -3.063876713483004e+02 +1448 1584 -2.841326260213855e+02 +1448 1639 -2.895745815575320e+02 +1448 1640 -2.689865983609317e+02 +1448 1641 -2.354925657825773e+02 +1448 1642 -1.989422168423268e+02 +1448 1643 -1.663510232448633e+02 +1448 1644 -1.407716848553628e+02 +1448 1645 -1.226088998409724e+02 +1448 1646 -1.111842160419089e+02 +1448 1647 -1.057061586526018e+02 +1449 1297 -1.097534196790493e+02 +1449 1298 -1.155304899028561e+02 +1449 1299 -1.275984131219179e+02 +1449 1300 -1.468355065336023e+02 +1449 1301 -1.740274317161707e+02 +1449 1302 -2.088271183655457e+02 +1449 1303 -2.480403651673271e+02 +1449 1304 -2.841326260213855e+02 +1449 1305 -3.063876713483004e+02 +1449 1576 -1.802596433195456e+03 +1449 1577 -1.550121445008505e+03 +1449 1578 -1.193932486839834e+03 +1449 1579 -8.726231103602357e+02 +1449 1580 -6.371952057562402e+02 +1449 1581 -4.819366867771664e+02 +1449 1582 -3.859179776157605e+02 +1449 1583 -3.311617365195747e+02 +1449 1584 -3.063876713483004e+02 +1449 1639 -3.124380547854544e+02 +1449 1640 -2.895745815575320e+02 +1449 1641 -2.525366109215767e+02 +1449 1642 -2.123577731150849e+02 +1449 1643 -1.767605489846857e+02 +1449 1644 -1.489885081652992e+02 +1449 1645 -1.293661657908652e+02 +1449 1646 -1.170681125153376e+02 +1449 1647 -1.111842160419089e+02 +1450 1369 -1.733190400658708e+03 +1450 1370 -1.877824568765017e+03 +1450 1371 -2.199157547087201e+03 +1450 1372 -2.767706810094291e+03 +1450 1373 -3.699147964795180e+03 +1450 1374 -5.136224430633882e+03 +1450 1375 -7.138491575686282e+03 +1450 1376 -9.405703259334639e+03 +1450 1377 -1.103972130715926e+04 +1450 1513 -1.733190400658708e+03 +1450 1514 -1.603684467943633e+03 +1450 1515 -1.394551574360510e+03 +1450 1516 -1.168677565678393e+03 +1450 1517 -9.695072463564434e+02 +1450 1518 -8.148024630667926e+02 +1450 1519 -7.058924559832867e+02 +1450 1520 -6.378158089920671e+02 +1450 1521 -6.052974323170196e+02 +1450 1540 -6.289529049931513e+02 +1450 1541 -5.970589583440825e+02 +1450 1542 -5.429674662554822e+02 +1450 1543 -4.803677035258846e+02 +1450 1544 -4.208084537187713e+02 +1450 1545 -3.710963518270331e+02 +1450 1546 -3.339204550667988e+02 +1450 1547 -3.096178268240465e+02 +1450 1548 -2.976873911031298e+02 +1451 1369 -1.603684467943633e+03 +1451 1370 -1.733190400658708e+03 +1451 1371 -2.019368486704435e+03 +1451 1372 -2.521021940438000e+03 +1451 1373 -3.331754877699595e+03 +1451 1374 -4.560278038130823e+03 +1451 1375 -6.235592529048601e+03 +1451 1376 -8.091232579773156e+03 +1451 1377 -9.405703259334639e+03 +1451 1513 -1.877824568765017e+03 +1451 1514 -1.733190400658708e+03 +1451 1515 -1.500725861549673e+03 +1451 1516 -1.251286952144484e+03 +1451 1517 -1.032880208377977e+03 +1451 1518 -8.643348602446076e+02 +1451 1519 -7.463158073460687e+02 +1451 1520 -6.728335244699299e+02 +1451 1521 -6.378158089920671e+02 +1451 1540 -6.632839990295113e+02 +1451 1541 -6.289529049931513e+02 +1451 1542 -5.708523475060541e+02 +1451 1543 -5.038180997021789e+02 +1451 1544 -4.402579127124382e+02 +1451 1545 -3.873813675510144e+02 +1451 1546 -3.479505460244110e+02 +1451 1547 -3.222285372305477e+02 +1451 1548 -3.096178268240465e+02 +1452 1369 -1.394551574360510e+03 +1452 1370 -1.500725861549673e+03 +1452 1371 -1.733190400658708e+03 +1452 1372 -2.134265778758326e+03 +1452 1373 -2.767706810094291e+03 +1452 1374 -3.699147964795180e+03 +1452 1375 -4.925216936196723e+03 +1452 1376 -6.235592529048601e+03 +1452 1377 -7.138491575686282e+03 +1452 1513 -2.199157547087201e+03 +1452 1514 -2.019368486704435e+03 +1452 1515 -1.733190400658708e+03 +1452 1516 -1.430197816180122e+03 +1452 1517 -1.168677565678393e+03 +1452 1518 -9.695072463564434e+02 +1452 1519 -8.315436028021828e+02 +1452 1520 -7.463158073460687e+02 +1452 1521 -7.058924559832867e+02 +1452 1540 -7.352796046183681e+02 +1452 1541 -6.956816209337401e+02 +1452 1542 -6.289529049931513e+02 +1452 1543 -5.524312223207850e+02 +1452 1544 -4.803677035258846e+02 +1452 1545 -4.208084537187713e+02 +1452 1546 -3.766415408901786e+02 +1452 1547 -3.479505460244110e+02 +1452 1548 -3.339204550667988e+02 +1453 1369 -1.168677565678393e+03 +1453 1370 -1.251286952144484e+03 +1453 1371 -1.430197816180122e+03 +1453 1372 -1.733190400658708e+03 +1453 1373 -2.199157547087201e+03 +1453 1374 -2.861294172280346e+03 +1453 1375 -3.699147964795180e+03 +1453 1376 -4.560278038130823e+03 +1453 1377 -5.136224430633882e+03 +1453 1513 -2.767706810094291e+03 +1453 1514 -2.521021940438000e+03 +1453 1515 -2.134265778758326e+03 +1453 1516 -1.733190400658708e+03 +1453 1517 -1.394551574360510e+03 +1453 1518 -1.141773184361042e+03 +1453 1519 -9.695072463564434e+02 +1453 1520 -8.643348602446076e+02 +1453 1521 -8.148024630667926e+02 +1453 1540 -8.507888885505199e+02 +1453 1541 -8.023274760830675e+02 +1453 1542 -7.211778000851799e+02 +1453 1543 -6.289529049931513e+02 +1453 1544 -5.429674662554822e+02 +1453 1545 -4.725808574370885e+02 +1453 1546 -4.208084537187713e+02 +1453 1547 -3.873813675510144e+02 +1453 1548 -3.710963518270331e+02 +1454 1369 -9.695072463564434e+02 +1454 1370 -1.032880208377977e+03 +1454 1371 -1.168677565678393e+03 +1454 1372 -1.394551574360510e+03 +1454 1373 -1.733190400658708e+03 +1454 1374 -2.199157547087201e+03 +1454 1375 -2.767706810094291e+03 +1454 1376 -3.331754877699595e+03 +1454 1377 -3.699147964795180e+03 +1454 1513 -3.699147964795180e+03 +1454 1514 -3.331754877699595e+03 +1454 1515 -2.767706810094291e+03 +1454 1516 -2.199157547087201e+03 +1454 1517 -1.733190400658708e+03 +1454 1518 -1.394551574360510e+03 +1454 1519 -1.168677565678393e+03 +1454 1520 -1.032880208377977e+03 +1454 1521 -9.695072463564434e+02 +1454 1540 -1.015511306612467e+03 +1454 1541 -9.536070604341750e+02 +1454 1542 -8.507888885505199e+02 +1454 1543 -7.352796046183681e+02 +1454 1544 -6.289529049931513e+02 +1454 1545 -5.429674662554822e+02 +1454 1546 -4.803677035258846e+02 +1454 1547 -4.402579127124382e+02 +1454 1548 -4.208084537187713e+02 +1455 1369 -8.148024630667926e+02 +1455 1370 -8.643348602446076e+02 +1455 1371 -9.695072463564434e+02 +1455 1372 -1.141773184361042e+03 +1455 1373 -1.394551574360510e+03 +1455 1374 -1.733190400658708e+03 +1455 1375 -2.134265778758326e+03 +1455 1376 -2.521021940438000e+03 +1455 1377 -2.767706810094291e+03 +1455 1513 -5.136224430633882e+03 +1455 1514 -4.560278038130823e+03 +1455 1515 -3.699147964795180e+03 +1455 1516 -2.861294172280346e+03 +1455 1517 -2.199157547087201e+03 +1455 1518 -1.733190400658708e+03 +1455 1519 -1.430197816180122e+03 +1455 1520 -1.251286952144484e+03 +1455 1521 -1.168677565678393e+03 +1455 1540 -1.228588660544053e+03 +1455 1541 -1.148042053110080e+03 +1455 1542 -1.015511306612467e+03 +1455 1543 -8.685786765383800e+02 +1455 1544 -7.352796046183681e+02 +1455 1545 -6.289529049931513e+02 +1455 1546 -5.524312223207850e+02 +1455 1547 -5.038180997021789e+02 +1455 1548 -4.803677035258846e+02 +1456 1369 -7.058924559832867e+02 +1456 1370 -7.463158073460687e+02 +1456 1371 -8.315436028021828e+02 +1456 1372 -9.695072463564434e+02 +1456 1373 -1.168677565678393e+03 +1456 1374 -1.430197816180122e+03 +1456 1375 -1.733190400658708e+03 +1456 1376 -2.019368486704435e+03 +1456 1377 -2.199157547087201e+03 +1456 1513 -7.138491575686282e+03 +1456 1514 -6.235592529048601e+03 +1456 1515 -4.925216936196723e+03 +1456 1516 -3.699147964795180e+03 +1456 1517 -2.767706810094291e+03 +1456 1518 -2.134265778758326e+03 +1456 1519 -1.733190400658708e+03 +1456 1520 -1.500725861549673e+03 +1456 1521 -1.394551574360510e+03 +1456 1540 -1.471477730866027e+03 +1456 1541 -1.368148367306964e+03 +1456 1542 -1.199743197084304e+03 +1456 1543 -1.015511306612467e+03 +1456 1544 -8.507888885505199e+02 +1456 1545 -7.211778000851799e+02 +1456 1546 -6.289529049931513e+02 +1456 1547 -5.708523475060541e+02 +1456 1548 -5.429674662554822e+02 +1457 1369 -6.378158089920671e+02 +1457 1370 -6.728335244699299e+02 +1457 1371 -7.463158073460687e+02 +1457 1372 -8.643348602446076e+02 +1457 1373 -1.032880208377977e+03 +1457 1374 -1.251286952144484e+03 +1457 1375 -1.500725861549673e+03 +1457 1376 -1.733190400658708e+03 +1457 1377 -1.877824568765017e+03 +1457 1513 -9.405703259334639e+03 +1457 1514 -8.091232579773156e+03 +1457 1515 -6.235592529048601e+03 +1457 1516 -4.560278038130823e+03 +1457 1517 -3.331754877699595e+03 +1457 1518 -2.521021940438000e+03 +1457 1519 -2.019368486704435e+03 +1457 1520 -1.733190400658708e+03 +1457 1521 -1.603684467943633e+03 +1457 1540 -1.697437739078449e+03 +1457 1541 -1.571600895131404e+03 +1457 1542 -1.368148367306964e+03 +1457 1543 -1.148042053110080e+03 +1457 1544 -9.536070604341750e+02 +1457 1545 -8.023274760830675e+02 +1457 1546 -6.956816209337401e+02 +1457 1547 -6.289529049931513e+02 +1457 1548 -5.970589583440825e+02 +1458 1369 -6.052974323170196e+02 +1458 1370 -6.378158089920671e+02 +1458 1371 -7.058924559832867e+02 +1458 1372 -8.148024630667926e+02 +1458 1373 -9.695072463564434e+02 +1458 1374 -1.168677565678393e+03 +1458 1375 -1.394551574360510e+03 +1458 1376 -1.603684467943633e+03 +1458 1377 -1.733190400658708e+03 +1458 1513 -1.103972130715926e+04 +1458 1514 -9.405703259334639e+03 +1458 1515 -7.138491575686282e+03 +1458 1516 -5.136224430633882e+03 +1458 1517 -3.699147964795180e+03 +1458 1518 -2.767706810094291e+03 +1458 1519 -2.199157547087201e+03 +1458 1520 -1.877824568765017e+03 +1458 1521 -1.733190400658708e+03 +1458 1540 -1.837845240586539e+03 +1458 1541 -1.697437739078449e+03 +1458 1542 -1.471477730866027e+03 +1458 1543 -1.228588660544053e+03 +1458 1544 -1.015511306612467e+03 +1458 1545 -8.507888885505199e+02 +1458 1546 -7.352796046183681e+02 +1458 1547 -6.632839990295113e+02 +1458 1548 -6.289529049931513e+02 +1477 1369 -6.289529049931513e+02 +1477 1370 -6.632839990295113e+02 +1477 1371 -7.352796046183681e+02 +1477 1372 -8.507888885505199e+02 +1477 1373 -1.015511306612467e+03 +1477 1374 -1.228588660544053e+03 +1477 1375 -1.471477730866027e+03 +1477 1376 -1.697437739078449e+03 +1477 1377 -1.837845240586539e+03 +1477 1396 -1.733190400658708e+03 +1477 1397 -1.877824568765017e+03 +1477 1398 -2.199157547087201e+03 +1477 1399 -2.767706810094291e+03 +1477 1400 -3.699147964795180e+03 +1477 1401 -5.136224430633882e+03 +1477 1402 -7.138491575686282e+03 +1477 1403 -9.405703259334639e+03 +1477 1404 -1.103972130715926e+04 +1477 1540 -1.733190400658708e+03 +1477 1541 -1.603684467943633e+03 +1477 1542 -1.394551574360510e+03 +1477 1543 -1.168677565678393e+03 +1477 1544 -9.695072463564434e+02 +1477 1545 -8.148024630667926e+02 +1477 1546 -7.058924559832867e+02 +1477 1547 -6.378158089920671e+02 +1477 1548 -6.052974323170196e+02 +1478 1369 -5.970589583440825e+02 +1478 1370 -6.289529049931513e+02 +1478 1371 -6.956816209337401e+02 +1478 1372 -8.023274760830675e+02 +1478 1373 -9.536070604341750e+02 +1478 1374 -1.148042053110080e+03 +1478 1375 -1.368148367306964e+03 +1478 1376 -1.571600895131404e+03 +1478 1377 -1.697437739078449e+03 +1478 1396 -1.603684467943633e+03 +1478 1397 -1.733190400658708e+03 +1478 1398 -2.019368486704435e+03 +1478 1399 -2.521021940438000e+03 +1478 1400 -3.331754877699595e+03 +1478 1401 -4.560278038130823e+03 +1478 1402 -6.235592529048601e+03 +1478 1403 -8.091232579773156e+03 +1478 1404 -9.405703259334639e+03 +1478 1540 -1.877824568765017e+03 +1478 1541 -1.733190400658708e+03 +1478 1542 -1.500725861549673e+03 +1478 1543 -1.251286952144484e+03 +1478 1544 -1.032880208377977e+03 +1478 1545 -8.643348602446076e+02 +1478 1546 -7.463158073460687e+02 +1478 1547 -6.728335244699299e+02 +1478 1548 -6.378158089920671e+02 +1479 1369 -5.429674662554822e+02 +1479 1370 -5.708523475060541e+02 +1479 1371 -6.289529049931513e+02 +1479 1372 -7.211778000851799e+02 +1479 1373 -8.507888885505199e+02 +1479 1374 -1.015511306612467e+03 +1479 1375 -1.199743197084304e+03 +1479 1376 -1.368148367306964e+03 +1479 1377 -1.471477730866027e+03 +1479 1396 -1.394551574360510e+03 +1479 1397 -1.500725861549673e+03 +1479 1398 -1.733190400658708e+03 +1479 1399 -2.134265778758326e+03 +1479 1400 -2.767706810094291e+03 +1479 1401 -3.699147964795180e+03 +1479 1402 -4.925216936196723e+03 +1479 1403 -6.235592529048601e+03 +1479 1404 -7.138491575686282e+03 +1479 1540 -2.199157547087201e+03 +1479 1541 -2.019368486704435e+03 +1479 1542 -1.733190400658708e+03 +1479 1543 -1.430197816180122e+03 +1479 1544 -1.168677565678393e+03 +1479 1545 -9.695072463564434e+02 +1479 1546 -8.315436028021828e+02 +1479 1547 -7.463158073460687e+02 +1479 1548 -7.058924559832867e+02 +1480 1369 -4.803677035258846e+02 +1480 1370 -5.038180997021789e+02 +1480 1371 -5.524312223207850e+02 +1480 1372 -6.289529049931513e+02 +1480 1373 -7.352796046183681e+02 +1480 1374 -8.685786765383800e+02 +1480 1375 -1.015511306612467e+03 +1480 1376 -1.148042053110080e+03 +1480 1377 -1.228588660544053e+03 +1480 1396 -1.168677565678393e+03 +1480 1397 -1.251286952144484e+03 +1480 1398 -1.430197816180122e+03 +1480 1399 -1.733190400658708e+03 +1480 1400 -2.199157547087201e+03 +1480 1401 -2.861294172280346e+03 +1480 1402 -3.699147964795180e+03 +1480 1403 -4.560278038130823e+03 +1480 1404 -5.136224430633882e+03 +1480 1540 -2.767706810094291e+03 +1480 1541 -2.521021940438000e+03 +1480 1542 -2.134265778758326e+03 +1480 1543 -1.733190400658708e+03 +1480 1544 -1.394551574360510e+03 +1480 1545 -1.141773184361042e+03 +1480 1546 -9.695072463564434e+02 +1480 1547 -8.643348602446076e+02 +1480 1548 -8.148024630667926e+02 +1481 1369 -4.208084537187713e+02 +1481 1370 -4.402579127124382e+02 +1481 1371 -4.803677035258846e+02 +1481 1372 -5.429674662554822e+02 +1481 1373 -6.289529049931513e+02 +1481 1374 -7.352796046183681e+02 +1481 1375 -8.507888885505199e+02 +1481 1376 -9.536070604341750e+02 +1481 1377 -1.015511306612467e+03 +1481 1396 -9.695072463564434e+02 +1481 1397 -1.032880208377977e+03 +1481 1398 -1.168677565678393e+03 +1481 1399 -1.394551574360510e+03 +1481 1400 -1.733190400658708e+03 +1481 1401 -2.199157547087201e+03 +1481 1402 -2.767706810094291e+03 +1481 1403 -3.331754877699595e+03 +1481 1404 -3.699147964795180e+03 +1481 1540 -3.699147964795180e+03 +1481 1541 -3.331754877699595e+03 +1481 1542 -2.767706810094291e+03 +1481 1543 -2.199157547087201e+03 +1481 1544 -1.733190400658708e+03 +1481 1545 -1.394551574360510e+03 +1481 1546 -1.168677565678393e+03 +1481 1547 -1.032880208377977e+03 +1481 1548 -9.695072463564434e+02 +1482 1369 -3.710963518270331e+02 +1482 1370 -3.873813675510144e+02 +1482 1371 -4.208084537187713e+02 +1482 1372 -4.725808574370885e+02 +1482 1373 -5.429674662554822e+02 +1482 1374 -6.289529049931513e+02 +1482 1375 -7.211778000851799e+02 +1482 1376 -8.023274760830675e+02 +1482 1377 -8.507888885505199e+02 +1482 1396 -8.148024630667926e+02 +1482 1397 -8.643348602446076e+02 +1482 1398 -9.695072463564434e+02 +1482 1399 -1.141773184361042e+03 +1482 1400 -1.394551574360510e+03 +1482 1401 -1.733190400658708e+03 +1482 1402 -2.134265778758326e+03 +1482 1403 -2.521021940438000e+03 +1482 1404 -2.767706810094291e+03 +1482 1540 -5.136224430633882e+03 +1482 1541 -4.560278038130823e+03 +1482 1542 -3.699147964795180e+03 +1482 1543 -2.861294172280346e+03 +1482 1544 -2.199157547087201e+03 +1482 1545 -1.733190400658708e+03 +1482 1546 -1.430197816180122e+03 +1482 1547 -1.251286952144484e+03 +1482 1548 -1.168677565678393e+03 +1483 1369 -3.339204550667988e+02 +1483 1370 -3.479505460244110e+02 +1483 1371 -3.766415408901786e+02 +1483 1372 -4.208084537187713e+02 +1483 1373 -4.803677035258846e+02 +1483 1374 -5.524312223207850e+02 +1483 1375 -6.289529049931513e+02 +1483 1376 -6.956816209337401e+02 +1483 1377 -7.352796046183681e+02 +1483 1396 -7.058924559832867e+02 +1483 1397 -7.463158073460687e+02 +1483 1398 -8.315436028021828e+02 +1483 1399 -9.695072463564434e+02 +1483 1400 -1.168677565678393e+03 +1483 1401 -1.430197816180122e+03 +1483 1402 -1.733190400658708e+03 +1483 1403 -2.019368486704435e+03 +1483 1404 -2.199157547087201e+03 +1483 1540 -7.138491575686282e+03 +1483 1541 -6.235592529048601e+03 +1483 1542 -4.925216936196723e+03 +1483 1543 -3.699147964795180e+03 +1483 1544 -2.767706810094291e+03 +1483 1545 -2.134265778758326e+03 +1483 1546 -1.733190400658708e+03 +1483 1547 -1.500725861549673e+03 +1483 1548 -1.394551574360510e+03 +1484 1369 -3.096178268240465e+02 +1484 1370 -3.222285372305477e+02 +1484 1371 -3.479505460244110e+02 +1484 1372 -3.873813675510144e+02 +1484 1373 -4.402579127124382e+02 +1484 1374 -5.038180997021789e+02 +1484 1375 -5.708523475060541e+02 +1484 1376 -6.289529049931513e+02 +1484 1377 -6.632839990295113e+02 +1484 1396 -6.378158089920671e+02 +1484 1397 -6.728335244699299e+02 +1484 1398 -7.463158073460687e+02 +1484 1399 -8.643348602446076e+02 +1484 1400 -1.032880208377977e+03 +1484 1401 -1.251286952144484e+03 +1484 1402 -1.500725861549673e+03 +1484 1403 -1.733190400658708e+03 +1484 1404 -1.877824568765017e+03 +1484 1540 -9.405703259334639e+03 +1484 1541 -8.091232579773156e+03 +1484 1542 -6.235592529048601e+03 +1484 1543 -4.560278038130823e+03 +1484 1544 -3.331754877699595e+03 +1484 1545 -2.521021940438000e+03 +1484 1546 -2.019368486704435e+03 +1484 1547 -1.733190400658708e+03 +1484 1548 -1.603684467943633e+03 +1485 1369 -2.976873911031298e+02 +1485 1370 -3.096178268240465e+02 +1485 1371 -3.339204550667988e+02 +1485 1372 -3.710963518270331e+02 +1485 1373 -4.208084537187713e+02 +1485 1374 -4.803677035258846e+02 +1485 1375 -5.429674662554822e+02 +1485 1376 -5.970589583440825e+02 +1485 1377 -6.289529049931513e+02 +1485 1396 -6.052974323170196e+02 +1485 1397 -6.378158089920671e+02 +1485 1398 -7.058924559832867e+02 +1485 1399 -8.148024630667926e+02 +1485 1400 -9.695072463564434e+02 +1485 1401 -1.168677565678393e+03 +1485 1402 -1.394551574360510e+03 +1485 1403 -1.603684467943633e+03 +1485 1404 -1.733190400658708e+03 +1485 1540 -1.103972130715926e+04 +1485 1541 -9.405703259334639e+03 +1485 1542 -7.138491575686282e+03 +1485 1543 -5.136224430633882e+03 +1485 1544 -3.699147964795180e+03 +1485 1545 -2.767706810094291e+03 +1485 1546 -2.199157547087201e+03 +1485 1547 -1.877824568765017e+03 +1485 1548 -1.733190400658708e+03 +1504 1297 -1.111842160419089e+02 +1504 1298 -1.170681125153376e+02 +1504 1299 -1.293661657908652e+02 +1504 1300 -1.489885081652992e+02 +1504 1301 -1.767605489846857e+02 +1504 1302 -2.123577731150849e+02 +1504 1303 -2.525366109215767e+02 +1504 1304 -2.895745815575320e+02 +1504 1305 -3.124380547854544e+02 +1504 1360 -3.063876713483004e+02 +1504 1361 -3.311617365195747e+02 +1504 1362 -3.859179776157605e+02 +1504 1363 -4.819366867771664e+02 +1504 1364 -6.371952057562402e+02 +1504 1365 -8.726231103602357e+02 +1504 1366 -1.193932486839834e+03 +1504 1367 -1.550121445008505e+03 +1504 1368 -1.802596433195456e+03 +1504 1639 -3.063876713483004e+02 +1504 1640 -2.841326260213855e+02 +1504 1641 -2.480403651673271e+02 +1504 1642 -2.088271183655457e+02 +1504 1643 -1.740274317161707e+02 +1504 1644 -1.468355065336023e+02 +1504 1645 -1.275984131219179e+02 +1504 1646 -1.155304899028561e+02 +1504 1647 -1.097534196790493e+02 +1505 1297 -1.057061586526018e+02 +1505 1298 -1.111842160419089e+02 +1505 1299 -1.226088998409724e+02 +1505 1300 -1.407716848553628e+02 +1505 1301 -1.663510232448633e+02 +1505 1302 -1.989422168423268e+02 +1505 1303 -2.354925657825773e+02 +1505 1304 -2.689865983609317e+02 +1505 1305 -2.895745815575320e+02 +1505 1360 -2.841326260213855e+02 +1505 1361 -3.063876713483004e+02 +1505 1362 -3.553280674768354e+02 +1505 1363 -4.404031329187411e+02 +1505 1364 -5.762343277298867e+02 +1505 1365 -7.788097592344268e+02 +1505 1366 -1.049909849375148e+03 +1505 1367 -1.344510568096302e+03 +1505 1368 -1.550121445008505e+03 +1505 1639 -3.311617365195747e+02 +1505 1640 -3.063876713483004e+02 +1505 1641 -2.663884709281895e+02 +1505 1642 -2.231981844606894e+02 +1505 1643 -1.851243485745373e+02 +1505 1644 -1.555580782497810e+02 +1505 1645 -1.347481526436478e+02 +1505 1646 -1.217424124188383e+02 +1505 1647 -1.155304899028561e+02 +1506 1297 -9.638822517401589e+01 +1506 1298 -1.011961191083175e+02 +1506 1299 -1.111842160419089e+02 +1506 1300 -1.269615920628681e+02 +1506 1301 -1.489885081652992e+02 +1506 1302 -1.767605489846857e+02 +1506 1303 -2.075588680195229e+02 +1506 1304 -2.354925657825773e+02 +1506 1305 -2.525366109215767e+02 +1506 1360 -2.480403651673271e+02 +1506 1361 -2.663884709281895e+02 +1506 1362 -3.063876713483004e+02 +1506 1363 -3.748904053829385e+02 +1506 1364 -4.819366867771664e+02 +1506 1365 -6.371952057562402e+02 +1506 1366 -8.383319685358435e+02 +1506 1367 -1.049909849375148e+03 +1506 1368 -1.193932486839834e+03 +1506 1639 -3.859179776157605e+02 +1506 1640 -3.553280674768354e+02 +1506 1641 -3.063876713483004e+02 +1506 1642 -2.542062119667738e+02 +1506 1643 -2.088271183655457e+02 +1506 1644 -1.740274317161707e+02 +1506 1645 -1.497853840269160e+02 +1506 1646 -1.347481526436478e+02 +1506 1647 -1.275984131219179e+02 +1507 1297 -8.555928471614156e+01 +1507 1298 -8.962181586287889e+01 +1507 1299 -9.802102195827720e+01 +1507 1300 -1.111842160419089e+02 +1507 1301 -1.293661657908652e+02 +1507 1302 -1.519993633210930e+02 +1507 1303 -1.767605489846857e+02 +1507 1304 -1.989422168423268e+02 +1507 1305 -2.123577731150849e+02 +1507 1360 -2.088271183655457e+02 +1507 1361 -2.231981844606894e+02 +1507 1362 -2.542062119667738e+02 +1507 1363 -3.063876713483004e+02 +1507 1364 -3.859179776157605e+02 +1507 1365 -4.976453857371607e+02 +1507 1366 -6.371952057562402e+02 +1507 1367 -7.788097592344268e+02 +1507 1368 -8.726231103602357e+02 +1507 1639 -4.819366867771664e+02 +1507 1640 -4.404031329187411e+02 +1507 1641 -3.748904053829385e+02 +1507 1642 -3.063876713483004e+02 +1507 1643 -2.480403651673271e+02 +1507 1644 -2.041390437321793e+02 +1507 1645 -1.740274317161707e+02 +1507 1646 -1.555580782497810e+02 +1507 1647 -1.468355065336023e+02 +1508 1297 -7.520762033775921e+01 +1508 1298 -7.859349409841370e+01 +1508 1299 -8.555928471614156e+01 +1508 1300 -9.638822517401589e+01 +1508 1301 -1.111842160419089e+02 +1508 1302 -1.293661657908652e+02 +1508 1303 -1.489885081652992e+02 +1508 1304 -1.663510232448633e+02 +1508 1305 -1.767605489846857e+02 +1508 1360 -1.740274317161707e+02 +1508 1361 -1.851243485745373e+02 +1508 1362 -2.088271183655457e+02 +1508 1363 -2.480403651673271e+02 +1508 1364 -3.063876713483004e+02 +1508 1365 -3.859179776157605e+02 +1508 1366 -4.819366867771664e+02 +1508 1367 -5.762343277298867e+02 +1508 1368 -6.371952057562402e+02 +1508 1639 -6.371952057562402e+02 +1508 1640 -5.762343277298867e+02 +1508 1641 -4.819366867771664e+02 +1508 1642 -3.859179776157605e+02 +1508 1643 -3.063876713483004e+02 +1508 1644 -2.480403651673271e+02 +1508 1645 -2.088271183655457e+02 +1508 1646 -1.851243485745373e+02 +1508 1647 -1.740274317161707e+02 +1509 1297 -6.652797451218323e+01 +1509 1298 -6.937545782864687e+01 +1509 1299 -7.520762033775921e+01 +1509 1300 -8.420868002944904e+01 +1509 1301 -9.638822517401589e+01 +1509 1302 -1.111842160419089e+02 +1509 1303 -1.269615920628681e+02 +1509 1304 -1.407716848553628e+02 +1509 1305 -1.489885081652992e+02 +1509 1360 -1.468355065336023e+02 +1509 1361 -1.555580782497810e+02 +1509 1362 -1.740274317161707e+02 +1509 1363 -2.041390437321793e+02 +1509 1364 -2.480403651673271e+02 +1509 1365 -3.063876713483004e+02 +1509 1366 -3.748904053829385e+02 +1509 1367 -4.404031329187411e+02 +1509 1368 -4.819366867771664e+02 +1509 1639 -8.726231103602357e+02 +1509 1640 -7.788097592344268e+02 +1509 1641 -6.371952057562402e+02 +1509 1642 -4.976453857371607e+02 +1509 1643 -3.859179776157605e+02 +1509 1644 -3.063876713483004e+02 +1509 1645 -2.542062119667738e+02 +1509 1646 -2.231981844606894e+02 +1509 1647 -2.088271183655457e+02 +1510 1297 -6.001174723167335e+01 +1510 1298 -6.247361649834824e+01 +1510 1299 -6.749803222962952e+01 +1510 1300 -7.520762033775921e+01 +1510 1301 -8.555928471614156e+01 +1510 1302 -9.802102195827720e+01 +1510 1303 -1.111842160419089e+02 +1510 1304 -1.226088998409724e+02 +1510 1305 -1.293661657908652e+02 +1510 1360 -1.275984131219179e+02 +1510 1361 -1.347481526436478e+02 +1510 1362 -1.497853840269160e+02 +1510 1363 -1.740274317161707e+02 +1510 1364 -2.088271183655457e+02 +1510 1365 -2.542062119667738e+02 +1510 1366 -3.063876713483004e+02 +1510 1367 -3.553280674768354e+02 +1510 1368 -3.859179776157605e+02 +1510 1639 -1.193932486839834e+03 +1510 1640 -1.049909849375148e+03 +1510 1641 -8.383319685358435e+02 +1510 1642 -6.371952057562402e+02 +1510 1643 -4.819366867771664e+02 +1510 1644 -3.748904053829385e+02 +1510 1645 -3.063876713483004e+02 +1510 1646 -2.663884709281895e+02 +1510 1647 -2.480403651673271e+02 +1511 1297 -5.573941364116940e+01 +1511 1298 -5.795761808209202e+01 +1511 1299 -6.247361649834824e+01 +1511 1300 -6.937545782864687e+01 +1511 1301 -7.859349409841370e+01 +1511 1302 -8.962181586287889e+01 +1511 1303 -1.011961191083175e+02 +1511 1304 -1.111842160419089e+02 +1511 1305 -1.170681125153376e+02 +1511 1360 -1.155304899028561e+02 +1511 1361 -1.217424124188383e+02 +1511 1362 -1.347481526436478e+02 +1511 1363 -1.555580782497810e+02 +1511 1364 -1.851243485745373e+02 +1511 1365 -2.231981844606894e+02 +1511 1366 -2.663884709281895e+02 +1511 1367 -3.063876713483004e+02 +1511 1368 -3.311617365195747e+02 +1511 1639 -1.550121445008505e+03 +1511 1640 -1.344510568096302e+03 +1511 1641 -1.049909849375148e+03 +1511 1642 -7.788097592344268e+02 +1511 1643 -5.762343277298867e+02 +1511 1644 -4.404031329187411e+02 +1511 1645 -3.553280674768354e+02 +1511 1646 -3.063876713483004e+02 +1511 1647 -2.841326260213855e+02 +1512 1297 -5.363826960242956e+01 +1512 1298 -5.573941364116940e+01 +1512 1299 -6.001174723167335e+01 +1512 1300 -6.652797451218323e+01 +1512 1301 -7.520762033775921e+01 +1512 1302 -8.555928471614156e+01 +1512 1303 -9.638822517401589e+01 +1512 1304 -1.057061586526018e+02 +1512 1305 -1.111842160419089e+02 +1512 1360 -1.097534196790493e+02 +1512 1361 -1.155304899028561e+02 +1512 1362 -1.275984131219179e+02 +1512 1363 -1.468355065336023e+02 +1512 1364 -1.740274317161707e+02 +1512 1365 -2.088271183655457e+02 +1512 1366 -2.480403651673271e+02 +1512 1367 -2.841326260213855e+02 +1512 1368 -3.063876713483004e+02 +1512 1639 -1.802596433195456e+03 +1512 1640 -1.550121445008505e+03 +1512 1641 -1.193932486839834e+03 +1512 1642 -8.726231103602357e+02 +1512 1643 -6.371952057562402e+02 +1512 1644 -4.819366867771664e+02 +1512 1645 -3.859179776157605e+02 +1512 1646 -3.311617365195747e+02 +1512 1647 -3.063876713483004e+02 +1513 1450 -1.733190400658708e+03 +1513 1451 -1.877824568765017e+03 +1513 1452 -2.199157547087201e+03 +1513 1453 -2.767706810094291e+03 +1513 1454 -3.699147964795180e+03 +1513 1455 -5.136224430633882e+03 +1513 1456 -7.138491575686282e+03 +1513 1457 -9.405703259334639e+03 +1513 1458 -1.103972130715926e+04 +1513 1585 -1.733190400658708e+03 +1513 1586 -1.603684467943633e+03 +1513 1587 -1.394551574360510e+03 +1513 1588 -1.168677565678393e+03 +1513 1589 -9.695072463564434e+02 +1513 1590 -8.148024630667926e+02 +1513 1591 -7.058924559832867e+02 +1513 1592 -6.378158089920671e+02 +1513 1593 -6.052974323170196e+02 +1513 1612 -6.289529049931513e+02 +1513 1613 -5.970589583440825e+02 +1513 1614 -5.429674662554822e+02 +1513 1615 -4.803677035258846e+02 +1513 1616 -4.208084537187713e+02 +1513 1617 -3.710963518270331e+02 +1513 1618 -3.339204550667988e+02 +1513 1619 -3.096178268240465e+02 +1513 1620 -2.976873911031298e+02 +1514 1450 -1.603684467943633e+03 +1514 1451 -1.733190400658708e+03 +1514 1452 -2.019368486704435e+03 +1514 1453 -2.521021940438000e+03 +1514 1454 -3.331754877699595e+03 +1514 1455 -4.560278038130823e+03 +1514 1456 -6.235592529048601e+03 +1514 1457 -8.091232579773156e+03 +1514 1458 -9.405703259334639e+03 +1514 1585 -1.877824568765017e+03 +1514 1586 -1.733190400658708e+03 +1514 1587 -1.500725861549673e+03 +1514 1588 -1.251286952144484e+03 +1514 1589 -1.032880208377977e+03 +1514 1590 -8.643348602446076e+02 +1514 1591 -7.463158073460687e+02 +1514 1592 -6.728335244699299e+02 +1514 1593 -6.378158089920671e+02 +1514 1612 -6.632839990295113e+02 +1514 1613 -6.289529049931513e+02 +1514 1614 -5.708523475060541e+02 +1514 1615 -5.038180997021789e+02 +1514 1616 -4.402579127124382e+02 +1514 1617 -3.873813675510144e+02 +1514 1618 -3.479505460244110e+02 +1514 1619 -3.222285372305477e+02 +1514 1620 -3.096178268240465e+02 +1515 1450 -1.394551574360510e+03 +1515 1451 -1.500725861549673e+03 +1515 1452 -1.733190400658708e+03 +1515 1453 -2.134265778758326e+03 +1515 1454 -2.767706810094291e+03 +1515 1455 -3.699147964795180e+03 +1515 1456 -4.925216936196723e+03 +1515 1457 -6.235592529048601e+03 +1515 1458 -7.138491575686282e+03 +1515 1585 -2.199157547087201e+03 +1515 1586 -2.019368486704435e+03 +1515 1587 -1.733190400658708e+03 +1515 1588 -1.430197816180122e+03 +1515 1589 -1.168677565678393e+03 +1515 1590 -9.695072463564434e+02 +1515 1591 -8.315436028021828e+02 +1515 1592 -7.463158073460687e+02 +1515 1593 -7.058924559832867e+02 +1515 1612 -7.352796046183681e+02 +1515 1613 -6.956816209337401e+02 +1515 1614 -6.289529049931513e+02 +1515 1615 -5.524312223207850e+02 +1515 1616 -4.803677035258846e+02 +1515 1617 -4.208084537187713e+02 +1515 1618 -3.766415408901786e+02 +1515 1619 -3.479505460244110e+02 +1515 1620 -3.339204550667988e+02 +1516 1450 -1.168677565678393e+03 +1516 1451 -1.251286952144484e+03 +1516 1452 -1.430197816180122e+03 +1516 1453 -1.733190400658708e+03 +1516 1454 -2.199157547087201e+03 +1516 1455 -2.861294172280346e+03 +1516 1456 -3.699147964795180e+03 +1516 1457 -4.560278038130823e+03 +1516 1458 -5.136224430633882e+03 +1516 1585 -2.767706810094291e+03 +1516 1586 -2.521021940438000e+03 +1516 1587 -2.134265778758326e+03 +1516 1588 -1.733190400658708e+03 +1516 1589 -1.394551574360510e+03 +1516 1590 -1.141773184361042e+03 +1516 1591 -9.695072463564434e+02 +1516 1592 -8.643348602446076e+02 +1516 1593 -8.148024630667926e+02 +1516 1612 -8.507888885505199e+02 +1516 1613 -8.023274760830675e+02 +1516 1614 -7.211778000851799e+02 +1516 1615 -6.289529049931513e+02 +1516 1616 -5.429674662554822e+02 +1516 1617 -4.725808574370885e+02 +1516 1618 -4.208084537187713e+02 +1516 1619 -3.873813675510144e+02 +1516 1620 -3.710963518270331e+02 +1517 1450 -9.695072463564434e+02 +1517 1451 -1.032880208377977e+03 +1517 1452 -1.168677565678393e+03 +1517 1453 -1.394551574360510e+03 +1517 1454 -1.733190400658708e+03 +1517 1455 -2.199157547087201e+03 +1517 1456 -2.767706810094291e+03 +1517 1457 -3.331754877699595e+03 +1517 1458 -3.699147964795180e+03 +1517 1585 -3.699147964795180e+03 +1517 1586 -3.331754877699595e+03 +1517 1587 -2.767706810094291e+03 +1517 1588 -2.199157547087201e+03 +1517 1589 -1.733190400658708e+03 +1517 1590 -1.394551574360510e+03 +1517 1591 -1.168677565678393e+03 +1517 1592 -1.032880208377977e+03 +1517 1593 -9.695072463564434e+02 +1517 1612 -1.015511306612467e+03 +1517 1613 -9.536070604341750e+02 +1517 1614 -8.507888885505199e+02 +1517 1615 -7.352796046183681e+02 +1517 1616 -6.289529049931513e+02 +1517 1617 -5.429674662554822e+02 +1517 1618 -4.803677035258846e+02 +1517 1619 -4.402579127124382e+02 +1517 1620 -4.208084537187713e+02 +1518 1450 -8.148024630667926e+02 +1518 1451 -8.643348602446076e+02 +1518 1452 -9.695072463564434e+02 +1518 1453 -1.141773184361042e+03 +1518 1454 -1.394551574360510e+03 +1518 1455 -1.733190400658708e+03 +1518 1456 -2.134265778758326e+03 +1518 1457 -2.521021940438000e+03 +1518 1458 -2.767706810094291e+03 +1518 1585 -5.136224430633882e+03 +1518 1586 -4.560278038130823e+03 +1518 1587 -3.699147964795180e+03 +1518 1588 -2.861294172280346e+03 +1518 1589 -2.199157547087201e+03 +1518 1590 -1.733190400658708e+03 +1518 1591 -1.430197816180122e+03 +1518 1592 -1.251286952144484e+03 +1518 1593 -1.168677565678393e+03 +1518 1612 -1.228588660544053e+03 +1518 1613 -1.148042053110080e+03 +1518 1614 -1.015511306612467e+03 +1518 1615 -8.685786765383800e+02 +1518 1616 -7.352796046183681e+02 +1518 1617 -6.289529049931513e+02 +1518 1618 -5.524312223207850e+02 +1518 1619 -5.038180997021789e+02 +1518 1620 -4.803677035258846e+02 +1519 1450 -7.058924559832867e+02 +1519 1451 -7.463158073460687e+02 +1519 1452 -8.315436028021828e+02 +1519 1453 -9.695072463564434e+02 +1519 1454 -1.168677565678393e+03 +1519 1455 -1.430197816180122e+03 +1519 1456 -1.733190400658708e+03 +1519 1457 -2.019368486704435e+03 +1519 1458 -2.199157547087201e+03 +1519 1585 -7.138491575686282e+03 +1519 1586 -6.235592529048601e+03 +1519 1587 -4.925216936196723e+03 +1519 1588 -3.699147964795180e+03 +1519 1589 -2.767706810094291e+03 +1519 1590 -2.134265778758326e+03 +1519 1591 -1.733190400658708e+03 +1519 1592 -1.500725861549673e+03 +1519 1593 -1.394551574360510e+03 +1519 1612 -1.471477730866027e+03 +1519 1613 -1.368148367306964e+03 +1519 1614 -1.199743197084304e+03 +1519 1615 -1.015511306612467e+03 +1519 1616 -8.507888885505199e+02 +1519 1617 -7.211778000851799e+02 +1519 1618 -6.289529049931513e+02 +1519 1619 -5.708523475060541e+02 +1519 1620 -5.429674662554822e+02 +1520 1450 -6.378158089920671e+02 +1520 1451 -6.728335244699299e+02 +1520 1452 -7.463158073460687e+02 +1520 1453 -8.643348602446076e+02 +1520 1454 -1.032880208377977e+03 +1520 1455 -1.251286952144484e+03 +1520 1456 -1.500725861549673e+03 +1520 1457 -1.733190400658708e+03 +1520 1458 -1.877824568765017e+03 +1520 1585 -9.405703259334639e+03 +1520 1586 -8.091232579773156e+03 +1520 1587 -6.235592529048601e+03 +1520 1588 -4.560278038130823e+03 +1520 1589 -3.331754877699595e+03 +1520 1590 -2.521021940438000e+03 +1520 1591 -2.019368486704435e+03 +1520 1592 -1.733190400658708e+03 +1520 1593 -1.603684467943633e+03 +1520 1612 -1.697437739078449e+03 +1520 1613 -1.571600895131404e+03 +1520 1614 -1.368148367306964e+03 +1520 1615 -1.148042053110080e+03 +1520 1616 -9.536070604341750e+02 +1520 1617 -8.023274760830675e+02 +1520 1618 -6.956816209337401e+02 +1520 1619 -6.289529049931513e+02 +1520 1620 -5.970589583440825e+02 +1521 1450 -6.052974323170196e+02 +1521 1451 -6.378158089920671e+02 +1521 1452 -7.058924559832867e+02 +1521 1453 -8.148024630667926e+02 +1521 1454 -9.695072463564434e+02 +1521 1455 -1.168677565678393e+03 +1521 1456 -1.394551574360510e+03 +1521 1457 -1.603684467943633e+03 +1521 1458 -1.733190400658708e+03 +1521 1585 -1.103972130715926e+04 +1521 1586 -9.405703259334639e+03 +1521 1587 -7.138491575686282e+03 +1521 1588 -5.136224430633882e+03 +1521 1589 -3.699147964795180e+03 +1521 1590 -2.767706810094291e+03 +1521 1591 -2.199157547087201e+03 +1521 1592 -1.877824568765017e+03 +1521 1593 -1.733190400658708e+03 +1521 1612 -1.837845240586539e+03 +1521 1613 -1.697437739078449e+03 +1521 1614 -1.471477730866027e+03 +1521 1615 -1.228588660544053e+03 +1521 1616 -1.015511306612467e+03 +1521 1617 -8.507888885505199e+02 +1521 1618 -7.352796046183681e+02 +1521 1619 -6.632839990295113e+02 +1521 1620 -6.289529049931513e+02 +1540 1450 -6.289529049931513e+02 +1540 1451 -6.632839990295113e+02 +1540 1452 -7.352796046183681e+02 +1540 1453 -8.507888885505199e+02 +1540 1454 -1.015511306612467e+03 +1540 1455 -1.228588660544053e+03 +1540 1456 -1.471477730866027e+03 +1540 1457 -1.697437739078449e+03 +1540 1458 -1.837845240586539e+03 +1540 1477 -1.733190400658708e+03 +1540 1478 -1.877824568765017e+03 +1540 1479 -2.199157547087201e+03 +1540 1480 -2.767706810094291e+03 +1540 1481 -3.699147964795180e+03 +1540 1482 -5.136224430633882e+03 +1540 1483 -7.138491575686282e+03 +1540 1484 -9.405703259334639e+03 +1540 1485 -1.103972130715926e+04 +1540 1612 -1.733190400658708e+03 +1540 1613 -1.603684467943633e+03 +1540 1614 -1.394551574360510e+03 +1540 1615 -1.168677565678393e+03 +1540 1616 -9.695072463564434e+02 +1540 1617 -8.148024630667926e+02 +1540 1618 -7.058924559832867e+02 +1540 1619 -6.378158089920671e+02 +1540 1620 -6.052974323170196e+02 +1541 1450 -5.970589583440825e+02 +1541 1451 -6.289529049931513e+02 +1541 1452 -6.956816209337401e+02 +1541 1453 -8.023274760830675e+02 +1541 1454 -9.536070604341750e+02 +1541 1455 -1.148042053110080e+03 +1541 1456 -1.368148367306964e+03 +1541 1457 -1.571600895131404e+03 +1541 1458 -1.697437739078449e+03 +1541 1477 -1.603684467943633e+03 +1541 1478 -1.733190400658708e+03 +1541 1479 -2.019368486704435e+03 +1541 1480 -2.521021940438000e+03 +1541 1481 -3.331754877699595e+03 +1541 1482 -4.560278038130823e+03 +1541 1483 -6.235592529048601e+03 +1541 1484 -8.091232579773156e+03 +1541 1485 -9.405703259334639e+03 +1541 1612 -1.877824568765017e+03 +1541 1613 -1.733190400658708e+03 +1541 1614 -1.500725861549673e+03 +1541 1615 -1.251286952144484e+03 +1541 1616 -1.032880208377977e+03 +1541 1617 -8.643348602446076e+02 +1541 1618 -7.463158073460687e+02 +1541 1619 -6.728335244699299e+02 +1541 1620 -6.378158089920671e+02 +1542 1450 -5.429674662554822e+02 +1542 1451 -5.708523475060541e+02 +1542 1452 -6.289529049931513e+02 +1542 1453 -7.211778000851799e+02 +1542 1454 -8.507888885505199e+02 +1542 1455 -1.015511306612467e+03 +1542 1456 -1.199743197084304e+03 +1542 1457 -1.368148367306964e+03 +1542 1458 -1.471477730866027e+03 +1542 1477 -1.394551574360510e+03 +1542 1478 -1.500725861549673e+03 +1542 1479 -1.733190400658708e+03 +1542 1480 -2.134265778758326e+03 +1542 1481 -2.767706810094291e+03 +1542 1482 -3.699147964795180e+03 +1542 1483 -4.925216936196723e+03 +1542 1484 -6.235592529048601e+03 +1542 1485 -7.138491575686282e+03 +1542 1612 -2.199157547087201e+03 +1542 1613 -2.019368486704435e+03 +1542 1614 -1.733190400658708e+03 +1542 1615 -1.430197816180122e+03 +1542 1616 -1.168677565678393e+03 +1542 1617 -9.695072463564434e+02 +1542 1618 -8.315436028021828e+02 +1542 1619 -7.463158073460687e+02 +1542 1620 -7.058924559832867e+02 +1543 1450 -4.803677035258846e+02 +1543 1451 -5.038180997021789e+02 +1543 1452 -5.524312223207850e+02 +1543 1453 -6.289529049931513e+02 +1543 1454 -7.352796046183681e+02 +1543 1455 -8.685786765383800e+02 +1543 1456 -1.015511306612467e+03 +1543 1457 -1.148042053110080e+03 +1543 1458 -1.228588660544053e+03 +1543 1477 -1.168677565678393e+03 +1543 1478 -1.251286952144484e+03 +1543 1479 -1.430197816180122e+03 +1543 1480 -1.733190400658708e+03 +1543 1481 -2.199157547087201e+03 +1543 1482 -2.861294172280346e+03 +1543 1483 -3.699147964795180e+03 +1543 1484 -4.560278038130823e+03 +1543 1485 -5.136224430633882e+03 +1543 1612 -2.767706810094291e+03 +1543 1613 -2.521021940438000e+03 +1543 1614 -2.134265778758326e+03 +1543 1615 -1.733190400658708e+03 +1543 1616 -1.394551574360510e+03 +1543 1617 -1.141773184361042e+03 +1543 1618 -9.695072463564434e+02 +1543 1619 -8.643348602446076e+02 +1543 1620 -8.148024630667926e+02 +1544 1450 -4.208084537187713e+02 +1544 1451 -4.402579127124382e+02 +1544 1452 -4.803677035258846e+02 +1544 1453 -5.429674662554822e+02 +1544 1454 -6.289529049931513e+02 +1544 1455 -7.352796046183681e+02 +1544 1456 -8.507888885505199e+02 +1544 1457 -9.536070604341750e+02 +1544 1458 -1.015511306612467e+03 +1544 1477 -9.695072463564434e+02 +1544 1478 -1.032880208377977e+03 +1544 1479 -1.168677565678393e+03 +1544 1480 -1.394551574360510e+03 +1544 1481 -1.733190400658708e+03 +1544 1482 -2.199157547087201e+03 +1544 1483 -2.767706810094291e+03 +1544 1484 -3.331754877699595e+03 +1544 1485 -3.699147964795180e+03 +1544 1612 -3.699147964795180e+03 +1544 1613 -3.331754877699595e+03 +1544 1614 -2.767706810094291e+03 +1544 1615 -2.199157547087201e+03 +1544 1616 -1.733190400658708e+03 +1544 1617 -1.394551574360510e+03 +1544 1618 -1.168677565678393e+03 +1544 1619 -1.032880208377977e+03 +1544 1620 -9.695072463564434e+02 +1545 1450 -3.710963518270331e+02 +1545 1451 -3.873813675510144e+02 +1545 1452 -4.208084537187713e+02 +1545 1453 -4.725808574370885e+02 +1545 1454 -5.429674662554822e+02 +1545 1455 -6.289529049931513e+02 +1545 1456 -7.211778000851799e+02 +1545 1457 -8.023274760830675e+02 +1545 1458 -8.507888885505199e+02 +1545 1477 -8.148024630667926e+02 +1545 1478 -8.643348602446076e+02 +1545 1479 -9.695072463564434e+02 +1545 1480 -1.141773184361042e+03 +1545 1481 -1.394551574360510e+03 +1545 1482 -1.733190400658708e+03 +1545 1483 -2.134265778758326e+03 +1545 1484 -2.521021940438000e+03 +1545 1485 -2.767706810094291e+03 +1545 1612 -5.136224430633882e+03 +1545 1613 -4.560278038130823e+03 +1545 1614 -3.699147964795180e+03 +1545 1615 -2.861294172280346e+03 +1545 1616 -2.199157547087201e+03 +1545 1617 -1.733190400658708e+03 +1545 1618 -1.430197816180122e+03 +1545 1619 -1.251286952144484e+03 +1545 1620 -1.168677565678393e+03 +1546 1450 -3.339204550667988e+02 +1546 1451 -3.479505460244110e+02 +1546 1452 -3.766415408901786e+02 +1546 1453 -4.208084537187713e+02 +1546 1454 -4.803677035258846e+02 +1546 1455 -5.524312223207850e+02 +1546 1456 -6.289529049931513e+02 +1546 1457 -6.956816209337401e+02 +1546 1458 -7.352796046183681e+02 +1546 1477 -7.058924559832867e+02 +1546 1478 -7.463158073460687e+02 +1546 1479 -8.315436028021828e+02 +1546 1480 -9.695072463564434e+02 +1546 1481 -1.168677565678393e+03 +1546 1482 -1.430197816180122e+03 +1546 1483 -1.733190400658708e+03 +1546 1484 -2.019368486704435e+03 +1546 1485 -2.199157547087201e+03 +1546 1612 -7.138491575686282e+03 +1546 1613 -6.235592529048601e+03 +1546 1614 -4.925216936196723e+03 +1546 1615 -3.699147964795180e+03 +1546 1616 -2.767706810094291e+03 +1546 1617 -2.134265778758326e+03 +1546 1618 -1.733190400658708e+03 +1546 1619 -1.500725861549673e+03 +1546 1620 -1.394551574360510e+03 +1547 1450 -3.096178268240465e+02 +1547 1451 -3.222285372305477e+02 +1547 1452 -3.479505460244110e+02 +1547 1453 -3.873813675510144e+02 +1547 1454 -4.402579127124382e+02 +1547 1455 -5.038180997021789e+02 +1547 1456 -5.708523475060541e+02 +1547 1457 -6.289529049931513e+02 +1547 1458 -6.632839990295113e+02 +1547 1477 -6.378158089920671e+02 +1547 1478 -6.728335244699299e+02 +1547 1479 -7.463158073460687e+02 +1547 1480 -8.643348602446076e+02 +1547 1481 -1.032880208377977e+03 +1547 1482 -1.251286952144484e+03 +1547 1483 -1.500725861549673e+03 +1547 1484 -1.733190400658708e+03 +1547 1485 -1.877824568765017e+03 +1547 1612 -9.405703259334639e+03 +1547 1613 -8.091232579773156e+03 +1547 1614 -6.235592529048601e+03 +1547 1615 -4.560278038130823e+03 +1547 1616 -3.331754877699595e+03 +1547 1617 -2.521021940438000e+03 +1547 1618 -2.019368486704435e+03 +1547 1619 -1.733190400658708e+03 +1547 1620 -1.603684467943633e+03 +1548 1450 -2.976873911031298e+02 +1548 1451 -3.096178268240465e+02 +1548 1452 -3.339204550667988e+02 +1548 1453 -3.710963518270331e+02 +1548 1454 -4.208084537187713e+02 +1548 1455 -4.803677035258846e+02 +1548 1456 -5.429674662554822e+02 +1548 1457 -5.970589583440825e+02 +1548 1458 -6.289529049931513e+02 +1548 1477 -6.052974323170196e+02 +1548 1478 -6.378158089920671e+02 +1548 1479 -7.058924559832867e+02 +1548 1480 -8.148024630667926e+02 +1548 1481 -9.695072463564434e+02 +1548 1482 -1.168677565678393e+03 +1548 1483 -1.394551574360510e+03 +1548 1484 -1.603684467943633e+03 +1548 1485 -1.733190400658708e+03 +1548 1612 -1.103972130715926e+04 +1548 1613 -9.405703259334639e+03 +1548 1614 -7.138491575686282e+03 +1548 1615 -5.136224430633882e+03 +1548 1616 -3.699147964795180e+03 +1548 1617 -2.767706810094291e+03 +1548 1618 -2.199157547087201e+03 +1548 1619 -1.877824568765017e+03 +1548 1620 -1.733190400658708e+03 +1567 1153 -1.965477828103598e+01 +1567 1154 -2.067858569511584e+01 +1567 1155 -2.281491025526307e+01 +1567 1156 -2.621419542240643e+01 +1567 1157 -3.100728135248165e+01 +1567 1158 -3.712309913086538e+01 +1567 1159 -4.399251628020367e+01 +1567 1160 -5.029652653878190e+01 +1567 1161 -5.417542964960961e+01 +1567 1288 -5.416220002058462e+01 +1567 1289 -5.847168336242214e+01 +1567 1290 -6.797204698756184e+01 +1567 1291 -8.455751811575986e+01 +1567 1292 -1.112023202068744e+02 +1567 1293 -1.512628164030906e+02 +1567 1294 -2.053883607687489e+02 +1567 1295 -2.647767438527630e+02 +1567 1296 -3.065373731090118e+02 +1567 1855 -5.416220002058462e+01 +1567 1856 -5.028460369863171e+01 +1567 1857 -4.398263164573866e+01 +1567 1858 -3.711530555640490e+01 +1567 1859 -3.100122392289864e+01 +1567 1860 -2.620940698061742e+01 +1567 1861 -2.281096793104268e+01 +1567 1862 -2.067515029553633e+01 +1567 1863 -1.965157861598590e+01 +1568 1153 -1.870055440211151e+01 +1568 1154 -1.965477828103598e+01 +1568 1155 -2.164167292784031e+01 +1568 1156 -2.479209926714913e+01 +1568 1157 -2.921308657465229e+01 +1568 1158 -3.482168460593341e+01 +1568 1159 -4.108257963331437e+01 +1568 1160 -4.679557686118159e+01 +1568 1161 -5.029652653878190e+01 +1568 1288 -5.028460369863171e+01 +1568 1289 -5.416220002058462e+01 +1568 1290 -6.266865647386096e+01 +1568 1291 -7.739429142416682e+01 +1568 1292 -1.007640600234616e+02 +1568 1293 -1.353445496343036e+02 +1568 1294 -1.811983282511275e+02 +1568 1295 -2.305668762810884e+02 +1568 1296 -2.647767438527630e+02 +1568 1855 -5.847168336242214e+01 +1568 1856 -5.416220002058462e+01 +1568 1857 -4.718848846240646e+01 +1568 1858 -3.963467701820890e+01 +1568 1859 -3.295302401855845e+01 +1568 1860 -2.774798050936779e+01 +1568 1861 -2.407490908992506e+01 +1568 1862 -2.177494503977683e+01 +1568 1863 -2.067515029553633e+01 +1569 1153 -1.707507926940499e+01 +1569 1154 -1.791417887437397e+01 +1569 1155 -1.965477828103598e+01 +1569 1156 -2.239757409043196e+01 +1569 1157 -2.621419542240647e+01 +1569 1158 -3.100728135248171e+01 +1569 1159 -3.630032063351624e+01 +1569 1160 -4.108257963331437e+01 +1569 1161 -4.399251628020367e+01 +1569 1288 -4.398263164573866e+01 +1569 1289 -4.718848846240646e+01 +1569 1290 -5.416220002058462e+01 +1569 1291 -6.606134132672688e+01 +1569 1292 -8.455751811576010e+01 +1569 1293 -1.112023202068747e+02 +1569 1294 -1.454508347890311e+02 +1569 1295 -1.811983282511275e+02 +1569 1296 -2.053883607687489e+02 +1569 1855 -6.797204698756184e+01 +1569 1856 -6.266865647386096e+01 +1569 1857 -5.416220002058462e+01 +1569 1858 -4.506046026496942e+01 +1569 1859 -3.711530555640482e+01 +1569 1860 -3.100122392289858e+01 +1569 1861 -2.672989532903555e+01 +1569 1862 -2.407490908992506e+01 +1569 1863 -2.281096793104268e+01 +1570 1153 -1.518203609416468e+01 +1570 1154 -1.589274010473518e+01 +1570 1155 -1.736013665098131e+01 +1570 1156 -1.965477828103598e+01 +1570 1157 -2.281491025526310e+01 +1570 1158 -2.673481743251412e+01 +1570 1159 -3.100728135248171e+01 +1570 1160 -3.482168460593341e+01 +1570 1161 -3.712309913086538e+01 +1570 1288 -3.711530555640490e+01 +1570 1289 -3.963467701820890e+01 +1570 1290 -4.506046026496942e+01 +1570 1291 -5.416220002058462e+01 +1570 1292 -6.797204698756201e+01 +1570 1293 -8.726265053974967e+01 +1570 1294 -1.112023202068747e+02 +1570 1295 -1.353445496343036e+02 +1570 1296 -1.512628164030906e+02 +1570 1855 -8.455751811575986e+01 +1570 1856 -7.739429142416682e+01 +1570 1857 -6.606134132672688e+01 +1570 1858 -5.416220002058462e+01 +1570 1859 -4.398263164573857e+01 +1570 1860 -3.629276779865588e+01 +1570 1861 -3.100122392289858e+01 +1570 1862 -2.774798050936779e+01 +1570 1863 -2.620940698061742e+01 +1571 1153 -1.336813651340294e+01 +1571 1154 -1.396191802264486e+01 +1571 1155 -1.518203609416466e+01 +1571 1156 -1.707507926940496e+01 +1571 1157 -1.965477828103598e+01 +1571 1158 -2.281491025526310e+01 +1571 1159 -2.621419542240647e+01 +1571 1160 -2.921308657465229e+01 +1571 1161 -3.100728135248165e+01 +1571 1288 -3.100122392289864e+01 +1571 1289 -3.295302401855845e+01 +1571 1290 -3.711530555640482e+01 +1571 1291 -4.398263164573857e+01 +1571 1292 -5.416220002058462e+01 +1571 1293 -6.797204698756201e+01 +1571 1294 -8.455751811576010e+01 +1571 1295 -1.007640600234616e+02 +1571 1296 -1.112023202068744e+02 +1571 1855 -1.112023202068744e+02 +1571 1856 -1.007640600234616e+02 +1571 1857 -8.455751811576010e+01 +1571 1858 -6.797204698756201e+01 +1571 1859 -5.416220002058462e+01 +1571 1860 -4.398263164573857e+01 +1571 1861 -3.711530555640482e+01 +1571 1862 -3.295302401855845e+01 +1571 1863 -3.100122392289864e+01 +1572 1153 -1.184372960400065e+01 +1572 1154 -1.234420052045069e+01 +1572 1155 -1.336813651340292e+01 +1572 1156 -1.494561758129197e+01 +1572 1157 -1.707507926940496e+01 +1572 1158 -1.965477828103598e+01 +1572 1159 -2.239757409043196e+01 +1572 1160 -2.479209926714913e+01 +1572 1161 -2.621419542240643e+01 +1572 1288 -2.620940698061742e+01 +1572 1289 -2.774798050936779e+01 +1572 1290 -3.100122392289858e+01 +1572 1291 -3.629276779865588e+01 +1572 1292 -4.398263164573857e+01 +1572 1293 -5.416220002058462e+01 +1572 1294 -6.606134132672688e+01 +1572 1295 -7.739429142416682e+01 +1572 1296 -8.455751811575986e+01 +1572 1855 -1.512628164030906e+02 +1572 1856 -1.353445496343036e+02 +1572 1857 -1.112023202068747e+02 +1572 1858 -8.726265053974967e+01 +1572 1859 -6.797204698756201e+01 +1572 1860 -5.416220002058462e+01 +1572 1861 -4.506046026496942e+01 +1572 1862 -3.963467701820890e+01 +1572 1863 -3.711530555640490e+01 +1573 1153 -1.069703031088084e+01 +1573 1154 -1.113049648221346e+01 +1573 1155 -1.201426721054981e+01 +1573 1156 -1.336813651340292e+01 +1573 1157 -1.518203609416466e+01 +1573 1158 -1.736013665098131e+01 +1573 1159 -1.965477828103598e+01 +1573 1160 -2.164167292784031e+01 +1573 1161 -2.281491025526307e+01 +1573 1288 -2.281096793104268e+01 +1573 1289 -2.407490908992506e+01 +1573 1290 -2.672989532903555e+01 +1573 1291 -3.100122392289858e+01 +1573 1292 -3.711530555640482e+01 +1573 1293 -4.506046026496942e+01 +1573 1294 -5.416220002058462e+01 +1573 1295 -6.266865647386096e+01 +1573 1296 -6.797204698756184e+01 +1573 1855 -2.053883607687489e+02 +1573 1856 -1.811983282511275e+02 +1573 1857 -1.454508347890311e+02 +1573 1858 -1.112023202068747e+02 +1573 1859 -8.455751811576010e+01 +1573 1860 -6.606134132672688e+01 +1573 1861 -5.416220002058462e+01 +1573 1862 -4.718848846240646e+01 +1573 1863 -4.398263164573866e+01 +1574 1153 -9.944085360683063e+00 +1574 1154 -1.033512964800000e+01 +1574 1155 -1.113049648221346e+01 +1574 1156 -1.234420052045069e+01 +1574 1157 -1.396191802264486e+01 +1574 1158 -1.589274010473518e+01 +1574 1159 -1.791417887437397e+01 +1574 1160 -1.965477828103598e+01 +1574 1161 -2.067858569511584e+01 +1574 1288 -2.067515029553633e+01 +1574 1289 -2.177494503977683e+01 +1574 1290 -2.407490908992506e+01 +1574 1291 -2.774798050936779e+01 +1574 1292 -3.295302401855845e+01 +1574 1293 -3.963467701820890e+01 +1574 1294 -4.718848846240646e+01 +1574 1295 -5.416220002058462e+01 +1574 1296 -5.847168336242214e+01 +1574 1855 -2.647767438527630e+02 +1574 1856 -2.305668762810884e+02 +1574 1857 -1.811983282511275e+02 +1574 1858 -1.353445496343036e+02 +1574 1859 -1.007640600234616e+02 +1574 1860 -7.739429142416682e+01 +1574 1861 -6.266865647386096e+01 +1574 1862 -5.416220002058462e+01 +1574 1863 -5.028460369863171e+01 +1575 1153 -9.573445684409064e+00 +1575 1154 -9.944085360683063e+00 +1575 1155 -1.069703031088084e+01 +1575 1156 -1.184372960400065e+01 +1575 1157 -1.336813651340294e+01 +1575 1158 -1.518203609416468e+01 +1575 1159 -1.707507926940499e+01 +1575 1160 -1.870055440211151e+01 +1575 1161 -1.965477828103598e+01 +1575 1288 -1.965157861598590e+01 +1575 1289 -2.067515029553633e+01 +1575 1290 -2.281096793104268e+01 +1575 1291 -2.620940698061742e+01 +1575 1292 -3.100122392289864e+01 +1575 1293 -3.711530555640490e+01 +1575 1294 -4.398263164573866e+01 +1575 1295 -5.028460369863171e+01 +1575 1296 -5.416220002058462e+01 +1575 1855 -3.065373731090118e+02 +1575 1856 -2.647767438527630e+02 +1575 1857 -2.053883607687489e+02 +1575 1858 -1.512628164030906e+02 +1575 1859 -1.112023202068744e+02 +1575 1860 -8.455751811575986e+01 +1575 1861 -6.797204698756184e+01 +1575 1862 -5.847168336242214e+01 +1575 1863 -5.416220002058462e+01 +1576 1441 -3.063876713483004e+02 +1576 1442 -3.311617365195747e+02 +1576 1443 -3.859179776157605e+02 +1576 1444 -4.819366867771664e+02 +1576 1445 -6.371952057562402e+02 +1576 1446 -8.726231103602357e+02 +1576 1447 -1.193932486839834e+03 +1576 1448 -1.550121445008505e+03 +1576 1449 -1.802596433195456e+03 +1576 1729 -3.063876713483004e+02 +1576 1730 -2.841326260213855e+02 +1576 1731 -2.480403651673271e+02 +1576 1732 -2.088271183655457e+02 +1576 1733 -1.740274317161707e+02 +1576 1734 -1.468355065336023e+02 +1576 1735 -1.275984131219179e+02 +1576 1736 -1.155304899028561e+02 +1576 1737 -1.097534196790493e+02 +1576 1792 -1.111842160419089e+02 +1576 1793 -1.057061586526018e+02 +1576 1794 -9.638822517401589e+01 +1576 1795 -8.555928471614156e+01 +1576 1796 -7.520762033775921e+01 +1576 1797 -6.652797451218323e+01 +1576 1798 -6.001174723167335e+01 +1576 1799 -5.573941364116940e+01 +1576 1800 -5.363826960242956e+01 +1577 1441 -2.841326260213855e+02 +1577 1442 -3.063876713483004e+02 +1577 1443 -3.553280674768354e+02 +1577 1444 -4.404031329187411e+02 +1577 1445 -5.762343277298867e+02 +1577 1446 -7.788097592344268e+02 +1577 1447 -1.049909849375148e+03 +1577 1448 -1.344510568096302e+03 +1577 1449 -1.550121445008505e+03 +1577 1729 -3.311617365195747e+02 +1577 1730 -3.063876713483004e+02 +1577 1731 -2.663884709281895e+02 +1577 1732 -2.231981844606894e+02 +1577 1733 -1.851243485745373e+02 +1577 1734 -1.555580782497810e+02 +1577 1735 -1.347481526436478e+02 +1577 1736 -1.217424124188383e+02 +1577 1737 -1.155304899028561e+02 +1577 1792 -1.170681125153376e+02 +1577 1793 -1.111842160419089e+02 +1577 1794 -1.011961191083175e+02 +1577 1795 -8.962181586287889e+01 +1577 1796 -7.859349409841370e+01 +1577 1797 -6.937545782864687e+01 +1577 1798 -6.247361649834824e+01 +1577 1799 -5.795761808209202e+01 +1577 1800 -5.573941364116940e+01 +1578 1441 -2.480403651673271e+02 +1578 1442 -2.663884709281895e+02 +1578 1443 -3.063876713483004e+02 +1578 1444 -3.748904053829385e+02 +1578 1445 -4.819366867771664e+02 +1578 1446 -6.371952057562402e+02 +1578 1447 -8.383319685358435e+02 +1578 1448 -1.049909849375148e+03 +1578 1449 -1.193932486839834e+03 +1578 1729 -3.859179776157605e+02 +1578 1730 -3.553280674768354e+02 +1578 1731 -3.063876713483004e+02 +1578 1732 -2.542062119667738e+02 +1578 1733 -2.088271183655457e+02 +1578 1734 -1.740274317161707e+02 +1578 1735 -1.497853840269160e+02 +1578 1736 -1.347481526436478e+02 +1578 1737 -1.275984131219179e+02 +1578 1792 -1.293661657908652e+02 +1578 1793 -1.226088998409724e+02 +1578 1794 -1.111842160419089e+02 +1578 1795 -9.802102195827720e+01 +1578 1796 -8.555928471614156e+01 +1578 1797 -7.520762033775921e+01 +1578 1798 -6.749803222962952e+01 +1578 1799 -6.247361649834824e+01 +1578 1800 -6.001174723167335e+01 +1579 1441 -2.088271183655457e+02 +1579 1442 -2.231981844606894e+02 +1579 1443 -2.542062119667738e+02 +1579 1444 -3.063876713483004e+02 +1579 1445 -3.859179776157605e+02 +1579 1446 -4.976453857371607e+02 +1579 1447 -6.371952057562402e+02 +1579 1448 -7.788097592344268e+02 +1579 1449 -8.726231103602357e+02 +1579 1729 -4.819366867771664e+02 +1579 1730 -4.404031329187411e+02 +1579 1731 -3.748904053829385e+02 +1579 1732 -3.063876713483004e+02 +1579 1733 -2.480403651673271e+02 +1579 1734 -2.041390437321793e+02 +1579 1735 -1.740274317161707e+02 +1579 1736 -1.555580782497810e+02 +1579 1737 -1.468355065336023e+02 +1579 1792 -1.489885081652992e+02 +1579 1793 -1.407716848553628e+02 +1579 1794 -1.269615920628681e+02 +1579 1795 -1.111842160419089e+02 +1579 1796 -9.638822517401589e+01 +1579 1797 -8.420868002944904e+01 +1579 1798 -7.520762033775921e+01 +1579 1799 -6.937545782864687e+01 +1579 1800 -6.652797451218323e+01 +1580 1441 -1.740274317161707e+02 +1580 1442 -1.851243485745373e+02 +1580 1443 -2.088271183655457e+02 +1580 1444 -2.480403651673271e+02 +1580 1445 -3.063876713483004e+02 +1580 1446 -3.859179776157605e+02 +1580 1447 -4.819366867771664e+02 +1580 1448 -5.762343277298867e+02 +1580 1449 -6.371952057562402e+02 +1580 1729 -6.371952057562402e+02 +1580 1730 -5.762343277298867e+02 +1580 1731 -4.819366867771664e+02 +1580 1732 -3.859179776157605e+02 +1580 1733 -3.063876713483004e+02 +1580 1734 -2.480403651673271e+02 +1580 1735 -2.088271183655457e+02 +1580 1736 -1.851243485745373e+02 +1580 1737 -1.740274317161707e+02 +1580 1792 -1.767605489846857e+02 +1580 1793 -1.663510232448633e+02 +1580 1794 -1.489885081652992e+02 +1580 1795 -1.293661657908652e+02 +1580 1796 -1.111842160419089e+02 +1580 1797 -9.638822517401589e+01 +1580 1798 -8.555928471614156e+01 +1580 1799 -7.859349409841370e+01 +1580 1800 -7.520762033775921e+01 +1581 1441 -1.468355065336023e+02 +1581 1442 -1.555580782497810e+02 +1581 1443 -1.740274317161707e+02 +1581 1444 -2.041390437321793e+02 +1581 1445 -2.480403651673271e+02 +1581 1446 -3.063876713483004e+02 +1581 1447 -3.748904053829385e+02 +1581 1448 -4.404031329187411e+02 +1581 1449 -4.819366867771664e+02 +1581 1729 -8.726231103602357e+02 +1581 1730 -7.788097592344268e+02 +1581 1731 -6.371952057562402e+02 +1581 1732 -4.976453857371607e+02 +1581 1733 -3.859179776157605e+02 +1581 1734 -3.063876713483004e+02 +1581 1735 -2.542062119667738e+02 +1581 1736 -2.231981844606894e+02 +1581 1737 -2.088271183655457e+02 +1581 1792 -2.123577731150849e+02 +1581 1793 -1.989422168423268e+02 +1581 1794 -1.767605489846857e+02 +1581 1795 -1.519993633210930e+02 +1581 1796 -1.293661657908652e+02 +1581 1797 -1.111842160419089e+02 +1581 1798 -9.802102195827720e+01 +1581 1799 -8.962181586287889e+01 +1581 1800 -8.555928471614156e+01 +1582 1441 -1.275984131219179e+02 +1582 1442 -1.347481526436478e+02 +1582 1443 -1.497853840269160e+02 +1582 1444 -1.740274317161707e+02 +1582 1445 -2.088271183655457e+02 +1582 1446 -2.542062119667738e+02 +1582 1447 -3.063876713483004e+02 +1582 1448 -3.553280674768354e+02 +1582 1449 -3.859179776157605e+02 +1582 1729 -1.193932486839834e+03 +1582 1730 -1.049909849375148e+03 +1582 1731 -8.383319685358435e+02 +1582 1732 -6.371952057562402e+02 +1582 1733 -4.819366867771664e+02 +1582 1734 -3.748904053829385e+02 +1582 1735 -3.063876713483004e+02 +1582 1736 -2.663884709281895e+02 +1582 1737 -2.480403651673271e+02 +1582 1792 -2.525366109215767e+02 +1582 1793 -2.354925657825773e+02 +1582 1794 -2.075588680195229e+02 +1582 1795 -1.767605489846857e+02 +1582 1796 -1.489885081652992e+02 +1582 1797 -1.269615920628681e+02 +1582 1798 -1.111842160419089e+02 +1582 1799 -1.011961191083175e+02 +1582 1800 -9.638822517401589e+01 +1583 1441 -1.155304899028561e+02 +1583 1442 -1.217424124188383e+02 +1583 1443 -1.347481526436478e+02 +1583 1444 -1.555580782497810e+02 +1583 1445 -1.851243485745373e+02 +1583 1446 -2.231981844606894e+02 +1583 1447 -2.663884709281895e+02 +1583 1448 -3.063876713483004e+02 +1583 1449 -3.311617365195747e+02 +1583 1729 -1.550121445008505e+03 +1583 1730 -1.344510568096302e+03 +1583 1731 -1.049909849375148e+03 +1583 1732 -7.788097592344268e+02 +1583 1733 -5.762343277298867e+02 +1583 1734 -4.404031329187411e+02 +1583 1735 -3.553280674768354e+02 +1583 1736 -3.063876713483004e+02 +1583 1737 -2.841326260213855e+02 +1583 1792 -2.895745815575320e+02 +1583 1793 -2.689865983609317e+02 +1583 1794 -2.354925657825773e+02 +1583 1795 -1.989422168423268e+02 +1583 1796 -1.663510232448633e+02 +1583 1797 -1.407716848553628e+02 +1583 1798 -1.226088998409724e+02 +1583 1799 -1.111842160419089e+02 +1583 1800 -1.057061586526018e+02 +1584 1441 -1.097534196790493e+02 +1584 1442 -1.155304899028561e+02 +1584 1443 -1.275984131219179e+02 +1584 1444 -1.468355065336023e+02 +1584 1445 -1.740274317161707e+02 +1584 1446 -2.088271183655457e+02 +1584 1447 -2.480403651673271e+02 +1584 1448 -2.841326260213855e+02 +1584 1449 -3.063876713483004e+02 +1584 1729 -1.802596433195456e+03 +1584 1730 -1.550121445008505e+03 +1584 1731 -1.193932486839834e+03 +1584 1732 -8.726231103602357e+02 +1584 1733 -6.371952057562402e+02 +1584 1734 -4.819366867771664e+02 +1584 1735 -3.859179776157605e+02 +1584 1736 -3.311617365195747e+02 +1584 1737 -3.063876713483004e+02 +1584 1792 -3.124380547854544e+02 +1584 1793 -2.895745815575320e+02 +1584 1794 -2.525366109215767e+02 +1584 1795 -2.123577731150849e+02 +1584 1796 -1.767605489846857e+02 +1584 1797 -1.489885081652992e+02 +1584 1798 -1.293661657908652e+02 +1584 1799 -1.170681125153376e+02 +1584 1800 -1.111842160419089e+02 +1585 1513 -1.733190400658708e+03 +1585 1514 -1.877824568765017e+03 +1585 1515 -2.199157547087201e+03 +1585 1516 -2.767706810094291e+03 +1585 1517 -3.699147964795180e+03 +1585 1518 -5.136224430633882e+03 +1585 1519 -7.138491575686282e+03 +1585 1520 -9.405703259334639e+03 +1585 1521 -1.103972130715926e+04 +1585 1648 -1.733190400658708e+03 +1585 1649 -1.603684467943633e+03 +1585 1650 -1.394551574360510e+03 +1585 1651 -1.168677565678393e+03 +1585 1652 -9.695072463564434e+02 +1585 1653 -8.148024630667926e+02 +1585 1654 -7.058924559832867e+02 +1585 1655 -6.378158089920671e+02 +1585 1656 -6.052974323170196e+02 +1585 1675 -6.289529049931513e+02 +1585 1676 -5.970589583440825e+02 +1585 1677 -5.429674662554822e+02 +1585 1678 -4.803677035258846e+02 +1585 1679 -4.208084537187713e+02 +1585 1680 -3.710963518270331e+02 +1585 1681 -3.339204550667988e+02 +1585 1682 -3.096178268240465e+02 +1585 1683 -2.976873911031298e+02 +1586 1513 -1.603684467943633e+03 +1586 1514 -1.733190400658708e+03 +1586 1515 -2.019368486704435e+03 +1586 1516 -2.521021940438000e+03 +1586 1517 -3.331754877699595e+03 +1586 1518 -4.560278038130823e+03 +1586 1519 -6.235592529048601e+03 +1586 1520 -8.091232579773156e+03 +1586 1521 -9.405703259334639e+03 +1586 1648 -1.877824568765017e+03 +1586 1649 -1.733190400658708e+03 +1586 1650 -1.500725861549673e+03 +1586 1651 -1.251286952144484e+03 +1586 1652 -1.032880208377977e+03 +1586 1653 -8.643348602446076e+02 +1586 1654 -7.463158073460687e+02 +1586 1655 -6.728335244699299e+02 +1586 1656 -6.378158089920671e+02 +1586 1675 -6.632839990295113e+02 +1586 1676 -6.289529049931513e+02 +1586 1677 -5.708523475060541e+02 +1586 1678 -5.038180997021789e+02 +1586 1679 -4.402579127124382e+02 +1586 1680 -3.873813675510144e+02 +1586 1681 -3.479505460244110e+02 +1586 1682 -3.222285372305477e+02 +1586 1683 -3.096178268240465e+02 +1587 1513 -1.394551574360510e+03 +1587 1514 -1.500725861549673e+03 +1587 1515 -1.733190400658708e+03 +1587 1516 -2.134265778758326e+03 +1587 1517 -2.767706810094291e+03 +1587 1518 -3.699147964795180e+03 +1587 1519 -4.925216936196723e+03 +1587 1520 -6.235592529048601e+03 +1587 1521 -7.138491575686282e+03 +1587 1648 -2.199157547087201e+03 +1587 1649 -2.019368486704435e+03 +1587 1650 -1.733190400658708e+03 +1587 1651 -1.430197816180122e+03 +1587 1652 -1.168677565678393e+03 +1587 1653 -9.695072463564434e+02 +1587 1654 -8.315436028021828e+02 +1587 1655 -7.463158073460687e+02 +1587 1656 -7.058924559832867e+02 +1587 1675 -7.352796046183681e+02 +1587 1676 -6.956816209337401e+02 +1587 1677 -6.289529049931513e+02 +1587 1678 -5.524312223207850e+02 +1587 1679 -4.803677035258846e+02 +1587 1680 -4.208084537187713e+02 +1587 1681 -3.766415408901786e+02 +1587 1682 -3.479505460244110e+02 +1587 1683 -3.339204550667988e+02 +1588 1513 -1.168677565678393e+03 +1588 1514 -1.251286952144484e+03 +1588 1515 -1.430197816180122e+03 +1588 1516 -1.733190400658708e+03 +1588 1517 -2.199157547087201e+03 +1588 1518 -2.861294172280346e+03 +1588 1519 -3.699147964795180e+03 +1588 1520 -4.560278038130823e+03 +1588 1521 -5.136224430633882e+03 +1588 1648 -2.767706810094291e+03 +1588 1649 -2.521021940438000e+03 +1588 1650 -2.134265778758326e+03 +1588 1651 -1.733190400658708e+03 +1588 1652 -1.394551574360510e+03 +1588 1653 -1.141773184361042e+03 +1588 1654 -9.695072463564434e+02 +1588 1655 -8.643348602446076e+02 +1588 1656 -8.148024630667926e+02 +1588 1675 -8.507888885505199e+02 +1588 1676 -8.023274760830675e+02 +1588 1677 -7.211778000851799e+02 +1588 1678 -6.289529049931513e+02 +1588 1679 -5.429674662554822e+02 +1588 1680 -4.725808574370885e+02 +1588 1681 -4.208084537187713e+02 +1588 1682 -3.873813675510144e+02 +1588 1683 -3.710963518270331e+02 +1589 1513 -9.695072463564434e+02 +1589 1514 -1.032880208377977e+03 +1589 1515 -1.168677565678393e+03 +1589 1516 -1.394551574360510e+03 +1589 1517 -1.733190400658708e+03 +1589 1518 -2.199157547087201e+03 +1589 1519 -2.767706810094291e+03 +1589 1520 -3.331754877699595e+03 +1589 1521 -3.699147964795180e+03 +1589 1648 -3.699147964795180e+03 +1589 1649 -3.331754877699595e+03 +1589 1650 -2.767706810094291e+03 +1589 1651 -2.199157547087201e+03 +1589 1652 -1.733190400658708e+03 +1589 1653 -1.394551574360510e+03 +1589 1654 -1.168677565678393e+03 +1589 1655 -1.032880208377977e+03 +1589 1656 -9.695072463564434e+02 +1589 1675 -1.015511306612467e+03 +1589 1676 -9.536070604341750e+02 +1589 1677 -8.507888885505199e+02 +1589 1678 -7.352796046183681e+02 +1589 1679 -6.289529049931513e+02 +1589 1680 -5.429674662554822e+02 +1589 1681 -4.803677035258846e+02 +1589 1682 -4.402579127124382e+02 +1589 1683 -4.208084537187713e+02 +1590 1513 -8.148024630667926e+02 +1590 1514 -8.643348602446076e+02 +1590 1515 -9.695072463564434e+02 +1590 1516 -1.141773184361042e+03 +1590 1517 -1.394551574360510e+03 +1590 1518 -1.733190400658708e+03 +1590 1519 -2.134265778758326e+03 +1590 1520 -2.521021940438000e+03 +1590 1521 -2.767706810094291e+03 +1590 1648 -5.136224430633882e+03 +1590 1649 -4.560278038130823e+03 +1590 1650 -3.699147964795180e+03 +1590 1651 -2.861294172280346e+03 +1590 1652 -2.199157547087201e+03 +1590 1653 -1.733190400658708e+03 +1590 1654 -1.430197816180122e+03 +1590 1655 -1.251286952144484e+03 +1590 1656 -1.168677565678393e+03 +1590 1675 -1.228588660544053e+03 +1590 1676 -1.148042053110080e+03 +1590 1677 -1.015511306612467e+03 +1590 1678 -8.685786765383800e+02 +1590 1679 -7.352796046183681e+02 +1590 1680 -6.289529049931513e+02 +1590 1681 -5.524312223207850e+02 +1590 1682 -5.038180997021789e+02 +1590 1683 -4.803677035258846e+02 +1591 1513 -7.058924559832867e+02 +1591 1514 -7.463158073460687e+02 +1591 1515 -8.315436028021828e+02 +1591 1516 -9.695072463564434e+02 +1591 1517 -1.168677565678393e+03 +1591 1518 -1.430197816180122e+03 +1591 1519 -1.733190400658708e+03 +1591 1520 -2.019368486704435e+03 +1591 1521 -2.199157547087201e+03 +1591 1648 -7.138491575686282e+03 +1591 1649 -6.235592529048601e+03 +1591 1650 -4.925216936196723e+03 +1591 1651 -3.699147964795180e+03 +1591 1652 -2.767706810094291e+03 +1591 1653 -2.134265778758326e+03 +1591 1654 -1.733190400658708e+03 +1591 1655 -1.500725861549673e+03 +1591 1656 -1.394551574360510e+03 +1591 1675 -1.471477730866027e+03 +1591 1676 -1.368148367306964e+03 +1591 1677 -1.199743197084304e+03 +1591 1678 -1.015511306612467e+03 +1591 1679 -8.507888885505199e+02 +1591 1680 -7.211778000851799e+02 +1591 1681 -6.289529049931513e+02 +1591 1682 -5.708523475060541e+02 +1591 1683 -5.429674662554822e+02 +1592 1513 -6.378158089920671e+02 +1592 1514 -6.728335244699299e+02 +1592 1515 -7.463158073460687e+02 +1592 1516 -8.643348602446076e+02 +1592 1517 -1.032880208377977e+03 +1592 1518 -1.251286952144484e+03 +1592 1519 -1.500725861549673e+03 +1592 1520 -1.733190400658708e+03 +1592 1521 -1.877824568765017e+03 +1592 1648 -9.405703259334639e+03 +1592 1649 -8.091232579773156e+03 +1592 1650 -6.235592529048601e+03 +1592 1651 -4.560278038130823e+03 +1592 1652 -3.331754877699595e+03 +1592 1653 -2.521021940438000e+03 +1592 1654 -2.019368486704435e+03 +1592 1655 -1.733190400658708e+03 +1592 1656 -1.603684467943633e+03 +1592 1675 -1.697437739078449e+03 +1592 1676 -1.571600895131404e+03 +1592 1677 -1.368148367306964e+03 +1592 1678 -1.148042053110080e+03 +1592 1679 -9.536070604341750e+02 +1592 1680 -8.023274760830675e+02 +1592 1681 -6.956816209337401e+02 +1592 1682 -6.289529049931513e+02 +1592 1683 -5.970589583440825e+02 +1593 1513 -6.052974323170196e+02 +1593 1514 -6.378158089920671e+02 +1593 1515 -7.058924559832867e+02 +1593 1516 -8.148024630667926e+02 +1593 1517 -9.695072463564434e+02 +1593 1518 -1.168677565678393e+03 +1593 1519 -1.394551574360510e+03 +1593 1520 -1.603684467943633e+03 +1593 1521 -1.733190400658708e+03 +1593 1648 -1.103972130715926e+04 +1593 1649 -9.405703259334639e+03 +1593 1650 -7.138491575686282e+03 +1593 1651 -5.136224430633882e+03 +1593 1652 -3.699147964795180e+03 +1593 1653 -2.767706810094291e+03 +1593 1654 -2.199157547087201e+03 +1593 1655 -1.877824568765017e+03 +1593 1656 -1.733190400658708e+03 +1593 1675 -1.837845240586539e+03 +1593 1676 -1.697437739078449e+03 +1593 1677 -1.471477730866027e+03 +1593 1678 -1.228588660544053e+03 +1593 1679 -1.015511306612467e+03 +1593 1680 -8.507888885505199e+02 +1593 1681 -7.352796046183681e+02 +1593 1682 -6.632839990295113e+02 +1593 1683 -6.289529049931513e+02 +1612 1513 -6.289529049931513e+02 +1612 1514 -6.632839990295113e+02 +1612 1515 -7.352796046183681e+02 +1612 1516 -8.507888885505199e+02 +1612 1517 -1.015511306612467e+03 +1612 1518 -1.228588660544053e+03 +1612 1519 -1.471477730866027e+03 +1612 1520 -1.697437739078449e+03 +1612 1521 -1.837845240586539e+03 +1612 1540 -1.733190400658708e+03 +1612 1541 -1.877824568765017e+03 +1612 1542 -2.199157547087201e+03 +1612 1543 -2.767706810094291e+03 +1612 1544 -3.699147964795180e+03 +1612 1545 -5.136224430633882e+03 +1612 1546 -7.138491575686282e+03 +1612 1547 -9.405703259334639e+03 +1612 1548 -1.103972130715926e+04 +1612 1675 -1.733190400658708e+03 +1612 1676 -1.603684467943633e+03 +1612 1677 -1.394551574360510e+03 +1612 1678 -1.168677565678393e+03 +1612 1679 -9.695072463564434e+02 +1612 1680 -8.148024630667926e+02 +1612 1681 -7.058924559832867e+02 +1612 1682 -6.378158089920671e+02 +1612 1683 -6.052974323170196e+02 +1613 1513 -5.970589583440825e+02 +1613 1514 -6.289529049931513e+02 +1613 1515 -6.956816209337401e+02 +1613 1516 -8.023274760830675e+02 +1613 1517 -9.536070604341750e+02 +1613 1518 -1.148042053110080e+03 +1613 1519 -1.368148367306964e+03 +1613 1520 -1.571600895131404e+03 +1613 1521 -1.697437739078449e+03 +1613 1540 -1.603684467943633e+03 +1613 1541 -1.733190400658708e+03 +1613 1542 -2.019368486704435e+03 +1613 1543 -2.521021940438000e+03 +1613 1544 -3.331754877699595e+03 +1613 1545 -4.560278038130823e+03 +1613 1546 -6.235592529048601e+03 +1613 1547 -8.091232579773156e+03 +1613 1548 -9.405703259334639e+03 +1613 1675 -1.877824568765017e+03 +1613 1676 -1.733190400658708e+03 +1613 1677 -1.500725861549673e+03 +1613 1678 -1.251286952144484e+03 +1613 1679 -1.032880208377977e+03 +1613 1680 -8.643348602446076e+02 +1613 1681 -7.463158073460687e+02 +1613 1682 -6.728335244699299e+02 +1613 1683 -6.378158089920671e+02 +1614 1513 -5.429674662554822e+02 +1614 1514 -5.708523475060541e+02 +1614 1515 -6.289529049931513e+02 +1614 1516 -7.211778000851799e+02 +1614 1517 -8.507888885505199e+02 +1614 1518 -1.015511306612467e+03 +1614 1519 -1.199743197084304e+03 +1614 1520 -1.368148367306964e+03 +1614 1521 -1.471477730866027e+03 +1614 1540 -1.394551574360510e+03 +1614 1541 -1.500725861549673e+03 +1614 1542 -1.733190400658708e+03 +1614 1543 -2.134265778758326e+03 +1614 1544 -2.767706810094291e+03 +1614 1545 -3.699147964795180e+03 +1614 1546 -4.925216936196723e+03 +1614 1547 -6.235592529048601e+03 +1614 1548 -7.138491575686282e+03 +1614 1675 -2.199157547087201e+03 +1614 1676 -2.019368486704435e+03 +1614 1677 -1.733190400658708e+03 +1614 1678 -1.430197816180122e+03 +1614 1679 -1.168677565678393e+03 +1614 1680 -9.695072463564434e+02 +1614 1681 -8.315436028021828e+02 +1614 1682 -7.463158073460687e+02 +1614 1683 -7.058924559832867e+02 +1615 1513 -4.803677035258846e+02 +1615 1514 -5.038180997021789e+02 +1615 1515 -5.524312223207850e+02 +1615 1516 -6.289529049931513e+02 +1615 1517 -7.352796046183681e+02 +1615 1518 -8.685786765383800e+02 +1615 1519 -1.015511306612467e+03 +1615 1520 -1.148042053110080e+03 +1615 1521 -1.228588660544053e+03 +1615 1540 -1.168677565678393e+03 +1615 1541 -1.251286952144484e+03 +1615 1542 -1.430197816180122e+03 +1615 1543 -1.733190400658708e+03 +1615 1544 -2.199157547087201e+03 +1615 1545 -2.861294172280346e+03 +1615 1546 -3.699147964795180e+03 +1615 1547 -4.560278038130823e+03 +1615 1548 -5.136224430633882e+03 +1615 1675 -2.767706810094291e+03 +1615 1676 -2.521021940438000e+03 +1615 1677 -2.134265778758326e+03 +1615 1678 -1.733190400658708e+03 +1615 1679 -1.394551574360510e+03 +1615 1680 -1.141773184361042e+03 +1615 1681 -9.695072463564434e+02 +1615 1682 -8.643348602446076e+02 +1615 1683 -8.148024630667926e+02 +1616 1513 -4.208084537187713e+02 +1616 1514 -4.402579127124382e+02 +1616 1515 -4.803677035258846e+02 +1616 1516 -5.429674662554822e+02 +1616 1517 -6.289529049931513e+02 +1616 1518 -7.352796046183681e+02 +1616 1519 -8.507888885505199e+02 +1616 1520 -9.536070604341750e+02 +1616 1521 -1.015511306612467e+03 +1616 1540 -9.695072463564434e+02 +1616 1541 -1.032880208377977e+03 +1616 1542 -1.168677565678393e+03 +1616 1543 -1.394551574360510e+03 +1616 1544 -1.733190400658708e+03 +1616 1545 -2.199157547087201e+03 +1616 1546 -2.767706810094291e+03 +1616 1547 -3.331754877699595e+03 +1616 1548 -3.699147964795180e+03 +1616 1675 -3.699147964795180e+03 +1616 1676 -3.331754877699595e+03 +1616 1677 -2.767706810094291e+03 +1616 1678 -2.199157547087201e+03 +1616 1679 -1.733190400658708e+03 +1616 1680 -1.394551574360510e+03 +1616 1681 -1.168677565678393e+03 +1616 1682 -1.032880208377977e+03 +1616 1683 -9.695072463564434e+02 +1617 1513 -3.710963518270331e+02 +1617 1514 -3.873813675510144e+02 +1617 1515 -4.208084537187713e+02 +1617 1516 -4.725808574370885e+02 +1617 1517 -5.429674662554822e+02 +1617 1518 -6.289529049931513e+02 +1617 1519 -7.211778000851799e+02 +1617 1520 -8.023274760830675e+02 +1617 1521 -8.507888885505199e+02 +1617 1540 -8.148024630667926e+02 +1617 1541 -8.643348602446076e+02 +1617 1542 -9.695072463564434e+02 +1617 1543 -1.141773184361042e+03 +1617 1544 -1.394551574360510e+03 +1617 1545 -1.733190400658708e+03 +1617 1546 -2.134265778758326e+03 +1617 1547 -2.521021940438000e+03 +1617 1548 -2.767706810094291e+03 +1617 1675 -5.136224430633882e+03 +1617 1676 -4.560278038130823e+03 +1617 1677 -3.699147964795180e+03 +1617 1678 -2.861294172280346e+03 +1617 1679 -2.199157547087201e+03 +1617 1680 -1.733190400658708e+03 +1617 1681 -1.430197816180122e+03 +1617 1682 -1.251286952144484e+03 +1617 1683 -1.168677565678393e+03 +1618 1513 -3.339204550667988e+02 +1618 1514 -3.479505460244110e+02 +1618 1515 -3.766415408901786e+02 +1618 1516 -4.208084537187713e+02 +1618 1517 -4.803677035258846e+02 +1618 1518 -5.524312223207850e+02 +1618 1519 -6.289529049931513e+02 +1618 1520 -6.956816209337401e+02 +1618 1521 -7.352796046183681e+02 +1618 1540 -7.058924559832867e+02 +1618 1541 -7.463158073460687e+02 +1618 1542 -8.315436028021828e+02 +1618 1543 -9.695072463564434e+02 +1618 1544 -1.168677565678393e+03 +1618 1545 -1.430197816180122e+03 +1618 1546 -1.733190400658708e+03 +1618 1547 -2.019368486704435e+03 +1618 1548 -2.199157547087201e+03 +1618 1675 -7.138491575686282e+03 +1618 1676 -6.235592529048601e+03 +1618 1677 -4.925216936196723e+03 +1618 1678 -3.699147964795180e+03 +1618 1679 -2.767706810094291e+03 +1618 1680 -2.134265778758326e+03 +1618 1681 -1.733190400658708e+03 +1618 1682 -1.500725861549673e+03 +1618 1683 -1.394551574360510e+03 +1619 1513 -3.096178268240465e+02 +1619 1514 -3.222285372305477e+02 +1619 1515 -3.479505460244110e+02 +1619 1516 -3.873813675510144e+02 +1619 1517 -4.402579127124382e+02 +1619 1518 -5.038180997021789e+02 +1619 1519 -5.708523475060541e+02 +1619 1520 -6.289529049931513e+02 +1619 1521 -6.632839990295113e+02 +1619 1540 -6.378158089920671e+02 +1619 1541 -6.728335244699299e+02 +1619 1542 -7.463158073460687e+02 +1619 1543 -8.643348602446076e+02 +1619 1544 -1.032880208377977e+03 +1619 1545 -1.251286952144484e+03 +1619 1546 -1.500725861549673e+03 +1619 1547 -1.733190400658708e+03 +1619 1548 -1.877824568765017e+03 +1619 1675 -9.405703259334639e+03 +1619 1676 -8.091232579773156e+03 +1619 1677 -6.235592529048601e+03 +1619 1678 -4.560278038130823e+03 +1619 1679 -3.331754877699595e+03 +1619 1680 -2.521021940438000e+03 +1619 1681 -2.019368486704435e+03 +1619 1682 -1.733190400658708e+03 +1619 1683 -1.603684467943633e+03 +1620 1513 -2.976873911031298e+02 +1620 1514 -3.096178268240465e+02 +1620 1515 -3.339204550667988e+02 +1620 1516 -3.710963518270331e+02 +1620 1517 -4.208084537187713e+02 +1620 1518 -4.803677035258846e+02 +1620 1519 -5.429674662554822e+02 +1620 1520 -5.970589583440825e+02 +1620 1521 -6.289529049931513e+02 +1620 1540 -6.052974323170196e+02 +1620 1541 -6.378158089920671e+02 +1620 1542 -7.058924559832867e+02 +1620 1543 -8.148024630667926e+02 +1620 1544 -9.695072463564434e+02 +1620 1545 -1.168677565678393e+03 +1620 1546 -1.394551574360510e+03 +1620 1547 -1.603684467943633e+03 +1620 1548 -1.733190400658708e+03 +1620 1675 -1.103972130715926e+04 +1620 1676 -9.405703259334639e+03 +1620 1677 -7.138491575686282e+03 +1620 1678 -5.136224430633882e+03 +1620 1679 -3.699147964795180e+03 +1620 1680 -2.767706810094291e+03 +1620 1681 -2.199157547087201e+03 +1620 1682 -1.877824568765017e+03 +1620 1683 -1.733190400658708e+03 +1639 1441 -1.111842160419089e+02 +1639 1442 -1.170681125153376e+02 +1639 1443 -1.293661657908652e+02 +1639 1444 -1.489885081652992e+02 +1639 1445 -1.767605489846857e+02 +1639 1446 -2.123577731150849e+02 +1639 1447 -2.525366109215767e+02 +1639 1448 -2.895745815575320e+02 +1639 1449 -3.124380547854544e+02 +1639 1504 -3.063876713483004e+02 +1639 1505 -3.311617365195747e+02 +1639 1506 -3.859179776157605e+02 +1639 1507 -4.819366867771664e+02 +1639 1508 -6.371952057562402e+02 +1639 1509 -8.726231103602357e+02 +1639 1510 -1.193932486839834e+03 +1639 1511 -1.550121445008505e+03 +1639 1512 -1.802596433195456e+03 +1639 1792 -3.063876713483004e+02 +1639 1793 -2.841326260213855e+02 +1639 1794 -2.480403651673271e+02 +1639 1795 -2.088271183655457e+02 +1639 1796 -1.740274317161707e+02 +1639 1797 -1.468355065336023e+02 +1639 1798 -1.275984131219179e+02 +1639 1799 -1.155304899028561e+02 +1639 1800 -1.097534196790493e+02 +1640 1441 -1.057061586526018e+02 +1640 1442 -1.111842160419089e+02 +1640 1443 -1.226088998409724e+02 +1640 1444 -1.407716848553628e+02 +1640 1445 -1.663510232448633e+02 +1640 1446 -1.989422168423268e+02 +1640 1447 -2.354925657825773e+02 +1640 1448 -2.689865983609317e+02 +1640 1449 -2.895745815575320e+02 +1640 1504 -2.841326260213855e+02 +1640 1505 -3.063876713483004e+02 +1640 1506 -3.553280674768354e+02 +1640 1507 -4.404031329187411e+02 +1640 1508 -5.762343277298867e+02 +1640 1509 -7.788097592344268e+02 +1640 1510 -1.049909849375148e+03 +1640 1511 -1.344510568096302e+03 +1640 1512 -1.550121445008505e+03 +1640 1792 -3.311617365195747e+02 +1640 1793 -3.063876713483004e+02 +1640 1794 -2.663884709281895e+02 +1640 1795 -2.231981844606894e+02 +1640 1796 -1.851243485745373e+02 +1640 1797 -1.555580782497810e+02 +1640 1798 -1.347481526436478e+02 +1640 1799 -1.217424124188383e+02 +1640 1800 -1.155304899028561e+02 +1641 1441 -9.638822517401589e+01 +1641 1442 -1.011961191083175e+02 +1641 1443 -1.111842160419089e+02 +1641 1444 -1.269615920628681e+02 +1641 1445 -1.489885081652992e+02 +1641 1446 -1.767605489846857e+02 +1641 1447 -2.075588680195229e+02 +1641 1448 -2.354925657825773e+02 +1641 1449 -2.525366109215767e+02 +1641 1504 -2.480403651673271e+02 +1641 1505 -2.663884709281895e+02 +1641 1506 -3.063876713483004e+02 +1641 1507 -3.748904053829385e+02 +1641 1508 -4.819366867771664e+02 +1641 1509 -6.371952057562402e+02 +1641 1510 -8.383319685358435e+02 +1641 1511 -1.049909849375148e+03 +1641 1512 -1.193932486839834e+03 +1641 1792 -3.859179776157605e+02 +1641 1793 -3.553280674768354e+02 +1641 1794 -3.063876713483004e+02 +1641 1795 -2.542062119667738e+02 +1641 1796 -2.088271183655457e+02 +1641 1797 -1.740274317161707e+02 +1641 1798 -1.497853840269160e+02 +1641 1799 -1.347481526436478e+02 +1641 1800 -1.275984131219179e+02 +1642 1441 -8.555928471614156e+01 +1642 1442 -8.962181586287889e+01 +1642 1443 -9.802102195827720e+01 +1642 1444 -1.111842160419089e+02 +1642 1445 -1.293661657908652e+02 +1642 1446 -1.519993633210930e+02 +1642 1447 -1.767605489846857e+02 +1642 1448 -1.989422168423268e+02 +1642 1449 -2.123577731150849e+02 +1642 1504 -2.088271183655457e+02 +1642 1505 -2.231981844606894e+02 +1642 1506 -2.542062119667738e+02 +1642 1507 -3.063876713483004e+02 +1642 1508 -3.859179776157605e+02 +1642 1509 -4.976453857371607e+02 +1642 1510 -6.371952057562402e+02 +1642 1511 -7.788097592344268e+02 +1642 1512 -8.726231103602357e+02 +1642 1792 -4.819366867771664e+02 +1642 1793 -4.404031329187411e+02 +1642 1794 -3.748904053829385e+02 +1642 1795 -3.063876713483004e+02 +1642 1796 -2.480403651673271e+02 +1642 1797 -2.041390437321793e+02 +1642 1798 -1.740274317161707e+02 +1642 1799 -1.555580782497810e+02 +1642 1800 -1.468355065336023e+02 +1643 1441 -7.520762033775921e+01 +1643 1442 -7.859349409841370e+01 +1643 1443 -8.555928471614156e+01 +1643 1444 -9.638822517401589e+01 +1643 1445 -1.111842160419089e+02 +1643 1446 -1.293661657908652e+02 +1643 1447 -1.489885081652992e+02 +1643 1448 -1.663510232448633e+02 +1643 1449 -1.767605489846857e+02 +1643 1504 -1.740274317161707e+02 +1643 1505 -1.851243485745373e+02 +1643 1506 -2.088271183655457e+02 +1643 1507 -2.480403651673271e+02 +1643 1508 -3.063876713483004e+02 +1643 1509 -3.859179776157605e+02 +1643 1510 -4.819366867771664e+02 +1643 1511 -5.762343277298867e+02 +1643 1512 -6.371952057562402e+02 +1643 1792 -6.371952057562402e+02 +1643 1793 -5.762343277298867e+02 +1643 1794 -4.819366867771664e+02 +1643 1795 -3.859179776157605e+02 +1643 1796 -3.063876713483004e+02 +1643 1797 -2.480403651673271e+02 +1643 1798 -2.088271183655457e+02 +1643 1799 -1.851243485745373e+02 +1643 1800 -1.740274317161707e+02 +1644 1441 -6.652797451218323e+01 +1644 1442 -6.937545782864687e+01 +1644 1443 -7.520762033775921e+01 +1644 1444 -8.420868002944904e+01 +1644 1445 -9.638822517401589e+01 +1644 1446 -1.111842160419089e+02 +1644 1447 -1.269615920628681e+02 +1644 1448 -1.407716848553628e+02 +1644 1449 -1.489885081652992e+02 +1644 1504 -1.468355065336023e+02 +1644 1505 -1.555580782497810e+02 +1644 1506 -1.740274317161707e+02 +1644 1507 -2.041390437321793e+02 +1644 1508 -2.480403651673271e+02 +1644 1509 -3.063876713483004e+02 +1644 1510 -3.748904053829385e+02 +1644 1511 -4.404031329187411e+02 +1644 1512 -4.819366867771664e+02 +1644 1792 -8.726231103602357e+02 +1644 1793 -7.788097592344268e+02 +1644 1794 -6.371952057562402e+02 +1644 1795 -4.976453857371607e+02 +1644 1796 -3.859179776157605e+02 +1644 1797 -3.063876713483004e+02 +1644 1798 -2.542062119667738e+02 +1644 1799 -2.231981844606894e+02 +1644 1800 -2.088271183655457e+02 +1645 1441 -6.001174723167335e+01 +1645 1442 -6.247361649834824e+01 +1645 1443 -6.749803222962952e+01 +1645 1444 -7.520762033775921e+01 +1645 1445 -8.555928471614156e+01 +1645 1446 -9.802102195827720e+01 +1645 1447 -1.111842160419089e+02 +1645 1448 -1.226088998409724e+02 +1645 1449 -1.293661657908652e+02 +1645 1504 -1.275984131219179e+02 +1645 1505 -1.347481526436478e+02 +1645 1506 -1.497853840269160e+02 +1645 1507 -1.740274317161707e+02 +1645 1508 -2.088271183655457e+02 +1645 1509 -2.542062119667738e+02 +1645 1510 -3.063876713483004e+02 +1645 1511 -3.553280674768354e+02 +1645 1512 -3.859179776157605e+02 +1645 1792 -1.193932486839834e+03 +1645 1793 -1.049909849375148e+03 +1645 1794 -8.383319685358435e+02 +1645 1795 -6.371952057562402e+02 +1645 1796 -4.819366867771664e+02 +1645 1797 -3.748904053829385e+02 +1645 1798 -3.063876713483004e+02 +1645 1799 -2.663884709281895e+02 +1645 1800 -2.480403651673271e+02 +1646 1441 -5.573941364116940e+01 +1646 1442 -5.795761808209202e+01 +1646 1443 -6.247361649834824e+01 +1646 1444 -6.937545782864687e+01 +1646 1445 -7.859349409841370e+01 +1646 1446 -8.962181586287889e+01 +1646 1447 -1.011961191083175e+02 +1646 1448 -1.111842160419089e+02 +1646 1449 -1.170681125153376e+02 +1646 1504 -1.155304899028561e+02 +1646 1505 -1.217424124188383e+02 +1646 1506 -1.347481526436478e+02 +1646 1507 -1.555580782497810e+02 +1646 1508 -1.851243485745373e+02 +1646 1509 -2.231981844606894e+02 +1646 1510 -2.663884709281895e+02 +1646 1511 -3.063876713483004e+02 +1646 1512 -3.311617365195747e+02 +1646 1792 -1.550121445008505e+03 +1646 1793 -1.344510568096302e+03 +1646 1794 -1.049909849375148e+03 +1646 1795 -7.788097592344268e+02 +1646 1796 -5.762343277298867e+02 +1646 1797 -4.404031329187411e+02 +1646 1798 -3.553280674768354e+02 +1646 1799 -3.063876713483004e+02 +1646 1800 -2.841326260213855e+02 +1647 1441 -5.363826960242956e+01 +1647 1442 -5.573941364116940e+01 +1647 1443 -6.001174723167335e+01 +1647 1444 -6.652797451218323e+01 +1647 1445 -7.520762033775921e+01 +1647 1446 -8.555928471614156e+01 +1647 1447 -9.638822517401589e+01 +1647 1448 -1.057061586526018e+02 +1647 1449 -1.111842160419089e+02 +1647 1504 -1.097534196790493e+02 +1647 1505 -1.155304899028561e+02 +1647 1506 -1.275984131219179e+02 +1647 1507 -1.468355065336023e+02 +1647 1508 -1.740274317161707e+02 +1647 1509 -2.088271183655457e+02 +1647 1510 -2.480403651673271e+02 +1647 1511 -2.841326260213855e+02 +1647 1512 -3.063876713483004e+02 +1647 1792 -1.802596433195456e+03 +1647 1793 -1.550121445008505e+03 +1647 1794 -1.193932486839834e+03 +1647 1795 -8.726231103602357e+02 +1647 1796 -6.371952057562402e+02 +1647 1797 -4.819366867771664e+02 +1647 1798 -3.859179776157605e+02 +1647 1799 -3.311617365195747e+02 +1647 1800 -3.063876713483004e+02 +1648 1585 -1.733190400658708e+03 +1648 1586 -1.877824568765017e+03 +1648 1587 -2.199157547087201e+03 +1648 1588 -2.767706810094291e+03 +1648 1589 -3.699147964795180e+03 +1648 1590 -5.136224430633882e+03 +1648 1591 -7.138491575686282e+03 +1648 1592 -9.405703259334639e+03 +1648 1593 -1.103972130715926e+04 +1648 1738 -1.733190400658708e+03 +1648 1739 -1.603684467943633e+03 +1648 1740 -1.394551574360510e+03 +1648 1741 -1.168677565678393e+03 +1648 1742 -9.695072463564434e+02 +1648 1743 -8.148024630667926e+02 +1648 1744 -7.058924559832867e+02 +1648 1745 -6.378158089920671e+02 +1648 1746 -6.052974323170196e+02 +1648 1765 -6.289529049931513e+02 +1648 1766 -5.970589583440825e+02 +1648 1767 -5.429674662554822e+02 +1648 1768 -4.803677035258846e+02 +1648 1769 -4.208084537187713e+02 +1648 1770 -3.710963518270331e+02 +1648 1771 -3.339204550667988e+02 +1648 1772 -3.096178268240465e+02 +1648 1773 -2.976873911031298e+02 +1649 1585 -1.603684467943633e+03 +1649 1586 -1.733190400658708e+03 +1649 1587 -2.019368486704435e+03 +1649 1588 -2.521021940438000e+03 +1649 1589 -3.331754877699595e+03 +1649 1590 -4.560278038130823e+03 +1649 1591 -6.235592529048601e+03 +1649 1592 -8.091232579773156e+03 +1649 1593 -9.405703259334639e+03 +1649 1738 -1.877824568765017e+03 +1649 1739 -1.733190400658708e+03 +1649 1740 -1.500725861549673e+03 +1649 1741 -1.251286952144484e+03 +1649 1742 -1.032880208377977e+03 +1649 1743 -8.643348602446076e+02 +1649 1744 -7.463158073460687e+02 +1649 1745 -6.728335244699299e+02 +1649 1746 -6.378158089920671e+02 +1649 1765 -6.632839990295113e+02 +1649 1766 -6.289529049931513e+02 +1649 1767 -5.708523475060541e+02 +1649 1768 -5.038180997021789e+02 +1649 1769 -4.402579127124382e+02 +1649 1770 -3.873813675510144e+02 +1649 1771 -3.479505460244110e+02 +1649 1772 -3.222285372305477e+02 +1649 1773 -3.096178268240465e+02 +1650 1585 -1.394551574360510e+03 +1650 1586 -1.500725861549673e+03 +1650 1587 -1.733190400658708e+03 +1650 1588 -2.134265778758326e+03 +1650 1589 -2.767706810094291e+03 +1650 1590 -3.699147964795180e+03 +1650 1591 -4.925216936196723e+03 +1650 1592 -6.235592529048601e+03 +1650 1593 -7.138491575686282e+03 +1650 1738 -2.199157547087201e+03 +1650 1739 -2.019368486704435e+03 +1650 1740 -1.733190400658708e+03 +1650 1741 -1.430197816180122e+03 +1650 1742 -1.168677565678393e+03 +1650 1743 -9.695072463564434e+02 +1650 1744 -8.315436028021828e+02 +1650 1745 -7.463158073460687e+02 +1650 1746 -7.058924559832867e+02 +1650 1765 -7.352796046183681e+02 +1650 1766 -6.956816209337401e+02 +1650 1767 -6.289529049931513e+02 +1650 1768 -5.524312223207850e+02 +1650 1769 -4.803677035258846e+02 +1650 1770 -4.208084537187713e+02 +1650 1771 -3.766415408901786e+02 +1650 1772 -3.479505460244110e+02 +1650 1773 -3.339204550667988e+02 +1651 1585 -1.168677565678393e+03 +1651 1586 -1.251286952144484e+03 +1651 1587 -1.430197816180122e+03 +1651 1588 -1.733190400658708e+03 +1651 1589 -2.199157547087201e+03 +1651 1590 -2.861294172280346e+03 +1651 1591 -3.699147964795180e+03 +1651 1592 -4.560278038130823e+03 +1651 1593 -5.136224430633882e+03 +1651 1738 -2.767706810094291e+03 +1651 1739 -2.521021940438000e+03 +1651 1740 -2.134265778758326e+03 +1651 1741 -1.733190400658708e+03 +1651 1742 -1.394551574360510e+03 +1651 1743 -1.141773184361042e+03 +1651 1744 -9.695072463564434e+02 +1651 1745 -8.643348602446076e+02 +1651 1746 -8.148024630667926e+02 +1651 1765 -8.507888885505199e+02 +1651 1766 -8.023274760830675e+02 +1651 1767 -7.211778000851799e+02 +1651 1768 -6.289529049931513e+02 +1651 1769 -5.429674662554822e+02 +1651 1770 -4.725808574370885e+02 +1651 1771 -4.208084537187713e+02 +1651 1772 -3.873813675510144e+02 +1651 1773 -3.710963518270331e+02 +1652 1585 -9.695072463564434e+02 +1652 1586 -1.032880208377977e+03 +1652 1587 -1.168677565678393e+03 +1652 1588 -1.394551574360510e+03 +1652 1589 -1.733190400658708e+03 +1652 1590 -2.199157547087201e+03 +1652 1591 -2.767706810094291e+03 +1652 1592 -3.331754877699595e+03 +1652 1593 -3.699147964795180e+03 +1652 1738 -3.699147964795180e+03 +1652 1739 -3.331754877699595e+03 +1652 1740 -2.767706810094291e+03 +1652 1741 -2.199157547087201e+03 +1652 1742 -1.733190400658708e+03 +1652 1743 -1.394551574360510e+03 +1652 1744 -1.168677565678393e+03 +1652 1745 -1.032880208377977e+03 +1652 1746 -9.695072463564434e+02 +1652 1765 -1.015511306612467e+03 +1652 1766 -9.536070604341750e+02 +1652 1767 -8.507888885505199e+02 +1652 1768 -7.352796046183681e+02 +1652 1769 -6.289529049931513e+02 +1652 1770 -5.429674662554822e+02 +1652 1771 -4.803677035258846e+02 +1652 1772 -4.402579127124382e+02 +1652 1773 -4.208084537187713e+02 +1653 1585 -8.148024630667926e+02 +1653 1586 -8.643348602446076e+02 +1653 1587 -9.695072463564434e+02 +1653 1588 -1.141773184361042e+03 +1653 1589 -1.394551574360510e+03 +1653 1590 -1.733190400658708e+03 +1653 1591 -2.134265778758326e+03 +1653 1592 -2.521021940438000e+03 +1653 1593 -2.767706810094291e+03 +1653 1738 -5.136224430633882e+03 +1653 1739 -4.560278038130823e+03 +1653 1740 -3.699147964795180e+03 +1653 1741 -2.861294172280346e+03 +1653 1742 -2.199157547087201e+03 +1653 1743 -1.733190400658708e+03 +1653 1744 -1.430197816180122e+03 +1653 1745 -1.251286952144484e+03 +1653 1746 -1.168677565678393e+03 +1653 1765 -1.228588660544053e+03 +1653 1766 -1.148042053110080e+03 +1653 1767 -1.015511306612467e+03 +1653 1768 -8.685786765383800e+02 +1653 1769 -7.352796046183681e+02 +1653 1770 -6.289529049931513e+02 +1653 1771 -5.524312223207850e+02 +1653 1772 -5.038180997021789e+02 +1653 1773 -4.803677035258846e+02 +1654 1585 -7.058924559832867e+02 +1654 1586 -7.463158073460687e+02 +1654 1587 -8.315436028021828e+02 +1654 1588 -9.695072463564434e+02 +1654 1589 -1.168677565678393e+03 +1654 1590 -1.430197816180122e+03 +1654 1591 -1.733190400658708e+03 +1654 1592 -2.019368486704435e+03 +1654 1593 -2.199157547087201e+03 +1654 1738 -7.138491575686282e+03 +1654 1739 -6.235592529048601e+03 +1654 1740 -4.925216936196723e+03 +1654 1741 -3.699147964795180e+03 +1654 1742 -2.767706810094291e+03 +1654 1743 -2.134265778758326e+03 +1654 1744 -1.733190400658708e+03 +1654 1745 -1.500725861549673e+03 +1654 1746 -1.394551574360510e+03 +1654 1765 -1.471477730866027e+03 +1654 1766 -1.368148367306964e+03 +1654 1767 -1.199743197084304e+03 +1654 1768 -1.015511306612467e+03 +1654 1769 -8.507888885505199e+02 +1654 1770 -7.211778000851799e+02 +1654 1771 -6.289529049931513e+02 +1654 1772 -5.708523475060541e+02 +1654 1773 -5.429674662554822e+02 +1655 1585 -6.378158089920671e+02 +1655 1586 -6.728335244699299e+02 +1655 1587 -7.463158073460687e+02 +1655 1588 -8.643348602446076e+02 +1655 1589 -1.032880208377977e+03 +1655 1590 -1.251286952144484e+03 +1655 1591 -1.500725861549673e+03 +1655 1592 -1.733190400658708e+03 +1655 1593 -1.877824568765017e+03 +1655 1738 -9.405703259334639e+03 +1655 1739 -8.091232579773156e+03 +1655 1740 -6.235592529048601e+03 +1655 1741 -4.560278038130823e+03 +1655 1742 -3.331754877699595e+03 +1655 1743 -2.521021940438000e+03 +1655 1744 -2.019368486704435e+03 +1655 1745 -1.733190400658708e+03 +1655 1746 -1.603684467943633e+03 +1655 1765 -1.697437739078449e+03 +1655 1766 -1.571600895131404e+03 +1655 1767 -1.368148367306964e+03 +1655 1768 -1.148042053110080e+03 +1655 1769 -9.536070604341750e+02 +1655 1770 -8.023274760830675e+02 +1655 1771 -6.956816209337401e+02 +1655 1772 -6.289529049931513e+02 +1655 1773 -5.970589583440825e+02 +1656 1585 -6.052974323170196e+02 +1656 1586 -6.378158089920671e+02 +1656 1587 -7.058924559832867e+02 +1656 1588 -8.148024630667926e+02 +1656 1589 -9.695072463564434e+02 +1656 1590 -1.168677565678393e+03 +1656 1591 -1.394551574360510e+03 +1656 1592 -1.603684467943633e+03 +1656 1593 -1.733190400658708e+03 +1656 1738 -1.103972130715926e+04 +1656 1739 -9.405703259334639e+03 +1656 1740 -7.138491575686282e+03 +1656 1741 -5.136224430633882e+03 +1656 1742 -3.699147964795180e+03 +1656 1743 -2.767706810094291e+03 +1656 1744 -2.199157547087201e+03 +1656 1745 -1.877824568765017e+03 +1656 1746 -1.733190400658708e+03 +1656 1765 -1.837845240586539e+03 +1656 1766 -1.697437739078449e+03 +1656 1767 -1.471477730866027e+03 +1656 1768 -1.228588660544053e+03 +1656 1769 -1.015511306612467e+03 +1656 1770 -8.507888885505199e+02 +1656 1771 -7.352796046183681e+02 +1656 1772 -6.632839990295113e+02 +1656 1773 -6.289529049931513e+02 +1675 1585 -6.289529049931513e+02 +1675 1586 -6.632839990295113e+02 +1675 1587 -7.352796046183681e+02 +1675 1588 -8.507888885505199e+02 +1675 1589 -1.015511306612467e+03 +1675 1590 -1.228588660544053e+03 +1675 1591 -1.471477730866027e+03 +1675 1592 -1.697437739078449e+03 +1675 1593 -1.837845240586539e+03 +1675 1612 -1.733190400658708e+03 +1675 1613 -1.877824568765017e+03 +1675 1614 -2.199157547087201e+03 +1675 1615 -2.767706810094291e+03 +1675 1616 -3.699147964795180e+03 +1675 1617 -5.136224430633882e+03 +1675 1618 -7.138491575686282e+03 +1675 1619 -9.405703259334639e+03 +1675 1620 -1.103972130715926e+04 +1675 1765 -1.733190400658708e+03 +1675 1766 -1.603684467943633e+03 +1675 1767 -1.394551574360510e+03 +1675 1768 -1.168677565678393e+03 +1675 1769 -9.695072463564434e+02 +1675 1770 -8.148024630667926e+02 +1675 1771 -7.058924559832867e+02 +1675 1772 -6.378158089920671e+02 +1675 1773 -6.052974323170196e+02 +1676 1585 -5.970589583440825e+02 +1676 1586 -6.289529049931513e+02 +1676 1587 -6.956816209337401e+02 +1676 1588 -8.023274760830675e+02 +1676 1589 -9.536070604341750e+02 +1676 1590 -1.148042053110080e+03 +1676 1591 -1.368148367306964e+03 +1676 1592 -1.571600895131404e+03 +1676 1593 -1.697437739078449e+03 +1676 1612 -1.603684467943633e+03 +1676 1613 -1.733190400658708e+03 +1676 1614 -2.019368486704435e+03 +1676 1615 -2.521021940438000e+03 +1676 1616 -3.331754877699595e+03 +1676 1617 -4.560278038130823e+03 +1676 1618 -6.235592529048601e+03 +1676 1619 -8.091232579773156e+03 +1676 1620 -9.405703259334639e+03 +1676 1765 -1.877824568765017e+03 +1676 1766 -1.733190400658708e+03 +1676 1767 -1.500725861549673e+03 +1676 1768 -1.251286952144484e+03 +1676 1769 -1.032880208377977e+03 +1676 1770 -8.643348602446076e+02 +1676 1771 -7.463158073460687e+02 +1676 1772 -6.728335244699299e+02 +1676 1773 -6.378158089920671e+02 +1677 1585 -5.429674662554822e+02 +1677 1586 -5.708523475060541e+02 +1677 1587 -6.289529049931513e+02 +1677 1588 -7.211778000851799e+02 +1677 1589 -8.507888885505199e+02 +1677 1590 -1.015511306612467e+03 +1677 1591 -1.199743197084304e+03 +1677 1592 -1.368148367306964e+03 +1677 1593 -1.471477730866027e+03 +1677 1612 -1.394551574360510e+03 +1677 1613 -1.500725861549673e+03 +1677 1614 -1.733190400658708e+03 +1677 1615 -2.134265778758326e+03 +1677 1616 -2.767706810094291e+03 +1677 1617 -3.699147964795180e+03 +1677 1618 -4.925216936196723e+03 +1677 1619 -6.235592529048601e+03 +1677 1620 -7.138491575686282e+03 +1677 1765 -2.199157547087201e+03 +1677 1766 -2.019368486704435e+03 +1677 1767 -1.733190400658708e+03 +1677 1768 -1.430197816180122e+03 +1677 1769 -1.168677565678393e+03 +1677 1770 -9.695072463564434e+02 +1677 1771 -8.315436028021828e+02 +1677 1772 -7.463158073460687e+02 +1677 1773 -7.058924559832867e+02 +1678 1585 -4.803677035258846e+02 +1678 1586 -5.038180997021789e+02 +1678 1587 -5.524312223207850e+02 +1678 1588 -6.289529049931513e+02 +1678 1589 -7.352796046183681e+02 +1678 1590 -8.685786765383800e+02 +1678 1591 -1.015511306612467e+03 +1678 1592 -1.148042053110080e+03 +1678 1593 -1.228588660544053e+03 +1678 1612 -1.168677565678393e+03 +1678 1613 -1.251286952144484e+03 +1678 1614 -1.430197816180122e+03 +1678 1615 -1.733190400658708e+03 +1678 1616 -2.199157547087201e+03 +1678 1617 -2.861294172280346e+03 +1678 1618 -3.699147964795180e+03 +1678 1619 -4.560278038130823e+03 +1678 1620 -5.136224430633882e+03 +1678 1765 -2.767706810094291e+03 +1678 1766 -2.521021940438000e+03 +1678 1767 -2.134265778758326e+03 +1678 1768 -1.733190400658708e+03 +1678 1769 -1.394551574360510e+03 +1678 1770 -1.141773184361042e+03 +1678 1771 -9.695072463564434e+02 +1678 1772 -8.643348602446076e+02 +1678 1773 -8.148024630667926e+02 +1679 1585 -4.208084537187713e+02 +1679 1586 -4.402579127124382e+02 +1679 1587 -4.803677035258846e+02 +1679 1588 -5.429674662554822e+02 +1679 1589 -6.289529049931513e+02 +1679 1590 -7.352796046183681e+02 +1679 1591 -8.507888885505199e+02 +1679 1592 -9.536070604341750e+02 +1679 1593 -1.015511306612467e+03 +1679 1612 -9.695072463564434e+02 +1679 1613 -1.032880208377977e+03 +1679 1614 -1.168677565678393e+03 +1679 1615 -1.394551574360510e+03 +1679 1616 -1.733190400658708e+03 +1679 1617 -2.199157547087201e+03 +1679 1618 -2.767706810094291e+03 +1679 1619 -3.331754877699595e+03 +1679 1620 -3.699147964795180e+03 +1679 1765 -3.699147964795180e+03 +1679 1766 -3.331754877699595e+03 +1679 1767 -2.767706810094291e+03 +1679 1768 -2.199157547087201e+03 +1679 1769 -1.733190400658708e+03 +1679 1770 -1.394551574360510e+03 +1679 1771 -1.168677565678393e+03 +1679 1772 -1.032880208377977e+03 +1679 1773 -9.695072463564434e+02 +1680 1585 -3.710963518270331e+02 +1680 1586 -3.873813675510144e+02 +1680 1587 -4.208084537187713e+02 +1680 1588 -4.725808574370885e+02 +1680 1589 -5.429674662554822e+02 +1680 1590 -6.289529049931513e+02 +1680 1591 -7.211778000851799e+02 +1680 1592 -8.023274760830675e+02 +1680 1593 -8.507888885505199e+02 +1680 1612 -8.148024630667926e+02 +1680 1613 -8.643348602446076e+02 +1680 1614 -9.695072463564434e+02 +1680 1615 -1.141773184361042e+03 +1680 1616 -1.394551574360510e+03 +1680 1617 -1.733190400658708e+03 +1680 1618 -2.134265778758326e+03 +1680 1619 -2.521021940438000e+03 +1680 1620 -2.767706810094291e+03 +1680 1765 -5.136224430633882e+03 +1680 1766 -4.560278038130823e+03 +1680 1767 -3.699147964795180e+03 +1680 1768 -2.861294172280346e+03 +1680 1769 -2.199157547087201e+03 +1680 1770 -1.733190400658708e+03 +1680 1771 -1.430197816180122e+03 +1680 1772 -1.251286952144484e+03 +1680 1773 -1.168677565678393e+03 +1681 1585 -3.339204550667988e+02 +1681 1586 -3.479505460244110e+02 +1681 1587 -3.766415408901786e+02 +1681 1588 -4.208084537187713e+02 +1681 1589 -4.803677035258846e+02 +1681 1590 -5.524312223207850e+02 +1681 1591 -6.289529049931513e+02 +1681 1592 -6.956816209337401e+02 +1681 1593 -7.352796046183681e+02 +1681 1612 -7.058924559832867e+02 +1681 1613 -7.463158073460687e+02 +1681 1614 -8.315436028021828e+02 +1681 1615 -9.695072463564434e+02 +1681 1616 -1.168677565678393e+03 +1681 1617 -1.430197816180122e+03 +1681 1618 -1.733190400658708e+03 +1681 1619 -2.019368486704435e+03 +1681 1620 -2.199157547087201e+03 +1681 1765 -7.138491575686282e+03 +1681 1766 -6.235592529048601e+03 +1681 1767 -4.925216936196723e+03 +1681 1768 -3.699147964795180e+03 +1681 1769 -2.767706810094291e+03 +1681 1770 -2.134265778758326e+03 +1681 1771 -1.733190400658708e+03 +1681 1772 -1.500725861549673e+03 +1681 1773 -1.394551574360510e+03 +1682 1585 -3.096178268240465e+02 +1682 1586 -3.222285372305477e+02 +1682 1587 -3.479505460244110e+02 +1682 1588 -3.873813675510144e+02 +1682 1589 -4.402579127124382e+02 +1682 1590 -5.038180997021789e+02 +1682 1591 -5.708523475060541e+02 +1682 1592 -6.289529049931513e+02 +1682 1593 -6.632839990295113e+02 +1682 1612 -6.378158089920671e+02 +1682 1613 -6.728335244699299e+02 +1682 1614 -7.463158073460687e+02 +1682 1615 -8.643348602446076e+02 +1682 1616 -1.032880208377977e+03 +1682 1617 -1.251286952144484e+03 +1682 1618 -1.500725861549673e+03 +1682 1619 -1.733190400658708e+03 +1682 1620 -1.877824568765017e+03 +1682 1765 -9.405703259334639e+03 +1682 1766 -8.091232579773156e+03 +1682 1767 -6.235592529048601e+03 +1682 1768 -4.560278038130823e+03 +1682 1769 -3.331754877699595e+03 +1682 1770 -2.521021940438000e+03 +1682 1771 -2.019368486704435e+03 +1682 1772 -1.733190400658708e+03 +1682 1773 -1.603684467943633e+03 +1683 1585 -2.976873911031298e+02 +1683 1586 -3.096178268240465e+02 +1683 1587 -3.339204550667988e+02 +1683 1588 -3.710963518270331e+02 +1683 1589 -4.208084537187713e+02 +1683 1590 -4.803677035258846e+02 +1683 1591 -5.429674662554822e+02 +1683 1592 -5.970589583440825e+02 +1683 1593 -6.289529049931513e+02 +1683 1612 -6.052974323170196e+02 +1683 1613 -6.378158089920671e+02 +1683 1614 -7.058924559832867e+02 +1683 1615 -8.148024630667926e+02 +1683 1616 -9.695072463564434e+02 +1683 1617 -1.168677565678393e+03 +1683 1618 -1.394551574360510e+03 +1683 1619 -1.603684467943633e+03 +1683 1620 -1.733190400658708e+03 +1683 1765 -1.103972130715926e+04 +1683 1766 -9.405703259334639e+03 +1683 1767 -7.138491575686282e+03 +1683 1768 -5.136224430633882e+03 +1683 1769 -3.699147964795180e+03 +1683 1770 -2.767706810094291e+03 +1683 1771 -2.199157547087201e+03 +1683 1772 -1.877824568765017e+03 +1683 1773 -1.733190400658708e+03 +1702 1 -6.162005167844603e-01 +1702 2 -6.478290624440273e-01 +1702 3 -7.137261578095764e-01 +1702 4 -8.183170326055945e-01 +1702 5 -9.652884463905012e-01 +1702 6 -1.152045612945678e+00 +1702 7 -1.360887952118583e+00 +1702 8 -1.551760741373023e+00 +1702 9 -1.668863110826555e+00 +1702 568 -1.692568750643269e+00 +1702 569 -1.825602022047363e+00 +1702 570 -2.118310613133422e+00 +1702 571 -2.627614132977349e+00 +1702 572 -3.441873371322745e+00 +1702 573 -4.658393121952510e+00 +1702 574 -6.289816136769566e+00 +1702 575 -8.066396227455577e+00 +1702 576 -9.308348002235288e+00 +1703 1 -5.865809664013769e-01 +1703 2 -6.160812483634749e-01 +1703 3 -6.774167410319347e-01 +1703 4 -7.744349425866087e-01 +1703 5 -9.101324942258833e-01 +1703 6 -1.081601773927926e+00 +1703 7 -1.272204792965373e+00 +1703 8 -1.445453388306640e+00 +1703 9 -1.551326188170236e+00 +1703 568 -1.572721720288759e+00 +1703 569 -1.692568750643269e+00 +1703 570 -1.955005166107604e+00 +1703 571 -2.407897866700162e+00 +1703 572 -3.123418860129884e+00 +1703 573 -4.176015720938289e+00 +1703 574 -5.562272020881102e+00 +1703 575 -7.044608140614899e+00 +1703 576 -8.066396227455581e+00 +1704 1 -5.360760519950343e-01 +1704 2 -5.620506436757026e-01 +1704 3 -6.158571844841060e-01 +1704 4 -7.004522660564482e-01 +1704 5 -8.178063234380492e-01 +1704 6 -9.646448843535066e-01 +1704 7 -1.126168560851712e+00 +1704 8 -1.271586461572002e+00 +1704 9 -1.359847093049060e+00 +1704 568 -1.377630306274569e+00 +1704 569 -1.476924503791048e+00 +1704 570 -1.692568750643269e+00 +1704 571 -2.059501442724468e+00 +1704 572 -2.627614132977349e+00 +1704 573 -3.441873371322745e+00 +1704 574 -4.482417214623956e+00 +1704 575 -5.562272020881102e+00 +1704 576 -6.289816136769567e+00 +1705 1 -4.771748485999386e-01 +1705 2 -4.992100478166410e-01 +1705 3 -5.446485853551305e-01 +1705 4 -6.155554843954473e-01 +1705 5 -7.129338469046965e-01 +1705 6 -8.333228824564292e-01 +1705 7 -9.640794416705641e-01 +1705 8 -1.080445857413130e+00 +1705 9 -1.150497018599473e+00 +1705 568 -1.164560971009494e+00 +1705 569 -1.242789029898726e+00 +1705 570 -1.411025407928763e+00 +1705 571 -1.692568750643269e+00 +1705 572 -2.118310613133423e+00 +1705 573 -2.710493887836724e+00 +1705 574 -3.441873371322745e+00 +1705 575 -4.176015720938289e+00 +1705 576 -4.658393121952511e+00 +1706 1 -4.206467334735816e-01 +1706 2 -4.390870812134406e-01 +1706 3 -4.769348167824555e-01 +1706 4 -5.355452838374449e-01 +1706 5 -6.152126550891496e-01 +1706 6 -7.125127689213320e-01 +1706 7 -8.168477108343095e-01 +1706 8 -9.086328186273338e-01 +1706 9 -9.634370076687800e-01 +1706 568 -9.744009411995010e-01 +1706 569 -1.035156024564130e+00 +1706 570 -1.164560971009494e+00 +1706 571 -1.377630306274569e+00 +1706 572 -1.692568750643269e+00 +1706 573 -2.118310613133423e+00 +1706 574 -2.627614132977349e+00 +1706 575 -3.123418860129884e+00 +1706 576 -3.441873371322747e+00 +1707 1 -3.730673665120094e-01 +1707 2 -3.886330314655431e-01 +1707 3 -4.204455407347000e-01 +1707 4 -4.693709761542122e-01 +1707 5 -5.352631678456060e-01 +1707 6 -6.148700930342391e-01 +1707 7 -6.992703419664850e-01 +1707 8 -7.727668187490034e-01 +1707 9 -8.163382848445681e-01 +1707 568 -8.250281026921222e-01 +1707 569 -8.730237114863630e-01 +1707 570 -9.744009411995010e-01 +1707 571 -1.139004803923774e+00 +1707 572 -1.377630306274569e+00 +1707 573 -1.692568750643269e+00 +1707 574 -2.059501442724468e+00 +1707 575 -2.407897866700162e+00 +1707 576 -2.627614132977350e+00 +1708 1 -3.372297028644913e-01 +1708 2 -3.507275275451662e-01 +1708 3 -3.782201346679643e-01 +1708 4 -4.202687261188718e-01 +1708 5 -4.764841616901885e-01 +1708 6 -5.438174501422909e-01 +1708 7 -6.145690696500914e-01 +1708 8 -6.756897927034838e-01 +1708 9 -7.117223427415745e-01 +1708 568 -7.188912825296515e-01 +1708 569 -7.583858575750241e-01 +1708 570 -8.412684343873768e-01 +1708 571 -9.744009411995010e-01 +1708 572 -1.164560971009494e+00 +1708 573 -1.411025407928763e+00 +1708 574 -1.692568750643269e+00 +1708 575 -1.955005166107604e+00 +1708 576 -2.118310613133424e+00 +1709 1 -3.136745651272539e-01 +1709 2 -3.258614897260794e-01 +1709 3 -3.506257015251436e-01 +1709 4 -3.883571662753673e-01 +1709 5 -4.385463909860715e-01 +1709 6 -4.983077465792363e-01 +1709 7 -5.607207329882316e-01 +1709 8 -6.143457752911261e-01 +1709 9 -6.458397702064286e-01 +1709 568 -6.520955051698261e-01 +1709 569 -6.864998175457022e-01 +1709 570 -7.583858575750239e-01 +1709 571 -8.730237114863630e-01 +1709 572 -1.035156024564130e+00 +1709 573 -1.242789029898726e+00 +1709 574 -1.476924503791048e+00 +1709 575 -1.692568750643269e+00 +1709 576 -1.825602022047363e+00 +1710 1 -3.020723387778803e-01 +1710 2 -3.136282204841275e-01 +1710 3 -3.370820519210149e-01 +1710 4 -3.727478224907735e-01 +1710 5 -4.200677864283204e-01 +1710 6 -4.762446160907916e-01 +1710 7 -5.347335258930616e-01 +1710 8 -5.848497573061521e-01 +1710 9 -6.142270091391578e-01 +1710 568 -6.200575078934891e-01 +1710 569 -6.520955051698263e-01 +1710 570 -7.188912825296515e-01 +1710 571 -8.250281026921222e-01 +1710 572 -9.744009411995010e-01 +1710 573 -1.164560971009494e+00 +1710 574 -1.377630306274569e+00 +1710 575 -1.572721720288760e+00 +1710 576 -1.692568750643270e+00 +1711 1144 -9.574614729634387e+00 +1711 1145 -1.033025206259609e+01 +1711 1146 -1.199392684783545e+01 +1711 1147 -1.489187979900572e+01 +1711 1148 -1.953249673072867e+01 +1711 1149 -2.648026715992622e+01 +1711 1150 -3.582072268161380e+01 +1711 1151 -4.601776203532702e+01 +1711 1152 -5.316004558269722e+01 +1712 1144 -8.894152732809214e+00 +1712 1145 -9.574614729634387e+00 +1712 1146 -1.106556701616914e+01 +1712 1147 -1.364121235299754e+01 +1712 1148 -1.771654764348813e+01 +1712 1149 -2.372339702886325e+01 +1712 1150 -3.165228467591593e+01 +1712 1151 -4.014998583800264e+01 +1712 1152 -4.601776203532702e+01 +1713 1144 -7.787064219095081e+00 +1713 1145 -8.350436340807201e+00 +1713 1146 -9.574614729634387e+00 +1713 1147 -1.165955788548230e+01 +1713 1148 -1.489187979900572e+01 +1713 1149 -1.953249673072867e+01 +1713 1150 -2.547425580969110e+01 +1713 1151 -3.165228467591599e+01 +1713 1152 -3.582072268161387e+01 +1714 1144 -6.578858018778778e+00 +1714 1145 -7.022334130042162e+00 +1714 1146 -7.976517934049889e+00 +1714 1147 -9.574614729634387e+00 +1714 1148 -1.199392684783545e+01 +1714 1149 -1.536382589350010e+01 +1714 1150 -1.953249673072864e+01 +1714 1151 -2.372339702886325e+01 +1714 1152 -2.648026715992622e+01 +1715 1144 -5.501432160761325e+00 +1715 1145 -5.845568772761844e+00 +1715 1146 -6.578858018778778e+00 +1715 1147 -7.787064219095081e+00 +1715 1148 -9.574614729634387e+00 +1715 1149 -1.199392684783545e+01 +1715 1150 -1.489187979900570e+01 +1715 1151 -1.771654764348813e+01 +1715 1152 -1.953249673072867e+01 +1716 1144 -4.655741575368517e+00 +1716 1145 -4.927408805516037e+00 +1716 1146 -5.501432160761325e+00 +1716 1147 -6.434009698761969e+00 +1716 1148 -7.787064219095081e+00 +1716 1149 -9.574614729634387e+00 +1716 1150 -1.165955788548229e+01 +1716 1151 -1.364121235299754e+01 +1716 1152 -1.489187979900572e+01 +1717 1144 -4.055212971361419e+00 +1717 1145 -4.278637194083236e+00 +1717 1146 -4.747658828821052e+00 +1717 1147 -5.501432160761331e+00 +1717 1148 -6.578858018778784e+00 +1717 1149 -7.976517934049897e+00 +1717 1150 -9.574614729634387e+00 +1717 1151 -1.106556701616915e+01 +1717 1152 -1.199392684783546e+01 +1718 1144 -3.677452266447854e+00 +1718 1145 -3.872006983680974e+00 +1718 1146 -4.278637194083233e+00 +1718 1147 -4.927408805516037e+00 +1718 1148 -5.845568772761844e+00 +1718 1149 -7.022334130042162e+00 +1718 1150 -8.350436340807194e+00 +1718 1151 -9.574614729634387e+00 +1718 1152 -1.033025206259609e+01 +1719 1144 -3.496313214985748e+00 +1719 1145 -3.677452266447854e+00 +1719 1146 -4.055212971361416e+00 +1719 1147 -4.655741575368517e+00 +1719 1148 -5.501432160761325e+00 +1719 1149 -6.578858018778778e+00 +1719 1150 -7.787064219095073e+00 +1719 1151 -8.894152732809214e+00 +1719 1152 -9.574614729634387e+00 +1720 1432 -5.416220002058462e+01 +1720 1433 -5.847168336242214e+01 +1720 1434 -6.797204698756184e+01 +1720 1435 -8.455751811575986e+01 +1720 1436 -1.112023202068744e+02 +1720 1437 -1.512628164030906e+02 +1720 1438 -2.053883607687489e+02 +1720 1439 -2.647767438527630e+02 +1720 1440 -3.065373731090118e+02 +1720 1999 -5.416220002058462e+01 +1720 2000 -5.028460369863171e+01 +1720 2001 -4.398263164573866e+01 +1720 2002 -3.711530555640490e+01 +1720 2003 -3.100122392289864e+01 +1720 2004 -2.620940698061742e+01 +1720 2005 -2.281096793104268e+01 +1720 2006 -2.067515029553633e+01 +1720 2007 -1.965157861598590e+01 +1720 2134 -1.965477828103598e+01 +1720 2135 -1.870055440211151e+01 +1720 2136 -1.707507926940499e+01 +1720 2137 -1.518203609416468e+01 +1720 2138 -1.336813651340294e+01 +1720 2139 -1.184372960400065e+01 +1720 2140 -1.069703031088084e+01 +1720 2141 -9.944085360683063e+00 +1720 2142 -9.573445684409064e+00 +1721 1432 -5.028460369863171e+01 +1721 1433 -5.416220002058462e+01 +1721 1434 -6.266865647386096e+01 +1721 1435 -7.739429142416682e+01 +1721 1436 -1.007640600234616e+02 +1721 1437 -1.353445496343036e+02 +1721 1438 -1.811983282511275e+02 +1721 1439 -2.305668762810884e+02 +1721 1440 -2.647767438527630e+02 +1721 1999 -5.847168336242214e+01 +1721 2000 -5.416220002058462e+01 +1721 2001 -4.718848846240646e+01 +1721 2002 -3.963467701820890e+01 +1721 2003 -3.295302401855845e+01 +1721 2004 -2.774798050936779e+01 +1721 2005 -2.407490908992506e+01 +1721 2006 -2.177494503977683e+01 +1721 2007 -2.067515029553633e+01 +1721 2134 -2.067858569511584e+01 +1721 2135 -1.965477828103598e+01 +1721 2136 -1.791417887437397e+01 +1721 2137 -1.589274010473518e+01 +1721 2138 -1.396191802264486e+01 +1721 2139 -1.234420052045069e+01 +1721 2140 -1.113049648221346e+01 +1721 2141 -1.033512964800000e+01 +1721 2142 -9.944085360683063e+00 +1722 1432 -4.398263164573866e+01 +1722 1433 -4.718848846240646e+01 +1722 1434 -5.416220002058462e+01 +1722 1435 -6.606134132672688e+01 +1722 1436 -8.455751811576010e+01 +1722 1437 -1.112023202068747e+02 +1722 1438 -1.454508347890311e+02 +1722 1439 -1.811983282511275e+02 +1722 1440 -2.053883607687489e+02 +1722 1999 -6.797204698756184e+01 +1722 2000 -6.266865647386096e+01 +1722 2001 -5.416220002058462e+01 +1722 2002 -4.506046026496942e+01 +1722 2003 -3.711530555640482e+01 +1722 2004 -3.100122392289858e+01 +1722 2005 -2.672989532903555e+01 +1722 2006 -2.407490908992506e+01 +1722 2007 -2.281096793104268e+01 +1722 2134 -2.281491025526307e+01 +1722 2135 -2.164167292784031e+01 +1722 2136 -1.965477828103598e+01 +1722 2137 -1.736013665098131e+01 +1722 2138 -1.518203609416466e+01 +1722 2139 -1.336813651340292e+01 +1722 2140 -1.201426721054981e+01 +1722 2141 -1.113049648221346e+01 +1722 2142 -1.069703031088084e+01 +1723 1432 -3.711530555640490e+01 +1723 1433 -3.963467701820890e+01 +1723 1434 -4.506046026496942e+01 +1723 1435 -5.416220002058462e+01 +1723 1436 -6.797204698756201e+01 +1723 1437 -8.726265053974967e+01 +1723 1438 -1.112023202068747e+02 +1723 1439 -1.353445496343036e+02 +1723 1440 -1.512628164030906e+02 +1723 1999 -8.455751811575986e+01 +1723 2000 -7.739429142416682e+01 +1723 2001 -6.606134132672688e+01 +1723 2002 -5.416220002058462e+01 +1723 2003 -4.398263164573857e+01 +1723 2004 -3.629276779865588e+01 +1723 2005 -3.100122392289858e+01 +1723 2006 -2.774798050936779e+01 +1723 2007 -2.620940698061742e+01 +1723 2134 -2.621419542240643e+01 +1723 2135 -2.479209926714913e+01 +1723 2136 -2.239757409043196e+01 +1723 2137 -1.965477828103598e+01 +1723 2138 -1.707507926940496e+01 +1723 2139 -1.494561758129197e+01 +1723 2140 -1.336813651340292e+01 +1723 2141 -1.234420052045069e+01 +1723 2142 -1.184372960400065e+01 +1724 1432 -3.100122392289864e+01 +1724 1433 -3.295302401855845e+01 +1724 1434 -3.711530555640482e+01 +1724 1435 -4.398263164573857e+01 +1724 1436 -5.416220002058462e+01 +1724 1437 -6.797204698756201e+01 +1724 1438 -8.455751811576010e+01 +1724 1439 -1.007640600234616e+02 +1724 1440 -1.112023202068744e+02 +1724 1999 -1.112023202068744e+02 +1724 2000 -1.007640600234616e+02 +1724 2001 -8.455751811576010e+01 +1724 2002 -6.797204698756201e+01 +1724 2003 -5.416220002058462e+01 +1724 2004 -4.398263164573857e+01 +1724 2005 -3.711530555640482e+01 +1724 2006 -3.295302401855845e+01 +1724 2007 -3.100122392289864e+01 +1724 2134 -3.100728135248165e+01 +1724 2135 -2.921308657465229e+01 +1724 2136 -2.621419542240647e+01 +1724 2137 -2.281491025526310e+01 +1724 2138 -1.965477828103598e+01 +1724 2139 -1.707507926940496e+01 +1724 2140 -1.518203609416466e+01 +1724 2141 -1.396191802264486e+01 +1724 2142 -1.336813651340294e+01 +1725 1432 -2.620940698061742e+01 +1725 1433 -2.774798050936779e+01 +1725 1434 -3.100122392289858e+01 +1725 1435 -3.629276779865588e+01 +1725 1436 -4.398263164573857e+01 +1725 1437 -5.416220002058462e+01 +1725 1438 -6.606134132672688e+01 +1725 1439 -7.739429142416682e+01 +1725 1440 -8.455751811575986e+01 +1725 1999 -1.512628164030906e+02 +1725 2000 -1.353445496343036e+02 +1725 2001 -1.112023202068747e+02 +1725 2002 -8.726265053974967e+01 +1725 2003 -6.797204698756201e+01 +1725 2004 -5.416220002058462e+01 +1725 2005 -4.506046026496942e+01 +1725 2006 -3.963467701820890e+01 +1725 2007 -3.711530555640490e+01 +1725 2134 -3.712309913086538e+01 +1725 2135 -3.482168460593341e+01 +1725 2136 -3.100728135248171e+01 +1725 2137 -2.673481743251412e+01 +1725 2138 -2.281491025526310e+01 +1725 2139 -1.965477828103598e+01 +1725 2140 -1.736013665098131e+01 +1725 2141 -1.589274010473518e+01 +1725 2142 -1.518203609416468e+01 +1726 1432 -2.281096793104268e+01 +1726 1433 -2.407490908992506e+01 +1726 1434 -2.672989532903555e+01 +1726 1435 -3.100122392289858e+01 +1726 1436 -3.711530555640482e+01 +1726 1437 -4.506046026496942e+01 +1726 1438 -5.416220002058462e+01 +1726 1439 -6.266865647386096e+01 +1726 1440 -6.797204698756184e+01 +1726 1999 -2.053883607687489e+02 +1726 2000 -1.811983282511275e+02 +1726 2001 -1.454508347890311e+02 +1726 2002 -1.112023202068747e+02 +1726 2003 -8.455751811576010e+01 +1726 2004 -6.606134132672688e+01 +1726 2005 -5.416220002058462e+01 +1726 2006 -4.718848846240646e+01 +1726 2007 -4.398263164573866e+01 +1726 2134 -4.399251628020367e+01 +1726 2135 -4.108257963331437e+01 +1726 2136 -3.630032063351624e+01 +1726 2137 -3.100728135248171e+01 +1726 2138 -2.621419542240647e+01 +1726 2139 -2.239757409043196e+01 +1726 2140 -1.965477828103598e+01 +1726 2141 -1.791417887437397e+01 +1726 2142 -1.707507926940499e+01 +1727 1432 -2.067515029553633e+01 +1727 1433 -2.177494503977683e+01 +1727 1434 -2.407490908992506e+01 +1727 1435 -2.774798050936779e+01 +1727 1436 -3.295302401855845e+01 +1727 1437 -3.963467701820890e+01 +1727 1438 -4.718848846240646e+01 +1727 1439 -5.416220002058462e+01 +1727 1440 -5.847168336242214e+01 +1727 1999 -2.647767438527630e+02 +1727 2000 -2.305668762810884e+02 +1727 2001 -1.811983282511275e+02 +1727 2002 -1.353445496343036e+02 +1727 2003 -1.007640600234616e+02 +1727 2004 -7.739429142416682e+01 +1727 2005 -6.266865647386096e+01 +1727 2006 -5.416220002058462e+01 +1727 2007 -5.028460369863171e+01 +1727 2134 -5.029652653878190e+01 +1727 2135 -4.679557686118159e+01 +1727 2136 -4.108257963331437e+01 +1727 2137 -3.482168460593341e+01 +1727 2138 -2.921308657465229e+01 +1727 2139 -2.479209926714913e+01 +1727 2140 -2.164167292784031e+01 +1727 2141 -1.965477828103598e+01 +1727 2142 -1.870055440211151e+01 +1728 1432 -1.965157861598590e+01 +1728 1433 -2.067515029553633e+01 +1728 1434 -2.281096793104268e+01 +1728 1435 -2.620940698061742e+01 +1728 1436 -3.100122392289864e+01 +1728 1437 -3.711530555640490e+01 +1728 1438 -4.398263164573866e+01 +1728 1439 -5.028460369863171e+01 +1728 1440 -5.416220002058462e+01 +1728 1999 -3.065373731090118e+02 +1728 2000 -2.647767438527630e+02 +1728 2001 -2.053883607687489e+02 +1728 2002 -1.512628164030906e+02 +1728 2003 -1.112023202068744e+02 +1728 2004 -8.455751811575986e+01 +1728 2005 -6.797204698756184e+01 +1728 2006 -5.847168336242214e+01 +1728 2007 -5.416220002058462e+01 +1728 2134 -5.417542964960961e+01 +1728 2135 -5.029652653878190e+01 +1728 2136 -4.399251628020367e+01 +1728 2137 -3.712309913086538e+01 +1728 2138 -3.100728135248165e+01 +1728 2139 -2.621419542240643e+01 +1728 2140 -2.281491025526307e+01 +1728 2141 -2.067858569511584e+01 +1728 2142 -1.965477828103598e+01 +1729 1576 -3.063876713483004e+02 +1729 1577 -3.311617365195747e+02 +1729 1578 -3.859179776157605e+02 +1729 1579 -4.819366867771664e+02 +1729 1580 -6.371952057562402e+02 +1729 1581 -8.726231103602357e+02 +1729 1582 -1.193932486839834e+03 +1729 1583 -1.550121445008505e+03 +1729 1584 -1.802596433195456e+03 +1729 1864 -3.063876713483004e+02 +1729 1865 -2.841326260213855e+02 +1729 1866 -2.480403651673271e+02 +1729 1867 -2.088271183655457e+02 +1729 1868 -1.740274317161707e+02 +1729 1869 -1.468355065336023e+02 +1729 1870 -1.275984131219179e+02 +1729 1871 -1.155304899028561e+02 +1729 1872 -1.097534196790493e+02 +1729 1927 -1.111842160419089e+02 +1729 1928 -1.057061586526018e+02 +1729 1929 -9.638822517401589e+01 +1729 1930 -8.555928471614156e+01 +1729 1931 -7.520762033775921e+01 +1729 1932 -6.652797451218323e+01 +1729 1933 -6.001174723167335e+01 +1729 1934 -5.573941364116940e+01 +1729 1935 -5.363826960242956e+01 +1730 1576 -2.841326260213855e+02 +1730 1577 -3.063876713483004e+02 +1730 1578 -3.553280674768354e+02 +1730 1579 -4.404031329187411e+02 +1730 1580 -5.762343277298867e+02 +1730 1581 -7.788097592344268e+02 +1730 1582 -1.049909849375148e+03 +1730 1583 -1.344510568096302e+03 +1730 1584 -1.550121445008505e+03 +1730 1864 -3.311617365195747e+02 +1730 1865 -3.063876713483004e+02 +1730 1866 -2.663884709281895e+02 +1730 1867 -2.231981844606894e+02 +1730 1868 -1.851243485745373e+02 +1730 1869 -1.555580782497810e+02 +1730 1870 -1.347481526436478e+02 +1730 1871 -1.217424124188383e+02 +1730 1872 -1.155304899028561e+02 +1730 1927 -1.170681125153376e+02 +1730 1928 -1.111842160419089e+02 +1730 1929 -1.011961191083175e+02 +1730 1930 -8.962181586287889e+01 +1730 1931 -7.859349409841370e+01 +1730 1932 -6.937545782864687e+01 +1730 1933 -6.247361649834824e+01 +1730 1934 -5.795761808209202e+01 +1730 1935 -5.573941364116940e+01 +1731 1576 -2.480403651673271e+02 +1731 1577 -2.663884709281895e+02 +1731 1578 -3.063876713483004e+02 +1731 1579 -3.748904053829385e+02 +1731 1580 -4.819366867771664e+02 +1731 1581 -6.371952057562402e+02 +1731 1582 -8.383319685358435e+02 +1731 1583 -1.049909849375148e+03 +1731 1584 -1.193932486839834e+03 +1731 1864 -3.859179776157605e+02 +1731 1865 -3.553280674768354e+02 +1731 1866 -3.063876713483004e+02 +1731 1867 -2.542062119667738e+02 +1731 1868 -2.088271183655457e+02 +1731 1869 -1.740274317161707e+02 +1731 1870 -1.497853840269160e+02 +1731 1871 -1.347481526436478e+02 +1731 1872 -1.275984131219179e+02 +1731 1927 -1.293661657908652e+02 +1731 1928 -1.226088998409724e+02 +1731 1929 -1.111842160419089e+02 +1731 1930 -9.802102195827720e+01 +1731 1931 -8.555928471614156e+01 +1731 1932 -7.520762033775921e+01 +1731 1933 -6.749803222962952e+01 +1731 1934 -6.247361649834824e+01 +1731 1935 -6.001174723167335e+01 +1732 1576 -2.088271183655457e+02 +1732 1577 -2.231981844606894e+02 +1732 1578 -2.542062119667738e+02 +1732 1579 -3.063876713483004e+02 +1732 1580 -3.859179776157605e+02 +1732 1581 -4.976453857371607e+02 +1732 1582 -6.371952057562402e+02 +1732 1583 -7.788097592344268e+02 +1732 1584 -8.726231103602357e+02 +1732 1864 -4.819366867771664e+02 +1732 1865 -4.404031329187411e+02 +1732 1866 -3.748904053829385e+02 +1732 1867 -3.063876713483004e+02 +1732 1868 -2.480403651673271e+02 +1732 1869 -2.041390437321793e+02 +1732 1870 -1.740274317161707e+02 +1732 1871 -1.555580782497810e+02 +1732 1872 -1.468355065336023e+02 +1732 1927 -1.489885081652992e+02 +1732 1928 -1.407716848553628e+02 +1732 1929 -1.269615920628681e+02 +1732 1930 -1.111842160419089e+02 +1732 1931 -9.638822517401589e+01 +1732 1932 -8.420868002944904e+01 +1732 1933 -7.520762033775921e+01 +1732 1934 -6.937545782864687e+01 +1732 1935 -6.652797451218323e+01 +1733 1576 -1.740274317161707e+02 +1733 1577 -1.851243485745373e+02 +1733 1578 -2.088271183655457e+02 +1733 1579 -2.480403651673271e+02 +1733 1580 -3.063876713483004e+02 +1733 1581 -3.859179776157605e+02 +1733 1582 -4.819366867771664e+02 +1733 1583 -5.762343277298867e+02 +1733 1584 -6.371952057562402e+02 +1733 1864 -6.371952057562402e+02 +1733 1865 -5.762343277298867e+02 +1733 1866 -4.819366867771664e+02 +1733 1867 -3.859179776157605e+02 +1733 1868 -3.063876713483004e+02 +1733 1869 -2.480403651673271e+02 +1733 1870 -2.088271183655457e+02 +1733 1871 -1.851243485745373e+02 +1733 1872 -1.740274317161707e+02 +1733 1927 -1.767605489846857e+02 +1733 1928 -1.663510232448633e+02 +1733 1929 -1.489885081652992e+02 +1733 1930 -1.293661657908652e+02 +1733 1931 -1.111842160419089e+02 +1733 1932 -9.638822517401589e+01 +1733 1933 -8.555928471614156e+01 +1733 1934 -7.859349409841370e+01 +1733 1935 -7.520762033775921e+01 +1734 1576 -1.468355065336023e+02 +1734 1577 -1.555580782497810e+02 +1734 1578 -1.740274317161707e+02 +1734 1579 -2.041390437321793e+02 +1734 1580 -2.480403651673271e+02 +1734 1581 -3.063876713483004e+02 +1734 1582 -3.748904053829385e+02 +1734 1583 -4.404031329187411e+02 +1734 1584 -4.819366867771664e+02 +1734 1864 -8.726231103602357e+02 +1734 1865 -7.788097592344268e+02 +1734 1866 -6.371952057562402e+02 +1734 1867 -4.976453857371607e+02 +1734 1868 -3.859179776157605e+02 +1734 1869 -3.063876713483004e+02 +1734 1870 -2.542062119667738e+02 +1734 1871 -2.231981844606894e+02 +1734 1872 -2.088271183655457e+02 +1734 1927 -2.123577731150849e+02 +1734 1928 -1.989422168423268e+02 +1734 1929 -1.767605489846857e+02 +1734 1930 -1.519993633210930e+02 +1734 1931 -1.293661657908652e+02 +1734 1932 -1.111842160419089e+02 +1734 1933 -9.802102195827720e+01 +1734 1934 -8.962181586287889e+01 +1734 1935 -8.555928471614156e+01 +1735 1576 -1.275984131219179e+02 +1735 1577 -1.347481526436478e+02 +1735 1578 -1.497853840269160e+02 +1735 1579 -1.740274317161707e+02 +1735 1580 -2.088271183655457e+02 +1735 1581 -2.542062119667738e+02 +1735 1582 -3.063876713483004e+02 +1735 1583 -3.553280674768354e+02 +1735 1584 -3.859179776157605e+02 +1735 1864 -1.193932486839834e+03 +1735 1865 -1.049909849375148e+03 +1735 1866 -8.383319685358435e+02 +1735 1867 -6.371952057562402e+02 +1735 1868 -4.819366867771664e+02 +1735 1869 -3.748904053829385e+02 +1735 1870 -3.063876713483004e+02 +1735 1871 -2.663884709281895e+02 +1735 1872 -2.480403651673271e+02 +1735 1927 -2.525366109215767e+02 +1735 1928 -2.354925657825773e+02 +1735 1929 -2.075588680195229e+02 +1735 1930 -1.767605489846857e+02 +1735 1931 -1.489885081652992e+02 +1735 1932 -1.269615920628681e+02 +1735 1933 -1.111842160419089e+02 +1735 1934 -1.011961191083175e+02 +1735 1935 -9.638822517401589e+01 +1736 1576 -1.155304899028561e+02 +1736 1577 -1.217424124188383e+02 +1736 1578 -1.347481526436478e+02 +1736 1579 -1.555580782497810e+02 +1736 1580 -1.851243485745373e+02 +1736 1581 -2.231981844606894e+02 +1736 1582 -2.663884709281895e+02 +1736 1583 -3.063876713483004e+02 +1736 1584 -3.311617365195747e+02 +1736 1864 -1.550121445008505e+03 +1736 1865 -1.344510568096302e+03 +1736 1866 -1.049909849375148e+03 +1736 1867 -7.788097592344268e+02 +1736 1868 -5.762343277298867e+02 +1736 1869 -4.404031329187411e+02 +1736 1870 -3.553280674768354e+02 +1736 1871 -3.063876713483004e+02 +1736 1872 -2.841326260213855e+02 +1736 1927 -2.895745815575320e+02 +1736 1928 -2.689865983609317e+02 +1736 1929 -2.354925657825773e+02 +1736 1930 -1.989422168423268e+02 +1736 1931 -1.663510232448633e+02 +1736 1932 -1.407716848553628e+02 +1736 1933 -1.226088998409724e+02 +1736 1934 -1.111842160419089e+02 +1736 1935 -1.057061586526018e+02 +1737 1576 -1.097534196790493e+02 +1737 1577 -1.155304899028561e+02 +1737 1578 -1.275984131219179e+02 +1737 1579 -1.468355065336023e+02 +1737 1580 -1.740274317161707e+02 +1737 1581 -2.088271183655457e+02 +1737 1582 -2.480403651673271e+02 +1737 1583 -2.841326260213855e+02 +1737 1584 -3.063876713483004e+02 +1737 1864 -1.802596433195456e+03 +1737 1865 -1.550121445008505e+03 +1737 1866 -1.193932486839834e+03 +1737 1867 -8.726231103602357e+02 +1737 1868 -6.371952057562402e+02 +1737 1869 -4.819366867771664e+02 +1737 1870 -3.859179776157605e+02 +1737 1871 -3.311617365195747e+02 +1737 1872 -3.063876713483004e+02 +1737 1927 -3.124380547854544e+02 +1737 1928 -2.895745815575320e+02 +1737 1929 -2.525366109215767e+02 +1737 1930 -2.123577731150849e+02 +1737 1931 -1.767605489846857e+02 +1737 1932 -1.489885081652992e+02 +1737 1933 -1.293661657908652e+02 +1737 1934 -1.170681125153376e+02 +1737 1935 -1.111842160419089e+02 +1738 1648 -1.733190400658708e+03 +1738 1649 -1.877824568765017e+03 +1738 1650 -2.199157547087201e+03 +1738 1651 -2.767706810094291e+03 +1738 1652 -3.699147964795180e+03 +1738 1653 -5.136224430633882e+03 +1738 1654 -7.138491575686282e+03 +1738 1655 -9.405703259334639e+03 +1738 1656 -1.103972130715926e+04 +1738 1801 -1.733190400658708e+03 +1738 1802 -1.603684467943633e+03 +1738 1803 -1.394551574360510e+03 +1738 1804 -1.168677565678393e+03 +1738 1805 -9.695072463564434e+02 +1738 1806 -8.148024630667926e+02 +1738 1807 -7.058924559832867e+02 +1738 1808 -6.378158089920671e+02 +1738 1809 -6.052974323170196e+02 +1738 1828 -6.289529049931513e+02 +1738 1829 -5.970589583440825e+02 +1738 1830 -5.429674662554822e+02 +1738 1831 -4.803677035258846e+02 +1738 1832 -4.208084537187713e+02 +1738 1833 -3.710963518270331e+02 +1738 1834 -3.339204550667988e+02 +1738 1835 -3.096178268240465e+02 +1738 1836 -2.976873911031298e+02 +1739 1648 -1.603684467943633e+03 +1739 1649 -1.733190400658708e+03 +1739 1650 -2.019368486704435e+03 +1739 1651 -2.521021940438000e+03 +1739 1652 -3.331754877699595e+03 +1739 1653 -4.560278038130823e+03 +1739 1654 -6.235592529048601e+03 +1739 1655 -8.091232579773156e+03 +1739 1656 -9.405703259334639e+03 +1739 1801 -1.877824568765017e+03 +1739 1802 -1.733190400658708e+03 +1739 1803 -1.500725861549673e+03 +1739 1804 -1.251286952144484e+03 +1739 1805 -1.032880208377977e+03 +1739 1806 -8.643348602446076e+02 +1739 1807 -7.463158073460687e+02 +1739 1808 -6.728335244699299e+02 +1739 1809 -6.378158089920671e+02 +1739 1828 -6.632839990295113e+02 +1739 1829 -6.289529049931513e+02 +1739 1830 -5.708523475060541e+02 +1739 1831 -5.038180997021789e+02 +1739 1832 -4.402579127124382e+02 +1739 1833 -3.873813675510144e+02 +1739 1834 -3.479505460244110e+02 +1739 1835 -3.222285372305477e+02 +1739 1836 -3.096178268240465e+02 +1740 1648 -1.394551574360510e+03 +1740 1649 -1.500725861549673e+03 +1740 1650 -1.733190400658708e+03 +1740 1651 -2.134265778758326e+03 +1740 1652 -2.767706810094291e+03 +1740 1653 -3.699147964795180e+03 +1740 1654 -4.925216936196723e+03 +1740 1655 -6.235592529048601e+03 +1740 1656 -7.138491575686282e+03 +1740 1801 -2.199157547087201e+03 +1740 1802 -2.019368486704435e+03 +1740 1803 -1.733190400658708e+03 +1740 1804 -1.430197816180122e+03 +1740 1805 -1.168677565678393e+03 +1740 1806 -9.695072463564434e+02 +1740 1807 -8.315436028021828e+02 +1740 1808 -7.463158073460687e+02 +1740 1809 -7.058924559832867e+02 +1740 1828 -7.352796046183681e+02 +1740 1829 -6.956816209337401e+02 +1740 1830 -6.289529049931513e+02 +1740 1831 -5.524312223207850e+02 +1740 1832 -4.803677035258846e+02 +1740 1833 -4.208084537187713e+02 +1740 1834 -3.766415408901786e+02 +1740 1835 -3.479505460244110e+02 +1740 1836 -3.339204550667988e+02 +1741 1648 -1.168677565678393e+03 +1741 1649 -1.251286952144484e+03 +1741 1650 -1.430197816180122e+03 +1741 1651 -1.733190400658708e+03 +1741 1652 -2.199157547087201e+03 +1741 1653 -2.861294172280346e+03 +1741 1654 -3.699147964795180e+03 +1741 1655 -4.560278038130823e+03 +1741 1656 -5.136224430633882e+03 +1741 1801 -2.767706810094291e+03 +1741 1802 -2.521021940438000e+03 +1741 1803 -2.134265778758326e+03 +1741 1804 -1.733190400658708e+03 +1741 1805 -1.394551574360510e+03 +1741 1806 -1.141773184361042e+03 +1741 1807 -9.695072463564434e+02 +1741 1808 -8.643348602446076e+02 +1741 1809 -8.148024630667926e+02 +1741 1828 -8.507888885505199e+02 +1741 1829 -8.023274760830675e+02 +1741 1830 -7.211778000851799e+02 +1741 1831 -6.289529049931513e+02 +1741 1832 -5.429674662554822e+02 +1741 1833 -4.725808574370885e+02 +1741 1834 -4.208084537187713e+02 +1741 1835 -3.873813675510144e+02 +1741 1836 -3.710963518270331e+02 +1742 1648 -9.695072463564434e+02 +1742 1649 -1.032880208377977e+03 +1742 1650 -1.168677565678393e+03 +1742 1651 -1.394551574360510e+03 +1742 1652 -1.733190400658708e+03 +1742 1653 -2.199157547087201e+03 +1742 1654 -2.767706810094291e+03 +1742 1655 -3.331754877699595e+03 +1742 1656 -3.699147964795180e+03 +1742 1801 -3.699147964795180e+03 +1742 1802 -3.331754877699595e+03 +1742 1803 -2.767706810094291e+03 +1742 1804 -2.199157547087201e+03 +1742 1805 -1.733190400658708e+03 +1742 1806 -1.394551574360510e+03 +1742 1807 -1.168677565678393e+03 +1742 1808 -1.032880208377977e+03 +1742 1809 -9.695072463564434e+02 +1742 1828 -1.015511306612467e+03 +1742 1829 -9.536070604341750e+02 +1742 1830 -8.507888885505199e+02 +1742 1831 -7.352796046183681e+02 +1742 1832 -6.289529049931513e+02 +1742 1833 -5.429674662554822e+02 +1742 1834 -4.803677035258846e+02 +1742 1835 -4.402579127124382e+02 +1742 1836 -4.208084537187713e+02 +1743 1648 -8.148024630667926e+02 +1743 1649 -8.643348602446076e+02 +1743 1650 -9.695072463564434e+02 +1743 1651 -1.141773184361042e+03 +1743 1652 -1.394551574360510e+03 +1743 1653 -1.733190400658708e+03 +1743 1654 -2.134265778758326e+03 +1743 1655 -2.521021940438000e+03 +1743 1656 -2.767706810094291e+03 +1743 1801 -5.136224430633882e+03 +1743 1802 -4.560278038130823e+03 +1743 1803 -3.699147964795180e+03 +1743 1804 -2.861294172280346e+03 +1743 1805 -2.199157547087201e+03 +1743 1806 -1.733190400658708e+03 +1743 1807 -1.430197816180122e+03 +1743 1808 -1.251286952144484e+03 +1743 1809 -1.168677565678393e+03 +1743 1828 -1.228588660544053e+03 +1743 1829 -1.148042053110080e+03 +1743 1830 -1.015511306612467e+03 +1743 1831 -8.685786765383800e+02 +1743 1832 -7.352796046183681e+02 +1743 1833 -6.289529049931513e+02 +1743 1834 -5.524312223207850e+02 +1743 1835 -5.038180997021789e+02 +1743 1836 -4.803677035258846e+02 +1744 1648 -7.058924559832867e+02 +1744 1649 -7.463158073460687e+02 +1744 1650 -8.315436028021828e+02 +1744 1651 -9.695072463564434e+02 +1744 1652 -1.168677565678393e+03 +1744 1653 -1.430197816180122e+03 +1744 1654 -1.733190400658708e+03 +1744 1655 -2.019368486704435e+03 +1744 1656 -2.199157547087201e+03 +1744 1801 -7.138491575686282e+03 +1744 1802 -6.235592529048601e+03 +1744 1803 -4.925216936196723e+03 +1744 1804 -3.699147964795180e+03 +1744 1805 -2.767706810094291e+03 +1744 1806 -2.134265778758326e+03 +1744 1807 -1.733190400658708e+03 +1744 1808 -1.500725861549673e+03 +1744 1809 -1.394551574360510e+03 +1744 1828 -1.471477730866027e+03 +1744 1829 -1.368148367306964e+03 +1744 1830 -1.199743197084304e+03 +1744 1831 -1.015511306612467e+03 +1744 1832 -8.507888885505199e+02 +1744 1833 -7.211778000851799e+02 +1744 1834 -6.289529049931513e+02 +1744 1835 -5.708523475060541e+02 +1744 1836 -5.429674662554822e+02 +1745 1648 -6.378158089920671e+02 +1745 1649 -6.728335244699299e+02 +1745 1650 -7.463158073460687e+02 +1745 1651 -8.643348602446076e+02 +1745 1652 -1.032880208377977e+03 +1745 1653 -1.251286952144484e+03 +1745 1654 -1.500725861549673e+03 +1745 1655 -1.733190400658708e+03 +1745 1656 -1.877824568765017e+03 +1745 1801 -9.405703259334639e+03 +1745 1802 -8.091232579773156e+03 +1745 1803 -6.235592529048601e+03 +1745 1804 -4.560278038130823e+03 +1745 1805 -3.331754877699595e+03 +1745 1806 -2.521021940438000e+03 +1745 1807 -2.019368486704435e+03 +1745 1808 -1.733190400658708e+03 +1745 1809 -1.603684467943633e+03 +1745 1828 -1.697437739078449e+03 +1745 1829 -1.571600895131404e+03 +1745 1830 -1.368148367306964e+03 +1745 1831 -1.148042053110080e+03 +1745 1832 -9.536070604341750e+02 +1745 1833 -8.023274760830675e+02 +1745 1834 -6.956816209337401e+02 +1745 1835 -6.289529049931513e+02 +1745 1836 -5.970589583440825e+02 +1746 1648 -6.052974323170196e+02 +1746 1649 -6.378158089920671e+02 +1746 1650 -7.058924559832867e+02 +1746 1651 -8.148024630667926e+02 +1746 1652 -9.695072463564434e+02 +1746 1653 -1.168677565678393e+03 +1746 1654 -1.394551574360510e+03 +1746 1655 -1.603684467943633e+03 +1746 1656 -1.733190400658708e+03 +1746 1801 -1.103972130715926e+04 +1746 1802 -9.405703259334639e+03 +1746 1803 -7.138491575686282e+03 +1746 1804 -5.136224430633882e+03 +1746 1805 -3.699147964795180e+03 +1746 1806 -2.767706810094291e+03 +1746 1807 -2.199157547087201e+03 +1746 1808 -1.877824568765017e+03 +1746 1809 -1.733190400658708e+03 +1746 1828 -1.837845240586539e+03 +1746 1829 -1.697437739078449e+03 +1746 1830 -1.471477730866027e+03 +1746 1831 -1.228588660544053e+03 +1746 1832 -1.015511306612467e+03 +1746 1833 -8.507888885505199e+02 +1746 1834 -7.352796046183681e+02 +1746 1835 -6.632839990295113e+02 +1746 1836 -6.289529049931513e+02 +1765 1648 -6.289529049931513e+02 +1765 1649 -6.632839990295113e+02 +1765 1650 -7.352796046183681e+02 +1765 1651 -8.507888885505199e+02 +1765 1652 -1.015511306612467e+03 +1765 1653 -1.228588660544053e+03 +1765 1654 -1.471477730866027e+03 +1765 1655 -1.697437739078449e+03 +1765 1656 -1.837845240586539e+03 +1765 1675 -1.733190400658708e+03 +1765 1676 -1.877824568765017e+03 +1765 1677 -2.199157547087201e+03 +1765 1678 -2.767706810094291e+03 +1765 1679 -3.699147964795180e+03 +1765 1680 -5.136224430633882e+03 +1765 1681 -7.138491575686282e+03 +1765 1682 -9.405703259334639e+03 +1765 1683 -1.103972130715926e+04 +1765 1828 -1.733190400658708e+03 +1765 1829 -1.603684467943633e+03 +1765 1830 -1.394551574360510e+03 +1765 1831 -1.168677565678393e+03 +1765 1832 -9.695072463564434e+02 +1765 1833 -8.148024630667926e+02 +1765 1834 -7.058924559832867e+02 +1765 1835 -6.378158089920671e+02 +1765 1836 -6.052974323170196e+02 +1766 1648 -5.970589583440825e+02 +1766 1649 -6.289529049931513e+02 +1766 1650 -6.956816209337401e+02 +1766 1651 -8.023274760830675e+02 +1766 1652 -9.536070604341750e+02 +1766 1653 -1.148042053110080e+03 +1766 1654 -1.368148367306964e+03 +1766 1655 -1.571600895131404e+03 +1766 1656 -1.697437739078449e+03 +1766 1675 -1.603684467943633e+03 +1766 1676 -1.733190400658708e+03 +1766 1677 -2.019368486704435e+03 +1766 1678 -2.521021940438000e+03 +1766 1679 -3.331754877699595e+03 +1766 1680 -4.560278038130823e+03 +1766 1681 -6.235592529048601e+03 +1766 1682 -8.091232579773156e+03 +1766 1683 -9.405703259334639e+03 +1766 1828 -1.877824568765017e+03 +1766 1829 -1.733190400658708e+03 +1766 1830 -1.500725861549673e+03 +1766 1831 -1.251286952144484e+03 +1766 1832 -1.032880208377977e+03 +1766 1833 -8.643348602446076e+02 +1766 1834 -7.463158073460687e+02 +1766 1835 -6.728335244699299e+02 +1766 1836 -6.378158089920671e+02 +1767 1648 -5.429674662554822e+02 +1767 1649 -5.708523475060541e+02 +1767 1650 -6.289529049931513e+02 +1767 1651 -7.211778000851799e+02 +1767 1652 -8.507888885505199e+02 +1767 1653 -1.015511306612467e+03 +1767 1654 -1.199743197084304e+03 +1767 1655 -1.368148367306964e+03 +1767 1656 -1.471477730866027e+03 +1767 1675 -1.394551574360510e+03 +1767 1676 -1.500725861549673e+03 +1767 1677 -1.733190400658708e+03 +1767 1678 -2.134265778758326e+03 +1767 1679 -2.767706810094291e+03 +1767 1680 -3.699147964795180e+03 +1767 1681 -4.925216936196723e+03 +1767 1682 -6.235592529048601e+03 +1767 1683 -7.138491575686282e+03 +1767 1828 -2.199157547087201e+03 +1767 1829 -2.019368486704435e+03 +1767 1830 -1.733190400658708e+03 +1767 1831 -1.430197816180122e+03 +1767 1832 -1.168677565678393e+03 +1767 1833 -9.695072463564434e+02 +1767 1834 -8.315436028021828e+02 +1767 1835 -7.463158073460687e+02 +1767 1836 -7.058924559832867e+02 +1768 1648 -4.803677035258846e+02 +1768 1649 -5.038180997021789e+02 +1768 1650 -5.524312223207850e+02 +1768 1651 -6.289529049931513e+02 +1768 1652 -7.352796046183681e+02 +1768 1653 -8.685786765383800e+02 +1768 1654 -1.015511306612467e+03 +1768 1655 -1.148042053110080e+03 +1768 1656 -1.228588660544053e+03 +1768 1675 -1.168677565678393e+03 +1768 1676 -1.251286952144484e+03 +1768 1677 -1.430197816180122e+03 +1768 1678 -1.733190400658708e+03 +1768 1679 -2.199157547087201e+03 +1768 1680 -2.861294172280346e+03 +1768 1681 -3.699147964795180e+03 +1768 1682 -4.560278038130823e+03 +1768 1683 -5.136224430633882e+03 +1768 1828 -2.767706810094291e+03 +1768 1829 -2.521021940438000e+03 +1768 1830 -2.134265778758326e+03 +1768 1831 -1.733190400658708e+03 +1768 1832 -1.394551574360510e+03 +1768 1833 -1.141773184361042e+03 +1768 1834 -9.695072463564434e+02 +1768 1835 -8.643348602446076e+02 +1768 1836 -8.148024630667926e+02 +1769 1648 -4.208084537187713e+02 +1769 1649 -4.402579127124382e+02 +1769 1650 -4.803677035258846e+02 +1769 1651 -5.429674662554822e+02 +1769 1652 -6.289529049931513e+02 +1769 1653 -7.352796046183681e+02 +1769 1654 -8.507888885505199e+02 +1769 1655 -9.536070604341750e+02 +1769 1656 -1.015511306612467e+03 +1769 1675 -9.695072463564434e+02 +1769 1676 -1.032880208377977e+03 +1769 1677 -1.168677565678393e+03 +1769 1678 -1.394551574360510e+03 +1769 1679 -1.733190400658708e+03 +1769 1680 -2.199157547087201e+03 +1769 1681 -2.767706810094291e+03 +1769 1682 -3.331754877699595e+03 +1769 1683 -3.699147964795180e+03 +1769 1828 -3.699147964795180e+03 +1769 1829 -3.331754877699595e+03 +1769 1830 -2.767706810094291e+03 +1769 1831 -2.199157547087201e+03 +1769 1832 -1.733190400658708e+03 +1769 1833 -1.394551574360510e+03 +1769 1834 -1.168677565678393e+03 +1769 1835 -1.032880208377977e+03 +1769 1836 -9.695072463564434e+02 +1770 1648 -3.710963518270331e+02 +1770 1649 -3.873813675510144e+02 +1770 1650 -4.208084537187713e+02 +1770 1651 -4.725808574370885e+02 +1770 1652 -5.429674662554822e+02 +1770 1653 -6.289529049931513e+02 +1770 1654 -7.211778000851799e+02 +1770 1655 -8.023274760830675e+02 +1770 1656 -8.507888885505199e+02 +1770 1675 -8.148024630667926e+02 +1770 1676 -8.643348602446076e+02 +1770 1677 -9.695072463564434e+02 +1770 1678 -1.141773184361042e+03 +1770 1679 -1.394551574360510e+03 +1770 1680 -1.733190400658708e+03 +1770 1681 -2.134265778758326e+03 +1770 1682 -2.521021940438000e+03 +1770 1683 -2.767706810094291e+03 +1770 1828 -5.136224430633882e+03 +1770 1829 -4.560278038130823e+03 +1770 1830 -3.699147964795180e+03 +1770 1831 -2.861294172280346e+03 +1770 1832 -2.199157547087201e+03 +1770 1833 -1.733190400658708e+03 +1770 1834 -1.430197816180122e+03 +1770 1835 -1.251286952144484e+03 +1770 1836 -1.168677565678393e+03 +1771 1648 -3.339204550667988e+02 +1771 1649 -3.479505460244110e+02 +1771 1650 -3.766415408901786e+02 +1771 1651 -4.208084537187713e+02 +1771 1652 -4.803677035258846e+02 +1771 1653 -5.524312223207850e+02 +1771 1654 -6.289529049931513e+02 +1771 1655 -6.956816209337401e+02 +1771 1656 -7.352796046183681e+02 +1771 1675 -7.058924559832867e+02 +1771 1676 -7.463158073460687e+02 +1771 1677 -8.315436028021828e+02 +1771 1678 -9.695072463564434e+02 +1771 1679 -1.168677565678393e+03 +1771 1680 -1.430197816180122e+03 +1771 1681 -1.733190400658708e+03 +1771 1682 -2.019368486704435e+03 +1771 1683 -2.199157547087201e+03 +1771 1828 -7.138491575686282e+03 +1771 1829 -6.235592529048601e+03 +1771 1830 -4.925216936196723e+03 +1771 1831 -3.699147964795180e+03 +1771 1832 -2.767706810094291e+03 +1771 1833 -2.134265778758326e+03 +1771 1834 -1.733190400658708e+03 +1771 1835 -1.500725861549673e+03 +1771 1836 -1.394551574360510e+03 +1772 1648 -3.096178268240465e+02 +1772 1649 -3.222285372305477e+02 +1772 1650 -3.479505460244110e+02 +1772 1651 -3.873813675510144e+02 +1772 1652 -4.402579127124382e+02 +1772 1653 -5.038180997021789e+02 +1772 1654 -5.708523475060541e+02 +1772 1655 -6.289529049931513e+02 +1772 1656 -6.632839990295113e+02 +1772 1675 -6.378158089920671e+02 +1772 1676 -6.728335244699299e+02 +1772 1677 -7.463158073460687e+02 +1772 1678 -8.643348602446076e+02 +1772 1679 -1.032880208377977e+03 +1772 1680 -1.251286952144484e+03 +1772 1681 -1.500725861549673e+03 +1772 1682 -1.733190400658708e+03 +1772 1683 -1.877824568765017e+03 +1772 1828 -9.405703259334639e+03 +1772 1829 -8.091232579773156e+03 +1772 1830 -6.235592529048601e+03 +1772 1831 -4.560278038130823e+03 +1772 1832 -3.331754877699595e+03 +1772 1833 -2.521021940438000e+03 +1772 1834 -2.019368486704435e+03 +1772 1835 -1.733190400658708e+03 +1772 1836 -1.603684467943633e+03 +1773 1648 -2.976873911031298e+02 +1773 1649 -3.096178268240465e+02 +1773 1650 -3.339204550667988e+02 +1773 1651 -3.710963518270331e+02 +1773 1652 -4.208084537187713e+02 +1773 1653 -4.803677035258846e+02 +1773 1654 -5.429674662554822e+02 +1773 1655 -5.970589583440825e+02 +1773 1656 -6.289529049931513e+02 +1773 1675 -6.052974323170196e+02 +1773 1676 -6.378158089920671e+02 +1773 1677 -7.058924559832867e+02 +1773 1678 -8.148024630667926e+02 +1773 1679 -9.695072463564434e+02 +1773 1680 -1.168677565678393e+03 +1773 1681 -1.394551574360510e+03 +1773 1682 -1.603684467943633e+03 +1773 1683 -1.733190400658708e+03 +1773 1828 -1.103972130715926e+04 +1773 1829 -9.405703259334639e+03 +1773 1830 -7.138491575686282e+03 +1773 1831 -5.136224430633882e+03 +1773 1832 -3.699147964795180e+03 +1773 1833 -2.767706810094291e+03 +1773 1834 -2.199157547087201e+03 +1773 1835 -1.877824568765017e+03 +1773 1836 -1.733190400658708e+03 +1792 1576 -1.111842160419089e+02 +1792 1577 -1.170681125153376e+02 +1792 1578 -1.293661657908652e+02 +1792 1579 -1.489885081652992e+02 +1792 1580 -1.767605489846857e+02 +1792 1581 -2.123577731150849e+02 +1792 1582 -2.525366109215767e+02 +1792 1583 -2.895745815575320e+02 +1792 1584 -3.124380547854544e+02 +1792 1639 -3.063876713483004e+02 +1792 1640 -3.311617365195747e+02 +1792 1641 -3.859179776157605e+02 +1792 1642 -4.819366867771664e+02 +1792 1643 -6.371952057562402e+02 +1792 1644 -8.726231103602357e+02 +1792 1645 -1.193932486839834e+03 +1792 1646 -1.550121445008505e+03 +1792 1647 -1.802596433195456e+03 +1792 1927 -3.063876713483004e+02 +1792 1928 -2.841326260213855e+02 +1792 1929 -2.480403651673271e+02 +1792 1930 -2.088271183655457e+02 +1792 1931 -1.740274317161707e+02 +1792 1932 -1.468355065336023e+02 +1792 1933 -1.275984131219179e+02 +1792 1934 -1.155304899028561e+02 +1792 1935 -1.097534196790493e+02 +1793 1576 -1.057061586526018e+02 +1793 1577 -1.111842160419089e+02 +1793 1578 -1.226088998409724e+02 +1793 1579 -1.407716848553628e+02 +1793 1580 -1.663510232448633e+02 +1793 1581 -1.989422168423268e+02 +1793 1582 -2.354925657825773e+02 +1793 1583 -2.689865983609317e+02 +1793 1584 -2.895745815575320e+02 +1793 1639 -2.841326260213855e+02 +1793 1640 -3.063876713483004e+02 +1793 1641 -3.553280674768354e+02 +1793 1642 -4.404031329187411e+02 +1793 1643 -5.762343277298867e+02 +1793 1644 -7.788097592344268e+02 +1793 1645 -1.049909849375148e+03 +1793 1646 -1.344510568096302e+03 +1793 1647 -1.550121445008505e+03 +1793 1927 -3.311617365195747e+02 +1793 1928 -3.063876713483004e+02 +1793 1929 -2.663884709281895e+02 +1793 1930 -2.231981844606894e+02 +1793 1931 -1.851243485745373e+02 +1793 1932 -1.555580782497810e+02 +1793 1933 -1.347481526436478e+02 +1793 1934 -1.217424124188383e+02 +1793 1935 -1.155304899028561e+02 +1794 1576 -9.638822517401589e+01 +1794 1577 -1.011961191083175e+02 +1794 1578 -1.111842160419089e+02 +1794 1579 -1.269615920628681e+02 +1794 1580 -1.489885081652992e+02 +1794 1581 -1.767605489846857e+02 +1794 1582 -2.075588680195229e+02 +1794 1583 -2.354925657825773e+02 +1794 1584 -2.525366109215767e+02 +1794 1639 -2.480403651673271e+02 +1794 1640 -2.663884709281895e+02 +1794 1641 -3.063876713483004e+02 +1794 1642 -3.748904053829385e+02 +1794 1643 -4.819366867771664e+02 +1794 1644 -6.371952057562402e+02 +1794 1645 -8.383319685358435e+02 +1794 1646 -1.049909849375148e+03 +1794 1647 -1.193932486839834e+03 +1794 1927 -3.859179776157605e+02 +1794 1928 -3.553280674768354e+02 +1794 1929 -3.063876713483004e+02 +1794 1930 -2.542062119667738e+02 +1794 1931 -2.088271183655457e+02 +1794 1932 -1.740274317161707e+02 +1794 1933 -1.497853840269160e+02 +1794 1934 -1.347481526436478e+02 +1794 1935 -1.275984131219179e+02 +1795 1576 -8.555928471614156e+01 +1795 1577 -8.962181586287889e+01 +1795 1578 -9.802102195827720e+01 +1795 1579 -1.111842160419089e+02 +1795 1580 -1.293661657908652e+02 +1795 1581 -1.519993633210930e+02 +1795 1582 -1.767605489846857e+02 +1795 1583 -1.989422168423268e+02 +1795 1584 -2.123577731150849e+02 +1795 1639 -2.088271183655457e+02 +1795 1640 -2.231981844606894e+02 +1795 1641 -2.542062119667738e+02 +1795 1642 -3.063876713483004e+02 +1795 1643 -3.859179776157605e+02 +1795 1644 -4.976453857371607e+02 +1795 1645 -6.371952057562402e+02 +1795 1646 -7.788097592344268e+02 +1795 1647 -8.726231103602357e+02 +1795 1927 -4.819366867771664e+02 +1795 1928 -4.404031329187411e+02 +1795 1929 -3.748904053829385e+02 +1795 1930 -3.063876713483004e+02 +1795 1931 -2.480403651673271e+02 +1795 1932 -2.041390437321793e+02 +1795 1933 -1.740274317161707e+02 +1795 1934 -1.555580782497810e+02 +1795 1935 -1.468355065336023e+02 +1796 1576 -7.520762033775921e+01 +1796 1577 -7.859349409841370e+01 +1796 1578 -8.555928471614156e+01 +1796 1579 -9.638822517401589e+01 +1796 1580 -1.111842160419089e+02 +1796 1581 -1.293661657908652e+02 +1796 1582 -1.489885081652992e+02 +1796 1583 -1.663510232448633e+02 +1796 1584 -1.767605489846857e+02 +1796 1639 -1.740274317161707e+02 +1796 1640 -1.851243485745373e+02 +1796 1641 -2.088271183655457e+02 +1796 1642 -2.480403651673271e+02 +1796 1643 -3.063876713483004e+02 +1796 1644 -3.859179776157605e+02 +1796 1645 -4.819366867771664e+02 +1796 1646 -5.762343277298867e+02 +1796 1647 -6.371952057562402e+02 +1796 1927 -6.371952057562402e+02 +1796 1928 -5.762343277298867e+02 +1796 1929 -4.819366867771664e+02 +1796 1930 -3.859179776157605e+02 +1796 1931 -3.063876713483004e+02 +1796 1932 -2.480403651673271e+02 +1796 1933 -2.088271183655457e+02 +1796 1934 -1.851243485745373e+02 +1796 1935 -1.740274317161707e+02 +1797 1576 -6.652797451218323e+01 +1797 1577 -6.937545782864687e+01 +1797 1578 -7.520762033775921e+01 +1797 1579 -8.420868002944904e+01 +1797 1580 -9.638822517401589e+01 +1797 1581 -1.111842160419089e+02 +1797 1582 -1.269615920628681e+02 +1797 1583 -1.407716848553628e+02 +1797 1584 -1.489885081652992e+02 +1797 1639 -1.468355065336023e+02 +1797 1640 -1.555580782497810e+02 +1797 1641 -1.740274317161707e+02 +1797 1642 -2.041390437321793e+02 +1797 1643 -2.480403651673271e+02 +1797 1644 -3.063876713483004e+02 +1797 1645 -3.748904053829385e+02 +1797 1646 -4.404031329187411e+02 +1797 1647 -4.819366867771664e+02 +1797 1927 -8.726231103602357e+02 +1797 1928 -7.788097592344268e+02 +1797 1929 -6.371952057562402e+02 +1797 1930 -4.976453857371607e+02 +1797 1931 -3.859179776157605e+02 +1797 1932 -3.063876713483004e+02 +1797 1933 -2.542062119667738e+02 +1797 1934 -2.231981844606894e+02 +1797 1935 -2.088271183655457e+02 +1798 1576 -6.001174723167335e+01 +1798 1577 -6.247361649834824e+01 +1798 1578 -6.749803222962952e+01 +1798 1579 -7.520762033775921e+01 +1798 1580 -8.555928471614156e+01 +1798 1581 -9.802102195827720e+01 +1798 1582 -1.111842160419089e+02 +1798 1583 -1.226088998409724e+02 +1798 1584 -1.293661657908652e+02 +1798 1639 -1.275984131219179e+02 +1798 1640 -1.347481526436478e+02 +1798 1641 -1.497853840269160e+02 +1798 1642 -1.740274317161707e+02 +1798 1643 -2.088271183655457e+02 +1798 1644 -2.542062119667738e+02 +1798 1645 -3.063876713483004e+02 +1798 1646 -3.553280674768354e+02 +1798 1647 -3.859179776157605e+02 +1798 1927 -1.193932486839834e+03 +1798 1928 -1.049909849375148e+03 +1798 1929 -8.383319685358435e+02 +1798 1930 -6.371952057562402e+02 +1798 1931 -4.819366867771664e+02 +1798 1932 -3.748904053829385e+02 +1798 1933 -3.063876713483004e+02 +1798 1934 -2.663884709281895e+02 +1798 1935 -2.480403651673271e+02 +1799 1576 -5.573941364116940e+01 +1799 1577 -5.795761808209202e+01 +1799 1578 -6.247361649834824e+01 +1799 1579 -6.937545782864687e+01 +1799 1580 -7.859349409841370e+01 +1799 1581 -8.962181586287889e+01 +1799 1582 -1.011961191083175e+02 +1799 1583 -1.111842160419089e+02 +1799 1584 -1.170681125153376e+02 +1799 1639 -1.155304899028561e+02 +1799 1640 -1.217424124188383e+02 +1799 1641 -1.347481526436478e+02 +1799 1642 -1.555580782497810e+02 +1799 1643 -1.851243485745373e+02 +1799 1644 -2.231981844606894e+02 +1799 1645 -2.663884709281895e+02 +1799 1646 -3.063876713483004e+02 +1799 1647 -3.311617365195747e+02 +1799 1927 -1.550121445008505e+03 +1799 1928 -1.344510568096302e+03 +1799 1929 -1.049909849375148e+03 +1799 1930 -7.788097592344268e+02 +1799 1931 -5.762343277298867e+02 +1799 1932 -4.404031329187411e+02 +1799 1933 -3.553280674768354e+02 +1799 1934 -3.063876713483004e+02 +1799 1935 -2.841326260213855e+02 +1800 1576 -5.363826960242956e+01 +1800 1577 -5.573941364116940e+01 +1800 1578 -6.001174723167335e+01 +1800 1579 -6.652797451218323e+01 +1800 1580 -7.520762033775921e+01 +1800 1581 -8.555928471614156e+01 +1800 1582 -9.638822517401589e+01 +1800 1583 -1.057061586526018e+02 +1800 1584 -1.111842160419089e+02 +1800 1639 -1.097534196790493e+02 +1800 1640 -1.155304899028561e+02 +1800 1641 -1.275984131219179e+02 +1800 1642 -1.468355065336023e+02 +1800 1643 -1.740274317161707e+02 +1800 1644 -2.088271183655457e+02 +1800 1645 -2.480403651673271e+02 +1800 1646 -2.841326260213855e+02 +1800 1647 -3.063876713483004e+02 +1800 1927 -1.802596433195456e+03 +1800 1928 -1.550121445008505e+03 +1800 1929 -1.193932486839834e+03 +1800 1930 -8.726231103602357e+02 +1800 1931 -6.371952057562402e+02 +1800 1932 -4.819366867771664e+02 +1800 1933 -3.859179776157605e+02 +1800 1934 -3.311617365195747e+02 +1800 1935 -3.063876713483004e+02 +1801 1738 -1.733190400658708e+03 +1801 1739 -1.877824568765017e+03 +1801 1740 -2.199157547087201e+03 +1801 1741 -2.767706810094291e+03 +1801 1742 -3.699147964795180e+03 +1801 1743 -5.136224430633882e+03 +1801 1744 -7.138491575686282e+03 +1801 1745 -9.405703259334639e+03 +1801 1746 -1.103972130715926e+04 +1801 1873 -1.733190400658708e+03 +1801 1874 -1.603684467943633e+03 +1801 1875 -1.394551574360510e+03 +1801 1876 -1.168677565678393e+03 +1801 1877 -9.695072463564434e+02 +1801 1878 -8.148024630667926e+02 +1801 1879 -7.058924559832867e+02 +1801 1880 -6.378158089920671e+02 +1801 1881 -6.052974323170196e+02 +1801 1900 -6.289529049931513e+02 +1801 1901 -5.970589583440825e+02 +1801 1902 -5.429674662554822e+02 +1801 1903 -4.803677035258846e+02 +1801 1904 -4.208084537187713e+02 +1801 1905 -3.710963518270331e+02 +1801 1906 -3.339204550667988e+02 +1801 1907 -3.096178268240465e+02 +1801 1908 -2.976873911031298e+02 +1802 1738 -1.603684467943633e+03 +1802 1739 -1.733190400658708e+03 +1802 1740 -2.019368486704435e+03 +1802 1741 -2.521021940438000e+03 +1802 1742 -3.331754877699595e+03 +1802 1743 -4.560278038130823e+03 +1802 1744 -6.235592529048601e+03 +1802 1745 -8.091232579773156e+03 +1802 1746 -9.405703259334639e+03 +1802 1873 -1.877824568765017e+03 +1802 1874 -1.733190400658708e+03 +1802 1875 -1.500725861549673e+03 +1802 1876 -1.251286952144484e+03 +1802 1877 -1.032880208377977e+03 +1802 1878 -8.643348602446076e+02 +1802 1879 -7.463158073460687e+02 +1802 1880 -6.728335244699299e+02 +1802 1881 -6.378158089920671e+02 +1802 1900 -6.632839990295113e+02 +1802 1901 -6.289529049931513e+02 +1802 1902 -5.708523475060541e+02 +1802 1903 -5.038180997021789e+02 +1802 1904 -4.402579127124382e+02 +1802 1905 -3.873813675510144e+02 +1802 1906 -3.479505460244110e+02 +1802 1907 -3.222285372305477e+02 +1802 1908 -3.096178268240465e+02 +1803 1738 -1.394551574360510e+03 +1803 1739 -1.500725861549673e+03 +1803 1740 -1.733190400658708e+03 +1803 1741 -2.134265778758326e+03 +1803 1742 -2.767706810094291e+03 +1803 1743 -3.699147964795180e+03 +1803 1744 -4.925216936196723e+03 +1803 1745 -6.235592529048601e+03 +1803 1746 -7.138491575686282e+03 +1803 1873 -2.199157547087201e+03 +1803 1874 -2.019368486704435e+03 +1803 1875 -1.733190400658708e+03 +1803 1876 -1.430197816180122e+03 +1803 1877 -1.168677565678393e+03 +1803 1878 -9.695072463564434e+02 +1803 1879 -8.315436028021828e+02 +1803 1880 -7.463158073460687e+02 +1803 1881 -7.058924559832867e+02 +1803 1900 -7.352796046183681e+02 +1803 1901 -6.956816209337401e+02 +1803 1902 -6.289529049931513e+02 +1803 1903 -5.524312223207850e+02 +1803 1904 -4.803677035258846e+02 +1803 1905 -4.208084537187713e+02 +1803 1906 -3.766415408901786e+02 +1803 1907 -3.479505460244110e+02 +1803 1908 -3.339204550667988e+02 +1804 1738 -1.168677565678393e+03 +1804 1739 -1.251286952144484e+03 +1804 1740 -1.430197816180122e+03 +1804 1741 -1.733190400658708e+03 +1804 1742 -2.199157547087201e+03 +1804 1743 -2.861294172280346e+03 +1804 1744 -3.699147964795180e+03 +1804 1745 -4.560278038130823e+03 +1804 1746 -5.136224430633882e+03 +1804 1873 -2.767706810094291e+03 +1804 1874 -2.521021940438000e+03 +1804 1875 -2.134265778758326e+03 +1804 1876 -1.733190400658708e+03 +1804 1877 -1.394551574360510e+03 +1804 1878 -1.141773184361042e+03 +1804 1879 -9.695072463564434e+02 +1804 1880 -8.643348602446076e+02 +1804 1881 -8.148024630667926e+02 +1804 1900 -8.507888885505199e+02 +1804 1901 -8.023274760830675e+02 +1804 1902 -7.211778000851799e+02 +1804 1903 -6.289529049931513e+02 +1804 1904 -5.429674662554822e+02 +1804 1905 -4.725808574370885e+02 +1804 1906 -4.208084537187713e+02 +1804 1907 -3.873813675510144e+02 +1804 1908 -3.710963518270331e+02 +1805 1738 -9.695072463564434e+02 +1805 1739 -1.032880208377977e+03 +1805 1740 -1.168677565678393e+03 +1805 1741 -1.394551574360510e+03 +1805 1742 -1.733190400658708e+03 +1805 1743 -2.199157547087201e+03 +1805 1744 -2.767706810094291e+03 +1805 1745 -3.331754877699595e+03 +1805 1746 -3.699147964795180e+03 +1805 1873 -3.699147964795180e+03 +1805 1874 -3.331754877699595e+03 +1805 1875 -2.767706810094291e+03 +1805 1876 -2.199157547087201e+03 +1805 1877 -1.733190400658708e+03 +1805 1878 -1.394551574360510e+03 +1805 1879 -1.168677565678393e+03 +1805 1880 -1.032880208377977e+03 +1805 1881 -9.695072463564434e+02 +1805 1900 -1.015511306612467e+03 +1805 1901 -9.536070604341750e+02 +1805 1902 -8.507888885505199e+02 +1805 1903 -7.352796046183681e+02 +1805 1904 -6.289529049931513e+02 +1805 1905 -5.429674662554822e+02 +1805 1906 -4.803677035258846e+02 +1805 1907 -4.402579127124382e+02 +1805 1908 -4.208084537187713e+02 +1806 1738 -8.148024630667926e+02 +1806 1739 -8.643348602446076e+02 +1806 1740 -9.695072463564434e+02 +1806 1741 -1.141773184361042e+03 +1806 1742 -1.394551574360510e+03 +1806 1743 -1.733190400658708e+03 +1806 1744 -2.134265778758326e+03 +1806 1745 -2.521021940438000e+03 +1806 1746 -2.767706810094291e+03 +1806 1873 -5.136224430633882e+03 +1806 1874 -4.560278038130823e+03 +1806 1875 -3.699147964795180e+03 +1806 1876 -2.861294172280346e+03 +1806 1877 -2.199157547087201e+03 +1806 1878 -1.733190400658708e+03 +1806 1879 -1.430197816180122e+03 +1806 1880 -1.251286952144484e+03 +1806 1881 -1.168677565678393e+03 +1806 1900 -1.228588660544053e+03 +1806 1901 -1.148042053110080e+03 +1806 1902 -1.015511306612467e+03 +1806 1903 -8.685786765383800e+02 +1806 1904 -7.352796046183681e+02 +1806 1905 -6.289529049931513e+02 +1806 1906 -5.524312223207850e+02 +1806 1907 -5.038180997021789e+02 +1806 1908 -4.803677035258846e+02 +1807 1738 -7.058924559832867e+02 +1807 1739 -7.463158073460687e+02 +1807 1740 -8.315436028021828e+02 +1807 1741 -9.695072463564434e+02 +1807 1742 -1.168677565678393e+03 +1807 1743 -1.430197816180122e+03 +1807 1744 -1.733190400658708e+03 +1807 1745 -2.019368486704435e+03 +1807 1746 -2.199157547087201e+03 +1807 1873 -7.138491575686282e+03 +1807 1874 -6.235592529048601e+03 +1807 1875 -4.925216936196723e+03 +1807 1876 -3.699147964795180e+03 +1807 1877 -2.767706810094291e+03 +1807 1878 -2.134265778758326e+03 +1807 1879 -1.733190400658708e+03 +1807 1880 -1.500725861549673e+03 +1807 1881 -1.394551574360510e+03 +1807 1900 -1.471477730866027e+03 +1807 1901 -1.368148367306964e+03 +1807 1902 -1.199743197084304e+03 +1807 1903 -1.015511306612467e+03 +1807 1904 -8.507888885505199e+02 +1807 1905 -7.211778000851799e+02 +1807 1906 -6.289529049931513e+02 +1807 1907 -5.708523475060541e+02 +1807 1908 -5.429674662554822e+02 +1808 1738 -6.378158089920671e+02 +1808 1739 -6.728335244699299e+02 +1808 1740 -7.463158073460687e+02 +1808 1741 -8.643348602446076e+02 +1808 1742 -1.032880208377977e+03 +1808 1743 -1.251286952144484e+03 +1808 1744 -1.500725861549673e+03 +1808 1745 -1.733190400658708e+03 +1808 1746 -1.877824568765017e+03 +1808 1873 -9.405703259334639e+03 +1808 1874 -8.091232579773156e+03 +1808 1875 -6.235592529048601e+03 +1808 1876 -4.560278038130823e+03 +1808 1877 -3.331754877699595e+03 +1808 1878 -2.521021940438000e+03 +1808 1879 -2.019368486704435e+03 +1808 1880 -1.733190400658708e+03 +1808 1881 -1.603684467943633e+03 +1808 1900 -1.697437739078449e+03 +1808 1901 -1.571600895131404e+03 +1808 1902 -1.368148367306964e+03 +1808 1903 -1.148042053110080e+03 +1808 1904 -9.536070604341750e+02 +1808 1905 -8.023274760830675e+02 +1808 1906 -6.956816209337401e+02 +1808 1907 -6.289529049931513e+02 +1808 1908 -5.970589583440825e+02 +1809 1738 -6.052974323170196e+02 +1809 1739 -6.378158089920671e+02 +1809 1740 -7.058924559832867e+02 +1809 1741 -8.148024630667926e+02 +1809 1742 -9.695072463564434e+02 +1809 1743 -1.168677565678393e+03 +1809 1744 -1.394551574360510e+03 +1809 1745 -1.603684467943633e+03 +1809 1746 -1.733190400658708e+03 +1809 1873 -1.103972130715926e+04 +1809 1874 -9.405703259334639e+03 +1809 1875 -7.138491575686282e+03 +1809 1876 -5.136224430633882e+03 +1809 1877 -3.699147964795180e+03 +1809 1878 -2.767706810094291e+03 +1809 1879 -2.199157547087201e+03 +1809 1880 -1.877824568765017e+03 +1809 1881 -1.733190400658708e+03 +1809 1900 -1.837845240586539e+03 +1809 1901 -1.697437739078449e+03 +1809 1902 -1.471477730866027e+03 +1809 1903 -1.228588660544053e+03 +1809 1904 -1.015511306612467e+03 +1809 1905 -8.507888885505199e+02 +1809 1906 -7.352796046183681e+02 +1809 1907 -6.632839990295113e+02 +1809 1908 -6.289529049931513e+02 +1828 1738 -6.289529049931513e+02 +1828 1739 -6.632839990295113e+02 +1828 1740 -7.352796046183681e+02 +1828 1741 -8.507888885505199e+02 +1828 1742 -1.015511306612467e+03 +1828 1743 -1.228588660544053e+03 +1828 1744 -1.471477730866027e+03 +1828 1745 -1.697437739078449e+03 +1828 1746 -1.837845240586539e+03 +1828 1765 -1.733190400658708e+03 +1828 1766 -1.877824568765017e+03 +1828 1767 -2.199157547087201e+03 +1828 1768 -2.767706810094291e+03 +1828 1769 -3.699147964795180e+03 +1828 1770 -5.136224430633882e+03 +1828 1771 -7.138491575686282e+03 +1828 1772 -9.405703259334639e+03 +1828 1773 -1.103972130715926e+04 +1828 1900 -1.733190400658708e+03 +1828 1901 -1.603684467943633e+03 +1828 1902 -1.394551574360510e+03 +1828 1903 -1.168677565678393e+03 +1828 1904 -9.695072463564434e+02 +1828 1905 -8.148024630667926e+02 +1828 1906 -7.058924559832867e+02 +1828 1907 -6.378158089920671e+02 +1828 1908 -6.052974323170196e+02 +1829 1738 -5.970589583440825e+02 +1829 1739 -6.289529049931513e+02 +1829 1740 -6.956816209337401e+02 +1829 1741 -8.023274760830675e+02 +1829 1742 -9.536070604341750e+02 +1829 1743 -1.148042053110080e+03 +1829 1744 -1.368148367306964e+03 +1829 1745 -1.571600895131404e+03 +1829 1746 -1.697437739078449e+03 +1829 1765 -1.603684467943633e+03 +1829 1766 -1.733190400658708e+03 +1829 1767 -2.019368486704435e+03 +1829 1768 -2.521021940438000e+03 +1829 1769 -3.331754877699595e+03 +1829 1770 -4.560278038130823e+03 +1829 1771 -6.235592529048601e+03 +1829 1772 -8.091232579773156e+03 +1829 1773 -9.405703259334639e+03 +1829 1900 -1.877824568765017e+03 +1829 1901 -1.733190400658708e+03 +1829 1902 -1.500725861549673e+03 +1829 1903 -1.251286952144484e+03 +1829 1904 -1.032880208377977e+03 +1829 1905 -8.643348602446076e+02 +1829 1906 -7.463158073460687e+02 +1829 1907 -6.728335244699299e+02 +1829 1908 -6.378158089920671e+02 +1830 1738 -5.429674662554822e+02 +1830 1739 -5.708523475060541e+02 +1830 1740 -6.289529049931513e+02 +1830 1741 -7.211778000851799e+02 +1830 1742 -8.507888885505199e+02 +1830 1743 -1.015511306612467e+03 +1830 1744 -1.199743197084304e+03 +1830 1745 -1.368148367306964e+03 +1830 1746 -1.471477730866027e+03 +1830 1765 -1.394551574360510e+03 +1830 1766 -1.500725861549673e+03 +1830 1767 -1.733190400658708e+03 +1830 1768 -2.134265778758326e+03 +1830 1769 -2.767706810094291e+03 +1830 1770 -3.699147964795180e+03 +1830 1771 -4.925216936196723e+03 +1830 1772 -6.235592529048601e+03 +1830 1773 -7.138491575686282e+03 +1830 1900 -2.199157547087201e+03 +1830 1901 -2.019368486704435e+03 +1830 1902 -1.733190400658708e+03 +1830 1903 -1.430197816180122e+03 +1830 1904 -1.168677565678393e+03 +1830 1905 -9.695072463564434e+02 +1830 1906 -8.315436028021828e+02 +1830 1907 -7.463158073460687e+02 +1830 1908 -7.058924559832867e+02 +1831 1738 -4.803677035258846e+02 +1831 1739 -5.038180997021789e+02 +1831 1740 -5.524312223207850e+02 +1831 1741 -6.289529049931513e+02 +1831 1742 -7.352796046183681e+02 +1831 1743 -8.685786765383800e+02 +1831 1744 -1.015511306612467e+03 +1831 1745 -1.148042053110080e+03 +1831 1746 -1.228588660544053e+03 +1831 1765 -1.168677565678393e+03 +1831 1766 -1.251286952144484e+03 +1831 1767 -1.430197816180122e+03 +1831 1768 -1.733190400658708e+03 +1831 1769 -2.199157547087201e+03 +1831 1770 -2.861294172280346e+03 +1831 1771 -3.699147964795180e+03 +1831 1772 -4.560278038130823e+03 +1831 1773 -5.136224430633882e+03 +1831 1900 -2.767706810094291e+03 +1831 1901 -2.521021940438000e+03 +1831 1902 -2.134265778758326e+03 +1831 1903 -1.733190400658708e+03 +1831 1904 -1.394551574360510e+03 +1831 1905 -1.141773184361042e+03 +1831 1906 -9.695072463564434e+02 +1831 1907 -8.643348602446076e+02 +1831 1908 -8.148024630667926e+02 +1832 1738 -4.208084537187713e+02 +1832 1739 -4.402579127124382e+02 +1832 1740 -4.803677035258846e+02 +1832 1741 -5.429674662554822e+02 +1832 1742 -6.289529049931513e+02 +1832 1743 -7.352796046183681e+02 +1832 1744 -8.507888885505199e+02 +1832 1745 -9.536070604341750e+02 +1832 1746 -1.015511306612467e+03 +1832 1765 -9.695072463564434e+02 +1832 1766 -1.032880208377977e+03 +1832 1767 -1.168677565678393e+03 +1832 1768 -1.394551574360510e+03 +1832 1769 -1.733190400658708e+03 +1832 1770 -2.199157547087201e+03 +1832 1771 -2.767706810094291e+03 +1832 1772 -3.331754877699595e+03 +1832 1773 -3.699147964795180e+03 +1832 1900 -3.699147964795180e+03 +1832 1901 -3.331754877699595e+03 +1832 1902 -2.767706810094291e+03 +1832 1903 -2.199157547087201e+03 +1832 1904 -1.733190400658708e+03 +1832 1905 -1.394551574360510e+03 +1832 1906 -1.168677565678393e+03 +1832 1907 -1.032880208377977e+03 +1832 1908 -9.695072463564434e+02 +1833 1738 -3.710963518270331e+02 +1833 1739 -3.873813675510144e+02 +1833 1740 -4.208084537187713e+02 +1833 1741 -4.725808574370885e+02 +1833 1742 -5.429674662554822e+02 +1833 1743 -6.289529049931513e+02 +1833 1744 -7.211778000851799e+02 +1833 1745 -8.023274760830675e+02 +1833 1746 -8.507888885505199e+02 +1833 1765 -8.148024630667926e+02 +1833 1766 -8.643348602446076e+02 +1833 1767 -9.695072463564434e+02 +1833 1768 -1.141773184361042e+03 +1833 1769 -1.394551574360510e+03 +1833 1770 -1.733190400658708e+03 +1833 1771 -2.134265778758326e+03 +1833 1772 -2.521021940438000e+03 +1833 1773 -2.767706810094291e+03 +1833 1900 -5.136224430633882e+03 +1833 1901 -4.560278038130823e+03 +1833 1902 -3.699147964795180e+03 +1833 1903 -2.861294172280346e+03 +1833 1904 -2.199157547087201e+03 +1833 1905 -1.733190400658708e+03 +1833 1906 -1.430197816180122e+03 +1833 1907 -1.251286952144484e+03 +1833 1908 -1.168677565678393e+03 +1834 1738 -3.339204550667988e+02 +1834 1739 -3.479505460244110e+02 +1834 1740 -3.766415408901786e+02 +1834 1741 -4.208084537187713e+02 +1834 1742 -4.803677035258846e+02 +1834 1743 -5.524312223207850e+02 +1834 1744 -6.289529049931513e+02 +1834 1745 -6.956816209337401e+02 +1834 1746 -7.352796046183681e+02 +1834 1765 -7.058924559832867e+02 +1834 1766 -7.463158073460687e+02 +1834 1767 -8.315436028021828e+02 +1834 1768 -9.695072463564434e+02 +1834 1769 -1.168677565678393e+03 +1834 1770 -1.430197816180122e+03 +1834 1771 -1.733190400658708e+03 +1834 1772 -2.019368486704435e+03 +1834 1773 -2.199157547087201e+03 +1834 1900 -7.138491575686282e+03 +1834 1901 -6.235592529048601e+03 +1834 1902 -4.925216936196723e+03 +1834 1903 -3.699147964795180e+03 +1834 1904 -2.767706810094291e+03 +1834 1905 -2.134265778758326e+03 +1834 1906 -1.733190400658708e+03 +1834 1907 -1.500725861549673e+03 +1834 1908 -1.394551574360510e+03 +1835 1738 -3.096178268240465e+02 +1835 1739 -3.222285372305477e+02 +1835 1740 -3.479505460244110e+02 +1835 1741 -3.873813675510144e+02 +1835 1742 -4.402579127124382e+02 +1835 1743 -5.038180997021789e+02 +1835 1744 -5.708523475060541e+02 +1835 1745 -6.289529049931513e+02 +1835 1746 -6.632839990295113e+02 +1835 1765 -6.378158089920671e+02 +1835 1766 -6.728335244699299e+02 +1835 1767 -7.463158073460687e+02 +1835 1768 -8.643348602446076e+02 +1835 1769 -1.032880208377977e+03 +1835 1770 -1.251286952144484e+03 +1835 1771 -1.500725861549673e+03 +1835 1772 -1.733190400658708e+03 +1835 1773 -1.877824568765017e+03 +1835 1900 -9.405703259334639e+03 +1835 1901 -8.091232579773156e+03 +1835 1902 -6.235592529048601e+03 +1835 1903 -4.560278038130823e+03 +1835 1904 -3.331754877699595e+03 +1835 1905 -2.521021940438000e+03 +1835 1906 -2.019368486704435e+03 +1835 1907 -1.733190400658708e+03 +1835 1908 -1.603684467943633e+03 +1836 1738 -2.976873911031298e+02 +1836 1739 -3.096178268240465e+02 +1836 1740 -3.339204550667988e+02 +1836 1741 -3.710963518270331e+02 +1836 1742 -4.208084537187713e+02 +1836 1743 -4.803677035258846e+02 +1836 1744 -5.429674662554822e+02 +1836 1745 -5.970589583440825e+02 +1836 1746 -6.289529049931513e+02 +1836 1765 -6.052974323170196e+02 +1836 1766 -6.378158089920671e+02 +1836 1767 -7.058924559832867e+02 +1836 1768 -8.148024630667926e+02 +1836 1769 -9.695072463564434e+02 +1836 1770 -1.168677565678393e+03 +1836 1771 -1.394551574360510e+03 +1836 1772 -1.603684467943633e+03 +1836 1773 -1.733190400658708e+03 +1836 1900 -1.103972130715926e+04 +1836 1901 -9.405703259334639e+03 +1836 1902 -7.138491575686282e+03 +1836 1903 -5.136224430633882e+03 +1836 1904 -3.699147964795180e+03 +1836 1905 -2.767706810094291e+03 +1836 1906 -2.199157547087201e+03 +1836 1907 -1.877824568765017e+03 +1836 1908 -1.733190400658708e+03 +1855 1432 -1.965477828103598e+01 +1855 1433 -2.067858569511584e+01 +1855 1434 -2.281491025526307e+01 +1855 1435 -2.621419542240643e+01 +1855 1436 -3.100728135248165e+01 +1855 1437 -3.712309913086538e+01 +1855 1438 -4.399251628020367e+01 +1855 1439 -5.029652653878190e+01 +1855 1440 -5.417542964960961e+01 +1855 1567 -5.416220002058462e+01 +1855 1568 -5.847168336242214e+01 +1855 1569 -6.797204698756184e+01 +1855 1570 -8.455751811575986e+01 +1855 1571 -1.112023202068744e+02 +1855 1572 -1.512628164030906e+02 +1855 1573 -2.053883607687489e+02 +1855 1574 -2.647767438527630e+02 +1855 1575 -3.065373731090118e+02 +1855 2134 -5.416220002058462e+01 +1855 2135 -5.028460369863171e+01 +1855 2136 -4.398263164573866e+01 +1855 2137 -3.711530555640490e+01 +1855 2138 -3.100122392289864e+01 +1855 2139 -2.620940698061742e+01 +1855 2140 -2.281096793104268e+01 +1855 2141 -2.067515029553633e+01 +1855 2142 -1.965157861598590e+01 +1856 1432 -1.870055440211151e+01 +1856 1433 -1.965477828103598e+01 +1856 1434 -2.164167292784031e+01 +1856 1435 -2.479209926714913e+01 +1856 1436 -2.921308657465229e+01 +1856 1437 -3.482168460593341e+01 +1856 1438 -4.108257963331437e+01 +1856 1439 -4.679557686118159e+01 +1856 1440 -5.029652653878190e+01 +1856 1567 -5.028460369863171e+01 +1856 1568 -5.416220002058462e+01 +1856 1569 -6.266865647386096e+01 +1856 1570 -7.739429142416682e+01 +1856 1571 -1.007640600234616e+02 +1856 1572 -1.353445496343036e+02 +1856 1573 -1.811983282511275e+02 +1856 1574 -2.305668762810884e+02 +1856 1575 -2.647767438527630e+02 +1856 2134 -5.847168336242214e+01 +1856 2135 -5.416220002058462e+01 +1856 2136 -4.718848846240646e+01 +1856 2137 -3.963467701820890e+01 +1856 2138 -3.295302401855845e+01 +1856 2139 -2.774798050936779e+01 +1856 2140 -2.407490908992506e+01 +1856 2141 -2.177494503977683e+01 +1856 2142 -2.067515029553633e+01 +1857 1432 -1.707507926940499e+01 +1857 1433 -1.791417887437397e+01 +1857 1434 -1.965477828103598e+01 +1857 1435 -2.239757409043196e+01 +1857 1436 -2.621419542240647e+01 +1857 1437 -3.100728135248171e+01 +1857 1438 -3.630032063351624e+01 +1857 1439 -4.108257963331437e+01 +1857 1440 -4.399251628020367e+01 +1857 1567 -4.398263164573866e+01 +1857 1568 -4.718848846240646e+01 +1857 1569 -5.416220002058462e+01 +1857 1570 -6.606134132672688e+01 +1857 1571 -8.455751811576010e+01 +1857 1572 -1.112023202068747e+02 +1857 1573 -1.454508347890311e+02 +1857 1574 -1.811983282511275e+02 +1857 1575 -2.053883607687489e+02 +1857 2134 -6.797204698756184e+01 +1857 2135 -6.266865647386096e+01 +1857 2136 -5.416220002058462e+01 +1857 2137 -4.506046026496942e+01 +1857 2138 -3.711530555640482e+01 +1857 2139 -3.100122392289858e+01 +1857 2140 -2.672989532903555e+01 +1857 2141 -2.407490908992506e+01 +1857 2142 -2.281096793104268e+01 +1858 1432 -1.518203609416468e+01 +1858 1433 -1.589274010473518e+01 +1858 1434 -1.736013665098131e+01 +1858 1435 -1.965477828103598e+01 +1858 1436 -2.281491025526310e+01 +1858 1437 -2.673481743251412e+01 +1858 1438 -3.100728135248171e+01 +1858 1439 -3.482168460593341e+01 +1858 1440 -3.712309913086538e+01 +1858 1567 -3.711530555640490e+01 +1858 1568 -3.963467701820890e+01 +1858 1569 -4.506046026496942e+01 +1858 1570 -5.416220002058462e+01 +1858 1571 -6.797204698756201e+01 +1858 1572 -8.726265053974967e+01 +1858 1573 -1.112023202068747e+02 +1858 1574 -1.353445496343036e+02 +1858 1575 -1.512628164030906e+02 +1858 2134 -8.455751811575986e+01 +1858 2135 -7.739429142416682e+01 +1858 2136 -6.606134132672688e+01 +1858 2137 -5.416220002058462e+01 +1858 2138 -4.398263164573857e+01 +1858 2139 -3.629276779865588e+01 +1858 2140 -3.100122392289858e+01 +1858 2141 -2.774798050936779e+01 +1858 2142 -2.620940698061742e+01 +1859 1432 -1.336813651340294e+01 +1859 1433 -1.396191802264486e+01 +1859 1434 -1.518203609416466e+01 +1859 1435 -1.707507926940496e+01 +1859 1436 -1.965477828103598e+01 +1859 1437 -2.281491025526310e+01 +1859 1438 -2.621419542240647e+01 +1859 1439 -2.921308657465229e+01 +1859 1440 -3.100728135248165e+01 +1859 1567 -3.100122392289864e+01 +1859 1568 -3.295302401855845e+01 +1859 1569 -3.711530555640482e+01 +1859 1570 -4.398263164573857e+01 +1859 1571 -5.416220002058462e+01 +1859 1572 -6.797204698756201e+01 +1859 1573 -8.455751811576010e+01 +1859 1574 -1.007640600234616e+02 +1859 1575 -1.112023202068744e+02 +1859 2134 -1.112023202068744e+02 +1859 2135 -1.007640600234616e+02 +1859 2136 -8.455751811576010e+01 +1859 2137 -6.797204698756201e+01 +1859 2138 -5.416220002058462e+01 +1859 2139 -4.398263164573857e+01 +1859 2140 -3.711530555640482e+01 +1859 2141 -3.295302401855845e+01 +1859 2142 -3.100122392289864e+01 +1860 1432 -1.184372960400065e+01 +1860 1433 -1.234420052045069e+01 +1860 1434 -1.336813651340292e+01 +1860 1435 -1.494561758129197e+01 +1860 1436 -1.707507926940496e+01 +1860 1437 -1.965477828103598e+01 +1860 1438 -2.239757409043196e+01 +1860 1439 -2.479209926714913e+01 +1860 1440 -2.621419542240643e+01 +1860 1567 -2.620940698061742e+01 +1860 1568 -2.774798050936779e+01 +1860 1569 -3.100122392289858e+01 +1860 1570 -3.629276779865588e+01 +1860 1571 -4.398263164573857e+01 +1860 1572 -5.416220002058462e+01 +1860 1573 -6.606134132672688e+01 +1860 1574 -7.739429142416682e+01 +1860 1575 -8.455751811575986e+01 +1860 2134 -1.512628164030906e+02 +1860 2135 -1.353445496343036e+02 +1860 2136 -1.112023202068747e+02 +1860 2137 -8.726265053974967e+01 +1860 2138 -6.797204698756201e+01 +1860 2139 -5.416220002058462e+01 +1860 2140 -4.506046026496942e+01 +1860 2141 -3.963467701820890e+01 +1860 2142 -3.711530555640490e+01 +1861 1432 -1.069703031088084e+01 +1861 1433 -1.113049648221346e+01 +1861 1434 -1.201426721054981e+01 +1861 1435 -1.336813651340292e+01 +1861 1436 -1.518203609416466e+01 +1861 1437 -1.736013665098131e+01 +1861 1438 -1.965477828103598e+01 +1861 1439 -2.164167292784031e+01 +1861 1440 -2.281491025526307e+01 +1861 1567 -2.281096793104268e+01 +1861 1568 -2.407490908992506e+01 +1861 1569 -2.672989532903555e+01 +1861 1570 -3.100122392289858e+01 +1861 1571 -3.711530555640482e+01 +1861 1572 -4.506046026496942e+01 +1861 1573 -5.416220002058462e+01 +1861 1574 -6.266865647386096e+01 +1861 1575 -6.797204698756184e+01 +1861 2134 -2.053883607687489e+02 +1861 2135 -1.811983282511275e+02 +1861 2136 -1.454508347890311e+02 +1861 2137 -1.112023202068747e+02 +1861 2138 -8.455751811576010e+01 +1861 2139 -6.606134132672688e+01 +1861 2140 -5.416220002058462e+01 +1861 2141 -4.718848846240646e+01 +1861 2142 -4.398263164573866e+01 +1862 1432 -9.944085360683063e+00 +1862 1433 -1.033512964800000e+01 +1862 1434 -1.113049648221346e+01 +1862 1435 -1.234420052045069e+01 +1862 1436 -1.396191802264486e+01 +1862 1437 -1.589274010473518e+01 +1862 1438 -1.791417887437397e+01 +1862 1439 -1.965477828103598e+01 +1862 1440 -2.067858569511584e+01 +1862 1567 -2.067515029553633e+01 +1862 1568 -2.177494503977683e+01 +1862 1569 -2.407490908992506e+01 +1862 1570 -2.774798050936779e+01 +1862 1571 -3.295302401855845e+01 +1862 1572 -3.963467701820890e+01 +1862 1573 -4.718848846240646e+01 +1862 1574 -5.416220002058462e+01 +1862 1575 -5.847168336242214e+01 +1862 2134 -2.647767438527630e+02 +1862 2135 -2.305668762810884e+02 +1862 2136 -1.811983282511275e+02 +1862 2137 -1.353445496343036e+02 +1862 2138 -1.007640600234616e+02 +1862 2139 -7.739429142416682e+01 +1862 2140 -6.266865647386096e+01 +1862 2141 -5.416220002058462e+01 +1862 2142 -5.028460369863171e+01 +1863 1432 -9.573445684409064e+00 +1863 1433 -9.944085360683063e+00 +1863 1434 -1.069703031088084e+01 +1863 1435 -1.184372960400065e+01 +1863 1436 -1.336813651340294e+01 +1863 1437 -1.518203609416468e+01 +1863 1438 -1.707507926940499e+01 +1863 1439 -1.870055440211151e+01 +1863 1440 -1.965477828103598e+01 +1863 1567 -1.965157861598590e+01 +1863 1568 -2.067515029553633e+01 +1863 1569 -2.281096793104268e+01 +1863 1570 -2.620940698061742e+01 +1863 1571 -3.100122392289864e+01 +1863 1572 -3.711530555640490e+01 +1863 1573 -4.398263164573866e+01 +1863 1574 -5.028460369863171e+01 +1863 1575 -5.416220002058462e+01 +1863 2134 -3.065373731090118e+02 +1863 2135 -2.647767438527630e+02 +1863 2136 -2.053883607687489e+02 +1863 2137 -1.512628164030906e+02 +1863 2138 -1.112023202068744e+02 +1863 2139 -8.455751811575986e+01 +1863 2140 -6.797204698756184e+01 +1863 2141 -5.847168336242214e+01 +1863 2142 -5.416220002058462e+01 +1864 1729 -3.063876713483004e+02 +1864 1730 -3.311617365195747e+02 +1864 1731 -3.859179776157605e+02 +1864 1732 -4.819366867771664e+02 +1864 1733 -6.371952057562402e+02 +1864 1734 -8.726231103602357e+02 +1864 1735 -1.193932486839834e+03 +1864 1736 -1.550121445008505e+03 +1864 1737 -1.802596433195456e+03 +1864 2008 -3.063876713483004e+02 +1864 2009 -2.841326260213855e+02 +1864 2010 -2.480403651673271e+02 +1864 2011 -2.088271183655457e+02 +1864 2012 -1.740274317161707e+02 +1864 2013 -1.468355065336023e+02 +1864 2014 -1.275984131219179e+02 +1864 2015 -1.155304899028561e+02 +1864 2016 -1.097534196790493e+02 +1864 2071 -1.111842160419089e+02 +1864 2072 -1.057061586526018e+02 +1864 2073 -9.638822517401589e+01 +1864 2074 -8.555928471614156e+01 +1864 2075 -7.520762033775921e+01 +1864 2076 -6.652797451218323e+01 +1864 2077 -6.001174723167335e+01 +1864 2078 -5.573941364116940e+01 +1864 2079 -5.363826960242956e+01 +1865 1729 -2.841326260213855e+02 +1865 1730 -3.063876713483004e+02 +1865 1731 -3.553280674768354e+02 +1865 1732 -4.404031329187411e+02 +1865 1733 -5.762343277298867e+02 +1865 1734 -7.788097592344268e+02 +1865 1735 -1.049909849375148e+03 +1865 1736 -1.344510568096302e+03 +1865 1737 -1.550121445008505e+03 +1865 2008 -3.311617365195747e+02 +1865 2009 -3.063876713483004e+02 +1865 2010 -2.663884709281895e+02 +1865 2011 -2.231981844606894e+02 +1865 2012 -1.851243485745373e+02 +1865 2013 -1.555580782497810e+02 +1865 2014 -1.347481526436478e+02 +1865 2015 -1.217424124188383e+02 +1865 2016 -1.155304899028561e+02 +1865 2071 -1.170681125153376e+02 +1865 2072 -1.111842160419089e+02 +1865 2073 -1.011961191083175e+02 +1865 2074 -8.962181586287889e+01 +1865 2075 -7.859349409841370e+01 +1865 2076 -6.937545782864687e+01 +1865 2077 -6.247361649834824e+01 +1865 2078 -5.795761808209202e+01 +1865 2079 -5.573941364116940e+01 +1866 1729 -2.480403651673271e+02 +1866 1730 -2.663884709281895e+02 +1866 1731 -3.063876713483004e+02 +1866 1732 -3.748904053829385e+02 +1866 1733 -4.819366867771664e+02 +1866 1734 -6.371952057562402e+02 +1866 1735 -8.383319685358435e+02 +1866 1736 -1.049909849375148e+03 +1866 1737 -1.193932486839834e+03 +1866 2008 -3.859179776157605e+02 +1866 2009 -3.553280674768354e+02 +1866 2010 -3.063876713483004e+02 +1866 2011 -2.542062119667738e+02 +1866 2012 -2.088271183655457e+02 +1866 2013 -1.740274317161707e+02 +1866 2014 -1.497853840269160e+02 +1866 2015 -1.347481526436478e+02 +1866 2016 -1.275984131219179e+02 +1866 2071 -1.293661657908652e+02 +1866 2072 -1.226088998409724e+02 +1866 2073 -1.111842160419089e+02 +1866 2074 -9.802102195827720e+01 +1866 2075 -8.555928471614156e+01 +1866 2076 -7.520762033775921e+01 +1866 2077 -6.749803222962952e+01 +1866 2078 -6.247361649834824e+01 +1866 2079 -6.001174723167335e+01 +1867 1729 -2.088271183655457e+02 +1867 1730 -2.231981844606894e+02 +1867 1731 -2.542062119667738e+02 +1867 1732 -3.063876713483004e+02 +1867 1733 -3.859179776157605e+02 +1867 1734 -4.976453857371607e+02 +1867 1735 -6.371952057562402e+02 +1867 1736 -7.788097592344268e+02 +1867 1737 -8.726231103602357e+02 +1867 2008 -4.819366867771664e+02 +1867 2009 -4.404031329187411e+02 +1867 2010 -3.748904053829385e+02 +1867 2011 -3.063876713483004e+02 +1867 2012 -2.480403651673271e+02 +1867 2013 -2.041390437321793e+02 +1867 2014 -1.740274317161707e+02 +1867 2015 -1.555580782497810e+02 +1867 2016 -1.468355065336023e+02 +1867 2071 -1.489885081652992e+02 +1867 2072 -1.407716848553628e+02 +1867 2073 -1.269615920628681e+02 +1867 2074 -1.111842160419089e+02 +1867 2075 -9.638822517401589e+01 +1867 2076 -8.420868002944904e+01 +1867 2077 -7.520762033775921e+01 +1867 2078 -6.937545782864687e+01 +1867 2079 -6.652797451218323e+01 +1868 1729 -1.740274317161707e+02 +1868 1730 -1.851243485745373e+02 +1868 1731 -2.088271183655457e+02 +1868 1732 -2.480403651673271e+02 +1868 1733 -3.063876713483004e+02 +1868 1734 -3.859179776157605e+02 +1868 1735 -4.819366867771664e+02 +1868 1736 -5.762343277298867e+02 +1868 1737 -6.371952057562402e+02 +1868 2008 -6.371952057562402e+02 +1868 2009 -5.762343277298867e+02 +1868 2010 -4.819366867771664e+02 +1868 2011 -3.859179776157605e+02 +1868 2012 -3.063876713483004e+02 +1868 2013 -2.480403651673271e+02 +1868 2014 -2.088271183655457e+02 +1868 2015 -1.851243485745373e+02 +1868 2016 -1.740274317161707e+02 +1868 2071 -1.767605489846857e+02 +1868 2072 -1.663510232448633e+02 +1868 2073 -1.489885081652992e+02 +1868 2074 -1.293661657908652e+02 +1868 2075 -1.111842160419089e+02 +1868 2076 -9.638822517401589e+01 +1868 2077 -8.555928471614156e+01 +1868 2078 -7.859349409841370e+01 +1868 2079 -7.520762033775921e+01 +1869 1729 -1.468355065336023e+02 +1869 1730 -1.555580782497810e+02 +1869 1731 -1.740274317161707e+02 +1869 1732 -2.041390437321793e+02 +1869 1733 -2.480403651673271e+02 +1869 1734 -3.063876713483004e+02 +1869 1735 -3.748904053829385e+02 +1869 1736 -4.404031329187411e+02 +1869 1737 -4.819366867771664e+02 +1869 2008 -8.726231103602357e+02 +1869 2009 -7.788097592344268e+02 +1869 2010 -6.371952057562402e+02 +1869 2011 -4.976453857371607e+02 +1869 2012 -3.859179776157605e+02 +1869 2013 -3.063876713483004e+02 +1869 2014 -2.542062119667738e+02 +1869 2015 -2.231981844606894e+02 +1869 2016 -2.088271183655457e+02 +1869 2071 -2.123577731150849e+02 +1869 2072 -1.989422168423268e+02 +1869 2073 -1.767605489846857e+02 +1869 2074 -1.519993633210930e+02 +1869 2075 -1.293661657908652e+02 +1869 2076 -1.111842160419089e+02 +1869 2077 -9.802102195827720e+01 +1869 2078 -8.962181586287889e+01 +1869 2079 -8.555928471614156e+01 +1870 1729 -1.275984131219179e+02 +1870 1730 -1.347481526436478e+02 +1870 1731 -1.497853840269160e+02 +1870 1732 -1.740274317161707e+02 +1870 1733 -2.088271183655457e+02 +1870 1734 -2.542062119667738e+02 +1870 1735 -3.063876713483004e+02 +1870 1736 -3.553280674768354e+02 +1870 1737 -3.859179776157605e+02 +1870 2008 -1.193932486839834e+03 +1870 2009 -1.049909849375148e+03 +1870 2010 -8.383319685358435e+02 +1870 2011 -6.371952057562402e+02 +1870 2012 -4.819366867771664e+02 +1870 2013 -3.748904053829385e+02 +1870 2014 -3.063876713483004e+02 +1870 2015 -2.663884709281895e+02 +1870 2016 -2.480403651673271e+02 +1870 2071 -2.525366109215767e+02 +1870 2072 -2.354925657825773e+02 +1870 2073 -2.075588680195229e+02 +1870 2074 -1.767605489846857e+02 +1870 2075 -1.489885081652992e+02 +1870 2076 -1.269615920628681e+02 +1870 2077 -1.111842160419089e+02 +1870 2078 -1.011961191083175e+02 +1870 2079 -9.638822517401589e+01 +1871 1729 -1.155304899028561e+02 +1871 1730 -1.217424124188383e+02 +1871 1731 -1.347481526436478e+02 +1871 1732 -1.555580782497810e+02 +1871 1733 -1.851243485745373e+02 +1871 1734 -2.231981844606894e+02 +1871 1735 -2.663884709281895e+02 +1871 1736 -3.063876713483004e+02 +1871 1737 -3.311617365195747e+02 +1871 2008 -1.550121445008505e+03 +1871 2009 -1.344510568096302e+03 +1871 2010 -1.049909849375148e+03 +1871 2011 -7.788097592344268e+02 +1871 2012 -5.762343277298867e+02 +1871 2013 -4.404031329187411e+02 +1871 2014 -3.553280674768354e+02 +1871 2015 -3.063876713483004e+02 +1871 2016 -2.841326260213855e+02 +1871 2071 -2.895745815575320e+02 +1871 2072 -2.689865983609317e+02 +1871 2073 -2.354925657825773e+02 +1871 2074 -1.989422168423268e+02 +1871 2075 -1.663510232448633e+02 +1871 2076 -1.407716848553628e+02 +1871 2077 -1.226088998409724e+02 +1871 2078 -1.111842160419089e+02 +1871 2079 -1.057061586526018e+02 +1872 1729 -1.097534196790493e+02 +1872 1730 -1.155304899028561e+02 +1872 1731 -1.275984131219179e+02 +1872 1732 -1.468355065336023e+02 +1872 1733 -1.740274317161707e+02 +1872 1734 -2.088271183655457e+02 +1872 1735 -2.480403651673271e+02 +1872 1736 -2.841326260213855e+02 +1872 1737 -3.063876713483004e+02 +1872 2008 -1.802596433195456e+03 +1872 2009 -1.550121445008505e+03 +1872 2010 -1.193932486839834e+03 +1872 2011 -8.726231103602357e+02 +1872 2012 -6.371952057562402e+02 +1872 2013 -4.819366867771664e+02 +1872 2014 -3.859179776157605e+02 +1872 2015 -3.311617365195747e+02 +1872 2016 -3.063876713483004e+02 +1872 2071 -3.124380547854544e+02 +1872 2072 -2.895745815575320e+02 +1872 2073 -2.525366109215767e+02 +1872 2074 -2.123577731150849e+02 +1872 2075 -1.767605489846857e+02 +1872 2076 -1.489885081652992e+02 +1872 2077 -1.293661657908652e+02 +1872 2078 -1.170681125153376e+02 +1872 2079 -1.111842160419089e+02 +1873 1801 -1.733190400658708e+03 +1873 1802 -1.877824568765017e+03 +1873 1803 -2.199157547087201e+03 +1873 1804 -2.767706810094291e+03 +1873 1805 -3.699147964795180e+03 +1873 1806 -5.136224430633882e+03 +1873 1807 -7.138491575686282e+03 +1873 1808 -9.405703259334639e+03 +1873 1809 -1.103972130715926e+04 +1873 1936 -1.733190400658708e+03 +1873 1937 -1.603684467943633e+03 +1873 1938 -1.394551574360510e+03 +1873 1939 -1.168677565678393e+03 +1873 1940 -9.695072463564434e+02 +1873 1941 -8.148024630667926e+02 +1873 1942 -7.058924559832867e+02 +1873 1943 -6.378158089920671e+02 +1873 1944 -6.052974323170196e+02 +1873 1963 -6.289529049931513e+02 +1873 1964 -5.970589583440825e+02 +1873 1965 -5.429674662554822e+02 +1873 1966 -4.803677035258846e+02 +1873 1967 -4.208084537187713e+02 +1873 1968 -3.710963518270331e+02 +1873 1969 -3.339204550667988e+02 +1873 1970 -3.096178268240465e+02 +1873 1971 -2.976873911031298e+02 +1874 1801 -1.603684467943633e+03 +1874 1802 -1.733190400658708e+03 +1874 1803 -2.019368486704435e+03 +1874 1804 -2.521021940438000e+03 +1874 1805 -3.331754877699595e+03 +1874 1806 -4.560278038130823e+03 +1874 1807 -6.235592529048601e+03 +1874 1808 -8.091232579773156e+03 +1874 1809 -9.405703259334639e+03 +1874 1936 -1.877824568765017e+03 +1874 1937 -1.733190400658708e+03 +1874 1938 -1.500725861549673e+03 +1874 1939 -1.251286952144484e+03 +1874 1940 -1.032880208377977e+03 +1874 1941 -8.643348602446076e+02 +1874 1942 -7.463158073460687e+02 +1874 1943 -6.728335244699299e+02 +1874 1944 -6.378158089920671e+02 +1874 1963 -6.632839990295113e+02 +1874 1964 -6.289529049931513e+02 +1874 1965 -5.708523475060541e+02 +1874 1966 -5.038180997021789e+02 +1874 1967 -4.402579127124382e+02 +1874 1968 -3.873813675510144e+02 +1874 1969 -3.479505460244110e+02 +1874 1970 -3.222285372305477e+02 +1874 1971 -3.096178268240465e+02 +1875 1801 -1.394551574360510e+03 +1875 1802 -1.500725861549673e+03 +1875 1803 -1.733190400658708e+03 +1875 1804 -2.134265778758326e+03 +1875 1805 -2.767706810094291e+03 +1875 1806 -3.699147964795180e+03 +1875 1807 -4.925216936196723e+03 +1875 1808 -6.235592529048601e+03 +1875 1809 -7.138491575686282e+03 +1875 1936 -2.199157547087201e+03 +1875 1937 -2.019368486704435e+03 +1875 1938 -1.733190400658708e+03 +1875 1939 -1.430197816180122e+03 +1875 1940 -1.168677565678393e+03 +1875 1941 -9.695072463564434e+02 +1875 1942 -8.315436028021828e+02 +1875 1943 -7.463158073460687e+02 +1875 1944 -7.058924559832867e+02 +1875 1963 -7.352796046183681e+02 +1875 1964 -6.956816209337401e+02 +1875 1965 -6.289529049931513e+02 +1875 1966 -5.524312223207850e+02 +1875 1967 -4.803677035258846e+02 +1875 1968 -4.208084537187713e+02 +1875 1969 -3.766415408901786e+02 +1875 1970 -3.479505460244110e+02 +1875 1971 -3.339204550667988e+02 +1876 1801 -1.168677565678393e+03 +1876 1802 -1.251286952144484e+03 +1876 1803 -1.430197816180122e+03 +1876 1804 -1.733190400658708e+03 +1876 1805 -2.199157547087201e+03 +1876 1806 -2.861294172280346e+03 +1876 1807 -3.699147964795180e+03 +1876 1808 -4.560278038130823e+03 +1876 1809 -5.136224430633882e+03 +1876 1936 -2.767706810094291e+03 +1876 1937 -2.521021940438000e+03 +1876 1938 -2.134265778758326e+03 +1876 1939 -1.733190400658708e+03 +1876 1940 -1.394551574360510e+03 +1876 1941 -1.141773184361042e+03 +1876 1942 -9.695072463564434e+02 +1876 1943 -8.643348602446076e+02 +1876 1944 -8.148024630667926e+02 +1876 1963 -8.507888885505199e+02 +1876 1964 -8.023274760830675e+02 +1876 1965 -7.211778000851799e+02 +1876 1966 -6.289529049931513e+02 +1876 1967 -5.429674662554822e+02 +1876 1968 -4.725808574370885e+02 +1876 1969 -4.208084537187713e+02 +1876 1970 -3.873813675510144e+02 +1876 1971 -3.710963518270331e+02 +1877 1801 -9.695072463564434e+02 +1877 1802 -1.032880208377977e+03 +1877 1803 -1.168677565678393e+03 +1877 1804 -1.394551574360510e+03 +1877 1805 -1.733190400658708e+03 +1877 1806 -2.199157547087201e+03 +1877 1807 -2.767706810094291e+03 +1877 1808 -3.331754877699595e+03 +1877 1809 -3.699147964795180e+03 +1877 1936 -3.699147964795180e+03 +1877 1937 -3.331754877699595e+03 +1877 1938 -2.767706810094291e+03 +1877 1939 -2.199157547087201e+03 +1877 1940 -1.733190400658708e+03 +1877 1941 -1.394551574360510e+03 +1877 1942 -1.168677565678393e+03 +1877 1943 -1.032880208377977e+03 +1877 1944 -9.695072463564434e+02 +1877 1963 -1.015511306612467e+03 +1877 1964 -9.536070604341750e+02 +1877 1965 -8.507888885505199e+02 +1877 1966 -7.352796046183681e+02 +1877 1967 -6.289529049931513e+02 +1877 1968 -5.429674662554822e+02 +1877 1969 -4.803677035258846e+02 +1877 1970 -4.402579127124382e+02 +1877 1971 -4.208084537187713e+02 +1878 1801 -8.148024630667926e+02 +1878 1802 -8.643348602446076e+02 +1878 1803 -9.695072463564434e+02 +1878 1804 -1.141773184361042e+03 +1878 1805 -1.394551574360510e+03 +1878 1806 -1.733190400658708e+03 +1878 1807 -2.134265778758326e+03 +1878 1808 -2.521021940438000e+03 +1878 1809 -2.767706810094291e+03 +1878 1936 -5.136224430633882e+03 +1878 1937 -4.560278038130823e+03 +1878 1938 -3.699147964795180e+03 +1878 1939 -2.861294172280346e+03 +1878 1940 -2.199157547087201e+03 +1878 1941 -1.733190400658708e+03 +1878 1942 -1.430197816180122e+03 +1878 1943 -1.251286952144484e+03 +1878 1944 -1.168677565678393e+03 +1878 1963 -1.228588660544053e+03 +1878 1964 -1.148042053110080e+03 +1878 1965 -1.015511306612467e+03 +1878 1966 -8.685786765383800e+02 +1878 1967 -7.352796046183681e+02 +1878 1968 -6.289529049931513e+02 +1878 1969 -5.524312223207850e+02 +1878 1970 -5.038180997021789e+02 +1878 1971 -4.803677035258846e+02 +1879 1801 -7.058924559832867e+02 +1879 1802 -7.463158073460687e+02 +1879 1803 -8.315436028021828e+02 +1879 1804 -9.695072463564434e+02 +1879 1805 -1.168677565678393e+03 +1879 1806 -1.430197816180122e+03 +1879 1807 -1.733190400658708e+03 +1879 1808 -2.019368486704435e+03 +1879 1809 -2.199157547087201e+03 +1879 1936 -7.138491575686282e+03 +1879 1937 -6.235592529048601e+03 +1879 1938 -4.925216936196723e+03 +1879 1939 -3.699147964795180e+03 +1879 1940 -2.767706810094291e+03 +1879 1941 -2.134265778758326e+03 +1879 1942 -1.733190400658708e+03 +1879 1943 -1.500725861549673e+03 +1879 1944 -1.394551574360510e+03 +1879 1963 -1.471477730866027e+03 +1879 1964 -1.368148367306964e+03 +1879 1965 -1.199743197084304e+03 +1879 1966 -1.015511306612467e+03 +1879 1967 -8.507888885505199e+02 +1879 1968 -7.211778000851799e+02 +1879 1969 -6.289529049931513e+02 +1879 1970 -5.708523475060541e+02 +1879 1971 -5.429674662554822e+02 +1880 1801 -6.378158089920671e+02 +1880 1802 -6.728335244699299e+02 +1880 1803 -7.463158073460687e+02 +1880 1804 -8.643348602446076e+02 +1880 1805 -1.032880208377977e+03 +1880 1806 -1.251286952144484e+03 +1880 1807 -1.500725861549673e+03 +1880 1808 -1.733190400658708e+03 +1880 1809 -1.877824568765017e+03 +1880 1936 -9.405703259334639e+03 +1880 1937 -8.091232579773156e+03 +1880 1938 -6.235592529048601e+03 +1880 1939 -4.560278038130823e+03 +1880 1940 -3.331754877699595e+03 +1880 1941 -2.521021940438000e+03 +1880 1942 -2.019368486704435e+03 +1880 1943 -1.733190400658708e+03 +1880 1944 -1.603684467943633e+03 +1880 1963 -1.697437739078449e+03 +1880 1964 -1.571600895131404e+03 +1880 1965 -1.368148367306964e+03 +1880 1966 -1.148042053110080e+03 +1880 1967 -9.536070604341750e+02 +1880 1968 -8.023274760830675e+02 +1880 1969 -6.956816209337401e+02 +1880 1970 -6.289529049931513e+02 +1880 1971 -5.970589583440825e+02 +1881 1801 -6.052974323170196e+02 +1881 1802 -6.378158089920671e+02 +1881 1803 -7.058924559832867e+02 +1881 1804 -8.148024630667926e+02 +1881 1805 -9.695072463564434e+02 +1881 1806 -1.168677565678393e+03 +1881 1807 -1.394551574360510e+03 +1881 1808 -1.603684467943633e+03 +1881 1809 -1.733190400658708e+03 +1881 1936 -1.103972130715926e+04 +1881 1937 -9.405703259334639e+03 +1881 1938 -7.138491575686282e+03 +1881 1939 -5.136224430633882e+03 +1881 1940 -3.699147964795180e+03 +1881 1941 -2.767706810094291e+03 +1881 1942 -2.199157547087201e+03 +1881 1943 -1.877824568765017e+03 +1881 1944 -1.733190400658708e+03 +1881 1963 -1.837845240586539e+03 +1881 1964 -1.697437739078449e+03 +1881 1965 -1.471477730866027e+03 +1881 1966 -1.228588660544053e+03 +1881 1967 -1.015511306612467e+03 +1881 1968 -8.507888885505199e+02 +1881 1969 -7.352796046183681e+02 +1881 1970 -6.632839990295113e+02 +1881 1971 -6.289529049931513e+02 +1900 1801 -6.289529049931513e+02 +1900 1802 -6.632839990295113e+02 +1900 1803 -7.352796046183681e+02 +1900 1804 -8.507888885505199e+02 +1900 1805 -1.015511306612467e+03 +1900 1806 -1.228588660544053e+03 +1900 1807 -1.471477730866027e+03 +1900 1808 -1.697437739078449e+03 +1900 1809 -1.837845240586539e+03 +1900 1828 -1.733190400658708e+03 +1900 1829 -1.877824568765017e+03 +1900 1830 -2.199157547087201e+03 +1900 1831 -2.767706810094291e+03 +1900 1832 -3.699147964795180e+03 +1900 1833 -5.136224430633882e+03 +1900 1834 -7.138491575686282e+03 +1900 1835 -9.405703259334639e+03 +1900 1836 -1.103972130715926e+04 +1900 1963 -1.733190400658708e+03 +1900 1964 -1.603684467943633e+03 +1900 1965 -1.394551574360510e+03 +1900 1966 -1.168677565678393e+03 +1900 1967 -9.695072463564434e+02 +1900 1968 -8.148024630667926e+02 +1900 1969 -7.058924559832867e+02 +1900 1970 -6.378158089920671e+02 +1900 1971 -6.052974323170196e+02 +1901 1801 -5.970589583440825e+02 +1901 1802 -6.289529049931513e+02 +1901 1803 -6.956816209337401e+02 +1901 1804 -8.023274760830675e+02 +1901 1805 -9.536070604341750e+02 +1901 1806 -1.148042053110080e+03 +1901 1807 -1.368148367306964e+03 +1901 1808 -1.571600895131404e+03 +1901 1809 -1.697437739078449e+03 +1901 1828 -1.603684467943633e+03 +1901 1829 -1.733190400658708e+03 +1901 1830 -2.019368486704435e+03 +1901 1831 -2.521021940438000e+03 +1901 1832 -3.331754877699595e+03 +1901 1833 -4.560278038130823e+03 +1901 1834 -6.235592529048601e+03 +1901 1835 -8.091232579773156e+03 +1901 1836 -9.405703259334639e+03 +1901 1963 -1.877824568765017e+03 +1901 1964 -1.733190400658708e+03 +1901 1965 -1.500725861549673e+03 +1901 1966 -1.251286952144484e+03 +1901 1967 -1.032880208377977e+03 +1901 1968 -8.643348602446076e+02 +1901 1969 -7.463158073460687e+02 +1901 1970 -6.728335244699299e+02 +1901 1971 -6.378158089920671e+02 +1902 1801 -5.429674662554822e+02 +1902 1802 -5.708523475060541e+02 +1902 1803 -6.289529049931513e+02 +1902 1804 -7.211778000851799e+02 +1902 1805 -8.507888885505199e+02 +1902 1806 -1.015511306612467e+03 +1902 1807 -1.199743197084304e+03 +1902 1808 -1.368148367306964e+03 +1902 1809 -1.471477730866027e+03 +1902 1828 -1.394551574360510e+03 +1902 1829 -1.500725861549673e+03 +1902 1830 -1.733190400658708e+03 +1902 1831 -2.134265778758326e+03 +1902 1832 -2.767706810094291e+03 +1902 1833 -3.699147964795180e+03 +1902 1834 -4.925216936196723e+03 +1902 1835 -6.235592529048601e+03 +1902 1836 -7.138491575686282e+03 +1902 1963 -2.199157547087201e+03 +1902 1964 -2.019368486704435e+03 +1902 1965 -1.733190400658708e+03 +1902 1966 -1.430197816180122e+03 +1902 1967 -1.168677565678393e+03 +1902 1968 -9.695072463564434e+02 +1902 1969 -8.315436028021828e+02 +1902 1970 -7.463158073460687e+02 +1902 1971 -7.058924559832867e+02 +1903 1801 -4.803677035258846e+02 +1903 1802 -5.038180997021789e+02 +1903 1803 -5.524312223207850e+02 +1903 1804 -6.289529049931513e+02 +1903 1805 -7.352796046183681e+02 +1903 1806 -8.685786765383800e+02 +1903 1807 -1.015511306612467e+03 +1903 1808 -1.148042053110080e+03 +1903 1809 -1.228588660544053e+03 +1903 1828 -1.168677565678393e+03 +1903 1829 -1.251286952144484e+03 +1903 1830 -1.430197816180122e+03 +1903 1831 -1.733190400658708e+03 +1903 1832 -2.199157547087201e+03 +1903 1833 -2.861294172280346e+03 +1903 1834 -3.699147964795180e+03 +1903 1835 -4.560278038130823e+03 +1903 1836 -5.136224430633882e+03 +1903 1963 -2.767706810094291e+03 +1903 1964 -2.521021940438000e+03 +1903 1965 -2.134265778758326e+03 +1903 1966 -1.733190400658708e+03 +1903 1967 -1.394551574360510e+03 +1903 1968 -1.141773184361042e+03 +1903 1969 -9.695072463564434e+02 +1903 1970 -8.643348602446076e+02 +1903 1971 -8.148024630667926e+02 +1904 1801 -4.208084537187713e+02 +1904 1802 -4.402579127124382e+02 +1904 1803 -4.803677035258846e+02 +1904 1804 -5.429674662554822e+02 +1904 1805 -6.289529049931513e+02 +1904 1806 -7.352796046183681e+02 +1904 1807 -8.507888885505199e+02 +1904 1808 -9.536070604341750e+02 +1904 1809 -1.015511306612467e+03 +1904 1828 -9.695072463564434e+02 +1904 1829 -1.032880208377977e+03 +1904 1830 -1.168677565678393e+03 +1904 1831 -1.394551574360510e+03 +1904 1832 -1.733190400658708e+03 +1904 1833 -2.199157547087201e+03 +1904 1834 -2.767706810094291e+03 +1904 1835 -3.331754877699595e+03 +1904 1836 -3.699147964795180e+03 +1904 1963 -3.699147964795180e+03 +1904 1964 -3.331754877699595e+03 +1904 1965 -2.767706810094291e+03 +1904 1966 -2.199157547087201e+03 +1904 1967 -1.733190400658708e+03 +1904 1968 -1.394551574360510e+03 +1904 1969 -1.168677565678393e+03 +1904 1970 -1.032880208377977e+03 +1904 1971 -9.695072463564434e+02 +1905 1801 -3.710963518270331e+02 +1905 1802 -3.873813675510144e+02 +1905 1803 -4.208084537187713e+02 +1905 1804 -4.725808574370885e+02 +1905 1805 -5.429674662554822e+02 +1905 1806 -6.289529049931513e+02 +1905 1807 -7.211778000851799e+02 +1905 1808 -8.023274760830675e+02 +1905 1809 -8.507888885505199e+02 +1905 1828 -8.148024630667926e+02 +1905 1829 -8.643348602446076e+02 +1905 1830 -9.695072463564434e+02 +1905 1831 -1.141773184361042e+03 +1905 1832 -1.394551574360510e+03 +1905 1833 -1.733190400658708e+03 +1905 1834 -2.134265778758326e+03 +1905 1835 -2.521021940438000e+03 +1905 1836 -2.767706810094291e+03 +1905 1963 -5.136224430633882e+03 +1905 1964 -4.560278038130823e+03 +1905 1965 -3.699147964795180e+03 +1905 1966 -2.861294172280346e+03 +1905 1967 -2.199157547087201e+03 +1905 1968 -1.733190400658708e+03 +1905 1969 -1.430197816180122e+03 +1905 1970 -1.251286952144484e+03 +1905 1971 -1.168677565678393e+03 +1906 1801 -3.339204550667988e+02 +1906 1802 -3.479505460244110e+02 +1906 1803 -3.766415408901786e+02 +1906 1804 -4.208084537187713e+02 +1906 1805 -4.803677035258846e+02 +1906 1806 -5.524312223207850e+02 +1906 1807 -6.289529049931513e+02 +1906 1808 -6.956816209337401e+02 +1906 1809 -7.352796046183681e+02 +1906 1828 -7.058924559832867e+02 +1906 1829 -7.463158073460687e+02 +1906 1830 -8.315436028021828e+02 +1906 1831 -9.695072463564434e+02 +1906 1832 -1.168677565678393e+03 +1906 1833 -1.430197816180122e+03 +1906 1834 -1.733190400658708e+03 +1906 1835 -2.019368486704435e+03 +1906 1836 -2.199157547087201e+03 +1906 1963 -7.138491575686282e+03 +1906 1964 -6.235592529048601e+03 +1906 1965 -4.925216936196723e+03 +1906 1966 -3.699147964795180e+03 +1906 1967 -2.767706810094291e+03 +1906 1968 -2.134265778758326e+03 +1906 1969 -1.733190400658708e+03 +1906 1970 -1.500725861549673e+03 +1906 1971 -1.394551574360510e+03 +1907 1801 -3.096178268240465e+02 +1907 1802 -3.222285372305477e+02 +1907 1803 -3.479505460244110e+02 +1907 1804 -3.873813675510144e+02 +1907 1805 -4.402579127124382e+02 +1907 1806 -5.038180997021789e+02 +1907 1807 -5.708523475060541e+02 +1907 1808 -6.289529049931513e+02 +1907 1809 -6.632839990295113e+02 +1907 1828 -6.378158089920671e+02 +1907 1829 -6.728335244699299e+02 +1907 1830 -7.463158073460687e+02 +1907 1831 -8.643348602446076e+02 +1907 1832 -1.032880208377977e+03 +1907 1833 -1.251286952144484e+03 +1907 1834 -1.500725861549673e+03 +1907 1835 -1.733190400658708e+03 +1907 1836 -1.877824568765017e+03 +1907 1963 -9.405703259334639e+03 +1907 1964 -8.091232579773156e+03 +1907 1965 -6.235592529048601e+03 +1907 1966 -4.560278038130823e+03 +1907 1967 -3.331754877699595e+03 +1907 1968 -2.521021940438000e+03 +1907 1969 -2.019368486704435e+03 +1907 1970 -1.733190400658708e+03 +1907 1971 -1.603684467943633e+03 +1908 1801 -2.976873911031298e+02 +1908 1802 -3.096178268240465e+02 +1908 1803 -3.339204550667988e+02 +1908 1804 -3.710963518270331e+02 +1908 1805 -4.208084537187713e+02 +1908 1806 -4.803677035258846e+02 +1908 1807 -5.429674662554822e+02 +1908 1808 -5.970589583440825e+02 +1908 1809 -6.289529049931513e+02 +1908 1828 -6.052974323170196e+02 +1908 1829 -6.378158089920671e+02 +1908 1830 -7.058924559832867e+02 +1908 1831 -8.148024630667926e+02 +1908 1832 -9.695072463564434e+02 +1908 1833 -1.168677565678393e+03 +1908 1834 -1.394551574360510e+03 +1908 1835 -1.603684467943633e+03 +1908 1836 -1.733190400658708e+03 +1908 1963 -1.103972130715926e+04 +1908 1964 -9.405703259334639e+03 +1908 1965 -7.138491575686282e+03 +1908 1966 -5.136224430633882e+03 +1908 1967 -3.699147964795180e+03 +1908 1968 -2.767706810094291e+03 +1908 1969 -2.199157547087201e+03 +1908 1970 -1.877824568765017e+03 +1908 1971 -1.733190400658708e+03 +1927 1729 -1.111842160419089e+02 +1927 1730 -1.170681125153376e+02 +1927 1731 -1.293661657908652e+02 +1927 1732 -1.489885081652992e+02 +1927 1733 -1.767605489846857e+02 +1927 1734 -2.123577731150849e+02 +1927 1735 -2.525366109215767e+02 +1927 1736 -2.895745815575320e+02 +1927 1737 -3.124380547854544e+02 +1927 1792 -3.063876713483004e+02 +1927 1793 -3.311617365195747e+02 +1927 1794 -3.859179776157605e+02 +1927 1795 -4.819366867771664e+02 +1927 1796 -6.371952057562402e+02 +1927 1797 -8.726231103602357e+02 +1927 1798 -1.193932486839834e+03 +1927 1799 -1.550121445008505e+03 +1927 1800 -1.802596433195456e+03 +1927 2071 -3.063876713483004e+02 +1927 2072 -2.841326260213855e+02 +1927 2073 -2.480403651673271e+02 +1927 2074 -2.088271183655457e+02 +1927 2075 -1.740274317161707e+02 +1927 2076 -1.468355065336023e+02 +1927 2077 -1.275984131219179e+02 +1927 2078 -1.155304899028561e+02 +1927 2079 -1.097534196790493e+02 +1928 1729 -1.057061586526018e+02 +1928 1730 -1.111842160419089e+02 +1928 1731 -1.226088998409724e+02 +1928 1732 -1.407716848553628e+02 +1928 1733 -1.663510232448633e+02 +1928 1734 -1.989422168423268e+02 +1928 1735 -2.354925657825773e+02 +1928 1736 -2.689865983609317e+02 +1928 1737 -2.895745815575320e+02 +1928 1792 -2.841326260213855e+02 +1928 1793 -3.063876713483004e+02 +1928 1794 -3.553280674768354e+02 +1928 1795 -4.404031329187411e+02 +1928 1796 -5.762343277298867e+02 +1928 1797 -7.788097592344268e+02 +1928 1798 -1.049909849375148e+03 +1928 1799 -1.344510568096302e+03 +1928 1800 -1.550121445008505e+03 +1928 2071 -3.311617365195747e+02 +1928 2072 -3.063876713483004e+02 +1928 2073 -2.663884709281895e+02 +1928 2074 -2.231981844606894e+02 +1928 2075 -1.851243485745373e+02 +1928 2076 -1.555580782497810e+02 +1928 2077 -1.347481526436478e+02 +1928 2078 -1.217424124188383e+02 +1928 2079 -1.155304899028561e+02 +1929 1729 -9.638822517401589e+01 +1929 1730 -1.011961191083175e+02 +1929 1731 -1.111842160419089e+02 +1929 1732 -1.269615920628681e+02 +1929 1733 -1.489885081652992e+02 +1929 1734 -1.767605489846857e+02 +1929 1735 -2.075588680195229e+02 +1929 1736 -2.354925657825773e+02 +1929 1737 -2.525366109215767e+02 +1929 1792 -2.480403651673271e+02 +1929 1793 -2.663884709281895e+02 +1929 1794 -3.063876713483004e+02 +1929 1795 -3.748904053829385e+02 +1929 1796 -4.819366867771664e+02 +1929 1797 -6.371952057562402e+02 +1929 1798 -8.383319685358435e+02 +1929 1799 -1.049909849375148e+03 +1929 1800 -1.193932486839834e+03 +1929 2071 -3.859179776157605e+02 +1929 2072 -3.553280674768354e+02 +1929 2073 -3.063876713483004e+02 +1929 2074 -2.542062119667738e+02 +1929 2075 -2.088271183655457e+02 +1929 2076 -1.740274317161707e+02 +1929 2077 -1.497853840269160e+02 +1929 2078 -1.347481526436478e+02 +1929 2079 -1.275984131219179e+02 +1930 1729 -8.555928471614156e+01 +1930 1730 -8.962181586287889e+01 +1930 1731 -9.802102195827720e+01 +1930 1732 -1.111842160419089e+02 +1930 1733 -1.293661657908652e+02 +1930 1734 -1.519993633210930e+02 +1930 1735 -1.767605489846857e+02 +1930 1736 -1.989422168423268e+02 +1930 1737 -2.123577731150849e+02 +1930 1792 -2.088271183655457e+02 +1930 1793 -2.231981844606894e+02 +1930 1794 -2.542062119667738e+02 +1930 1795 -3.063876713483004e+02 +1930 1796 -3.859179776157605e+02 +1930 1797 -4.976453857371607e+02 +1930 1798 -6.371952057562402e+02 +1930 1799 -7.788097592344268e+02 +1930 1800 -8.726231103602357e+02 +1930 2071 -4.819366867771664e+02 +1930 2072 -4.404031329187411e+02 +1930 2073 -3.748904053829385e+02 +1930 2074 -3.063876713483004e+02 +1930 2075 -2.480403651673271e+02 +1930 2076 -2.041390437321793e+02 +1930 2077 -1.740274317161707e+02 +1930 2078 -1.555580782497810e+02 +1930 2079 -1.468355065336023e+02 +1931 1729 -7.520762033775921e+01 +1931 1730 -7.859349409841370e+01 +1931 1731 -8.555928471614156e+01 +1931 1732 -9.638822517401589e+01 +1931 1733 -1.111842160419089e+02 +1931 1734 -1.293661657908652e+02 +1931 1735 -1.489885081652992e+02 +1931 1736 -1.663510232448633e+02 +1931 1737 -1.767605489846857e+02 +1931 1792 -1.740274317161707e+02 +1931 1793 -1.851243485745373e+02 +1931 1794 -2.088271183655457e+02 +1931 1795 -2.480403651673271e+02 +1931 1796 -3.063876713483004e+02 +1931 1797 -3.859179776157605e+02 +1931 1798 -4.819366867771664e+02 +1931 1799 -5.762343277298867e+02 +1931 1800 -6.371952057562402e+02 +1931 2071 -6.371952057562402e+02 +1931 2072 -5.762343277298867e+02 +1931 2073 -4.819366867771664e+02 +1931 2074 -3.859179776157605e+02 +1931 2075 -3.063876713483004e+02 +1931 2076 -2.480403651673271e+02 +1931 2077 -2.088271183655457e+02 +1931 2078 -1.851243485745373e+02 +1931 2079 -1.740274317161707e+02 +1932 1729 -6.652797451218323e+01 +1932 1730 -6.937545782864687e+01 +1932 1731 -7.520762033775921e+01 +1932 1732 -8.420868002944904e+01 +1932 1733 -9.638822517401589e+01 +1932 1734 -1.111842160419089e+02 +1932 1735 -1.269615920628681e+02 +1932 1736 -1.407716848553628e+02 +1932 1737 -1.489885081652992e+02 +1932 1792 -1.468355065336023e+02 +1932 1793 -1.555580782497810e+02 +1932 1794 -1.740274317161707e+02 +1932 1795 -2.041390437321793e+02 +1932 1796 -2.480403651673271e+02 +1932 1797 -3.063876713483004e+02 +1932 1798 -3.748904053829385e+02 +1932 1799 -4.404031329187411e+02 +1932 1800 -4.819366867771664e+02 +1932 2071 -8.726231103602357e+02 +1932 2072 -7.788097592344268e+02 +1932 2073 -6.371952057562402e+02 +1932 2074 -4.976453857371607e+02 +1932 2075 -3.859179776157605e+02 +1932 2076 -3.063876713483004e+02 +1932 2077 -2.542062119667738e+02 +1932 2078 -2.231981844606894e+02 +1932 2079 -2.088271183655457e+02 +1933 1729 -6.001174723167335e+01 +1933 1730 -6.247361649834824e+01 +1933 1731 -6.749803222962952e+01 +1933 1732 -7.520762033775921e+01 +1933 1733 -8.555928471614156e+01 +1933 1734 -9.802102195827720e+01 +1933 1735 -1.111842160419089e+02 +1933 1736 -1.226088998409724e+02 +1933 1737 -1.293661657908652e+02 +1933 1792 -1.275984131219179e+02 +1933 1793 -1.347481526436478e+02 +1933 1794 -1.497853840269160e+02 +1933 1795 -1.740274317161707e+02 +1933 1796 -2.088271183655457e+02 +1933 1797 -2.542062119667738e+02 +1933 1798 -3.063876713483004e+02 +1933 1799 -3.553280674768354e+02 +1933 1800 -3.859179776157605e+02 +1933 2071 -1.193932486839834e+03 +1933 2072 -1.049909849375148e+03 +1933 2073 -8.383319685358435e+02 +1933 2074 -6.371952057562402e+02 +1933 2075 -4.819366867771664e+02 +1933 2076 -3.748904053829385e+02 +1933 2077 -3.063876713483004e+02 +1933 2078 -2.663884709281895e+02 +1933 2079 -2.480403651673271e+02 +1934 1729 -5.573941364116940e+01 +1934 1730 -5.795761808209202e+01 +1934 1731 -6.247361649834824e+01 +1934 1732 -6.937545782864687e+01 +1934 1733 -7.859349409841370e+01 +1934 1734 -8.962181586287889e+01 +1934 1735 -1.011961191083175e+02 +1934 1736 -1.111842160419089e+02 +1934 1737 -1.170681125153376e+02 +1934 1792 -1.155304899028561e+02 +1934 1793 -1.217424124188383e+02 +1934 1794 -1.347481526436478e+02 +1934 1795 -1.555580782497810e+02 +1934 1796 -1.851243485745373e+02 +1934 1797 -2.231981844606894e+02 +1934 1798 -2.663884709281895e+02 +1934 1799 -3.063876713483004e+02 +1934 1800 -3.311617365195747e+02 +1934 2071 -1.550121445008505e+03 +1934 2072 -1.344510568096302e+03 +1934 2073 -1.049909849375148e+03 +1934 2074 -7.788097592344268e+02 +1934 2075 -5.762343277298867e+02 +1934 2076 -4.404031329187411e+02 +1934 2077 -3.553280674768354e+02 +1934 2078 -3.063876713483004e+02 +1934 2079 -2.841326260213855e+02 +1935 1729 -5.363826960242956e+01 +1935 1730 -5.573941364116940e+01 +1935 1731 -6.001174723167335e+01 +1935 1732 -6.652797451218323e+01 +1935 1733 -7.520762033775921e+01 +1935 1734 -8.555928471614156e+01 +1935 1735 -9.638822517401589e+01 +1935 1736 -1.057061586526018e+02 +1935 1737 -1.111842160419089e+02 +1935 1792 -1.097534196790493e+02 +1935 1793 -1.155304899028561e+02 +1935 1794 -1.275984131219179e+02 +1935 1795 -1.468355065336023e+02 +1935 1796 -1.740274317161707e+02 +1935 1797 -2.088271183655457e+02 +1935 1798 -2.480403651673271e+02 +1935 1799 -2.841326260213855e+02 +1935 1800 -3.063876713483004e+02 +1935 2071 -1.802596433195456e+03 +1935 2072 -1.550121445008505e+03 +1935 2073 -1.193932486839834e+03 +1935 2074 -8.726231103602357e+02 +1935 2075 -6.371952057562402e+02 +1935 2076 -4.819366867771664e+02 +1935 2077 -3.859179776157605e+02 +1935 2078 -3.311617365195747e+02 +1935 2079 -3.063876713483004e+02 +1936 1873 -1.733190400658708e+03 +1936 1874 -1.877824568765017e+03 +1936 1875 -2.199157547087201e+03 +1936 1876 -2.767706810094291e+03 +1936 1877 -3.699147964795180e+03 +1936 1878 -5.136224430633882e+03 +1936 1879 -7.138491575686282e+03 +1936 1880 -9.405703259334639e+03 +1936 1881 -1.103972130715926e+04 +1936 2017 -1.733190400658708e+03 +1936 2018 -1.603684467943633e+03 +1936 2019 -1.394551574360510e+03 +1936 2020 -1.168677565678393e+03 +1936 2021 -9.695072463564434e+02 +1936 2022 -8.148024630667926e+02 +1936 2023 -7.058924559832867e+02 +1936 2024 -6.378158089920671e+02 +1936 2025 -6.052974323170196e+02 +1936 2044 -6.289529049931513e+02 +1936 2045 -5.970589583440825e+02 +1936 2046 -5.429674662554822e+02 +1936 2047 -4.803677035258846e+02 +1936 2048 -4.208084537187713e+02 +1936 2049 -3.710963518270331e+02 +1936 2050 -3.339204550667988e+02 +1936 2051 -3.096178268240465e+02 +1936 2052 -2.976873911031298e+02 +1937 1873 -1.603684467943633e+03 +1937 1874 -1.733190400658708e+03 +1937 1875 -2.019368486704435e+03 +1937 1876 -2.521021940438000e+03 +1937 1877 -3.331754877699595e+03 +1937 1878 -4.560278038130823e+03 +1937 1879 -6.235592529048601e+03 +1937 1880 -8.091232579773156e+03 +1937 1881 -9.405703259334639e+03 +1937 2017 -1.877824568765017e+03 +1937 2018 -1.733190400658708e+03 +1937 2019 -1.500725861549673e+03 +1937 2020 -1.251286952144484e+03 +1937 2021 -1.032880208377977e+03 +1937 2022 -8.643348602446076e+02 +1937 2023 -7.463158073460687e+02 +1937 2024 -6.728335244699299e+02 +1937 2025 -6.378158089920671e+02 +1937 2044 -6.632839990295113e+02 +1937 2045 -6.289529049931513e+02 +1937 2046 -5.708523475060541e+02 +1937 2047 -5.038180997021789e+02 +1937 2048 -4.402579127124382e+02 +1937 2049 -3.873813675510144e+02 +1937 2050 -3.479505460244110e+02 +1937 2051 -3.222285372305477e+02 +1937 2052 -3.096178268240465e+02 +1938 1873 -1.394551574360510e+03 +1938 1874 -1.500725861549673e+03 +1938 1875 -1.733190400658708e+03 +1938 1876 -2.134265778758326e+03 +1938 1877 -2.767706810094291e+03 +1938 1878 -3.699147964795180e+03 +1938 1879 -4.925216936196723e+03 +1938 1880 -6.235592529048601e+03 +1938 1881 -7.138491575686282e+03 +1938 2017 -2.199157547087201e+03 +1938 2018 -2.019368486704435e+03 +1938 2019 -1.733190400658708e+03 +1938 2020 -1.430197816180122e+03 +1938 2021 -1.168677565678393e+03 +1938 2022 -9.695072463564434e+02 +1938 2023 -8.315436028021828e+02 +1938 2024 -7.463158073460687e+02 +1938 2025 -7.058924559832867e+02 +1938 2044 -7.352796046183681e+02 +1938 2045 -6.956816209337401e+02 +1938 2046 -6.289529049931513e+02 +1938 2047 -5.524312223207850e+02 +1938 2048 -4.803677035258846e+02 +1938 2049 -4.208084537187713e+02 +1938 2050 -3.766415408901786e+02 +1938 2051 -3.479505460244110e+02 +1938 2052 -3.339204550667988e+02 +1939 1873 -1.168677565678393e+03 +1939 1874 -1.251286952144484e+03 +1939 1875 -1.430197816180122e+03 +1939 1876 -1.733190400658708e+03 +1939 1877 -2.199157547087201e+03 +1939 1878 -2.861294172280346e+03 +1939 1879 -3.699147964795180e+03 +1939 1880 -4.560278038130823e+03 +1939 1881 -5.136224430633882e+03 +1939 2017 -2.767706810094291e+03 +1939 2018 -2.521021940438000e+03 +1939 2019 -2.134265778758326e+03 +1939 2020 -1.733190400658708e+03 +1939 2021 -1.394551574360510e+03 +1939 2022 -1.141773184361042e+03 +1939 2023 -9.695072463564434e+02 +1939 2024 -8.643348602446076e+02 +1939 2025 -8.148024630667926e+02 +1939 2044 -8.507888885505199e+02 +1939 2045 -8.023274760830675e+02 +1939 2046 -7.211778000851799e+02 +1939 2047 -6.289529049931513e+02 +1939 2048 -5.429674662554822e+02 +1939 2049 -4.725808574370885e+02 +1939 2050 -4.208084537187713e+02 +1939 2051 -3.873813675510144e+02 +1939 2052 -3.710963518270331e+02 +1940 1873 -9.695072463564434e+02 +1940 1874 -1.032880208377977e+03 +1940 1875 -1.168677565678393e+03 +1940 1876 -1.394551574360510e+03 +1940 1877 -1.733190400658708e+03 +1940 1878 -2.199157547087201e+03 +1940 1879 -2.767706810094291e+03 +1940 1880 -3.331754877699595e+03 +1940 1881 -3.699147964795180e+03 +1940 2017 -3.699147964795180e+03 +1940 2018 -3.331754877699595e+03 +1940 2019 -2.767706810094291e+03 +1940 2020 -2.199157547087201e+03 +1940 2021 -1.733190400658708e+03 +1940 2022 -1.394551574360510e+03 +1940 2023 -1.168677565678393e+03 +1940 2024 -1.032880208377977e+03 +1940 2025 -9.695072463564434e+02 +1940 2044 -1.015511306612467e+03 +1940 2045 -9.536070604341750e+02 +1940 2046 -8.507888885505199e+02 +1940 2047 -7.352796046183681e+02 +1940 2048 -6.289529049931513e+02 +1940 2049 -5.429674662554822e+02 +1940 2050 -4.803677035258846e+02 +1940 2051 -4.402579127124382e+02 +1940 2052 -4.208084537187713e+02 +1941 1873 -8.148024630667926e+02 +1941 1874 -8.643348602446076e+02 +1941 1875 -9.695072463564434e+02 +1941 1876 -1.141773184361042e+03 +1941 1877 -1.394551574360510e+03 +1941 1878 -1.733190400658708e+03 +1941 1879 -2.134265778758326e+03 +1941 1880 -2.521021940438000e+03 +1941 1881 -2.767706810094291e+03 +1941 2017 -5.136224430633882e+03 +1941 2018 -4.560278038130823e+03 +1941 2019 -3.699147964795180e+03 +1941 2020 -2.861294172280346e+03 +1941 2021 -2.199157547087201e+03 +1941 2022 -1.733190400658708e+03 +1941 2023 -1.430197816180122e+03 +1941 2024 -1.251286952144484e+03 +1941 2025 -1.168677565678393e+03 +1941 2044 -1.228588660544053e+03 +1941 2045 -1.148042053110080e+03 +1941 2046 -1.015511306612467e+03 +1941 2047 -8.685786765383800e+02 +1941 2048 -7.352796046183681e+02 +1941 2049 -6.289529049931513e+02 +1941 2050 -5.524312223207850e+02 +1941 2051 -5.038180997021789e+02 +1941 2052 -4.803677035258846e+02 +1942 1873 -7.058924559832867e+02 +1942 1874 -7.463158073460687e+02 +1942 1875 -8.315436028021828e+02 +1942 1876 -9.695072463564434e+02 +1942 1877 -1.168677565678393e+03 +1942 1878 -1.430197816180122e+03 +1942 1879 -1.733190400658708e+03 +1942 1880 -2.019368486704435e+03 +1942 1881 -2.199157547087201e+03 +1942 2017 -7.138491575686282e+03 +1942 2018 -6.235592529048601e+03 +1942 2019 -4.925216936196723e+03 +1942 2020 -3.699147964795180e+03 +1942 2021 -2.767706810094291e+03 +1942 2022 -2.134265778758326e+03 +1942 2023 -1.733190400658708e+03 +1942 2024 -1.500725861549673e+03 +1942 2025 -1.394551574360510e+03 +1942 2044 -1.471477730866027e+03 +1942 2045 -1.368148367306964e+03 +1942 2046 -1.199743197084304e+03 +1942 2047 -1.015511306612467e+03 +1942 2048 -8.507888885505199e+02 +1942 2049 -7.211778000851799e+02 +1942 2050 -6.289529049931513e+02 +1942 2051 -5.708523475060541e+02 +1942 2052 -5.429674662554822e+02 +1943 1873 -6.378158089920671e+02 +1943 1874 -6.728335244699299e+02 +1943 1875 -7.463158073460687e+02 +1943 1876 -8.643348602446076e+02 +1943 1877 -1.032880208377977e+03 +1943 1878 -1.251286952144484e+03 +1943 1879 -1.500725861549673e+03 +1943 1880 -1.733190400658708e+03 +1943 1881 -1.877824568765017e+03 +1943 2017 -9.405703259334639e+03 +1943 2018 -8.091232579773156e+03 +1943 2019 -6.235592529048601e+03 +1943 2020 -4.560278038130823e+03 +1943 2021 -3.331754877699595e+03 +1943 2022 -2.521021940438000e+03 +1943 2023 -2.019368486704435e+03 +1943 2024 -1.733190400658708e+03 +1943 2025 -1.603684467943633e+03 +1943 2044 -1.697437739078449e+03 +1943 2045 -1.571600895131404e+03 +1943 2046 -1.368148367306964e+03 +1943 2047 -1.148042053110080e+03 +1943 2048 -9.536070604341750e+02 +1943 2049 -8.023274760830675e+02 +1943 2050 -6.956816209337401e+02 +1943 2051 -6.289529049931513e+02 +1943 2052 -5.970589583440825e+02 +1944 1873 -6.052974323170196e+02 +1944 1874 -6.378158089920671e+02 +1944 1875 -7.058924559832867e+02 +1944 1876 -8.148024630667926e+02 +1944 1877 -9.695072463564434e+02 +1944 1878 -1.168677565678393e+03 +1944 1879 -1.394551574360510e+03 +1944 1880 -1.603684467943633e+03 +1944 1881 -1.733190400658708e+03 +1944 2017 -1.103972130715926e+04 +1944 2018 -9.405703259334639e+03 +1944 2019 -7.138491575686282e+03 +1944 2020 -5.136224430633882e+03 +1944 2021 -3.699147964795180e+03 +1944 2022 -2.767706810094291e+03 +1944 2023 -2.199157547087201e+03 +1944 2024 -1.877824568765017e+03 +1944 2025 -1.733190400658708e+03 +1944 2044 -1.837845240586539e+03 +1944 2045 -1.697437739078449e+03 +1944 2046 -1.471477730866027e+03 +1944 2047 -1.228588660544053e+03 +1944 2048 -1.015511306612467e+03 +1944 2049 -8.507888885505199e+02 +1944 2050 -7.352796046183681e+02 +1944 2051 -6.632839990295113e+02 +1944 2052 -6.289529049931513e+02 +1963 1873 -6.289529049931513e+02 +1963 1874 -6.632839990295113e+02 +1963 1875 -7.352796046183681e+02 +1963 1876 -8.507888885505199e+02 +1963 1877 -1.015511306612467e+03 +1963 1878 -1.228588660544053e+03 +1963 1879 -1.471477730866027e+03 +1963 1880 -1.697437739078449e+03 +1963 1881 -1.837845240586539e+03 +1963 1900 -1.733190400658708e+03 +1963 1901 -1.877824568765017e+03 +1963 1902 -2.199157547087201e+03 +1963 1903 -2.767706810094291e+03 +1963 1904 -3.699147964795180e+03 +1963 1905 -5.136224430633882e+03 +1963 1906 -7.138491575686282e+03 +1963 1907 -9.405703259334639e+03 +1963 1908 -1.103972130715926e+04 +1963 2044 -1.733190400658708e+03 +1963 2045 -1.603684467943633e+03 +1963 2046 -1.394551574360510e+03 +1963 2047 -1.168677565678393e+03 +1963 2048 -9.695072463564434e+02 +1963 2049 -8.148024630667926e+02 +1963 2050 -7.058924559832867e+02 +1963 2051 -6.378158089920671e+02 +1963 2052 -6.052974323170196e+02 +1964 1873 -5.970589583440825e+02 +1964 1874 -6.289529049931513e+02 +1964 1875 -6.956816209337401e+02 +1964 1876 -8.023274760830675e+02 +1964 1877 -9.536070604341750e+02 +1964 1878 -1.148042053110080e+03 +1964 1879 -1.368148367306964e+03 +1964 1880 -1.571600895131404e+03 +1964 1881 -1.697437739078449e+03 +1964 1900 -1.603684467943633e+03 +1964 1901 -1.733190400658708e+03 +1964 1902 -2.019368486704435e+03 +1964 1903 -2.521021940438000e+03 +1964 1904 -3.331754877699595e+03 +1964 1905 -4.560278038130823e+03 +1964 1906 -6.235592529048601e+03 +1964 1907 -8.091232579773156e+03 +1964 1908 -9.405703259334639e+03 +1964 2044 -1.877824568765017e+03 +1964 2045 -1.733190400658708e+03 +1964 2046 -1.500725861549673e+03 +1964 2047 -1.251286952144484e+03 +1964 2048 -1.032880208377977e+03 +1964 2049 -8.643348602446076e+02 +1964 2050 -7.463158073460687e+02 +1964 2051 -6.728335244699299e+02 +1964 2052 -6.378158089920671e+02 +1965 1873 -5.429674662554822e+02 +1965 1874 -5.708523475060541e+02 +1965 1875 -6.289529049931513e+02 +1965 1876 -7.211778000851799e+02 +1965 1877 -8.507888885505199e+02 +1965 1878 -1.015511306612467e+03 +1965 1879 -1.199743197084304e+03 +1965 1880 -1.368148367306964e+03 +1965 1881 -1.471477730866027e+03 +1965 1900 -1.394551574360510e+03 +1965 1901 -1.500725861549673e+03 +1965 1902 -1.733190400658708e+03 +1965 1903 -2.134265778758326e+03 +1965 1904 -2.767706810094291e+03 +1965 1905 -3.699147964795180e+03 +1965 1906 -4.925216936196723e+03 +1965 1907 -6.235592529048601e+03 +1965 1908 -7.138491575686282e+03 +1965 2044 -2.199157547087201e+03 +1965 2045 -2.019368486704435e+03 +1965 2046 -1.733190400658708e+03 +1965 2047 -1.430197816180122e+03 +1965 2048 -1.168677565678393e+03 +1965 2049 -9.695072463564434e+02 +1965 2050 -8.315436028021828e+02 +1965 2051 -7.463158073460687e+02 +1965 2052 -7.058924559832867e+02 +1966 1873 -4.803677035258846e+02 +1966 1874 -5.038180997021789e+02 +1966 1875 -5.524312223207850e+02 +1966 1876 -6.289529049931513e+02 +1966 1877 -7.352796046183681e+02 +1966 1878 -8.685786765383800e+02 +1966 1879 -1.015511306612467e+03 +1966 1880 -1.148042053110080e+03 +1966 1881 -1.228588660544053e+03 +1966 1900 -1.168677565678393e+03 +1966 1901 -1.251286952144484e+03 +1966 1902 -1.430197816180122e+03 +1966 1903 -1.733190400658708e+03 +1966 1904 -2.199157547087201e+03 +1966 1905 -2.861294172280346e+03 +1966 1906 -3.699147964795180e+03 +1966 1907 -4.560278038130823e+03 +1966 1908 -5.136224430633882e+03 +1966 2044 -2.767706810094291e+03 +1966 2045 -2.521021940438000e+03 +1966 2046 -2.134265778758326e+03 +1966 2047 -1.733190400658708e+03 +1966 2048 -1.394551574360510e+03 +1966 2049 -1.141773184361042e+03 +1966 2050 -9.695072463564434e+02 +1966 2051 -8.643348602446076e+02 +1966 2052 -8.148024630667926e+02 +1967 1873 -4.208084537187713e+02 +1967 1874 -4.402579127124382e+02 +1967 1875 -4.803677035258846e+02 +1967 1876 -5.429674662554822e+02 +1967 1877 -6.289529049931513e+02 +1967 1878 -7.352796046183681e+02 +1967 1879 -8.507888885505199e+02 +1967 1880 -9.536070604341750e+02 +1967 1881 -1.015511306612467e+03 +1967 1900 -9.695072463564434e+02 +1967 1901 -1.032880208377977e+03 +1967 1902 -1.168677565678393e+03 +1967 1903 -1.394551574360510e+03 +1967 1904 -1.733190400658708e+03 +1967 1905 -2.199157547087201e+03 +1967 1906 -2.767706810094291e+03 +1967 1907 -3.331754877699595e+03 +1967 1908 -3.699147964795180e+03 +1967 2044 -3.699147964795180e+03 +1967 2045 -3.331754877699595e+03 +1967 2046 -2.767706810094291e+03 +1967 2047 -2.199157547087201e+03 +1967 2048 -1.733190400658708e+03 +1967 2049 -1.394551574360510e+03 +1967 2050 -1.168677565678393e+03 +1967 2051 -1.032880208377977e+03 +1967 2052 -9.695072463564434e+02 +1968 1873 -3.710963518270331e+02 +1968 1874 -3.873813675510144e+02 +1968 1875 -4.208084537187713e+02 +1968 1876 -4.725808574370885e+02 +1968 1877 -5.429674662554822e+02 +1968 1878 -6.289529049931513e+02 +1968 1879 -7.211778000851799e+02 +1968 1880 -8.023274760830675e+02 +1968 1881 -8.507888885505199e+02 +1968 1900 -8.148024630667926e+02 +1968 1901 -8.643348602446076e+02 +1968 1902 -9.695072463564434e+02 +1968 1903 -1.141773184361042e+03 +1968 1904 -1.394551574360510e+03 +1968 1905 -1.733190400658708e+03 +1968 1906 -2.134265778758326e+03 +1968 1907 -2.521021940438000e+03 +1968 1908 -2.767706810094291e+03 +1968 2044 -5.136224430633882e+03 +1968 2045 -4.560278038130823e+03 +1968 2046 -3.699147964795180e+03 +1968 2047 -2.861294172280346e+03 +1968 2048 -2.199157547087201e+03 +1968 2049 -1.733190400658708e+03 +1968 2050 -1.430197816180122e+03 +1968 2051 -1.251286952144484e+03 +1968 2052 -1.168677565678393e+03 +1969 1873 -3.339204550667988e+02 +1969 1874 -3.479505460244110e+02 +1969 1875 -3.766415408901786e+02 +1969 1876 -4.208084537187713e+02 +1969 1877 -4.803677035258846e+02 +1969 1878 -5.524312223207850e+02 +1969 1879 -6.289529049931513e+02 +1969 1880 -6.956816209337401e+02 +1969 1881 -7.352796046183681e+02 +1969 1900 -7.058924559832867e+02 +1969 1901 -7.463158073460687e+02 +1969 1902 -8.315436028021828e+02 +1969 1903 -9.695072463564434e+02 +1969 1904 -1.168677565678393e+03 +1969 1905 -1.430197816180122e+03 +1969 1906 -1.733190400658708e+03 +1969 1907 -2.019368486704435e+03 +1969 1908 -2.199157547087201e+03 +1969 2044 -7.138491575686282e+03 +1969 2045 -6.235592529048601e+03 +1969 2046 -4.925216936196723e+03 +1969 2047 -3.699147964795180e+03 +1969 2048 -2.767706810094291e+03 +1969 2049 -2.134265778758326e+03 +1969 2050 -1.733190400658708e+03 +1969 2051 -1.500725861549673e+03 +1969 2052 -1.394551574360510e+03 +1970 1873 -3.096178268240465e+02 +1970 1874 -3.222285372305477e+02 +1970 1875 -3.479505460244110e+02 +1970 1876 -3.873813675510144e+02 +1970 1877 -4.402579127124382e+02 +1970 1878 -5.038180997021789e+02 +1970 1879 -5.708523475060541e+02 +1970 1880 -6.289529049931513e+02 +1970 1881 -6.632839990295113e+02 +1970 1900 -6.378158089920671e+02 +1970 1901 -6.728335244699299e+02 +1970 1902 -7.463158073460687e+02 +1970 1903 -8.643348602446076e+02 +1970 1904 -1.032880208377977e+03 +1970 1905 -1.251286952144484e+03 +1970 1906 -1.500725861549673e+03 +1970 1907 -1.733190400658708e+03 +1970 1908 -1.877824568765017e+03 +1970 2044 -9.405703259334639e+03 +1970 2045 -8.091232579773156e+03 +1970 2046 -6.235592529048601e+03 +1970 2047 -4.560278038130823e+03 +1970 2048 -3.331754877699595e+03 +1970 2049 -2.521021940438000e+03 +1970 2050 -2.019368486704435e+03 +1970 2051 -1.733190400658708e+03 +1970 2052 -1.603684467943633e+03 +1971 1873 -2.976873911031298e+02 +1971 1874 -3.096178268240465e+02 +1971 1875 -3.339204550667988e+02 +1971 1876 -3.710963518270331e+02 +1971 1877 -4.208084537187713e+02 +1971 1878 -4.803677035258846e+02 +1971 1879 -5.429674662554822e+02 +1971 1880 -5.970589583440825e+02 +1971 1881 -6.289529049931513e+02 +1971 1900 -6.052974323170196e+02 +1971 1901 -6.378158089920671e+02 +1971 1902 -7.058924559832867e+02 +1971 1903 -8.148024630667926e+02 +1971 1904 -9.695072463564434e+02 +1971 1905 -1.168677565678393e+03 +1971 1906 -1.394551574360510e+03 +1971 1907 -1.603684467943633e+03 +1971 1908 -1.733190400658708e+03 +1971 2044 -1.103972130715926e+04 +1971 2045 -9.405703259334639e+03 +1971 2046 -7.138491575686282e+03 +1971 2047 -5.136224430633882e+03 +1971 2048 -3.699147964795180e+03 +1971 2049 -2.767706810094291e+03 +1971 2050 -2.199157547087201e+03 +1971 2051 -1.877824568765017e+03 +1971 2052 -1.733190400658708e+03 +1990 1144 -3.474506751309654e+00 +1990 1145 -3.654050001394688e+00 +1990 1146 -4.028382153902572e+00 +1990 1147 -4.623196535591008e+00 +1990 1148 -5.460334268221786e+00 +1990 1149 -6.526086991349062e+00 +1990 1150 -7.720270179432522e+00 +1990 1151 -8.813722702286093e+00 +1990 1152 -9.485456953123382e+00 +1990 1423 -9.574614729634387e+00 +1990 1424 -1.033025206259609e+01 +1990 1425 -1.199392684783545e+01 +1990 1426 -1.489187979900572e+01 +1990 1427 -1.953249673072867e+01 +1990 1428 -2.648026715992622e+01 +1990 1429 -3.582072268161380e+01 +1990 1430 -4.601776203532702e+01 +1990 1431 -5.316004558269722e+01 +1991 1144 -3.307075579356515e+00 +1991 1145 -3.474506751309654e+00 +1991 1146 -3.822855655704617e+00 +1991 1147 -4.374472772345656e+00 +1991 1148 -5.147173192788435e+00 +1991 1149 -6.125338181409234e+00 +1991 1150 -7.214758870193810e+00 +1991 1151 -8.206746303750586e+00 +1991 1152 -8.813722702286093e+00 +1991 1423 -8.894152732809214e+00 +1991 1424 -9.574614729634387e+00 +1991 1425 -1.106556701616914e+01 +1991 1426 -1.364121235299754e+01 +1991 1427 -1.771654764348813e+01 +1991 1428 -2.372339702886325e+01 +1991 1429 -3.165228467591593e+01 +1991 1430 -4.014998583800264e+01 +1991 1431 -4.601776203532702e+01 +1992 1144 -3.021655125742912e+00 +1992 1145 -3.169027908859175e+00 +1992 1146 -3.474506751309654e+00 +1992 1147 -3.955287673172523e+00 +1992 1148 -4.623196535591008e+00 +1992 1149 -5.460334268221786e+00 +1992 1150 -6.382855547803861e+00 +1992 1151 -7.214758870193816e+00 +1992 1152 -7.720270179432532e+00 +1992 1423 -7.787064219095081e+00 +1992 1424 -8.350436340807201e+00 +1992 1425 -9.574614729634387e+00 +1992 1426 -1.165955788548230e+01 +1992 1427 -1.489187979900572e+01 +1992 1428 -1.953249673072867e+01 +1992 1429 -2.547425580969110e+01 +1992 1430 -3.165228467591599e+01 +1992 1431 -3.582072268161387e+01 +1993 1144 -2.688901476974079e+00 +1993 1145 -2.813872708878962e+00 +1993 1146 -3.071728502881820e+00 +1993 1147 -3.474506751309654e+00 +1993 1148 -4.028382153902572e+00 +1993 1149 -4.714211996655912e+00 +1993 1150 -5.460334268221780e+00 +1993 1151 -6.125338181409234e+00 +1993 1152 -6.526086991349062e+00 +1993 1423 -6.578858018778778e+00 +1993 1424 -7.022334130042162e+00 +1993 1425 -7.976517934049889e+00 +1993 1426 -9.574614729634387e+00 +1993 1427 -1.199392684783545e+01 +1993 1428 -1.536382589350010e+01 +1993 1429 -1.953249673072864e+01 +1993 1430 -2.372339702886325e+01 +1993 1431 -2.648026715992622e+01 +1994 1144 -2.369680831172465e+00 +1994 1145 -2.474220532866516e+00 +1994 1146 -2.688901476974079e+00 +1994 1147 -3.021655125742912e+00 +1994 1148 -3.474506751309654e+00 +1994 1149 -4.028382153902572e+00 +1994 1150 -4.623196535591005e+00 +1994 1151 -5.147173192788435e+00 +1994 1152 -5.460334268221786e+00 +1994 1423 -5.501432160761325e+00 +1994 1424 -5.845568772761844e+00 +1994 1425 -6.578858018778778e+00 +1994 1426 -7.787064219095081e+00 +1994 1427 -9.574614729634387e+00 +1994 1428 -1.199392684783545e+01 +1994 1429 -1.489187979900570e+01 +1994 1430 -1.771654764348813e+01 +1994 1431 -1.953249673072867e+01 +1995 1144 -2.101098045763917e+00 +1995 1145 -2.189307683194851e+00 +1995 1146 -2.369680831172465e+00 +1995 1147 -2.647316772054515e+00 +1995 1148 -3.021655125742912e+00 +1995 1149 -3.474506751309654e+00 +1995 1150 -3.955287673172521e+00 +1995 1151 -4.374472772345656e+00 +1995 1152 -4.623196535591008e+00 +1995 1423 -4.655741575368517e+00 +1995 1424 -4.927408805516037e+00 +1995 1425 -5.501432160761325e+00 +1995 1426 -6.434009698761969e+00 +1995 1427 -7.787064219095081e+00 +1995 1428 -9.574614729634387e+00 +1995 1429 -1.165955788548229e+01 +1995 1430 -1.364121235299754e+01 +1995 1431 -1.489187979900572e+01 +1996 1144 -1.898863298003203e+00 +1996 1145 -1.975331417147858e+00 +1996 1146 -2.131159503067379e+00 +1996 1147 -2.369680831172467e+00 +1996 1148 -2.688901476974081e+00 +1996 1149 -3.071728502881823e+00 +1996 1150 -3.474506751309654e+00 +1996 1151 -3.822855655704620e+00 +1996 1152 -4.028382153902576e+00 +1996 1423 -4.055212971361419e+00 +1996 1424 -4.278637194083236e+00 +1996 1425 -4.747658828821052e+00 +1996 1426 -5.501432160761331e+00 +1996 1427 -6.578858018778784e+00 +1996 1428 -7.976517934049897e+00 +1996 1429 -9.574614729634387e+00 +1996 1430 -1.106556701616915e+01 +1996 1431 -1.199392684783546e+01 +1997 1144 -1.765972963745819e+00 +1997 1145 -1.835000056862136e+00 +1997 1146 -1.975331417147857e+00 +1997 1147 -2.189307683194851e+00 +1997 1148 -2.474220532866516e+00 +1997 1149 -2.813872708878962e+00 +1997 1150 -3.169027908859173e+00 +1997 1151 -3.474506751309654e+00 +1997 1152 -3.654050001394688e+00 +1997 1423 -3.677452266447854e+00 +1997 1424 -3.872006983680974e+00 +1997 1425 -4.278637194083233e+00 +1997 1426 -4.927408805516037e+00 +1997 1427 -5.845568772761844e+00 +1997 1428 -7.022334130042162e+00 +1997 1429 -8.350436340807194e+00 +1997 1430 -9.574614729634387e+00 +1997 1431 -1.033025206259609e+01 +1998 1144 -1.700527108287443e+00 +1998 1145 -1.765972963745819e+00 +1998 1146 -1.898863298003202e+00 +1998 1147 -2.101098045763917e+00 +1998 1148 -2.369680831172465e+00 +1998 1149 -2.688901476974079e+00 +1998 1150 -3.021655125742909e+00 +1998 1151 -3.307075579356515e+00 +1998 1152 -3.474506751309654e+00 +1998 1423 -3.496313214985748e+00 +1998 1424 -3.677452266447854e+00 +1998 1425 -4.055212971361416e+00 +1998 1426 -4.655741575368517e+00 +1998 1427 -5.501432160761325e+00 +1998 1428 -6.578858018778778e+00 +1998 1429 -7.787064219095073e+00 +1998 1430 -8.894152732809214e+00 +1998 1431 -9.574614729634387e+00 +1999 1720 -5.416220002058462e+01 +1999 1721 -5.847168336242214e+01 +1999 1722 -6.797204698756184e+01 +1999 1723 -8.455751811575986e+01 +1999 1724 -1.112023202068744e+02 +1999 1725 -1.512628164030906e+02 +1999 1726 -2.053883607687489e+02 +1999 1727 -2.647767438527630e+02 +1999 1728 -3.065373731090118e+02 +2000 1720 -5.028460369863171e+01 +2000 1721 -5.416220002058462e+01 +2000 1722 -6.266865647386096e+01 +2000 1723 -7.739429142416682e+01 +2000 1724 -1.007640600234616e+02 +2000 1725 -1.353445496343036e+02 +2000 1726 -1.811983282511275e+02 +2000 1727 -2.305668762810884e+02 +2000 1728 -2.647767438527630e+02 +2001 1720 -4.398263164573866e+01 +2001 1721 -4.718848846240646e+01 +2001 1722 -5.416220002058462e+01 +2001 1723 -6.606134132672688e+01 +2001 1724 -8.455751811576010e+01 +2001 1725 -1.112023202068747e+02 +2001 1726 -1.454508347890311e+02 +2001 1727 -1.811983282511275e+02 +2001 1728 -2.053883607687489e+02 +2002 1720 -3.711530555640490e+01 +2002 1721 -3.963467701820890e+01 +2002 1722 -4.506046026496942e+01 +2002 1723 -5.416220002058462e+01 +2002 1724 -6.797204698756201e+01 +2002 1725 -8.726265053974967e+01 +2002 1726 -1.112023202068747e+02 +2002 1727 -1.353445496343036e+02 +2002 1728 -1.512628164030906e+02 +2003 1720 -3.100122392289864e+01 +2003 1721 -3.295302401855845e+01 +2003 1722 -3.711530555640482e+01 +2003 1723 -4.398263164573857e+01 +2003 1724 -5.416220002058462e+01 +2003 1725 -6.797204698756201e+01 +2003 1726 -8.455751811576010e+01 +2003 1727 -1.007640600234616e+02 +2003 1728 -1.112023202068744e+02 +2004 1720 -2.620940698061742e+01 +2004 1721 -2.774798050936779e+01 +2004 1722 -3.100122392289858e+01 +2004 1723 -3.629276779865588e+01 +2004 1724 -4.398263164573857e+01 +2004 1725 -5.416220002058462e+01 +2004 1726 -6.606134132672688e+01 +2004 1727 -7.739429142416682e+01 +2004 1728 -8.455751811575986e+01 +2005 1720 -2.281096793104268e+01 +2005 1721 -2.407490908992506e+01 +2005 1722 -2.672989532903555e+01 +2005 1723 -3.100122392289858e+01 +2005 1724 -3.711530555640482e+01 +2005 1725 -4.506046026496942e+01 +2005 1726 -5.416220002058462e+01 +2005 1727 -6.266865647386096e+01 +2005 1728 -6.797204698756184e+01 +2006 1720 -2.067515029553633e+01 +2006 1721 -2.177494503977683e+01 +2006 1722 -2.407490908992506e+01 +2006 1723 -2.774798050936779e+01 +2006 1724 -3.295302401855845e+01 +2006 1725 -3.963467701820890e+01 +2006 1726 -4.718848846240646e+01 +2006 1727 -5.416220002058462e+01 +2006 1728 -5.847168336242214e+01 +2007 1720 -1.965157861598590e+01 +2007 1721 -2.067515029553633e+01 +2007 1722 -2.281096793104268e+01 +2007 1723 -2.620940698061742e+01 +2007 1724 -3.100122392289864e+01 +2007 1725 -3.711530555640490e+01 +2007 1726 -4.398263164573866e+01 +2007 1727 -5.028460369863171e+01 +2007 1728 -5.416220002058462e+01 +2008 1864 -3.063876713483004e+02 +2008 1865 -3.311617365195747e+02 +2008 1866 -3.859179776157605e+02 +2008 1867 -4.819366867771664e+02 +2008 1868 -6.371952057562402e+02 +2008 1869 -8.726231103602357e+02 +2008 1870 -1.193932486839834e+03 +2008 1871 -1.550121445008505e+03 +2008 1872 -1.802596433195456e+03 +2008 2143 -3.063876713483004e+02 +2008 2144 -2.841326260213855e+02 +2008 2145 -2.480403651673271e+02 +2008 2146 -2.088271183655457e+02 +2008 2147 -1.740274317161707e+02 +2008 2148 -1.468355065336023e+02 +2008 2149 -1.275984131219179e+02 +2008 2150 -1.155304899028561e+02 +2008 2151 -1.097534196790493e+02 +2008 2206 -1.111842160419089e+02 +2008 2207 -1.057061586526018e+02 +2008 2208 -9.638822517401589e+01 +2008 2209 -8.555928471614156e+01 +2008 2210 -7.520762033775921e+01 +2008 2211 -6.652797451218323e+01 +2008 2212 -6.001174723167335e+01 +2008 2213 -5.573941364116940e+01 +2008 2214 -5.363826960242956e+01 +2009 1864 -2.841326260213855e+02 +2009 1865 -3.063876713483004e+02 +2009 1866 -3.553280674768354e+02 +2009 1867 -4.404031329187411e+02 +2009 1868 -5.762343277298867e+02 +2009 1869 -7.788097592344268e+02 +2009 1870 -1.049909849375148e+03 +2009 1871 -1.344510568096302e+03 +2009 1872 -1.550121445008505e+03 +2009 2143 -3.311617365195747e+02 +2009 2144 -3.063876713483004e+02 +2009 2145 -2.663884709281895e+02 +2009 2146 -2.231981844606894e+02 +2009 2147 -1.851243485745373e+02 +2009 2148 -1.555580782497810e+02 +2009 2149 -1.347481526436478e+02 +2009 2150 -1.217424124188383e+02 +2009 2151 -1.155304899028561e+02 +2009 2206 -1.170681125153376e+02 +2009 2207 -1.111842160419089e+02 +2009 2208 -1.011961191083175e+02 +2009 2209 -8.962181586287889e+01 +2009 2210 -7.859349409841370e+01 +2009 2211 -6.937545782864687e+01 +2009 2212 -6.247361649834824e+01 +2009 2213 -5.795761808209202e+01 +2009 2214 -5.573941364116940e+01 +2010 1864 -2.480403651673271e+02 +2010 1865 -2.663884709281895e+02 +2010 1866 -3.063876713483004e+02 +2010 1867 -3.748904053829385e+02 +2010 1868 -4.819366867771664e+02 +2010 1869 -6.371952057562402e+02 +2010 1870 -8.383319685358435e+02 +2010 1871 -1.049909849375148e+03 +2010 1872 -1.193932486839834e+03 +2010 2143 -3.859179776157605e+02 +2010 2144 -3.553280674768354e+02 +2010 2145 -3.063876713483004e+02 +2010 2146 -2.542062119667738e+02 +2010 2147 -2.088271183655457e+02 +2010 2148 -1.740274317161707e+02 +2010 2149 -1.497853840269160e+02 +2010 2150 -1.347481526436478e+02 +2010 2151 -1.275984131219179e+02 +2010 2206 -1.293661657908652e+02 +2010 2207 -1.226088998409724e+02 +2010 2208 -1.111842160419089e+02 +2010 2209 -9.802102195827720e+01 +2010 2210 -8.555928471614156e+01 +2010 2211 -7.520762033775921e+01 +2010 2212 -6.749803222962952e+01 +2010 2213 -6.247361649834824e+01 +2010 2214 -6.001174723167335e+01 +2011 1864 -2.088271183655457e+02 +2011 1865 -2.231981844606894e+02 +2011 1866 -2.542062119667738e+02 +2011 1867 -3.063876713483004e+02 +2011 1868 -3.859179776157605e+02 +2011 1869 -4.976453857371607e+02 +2011 1870 -6.371952057562402e+02 +2011 1871 -7.788097592344268e+02 +2011 1872 -8.726231103602357e+02 +2011 2143 -4.819366867771664e+02 +2011 2144 -4.404031329187411e+02 +2011 2145 -3.748904053829385e+02 +2011 2146 -3.063876713483004e+02 +2011 2147 -2.480403651673271e+02 +2011 2148 -2.041390437321793e+02 +2011 2149 -1.740274317161707e+02 +2011 2150 -1.555580782497810e+02 +2011 2151 -1.468355065336023e+02 +2011 2206 -1.489885081652992e+02 +2011 2207 -1.407716848553628e+02 +2011 2208 -1.269615920628681e+02 +2011 2209 -1.111842160419089e+02 +2011 2210 -9.638822517401589e+01 +2011 2211 -8.420868002944904e+01 +2011 2212 -7.520762033775921e+01 +2011 2213 -6.937545782864687e+01 +2011 2214 -6.652797451218323e+01 +2012 1864 -1.740274317161707e+02 +2012 1865 -1.851243485745373e+02 +2012 1866 -2.088271183655457e+02 +2012 1867 -2.480403651673271e+02 +2012 1868 -3.063876713483004e+02 +2012 1869 -3.859179776157605e+02 +2012 1870 -4.819366867771664e+02 +2012 1871 -5.762343277298867e+02 +2012 1872 -6.371952057562402e+02 +2012 2143 -6.371952057562402e+02 +2012 2144 -5.762343277298867e+02 +2012 2145 -4.819366867771664e+02 +2012 2146 -3.859179776157605e+02 +2012 2147 -3.063876713483004e+02 +2012 2148 -2.480403651673271e+02 +2012 2149 -2.088271183655457e+02 +2012 2150 -1.851243485745373e+02 +2012 2151 -1.740274317161707e+02 +2012 2206 -1.767605489846857e+02 +2012 2207 -1.663510232448633e+02 +2012 2208 -1.489885081652992e+02 +2012 2209 -1.293661657908652e+02 +2012 2210 -1.111842160419089e+02 +2012 2211 -9.638822517401589e+01 +2012 2212 -8.555928471614156e+01 +2012 2213 -7.859349409841370e+01 +2012 2214 -7.520762033775921e+01 +2013 1864 -1.468355065336023e+02 +2013 1865 -1.555580782497810e+02 +2013 1866 -1.740274317161707e+02 +2013 1867 -2.041390437321793e+02 +2013 1868 -2.480403651673271e+02 +2013 1869 -3.063876713483004e+02 +2013 1870 -3.748904053829385e+02 +2013 1871 -4.404031329187411e+02 +2013 1872 -4.819366867771664e+02 +2013 2143 -8.726231103602357e+02 +2013 2144 -7.788097592344268e+02 +2013 2145 -6.371952057562402e+02 +2013 2146 -4.976453857371607e+02 +2013 2147 -3.859179776157605e+02 +2013 2148 -3.063876713483004e+02 +2013 2149 -2.542062119667738e+02 +2013 2150 -2.231981844606894e+02 +2013 2151 -2.088271183655457e+02 +2013 2206 -2.123577731150849e+02 +2013 2207 -1.989422168423268e+02 +2013 2208 -1.767605489846857e+02 +2013 2209 -1.519993633210930e+02 +2013 2210 -1.293661657908652e+02 +2013 2211 -1.111842160419089e+02 +2013 2212 -9.802102195827720e+01 +2013 2213 -8.962181586287889e+01 +2013 2214 -8.555928471614156e+01 +2014 1864 -1.275984131219179e+02 +2014 1865 -1.347481526436478e+02 +2014 1866 -1.497853840269160e+02 +2014 1867 -1.740274317161707e+02 +2014 1868 -2.088271183655457e+02 +2014 1869 -2.542062119667738e+02 +2014 1870 -3.063876713483004e+02 +2014 1871 -3.553280674768354e+02 +2014 1872 -3.859179776157605e+02 +2014 2143 -1.193932486839834e+03 +2014 2144 -1.049909849375148e+03 +2014 2145 -8.383319685358435e+02 +2014 2146 -6.371952057562402e+02 +2014 2147 -4.819366867771664e+02 +2014 2148 -3.748904053829385e+02 +2014 2149 -3.063876713483004e+02 +2014 2150 -2.663884709281895e+02 +2014 2151 -2.480403651673271e+02 +2014 2206 -2.525366109215767e+02 +2014 2207 -2.354925657825773e+02 +2014 2208 -2.075588680195229e+02 +2014 2209 -1.767605489846857e+02 +2014 2210 -1.489885081652992e+02 +2014 2211 -1.269615920628681e+02 +2014 2212 -1.111842160419089e+02 +2014 2213 -1.011961191083175e+02 +2014 2214 -9.638822517401589e+01 +2015 1864 -1.155304899028561e+02 +2015 1865 -1.217424124188383e+02 +2015 1866 -1.347481526436478e+02 +2015 1867 -1.555580782497810e+02 +2015 1868 -1.851243485745373e+02 +2015 1869 -2.231981844606894e+02 +2015 1870 -2.663884709281895e+02 +2015 1871 -3.063876713483004e+02 +2015 1872 -3.311617365195747e+02 +2015 2143 -1.550121445008505e+03 +2015 2144 -1.344510568096302e+03 +2015 2145 -1.049909849375148e+03 +2015 2146 -7.788097592344268e+02 +2015 2147 -5.762343277298867e+02 +2015 2148 -4.404031329187411e+02 +2015 2149 -3.553280674768354e+02 +2015 2150 -3.063876713483004e+02 +2015 2151 -2.841326260213855e+02 +2015 2206 -2.895745815575320e+02 +2015 2207 -2.689865983609317e+02 +2015 2208 -2.354925657825773e+02 +2015 2209 -1.989422168423268e+02 +2015 2210 -1.663510232448633e+02 +2015 2211 -1.407716848553628e+02 +2015 2212 -1.226088998409724e+02 +2015 2213 -1.111842160419089e+02 +2015 2214 -1.057061586526018e+02 +2016 1864 -1.097534196790493e+02 +2016 1865 -1.155304899028561e+02 +2016 1866 -1.275984131219179e+02 +2016 1867 -1.468355065336023e+02 +2016 1868 -1.740274317161707e+02 +2016 1869 -2.088271183655457e+02 +2016 1870 -2.480403651673271e+02 +2016 1871 -2.841326260213855e+02 +2016 1872 -3.063876713483004e+02 +2016 2143 -1.802596433195456e+03 +2016 2144 -1.550121445008505e+03 +2016 2145 -1.193932486839834e+03 +2016 2146 -8.726231103602357e+02 +2016 2147 -6.371952057562402e+02 +2016 2148 -4.819366867771664e+02 +2016 2149 -3.859179776157605e+02 +2016 2150 -3.311617365195747e+02 +2016 2151 -3.063876713483004e+02 +2016 2206 -3.124380547854544e+02 +2016 2207 -2.895745815575320e+02 +2016 2208 -2.525366109215767e+02 +2016 2209 -2.123577731150849e+02 +2016 2210 -1.767605489846857e+02 +2016 2211 -1.489885081652992e+02 +2016 2212 -1.293661657908652e+02 +2016 2213 -1.170681125153376e+02 +2016 2214 -1.111842160419089e+02 +2017 1936 -1.733190400658708e+03 +2017 1937 -1.877824568765017e+03 +2017 1938 -2.199157547087201e+03 +2017 1939 -2.767706810094291e+03 +2017 1940 -3.699147964795180e+03 +2017 1941 -5.136224430633882e+03 +2017 1942 -7.138491575686282e+03 +2017 1943 -9.405703259334639e+03 +2017 1944 -1.103972130715926e+04 +2017 2080 -1.733190400658708e+03 +2017 2081 -1.603684467943633e+03 +2017 2082 -1.394551574360510e+03 +2017 2083 -1.168677565678393e+03 +2017 2084 -9.695072463564434e+02 +2017 2085 -8.148024630667926e+02 +2017 2086 -7.058924559832867e+02 +2017 2087 -6.378158089920671e+02 +2017 2088 -6.052974323170196e+02 +2017 2107 -6.289529049931513e+02 +2017 2108 -5.970589583440825e+02 +2017 2109 -5.429674662554822e+02 +2017 2110 -4.803677035258846e+02 +2017 2111 -4.208084537187713e+02 +2017 2112 -3.710963518270331e+02 +2017 2113 -3.339204550667988e+02 +2017 2114 -3.096178268240465e+02 +2017 2115 -2.976873911031298e+02 +2018 1936 -1.603684467943633e+03 +2018 1937 -1.733190400658708e+03 +2018 1938 -2.019368486704435e+03 +2018 1939 -2.521021940438000e+03 +2018 1940 -3.331754877699595e+03 +2018 1941 -4.560278038130823e+03 +2018 1942 -6.235592529048601e+03 +2018 1943 -8.091232579773156e+03 +2018 1944 -9.405703259334639e+03 +2018 2080 -1.877824568765017e+03 +2018 2081 -1.733190400658708e+03 +2018 2082 -1.500725861549673e+03 +2018 2083 -1.251286952144484e+03 +2018 2084 -1.032880208377977e+03 +2018 2085 -8.643348602446076e+02 +2018 2086 -7.463158073460687e+02 +2018 2087 -6.728335244699299e+02 +2018 2088 -6.378158089920671e+02 +2018 2107 -6.632839990295113e+02 +2018 2108 -6.289529049931513e+02 +2018 2109 -5.708523475060541e+02 +2018 2110 -5.038180997021789e+02 +2018 2111 -4.402579127124382e+02 +2018 2112 -3.873813675510144e+02 +2018 2113 -3.479505460244110e+02 +2018 2114 -3.222285372305477e+02 +2018 2115 -3.096178268240465e+02 +2019 1936 -1.394551574360510e+03 +2019 1937 -1.500725861549673e+03 +2019 1938 -1.733190400658708e+03 +2019 1939 -2.134265778758326e+03 +2019 1940 -2.767706810094291e+03 +2019 1941 -3.699147964795180e+03 +2019 1942 -4.925216936196723e+03 +2019 1943 -6.235592529048601e+03 +2019 1944 -7.138491575686282e+03 +2019 2080 -2.199157547087201e+03 +2019 2081 -2.019368486704435e+03 +2019 2082 -1.733190400658708e+03 +2019 2083 -1.430197816180122e+03 +2019 2084 -1.168677565678393e+03 +2019 2085 -9.695072463564434e+02 +2019 2086 -8.315436028021828e+02 +2019 2087 -7.463158073460687e+02 +2019 2088 -7.058924559832867e+02 +2019 2107 -7.352796046183681e+02 +2019 2108 -6.956816209337401e+02 +2019 2109 -6.289529049931513e+02 +2019 2110 -5.524312223207850e+02 +2019 2111 -4.803677035258846e+02 +2019 2112 -4.208084537187713e+02 +2019 2113 -3.766415408901786e+02 +2019 2114 -3.479505460244110e+02 +2019 2115 -3.339204550667988e+02 +2020 1936 -1.168677565678393e+03 +2020 1937 -1.251286952144484e+03 +2020 1938 -1.430197816180122e+03 +2020 1939 -1.733190400658708e+03 +2020 1940 -2.199157547087201e+03 +2020 1941 -2.861294172280346e+03 +2020 1942 -3.699147964795180e+03 +2020 1943 -4.560278038130823e+03 +2020 1944 -5.136224430633882e+03 +2020 2080 -2.767706810094291e+03 +2020 2081 -2.521021940438000e+03 +2020 2082 -2.134265778758326e+03 +2020 2083 -1.733190400658708e+03 +2020 2084 -1.394551574360510e+03 +2020 2085 -1.141773184361042e+03 +2020 2086 -9.695072463564434e+02 +2020 2087 -8.643348602446076e+02 +2020 2088 -8.148024630667926e+02 +2020 2107 -8.507888885505199e+02 +2020 2108 -8.023274760830675e+02 +2020 2109 -7.211778000851799e+02 +2020 2110 -6.289529049931513e+02 +2020 2111 -5.429674662554822e+02 +2020 2112 -4.725808574370885e+02 +2020 2113 -4.208084537187713e+02 +2020 2114 -3.873813675510144e+02 +2020 2115 -3.710963518270331e+02 +2021 1936 -9.695072463564434e+02 +2021 1937 -1.032880208377977e+03 +2021 1938 -1.168677565678393e+03 +2021 1939 -1.394551574360510e+03 +2021 1940 -1.733190400658708e+03 +2021 1941 -2.199157547087201e+03 +2021 1942 -2.767706810094291e+03 +2021 1943 -3.331754877699595e+03 +2021 1944 -3.699147964795180e+03 +2021 2080 -3.699147964795180e+03 +2021 2081 -3.331754877699595e+03 +2021 2082 -2.767706810094291e+03 +2021 2083 -2.199157547087201e+03 +2021 2084 -1.733190400658708e+03 +2021 2085 -1.394551574360510e+03 +2021 2086 -1.168677565678393e+03 +2021 2087 -1.032880208377977e+03 +2021 2088 -9.695072463564434e+02 +2021 2107 -1.015511306612467e+03 +2021 2108 -9.536070604341750e+02 +2021 2109 -8.507888885505199e+02 +2021 2110 -7.352796046183681e+02 +2021 2111 -6.289529049931513e+02 +2021 2112 -5.429674662554822e+02 +2021 2113 -4.803677035258846e+02 +2021 2114 -4.402579127124382e+02 +2021 2115 -4.208084537187713e+02 +2022 1936 -8.148024630667926e+02 +2022 1937 -8.643348602446076e+02 +2022 1938 -9.695072463564434e+02 +2022 1939 -1.141773184361042e+03 +2022 1940 -1.394551574360510e+03 +2022 1941 -1.733190400658708e+03 +2022 1942 -2.134265778758326e+03 +2022 1943 -2.521021940438000e+03 +2022 1944 -2.767706810094291e+03 +2022 2080 -5.136224430633882e+03 +2022 2081 -4.560278038130823e+03 +2022 2082 -3.699147964795180e+03 +2022 2083 -2.861294172280346e+03 +2022 2084 -2.199157547087201e+03 +2022 2085 -1.733190400658708e+03 +2022 2086 -1.430197816180122e+03 +2022 2087 -1.251286952144484e+03 +2022 2088 -1.168677565678393e+03 +2022 2107 -1.228588660544053e+03 +2022 2108 -1.148042053110080e+03 +2022 2109 -1.015511306612467e+03 +2022 2110 -8.685786765383800e+02 +2022 2111 -7.352796046183681e+02 +2022 2112 -6.289529049931513e+02 +2022 2113 -5.524312223207850e+02 +2022 2114 -5.038180997021789e+02 +2022 2115 -4.803677035258846e+02 +2023 1936 -7.058924559832867e+02 +2023 1937 -7.463158073460687e+02 +2023 1938 -8.315436028021828e+02 +2023 1939 -9.695072463564434e+02 +2023 1940 -1.168677565678393e+03 +2023 1941 -1.430197816180122e+03 +2023 1942 -1.733190400658708e+03 +2023 1943 -2.019368486704435e+03 +2023 1944 -2.199157547087201e+03 +2023 2080 -7.138491575686282e+03 +2023 2081 -6.235592529048601e+03 +2023 2082 -4.925216936196723e+03 +2023 2083 -3.699147964795180e+03 +2023 2084 -2.767706810094291e+03 +2023 2085 -2.134265778758326e+03 +2023 2086 -1.733190400658708e+03 +2023 2087 -1.500725861549673e+03 +2023 2088 -1.394551574360510e+03 +2023 2107 -1.471477730866027e+03 +2023 2108 -1.368148367306964e+03 +2023 2109 -1.199743197084304e+03 +2023 2110 -1.015511306612467e+03 +2023 2111 -8.507888885505199e+02 +2023 2112 -7.211778000851799e+02 +2023 2113 -6.289529049931513e+02 +2023 2114 -5.708523475060541e+02 +2023 2115 -5.429674662554822e+02 +2024 1936 -6.378158089920671e+02 +2024 1937 -6.728335244699299e+02 +2024 1938 -7.463158073460687e+02 +2024 1939 -8.643348602446076e+02 +2024 1940 -1.032880208377977e+03 +2024 1941 -1.251286952144484e+03 +2024 1942 -1.500725861549673e+03 +2024 1943 -1.733190400658708e+03 +2024 1944 -1.877824568765017e+03 +2024 2080 -9.405703259334639e+03 +2024 2081 -8.091232579773156e+03 +2024 2082 -6.235592529048601e+03 +2024 2083 -4.560278038130823e+03 +2024 2084 -3.331754877699595e+03 +2024 2085 -2.521021940438000e+03 +2024 2086 -2.019368486704435e+03 +2024 2087 -1.733190400658708e+03 +2024 2088 -1.603684467943633e+03 +2024 2107 -1.697437739078449e+03 +2024 2108 -1.571600895131404e+03 +2024 2109 -1.368148367306964e+03 +2024 2110 -1.148042053110080e+03 +2024 2111 -9.536070604341750e+02 +2024 2112 -8.023274760830675e+02 +2024 2113 -6.956816209337401e+02 +2024 2114 -6.289529049931513e+02 +2024 2115 -5.970589583440825e+02 +2025 1936 -6.052974323170196e+02 +2025 1937 -6.378158089920671e+02 +2025 1938 -7.058924559832867e+02 +2025 1939 -8.148024630667926e+02 +2025 1940 -9.695072463564434e+02 +2025 1941 -1.168677565678393e+03 +2025 1942 -1.394551574360510e+03 +2025 1943 -1.603684467943633e+03 +2025 1944 -1.733190400658708e+03 +2025 2080 -1.103972130715926e+04 +2025 2081 -9.405703259334639e+03 +2025 2082 -7.138491575686282e+03 +2025 2083 -5.136224430633882e+03 +2025 2084 -3.699147964795180e+03 +2025 2085 -2.767706810094291e+03 +2025 2086 -2.199157547087201e+03 +2025 2087 -1.877824568765017e+03 +2025 2088 -1.733190400658708e+03 +2025 2107 -1.837845240586539e+03 +2025 2108 -1.697437739078449e+03 +2025 2109 -1.471477730866027e+03 +2025 2110 -1.228588660544053e+03 +2025 2111 -1.015511306612467e+03 +2025 2112 -8.507888885505199e+02 +2025 2113 -7.352796046183681e+02 +2025 2114 -6.632839990295113e+02 +2025 2115 -6.289529049931513e+02 +2044 1936 -6.289529049931513e+02 +2044 1937 -6.632839990295113e+02 +2044 1938 -7.352796046183681e+02 +2044 1939 -8.507888885505199e+02 +2044 1940 -1.015511306612467e+03 +2044 1941 -1.228588660544053e+03 +2044 1942 -1.471477730866027e+03 +2044 1943 -1.697437739078449e+03 +2044 1944 -1.837845240586539e+03 +2044 1963 -1.733190400658708e+03 +2044 1964 -1.877824568765017e+03 +2044 1965 -2.199157547087201e+03 +2044 1966 -2.767706810094291e+03 +2044 1967 -3.699147964795180e+03 +2044 1968 -5.136224430633882e+03 +2044 1969 -7.138491575686282e+03 +2044 1970 -9.405703259334639e+03 +2044 1971 -1.103972130715926e+04 +2044 2107 -1.733190400658708e+03 +2044 2108 -1.603684467943633e+03 +2044 2109 -1.394551574360510e+03 +2044 2110 -1.168677565678393e+03 +2044 2111 -9.695072463564434e+02 +2044 2112 -8.148024630667926e+02 +2044 2113 -7.058924559832867e+02 +2044 2114 -6.378158089920671e+02 +2044 2115 -6.052974323170196e+02 +2045 1936 -5.970589583440825e+02 +2045 1937 -6.289529049931513e+02 +2045 1938 -6.956816209337401e+02 +2045 1939 -8.023274760830675e+02 +2045 1940 -9.536070604341750e+02 +2045 1941 -1.148042053110080e+03 +2045 1942 -1.368148367306964e+03 +2045 1943 -1.571600895131404e+03 +2045 1944 -1.697437739078449e+03 +2045 1963 -1.603684467943633e+03 +2045 1964 -1.733190400658708e+03 +2045 1965 -2.019368486704435e+03 +2045 1966 -2.521021940438000e+03 +2045 1967 -3.331754877699595e+03 +2045 1968 -4.560278038130823e+03 +2045 1969 -6.235592529048601e+03 +2045 1970 -8.091232579773156e+03 +2045 1971 -9.405703259334639e+03 +2045 2107 -1.877824568765017e+03 +2045 2108 -1.733190400658708e+03 +2045 2109 -1.500725861549673e+03 +2045 2110 -1.251286952144484e+03 +2045 2111 -1.032880208377977e+03 +2045 2112 -8.643348602446076e+02 +2045 2113 -7.463158073460687e+02 +2045 2114 -6.728335244699299e+02 +2045 2115 -6.378158089920671e+02 +2046 1936 -5.429674662554822e+02 +2046 1937 -5.708523475060541e+02 +2046 1938 -6.289529049931513e+02 +2046 1939 -7.211778000851799e+02 +2046 1940 -8.507888885505199e+02 +2046 1941 -1.015511306612467e+03 +2046 1942 -1.199743197084304e+03 +2046 1943 -1.368148367306964e+03 +2046 1944 -1.471477730866027e+03 +2046 1963 -1.394551574360510e+03 +2046 1964 -1.500725861549673e+03 +2046 1965 -1.733190400658708e+03 +2046 1966 -2.134265778758326e+03 +2046 1967 -2.767706810094291e+03 +2046 1968 -3.699147964795180e+03 +2046 1969 -4.925216936196723e+03 +2046 1970 -6.235592529048601e+03 +2046 1971 -7.138491575686282e+03 +2046 2107 -2.199157547087201e+03 +2046 2108 -2.019368486704435e+03 +2046 2109 -1.733190400658708e+03 +2046 2110 -1.430197816180122e+03 +2046 2111 -1.168677565678393e+03 +2046 2112 -9.695072463564434e+02 +2046 2113 -8.315436028021828e+02 +2046 2114 -7.463158073460687e+02 +2046 2115 -7.058924559832867e+02 +2047 1936 -4.803677035258846e+02 +2047 1937 -5.038180997021789e+02 +2047 1938 -5.524312223207850e+02 +2047 1939 -6.289529049931513e+02 +2047 1940 -7.352796046183681e+02 +2047 1941 -8.685786765383800e+02 +2047 1942 -1.015511306612467e+03 +2047 1943 -1.148042053110080e+03 +2047 1944 -1.228588660544053e+03 +2047 1963 -1.168677565678393e+03 +2047 1964 -1.251286952144484e+03 +2047 1965 -1.430197816180122e+03 +2047 1966 -1.733190400658708e+03 +2047 1967 -2.199157547087201e+03 +2047 1968 -2.861294172280346e+03 +2047 1969 -3.699147964795180e+03 +2047 1970 -4.560278038130823e+03 +2047 1971 -5.136224430633882e+03 +2047 2107 -2.767706810094291e+03 +2047 2108 -2.521021940438000e+03 +2047 2109 -2.134265778758326e+03 +2047 2110 -1.733190400658708e+03 +2047 2111 -1.394551574360510e+03 +2047 2112 -1.141773184361042e+03 +2047 2113 -9.695072463564434e+02 +2047 2114 -8.643348602446076e+02 +2047 2115 -8.148024630667926e+02 +2048 1936 -4.208084537187713e+02 +2048 1937 -4.402579127124382e+02 +2048 1938 -4.803677035258846e+02 +2048 1939 -5.429674662554822e+02 +2048 1940 -6.289529049931513e+02 +2048 1941 -7.352796046183681e+02 +2048 1942 -8.507888885505199e+02 +2048 1943 -9.536070604341750e+02 +2048 1944 -1.015511306612467e+03 +2048 1963 -9.695072463564434e+02 +2048 1964 -1.032880208377977e+03 +2048 1965 -1.168677565678393e+03 +2048 1966 -1.394551574360510e+03 +2048 1967 -1.733190400658708e+03 +2048 1968 -2.199157547087201e+03 +2048 1969 -2.767706810094291e+03 +2048 1970 -3.331754877699595e+03 +2048 1971 -3.699147964795180e+03 +2048 2107 -3.699147964795180e+03 +2048 2108 -3.331754877699595e+03 +2048 2109 -2.767706810094291e+03 +2048 2110 -2.199157547087201e+03 +2048 2111 -1.733190400658708e+03 +2048 2112 -1.394551574360510e+03 +2048 2113 -1.168677565678393e+03 +2048 2114 -1.032880208377977e+03 +2048 2115 -9.695072463564434e+02 +2049 1936 -3.710963518270331e+02 +2049 1937 -3.873813675510144e+02 +2049 1938 -4.208084537187713e+02 +2049 1939 -4.725808574370885e+02 +2049 1940 -5.429674662554822e+02 +2049 1941 -6.289529049931513e+02 +2049 1942 -7.211778000851799e+02 +2049 1943 -8.023274760830675e+02 +2049 1944 -8.507888885505199e+02 +2049 1963 -8.148024630667926e+02 +2049 1964 -8.643348602446076e+02 +2049 1965 -9.695072463564434e+02 +2049 1966 -1.141773184361042e+03 +2049 1967 -1.394551574360510e+03 +2049 1968 -1.733190400658708e+03 +2049 1969 -2.134265778758326e+03 +2049 1970 -2.521021940438000e+03 +2049 1971 -2.767706810094291e+03 +2049 2107 -5.136224430633882e+03 +2049 2108 -4.560278038130823e+03 +2049 2109 -3.699147964795180e+03 +2049 2110 -2.861294172280346e+03 +2049 2111 -2.199157547087201e+03 +2049 2112 -1.733190400658708e+03 +2049 2113 -1.430197816180122e+03 +2049 2114 -1.251286952144484e+03 +2049 2115 -1.168677565678393e+03 +2050 1936 -3.339204550667988e+02 +2050 1937 -3.479505460244110e+02 +2050 1938 -3.766415408901786e+02 +2050 1939 -4.208084537187713e+02 +2050 1940 -4.803677035258846e+02 +2050 1941 -5.524312223207850e+02 +2050 1942 -6.289529049931513e+02 +2050 1943 -6.956816209337401e+02 +2050 1944 -7.352796046183681e+02 +2050 1963 -7.058924559832867e+02 +2050 1964 -7.463158073460687e+02 +2050 1965 -8.315436028021828e+02 +2050 1966 -9.695072463564434e+02 +2050 1967 -1.168677565678393e+03 +2050 1968 -1.430197816180122e+03 +2050 1969 -1.733190400658708e+03 +2050 1970 -2.019368486704435e+03 +2050 1971 -2.199157547087201e+03 +2050 2107 -7.138491575686282e+03 +2050 2108 -6.235592529048601e+03 +2050 2109 -4.925216936196723e+03 +2050 2110 -3.699147964795180e+03 +2050 2111 -2.767706810094291e+03 +2050 2112 -2.134265778758326e+03 +2050 2113 -1.733190400658708e+03 +2050 2114 -1.500725861549673e+03 +2050 2115 -1.394551574360510e+03 +2051 1936 -3.096178268240465e+02 +2051 1937 -3.222285372305477e+02 +2051 1938 -3.479505460244110e+02 +2051 1939 -3.873813675510144e+02 +2051 1940 -4.402579127124382e+02 +2051 1941 -5.038180997021789e+02 +2051 1942 -5.708523475060541e+02 +2051 1943 -6.289529049931513e+02 +2051 1944 -6.632839990295113e+02 +2051 1963 -6.378158089920671e+02 +2051 1964 -6.728335244699299e+02 +2051 1965 -7.463158073460687e+02 +2051 1966 -8.643348602446076e+02 +2051 1967 -1.032880208377977e+03 +2051 1968 -1.251286952144484e+03 +2051 1969 -1.500725861549673e+03 +2051 1970 -1.733190400658708e+03 +2051 1971 -1.877824568765017e+03 +2051 2107 -9.405703259334639e+03 +2051 2108 -8.091232579773156e+03 +2051 2109 -6.235592529048601e+03 +2051 2110 -4.560278038130823e+03 +2051 2111 -3.331754877699595e+03 +2051 2112 -2.521021940438000e+03 +2051 2113 -2.019368486704435e+03 +2051 2114 -1.733190400658708e+03 +2051 2115 -1.603684467943633e+03 +2052 1936 -2.976873911031298e+02 +2052 1937 -3.096178268240465e+02 +2052 1938 -3.339204550667988e+02 +2052 1939 -3.710963518270331e+02 +2052 1940 -4.208084537187713e+02 +2052 1941 -4.803677035258846e+02 +2052 1942 -5.429674662554822e+02 +2052 1943 -5.970589583440825e+02 +2052 1944 -6.289529049931513e+02 +2052 1963 -6.052974323170196e+02 +2052 1964 -6.378158089920671e+02 +2052 1965 -7.058924559832867e+02 +2052 1966 -8.148024630667926e+02 +2052 1967 -9.695072463564434e+02 +2052 1968 -1.168677565678393e+03 +2052 1969 -1.394551574360510e+03 +2052 1970 -1.603684467943633e+03 +2052 1971 -1.733190400658708e+03 +2052 2107 -1.103972130715926e+04 +2052 2108 -9.405703259334639e+03 +2052 2109 -7.138491575686282e+03 +2052 2110 -5.136224430633882e+03 +2052 2111 -3.699147964795180e+03 +2052 2112 -2.767706810094291e+03 +2052 2113 -2.199157547087201e+03 +2052 2114 -1.877824568765017e+03 +2052 2115 -1.733190400658708e+03 +2071 1864 -1.111842160419089e+02 +2071 1865 -1.170681125153376e+02 +2071 1866 -1.293661657908652e+02 +2071 1867 -1.489885081652992e+02 +2071 1868 -1.767605489846857e+02 +2071 1869 -2.123577731150849e+02 +2071 1870 -2.525366109215767e+02 +2071 1871 -2.895745815575320e+02 +2071 1872 -3.124380547854544e+02 +2071 1927 -3.063876713483004e+02 +2071 1928 -3.311617365195747e+02 +2071 1929 -3.859179776157605e+02 +2071 1930 -4.819366867771664e+02 +2071 1931 -6.371952057562402e+02 +2071 1932 -8.726231103602357e+02 +2071 1933 -1.193932486839834e+03 +2071 1934 -1.550121445008505e+03 +2071 1935 -1.802596433195456e+03 +2071 2206 -3.063876713483004e+02 +2071 2207 -2.841326260213855e+02 +2071 2208 -2.480403651673271e+02 +2071 2209 -2.088271183655457e+02 +2071 2210 -1.740274317161707e+02 +2071 2211 -1.468355065336023e+02 +2071 2212 -1.275984131219179e+02 +2071 2213 -1.155304899028561e+02 +2071 2214 -1.097534196790493e+02 +2072 1864 -1.057061586526018e+02 +2072 1865 -1.111842160419089e+02 +2072 1866 -1.226088998409724e+02 +2072 1867 -1.407716848553628e+02 +2072 1868 -1.663510232448633e+02 +2072 1869 -1.989422168423268e+02 +2072 1870 -2.354925657825773e+02 +2072 1871 -2.689865983609317e+02 +2072 1872 -2.895745815575320e+02 +2072 1927 -2.841326260213855e+02 +2072 1928 -3.063876713483004e+02 +2072 1929 -3.553280674768354e+02 +2072 1930 -4.404031329187411e+02 +2072 1931 -5.762343277298867e+02 +2072 1932 -7.788097592344268e+02 +2072 1933 -1.049909849375148e+03 +2072 1934 -1.344510568096302e+03 +2072 1935 -1.550121445008505e+03 +2072 2206 -3.311617365195747e+02 +2072 2207 -3.063876713483004e+02 +2072 2208 -2.663884709281895e+02 +2072 2209 -2.231981844606894e+02 +2072 2210 -1.851243485745373e+02 +2072 2211 -1.555580782497810e+02 +2072 2212 -1.347481526436478e+02 +2072 2213 -1.217424124188383e+02 +2072 2214 -1.155304899028561e+02 +2073 1864 -9.638822517401589e+01 +2073 1865 -1.011961191083175e+02 +2073 1866 -1.111842160419089e+02 +2073 1867 -1.269615920628681e+02 +2073 1868 -1.489885081652992e+02 +2073 1869 -1.767605489846857e+02 +2073 1870 -2.075588680195229e+02 +2073 1871 -2.354925657825773e+02 +2073 1872 -2.525366109215767e+02 +2073 1927 -2.480403651673271e+02 +2073 1928 -2.663884709281895e+02 +2073 1929 -3.063876713483004e+02 +2073 1930 -3.748904053829385e+02 +2073 1931 -4.819366867771664e+02 +2073 1932 -6.371952057562402e+02 +2073 1933 -8.383319685358435e+02 +2073 1934 -1.049909849375148e+03 +2073 1935 -1.193932486839834e+03 +2073 2206 -3.859179776157605e+02 +2073 2207 -3.553280674768354e+02 +2073 2208 -3.063876713483004e+02 +2073 2209 -2.542062119667738e+02 +2073 2210 -2.088271183655457e+02 +2073 2211 -1.740274317161707e+02 +2073 2212 -1.497853840269160e+02 +2073 2213 -1.347481526436478e+02 +2073 2214 -1.275984131219179e+02 +2074 1864 -8.555928471614156e+01 +2074 1865 -8.962181586287889e+01 +2074 1866 -9.802102195827720e+01 +2074 1867 -1.111842160419089e+02 +2074 1868 -1.293661657908652e+02 +2074 1869 -1.519993633210930e+02 +2074 1870 -1.767605489846857e+02 +2074 1871 -1.989422168423268e+02 +2074 1872 -2.123577731150849e+02 +2074 1927 -2.088271183655457e+02 +2074 1928 -2.231981844606894e+02 +2074 1929 -2.542062119667738e+02 +2074 1930 -3.063876713483004e+02 +2074 1931 -3.859179776157605e+02 +2074 1932 -4.976453857371607e+02 +2074 1933 -6.371952057562402e+02 +2074 1934 -7.788097592344268e+02 +2074 1935 -8.726231103602357e+02 +2074 2206 -4.819366867771664e+02 +2074 2207 -4.404031329187411e+02 +2074 2208 -3.748904053829385e+02 +2074 2209 -3.063876713483004e+02 +2074 2210 -2.480403651673271e+02 +2074 2211 -2.041390437321793e+02 +2074 2212 -1.740274317161707e+02 +2074 2213 -1.555580782497810e+02 +2074 2214 -1.468355065336023e+02 +2075 1864 -7.520762033775921e+01 +2075 1865 -7.859349409841370e+01 +2075 1866 -8.555928471614156e+01 +2075 1867 -9.638822517401589e+01 +2075 1868 -1.111842160419089e+02 +2075 1869 -1.293661657908652e+02 +2075 1870 -1.489885081652992e+02 +2075 1871 -1.663510232448633e+02 +2075 1872 -1.767605489846857e+02 +2075 1927 -1.740274317161707e+02 +2075 1928 -1.851243485745373e+02 +2075 1929 -2.088271183655457e+02 +2075 1930 -2.480403651673271e+02 +2075 1931 -3.063876713483004e+02 +2075 1932 -3.859179776157605e+02 +2075 1933 -4.819366867771664e+02 +2075 1934 -5.762343277298867e+02 +2075 1935 -6.371952057562402e+02 +2075 2206 -6.371952057562402e+02 +2075 2207 -5.762343277298867e+02 +2075 2208 -4.819366867771664e+02 +2075 2209 -3.859179776157605e+02 +2075 2210 -3.063876713483004e+02 +2075 2211 -2.480403651673271e+02 +2075 2212 -2.088271183655457e+02 +2075 2213 -1.851243485745373e+02 +2075 2214 -1.740274317161707e+02 +2076 1864 -6.652797451218323e+01 +2076 1865 -6.937545782864687e+01 +2076 1866 -7.520762033775921e+01 +2076 1867 -8.420868002944904e+01 +2076 1868 -9.638822517401589e+01 +2076 1869 -1.111842160419089e+02 +2076 1870 -1.269615920628681e+02 +2076 1871 -1.407716848553628e+02 +2076 1872 -1.489885081652992e+02 +2076 1927 -1.468355065336023e+02 +2076 1928 -1.555580782497810e+02 +2076 1929 -1.740274317161707e+02 +2076 1930 -2.041390437321793e+02 +2076 1931 -2.480403651673271e+02 +2076 1932 -3.063876713483004e+02 +2076 1933 -3.748904053829385e+02 +2076 1934 -4.404031329187411e+02 +2076 1935 -4.819366867771664e+02 +2076 2206 -8.726231103602357e+02 +2076 2207 -7.788097592344268e+02 +2076 2208 -6.371952057562402e+02 +2076 2209 -4.976453857371607e+02 +2076 2210 -3.859179776157605e+02 +2076 2211 -3.063876713483004e+02 +2076 2212 -2.542062119667738e+02 +2076 2213 -2.231981844606894e+02 +2076 2214 -2.088271183655457e+02 +2077 1864 -6.001174723167335e+01 +2077 1865 -6.247361649834824e+01 +2077 1866 -6.749803222962952e+01 +2077 1867 -7.520762033775921e+01 +2077 1868 -8.555928471614156e+01 +2077 1869 -9.802102195827720e+01 +2077 1870 -1.111842160419089e+02 +2077 1871 -1.226088998409724e+02 +2077 1872 -1.293661657908652e+02 +2077 1927 -1.275984131219179e+02 +2077 1928 -1.347481526436478e+02 +2077 1929 -1.497853840269160e+02 +2077 1930 -1.740274317161707e+02 +2077 1931 -2.088271183655457e+02 +2077 1932 -2.542062119667738e+02 +2077 1933 -3.063876713483004e+02 +2077 1934 -3.553280674768354e+02 +2077 1935 -3.859179776157605e+02 +2077 2206 -1.193932486839834e+03 +2077 2207 -1.049909849375148e+03 +2077 2208 -8.383319685358435e+02 +2077 2209 -6.371952057562402e+02 +2077 2210 -4.819366867771664e+02 +2077 2211 -3.748904053829385e+02 +2077 2212 -3.063876713483004e+02 +2077 2213 -2.663884709281895e+02 +2077 2214 -2.480403651673271e+02 +2078 1864 -5.573941364116940e+01 +2078 1865 -5.795761808209202e+01 +2078 1866 -6.247361649834824e+01 +2078 1867 -6.937545782864687e+01 +2078 1868 -7.859349409841370e+01 +2078 1869 -8.962181586287889e+01 +2078 1870 -1.011961191083175e+02 +2078 1871 -1.111842160419089e+02 +2078 1872 -1.170681125153376e+02 +2078 1927 -1.155304899028561e+02 +2078 1928 -1.217424124188383e+02 +2078 1929 -1.347481526436478e+02 +2078 1930 -1.555580782497810e+02 +2078 1931 -1.851243485745373e+02 +2078 1932 -2.231981844606894e+02 +2078 1933 -2.663884709281895e+02 +2078 1934 -3.063876713483004e+02 +2078 1935 -3.311617365195747e+02 +2078 2206 -1.550121445008505e+03 +2078 2207 -1.344510568096302e+03 +2078 2208 -1.049909849375148e+03 +2078 2209 -7.788097592344268e+02 +2078 2210 -5.762343277298867e+02 +2078 2211 -4.404031329187411e+02 +2078 2212 -3.553280674768354e+02 +2078 2213 -3.063876713483004e+02 +2078 2214 -2.841326260213855e+02 +2079 1864 -5.363826960242956e+01 +2079 1865 -5.573941364116940e+01 +2079 1866 -6.001174723167335e+01 +2079 1867 -6.652797451218323e+01 +2079 1868 -7.520762033775921e+01 +2079 1869 -8.555928471614156e+01 +2079 1870 -9.638822517401589e+01 +2079 1871 -1.057061586526018e+02 +2079 1872 -1.111842160419089e+02 +2079 1927 -1.097534196790493e+02 +2079 1928 -1.155304899028561e+02 +2079 1929 -1.275984131219179e+02 +2079 1930 -1.468355065336023e+02 +2079 1931 -1.740274317161707e+02 +2079 1932 -2.088271183655457e+02 +2079 1933 -2.480403651673271e+02 +2079 1934 -2.841326260213855e+02 +2079 1935 -3.063876713483004e+02 +2079 2206 -1.802596433195456e+03 +2079 2207 -1.550121445008505e+03 +2079 2208 -1.193932486839834e+03 +2079 2209 -8.726231103602357e+02 +2079 2210 -6.371952057562402e+02 +2079 2211 -4.819366867771664e+02 +2079 2212 -3.859179776157605e+02 +2079 2213 -3.311617365195747e+02 +2079 2214 -3.063876713483004e+02 +2080 2017 -1.733190400658708e+03 +2080 2018 -1.877824568765017e+03 +2080 2019 -2.199157547087201e+03 +2080 2020 -2.767706810094291e+03 +2080 2021 -3.699147964795180e+03 +2080 2022 -5.136224430633882e+03 +2080 2023 -7.138491575686282e+03 +2080 2024 -9.405703259334639e+03 +2080 2025 -1.103972130715926e+04 +2080 2152 -1.733190400658708e+03 +2080 2153 -1.603684467943633e+03 +2080 2154 -1.394551574360510e+03 +2080 2155 -1.168677565678393e+03 +2080 2156 -9.695072463564434e+02 +2080 2157 -8.148024630667926e+02 +2080 2158 -7.058924559832867e+02 +2080 2159 -6.378158089920671e+02 +2080 2160 -6.052974323170196e+02 +2080 2179 -6.289529049931513e+02 +2080 2180 -5.970589583440825e+02 +2080 2181 -5.429674662554822e+02 +2080 2182 -4.803677035258846e+02 +2080 2183 -4.208084537187713e+02 +2080 2184 -3.710963518270331e+02 +2080 2185 -3.339204550667988e+02 +2080 2186 -3.096178268240465e+02 +2080 2187 -2.976873911031298e+02 +2081 2017 -1.603684467943633e+03 +2081 2018 -1.733190400658708e+03 +2081 2019 -2.019368486704435e+03 +2081 2020 -2.521021940438000e+03 +2081 2021 -3.331754877699595e+03 +2081 2022 -4.560278038130823e+03 +2081 2023 -6.235592529048601e+03 +2081 2024 -8.091232579773156e+03 +2081 2025 -9.405703259334639e+03 +2081 2152 -1.877824568765017e+03 +2081 2153 -1.733190400658708e+03 +2081 2154 -1.500725861549673e+03 +2081 2155 -1.251286952144484e+03 +2081 2156 -1.032880208377977e+03 +2081 2157 -8.643348602446076e+02 +2081 2158 -7.463158073460687e+02 +2081 2159 -6.728335244699299e+02 +2081 2160 -6.378158089920671e+02 +2081 2179 -6.632839990295113e+02 +2081 2180 -6.289529049931513e+02 +2081 2181 -5.708523475060541e+02 +2081 2182 -5.038180997021789e+02 +2081 2183 -4.402579127124382e+02 +2081 2184 -3.873813675510144e+02 +2081 2185 -3.479505460244110e+02 +2081 2186 -3.222285372305477e+02 +2081 2187 -3.096178268240465e+02 +2082 2017 -1.394551574360510e+03 +2082 2018 -1.500725861549673e+03 +2082 2019 -1.733190400658708e+03 +2082 2020 -2.134265778758326e+03 +2082 2021 -2.767706810094291e+03 +2082 2022 -3.699147964795180e+03 +2082 2023 -4.925216936196723e+03 +2082 2024 -6.235592529048601e+03 +2082 2025 -7.138491575686282e+03 +2082 2152 -2.199157547087201e+03 +2082 2153 -2.019368486704435e+03 +2082 2154 -1.733190400658708e+03 +2082 2155 -1.430197816180122e+03 +2082 2156 -1.168677565678393e+03 +2082 2157 -9.695072463564434e+02 +2082 2158 -8.315436028021828e+02 +2082 2159 -7.463158073460687e+02 +2082 2160 -7.058924559832867e+02 +2082 2179 -7.352796046183681e+02 +2082 2180 -6.956816209337401e+02 +2082 2181 -6.289529049931513e+02 +2082 2182 -5.524312223207850e+02 +2082 2183 -4.803677035258846e+02 +2082 2184 -4.208084537187713e+02 +2082 2185 -3.766415408901786e+02 +2082 2186 -3.479505460244110e+02 +2082 2187 -3.339204550667988e+02 +2083 2017 -1.168677565678393e+03 +2083 2018 -1.251286952144484e+03 +2083 2019 -1.430197816180122e+03 +2083 2020 -1.733190400658708e+03 +2083 2021 -2.199157547087201e+03 +2083 2022 -2.861294172280346e+03 +2083 2023 -3.699147964795180e+03 +2083 2024 -4.560278038130823e+03 +2083 2025 -5.136224430633882e+03 +2083 2152 -2.767706810094291e+03 +2083 2153 -2.521021940438000e+03 +2083 2154 -2.134265778758326e+03 +2083 2155 -1.733190400658708e+03 +2083 2156 -1.394551574360510e+03 +2083 2157 -1.141773184361042e+03 +2083 2158 -9.695072463564434e+02 +2083 2159 -8.643348602446076e+02 +2083 2160 -8.148024630667926e+02 +2083 2179 -8.507888885505199e+02 +2083 2180 -8.023274760830675e+02 +2083 2181 -7.211778000851799e+02 +2083 2182 -6.289529049931513e+02 +2083 2183 -5.429674662554822e+02 +2083 2184 -4.725808574370885e+02 +2083 2185 -4.208084537187713e+02 +2083 2186 -3.873813675510144e+02 +2083 2187 -3.710963518270331e+02 +2084 2017 -9.695072463564434e+02 +2084 2018 -1.032880208377977e+03 +2084 2019 -1.168677565678393e+03 +2084 2020 -1.394551574360510e+03 +2084 2021 -1.733190400658708e+03 +2084 2022 -2.199157547087201e+03 +2084 2023 -2.767706810094291e+03 +2084 2024 -3.331754877699595e+03 +2084 2025 -3.699147964795180e+03 +2084 2152 -3.699147964795180e+03 +2084 2153 -3.331754877699595e+03 +2084 2154 -2.767706810094291e+03 +2084 2155 -2.199157547087201e+03 +2084 2156 -1.733190400658708e+03 +2084 2157 -1.394551574360510e+03 +2084 2158 -1.168677565678393e+03 +2084 2159 -1.032880208377977e+03 +2084 2160 -9.695072463564434e+02 +2084 2179 -1.015511306612467e+03 +2084 2180 -9.536070604341750e+02 +2084 2181 -8.507888885505199e+02 +2084 2182 -7.352796046183681e+02 +2084 2183 -6.289529049931513e+02 +2084 2184 -5.429674662554822e+02 +2084 2185 -4.803677035258846e+02 +2084 2186 -4.402579127124382e+02 +2084 2187 -4.208084537187713e+02 +2085 2017 -8.148024630667926e+02 +2085 2018 -8.643348602446076e+02 +2085 2019 -9.695072463564434e+02 +2085 2020 -1.141773184361042e+03 +2085 2021 -1.394551574360510e+03 +2085 2022 -1.733190400658708e+03 +2085 2023 -2.134265778758326e+03 +2085 2024 -2.521021940438000e+03 +2085 2025 -2.767706810094291e+03 +2085 2152 -5.136224430633882e+03 +2085 2153 -4.560278038130823e+03 +2085 2154 -3.699147964795180e+03 +2085 2155 -2.861294172280346e+03 +2085 2156 -2.199157547087201e+03 +2085 2157 -1.733190400658708e+03 +2085 2158 -1.430197816180122e+03 +2085 2159 -1.251286952144484e+03 +2085 2160 -1.168677565678393e+03 +2085 2179 -1.228588660544053e+03 +2085 2180 -1.148042053110080e+03 +2085 2181 -1.015511306612467e+03 +2085 2182 -8.685786765383800e+02 +2085 2183 -7.352796046183681e+02 +2085 2184 -6.289529049931513e+02 +2085 2185 -5.524312223207850e+02 +2085 2186 -5.038180997021789e+02 +2085 2187 -4.803677035258846e+02 +2086 2017 -7.058924559832867e+02 +2086 2018 -7.463158073460687e+02 +2086 2019 -8.315436028021828e+02 +2086 2020 -9.695072463564434e+02 +2086 2021 -1.168677565678393e+03 +2086 2022 -1.430197816180122e+03 +2086 2023 -1.733190400658708e+03 +2086 2024 -2.019368486704435e+03 +2086 2025 -2.199157547087201e+03 +2086 2152 -7.138491575686282e+03 +2086 2153 -6.235592529048601e+03 +2086 2154 -4.925216936196723e+03 +2086 2155 -3.699147964795180e+03 +2086 2156 -2.767706810094291e+03 +2086 2157 -2.134265778758326e+03 +2086 2158 -1.733190400658708e+03 +2086 2159 -1.500725861549673e+03 +2086 2160 -1.394551574360510e+03 +2086 2179 -1.471477730866027e+03 +2086 2180 -1.368148367306964e+03 +2086 2181 -1.199743197084304e+03 +2086 2182 -1.015511306612467e+03 +2086 2183 -8.507888885505199e+02 +2086 2184 -7.211778000851799e+02 +2086 2185 -6.289529049931513e+02 +2086 2186 -5.708523475060541e+02 +2086 2187 -5.429674662554822e+02 +2087 2017 -6.378158089920671e+02 +2087 2018 -6.728335244699299e+02 +2087 2019 -7.463158073460687e+02 +2087 2020 -8.643348602446076e+02 +2087 2021 -1.032880208377977e+03 +2087 2022 -1.251286952144484e+03 +2087 2023 -1.500725861549673e+03 +2087 2024 -1.733190400658708e+03 +2087 2025 -1.877824568765017e+03 +2087 2152 -9.405703259334639e+03 +2087 2153 -8.091232579773156e+03 +2087 2154 -6.235592529048601e+03 +2087 2155 -4.560278038130823e+03 +2087 2156 -3.331754877699595e+03 +2087 2157 -2.521021940438000e+03 +2087 2158 -2.019368486704435e+03 +2087 2159 -1.733190400658708e+03 +2087 2160 -1.603684467943633e+03 +2087 2179 -1.697437739078449e+03 +2087 2180 -1.571600895131404e+03 +2087 2181 -1.368148367306964e+03 +2087 2182 -1.148042053110080e+03 +2087 2183 -9.536070604341750e+02 +2087 2184 -8.023274760830675e+02 +2087 2185 -6.956816209337401e+02 +2087 2186 -6.289529049931513e+02 +2087 2187 -5.970589583440825e+02 +2088 2017 -6.052974323170196e+02 +2088 2018 -6.378158089920671e+02 +2088 2019 -7.058924559832867e+02 +2088 2020 -8.148024630667926e+02 +2088 2021 -9.695072463564434e+02 +2088 2022 -1.168677565678393e+03 +2088 2023 -1.394551574360510e+03 +2088 2024 -1.603684467943633e+03 +2088 2025 -1.733190400658708e+03 +2088 2152 -1.103972130715926e+04 +2088 2153 -9.405703259334639e+03 +2088 2154 -7.138491575686282e+03 +2088 2155 -5.136224430633882e+03 +2088 2156 -3.699147964795180e+03 +2088 2157 -2.767706810094291e+03 +2088 2158 -2.199157547087201e+03 +2088 2159 -1.877824568765017e+03 +2088 2160 -1.733190400658708e+03 +2088 2179 -1.837845240586539e+03 +2088 2180 -1.697437739078449e+03 +2088 2181 -1.471477730866027e+03 +2088 2182 -1.228588660544053e+03 +2088 2183 -1.015511306612467e+03 +2088 2184 -8.507888885505199e+02 +2088 2185 -7.352796046183681e+02 +2088 2186 -6.632839990295113e+02 +2088 2187 -6.289529049931513e+02 +2107 2017 -6.289529049931513e+02 +2107 2018 -6.632839990295113e+02 +2107 2019 -7.352796046183681e+02 +2107 2020 -8.507888885505199e+02 +2107 2021 -1.015511306612467e+03 +2107 2022 -1.228588660544053e+03 +2107 2023 -1.471477730866027e+03 +2107 2024 -1.697437739078449e+03 +2107 2025 -1.837845240586539e+03 +2107 2044 -1.733190400658708e+03 +2107 2045 -1.877824568765017e+03 +2107 2046 -2.199157547087201e+03 +2107 2047 -2.767706810094291e+03 +2107 2048 -3.699147964795180e+03 +2107 2049 -5.136224430633882e+03 +2107 2050 -7.138491575686282e+03 +2107 2051 -9.405703259334639e+03 +2107 2052 -1.103972130715926e+04 +2107 2179 -1.733190400658708e+03 +2107 2180 -1.603684467943633e+03 +2107 2181 -1.394551574360510e+03 +2107 2182 -1.168677565678393e+03 +2107 2183 -9.695072463564434e+02 +2107 2184 -8.148024630667926e+02 +2107 2185 -7.058924559832867e+02 +2107 2186 -6.378158089920671e+02 +2107 2187 -6.052974323170196e+02 +2108 2017 -5.970589583440825e+02 +2108 2018 -6.289529049931513e+02 +2108 2019 -6.956816209337401e+02 +2108 2020 -8.023274760830675e+02 +2108 2021 -9.536070604341750e+02 +2108 2022 -1.148042053110080e+03 +2108 2023 -1.368148367306964e+03 +2108 2024 -1.571600895131404e+03 +2108 2025 -1.697437739078449e+03 +2108 2044 -1.603684467943633e+03 +2108 2045 -1.733190400658708e+03 +2108 2046 -2.019368486704435e+03 +2108 2047 -2.521021940438000e+03 +2108 2048 -3.331754877699595e+03 +2108 2049 -4.560278038130823e+03 +2108 2050 -6.235592529048601e+03 +2108 2051 -8.091232579773156e+03 +2108 2052 -9.405703259334639e+03 +2108 2179 -1.877824568765017e+03 +2108 2180 -1.733190400658708e+03 +2108 2181 -1.500725861549673e+03 +2108 2182 -1.251286952144484e+03 +2108 2183 -1.032880208377977e+03 +2108 2184 -8.643348602446076e+02 +2108 2185 -7.463158073460687e+02 +2108 2186 -6.728335244699299e+02 +2108 2187 -6.378158089920671e+02 +2109 2017 -5.429674662554822e+02 +2109 2018 -5.708523475060541e+02 +2109 2019 -6.289529049931513e+02 +2109 2020 -7.211778000851799e+02 +2109 2021 -8.507888885505199e+02 +2109 2022 -1.015511306612467e+03 +2109 2023 -1.199743197084304e+03 +2109 2024 -1.368148367306964e+03 +2109 2025 -1.471477730866027e+03 +2109 2044 -1.394551574360510e+03 +2109 2045 -1.500725861549673e+03 +2109 2046 -1.733190400658708e+03 +2109 2047 -2.134265778758326e+03 +2109 2048 -2.767706810094291e+03 +2109 2049 -3.699147964795180e+03 +2109 2050 -4.925216936196723e+03 +2109 2051 -6.235592529048601e+03 +2109 2052 -7.138491575686282e+03 +2109 2179 -2.199157547087201e+03 +2109 2180 -2.019368486704435e+03 +2109 2181 -1.733190400658708e+03 +2109 2182 -1.430197816180122e+03 +2109 2183 -1.168677565678393e+03 +2109 2184 -9.695072463564434e+02 +2109 2185 -8.315436028021828e+02 +2109 2186 -7.463158073460687e+02 +2109 2187 -7.058924559832867e+02 +2110 2017 -4.803677035258846e+02 +2110 2018 -5.038180997021789e+02 +2110 2019 -5.524312223207850e+02 +2110 2020 -6.289529049931513e+02 +2110 2021 -7.352796046183681e+02 +2110 2022 -8.685786765383800e+02 +2110 2023 -1.015511306612467e+03 +2110 2024 -1.148042053110080e+03 +2110 2025 -1.228588660544053e+03 +2110 2044 -1.168677565678393e+03 +2110 2045 -1.251286952144484e+03 +2110 2046 -1.430197816180122e+03 +2110 2047 -1.733190400658708e+03 +2110 2048 -2.199157547087201e+03 +2110 2049 -2.861294172280346e+03 +2110 2050 -3.699147964795180e+03 +2110 2051 -4.560278038130823e+03 +2110 2052 -5.136224430633882e+03 +2110 2179 -2.767706810094291e+03 +2110 2180 -2.521021940438000e+03 +2110 2181 -2.134265778758326e+03 +2110 2182 -1.733190400658708e+03 +2110 2183 -1.394551574360510e+03 +2110 2184 -1.141773184361042e+03 +2110 2185 -9.695072463564434e+02 +2110 2186 -8.643348602446076e+02 +2110 2187 -8.148024630667926e+02 +2111 2017 -4.208084537187713e+02 +2111 2018 -4.402579127124382e+02 +2111 2019 -4.803677035258846e+02 +2111 2020 -5.429674662554822e+02 +2111 2021 -6.289529049931513e+02 +2111 2022 -7.352796046183681e+02 +2111 2023 -8.507888885505199e+02 +2111 2024 -9.536070604341750e+02 +2111 2025 -1.015511306612467e+03 +2111 2044 -9.695072463564434e+02 +2111 2045 -1.032880208377977e+03 +2111 2046 -1.168677565678393e+03 +2111 2047 -1.394551574360510e+03 +2111 2048 -1.733190400658708e+03 +2111 2049 -2.199157547087201e+03 +2111 2050 -2.767706810094291e+03 +2111 2051 -3.331754877699595e+03 +2111 2052 -3.699147964795180e+03 +2111 2179 -3.699147964795180e+03 +2111 2180 -3.331754877699595e+03 +2111 2181 -2.767706810094291e+03 +2111 2182 -2.199157547087201e+03 +2111 2183 -1.733190400658708e+03 +2111 2184 -1.394551574360510e+03 +2111 2185 -1.168677565678393e+03 +2111 2186 -1.032880208377977e+03 +2111 2187 -9.695072463564434e+02 +2112 2017 -3.710963518270331e+02 +2112 2018 -3.873813675510144e+02 +2112 2019 -4.208084537187713e+02 +2112 2020 -4.725808574370885e+02 +2112 2021 -5.429674662554822e+02 +2112 2022 -6.289529049931513e+02 +2112 2023 -7.211778000851799e+02 +2112 2024 -8.023274760830675e+02 +2112 2025 -8.507888885505199e+02 +2112 2044 -8.148024630667926e+02 +2112 2045 -8.643348602446076e+02 +2112 2046 -9.695072463564434e+02 +2112 2047 -1.141773184361042e+03 +2112 2048 -1.394551574360510e+03 +2112 2049 -1.733190400658708e+03 +2112 2050 -2.134265778758326e+03 +2112 2051 -2.521021940438000e+03 +2112 2052 -2.767706810094291e+03 +2112 2179 -5.136224430633882e+03 +2112 2180 -4.560278038130823e+03 +2112 2181 -3.699147964795180e+03 +2112 2182 -2.861294172280346e+03 +2112 2183 -2.199157547087201e+03 +2112 2184 -1.733190400658708e+03 +2112 2185 -1.430197816180122e+03 +2112 2186 -1.251286952144484e+03 +2112 2187 -1.168677565678393e+03 +2113 2017 -3.339204550667988e+02 +2113 2018 -3.479505460244110e+02 +2113 2019 -3.766415408901786e+02 +2113 2020 -4.208084537187713e+02 +2113 2021 -4.803677035258846e+02 +2113 2022 -5.524312223207850e+02 +2113 2023 -6.289529049931513e+02 +2113 2024 -6.956816209337401e+02 +2113 2025 -7.352796046183681e+02 +2113 2044 -7.058924559832867e+02 +2113 2045 -7.463158073460687e+02 +2113 2046 -8.315436028021828e+02 +2113 2047 -9.695072463564434e+02 +2113 2048 -1.168677565678393e+03 +2113 2049 -1.430197816180122e+03 +2113 2050 -1.733190400658708e+03 +2113 2051 -2.019368486704435e+03 +2113 2052 -2.199157547087201e+03 +2113 2179 -7.138491575686282e+03 +2113 2180 -6.235592529048601e+03 +2113 2181 -4.925216936196723e+03 +2113 2182 -3.699147964795180e+03 +2113 2183 -2.767706810094291e+03 +2113 2184 -2.134265778758326e+03 +2113 2185 -1.733190400658708e+03 +2113 2186 -1.500725861549673e+03 +2113 2187 -1.394551574360510e+03 +2114 2017 -3.096178268240465e+02 +2114 2018 -3.222285372305477e+02 +2114 2019 -3.479505460244110e+02 +2114 2020 -3.873813675510144e+02 +2114 2021 -4.402579127124382e+02 +2114 2022 -5.038180997021789e+02 +2114 2023 -5.708523475060541e+02 +2114 2024 -6.289529049931513e+02 +2114 2025 -6.632839990295113e+02 +2114 2044 -6.378158089920671e+02 +2114 2045 -6.728335244699299e+02 +2114 2046 -7.463158073460687e+02 +2114 2047 -8.643348602446076e+02 +2114 2048 -1.032880208377977e+03 +2114 2049 -1.251286952144484e+03 +2114 2050 -1.500725861549673e+03 +2114 2051 -1.733190400658708e+03 +2114 2052 -1.877824568765017e+03 +2114 2179 -9.405703259334639e+03 +2114 2180 -8.091232579773156e+03 +2114 2181 -6.235592529048601e+03 +2114 2182 -4.560278038130823e+03 +2114 2183 -3.331754877699595e+03 +2114 2184 -2.521021940438000e+03 +2114 2185 -2.019368486704435e+03 +2114 2186 -1.733190400658708e+03 +2114 2187 -1.603684467943633e+03 +2115 2017 -2.976873911031298e+02 +2115 2018 -3.096178268240465e+02 +2115 2019 -3.339204550667988e+02 +2115 2020 -3.710963518270331e+02 +2115 2021 -4.208084537187713e+02 +2115 2022 -4.803677035258846e+02 +2115 2023 -5.429674662554822e+02 +2115 2024 -5.970589583440825e+02 +2115 2025 -6.289529049931513e+02 +2115 2044 -6.052974323170196e+02 +2115 2045 -6.378158089920671e+02 +2115 2046 -7.058924559832867e+02 +2115 2047 -8.148024630667926e+02 +2115 2048 -9.695072463564434e+02 +2115 2049 -1.168677565678393e+03 +2115 2050 -1.394551574360510e+03 +2115 2051 -1.603684467943633e+03 +2115 2052 -1.733190400658708e+03 +2115 2179 -1.103972130715926e+04 +2115 2180 -9.405703259334639e+03 +2115 2181 -7.138491575686282e+03 +2115 2182 -5.136224430633882e+03 +2115 2183 -3.699147964795180e+03 +2115 2184 -2.767706810094291e+03 +2115 2185 -2.199157547087201e+03 +2115 2186 -1.877824568765017e+03 +2115 2187 -1.733190400658708e+03 +2134 1720 -1.965477828103598e+01 +2134 1721 -2.067858569511584e+01 +2134 1722 -2.281491025526307e+01 +2134 1723 -2.621419542240643e+01 +2134 1724 -3.100728135248165e+01 +2134 1725 -3.712309913086538e+01 +2134 1726 -4.399251628020367e+01 +2134 1727 -5.029652653878190e+01 +2134 1728 -5.417542964960961e+01 +2134 1855 -5.416220002058462e+01 +2134 1856 -5.847168336242214e+01 +2134 1857 -6.797204698756184e+01 +2134 1858 -8.455751811575986e+01 +2134 1859 -1.112023202068744e+02 +2134 1860 -1.512628164030906e+02 +2134 1861 -2.053883607687489e+02 +2134 1862 -2.647767438527630e+02 +2134 1863 -3.065373731090118e+02 +2135 1720 -1.870055440211151e+01 +2135 1721 -1.965477828103598e+01 +2135 1722 -2.164167292784031e+01 +2135 1723 -2.479209926714913e+01 +2135 1724 -2.921308657465229e+01 +2135 1725 -3.482168460593341e+01 +2135 1726 -4.108257963331437e+01 +2135 1727 -4.679557686118159e+01 +2135 1728 -5.029652653878190e+01 +2135 1855 -5.028460369863171e+01 +2135 1856 -5.416220002058462e+01 +2135 1857 -6.266865647386096e+01 +2135 1858 -7.739429142416682e+01 +2135 1859 -1.007640600234616e+02 +2135 1860 -1.353445496343036e+02 +2135 1861 -1.811983282511275e+02 +2135 1862 -2.305668762810884e+02 +2135 1863 -2.647767438527630e+02 +2136 1720 -1.707507926940499e+01 +2136 1721 -1.791417887437397e+01 +2136 1722 -1.965477828103598e+01 +2136 1723 -2.239757409043196e+01 +2136 1724 -2.621419542240647e+01 +2136 1725 -3.100728135248171e+01 +2136 1726 -3.630032063351624e+01 +2136 1727 -4.108257963331437e+01 +2136 1728 -4.399251628020367e+01 +2136 1855 -4.398263164573866e+01 +2136 1856 -4.718848846240646e+01 +2136 1857 -5.416220002058462e+01 +2136 1858 -6.606134132672688e+01 +2136 1859 -8.455751811576010e+01 +2136 1860 -1.112023202068747e+02 +2136 1861 -1.454508347890311e+02 +2136 1862 -1.811983282511275e+02 +2136 1863 -2.053883607687489e+02 +2137 1720 -1.518203609416468e+01 +2137 1721 -1.589274010473518e+01 +2137 1722 -1.736013665098131e+01 +2137 1723 -1.965477828103598e+01 +2137 1724 -2.281491025526310e+01 +2137 1725 -2.673481743251412e+01 +2137 1726 -3.100728135248171e+01 +2137 1727 -3.482168460593341e+01 +2137 1728 -3.712309913086538e+01 +2137 1855 -3.711530555640490e+01 +2137 1856 -3.963467701820890e+01 +2137 1857 -4.506046026496942e+01 +2137 1858 -5.416220002058462e+01 +2137 1859 -6.797204698756201e+01 +2137 1860 -8.726265053974967e+01 +2137 1861 -1.112023202068747e+02 +2137 1862 -1.353445496343036e+02 +2137 1863 -1.512628164030906e+02 +2138 1720 -1.336813651340294e+01 +2138 1721 -1.396191802264486e+01 +2138 1722 -1.518203609416466e+01 +2138 1723 -1.707507926940496e+01 +2138 1724 -1.965477828103598e+01 +2138 1725 -2.281491025526310e+01 +2138 1726 -2.621419542240647e+01 +2138 1727 -2.921308657465229e+01 +2138 1728 -3.100728135248165e+01 +2138 1855 -3.100122392289864e+01 +2138 1856 -3.295302401855845e+01 +2138 1857 -3.711530555640482e+01 +2138 1858 -4.398263164573857e+01 +2138 1859 -5.416220002058462e+01 +2138 1860 -6.797204698756201e+01 +2138 1861 -8.455751811576010e+01 +2138 1862 -1.007640600234616e+02 +2138 1863 -1.112023202068744e+02 +2139 1720 -1.184372960400065e+01 +2139 1721 -1.234420052045069e+01 +2139 1722 -1.336813651340292e+01 +2139 1723 -1.494561758129197e+01 +2139 1724 -1.707507926940496e+01 +2139 1725 -1.965477828103598e+01 +2139 1726 -2.239757409043196e+01 +2139 1727 -2.479209926714913e+01 +2139 1728 -2.621419542240643e+01 +2139 1855 -2.620940698061742e+01 +2139 1856 -2.774798050936779e+01 +2139 1857 -3.100122392289858e+01 +2139 1858 -3.629276779865588e+01 +2139 1859 -4.398263164573857e+01 +2139 1860 -5.416220002058462e+01 +2139 1861 -6.606134132672688e+01 +2139 1862 -7.739429142416682e+01 +2139 1863 -8.455751811575986e+01 +2140 1720 -1.069703031088084e+01 +2140 1721 -1.113049648221346e+01 +2140 1722 -1.201426721054981e+01 +2140 1723 -1.336813651340292e+01 +2140 1724 -1.518203609416466e+01 +2140 1725 -1.736013665098131e+01 +2140 1726 -1.965477828103598e+01 +2140 1727 -2.164167292784031e+01 +2140 1728 -2.281491025526307e+01 +2140 1855 -2.281096793104268e+01 +2140 1856 -2.407490908992506e+01 +2140 1857 -2.672989532903555e+01 +2140 1858 -3.100122392289858e+01 +2140 1859 -3.711530555640482e+01 +2140 1860 -4.506046026496942e+01 +2140 1861 -5.416220002058462e+01 +2140 1862 -6.266865647386096e+01 +2140 1863 -6.797204698756184e+01 +2141 1720 -9.944085360683063e+00 +2141 1721 -1.033512964800000e+01 +2141 1722 -1.113049648221346e+01 +2141 1723 -1.234420052045069e+01 +2141 1724 -1.396191802264486e+01 +2141 1725 -1.589274010473518e+01 +2141 1726 -1.791417887437397e+01 +2141 1727 -1.965477828103598e+01 +2141 1728 -2.067858569511584e+01 +2141 1855 -2.067515029553633e+01 +2141 1856 -2.177494503977683e+01 +2141 1857 -2.407490908992506e+01 +2141 1858 -2.774798050936779e+01 +2141 1859 -3.295302401855845e+01 +2141 1860 -3.963467701820890e+01 +2141 1861 -4.718848846240646e+01 +2141 1862 -5.416220002058462e+01 +2141 1863 -5.847168336242214e+01 +2142 1720 -9.573445684409064e+00 +2142 1721 -9.944085360683063e+00 +2142 1722 -1.069703031088084e+01 +2142 1723 -1.184372960400065e+01 +2142 1724 -1.336813651340294e+01 +2142 1725 -1.518203609416468e+01 +2142 1726 -1.707507926940499e+01 +2142 1727 -1.870055440211151e+01 +2142 1728 -1.965477828103598e+01 +2142 1855 -1.965157861598590e+01 +2142 1856 -2.067515029553633e+01 +2142 1857 -2.281096793104268e+01 +2142 1858 -2.620940698061742e+01 +2142 1859 -3.100122392289864e+01 +2142 1860 -3.711530555640490e+01 +2142 1861 -4.398263164573866e+01 +2142 1862 -5.028460369863171e+01 +2142 1863 -5.416220002058462e+01 +2143 2008 -3.063876713483004e+02 +2143 2009 -3.311617365195747e+02 +2143 2010 -3.859179776157605e+02 +2143 2011 -4.819366867771664e+02 +2143 2012 -6.371952057562402e+02 +2143 2013 -8.726231103602357e+02 +2143 2014 -1.193932486839834e+03 +2143 2015 -1.550121445008505e+03 +2143 2016 -1.802596433195456e+03 +2144 2008 -2.841326260213855e+02 +2144 2009 -3.063876713483004e+02 +2144 2010 -3.553280674768354e+02 +2144 2011 -4.404031329187411e+02 +2144 2012 -5.762343277298867e+02 +2144 2013 -7.788097592344268e+02 +2144 2014 -1.049909849375148e+03 +2144 2015 -1.344510568096302e+03 +2144 2016 -1.550121445008505e+03 +2145 2008 -2.480403651673271e+02 +2145 2009 -2.663884709281895e+02 +2145 2010 -3.063876713483004e+02 +2145 2011 -3.748904053829385e+02 +2145 2012 -4.819366867771664e+02 +2145 2013 -6.371952057562402e+02 +2145 2014 -8.383319685358435e+02 +2145 2015 -1.049909849375148e+03 +2145 2016 -1.193932486839834e+03 +2146 2008 -2.088271183655457e+02 +2146 2009 -2.231981844606894e+02 +2146 2010 -2.542062119667738e+02 +2146 2011 -3.063876713483004e+02 +2146 2012 -3.859179776157605e+02 +2146 2013 -4.976453857371607e+02 +2146 2014 -6.371952057562402e+02 +2146 2015 -7.788097592344268e+02 +2146 2016 -8.726231103602357e+02 +2147 2008 -1.740274317161707e+02 +2147 2009 -1.851243485745373e+02 +2147 2010 -2.088271183655457e+02 +2147 2011 -2.480403651673271e+02 +2147 2012 -3.063876713483004e+02 +2147 2013 -3.859179776157605e+02 +2147 2014 -4.819366867771664e+02 +2147 2015 -5.762343277298867e+02 +2147 2016 -6.371952057562402e+02 +2148 2008 -1.468355065336023e+02 +2148 2009 -1.555580782497810e+02 +2148 2010 -1.740274317161707e+02 +2148 2011 -2.041390437321793e+02 +2148 2012 -2.480403651673271e+02 +2148 2013 -3.063876713483004e+02 +2148 2014 -3.748904053829385e+02 +2148 2015 -4.404031329187411e+02 +2148 2016 -4.819366867771664e+02 +2149 2008 -1.275984131219179e+02 +2149 2009 -1.347481526436478e+02 +2149 2010 -1.497853840269160e+02 +2149 2011 -1.740274317161707e+02 +2149 2012 -2.088271183655457e+02 +2149 2013 -2.542062119667738e+02 +2149 2014 -3.063876713483004e+02 +2149 2015 -3.553280674768354e+02 +2149 2016 -3.859179776157605e+02 +2150 2008 -1.155304899028561e+02 +2150 2009 -1.217424124188383e+02 +2150 2010 -1.347481526436478e+02 +2150 2011 -1.555580782497810e+02 +2150 2012 -1.851243485745373e+02 +2150 2013 -2.231981844606894e+02 +2150 2014 -2.663884709281895e+02 +2150 2015 -3.063876713483004e+02 +2150 2016 -3.311617365195747e+02 +2151 2008 -1.097534196790493e+02 +2151 2009 -1.155304899028561e+02 +2151 2010 -1.275984131219179e+02 +2151 2011 -1.468355065336023e+02 +2151 2012 -1.740274317161707e+02 +2151 2013 -2.088271183655457e+02 +2151 2014 -2.480403651673271e+02 +2151 2015 -2.841326260213855e+02 +2151 2016 -3.063876713483004e+02 +2152 2080 -1.733190400658708e+03 +2152 2081 -1.877824568765017e+03 +2152 2082 -2.199157547087201e+03 +2152 2083 -2.767706810094291e+03 +2152 2084 -3.699147964795180e+03 +2152 2085 -5.136224430633882e+03 +2152 2086 -7.138491575686282e+03 +2152 2087 -9.405703259334639e+03 +2152 2088 -1.103972130715926e+04 +2152 2215 -1.733190400658708e+03 +2152 2216 -1.603684467943633e+03 +2152 2217 -1.394551574360510e+03 +2152 2218 -1.168677565678393e+03 +2152 2219 -9.695072463564434e+02 +2152 2220 -8.148024630667926e+02 +2152 2221 -7.058924559832867e+02 +2152 2222 -6.378158089920671e+02 +2152 2223 -6.052974323170196e+02 +2152 2242 -6.289529049931513e+02 +2152 2243 -5.970589583440825e+02 +2152 2244 -5.429674662554822e+02 +2152 2245 -4.803677035258846e+02 +2152 2246 -4.208084537187713e+02 +2152 2247 -3.710963518270331e+02 +2152 2248 -3.339204550667988e+02 +2152 2249 -3.096178268240465e+02 +2152 2250 -2.976873911031298e+02 +2153 2080 -1.603684467943633e+03 +2153 2081 -1.733190400658708e+03 +2153 2082 -2.019368486704435e+03 +2153 2083 -2.521021940438000e+03 +2153 2084 -3.331754877699595e+03 +2153 2085 -4.560278038130823e+03 +2153 2086 -6.235592529048601e+03 +2153 2087 -8.091232579773156e+03 +2153 2088 -9.405703259334639e+03 +2153 2215 -1.877824568765017e+03 +2153 2216 -1.733190400658708e+03 +2153 2217 -1.500725861549673e+03 +2153 2218 -1.251286952144484e+03 +2153 2219 -1.032880208377977e+03 +2153 2220 -8.643348602446076e+02 +2153 2221 -7.463158073460687e+02 +2153 2222 -6.728335244699299e+02 +2153 2223 -6.378158089920671e+02 +2153 2242 -6.632839990295113e+02 +2153 2243 -6.289529049931513e+02 +2153 2244 -5.708523475060541e+02 +2153 2245 -5.038180997021789e+02 +2153 2246 -4.402579127124382e+02 +2153 2247 -3.873813675510144e+02 +2153 2248 -3.479505460244110e+02 +2153 2249 -3.222285372305477e+02 +2153 2250 -3.096178268240465e+02 +2154 2080 -1.394551574360510e+03 +2154 2081 -1.500725861549673e+03 +2154 2082 -1.733190400658708e+03 +2154 2083 -2.134265778758326e+03 +2154 2084 -2.767706810094291e+03 +2154 2085 -3.699147964795180e+03 +2154 2086 -4.925216936196723e+03 +2154 2087 -6.235592529048601e+03 +2154 2088 -7.138491575686282e+03 +2154 2215 -2.199157547087201e+03 +2154 2216 -2.019368486704435e+03 +2154 2217 -1.733190400658708e+03 +2154 2218 -1.430197816180122e+03 +2154 2219 -1.168677565678393e+03 +2154 2220 -9.695072463564434e+02 +2154 2221 -8.315436028021828e+02 +2154 2222 -7.463158073460687e+02 +2154 2223 -7.058924559832867e+02 +2154 2242 -7.352796046183681e+02 +2154 2243 -6.956816209337401e+02 +2154 2244 -6.289529049931513e+02 +2154 2245 -5.524312223207850e+02 +2154 2246 -4.803677035258846e+02 +2154 2247 -4.208084537187713e+02 +2154 2248 -3.766415408901786e+02 +2154 2249 -3.479505460244110e+02 +2154 2250 -3.339204550667988e+02 +2155 2080 -1.168677565678393e+03 +2155 2081 -1.251286952144484e+03 +2155 2082 -1.430197816180122e+03 +2155 2083 -1.733190400658708e+03 +2155 2084 -2.199157547087201e+03 +2155 2085 -2.861294172280346e+03 +2155 2086 -3.699147964795180e+03 +2155 2087 -4.560278038130823e+03 +2155 2088 -5.136224430633882e+03 +2155 2215 -2.767706810094291e+03 +2155 2216 -2.521021940438000e+03 +2155 2217 -2.134265778758326e+03 +2155 2218 -1.733190400658708e+03 +2155 2219 -1.394551574360510e+03 +2155 2220 -1.141773184361042e+03 +2155 2221 -9.695072463564434e+02 +2155 2222 -8.643348602446076e+02 +2155 2223 -8.148024630667926e+02 +2155 2242 -8.507888885505199e+02 +2155 2243 -8.023274760830675e+02 +2155 2244 -7.211778000851799e+02 +2155 2245 -6.289529049931513e+02 +2155 2246 -5.429674662554822e+02 +2155 2247 -4.725808574370885e+02 +2155 2248 -4.208084537187713e+02 +2155 2249 -3.873813675510144e+02 +2155 2250 -3.710963518270331e+02 +2156 2080 -9.695072463564434e+02 +2156 2081 -1.032880208377977e+03 +2156 2082 -1.168677565678393e+03 +2156 2083 -1.394551574360510e+03 +2156 2084 -1.733190400658708e+03 +2156 2085 -2.199157547087201e+03 +2156 2086 -2.767706810094291e+03 +2156 2087 -3.331754877699595e+03 +2156 2088 -3.699147964795180e+03 +2156 2215 -3.699147964795180e+03 +2156 2216 -3.331754877699595e+03 +2156 2217 -2.767706810094291e+03 +2156 2218 -2.199157547087201e+03 +2156 2219 -1.733190400658708e+03 +2156 2220 -1.394551574360510e+03 +2156 2221 -1.168677565678393e+03 +2156 2222 -1.032880208377977e+03 +2156 2223 -9.695072463564434e+02 +2156 2242 -1.015511306612467e+03 +2156 2243 -9.536070604341750e+02 +2156 2244 -8.507888885505199e+02 +2156 2245 -7.352796046183681e+02 +2156 2246 -6.289529049931513e+02 +2156 2247 -5.429674662554822e+02 +2156 2248 -4.803677035258846e+02 +2156 2249 -4.402579127124382e+02 +2156 2250 -4.208084537187713e+02 +2157 2080 -8.148024630667926e+02 +2157 2081 -8.643348602446076e+02 +2157 2082 -9.695072463564434e+02 +2157 2083 -1.141773184361042e+03 +2157 2084 -1.394551574360510e+03 +2157 2085 -1.733190400658708e+03 +2157 2086 -2.134265778758326e+03 +2157 2087 -2.521021940438000e+03 +2157 2088 -2.767706810094291e+03 +2157 2215 -5.136224430633882e+03 +2157 2216 -4.560278038130823e+03 +2157 2217 -3.699147964795180e+03 +2157 2218 -2.861294172280346e+03 +2157 2219 -2.199157547087201e+03 +2157 2220 -1.733190400658708e+03 +2157 2221 -1.430197816180122e+03 +2157 2222 -1.251286952144484e+03 +2157 2223 -1.168677565678393e+03 +2157 2242 -1.228588660544053e+03 +2157 2243 -1.148042053110080e+03 +2157 2244 -1.015511306612467e+03 +2157 2245 -8.685786765383800e+02 +2157 2246 -7.352796046183681e+02 +2157 2247 -6.289529049931513e+02 +2157 2248 -5.524312223207850e+02 +2157 2249 -5.038180997021789e+02 +2157 2250 -4.803677035258846e+02 +2158 2080 -7.058924559832867e+02 +2158 2081 -7.463158073460687e+02 +2158 2082 -8.315436028021828e+02 +2158 2083 -9.695072463564434e+02 +2158 2084 -1.168677565678393e+03 +2158 2085 -1.430197816180122e+03 +2158 2086 -1.733190400658708e+03 +2158 2087 -2.019368486704435e+03 +2158 2088 -2.199157547087201e+03 +2158 2215 -7.138491575686282e+03 +2158 2216 -6.235592529048601e+03 +2158 2217 -4.925216936196723e+03 +2158 2218 -3.699147964795180e+03 +2158 2219 -2.767706810094291e+03 +2158 2220 -2.134265778758326e+03 +2158 2221 -1.733190400658708e+03 +2158 2222 -1.500725861549673e+03 +2158 2223 -1.394551574360510e+03 +2158 2242 -1.471477730866027e+03 +2158 2243 -1.368148367306964e+03 +2158 2244 -1.199743197084304e+03 +2158 2245 -1.015511306612467e+03 +2158 2246 -8.507888885505199e+02 +2158 2247 -7.211778000851799e+02 +2158 2248 -6.289529049931513e+02 +2158 2249 -5.708523475060541e+02 +2158 2250 -5.429674662554822e+02 +2159 2080 -6.378158089920671e+02 +2159 2081 -6.728335244699299e+02 +2159 2082 -7.463158073460687e+02 +2159 2083 -8.643348602446076e+02 +2159 2084 -1.032880208377977e+03 +2159 2085 -1.251286952144484e+03 +2159 2086 -1.500725861549673e+03 +2159 2087 -1.733190400658708e+03 +2159 2088 -1.877824568765017e+03 +2159 2215 -9.405703259334639e+03 +2159 2216 -8.091232579773156e+03 +2159 2217 -6.235592529048601e+03 +2159 2218 -4.560278038130823e+03 +2159 2219 -3.331754877699595e+03 +2159 2220 -2.521021940438000e+03 +2159 2221 -2.019368486704435e+03 +2159 2222 -1.733190400658708e+03 +2159 2223 -1.603684467943633e+03 +2159 2242 -1.697437739078449e+03 +2159 2243 -1.571600895131404e+03 +2159 2244 -1.368148367306964e+03 +2159 2245 -1.148042053110080e+03 +2159 2246 -9.536070604341750e+02 +2159 2247 -8.023274760830675e+02 +2159 2248 -6.956816209337401e+02 +2159 2249 -6.289529049931513e+02 +2159 2250 -5.970589583440825e+02 +2160 2080 -6.052974323170196e+02 +2160 2081 -6.378158089920671e+02 +2160 2082 -7.058924559832867e+02 +2160 2083 -8.148024630667926e+02 +2160 2084 -9.695072463564434e+02 +2160 2085 -1.168677565678393e+03 +2160 2086 -1.394551574360510e+03 +2160 2087 -1.603684467943633e+03 +2160 2088 -1.733190400658708e+03 +2160 2215 -1.103972130715926e+04 +2160 2216 -9.405703259334639e+03 +2160 2217 -7.138491575686282e+03 +2160 2218 -5.136224430633882e+03 +2160 2219 -3.699147964795180e+03 +2160 2220 -2.767706810094291e+03 +2160 2221 -2.199157547087201e+03 +2160 2222 -1.877824568765017e+03 +2160 2223 -1.733190400658708e+03 +2160 2242 -1.837845240586539e+03 +2160 2243 -1.697437739078449e+03 +2160 2244 -1.471477730866027e+03 +2160 2245 -1.228588660544053e+03 +2160 2246 -1.015511306612467e+03 +2160 2247 -8.507888885505199e+02 +2160 2248 -7.352796046183681e+02 +2160 2249 -6.632839990295113e+02 +2160 2250 -6.289529049931513e+02 +2179 2080 -6.289529049931513e+02 +2179 2081 -6.632839990295113e+02 +2179 2082 -7.352796046183681e+02 +2179 2083 -8.507888885505199e+02 +2179 2084 -1.015511306612467e+03 +2179 2085 -1.228588660544053e+03 +2179 2086 -1.471477730866027e+03 +2179 2087 -1.697437739078449e+03 +2179 2088 -1.837845240586539e+03 +2179 2107 -1.733190400658708e+03 +2179 2108 -1.877824568765017e+03 +2179 2109 -2.199157547087201e+03 +2179 2110 -2.767706810094291e+03 +2179 2111 -3.699147964795180e+03 +2179 2112 -5.136224430633882e+03 +2179 2113 -7.138491575686282e+03 +2179 2114 -9.405703259334639e+03 +2179 2115 -1.103972130715926e+04 +2179 2242 -1.733190400658708e+03 +2179 2243 -1.603684467943633e+03 +2179 2244 -1.394551574360510e+03 +2179 2245 -1.168677565678393e+03 +2179 2246 -9.695072463564434e+02 +2179 2247 -8.148024630667926e+02 +2179 2248 -7.058924559832867e+02 +2179 2249 -6.378158089920671e+02 +2179 2250 -6.052974323170196e+02 +2180 2080 -5.970589583440825e+02 +2180 2081 -6.289529049931513e+02 +2180 2082 -6.956816209337401e+02 +2180 2083 -8.023274760830675e+02 +2180 2084 -9.536070604341750e+02 +2180 2085 -1.148042053110080e+03 +2180 2086 -1.368148367306964e+03 +2180 2087 -1.571600895131404e+03 +2180 2088 -1.697437739078449e+03 +2180 2107 -1.603684467943633e+03 +2180 2108 -1.733190400658708e+03 +2180 2109 -2.019368486704435e+03 +2180 2110 -2.521021940438000e+03 +2180 2111 -3.331754877699595e+03 +2180 2112 -4.560278038130823e+03 +2180 2113 -6.235592529048601e+03 +2180 2114 -8.091232579773156e+03 +2180 2115 -9.405703259334639e+03 +2180 2242 -1.877824568765017e+03 +2180 2243 -1.733190400658708e+03 +2180 2244 -1.500725861549673e+03 +2180 2245 -1.251286952144484e+03 +2180 2246 -1.032880208377977e+03 +2180 2247 -8.643348602446076e+02 +2180 2248 -7.463158073460687e+02 +2180 2249 -6.728335244699299e+02 +2180 2250 -6.378158089920671e+02 +2181 2080 -5.429674662554822e+02 +2181 2081 -5.708523475060541e+02 +2181 2082 -6.289529049931513e+02 +2181 2083 -7.211778000851799e+02 +2181 2084 -8.507888885505199e+02 +2181 2085 -1.015511306612467e+03 +2181 2086 -1.199743197084304e+03 +2181 2087 -1.368148367306964e+03 +2181 2088 -1.471477730866027e+03 +2181 2107 -1.394551574360510e+03 +2181 2108 -1.500725861549673e+03 +2181 2109 -1.733190400658708e+03 +2181 2110 -2.134265778758326e+03 +2181 2111 -2.767706810094291e+03 +2181 2112 -3.699147964795180e+03 +2181 2113 -4.925216936196723e+03 +2181 2114 -6.235592529048601e+03 +2181 2115 -7.138491575686282e+03 +2181 2242 -2.199157547087201e+03 +2181 2243 -2.019368486704435e+03 +2181 2244 -1.733190400658708e+03 +2181 2245 -1.430197816180122e+03 +2181 2246 -1.168677565678393e+03 +2181 2247 -9.695072463564434e+02 +2181 2248 -8.315436028021828e+02 +2181 2249 -7.463158073460687e+02 +2181 2250 -7.058924559832867e+02 +2182 2080 -4.803677035258846e+02 +2182 2081 -5.038180997021789e+02 +2182 2082 -5.524312223207850e+02 +2182 2083 -6.289529049931513e+02 +2182 2084 -7.352796046183681e+02 +2182 2085 -8.685786765383800e+02 +2182 2086 -1.015511306612467e+03 +2182 2087 -1.148042053110080e+03 +2182 2088 -1.228588660544053e+03 +2182 2107 -1.168677565678393e+03 +2182 2108 -1.251286952144484e+03 +2182 2109 -1.430197816180122e+03 +2182 2110 -1.733190400658708e+03 +2182 2111 -2.199157547087201e+03 +2182 2112 -2.861294172280346e+03 +2182 2113 -3.699147964795180e+03 +2182 2114 -4.560278038130823e+03 +2182 2115 -5.136224430633882e+03 +2182 2242 -2.767706810094291e+03 +2182 2243 -2.521021940438000e+03 +2182 2244 -2.134265778758326e+03 +2182 2245 -1.733190400658708e+03 +2182 2246 -1.394551574360510e+03 +2182 2247 -1.141773184361042e+03 +2182 2248 -9.695072463564434e+02 +2182 2249 -8.643348602446076e+02 +2182 2250 -8.148024630667926e+02 +2183 2080 -4.208084537187713e+02 +2183 2081 -4.402579127124382e+02 +2183 2082 -4.803677035258846e+02 +2183 2083 -5.429674662554822e+02 +2183 2084 -6.289529049931513e+02 +2183 2085 -7.352796046183681e+02 +2183 2086 -8.507888885505199e+02 +2183 2087 -9.536070604341750e+02 +2183 2088 -1.015511306612467e+03 +2183 2107 -9.695072463564434e+02 +2183 2108 -1.032880208377977e+03 +2183 2109 -1.168677565678393e+03 +2183 2110 -1.394551574360510e+03 +2183 2111 -1.733190400658708e+03 +2183 2112 -2.199157547087201e+03 +2183 2113 -2.767706810094291e+03 +2183 2114 -3.331754877699595e+03 +2183 2115 -3.699147964795180e+03 +2183 2242 -3.699147964795180e+03 +2183 2243 -3.331754877699595e+03 +2183 2244 -2.767706810094291e+03 +2183 2245 -2.199157547087201e+03 +2183 2246 -1.733190400658708e+03 +2183 2247 -1.394551574360510e+03 +2183 2248 -1.168677565678393e+03 +2183 2249 -1.032880208377977e+03 +2183 2250 -9.695072463564434e+02 +2184 2080 -3.710963518270331e+02 +2184 2081 -3.873813675510144e+02 +2184 2082 -4.208084537187713e+02 +2184 2083 -4.725808574370885e+02 +2184 2084 -5.429674662554822e+02 +2184 2085 -6.289529049931513e+02 +2184 2086 -7.211778000851799e+02 +2184 2087 -8.023274760830675e+02 +2184 2088 -8.507888885505199e+02 +2184 2107 -8.148024630667926e+02 +2184 2108 -8.643348602446076e+02 +2184 2109 -9.695072463564434e+02 +2184 2110 -1.141773184361042e+03 +2184 2111 -1.394551574360510e+03 +2184 2112 -1.733190400658708e+03 +2184 2113 -2.134265778758326e+03 +2184 2114 -2.521021940438000e+03 +2184 2115 -2.767706810094291e+03 +2184 2242 -5.136224430633882e+03 +2184 2243 -4.560278038130823e+03 +2184 2244 -3.699147964795180e+03 +2184 2245 -2.861294172280346e+03 +2184 2246 -2.199157547087201e+03 +2184 2247 -1.733190400658708e+03 +2184 2248 -1.430197816180122e+03 +2184 2249 -1.251286952144484e+03 +2184 2250 -1.168677565678393e+03 +2185 2080 -3.339204550667988e+02 +2185 2081 -3.479505460244110e+02 +2185 2082 -3.766415408901786e+02 +2185 2083 -4.208084537187713e+02 +2185 2084 -4.803677035258846e+02 +2185 2085 -5.524312223207850e+02 +2185 2086 -6.289529049931513e+02 +2185 2087 -6.956816209337401e+02 +2185 2088 -7.352796046183681e+02 +2185 2107 -7.058924559832867e+02 +2185 2108 -7.463158073460687e+02 +2185 2109 -8.315436028021828e+02 +2185 2110 -9.695072463564434e+02 +2185 2111 -1.168677565678393e+03 +2185 2112 -1.430197816180122e+03 +2185 2113 -1.733190400658708e+03 +2185 2114 -2.019368486704435e+03 +2185 2115 -2.199157547087201e+03 +2185 2242 -7.138491575686282e+03 +2185 2243 -6.235592529048601e+03 +2185 2244 -4.925216936196723e+03 +2185 2245 -3.699147964795180e+03 +2185 2246 -2.767706810094291e+03 +2185 2247 -2.134265778758326e+03 +2185 2248 -1.733190400658708e+03 +2185 2249 -1.500725861549673e+03 +2185 2250 -1.394551574360510e+03 +2186 2080 -3.096178268240465e+02 +2186 2081 -3.222285372305477e+02 +2186 2082 -3.479505460244110e+02 +2186 2083 -3.873813675510144e+02 +2186 2084 -4.402579127124382e+02 +2186 2085 -5.038180997021789e+02 +2186 2086 -5.708523475060541e+02 +2186 2087 -6.289529049931513e+02 +2186 2088 -6.632839990295113e+02 +2186 2107 -6.378158089920671e+02 +2186 2108 -6.728335244699299e+02 +2186 2109 -7.463158073460687e+02 +2186 2110 -8.643348602446076e+02 +2186 2111 -1.032880208377977e+03 +2186 2112 -1.251286952144484e+03 +2186 2113 -1.500725861549673e+03 +2186 2114 -1.733190400658708e+03 +2186 2115 -1.877824568765017e+03 +2186 2242 -9.405703259334639e+03 +2186 2243 -8.091232579773156e+03 +2186 2244 -6.235592529048601e+03 +2186 2245 -4.560278038130823e+03 +2186 2246 -3.331754877699595e+03 +2186 2247 -2.521021940438000e+03 +2186 2248 -2.019368486704435e+03 +2186 2249 -1.733190400658708e+03 +2186 2250 -1.603684467943633e+03 +2187 2080 -2.976873911031298e+02 +2187 2081 -3.096178268240465e+02 +2187 2082 -3.339204550667988e+02 +2187 2083 -3.710963518270331e+02 +2187 2084 -4.208084537187713e+02 +2187 2085 -4.803677035258846e+02 +2187 2086 -5.429674662554822e+02 +2187 2087 -5.970589583440825e+02 +2187 2088 -6.289529049931513e+02 +2187 2107 -6.052974323170196e+02 +2187 2108 -6.378158089920671e+02 +2187 2109 -7.058924559832867e+02 +2187 2110 -8.148024630667926e+02 +2187 2111 -9.695072463564434e+02 +2187 2112 -1.168677565678393e+03 +2187 2113 -1.394551574360510e+03 +2187 2114 -1.603684467943633e+03 +2187 2115 -1.733190400658708e+03 +2187 2242 -1.103972130715926e+04 +2187 2243 -9.405703259334639e+03 +2187 2244 -7.138491575686282e+03 +2187 2245 -5.136224430633882e+03 +2187 2246 -3.699147964795180e+03 +2187 2247 -2.767706810094291e+03 +2187 2248 -2.199157547087201e+03 +2187 2249 -1.877824568765017e+03 +2187 2250 -1.733190400658708e+03 +2206 2008 -1.111842160419089e+02 +2206 2009 -1.170681125153376e+02 +2206 2010 -1.293661657908652e+02 +2206 2011 -1.489885081652992e+02 +2206 2012 -1.767605489846857e+02 +2206 2013 -2.123577731150849e+02 +2206 2014 -2.525366109215767e+02 +2206 2015 -2.895745815575320e+02 +2206 2016 -3.124380547854544e+02 +2206 2071 -3.063876713483004e+02 +2206 2072 -3.311617365195747e+02 +2206 2073 -3.859179776157605e+02 +2206 2074 -4.819366867771664e+02 +2206 2075 -6.371952057562402e+02 +2206 2076 -8.726231103602357e+02 +2206 2077 -1.193932486839834e+03 +2206 2078 -1.550121445008505e+03 +2206 2079 -1.802596433195456e+03 +2207 2008 -1.057061586526018e+02 +2207 2009 -1.111842160419089e+02 +2207 2010 -1.226088998409724e+02 +2207 2011 -1.407716848553628e+02 +2207 2012 -1.663510232448633e+02 +2207 2013 -1.989422168423268e+02 +2207 2014 -2.354925657825773e+02 +2207 2015 -2.689865983609317e+02 +2207 2016 -2.895745815575320e+02 +2207 2071 -2.841326260213855e+02 +2207 2072 -3.063876713483004e+02 +2207 2073 -3.553280674768354e+02 +2207 2074 -4.404031329187411e+02 +2207 2075 -5.762343277298867e+02 +2207 2076 -7.788097592344268e+02 +2207 2077 -1.049909849375148e+03 +2207 2078 -1.344510568096302e+03 +2207 2079 -1.550121445008505e+03 +2208 2008 -9.638822517401589e+01 +2208 2009 -1.011961191083175e+02 +2208 2010 -1.111842160419089e+02 +2208 2011 -1.269615920628681e+02 +2208 2012 -1.489885081652992e+02 +2208 2013 -1.767605489846857e+02 +2208 2014 -2.075588680195229e+02 +2208 2015 -2.354925657825773e+02 +2208 2016 -2.525366109215767e+02 +2208 2071 -2.480403651673271e+02 +2208 2072 -2.663884709281895e+02 +2208 2073 -3.063876713483004e+02 +2208 2074 -3.748904053829385e+02 +2208 2075 -4.819366867771664e+02 +2208 2076 -6.371952057562402e+02 +2208 2077 -8.383319685358435e+02 +2208 2078 -1.049909849375148e+03 +2208 2079 -1.193932486839834e+03 +2209 2008 -8.555928471614156e+01 +2209 2009 -8.962181586287889e+01 +2209 2010 -9.802102195827720e+01 +2209 2011 -1.111842160419089e+02 +2209 2012 -1.293661657908652e+02 +2209 2013 -1.519993633210930e+02 +2209 2014 -1.767605489846857e+02 +2209 2015 -1.989422168423268e+02 +2209 2016 -2.123577731150849e+02 +2209 2071 -2.088271183655457e+02 +2209 2072 -2.231981844606894e+02 +2209 2073 -2.542062119667738e+02 +2209 2074 -3.063876713483004e+02 +2209 2075 -3.859179776157605e+02 +2209 2076 -4.976453857371607e+02 +2209 2077 -6.371952057562402e+02 +2209 2078 -7.788097592344268e+02 +2209 2079 -8.726231103602357e+02 +2210 2008 -7.520762033775921e+01 +2210 2009 -7.859349409841370e+01 +2210 2010 -8.555928471614156e+01 +2210 2011 -9.638822517401589e+01 +2210 2012 -1.111842160419089e+02 +2210 2013 -1.293661657908652e+02 +2210 2014 -1.489885081652992e+02 +2210 2015 -1.663510232448633e+02 +2210 2016 -1.767605489846857e+02 +2210 2071 -1.740274317161707e+02 +2210 2072 -1.851243485745373e+02 +2210 2073 -2.088271183655457e+02 +2210 2074 -2.480403651673271e+02 +2210 2075 -3.063876713483004e+02 +2210 2076 -3.859179776157605e+02 +2210 2077 -4.819366867771664e+02 +2210 2078 -5.762343277298867e+02 +2210 2079 -6.371952057562402e+02 +2211 2008 -6.652797451218323e+01 +2211 2009 -6.937545782864687e+01 +2211 2010 -7.520762033775921e+01 +2211 2011 -8.420868002944904e+01 +2211 2012 -9.638822517401589e+01 +2211 2013 -1.111842160419089e+02 +2211 2014 -1.269615920628681e+02 +2211 2015 -1.407716848553628e+02 +2211 2016 -1.489885081652992e+02 +2211 2071 -1.468355065336023e+02 +2211 2072 -1.555580782497810e+02 +2211 2073 -1.740274317161707e+02 +2211 2074 -2.041390437321793e+02 +2211 2075 -2.480403651673271e+02 +2211 2076 -3.063876713483004e+02 +2211 2077 -3.748904053829385e+02 +2211 2078 -4.404031329187411e+02 +2211 2079 -4.819366867771664e+02 +2212 2008 -6.001174723167335e+01 +2212 2009 -6.247361649834824e+01 +2212 2010 -6.749803222962952e+01 +2212 2011 -7.520762033775921e+01 +2212 2012 -8.555928471614156e+01 +2212 2013 -9.802102195827720e+01 +2212 2014 -1.111842160419089e+02 +2212 2015 -1.226088998409724e+02 +2212 2016 -1.293661657908652e+02 +2212 2071 -1.275984131219179e+02 +2212 2072 -1.347481526436478e+02 +2212 2073 -1.497853840269160e+02 +2212 2074 -1.740274317161707e+02 +2212 2075 -2.088271183655457e+02 +2212 2076 -2.542062119667738e+02 +2212 2077 -3.063876713483004e+02 +2212 2078 -3.553280674768354e+02 +2212 2079 -3.859179776157605e+02 +2213 2008 -5.573941364116940e+01 +2213 2009 -5.795761808209202e+01 +2213 2010 -6.247361649834824e+01 +2213 2011 -6.937545782864687e+01 +2213 2012 -7.859349409841370e+01 +2213 2013 -8.962181586287889e+01 +2213 2014 -1.011961191083175e+02 +2213 2015 -1.111842160419089e+02 +2213 2016 -1.170681125153376e+02 +2213 2071 -1.155304899028561e+02 +2213 2072 -1.217424124188383e+02 +2213 2073 -1.347481526436478e+02 +2213 2074 -1.555580782497810e+02 +2213 2075 -1.851243485745373e+02 +2213 2076 -2.231981844606894e+02 +2213 2077 -2.663884709281895e+02 +2213 2078 -3.063876713483004e+02 +2213 2079 -3.311617365195747e+02 +2214 2008 -5.363826960242956e+01 +2214 2009 -5.573941364116940e+01 +2214 2010 -6.001174723167335e+01 +2214 2011 -6.652797451218323e+01 +2214 2012 -7.520762033775921e+01 +2214 2013 -8.555928471614156e+01 +2214 2014 -9.638822517401589e+01 +2214 2015 -1.057061586526018e+02 +2214 2016 -1.111842160419089e+02 +2214 2071 -1.097534196790493e+02 +2214 2072 -1.155304899028561e+02 +2214 2073 -1.275984131219179e+02 +2214 2074 -1.468355065336023e+02 +2214 2075 -1.740274317161707e+02 +2214 2076 -2.088271183655457e+02 +2214 2077 -2.480403651673271e+02 +2214 2078 -2.841326260213855e+02 +2214 2079 -3.063876713483004e+02 +2215 2152 -1.733190400658708e+03 +2215 2153 -1.877824568765017e+03 +2215 2154 -2.199157547087201e+03 +2215 2155 -2.767706810094291e+03 +2215 2156 -3.699147964795180e+03 +2215 2157 -5.136224430633882e+03 +2215 2158 -7.138491575686282e+03 +2215 2159 -9.405703259334639e+03 +2215 2160 -1.103972130715926e+04 +2216 2152 -1.603684467943633e+03 +2216 2153 -1.733190400658708e+03 +2216 2154 -2.019368486704435e+03 +2216 2155 -2.521021940438000e+03 +2216 2156 -3.331754877699595e+03 +2216 2157 -4.560278038130823e+03 +2216 2158 -6.235592529048601e+03 +2216 2159 -8.091232579773156e+03 +2216 2160 -9.405703259334639e+03 +2217 2152 -1.394551574360510e+03 +2217 2153 -1.500725861549673e+03 +2217 2154 -1.733190400658708e+03 +2217 2155 -2.134265778758326e+03 +2217 2156 -2.767706810094291e+03 +2217 2157 -3.699147964795180e+03 +2217 2158 -4.925216936196723e+03 +2217 2159 -6.235592529048601e+03 +2217 2160 -7.138491575686282e+03 +2218 2152 -1.168677565678393e+03 +2218 2153 -1.251286952144484e+03 +2218 2154 -1.430197816180122e+03 +2218 2155 -1.733190400658708e+03 +2218 2156 -2.199157547087201e+03 +2218 2157 -2.861294172280346e+03 +2218 2158 -3.699147964795180e+03 +2218 2159 -4.560278038130823e+03 +2218 2160 -5.136224430633882e+03 +2219 2152 -9.695072463564434e+02 +2219 2153 -1.032880208377977e+03 +2219 2154 -1.168677565678393e+03 +2219 2155 -1.394551574360510e+03 +2219 2156 -1.733190400658708e+03 +2219 2157 -2.199157547087201e+03 +2219 2158 -2.767706810094291e+03 +2219 2159 -3.331754877699595e+03 +2219 2160 -3.699147964795180e+03 +2220 2152 -8.148024630667926e+02 +2220 2153 -8.643348602446076e+02 +2220 2154 -9.695072463564434e+02 +2220 2155 -1.141773184361042e+03 +2220 2156 -1.394551574360510e+03 +2220 2157 -1.733190400658708e+03 +2220 2158 -2.134265778758326e+03 +2220 2159 -2.521021940438000e+03 +2220 2160 -2.767706810094291e+03 +2221 2152 -7.058924559832867e+02 +2221 2153 -7.463158073460687e+02 +2221 2154 -8.315436028021828e+02 +2221 2155 -9.695072463564434e+02 +2221 2156 -1.168677565678393e+03 +2221 2157 -1.430197816180122e+03 +2221 2158 -1.733190400658708e+03 +2221 2159 -2.019368486704435e+03 +2221 2160 -2.199157547087201e+03 +2222 2152 -6.378158089920671e+02 +2222 2153 -6.728335244699299e+02 +2222 2154 -7.463158073460687e+02 +2222 2155 -8.643348602446076e+02 +2222 2156 -1.032880208377977e+03 +2222 2157 -1.251286952144484e+03 +2222 2158 -1.500725861549673e+03 +2222 2159 -1.733190400658708e+03 +2222 2160 -1.877824568765017e+03 +2223 2152 -6.052974323170196e+02 +2223 2153 -6.378158089920671e+02 +2223 2154 -7.058924559832867e+02 +2223 2155 -8.148024630667926e+02 +2223 2156 -9.695072463564434e+02 +2223 2157 -1.168677565678393e+03 +2223 2158 -1.394551574360510e+03 +2223 2159 -1.603684467943633e+03 +2223 2160 -1.733190400658708e+03 +2242 2152 -6.289529049931513e+02 +2242 2153 -6.632839990295113e+02 +2242 2154 -7.352796046183681e+02 +2242 2155 -8.507888885505199e+02 +2242 2156 -1.015511306612467e+03 +2242 2157 -1.228588660544053e+03 +2242 2158 -1.471477730866027e+03 +2242 2159 -1.697437739078449e+03 +2242 2160 -1.837845240586539e+03 +2242 2179 -1.733190400658708e+03 +2242 2180 -1.877824568765017e+03 +2242 2181 -2.199157547087201e+03 +2242 2182 -2.767706810094291e+03 +2242 2183 -3.699147964795180e+03 +2242 2184 -5.136224430633882e+03 +2242 2185 -7.138491575686282e+03 +2242 2186 -9.405703259334639e+03 +2242 2187 -1.103972130715926e+04 +2243 2152 -5.970589583440825e+02 +2243 2153 -6.289529049931513e+02 +2243 2154 -6.956816209337401e+02 +2243 2155 -8.023274760830675e+02 +2243 2156 -9.536070604341750e+02 +2243 2157 -1.148042053110080e+03 +2243 2158 -1.368148367306964e+03 +2243 2159 -1.571600895131404e+03 +2243 2160 -1.697437739078449e+03 +2243 2179 -1.603684467943633e+03 +2243 2180 -1.733190400658708e+03 +2243 2181 -2.019368486704435e+03 +2243 2182 -2.521021940438000e+03 +2243 2183 -3.331754877699595e+03 +2243 2184 -4.560278038130823e+03 +2243 2185 -6.235592529048601e+03 +2243 2186 -8.091232579773156e+03 +2243 2187 -9.405703259334639e+03 +2244 2152 -5.429674662554822e+02 +2244 2153 -5.708523475060541e+02 +2244 2154 -6.289529049931513e+02 +2244 2155 -7.211778000851799e+02 +2244 2156 -8.507888885505199e+02 +2244 2157 -1.015511306612467e+03 +2244 2158 -1.199743197084304e+03 +2244 2159 -1.368148367306964e+03 +2244 2160 -1.471477730866027e+03 +2244 2179 -1.394551574360510e+03 +2244 2180 -1.500725861549673e+03 +2244 2181 -1.733190400658708e+03 +2244 2182 -2.134265778758326e+03 +2244 2183 -2.767706810094291e+03 +2244 2184 -3.699147964795180e+03 +2244 2185 -4.925216936196723e+03 +2244 2186 -6.235592529048601e+03 +2244 2187 -7.138491575686282e+03 +2245 2152 -4.803677035258846e+02 +2245 2153 -5.038180997021789e+02 +2245 2154 -5.524312223207850e+02 +2245 2155 -6.289529049931513e+02 +2245 2156 -7.352796046183681e+02 +2245 2157 -8.685786765383800e+02 +2245 2158 -1.015511306612467e+03 +2245 2159 -1.148042053110080e+03 +2245 2160 -1.228588660544053e+03 +2245 2179 -1.168677565678393e+03 +2245 2180 -1.251286952144484e+03 +2245 2181 -1.430197816180122e+03 +2245 2182 -1.733190400658708e+03 +2245 2183 -2.199157547087201e+03 +2245 2184 -2.861294172280346e+03 +2245 2185 -3.699147964795180e+03 +2245 2186 -4.560278038130823e+03 +2245 2187 -5.136224430633882e+03 +2246 2152 -4.208084537187713e+02 +2246 2153 -4.402579127124382e+02 +2246 2154 -4.803677035258846e+02 +2246 2155 -5.429674662554822e+02 +2246 2156 -6.289529049931513e+02 +2246 2157 -7.352796046183681e+02 +2246 2158 -8.507888885505199e+02 +2246 2159 -9.536070604341750e+02 +2246 2160 -1.015511306612467e+03 +2246 2179 -9.695072463564434e+02 +2246 2180 -1.032880208377977e+03 +2246 2181 -1.168677565678393e+03 +2246 2182 -1.394551574360510e+03 +2246 2183 -1.733190400658708e+03 +2246 2184 -2.199157547087201e+03 +2246 2185 -2.767706810094291e+03 +2246 2186 -3.331754877699595e+03 +2246 2187 -3.699147964795180e+03 +2247 2152 -3.710963518270331e+02 +2247 2153 -3.873813675510144e+02 +2247 2154 -4.208084537187713e+02 +2247 2155 -4.725808574370885e+02 +2247 2156 -5.429674662554822e+02 +2247 2157 -6.289529049931513e+02 +2247 2158 -7.211778000851799e+02 +2247 2159 -8.023274760830675e+02 +2247 2160 -8.507888885505199e+02 +2247 2179 -8.148024630667926e+02 +2247 2180 -8.643348602446076e+02 +2247 2181 -9.695072463564434e+02 +2247 2182 -1.141773184361042e+03 +2247 2183 -1.394551574360510e+03 +2247 2184 -1.733190400658708e+03 +2247 2185 -2.134265778758326e+03 +2247 2186 -2.521021940438000e+03 +2247 2187 -2.767706810094291e+03 +2248 2152 -3.339204550667988e+02 +2248 2153 -3.479505460244110e+02 +2248 2154 -3.766415408901786e+02 +2248 2155 -4.208084537187713e+02 +2248 2156 -4.803677035258846e+02 +2248 2157 -5.524312223207850e+02 +2248 2158 -6.289529049931513e+02 +2248 2159 -6.956816209337401e+02 +2248 2160 -7.352796046183681e+02 +2248 2179 -7.058924559832867e+02 +2248 2180 -7.463158073460687e+02 +2248 2181 -8.315436028021828e+02 +2248 2182 -9.695072463564434e+02 +2248 2183 -1.168677565678393e+03 +2248 2184 -1.430197816180122e+03 +2248 2185 -1.733190400658708e+03 +2248 2186 -2.019368486704435e+03 +2248 2187 -2.199157547087201e+03 +2249 2152 -3.096178268240465e+02 +2249 2153 -3.222285372305477e+02 +2249 2154 -3.479505460244110e+02 +2249 2155 -3.873813675510144e+02 +2249 2156 -4.402579127124382e+02 +2249 2157 -5.038180997021789e+02 +2249 2158 -5.708523475060541e+02 +2249 2159 -6.289529049931513e+02 +2249 2160 -6.632839990295113e+02 +2249 2179 -6.378158089920671e+02 +2249 2180 -6.728335244699299e+02 +2249 2181 -7.463158073460687e+02 +2249 2182 -8.643348602446076e+02 +2249 2183 -1.032880208377977e+03 +2249 2184 -1.251286952144484e+03 +2249 2185 -1.500725861549673e+03 +2249 2186 -1.733190400658708e+03 +2249 2187 -1.877824568765017e+03 +2250 2152 -2.976873911031298e+02 +2250 2153 -3.096178268240465e+02 +2250 2154 -3.339204550667988e+02 +2250 2155 -3.710963518270331e+02 +2250 2156 -4.208084537187713e+02 +2250 2157 -4.803677035258846e+02 +2250 2158 -5.429674662554822e+02 +2250 2159 -5.970589583440825e+02 +2250 2160 -6.289529049931513e+02 +2250 2179 -6.052974323170196e+02 +2250 2180 -6.378158089920671e+02 +2250 2181 -7.058924559832867e+02 +2250 2182 -8.148024630667926e+02 +2250 2183 -9.695072463564434e+02 +2250 2184 -1.168677565678393e+03 +2250 2185 -1.394551574360510e+03 +2250 2186 -1.603684467943633e+03 +2250 2187 -1.733190400658708e+03 diff --git a/packages/muelu/research/caglusa/main.cpp b/packages/muelu/research/caglusa/main.cpp new file mode 100644 index 000000000000..8e70c329f5be --- /dev/null +++ b/packages/muelu/research/caglusa/main.cpp @@ -0,0 +1,438 @@ +// Teuchos +#include +#include + +#include +#include + +#include + +#include + +#ifdef HAVE_MUELU_BELOS +#include +#include +#include +#include +#include // => This header defines Belos::XpetraOp +#include // => This header defines Belos::MueLuOp +#endif + +using Teuchos::RCP; +using Teuchos::rcp; +using Teuchos::rcp_dynamic_cast; + +namespace Tpetra { + + template ::scalar_type, + class LocalOrdinal = typename Tpetra::Operator::local_ordinal_type, + class GlobalOrdinal = typename Tpetra::Operator::global_ordinal_type, + class Node = typename Tpetra::Operator::node_type> + class HierarchicalOperator : public Tpetra::Operator { + + public: + using matrix_type = Tpetra::CrsMatrix; + using vec_type = Tpetra::MultiVector; + using map_type = Tpetra::Map; + + //! @name Constructor/Destructor + //@{ + + //! Constructor + HierarchicalOperator(const RCP >& nearField, + const RCP >& kernelApproximations, + const RCP >& basisMatrix, + std::vector > >& transferMatrices) + : + nearField_(nearField), + kernelApproximations_(kernelApproximations), + basisMatrix_(basisMatrix), + transferMatrices_(transferMatrices) + { + auto map = nearField_->getDomainMap(); + clusterCoeffMap_ = basisMatrix_->getDomainMap(); + TEUCHOS_ASSERT(map->isSameAs(*nearField_->getRangeMap())); + TEUCHOS_ASSERT(map->isSameAs(*basisMatrix->getRangeMap())); + // TEUCHOS_ASSERT(clusterCoeffMap_->isSameAs(*basisMatrix->getDomainMap())); + TEUCHOS_ASSERT(clusterCoeffMap_->isSameAs(*kernelApproximations_->getDomainMap())); + TEUCHOS_ASSERT(clusterCoeffMap_->isSameAs(*kernelApproximations_->getRangeMap())); + TEUCHOS_ASSERT(clusterCoeffMap_->isSameAs(*kernelApproximations_->getRowMap())); + + for (size_t i = 0; iisSameAs(*transferMatrices_[i]->getDomainMap())); + TEUCHOS_ASSERT(clusterCoeffMap_->isSameAs(*transferMatrices_[i]->getRangeMap())); + } + + allocateMemory(1); + } + + //! Returns the Tpetra::Map object associated with the domain of this operator. + Teuchos::RCP > getDomainMap() const { + return nearField_->getDomainMap(); + } + + //! Returns the Tpetra::Map object associated with the range of this operator. + Teuchos::RCP > getRangeMap() const { + return nearField_->getRangeMap(); + } + + //! Returns in Y the result of a Tpetra::Operator applied to a Tpetra::MultiVector X. + /*! + \param[in] X - Tpetra::MultiVector of dimension NumVectors to multiply with matrix. + \param[out] Y -Tpetra::MultiVector of dimension NumVectors containing result. + */ + void apply(const Tpetra::MultiVector& X, + Tpetra::MultiVector& Y, + Teuchos::ETransp mode = Teuchos::NO_TRANS, + Scalar alpha = Teuchos::ScalarTraits::one(), + Scalar beta = Teuchos::ScalarTraits::zero()) const { + const Scalar one = Teuchos::ScalarTraits::one(); + + allocateMemory(X.getNumVectors()); + + // near field + nearField_->apply(X, Y, mode, alpha, beta); + + // auto out = Teuchos::getFancyOStream (Teuchos::rcpFromRef (std::cerr)); + // Y.describe(*out, Teuchos::VERB_EXTREME); + + // upward pass + basisMatrix_->apply(X, *coefficients_, Teuchos::TRANS); + + bool flip = true; + for (int i = Teuchos::as(transferMatrices_.size())-1; i>=0; i--) + if (flip) { + coefficients2_->assign(*coefficients_); + transferMatrices_[i]->apply(*coefficients_, *coefficients2_, Teuchos::NO_TRANS, one, one); + flip = false; + } else { + coefficients_->assign(*coefficients2_); + transferMatrices_[i]->apply(*coefficients2_, *coefficients_, Teuchos::NO_TRANS, one, one); + flip = true; + } + + if (flip) + kernelApproximations_->apply(*coefficients_, *coefficients2_, mode, alpha); + else + kernelApproximations_->apply(*coefficients2_, *coefficients_, mode, alpha); + // coefficients2_->describe(*out, Teuchos::VERB_EXTREME); + + // downward pass + for (size_t i = 0; iassign(*coefficients2_); + transferMatrices_[i]->apply(*coefficients2_, *coefficients_, Teuchos::TRANS, one, one); + flip = false; + } else { + coefficients2_->assign(*coefficients_); + transferMatrices_[i]->apply(*coefficients_, *coefficients2_, Teuchos::TRANS, one, one); + flip = true; + } + if (flip) + basisMatrix_->apply(*coefficients2_, Y, Teuchos::NO_TRANS, one, one); + else + basisMatrix_->apply(*coefficients_, Y, Teuchos::NO_TRANS, one, one); + } + + + RCP > restrict(const RCP& P) { + + RCP temp = rcp(new matrix_type(nearField_->getRowMap(), 0)); + MatrixMatrix::Multiply(*nearField_, false, *P, false, *temp); + RCP newNearField = rcp(new matrix_type(P->getDomainMap(), 0)); + MatrixMatrix::Multiply(*P, true, *temp, false, *newNearField); + + RCP newBasisMatrix = rcp(new matrix_type(P->getDomainMap(), clusterCoeffMap_, 0)); + MatrixMatrix::Multiply(*P, true, *basisMatrix_, false, *newBasisMatrix); + + // auto out = Teuchos::getFancyOStream (Teuchos::rcpFromRef (std::cerr)); + // clusterCoeffMap_->describe(*out, Teuchos::VERB_EXTREME); + // clusterCoeffMap_->getComm()->barrier(); + // newBasisMatrix->getColMap()->describe(*out, Teuchos::VERB_EXTREME); + + return rcp(new HierarchicalOperator(newNearField, kernelApproximations_, newBasisMatrix, transferMatrices_)); + } + + double getCompression() { + size_t nnz = (nearField_->getGlobalNumEntries() + + kernelApproximations_->getGlobalNumEntries() + + basisMatrix_->getGlobalNumEntries()); + for (size_t i = 0; i < transferMatrices_.size(); i++) + nnz += transferMatrices_[i]->getGlobalNumEntries(); + return Teuchos::as(nnz) / (getDomainMap()->getGlobalNumElements()*getDomainMap()->getGlobalNumElements()); + } + + private: + + void allocateMemory(size_t numVectors) const { + if (coefficients_.is_null() || coefficients_->getNumVectors() != numVectors) { + coefficients_ = rcp(new vec_type(clusterCoeffMap_, numVectors)); + coefficients2_ = rcp(new vec_type(clusterCoeffMap_, numVectors)); + } + } + + RCP nearField_; + RCP kernelApproximations_; + RCP basisMatrix_; + std::vector > transferMatrices_; + RCP clusterCoeffMap_; + mutable RCP coefficients_, coefficients2_; + }; + +} + +namespace Xpetra { + + template + class HierarchicalOperator : public Xpetra::Operator { + + public: + using tHOp = Tpetra::HierarchicalOperator; + using map_type = Map; + using vec_type = MultiVector; + using matrix_type = Matrix; + + //! @name Constructor/Destructor + //@{ + + //! Constructor + HierarchicalOperator(const RCP& op) : op_(op) { } + + HierarchicalOperator(const RCP& nearField, + const RCP& kernelApproximations, + const RCP& basisMatrix, + std::vector >& transferMatrices) { + #include "MueLu_UseShortNames.hpp" + + std::vector > tTransferMatrices; + for (size_t i = 0; i(rcp_dynamic_cast(transferMatrices[i])->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(); + tTransferMatrices.push_back(transferT); + } + + op_ = rcp(new tHOp(rcp_dynamic_cast(rcp_dynamic_cast(nearField)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + rcp_dynamic_cast(rcp_dynamic_cast(kernelApproximations)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + rcp_dynamic_cast(rcp_dynamic_cast(basisMatrix)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + tTransferMatrices)); + } + + //! Returns the Tpetra::Map object associated with the domain of this operator. + Teuchos::RCP getDomainMap() const { + return toXpetra(op_->getDomainMap()); + } + + //! Returns the Tpetra::Map object associated with the range of this operator. + Teuchos::RCP getRangeMap() const { + return toXpetra(op_->getRangeMap()); + } + + //! \brief Computes the operator-multivector application. + /*! Loosely, performs \f$Y = \alpha \cdot A^{\textrm{mode}} \cdot X + \beta \cdot Y\f$. However, the details of operation + vary according to the values of \c alpha and \c beta. Specifically + - if beta == 0, apply() must overwrite \c Y, so that any values in \c Y (including NaNs) are ignored. + - if alpha == 0, apply() may short-circuit the operator, so that any values in \c X (including NaNs) are ignored. + */ + void apply (const vec_type& X, vec_type& Y, + Teuchos::ETransp mode = Teuchos::NO_TRANS, + Scalar alpha = Teuchos::ScalarTraits::one(), + Scalar beta = Teuchos::ScalarTraits::zero()) const { + op_->apply(Xpetra::toTpetra(X), Xpetra::toTpetra(Y), mode, alpha, beta); + } + + //! Compute a residual R = B - (*this) * X + void residual(const vec_type & X, + const vec_type & B, + vec_type& R) const { + Tpetra::Details::residual(*op_, toTpetra(X), toTpetra(B), toTpetra(R)); + } + + RCP > restrict(const RCP& P) { + #include "MueLu_UseShortNames.hpp" + return rcp(new HierarchicalOperator(op_->restrict(rcp_dynamic_cast(rcp_dynamic_cast(P)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst()))); + } + + double getCompression() { + return op_->getCompression(); + } + + private: + RCP op_; + }; +} + + +template +int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int argc, char *argv[]) { + #include "MueLu_UseShortNames.hpp" + + std::string xmlHierachical = "hierarchical.xml"; + std::string xmlAuxHierarchy = "aux.xml"; + + switch (clp.parse(argc, argv)) { + case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED: return EXIT_SUCCESS; break; + case Teuchos::CommandLineProcessor::PARSE_ERROR: + case Teuchos::CommandLineProcessor::PARSE_UNRECOGNIZED_OPTION: return EXIT_FAILURE; break; + case Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL: break; + } + + using HOp = Xpetra::HierarchicalOperator; + + RCP fancy = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout)); + Teuchos::FancyOStream& out = *fancy; + out.setOutputToRootOnly(0); + bool success = true; + const Scalar one = Teuchos::ScalarTraits::one(); + + RCP< const Teuchos::Comm > comm = Teuchos::DefaultComm::getComm(); + + Teuchos::ParameterList hierachicalParams; + Teuchos::updateParametersFromXmlFileAndBroadcast(xmlHierachical, Teuchos::Ptr(&hierachicalParams), *comm); + + // row, domain and range map of the operator + auto map = Xpetra::IO::ReadMap(hierachicalParams.get("map"), lib, comm); + // 1-to-1 map for the cluster coefficients + auto clusterCoeffMap = Xpetra::IO::ReadMap(hierachicalParams.get("coefficient map"), lib, comm); + // overlapping map for the cluster coefficients + auto ghosted_clusterCoeffMap = Xpetra::IO::ReadMap(hierachicalParams.get("ghosted coefficient map"), lib, comm); + + // near field interactions + auto nearField = Xpetra::IO::Read(hierachicalParams.get("near field matrix"), map); + + // far field basis expansion coefficients + auto basisMatrix = Xpetra::IO::Read(hierachicalParams.get("basis expansion coefficient matrix"), map, clusterCoeffMap, clusterCoeffMap, map); + // far field interactions + auto kernelApproximations = Xpetra::IO::Read(hierachicalParams.get("far field interaction matrix"), clusterCoeffMap, ghosted_clusterCoeffMap, clusterCoeffMap, clusterCoeffMap); + + auto transfersList = hierachicalParams.sublist("shift coefficient matrices"); + std::vector > transferMatrices; + for (int i = 0; i < transfersList.numParams(); i++) { + std::string filename = transfersList.get(std::to_string(i)); + auto transfer = Xpetra::IO::Read(filename, clusterCoeffMap, clusterCoeffMap, clusterCoeffMap, clusterCoeffMap); + transferMatrices.push_back(transfer); + } + + auto op = rcp(new HOp(nearField, kernelApproximations, basisMatrix, transferMatrices)); + + out << "Compression: " << op->getCompression() << " of dense matrix."<< std::endl; + + auto X_ex = Xpetra::IO::ReadMultiVector(hierachicalParams.get("exact solution"), map); + auto RHS = Xpetra::IO::ReadMultiVector(hierachicalParams.get("right-hand side"), map); + auto X = MultiVectorFactory::Build(map, 1); + + { + op->apply(*X_ex, *X); + + // Xpetra::IO::Write("X.mtx", *X); + X->update(one, *RHS, -one); + out << "|op*X_ex - RHS| = " << X->getVector(0)->norm2() << std::endl; + // Xpetra::IO::Write("diff.mtx", *X); + } + + { + op->apply(*X_ex, *X, Teuchos::NO_TRANS, -one); + + // Xpetra::IO::Write("X2.mtx", *X); + X->update(one, *RHS, one); + out << "|(-op)*X_ex + RHS| = " << X->getVector(0)->norm2() << std::endl; + // Xpetra::IO::Write("diff2.mtx", *X); + } + + { + op->apply(*X_ex, *X, Teuchos::TRANS, -one); + + // Xpetra::IO::Write("X2.mtx", *X); + X->update(one, *RHS, one); + out << "|(-op^T)*X_ex + RHS| = " << X->getVector(0)->norm2() << std::endl; + // Xpetra::IO::Write("diff2.mtx", *X); + } + + { + // Solve linear system using unpreconditioned Krylov method + + using MV = typename HOp::vec_type; + using OP = Belos::OperatorT; + + RCP belosOp = rcp(new Belos::XpetraOp(op)); + RCP > belosProblem = rcp(new Belos::LinearProblem(belosOp, X, RHS)); + + std::string belosType = "Pseudoblock CG"; + RCP belosList = Teuchos::parameterList(); + belosList->set("Maximum Iterations", 1000); // Maximum number of iterations allowed + belosList->set("Convergence Tolerance", 1e-5); // Relative convergence tolerance requested + belosList->set("Verbosity", Belos::Errors + Belos::Warnings + Belos::StatusTestDetails); + belosList->set("Output Frequency", 1); + belosList->set("Output Style", Belos::Brief); + + bool set = belosProblem->setProblem(); + if (set == false) { + throw MueLu::Exceptions::RuntimeError("ERROR: Belos::LinearProblem failed to set up correctly!"); + } + + // Create an iterative solver manager + Belos::SolverFactory solverFactory; + RCP< Belos::SolverManager > solver = solverFactory.create(belosType, belosList); + solver->setProblem(belosProblem); + + // Perform solve + Belos::ReturnType ret = solver->solve(); + int numIts = solver->getNumIters(); + + // Get the number of iterations for this solve. + out << "Number of iterations performed for this solve: " << numIts << std::endl; + + // Xpetra::IO::Write("X.mtx", *X); + X->update(one, *X_ex, -one); + out << "|X-X_ex| = " << X->getVector(0)->norm2() << std::endl; + + success &= (ret == Belos::Converged); + + } + + // { + // // Solve linear system using a AMG preconditioned Krylov method + + // auto auxOp = Xpetra::IO::Read(hierachicalParams.get("auxiliary operator"), map); + // auto coords = Xpetra::IO::coordinateType,LocalOrdinal,GlobalOrdinal,Node>::ReadMultiVector(hierachicalParams.get("coordinates"), map); + + // Teuchos::ParameterList auxParams; + // Teuchos::updateParametersFromXmlFileAndBroadcast(xmlAuxHierarchy, Teuchos::Ptr(&auxParams), *comm); + // auxParams.sublist("user data").set("Coordinates", coords); + + // auto auxH = MueLu::CreateXpetraPreconditioner(auxOp, auxParams); + + // auto H = rcp(new Hierarchy()); + // RCP lvl = H->GetLevel(0); + // lvl->Set("A", rcp_dynamic_cast(op)); + // for(int lvlNo = 1; lvlNoGetNumLevels(); lvlNo++) { + // H->AddNewLevel(); + // RCP auxLvl = auxH->GetLevel(lvlNo); + // RCP fineLvl = H->GetLevel(lvlNo-1); + // RCP lvl = H->GetLevel(lvlNo); + // auto P = auxLvl->Get >("P"); + // lvl->Set("P", P); + + // auto fineA = rcp_dynamic_cast(fineLvl->Get >("A")); + // auto coarseA = fineA->restrict(P); + // lvl->Set("A", rcp_dynamic_cast(coarseA)); + // } + + // RCP mueLuFactory = rcp(new ParameterListInterpreter(auxParams,op->getDomainMap()->getComm())); + // H->setlib(op->getDomainMap()->lib()); + // H->SetProcRankVerbose(op->getDomainMap()->getComm()->getRank()); + // mueLuFactory->SetupHierarchy(*H); + + // } + + return ( success ? EXIT_SUCCESS : EXIT_FAILURE ); +} //main + +//- -- -------------------------------------------------------- +#define MUELU_AUTOMATIC_TEST_ETI_NAME main_ +#include "MueLu_Test_ETI.hpp" + +int main(int argc, char *argv[]) { + return Automatic_Test_ETI(argc,argv); +} diff --git a/packages/muelu/research/caglusa/rowmap.mtx b/packages/muelu/research/caglusa/rowmap.mtx new file mode 100644 index 000000000000..a89e8c64e66b --- /dev/null +++ b/packages/muelu/research/caglusa/rowmap.mtx @@ -0,0 +1,2049 @@ +%%MatrixMarket matrix array integer general +% +2046 1 +0 +0 +1 +0 +2 +0 +3 +0 +4 +0 +5 +0 +6 +0 +7 +0 +8 +0 +9 +0 +10 +0 +11 +0 +12 +0 +13 +0 +14 +0 +15 +0 +16 +0 +17 +0 +18 +0 +19 +0 +20 +0 +21 +0 +22 +0 +23 +0 +24 +0 +25 +0 +26 +0 +27 +0 +28 +0 +29 +0 +30 +0 +31 +0 +32 +0 +33 +0 +34 +0 +35 +0 +36 +0 +37 +0 +38 +0 +39 +0 +40 +0 +41 +0 +42 +0 +43 +0 +44 +0 +45 +0 +46 +0 +47 +0 +48 +0 +49 +0 +50 +0 +51 +0 +52 +0 +53 +0 +54 +0 +55 +0 +56 +0 +57 +0 +58 +0 +59 +0 +60 +0 +61 +0 +62 +0 +63 +0 +64 +0 +65 +0 +66 +0 +67 +0 +68 +0 +69 +0 +70 +0 +71 +0 +72 +0 +73 +0 +74 +0 +75 +0 +76 +0 +77 +0 +78 +0 +79 +0 +80 +0 +81 +0 +82 +0 +83 +0 +84 +0 +85 +0 +86 +0 +87 +0 +88 +0 +89 +0 +90 +0 +91 +0 +92 +0 +93 +0 +94 +0 +95 +0 +96 +0 +97 +0 +98 +0 +99 +0 +100 +0 +101 +0 +102 +0 +103 +0 +104 +0 +105 +0 +106 +0 +107 +0 +108 +0 +109 +0 +110 +0 +111 +0 +112 +0 +113 +0 +114 +0 +115 +0 +116 +0 +117 +0 +118 +0 +119 +0 +120 +0 +121 +0 +122 +0 +123 +0 +124 +0 +125 +0 +126 +0 +127 +0 +128 +0 +129 +0 +130 +0 +131 +0 +132 +0 +133 +0 +134 +0 +135 +0 +136 +0 +137 +0 +138 +0 +139 +0 +140 +0 +141 +0 +142 +0 +143 +0 +144 +0 +145 +0 +146 +0 +147 +0 +148 +0 +149 +0 +150 +0 +151 +0 +152 +0 +153 +0 +154 +0 +155 +0 +156 +0 +157 +0 +158 +0 +159 +0 +160 +0 +161 +0 +162 +0 +163 +0 +164 +0 +165 +0 +166 +0 +167 +0 +168 +0 +169 +0 +170 +0 +171 +0 +172 +0 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +180 +0 +181 +0 +182 +0 +183 +0 +184 +0 +185 +0 +186 +0 +187 +0 +188 +0 +189 +0 +190 +0 +191 +0 +192 +0 +193 +0 +194 +0 +195 +0 +196 +0 +197 +0 +198 +0 +199 +0 +200 +0 +201 +0 +202 +0 +203 +0 +204 +0 +205 +0 +206 +0 +207 +0 +208 +0 +209 +0 +210 +0 +211 +0 +212 +0 +213 +0 +214 +0 +215 +0 +216 +0 +217 +0 +218 +0 +219 +0 +220 +0 +221 +0 +222 +0 +223 +0 +224 +0 +225 +0 +226 +0 +227 +0 +228 +0 +229 +0 +230 +0 +231 +0 +232 +0 +233 +0 +234 +0 +235 +0 +236 +0 +237 +0 +238 +0 +239 +0 +240 +0 +241 +0 +242 +0 +243 +0 +244 +0 +245 +0 +246 +0 +247 +0 +248 +0 +249 +0 +250 +0 +251 +0 +252 +0 +253 +0 +254 +0 +255 +1 +256 +1 +257 +1 +258 +1 +259 +1 +260 +1 +261 +1 +262 +1 +263 +1 +264 +1 +265 +1 +266 +1 +267 +1 +268 +1 +269 +1 +270 +1 +271 +1 +272 +1 +273 +1 +274 +1 +275 +1 +276 +1 +277 +1 +278 +1 +279 +1 +280 +1 +281 +1 +282 +1 +283 +1 +284 +1 +285 +1 +286 +1 +287 +1 +288 +1 +289 +1 +290 +1 +291 +1 +292 +1 +293 +1 +294 +1 +295 +1 +296 +1 +297 +1 +298 +1 +299 +1 +300 +1 +301 +1 +302 +1 +303 +1 +304 +1 +305 +1 +306 +1 +307 +1 +308 +1 +309 +1 +310 +1 +311 +1 +312 +1 +313 +1 +314 +1 +315 +1 +316 +1 +317 +1 +318 +1 +319 +1 +320 +1 +321 +1 +322 +1 +323 +1 +324 +1 +325 +1 +326 +1 +327 +1 +328 +1 +329 +1 +330 +1 +331 +1 +332 +1 +333 +1 +334 +1 +335 +1 +336 +1 +337 +1 +338 +1 +339 +1 +340 +1 +341 +1 +342 +1 +343 +1 +344 +1 +345 +1 +346 +1 +347 +1 +348 +1 +349 +1 +350 +1 +351 +1 +352 +1 +353 +1 +354 +1 +355 +1 +356 +1 +357 +1 +358 +1 +359 +1 +360 +1 +361 +1 +362 +1 +363 +1 +364 +1 +365 +1 +366 +1 +367 +1 +368 +1 +369 +1 +370 +1 +371 +1 +372 +1 +373 +1 +374 +1 +375 +1 +376 +1 +377 +1 +378 +1 +379 +1 +380 +1 +381 +1 +382 +1 +383 +1 +384 +1 +385 +1 +386 +1 +387 +1 +388 +1 +389 +1 +390 +1 +391 +1 +392 +1 +393 +1 +394 +1 +395 +1 +396 +1 +397 +1 +398 +1 +399 +1 +400 +1 +401 +1 +402 +1 +403 +1 +404 +1 +405 +1 +406 +1 +407 +1 +408 +1 +409 +1 +410 +1 +411 +1 +412 +1 +413 +1 +414 +1 +415 +1 +416 +1 +417 +1 +418 +1 +419 +1 +420 +1 +421 +1 +422 +1 +423 +1 +424 +1 +425 +1 +426 +1 +427 +1 +428 +1 +429 +1 +430 +1 +431 +1 +432 +1 +433 +1 +434 +1 +435 +1 +436 +1 +437 +1 +438 +1 +439 +1 +440 +1 +441 +1 +442 +1 +443 +1 +444 +1 +445 +1 +446 +1 +447 +1 +448 +1 +449 +1 +450 +1 +451 +1 +452 +1 +453 +1 +454 +1 +455 +1 +456 +1 +457 +1 +458 +1 +459 +1 +460 +1 +461 +1 +462 +1 +463 +1 +464 +1 +465 +1 +466 +1 +467 +1 +468 +1 +469 +1 +470 +1 +471 +1 +472 +1 +473 +1 +474 +1 +475 +1 +476 +1 +477 +1 +478 +1 +479 +1 +480 +1 +481 +1 +482 +1 +483 +1 +484 +1 +485 +1 +486 +1 +487 +1 +488 +1 +489 +1 +490 +1 +491 +1 +492 +1 +493 +1 +494 +1 +495 +1 +496 +1 +497 +1 +498 +1 +499 +1 +500 +1 +501 +1 +502 +1 +503 +1 +504 +1 +505 +1 +506 +1 +507 +1 +508 +1 +509 +1 +510 +1 +511 +2 +512 +2 +513 +2 +514 +2 +515 +2 +516 +2 +517 +2 +518 +2 +519 +2 +520 +2 +521 +2 +522 +2 +523 +2 +524 +2 +525 +2 +526 +2 +527 +2 +528 +2 +529 +2 +530 +2 +531 +2 +532 +2 +533 +2 +534 +2 +535 +2 +536 +2 +537 +2 +538 +2 +539 +2 +540 +2 +541 +2 +542 +2 +543 +2 +544 +2 +545 +2 +546 +2 +547 +2 +548 +2 +549 +2 +550 +2 +551 +2 +552 +2 +553 +2 +554 +2 +555 +2 +556 +2 +557 +2 +558 +2 +559 +2 +560 +2 +561 +2 +562 +2 +563 +2 +564 +2 +565 +2 +566 +2 +567 +2 +568 +2 +569 +2 +570 +2 +571 +2 +572 +2 +573 +2 +574 +2 +575 +2 +576 +2 +577 +2 +578 +2 +579 +2 +580 +2 +581 +2 +582 +2 +583 +2 +584 +2 +585 +2 +586 +2 +587 +2 +588 +2 +589 +2 +590 +2 +591 +2 +592 +2 +593 +2 +594 +2 +595 +2 +596 +2 +597 +2 +598 +2 +599 +2 +600 +2 +601 +2 +602 +2 +603 +2 +604 +2 +605 +2 +606 +2 +607 +2 +608 +2 +609 +2 +610 +2 +611 +2 +612 +2 +613 +2 +614 +2 +615 +2 +616 +2 +617 +2 +618 +2 +619 +2 +620 +2 +621 +2 +622 +2 +623 +2 +624 +2 +625 +2 +626 +2 +627 +2 +628 +2 +629 +2 +630 +2 +631 +2 +632 +2 +633 +2 +634 +2 +635 +2 +636 +2 +637 +2 +638 +2 +639 +2 +640 +2 +641 +2 +642 +2 +643 +2 +644 +2 +645 +2 +646 +2 +647 +2 +648 +2 +649 +2 +650 +2 +651 +2 +652 +2 +653 +2 +654 +2 +655 +2 +656 +2 +657 +2 +658 +2 +659 +2 +660 +2 +661 +2 +662 +2 +663 +2 +664 +2 +665 +2 +666 +2 +667 +2 +668 +2 +669 +2 +670 +2 +671 +2 +672 +2 +673 +2 +674 +2 +675 +2 +676 +2 +677 +2 +678 +2 +679 +2 +680 +2 +681 +2 +682 +2 +683 +2 +684 +2 +685 +2 +686 +2 +687 +2 +688 +2 +689 +2 +690 +2 +691 +2 +692 +2 +693 +2 +694 +2 +695 +2 +696 +2 +697 +2 +698 +2 +699 +2 +700 +2 +701 +2 +702 +2 +703 +2 +704 +2 +705 +2 +706 +2 +707 +2 +708 +2 +709 +2 +710 +2 +711 +2 +712 +2 +713 +2 +714 +2 +715 +2 +716 +2 +717 +2 +718 +2 +719 +2 +720 +2 +721 +2 +722 +2 +723 +2 +724 +2 +725 +2 +726 +2 +727 +2 +728 +2 +729 +2 +730 +2 +731 +2 +732 +2 +733 +2 +734 +2 +735 +2 +736 +2 +737 +2 +738 +2 +739 +2 +740 +2 +741 +2 +742 +2 +743 +2 +744 +2 +745 +2 +746 +2 +747 +2 +748 +2 +749 +2 +750 +2 +751 +2 +752 +2 +753 +2 +754 +2 +755 +2 +756 +2 +757 +2 +758 +2 +759 +2 +760 +2 +761 +2 +762 +2 +763 +2 +764 +2 +765 +2 +766 +2 +767 +3 +768 +3 +769 +3 +770 +3 +771 +3 +772 +3 +773 +3 +774 +3 +775 +3 +776 +3 +777 +3 +778 +3 +779 +3 +780 +3 +781 +3 +782 +3 +783 +3 +784 +3 +785 +3 +786 +3 +787 +3 +788 +3 +789 +3 +790 +3 +791 +3 +792 +3 +793 +3 +794 +3 +795 +3 +796 +3 +797 +3 +798 +3 +799 +3 +800 +3 +801 +3 +802 +3 +803 +3 +804 +3 +805 +3 +806 +3 +807 +3 +808 +3 +809 +3 +810 +3 +811 +3 +812 +3 +813 +3 +814 +3 +815 +3 +816 +3 +817 +3 +818 +3 +819 +3 +820 +3 +821 +3 +822 +3 +823 +3 +824 +3 +825 +3 +826 +3 +827 +3 +828 +3 +829 +3 +830 +3 +831 +3 +832 +3 +833 +3 +834 +3 +835 +3 +836 +3 +837 +3 +838 +3 +839 +3 +840 +3 +841 +3 +842 +3 +843 +3 +844 +3 +845 +3 +846 +3 +847 +3 +848 +3 +849 +3 +850 +3 +851 +3 +852 +3 +853 +3 +854 +3 +855 +3 +856 +3 +857 +3 +858 +3 +859 +3 +860 +3 +861 +3 +862 +3 +863 +3 +864 +3 +865 +3 +866 +3 +867 +3 +868 +3 +869 +3 +870 +3 +871 +3 +872 +3 +873 +3 +874 +3 +875 +3 +876 +3 +877 +3 +878 +3 +879 +3 +880 +3 +881 +3 +882 +3 +883 +3 +884 +3 +885 +3 +886 +3 +887 +3 +888 +3 +889 +3 +890 +3 +891 +3 +892 +3 +893 +3 +894 +3 +895 +3 +896 +3 +897 +3 +898 +3 +899 +3 +900 +3 +901 +3 +902 +3 +903 +3 +904 +3 +905 +3 +906 +3 +907 +3 +908 +3 +909 +3 +910 +3 +911 +3 +912 +3 +913 +3 +914 +3 +915 +3 +916 +3 +917 +3 +918 +3 +919 +3 +920 +3 +921 +3 +922 +3 +923 +3 +924 +3 +925 +3 +926 +3 +927 +3 +928 +3 +929 +3 +930 +3 +931 +3 +932 +3 +933 +3 +934 +3 +935 +3 +936 +3 +937 +3 +938 +3 +939 +3 +940 +3 +941 +3 +942 +3 +943 +3 +944 +3 +945 +3 +946 +3 +947 +3 +948 +3 +949 +3 +950 +3 +951 +3 +952 +3 +953 +3 +954 +3 +955 +3 +956 +3 +957 +3 +958 +3 +959 +3 +960 +3 +961 +3 +962 +3 +963 +3 +964 +3 +965 +3 +966 +3 +967 +3 +968 +3 +969 +3 +970 +3 +971 +3 +972 +3 +973 +3 +974 +3 +975 +3 +976 +3 +977 +3 +978 +3 +979 +3 +980 +3 +981 +3 +982 +3 +983 +3 +984 +3 +985 +3 +986 +3 +987 +3 +988 +3 +989 +3 +990 +3 +991 +3 +992 +3 +993 +3 +994 +3 +995 +3 +996 +3 +997 +3 +998 +3 +999 +3 +1000 +3 +1001 +3 +1002 +3 +1003 +3 +1004 +3 +1005 +3 +1006 +3 +1007 +3 +1008 +3 +1009 +3 +1010 +3 +1011 +3 +1012 +3 +1013 +3 +1014 +3 +1015 +3 +1016 +3 +1017 +3 +1018 +3 +1019 +3 +1020 +3 +1021 +3 +1022 +3 diff --git a/packages/muelu/research/caglusa/transfer0.mtx b/packages/muelu/research/caglusa/transfer0.mtx new file mode 100644 index 000000000000..1d95d120870d --- /dev/null +++ b/packages/muelu/research/caglusa/transfer0.mtx @@ -0,0 +1,651 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 648 +1 10 1.129411500546784e+00 +1 11 3.670587123461224e-01 +1 12 -8.049160724422064e-02 +1 13 -2.032779703371170e-02 +1 14 3.979771743152476e-02 +1 15 -3.653023273099719e-03 +1 16 -2.390769583422672e-02 +1 17 -1.192764283693718e-02 +1 18 -1.348774781601022e-03 +1 289 -2.769334835519589e-05 +1 290 9.459177033964402e-03 +1 291 1.667465881859012e-02 +1 292 2.558493179496224e-03 +1 293 -1.301800780792160e-02 +1 294 3.513446234667466e-03 +1 295 7.458144490217366e-03 +1 296 -9.892693448703265e-03 +1 297 4.301228990786801e-03 +2 10 -1.954658507609646e-01 +2 11 8.172051897065897e-01 +2 12 8.485883218629846e-01 +2 13 9.418268414471946e-02 +2 14 -1.517806004204933e-01 +2 15 1.284495107653860e-02 +2 16 8.073455683811782e-02 +2 17 3.944978508915502e-02 +2 18 4.421028511261784e-03 +2 289 9.067875947276147e-05 +2 290 -3.073142604477415e-02 +2 291 -5.350591789649456e-02 +2 292 -8.102369106559109e-03 +2 293 4.075260508754474e-02 +2 294 -1.089968456047368e-02 +2 295 -2.298780093000995e-02 +2 296 3.036615027213546e-02 +2 297 -1.317650674636975e-02 +3 10 1.082520994427544e-01 +3 11 -2.889831904537400e-01 +3 12 3.248829650141348e-01 +3 13 9.970774308689467e-01 +3 14 5.961024869195356e-01 +3 15 -3.367981223730957e-02 +3 16 -1.831797001588231e-01 +3 17 -8.387339051456290e-02 +3 18 -9.153920411521620e-03 +3 289 -1.871888697977666e-04 +3 290 6.204552542802631e-02 +3 291 1.044305775838867e-01 +3 292 1.528067052375871e-02 +3 293 -7.467512415084213e-02 +3 294 1.954235577407955e-02 +3 295 4.059422848908625e-02 +3 296 -5.311666292266027e-02 +3 297 2.294370586195648e-02 +4 10 -7.138223443736702e-02 +4 11 1.740834065912312e-01 +4 12 -1.484845065565620e-01 +4 13 -1.049235629513360e-01 +4 14 6.609088867175748e-01 +4 15 9.949463440350268e-01 +4 16 6.382749766949400e-01 +4 17 2.153988514319247e-01 +4 18 2.132780628751801e-02 +4 289 4.316393375768704e-04 +4 290 -1.330939268701061e-01 +4 291 -2.030321726873077e-01 +4 292 -2.721254616727129e-02 +4 293 1.244753190317419e-01 +4 294 -3.110768401439445e-02 +4 295 -6.268503575026510e-02 +4 296 8.053348214855779e-02 +4 297 -3.448845468129739e-02 +5 10 4.978351309021659e-02 +5 11 -1.173453856460456e-01 +5 12 9.221850329093995e-02 +5 13 5.474453575062167e-02 +5 14 -2.222222222222224e-01 +5 15 4.193559628619540e-02 +5 16 6.214620396774779e-01 +5 17 9.411301078682682e-01 +5 18 9.992308119045477e-01 +5 289 9.999996712135830e-01 +5 290 9.530885297305624e-01 +5 291 6.452282034579943e-01 +5 292 5.955243333140754e-02 +5 293 -2.237879592571277e-01 +5 294 5.004246053513065e-02 +5 295 9.453183932501989e-02 +5 296 -1.171358555372252e-01 +5 297 4.935145649296358e-02 +6 10 -3.479092359412759e-02 +6 11 8.068968438828850e-02 +6 12 -6.118162989078881e-02 +6 13 -3.407479357032987e-02 +6 14 1.239997546686380e-01 +6 15 -1.932067089943150e-02 +6 16 -2.003414469256311e-01 +6 17 -1.448427411451554e-01 +6 18 -2.040102646753046e-02 +6 289 -4.312431621256262e-04 +6 290 1.893804309416283e-01 +6 291 6.147343966585301e-01 +6 292 9.915039436273511e-01 +6 293 6.771081466091788e-01 +6 294 -9.629648679611330e-02 +6 295 -1.523943170459345e-01 +6 296 1.738290246087277e-01 +6 297 -7.076495429407921e-02 +7 10 2.314511493126580e-02 +7 11 -5.322385868251331e-02 +7 12 3.963041032797538e-02 +7 13 2.141880768979494e-02 +7 14 -7.448107462312177e-02 +7 15 1.087558270779069e-02 +7 16 1.035174746041493e-01 +7 17 6.804174656093516e-02 +7 18 8.940094922500905e-03 +7 289 1.870974323655495e-04 +7 290 -7.475027283968257e-02 +7 291 -1.808515628966702e-01 +7 292 -4.629297099848542e-02 +7 293 5.797523298480373e-01 +7 294 9.989180323621645e-01 +7 295 3.350848809027738e-01 +7 296 -2.888261975066064e-01 +7 297 1.073244113536807e-01 +8 10 -1.329223336631334e-02 +8 11 3.042868713306708e-02 +8 12 -2.244483970189554e-02 +8 13 -1.194967046758751e-02 +8 14 4.066948930938207e-02 +8 15 -5.772473560016135e-03 +8 16 -5.312732759263696e-02 +8 17 -3.378505081770156e-02 +8 18 -4.344146984209206e-03 +8 289 -9.064588083784855e-05 +8 290 3.528195766424554e-02 +8 291 8.006299731787808e-02 +8 292 1.777683241109559e-02 +8 293 -1.500544854393664e-01 +8 294 8.464781839456975e-02 +8 295 8.420712710301355e-01 +8 296 8.217080328079516e-01 +8 297 -1.938488998438378e-01 +9 10 4.339014147752001e-03 +9 11 -9.913245383000176e-03 +9 12 7.282382897431911e-03 +9 13 3.852365568882107e-03 +9 14 -1.299443778081731e-02 +9 15 1.823505864305507e-03 +9 16 1.656712269663253e-02 +9 17 1.040833436407406e-02 +9 18 1.328127019033700e-03 +9 289 2.768451811848766e-05 +9 290 -1.067999504386462e-02 +9 291 -2.374118035640687e-02 +9 292 -5.064486800793322e-03 +9 293 3.944717607875494e-02 +9 294 -1.836025792963043e-02 +9 295 -8.167321051102366e-02 +9 296 3.625347195778224e-01 +9 297 1.128358012866197e+00 +568 577 1.128886721016068e+00 +568 578 3.648015281808026e-01 +568 579 -8.108833879502317e-02 +568 580 -1.934548288090387e-02 +568 581 3.963055707113157e-02 +568 582 -4.360522943874613e-03 +568 583 -2.383468761167499e-02 +568 584 -1.130981914556010e-02 +568 585 -6.608998355542497e-04 +568 856 6.559061877940150e-04 +568 857 9.942562460241651e-03 +568 858 1.662768741732000e-02 +568 859 2.189690916089127e-03 +568 860 -1.300883063495634e-02 +568 861 3.684009202837277e-03 +568 862 7.370407434919079e-03 +568 863 -9.903211170919062e-03 +568 864 4.320187133485827e-03 +569 577 -1.946603400966420e-01 +569 578 8.194556018114637e-01 +569 579 8.453519213002958e-01 +569 580 8.941016994555676e-02 +569 581 -1.509472923848867e-01 +569 582 1.531926222076541e-02 +569 583 8.043313241304531e-02 +569 584 3.738448385480556e-02 +569 585 2.165125410075797e-03 +569 856 -2.146531909365995e-03 +569 857 -3.228741036227865e-02 +569 858 -5.333825339575225e-02 +569 859 -6.933037876038517e-03 +569 860 4.071918096306302e-02 +569 861 -1.142812838892234e-02 +569 862 -2.271675331676659e-02 +569 863 3.039815995453323e-02 +569 864 -1.323457091334373e-02 +570 577 1.077898942356713e-01 +570 578 -2.889109156923248e-01 +570 579 3.299673359533300e-01 +570 580 9.980348603289079e-01 +570 581 5.879695423797844e-01 +570 582 -4.002974318365059e-02 +570 583 -1.820905196773940e-01 +570 584 -7.934326425256337e-02 +570 585 -4.475936270564448e-03 +570 856 4.424225860598829e-03 +570 857 6.510554638922857e-02 +570 858 1.040152149855680e-01 +570 859 1.306870827771027e-02 +570 860 -7.459286110187001e-02 +570 861 2.048688777259693e-02 +570 862 4.011304269704104e-02 +570 863 -5.317155405934341e-02 +570 864 2.304476016308864e-02 +571 577 -7.107467396218857e-02 +571 578 1.739602865291659e-01 +571 579 -1.504395625967402e-01 +571 580 -1.006522569631177e-01 +571 581 6.690128883233533e-01 +571 582 9.933317053474532e-01 +571 583 6.265934279351885e-01 +571 584 2.023782023491814e-01 +571 585 1.037216001587786e-02 +571 856 -1.014809266520458e-02 +571 857 -1.391183040317297e-01 +571 858 -2.017600458799609e-01 +571 859 -2.324486740935293e-02 +571 860 1.242615554319795e-01 +571 861 -3.260165948376758e-02 +571 862 -6.193432351704962e-02 +571 863 8.061353422324739e-02 +571 864 -3.464021496124542e-02 +572 577 4.956823738510598e-02 +572 578 -1.172434297766254e-01 +572 579 9.337627083999379e-02 +572 580 5.241160046681225e-02 +572 581 -2.230447400475990e-01 +572 582 5.065880465089875e-02 +572 583 6.333540438136608e-01 +572 584 9.472480027386746e-01 +572 585 9.998140432063428e-01 +572 856 9.998140432063428e-01 +572 857 9.472480027386744e-01 +572 858 6.333540438136602e-01 +572 859 5.065880465089870e-02 +572 860 -2.230447400475984e-01 +572 861 5.241160046681314e-02 +572 862 9.337627083999406e-02 +572 863 -1.172434297766255e-01 +572 864 4.956823738510606e-02 +573 577 -3.464021496124541e-02 +573 578 8.061353422324735e-02 +573 579 -6.193432351704951e-02 +573 580 -3.260165948376707e-02 +573 581 1.242615554319800e-01 +573 582 -2.324486740935298e-02 +573 583 -2.017600458799613e-01 +573 584 -1.391183040317298e-01 +573 585 -1.014809266520460e-02 +573 856 1.037216001587787e-02 +573 857 2.023782023491816e-01 +573 858 6.265934279351886e-01 +573 859 9.933317053474532e-01 +573 860 6.690128883233522e-01 +573 861 -1.006522569631195e-01 +573 862 -1.504395625967409e-01 +573 863 1.739602865291664e-01 +573 864 -7.107467396218876e-02 +574 577 2.304476016308861e-02 +574 578 -5.317155405934335e-02 +574 579 4.011304269704094e-02 +574 580 2.048688777259659e-02 +574 581 -7.459286110187024e-02 +574 582 1.306870827771029e-02 +574 583 1.040152149855682e-01 +574 584 6.510554638922862e-02 +574 585 4.424225860598831e-03 +574 856 -4.475936270564451e-03 +574 857 -7.934326425256341e-02 +574 858 -1.820905196773940e-01 +574 859 -4.002974318365060e-02 +574 860 5.879695423797846e-01 +574 861 9.980348603289083e-01 +574 862 3.299673359533302e-01 +574 863 -2.889109156923248e-01 +574 864 1.077898942356713e-01 +575 577 -1.323457091334368e-02 +575 578 3.039815995453312e-02 +575 579 -2.271675331676647e-02 +575 580 -1.142812838892212e-02 +575 581 4.071918096306303e-02 +575 582 -6.933037876038508e-03 +575 583 -5.333825339575216e-02 +575 584 -3.228741036227857e-02 +575 585 -2.146531909365989e-03 +575 856 2.165125410075791e-03 +575 857 3.738448385480546e-02 +575 858 8.043313241304505e-02 +575 859 1.531926222076535e-02 +575 860 -1.509472923848859e-01 +575 861 8.941016994555802e-02 +575 862 8.453519213002961e-01 +575 863 8.194556018114629e-01 +575 864 -1.946603400966418e-01 +576 577 4.320187133485814e-03 +576 578 -9.903211170919033e-03 +576 579 7.370407434919046e-03 +576 580 3.684009202837210e-03 +576 581 -1.300883063495635e-02 +576 582 2.189690916089126e-03 +576 583 1.662768741731999e-02 +576 584 9.942562460241638e-03 +576 585 6.559061877940140e-04 +576 856 -6.608998355542487e-04 +576 857 -1.130981914556008e-02 +576 858 -2.383468761167493e-02 +576 859 -4.360522943874602e-03 +576 860 3.963055707113140e-02 +576 861 -1.934548288090417e-02 +576 862 -8.108833879502329e-02 +576 863 3.648015281808027e-01 +576 864 1.128886721016068e+00 +1135 1144 1.128886721016076e+00 +1135 1145 3.648015281808016e-01 +1135 1146 -8.108833879502349e-02 +1135 1147 -1.934548288090397e-02 +1135 1148 3.963055707113168e-02 +1135 1149 -4.360522943874514e-03 +1135 1150 -2.383468761167511e-02 +1135 1151 -1.130981914556023e-02 +1135 1152 -6.608998355542530e-04 +1135 1423 6.559061877940181e-04 +1135 1424 9.942562460241763e-03 +1135 1425 1.662768741732009e-02 +1135 1426 2.189690916089076e-03 +1135 1427 -1.300883063495640e-02 +1135 1428 3.684009202837235e-03 +1135 1429 7.370407434919156e-03 +1135 1430 -9.903211170919021e-03 +1135 1431 4.320187133486105e-03 +1136 1144 -1.946603400966539e-01 +1136 1145 8.194556018114630e-01 +1136 1146 8.453519213002989e-01 +1136 1147 8.941016994555659e-02 +1136 1148 -1.509472923848863e-01 +1136 1149 1.531926222076498e-02 +1136 1150 8.043313241304534e-02 +1136 1151 3.738448385480581e-02 +1136 1152 2.165125410075797e-03 +1136 1423 -2.146531909365995e-03 +1136 1424 -3.228741036227885e-02 +1136 1425 -5.333825339575230e-02 +1136 1426 -6.933037876038323e-03 +1136 1427 4.071918096306303e-02 +1136 1428 -1.142812838892215e-02 +1136 1429 -2.271675331676672e-02 +1136 1430 3.039815995453296e-02 +1136 1431 -1.323457091334452e-02 +1137 1144 1.077898942356777e-01 +1137 1145 -2.889109156923226e-01 +1137 1146 3.299673359533263e-01 +1137 1147 9.980348603289083e-01 +1137 1148 5.879695423797845e-01 +1137 1149 -4.002974318364955e-02 +1137 1150 -1.820905196773942e-01 +1137 1151 -7.934326425256398e-02 +1137 1152 -4.475936270564450e-03 +1137 1423 4.424225860598830e-03 +1137 1424 6.510554638922900e-02 +1137 1425 1.040152149855682e-01 +1137 1426 1.306870827770991e-02 +1137 1427 -7.459286110187004e-02 +1137 1428 2.048688777259660e-02 +1137 1429 4.011304269704129e-02 +1137 1430 -5.317155405934295e-02 +1137 1431 2.304476016309003e-02 +1138 1144 -7.107467396219301e-02 +1138 1145 1.739602865291649e-01 +1138 1146 -1.504395625967394e-01 +1138 1147 -1.006522569631180e-01 +1138 1148 6.690128883233522e-01 +1138 1149 9.933317053474540e-01 +1138 1150 6.265934279351906e-01 +1138 1151 2.023782023491832e-01 +1138 1152 1.037216001587787e-02 +1138 1423 -1.014809266520459e-02 +1138 1424 -1.391183040317306e-01 +1138 1425 -2.017600458799614e-01 +1138 1426 -2.324486740935230e-02 +1138 1427 1.242615554319796e-01 +1138 1428 -3.260165948376709e-02 +1138 1429 -6.193432351705006e-02 +1138 1430 8.061353422324678e-02 +1138 1431 -3.464021496124754e-02 +1139 1144 4.956823738510902e-02 +1139 1145 -1.172434297766245e-01 +1139 1146 9.337627083999317e-02 +1139 1147 5.241160046681232e-02 +1139 1148 -2.230447400475984e-01 +1139 1149 5.065880465089723e-02 +1139 1150 6.333540438136590e-01 +1139 1151 9.472480027386739e-01 +1139 1152 9.998140432063428e-01 +1139 1423 9.998140432063428e-01 +1139 1424 9.472480027386740e-01 +1139 1425 6.333540438136621e-01 +1139 1426 5.065880465089723e-02 +1139 1427 -2.230447400475985e-01 +1139 1428 5.241160046681231e-02 +1139 1429 9.337627083999461e-02 +1139 1430 -1.172434297766245e-01 +1139 1431 4.956823738510902e-02 +1140 1144 -3.464021496124753e-02 +1140 1145 8.061353422324678e-02 +1140 1146 -6.193432351704910e-02 +1140 1147 -3.260165948376709e-02 +1140 1148 1.242615554319796e-01 +1140 1149 -2.324486740935229e-02 +1140 1150 -2.017600458799610e-01 +1140 1151 -1.391183040317306e-01 +1140 1152 -1.014809266520459e-02 +1140 1423 1.037216001587787e-02 +1140 1424 2.023782023491832e-01 +1140 1425 6.265934279351871e-01 +1140 1426 9.933317053474537e-01 +1140 1427 6.690128883233522e-01 +1140 1428 -1.006522569631180e-01 +1140 1429 -1.504395625967418e-01 +1140 1430 1.739602865291649e-01 +1140 1431 -7.107467396219300e-02 +1141 1144 2.304476016309003e-02 +1141 1145 -5.317155405934297e-02 +1141 1146 4.011304269704069e-02 +1141 1147 2.048688777259661e-02 +1141 1148 -7.459286110187005e-02 +1141 1149 1.306870827770991e-02 +1141 1150 1.040152149855681e-01 +1141 1151 6.510554638922900e-02 +1141 1152 4.424225860598832e-03 +1141 1423 -4.475936270564452e-03 +1141 1424 -7.934326425256401e-02 +1141 1425 -1.820905196773939e-01 +1141 1426 -4.002974318364956e-02 +1141 1427 5.879695423797848e-01 +1141 1428 9.980348603289085e-01 +1141 1429 3.299673359533328e-01 +1141 1430 -2.889109156923227e-01 +1141 1431 1.077898942356778e-01 +1142 1144 -1.323457091334452e-02 +1142 1145 3.039815995453297e-02 +1142 1146 -2.271675331676638e-02 +1142 1147 -1.142812838892215e-02 +1142 1148 4.071918096306302e-02 +1142 1149 -6.933037876038323e-03 +1142 1150 -5.333825339575225e-02 +1142 1151 -3.228741036227884e-02 +1142 1152 -2.146531909365995e-03 +1142 1423 2.165125410075797e-03 +1142 1424 3.738448385480582e-02 +1142 1425 8.043313241304523e-02 +1142 1426 1.531926222076498e-02 +1142 1427 -1.509472923848863e-01 +1142 1428 8.941016994555659e-02 +1142 1429 8.453519213002947e-01 +1142 1430 8.194556018114629e-01 +1142 1431 -1.946603400966539e-01 +1143 1144 4.320187133486105e-03 +1143 1145 -9.903211170919021e-03 +1143 1146 7.370407434919043e-03 +1143 1147 3.684009202837234e-03 +1143 1148 -1.300883063495640e-02 +1143 1149 2.189690916089075e-03 +1143 1150 1.662768741732008e-02 +1143 1151 9.942562460241758e-03 +1143 1152 6.559061877940180e-04 +1143 1423 -6.608998355542529e-04 +1143 1424 -1.130981914556023e-02 +1143 1425 -2.383468761167508e-02 +1143 1426 -4.360522943874512e-03 +1143 1427 3.963055707113167e-02 +1143 1428 -1.934548288090396e-02 +1143 1429 -8.108833879502420e-02 +1143 1430 3.648015281808015e-01 +1143 1431 1.128886721016076e+00 +1702 1711 1.128886721016076e+00 +1702 1712 3.648015281808016e-01 +1702 1713 -8.108833879502349e-02 +1702 1714 -1.934548288090397e-02 +1702 1715 3.963055707113168e-02 +1702 1716 -4.360522943874514e-03 +1702 1717 -2.383468761167511e-02 +1702 1718 -1.130981914556023e-02 +1702 1719 -6.608998355542530e-04 +1702 1990 6.559061877940181e-04 +1702 1991 9.942562460241763e-03 +1702 1992 1.662768741732009e-02 +1702 1993 2.189690916089076e-03 +1702 1994 -1.300883063495640e-02 +1702 1995 3.684009202837235e-03 +1702 1996 7.370407434919156e-03 +1702 1997 -9.903211170919021e-03 +1702 1998 4.320187133486105e-03 +1703 1711 -1.946603400966539e-01 +1703 1712 8.194556018114630e-01 +1703 1713 8.453519213002989e-01 +1703 1714 8.941016994555659e-02 +1703 1715 -1.509472923848863e-01 +1703 1716 1.531926222076498e-02 +1703 1717 8.043313241304534e-02 +1703 1718 3.738448385480581e-02 +1703 1719 2.165125410075797e-03 +1703 1990 -2.146531909365995e-03 +1703 1991 -3.228741036227885e-02 +1703 1992 -5.333825339575230e-02 +1703 1993 -6.933037876038323e-03 +1703 1994 4.071918096306303e-02 +1703 1995 -1.142812838892215e-02 +1703 1996 -2.271675331676672e-02 +1703 1997 3.039815995453296e-02 +1703 1998 -1.323457091334452e-02 +1704 1711 1.077898942356777e-01 +1704 1712 -2.889109156923226e-01 +1704 1713 3.299673359533263e-01 +1704 1714 9.980348603289083e-01 +1704 1715 5.879695423797845e-01 +1704 1716 -4.002974318364955e-02 +1704 1717 -1.820905196773942e-01 +1704 1718 -7.934326425256398e-02 +1704 1719 -4.475936270564450e-03 +1704 1990 4.424225860598830e-03 +1704 1991 6.510554638922900e-02 +1704 1992 1.040152149855682e-01 +1704 1993 1.306870827770991e-02 +1704 1994 -7.459286110187004e-02 +1704 1995 2.048688777259660e-02 +1704 1996 4.011304269704129e-02 +1704 1997 -5.317155405934295e-02 +1704 1998 2.304476016309003e-02 +1705 1711 -7.107467396219301e-02 +1705 1712 1.739602865291649e-01 +1705 1713 -1.504395625967394e-01 +1705 1714 -1.006522569631180e-01 +1705 1715 6.690128883233522e-01 +1705 1716 9.933317053474540e-01 +1705 1717 6.265934279351906e-01 +1705 1718 2.023782023491832e-01 +1705 1719 1.037216001587787e-02 +1705 1990 -1.014809266520459e-02 +1705 1991 -1.391183040317306e-01 +1705 1992 -2.017600458799614e-01 +1705 1993 -2.324486740935230e-02 +1705 1994 1.242615554319796e-01 +1705 1995 -3.260165948376709e-02 +1705 1996 -6.193432351705006e-02 +1705 1997 8.061353422324678e-02 +1705 1998 -3.464021496124754e-02 +1706 1711 4.956823738510902e-02 +1706 1712 -1.172434297766245e-01 +1706 1713 9.337627083999317e-02 +1706 1714 5.241160046681232e-02 +1706 1715 -2.230447400475984e-01 +1706 1716 5.065880465089723e-02 +1706 1717 6.333540438136590e-01 +1706 1718 9.472480027386739e-01 +1706 1719 9.998140432063428e-01 +1706 1990 9.998140432063428e-01 +1706 1991 9.472480027386740e-01 +1706 1992 6.333540438136621e-01 +1706 1993 5.065880465089723e-02 +1706 1994 -2.230447400475985e-01 +1706 1995 5.241160046681231e-02 +1706 1996 9.337627083999461e-02 +1706 1997 -1.172434297766245e-01 +1706 1998 4.956823738510902e-02 +1707 1711 -3.464021496124753e-02 +1707 1712 8.061353422324678e-02 +1707 1713 -6.193432351704910e-02 +1707 1714 -3.260165948376709e-02 +1707 1715 1.242615554319796e-01 +1707 1716 -2.324486740935229e-02 +1707 1717 -2.017600458799610e-01 +1707 1718 -1.391183040317306e-01 +1707 1719 -1.014809266520459e-02 +1707 1990 1.037216001587787e-02 +1707 1991 2.023782023491832e-01 +1707 1992 6.265934279351871e-01 +1707 1993 9.933317053474537e-01 +1707 1994 6.690128883233522e-01 +1707 1995 -1.006522569631180e-01 +1707 1996 -1.504395625967418e-01 +1707 1997 1.739602865291649e-01 +1707 1998 -7.107467396219300e-02 +1708 1711 2.304476016309003e-02 +1708 1712 -5.317155405934297e-02 +1708 1713 4.011304269704069e-02 +1708 1714 2.048688777259661e-02 +1708 1715 -7.459286110187005e-02 +1708 1716 1.306870827770991e-02 +1708 1717 1.040152149855681e-01 +1708 1718 6.510554638922900e-02 +1708 1719 4.424225860598832e-03 +1708 1990 -4.475936270564452e-03 +1708 1991 -7.934326425256401e-02 +1708 1992 -1.820905196773939e-01 +1708 1993 -4.002974318364956e-02 +1708 1994 5.879695423797848e-01 +1708 1995 9.980348603289085e-01 +1708 1996 3.299673359533328e-01 +1708 1997 -2.889109156923227e-01 +1708 1998 1.077898942356778e-01 +1709 1711 -1.323457091334452e-02 +1709 1712 3.039815995453297e-02 +1709 1713 -2.271675331676638e-02 +1709 1714 -1.142812838892215e-02 +1709 1715 4.071918096306302e-02 +1709 1716 -6.933037876038323e-03 +1709 1717 -5.333825339575225e-02 +1709 1718 -3.228741036227884e-02 +1709 1719 -2.146531909365995e-03 +1709 1990 2.165125410075797e-03 +1709 1991 3.738448385480582e-02 +1709 1992 8.043313241304523e-02 +1709 1993 1.531926222076498e-02 +1709 1994 -1.509472923848863e-01 +1709 1995 8.941016994555659e-02 +1709 1996 8.453519213002947e-01 +1709 1997 8.194556018114629e-01 +1709 1998 -1.946603400966539e-01 +1710 1711 4.320187133486105e-03 +1710 1712 -9.903211170919021e-03 +1710 1713 7.370407434919043e-03 +1710 1714 3.684009202837234e-03 +1710 1715 -1.300883063495640e-02 +1710 1716 2.189690916089075e-03 +1710 1717 1.662768741732008e-02 +1710 1718 9.942562460241758e-03 +1710 1719 6.559061877940180e-04 +1710 1990 -6.608998355542529e-04 +1710 1991 -1.130981914556023e-02 +1710 1992 -2.383468761167508e-02 +1710 1993 -4.360522943874512e-03 +1710 1994 3.963055707113167e-02 +1710 1995 -1.934548288090396e-02 +1710 1996 -8.108833879502420e-02 +1710 1997 3.648015281808015e-01 +1710 1998 1.128886721016076e+00 diff --git a/packages/muelu/research/caglusa/transfer1.mtx b/packages/muelu/research/caglusa/transfer1.mtx new file mode 100644 index 000000000000..f0124895c60a --- /dev/null +++ b/packages/muelu/research/caglusa/transfer1.mtx @@ -0,0 +1,1299 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 1296 +10 19 1.129411500546784e+00 +10 20 3.670587123461224e-01 +10 21 -8.049160724422064e-02 +10 22 -2.032779703371170e-02 +10 23 3.979771743152476e-02 +10 24 -3.653023273099719e-03 +10 25 -2.390769583422672e-02 +10 26 -1.192764283693718e-02 +10 27 -1.348774781601022e-03 +10 154 -1.404900490503611e-03 +10 155 8.456008732827812e-03 +10 156 1.672578661970231e-02 +10 157 3.291630094558674e-03 +10 158 -1.302036143571055e-02 +10 159 3.171144008953387e-03 +10 160 7.629997726553140e-03 +10 161 -9.870537642513787e-03 +10 162 4.263507388379960e-03 +11 19 -1.954658507609646e-01 +11 20 8.172051897065897e-01 +11 21 8.485883218629846e-01 +11 22 9.418268414471946e-02 +11 23 -1.517806004204933e-01 +11 24 1.284495107653860e-02 +11 25 8.073455683811782e-02 +11 26 3.944978508915502e-02 +11 27 4.421028511261784e-03 +11 154 4.605202828173344e-03 +11 155 -2.749708002972579e-02 +11 156 -5.370424636744751e-02 +11 157 -1.042829283213487e-02 +11 158 4.076937575409446e-02 +11 159 -9.838954046684511e-03 +11 160 -2.351877609164781e-02 +11 161 3.029868819615783e-02 +11 162 -1.306097437910806e-02 +12 19 1.082520994427544e-01 +12 20 -2.889831904537400e-01 +12 21 3.248829650141348e-01 +12 22 9.970774308689467e-01 +12 23 5.961024869195356e-01 +12 24 -3.367981223730957e-02 +12 25 -1.831797001588231e-01 +12 26 -8.387339051456290e-02 +12 27 -9.153920411521620e-03 +12 154 -9.536487527815716e-03 +12 155 5.565587845590155e-02 +12 156 1.049965395863454e-01 +12 157 1.968737235177261e-02 +12 158 -7.474799342411907e-02 +12 159 1.764558218850805e-02 +12 160 4.153712972513366e-02 +12 161 -5.300084402367374e-02 +12 162 2.274263328845924e-02 +13 19 -7.138223443736702e-02 +13 20 1.740834065912312e-01 +13 21 -1.484845065565620e-01 +13 22 -1.049235629513360e-01 +13 23 6.609088867175748e-01 +13 24 9.949463440350268e-01 +13 25 6.382749766949400e-01 +13 26 2.153988514319247e-01 +13 27 2.132780628751801e-02 +13 154 2.222904272397270e-02 +13 155 -1.203321158231247e-01 +13 156 -2.050845425549297e-01 +13 157 -3.514679863874003e-02 +13 158 1.247508637700272e-01 +13 159 -2.810481414958162e-02 +13 160 -6.415690610906792e-02 +13 161 8.036418450606789e-02 +13 162 -3.418648665710605e-02 +14 19 4.978351309021659e-02 +14 20 -1.173453856460456e-01 +14 21 9.221850329093995e-02 +14 22 5.474453575062167e-02 +14 23 -2.222222222222224e-01 +14 24 4.193559628619540e-02 +14 25 6.214620396774779e-01 +14 26 9.411301078682682e-01 +14 27 9.992308119045477e-01 +14 154 9.991659071164496e-01 +14 155 9.637381299190195e-01 +14 156 6.685317818820811e-01 +14 157 7.756624663124041e-02 +14 158 -2.250097461981359e-01 +14 159 4.527085932434232e-02 +14 160 9.680002677732708e-02 +14 161 -1.169072266770419e-01 +14 162 4.892010347784934e-02 +15 19 -3.479092359412759e-02 +15 20 8.068968438828850e-02 +15 21 -6.118162989078881e-02 +15 22 -3.407479357032987e-02 +15 23 1.239997546686380e-01 +15 24 -1.932067089943150e-02 +15 25 -2.003414469256311e-01 +15 26 -1.448427411451554e-01 +15 27 -2.040102646753046e-02 +15 154 -2.122406618320637e-02 +15 155 1.638834942818611e-01 +15 156 5.908729099917706e-01 +15 157 9.872680225564834e-01 +15 158 6.930142900106389e-01 +15 159 -8.746827606549312e-02 +15 160 -1.562414202367707e-01 +15 161 1.735461889579596e-01 +15 162 -7.014864448376784e-02 +16 19 2.314511493126580e-02 +16 20 -5.322385868251331e-02 +16 21 3.963041032797538e-02 +16 22 2.141880768979494e-02 +16 23 -7.448107462312177e-02 +16 24 1.087558270779069e-02 +16 25 1.035174746041493e-01 +16 26 6.804174656093516e-02 +16 27 8.940094922500905e-03 +16 154 9.304627513003604e-03 +16 155 -6.553722357732739e-02 +16 156 -1.779730806361799e-01 +16 157 -5.836068874828158e-02 +16 158 5.633270268658448e-01 +16 159 1.000434281158169e+00 +16 160 3.452595702976103e-01 +16 161 -2.886220660439252e-01 +16 162 1.063980508661014e-01 +17 19 -1.329223336631334e-02 +17 20 3.042868713306708e-02 +17 21 -2.244483970189554e-02 +17 22 -1.194967046758751e-02 +17 23 4.066948930938207e-02 +17 24 -5.772473560016135e-03 +17 25 -5.312732759263696e-02 +17 26 -3.378505081770156e-02 +17 27 -4.344146984209206e-03 +17 154 -4.521837380474279e-03 +17 155 3.103952022230707e-02 +17 156 7.913119828262959e-02 +17 157 2.256106420246836e-02 +17 158 -1.481216636084519e-01 +17 159 7.530256232865365e-02 +17 160 8.354799925575341e-01 +17 161 8.261490472781701e-01 +17 162 -1.922333967540069e-01 +18 19 4.339014147752001e-03 +18 20 -9.913245383000176e-03 +18 21 7.282382897431911e-03 +18 22 3.852365568882107e-03 +18 23 -1.299443778081731e-02 +18 24 1.823505864305507e-03 +18 25 1.656712269663253e-02 +18 26 1.040833436407406e-02 +18 27 1.328127019033700e-03 +18 154 1.382511400400587e-03 +18 155 -9.406612181739370e-03 +18 156 -2.349634680397213e-02 +18 157 -6.438555617366876e-03 +18 158 3.903820826581222e-02 +18 159 -1.641238474686723e-02 +18 160 -8.278961464667198e-02 +18 161 3.580425654487990e-01 +18 162 1.127305207253199e+00 +289 298 1.128366176813768e+00 +289 299 3.625696666431104e-01 +289 300 -8.166430317487385e-02 +289 301 -1.837543629657486e-02 +289 302 3.945012074512166e-02 +289 303 -5.053685754328682e-03 +289 304 -2.374277521713673e-02 +289 305 -1.068977305722691e-02 +289 306 1.708965696038116e-05 +289 433 -1.709302139429073e-05 +289 434 9.466746917004418e-03 +289 435 1.667404124422424e-02 +289 436 2.552800450746999e-03 +289 437 -1.301790673093653e-02 +289 438 3.516086961442617e-03 +289 439 7.456796970088174e-03 +289 440 -9.892858960996915e-03 +289 441 4.301521654480856e-03 +290 298 -1.938614287778284e-01 +290 299 8.216733652996333e-01 +290 300 8.421220797288179e-01 +290 301 8.472100426512393e-02 +290 302 -1.500686725732941e-01 +290 303 1.773915858549195e-02 +290 304 8.006921488188760e-02 +290 305 3.531457764737303e-02 +290 306 -5.595618335334461e-05 +290 433 5.596871053662927e-05 +290 434 -3.075580596521752e-02 +290 435 -5.350367303591450e-02 +290 436 -8.084316013180937e-03 +290 437 4.075221600345585e-02 +290 438 -1.090786665131195e-02 +290 439 -2.298363784337890e-02 +290 440 3.036665407732237e-02 +290 441 -1.317740310464598e-02 +291 298 1.073315976272178e-01 +291 299 -2.888275962935750e-01 +291 300 3.350058980661361e-01 +291 301 9.989050150191328e-01 +291 302 5.798793834472796e-01 +291 303 -4.619728649369591e-02 +291 304 -1.808717595023318e-01 +291 305 -7.482139085349031e-02 +291 306 1.154990208376132e-04 +291 433 -1.155338596761628e-04 +291 434 6.209354315549899e-02 +291 435 1.044248256883649e-01 +291 436 1.524650300188077e-02 +291 437 -7.467408580228516e-02 +291 438 1.955698244580616e-02 +291 439 4.058683714390226e-02 +291 440 -5.311752720233282e-02 +291 441 2.294526587804998e-02 +292 298 -7.076973567865519e-02 +292 299 1.738311063922715e-01 +292 300 -1.523642479414673e-01 +292 301 -9.636414324008422e-02 +292 302 6.769836828056056e-01 +292 303 9.915336948183731e-01 +292 304 6.149181743789619e-01 +292 305 1.895801827549052e-01 +292 306 -2.662369847738061e-04 +292 433 2.663879327057138e-04 +292 434 -1.331889094121588e-01 +292 435 -2.030137423104386e-01 +292 436 -2.715118332449053e-02 +292 437 1.244724005874631e-01 +292 438 -3.113082607241056e-02 +292 439 -6.267350218520711e-02 +292 440 8.053474359210504e-02 +292 441 -3.449079747461022e-02 +293 298 4.935480306222328e-02 +293 299 -1.171375535475385e-01 +293 300 9.451407923598232e-02 +293 301 5.007918356887609e-02 +293 302 -2.237771384824100e-01 +293 303 5.941431472920292e-02 +293 304 6.450456938723828e-01 +293 305 9.530008288133119e-01 +293 306 9.999998747281572e-01 +293 433 9.999998747281572e-01 +293 434 9.530008288133119e-01 +293 435 6.450456938723844e-01 +293 436 5.941431472920296e-02 +293 437 -2.237771384824103e-01 +293 438 5.007918356887621e-02 +293 439 9.451407923598393e-02 +293 440 -1.171375535475377e-01 +293 441 4.935480306222310e-02 +294 298 -3.449079747461033e-02 +294 299 8.053474359210555e-02 +294 300 -6.267350218520604e-02 +294 301 -3.113082607241048e-02 +294 302 1.244724005874630e-01 +294 303 -2.715118332449049e-02 +294 304 -2.030137423104384e-01 +294 305 -1.331889094121588e-01 +294 306 2.663879327057138e-04 +294 433 -2.662369847738061e-04 +294 434 1.895801827549052e-01 +294 435 6.149181743789601e-01 +294 436 9.915336948183735e-01 +294 437 6.769836828056061e-01 +294 438 -9.636414324008441e-02 +294 439 -1.523642479414699e-01 +294 440 1.738311063922703e-01 +294 441 -7.076973567865490e-02 +295 298 2.294526587805002e-02 +295 299 -5.311752720233307e-02 +295 300 4.058683714390150e-02 +295 301 1.955698244580607e-02 +295 302 -7.467408580228493e-02 +295 303 1.524650300188073e-02 +295 304 1.044248256883646e-01 +295 305 6.209354315549886e-02 +295 306 -1.155338596761626e-04 +295 433 1.154990208376130e-04 +295 434 -7.482139085349016e-02 +295 435 -1.808717595023313e-01 +295 436 -4.619728649369586e-02 +295 437 5.798793834472792e-01 +295 438 9.989050150191330e-01 +295 439 3.350058980661417e-01 +295 440 -2.888275962935725e-01 +295 441 1.073315976272172e-01 +296 298 -1.317740310464602e-02 +296 299 3.036665407732255e-02 +296 300 -2.298363784337850e-02 +296 301 -1.090786665131192e-02 +296 302 4.075221600345579e-02 +296 303 -8.084316013180923e-03 +296 304 -5.350367303591442e-02 +296 305 -3.075580596521749e-02 +296 306 5.596871053662920e-05 +296 433 -5.595618335334456e-05 +296 434 3.531457764737298e-02 +296 435 8.006921488188745e-02 +296 436 1.773915858549195e-02 +296 437 -1.500686725732940e-01 +296 438 8.472100426512388e-02 +296 439 8.421220797288150e-01 +296 440 8.216733652996328e-01 +296 441 -1.938614287778283e-01 +297 298 4.301521654480888e-03 +297 299 -9.892858960997019e-03 +297 300 7.456796970088079e-03 +297 301 3.516086961442622e-03 +297 302 -1.301790673093657e-02 +297 303 2.552800450747007e-03 +297 304 1.667404124422430e-02 +297 305 9.466746917004457e-03 +297 306 -1.709302139429080e-05 +297 433 1.708965696038123e-05 +297 434 -1.068977305722695e-02 +297 435 -2.374277521713681e-02 +297 436 -5.053685754328706e-03 +297 437 3.945012074512185e-02 +297 438 -1.837543629657497e-02 +297 439 -8.166430317487527e-02 +297 440 3.625696666431093e-01 +297 441 1.128366176813768e+00 +577 586 1.128366176813768e+00 +577 587 3.625696666431092e-01 +577 588 -8.166430317487527e-02 +577 589 -1.837543629657496e-02 +577 590 3.945012074512184e-02 +577 591 -5.053685754328704e-03 +577 592 -2.374277521713683e-02 +577 593 -1.068977305722695e-02 +577 594 1.708965696030355e-05 +577 721 -1.709302139421308e-05 +577 722 9.466746917004457e-03 +577 723 1.667404124422430e-02 +577 724 2.552800450747008e-03 +577 725 -1.301790673093658e-02 +577 726 3.516086961442629e-03 +577 727 7.456796970088204e-03 +577 728 -9.892858960996953e-03 +577 729 4.301521654480592e-03 +578 586 -1.938614287778283e-01 +578 587 8.216733652996328e-01 +578 588 8.421220797288150e-01 +578 589 8.472100426512387e-02 +578 590 -1.500686725732940e-01 +578 591 1.773915858549195e-02 +578 592 8.006921488188753e-02 +578 593 3.531457764737300e-02 +578 594 -5.595618335309022e-05 +578 721 5.596871053637475e-05 +578 722 -3.075580596521750e-02 +578 723 -5.350367303591444e-02 +578 724 -8.084316013180928e-03 +578 725 4.075221600345583e-02 +578 726 -1.090786665131194e-02 +578 727 -2.298363784337889e-02 +578 728 3.036665407732235e-02 +578 729 -1.317740310464511e-02 +579 586 1.073315976272172e-01 +579 587 -2.888275962935725e-01 +579 588 3.350058980661417e-01 +579 589 9.989050150191331e-01 +579 590 5.798793834472792e-01 +579 591 -4.619728649369586e-02 +579 592 -1.808717595023315e-01 +579 593 -7.482139085349018e-02 +579 594 1.154990208370880e-04 +579 721 -1.155338596756373e-04 +579 722 6.209354315549889e-02 +579 723 1.044248256883647e-01 +579 724 1.524650300188074e-02 +579 725 -7.467408580228500e-02 +579 726 1.955698244580611e-02 +579 727 4.058683714390219e-02 +579 728 -5.311752720233272e-02 +579 729 2.294526587804845e-02 +580 586 -7.076973567865490e-02 +580 587 1.738311063922703e-01 +580 588 -1.523642479414699e-01 +580 589 -9.636414324008440e-02 +580 590 6.769836828056059e-01 +580 591 9.915336948183734e-01 +580 592 6.149181743789619e-01 +580 593 1.895801827549052e-01 +580 594 -2.662369847725961e-04 +580 721 2.663879327045024e-04 +580 722 -1.331889094121588e-01 +580 723 -2.030137423104384e-01 +580 724 -2.715118332449051e-02 +580 725 1.244724005874631e-01 +580 726 -3.113082607241054e-02 +580 727 -6.267350218520709e-02 +580 728 8.053474359210501e-02 +580 729 -3.449079747460796e-02 +581 586 4.935480306222310e-02 +581 587 -1.171375535475376e-01 +581 588 9.451407923598390e-02 +581 589 5.007918356887619e-02 +581 590 -2.237771384824102e-01 +581 591 5.941431472920294e-02 +581 592 6.450456938723828e-01 +581 593 9.530008288133118e-01 +581 594 9.999998747281572e-01 +581 721 9.999998747281570e-01 +581 722 9.530008288133118e-01 +581 723 6.450456938723828e-01 +581 724 5.941431472920293e-02 +581 725 -2.237771384824102e-01 +581 726 5.007918356887618e-02 +581 727 9.451407923598391e-02 +581 728 -1.171375535475376e-01 +581 729 4.935480306221989e-02 +582 586 -3.449079747461021e-02 +582 587 8.053474359210501e-02 +582 588 -6.267350218520708e-02 +582 589 -3.113082607241055e-02 +582 590 1.244724005874631e-01 +582 591 -2.715118332449051e-02 +582 592 -2.030137423104384e-01 +582 593 -1.331889094121588e-01 +582 594 2.663879327045024e-04 +582 721 -2.662369847725961e-04 +582 722 1.895801827549052e-01 +582 723 6.149181743789619e-01 +582 724 9.915336948183732e-01 +582 725 6.769836828056059e-01 +582 726 -9.636414324008437e-02 +582 727 -1.523642479414699e-01 +582 728 1.738311063922703e-01 +582 729 -7.076973567865032e-02 +583 586 2.294526587804994e-02 +583 587 -5.311752720233272e-02 +583 588 4.058683714390218e-02 +583 589 1.955698244580612e-02 +583 590 -7.467408580228500e-02 +583 591 1.524650300188074e-02 +583 592 1.044248256883647e-01 +583 593 6.209354315549889e-02 +583 594 -1.155338596756373e-04 +583 721 1.154990208370880e-04 +583 722 -7.482139085349018e-02 +583 723 -1.808717595023315e-01 +583 724 -4.619728649369585e-02 +583 725 5.798793834472792e-01 +583 726 9.989050150191328e-01 +583 727 3.350058980661418e-01 +583 728 -2.888275962935726e-01 +583 729 1.073315976272103e-01 +584 586 -1.317740310464597e-02 +584 587 3.036665407732235e-02 +584 588 -2.298363784337889e-02 +584 589 -1.090786665131195e-02 +584 590 4.075221600345583e-02 +584 591 -8.084316013180930e-03 +584 592 -5.350367303591444e-02 +584 593 -3.075580596521750e-02 +584 594 5.596871053637475e-05 +584 721 -5.595618335309020e-05 +584 722 3.531457764737300e-02 +584 723 8.006921488188753e-02 +584 724 1.773915858549194e-02 +584 725 -1.500686725732940e-01 +584 726 8.472100426512386e-02 +584 727 8.421220797288153e-01 +584 728 8.216733652996330e-01 +584 729 -1.938614287778163e-01 +585 586 4.301521654480873e-03 +585 587 -9.892858960996953e-03 +585 588 7.456796970088204e-03 +585 589 3.516086961442631e-03 +585 590 -1.301790673093658e-02 +585 591 2.552800450747009e-03 +585 592 1.667404124422430e-02 +585 593 9.466746917004458e-03 +585 594 -1.709302139421309e-05 +585 721 1.708965696030355e-05 +585 722 -1.068977305722695e-02 +585 723 -2.374277521713683e-02 +585 724 -5.053685754328705e-03 +585 725 3.945012074512186e-02 +585 726 -1.837543629657496e-02 +585 727 -8.166430317487529e-02 +585 728 3.625696666431094e-01 +585 729 1.128366176813761e+00 +856 865 1.128366176813760e+00 +856 866 3.625696666431092e-01 +856 867 -8.166430317487527e-02 +856 868 -1.837543629657496e-02 +856 869 3.945012074512184e-02 +856 870 -5.053685754328704e-03 +856 871 -2.374277521713683e-02 +856 872 -1.068977305722695e-02 +856 873 1.708965696030355e-05 +856 1000 -1.709302139421308e-05 +856 1001 9.466746917004457e-03 +856 1002 1.667404124422430e-02 +856 1003 2.552800450747008e-03 +856 1004 -1.301790673093658e-02 +856 1005 3.516086961442629e-03 +856 1006 7.456796970088204e-03 +856 1007 -9.892858960996953e-03 +856 1008 4.301521654480592e-03 +857 865 -1.938614287778163e-01 +857 866 8.216733652996328e-01 +857 867 8.421220797288150e-01 +857 868 8.472100426512387e-02 +857 869 -1.500686725732940e-01 +857 870 1.773915858549195e-02 +857 871 8.006921488188753e-02 +857 872 3.531457764737300e-02 +857 873 -5.595618335309022e-05 +857 1000 5.596871053637475e-05 +857 1001 -3.075580596521750e-02 +857 1002 -5.350367303591444e-02 +857 1003 -8.084316013180928e-03 +857 1004 4.075221600345583e-02 +857 1005 -1.090786665131194e-02 +857 1006 -2.298363784337889e-02 +857 1007 3.036665407732235e-02 +857 1008 -1.317740310464511e-02 +858 865 1.073315976272103e-01 +858 866 -2.888275962935725e-01 +858 867 3.350058980661417e-01 +858 868 9.989050150191331e-01 +858 869 5.798793834472792e-01 +858 870 -4.619728649369586e-02 +858 871 -1.808717595023315e-01 +858 872 -7.482139085349018e-02 +858 873 1.154990208370880e-04 +858 1000 -1.155338596756373e-04 +858 1001 6.209354315549889e-02 +858 1002 1.044248256883647e-01 +858 1003 1.524650300188074e-02 +858 1004 -7.467408580228500e-02 +858 1005 1.955698244580611e-02 +858 1006 4.058683714390219e-02 +858 1007 -5.311752720233272e-02 +858 1008 2.294526587804845e-02 +859 865 -7.076973567865032e-02 +859 866 1.738311063922703e-01 +859 867 -1.523642479414699e-01 +859 868 -9.636414324008440e-02 +859 869 6.769836828056059e-01 +859 870 9.915336948183734e-01 +859 871 6.149181743789619e-01 +859 872 1.895801827549052e-01 +859 873 -2.662369847725961e-04 +859 1000 2.663879327045024e-04 +859 1001 -1.331889094121588e-01 +859 1002 -2.030137423104384e-01 +859 1003 -2.715118332449051e-02 +859 1004 1.244724005874631e-01 +859 1005 -3.113082607241054e-02 +859 1006 -6.267350218520709e-02 +859 1007 8.053474359210501e-02 +859 1008 -3.449079747460796e-02 +860 865 4.935480306221989e-02 +860 866 -1.171375535475376e-01 +860 867 9.451407923598390e-02 +860 868 5.007918356887619e-02 +860 869 -2.237771384824102e-01 +860 870 5.941431472920294e-02 +860 871 6.450456938723828e-01 +860 872 9.530008288133118e-01 +860 873 9.999998747281572e-01 +860 1000 9.999998747281570e-01 +860 1001 9.530008288133118e-01 +860 1002 6.450456938723828e-01 +860 1003 5.941431472920293e-02 +860 1004 -2.237771384824102e-01 +860 1005 5.007918356887618e-02 +860 1006 9.451407923598391e-02 +860 1007 -1.171375535475376e-01 +860 1008 4.935480306221989e-02 +861 865 -3.449079747460796e-02 +861 866 8.053474359210501e-02 +861 867 -6.267350218520708e-02 +861 868 -3.113082607241055e-02 +861 869 1.244724005874631e-01 +861 870 -2.715118332449051e-02 +861 871 -2.030137423104384e-01 +861 872 -1.331889094121588e-01 +861 873 2.663879327045024e-04 +861 1000 -2.662369847725961e-04 +861 1001 1.895801827549052e-01 +861 1002 6.149181743789619e-01 +861 1003 9.915336948183732e-01 +861 1004 6.769836828056059e-01 +861 1005 -9.636414324008437e-02 +861 1006 -1.523642479414699e-01 +861 1007 1.738311063922703e-01 +861 1008 -7.076973567865032e-02 +862 865 2.294526587804845e-02 +862 866 -5.311752720233272e-02 +862 867 4.058683714390218e-02 +862 868 1.955698244580612e-02 +862 869 -7.467408580228500e-02 +862 870 1.524650300188074e-02 +862 871 1.044248256883647e-01 +862 872 6.209354315549889e-02 +862 873 -1.155338596756373e-04 +862 1000 1.154990208370880e-04 +862 1001 -7.482139085349018e-02 +862 1002 -1.808717595023315e-01 +862 1003 -4.619728649369585e-02 +862 1004 5.798793834472792e-01 +862 1005 9.989050150191328e-01 +862 1006 3.350058980661418e-01 +862 1007 -2.888275962935726e-01 +862 1008 1.073315976272103e-01 +863 865 -1.317740310464511e-02 +863 866 3.036665407732235e-02 +863 867 -2.298363784337889e-02 +863 868 -1.090786665131195e-02 +863 869 4.075221600345583e-02 +863 870 -8.084316013180930e-03 +863 871 -5.350367303591444e-02 +863 872 -3.075580596521750e-02 +863 873 5.596871053637475e-05 +863 1000 -5.595618335309020e-05 +863 1001 3.531457764737300e-02 +863 1002 8.006921488188753e-02 +863 1003 1.773915858549194e-02 +863 1004 -1.500686725732940e-01 +863 1005 8.472100426512386e-02 +863 1006 8.421220797288153e-01 +863 1007 8.216733652996330e-01 +863 1008 -1.938614287778163e-01 +864 865 4.301521654480593e-03 +864 866 -9.892858960996953e-03 +864 867 7.456796970088204e-03 +864 868 3.516086961442631e-03 +864 869 -1.301790673093658e-02 +864 870 2.552800450747009e-03 +864 871 1.667404124422430e-02 +864 872 9.466746917004458e-03 +864 873 -1.709302139421309e-05 +864 1000 1.708965696030355e-05 +864 1001 -1.068977305722695e-02 +864 1002 -2.374277521713683e-02 +864 1003 -5.053685754328705e-03 +864 1004 3.945012074512186e-02 +864 1005 -1.837543629657496e-02 +864 1006 -8.166430317487529e-02 +864 1007 3.625696666431094e-01 +864 1008 1.128366176813761e+00 +1144 1153 1.128366176813760e+00 +1144 1154 3.625696666431113e-01 +1144 1155 -8.166430317487221e-02 +1144 1156 -1.837543629657486e-02 +1144 1157 3.945012074512196e-02 +1144 1158 -5.053685754328662e-03 +1144 1159 -2.374277521713650e-02 +1144 1160 -1.068977305722682e-02 +1144 1161 1.708965696030335e-05 +1144 1288 -1.709302139421289e-05 +1144 1289 9.466746917004342e-03 +1144 1290 1.667404124422407e-02 +1144 1291 2.552800450746984e-03 +1144 1292 -1.301790673093648e-02 +1144 1293 3.516086961442843e-03 +1144 1294 7.456796970087964e-03 +1144 1295 -9.892858960997076e-03 +1144 1296 4.301521654480617e-03 +1145 1153 -1.938614287778170e-01 +1145 1154 8.216733652996351e-01 +1145 1155 8.421220797288200e-01 +1145 1156 8.472100426512477e-02 +1145 1157 -1.500686725732963e-01 +1145 1158 1.773915858549200e-02 +1145 1159 8.006921488188734e-02 +1145 1160 3.531457764737298e-02 +1145 1161 -5.595618335309020e-05 +1145 1288 5.596871053637476e-05 +1145 1289 -3.075580596521747e-02 +1145 1290 -5.350367303591431e-02 +1145 1291 -8.084316013180940e-03 +1145 1292 4.075221600345594e-02 +1145 1293 -1.090786665131273e-02 +1145 1294 -2.298363784337840e-02 +1145 1295 3.036665407732306e-02 +1145 1296 -1.317740310464533e-02 +1146 1153 1.073315976272113e-01 +1146 1154 -2.888275962935771e-01 +1146 1155 3.350058980661297e-01 +1146 1156 9.989050150191312e-01 +1146 1157 5.798793834472813e-01 +1146 1158 -4.619728649369560e-02 +1146 1159 -1.808717595023298e-01 +1146 1160 -7.482139085348972e-02 +1146 1161 1.154990208370873e-04 +1146 1288 -1.155338596756367e-04 +1146 1289 6.209354315549849e-02 +1146 1290 1.044248256883639e-01 +1146 1291 1.524650300188069e-02 +1146 1292 -7.467408580228488e-02 +1146 1293 1.955698244580743e-02 +1146 1294 4.058683714390114e-02 +1146 1295 -5.311752720233373e-02 +1146 1296 2.294526587804873e-02 +1147 1153 -7.076973567865066e-02 +1147 1154 1.738311063922721e-01 +1147 1155 -1.523642479414637e-01 +1147 1156 -9.636414324008365e-02 +1147 1157 6.769836828056082e-01 +1147 1158 9.915336948183725e-01 +1147 1159 6.149181743789578e-01 +1147 1160 1.895801827549048e-01 +1147 1161 -2.662369847725954e-04 +1147 1288 2.663879327045018e-04 +1147 1289 -1.331889094121583e-01 +1147 1290 -2.030137423104374e-01 +1147 1291 -2.715118332449046e-02 +1147 1292 1.244724005874630e-01 +1147 1293 -3.113082607241265e-02 +1147 1294 -6.267350218520550e-02 +1147 1295 8.053474359210658e-02 +1147 1296 -3.449079747460840e-02 +1148 1153 4.935480306222046e-02 +1148 1154 -1.171375535475397e-01 +1148 1155 9.451407923598085e-02 +1148 1156 5.007918356887627e-02 +1148 1157 -2.237771384824134e-01 +1148 1158 5.941431472920337e-02 +1148 1159 6.450456938723853e-01 +1148 1160 9.530008288133118e-01 +1148 1161 9.999998747281572e-01 +1148 1288 9.999998747281575e-01 +1148 1289 9.530008288133115e-01 +1148 1290 6.450456938723842e-01 +1148 1291 5.941431472920317e-02 +1148 1292 -2.237771384824110e-01 +1148 1293 5.007918356887977e-02 +1148 1294 9.451407923598192e-02 +1148 1295 -1.171375535475405e-01 +1148 1296 4.935480306222076e-02 +1149 1153 -3.449079747460834e-02 +1149 1154 8.053474359210636e-02 +1149 1155 -6.267350218520504e-02 +1149 1156 -3.113082607241060e-02 +1149 1157 1.244724005874648e-01 +1149 1158 -2.715118332449067e-02 +1149 1159 -2.030137423104386e-01 +1149 1160 -1.331889094121589e-01 +1149 1161 2.663879327045028e-04 +1149 1288 -2.662369847725965e-04 +1149 1289 1.895801827549055e-01 +1149 1290 6.149181743789592e-01 +1149 1291 9.915336948183732e-01 +1149 1292 6.769836828056037e-01 +1149 1293 -9.636414324009077e-02 +1149 1294 -1.523642479414661e-01 +1149 1295 1.738311063922740e-01 +1149 1296 -7.076973567865137e-02 +1150 1153 2.294526587804861e-02 +1150 1154 -5.311752720233340e-02 +1150 1155 4.058683714390072e-02 +1150 1156 1.955698244580608e-02 +1150 1157 -7.467408580228575e-02 +1150 1158 1.524650300188076e-02 +1150 1159 1.044248256883642e-01 +1150 1160 6.209354315549864e-02 +1150 1161 -1.155338596756369e-04 +1150 1288 1.154990208370876e-04 +1150 1289 -7.482139085348988e-02 +1150 1290 -1.808717595023301e-01 +1150 1291 -4.619728649369568e-02 +1150 1292 5.798793834472818e-01 +1150 1293 9.989050150191321e-01 +1150 1294 3.350058980661300e-01 +1150 1295 -2.888275962935772e-01 +1150 1296 1.073315976272114e-01 +1151 1153 -1.317740310464513e-02 +1151 1154 3.036665407732257e-02 +1151 1155 -2.298363784337793e-02 +1151 1156 -1.090786665131186e-02 +1151 1157 4.075221600345601e-02 +1151 1158 -8.084316013180892e-03 +1151 1159 -5.350367303591389e-02 +1151 1160 -3.075580596521720e-02 +1151 1161 5.596871053637422e-05 +1151 1288 -5.595618335308970e-05 +1151 1289 3.531457764737264e-02 +1151 1290 8.006921488188645e-02 +1151 1291 1.773915858549178e-02 +1151 1292 -1.500686725732933e-01 +1151 1293 8.472100426512991e-02 +1151 1294 8.421220797288217e-01 +1151 1295 8.216733652996332e-01 +1151 1296 -1.938614287778163e-01 +1152 1153 4.301521654480565e-03 +1152 1154 -9.892858960996944e-03 +1152 1155 7.456796970087833e-03 +1152 1156 3.516086961442576e-03 +1152 1157 -1.301790673093653e-02 +1152 1158 2.552800450746977e-03 +1152 1159 1.667404124422400e-02 +1152 1160 9.466746917004288e-03 +1152 1161 -1.709302139421278e-05 +1152 1288 1.708965696030325e-05 +1152 1289 -1.068977305722675e-02 +1152 1290 -2.374277521713631e-02 +1152 1291 -5.053685754328613e-03 +1152 1292 3.945012074512129e-02 +1152 1293 -1.837543629657603e-02 +1152 1294 -8.166430317487262e-02 +1152 1295 3.625696666431116e-01 +1152 1296 1.128366176813760e+00 +1423 1432 1.128366176813760e+00 +1423 1433 3.625696666431113e-01 +1423 1434 -8.166430317487221e-02 +1423 1435 -1.837543629657486e-02 +1423 1436 3.945012074512196e-02 +1423 1437 -5.053685754328662e-03 +1423 1438 -2.374277521713650e-02 +1423 1439 -1.068977305722682e-02 +1423 1440 1.708965696030335e-05 +1423 1567 -1.709302139421289e-05 +1423 1568 9.466746917004342e-03 +1423 1569 1.667404124422407e-02 +1423 1570 2.552800450746984e-03 +1423 1571 -1.301790673093648e-02 +1423 1572 3.516086961442843e-03 +1423 1573 7.456796970087964e-03 +1423 1574 -9.892858960997076e-03 +1423 1575 4.301521654480617e-03 +1424 1432 -1.938614287778170e-01 +1424 1433 8.216733652996351e-01 +1424 1434 8.421220797288200e-01 +1424 1435 8.472100426512477e-02 +1424 1436 -1.500686725732963e-01 +1424 1437 1.773915858549200e-02 +1424 1438 8.006921488188734e-02 +1424 1439 3.531457764737298e-02 +1424 1440 -5.595618335309020e-05 +1424 1567 5.596871053637476e-05 +1424 1568 -3.075580596521747e-02 +1424 1569 -5.350367303591431e-02 +1424 1570 -8.084316013180940e-03 +1424 1571 4.075221600345594e-02 +1424 1572 -1.090786665131273e-02 +1424 1573 -2.298363784337840e-02 +1424 1574 3.036665407732306e-02 +1424 1575 -1.317740310464533e-02 +1425 1432 1.073315976272113e-01 +1425 1433 -2.888275962935771e-01 +1425 1434 3.350058980661297e-01 +1425 1435 9.989050150191312e-01 +1425 1436 5.798793834472813e-01 +1425 1437 -4.619728649369560e-02 +1425 1438 -1.808717595023298e-01 +1425 1439 -7.482139085348972e-02 +1425 1440 1.154990208370873e-04 +1425 1567 -1.155338596756367e-04 +1425 1568 6.209354315549849e-02 +1425 1569 1.044248256883639e-01 +1425 1570 1.524650300188069e-02 +1425 1571 -7.467408580228488e-02 +1425 1572 1.955698244580743e-02 +1425 1573 4.058683714390114e-02 +1425 1574 -5.311752720233373e-02 +1425 1575 2.294526587804873e-02 +1426 1432 -7.076973567865066e-02 +1426 1433 1.738311063922721e-01 +1426 1434 -1.523642479414637e-01 +1426 1435 -9.636414324008365e-02 +1426 1436 6.769836828056082e-01 +1426 1437 9.915336948183725e-01 +1426 1438 6.149181743789578e-01 +1426 1439 1.895801827549048e-01 +1426 1440 -2.662369847725954e-04 +1426 1567 2.663879327045018e-04 +1426 1568 -1.331889094121583e-01 +1426 1569 -2.030137423104374e-01 +1426 1570 -2.715118332449046e-02 +1426 1571 1.244724005874630e-01 +1426 1572 -3.113082607241265e-02 +1426 1573 -6.267350218520550e-02 +1426 1574 8.053474359210658e-02 +1426 1575 -3.449079747460840e-02 +1427 1432 4.935480306222046e-02 +1427 1433 -1.171375535475397e-01 +1427 1434 9.451407923598085e-02 +1427 1435 5.007918356887627e-02 +1427 1436 -2.237771384824134e-01 +1427 1437 5.941431472920337e-02 +1427 1438 6.450456938723853e-01 +1427 1439 9.530008288133118e-01 +1427 1440 9.999998747281572e-01 +1427 1567 9.999998747281575e-01 +1427 1568 9.530008288133115e-01 +1427 1569 6.450456938723842e-01 +1427 1570 5.941431472920317e-02 +1427 1571 -2.237771384824110e-01 +1427 1572 5.007918356887977e-02 +1427 1573 9.451407923598192e-02 +1427 1574 -1.171375535475405e-01 +1427 1575 4.935480306222076e-02 +1428 1432 -3.449079747460834e-02 +1428 1433 8.053474359210636e-02 +1428 1434 -6.267350218520504e-02 +1428 1435 -3.113082607241060e-02 +1428 1436 1.244724005874648e-01 +1428 1437 -2.715118332449067e-02 +1428 1438 -2.030137423104386e-01 +1428 1439 -1.331889094121589e-01 +1428 1440 2.663879327045028e-04 +1428 1567 -2.662369847725965e-04 +1428 1568 1.895801827549055e-01 +1428 1569 6.149181743789592e-01 +1428 1570 9.915336948183732e-01 +1428 1571 6.769836828056037e-01 +1428 1572 -9.636414324009077e-02 +1428 1573 -1.523642479414661e-01 +1428 1574 1.738311063922740e-01 +1428 1575 -7.076973567865137e-02 +1429 1432 2.294526587804861e-02 +1429 1433 -5.311752720233340e-02 +1429 1434 4.058683714390072e-02 +1429 1435 1.955698244580608e-02 +1429 1436 -7.467408580228575e-02 +1429 1437 1.524650300188076e-02 +1429 1438 1.044248256883642e-01 +1429 1439 6.209354315549864e-02 +1429 1440 -1.155338596756369e-04 +1429 1567 1.154990208370876e-04 +1429 1568 -7.482139085348988e-02 +1429 1569 -1.808717595023301e-01 +1429 1570 -4.619728649369568e-02 +1429 1571 5.798793834472818e-01 +1429 1572 9.989050150191321e-01 +1429 1573 3.350058980661300e-01 +1429 1574 -2.888275962935772e-01 +1429 1575 1.073315976272114e-01 +1430 1432 -1.317740310464513e-02 +1430 1433 3.036665407732257e-02 +1430 1434 -2.298363784337793e-02 +1430 1435 -1.090786665131186e-02 +1430 1436 4.075221600345601e-02 +1430 1437 -8.084316013180892e-03 +1430 1438 -5.350367303591389e-02 +1430 1439 -3.075580596521720e-02 +1430 1440 5.596871053637422e-05 +1430 1567 -5.595618335308970e-05 +1430 1568 3.531457764737264e-02 +1430 1569 8.006921488188645e-02 +1430 1570 1.773915858549178e-02 +1430 1571 -1.500686725732933e-01 +1430 1572 8.472100426512991e-02 +1430 1573 8.421220797288217e-01 +1430 1574 8.216733652996332e-01 +1430 1575 -1.938614287778163e-01 +1431 1432 4.301521654480565e-03 +1431 1433 -9.892858960996944e-03 +1431 1434 7.456796970087833e-03 +1431 1435 3.516086961442576e-03 +1431 1436 -1.301790673093653e-02 +1431 1437 2.552800450746977e-03 +1431 1438 1.667404124422400e-02 +1431 1439 9.466746917004288e-03 +1431 1440 -1.709302139421278e-05 +1431 1567 1.708965696030325e-05 +1431 1568 -1.068977305722675e-02 +1431 1569 -2.374277521713631e-02 +1431 1570 -5.053685754328613e-03 +1431 1571 3.945012074512129e-02 +1431 1572 -1.837543629657603e-02 +1431 1573 -8.166430317487262e-02 +1431 1574 3.625696666431116e-01 +1431 1575 1.128366176813760e+00 +1711 1720 1.128366176813760e+00 +1711 1721 3.625696666431113e-01 +1711 1722 -8.166430317487221e-02 +1711 1723 -1.837543629657486e-02 +1711 1724 3.945012074512196e-02 +1711 1725 -5.053685754328662e-03 +1711 1726 -2.374277521713650e-02 +1711 1727 -1.068977305722682e-02 +1711 1728 1.708965696030335e-05 +1711 1855 -1.709302139421289e-05 +1711 1856 9.466746917004342e-03 +1711 1857 1.667404124422407e-02 +1711 1858 2.552800450746984e-03 +1711 1859 -1.301790673093648e-02 +1711 1860 3.516086961442843e-03 +1711 1861 7.456796970087964e-03 +1711 1862 -9.892858960997076e-03 +1711 1863 4.301521654480617e-03 +1712 1720 -1.938614287778170e-01 +1712 1721 8.216733652996351e-01 +1712 1722 8.421220797288200e-01 +1712 1723 8.472100426512477e-02 +1712 1724 -1.500686725732963e-01 +1712 1725 1.773915858549200e-02 +1712 1726 8.006921488188734e-02 +1712 1727 3.531457764737298e-02 +1712 1728 -5.595618335309020e-05 +1712 1855 5.596871053637476e-05 +1712 1856 -3.075580596521747e-02 +1712 1857 -5.350367303591431e-02 +1712 1858 -8.084316013180940e-03 +1712 1859 4.075221600345594e-02 +1712 1860 -1.090786665131273e-02 +1712 1861 -2.298363784337840e-02 +1712 1862 3.036665407732306e-02 +1712 1863 -1.317740310464533e-02 +1713 1720 1.073315976272113e-01 +1713 1721 -2.888275962935771e-01 +1713 1722 3.350058980661297e-01 +1713 1723 9.989050150191312e-01 +1713 1724 5.798793834472813e-01 +1713 1725 -4.619728649369560e-02 +1713 1726 -1.808717595023298e-01 +1713 1727 -7.482139085348972e-02 +1713 1728 1.154990208370873e-04 +1713 1855 -1.155338596756367e-04 +1713 1856 6.209354315549849e-02 +1713 1857 1.044248256883639e-01 +1713 1858 1.524650300188069e-02 +1713 1859 -7.467408580228488e-02 +1713 1860 1.955698244580743e-02 +1713 1861 4.058683714390114e-02 +1713 1862 -5.311752720233373e-02 +1713 1863 2.294526587804873e-02 +1714 1720 -7.076973567865066e-02 +1714 1721 1.738311063922721e-01 +1714 1722 -1.523642479414637e-01 +1714 1723 -9.636414324008365e-02 +1714 1724 6.769836828056082e-01 +1714 1725 9.915336948183725e-01 +1714 1726 6.149181743789578e-01 +1714 1727 1.895801827549048e-01 +1714 1728 -2.662369847725954e-04 +1714 1855 2.663879327045018e-04 +1714 1856 -1.331889094121583e-01 +1714 1857 -2.030137423104374e-01 +1714 1858 -2.715118332449046e-02 +1714 1859 1.244724005874630e-01 +1714 1860 -3.113082607241265e-02 +1714 1861 -6.267350218520550e-02 +1714 1862 8.053474359210658e-02 +1714 1863 -3.449079747460840e-02 +1715 1720 4.935480306222046e-02 +1715 1721 -1.171375535475397e-01 +1715 1722 9.451407923598085e-02 +1715 1723 5.007918356887627e-02 +1715 1724 -2.237771384824134e-01 +1715 1725 5.941431472920337e-02 +1715 1726 6.450456938723853e-01 +1715 1727 9.530008288133118e-01 +1715 1728 9.999998747281572e-01 +1715 1855 9.999998747281575e-01 +1715 1856 9.530008288133115e-01 +1715 1857 6.450456938723842e-01 +1715 1858 5.941431472920317e-02 +1715 1859 -2.237771384824110e-01 +1715 1860 5.007918356887977e-02 +1715 1861 9.451407923598192e-02 +1715 1862 -1.171375535475405e-01 +1715 1863 4.935480306222076e-02 +1716 1720 -3.449079747460834e-02 +1716 1721 8.053474359210636e-02 +1716 1722 -6.267350218520504e-02 +1716 1723 -3.113082607241060e-02 +1716 1724 1.244724005874648e-01 +1716 1725 -2.715118332449067e-02 +1716 1726 -2.030137423104386e-01 +1716 1727 -1.331889094121589e-01 +1716 1728 2.663879327045028e-04 +1716 1855 -2.662369847725965e-04 +1716 1856 1.895801827549055e-01 +1716 1857 6.149181743789592e-01 +1716 1858 9.915336948183732e-01 +1716 1859 6.769836828056037e-01 +1716 1860 -9.636414324009077e-02 +1716 1861 -1.523642479414661e-01 +1716 1862 1.738311063922740e-01 +1716 1863 -7.076973567865137e-02 +1717 1720 2.294526587804861e-02 +1717 1721 -5.311752720233340e-02 +1717 1722 4.058683714390072e-02 +1717 1723 1.955698244580608e-02 +1717 1724 -7.467408580228575e-02 +1717 1725 1.524650300188076e-02 +1717 1726 1.044248256883642e-01 +1717 1727 6.209354315549864e-02 +1717 1728 -1.155338596756369e-04 +1717 1855 1.154990208370876e-04 +1717 1856 -7.482139085348988e-02 +1717 1857 -1.808717595023301e-01 +1717 1858 -4.619728649369568e-02 +1717 1859 5.798793834472818e-01 +1717 1860 9.989050150191321e-01 +1717 1861 3.350058980661300e-01 +1717 1862 -2.888275962935772e-01 +1717 1863 1.073315976272114e-01 +1718 1720 -1.317740310464513e-02 +1718 1721 3.036665407732257e-02 +1718 1722 -2.298363784337793e-02 +1718 1723 -1.090786665131186e-02 +1718 1724 4.075221600345601e-02 +1718 1725 -8.084316013180892e-03 +1718 1726 -5.350367303591389e-02 +1718 1727 -3.075580596521720e-02 +1718 1728 5.596871053637422e-05 +1718 1855 -5.595618335308970e-05 +1718 1856 3.531457764737264e-02 +1718 1857 8.006921488188645e-02 +1718 1858 1.773915858549178e-02 +1718 1859 -1.500686725732933e-01 +1718 1860 8.472100426512991e-02 +1718 1861 8.421220797288217e-01 +1718 1862 8.216733652996332e-01 +1718 1863 -1.938614287778163e-01 +1719 1720 4.301521654480565e-03 +1719 1721 -9.892858960996944e-03 +1719 1722 7.456796970087833e-03 +1719 1723 3.516086961442576e-03 +1719 1724 -1.301790673093653e-02 +1719 1725 2.552800450746977e-03 +1719 1726 1.667404124422400e-02 +1719 1727 9.466746917004288e-03 +1719 1728 -1.709302139421278e-05 +1719 1855 1.708965696030325e-05 +1719 1856 -1.068977305722675e-02 +1719 1857 -2.374277521713631e-02 +1719 1858 -5.053685754328613e-03 +1719 1859 3.945012074512129e-02 +1719 1860 -1.837543629657603e-02 +1719 1861 -8.166430317487262e-02 +1719 1862 3.625696666431116e-01 +1719 1863 1.128366176813760e+00 +1990 1999 1.128366176813760e+00 +1990 2000 3.625696666431113e-01 +1990 2001 -8.166430317487221e-02 +1990 2002 -1.837543629657486e-02 +1990 2003 3.945012074512196e-02 +1990 2004 -5.053685754328662e-03 +1990 2005 -2.374277521713650e-02 +1990 2006 -1.068977305722682e-02 +1990 2007 1.708965696030335e-05 +1990 2134 -1.709302139421289e-05 +1990 2135 9.466746917004342e-03 +1990 2136 1.667404124422407e-02 +1990 2137 2.552800450746984e-03 +1990 2138 -1.301790673093648e-02 +1990 2139 3.516086961442843e-03 +1990 2140 7.456796970087964e-03 +1990 2141 -9.892858960997076e-03 +1990 2142 4.301521654480617e-03 +1991 1999 -1.938614287778170e-01 +1991 2000 8.216733652996351e-01 +1991 2001 8.421220797288200e-01 +1991 2002 8.472100426512477e-02 +1991 2003 -1.500686725732963e-01 +1991 2004 1.773915858549200e-02 +1991 2005 8.006921488188734e-02 +1991 2006 3.531457764737298e-02 +1991 2007 -5.595618335309020e-05 +1991 2134 5.596871053637476e-05 +1991 2135 -3.075580596521747e-02 +1991 2136 -5.350367303591431e-02 +1991 2137 -8.084316013180940e-03 +1991 2138 4.075221600345594e-02 +1991 2139 -1.090786665131273e-02 +1991 2140 -2.298363784337840e-02 +1991 2141 3.036665407732306e-02 +1991 2142 -1.317740310464533e-02 +1992 1999 1.073315976272113e-01 +1992 2000 -2.888275962935771e-01 +1992 2001 3.350058980661297e-01 +1992 2002 9.989050150191312e-01 +1992 2003 5.798793834472813e-01 +1992 2004 -4.619728649369560e-02 +1992 2005 -1.808717595023298e-01 +1992 2006 -7.482139085348972e-02 +1992 2007 1.154990208370873e-04 +1992 2134 -1.155338596756367e-04 +1992 2135 6.209354315549849e-02 +1992 2136 1.044248256883639e-01 +1992 2137 1.524650300188069e-02 +1992 2138 -7.467408580228488e-02 +1992 2139 1.955698244580743e-02 +1992 2140 4.058683714390114e-02 +1992 2141 -5.311752720233373e-02 +1992 2142 2.294526587804873e-02 +1993 1999 -7.076973567865066e-02 +1993 2000 1.738311063922721e-01 +1993 2001 -1.523642479414637e-01 +1993 2002 -9.636414324008365e-02 +1993 2003 6.769836828056082e-01 +1993 2004 9.915336948183725e-01 +1993 2005 6.149181743789578e-01 +1993 2006 1.895801827549048e-01 +1993 2007 -2.662369847725954e-04 +1993 2134 2.663879327045018e-04 +1993 2135 -1.331889094121583e-01 +1993 2136 -2.030137423104374e-01 +1993 2137 -2.715118332449046e-02 +1993 2138 1.244724005874630e-01 +1993 2139 -3.113082607241265e-02 +1993 2140 -6.267350218520550e-02 +1993 2141 8.053474359210658e-02 +1993 2142 -3.449079747460840e-02 +1994 1999 4.935480306222046e-02 +1994 2000 -1.171375535475397e-01 +1994 2001 9.451407923598085e-02 +1994 2002 5.007918356887627e-02 +1994 2003 -2.237771384824134e-01 +1994 2004 5.941431472920337e-02 +1994 2005 6.450456938723853e-01 +1994 2006 9.530008288133118e-01 +1994 2007 9.999998747281572e-01 +1994 2134 9.999998747281575e-01 +1994 2135 9.530008288133115e-01 +1994 2136 6.450456938723842e-01 +1994 2137 5.941431472920317e-02 +1994 2138 -2.237771384824110e-01 +1994 2139 5.007918356887977e-02 +1994 2140 9.451407923598192e-02 +1994 2141 -1.171375535475405e-01 +1994 2142 4.935480306222076e-02 +1995 1999 -3.449079747460834e-02 +1995 2000 8.053474359210636e-02 +1995 2001 -6.267350218520504e-02 +1995 2002 -3.113082607241060e-02 +1995 2003 1.244724005874648e-01 +1995 2004 -2.715118332449067e-02 +1995 2005 -2.030137423104386e-01 +1995 2006 -1.331889094121589e-01 +1995 2007 2.663879327045028e-04 +1995 2134 -2.662369847725965e-04 +1995 2135 1.895801827549055e-01 +1995 2136 6.149181743789592e-01 +1995 2137 9.915336948183732e-01 +1995 2138 6.769836828056037e-01 +1995 2139 -9.636414324009077e-02 +1995 2140 -1.523642479414661e-01 +1995 2141 1.738311063922740e-01 +1995 2142 -7.076973567865137e-02 +1996 1999 2.294526587804861e-02 +1996 2000 -5.311752720233340e-02 +1996 2001 4.058683714390072e-02 +1996 2002 1.955698244580608e-02 +1996 2003 -7.467408580228575e-02 +1996 2004 1.524650300188076e-02 +1996 2005 1.044248256883642e-01 +1996 2006 6.209354315549864e-02 +1996 2007 -1.155338596756369e-04 +1996 2134 1.154990208370876e-04 +1996 2135 -7.482139085348988e-02 +1996 2136 -1.808717595023301e-01 +1996 2137 -4.619728649369568e-02 +1996 2138 5.798793834472818e-01 +1996 2139 9.989050150191321e-01 +1996 2140 3.350058980661300e-01 +1996 2141 -2.888275962935772e-01 +1996 2142 1.073315976272114e-01 +1997 1999 -1.317740310464513e-02 +1997 2000 3.036665407732257e-02 +1997 2001 -2.298363784337793e-02 +1997 2002 -1.090786665131186e-02 +1997 2003 4.075221600345601e-02 +1997 2004 -8.084316013180892e-03 +1997 2005 -5.350367303591389e-02 +1997 2006 -3.075580596521720e-02 +1997 2007 5.596871053637422e-05 +1997 2134 -5.595618335308970e-05 +1997 2135 3.531457764737264e-02 +1997 2136 8.006921488188645e-02 +1997 2137 1.773915858549178e-02 +1997 2138 -1.500686725732933e-01 +1997 2139 8.472100426512991e-02 +1997 2140 8.421220797288217e-01 +1997 2141 8.216733652996332e-01 +1997 2142 -1.938614287778163e-01 +1998 1999 4.301521654480565e-03 +1998 2000 -9.892858960996944e-03 +1998 2001 7.456796970087833e-03 +1998 2002 3.516086961442576e-03 +1998 2003 -1.301790673093653e-02 +1998 2004 2.552800450746977e-03 +1998 2005 1.667404124422400e-02 +1998 2006 9.466746917004288e-03 +1998 2007 -1.709302139421278e-05 +1998 2134 1.708965696030325e-05 +1998 2135 -1.068977305722675e-02 +1998 2136 -2.374277521713631e-02 +1998 2137 -5.053685754328613e-03 +1998 2138 3.945012074512129e-02 +1998 2139 -1.837543629657603e-02 +1998 2140 -8.166430317487262e-02 +1998 2141 3.625696666431116e-01 +1998 2142 1.128366176813760e+00 diff --git a/packages/muelu/research/caglusa/transfer2.mtx b/packages/muelu/research/caglusa/transfer2.mtx new file mode 100644 index 000000000000..3d7710efade6 --- /dev/null +++ b/packages/muelu/research/caglusa/transfer2.mtx @@ -0,0 +1,2595 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 2592 +19 28 1.129411500546784e+00 +19 29 3.670587123461224e-01 +19 30 -8.049160724422064e-02 +19 31 -2.032779703371170e-02 +19 32 3.979771743152476e-02 +19 33 -3.653023273099719e-03 +19 34 -2.390769583422672e-02 +19 35 -1.192764283693718e-02 +19 36 -1.348774781601022e-03 +19 91 -4.198667441749845e-03 +19 92 6.301849789441372e-03 +19 93 1.665653779613011e-02 +19 94 4.745353029115879e-03 +19 95 -1.296163490697002e-02 +19 96 2.477732868262222e-03 +19 97 7.961805476532446e-03 +19 98 -9.821496402565726e-03 +19 99 4.188254619640946e-03 +20 28 -1.954658507609646e-01 +20 29 8.172051897065897e-01 +20 30 8.485883218629846e-01 +20 31 9.418268414471946e-02 +20 32 -1.517806004204933e-01 +20 33 1.284495107653860e-02 +20 34 8.073455683811782e-02 +20 35 3.944978508915502e-02 +20 36 4.421028511261784e-03 +20 91 1.379384603374485e-02 +20 92 -2.053008029539680e-02 +20 93 -5.355144098812476e-02 +20 94 -1.504610353509657e-02 +20 95 4.060437416110361e-02 +20 96 -7.689403638574617e-03 +20 97 -2.454422559452946e-02 +20 98 3.014923900646534e-02 +20 99 -1.283049170970211e-02 +21 28 1.082520994427544e-01 +21 29 -2.889831904537400e-01 +21 30 3.248829650141348e-01 +21 31 9.970774308689467e-01 +21 32 5.961024869195356e-01 +21 33 -3.367981223730957e-02 +21 34 -1.831797001588231e-01 +21 35 -8.387339051456290e-02 +21 36 -9.153920411521620e-03 +21 91 -2.875043604688287e-02 +21 92 4.177055877128089e-02 +21 93 1.050631500406107e-01 +21 94 2.846427830129430e-02 +21 95 -7.453028269481812e-02 +21 96 1.379841575459093e-02 +21 97 4.335919353178146e-02 +21 98 -5.274377092766295e-02 +21 99 2.234149643925425e-02 +22 28 -7.138223443736702e-02 +22 29 1.740834065912312e-01 +22 30 -1.484845065565620e-01 +22 31 -1.049235629513360e-01 +22 32 6.609088867175748e-01 +22 33 9.949463440350268e-01 +22 34 6.382749766949400e-01 +22 35 2.153988514319247e-01 +22 36 2.132780628751801e-02 +22 91 6.856089691670482e-02 +22 92 -9.181057189607493e-02 +22 93 -2.071940355343531e-01 +22 94 -5.107217057563653e-02 +22 95 1.246991336183560e-01 +22 96 -2.200317396232008e-02 +22 97 -6.700442871112169e-02 +22 98 7.998694894283201e-02 +22 99 -3.358405153337873e-02 +23 28 4.978351309021659e-02 +23 29 -1.173453856460456e-01 +23 30 9.221850329093995e-02 +23 31 5.474453575062167e-02 +23 32 -2.222222222222224e-01 +23 33 4.193559628619540e-02 +23 34 6.214620396774779e-01 +23 35 9.411301078682682e-01 +23 36 9.992308119045477e-01 +23 91 9.927033233726968e-01 +23 92 9.810160178630802e-01 +23 93 7.135841730750169e-01 +23 94 1.146988647957101e-01 +23 95 -2.264037708906063e-01 +23 96 3.553598977168210e-02 +23 97 1.011982840154461e-01 +23 98 -1.163935778028011e-01 +23 99 4.805950582466666e-02 +24 28 -3.479092359412759e-02 +24 29 8.068968438828850e-02 +24 30 -6.118162989078881e-02 +24 31 -3.407479357032987e-02 +24 32 1.239997546686380e-01 +24 33 -1.932067089943150e-02 +24 34 -2.003414469256311e-01 +24 35 -1.448427411451554e-01 +24 36 -2.040102646753046e-02 +24 91 -5.977438838790539e-02 +24 92 1.146466908881000e-01 +24 93 5.423680023784618e-01 +24 94 9.764620148538184e-01 +24 95 7.239005454859888e-01 +24 96 -6.922825311408992e-02 +24 97 -1.637424646876964e-01 +24 98 1.728963890849742e-01 +24 99 -6.891893280298025e-02 +25 28 2.314511493126580e-02 +25 29 -5.322385868251331e-02 +25 30 3.963041032797538e-02 +25 31 2.141880768979494e-02 +25 32 -7.448107462312177e-02 +25 33 1.087558270779069e-02 +25 34 1.035174746041493e-01 +25 35 6.804174656093516e-02 +25 36 8.940094922500905e-03 +25 91 2.672933017068397e-02 +25 92 -4.699475667815084e-02 +25 93 -1.706673596596047e-01 +25 94 -8.084458002769906e-02 +25 95 5.303097279263185e-01 +25 96 1.002504763979036e+00 +25 97 3.655183310800756e-01 +25 98 -2.880739191554211e-01 +25 99 1.045493091485161e-01 +26 28 -1.329223336631334e-02 +26 29 3.042868713306708e-02 +26 30 -2.244483970189554e-02 +26 31 -1.194967046758751e-02 +26 32 4.066948930938207e-02 +26 33 -5.772473560016135e-03 +26 34 -5.312732759263696e-02 +26 35 -3.378505081770156e-02 +26 36 -4.344146984209206e-03 +26 91 -1.306753988002899e-02 +26 92 2.240564471734898e-02 +26 93 7.652205228823021e-02 +26 94 3.165712896908295e-02 +26 95 -1.436711784367418e-01 +26 96 5.718482886330097e-02 +26 97 8.220853274433515e-01 +26 98 8.348470229832068e-01 +26 99 -1.890067309257889e-01 +27 28 4.339014147752001e-03 +27 29 -9.913245383000176e-03 +27 30 7.282382897431911e-03 +27 31 3.852365568882107e-03 +27 32 -1.299443778081731e-02 +27 33 1.823505864305507e-03 +27 34 1.656712269663253e-02 +27 35 1.040833436407406e-02 +27 36 1.328127019033700e-03 +27 91 4.003635262736773e-03 +27 92 -6.805353159628943e-03 +27 93 -2.278107939636689e-02 +27 94 -9.064785810589365e-03 +27 95 3.805308573736937e-02 +27 96 -1.258090052188781e-02 +27 97 -8.483182255383963e-02 +27 98 3.491531642709724e-01 +27 99 1.125201640939772e+00 +154 163 1.127337591104743e+00 +154 164 3.581803123145713e-01 +154 165 -8.275622364937985e-02 +154 166 -1.647201287983630e-02 +154 167 3.905164342835202e-02 +154 168 -6.396858715894208e-03 +154 169 -2.350502600205520e-02 +154 170 -9.446121266013496e-03 +154 171 1.341205845607445e-03 +154 226 -1.362265824185674e-03 +154 227 8.487647252886718e-03 +154 228 1.672506100817122e-02 +154 229 3.269116801862823e-03 +154 230 -1.302060500417361e-02 +154 231 3.181723537341469e-03 +154 232 7.624768649835682e-03 +154 233 -9.871243074084034e-03 +154 234 4.264667105949048e-03 +155 163 -1.922830829601444e-01 +155 164 8.260133191084719e-01 +155 165 8.356838818943083e-01 +155 166 7.558727102103158e-02 +155 167 -1.481841308439272e-01 +155 168 2.241613345136432e-02 +155 169 7.916366620200246e-02 +155 170 3.117098545351259e-02 +155 171 -4.386880907561118e-03 +155 226 4.465297339933665e-03 +155 227 -2.759918986753068e-02 +155 228 -5.370085579481167e-02 +155 229 -1.035683940699978e-02 +155 230 4.076984829088409e-02 +155 231 -9.871741963055024e-03 +155 232 -2.350261848546778e-02 +155 233 3.030083677823448e-02 +155 234 -1.306452632632485e-02 +156 163 1.064265344782129e-01 +156 164 -2.886290461498142e-01 +156 165 3.449469309961131e-01 +156 166 1.000392437420345e+00 +156 167 5.638333964581613e-01 +156 168 -5.799754933334213e-02 +156 169 -1.780696083183279e-01 +156 170 -6.582166366027625e-02 +156 171 9.027771977723279e-03 +156 226 -9.245866670384170e-03 +156 227 5.585817628857291e-02 +156 228 1.049843649593249e-01 +156 229 1.955185861067635e-02 +156 230 -7.474755887491966e-02 +156 231 1.770422947357980e-02 +156 232 4.150843175724458e-02 +156 233 -5.300453519820989e-02 +156 234 2.274881512221573e-02 +157 163 -7.016759340116396e-02 +157 164 1.735553128493525e-01 +157 165 -1.561239953893025e-01 +157 166 -8.774286432824685e-02 +157 167 6.925293570792239e-01 +157 168 9.874100819505094e-01 +157 169 5.916114520752453e-01 +157 170 1.646597577537485e-01 +157 171 -2.059904582301474e-02 +157 226 2.154433625498818e-02 +157 227 -1.207398053365293e-01 +157 228 -2.050311138188887e-01 +157 229 -3.490220705075135e-02 +157 230 1.247453761320624e-01 +157 231 -2.819771551760692e-02 +157 232 -6.411209206256274e-02 +157 233 8.036958734762664e-02 +157 234 -3.419577051631738e-02 +158 163 4.893336539283008e-02 +158 164 -1.169145439761488e-01 +158 165 9.673091628921086e-02 +158 166 4.541867323644684e-02 +158 167 -2.249773266656634e-01 +158 168 7.700626369257425e-02 +158 169 6.678220596893391e-01 +158 170 9.634302133816285e-01 +158 171 9.992154478068932e-01 +158 226 9.992154478068930e-01 +158 227 9.634302133816290e-01 +158 228 6.678220596893403e-01 +158 229 7.700626369257420e-02 +158 230 -2.249773266656628e-01 +158 231 4.541867323644765e-02 +158 232 9.673091628921161e-02 +158 233 -1.169145439761478e-01 +158 234 4.893336539282987e-02 +159 163 -3.419577051631752e-02 +159 164 8.036958734762729e-02 +159 165 -6.411209206256223e-02 +159 166 -2.819771551760640e-02 +159 167 1.247453761320626e-01 +159 168 -3.490220705075134e-02 +159 169 -2.050311138188882e-01 +159 170 -1.207398053365291e-01 +159 171 2.154433625498816e-02 +159 226 -2.059904582301472e-02 +159 227 1.646597577537484e-01 +159 228 5.916114520752450e-01 +159 229 9.874100819505102e-01 +159 230 6.925293570792241e-01 +159 231 -8.774286432824849e-02 +159 232 -1.561239953893039e-01 +159 233 1.735553128493512e-01 +159 234 -7.016759340116371e-02 +160 163 2.274881512221584e-02 +160 164 -5.300453519821034e-02 +160 165 4.150843175724426e-02 +160 166 1.770422947357948e-02 +160 167 -7.474755887491986e-02 +160 168 1.955185861067635e-02 +160 169 1.049843649593247e-01 +160 170 5.585817628857288e-02 +160 171 -9.245866670384174e-03 +160 226 9.027771977723278e-03 +160 227 -6.582166366027631e-02 +160 228 -1.780696083183282e-01 +160 229 -5.799754933334226e-02 +160 230 5.638333964581600e-01 +160 231 1.000392437420345e+00 +160 232 3.449469309961158e-01 +160 233 -2.886290461498119e-01 +160 234 1.064265344782124e-01 +161 163 -1.306452632632491e-02 +161 164 3.030083677823475e-02 +161 165 -2.350261848546761e-02 +161 166 -9.871741963054848e-03 +161 167 4.076984829088421e-02 +161 168 -1.035683940699979e-02 +161 169 -5.370085579481158e-02 +161 170 -2.759918986753067e-02 +161 171 4.465297339933666e-03 +161 226 -4.386880907561119e-03 +161 227 3.117098545351261e-02 +161 228 7.916366620200260e-02 +161 229 2.241613345136434e-02 +161 230 -1.481841308439268e-01 +161 231 7.558727102103303e-02 +161 232 8.356838818943076e-01 +161 233 8.260133191084712e-01 +161 234 -1.922830829601444e-01 +162 163 4.264667105949089e-03 +162 164 -9.871243074084166e-03 +162 165 7.624768649835662e-03 +162 166 3.181723537341427e-03 +162 167 -1.302060500417371e-02 +162 168 3.269116801862839e-03 +162 169 1.672506100817128e-02 +162 170 8.487647252886756e-03 +162 171 -1.362265824185682e-03 +162 226 1.341205845607452e-03 +162 227 -9.446121266013551e-03 +162 228 -2.350502600205536e-02 +162 229 -6.396858715894249e-03 +162 230 3.905164342835212e-02 +162 231 -1.647201287983672e-02 +162 232 -8.275622364938091e-02 +162 233 3.581803123145702e-01 +162 234 1.127337591104744e+00 +298 307 1.127337591104743e+00 +298 308 3.581803123145701e-01 +298 309 -8.275622364938082e-02 +298 310 -1.647201287983644e-02 +298 311 3.905164342835236e-02 +298 312 -6.396858715894252e-03 +298 313 -2.350502600205533e-02 +298 314 -9.446121266013548e-03 +298 315 1.341205845607527e-03 +298 370 -1.362265824185603e-03 +298 371 8.487647252886756e-03 +298 372 1.672506100817127e-02 +298 373 3.269116801862838e-03 +298 374 -1.302060500417369e-02 +298 375 3.181723537341553e-03 +298 376 7.624768649835753e-03 +298 377 -9.871243074084117e-03 +298 378 4.264667105949359e-03 +299 307 -1.922830829601445e-01 +299 308 8.260133191084716e-01 +299 309 8.356838818943071e-01 +299 310 7.558727102103183e-02 +299 311 -1.481841308439278e-01 +299 312 2.241613345136437e-02 +299 313 7.916366620200257e-02 +299 314 3.117098545351263e-02 +299 315 -4.386880907561369e-03 +299 370 4.465297339933412e-03 +299 371 -2.759918986753069e-02 +299 372 -5.370085579481160e-02 +299 373 -1.035683940699979e-02 +299 374 4.076984829088419e-02 +299 375 -9.871741963055247e-03 +299 376 -2.350261848546790e-02 +299 377 3.030083677823463e-02 +299 378 -1.306452632632575e-02 +300 307 1.064265344782123e-01 +300 308 -2.886290461498118e-01 +300 309 3.449469309961156e-01 +300 310 1.000392437420345e+00 +300 311 5.638333964581608e-01 +300 312 -5.799754933334206e-02 +300 313 -1.780696083183275e-01 +300 314 -6.582166366027610e-02 +300 315 9.027771977723762e-03 +300 370 -9.245866670383613e-03 +300 371 5.585817628857274e-02 +300 372 1.049843649593244e-01 +300 373 1.955185861067630e-02 +300 374 -7.474755887491960e-02 +300 375 1.770422947358014e-02 +300 376 4.150843175724467e-02 +300 377 -5.300453519820997e-02 +300 378 2.274881512221723e-02 +301 307 -7.016759340116353e-02 +301 308 1.735553128493507e-01 +301 309 -1.561239953893032e-01 +301 310 -8.774286432824674e-02 +301 311 6.925293570792254e-01 +301 312 9.874100819505095e-01 +301 313 5.916114520752447e-01 +301 314 1.646597577537482e-01 +301 315 -2.059904582301585e-02 +301 370 2.154433625498688e-02 +301 371 -1.207398053365290e-01 +301 372 -2.050311138188880e-01 +301 373 -3.490220705075129e-02 +301 374 1.247453761320623e-01 +301 375 -2.819771551760747e-02 +301 376 -6.411209206256291e-02 +301 377 8.036958734762679e-02 +301 378 -3.419577051631964e-02 +302 307 4.893336539282988e-02 +302 308 -1.169145439761479e-01 +302 309 9.673091628921154e-02 +302 310 4.541867323644692e-02 +302 311 -2.249773266656643e-01 +302 312 7.700626369257443e-02 +302 313 6.678220596893397e-01 +302 314 9.634302133816294e-01 +302 315 9.992154478068934e-01 +302 370 9.992154478068935e-01 +302 371 9.634302133816290e-01 +302 372 6.678220596893393e-01 +302 373 7.700626369257429e-02 +302 374 -2.249773266656632e-01 +302 375 4.541867323644865e-02 +302 376 9.673091628921208e-02 +302 377 -1.169145439761483e-01 +302 378 4.893336539283320e-02 +303 307 -3.419577051631739e-02 +303 308 8.036958734762666e-02 +303 309 -6.411209206256269e-02 +303 310 -2.819771551760646e-02 +303 311 1.247453761320632e-01 +303 312 -3.490220705075143e-02 +303 313 -2.050311138188886e-01 +303 314 -1.207398053365293e-01 +303 315 2.154433625498944e-02 +303 370 -2.059904582301359e-02 +303 371 1.646597577537486e-01 +303 372 5.916114520752455e-01 +303 373 9.874100819505095e-01 +303 374 6.925293570792234e-01 +303 375 -8.774286432825025e-02 +303 376 -1.561239953893044e-01 +303 377 1.735553128493517e-01 +303 378 -7.016759340116840e-02 +304 307 2.274881512221569e-02 +304 308 -5.300453519820979e-02 +304 309 4.150843175724445e-02 +304 310 1.770422947357947e-02 +304 311 -7.474755887491999e-02 +304 312 1.955185861067635e-02 +304 313 1.049843649593245e-01 +304 314 5.585817628857279e-02 +304 315 -9.245866670384689e-03 +304 370 9.027771977722754e-03 +304 371 -6.582166366027616e-02 +304 372 -1.780696083183276e-01 +304 373 -5.799754933334208e-02 +304 374 5.638333964581611e-01 +304 375 1.000392437420345e+00 +304 376 3.449469309961157e-01 +304 377 -2.886290461498118e-01 +304 378 1.064265344782192e-01 +305 307 -1.306452632632480e-02 +305 308 3.030083677823438e-02 +305 309 -2.350261848546767e-02 +305 310 -9.871741963054827e-03 +305 311 4.076984829088420e-02 +305 312 -1.035683940699976e-02 +305 313 -5.370085579481140e-02 +305 314 -2.759918986753057e-02 +305 315 4.465297339933904e-03 +305 370 -4.386880907560853e-03 +305 371 3.117098545351247e-02 +305 372 7.916366620200213e-02 +305 373 2.241613345136422e-02 +305 374 -1.481841308439264e-01 +305 375 7.558727102103434e-02 +305 376 8.356838818943079e-01 +305 377 8.260133191084708e-01 +305 378 -1.922830829601561e-01 +306 307 4.264667105949057e-03 +306 308 -9.871243074084055e-03 +306 309 7.624768649835689e-03 +306 310 3.181723537341423e-03 +306 311 -1.302060500417372e-02 +306 312 3.269116801862836e-03 +306 313 1.672506100817124e-02 +306 314 8.487647252886732e-03 +306 315 -1.362265824185756e-03 +306 370 1.341205845607371e-03 +306 371 -9.446121266013519e-03 +306 372 -2.350502600205524e-02 +306 373 -6.396858715894220e-03 +306 374 3.905164342835206e-02 +306 375 -1.647201287983701e-02 +306 376 -8.275622364938102e-02 +306 377 3.581803123145703e-01 +306 378 1.127337591104751e+00 +433 442 1.127337591104735e+00 +433 443 3.581803123145701e-01 +433 444 -8.275622364938082e-02 +433 445 -1.647201287983644e-02 +433 446 3.905164342835236e-02 +433 447 -6.396858715894252e-03 +433 448 -2.350502600205533e-02 +433 449 -9.446121266013548e-03 +433 450 1.341205845607527e-03 +433 505 -1.362265824185603e-03 +433 506 8.487647252886756e-03 +433 507 1.672506100817127e-02 +433 508 3.269116801862838e-03 +433 509 -1.302060500417369e-02 +433 510 3.181723537341553e-03 +433 511 7.624768649835753e-03 +433 512 -9.871243074084117e-03 +433 513 4.264667105949359e-03 +434 442 -1.922830829601326e-01 +434 443 8.260133191084716e-01 +434 444 8.356838818943071e-01 +434 445 7.558727102103183e-02 +434 446 -1.481841308439278e-01 +434 447 2.241613345136437e-02 +434 448 7.916366620200257e-02 +434 449 3.117098545351263e-02 +434 450 -4.386880907561369e-03 +434 505 4.465297339933412e-03 +434 506 -2.759918986753069e-02 +434 507 -5.370085579481160e-02 +434 508 -1.035683940699979e-02 +434 509 4.076984829088419e-02 +434 510 -9.871741963055247e-03 +434 511 -2.350261848546790e-02 +434 512 3.030083677823463e-02 +434 513 -1.306452632632575e-02 +435 442 1.064265344782055e-01 +435 443 -2.886290461498118e-01 +435 444 3.449469309961156e-01 +435 445 1.000392437420345e+00 +435 446 5.638333964581608e-01 +435 447 -5.799754933334206e-02 +435 448 -1.780696083183275e-01 +435 449 -6.582166366027610e-02 +435 450 9.027771977723762e-03 +435 505 -9.245866670383613e-03 +435 506 5.585817628857274e-02 +435 507 1.049843649593244e-01 +435 508 1.955185861067630e-02 +435 509 -7.474755887491960e-02 +435 510 1.770422947358014e-02 +435 511 4.150843175724467e-02 +435 512 -5.300453519820997e-02 +435 513 2.274881512221723e-02 +436 442 -7.016759340115898e-02 +436 443 1.735553128493507e-01 +436 444 -1.561239953893032e-01 +436 445 -8.774286432824674e-02 +436 446 6.925293570792254e-01 +436 447 9.874100819505095e-01 +436 448 5.916114520752447e-01 +436 449 1.646597577537482e-01 +436 450 -2.059904582301585e-02 +436 505 2.154433625498688e-02 +436 506 -1.207398053365290e-01 +436 507 -2.050311138188880e-01 +436 508 -3.490220705075129e-02 +436 509 1.247453761320623e-01 +436 510 -2.819771551760747e-02 +436 511 -6.411209206256291e-02 +436 512 8.036958734762679e-02 +436 513 -3.419577051631964e-02 +437 442 4.893336539282669e-02 +437 443 -1.169145439761479e-01 +437 444 9.673091628921154e-02 +437 445 4.541867323644692e-02 +437 446 -2.249773266656643e-01 +437 447 7.700626369257443e-02 +437 448 6.678220596893397e-01 +437 449 9.634302133816294e-01 +437 450 9.992154478068934e-01 +437 505 9.992154478068935e-01 +437 506 9.634302133816290e-01 +437 507 6.678220596893393e-01 +437 508 7.700626369257429e-02 +437 509 -2.249773266656632e-01 +437 510 4.541867323644865e-02 +437 511 9.673091628921208e-02 +437 512 -1.169145439761483e-01 +437 513 4.893336539283320e-02 +438 442 -3.419577051631515e-02 +438 443 8.036958734762666e-02 +438 444 -6.411209206256269e-02 +438 445 -2.819771551760646e-02 +438 446 1.247453761320632e-01 +438 447 -3.490220705075143e-02 +438 448 -2.050311138188886e-01 +438 449 -1.207398053365293e-01 +438 450 2.154433625498944e-02 +438 505 -2.059904582301359e-02 +438 506 1.646597577537486e-01 +438 507 5.916114520752455e-01 +438 508 9.874100819505095e-01 +438 509 6.925293570792234e-01 +438 510 -8.774286432825025e-02 +438 511 -1.561239953893044e-01 +438 512 1.735553128493517e-01 +438 513 -7.016759340116840e-02 +439 442 2.274881512221420e-02 +439 443 -5.300453519820979e-02 +439 444 4.150843175724445e-02 +439 445 1.770422947357947e-02 +439 446 -7.474755887491999e-02 +439 447 1.955185861067635e-02 +439 448 1.049843649593245e-01 +439 449 5.585817628857279e-02 +439 450 -9.245866670384689e-03 +439 505 9.027771977722754e-03 +439 506 -6.582166366027616e-02 +439 507 -1.780696083183276e-01 +439 508 -5.799754933334208e-02 +439 509 5.638333964581611e-01 +439 510 1.000392437420345e+00 +439 511 3.449469309961157e-01 +439 512 -2.886290461498118e-01 +439 513 1.064265344782192e-01 +440 442 -1.306452632632395e-02 +440 443 3.030083677823438e-02 +440 444 -2.350261848546767e-02 +440 445 -9.871741963054827e-03 +440 446 4.076984829088420e-02 +440 447 -1.035683940699976e-02 +440 448 -5.370085579481140e-02 +440 449 -2.759918986753057e-02 +440 450 4.465297339933904e-03 +440 505 -4.386880907560853e-03 +440 506 3.117098545351247e-02 +440 507 7.916366620200213e-02 +440 508 2.241613345136422e-02 +440 509 -1.481841308439264e-01 +440 510 7.558727102103434e-02 +440 511 8.356838818943079e-01 +440 512 8.260133191084708e-01 +440 513 -1.922830829601561e-01 +441 442 4.264667105948777e-03 +441 443 -9.871243074084055e-03 +441 444 7.624768649835689e-03 +441 445 3.181723537341423e-03 +441 446 -1.302060500417372e-02 +441 447 3.269116801862836e-03 +441 448 1.672506100817124e-02 +441 449 8.487647252886732e-03 +441 450 -1.362265824185756e-03 +441 505 1.341205845607371e-03 +441 506 -9.446121266013519e-03 +441 507 -2.350502600205524e-02 +441 508 -6.396858715894220e-03 +441 509 3.905164342835206e-02 +441 510 -1.647201287983701e-02 +441 511 -8.275622364938102e-02 +441 512 3.581803123145703e-01 +441 513 1.127337591104751e+00 +586 595 1.127337591104735e+00 +586 596 3.581803123145777e-01 +586 597 -8.275622364938169e-02 +586 598 -1.647201287983635e-02 +586 599 3.905164342835204e-02 +586 600 -6.396858715893991e-03 +586 601 -2.350502600205526e-02 +586 602 -9.446121266013350e-03 +586 603 1.341205845607521e-03 +586 658 -1.362265824185753e-03 +586 659 8.487647252886596e-03 +586 660 1.672506100817120e-02 +586 661 3.269116801862702e-03 +586 662 -1.302060500417363e-02 +586 663 3.181723537341419e-03 +586 664 7.624768649835802e-03 +586 665 -9.871243074083968e-03 +586 666 4.264667105949845e-03 +587 595 -1.922830829601323e-01 +587 596 8.260133191084634e-01 +587 597 8.356838818943036e-01 +587 598 7.558727102103120e-02 +587 599 -1.481841308439263e-01 +587 600 2.241613345136343e-02 +587 601 7.916366620200224e-02 +587 602 3.117098545351193e-02 +587 603 -4.386880907561344e-03 +587 658 4.465297339933899e-03 +587 659 -2.759918986753014e-02 +587 660 -5.370085579481128e-02 +587 661 -1.035683940699934e-02 +587 662 4.076984829088395e-02 +587 663 -9.871741963054820e-03 +587 664 -2.350261848546802e-02 +587 665 3.030083677823413e-02 +587 666 -1.306452632632723e-02 +588 595 1.064265344782056e-01 +588 596 -2.886290461498122e-01 +588 597 3.449469309961221e-01 +588 598 1.000392437420346e+00 +588 599 5.638333964581611e-01 +588 600 -5.799754933334010e-02 +588 601 -1.780696083183279e-01 +588 602 -6.582166366027499e-02 +588 603 9.027771977723762e-03 +588 658 -9.245866670384678e-03 +588 659 5.585817628857195e-02 +588 660 1.049843649593243e-01 +588 661 1.955185861067555e-02 +588 662 -7.474755887491953e-02 +588 663 1.770422947357947e-02 +588 664 4.150843175724508e-02 +588 665 -5.300453519820934e-02 +588 666 2.274881512221991e-02 +589 595 -7.016759340115938e-02 +589 596 1.735553128493523e-01 +589 597 -1.561239953893069e-01 +589 598 -8.774286432824727e-02 +589 599 6.925293570792235e-01 +589 600 9.874100819505106e-01 +589 601 5.916114520752486e-01 +589 602 1.646597577537454e-01 +589 603 -2.059904582301587e-02 +589 658 2.154433625498942e-02 +589 659 -1.207398053365276e-01 +589 660 -2.050311138188881e-01 +589 661 -3.490220705075001e-02 +589 662 1.247453761320625e-01 +589 663 -2.819771551760646e-02 +589 664 -6.411209206256369e-02 +589 665 8.036958734762600e-02 +589 666 -3.419577051632374e-02 +590 595 4.893336539282690e-02 +590 596 -1.169145439761488e-01 +590 597 9.673091628921357e-02 +590 598 4.541867323644706e-02 +590 599 -2.249773266656634e-01 +590 600 7.700626369257130e-02 +590 601 6.678220596893363e-01 +590 602 9.634302133816300e-01 +590 603 9.992154478068930e-01 +590 658 9.992154478068929e-01 +590 659 9.634302133816300e-01 +590 660 6.678220596893359e-01 +590 661 7.700626369257121e-02 +590 662 -2.249773266656631e-01 +590 663 4.541867323644695e-02 +590 664 9.673091628921314e-02 +590 665 -1.169145439761470e-01 +590 666 4.893336539283898e-02 +591 595 -3.419577051631530e-02 +591 596 8.036958734762731e-02 +591 597 -6.411209206256401e-02 +591 598 -2.819771551760654e-02 +591 599 1.247453761320627e-01 +591 600 -3.490220705075006e-02 +591 601 -2.050311138188882e-01 +591 602 -1.207398053365276e-01 +591 603 2.154433625498943e-02 +591 658 -2.059904582301588e-02 +591 659 1.646597577537455e-01 +591 660 5.916114520752487e-01 +591 661 9.874100819505099e-01 +591 662 6.925293570792230e-01 +591 663 -8.774286432824713e-02 +591 664 -1.561239953893062e-01 +591 665 1.735553128493496e-01 +591 666 -7.016759340117672e-02 +592 595 2.274881512221433e-02 +592 596 -5.300453519821029e-02 +592 597 4.150843175724536e-02 +592 598 1.770422947357954e-02 +592 599 -7.474755887491977e-02 +592 600 1.955185861067561e-02 +592 601 1.049843649593246e-01 +592 602 5.585817628857206e-02 +592 603 -9.245866670384698e-03 +592 658 9.027771977723779e-03 +592 659 -6.582166366027511e-02 +592 660 -1.780696083183282e-01 +592 661 -5.799754933334016e-02 +592 662 5.638333964581616e-01 +592 663 1.000392437420346e+00 +592 664 3.449469309961212e-01 +592 665 -2.886290461498082e-01 +592 666 1.064265344782319e-01 +593 595 -1.306452632632408e-02 +593 596 3.030083677823481e-02 +593 597 -2.350261848546828e-02 +593 598 -9.871741963054907e-03 +593 599 4.076984829088427e-02 +593 600 -1.035683940699942e-02 +593 601 -5.370085579481167e-02 +593 602 -2.759918986753033e-02 +593 603 4.465297339933930e-03 +593 658 -4.386880907561373e-03 +593 659 3.117098545351214e-02 +593 660 7.916366620200274e-02 +593 661 2.241613345136356e-02 +593 662 -1.481841308439272e-01 +593 663 7.558727102103156e-02 +593 664 8.356838818943056e-01 +593 665 8.260133191084560e-01 +593 666 -1.922830829601799e-01 +594 595 4.264667105948851e-03 +594 596 -9.871243074084265e-03 +594 597 7.624768649835944e-03 +594 598 3.181723537341472e-03 +594 599 -1.302060500417384e-02 +594 600 3.269116801862752e-03 +594 601 1.672506100817145e-02 +594 602 8.487647252886721e-03 +594 603 -1.362265824185774e-03 +594 658 1.341205845607541e-03 +594 659 -9.446121266013491e-03 +594 660 -2.350502600205560e-02 +594 661 -6.396858715894081e-03 +594 662 3.905164342835260e-02 +594 663 -1.647201287983659e-02 +594 664 -8.275622364938288e-02 +594 665 3.581803123145829e-01 +594 666 1.127337591104767e+00 +721 730 1.127337591104767e+00 +721 731 3.581803123145827e-01 +721 732 -8.275622364938288e-02 +721 733 -1.647201287983658e-02 +721 734 3.905164342835259e-02 +721 735 -6.396858715894082e-03 +721 736 -2.350502600205559e-02 +721 737 -9.446121266013484e-03 +721 738 1.341205845607540e-03 +721 793 -1.362265824185773e-03 +721 794 8.487647252886718e-03 +721 795 1.672506100817144e-02 +721 796 3.269116801862750e-03 +721 797 -1.302060500417382e-02 +721 798 3.181723537341464e-03 +721 799 7.624768649835909e-03 +721 800 -9.871243074084103e-03 +721 801 4.264667105949906e-03 +722 730 -1.922830829601800e-01 +722 731 8.260133191084557e-01 +722 732 8.356838818943058e-01 +722 733 7.558727102103155e-02 +722 734 -1.481841308439271e-01 +722 735 2.241613345136356e-02 +722 736 7.916366620200271e-02 +722 737 3.117098545351212e-02 +722 738 -4.386880907561372e-03 +722 793 4.465297339933927e-03 +722 794 -2.759918986753031e-02 +722 795 -5.370085579481166e-02 +722 796 -1.035683940699942e-02 +722 797 4.076984829088422e-02 +722 798 -9.871741963054886e-03 +722 799 -2.350261848546818e-02 +722 800 3.030083677823432e-02 +722 801 -1.306452632632732e-02 +723 730 1.064265344782319e-01 +723 731 -2.886290461498082e-01 +723 732 3.449469309961213e-01 +723 733 1.000392437420346e+00 +723 734 5.638333964581613e-01 +723 735 -5.799754933334017e-02 +723 736 -1.780696083183281e-01 +723 737 -6.582166366027509e-02 +723 738 9.027771977723777e-03 +723 793 -9.245866670384694e-03 +723 794 5.585817628857204e-02 +723 795 1.049843649593245e-01 +723 796 1.955185861067560e-02 +723 797 -7.474755887491967e-02 +723 798 1.770422947357950e-02 +723 799 4.150843175724517e-02 +723 800 -5.300453519820944e-02 +723 801 2.274881512221995e-02 +724 730 -7.016759340117676e-02 +724 731 1.735553128493496e-01 +724 732 -1.561239953893063e-01 +724 733 -8.774286432824714e-02 +724 734 6.925293570792230e-01 +724 735 9.874100819505106e-01 +724 736 5.916114520752486e-01 +724 737 1.646597577537455e-01 +724 738 -2.059904582301588e-02 +724 793 2.154433625498943e-02 +724 794 -1.207398053365276e-01 +724 795 -2.050311138188882e-01 +724 796 -3.490220705075005e-02 +724 797 1.247453761320625e-01 +724 798 -2.819771551760648e-02 +724 799 -6.411209206256374e-02 +724 800 8.036958734762605e-02 +724 801 -3.419577051632377e-02 +725 730 4.893336539283901e-02 +725 731 -1.169145439761470e-01 +725 732 9.673091628921318e-02 +725 733 4.541867323644696e-02 +725 734 -2.249773266656631e-01 +725 735 7.700626369257126e-02 +725 736 6.678220596893359e-01 +725 737 9.634302133816298e-01 +725 738 9.992154478068930e-01 +725 793 9.992154478068929e-01 +725 794 9.634302133816302e-01 +725 795 6.678220596893362e-01 +725 796 7.700626369257128e-02 +725 797 -2.249773266656631e-01 +725 798 4.541867323644697e-02 +725 799 9.673091628921317e-02 +725 800 -1.169145439761470e-01 +725 801 4.893336539283900e-02 +726 730 -3.419577051632377e-02 +726 731 8.036958734762603e-02 +726 732 -6.411209206256374e-02 +726 733 -2.819771551760647e-02 +726 734 1.247453761320625e-01 +726 735 -3.490220705075004e-02 +726 736 -2.050311138188881e-01 +726 737 -1.207398053365276e-01 +726 738 2.154433625498943e-02 +726 793 -2.059904582301587e-02 +726 794 1.646597577537455e-01 +726 795 5.916114520752487e-01 +726 796 9.874100819505106e-01 +726 797 6.925293570792229e-01 +726 798 -8.774286432824713e-02 +726 799 -1.561239953893062e-01 +726 800 1.735553128493496e-01 +726 801 -7.016759340117673e-02 +727 730 2.274881512221996e-02 +727 731 -5.300453519820943e-02 +727 732 4.150843175724517e-02 +727 733 1.770422947357950e-02 +727 734 -7.474755887491966e-02 +727 735 1.955185861067559e-02 +727 736 1.049843649593245e-01 +727 737 5.585817628857203e-02 +727 738 -9.245866670384694e-03 +727 793 9.027771977723774e-03 +727 794 -6.582166366027510e-02 +727 795 -1.780696083183282e-01 +727 796 -5.799754933334018e-02 +727 797 5.638333964581613e-01 +727 798 1.000392437420346e+00 +727 799 3.449469309961212e-01 +727 800 -2.886290461498081e-01 +727 801 1.064265344782319e-01 +728 730 -1.306452632632732e-02 +728 731 3.030083677823433e-02 +728 732 -2.350261848546819e-02 +728 733 -9.871741963054886e-03 +728 734 4.076984829088422e-02 +728 735 -1.035683940699942e-02 +728 736 -5.370085579481165e-02 +728 737 -2.759918986753031e-02 +728 738 4.465297339933929e-03 +728 793 -4.386880907561372e-03 +728 794 3.117098545351214e-02 +728 795 7.916366620200274e-02 +728 796 2.241613345136357e-02 +728 797 -1.481841308439272e-01 +728 798 7.558727102103158e-02 +728 799 8.356838818943058e-01 +728 800 8.260133191084559e-01 +728 801 -1.922830829601800e-01 +729 730 4.264667105949907e-03 +729 731 -9.871243074084105e-03 +729 732 7.624768649835910e-03 +729 733 3.181723537341464e-03 +729 734 -1.302060500417382e-02 +729 735 3.269116801862750e-03 +729 736 1.672506100817144e-02 +729 737 8.487647252886716e-03 +729 738 -1.362265824185773e-03 +729 793 1.341205845607540e-03 +729 794 -9.446121266013487e-03 +729 795 -2.350502600205560e-02 +729 796 -6.396858715894085e-03 +729 797 3.905164342835259e-02 +729 798 -1.647201287983659e-02 +729 799 -8.275622364938288e-02 +729 800 3.581803123145828e-01 +729 801 1.127337591104767e+00 +865 874 1.127337591104767e+00 +865 875 3.581803123145827e-01 +865 876 -8.275622364938288e-02 +865 877 -1.647201287983658e-02 +865 878 3.905164342835259e-02 +865 879 -6.396858715894082e-03 +865 880 -2.350502600205559e-02 +865 881 -9.446121266013484e-03 +865 882 1.341205845607540e-03 +865 937 -1.362265824185773e-03 +865 938 8.487647252886718e-03 +865 939 1.672506100817144e-02 +865 940 3.269116801862750e-03 +865 941 -1.302060500417382e-02 +865 942 3.181723537341464e-03 +865 943 7.624768649835909e-03 +865 944 -9.871243074084103e-03 +865 945 4.264667105949906e-03 +866 874 -1.922830829601800e-01 +866 875 8.260133191084557e-01 +866 876 8.356838818943058e-01 +866 877 7.558727102103155e-02 +866 878 -1.481841308439271e-01 +866 879 2.241613345136356e-02 +866 880 7.916366620200271e-02 +866 881 3.117098545351212e-02 +866 882 -4.386880907561372e-03 +866 937 4.465297339933927e-03 +866 938 -2.759918986753031e-02 +866 939 -5.370085579481166e-02 +866 940 -1.035683940699942e-02 +866 941 4.076984829088422e-02 +866 942 -9.871741963054886e-03 +866 943 -2.350261848546818e-02 +866 944 3.030083677823432e-02 +866 945 -1.306452632632732e-02 +867 874 1.064265344782319e-01 +867 875 -2.886290461498082e-01 +867 876 3.449469309961213e-01 +867 877 1.000392437420346e+00 +867 878 5.638333964581613e-01 +867 879 -5.799754933334017e-02 +867 880 -1.780696083183281e-01 +867 881 -6.582166366027509e-02 +867 882 9.027771977723777e-03 +867 937 -9.245866670384694e-03 +867 938 5.585817628857204e-02 +867 939 1.049843649593245e-01 +867 940 1.955185861067560e-02 +867 941 -7.474755887491967e-02 +867 942 1.770422947357950e-02 +867 943 4.150843175724517e-02 +867 944 -5.300453519820944e-02 +867 945 2.274881512221995e-02 +868 874 -7.016759340117676e-02 +868 875 1.735553128493496e-01 +868 876 -1.561239953893063e-01 +868 877 -8.774286432824714e-02 +868 878 6.925293570792230e-01 +868 879 9.874100819505106e-01 +868 880 5.916114520752486e-01 +868 881 1.646597577537455e-01 +868 882 -2.059904582301588e-02 +868 937 2.154433625498943e-02 +868 938 -1.207398053365276e-01 +868 939 -2.050311138188882e-01 +868 940 -3.490220705075005e-02 +868 941 1.247453761320625e-01 +868 942 -2.819771551760648e-02 +868 943 -6.411209206256374e-02 +868 944 8.036958734762605e-02 +868 945 -3.419577051632377e-02 +869 874 4.893336539283901e-02 +869 875 -1.169145439761470e-01 +869 876 9.673091628921318e-02 +869 877 4.541867323644696e-02 +869 878 -2.249773266656631e-01 +869 879 7.700626369257126e-02 +869 880 6.678220596893359e-01 +869 881 9.634302133816298e-01 +869 882 9.992154478068930e-01 +869 937 9.992154478068929e-01 +869 938 9.634302133816302e-01 +869 939 6.678220596893362e-01 +869 940 7.700626369257128e-02 +869 941 -2.249773266656631e-01 +869 942 4.541867323644697e-02 +869 943 9.673091628921317e-02 +869 944 -1.169145439761470e-01 +869 945 4.893336539283900e-02 +870 874 -3.419577051632377e-02 +870 875 8.036958734762603e-02 +870 876 -6.411209206256374e-02 +870 877 -2.819771551760647e-02 +870 878 1.247453761320625e-01 +870 879 -3.490220705075004e-02 +870 880 -2.050311138188881e-01 +870 881 -1.207398053365276e-01 +870 882 2.154433625498943e-02 +870 937 -2.059904582301587e-02 +870 938 1.646597577537455e-01 +870 939 5.916114520752487e-01 +870 940 9.874100819505106e-01 +870 941 6.925293570792229e-01 +870 942 -8.774286432824713e-02 +870 943 -1.561239953893062e-01 +870 944 1.735553128493496e-01 +870 945 -7.016759340117673e-02 +871 874 2.274881512221996e-02 +871 875 -5.300453519820943e-02 +871 876 4.150843175724517e-02 +871 877 1.770422947357950e-02 +871 878 -7.474755887491966e-02 +871 879 1.955185861067559e-02 +871 880 1.049843649593245e-01 +871 881 5.585817628857203e-02 +871 882 -9.245866670384694e-03 +871 937 9.027771977723774e-03 +871 938 -6.582166366027510e-02 +871 939 -1.780696083183282e-01 +871 940 -5.799754933334018e-02 +871 941 5.638333964581613e-01 +871 942 1.000392437420346e+00 +871 943 3.449469309961212e-01 +871 944 -2.886290461498081e-01 +871 945 1.064265344782319e-01 +872 874 -1.306452632632732e-02 +872 875 3.030083677823433e-02 +872 876 -2.350261848546819e-02 +872 877 -9.871741963054886e-03 +872 878 4.076984829088422e-02 +872 879 -1.035683940699942e-02 +872 880 -5.370085579481165e-02 +872 881 -2.759918986753031e-02 +872 882 4.465297339933929e-03 +872 937 -4.386880907561372e-03 +872 938 3.117098545351214e-02 +872 939 7.916366620200274e-02 +872 940 2.241613345136357e-02 +872 941 -1.481841308439272e-01 +872 942 7.558727102103158e-02 +872 943 8.356838818943058e-01 +872 944 8.260133191084559e-01 +872 945 -1.922830829601800e-01 +873 874 4.264667105949907e-03 +873 875 -9.871243074084105e-03 +873 876 7.624768649835910e-03 +873 877 3.181723537341464e-03 +873 878 -1.302060500417382e-02 +873 879 3.269116801862750e-03 +873 880 1.672506100817144e-02 +873 881 8.487647252886716e-03 +873 882 -1.362265824185773e-03 +873 937 1.341205845607540e-03 +873 938 -9.446121266013487e-03 +873 939 -2.350502600205560e-02 +873 940 -6.396858715894085e-03 +873 941 3.905164342835259e-02 +873 942 -1.647201287983659e-02 +873 943 -8.275622364938288e-02 +873 944 3.581803123145828e-01 +873 945 1.127337591104767e+00 +1000 1009 1.127337591104767e+00 +1000 1010 3.581803123145827e-01 +1000 1011 -8.275622364938288e-02 +1000 1012 -1.647201287983658e-02 +1000 1013 3.905164342835259e-02 +1000 1014 -6.396858715894082e-03 +1000 1015 -2.350502600205559e-02 +1000 1016 -9.446121266013484e-03 +1000 1017 1.341205845607540e-03 +1000 1072 -1.362265824185773e-03 +1000 1073 8.487647252886718e-03 +1000 1074 1.672506100817144e-02 +1000 1075 3.269116801862750e-03 +1000 1076 -1.302060500417382e-02 +1000 1077 3.181723537341464e-03 +1000 1078 7.624768649835909e-03 +1000 1079 -9.871243074084103e-03 +1000 1080 4.264667105949906e-03 +1001 1009 -1.922830829601800e-01 +1001 1010 8.260133191084557e-01 +1001 1011 8.356838818943058e-01 +1001 1012 7.558727102103155e-02 +1001 1013 -1.481841308439271e-01 +1001 1014 2.241613345136356e-02 +1001 1015 7.916366620200271e-02 +1001 1016 3.117098545351212e-02 +1001 1017 -4.386880907561372e-03 +1001 1072 4.465297339933927e-03 +1001 1073 -2.759918986753031e-02 +1001 1074 -5.370085579481166e-02 +1001 1075 -1.035683940699942e-02 +1001 1076 4.076984829088422e-02 +1001 1077 -9.871741963054886e-03 +1001 1078 -2.350261848546818e-02 +1001 1079 3.030083677823432e-02 +1001 1080 -1.306452632632732e-02 +1002 1009 1.064265344782319e-01 +1002 1010 -2.886290461498082e-01 +1002 1011 3.449469309961213e-01 +1002 1012 1.000392437420346e+00 +1002 1013 5.638333964581613e-01 +1002 1014 -5.799754933334017e-02 +1002 1015 -1.780696083183281e-01 +1002 1016 -6.582166366027509e-02 +1002 1017 9.027771977723777e-03 +1002 1072 -9.245866670384694e-03 +1002 1073 5.585817628857204e-02 +1002 1074 1.049843649593245e-01 +1002 1075 1.955185861067560e-02 +1002 1076 -7.474755887491967e-02 +1002 1077 1.770422947357950e-02 +1002 1078 4.150843175724517e-02 +1002 1079 -5.300453519820944e-02 +1002 1080 2.274881512221995e-02 +1003 1009 -7.016759340117676e-02 +1003 1010 1.735553128493496e-01 +1003 1011 -1.561239953893063e-01 +1003 1012 -8.774286432824714e-02 +1003 1013 6.925293570792230e-01 +1003 1014 9.874100819505106e-01 +1003 1015 5.916114520752486e-01 +1003 1016 1.646597577537455e-01 +1003 1017 -2.059904582301588e-02 +1003 1072 2.154433625498943e-02 +1003 1073 -1.207398053365276e-01 +1003 1074 -2.050311138188882e-01 +1003 1075 -3.490220705075005e-02 +1003 1076 1.247453761320625e-01 +1003 1077 -2.819771551760648e-02 +1003 1078 -6.411209206256374e-02 +1003 1079 8.036958734762605e-02 +1003 1080 -3.419577051632377e-02 +1004 1009 4.893336539283901e-02 +1004 1010 -1.169145439761470e-01 +1004 1011 9.673091628921318e-02 +1004 1012 4.541867323644696e-02 +1004 1013 -2.249773266656631e-01 +1004 1014 7.700626369257126e-02 +1004 1015 6.678220596893359e-01 +1004 1016 9.634302133816298e-01 +1004 1017 9.992154478068930e-01 +1004 1072 9.992154478068929e-01 +1004 1073 9.634302133816302e-01 +1004 1074 6.678220596893362e-01 +1004 1075 7.700626369257128e-02 +1004 1076 -2.249773266656631e-01 +1004 1077 4.541867323644697e-02 +1004 1078 9.673091628921317e-02 +1004 1079 -1.169145439761470e-01 +1004 1080 4.893336539283900e-02 +1005 1009 -3.419577051632377e-02 +1005 1010 8.036958734762603e-02 +1005 1011 -6.411209206256374e-02 +1005 1012 -2.819771551760647e-02 +1005 1013 1.247453761320625e-01 +1005 1014 -3.490220705075004e-02 +1005 1015 -2.050311138188881e-01 +1005 1016 -1.207398053365276e-01 +1005 1017 2.154433625498943e-02 +1005 1072 -2.059904582301587e-02 +1005 1073 1.646597577537455e-01 +1005 1074 5.916114520752487e-01 +1005 1075 9.874100819505106e-01 +1005 1076 6.925293570792229e-01 +1005 1077 -8.774286432824713e-02 +1005 1078 -1.561239953893062e-01 +1005 1079 1.735553128493496e-01 +1005 1080 -7.016759340117673e-02 +1006 1009 2.274881512221996e-02 +1006 1010 -5.300453519820943e-02 +1006 1011 4.150843175724517e-02 +1006 1012 1.770422947357950e-02 +1006 1013 -7.474755887491966e-02 +1006 1014 1.955185861067559e-02 +1006 1015 1.049843649593245e-01 +1006 1016 5.585817628857203e-02 +1006 1017 -9.245866670384694e-03 +1006 1072 9.027771977723774e-03 +1006 1073 -6.582166366027510e-02 +1006 1074 -1.780696083183282e-01 +1006 1075 -5.799754933334018e-02 +1006 1076 5.638333964581613e-01 +1006 1077 1.000392437420346e+00 +1006 1078 3.449469309961212e-01 +1006 1079 -2.886290461498081e-01 +1006 1080 1.064265344782319e-01 +1007 1009 -1.306452632632732e-02 +1007 1010 3.030083677823433e-02 +1007 1011 -2.350261848546819e-02 +1007 1012 -9.871741963054886e-03 +1007 1013 4.076984829088422e-02 +1007 1014 -1.035683940699942e-02 +1007 1015 -5.370085579481165e-02 +1007 1016 -2.759918986753031e-02 +1007 1017 4.465297339933929e-03 +1007 1072 -4.386880907561372e-03 +1007 1073 3.117098545351214e-02 +1007 1074 7.916366620200274e-02 +1007 1075 2.241613345136357e-02 +1007 1076 -1.481841308439272e-01 +1007 1077 7.558727102103158e-02 +1007 1078 8.356838818943058e-01 +1007 1079 8.260133191084559e-01 +1007 1080 -1.922830829601800e-01 +1008 1009 4.264667105949907e-03 +1008 1010 -9.871243074084105e-03 +1008 1011 7.624768649835910e-03 +1008 1012 3.181723537341464e-03 +1008 1013 -1.302060500417382e-02 +1008 1014 3.269116801862750e-03 +1008 1015 1.672506100817144e-02 +1008 1016 8.487647252886716e-03 +1008 1017 -1.362265824185773e-03 +1008 1072 1.341205845607540e-03 +1008 1073 -9.446121266013487e-03 +1008 1074 -2.350502600205560e-02 +1008 1075 -6.396858715894085e-03 +1008 1076 3.905164342835259e-02 +1008 1077 -1.647201287983659e-02 +1008 1078 -8.275622364938288e-02 +1008 1079 3.581803123145828e-01 +1008 1080 1.127337591104767e+00 +1153 1162 1.127337591104767e+00 +1153 1163 3.581803123145674e-01 +1153 1164 -8.275622364938241e-02 +1153 1165 -1.647201287983672e-02 +1153 1166 3.905164342835294e-02 +1153 1167 -6.396858715895110e-03 +1153 1168 -2.350502600205617e-02 +1153 1169 -9.446121266013996e-03 +1153 1170 1.341205845607568e-03 +1153 1225 -1.362265824185802e-03 +1153 1226 8.487647252887143e-03 +1153 1227 1.672506100817185e-02 +1153 1228 3.269116801863287e-03 +1153 1229 -1.302060500417393e-02 +1153 1230 3.181723537341469e-03 +1153 1231 7.624768649835868e-03 +1153 1232 -9.871243074084018e-03 +1153 1233 4.264667105949907e-03 +1154 1162 -1.922830829601806e-01 +1154 1163 8.260133191084722e-01 +1154 1164 8.356838818943036e-01 +1154 1165 7.558727102103262e-02 +1154 1166 -1.481841308439290e-01 +1154 1167 2.241613345136722e-02 +1154 1168 7.916366620200491e-02 +1154 1169 3.117098545351392e-02 +1154 1170 -4.386880907561477e-03 +1154 1225 4.465297339934037e-03 +1154 1226 -2.759918986753178e-02 +1154 1227 -5.370085579481315e-02 +1154 1228 -1.035683940700115e-02 +1154 1229 4.076984829088470e-02 +1154 1230 -9.871741963054927e-03 +1154 1231 -2.350261848546813e-02 +1154 1232 3.030083677823415e-02 +1154 1233 -1.306452632632736e-02 +1155 1162 1.064265344782320e-01 +1155 1163 -2.886290461498077e-01 +1155 1164 3.449469309961214e-01 +1155 1165 1.000392437420344e+00 +1155 1166 5.638333964581578e-01 +1155 1167 -5.799754933334880e-02 +1155 1168 -1.780696083183312e-01 +1155 1169 -6.582166366027828e-02 +1155 1170 9.027771977723906e-03 +1155 1225 -9.245866670384831e-03 +1155 1226 5.585817628857445e-02 +1155 1227 1.049843649593265e-01 +1155 1228 1.955185861067871e-02 +1155 1229 -7.474755887491993e-02 +1155 1230 1.770422947357942e-02 +1155 1231 4.150843175724474e-02 +1155 1232 -5.300453519820873e-02 +1155 1233 2.274881512221985e-02 +1156 1162 -7.016759340117582e-02 +1156 1163 1.735553128493462e-01 +1156 1164 -1.561239953893035e-01 +1156 1165 -8.774286432824593e-02 +1156 1166 6.925293570792262e-01 +1156 1167 9.874100819505079e-01 +1156 1168 5.916114520752478e-01 +1156 1169 1.646597577537514e-01 +1156 1170 -2.059904582301588e-02 +1156 1225 2.154433625498943e-02 +1156 1226 -1.207398053365309e-01 +1156 1227 -2.050311138188893e-01 +1156 1228 -3.490220705075518e-02 +1156 1229 1.247453761320614e-01 +1156 1230 -2.819771551760599e-02 +1156 1231 -6.411209206256227e-02 +1156 1232 8.036958734762398e-02 +1156 1233 -3.419577051632318e-02 +1157 1162 4.893336539283798e-02 +1157 1163 -1.169145439761436e-01 +1157 1164 9.673091628921059e-02 +1157 1165 4.541867323644599e-02 +1157 1166 -2.249773266656604e-01 +1157 1167 7.700626369258262e-02 +1157 1168 6.678220596893384e-01 +1157 1169 9.634302133816279e-01 +1157 1170 9.992154478068926e-01 +1157 1225 9.992154478068931e-01 +1157 1226 9.634302133816277e-01 +1157 1227 6.678220596893386e-01 +1157 1228 7.700626369258262e-02 +1157 1229 -2.249773266656604e-01 +1157 1230 4.541867323644599e-02 +1157 1231 9.673091628921060e-02 +1157 1232 -1.169145439761436e-01 +1157 1233 4.893336539283798e-02 +1158 1162 -3.419577051632319e-02 +1158 1163 8.036958734762399e-02 +1158 1164 -6.411209206256227e-02 +1158 1165 -2.819771551760600e-02 +1158 1166 1.247453761320614e-01 +1158 1167 -3.490220705075519e-02 +1158 1168 -2.050311138188892e-01 +1158 1169 -1.207398053365309e-01 +1158 1170 2.154433625498943e-02 +1158 1225 -2.059904582301589e-02 +1158 1226 1.646597577537514e-01 +1158 1227 5.916114520752482e-01 +1158 1228 9.874100819505082e-01 +1158 1229 6.925293570792262e-01 +1158 1230 -8.774286432824595e-02 +1158 1231 -1.561239953893035e-01 +1158 1232 1.735553128493462e-01 +1158 1233 -7.016759340117583e-02 +1159 1162 2.274881512221985e-02 +1159 1163 -5.300453519820873e-02 +1159 1164 4.150843175724473e-02 +1159 1165 1.770422947357942e-02 +1159 1166 -7.474755887491995e-02 +1159 1167 1.955185861067871e-02 +1159 1168 1.049843649593265e-01 +1159 1169 5.585817628857446e-02 +1159 1170 -9.245866670384828e-03 +1159 1225 9.027771977723909e-03 +1159 1226 -6.582166366027828e-02 +1159 1227 -1.780696083183313e-01 +1159 1228 -5.799754933334880e-02 +1159 1229 5.638333964581578e-01 +1159 1230 1.000392437420344e+00 +1159 1231 3.449469309961215e-01 +1159 1232 -2.886290461498077e-01 +1159 1233 1.064265344782320e-01 +1160 1162 -1.306452632632736e-02 +1160 1163 3.030083677823416e-02 +1160 1164 -2.350261848546813e-02 +1160 1165 -9.871741963054929e-03 +1160 1166 4.076984829088472e-02 +1160 1167 -1.035683940700115e-02 +1160 1168 -5.370085579481314e-02 +1160 1169 -2.759918986753180e-02 +1160 1170 4.465297339934036e-03 +1160 1225 -4.386880907561479e-03 +1160 1226 3.117098545351392e-02 +1160 1227 7.916366620200496e-02 +1160 1228 2.241613345136722e-02 +1160 1229 -1.481841308439290e-01 +1160 1230 7.558727102103263e-02 +1160 1231 8.356838818943038e-01 +1160 1232 8.260133191084723e-01 +1160 1233 -1.922830829601806e-01 +1161 1162 4.264667105949907e-03 +1161 1163 -9.871243074084018e-03 +1161 1164 7.624768649835868e-03 +1161 1165 3.181723537341469e-03 +1161 1166 -1.302060500417394e-02 +1161 1167 3.269116801863288e-03 +1161 1168 1.672506100817185e-02 +1161 1169 8.487647252887146e-03 +1161 1170 -1.362265824185802e-03 +1161 1225 1.341205845607569e-03 +1161 1226 -9.446121266013994e-03 +1161 1227 -2.350502600205618e-02 +1161 1228 -6.396858715895111e-03 +1161 1229 3.905164342835294e-02 +1161 1230 -1.647201287983672e-02 +1161 1231 -8.275622364938244e-02 +1161 1232 3.581803123145674e-01 +1161 1233 1.127337591104767e+00 +1288 1297 1.127337591104767e+00 +1288 1298 3.581803123145674e-01 +1288 1299 -8.275622364938241e-02 +1288 1300 -1.647201287983672e-02 +1288 1301 3.905164342835294e-02 +1288 1302 -6.396858715895110e-03 +1288 1303 -2.350502600205617e-02 +1288 1304 -9.446121266013996e-03 +1288 1305 1.341205845607568e-03 +1288 1360 -1.362265824185802e-03 +1288 1361 8.487647252887143e-03 +1288 1362 1.672506100817185e-02 +1288 1363 3.269116801863287e-03 +1288 1364 -1.302060500417393e-02 +1288 1365 3.181723537341469e-03 +1288 1366 7.624768649835868e-03 +1288 1367 -9.871243074084018e-03 +1288 1368 4.264667105949907e-03 +1289 1297 -1.922830829601806e-01 +1289 1298 8.260133191084722e-01 +1289 1299 8.356838818943036e-01 +1289 1300 7.558727102103262e-02 +1289 1301 -1.481841308439290e-01 +1289 1302 2.241613345136722e-02 +1289 1303 7.916366620200491e-02 +1289 1304 3.117098545351392e-02 +1289 1305 -4.386880907561477e-03 +1289 1360 4.465297339934037e-03 +1289 1361 -2.759918986753178e-02 +1289 1362 -5.370085579481315e-02 +1289 1363 -1.035683940700115e-02 +1289 1364 4.076984829088470e-02 +1289 1365 -9.871741963054927e-03 +1289 1366 -2.350261848546813e-02 +1289 1367 3.030083677823415e-02 +1289 1368 -1.306452632632736e-02 +1290 1297 1.064265344782320e-01 +1290 1298 -2.886290461498077e-01 +1290 1299 3.449469309961214e-01 +1290 1300 1.000392437420344e+00 +1290 1301 5.638333964581578e-01 +1290 1302 -5.799754933334880e-02 +1290 1303 -1.780696083183312e-01 +1290 1304 -6.582166366027828e-02 +1290 1305 9.027771977723906e-03 +1290 1360 -9.245866670384831e-03 +1290 1361 5.585817628857445e-02 +1290 1362 1.049843649593265e-01 +1290 1363 1.955185861067871e-02 +1290 1364 -7.474755887491993e-02 +1290 1365 1.770422947357942e-02 +1290 1366 4.150843175724474e-02 +1290 1367 -5.300453519820873e-02 +1290 1368 2.274881512221985e-02 +1291 1297 -7.016759340117582e-02 +1291 1298 1.735553128493462e-01 +1291 1299 -1.561239953893035e-01 +1291 1300 -8.774286432824593e-02 +1291 1301 6.925293570792262e-01 +1291 1302 9.874100819505079e-01 +1291 1303 5.916114520752478e-01 +1291 1304 1.646597577537514e-01 +1291 1305 -2.059904582301588e-02 +1291 1360 2.154433625498943e-02 +1291 1361 -1.207398053365309e-01 +1291 1362 -2.050311138188893e-01 +1291 1363 -3.490220705075518e-02 +1291 1364 1.247453761320614e-01 +1291 1365 -2.819771551760599e-02 +1291 1366 -6.411209206256227e-02 +1291 1367 8.036958734762398e-02 +1291 1368 -3.419577051632318e-02 +1292 1297 4.893336539283798e-02 +1292 1298 -1.169145439761436e-01 +1292 1299 9.673091628921059e-02 +1292 1300 4.541867323644599e-02 +1292 1301 -2.249773266656604e-01 +1292 1302 7.700626369258262e-02 +1292 1303 6.678220596893384e-01 +1292 1304 9.634302133816279e-01 +1292 1305 9.992154478068926e-01 +1292 1360 9.992154478068931e-01 +1292 1361 9.634302133816277e-01 +1292 1362 6.678220596893386e-01 +1292 1363 7.700626369258262e-02 +1292 1364 -2.249773266656604e-01 +1292 1365 4.541867323644599e-02 +1292 1366 9.673091628921060e-02 +1292 1367 -1.169145439761436e-01 +1292 1368 4.893336539283798e-02 +1293 1297 -3.419577051632319e-02 +1293 1298 8.036958734762399e-02 +1293 1299 -6.411209206256227e-02 +1293 1300 -2.819771551760600e-02 +1293 1301 1.247453761320614e-01 +1293 1302 -3.490220705075519e-02 +1293 1303 -2.050311138188892e-01 +1293 1304 -1.207398053365309e-01 +1293 1305 2.154433625498943e-02 +1293 1360 -2.059904582301589e-02 +1293 1361 1.646597577537514e-01 +1293 1362 5.916114520752482e-01 +1293 1363 9.874100819505082e-01 +1293 1364 6.925293570792262e-01 +1293 1365 -8.774286432824595e-02 +1293 1366 -1.561239953893035e-01 +1293 1367 1.735553128493462e-01 +1293 1368 -7.016759340117583e-02 +1294 1297 2.274881512221985e-02 +1294 1298 -5.300453519820873e-02 +1294 1299 4.150843175724473e-02 +1294 1300 1.770422947357942e-02 +1294 1301 -7.474755887491995e-02 +1294 1302 1.955185861067871e-02 +1294 1303 1.049843649593265e-01 +1294 1304 5.585817628857446e-02 +1294 1305 -9.245866670384828e-03 +1294 1360 9.027771977723909e-03 +1294 1361 -6.582166366027828e-02 +1294 1362 -1.780696083183313e-01 +1294 1363 -5.799754933334880e-02 +1294 1364 5.638333964581578e-01 +1294 1365 1.000392437420344e+00 +1294 1366 3.449469309961215e-01 +1294 1367 -2.886290461498077e-01 +1294 1368 1.064265344782320e-01 +1295 1297 -1.306452632632736e-02 +1295 1298 3.030083677823416e-02 +1295 1299 -2.350261848546813e-02 +1295 1300 -9.871741963054929e-03 +1295 1301 4.076984829088472e-02 +1295 1302 -1.035683940700115e-02 +1295 1303 -5.370085579481314e-02 +1295 1304 -2.759918986753180e-02 +1295 1305 4.465297339934036e-03 +1295 1360 -4.386880907561479e-03 +1295 1361 3.117098545351392e-02 +1295 1362 7.916366620200496e-02 +1295 1363 2.241613345136722e-02 +1295 1364 -1.481841308439290e-01 +1295 1365 7.558727102103263e-02 +1295 1366 8.356838818943038e-01 +1295 1367 8.260133191084723e-01 +1295 1368 -1.922830829601806e-01 +1296 1297 4.264667105949907e-03 +1296 1298 -9.871243074084018e-03 +1296 1299 7.624768649835868e-03 +1296 1300 3.181723537341469e-03 +1296 1301 -1.302060500417394e-02 +1296 1302 3.269116801863288e-03 +1296 1303 1.672506100817185e-02 +1296 1304 8.487647252887146e-03 +1296 1305 -1.362265824185802e-03 +1296 1360 1.341205845607569e-03 +1296 1361 -9.446121266013994e-03 +1296 1362 -2.350502600205618e-02 +1296 1363 -6.396858715895111e-03 +1296 1364 3.905164342835294e-02 +1296 1365 -1.647201287983672e-02 +1296 1366 -8.275622364938244e-02 +1296 1367 3.581803123145674e-01 +1296 1368 1.127337591104767e+00 +1432 1441 1.127337591104767e+00 +1432 1442 3.581803123145674e-01 +1432 1443 -8.275622364938241e-02 +1432 1444 -1.647201287983672e-02 +1432 1445 3.905164342835294e-02 +1432 1446 -6.396858715895110e-03 +1432 1447 -2.350502600205617e-02 +1432 1448 -9.446121266013996e-03 +1432 1449 1.341205845607568e-03 +1432 1504 -1.362265824185802e-03 +1432 1505 8.487647252887143e-03 +1432 1506 1.672506100817185e-02 +1432 1507 3.269116801863287e-03 +1432 1508 -1.302060500417393e-02 +1432 1509 3.181723537341469e-03 +1432 1510 7.624768649835868e-03 +1432 1511 -9.871243074084018e-03 +1432 1512 4.264667105949907e-03 +1433 1441 -1.922830829601806e-01 +1433 1442 8.260133191084722e-01 +1433 1443 8.356838818943036e-01 +1433 1444 7.558727102103262e-02 +1433 1445 -1.481841308439290e-01 +1433 1446 2.241613345136722e-02 +1433 1447 7.916366620200491e-02 +1433 1448 3.117098545351392e-02 +1433 1449 -4.386880907561477e-03 +1433 1504 4.465297339934037e-03 +1433 1505 -2.759918986753178e-02 +1433 1506 -5.370085579481315e-02 +1433 1507 -1.035683940700115e-02 +1433 1508 4.076984829088470e-02 +1433 1509 -9.871741963054927e-03 +1433 1510 -2.350261848546813e-02 +1433 1511 3.030083677823415e-02 +1433 1512 -1.306452632632736e-02 +1434 1441 1.064265344782320e-01 +1434 1442 -2.886290461498077e-01 +1434 1443 3.449469309961214e-01 +1434 1444 1.000392437420344e+00 +1434 1445 5.638333964581578e-01 +1434 1446 -5.799754933334880e-02 +1434 1447 -1.780696083183312e-01 +1434 1448 -6.582166366027828e-02 +1434 1449 9.027771977723906e-03 +1434 1504 -9.245866670384831e-03 +1434 1505 5.585817628857445e-02 +1434 1506 1.049843649593265e-01 +1434 1507 1.955185861067871e-02 +1434 1508 -7.474755887491993e-02 +1434 1509 1.770422947357942e-02 +1434 1510 4.150843175724474e-02 +1434 1511 -5.300453519820873e-02 +1434 1512 2.274881512221985e-02 +1435 1441 -7.016759340117582e-02 +1435 1442 1.735553128493462e-01 +1435 1443 -1.561239953893035e-01 +1435 1444 -8.774286432824593e-02 +1435 1445 6.925293570792262e-01 +1435 1446 9.874100819505079e-01 +1435 1447 5.916114520752478e-01 +1435 1448 1.646597577537514e-01 +1435 1449 -2.059904582301588e-02 +1435 1504 2.154433625498943e-02 +1435 1505 -1.207398053365309e-01 +1435 1506 -2.050311138188893e-01 +1435 1507 -3.490220705075518e-02 +1435 1508 1.247453761320614e-01 +1435 1509 -2.819771551760599e-02 +1435 1510 -6.411209206256227e-02 +1435 1511 8.036958734762398e-02 +1435 1512 -3.419577051632318e-02 +1436 1441 4.893336539283798e-02 +1436 1442 -1.169145439761436e-01 +1436 1443 9.673091628921059e-02 +1436 1444 4.541867323644599e-02 +1436 1445 -2.249773266656604e-01 +1436 1446 7.700626369258262e-02 +1436 1447 6.678220596893384e-01 +1436 1448 9.634302133816279e-01 +1436 1449 9.992154478068926e-01 +1436 1504 9.992154478068931e-01 +1436 1505 9.634302133816277e-01 +1436 1506 6.678220596893386e-01 +1436 1507 7.700626369258262e-02 +1436 1508 -2.249773266656604e-01 +1436 1509 4.541867323644599e-02 +1436 1510 9.673091628921060e-02 +1436 1511 -1.169145439761436e-01 +1436 1512 4.893336539283798e-02 +1437 1441 -3.419577051632319e-02 +1437 1442 8.036958734762399e-02 +1437 1443 -6.411209206256227e-02 +1437 1444 -2.819771551760600e-02 +1437 1445 1.247453761320614e-01 +1437 1446 -3.490220705075519e-02 +1437 1447 -2.050311138188892e-01 +1437 1448 -1.207398053365309e-01 +1437 1449 2.154433625498943e-02 +1437 1504 -2.059904582301589e-02 +1437 1505 1.646597577537514e-01 +1437 1506 5.916114520752482e-01 +1437 1507 9.874100819505082e-01 +1437 1508 6.925293570792262e-01 +1437 1509 -8.774286432824595e-02 +1437 1510 -1.561239953893035e-01 +1437 1511 1.735553128493462e-01 +1437 1512 -7.016759340117583e-02 +1438 1441 2.274881512221985e-02 +1438 1442 -5.300453519820873e-02 +1438 1443 4.150843175724473e-02 +1438 1444 1.770422947357942e-02 +1438 1445 -7.474755887491995e-02 +1438 1446 1.955185861067871e-02 +1438 1447 1.049843649593265e-01 +1438 1448 5.585817628857446e-02 +1438 1449 -9.245866670384828e-03 +1438 1504 9.027771977723909e-03 +1438 1505 -6.582166366027828e-02 +1438 1506 -1.780696083183313e-01 +1438 1507 -5.799754933334880e-02 +1438 1508 5.638333964581578e-01 +1438 1509 1.000392437420344e+00 +1438 1510 3.449469309961215e-01 +1438 1511 -2.886290461498077e-01 +1438 1512 1.064265344782320e-01 +1439 1441 -1.306452632632736e-02 +1439 1442 3.030083677823416e-02 +1439 1443 -2.350261848546813e-02 +1439 1444 -9.871741963054929e-03 +1439 1445 4.076984829088472e-02 +1439 1446 -1.035683940700115e-02 +1439 1447 -5.370085579481314e-02 +1439 1448 -2.759918986753180e-02 +1439 1449 4.465297339934036e-03 +1439 1504 -4.386880907561479e-03 +1439 1505 3.117098545351392e-02 +1439 1506 7.916366620200496e-02 +1439 1507 2.241613345136722e-02 +1439 1508 -1.481841308439290e-01 +1439 1509 7.558727102103263e-02 +1439 1510 8.356838818943038e-01 +1439 1511 8.260133191084723e-01 +1439 1512 -1.922830829601806e-01 +1440 1441 4.264667105949907e-03 +1440 1442 -9.871243074084018e-03 +1440 1443 7.624768649835868e-03 +1440 1444 3.181723537341469e-03 +1440 1445 -1.302060500417394e-02 +1440 1446 3.269116801863288e-03 +1440 1447 1.672506100817185e-02 +1440 1448 8.487647252887146e-03 +1440 1449 -1.362265824185802e-03 +1440 1504 1.341205845607569e-03 +1440 1505 -9.446121266013994e-03 +1440 1506 -2.350502600205618e-02 +1440 1507 -6.396858715895111e-03 +1440 1508 3.905164342835294e-02 +1440 1509 -1.647201287983672e-02 +1440 1510 -8.275622364938244e-02 +1440 1511 3.581803123145674e-01 +1440 1512 1.127337591104767e+00 +1567 1576 1.127337591104767e+00 +1567 1577 3.581803123145674e-01 +1567 1578 -8.275622364938241e-02 +1567 1579 -1.647201287983672e-02 +1567 1580 3.905164342835294e-02 +1567 1581 -6.396858715895110e-03 +1567 1582 -2.350502600205617e-02 +1567 1583 -9.446121266013996e-03 +1567 1584 1.341205845607568e-03 +1567 1639 -1.362265824185802e-03 +1567 1640 8.487647252887143e-03 +1567 1641 1.672506100817185e-02 +1567 1642 3.269116801863287e-03 +1567 1643 -1.302060500417393e-02 +1567 1644 3.181723537341469e-03 +1567 1645 7.624768649835868e-03 +1567 1646 -9.871243074084018e-03 +1567 1647 4.264667105949907e-03 +1568 1576 -1.922830829601806e-01 +1568 1577 8.260133191084722e-01 +1568 1578 8.356838818943036e-01 +1568 1579 7.558727102103262e-02 +1568 1580 -1.481841308439290e-01 +1568 1581 2.241613345136722e-02 +1568 1582 7.916366620200491e-02 +1568 1583 3.117098545351392e-02 +1568 1584 -4.386880907561477e-03 +1568 1639 4.465297339934037e-03 +1568 1640 -2.759918986753178e-02 +1568 1641 -5.370085579481315e-02 +1568 1642 -1.035683940700115e-02 +1568 1643 4.076984829088470e-02 +1568 1644 -9.871741963054927e-03 +1568 1645 -2.350261848546813e-02 +1568 1646 3.030083677823415e-02 +1568 1647 -1.306452632632736e-02 +1569 1576 1.064265344782320e-01 +1569 1577 -2.886290461498077e-01 +1569 1578 3.449469309961214e-01 +1569 1579 1.000392437420344e+00 +1569 1580 5.638333964581578e-01 +1569 1581 -5.799754933334880e-02 +1569 1582 -1.780696083183312e-01 +1569 1583 -6.582166366027828e-02 +1569 1584 9.027771977723906e-03 +1569 1639 -9.245866670384831e-03 +1569 1640 5.585817628857445e-02 +1569 1641 1.049843649593265e-01 +1569 1642 1.955185861067871e-02 +1569 1643 -7.474755887491993e-02 +1569 1644 1.770422947357942e-02 +1569 1645 4.150843175724474e-02 +1569 1646 -5.300453519820873e-02 +1569 1647 2.274881512221985e-02 +1570 1576 -7.016759340117582e-02 +1570 1577 1.735553128493462e-01 +1570 1578 -1.561239953893035e-01 +1570 1579 -8.774286432824593e-02 +1570 1580 6.925293570792262e-01 +1570 1581 9.874100819505079e-01 +1570 1582 5.916114520752478e-01 +1570 1583 1.646597577537514e-01 +1570 1584 -2.059904582301588e-02 +1570 1639 2.154433625498943e-02 +1570 1640 -1.207398053365309e-01 +1570 1641 -2.050311138188893e-01 +1570 1642 -3.490220705075518e-02 +1570 1643 1.247453761320614e-01 +1570 1644 -2.819771551760599e-02 +1570 1645 -6.411209206256227e-02 +1570 1646 8.036958734762398e-02 +1570 1647 -3.419577051632318e-02 +1571 1576 4.893336539283798e-02 +1571 1577 -1.169145439761436e-01 +1571 1578 9.673091628921059e-02 +1571 1579 4.541867323644599e-02 +1571 1580 -2.249773266656604e-01 +1571 1581 7.700626369258262e-02 +1571 1582 6.678220596893384e-01 +1571 1583 9.634302133816279e-01 +1571 1584 9.992154478068926e-01 +1571 1639 9.992154478068931e-01 +1571 1640 9.634302133816277e-01 +1571 1641 6.678220596893386e-01 +1571 1642 7.700626369258262e-02 +1571 1643 -2.249773266656604e-01 +1571 1644 4.541867323644599e-02 +1571 1645 9.673091628921060e-02 +1571 1646 -1.169145439761436e-01 +1571 1647 4.893336539283798e-02 +1572 1576 -3.419577051632319e-02 +1572 1577 8.036958734762399e-02 +1572 1578 -6.411209206256227e-02 +1572 1579 -2.819771551760600e-02 +1572 1580 1.247453761320614e-01 +1572 1581 -3.490220705075519e-02 +1572 1582 -2.050311138188892e-01 +1572 1583 -1.207398053365309e-01 +1572 1584 2.154433625498943e-02 +1572 1639 -2.059904582301589e-02 +1572 1640 1.646597577537514e-01 +1572 1641 5.916114520752482e-01 +1572 1642 9.874100819505082e-01 +1572 1643 6.925293570792262e-01 +1572 1644 -8.774286432824595e-02 +1572 1645 -1.561239953893035e-01 +1572 1646 1.735553128493462e-01 +1572 1647 -7.016759340117583e-02 +1573 1576 2.274881512221985e-02 +1573 1577 -5.300453519820873e-02 +1573 1578 4.150843175724473e-02 +1573 1579 1.770422947357942e-02 +1573 1580 -7.474755887491995e-02 +1573 1581 1.955185861067871e-02 +1573 1582 1.049843649593265e-01 +1573 1583 5.585817628857446e-02 +1573 1584 -9.245866670384828e-03 +1573 1639 9.027771977723909e-03 +1573 1640 -6.582166366027828e-02 +1573 1641 -1.780696083183313e-01 +1573 1642 -5.799754933334880e-02 +1573 1643 5.638333964581578e-01 +1573 1644 1.000392437420344e+00 +1573 1645 3.449469309961215e-01 +1573 1646 -2.886290461498077e-01 +1573 1647 1.064265344782320e-01 +1574 1576 -1.306452632632736e-02 +1574 1577 3.030083677823416e-02 +1574 1578 -2.350261848546813e-02 +1574 1579 -9.871741963054929e-03 +1574 1580 4.076984829088472e-02 +1574 1581 -1.035683940700115e-02 +1574 1582 -5.370085579481314e-02 +1574 1583 -2.759918986753180e-02 +1574 1584 4.465297339934036e-03 +1574 1639 -4.386880907561479e-03 +1574 1640 3.117098545351392e-02 +1574 1641 7.916366620200496e-02 +1574 1642 2.241613345136722e-02 +1574 1643 -1.481841308439290e-01 +1574 1644 7.558727102103263e-02 +1574 1645 8.356838818943038e-01 +1574 1646 8.260133191084723e-01 +1574 1647 -1.922830829601806e-01 +1575 1576 4.264667105949907e-03 +1575 1577 -9.871243074084018e-03 +1575 1578 7.624768649835868e-03 +1575 1579 3.181723537341469e-03 +1575 1580 -1.302060500417394e-02 +1575 1581 3.269116801863288e-03 +1575 1582 1.672506100817185e-02 +1575 1583 8.487647252887146e-03 +1575 1584 -1.362265824185802e-03 +1575 1639 1.341205845607569e-03 +1575 1640 -9.446121266013994e-03 +1575 1641 -2.350502600205618e-02 +1575 1642 -6.396858715895111e-03 +1575 1643 3.905164342835294e-02 +1575 1644 -1.647201287983672e-02 +1575 1645 -8.275622364938244e-02 +1575 1646 3.581803123145674e-01 +1575 1647 1.127337591104767e+00 +1720 1729 1.127337591104767e+00 +1720 1730 3.581803123145674e-01 +1720 1731 -8.275622364938241e-02 +1720 1732 -1.647201287983672e-02 +1720 1733 3.905164342835294e-02 +1720 1734 -6.396858715895110e-03 +1720 1735 -2.350502600205617e-02 +1720 1736 -9.446121266013996e-03 +1720 1737 1.341205845607568e-03 +1720 1792 -1.362265824185802e-03 +1720 1793 8.487647252887143e-03 +1720 1794 1.672506100817185e-02 +1720 1795 3.269116801863287e-03 +1720 1796 -1.302060500417393e-02 +1720 1797 3.181723537341469e-03 +1720 1798 7.624768649835868e-03 +1720 1799 -9.871243074084018e-03 +1720 1800 4.264667105949907e-03 +1721 1729 -1.922830829601806e-01 +1721 1730 8.260133191084722e-01 +1721 1731 8.356838818943036e-01 +1721 1732 7.558727102103262e-02 +1721 1733 -1.481841308439290e-01 +1721 1734 2.241613345136722e-02 +1721 1735 7.916366620200491e-02 +1721 1736 3.117098545351392e-02 +1721 1737 -4.386880907561477e-03 +1721 1792 4.465297339934037e-03 +1721 1793 -2.759918986753178e-02 +1721 1794 -5.370085579481315e-02 +1721 1795 -1.035683940700115e-02 +1721 1796 4.076984829088470e-02 +1721 1797 -9.871741963054927e-03 +1721 1798 -2.350261848546813e-02 +1721 1799 3.030083677823415e-02 +1721 1800 -1.306452632632736e-02 +1722 1729 1.064265344782320e-01 +1722 1730 -2.886290461498077e-01 +1722 1731 3.449469309961214e-01 +1722 1732 1.000392437420344e+00 +1722 1733 5.638333964581578e-01 +1722 1734 -5.799754933334880e-02 +1722 1735 -1.780696083183312e-01 +1722 1736 -6.582166366027828e-02 +1722 1737 9.027771977723906e-03 +1722 1792 -9.245866670384831e-03 +1722 1793 5.585817628857445e-02 +1722 1794 1.049843649593265e-01 +1722 1795 1.955185861067871e-02 +1722 1796 -7.474755887491993e-02 +1722 1797 1.770422947357942e-02 +1722 1798 4.150843175724474e-02 +1722 1799 -5.300453519820873e-02 +1722 1800 2.274881512221985e-02 +1723 1729 -7.016759340117582e-02 +1723 1730 1.735553128493462e-01 +1723 1731 -1.561239953893035e-01 +1723 1732 -8.774286432824593e-02 +1723 1733 6.925293570792262e-01 +1723 1734 9.874100819505079e-01 +1723 1735 5.916114520752478e-01 +1723 1736 1.646597577537514e-01 +1723 1737 -2.059904582301588e-02 +1723 1792 2.154433625498943e-02 +1723 1793 -1.207398053365309e-01 +1723 1794 -2.050311138188893e-01 +1723 1795 -3.490220705075518e-02 +1723 1796 1.247453761320614e-01 +1723 1797 -2.819771551760599e-02 +1723 1798 -6.411209206256227e-02 +1723 1799 8.036958734762398e-02 +1723 1800 -3.419577051632318e-02 +1724 1729 4.893336539283798e-02 +1724 1730 -1.169145439761436e-01 +1724 1731 9.673091628921059e-02 +1724 1732 4.541867323644599e-02 +1724 1733 -2.249773266656604e-01 +1724 1734 7.700626369258262e-02 +1724 1735 6.678220596893384e-01 +1724 1736 9.634302133816279e-01 +1724 1737 9.992154478068926e-01 +1724 1792 9.992154478068931e-01 +1724 1793 9.634302133816277e-01 +1724 1794 6.678220596893386e-01 +1724 1795 7.700626369258262e-02 +1724 1796 -2.249773266656604e-01 +1724 1797 4.541867323644599e-02 +1724 1798 9.673091628921060e-02 +1724 1799 -1.169145439761436e-01 +1724 1800 4.893336539283798e-02 +1725 1729 -3.419577051632319e-02 +1725 1730 8.036958734762399e-02 +1725 1731 -6.411209206256227e-02 +1725 1732 -2.819771551760600e-02 +1725 1733 1.247453761320614e-01 +1725 1734 -3.490220705075519e-02 +1725 1735 -2.050311138188892e-01 +1725 1736 -1.207398053365309e-01 +1725 1737 2.154433625498943e-02 +1725 1792 -2.059904582301589e-02 +1725 1793 1.646597577537514e-01 +1725 1794 5.916114520752482e-01 +1725 1795 9.874100819505082e-01 +1725 1796 6.925293570792262e-01 +1725 1797 -8.774286432824595e-02 +1725 1798 -1.561239953893035e-01 +1725 1799 1.735553128493462e-01 +1725 1800 -7.016759340117583e-02 +1726 1729 2.274881512221985e-02 +1726 1730 -5.300453519820873e-02 +1726 1731 4.150843175724473e-02 +1726 1732 1.770422947357942e-02 +1726 1733 -7.474755887491995e-02 +1726 1734 1.955185861067871e-02 +1726 1735 1.049843649593265e-01 +1726 1736 5.585817628857446e-02 +1726 1737 -9.245866670384828e-03 +1726 1792 9.027771977723909e-03 +1726 1793 -6.582166366027828e-02 +1726 1794 -1.780696083183313e-01 +1726 1795 -5.799754933334880e-02 +1726 1796 5.638333964581578e-01 +1726 1797 1.000392437420344e+00 +1726 1798 3.449469309961215e-01 +1726 1799 -2.886290461498077e-01 +1726 1800 1.064265344782320e-01 +1727 1729 -1.306452632632736e-02 +1727 1730 3.030083677823416e-02 +1727 1731 -2.350261848546813e-02 +1727 1732 -9.871741963054929e-03 +1727 1733 4.076984829088472e-02 +1727 1734 -1.035683940700115e-02 +1727 1735 -5.370085579481314e-02 +1727 1736 -2.759918986753180e-02 +1727 1737 4.465297339934036e-03 +1727 1792 -4.386880907561479e-03 +1727 1793 3.117098545351392e-02 +1727 1794 7.916366620200496e-02 +1727 1795 2.241613345136722e-02 +1727 1796 -1.481841308439290e-01 +1727 1797 7.558727102103263e-02 +1727 1798 8.356838818943038e-01 +1727 1799 8.260133191084723e-01 +1727 1800 -1.922830829601806e-01 +1728 1729 4.264667105949907e-03 +1728 1730 -9.871243074084018e-03 +1728 1731 7.624768649835868e-03 +1728 1732 3.181723537341469e-03 +1728 1733 -1.302060500417394e-02 +1728 1734 3.269116801863288e-03 +1728 1735 1.672506100817185e-02 +1728 1736 8.487647252887146e-03 +1728 1737 -1.362265824185802e-03 +1728 1792 1.341205845607569e-03 +1728 1793 -9.446121266013994e-03 +1728 1794 -2.350502600205618e-02 +1728 1795 -6.396858715895111e-03 +1728 1796 3.905164342835294e-02 +1728 1797 -1.647201287983672e-02 +1728 1798 -8.275622364938244e-02 +1728 1799 3.581803123145674e-01 +1728 1800 1.127337591104767e+00 +1855 1864 1.127337591104767e+00 +1855 1865 3.581803123145674e-01 +1855 1866 -8.275622364938241e-02 +1855 1867 -1.647201287983672e-02 +1855 1868 3.905164342835294e-02 +1855 1869 -6.396858715895110e-03 +1855 1870 -2.350502600205617e-02 +1855 1871 -9.446121266013996e-03 +1855 1872 1.341205845607568e-03 +1855 1927 -1.362265824185802e-03 +1855 1928 8.487647252887143e-03 +1855 1929 1.672506100817185e-02 +1855 1930 3.269116801863287e-03 +1855 1931 -1.302060500417393e-02 +1855 1932 3.181723537341469e-03 +1855 1933 7.624768649835868e-03 +1855 1934 -9.871243074084018e-03 +1855 1935 4.264667105949907e-03 +1856 1864 -1.922830829601806e-01 +1856 1865 8.260133191084722e-01 +1856 1866 8.356838818943036e-01 +1856 1867 7.558727102103262e-02 +1856 1868 -1.481841308439290e-01 +1856 1869 2.241613345136722e-02 +1856 1870 7.916366620200491e-02 +1856 1871 3.117098545351392e-02 +1856 1872 -4.386880907561477e-03 +1856 1927 4.465297339934037e-03 +1856 1928 -2.759918986753178e-02 +1856 1929 -5.370085579481315e-02 +1856 1930 -1.035683940700115e-02 +1856 1931 4.076984829088470e-02 +1856 1932 -9.871741963054927e-03 +1856 1933 -2.350261848546813e-02 +1856 1934 3.030083677823415e-02 +1856 1935 -1.306452632632736e-02 +1857 1864 1.064265344782320e-01 +1857 1865 -2.886290461498077e-01 +1857 1866 3.449469309961214e-01 +1857 1867 1.000392437420344e+00 +1857 1868 5.638333964581578e-01 +1857 1869 -5.799754933334880e-02 +1857 1870 -1.780696083183312e-01 +1857 1871 -6.582166366027828e-02 +1857 1872 9.027771977723906e-03 +1857 1927 -9.245866670384831e-03 +1857 1928 5.585817628857445e-02 +1857 1929 1.049843649593265e-01 +1857 1930 1.955185861067871e-02 +1857 1931 -7.474755887491993e-02 +1857 1932 1.770422947357942e-02 +1857 1933 4.150843175724474e-02 +1857 1934 -5.300453519820873e-02 +1857 1935 2.274881512221985e-02 +1858 1864 -7.016759340117582e-02 +1858 1865 1.735553128493462e-01 +1858 1866 -1.561239953893035e-01 +1858 1867 -8.774286432824593e-02 +1858 1868 6.925293570792262e-01 +1858 1869 9.874100819505079e-01 +1858 1870 5.916114520752478e-01 +1858 1871 1.646597577537514e-01 +1858 1872 -2.059904582301588e-02 +1858 1927 2.154433625498943e-02 +1858 1928 -1.207398053365309e-01 +1858 1929 -2.050311138188893e-01 +1858 1930 -3.490220705075518e-02 +1858 1931 1.247453761320614e-01 +1858 1932 -2.819771551760599e-02 +1858 1933 -6.411209206256227e-02 +1858 1934 8.036958734762398e-02 +1858 1935 -3.419577051632318e-02 +1859 1864 4.893336539283798e-02 +1859 1865 -1.169145439761436e-01 +1859 1866 9.673091628921059e-02 +1859 1867 4.541867323644599e-02 +1859 1868 -2.249773266656604e-01 +1859 1869 7.700626369258262e-02 +1859 1870 6.678220596893384e-01 +1859 1871 9.634302133816279e-01 +1859 1872 9.992154478068926e-01 +1859 1927 9.992154478068931e-01 +1859 1928 9.634302133816277e-01 +1859 1929 6.678220596893386e-01 +1859 1930 7.700626369258262e-02 +1859 1931 -2.249773266656604e-01 +1859 1932 4.541867323644599e-02 +1859 1933 9.673091628921060e-02 +1859 1934 -1.169145439761436e-01 +1859 1935 4.893336539283798e-02 +1860 1864 -3.419577051632319e-02 +1860 1865 8.036958734762399e-02 +1860 1866 -6.411209206256227e-02 +1860 1867 -2.819771551760600e-02 +1860 1868 1.247453761320614e-01 +1860 1869 -3.490220705075519e-02 +1860 1870 -2.050311138188892e-01 +1860 1871 -1.207398053365309e-01 +1860 1872 2.154433625498943e-02 +1860 1927 -2.059904582301589e-02 +1860 1928 1.646597577537514e-01 +1860 1929 5.916114520752482e-01 +1860 1930 9.874100819505082e-01 +1860 1931 6.925293570792262e-01 +1860 1932 -8.774286432824595e-02 +1860 1933 -1.561239953893035e-01 +1860 1934 1.735553128493462e-01 +1860 1935 -7.016759340117583e-02 +1861 1864 2.274881512221985e-02 +1861 1865 -5.300453519820873e-02 +1861 1866 4.150843175724473e-02 +1861 1867 1.770422947357942e-02 +1861 1868 -7.474755887491995e-02 +1861 1869 1.955185861067871e-02 +1861 1870 1.049843649593265e-01 +1861 1871 5.585817628857446e-02 +1861 1872 -9.245866670384828e-03 +1861 1927 9.027771977723909e-03 +1861 1928 -6.582166366027828e-02 +1861 1929 -1.780696083183313e-01 +1861 1930 -5.799754933334880e-02 +1861 1931 5.638333964581578e-01 +1861 1932 1.000392437420344e+00 +1861 1933 3.449469309961215e-01 +1861 1934 -2.886290461498077e-01 +1861 1935 1.064265344782320e-01 +1862 1864 -1.306452632632736e-02 +1862 1865 3.030083677823416e-02 +1862 1866 -2.350261848546813e-02 +1862 1867 -9.871741963054929e-03 +1862 1868 4.076984829088472e-02 +1862 1869 -1.035683940700115e-02 +1862 1870 -5.370085579481314e-02 +1862 1871 -2.759918986753180e-02 +1862 1872 4.465297339934036e-03 +1862 1927 -4.386880907561479e-03 +1862 1928 3.117098545351392e-02 +1862 1929 7.916366620200496e-02 +1862 1930 2.241613345136722e-02 +1862 1931 -1.481841308439290e-01 +1862 1932 7.558727102103263e-02 +1862 1933 8.356838818943038e-01 +1862 1934 8.260133191084723e-01 +1862 1935 -1.922830829601806e-01 +1863 1864 4.264667105949907e-03 +1863 1865 -9.871243074084018e-03 +1863 1866 7.624768649835868e-03 +1863 1867 3.181723537341469e-03 +1863 1868 -1.302060500417394e-02 +1863 1869 3.269116801863288e-03 +1863 1870 1.672506100817185e-02 +1863 1871 8.487647252887146e-03 +1863 1872 -1.362265824185802e-03 +1863 1927 1.341205845607569e-03 +1863 1928 -9.446121266013994e-03 +1863 1929 -2.350502600205618e-02 +1863 1930 -6.396858715895111e-03 +1863 1931 3.905164342835294e-02 +1863 1932 -1.647201287983672e-02 +1863 1933 -8.275622364938244e-02 +1863 1934 3.581803123145674e-01 +1863 1935 1.127337591104767e+00 +1999 2008 1.127337591104767e+00 +1999 2009 3.581803123145674e-01 +1999 2010 -8.275622364938241e-02 +1999 2011 -1.647201287983672e-02 +1999 2012 3.905164342835294e-02 +1999 2013 -6.396858715895110e-03 +1999 2014 -2.350502600205617e-02 +1999 2015 -9.446121266013996e-03 +1999 2016 1.341205845607568e-03 +1999 2071 -1.362265824185802e-03 +1999 2072 8.487647252887143e-03 +1999 2073 1.672506100817185e-02 +1999 2074 3.269116801863287e-03 +1999 2075 -1.302060500417393e-02 +1999 2076 3.181723537341469e-03 +1999 2077 7.624768649835868e-03 +1999 2078 -9.871243074084018e-03 +1999 2079 4.264667105949907e-03 +2000 2008 -1.922830829601806e-01 +2000 2009 8.260133191084722e-01 +2000 2010 8.356838818943036e-01 +2000 2011 7.558727102103262e-02 +2000 2012 -1.481841308439290e-01 +2000 2013 2.241613345136722e-02 +2000 2014 7.916366620200491e-02 +2000 2015 3.117098545351392e-02 +2000 2016 -4.386880907561477e-03 +2000 2071 4.465297339934037e-03 +2000 2072 -2.759918986753178e-02 +2000 2073 -5.370085579481315e-02 +2000 2074 -1.035683940700115e-02 +2000 2075 4.076984829088470e-02 +2000 2076 -9.871741963054927e-03 +2000 2077 -2.350261848546813e-02 +2000 2078 3.030083677823415e-02 +2000 2079 -1.306452632632736e-02 +2001 2008 1.064265344782320e-01 +2001 2009 -2.886290461498077e-01 +2001 2010 3.449469309961214e-01 +2001 2011 1.000392437420344e+00 +2001 2012 5.638333964581578e-01 +2001 2013 -5.799754933334880e-02 +2001 2014 -1.780696083183312e-01 +2001 2015 -6.582166366027828e-02 +2001 2016 9.027771977723906e-03 +2001 2071 -9.245866670384831e-03 +2001 2072 5.585817628857445e-02 +2001 2073 1.049843649593265e-01 +2001 2074 1.955185861067871e-02 +2001 2075 -7.474755887491993e-02 +2001 2076 1.770422947357942e-02 +2001 2077 4.150843175724474e-02 +2001 2078 -5.300453519820873e-02 +2001 2079 2.274881512221985e-02 +2002 2008 -7.016759340117582e-02 +2002 2009 1.735553128493462e-01 +2002 2010 -1.561239953893035e-01 +2002 2011 -8.774286432824593e-02 +2002 2012 6.925293570792262e-01 +2002 2013 9.874100819505079e-01 +2002 2014 5.916114520752478e-01 +2002 2015 1.646597577537514e-01 +2002 2016 -2.059904582301588e-02 +2002 2071 2.154433625498943e-02 +2002 2072 -1.207398053365309e-01 +2002 2073 -2.050311138188893e-01 +2002 2074 -3.490220705075518e-02 +2002 2075 1.247453761320614e-01 +2002 2076 -2.819771551760599e-02 +2002 2077 -6.411209206256227e-02 +2002 2078 8.036958734762398e-02 +2002 2079 -3.419577051632318e-02 +2003 2008 4.893336539283798e-02 +2003 2009 -1.169145439761436e-01 +2003 2010 9.673091628921059e-02 +2003 2011 4.541867323644599e-02 +2003 2012 -2.249773266656604e-01 +2003 2013 7.700626369258262e-02 +2003 2014 6.678220596893384e-01 +2003 2015 9.634302133816279e-01 +2003 2016 9.992154478068926e-01 +2003 2071 9.992154478068931e-01 +2003 2072 9.634302133816277e-01 +2003 2073 6.678220596893386e-01 +2003 2074 7.700626369258262e-02 +2003 2075 -2.249773266656604e-01 +2003 2076 4.541867323644599e-02 +2003 2077 9.673091628921060e-02 +2003 2078 -1.169145439761436e-01 +2003 2079 4.893336539283798e-02 +2004 2008 -3.419577051632319e-02 +2004 2009 8.036958734762399e-02 +2004 2010 -6.411209206256227e-02 +2004 2011 -2.819771551760600e-02 +2004 2012 1.247453761320614e-01 +2004 2013 -3.490220705075519e-02 +2004 2014 -2.050311138188892e-01 +2004 2015 -1.207398053365309e-01 +2004 2016 2.154433625498943e-02 +2004 2071 -2.059904582301589e-02 +2004 2072 1.646597577537514e-01 +2004 2073 5.916114520752482e-01 +2004 2074 9.874100819505082e-01 +2004 2075 6.925293570792262e-01 +2004 2076 -8.774286432824595e-02 +2004 2077 -1.561239953893035e-01 +2004 2078 1.735553128493462e-01 +2004 2079 -7.016759340117583e-02 +2005 2008 2.274881512221985e-02 +2005 2009 -5.300453519820873e-02 +2005 2010 4.150843175724473e-02 +2005 2011 1.770422947357942e-02 +2005 2012 -7.474755887491995e-02 +2005 2013 1.955185861067871e-02 +2005 2014 1.049843649593265e-01 +2005 2015 5.585817628857446e-02 +2005 2016 -9.245866670384828e-03 +2005 2071 9.027771977723909e-03 +2005 2072 -6.582166366027828e-02 +2005 2073 -1.780696083183313e-01 +2005 2074 -5.799754933334880e-02 +2005 2075 5.638333964581578e-01 +2005 2076 1.000392437420344e+00 +2005 2077 3.449469309961215e-01 +2005 2078 -2.886290461498077e-01 +2005 2079 1.064265344782320e-01 +2006 2008 -1.306452632632736e-02 +2006 2009 3.030083677823416e-02 +2006 2010 -2.350261848546813e-02 +2006 2011 -9.871741963054929e-03 +2006 2012 4.076984829088472e-02 +2006 2013 -1.035683940700115e-02 +2006 2014 -5.370085579481314e-02 +2006 2015 -2.759918986753180e-02 +2006 2016 4.465297339934036e-03 +2006 2071 -4.386880907561479e-03 +2006 2072 3.117098545351392e-02 +2006 2073 7.916366620200496e-02 +2006 2074 2.241613345136722e-02 +2006 2075 -1.481841308439290e-01 +2006 2076 7.558727102103263e-02 +2006 2077 8.356838818943038e-01 +2006 2078 8.260133191084723e-01 +2006 2079 -1.922830829601806e-01 +2007 2008 4.264667105949907e-03 +2007 2009 -9.871243074084018e-03 +2007 2010 7.624768649835868e-03 +2007 2011 3.181723537341469e-03 +2007 2012 -1.302060500417394e-02 +2007 2013 3.269116801863288e-03 +2007 2014 1.672506100817185e-02 +2007 2015 8.487647252887146e-03 +2007 2016 -1.362265824185802e-03 +2007 2071 1.341205845607569e-03 +2007 2072 -9.446121266013994e-03 +2007 2073 -2.350502600205618e-02 +2007 2074 -6.396858715895111e-03 +2007 2075 3.905164342835294e-02 +2007 2076 -1.647201287983672e-02 +2007 2077 -8.275622364938244e-02 +2007 2078 3.581803123145674e-01 +2007 2079 1.127337591104767e+00 +2134 2143 1.127337591104767e+00 +2134 2144 3.581803123145674e-01 +2134 2145 -8.275622364938241e-02 +2134 2146 -1.647201287983672e-02 +2134 2147 3.905164342835294e-02 +2134 2148 -6.396858715895110e-03 +2134 2149 -2.350502600205617e-02 +2134 2150 -9.446121266013996e-03 +2134 2151 1.341205845607568e-03 +2134 2206 -1.362265824185802e-03 +2134 2207 8.487647252887143e-03 +2134 2208 1.672506100817185e-02 +2134 2209 3.269116801863287e-03 +2134 2210 -1.302060500417393e-02 +2134 2211 3.181723537341469e-03 +2134 2212 7.624768649835868e-03 +2134 2213 -9.871243074084018e-03 +2134 2214 4.264667105949907e-03 +2135 2143 -1.922830829601806e-01 +2135 2144 8.260133191084722e-01 +2135 2145 8.356838818943036e-01 +2135 2146 7.558727102103262e-02 +2135 2147 -1.481841308439290e-01 +2135 2148 2.241613345136722e-02 +2135 2149 7.916366620200491e-02 +2135 2150 3.117098545351392e-02 +2135 2151 -4.386880907561477e-03 +2135 2206 4.465297339934037e-03 +2135 2207 -2.759918986753178e-02 +2135 2208 -5.370085579481315e-02 +2135 2209 -1.035683940700115e-02 +2135 2210 4.076984829088470e-02 +2135 2211 -9.871741963054927e-03 +2135 2212 -2.350261848546813e-02 +2135 2213 3.030083677823415e-02 +2135 2214 -1.306452632632736e-02 +2136 2143 1.064265344782320e-01 +2136 2144 -2.886290461498077e-01 +2136 2145 3.449469309961214e-01 +2136 2146 1.000392437420344e+00 +2136 2147 5.638333964581578e-01 +2136 2148 -5.799754933334880e-02 +2136 2149 -1.780696083183312e-01 +2136 2150 -6.582166366027828e-02 +2136 2151 9.027771977723906e-03 +2136 2206 -9.245866670384831e-03 +2136 2207 5.585817628857445e-02 +2136 2208 1.049843649593265e-01 +2136 2209 1.955185861067871e-02 +2136 2210 -7.474755887491993e-02 +2136 2211 1.770422947357942e-02 +2136 2212 4.150843175724474e-02 +2136 2213 -5.300453519820873e-02 +2136 2214 2.274881512221985e-02 +2137 2143 -7.016759340117582e-02 +2137 2144 1.735553128493462e-01 +2137 2145 -1.561239953893035e-01 +2137 2146 -8.774286432824593e-02 +2137 2147 6.925293570792262e-01 +2137 2148 9.874100819505079e-01 +2137 2149 5.916114520752478e-01 +2137 2150 1.646597577537514e-01 +2137 2151 -2.059904582301588e-02 +2137 2206 2.154433625498943e-02 +2137 2207 -1.207398053365309e-01 +2137 2208 -2.050311138188893e-01 +2137 2209 -3.490220705075518e-02 +2137 2210 1.247453761320614e-01 +2137 2211 -2.819771551760599e-02 +2137 2212 -6.411209206256227e-02 +2137 2213 8.036958734762398e-02 +2137 2214 -3.419577051632318e-02 +2138 2143 4.893336539283798e-02 +2138 2144 -1.169145439761436e-01 +2138 2145 9.673091628921059e-02 +2138 2146 4.541867323644599e-02 +2138 2147 -2.249773266656604e-01 +2138 2148 7.700626369258262e-02 +2138 2149 6.678220596893384e-01 +2138 2150 9.634302133816279e-01 +2138 2151 9.992154478068926e-01 +2138 2206 9.992154478068931e-01 +2138 2207 9.634302133816277e-01 +2138 2208 6.678220596893386e-01 +2138 2209 7.700626369258262e-02 +2138 2210 -2.249773266656604e-01 +2138 2211 4.541867323644599e-02 +2138 2212 9.673091628921060e-02 +2138 2213 -1.169145439761436e-01 +2138 2214 4.893336539283798e-02 +2139 2143 -3.419577051632319e-02 +2139 2144 8.036958734762399e-02 +2139 2145 -6.411209206256227e-02 +2139 2146 -2.819771551760600e-02 +2139 2147 1.247453761320614e-01 +2139 2148 -3.490220705075519e-02 +2139 2149 -2.050311138188892e-01 +2139 2150 -1.207398053365309e-01 +2139 2151 2.154433625498943e-02 +2139 2206 -2.059904582301589e-02 +2139 2207 1.646597577537514e-01 +2139 2208 5.916114520752482e-01 +2139 2209 9.874100819505082e-01 +2139 2210 6.925293570792262e-01 +2139 2211 -8.774286432824595e-02 +2139 2212 -1.561239953893035e-01 +2139 2213 1.735553128493462e-01 +2139 2214 -7.016759340117583e-02 +2140 2143 2.274881512221985e-02 +2140 2144 -5.300453519820873e-02 +2140 2145 4.150843175724473e-02 +2140 2146 1.770422947357942e-02 +2140 2147 -7.474755887491995e-02 +2140 2148 1.955185861067871e-02 +2140 2149 1.049843649593265e-01 +2140 2150 5.585817628857446e-02 +2140 2151 -9.245866670384828e-03 +2140 2206 9.027771977723909e-03 +2140 2207 -6.582166366027828e-02 +2140 2208 -1.780696083183313e-01 +2140 2209 -5.799754933334880e-02 +2140 2210 5.638333964581578e-01 +2140 2211 1.000392437420344e+00 +2140 2212 3.449469309961215e-01 +2140 2213 -2.886290461498077e-01 +2140 2214 1.064265344782320e-01 +2141 2143 -1.306452632632736e-02 +2141 2144 3.030083677823416e-02 +2141 2145 -2.350261848546813e-02 +2141 2146 -9.871741963054929e-03 +2141 2147 4.076984829088472e-02 +2141 2148 -1.035683940700115e-02 +2141 2149 -5.370085579481314e-02 +2141 2150 -2.759918986753180e-02 +2141 2151 4.465297339934036e-03 +2141 2206 -4.386880907561479e-03 +2141 2207 3.117098545351392e-02 +2141 2208 7.916366620200496e-02 +2141 2209 2.241613345136722e-02 +2141 2210 -1.481841308439290e-01 +2141 2211 7.558727102103263e-02 +2141 2212 8.356838818943038e-01 +2141 2213 8.260133191084723e-01 +2141 2214 -1.922830829601806e-01 +2142 2143 4.264667105949907e-03 +2142 2144 -9.871243074084018e-03 +2142 2145 7.624768649835868e-03 +2142 2146 3.181723537341469e-03 +2142 2147 -1.302060500417394e-02 +2142 2148 3.269116801863288e-03 +2142 2149 1.672506100817185e-02 +2142 2150 8.487647252887146e-03 +2142 2151 -1.362265824185802e-03 +2142 2206 1.341205845607569e-03 +2142 2207 -9.446121266013994e-03 +2142 2208 -2.350502600205618e-02 +2142 2209 -6.396858715895111e-03 +2142 2210 3.905164342835294e-02 +2142 2211 -1.647201287983672e-02 +2142 2212 -8.275622364938244e-02 +2142 2213 3.581803123145674e-01 +2142 2214 1.127337591104767e+00 diff --git a/packages/muelu/research/caglusa/transfer3.mtx b/packages/muelu/research/caglusa/transfer3.mtx new file mode 100644 index 000000000000..53ff32f3fa28 --- /dev/null +++ b/packages/muelu/research/caglusa/transfer3.mtx @@ -0,0 +1,5187 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 5184 +28 37 1.129411500546784e+00 +28 38 3.670587123461224e-01 +28 39 -8.049160724422064e-02 +28 40 -2.032779703371170e-02 +28 41 3.979771743152476e-02 +28 42 -3.653023273099719e-03 +28 43 -2.390769583422672e-02 +28 44 -1.192764283693718e-02 +28 45 -1.348774781601022e-03 +28 64 -9.761772636663994e-03 +28 65 1.514586871585055e-03 +28 66 1.582582744294437e-02 +28 67 7.554351143807301e-03 +28 68 -1.259363521777076e-02 +28 69 1.064982304023081e-03 +28 70 8.576740929101536e-03 +28 71 -9.705062112143847e-03 +28 72 4.038509235068527e-03 +29 37 -1.954658507609646e-01 +29 38 8.172051897065897e-01 +29 39 8.485883218629846e-01 +29 40 9.418268414471946e-02 +29 41 -1.517806004204933e-01 +29 42 1.284495107653860e-02 +29 43 8.073455683811782e-02 +29 44 3.944978508915502e-02 +29 45 4.421028511261784e-03 +29 64 3.222167705196030e-02 +29 65 -4.953304498955981e-03 +29 66 -5.101794604869591e-02 +29 67 -2.399262203292714e-02 +29 68 3.948889493949895e-02 +29 69 -3.306686706026906e-03 +29 70 -2.644572311599207e-02 +29 71 2.979397280942391e-02 +29 72 -1.237184978633876e-02 +30 37 1.082520994427544e-01 +30 38 -2.889831904537400e-01 +30 39 3.248829650141348e-01 +30 40 9.970774308689467e-01 +30 41 5.961024869195356e-01 +30 42 -3.367981223730957e-02 +30 43 -1.831797001588231e-01 +30 44 -8.387339051456290e-02 +30 45 -9.153920411521620e-03 +30 64 -6.809733684365207e-02 +30 65 1.018940889409097e-02 +30 66 1.008236133368206e-01 +30 67 4.558396641569880e-02 +30 68 -7.265123077934935e-02 +30 69 5.940652446883312e-03 +30 70 4.674215007724540e-02 +30 71 -5.213088496342568e-02 +30 72 2.154324761375216e-02 +31 37 -7.138223443736702e-02 +31 38 1.740834065912312e-01 +31 39 -1.484845065565620e-01 +31 40 -1.049235629513360e-01 +31 41 6.609088867175748e-01 +31 42 9.949463440350268e-01 +31 43 6.382749766949400e-01 +31 44 2.153988514319247e-01 +31 45 2.132780628751801e-02 +31 64 1.708947318916948e-01 +31 65 -2.321887390001622e-02 +31 66 -2.029440035142312e-01 +31 67 -8.265166278284414e-02 +31 68 1.221803150080615e-01 +31 69 -9.495701490382293e-03 +31 70 -7.230437404439831e-02 +31 71 7.908238406933848e-02 +31 72 -3.238517280896107e-02 +32 37 4.978351309021659e-02 +32 38 -1.173453856460456e-01 +32 39 9.221850329093995e-02 +32 40 5.474453575062167e-02 +32 41 -2.222222222222224e-01 +32 42 4.193559628619540e-02 +32 43 6.214620396774779e-01 +32 44 9.411301078682682e-01 +32 45 9.992308119045477e-01 +32 64 9.609192275818028e-01 +32 65 9.989970936976241e-01 +32 66 7.963575059544109e-01 +32 67 1.927550749225808e-01 +32 68 -2.248909042682495e-01 +32 69 1.541860858604259e-02 +32 70 1.094251270410043e-01 +32 71 -1.151469791738853e-01 +32 72 4.634672745811502e-02 +33 37 -3.479092359412759e-02 +33 38 8.068968438828850e-02 +33 39 -6.118162989078881e-02 +33 40 -3.407479357032987e-02 +33 41 1.239997546686380e-01 +33 42 -1.932067089943150e-02 +33 43 -2.003414469256311e-01 +33 44 -1.448427411451554e-01 +33 45 -2.040102646753046e-02 +33 64 -1.239699394844861e-01 +33 65 2.442723114211704e-02 +33 66 4.434876076263333e-01 +33 67 9.458869925096695e-01 +33 68 7.816638802427196e-01 +33 69 -3.055553118107046e-02 +33 70 -1.779386470259948e-01 +33 71 1.712688141183993e-01 +33 72 -6.647111980753091e-02 +34 37 2.314511493126580e-02 +34 38 -5.322385868251331e-02 +34 39 3.963041032797538e-02 +34 40 2.141880768979494e-02 +34 41 -7.448107462312177e-02 +34 42 1.087558270779069e-02 +34 43 1.035174746041493e-01 +34 44 6.804174656093516e-02 +34 45 8.940094922500905e-03 +34 64 5.746512483605298e-02 +34 65 -1.046816959307711e-02 +34 66 -1.506054468448829e-01 +34 67 -1.191495685306653e-01 +34 68 4.640064612856435e-01 +34 69 1.002881373964522e+00 +34 70 4.056131648214225e-01 +34 71 -2.864287174775687e-01 +34 72 1.008677179362730e-01 +35 37 -1.329223336631334e-02 +35 38 3.042868713306708e-02 +35 39 -2.244483970189554e-02 +35 40 -1.194967046758751e-02 +35 41 4.066948930938207e-02 +35 42 -5.772473560016135e-03 +35 43 -5.312732759263696e-02 +35 44 -3.378505081770156e-02 +35 45 -4.344146984209206e-03 +35 64 -2.841095648990516e-02 +35 65 5.053531743575554e-03 +35 66 6.859615685745800e-02 +35 67 4.778343133849267e-02 +35 68 -1.326757337246851e-01 +35 69 2.326082279563569e-02 +35 70 7.945195594770269e-01 +35 71 8.515167152468310e-01 +35 72 -1.825707387785166e-01 +36 37 4.339014147752001e-03 +36 38 -9.913245383000176e-03 +36 39 7.282382897431911e-03 +36 40 3.852365568882107e-03 +36 41 -1.299443778081731e-02 +36 42 1.823505864305507e-03 +36 43 1.656712269663253e-02 +36 44 1.040833436407406e-02 +36 45 1.328127019033700e-03 +36 64 8.739244093196121e-03 +36 65 -1.541504356943518e-03 +36 66 -2.052331481015729e-02 +36 67 -1.376996298381223e-02 +36 68 3.547195251413116e-02 +36 69 -5.208520719626806e-03 +36 70 -8.818799815941553e-02 +36 71 3.317497574830305e-01 +36 72 1.121002678938138e+00 +91 100 1.125329052227193e+00 +91 101 3.496883302058090e-01 +91 102 -8.471515173090792e-02 +91 103 -1.281053516842967e-02 +91 104 3.811891211200217e-02 +91 105 -8.910497086827177e-03 +91 106 -2.283271683293603e-02 +91 107 -6.964455901063977e-03 +91 108 3.848762214796290e-03 +91 127 -4.028549736136071e-03 +91 128 6.437602044020998e-03 +91 129 1.666728813825679e-02 +91 130 4.657915058915068e-03 +91 131 -1.296759263272032e-02 +91 132 2.520055549234727e-03 +91 133 7.942152029251810e-03 +91 134 -9.824645887494821e-03 +91 135 4.192808171657343e-03 +92 100 -1.892021217766241e-01 +92 101 8.343268197451053e-01 +92 102 8.229048909617059e-01 +92 103 5.826103953347038e-02 +92 104 -1.439621421629044e-01 +92 105 3.112452985382214e-02 +92 106 7.670746208201233e-02 +92 107 2.293253914396406e-02 +92 108 -1.256361223271885e-02 +92 127 1.323313804878172e-02 +92 128 -2.096995323672039e-02 +92 129 -5.358173644527540e-02 +92 130 -1.476812971757745e-02 +92 131 4.062188650978263e-02 +92 132 -7.820632800318873e-03 +92 133 -2.448347659537426e-02 +92 134 3.015884103136262e-02 +92 135 -1.284443828278838e-02 +93 100 1.046612031639890e-01 +93 101 -2.881124078576383e-01 +93 102 3.642942065094383e-01 +93 103 1.002415479616464e+00 +93 104 5.323155226899984e-01 +93 105 -7.954492469653790e-02 +93 106 -1.711660602912858e-01 +93 107 -4.811885553863109e-02 +93 108 2.570767009640749e-02 +93 127 -2.757068474109963e-02 +93 128 4.265186386815121e-02 +93 129 1.051000962006369e-01 +93 130 2.793485847485680e-02 +93 131 -7.455725140302184e-02 +93 132 1.403341243147972e-02 +93 133 4.325121028990368e-02 +93 134 -5.276030473240597e-02 +93 135 2.236576952567197e-02 +94 100 -6.899335049539898e-02 +94 101 1.729389305228448e-01 +94 102 -1.632953212690499e-01 +94 103 -7.035531268750947e-02 +94 104 7.220650334136169e-01 +94 105 9.772041559577652e-01 +94 106 5.453324425206540e-01 +94 107 1.175590121763713e-01 +94 108 -5.755658390964281e-02 +94 127 6.565365744134992e-02 +94 128 -9.365152023069237e-02 +94 129 -2.071439731675944e-01 +94 130 -5.010677298615469e-02 +94 131 1.247251953696833e-01 +94 132 -2.237629970634156e-02 +94 133 -6.683554557781765e-02 +94 134 8.001126076632271e-02 +94 135 -3.362050583247694e-02 +95 100 4.811158329877728e-02 +95 101 -1.164268237939055e-01 +95 102 1.009370353828501e-01 +95 103 3.613279323195029e-02 +95 104 -2.263595638964371e-01 +95 105 1.124088651417379e-01 +95 106 7.109171977955315e-01 +95 107 9.801237676746003e-01 +95 108 9.932762028182619e-01 +95 127 9.932762028182619e-01 +95 128 9.801237676746005e-01 +95 129 7.109171977955323e-01 +95 130 1.124088651417377e-01 +95 131 -2.263595638964358e-01 +95 132 3.613279323195191e-02 +95 133 1.009370353828502e-01 +95 134 -1.164268237939055e-01 +95 135 4.811158329877730e-02 +96 100 -3.362050583247696e-02 +96 101 8.001126076632276e-02 +96 102 -6.683554557781765e-02 +96 103 -2.237629970634057e-02 +96 104 1.247251953696841e-01 +96 105 -5.010677298615480e-02 +96 106 -2.071439731675943e-01 +96 107 -9.365152023069238e-02 +96 108 6.565365744134992e-02 +96 127 -5.755658390964283e-02 +96 128 1.175590121763714e-01 +96 129 5.453324425206542e-01 +96 130 9.772041559577658e-01 +96 131 7.220650334136159e-01 +96 132 -7.035531268751277e-02 +96 133 -1.632953212690505e-01 +96 134 1.729389305228453e-01 +96 135 -6.899335049539915e-02 +97 100 2.236576952567200e-02 +97 101 -5.276030473240604e-02 +97 102 4.325121028990372e-02 +97 103 1.403341243147912e-02 +97 104 -7.455725140302243e-02 +97 105 2.793485847485690e-02 +97 106 1.051000962006371e-01 +97 107 4.265186386815130e-02 +97 108 -2.757068474109970e-02 +97 127 2.570767009640755e-02 +97 128 -4.811885553863122e-02 +97 129 -1.711660602912864e-01 +97 130 -7.954492469653819e-02 +97 131 5.323155226899977e-01 +97 132 1.002415479616464e+00 +97 133 3.642942065094385e-01 +97 134 -2.881124078576385e-01 +97 135 1.046612031639891e-01 +98 100 -1.284443828278836e-02 +98 101 3.015884103136257e-02 +98 102 -2.448347659537421e-02 +98 103 -7.820632800318512e-03 +98 104 4.062188650978283e-02 +98 105 -1.476812971757746e-02 +98 106 -5.358173644527529e-02 +98 107 -2.096995323672036e-02 +98 108 1.323313804878171e-02 +98 127 -1.256361223271884e-02 +98 128 2.293253914396404e-02 +98 129 7.670746208201233e-02 +98 130 3.112452985382211e-02 +98 131 -1.439621421629035e-01 +98 132 5.826103953347309e-02 +98 133 8.229048909617060e-01 +98 134 8.343268197451051e-01 +98 135 -1.892021217766240e-01 +99 100 4.192808171657339e-03 +99 101 -9.824645887494808e-03 +99 102 7.942152029251796e-03 +99 103 2.520055549234612e-03 +99 104 -1.296759263272038e-02 +99 105 4.657915058915070e-03 +99 106 1.666728813825676e-02 +99 107 6.437602044020993e-03 +99 108 -4.028549736136068e-03 +99 127 3.848762214796287e-03 +99 128 -6.964455901063975e-03 +99 129 -2.283271683293603e-02 +99 130 -8.910497086827169e-03 +99 131 3.811891211200193e-02 +99 132 -1.281053516843026e-02 +99 133 -8.471515173090796e-02 +99 134 3.496883302058090e-01 +99 135 1.125329052227193e+00 +163 172 1.125329052227193e+00 +163 173 3.496883302058055e-01 +163 174 -8.471515173090792e-02 +163 175 -1.281053516842999e-02 +163 176 3.811891211200218e-02 +163 177 -8.910497086827182e-03 +163 178 -2.283271683293604e-02 +163 179 -6.964455901064062e-03 +163 180 3.848762214796368e-03 +163 199 -4.028549736136154e-03 +163 200 6.437602044021074e-03 +163 201 1.666728813825683e-02 +163 202 4.657915058915191e-03 +163 203 -1.296759263272030e-02 +163 204 2.520055549234663e-03 +163 205 7.942152029251781e-03 +163 206 -9.824645887494772e-03 +163 207 4.192808171657604e-03 +164 172 -1.892021217766240e-01 +164 173 8.343268197451090e-01 +164 174 8.229048909617059e-01 +164 175 5.826103953347188e-02 +164 176 -1.439621421629045e-01 +164 177 3.112452985382217e-02 +164 178 7.670746208201237e-02 +164 179 2.293253914396434e-02 +164 180 -1.256361223271910e-02 +164 199 1.323313804878199e-02 +164 200 -2.096995323672063e-02 +164 201 -5.358173644527554e-02 +164 202 -1.476812971757784e-02 +164 203 4.062188650978259e-02 +164 204 -7.820632800318675e-03 +164 205 -2.448347659537417e-02 +164 206 3.015884103136247e-02 +164 207 -1.284443828278918e-02 +165 172 1.046612031639889e-01 +165 173 -2.881124078576380e-01 +165 174 3.642942065094383e-01 +165 175 1.002415479616464e+00 +165 176 5.323155226899984e-01 +165 177 -7.954492469653793e-02 +165 178 -1.711660602912858e-01 +165 179 -4.811885553863168e-02 +165 180 2.570767009640800e-02 +165 199 -2.757068474110020e-02 +165 200 4.265186386815169e-02 +165 201 1.051000962006371e-01 +165 202 2.793485847485754e-02 +165 203 -7.455725140302175e-02 +165 204 1.403341243147936e-02 +165 205 4.325121028990350e-02 +165 206 -5.276030473240571e-02 +165 207 2.236576952567335e-02 +166 172 -6.899335049539894e-02 +166 173 1.729389305228445e-01 +166 174 -1.632953212690499e-01 +166 175 -7.035531268751101e-02 +166 176 7.220650334136167e-01 +166 177 9.772041559577656e-01 +166 178 5.453324425206542e-01 +166 179 1.175590121763728e-01 +166 180 -5.755658390964392e-02 +166 199 6.565365744135131e-02 +166 200 -9.365152023069338e-02 +166 201 -2.071439731675948e-01 +166 202 -5.010677298615601e-02 +166 203 1.247251953696831e-01 +166 204 -2.237629970634098e-02 +166 205 -6.683554557781736e-02 +166 206 8.001126076632230e-02 +166 207 -3.362050583247902e-02 +167 172 4.811158329877720e-02 +167 173 -1.164268237939051e-01 +167 174 1.009370353828500e-01 +167 175 3.613279323195107e-02 +167 176 -2.263595638964369e-01 +167 177 1.124088651417379e-01 +167 178 7.109171977955310e-01 +167 179 9.801237676745994e-01 +167 180 9.932762028182621e-01 +167 199 9.932762028182618e-01 +167 200 9.801237676746002e-01 +167 201 7.109171977955331e-01 +167 202 1.124088651417406e-01 +167 203 -2.263595638964352e-01 +167 204 3.613279323195094e-02 +167 205 1.009370353828497e-01 +167 206 -1.164268237939048e-01 +167 207 4.811158329878022e-02 +168 172 -3.362050583247692e-02 +168 173 8.001126076632252e-02 +168 174 -6.683554557781755e-02 +168 175 -2.237629970634106e-02 +168 176 1.247251953696840e-01 +168 177 -5.010677298615476e-02 +168 178 -2.071439731675941e-01 +168 179 -9.365152023069317e-02 +168 180 6.565365744135122e-02 +168 199 -5.755658390964381e-02 +168 200 1.175590121763727e-01 +168 201 5.453324425206537e-01 +168 202 9.772041559577651e-01 +168 203 7.220650334136165e-01 +168 204 -7.035531268751102e-02 +168 205 -1.632953212690498e-01 +168 206 1.729389305228445e-01 +168 207 -6.899335049540339e-02 +169 172 2.236576952567203e-02 +169 173 -5.276030473240603e-02 +169 174 4.325121028990377e-02 +169 175 1.403341243147947e-02 +169 176 -7.455725140302255e-02 +169 177 2.793485847485695e-02 +169 178 1.051000962006372e-01 +169 179 4.265186386815182e-02 +169 180 -2.757068474110031e-02 +169 199 2.570767009640808e-02 +169 200 -4.811885553863189e-02 +169 201 -1.711660602912870e-01 +169 202 -7.954492469654018e-02 +169 203 5.323155226899965e-01 +169 204 1.002415479616464e+00 +169 205 3.642942065094386e-01 +169 206 -2.881124078576384e-01 +169 207 1.046612031639958e-01 +170 172 -1.284443828278840e-02 +170 173 3.015884103136262e-02 +170 174 -2.448347659537430e-02 +170 175 -7.820632800318722e-03 +170 176 4.062188650978297e-02 +170 177 -1.476812971757752e-02 +170 178 -5.358173644527549e-02 +170 179 -2.096995323672067e-02 +170 180 1.323313804878203e-02 +170 199 -1.256361223271913e-02 +170 200 2.293253914396441e-02 +170 201 7.670746208201278e-02 +170 202 3.112452985382300e-02 +170 203 -1.439621421629038e-01 +170 204 5.826103953347181e-02 +170 205 8.229048909617055e-01 +170 206 8.343268197451090e-01 +170 207 -1.892021217766357e-01 +171 172 4.192808171657348e-03 +171 173 -9.824645887494815e-03 +171 174 7.942152029251817e-03 +171 175 2.520055549234677e-03 +171 176 -1.296759263272042e-02 +171 177 4.657915058915085e-03 +171 178 1.666728813825681e-02 +171 179 6.437602044021083e-03 +171 180 -4.028549736136164e-03 +171 199 3.848762214796373e-03 +171 200 -6.964455901064081e-03 +171 201 -2.283271683293615e-02 +171 202 -8.910497086827420e-03 +171 203 3.811891211200197e-02 +171 204 -1.281053516842997e-02 +171 205 -8.471515173090784e-02 +171 206 3.496883302058053e-01 +171 207 1.125329052227200e+00 +226 235 1.125329052227200e+00 +226 236 3.496883302058055e-01 +226 237 -8.471515173090792e-02 +226 238 -1.281053516842999e-02 +226 239 3.811891211200218e-02 +226 240 -8.910497086827182e-03 +226 241 -2.283271683293604e-02 +226 242 -6.964455901064062e-03 +226 243 3.848762214796368e-03 +226 262 -4.028549736136154e-03 +226 263 6.437602044021074e-03 +226 264 1.666728813825683e-02 +226 265 4.657915058915191e-03 +226 266 -1.296759263272030e-02 +226 267 2.520055549234663e-03 +226 268 7.942152029251781e-03 +226 269 -9.824645887494772e-03 +226 270 4.192808171657604e-03 +227 235 -1.892021217766357e-01 +227 236 8.343268197451090e-01 +227 237 8.229048909617059e-01 +227 238 5.826103953347188e-02 +227 239 -1.439621421629045e-01 +227 240 3.112452985382217e-02 +227 241 7.670746208201237e-02 +227 242 2.293253914396434e-02 +227 243 -1.256361223271910e-02 +227 262 1.323313804878199e-02 +227 263 -2.096995323672063e-02 +227 264 -5.358173644527554e-02 +227 265 -1.476812971757784e-02 +227 266 4.062188650978259e-02 +227 267 -7.820632800318675e-03 +227 268 -2.448347659537417e-02 +227 269 3.015884103136247e-02 +227 270 -1.284443828278918e-02 +228 235 1.046612031639956e-01 +228 236 -2.881124078576380e-01 +228 237 3.642942065094383e-01 +228 238 1.002415479616464e+00 +228 239 5.323155226899984e-01 +228 240 -7.954492469653793e-02 +228 241 -1.711660602912858e-01 +228 242 -4.811885553863168e-02 +228 243 2.570767009640800e-02 +228 262 -2.757068474110020e-02 +228 263 4.265186386815169e-02 +228 264 1.051000962006371e-01 +228 265 2.793485847485754e-02 +228 266 -7.455725140302175e-02 +228 267 1.403341243147936e-02 +228 268 4.325121028990350e-02 +228 269 -5.276030473240571e-02 +228 270 2.236576952567335e-02 +229 235 -6.899335049540338e-02 +229 236 1.729389305228445e-01 +229 237 -1.632953212690499e-01 +229 238 -7.035531268751101e-02 +229 239 7.220650334136167e-01 +229 240 9.772041559577656e-01 +229 241 5.453324425206542e-01 +229 242 1.175590121763728e-01 +229 243 -5.755658390964392e-02 +229 262 6.565365744135131e-02 +229 263 -9.365152023069338e-02 +229 264 -2.071439731675948e-01 +229 265 -5.010677298615601e-02 +229 266 1.247251953696831e-01 +229 267 -2.237629970634098e-02 +229 268 -6.683554557781736e-02 +229 269 8.001126076632230e-02 +229 270 -3.362050583247902e-02 +230 235 4.811158329878032e-02 +230 236 -1.164268237939051e-01 +230 237 1.009370353828500e-01 +230 238 3.613279323195107e-02 +230 239 -2.263595638964369e-01 +230 240 1.124088651417379e-01 +230 241 7.109171977955310e-01 +230 242 9.801237676745994e-01 +230 243 9.932762028182621e-01 +230 262 9.932762028182618e-01 +230 263 9.801237676746002e-01 +230 264 7.109171977955331e-01 +230 265 1.124088651417406e-01 +230 266 -2.263595638964352e-01 +230 267 3.613279323195094e-02 +230 268 1.009370353828497e-01 +230 269 -1.164268237939048e-01 +230 270 4.811158329878022e-02 +231 235 -3.362050583247909e-02 +231 236 8.001126076632252e-02 +231 237 -6.683554557781755e-02 +231 238 -2.237629970634106e-02 +231 239 1.247251953696840e-01 +231 240 -5.010677298615476e-02 +231 241 -2.071439731675941e-01 +231 242 -9.365152023069317e-02 +231 243 6.565365744135122e-02 +231 262 -5.755658390964381e-02 +231 263 1.175590121763727e-01 +231 264 5.453324425206537e-01 +231 265 9.772041559577651e-01 +231 266 7.220650334136165e-01 +231 267 -7.035531268751102e-02 +231 268 -1.632953212690498e-01 +231 269 1.729389305228445e-01 +231 270 -6.899335049540339e-02 +232 235 2.236576952567348e-02 +232 236 -5.276030473240603e-02 +232 237 4.325121028990377e-02 +232 238 1.403341243147947e-02 +232 239 -7.455725140302255e-02 +232 240 2.793485847485695e-02 +232 241 1.051000962006372e-01 +232 242 4.265186386815182e-02 +232 243 -2.757068474110031e-02 +232 262 2.570767009640808e-02 +232 263 -4.811885553863189e-02 +232 264 -1.711660602912870e-01 +232 265 -7.954492469654018e-02 +232 266 5.323155226899965e-01 +232 267 1.002415479616464e+00 +232 268 3.642942065094386e-01 +232 269 -2.881124078576384e-01 +232 270 1.046612031639958e-01 +233 235 -1.284443828278923e-02 +233 236 3.015884103136262e-02 +233 237 -2.448347659537430e-02 +233 238 -7.820632800318722e-03 +233 239 4.062188650978297e-02 +233 240 -1.476812971757752e-02 +233 241 -5.358173644527549e-02 +233 242 -2.096995323672067e-02 +233 243 1.323313804878203e-02 +233 262 -1.256361223271913e-02 +233 263 2.293253914396441e-02 +233 264 7.670746208201278e-02 +233 265 3.112452985382300e-02 +233 266 -1.439621421629038e-01 +233 267 5.826103953347181e-02 +233 268 8.229048909617055e-01 +233 269 8.343268197451090e-01 +233 270 -1.892021217766357e-01 +234 235 4.192808171657621e-03 +234 236 -9.824645887494815e-03 +234 237 7.942152029251817e-03 +234 238 2.520055549234677e-03 +234 239 -1.296759263272042e-02 +234 240 4.657915058915085e-03 +234 241 1.666728813825681e-02 +234 242 6.437602044021083e-03 +234 243 -4.028549736136164e-03 +234 262 3.848762214796373e-03 +234 263 -6.964455901064081e-03 +234 264 -2.283271683293615e-02 +234 265 -8.910497086827420e-03 +234 266 3.811891211200197e-02 +234 267 -1.281053516842997e-02 +234 268 -8.471515173090784e-02 +234 269 3.496883302058053e-01 +234 270 1.125329052227200e+00 +307 316 1.125329052227201e+00 +307 317 3.496883302058127e-01 +307 318 -8.471515173090789e-02 +307 319 -1.281053516842998e-02 +307 320 3.811891211200202e-02 +307 321 -8.910497086827431e-03 +307 322 -2.283271683293618e-02 +307 323 -6.964455901063942e-03 +307 324 3.848762214796385e-03 +307 343 -4.028549736136173e-03 +307 344 6.437602044020971e-03 +307 345 1.666728813825689e-02 +307 346 4.657915058915205e-03 +307 347 -1.296759263272035e-02 +307 348 2.520055549234675e-03 +307 349 7.942152029251836e-03 +307 350 -9.824645887494987e-03 +307 351 4.192808171657122e-03 +308 316 -1.892021217766358e-01 +308 317 8.343268197451023e-01 +308 318 8.229048909617058e-01 +308 319 5.826103953347183e-02 +308 320 -1.439621421629039e-01 +308 321 3.112452985382303e-02 +308 322 7.670746208201289e-02 +308 323 2.293253914396394e-02 +308 324 -1.256361223271916e-02 +308 343 1.323313804878206e-02 +308 344 -2.096995323672030e-02 +308 345 -5.358173644527574e-02 +308 346 -1.476812971757790e-02 +308 347 4.062188650978276e-02 +308 348 -7.820632800318713e-03 +308 349 -2.448347659537434e-02 +308 350 3.015884103136314e-02 +308 351 -1.284443828278770e-02 +309 316 1.046612031639958e-01 +309 317 -2.881124078576389e-01 +309 318 3.642942065094386e-01 +309 319 1.002415479616464e+00 +309 320 5.323155226899967e-01 +309 321 -7.954492469654023e-02 +309 322 -1.711660602912871e-01 +309 323 -4.811885553863087e-02 +309 324 2.570767009640814e-02 +309 343 -2.757068474110036e-02 +309 344 4.265186386815107e-02 +309 345 1.051000962006377e-01 +309 346 2.793485847485766e-02 +309 347 -7.455725140302212e-02 +309 348 1.403341243147945e-02 +309 349 4.325121028990385e-02 +309 350 -5.276030473240691e-02 +309 351 2.236576952567081e-02 +310 316 -6.899335049540337e-02 +310 317 1.729389305228450e-01 +310 318 -1.632953212690497e-01 +310 319 -7.035531268751098e-02 +310 320 7.220650334136166e-01 +310 321 9.772041559577653e-01 +310 322 5.453324425206540e-01 +310 323 1.175590121763700e-01 +310 324 -5.755658390964392e-02 +310 343 6.565365744135131e-02 +310 344 -9.365152023069159e-02 +310 345 -2.071439731675948e-01 +310 346 -5.010677298615600e-02 +310 347 1.247251953696832e-01 +310 348 -2.237629970634102e-02 +310 349 -6.683554557781764e-02 +310 350 8.001126076632381e-02 +310 351 -3.362050583247506e-02 +311 316 4.811158329878012e-02 +311 317 -1.164268237939050e-01 +311 318 1.009370353828494e-01 +311 319 3.613279323195086e-02 +311 320 -2.263595638964349e-01 +311 321 1.124088651417404e-01 +311 322 7.109171977955323e-01 +311 323 9.801237676746007e-01 +311 324 9.932762028182620e-01 +311 343 9.932762028182618e-01 +311 344 9.801237676746007e-01 +311 345 7.109171977955324e-01 +311 346 1.124088651417405e-01 +311 347 -2.263595638964351e-01 +311 348 3.613279323195094e-02 +311 349 1.009370353828499e-01 +311 350 -1.164268237939068e-01 +311 351 4.811158329877446e-02 +312 316 -3.362050583247900e-02 +312 317 8.001126076632256e-02 +312 318 -6.683554557781730e-02 +312 319 -2.237629970634096e-02 +312 320 1.247251953696830e-01 +312 321 -5.010677298615597e-02 +312 322 -2.071439731675947e-01 +312 323 -9.365152023069155e-02 +312 324 6.565365744135129e-02 +312 343 -5.755658390964388e-02 +312 344 1.175590121763700e-01 +312 345 5.453324425206538e-01 +312 346 9.772041559577652e-01 +312 347 7.220650334136169e-01 +312 348 -7.035531268751111e-02 +312 349 -1.632953212690504e-01 +312 350 1.729389305228475e-01 +312 351 -6.899335049539522e-02 +313 316 2.236576952567340e-02 +313 317 -5.276030473240602e-02 +313 318 4.325121028990358e-02 +313 319 1.403341243147939e-02 +313 320 -7.455725140302191e-02 +313 321 2.793485847485760e-02 +313 322 1.051000962006375e-01 +313 323 4.265186386815099e-02 +313 324 -2.757068474110032e-02 +313 343 2.570767009640809e-02 +313 344 -4.811885553863079e-02 +313 345 -1.711660602912868e-01 +313 346 -7.954492469654012e-02 +313 347 5.323155226899964e-01 +313 348 1.002415479616464e+00 +313 349 3.642942065094396e-01 +313 350 -2.881124078576427e-01 +313 351 1.046612031639833e-01 +314 316 -1.284443828278912e-02 +314 317 3.015884103136247e-02 +314 318 -2.448347659537406e-02 +314 319 -7.820632800318642e-03 +314 320 4.062188650978243e-02 +314 321 -1.476812971757779e-02 +314 322 -5.358173644527536e-02 +314 323 -2.096995323672015e-02 +314 324 1.323313804878197e-02 +314 343 -1.256361223271907e-02 +314 344 2.293253914396378e-02 +314 345 7.670746208201236e-02 +314 346 3.112452985382282e-02 +314 347 -1.439621421629030e-01 +314 348 5.826103953347155e-02 +314 349 8.229048909617038e-01 +314 350 8.343268197451089e-01 +314 351 -1.892021217766123e-01 +315 316 4.192808171657555e-03 +315 317 -9.824645887494701e-03 +315 318 7.942152029251689e-03 +315 319 2.520055549234634e-03 +315 320 -1.296759263272016e-02 +315 321 4.657915058915139e-03 +315 322 1.666728813825665e-02 +315 323 6.437602044020877e-03 +315 324 -4.028549736136115e-03 +315 343 3.848762214796329e-03 +315 344 -6.964455901063841e-03 +315 345 -2.283271683293586e-02 +315 346 -8.910497086827300e-03 +315 347 3.811891211200148e-02 +315 348 -1.281053516842980e-02 +315 349 -8.471515173090668e-02 +315 350 3.496883302058078e-01 +315 351 1.125329052227185e+00 +370 379 1.125329052227216e+00 +370 380 3.496883302058175e-01 +370 381 -8.471515173090904e-02 +370 382 -1.281053516843016e-02 +370 383 3.811891211200254e-02 +370 384 -8.910497086827555e-03 +370 385 -2.283271683293651e-02 +370 386 -6.964455901064036e-03 +370 387 3.848762214796438e-03 +370 406 -4.028549736136228e-03 +370 407 6.437602044021058e-03 +370 408 1.666728813825712e-02 +370 409 4.657915058915272e-03 +370 410 -1.296759263272053e-02 +370 411 2.520055549234710e-03 +370 412 7.942152029251946e-03 +370 413 -9.824645887495128e-03 +370 414 4.192808171657180e-03 +371 379 -1.892021217766593e-01 +371 380 8.343268197450946e-01 +371 381 8.229048909617072e-01 +371 382 5.826103953347209e-02 +371 383 -1.439621421629046e-01 +371 384 3.112452985382322e-02 +371 385 7.670746208201337e-02 +371 386 2.293253914396408e-02 +371 387 -1.256361223271924e-02 +371 406 1.323313804878213e-02 +371 407 -2.096995323672043e-02 +371 408 -5.358173644527608e-02 +371 409 -1.476812971757800e-02 +371 410 4.062188650978302e-02 +371 411 -7.820632800318765e-03 +371 412 -2.448347659537451e-02 +371 413 3.015884103136336e-02 +371 414 -1.284443828278779e-02 +372 379 1.046612031640082e-01 +372 380 -2.881124078576349e-01 +372 381 3.642942065094375e-01 +372 382 1.002415479616464e+00 +372 383 5.323155226899972e-01 +372 384 -7.954492469654036e-02 +372 385 -1.711660602912874e-01 +372 386 -4.811885553863095e-02 +372 387 2.570767009640819e-02 +372 406 -2.757068474110040e-02 +372 407 4.265186386815114e-02 +372 408 1.051000962006379e-01 +372 409 2.793485847485772e-02 +372 410 -7.455725140302227e-02 +372 411 1.403341243147947e-02 +372 412 4.325121028990395e-02 +372 413 -5.276030473240705e-02 +372 414 2.236576952567086e-02 +373 379 -6.899335049541151e-02 +373 380 1.729389305228424e-01 +373 381 -1.632953212690491e-01 +373 382 -7.035531268751088e-02 +373 383 7.220650334136162e-01 +373 384 9.772041559577656e-01 +373 385 5.453324425206544e-01 +373 386 1.175590121763700e-01 +373 387 -5.755658390964394e-02 +373 406 6.565365744135132e-02 +373 407 -9.365152023069163e-02 +373 408 -2.071439731675950e-01 +373 409 -5.010677298615606e-02 +373 410 1.247251953696833e-01 +373 411 -2.237629970634104e-02 +373 412 -6.683554557781771e-02 +373 413 8.001126076632394e-02 +373 414 -3.362050583247509e-02 +374 379 4.811158329878578e-02 +374 380 -1.164268237939032e-01 +374 381 1.009370353828490e-01 +374 382 3.613279323195081e-02 +374 383 -2.263595638964347e-01 +374 384 1.124088651417404e-01 +374 385 7.109171977955324e-01 +374 386 9.801237676746006e-01 +374 387 9.932762028182620e-01 +374 406 9.932762028182617e-01 +374 407 9.801237676746009e-01 +374 408 7.109171977955325e-01 +374 409 1.124088651417405e-01 +374 410 -2.263595638964352e-01 +374 411 3.613279323195096e-02 +374 412 1.009370353828500e-01 +374 413 -1.164268237939069e-01 +374 414 4.811158329877449e-02 +375 379 -3.362050583248293e-02 +375 380 8.001126076632127e-02 +375 381 -6.683554557781696e-02 +375 382 -2.237629970634091e-02 +375 383 1.247251953696828e-01 +375 384 -5.010677298615593e-02 +375 385 -2.071439731675946e-01 +375 386 -9.365152023069147e-02 +375 387 6.565365744135125e-02 +375 406 -5.755658390964382e-02 +375 407 1.175590121763699e-01 +375 408 5.453324425206536e-01 +375 409 9.772041559577650e-01 +375 410 7.220650334136166e-01 +375 411 -7.035531268751108e-02 +375 412 -1.632953212690504e-01 +375 413 1.729389305228475e-01 +375 414 -6.899335049539521e-02 +376 379 2.236576952567601e-02 +376 380 -5.276030473240516e-02 +376 381 4.325121028990335e-02 +376 382 1.403341243147935e-02 +376 383 -7.455725140302179e-02 +376 384 2.793485847485758e-02 +376 385 1.051000962006374e-01 +376 386 4.265186386815095e-02 +376 387 -2.757068474110029e-02 +376 406 2.570767009640806e-02 +376 407 -4.811885553863076e-02 +376 408 -1.711660602912867e-01 +376 409 -7.954492469654009e-02 +376 410 5.323155226899960e-01 +376 411 1.002415479616464e+00 +376 412 3.642942065094395e-01 +376 413 -2.881124078576427e-01 +376 414 1.046612031639833e-01 +377 379 -1.284443828279063e-02 +377 380 3.015884103136199e-02 +377 381 -2.448347659537394e-02 +377 382 -7.820632800318623e-03 +377 383 4.062188650978237e-02 +377 384 -1.476812971757778e-02 +377 385 -5.358173644527533e-02 +377 386 -2.096995323672014e-02 +377 387 1.323313804878196e-02 +377 406 -1.256361223271906e-02 +377 407 2.293253914396377e-02 +377 408 7.670746208201233e-02 +377 409 3.112452985382283e-02 +377 410 -1.439621421629030e-01 +377 411 5.826103953347154e-02 +377 412 8.229048909617038e-01 +377 413 8.343268197451094e-01 +377 414 -1.892021217766123e-01 +378 379 4.192808171658047e-03 +378 380 -9.824645887494545e-03 +378 381 7.942152029251647e-03 +378 382 2.520055549234628e-03 +378 383 -1.296759263272014e-02 +378 384 4.657915058915135e-03 +378 385 1.666728813825664e-02 +378 386 6.437602044020873e-03 +378 387 -4.028549736136113e-03 +378 406 3.848762214796326e-03 +378 407 -6.964455901063838e-03 +378 408 -2.283271683293585e-02 +378 409 -8.910497086827300e-03 +378 410 3.811891211200147e-02 +378 411 -1.281053516842980e-02 +378 412 -8.471515173090670e-02 +378 413 3.496883302058079e-01 +378 414 1.125329052227185e+00 +442 451 1.125329052227216e+00 +442 452 3.496883302058175e-01 +442 453 -8.471515173090904e-02 +442 454 -1.281053516843016e-02 +442 455 3.811891211200254e-02 +442 456 -8.910497086827555e-03 +442 457 -2.283271683293651e-02 +442 458 -6.964455901064036e-03 +442 459 3.848762214796438e-03 +442 478 -4.028549736136228e-03 +442 479 6.437602044021058e-03 +442 480 1.666728813825712e-02 +442 481 4.657915058915272e-03 +442 482 -1.296759263272053e-02 +442 483 2.520055549234710e-03 +442 484 7.942152029251946e-03 +442 485 -9.824645887495128e-03 +442 486 4.192808171657180e-03 +443 451 -1.892021217766593e-01 +443 452 8.343268197450946e-01 +443 453 8.229048909617072e-01 +443 454 5.826103953347209e-02 +443 455 -1.439621421629046e-01 +443 456 3.112452985382322e-02 +443 457 7.670746208201337e-02 +443 458 2.293253914396408e-02 +443 459 -1.256361223271924e-02 +443 478 1.323313804878213e-02 +443 479 -2.096995323672043e-02 +443 480 -5.358173644527608e-02 +443 481 -1.476812971757800e-02 +443 482 4.062188650978302e-02 +443 483 -7.820632800318765e-03 +443 484 -2.448347659537451e-02 +443 485 3.015884103136336e-02 +443 486 -1.284443828278779e-02 +444 451 1.046612031640082e-01 +444 452 -2.881124078576349e-01 +444 453 3.642942065094375e-01 +444 454 1.002415479616464e+00 +444 455 5.323155226899972e-01 +444 456 -7.954492469654036e-02 +444 457 -1.711660602912874e-01 +444 458 -4.811885553863095e-02 +444 459 2.570767009640819e-02 +444 478 -2.757068474110040e-02 +444 479 4.265186386815114e-02 +444 480 1.051000962006379e-01 +444 481 2.793485847485772e-02 +444 482 -7.455725140302227e-02 +444 483 1.403341243147947e-02 +444 484 4.325121028990395e-02 +444 485 -5.276030473240705e-02 +444 486 2.236576952567086e-02 +445 451 -6.899335049541151e-02 +445 452 1.729389305228424e-01 +445 453 -1.632953212690491e-01 +445 454 -7.035531268751088e-02 +445 455 7.220650334136162e-01 +445 456 9.772041559577656e-01 +445 457 5.453324425206544e-01 +445 458 1.175590121763700e-01 +445 459 -5.755658390964394e-02 +445 478 6.565365744135132e-02 +445 479 -9.365152023069163e-02 +445 480 -2.071439731675950e-01 +445 481 -5.010677298615606e-02 +445 482 1.247251953696833e-01 +445 483 -2.237629970634104e-02 +445 484 -6.683554557781771e-02 +445 485 8.001126076632394e-02 +445 486 -3.362050583247509e-02 +446 451 4.811158329878578e-02 +446 452 -1.164268237939032e-01 +446 453 1.009370353828490e-01 +446 454 3.613279323195081e-02 +446 455 -2.263595638964347e-01 +446 456 1.124088651417404e-01 +446 457 7.109171977955324e-01 +446 458 9.801237676746006e-01 +446 459 9.932762028182620e-01 +446 478 9.932762028182617e-01 +446 479 9.801237676746009e-01 +446 480 7.109171977955325e-01 +446 481 1.124088651417405e-01 +446 482 -2.263595638964352e-01 +446 483 3.613279323195096e-02 +446 484 1.009370353828500e-01 +446 485 -1.164268237939069e-01 +446 486 4.811158329877449e-02 +447 451 -3.362050583248293e-02 +447 452 8.001126076632127e-02 +447 453 -6.683554557781696e-02 +447 454 -2.237629970634091e-02 +447 455 1.247251953696828e-01 +447 456 -5.010677298615593e-02 +447 457 -2.071439731675946e-01 +447 458 -9.365152023069147e-02 +447 459 6.565365744135125e-02 +447 478 -5.755658390964382e-02 +447 479 1.175590121763699e-01 +447 480 5.453324425206536e-01 +447 481 9.772041559577650e-01 +447 482 7.220650334136166e-01 +447 483 -7.035531268751108e-02 +447 484 -1.632953212690504e-01 +447 485 1.729389305228475e-01 +447 486 -6.899335049539521e-02 +448 451 2.236576952567601e-02 +448 452 -5.276030473240516e-02 +448 453 4.325121028990335e-02 +448 454 1.403341243147935e-02 +448 455 -7.455725140302179e-02 +448 456 2.793485847485758e-02 +448 457 1.051000962006374e-01 +448 458 4.265186386815095e-02 +448 459 -2.757068474110029e-02 +448 478 2.570767009640806e-02 +448 479 -4.811885553863076e-02 +448 480 -1.711660602912867e-01 +448 481 -7.954492469654009e-02 +448 482 5.323155226899960e-01 +448 483 1.002415479616464e+00 +448 484 3.642942065094395e-01 +448 485 -2.881124078576427e-01 +448 486 1.046612031639833e-01 +449 451 -1.284443828279063e-02 +449 452 3.015884103136199e-02 +449 453 -2.448347659537394e-02 +449 454 -7.820632800318623e-03 +449 455 4.062188650978237e-02 +449 456 -1.476812971757778e-02 +449 457 -5.358173644527533e-02 +449 458 -2.096995323672014e-02 +449 459 1.323313804878196e-02 +449 478 -1.256361223271906e-02 +449 479 2.293253914396377e-02 +449 480 7.670746208201233e-02 +449 481 3.112452985382283e-02 +449 482 -1.439621421629030e-01 +449 483 5.826103953347154e-02 +449 484 8.229048909617038e-01 +449 485 8.343268197451094e-01 +449 486 -1.892021217766123e-01 +450 451 4.192808171658047e-03 +450 452 -9.824645887494545e-03 +450 453 7.942152029251647e-03 +450 454 2.520055549234628e-03 +450 455 -1.296759263272014e-02 +450 456 4.657915058915135e-03 +450 457 1.666728813825664e-02 +450 458 6.437602044020873e-03 +450 459 -4.028549736136113e-03 +450 478 3.848762214796326e-03 +450 479 -6.964455901063838e-03 +450 480 -2.283271683293585e-02 +450 481 -8.910497086827300e-03 +450 482 3.811891211200147e-02 +450 483 -1.281053516842980e-02 +450 484 -8.471515173090670e-02 +450 485 3.496883302058079e-01 +450 486 1.125329052227185e+00 +505 514 1.125329052227216e+00 +505 515 3.496883302058175e-01 +505 516 -8.471515173090904e-02 +505 517 -1.281053516843016e-02 +505 518 3.811891211200254e-02 +505 519 -8.910497086827555e-03 +505 520 -2.283271683293651e-02 +505 521 -6.964455901064036e-03 +505 522 3.848762214796438e-03 +505 541 -4.028549736136228e-03 +505 542 6.437602044021058e-03 +505 543 1.666728813825712e-02 +505 544 4.657915058915272e-03 +505 545 -1.296759263272053e-02 +505 546 2.520055549234710e-03 +505 547 7.942152029251946e-03 +505 548 -9.824645887495128e-03 +505 549 4.192808171657180e-03 +506 514 -1.892021217766593e-01 +506 515 8.343268197450946e-01 +506 516 8.229048909617072e-01 +506 517 5.826103953347209e-02 +506 518 -1.439621421629046e-01 +506 519 3.112452985382322e-02 +506 520 7.670746208201337e-02 +506 521 2.293253914396408e-02 +506 522 -1.256361223271924e-02 +506 541 1.323313804878213e-02 +506 542 -2.096995323672043e-02 +506 543 -5.358173644527608e-02 +506 544 -1.476812971757800e-02 +506 545 4.062188650978302e-02 +506 546 -7.820632800318765e-03 +506 547 -2.448347659537451e-02 +506 548 3.015884103136336e-02 +506 549 -1.284443828278779e-02 +507 514 1.046612031640082e-01 +507 515 -2.881124078576349e-01 +507 516 3.642942065094375e-01 +507 517 1.002415479616464e+00 +507 518 5.323155226899972e-01 +507 519 -7.954492469654036e-02 +507 520 -1.711660602912874e-01 +507 521 -4.811885553863095e-02 +507 522 2.570767009640819e-02 +507 541 -2.757068474110040e-02 +507 542 4.265186386815114e-02 +507 543 1.051000962006379e-01 +507 544 2.793485847485772e-02 +507 545 -7.455725140302227e-02 +507 546 1.403341243147947e-02 +507 547 4.325121028990395e-02 +507 548 -5.276030473240705e-02 +507 549 2.236576952567086e-02 +508 514 -6.899335049541151e-02 +508 515 1.729389305228424e-01 +508 516 -1.632953212690491e-01 +508 517 -7.035531268751088e-02 +508 518 7.220650334136162e-01 +508 519 9.772041559577656e-01 +508 520 5.453324425206544e-01 +508 521 1.175590121763700e-01 +508 522 -5.755658390964394e-02 +508 541 6.565365744135132e-02 +508 542 -9.365152023069163e-02 +508 543 -2.071439731675950e-01 +508 544 -5.010677298615606e-02 +508 545 1.247251953696833e-01 +508 546 -2.237629970634104e-02 +508 547 -6.683554557781771e-02 +508 548 8.001126076632394e-02 +508 549 -3.362050583247509e-02 +509 514 4.811158329878578e-02 +509 515 -1.164268237939032e-01 +509 516 1.009370353828490e-01 +509 517 3.613279323195081e-02 +509 518 -2.263595638964347e-01 +509 519 1.124088651417404e-01 +509 520 7.109171977955324e-01 +509 521 9.801237676746006e-01 +509 522 9.932762028182620e-01 +509 541 9.932762028182617e-01 +509 542 9.801237676746009e-01 +509 543 7.109171977955325e-01 +509 544 1.124088651417405e-01 +509 545 -2.263595638964352e-01 +509 546 3.613279323195096e-02 +509 547 1.009370353828500e-01 +509 548 -1.164268237939069e-01 +509 549 4.811158329877449e-02 +510 514 -3.362050583248293e-02 +510 515 8.001126076632127e-02 +510 516 -6.683554557781696e-02 +510 517 -2.237629970634091e-02 +510 518 1.247251953696828e-01 +510 519 -5.010677298615593e-02 +510 520 -2.071439731675946e-01 +510 521 -9.365152023069147e-02 +510 522 6.565365744135125e-02 +510 541 -5.755658390964382e-02 +510 542 1.175590121763699e-01 +510 543 5.453324425206536e-01 +510 544 9.772041559577650e-01 +510 545 7.220650334136166e-01 +510 546 -7.035531268751108e-02 +510 547 -1.632953212690504e-01 +510 548 1.729389305228475e-01 +510 549 -6.899335049539521e-02 +511 514 2.236576952567601e-02 +511 515 -5.276030473240516e-02 +511 516 4.325121028990335e-02 +511 517 1.403341243147935e-02 +511 518 -7.455725140302179e-02 +511 519 2.793485847485758e-02 +511 520 1.051000962006374e-01 +511 521 4.265186386815095e-02 +511 522 -2.757068474110029e-02 +511 541 2.570767009640806e-02 +511 542 -4.811885553863076e-02 +511 543 -1.711660602912867e-01 +511 544 -7.954492469654009e-02 +511 545 5.323155226899960e-01 +511 546 1.002415479616464e+00 +511 547 3.642942065094395e-01 +511 548 -2.881124078576427e-01 +511 549 1.046612031639833e-01 +512 514 -1.284443828279063e-02 +512 515 3.015884103136199e-02 +512 516 -2.448347659537394e-02 +512 517 -7.820632800318623e-03 +512 518 4.062188650978237e-02 +512 519 -1.476812971757778e-02 +512 520 -5.358173644527533e-02 +512 521 -2.096995323672014e-02 +512 522 1.323313804878196e-02 +512 541 -1.256361223271906e-02 +512 542 2.293253914396377e-02 +512 543 7.670746208201233e-02 +512 544 3.112452985382283e-02 +512 545 -1.439621421629030e-01 +512 546 5.826103953347154e-02 +512 547 8.229048909617038e-01 +512 548 8.343268197451094e-01 +512 549 -1.892021217766123e-01 +513 514 4.192808171658047e-03 +513 515 -9.824645887494545e-03 +513 516 7.942152029251647e-03 +513 517 2.520055549234628e-03 +513 518 -1.296759263272014e-02 +513 519 4.657915058915135e-03 +513 520 1.666728813825664e-02 +513 521 6.437602044020873e-03 +513 522 -4.028549736136113e-03 +513 541 3.848762214796326e-03 +513 542 -6.964455901063838e-03 +513 543 -2.283271683293585e-02 +513 544 -8.910497086827300e-03 +513 545 3.811891211200147e-02 +513 546 -1.281053516842980e-02 +513 547 -8.471515173090670e-02 +513 548 3.496883302058079e-01 +513 549 1.125329052227185e+00 +595 604 1.125329052227217e+00 +595 605 3.496883302058139e-01 +595 606 -8.471515173091367e-02 +595 607 -1.281053516843035e-02 +595 608 3.811891211200300e-02 +595 609 -8.910497086826700e-03 +595 610 -2.283271683293637e-02 +595 611 -6.964455901064016e-03 +595 612 3.848762214796141e-03 +595 631 -4.028549736135903e-03 +595 632 6.437602044021037e-03 +595 633 1.666728813825703e-02 +595 634 4.657915058914810e-03 +595 635 -1.296759263272068e-02 +595 636 2.520055549234765e-03 +595 637 7.942152029252381e-03 +595 638 -9.824645887495020e-03 +595 639 4.192808171656095e-03 +596 604 -1.892021217766581e-01 +596 605 8.343268197450904e-01 +596 606 8.229048909617066e-01 +596 607 5.826103953347109e-02 +596 608 -1.439621421629027e-01 +596 609 3.112452985381951e-02 +596 610 7.670746208201111e-02 +596 611 2.293253914396348e-02 +596 612 -1.256361223271798e-02 +596 631 1.323313804878076e-02 +596 632 -2.096995323671988e-02 +596 633 -5.358173644527457e-02 +596 634 -1.476812971757620e-02 +596 635 4.062188650978259e-02 +596 636 -7.820632800318762e-03 +596 637 -2.448347659537531e-02 +596 638 3.015884103136236e-02 +596 639 -1.284443828278418e-02 +597 604 1.046612031640059e-01 +597 605 -2.881124078576247e-01 +597 606 3.642942065094469e-01 +597 607 1.002415479616465e+00 +597 608 5.323155226899992e-01 +597 609 -7.954492469653184e-02 +597 610 -1.711660602912838e-01 +597 611 -4.811885553863003e-02 +597 612 2.570767009640580e-02 +597 631 -2.757068474109771e-02 +597 632 4.265186386815029e-02 +597 633 1.051000962006355e-01 +597 634 2.793485847485445e-02 +597 635 -7.455725140302183e-02 +597 636 1.403341243147953e-02 +597 637 4.325121028990554e-02 +597 638 -5.276030473240553e-02 +597 639 2.236576952566467e-02 +598 604 -6.899335049541121e-02 +598 605 1.729389305228396e-01 +598 606 -1.632953212690570e-01 +598 607 -7.035531268751215e-02 +598 608 7.220650334136141e-01 +598 609 9.772041559577677e-01 +598 610 5.453324425206545e-01 +598 611 1.175590121763700e-01 +598 612 -5.755658390963979e-02 +598 631 6.565365744134598e-02 +598 632 -9.365152023069148e-02 +598 633 -2.071439731675939e-01 +598 634 -5.010677298615101e-02 +598 635 1.247251953696847e-01 +598 636 -2.237629970634152e-02 +598 637 -6.683554557782127e-02 +598 638 8.001126076632294e-02 +598 639 -3.362050583246635e-02 +599 604 4.811158329878598e-02 +599 605 -1.164268237939024e-01 +599 606 1.009370353828548e-01 +599 607 3.613279323195176e-02 +599 608 -2.263595638964380e-01 +599 609 1.124088651417291e-01 +599 610 7.109171977955303e-01 +599 611 9.801237676746006e-01 +599 612 9.932762028182630e-01 +599 631 9.932762028182627e-01 +599 632 9.801237676746006e-01 +599 633 7.109171977955308e-01 +599 634 1.124088651417293e-01 +599 635 -2.263595638964385e-01 +599 636 3.613279323195191e-02 +599 637 1.009370353828558e-01 +599 638 -1.164268237939060e-01 +599 639 4.811158329876222e-02 +600 604 -3.362050583248292e-02 +600 605 8.001126076632033e-02 +600 606 -6.683554557782054e-02 +600 607 -2.237629970634139e-02 +600 608 1.247251953696843e-01 +600 609 -5.010677298615086e-02 +600 610 -2.071439731675935e-01 +600 611 -9.365152023069136e-02 +600 612 6.565365744134589e-02 +600 631 -5.755658390963969e-02 +600 632 1.175590121763698e-01 +600 633 5.453324425206540e-01 +600 634 9.772041559577676e-01 +600 635 7.220650334136143e-01 +600 636 -7.035531268751234e-02 +600 637 -1.632953212690583e-01 +600 638 1.729389305228447e-01 +600 639 -6.899335049537710e-02 +601 604 2.236576952567564e-02 +601 605 -5.276030473240368e-02 +601 606 4.325121028990496e-02 +601 607 1.403341243147942e-02 +601 608 -7.455725140302140e-02 +601 609 2.793485847485431e-02 +601 610 1.051000962006350e-01 +601 611 4.265186386815013e-02 +601 612 -2.757068474109761e-02 +601 631 2.570767009640570e-02 +601 632 -4.811885553862984e-02 +601 633 -1.711660602912832e-01 +601 634 -7.954492469653164e-02 +601 635 5.323155226899982e-01 +601 636 1.002415479616466e+00 +601 637 3.642942065094489e-01 +601 638 -2.881124078576325e-01 +601 639 1.046612031639541e-01 +602 604 -1.284443828279037e-02 +602 605 3.015884103136103e-02 +602 606 -2.448347659537475e-02 +602 607 -7.820632800318625e-03 +602 608 4.062188650978197e-02 +602 609 -1.476812971757598e-02 +602 610 -5.358173644527382e-02 +602 611 -2.096995323671960e-02 +602 612 1.323313804878059e-02 +602 631 -1.256361223271782e-02 +602 632 2.293253914396317e-02 +602 633 7.670746208201014e-02 +602 634 3.112452985381913e-02 +602 635 -1.439621421629011e-01 +602 636 5.826103953347057e-02 +602 637 8.229048909617036e-01 +602 638 8.343268197451051e-01 +602 639 -1.892021217765644e-01 +603 604 4.192808171658051e-03 +603 605 -9.824645887494439e-03 +603 606 7.942152029252081e-03 +603 607 2.520055549234683e-03 +603 608 -1.296759263272029e-02 +603 609 4.657915058914670e-03 +603 610 1.666728813825654e-02 +603 611 6.437602044020852e-03 +603 612 -4.028549736135787e-03 +603 631 3.848762214796029e-03 +603 632 -6.964455901063813e-03 +603 633 -2.283271683293571e-02 +603 634 -8.910497086826449e-03 +603 635 3.811891211200190e-02 +603 636 -1.281053516842999e-02 +603 637 -8.471515173091131e-02 +603 638 3.496883302058039e-01 +603 639 1.125329052227155e+00 +658 667 1.125329052227155e+00 +658 668 3.496883302058040e-01 +658 669 -8.471515173091132e-02 +658 670 -1.281053516842999e-02 +658 671 3.811891211200192e-02 +658 672 -8.910497086826454e-03 +658 673 -2.283271683293573e-02 +658 674 -6.964455901063820e-03 +658 675 3.848762214796032e-03 +658 694 -4.028549736135791e-03 +658 695 6.437602044020860e-03 +658 696 1.666728813825656e-02 +658 697 4.657915058914679e-03 +658 698 -1.296759263272032e-02 +658 699 2.520055549234693e-03 +658 700 7.942152029252155e-03 +658 701 -9.824645887494744e-03 +658 702 4.192808171655975e-03 +659 667 -1.892021217765643e-01 +659 668 8.343268197451050e-01 +659 669 8.229048909617033e-01 +659 670 5.826103953347056e-02 +659 671 -1.439621421629011e-01 +659 672 3.112452985381915e-02 +659 673 7.670746208201017e-02 +659 674 2.293253914396319e-02 +659 675 -1.256361223271782e-02 +659 694 1.323313804878060e-02 +659 695 -2.096995323671962e-02 +659 696 -5.358173644527387e-02 +659 697 -1.476812971757600e-02 +659 698 4.062188650978205e-02 +659 699 -7.820632800318658e-03 +659 700 -2.448347659537498e-02 +659 701 3.015884103136195e-02 +659 702 -1.284443828278400e-02 +660 667 1.046612031639541e-01 +660 668 -2.881124078576325e-01 +660 669 3.642942065094489e-01 +660 670 1.002415479616466e+00 +660 671 5.323155226899983e-01 +660 672 -7.954492469653167e-02 +660 673 -1.711660602912833e-01 +660 674 -4.811885553862987e-02 +660 675 2.570767009640572e-02 +660 694 -2.757068474109763e-02 +660 695 4.265186386815017e-02 +660 696 1.051000962006351e-01 +660 697 2.793485847485435e-02 +660 698 -7.455725140302157e-02 +660 699 1.403341243147948e-02 +660 700 4.325121028990536e-02 +660 701 -5.276030473240530e-02 +660 702 2.236576952566457e-02 +661 667 -6.899335049537707e-02 +661 668 1.729389305228446e-01 +661 669 -1.632953212690583e-01 +661 670 -7.035531268751234e-02 +661 671 7.220650334136145e-01 +661 672 9.772041559577678e-01 +661 673 5.453324425206543e-01 +661 674 1.175590121763699e-01 +661 675 -5.755658390963972e-02 +661 694 6.565365744134594e-02 +661 695 -9.365152023069143e-02 +661 696 -2.071439731675937e-01 +661 697 -5.010677298615094e-02 +661 698 1.247251953696845e-01 +661 699 -2.237629970634148e-02 +661 700 -6.683554557782116e-02 +661 701 8.001126076632280e-02 +661 702 -3.362050583246628e-02 +662 667 4.811158329876216e-02 +662 668 -1.164268237939059e-01 +662 669 1.009370353828557e-01 +662 670 3.613279323195188e-02 +662 671 -2.263595638964383e-01 +662 672 1.124088651417292e-01 +662 673 7.109171977955304e-01 +662 674 9.801237676746004e-01 +662 675 9.932762028182623e-01 +662 694 9.932762028182627e-01 +662 695 9.801237676746007e-01 +662 696 7.109171977955304e-01 +662 697 1.124088651417292e-01 +662 698 -2.263595638964383e-01 +662 699 3.613279323195188e-02 +662 700 1.009370353828557e-01 +662 701 -1.164268237939059e-01 +662 702 4.811158329876215e-02 +663 667 -3.362050583246629e-02 +663 668 8.001126076632280e-02 +663 669 -6.683554557782116e-02 +663 670 -2.237629970634147e-02 +663 671 1.247251953696845e-01 +663 672 -5.010677298615095e-02 +663 673 -2.071439731675937e-01 +663 674 -9.365152023069140e-02 +663 675 6.565365744134591e-02 +663 694 -5.755658390963973e-02 +663 695 1.175590121763699e-01 +663 696 5.453324425206542e-01 +663 697 9.772041559577676e-01 +663 698 7.220650334136144e-01 +663 699 -7.035531268751233e-02 +663 700 -1.632953212690582e-01 +663 701 1.729389305228446e-01 +663 702 -6.899335049537704e-02 +664 667 2.236576952566457e-02 +664 668 -5.276030473240532e-02 +664 669 4.325121028990537e-02 +664 670 1.403341243147948e-02 +664 671 -7.455725140302157e-02 +664 672 2.793485847485436e-02 +664 673 1.051000962006351e-01 +664 674 4.265186386815016e-02 +664 675 -2.757068474109762e-02 +664 694 2.570767009640572e-02 +664 695 -4.811885553862988e-02 +664 696 -1.711660602912833e-01 +664 697 -7.954492469653165e-02 +664 698 5.323155226899983e-01 +664 699 1.002415479616466e+00 +664 700 3.642942065094489e-01 +664 701 -2.881124078576325e-01 +664 702 1.046612031639541e-01 +665 667 -1.284443828278401e-02 +665 668 3.015884103136196e-02 +665 669 -2.448347659537498e-02 +665 670 -7.820632800318658e-03 +665 671 4.062188650978206e-02 +665 672 -1.476812971757601e-02 +665 673 -5.358173644527388e-02 +665 674 -2.096995323671962e-02 +665 675 1.323313804878060e-02 +665 694 -1.256361223271783e-02 +665 695 2.293253914396320e-02 +665 696 7.670746208201018e-02 +665 697 3.112452985381915e-02 +665 698 -1.439621421629011e-01 +665 699 5.826103953347057e-02 +665 700 8.229048909617035e-01 +665 701 8.343268197451050e-01 +665 702 -1.892021217765643e-01 +666 667 4.192808171655976e-03 +666 668 -9.824645887494746e-03 +666 669 7.942152029252157e-03 +666 670 2.520055549234693e-03 +666 671 -1.296759263272032e-02 +666 672 4.657915058914680e-03 +666 673 1.666728813825656e-02 +666 674 6.437602044020858e-03 +666 675 -4.028549736135791e-03 +666 694 3.848762214796033e-03 +666 695 -6.964455901063821e-03 +666 696 -2.283271683293573e-02 +666 697 -8.910497086826452e-03 +666 698 3.811891211200192e-02 +666 699 -1.281053516842999e-02 +666 700 -8.471515173091131e-02 +666 701 3.496883302058040e-01 +666 702 1.125329052227155e+00 +730 739 1.125329052227155e+00 +730 740 3.496883302058040e-01 +730 741 -8.471515173091132e-02 +730 742 -1.281053516842999e-02 +730 743 3.811891211200192e-02 +730 744 -8.910497086826454e-03 +730 745 -2.283271683293573e-02 +730 746 -6.964455901063820e-03 +730 747 3.848762214796032e-03 +730 766 -4.028549736135791e-03 +730 767 6.437602044020860e-03 +730 768 1.666728813825656e-02 +730 769 4.657915058914679e-03 +730 770 -1.296759263272032e-02 +730 771 2.520055549234693e-03 +730 772 7.942152029252155e-03 +730 773 -9.824645887494744e-03 +730 774 4.192808171655975e-03 +731 739 -1.892021217765643e-01 +731 740 8.343268197451050e-01 +731 741 8.229048909617033e-01 +731 742 5.826103953347056e-02 +731 743 -1.439621421629011e-01 +731 744 3.112452985381915e-02 +731 745 7.670746208201017e-02 +731 746 2.293253914396319e-02 +731 747 -1.256361223271782e-02 +731 766 1.323313804878060e-02 +731 767 -2.096995323671962e-02 +731 768 -5.358173644527387e-02 +731 769 -1.476812971757600e-02 +731 770 4.062188650978205e-02 +731 771 -7.820632800318658e-03 +731 772 -2.448347659537498e-02 +731 773 3.015884103136195e-02 +731 774 -1.284443828278400e-02 +732 739 1.046612031639541e-01 +732 740 -2.881124078576325e-01 +732 741 3.642942065094489e-01 +732 742 1.002415479616466e+00 +732 743 5.323155226899983e-01 +732 744 -7.954492469653167e-02 +732 745 -1.711660602912833e-01 +732 746 -4.811885553862987e-02 +732 747 2.570767009640572e-02 +732 766 -2.757068474109763e-02 +732 767 4.265186386815017e-02 +732 768 1.051000962006351e-01 +732 769 2.793485847485435e-02 +732 770 -7.455725140302157e-02 +732 771 1.403341243147948e-02 +732 772 4.325121028990536e-02 +732 773 -5.276030473240530e-02 +732 774 2.236576952566457e-02 +733 739 -6.899335049537707e-02 +733 740 1.729389305228446e-01 +733 741 -1.632953212690583e-01 +733 742 -7.035531268751234e-02 +733 743 7.220650334136145e-01 +733 744 9.772041559577678e-01 +733 745 5.453324425206543e-01 +733 746 1.175590121763699e-01 +733 747 -5.755658390963972e-02 +733 766 6.565365744134594e-02 +733 767 -9.365152023069143e-02 +733 768 -2.071439731675937e-01 +733 769 -5.010677298615094e-02 +733 770 1.247251953696845e-01 +733 771 -2.237629970634148e-02 +733 772 -6.683554557782116e-02 +733 773 8.001126076632280e-02 +733 774 -3.362050583246628e-02 +734 739 4.811158329876216e-02 +734 740 -1.164268237939059e-01 +734 741 1.009370353828557e-01 +734 742 3.613279323195188e-02 +734 743 -2.263595638964383e-01 +734 744 1.124088651417292e-01 +734 745 7.109171977955304e-01 +734 746 9.801237676746004e-01 +734 747 9.932762028182623e-01 +734 766 9.932762028182627e-01 +734 767 9.801237676746007e-01 +734 768 7.109171977955304e-01 +734 769 1.124088651417292e-01 +734 770 -2.263595638964383e-01 +734 771 3.613279323195188e-02 +734 772 1.009370353828557e-01 +734 773 -1.164268237939059e-01 +734 774 4.811158329876215e-02 +735 739 -3.362050583246629e-02 +735 740 8.001126076632280e-02 +735 741 -6.683554557782116e-02 +735 742 -2.237629970634147e-02 +735 743 1.247251953696845e-01 +735 744 -5.010677298615095e-02 +735 745 -2.071439731675937e-01 +735 746 -9.365152023069140e-02 +735 747 6.565365744134591e-02 +735 766 -5.755658390963973e-02 +735 767 1.175590121763699e-01 +735 768 5.453324425206542e-01 +735 769 9.772041559577676e-01 +735 770 7.220650334136144e-01 +735 771 -7.035531268751233e-02 +735 772 -1.632953212690582e-01 +735 773 1.729389305228446e-01 +735 774 -6.899335049537704e-02 +736 739 2.236576952566457e-02 +736 740 -5.276030473240532e-02 +736 741 4.325121028990537e-02 +736 742 1.403341243147948e-02 +736 743 -7.455725140302157e-02 +736 744 2.793485847485436e-02 +736 745 1.051000962006351e-01 +736 746 4.265186386815016e-02 +736 747 -2.757068474109762e-02 +736 766 2.570767009640572e-02 +736 767 -4.811885553862988e-02 +736 768 -1.711660602912833e-01 +736 769 -7.954492469653165e-02 +736 770 5.323155226899983e-01 +736 771 1.002415479616466e+00 +736 772 3.642942065094489e-01 +736 773 -2.881124078576325e-01 +736 774 1.046612031639541e-01 +737 739 -1.284443828278401e-02 +737 740 3.015884103136196e-02 +737 741 -2.448347659537498e-02 +737 742 -7.820632800318658e-03 +737 743 4.062188650978206e-02 +737 744 -1.476812971757601e-02 +737 745 -5.358173644527388e-02 +737 746 -2.096995323671962e-02 +737 747 1.323313804878060e-02 +737 766 -1.256361223271783e-02 +737 767 2.293253914396320e-02 +737 768 7.670746208201018e-02 +737 769 3.112452985381915e-02 +737 770 -1.439621421629011e-01 +737 771 5.826103953347057e-02 +737 772 8.229048909617035e-01 +737 773 8.343268197451050e-01 +737 774 -1.892021217765643e-01 +738 739 4.192808171655976e-03 +738 740 -9.824645887494746e-03 +738 741 7.942152029252157e-03 +738 742 2.520055549234693e-03 +738 743 -1.296759263272032e-02 +738 744 4.657915058914680e-03 +738 745 1.666728813825656e-02 +738 746 6.437602044020858e-03 +738 747 -4.028549736135791e-03 +738 766 3.848762214796033e-03 +738 767 -6.964455901063821e-03 +738 768 -2.283271683293573e-02 +738 769 -8.910497086826452e-03 +738 770 3.811891211200192e-02 +738 771 -1.281053516842999e-02 +738 772 -8.471515173091131e-02 +738 773 3.496883302058040e-01 +738 774 1.125329052227155e+00 +793 802 1.125329052227155e+00 +793 803 3.496883302058040e-01 +793 804 -8.471515173091132e-02 +793 805 -1.281053516842999e-02 +793 806 3.811891211200192e-02 +793 807 -8.910497086826454e-03 +793 808 -2.283271683293573e-02 +793 809 -6.964455901063820e-03 +793 810 3.848762214796032e-03 +793 829 -4.028549736135791e-03 +793 830 6.437602044020860e-03 +793 831 1.666728813825656e-02 +793 832 4.657915058914679e-03 +793 833 -1.296759263272032e-02 +793 834 2.520055549234693e-03 +793 835 7.942152029252155e-03 +793 836 -9.824645887494744e-03 +793 837 4.192808171655975e-03 +794 802 -1.892021217765643e-01 +794 803 8.343268197451050e-01 +794 804 8.229048909617033e-01 +794 805 5.826103953347056e-02 +794 806 -1.439621421629011e-01 +794 807 3.112452985381915e-02 +794 808 7.670746208201017e-02 +794 809 2.293253914396319e-02 +794 810 -1.256361223271782e-02 +794 829 1.323313804878060e-02 +794 830 -2.096995323671962e-02 +794 831 -5.358173644527387e-02 +794 832 -1.476812971757600e-02 +794 833 4.062188650978205e-02 +794 834 -7.820632800318658e-03 +794 835 -2.448347659537498e-02 +794 836 3.015884103136195e-02 +794 837 -1.284443828278400e-02 +795 802 1.046612031639541e-01 +795 803 -2.881124078576325e-01 +795 804 3.642942065094489e-01 +795 805 1.002415479616466e+00 +795 806 5.323155226899983e-01 +795 807 -7.954492469653167e-02 +795 808 -1.711660602912833e-01 +795 809 -4.811885553862987e-02 +795 810 2.570767009640572e-02 +795 829 -2.757068474109763e-02 +795 830 4.265186386815017e-02 +795 831 1.051000962006351e-01 +795 832 2.793485847485435e-02 +795 833 -7.455725140302157e-02 +795 834 1.403341243147948e-02 +795 835 4.325121028990536e-02 +795 836 -5.276030473240530e-02 +795 837 2.236576952566457e-02 +796 802 -6.899335049537707e-02 +796 803 1.729389305228446e-01 +796 804 -1.632953212690583e-01 +796 805 -7.035531268751234e-02 +796 806 7.220650334136145e-01 +796 807 9.772041559577678e-01 +796 808 5.453324425206543e-01 +796 809 1.175590121763699e-01 +796 810 -5.755658390963972e-02 +796 829 6.565365744134594e-02 +796 830 -9.365152023069143e-02 +796 831 -2.071439731675937e-01 +796 832 -5.010677298615094e-02 +796 833 1.247251953696845e-01 +796 834 -2.237629970634148e-02 +796 835 -6.683554557782116e-02 +796 836 8.001126076632280e-02 +796 837 -3.362050583246628e-02 +797 802 4.811158329876216e-02 +797 803 -1.164268237939059e-01 +797 804 1.009370353828557e-01 +797 805 3.613279323195188e-02 +797 806 -2.263595638964383e-01 +797 807 1.124088651417292e-01 +797 808 7.109171977955304e-01 +797 809 9.801237676746004e-01 +797 810 9.932762028182623e-01 +797 829 9.932762028182627e-01 +797 830 9.801237676746007e-01 +797 831 7.109171977955304e-01 +797 832 1.124088651417292e-01 +797 833 -2.263595638964383e-01 +797 834 3.613279323195188e-02 +797 835 1.009370353828557e-01 +797 836 -1.164268237939059e-01 +797 837 4.811158329876215e-02 +798 802 -3.362050583246629e-02 +798 803 8.001126076632280e-02 +798 804 -6.683554557782116e-02 +798 805 -2.237629970634147e-02 +798 806 1.247251953696845e-01 +798 807 -5.010677298615095e-02 +798 808 -2.071439731675937e-01 +798 809 -9.365152023069140e-02 +798 810 6.565365744134591e-02 +798 829 -5.755658390963973e-02 +798 830 1.175590121763699e-01 +798 831 5.453324425206542e-01 +798 832 9.772041559577676e-01 +798 833 7.220650334136144e-01 +798 834 -7.035531268751233e-02 +798 835 -1.632953212690582e-01 +798 836 1.729389305228446e-01 +798 837 -6.899335049537704e-02 +799 802 2.236576952566457e-02 +799 803 -5.276030473240532e-02 +799 804 4.325121028990537e-02 +799 805 1.403341243147948e-02 +799 806 -7.455725140302157e-02 +799 807 2.793485847485436e-02 +799 808 1.051000962006351e-01 +799 809 4.265186386815016e-02 +799 810 -2.757068474109762e-02 +799 829 2.570767009640572e-02 +799 830 -4.811885553862988e-02 +799 831 -1.711660602912833e-01 +799 832 -7.954492469653165e-02 +799 833 5.323155226899983e-01 +799 834 1.002415479616466e+00 +799 835 3.642942065094489e-01 +799 836 -2.881124078576325e-01 +799 837 1.046612031639541e-01 +800 802 -1.284443828278401e-02 +800 803 3.015884103136196e-02 +800 804 -2.448347659537498e-02 +800 805 -7.820632800318658e-03 +800 806 4.062188650978206e-02 +800 807 -1.476812971757601e-02 +800 808 -5.358173644527388e-02 +800 809 -2.096995323671962e-02 +800 810 1.323313804878060e-02 +800 829 -1.256361223271783e-02 +800 830 2.293253914396320e-02 +800 831 7.670746208201018e-02 +800 832 3.112452985381915e-02 +800 833 -1.439621421629011e-01 +800 834 5.826103953347057e-02 +800 835 8.229048909617035e-01 +800 836 8.343268197451050e-01 +800 837 -1.892021217765643e-01 +801 802 4.192808171655976e-03 +801 803 -9.824645887494746e-03 +801 804 7.942152029252157e-03 +801 805 2.520055549234693e-03 +801 806 -1.296759263272032e-02 +801 807 4.657915058914680e-03 +801 808 1.666728813825656e-02 +801 809 6.437602044020858e-03 +801 810 -4.028549736135791e-03 +801 829 3.848762214796033e-03 +801 830 -6.964455901063821e-03 +801 831 -2.283271683293573e-02 +801 832 -8.910497086826452e-03 +801 833 3.811891211200192e-02 +801 834 -1.281053516842999e-02 +801 835 -8.471515173091131e-02 +801 836 3.496883302058040e-01 +801 837 1.125329052227155e+00 +874 883 1.125329052227155e+00 +874 884 3.496883302058040e-01 +874 885 -8.471515173091132e-02 +874 886 -1.281053516842999e-02 +874 887 3.811891211200192e-02 +874 888 -8.910497086826454e-03 +874 889 -2.283271683293573e-02 +874 890 -6.964455901063820e-03 +874 891 3.848762214796032e-03 +874 910 -4.028549736135791e-03 +874 911 6.437602044020860e-03 +874 912 1.666728813825656e-02 +874 913 4.657915058914679e-03 +874 914 -1.296759263272032e-02 +874 915 2.520055549234693e-03 +874 916 7.942152029252155e-03 +874 917 -9.824645887494744e-03 +874 918 4.192808171655975e-03 +875 883 -1.892021217765643e-01 +875 884 8.343268197451050e-01 +875 885 8.229048909617033e-01 +875 886 5.826103953347056e-02 +875 887 -1.439621421629011e-01 +875 888 3.112452985381915e-02 +875 889 7.670746208201017e-02 +875 890 2.293253914396319e-02 +875 891 -1.256361223271782e-02 +875 910 1.323313804878060e-02 +875 911 -2.096995323671962e-02 +875 912 -5.358173644527387e-02 +875 913 -1.476812971757600e-02 +875 914 4.062188650978205e-02 +875 915 -7.820632800318658e-03 +875 916 -2.448347659537498e-02 +875 917 3.015884103136195e-02 +875 918 -1.284443828278400e-02 +876 883 1.046612031639541e-01 +876 884 -2.881124078576325e-01 +876 885 3.642942065094489e-01 +876 886 1.002415479616466e+00 +876 887 5.323155226899983e-01 +876 888 -7.954492469653167e-02 +876 889 -1.711660602912833e-01 +876 890 -4.811885553862987e-02 +876 891 2.570767009640572e-02 +876 910 -2.757068474109763e-02 +876 911 4.265186386815017e-02 +876 912 1.051000962006351e-01 +876 913 2.793485847485435e-02 +876 914 -7.455725140302157e-02 +876 915 1.403341243147948e-02 +876 916 4.325121028990536e-02 +876 917 -5.276030473240530e-02 +876 918 2.236576952566457e-02 +877 883 -6.899335049537707e-02 +877 884 1.729389305228446e-01 +877 885 -1.632953212690583e-01 +877 886 -7.035531268751234e-02 +877 887 7.220650334136145e-01 +877 888 9.772041559577678e-01 +877 889 5.453324425206543e-01 +877 890 1.175590121763699e-01 +877 891 -5.755658390963972e-02 +877 910 6.565365744134594e-02 +877 911 -9.365152023069143e-02 +877 912 -2.071439731675937e-01 +877 913 -5.010677298615094e-02 +877 914 1.247251953696845e-01 +877 915 -2.237629970634148e-02 +877 916 -6.683554557782116e-02 +877 917 8.001126076632280e-02 +877 918 -3.362050583246628e-02 +878 883 4.811158329876216e-02 +878 884 -1.164268237939059e-01 +878 885 1.009370353828557e-01 +878 886 3.613279323195188e-02 +878 887 -2.263595638964383e-01 +878 888 1.124088651417292e-01 +878 889 7.109171977955304e-01 +878 890 9.801237676746004e-01 +878 891 9.932762028182623e-01 +878 910 9.932762028182627e-01 +878 911 9.801237676746007e-01 +878 912 7.109171977955304e-01 +878 913 1.124088651417292e-01 +878 914 -2.263595638964383e-01 +878 915 3.613279323195188e-02 +878 916 1.009370353828557e-01 +878 917 -1.164268237939059e-01 +878 918 4.811158329876215e-02 +879 883 -3.362050583246629e-02 +879 884 8.001126076632280e-02 +879 885 -6.683554557782116e-02 +879 886 -2.237629970634147e-02 +879 887 1.247251953696845e-01 +879 888 -5.010677298615095e-02 +879 889 -2.071439731675937e-01 +879 890 -9.365152023069140e-02 +879 891 6.565365744134591e-02 +879 910 -5.755658390963973e-02 +879 911 1.175590121763699e-01 +879 912 5.453324425206542e-01 +879 913 9.772041559577676e-01 +879 914 7.220650334136144e-01 +879 915 -7.035531268751233e-02 +879 916 -1.632953212690582e-01 +879 917 1.729389305228446e-01 +879 918 -6.899335049537704e-02 +880 883 2.236576952566457e-02 +880 884 -5.276030473240532e-02 +880 885 4.325121028990537e-02 +880 886 1.403341243147948e-02 +880 887 -7.455725140302157e-02 +880 888 2.793485847485436e-02 +880 889 1.051000962006351e-01 +880 890 4.265186386815016e-02 +880 891 -2.757068474109762e-02 +880 910 2.570767009640572e-02 +880 911 -4.811885553862988e-02 +880 912 -1.711660602912833e-01 +880 913 -7.954492469653165e-02 +880 914 5.323155226899983e-01 +880 915 1.002415479616466e+00 +880 916 3.642942065094489e-01 +880 917 -2.881124078576325e-01 +880 918 1.046612031639541e-01 +881 883 -1.284443828278401e-02 +881 884 3.015884103136196e-02 +881 885 -2.448347659537498e-02 +881 886 -7.820632800318658e-03 +881 887 4.062188650978206e-02 +881 888 -1.476812971757601e-02 +881 889 -5.358173644527388e-02 +881 890 -2.096995323671962e-02 +881 891 1.323313804878060e-02 +881 910 -1.256361223271783e-02 +881 911 2.293253914396320e-02 +881 912 7.670746208201018e-02 +881 913 3.112452985381915e-02 +881 914 -1.439621421629011e-01 +881 915 5.826103953347057e-02 +881 916 8.229048909617035e-01 +881 917 8.343268197451050e-01 +881 918 -1.892021217765643e-01 +882 883 4.192808171655976e-03 +882 884 -9.824645887494746e-03 +882 885 7.942152029252157e-03 +882 886 2.520055549234693e-03 +882 887 -1.296759263272032e-02 +882 888 4.657915058914680e-03 +882 889 1.666728813825656e-02 +882 890 6.437602044020858e-03 +882 891 -4.028549736135791e-03 +882 910 3.848762214796033e-03 +882 911 -6.964455901063821e-03 +882 912 -2.283271683293573e-02 +882 913 -8.910497086826452e-03 +882 914 3.811891211200192e-02 +882 915 -1.281053516842999e-02 +882 916 -8.471515173091131e-02 +882 917 3.496883302058040e-01 +882 918 1.125329052227155e+00 +937 946 1.125329052227155e+00 +937 947 3.496883302058040e-01 +937 948 -8.471515173091132e-02 +937 949 -1.281053516842999e-02 +937 950 3.811891211200192e-02 +937 951 -8.910497086826454e-03 +937 952 -2.283271683293573e-02 +937 953 -6.964455901063820e-03 +937 954 3.848762214796032e-03 +937 973 -4.028549736135791e-03 +937 974 6.437602044020860e-03 +937 975 1.666728813825656e-02 +937 976 4.657915058914679e-03 +937 977 -1.296759263272032e-02 +937 978 2.520055549234693e-03 +937 979 7.942152029252155e-03 +937 980 -9.824645887494744e-03 +937 981 4.192808171655975e-03 +938 946 -1.892021217765643e-01 +938 947 8.343268197451050e-01 +938 948 8.229048909617033e-01 +938 949 5.826103953347056e-02 +938 950 -1.439621421629011e-01 +938 951 3.112452985381915e-02 +938 952 7.670746208201017e-02 +938 953 2.293253914396319e-02 +938 954 -1.256361223271782e-02 +938 973 1.323313804878060e-02 +938 974 -2.096995323671962e-02 +938 975 -5.358173644527387e-02 +938 976 -1.476812971757600e-02 +938 977 4.062188650978205e-02 +938 978 -7.820632800318658e-03 +938 979 -2.448347659537498e-02 +938 980 3.015884103136195e-02 +938 981 -1.284443828278400e-02 +939 946 1.046612031639541e-01 +939 947 -2.881124078576325e-01 +939 948 3.642942065094489e-01 +939 949 1.002415479616466e+00 +939 950 5.323155226899983e-01 +939 951 -7.954492469653167e-02 +939 952 -1.711660602912833e-01 +939 953 -4.811885553862987e-02 +939 954 2.570767009640572e-02 +939 973 -2.757068474109763e-02 +939 974 4.265186386815017e-02 +939 975 1.051000962006351e-01 +939 976 2.793485847485435e-02 +939 977 -7.455725140302157e-02 +939 978 1.403341243147948e-02 +939 979 4.325121028990536e-02 +939 980 -5.276030473240530e-02 +939 981 2.236576952566457e-02 +940 946 -6.899335049537707e-02 +940 947 1.729389305228446e-01 +940 948 -1.632953212690583e-01 +940 949 -7.035531268751234e-02 +940 950 7.220650334136145e-01 +940 951 9.772041559577678e-01 +940 952 5.453324425206543e-01 +940 953 1.175590121763699e-01 +940 954 -5.755658390963972e-02 +940 973 6.565365744134594e-02 +940 974 -9.365152023069143e-02 +940 975 -2.071439731675937e-01 +940 976 -5.010677298615094e-02 +940 977 1.247251953696845e-01 +940 978 -2.237629970634148e-02 +940 979 -6.683554557782116e-02 +940 980 8.001126076632280e-02 +940 981 -3.362050583246628e-02 +941 946 4.811158329876216e-02 +941 947 -1.164268237939059e-01 +941 948 1.009370353828557e-01 +941 949 3.613279323195188e-02 +941 950 -2.263595638964383e-01 +941 951 1.124088651417292e-01 +941 952 7.109171977955304e-01 +941 953 9.801237676746004e-01 +941 954 9.932762028182623e-01 +941 973 9.932762028182627e-01 +941 974 9.801237676746007e-01 +941 975 7.109171977955304e-01 +941 976 1.124088651417292e-01 +941 977 -2.263595638964383e-01 +941 978 3.613279323195188e-02 +941 979 1.009370353828557e-01 +941 980 -1.164268237939059e-01 +941 981 4.811158329876215e-02 +942 946 -3.362050583246629e-02 +942 947 8.001126076632280e-02 +942 948 -6.683554557782116e-02 +942 949 -2.237629970634147e-02 +942 950 1.247251953696845e-01 +942 951 -5.010677298615095e-02 +942 952 -2.071439731675937e-01 +942 953 -9.365152023069140e-02 +942 954 6.565365744134591e-02 +942 973 -5.755658390963973e-02 +942 974 1.175590121763699e-01 +942 975 5.453324425206542e-01 +942 976 9.772041559577676e-01 +942 977 7.220650334136144e-01 +942 978 -7.035531268751233e-02 +942 979 -1.632953212690582e-01 +942 980 1.729389305228446e-01 +942 981 -6.899335049537704e-02 +943 946 2.236576952566457e-02 +943 947 -5.276030473240532e-02 +943 948 4.325121028990537e-02 +943 949 1.403341243147948e-02 +943 950 -7.455725140302157e-02 +943 951 2.793485847485436e-02 +943 952 1.051000962006351e-01 +943 953 4.265186386815016e-02 +943 954 -2.757068474109762e-02 +943 973 2.570767009640572e-02 +943 974 -4.811885553862988e-02 +943 975 -1.711660602912833e-01 +943 976 -7.954492469653165e-02 +943 977 5.323155226899983e-01 +943 978 1.002415479616466e+00 +943 979 3.642942065094489e-01 +943 980 -2.881124078576325e-01 +943 981 1.046612031639541e-01 +944 946 -1.284443828278401e-02 +944 947 3.015884103136196e-02 +944 948 -2.448347659537498e-02 +944 949 -7.820632800318658e-03 +944 950 4.062188650978206e-02 +944 951 -1.476812971757601e-02 +944 952 -5.358173644527388e-02 +944 953 -2.096995323671962e-02 +944 954 1.323313804878060e-02 +944 973 -1.256361223271783e-02 +944 974 2.293253914396320e-02 +944 975 7.670746208201018e-02 +944 976 3.112452985381915e-02 +944 977 -1.439621421629011e-01 +944 978 5.826103953347057e-02 +944 979 8.229048909617035e-01 +944 980 8.343268197451050e-01 +944 981 -1.892021217765643e-01 +945 946 4.192808171655976e-03 +945 947 -9.824645887494746e-03 +945 948 7.942152029252157e-03 +945 949 2.520055549234693e-03 +945 950 -1.296759263272032e-02 +945 951 4.657915058914680e-03 +945 952 1.666728813825656e-02 +945 953 6.437602044020858e-03 +945 954 -4.028549736135791e-03 +945 973 3.848762214796033e-03 +945 974 -6.964455901063821e-03 +945 975 -2.283271683293573e-02 +945 976 -8.910497086826452e-03 +945 977 3.811891211200192e-02 +945 978 -1.281053516842999e-02 +945 979 -8.471515173091131e-02 +945 980 3.496883302058040e-01 +945 981 1.125329052227155e+00 +1009 1018 1.125329052227155e+00 +1009 1019 3.496883302058040e-01 +1009 1020 -8.471515173091132e-02 +1009 1021 -1.281053516842999e-02 +1009 1022 3.811891211200192e-02 +1009 1023 -8.910497086826454e-03 +1009 1024 -2.283271683293573e-02 +1009 1025 -6.964455901063820e-03 +1009 1026 3.848762214796032e-03 +1009 1045 -4.028549736135791e-03 +1009 1046 6.437602044020860e-03 +1009 1047 1.666728813825656e-02 +1009 1048 4.657915058914679e-03 +1009 1049 -1.296759263272032e-02 +1009 1050 2.520055549234693e-03 +1009 1051 7.942152029252155e-03 +1009 1052 -9.824645887494744e-03 +1009 1053 4.192808171655975e-03 +1010 1018 -1.892021217765643e-01 +1010 1019 8.343268197451050e-01 +1010 1020 8.229048909617033e-01 +1010 1021 5.826103953347056e-02 +1010 1022 -1.439621421629011e-01 +1010 1023 3.112452985381915e-02 +1010 1024 7.670746208201017e-02 +1010 1025 2.293253914396319e-02 +1010 1026 -1.256361223271782e-02 +1010 1045 1.323313804878060e-02 +1010 1046 -2.096995323671962e-02 +1010 1047 -5.358173644527387e-02 +1010 1048 -1.476812971757600e-02 +1010 1049 4.062188650978205e-02 +1010 1050 -7.820632800318658e-03 +1010 1051 -2.448347659537498e-02 +1010 1052 3.015884103136195e-02 +1010 1053 -1.284443828278400e-02 +1011 1018 1.046612031639541e-01 +1011 1019 -2.881124078576325e-01 +1011 1020 3.642942065094489e-01 +1011 1021 1.002415479616466e+00 +1011 1022 5.323155226899983e-01 +1011 1023 -7.954492469653167e-02 +1011 1024 -1.711660602912833e-01 +1011 1025 -4.811885553862987e-02 +1011 1026 2.570767009640572e-02 +1011 1045 -2.757068474109763e-02 +1011 1046 4.265186386815017e-02 +1011 1047 1.051000962006351e-01 +1011 1048 2.793485847485435e-02 +1011 1049 -7.455725140302157e-02 +1011 1050 1.403341243147948e-02 +1011 1051 4.325121028990536e-02 +1011 1052 -5.276030473240530e-02 +1011 1053 2.236576952566457e-02 +1012 1018 -6.899335049537707e-02 +1012 1019 1.729389305228446e-01 +1012 1020 -1.632953212690583e-01 +1012 1021 -7.035531268751234e-02 +1012 1022 7.220650334136145e-01 +1012 1023 9.772041559577678e-01 +1012 1024 5.453324425206543e-01 +1012 1025 1.175590121763699e-01 +1012 1026 -5.755658390963972e-02 +1012 1045 6.565365744134594e-02 +1012 1046 -9.365152023069143e-02 +1012 1047 -2.071439731675937e-01 +1012 1048 -5.010677298615094e-02 +1012 1049 1.247251953696845e-01 +1012 1050 -2.237629970634148e-02 +1012 1051 -6.683554557782116e-02 +1012 1052 8.001126076632280e-02 +1012 1053 -3.362050583246628e-02 +1013 1018 4.811158329876216e-02 +1013 1019 -1.164268237939059e-01 +1013 1020 1.009370353828557e-01 +1013 1021 3.613279323195188e-02 +1013 1022 -2.263595638964383e-01 +1013 1023 1.124088651417292e-01 +1013 1024 7.109171977955304e-01 +1013 1025 9.801237676746004e-01 +1013 1026 9.932762028182623e-01 +1013 1045 9.932762028182627e-01 +1013 1046 9.801237676746007e-01 +1013 1047 7.109171977955304e-01 +1013 1048 1.124088651417292e-01 +1013 1049 -2.263595638964383e-01 +1013 1050 3.613279323195188e-02 +1013 1051 1.009370353828557e-01 +1013 1052 -1.164268237939059e-01 +1013 1053 4.811158329876215e-02 +1014 1018 -3.362050583246629e-02 +1014 1019 8.001126076632280e-02 +1014 1020 -6.683554557782116e-02 +1014 1021 -2.237629970634147e-02 +1014 1022 1.247251953696845e-01 +1014 1023 -5.010677298615095e-02 +1014 1024 -2.071439731675937e-01 +1014 1025 -9.365152023069140e-02 +1014 1026 6.565365744134591e-02 +1014 1045 -5.755658390963973e-02 +1014 1046 1.175590121763699e-01 +1014 1047 5.453324425206542e-01 +1014 1048 9.772041559577676e-01 +1014 1049 7.220650334136144e-01 +1014 1050 -7.035531268751233e-02 +1014 1051 -1.632953212690582e-01 +1014 1052 1.729389305228446e-01 +1014 1053 -6.899335049537704e-02 +1015 1018 2.236576952566457e-02 +1015 1019 -5.276030473240532e-02 +1015 1020 4.325121028990537e-02 +1015 1021 1.403341243147948e-02 +1015 1022 -7.455725140302157e-02 +1015 1023 2.793485847485436e-02 +1015 1024 1.051000962006351e-01 +1015 1025 4.265186386815016e-02 +1015 1026 -2.757068474109762e-02 +1015 1045 2.570767009640572e-02 +1015 1046 -4.811885553862988e-02 +1015 1047 -1.711660602912833e-01 +1015 1048 -7.954492469653165e-02 +1015 1049 5.323155226899983e-01 +1015 1050 1.002415479616466e+00 +1015 1051 3.642942065094489e-01 +1015 1052 -2.881124078576325e-01 +1015 1053 1.046612031639541e-01 +1016 1018 -1.284443828278401e-02 +1016 1019 3.015884103136196e-02 +1016 1020 -2.448347659537498e-02 +1016 1021 -7.820632800318658e-03 +1016 1022 4.062188650978206e-02 +1016 1023 -1.476812971757601e-02 +1016 1024 -5.358173644527388e-02 +1016 1025 -2.096995323671962e-02 +1016 1026 1.323313804878060e-02 +1016 1045 -1.256361223271783e-02 +1016 1046 2.293253914396320e-02 +1016 1047 7.670746208201018e-02 +1016 1048 3.112452985381915e-02 +1016 1049 -1.439621421629011e-01 +1016 1050 5.826103953347057e-02 +1016 1051 8.229048909617035e-01 +1016 1052 8.343268197451050e-01 +1016 1053 -1.892021217765643e-01 +1017 1018 4.192808171655976e-03 +1017 1019 -9.824645887494746e-03 +1017 1020 7.942152029252157e-03 +1017 1021 2.520055549234693e-03 +1017 1022 -1.296759263272032e-02 +1017 1023 4.657915058914680e-03 +1017 1024 1.666728813825656e-02 +1017 1025 6.437602044020858e-03 +1017 1026 -4.028549736135791e-03 +1017 1045 3.848762214796033e-03 +1017 1046 -6.964455901063821e-03 +1017 1047 -2.283271683293573e-02 +1017 1048 -8.910497086826452e-03 +1017 1049 3.811891211200192e-02 +1017 1050 -1.281053516842999e-02 +1017 1051 -8.471515173091131e-02 +1017 1052 3.496883302058040e-01 +1017 1053 1.125329052227155e+00 +1072 1081 1.125329052227155e+00 +1072 1082 3.496883302058040e-01 +1072 1083 -8.471515173091132e-02 +1072 1084 -1.281053516842999e-02 +1072 1085 3.811891211200192e-02 +1072 1086 -8.910497086826454e-03 +1072 1087 -2.283271683293573e-02 +1072 1088 -6.964455901063820e-03 +1072 1089 3.848762214796032e-03 +1072 1108 -4.028549736135791e-03 +1072 1109 6.437602044020860e-03 +1072 1110 1.666728813825656e-02 +1072 1111 4.657915058914679e-03 +1072 1112 -1.296759263272032e-02 +1072 1113 2.520055549234693e-03 +1072 1114 7.942152029252155e-03 +1072 1115 -9.824645887494744e-03 +1072 1116 4.192808171655975e-03 +1073 1081 -1.892021217765643e-01 +1073 1082 8.343268197451050e-01 +1073 1083 8.229048909617033e-01 +1073 1084 5.826103953347056e-02 +1073 1085 -1.439621421629011e-01 +1073 1086 3.112452985381915e-02 +1073 1087 7.670746208201017e-02 +1073 1088 2.293253914396319e-02 +1073 1089 -1.256361223271782e-02 +1073 1108 1.323313804878060e-02 +1073 1109 -2.096995323671962e-02 +1073 1110 -5.358173644527387e-02 +1073 1111 -1.476812971757600e-02 +1073 1112 4.062188650978205e-02 +1073 1113 -7.820632800318658e-03 +1073 1114 -2.448347659537498e-02 +1073 1115 3.015884103136195e-02 +1073 1116 -1.284443828278400e-02 +1074 1081 1.046612031639541e-01 +1074 1082 -2.881124078576325e-01 +1074 1083 3.642942065094489e-01 +1074 1084 1.002415479616466e+00 +1074 1085 5.323155226899983e-01 +1074 1086 -7.954492469653167e-02 +1074 1087 -1.711660602912833e-01 +1074 1088 -4.811885553862987e-02 +1074 1089 2.570767009640572e-02 +1074 1108 -2.757068474109763e-02 +1074 1109 4.265186386815017e-02 +1074 1110 1.051000962006351e-01 +1074 1111 2.793485847485435e-02 +1074 1112 -7.455725140302157e-02 +1074 1113 1.403341243147948e-02 +1074 1114 4.325121028990536e-02 +1074 1115 -5.276030473240530e-02 +1074 1116 2.236576952566457e-02 +1075 1081 -6.899335049537707e-02 +1075 1082 1.729389305228446e-01 +1075 1083 -1.632953212690583e-01 +1075 1084 -7.035531268751234e-02 +1075 1085 7.220650334136145e-01 +1075 1086 9.772041559577678e-01 +1075 1087 5.453324425206543e-01 +1075 1088 1.175590121763699e-01 +1075 1089 -5.755658390963972e-02 +1075 1108 6.565365744134594e-02 +1075 1109 -9.365152023069143e-02 +1075 1110 -2.071439731675937e-01 +1075 1111 -5.010677298615094e-02 +1075 1112 1.247251953696845e-01 +1075 1113 -2.237629970634148e-02 +1075 1114 -6.683554557782116e-02 +1075 1115 8.001126076632280e-02 +1075 1116 -3.362050583246628e-02 +1076 1081 4.811158329876216e-02 +1076 1082 -1.164268237939059e-01 +1076 1083 1.009370353828557e-01 +1076 1084 3.613279323195188e-02 +1076 1085 -2.263595638964383e-01 +1076 1086 1.124088651417292e-01 +1076 1087 7.109171977955304e-01 +1076 1088 9.801237676746004e-01 +1076 1089 9.932762028182623e-01 +1076 1108 9.932762028182627e-01 +1076 1109 9.801237676746007e-01 +1076 1110 7.109171977955304e-01 +1076 1111 1.124088651417292e-01 +1076 1112 -2.263595638964383e-01 +1076 1113 3.613279323195188e-02 +1076 1114 1.009370353828557e-01 +1076 1115 -1.164268237939059e-01 +1076 1116 4.811158329876215e-02 +1077 1081 -3.362050583246629e-02 +1077 1082 8.001126076632280e-02 +1077 1083 -6.683554557782116e-02 +1077 1084 -2.237629970634147e-02 +1077 1085 1.247251953696845e-01 +1077 1086 -5.010677298615095e-02 +1077 1087 -2.071439731675937e-01 +1077 1088 -9.365152023069140e-02 +1077 1089 6.565365744134591e-02 +1077 1108 -5.755658390963973e-02 +1077 1109 1.175590121763699e-01 +1077 1110 5.453324425206542e-01 +1077 1111 9.772041559577676e-01 +1077 1112 7.220650334136144e-01 +1077 1113 -7.035531268751233e-02 +1077 1114 -1.632953212690582e-01 +1077 1115 1.729389305228446e-01 +1077 1116 -6.899335049537704e-02 +1078 1081 2.236576952566457e-02 +1078 1082 -5.276030473240532e-02 +1078 1083 4.325121028990537e-02 +1078 1084 1.403341243147948e-02 +1078 1085 -7.455725140302157e-02 +1078 1086 2.793485847485436e-02 +1078 1087 1.051000962006351e-01 +1078 1088 4.265186386815016e-02 +1078 1089 -2.757068474109762e-02 +1078 1108 2.570767009640572e-02 +1078 1109 -4.811885553862988e-02 +1078 1110 -1.711660602912833e-01 +1078 1111 -7.954492469653165e-02 +1078 1112 5.323155226899983e-01 +1078 1113 1.002415479616466e+00 +1078 1114 3.642942065094489e-01 +1078 1115 -2.881124078576325e-01 +1078 1116 1.046612031639541e-01 +1079 1081 -1.284443828278401e-02 +1079 1082 3.015884103136196e-02 +1079 1083 -2.448347659537498e-02 +1079 1084 -7.820632800318658e-03 +1079 1085 4.062188650978206e-02 +1079 1086 -1.476812971757601e-02 +1079 1087 -5.358173644527388e-02 +1079 1088 -2.096995323671962e-02 +1079 1089 1.323313804878060e-02 +1079 1108 -1.256361223271783e-02 +1079 1109 2.293253914396320e-02 +1079 1110 7.670746208201018e-02 +1079 1111 3.112452985381915e-02 +1079 1112 -1.439621421629011e-01 +1079 1113 5.826103953347057e-02 +1079 1114 8.229048909617035e-01 +1079 1115 8.343268197451050e-01 +1079 1116 -1.892021217765643e-01 +1080 1081 4.192808171655976e-03 +1080 1082 -9.824645887494746e-03 +1080 1083 7.942152029252157e-03 +1080 1084 2.520055549234693e-03 +1080 1085 -1.296759263272032e-02 +1080 1086 4.657915058914680e-03 +1080 1087 1.666728813825656e-02 +1080 1088 6.437602044020858e-03 +1080 1089 -4.028549736135791e-03 +1080 1108 3.848762214796033e-03 +1080 1109 -6.964455901063821e-03 +1080 1110 -2.283271683293573e-02 +1080 1111 -8.910497086826452e-03 +1080 1112 3.811891211200192e-02 +1080 1113 -1.281053516842999e-02 +1080 1114 -8.471515173091131e-02 +1080 1115 3.496883302058040e-01 +1080 1116 1.125329052227155e+00 +1162 1171 1.125329052227153e+00 +1162 1172 3.496883302058122e-01 +1162 1173 -8.471515173090287e-02 +1162 1174 -1.281053516843188e-02 +1162 1175 3.811891211199978e-02 +1162 1176 -8.910497086827956e-03 +1162 1177 -2.283271683293555e-02 +1162 1178 -6.964455901063736e-03 +1162 1179 3.848762214796554e-03 +1162 1198 -4.028549736136366e-03 +1162 1199 6.437602044020779e-03 +1162 1200 1.666728813825643e-02 +1162 1201 4.657915058915501e-03 +1162 1202 -1.296759263271960e-02 +1162 1203 2.520055549235032e-03 +1162 1204 7.942152029251364e-03 +1162 1205 -9.824645887494973e-03 +1162 1206 4.192808171658150e-03 +1163 1171 -1.892021217765656e-01 +1163 1172 8.343268197451107e-01 +1163 1173 8.229048909617080e-01 +1163 1174 5.826103953348261e-02 +1163 1175 -1.439621421628995e-01 +1163 1176 3.112452985382569e-02 +1163 1177 7.670746208201273e-02 +1163 1178 2.293253914396385e-02 +1163 1179 -1.256361223272003e-02 +1163 1198 1.323313804878303e-02 +1163 1199 -2.096995323672021e-02 +1163 1200 -5.358173644527560e-02 +1163 1201 -1.476812971757920e-02 +1163 1202 4.062188650978137e-02 +1163 1203 -7.820632800320009e-03 +1163 1204 -2.448347659537347e-02 +1163 1205 3.015884103136381e-02 +1163 1206 -1.284443828279115e-02 +1164 1171 1.046612031639591e-01 +1164 1172 -2.881124078576537e-01 +1164 1173 3.642942065094310e-01 +1164 1174 1.002415479616464e+00 +1164 1175 5.323155226899952e-01 +1164 1176 -7.954492469654867e-02 +1164 1177 -1.711660602912905e-01 +1164 1178 -4.811885553863171e-02 +1164 1179 2.570767009641045e-02 +1164 1198 -2.757068474110300e-02 +1164 1199 4.265186386815178e-02 +1164 1200 1.051000962006396e-01 +1164 1201 2.793485847486072e-02 +1164 1202 -7.455725140302115e-02 +1164 1203 1.403341243148206e-02 +1164 1204 4.325121028990322e-02 +1164 1205 -5.276030473240920e-02 +1164 1206 2.236576952567728e-02 +1165 1171 -6.899335049537925e-02 +1165 1172 1.729389305228546e-01 +1165 1173 -1.632953212690478e-01 +1165 1174 -7.035531268752397e-02 +1165 1175 7.220650334136118e-01 +1165 1176 9.772041559577636e-01 +1165 1177 5.453324425206555e-01 +1165 1178 1.175590121763705e-01 +1165 1179 -5.755658390964827e-02 +1165 1198 6.565365744135691e-02 +1165 1199 -9.365152023069208e-02 +1165 1200 -2.071439731675966e-01 +1165 1201 -5.010677298616108e-02 +1165 1202 1.247251953696806e-01 +1165 1203 -2.237629970634502e-02 +1165 1204 -6.683554557781619e-02 +1165 1205 8.001126076632671e-02 +1165 1206 -3.362050583248455e-02 +1166 1171 4.811158329876265e-02 +1166 1172 -1.164268237939101e-01 +1166 1173 1.009370353828469e-01 +1166 1174 3.613279323195708e-02 +1166 1175 -2.263595638964284e-01 +1166 1176 1.124088651417514e-01 +1166 1177 7.109171977955336e-01 +1166 1178 9.801237676746007e-01 +1166 1179 9.932762028182606e-01 +1166 1198 9.932762028182608e-01 +1166 1199 9.801237676746006e-01 +1166 1200 7.109171977955339e-01 +1166 1201 1.124088651417514e-01 +1166 1202 -2.263595638964285e-01 +1166 1203 3.613279323195707e-02 +1166 1204 1.009370353828469e-01 +1166 1205 -1.164268237939100e-01 +1166 1206 4.811158329878761e-02 +1167 1171 -3.362050583246708e-02 +1167 1172 8.001126076632673e-02 +1167 1173 -6.683554557781621e-02 +1167 1174 -2.237629970634502e-02 +1167 1175 1.247251953696805e-01 +1167 1176 -5.010677298616108e-02 +1167 1177 -2.071439731675965e-01 +1167 1178 -9.365152023069209e-02 +1167 1179 6.565365744135690e-02 +1167 1198 -5.755658390964827e-02 +1167 1199 1.175590121763705e-01 +1167 1200 5.453324425206556e-01 +1167 1201 9.772041559577636e-01 +1167 1202 7.220650334136122e-01 +1167 1203 -7.035531268752394e-02 +1167 1204 -1.632953212690477e-01 +1167 1205 1.729389305228546e-01 +1167 1206 -6.899335049541490e-02 +1168 1171 2.236576952566565e-02 +1168 1172 -5.276030473240920e-02 +1168 1173 4.325121028990322e-02 +1168 1174 1.403341243148206e-02 +1168 1175 -7.455725140302112e-02 +1168 1176 2.793485847486071e-02 +1168 1177 1.051000962006396e-01 +1168 1178 4.265186386815178e-02 +1168 1179 -2.757068474110299e-02 +1168 1198 2.570767009641045e-02 +1168 1199 -4.811885553863170e-02 +1168 1200 -1.711660602912906e-01 +1168 1201 -7.954492469654866e-02 +1168 1202 5.323155226899953e-01 +1168 1203 1.002415479616464e+00 +1168 1204 3.642942065094308e-01 +1168 1205 -2.881124078576536e-01 +1168 1206 1.046612031640127e-01 +1169 1171 -1.284443828278447e-02 +1169 1172 3.015884103136382e-02 +1169 1173 -2.448347659537348e-02 +1169 1174 -7.820632800320013e-03 +1169 1175 4.062188650978136e-02 +1169 1176 -1.476812971757920e-02 +1169 1177 -5.358173644527559e-02 +1169 1178 -2.096995323672021e-02 +1169 1179 1.323313804878302e-02 +1169 1198 -1.256361223272003e-02 +1169 1199 2.293253914396384e-02 +1169 1200 7.670746208201275e-02 +1169 1201 3.112452985382569e-02 +1169 1202 -1.439621421628996e-01 +1169 1203 5.826103953348259e-02 +1169 1204 8.229048909617078e-01 +1169 1205 8.343268197451105e-01 +1169 1206 -1.892021217766592e-01 +1170 1171 4.192808171655968e-03 +1170 1172 -9.824645887494977e-03 +1170 1173 7.942152029251368e-03 +1170 1174 2.520055549235034e-03 +1170 1175 -1.296759263271960e-02 +1170 1176 4.657915058915502e-03 +1170 1177 1.666728813825644e-02 +1170 1178 6.437602044020781e-03 +1170 1179 -4.028549736136366e-03 +1170 1198 3.848762214796555e-03 +1170 1199 -6.964455901063737e-03 +1170 1200 -2.283271683293556e-02 +1170 1201 -8.910497086827958e-03 +1170 1202 3.811891211199980e-02 +1170 1203 -1.281053516843188e-02 +1170 1204 -8.471515173090287e-02 +1170 1205 3.496883302058122e-01 +1170 1206 1.125329052227214e+00 +1225 1234 1.125329052227214e+00 +1225 1235 3.496883302058122e-01 +1225 1236 -8.471515173090287e-02 +1225 1237 -1.281053516843188e-02 +1225 1238 3.811891211199978e-02 +1225 1239 -8.910497086827956e-03 +1225 1240 -2.283271683293555e-02 +1225 1241 -6.964455901063736e-03 +1225 1242 3.848762214796554e-03 +1225 1261 -4.028549736136366e-03 +1225 1262 6.437602044020779e-03 +1225 1263 1.666728813825643e-02 +1225 1264 4.657915058915501e-03 +1225 1265 -1.296759263271960e-02 +1225 1266 2.520055549235032e-03 +1225 1267 7.942152029251364e-03 +1225 1268 -9.824645887494973e-03 +1225 1269 4.192808171658150e-03 +1226 1234 -1.892021217766592e-01 +1226 1235 8.343268197451107e-01 +1226 1236 8.229048909617080e-01 +1226 1237 5.826103953348261e-02 +1226 1238 -1.439621421628995e-01 +1226 1239 3.112452985382569e-02 +1226 1240 7.670746208201273e-02 +1226 1241 2.293253914396385e-02 +1226 1242 -1.256361223272003e-02 +1226 1261 1.323313804878303e-02 +1226 1262 -2.096995323672021e-02 +1226 1263 -5.358173644527560e-02 +1226 1264 -1.476812971757920e-02 +1226 1265 4.062188650978137e-02 +1226 1266 -7.820632800320009e-03 +1226 1267 -2.448347659537347e-02 +1226 1268 3.015884103136381e-02 +1226 1269 -1.284443828279115e-02 +1227 1234 1.046612031640127e-01 +1227 1235 -2.881124078576537e-01 +1227 1236 3.642942065094310e-01 +1227 1237 1.002415479616464e+00 +1227 1238 5.323155226899952e-01 +1227 1239 -7.954492469654867e-02 +1227 1240 -1.711660602912905e-01 +1227 1241 -4.811885553863171e-02 +1227 1242 2.570767009641045e-02 +1227 1261 -2.757068474110300e-02 +1227 1262 4.265186386815178e-02 +1227 1263 1.051000962006396e-01 +1227 1264 2.793485847486072e-02 +1227 1265 -7.455725140302115e-02 +1227 1266 1.403341243148206e-02 +1227 1267 4.325121028990322e-02 +1227 1268 -5.276030473240920e-02 +1227 1269 2.236576952567728e-02 +1228 1234 -6.899335049541490e-02 +1228 1235 1.729389305228546e-01 +1228 1236 -1.632953212690478e-01 +1228 1237 -7.035531268752397e-02 +1228 1238 7.220650334136118e-01 +1228 1239 9.772041559577636e-01 +1228 1240 5.453324425206555e-01 +1228 1241 1.175590121763705e-01 +1228 1242 -5.755658390964827e-02 +1228 1261 6.565365744135691e-02 +1228 1262 -9.365152023069208e-02 +1228 1263 -2.071439731675966e-01 +1228 1264 -5.010677298616108e-02 +1228 1265 1.247251953696806e-01 +1228 1266 -2.237629970634502e-02 +1228 1267 -6.683554557781619e-02 +1228 1268 8.001126076632671e-02 +1228 1269 -3.362050583248455e-02 +1229 1234 4.811158329878761e-02 +1229 1235 -1.164268237939101e-01 +1229 1236 1.009370353828469e-01 +1229 1237 3.613279323195708e-02 +1229 1238 -2.263595638964284e-01 +1229 1239 1.124088651417514e-01 +1229 1240 7.109171977955336e-01 +1229 1241 9.801237676746007e-01 +1229 1242 9.932762028182606e-01 +1229 1261 9.932762028182608e-01 +1229 1262 9.801237676746006e-01 +1229 1263 7.109171977955339e-01 +1229 1264 1.124088651417514e-01 +1229 1265 -2.263595638964285e-01 +1229 1266 3.613279323195707e-02 +1229 1267 1.009370353828469e-01 +1229 1268 -1.164268237939100e-01 +1229 1269 4.811158329878761e-02 +1230 1234 -3.362050583248454e-02 +1230 1235 8.001126076632673e-02 +1230 1236 -6.683554557781621e-02 +1230 1237 -2.237629970634502e-02 +1230 1238 1.247251953696805e-01 +1230 1239 -5.010677298616108e-02 +1230 1240 -2.071439731675965e-01 +1230 1241 -9.365152023069209e-02 +1230 1242 6.565365744135690e-02 +1230 1261 -5.755658390964827e-02 +1230 1262 1.175590121763705e-01 +1230 1263 5.453324425206556e-01 +1230 1264 9.772041559577636e-01 +1230 1265 7.220650334136122e-01 +1230 1266 -7.035531268752394e-02 +1230 1267 -1.632953212690477e-01 +1230 1268 1.729389305228546e-01 +1230 1269 -6.899335049541490e-02 +1231 1234 2.236576952567727e-02 +1231 1235 -5.276030473240920e-02 +1231 1236 4.325121028990322e-02 +1231 1237 1.403341243148206e-02 +1231 1238 -7.455725140302112e-02 +1231 1239 2.793485847486071e-02 +1231 1240 1.051000962006396e-01 +1231 1241 4.265186386815178e-02 +1231 1242 -2.757068474110299e-02 +1231 1261 2.570767009641045e-02 +1231 1262 -4.811885553863170e-02 +1231 1263 -1.711660602912906e-01 +1231 1264 -7.954492469654866e-02 +1231 1265 5.323155226899953e-01 +1231 1266 1.002415479616464e+00 +1231 1267 3.642942065094308e-01 +1231 1268 -2.881124078576536e-01 +1231 1269 1.046612031640127e-01 +1232 1234 -1.284443828279115e-02 +1232 1235 3.015884103136382e-02 +1232 1236 -2.448347659537348e-02 +1232 1237 -7.820632800320013e-03 +1232 1238 4.062188650978136e-02 +1232 1239 -1.476812971757920e-02 +1232 1240 -5.358173644527559e-02 +1232 1241 -2.096995323672021e-02 +1232 1242 1.323313804878302e-02 +1232 1261 -1.256361223272003e-02 +1232 1262 2.293253914396384e-02 +1232 1263 7.670746208201275e-02 +1232 1264 3.112452985382569e-02 +1232 1265 -1.439621421628996e-01 +1232 1266 5.826103953348259e-02 +1232 1267 8.229048909617078e-01 +1232 1268 8.343268197451105e-01 +1232 1269 -1.892021217766592e-01 +1233 1234 4.192808171658150e-03 +1233 1235 -9.824645887494977e-03 +1233 1236 7.942152029251368e-03 +1233 1237 2.520055549235034e-03 +1233 1238 -1.296759263271960e-02 +1233 1239 4.657915058915502e-03 +1233 1240 1.666728813825644e-02 +1233 1241 6.437602044020781e-03 +1233 1242 -4.028549736136366e-03 +1233 1261 3.848762214796555e-03 +1233 1262 -6.964455901063737e-03 +1233 1263 -2.283271683293556e-02 +1233 1264 -8.910497086827958e-03 +1233 1265 3.811891211199980e-02 +1233 1266 -1.281053516843188e-02 +1233 1267 -8.471515173090287e-02 +1233 1268 3.496883302058122e-01 +1233 1269 1.125329052227214e+00 +1297 1306 1.125329052227214e+00 +1297 1307 3.496883302058122e-01 +1297 1308 -8.471515173090287e-02 +1297 1309 -1.281053516843188e-02 +1297 1310 3.811891211199978e-02 +1297 1311 -8.910497086827956e-03 +1297 1312 -2.283271683293555e-02 +1297 1313 -6.964455901063736e-03 +1297 1314 3.848762214796554e-03 +1297 1333 -4.028549736136366e-03 +1297 1334 6.437602044020779e-03 +1297 1335 1.666728813825643e-02 +1297 1336 4.657915058915501e-03 +1297 1337 -1.296759263271960e-02 +1297 1338 2.520055549235032e-03 +1297 1339 7.942152029251364e-03 +1297 1340 -9.824645887494973e-03 +1297 1341 4.192808171658150e-03 +1298 1306 -1.892021217766592e-01 +1298 1307 8.343268197451107e-01 +1298 1308 8.229048909617080e-01 +1298 1309 5.826103953348261e-02 +1298 1310 -1.439621421628995e-01 +1298 1311 3.112452985382569e-02 +1298 1312 7.670746208201273e-02 +1298 1313 2.293253914396385e-02 +1298 1314 -1.256361223272003e-02 +1298 1333 1.323313804878303e-02 +1298 1334 -2.096995323672021e-02 +1298 1335 -5.358173644527560e-02 +1298 1336 -1.476812971757920e-02 +1298 1337 4.062188650978137e-02 +1298 1338 -7.820632800320009e-03 +1298 1339 -2.448347659537347e-02 +1298 1340 3.015884103136381e-02 +1298 1341 -1.284443828279115e-02 +1299 1306 1.046612031640127e-01 +1299 1307 -2.881124078576537e-01 +1299 1308 3.642942065094310e-01 +1299 1309 1.002415479616464e+00 +1299 1310 5.323155226899952e-01 +1299 1311 -7.954492469654867e-02 +1299 1312 -1.711660602912905e-01 +1299 1313 -4.811885553863171e-02 +1299 1314 2.570767009641045e-02 +1299 1333 -2.757068474110300e-02 +1299 1334 4.265186386815178e-02 +1299 1335 1.051000962006396e-01 +1299 1336 2.793485847486072e-02 +1299 1337 -7.455725140302115e-02 +1299 1338 1.403341243148206e-02 +1299 1339 4.325121028990322e-02 +1299 1340 -5.276030473240920e-02 +1299 1341 2.236576952567728e-02 +1300 1306 -6.899335049541490e-02 +1300 1307 1.729389305228546e-01 +1300 1308 -1.632953212690478e-01 +1300 1309 -7.035531268752397e-02 +1300 1310 7.220650334136118e-01 +1300 1311 9.772041559577636e-01 +1300 1312 5.453324425206555e-01 +1300 1313 1.175590121763705e-01 +1300 1314 -5.755658390964827e-02 +1300 1333 6.565365744135691e-02 +1300 1334 -9.365152023069208e-02 +1300 1335 -2.071439731675966e-01 +1300 1336 -5.010677298616108e-02 +1300 1337 1.247251953696806e-01 +1300 1338 -2.237629970634502e-02 +1300 1339 -6.683554557781619e-02 +1300 1340 8.001126076632671e-02 +1300 1341 -3.362050583248455e-02 +1301 1306 4.811158329878761e-02 +1301 1307 -1.164268237939101e-01 +1301 1308 1.009370353828469e-01 +1301 1309 3.613279323195708e-02 +1301 1310 -2.263595638964284e-01 +1301 1311 1.124088651417514e-01 +1301 1312 7.109171977955336e-01 +1301 1313 9.801237676746007e-01 +1301 1314 9.932762028182606e-01 +1301 1333 9.932762028182608e-01 +1301 1334 9.801237676746006e-01 +1301 1335 7.109171977955339e-01 +1301 1336 1.124088651417514e-01 +1301 1337 -2.263595638964285e-01 +1301 1338 3.613279323195707e-02 +1301 1339 1.009370353828469e-01 +1301 1340 -1.164268237939100e-01 +1301 1341 4.811158329878761e-02 +1302 1306 -3.362050583248454e-02 +1302 1307 8.001126076632673e-02 +1302 1308 -6.683554557781621e-02 +1302 1309 -2.237629970634502e-02 +1302 1310 1.247251953696805e-01 +1302 1311 -5.010677298616108e-02 +1302 1312 -2.071439731675965e-01 +1302 1313 -9.365152023069209e-02 +1302 1314 6.565365744135690e-02 +1302 1333 -5.755658390964827e-02 +1302 1334 1.175590121763705e-01 +1302 1335 5.453324425206556e-01 +1302 1336 9.772041559577636e-01 +1302 1337 7.220650334136122e-01 +1302 1338 -7.035531268752394e-02 +1302 1339 -1.632953212690477e-01 +1302 1340 1.729389305228546e-01 +1302 1341 -6.899335049541490e-02 +1303 1306 2.236576952567727e-02 +1303 1307 -5.276030473240920e-02 +1303 1308 4.325121028990322e-02 +1303 1309 1.403341243148206e-02 +1303 1310 -7.455725140302112e-02 +1303 1311 2.793485847486071e-02 +1303 1312 1.051000962006396e-01 +1303 1313 4.265186386815178e-02 +1303 1314 -2.757068474110299e-02 +1303 1333 2.570767009641045e-02 +1303 1334 -4.811885553863170e-02 +1303 1335 -1.711660602912906e-01 +1303 1336 -7.954492469654866e-02 +1303 1337 5.323155226899953e-01 +1303 1338 1.002415479616464e+00 +1303 1339 3.642942065094308e-01 +1303 1340 -2.881124078576536e-01 +1303 1341 1.046612031640127e-01 +1304 1306 -1.284443828279115e-02 +1304 1307 3.015884103136382e-02 +1304 1308 -2.448347659537348e-02 +1304 1309 -7.820632800320013e-03 +1304 1310 4.062188650978136e-02 +1304 1311 -1.476812971757920e-02 +1304 1312 -5.358173644527559e-02 +1304 1313 -2.096995323672021e-02 +1304 1314 1.323313804878302e-02 +1304 1333 -1.256361223272003e-02 +1304 1334 2.293253914396384e-02 +1304 1335 7.670746208201275e-02 +1304 1336 3.112452985382569e-02 +1304 1337 -1.439621421628996e-01 +1304 1338 5.826103953348259e-02 +1304 1339 8.229048909617078e-01 +1304 1340 8.343268197451105e-01 +1304 1341 -1.892021217766592e-01 +1305 1306 4.192808171658150e-03 +1305 1307 -9.824645887494977e-03 +1305 1308 7.942152029251368e-03 +1305 1309 2.520055549235034e-03 +1305 1310 -1.296759263271960e-02 +1305 1311 4.657915058915502e-03 +1305 1312 1.666728813825644e-02 +1305 1313 6.437602044020781e-03 +1305 1314 -4.028549736136366e-03 +1305 1333 3.848762214796555e-03 +1305 1334 -6.964455901063737e-03 +1305 1335 -2.283271683293556e-02 +1305 1336 -8.910497086827958e-03 +1305 1337 3.811891211199980e-02 +1305 1338 -1.281053516843188e-02 +1305 1339 -8.471515173090287e-02 +1305 1340 3.496883302058122e-01 +1305 1341 1.125329052227214e+00 +1360 1369 1.125329052227214e+00 +1360 1370 3.496883302058122e-01 +1360 1371 -8.471515173090287e-02 +1360 1372 -1.281053516843188e-02 +1360 1373 3.811891211199978e-02 +1360 1374 -8.910497086827956e-03 +1360 1375 -2.283271683293555e-02 +1360 1376 -6.964455901063736e-03 +1360 1377 3.848762214796554e-03 +1360 1396 -4.028549736136366e-03 +1360 1397 6.437602044020779e-03 +1360 1398 1.666728813825643e-02 +1360 1399 4.657915058915501e-03 +1360 1400 -1.296759263271960e-02 +1360 1401 2.520055549235032e-03 +1360 1402 7.942152029251364e-03 +1360 1403 -9.824645887494973e-03 +1360 1404 4.192808171658150e-03 +1361 1369 -1.892021217766592e-01 +1361 1370 8.343268197451107e-01 +1361 1371 8.229048909617080e-01 +1361 1372 5.826103953348261e-02 +1361 1373 -1.439621421628995e-01 +1361 1374 3.112452985382569e-02 +1361 1375 7.670746208201273e-02 +1361 1376 2.293253914396385e-02 +1361 1377 -1.256361223272003e-02 +1361 1396 1.323313804878303e-02 +1361 1397 -2.096995323672021e-02 +1361 1398 -5.358173644527560e-02 +1361 1399 -1.476812971757920e-02 +1361 1400 4.062188650978137e-02 +1361 1401 -7.820632800320009e-03 +1361 1402 -2.448347659537347e-02 +1361 1403 3.015884103136381e-02 +1361 1404 -1.284443828279115e-02 +1362 1369 1.046612031640127e-01 +1362 1370 -2.881124078576537e-01 +1362 1371 3.642942065094310e-01 +1362 1372 1.002415479616464e+00 +1362 1373 5.323155226899952e-01 +1362 1374 -7.954492469654867e-02 +1362 1375 -1.711660602912905e-01 +1362 1376 -4.811885553863171e-02 +1362 1377 2.570767009641045e-02 +1362 1396 -2.757068474110300e-02 +1362 1397 4.265186386815178e-02 +1362 1398 1.051000962006396e-01 +1362 1399 2.793485847486072e-02 +1362 1400 -7.455725140302115e-02 +1362 1401 1.403341243148206e-02 +1362 1402 4.325121028990322e-02 +1362 1403 -5.276030473240920e-02 +1362 1404 2.236576952567728e-02 +1363 1369 -6.899335049541490e-02 +1363 1370 1.729389305228546e-01 +1363 1371 -1.632953212690478e-01 +1363 1372 -7.035531268752397e-02 +1363 1373 7.220650334136118e-01 +1363 1374 9.772041559577636e-01 +1363 1375 5.453324425206555e-01 +1363 1376 1.175590121763705e-01 +1363 1377 -5.755658390964827e-02 +1363 1396 6.565365744135691e-02 +1363 1397 -9.365152023069208e-02 +1363 1398 -2.071439731675966e-01 +1363 1399 -5.010677298616108e-02 +1363 1400 1.247251953696806e-01 +1363 1401 -2.237629970634502e-02 +1363 1402 -6.683554557781619e-02 +1363 1403 8.001126076632671e-02 +1363 1404 -3.362050583248455e-02 +1364 1369 4.811158329878761e-02 +1364 1370 -1.164268237939101e-01 +1364 1371 1.009370353828469e-01 +1364 1372 3.613279323195708e-02 +1364 1373 -2.263595638964284e-01 +1364 1374 1.124088651417514e-01 +1364 1375 7.109171977955336e-01 +1364 1376 9.801237676746007e-01 +1364 1377 9.932762028182606e-01 +1364 1396 9.932762028182608e-01 +1364 1397 9.801237676746006e-01 +1364 1398 7.109171977955339e-01 +1364 1399 1.124088651417514e-01 +1364 1400 -2.263595638964285e-01 +1364 1401 3.613279323195707e-02 +1364 1402 1.009370353828469e-01 +1364 1403 -1.164268237939100e-01 +1364 1404 4.811158329878761e-02 +1365 1369 -3.362050583248454e-02 +1365 1370 8.001126076632673e-02 +1365 1371 -6.683554557781621e-02 +1365 1372 -2.237629970634502e-02 +1365 1373 1.247251953696805e-01 +1365 1374 -5.010677298616108e-02 +1365 1375 -2.071439731675965e-01 +1365 1376 -9.365152023069209e-02 +1365 1377 6.565365744135690e-02 +1365 1396 -5.755658390964827e-02 +1365 1397 1.175590121763705e-01 +1365 1398 5.453324425206556e-01 +1365 1399 9.772041559577636e-01 +1365 1400 7.220650334136122e-01 +1365 1401 -7.035531268752394e-02 +1365 1402 -1.632953212690477e-01 +1365 1403 1.729389305228546e-01 +1365 1404 -6.899335049541490e-02 +1366 1369 2.236576952567727e-02 +1366 1370 -5.276030473240920e-02 +1366 1371 4.325121028990322e-02 +1366 1372 1.403341243148206e-02 +1366 1373 -7.455725140302112e-02 +1366 1374 2.793485847486071e-02 +1366 1375 1.051000962006396e-01 +1366 1376 4.265186386815178e-02 +1366 1377 -2.757068474110299e-02 +1366 1396 2.570767009641045e-02 +1366 1397 -4.811885553863170e-02 +1366 1398 -1.711660602912906e-01 +1366 1399 -7.954492469654866e-02 +1366 1400 5.323155226899953e-01 +1366 1401 1.002415479616464e+00 +1366 1402 3.642942065094308e-01 +1366 1403 -2.881124078576536e-01 +1366 1404 1.046612031640127e-01 +1367 1369 -1.284443828279115e-02 +1367 1370 3.015884103136382e-02 +1367 1371 -2.448347659537348e-02 +1367 1372 -7.820632800320013e-03 +1367 1373 4.062188650978136e-02 +1367 1374 -1.476812971757920e-02 +1367 1375 -5.358173644527559e-02 +1367 1376 -2.096995323672021e-02 +1367 1377 1.323313804878302e-02 +1367 1396 -1.256361223272003e-02 +1367 1397 2.293253914396384e-02 +1367 1398 7.670746208201275e-02 +1367 1399 3.112452985382569e-02 +1367 1400 -1.439621421628996e-01 +1367 1401 5.826103953348259e-02 +1367 1402 8.229048909617078e-01 +1367 1403 8.343268197451105e-01 +1367 1404 -1.892021217766592e-01 +1368 1369 4.192808171658150e-03 +1368 1370 -9.824645887494977e-03 +1368 1371 7.942152029251368e-03 +1368 1372 2.520055549235034e-03 +1368 1373 -1.296759263271960e-02 +1368 1374 4.657915058915502e-03 +1368 1375 1.666728813825644e-02 +1368 1376 6.437602044020781e-03 +1368 1377 -4.028549736136366e-03 +1368 1396 3.848762214796555e-03 +1368 1397 -6.964455901063737e-03 +1368 1398 -2.283271683293556e-02 +1368 1399 -8.910497086827958e-03 +1368 1400 3.811891211199980e-02 +1368 1401 -1.281053516843188e-02 +1368 1402 -8.471515173090287e-02 +1368 1403 3.496883302058122e-01 +1368 1404 1.125329052227214e+00 +1441 1450 1.125329052227214e+00 +1441 1451 3.496883302058122e-01 +1441 1452 -8.471515173090287e-02 +1441 1453 -1.281053516843188e-02 +1441 1454 3.811891211199978e-02 +1441 1455 -8.910497086827956e-03 +1441 1456 -2.283271683293555e-02 +1441 1457 -6.964455901063736e-03 +1441 1458 3.848762214796554e-03 +1441 1477 -4.028549736136366e-03 +1441 1478 6.437602044020779e-03 +1441 1479 1.666728813825643e-02 +1441 1480 4.657915058915501e-03 +1441 1481 -1.296759263271960e-02 +1441 1482 2.520055549235032e-03 +1441 1483 7.942152029251364e-03 +1441 1484 -9.824645887494973e-03 +1441 1485 4.192808171658150e-03 +1442 1450 -1.892021217766592e-01 +1442 1451 8.343268197451107e-01 +1442 1452 8.229048909617080e-01 +1442 1453 5.826103953348261e-02 +1442 1454 -1.439621421628995e-01 +1442 1455 3.112452985382569e-02 +1442 1456 7.670746208201273e-02 +1442 1457 2.293253914396385e-02 +1442 1458 -1.256361223272003e-02 +1442 1477 1.323313804878303e-02 +1442 1478 -2.096995323672021e-02 +1442 1479 -5.358173644527560e-02 +1442 1480 -1.476812971757920e-02 +1442 1481 4.062188650978137e-02 +1442 1482 -7.820632800320009e-03 +1442 1483 -2.448347659537347e-02 +1442 1484 3.015884103136381e-02 +1442 1485 -1.284443828279115e-02 +1443 1450 1.046612031640127e-01 +1443 1451 -2.881124078576537e-01 +1443 1452 3.642942065094310e-01 +1443 1453 1.002415479616464e+00 +1443 1454 5.323155226899952e-01 +1443 1455 -7.954492469654867e-02 +1443 1456 -1.711660602912905e-01 +1443 1457 -4.811885553863171e-02 +1443 1458 2.570767009641045e-02 +1443 1477 -2.757068474110300e-02 +1443 1478 4.265186386815178e-02 +1443 1479 1.051000962006396e-01 +1443 1480 2.793485847486072e-02 +1443 1481 -7.455725140302115e-02 +1443 1482 1.403341243148206e-02 +1443 1483 4.325121028990322e-02 +1443 1484 -5.276030473240920e-02 +1443 1485 2.236576952567728e-02 +1444 1450 -6.899335049541490e-02 +1444 1451 1.729389305228546e-01 +1444 1452 -1.632953212690478e-01 +1444 1453 -7.035531268752397e-02 +1444 1454 7.220650334136118e-01 +1444 1455 9.772041559577636e-01 +1444 1456 5.453324425206555e-01 +1444 1457 1.175590121763705e-01 +1444 1458 -5.755658390964827e-02 +1444 1477 6.565365744135691e-02 +1444 1478 -9.365152023069208e-02 +1444 1479 -2.071439731675966e-01 +1444 1480 -5.010677298616108e-02 +1444 1481 1.247251953696806e-01 +1444 1482 -2.237629970634502e-02 +1444 1483 -6.683554557781619e-02 +1444 1484 8.001126076632671e-02 +1444 1485 -3.362050583248455e-02 +1445 1450 4.811158329878761e-02 +1445 1451 -1.164268237939101e-01 +1445 1452 1.009370353828469e-01 +1445 1453 3.613279323195708e-02 +1445 1454 -2.263595638964284e-01 +1445 1455 1.124088651417514e-01 +1445 1456 7.109171977955336e-01 +1445 1457 9.801237676746007e-01 +1445 1458 9.932762028182606e-01 +1445 1477 9.932762028182608e-01 +1445 1478 9.801237676746006e-01 +1445 1479 7.109171977955339e-01 +1445 1480 1.124088651417514e-01 +1445 1481 -2.263595638964285e-01 +1445 1482 3.613279323195707e-02 +1445 1483 1.009370353828469e-01 +1445 1484 -1.164268237939100e-01 +1445 1485 4.811158329878761e-02 +1446 1450 -3.362050583248454e-02 +1446 1451 8.001126076632673e-02 +1446 1452 -6.683554557781621e-02 +1446 1453 -2.237629970634502e-02 +1446 1454 1.247251953696805e-01 +1446 1455 -5.010677298616108e-02 +1446 1456 -2.071439731675965e-01 +1446 1457 -9.365152023069209e-02 +1446 1458 6.565365744135690e-02 +1446 1477 -5.755658390964827e-02 +1446 1478 1.175590121763705e-01 +1446 1479 5.453324425206556e-01 +1446 1480 9.772041559577636e-01 +1446 1481 7.220650334136122e-01 +1446 1482 -7.035531268752394e-02 +1446 1483 -1.632953212690477e-01 +1446 1484 1.729389305228546e-01 +1446 1485 -6.899335049541490e-02 +1447 1450 2.236576952567727e-02 +1447 1451 -5.276030473240920e-02 +1447 1452 4.325121028990322e-02 +1447 1453 1.403341243148206e-02 +1447 1454 -7.455725140302112e-02 +1447 1455 2.793485847486071e-02 +1447 1456 1.051000962006396e-01 +1447 1457 4.265186386815178e-02 +1447 1458 -2.757068474110299e-02 +1447 1477 2.570767009641045e-02 +1447 1478 -4.811885553863170e-02 +1447 1479 -1.711660602912906e-01 +1447 1480 -7.954492469654866e-02 +1447 1481 5.323155226899953e-01 +1447 1482 1.002415479616464e+00 +1447 1483 3.642942065094308e-01 +1447 1484 -2.881124078576536e-01 +1447 1485 1.046612031640127e-01 +1448 1450 -1.284443828279115e-02 +1448 1451 3.015884103136382e-02 +1448 1452 -2.448347659537348e-02 +1448 1453 -7.820632800320013e-03 +1448 1454 4.062188650978136e-02 +1448 1455 -1.476812971757920e-02 +1448 1456 -5.358173644527559e-02 +1448 1457 -2.096995323672021e-02 +1448 1458 1.323313804878302e-02 +1448 1477 -1.256361223272003e-02 +1448 1478 2.293253914396384e-02 +1448 1479 7.670746208201275e-02 +1448 1480 3.112452985382569e-02 +1448 1481 -1.439621421628996e-01 +1448 1482 5.826103953348259e-02 +1448 1483 8.229048909617078e-01 +1448 1484 8.343268197451105e-01 +1448 1485 -1.892021217766592e-01 +1449 1450 4.192808171658150e-03 +1449 1451 -9.824645887494977e-03 +1449 1452 7.942152029251368e-03 +1449 1453 2.520055549235034e-03 +1449 1454 -1.296759263271960e-02 +1449 1455 4.657915058915502e-03 +1449 1456 1.666728813825644e-02 +1449 1457 6.437602044020781e-03 +1449 1458 -4.028549736136366e-03 +1449 1477 3.848762214796555e-03 +1449 1478 -6.964455901063737e-03 +1449 1479 -2.283271683293556e-02 +1449 1480 -8.910497086827958e-03 +1449 1481 3.811891211199980e-02 +1449 1482 -1.281053516843188e-02 +1449 1483 -8.471515173090287e-02 +1449 1484 3.496883302058122e-01 +1449 1485 1.125329052227214e+00 +1504 1513 1.125329052227214e+00 +1504 1514 3.496883302058122e-01 +1504 1515 -8.471515173090287e-02 +1504 1516 -1.281053516843188e-02 +1504 1517 3.811891211199978e-02 +1504 1518 -8.910497086827956e-03 +1504 1519 -2.283271683293555e-02 +1504 1520 -6.964455901063736e-03 +1504 1521 3.848762214796554e-03 +1504 1540 -4.028549736136366e-03 +1504 1541 6.437602044020779e-03 +1504 1542 1.666728813825643e-02 +1504 1543 4.657915058915501e-03 +1504 1544 -1.296759263271960e-02 +1504 1545 2.520055549235032e-03 +1504 1546 7.942152029251364e-03 +1504 1547 -9.824645887494973e-03 +1504 1548 4.192808171658150e-03 +1505 1513 -1.892021217766592e-01 +1505 1514 8.343268197451107e-01 +1505 1515 8.229048909617080e-01 +1505 1516 5.826103953348261e-02 +1505 1517 -1.439621421628995e-01 +1505 1518 3.112452985382569e-02 +1505 1519 7.670746208201273e-02 +1505 1520 2.293253914396385e-02 +1505 1521 -1.256361223272003e-02 +1505 1540 1.323313804878303e-02 +1505 1541 -2.096995323672021e-02 +1505 1542 -5.358173644527560e-02 +1505 1543 -1.476812971757920e-02 +1505 1544 4.062188650978137e-02 +1505 1545 -7.820632800320009e-03 +1505 1546 -2.448347659537347e-02 +1505 1547 3.015884103136381e-02 +1505 1548 -1.284443828279115e-02 +1506 1513 1.046612031640127e-01 +1506 1514 -2.881124078576537e-01 +1506 1515 3.642942065094310e-01 +1506 1516 1.002415479616464e+00 +1506 1517 5.323155226899952e-01 +1506 1518 -7.954492469654867e-02 +1506 1519 -1.711660602912905e-01 +1506 1520 -4.811885553863171e-02 +1506 1521 2.570767009641045e-02 +1506 1540 -2.757068474110300e-02 +1506 1541 4.265186386815178e-02 +1506 1542 1.051000962006396e-01 +1506 1543 2.793485847486072e-02 +1506 1544 -7.455725140302115e-02 +1506 1545 1.403341243148206e-02 +1506 1546 4.325121028990322e-02 +1506 1547 -5.276030473240920e-02 +1506 1548 2.236576952567728e-02 +1507 1513 -6.899335049541490e-02 +1507 1514 1.729389305228546e-01 +1507 1515 -1.632953212690478e-01 +1507 1516 -7.035531268752397e-02 +1507 1517 7.220650334136118e-01 +1507 1518 9.772041559577636e-01 +1507 1519 5.453324425206555e-01 +1507 1520 1.175590121763705e-01 +1507 1521 -5.755658390964827e-02 +1507 1540 6.565365744135691e-02 +1507 1541 -9.365152023069208e-02 +1507 1542 -2.071439731675966e-01 +1507 1543 -5.010677298616108e-02 +1507 1544 1.247251953696806e-01 +1507 1545 -2.237629970634502e-02 +1507 1546 -6.683554557781619e-02 +1507 1547 8.001126076632671e-02 +1507 1548 -3.362050583248455e-02 +1508 1513 4.811158329878761e-02 +1508 1514 -1.164268237939101e-01 +1508 1515 1.009370353828469e-01 +1508 1516 3.613279323195708e-02 +1508 1517 -2.263595638964284e-01 +1508 1518 1.124088651417514e-01 +1508 1519 7.109171977955336e-01 +1508 1520 9.801237676746007e-01 +1508 1521 9.932762028182606e-01 +1508 1540 9.932762028182608e-01 +1508 1541 9.801237676746006e-01 +1508 1542 7.109171977955339e-01 +1508 1543 1.124088651417514e-01 +1508 1544 -2.263595638964285e-01 +1508 1545 3.613279323195707e-02 +1508 1546 1.009370353828469e-01 +1508 1547 -1.164268237939100e-01 +1508 1548 4.811158329878761e-02 +1509 1513 -3.362050583248454e-02 +1509 1514 8.001126076632673e-02 +1509 1515 -6.683554557781621e-02 +1509 1516 -2.237629970634502e-02 +1509 1517 1.247251953696805e-01 +1509 1518 -5.010677298616108e-02 +1509 1519 -2.071439731675965e-01 +1509 1520 -9.365152023069209e-02 +1509 1521 6.565365744135690e-02 +1509 1540 -5.755658390964827e-02 +1509 1541 1.175590121763705e-01 +1509 1542 5.453324425206556e-01 +1509 1543 9.772041559577636e-01 +1509 1544 7.220650334136122e-01 +1509 1545 -7.035531268752394e-02 +1509 1546 -1.632953212690477e-01 +1509 1547 1.729389305228546e-01 +1509 1548 -6.899335049541490e-02 +1510 1513 2.236576952567727e-02 +1510 1514 -5.276030473240920e-02 +1510 1515 4.325121028990322e-02 +1510 1516 1.403341243148206e-02 +1510 1517 -7.455725140302112e-02 +1510 1518 2.793485847486071e-02 +1510 1519 1.051000962006396e-01 +1510 1520 4.265186386815178e-02 +1510 1521 -2.757068474110299e-02 +1510 1540 2.570767009641045e-02 +1510 1541 -4.811885553863170e-02 +1510 1542 -1.711660602912906e-01 +1510 1543 -7.954492469654866e-02 +1510 1544 5.323155226899953e-01 +1510 1545 1.002415479616464e+00 +1510 1546 3.642942065094308e-01 +1510 1547 -2.881124078576536e-01 +1510 1548 1.046612031640127e-01 +1511 1513 -1.284443828279115e-02 +1511 1514 3.015884103136382e-02 +1511 1515 -2.448347659537348e-02 +1511 1516 -7.820632800320013e-03 +1511 1517 4.062188650978136e-02 +1511 1518 -1.476812971757920e-02 +1511 1519 -5.358173644527559e-02 +1511 1520 -2.096995323672021e-02 +1511 1521 1.323313804878302e-02 +1511 1540 -1.256361223272003e-02 +1511 1541 2.293253914396384e-02 +1511 1542 7.670746208201275e-02 +1511 1543 3.112452985382569e-02 +1511 1544 -1.439621421628996e-01 +1511 1545 5.826103953348259e-02 +1511 1546 8.229048909617078e-01 +1511 1547 8.343268197451105e-01 +1511 1548 -1.892021217766592e-01 +1512 1513 4.192808171658150e-03 +1512 1514 -9.824645887494977e-03 +1512 1515 7.942152029251368e-03 +1512 1516 2.520055549235034e-03 +1512 1517 -1.296759263271960e-02 +1512 1518 4.657915058915502e-03 +1512 1519 1.666728813825644e-02 +1512 1520 6.437602044020781e-03 +1512 1521 -4.028549736136366e-03 +1512 1540 3.848762214796555e-03 +1512 1541 -6.964455901063737e-03 +1512 1542 -2.283271683293556e-02 +1512 1543 -8.910497086827958e-03 +1512 1544 3.811891211199980e-02 +1512 1545 -1.281053516843188e-02 +1512 1546 -8.471515173090287e-02 +1512 1547 3.496883302058122e-01 +1512 1548 1.125329052227214e+00 +1576 1585 1.125329052227214e+00 +1576 1586 3.496883302058122e-01 +1576 1587 -8.471515173090287e-02 +1576 1588 -1.281053516843188e-02 +1576 1589 3.811891211199978e-02 +1576 1590 -8.910497086827956e-03 +1576 1591 -2.283271683293555e-02 +1576 1592 -6.964455901063736e-03 +1576 1593 3.848762214796554e-03 +1576 1612 -4.028549736136366e-03 +1576 1613 6.437602044020779e-03 +1576 1614 1.666728813825643e-02 +1576 1615 4.657915058915501e-03 +1576 1616 -1.296759263271960e-02 +1576 1617 2.520055549235032e-03 +1576 1618 7.942152029251364e-03 +1576 1619 -9.824645887494973e-03 +1576 1620 4.192808171658150e-03 +1577 1585 -1.892021217766592e-01 +1577 1586 8.343268197451107e-01 +1577 1587 8.229048909617080e-01 +1577 1588 5.826103953348261e-02 +1577 1589 -1.439621421628995e-01 +1577 1590 3.112452985382569e-02 +1577 1591 7.670746208201273e-02 +1577 1592 2.293253914396385e-02 +1577 1593 -1.256361223272003e-02 +1577 1612 1.323313804878303e-02 +1577 1613 -2.096995323672021e-02 +1577 1614 -5.358173644527560e-02 +1577 1615 -1.476812971757920e-02 +1577 1616 4.062188650978137e-02 +1577 1617 -7.820632800320009e-03 +1577 1618 -2.448347659537347e-02 +1577 1619 3.015884103136381e-02 +1577 1620 -1.284443828279115e-02 +1578 1585 1.046612031640127e-01 +1578 1586 -2.881124078576537e-01 +1578 1587 3.642942065094310e-01 +1578 1588 1.002415479616464e+00 +1578 1589 5.323155226899952e-01 +1578 1590 -7.954492469654867e-02 +1578 1591 -1.711660602912905e-01 +1578 1592 -4.811885553863171e-02 +1578 1593 2.570767009641045e-02 +1578 1612 -2.757068474110300e-02 +1578 1613 4.265186386815178e-02 +1578 1614 1.051000962006396e-01 +1578 1615 2.793485847486072e-02 +1578 1616 -7.455725140302115e-02 +1578 1617 1.403341243148206e-02 +1578 1618 4.325121028990322e-02 +1578 1619 -5.276030473240920e-02 +1578 1620 2.236576952567728e-02 +1579 1585 -6.899335049541490e-02 +1579 1586 1.729389305228546e-01 +1579 1587 -1.632953212690478e-01 +1579 1588 -7.035531268752397e-02 +1579 1589 7.220650334136118e-01 +1579 1590 9.772041559577636e-01 +1579 1591 5.453324425206555e-01 +1579 1592 1.175590121763705e-01 +1579 1593 -5.755658390964827e-02 +1579 1612 6.565365744135691e-02 +1579 1613 -9.365152023069208e-02 +1579 1614 -2.071439731675966e-01 +1579 1615 -5.010677298616108e-02 +1579 1616 1.247251953696806e-01 +1579 1617 -2.237629970634502e-02 +1579 1618 -6.683554557781619e-02 +1579 1619 8.001126076632671e-02 +1579 1620 -3.362050583248455e-02 +1580 1585 4.811158329878761e-02 +1580 1586 -1.164268237939101e-01 +1580 1587 1.009370353828469e-01 +1580 1588 3.613279323195708e-02 +1580 1589 -2.263595638964284e-01 +1580 1590 1.124088651417514e-01 +1580 1591 7.109171977955336e-01 +1580 1592 9.801237676746007e-01 +1580 1593 9.932762028182606e-01 +1580 1612 9.932762028182608e-01 +1580 1613 9.801237676746006e-01 +1580 1614 7.109171977955339e-01 +1580 1615 1.124088651417514e-01 +1580 1616 -2.263595638964285e-01 +1580 1617 3.613279323195707e-02 +1580 1618 1.009370353828469e-01 +1580 1619 -1.164268237939100e-01 +1580 1620 4.811158329878761e-02 +1581 1585 -3.362050583248454e-02 +1581 1586 8.001126076632673e-02 +1581 1587 -6.683554557781621e-02 +1581 1588 -2.237629970634502e-02 +1581 1589 1.247251953696805e-01 +1581 1590 -5.010677298616108e-02 +1581 1591 -2.071439731675965e-01 +1581 1592 -9.365152023069209e-02 +1581 1593 6.565365744135690e-02 +1581 1612 -5.755658390964827e-02 +1581 1613 1.175590121763705e-01 +1581 1614 5.453324425206556e-01 +1581 1615 9.772041559577636e-01 +1581 1616 7.220650334136122e-01 +1581 1617 -7.035531268752394e-02 +1581 1618 -1.632953212690477e-01 +1581 1619 1.729389305228546e-01 +1581 1620 -6.899335049541490e-02 +1582 1585 2.236576952567727e-02 +1582 1586 -5.276030473240920e-02 +1582 1587 4.325121028990322e-02 +1582 1588 1.403341243148206e-02 +1582 1589 -7.455725140302112e-02 +1582 1590 2.793485847486071e-02 +1582 1591 1.051000962006396e-01 +1582 1592 4.265186386815178e-02 +1582 1593 -2.757068474110299e-02 +1582 1612 2.570767009641045e-02 +1582 1613 -4.811885553863170e-02 +1582 1614 -1.711660602912906e-01 +1582 1615 -7.954492469654866e-02 +1582 1616 5.323155226899953e-01 +1582 1617 1.002415479616464e+00 +1582 1618 3.642942065094308e-01 +1582 1619 -2.881124078576536e-01 +1582 1620 1.046612031640127e-01 +1583 1585 -1.284443828279115e-02 +1583 1586 3.015884103136382e-02 +1583 1587 -2.448347659537348e-02 +1583 1588 -7.820632800320013e-03 +1583 1589 4.062188650978136e-02 +1583 1590 -1.476812971757920e-02 +1583 1591 -5.358173644527559e-02 +1583 1592 -2.096995323672021e-02 +1583 1593 1.323313804878302e-02 +1583 1612 -1.256361223272003e-02 +1583 1613 2.293253914396384e-02 +1583 1614 7.670746208201275e-02 +1583 1615 3.112452985382569e-02 +1583 1616 -1.439621421628996e-01 +1583 1617 5.826103953348259e-02 +1583 1618 8.229048909617078e-01 +1583 1619 8.343268197451105e-01 +1583 1620 -1.892021217766592e-01 +1584 1585 4.192808171658150e-03 +1584 1586 -9.824645887494977e-03 +1584 1587 7.942152029251368e-03 +1584 1588 2.520055549235034e-03 +1584 1589 -1.296759263271960e-02 +1584 1590 4.657915058915502e-03 +1584 1591 1.666728813825644e-02 +1584 1592 6.437602044020781e-03 +1584 1593 -4.028549736136366e-03 +1584 1612 3.848762214796555e-03 +1584 1613 -6.964455901063737e-03 +1584 1614 -2.283271683293556e-02 +1584 1615 -8.910497086827958e-03 +1584 1616 3.811891211199980e-02 +1584 1617 -1.281053516843188e-02 +1584 1618 -8.471515173090287e-02 +1584 1619 3.496883302058122e-01 +1584 1620 1.125329052227214e+00 +1639 1648 1.125329052227214e+00 +1639 1649 3.496883302058122e-01 +1639 1650 -8.471515173090287e-02 +1639 1651 -1.281053516843188e-02 +1639 1652 3.811891211199978e-02 +1639 1653 -8.910497086827956e-03 +1639 1654 -2.283271683293555e-02 +1639 1655 -6.964455901063736e-03 +1639 1656 3.848762214796554e-03 +1639 1675 -4.028549736136366e-03 +1639 1676 6.437602044020779e-03 +1639 1677 1.666728813825643e-02 +1639 1678 4.657915058915501e-03 +1639 1679 -1.296759263271960e-02 +1639 1680 2.520055549235032e-03 +1639 1681 7.942152029251364e-03 +1639 1682 -9.824645887494973e-03 +1639 1683 4.192808171658150e-03 +1640 1648 -1.892021217766592e-01 +1640 1649 8.343268197451107e-01 +1640 1650 8.229048909617080e-01 +1640 1651 5.826103953348261e-02 +1640 1652 -1.439621421628995e-01 +1640 1653 3.112452985382569e-02 +1640 1654 7.670746208201273e-02 +1640 1655 2.293253914396385e-02 +1640 1656 -1.256361223272003e-02 +1640 1675 1.323313804878303e-02 +1640 1676 -2.096995323672021e-02 +1640 1677 -5.358173644527560e-02 +1640 1678 -1.476812971757920e-02 +1640 1679 4.062188650978137e-02 +1640 1680 -7.820632800320009e-03 +1640 1681 -2.448347659537347e-02 +1640 1682 3.015884103136381e-02 +1640 1683 -1.284443828279115e-02 +1641 1648 1.046612031640127e-01 +1641 1649 -2.881124078576537e-01 +1641 1650 3.642942065094310e-01 +1641 1651 1.002415479616464e+00 +1641 1652 5.323155226899952e-01 +1641 1653 -7.954492469654867e-02 +1641 1654 -1.711660602912905e-01 +1641 1655 -4.811885553863171e-02 +1641 1656 2.570767009641045e-02 +1641 1675 -2.757068474110300e-02 +1641 1676 4.265186386815178e-02 +1641 1677 1.051000962006396e-01 +1641 1678 2.793485847486072e-02 +1641 1679 -7.455725140302115e-02 +1641 1680 1.403341243148206e-02 +1641 1681 4.325121028990322e-02 +1641 1682 -5.276030473240920e-02 +1641 1683 2.236576952567728e-02 +1642 1648 -6.899335049541490e-02 +1642 1649 1.729389305228546e-01 +1642 1650 -1.632953212690478e-01 +1642 1651 -7.035531268752397e-02 +1642 1652 7.220650334136118e-01 +1642 1653 9.772041559577636e-01 +1642 1654 5.453324425206555e-01 +1642 1655 1.175590121763705e-01 +1642 1656 -5.755658390964827e-02 +1642 1675 6.565365744135691e-02 +1642 1676 -9.365152023069208e-02 +1642 1677 -2.071439731675966e-01 +1642 1678 -5.010677298616108e-02 +1642 1679 1.247251953696806e-01 +1642 1680 -2.237629970634502e-02 +1642 1681 -6.683554557781619e-02 +1642 1682 8.001126076632671e-02 +1642 1683 -3.362050583248455e-02 +1643 1648 4.811158329878761e-02 +1643 1649 -1.164268237939101e-01 +1643 1650 1.009370353828469e-01 +1643 1651 3.613279323195708e-02 +1643 1652 -2.263595638964284e-01 +1643 1653 1.124088651417514e-01 +1643 1654 7.109171977955336e-01 +1643 1655 9.801237676746007e-01 +1643 1656 9.932762028182606e-01 +1643 1675 9.932762028182608e-01 +1643 1676 9.801237676746006e-01 +1643 1677 7.109171977955339e-01 +1643 1678 1.124088651417514e-01 +1643 1679 -2.263595638964285e-01 +1643 1680 3.613279323195707e-02 +1643 1681 1.009370353828469e-01 +1643 1682 -1.164268237939100e-01 +1643 1683 4.811158329878761e-02 +1644 1648 -3.362050583248454e-02 +1644 1649 8.001126076632673e-02 +1644 1650 -6.683554557781621e-02 +1644 1651 -2.237629970634502e-02 +1644 1652 1.247251953696805e-01 +1644 1653 -5.010677298616108e-02 +1644 1654 -2.071439731675965e-01 +1644 1655 -9.365152023069209e-02 +1644 1656 6.565365744135690e-02 +1644 1675 -5.755658390964827e-02 +1644 1676 1.175590121763705e-01 +1644 1677 5.453324425206556e-01 +1644 1678 9.772041559577636e-01 +1644 1679 7.220650334136122e-01 +1644 1680 -7.035531268752394e-02 +1644 1681 -1.632953212690477e-01 +1644 1682 1.729389305228546e-01 +1644 1683 -6.899335049541490e-02 +1645 1648 2.236576952567727e-02 +1645 1649 -5.276030473240920e-02 +1645 1650 4.325121028990322e-02 +1645 1651 1.403341243148206e-02 +1645 1652 -7.455725140302112e-02 +1645 1653 2.793485847486071e-02 +1645 1654 1.051000962006396e-01 +1645 1655 4.265186386815178e-02 +1645 1656 -2.757068474110299e-02 +1645 1675 2.570767009641045e-02 +1645 1676 -4.811885553863170e-02 +1645 1677 -1.711660602912906e-01 +1645 1678 -7.954492469654866e-02 +1645 1679 5.323155226899953e-01 +1645 1680 1.002415479616464e+00 +1645 1681 3.642942065094308e-01 +1645 1682 -2.881124078576536e-01 +1645 1683 1.046612031640127e-01 +1646 1648 -1.284443828279115e-02 +1646 1649 3.015884103136382e-02 +1646 1650 -2.448347659537348e-02 +1646 1651 -7.820632800320013e-03 +1646 1652 4.062188650978136e-02 +1646 1653 -1.476812971757920e-02 +1646 1654 -5.358173644527559e-02 +1646 1655 -2.096995323672021e-02 +1646 1656 1.323313804878302e-02 +1646 1675 -1.256361223272003e-02 +1646 1676 2.293253914396384e-02 +1646 1677 7.670746208201275e-02 +1646 1678 3.112452985382569e-02 +1646 1679 -1.439621421628996e-01 +1646 1680 5.826103953348259e-02 +1646 1681 8.229048909617078e-01 +1646 1682 8.343268197451105e-01 +1646 1683 -1.892021217766592e-01 +1647 1648 4.192808171658150e-03 +1647 1649 -9.824645887494977e-03 +1647 1650 7.942152029251368e-03 +1647 1651 2.520055549235034e-03 +1647 1652 -1.296759263271960e-02 +1647 1653 4.657915058915502e-03 +1647 1654 1.666728813825644e-02 +1647 1655 6.437602044020781e-03 +1647 1656 -4.028549736136366e-03 +1647 1675 3.848762214796555e-03 +1647 1676 -6.964455901063737e-03 +1647 1677 -2.283271683293556e-02 +1647 1678 -8.910497086827958e-03 +1647 1679 3.811891211199980e-02 +1647 1680 -1.281053516843188e-02 +1647 1681 -8.471515173090287e-02 +1647 1682 3.496883302058122e-01 +1647 1683 1.125329052227214e+00 +1729 1738 1.125329052227214e+00 +1729 1739 3.496883302058122e-01 +1729 1740 -8.471515173090287e-02 +1729 1741 -1.281053516843188e-02 +1729 1742 3.811891211199978e-02 +1729 1743 -8.910497086827956e-03 +1729 1744 -2.283271683293555e-02 +1729 1745 -6.964455901063736e-03 +1729 1746 3.848762214796554e-03 +1729 1765 -4.028549736136366e-03 +1729 1766 6.437602044020779e-03 +1729 1767 1.666728813825643e-02 +1729 1768 4.657915058915501e-03 +1729 1769 -1.296759263271960e-02 +1729 1770 2.520055549235032e-03 +1729 1771 7.942152029251364e-03 +1729 1772 -9.824645887494973e-03 +1729 1773 4.192808171658150e-03 +1730 1738 -1.892021217766592e-01 +1730 1739 8.343268197451107e-01 +1730 1740 8.229048909617080e-01 +1730 1741 5.826103953348261e-02 +1730 1742 -1.439621421628995e-01 +1730 1743 3.112452985382569e-02 +1730 1744 7.670746208201273e-02 +1730 1745 2.293253914396385e-02 +1730 1746 -1.256361223272003e-02 +1730 1765 1.323313804878303e-02 +1730 1766 -2.096995323672021e-02 +1730 1767 -5.358173644527560e-02 +1730 1768 -1.476812971757920e-02 +1730 1769 4.062188650978137e-02 +1730 1770 -7.820632800320009e-03 +1730 1771 -2.448347659537347e-02 +1730 1772 3.015884103136381e-02 +1730 1773 -1.284443828279115e-02 +1731 1738 1.046612031640127e-01 +1731 1739 -2.881124078576537e-01 +1731 1740 3.642942065094310e-01 +1731 1741 1.002415479616464e+00 +1731 1742 5.323155226899952e-01 +1731 1743 -7.954492469654867e-02 +1731 1744 -1.711660602912905e-01 +1731 1745 -4.811885553863171e-02 +1731 1746 2.570767009641045e-02 +1731 1765 -2.757068474110300e-02 +1731 1766 4.265186386815178e-02 +1731 1767 1.051000962006396e-01 +1731 1768 2.793485847486072e-02 +1731 1769 -7.455725140302115e-02 +1731 1770 1.403341243148206e-02 +1731 1771 4.325121028990322e-02 +1731 1772 -5.276030473240920e-02 +1731 1773 2.236576952567728e-02 +1732 1738 -6.899335049541490e-02 +1732 1739 1.729389305228546e-01 +1732 1740 -1.632953212690478e-01 +1732 1741 -7.035531268752397e-02 +1732 1742 7.220650334136118e-01 +1732 1743 9.772041559577636e-01 +1732 1744 5.453324425206555e-01 +1732 1745 1.175590121763705e-01 +1732 1746 -5.755658390964827e-02 +1732 1765 6.565365744135691e-02 +1732 1766 -9.365152023069208e-02 +1732 1767 -2.071439731675966e-01 +1732 1768 -5.010677298616108e-02 +1732 1769 1.247251953696806e-01 +1732 1770 -2.237629970634502e-02 +1732 1771 -6.683554557781619e-02 +1732 1772 8.001126076632671e-02 +1732 1773 -3.362050583248455e-02 +1733 1738 4.811158329878761e-02 +1733 1739 -1.164268237939101e-01 +1733 1740 1.009370353828469e-01 +1733 1741 3.613279323195708e-02 +1733 1742 -2.263595638964284e-01 +1733 1743 1.124088651417514e-01 +1733 1744 7.109171977955336e-01 +1733 1745 9.801237676746007e-01 +1733 1746 9.932762028182606e-01 +1733 1765 9.932762028182608e-01 +1733 1766 9.801237676746006e-01 +1733 1767 7.109171977955339e-01 +1733 1768 1.124088651417514e-01 +1733 1769 -2.263595638964285e-01 +1733 1770 3.613279323195707e-02 +1733 1771 1.009370353828469e-01 +1733 1772 -1.164268237939100e-01 +1733 1773 4.811158329878761e-02 +1734 1738 -3.362050583248454e-02 +1734 1739 8.001126076632673e-02 +1734 1740 -6.683554557781621e-02 +1734 1741 -2.237629970634502e-02 +1734 1742 1.247251953696805e-01 +1734 1743 -5.010677298616108e-02 +1734 1744 -2.071439731675965e-01 +1734 1745 -9.365152023069209e-02 +1734 1746 6.565365744135690e-02 +1734 1765 -5.755658390964827e-02 +1734 1766 1.175590121763705e-01 +1734 1767 5.453324425206556e-01 +1734 1768 9.772041559577636e-01 +1734 1769 7.220650334136122e-01 +1734 1770 -7.035531268752394e-02 +1734 1771 -1.632953212690477e-01 +1734 1772 1.729389305228546e-01 +1734 1773 -6.899335049541490e-02 +1735 1738 2.236576952567727e-02 +1735 1739 -5.276030473240920e-02 +1735 1740 4.325121028990322e-02 +1735 1741 1.403341243148206e-02 +1735 1742 -7.455725140302112e-02 +1735 1743 2.793485847486071e-02 +1735 1744 1.051000962006396e-01 +1735 1745 4.265186386815178e-02 +1735 1746 -2.757068474110299e-02 +1735 1765 2.570767009641045e-02 +1735 1766 -4.811885553863170e-02 +1735 1767 -1.711660602912906e-01 +1735 1768 -7.954492469654866e-02 +1735 1769 5.323155226899953e-01 +1735 1770 1.002415479616464e+00 +1735 1771 3.642942065094308e-01 +1735 1772 -2.881124078576536e-01 +1735 1773 1.046612031640127e-01 +1736 1738 -1.284443828279115e-02 +1736 1739 3.015884103136382e-02 +1736 1740 -2.448347659537348e-02 +1736 1741 -7.820632800320013e-03 +1736 1742 4.062188650978136e-02 +1736 1743 -1.476812971757920e-02 +1736 1744 -5.358173644527559e-02 +1736 1745 -2.096995323672021e-02 +1736 1746 1.323313804878302e-02 +1736 1765 -1.256361223272003e-02 +1736 1766 2.293253914396384e-02 +1736 1767 7.670746208201275e-02 +1736 1768 3.112452985382569e-02 +1736 1769 -1.439621421628996e-01 +1736 1770 5.826103953348259e-02 +1736 1771 8.229048909617078e-01 +1736 1772 8.343268197451105e-01 +1736 1773 -1.892021217766592e-01 +1737 1738 4.192808171658150e-03 +1737 1739 -9.824645887494977e-03 +1737 1740 7.942152029251368e-03 +1737 1741 2.520055549235034e-03 +1737 1742 -1.296759263271960e-02 +1737 1743 4.657915058915502e-03 +1737 1744 1.666728813825644e-02 +1737 1745 6.437602044020781e-03 +1737 1746 -4.028549736136366e-03 +1737 1765 3.848762214796555e-03 +1737 1766 -6.964455901063737e-03 +1737 1767 -2.283271683293556e-02 +1737 1768 -8.910497086827958e-03 +1737 1769 3.811891211199980e-02 +1737 1770 -1.281053516843188e-02 +1737 1771 -8.471515173090287e-02 +1737 1772 3.496883302058122e-01 +1737 1773 1.125329052227214e+00 +1792 1801 1.125329052227214e+00 +1792 1802 3.496883302058122e-01 +1792 1803 -8.471515173090287e-02 +1792 1804 -1.281053516843188e-02 +1792 1805 3.811891211199978e-02 +1792 1806 -8.910497086827956e-03 +1792 1807 -2.283271683293555e-02 +1792 1808 -6.964455901063736e-03 +1792 1809 3.848762214796554e-03 +1792 1828 -4.028549736136366e-03 +1792 1829 6.437602044020779e-03 +1792 1830 1.666728813825643e-02 +1792 1831 4.657915058915501e-03 +1792 1832 -1.296759263271960e-02 +1792 1833 2.520055549235032e-03 +1792 1834 7.942152029251364e-03 +1792 1835 -9.824645887494973e-03 +1792 1836 4.192808171658150e-03 +1793 1801 -1.892021217766592e-01 +1793 1802 8.343268197451107e-01 +1793 1803 8.229048909617080e-01 +1793 1804 5.826103953348261e-02 +1793 1805 -1.439621421628995e-01 +1793 1806 3.112452985382569e-02 +1793 1807 7.670746208201273e-02 +1793 1808 2.293253914396385e-02 +1793 1809 -1.256361223272003e-02 +1793 1828 1.323313804878303e-02 +1793 1829 -2.096995323672021e-02 +1793 1830 -5.358173644527560e-02 +1793 1831 -1.476812971757920e-02 +1793 1832 4.062188650978137e-02 +1793 1833 -7.820632800320009e-03 +1793 1834 -2.448347659537347e-02 +1793 1835 3.015884103136381e-02 +1793 1836 -1.284443828279115e-02 +1794 1801 1.046612031640127e-01 +1794 1802 -2.881124078576537e-01 +1794 1803 3.642942065094310e-01 +1794 1804 1.002415479616464e+00 +1794 1805 5.323155226899952e-01 +1794 1806 -7.954492469654867e-02 +1794 1807 -1.711660602912905e-01 +1794 1808 -4.811885553863171e-02 +1794 1809 2.570767009641045e-02 +1794 1828 -2.757068474110300e-02 +1794 1829 4.265186386815178e-02 +1794 1830 1.051000962006396e-01 +1794 1831 2.793485847486072e-02 +1794 1832 -7.455725140302115e-02 +1794 1833 1.403341243148206e-02 +1794 1834 4.325121028990322e-02 +1794 1835 -5.276030473240920e-02 +1794 1836 2.236576952567728e-02 +1795 1801 -6.899335049541490e-02 +1795 1802 1.729389305228546e-01 +1795 1803 -1.632953212690478e-01 +1795 1804 -7.035531268752397e-02 +1795 1805 7.220650334136118e-01 +1795 1806 9.772041559577636e-01 +1795 1807 5.453324425206555e-01 +1795 1808 1.175590121763705e-01 +1795 1809 -5.755658390964827e-02 +1795 1828 6.565365744135691e-02 +1795 1829 -9.365152023069208e-02 +1795 1830 -2.071439731675966e-01 +1795 1831 -5.010677298616108e-02 +1795 1832 1.247251953696806e-01 +1795 1833 -2.237629970634502e-02 +1795 1834 -6.683554557781619e-02 +1795 1835 8.001126076632671e-02 +1795 1836 -3.362050583248455e-02 +1796 1801 4.811158329878761e-02 +1796 1802 -1.164268237939101e-01 +1796 1803 1.009370353828469e-01 +1796 1804 3.613279323195708e-02 +1796 1805 -2.263595638964284e-01 +1796 1806 1.124088651417514e-01 +1796 1807 7.109171977955336e-01 +1796 1808 9.801237676746007e-01 +1796 1809 9.932762028182606e-01 +1796 1828 9.932762028182608e-01 +1796 1829 9.801237676746006e-01 +1796 1830 7.109171977955339e-01 +1796 1831 1.124088651417514e-01 +1796 1832 -2.263595638964285e-01 +1796 1833 3.613279323195707e-02 +1796 1834 1.009370353828469e-01 +1796 1835 -1.164268237939100e-01 +1796 1836 4.811158329878761e-02 +1797 1801 -3.362050583248454e-02 +1797 1802 8.001126076632673e-02 +1797 1803 -6.683554557781621e-02 +1797 1804 -2.237629970634502e-02 +1797 1805 1.247251953696805e-01 +1797 1806 -5.010677298616108e-02 +1797 1807 -2.071439731675965e-01 +1797 1808 -9.365152023069209e-02 +1797 1809 6.565365744135690e-02 +1797 1828 -5.755658390964827e-02 +1797 1829 1.175590121763705e-01 +1797 1830 5.453324425206556e-01 +1797 1831 9.772041559577636e-01 +1797 1832 7.220650334136122e-01 +1797 1833 -7.035531268752394e-02 +1797 1834 -1.632953212690477e-01 +1797 1835 1.729389305228546e-01 +1797 1836 -6.899335049541490e-02 +1798 1801 2.236576952567727e-02 +1798 1802 -5.276030473240920e-02 +1798 1803 4.325121028990322e-02 +1798 1804 1.403341243148206e-02 +1798 1805 -7.455725140302112e-02 +1798 1806 2.793485847486071e-02 +1798 1807 1.051000962006396e-01 +1798 1808 4.265186386815178e-02 +1798 1809 -2.757068474110299e-02 +1798 1828 2.570767009641045e-02 +1798 1829 -4.811885553863170e-02 +1798 1830 -1.711660602912906e-01 +1798 1831 -7.954492469654866e-02 +1798 1832 5.323155226899953e-01 +1798 1833 1.002415479616464e+00 +1798 1834 3.642942065094308e-01 +1798 1835 -2.881124078576536e-01 +1798 1836 1.046612031640127e-01 +1799 1801 -1.284443828279115e-02 +1799 1802 3.015884103136382e-02 +1799 1803 -2.448347659537348e-02 +1799 1804 -7.820632800320013e-03 +1799 1805 4.062188650978136e-02 +1799 1806 -1.476812971757920e-02 +1799 1807 -5.358173644527559e-02 +1799 1808 -2.096995323672021e-02 +1799 1809 1.323313804878302e-02 +1799 1828 -1.256361223272003e-02 +1799 1829 2.293253914396384e-02 +1799 1830 7.670746208201275e-02 +1799 1831 3.112452985382569e-02 +1799 1832 -1.439621421628996e-01 +1799 1833 5.826103953348259e-02 +1799 1834 8.229048909617078e-01 +1799 1835 8.343268197451105e-01 +1799 1836 -1.892021217766592e-01 +1800 1801 4.192808171658150e-03 +1800 1802 -9.824645887494977e-03 +1800 1803 7.942152029251368e-03 +1800 1804 2.520055549235034e-03 +1800 1805 -1.296759263271960e-02 +1800 1806 4.657915058915502e-03 +1800 1807 1.666728813825644e-02 +1800 1808 6.437602044020781e-03 +1800 1809 -4.028549736136366e-03 +1800 1828 3.848762214796555e-03 +1800 1829 -6.964455901063737e-03 +1800 1830 -2.283271683293556e-02 +1800 1831 -8.910497086827958e-03 +1800 1832 3.811891211199980e-02 +1800 1833 -1.281053516843188e-02 +1800 1834 -8.471515173090287e-02 +1800 1835 3.496883302058122e-01 +1800 1836 1.125329052227214e+00 +1864 1873 1.125329052227214e+00 +1864 1874 3.496883302058122e-01 +1864 1875 -8.471515173090287e-02 +1864 1876 -1.281053516843188e-02 +1864 1877 3.811891211199978e-02 +1864 1878 -8.910497086827956e-03 +1864 1879 -2.283271683293555e-02 +1864 1880 -6.964455901063736e-03 +1864 1881 3.848762214796554e-03 +1864 1900 -4.028549736136366e-03 +1864 1901 6.437602044020779e-03 +1864 1902 1.666728813825643e-02 +1864 1903 4.657915058915501e-03 +1864 1904 -1.296759263271960e-02 +1864 1905 2.520055549235032e-03 +1864 1906 7.942152029251364e-03 +1864 1907 -9.824645887494973e-03 +1864 1908 4.192808171658150e-03 +1865 1873 -1.892021217766592e-01 +1865 1874 8.343268197451107e-01 +1865 1875 8.229048909617080e-01 +1865 1876 5.826103953348261e-02 +1865 1877 -1.439621421628995e-01 +1865 1878 3.112452985382569e-02 +1865 1879 7.670746208201273e-02 +1865 1880 2.293253914396385e-02 +1865 1881 -1.256361223272003e-02 +1865 1900 1.323313804878303e-02 +1865 1901 -2.096995323672021e-02 +1865 1902 -5.358173644527560e-02 +1865 1903 -1.476812971757920e-02 +1865 1904 4.062188650978137e-02 +1865 1905 -7.820632800320009e-03 +1865 1906 -2.448347659537347e-02 +1865 1907 3.015884103136381e-02 +1865 1908 -1.284443828279115e-02 +1866 1873 1.046612031640127e-01 +1866 1874 -2.881124078576537e-01 +1866 1875 3.642942065094310e-01 +1866 1876 1.002415479616464e+00 +1866 1877 5.323155226899952e-01 +1866 1878 -7.954492469654867e-02 +1866 1879 -1.711660602912905e-01 +1866 1880 -4.811885553863171e-02 +1866 1881 2.570767009641045e-02 +1866 1900 -2.757068474110300e-02 +1866 1901 4.265186386815178e-02 +1866 1902 1.051000962006396e-01 +1866 1903 2.793485847486072e-02 +1866 1904 -7.455725140302115e-02 +1866 1905 1.403341243148206e-02 +1866 1906 4.325121028990322e-02 +1866 1907 -5.276030473240920e-02 +1866 1908 2.236576952567728e-02 +1867 1873 -6.899335049541490e-02 +1867 1874 1.729389305228546e-01 +1867 1875 -1.632953212690478e-01 +1867 1876 -7.035531268752397e-02 +1867 1877 7.220650334136118e-01 +1867 1878 9.772041559577636e-01 +1867 1879 5.453324425206555e-01 +1867 1880 1.175590121763705e-01 +1867 1881 -5.755658390964827e-02 +1867 1900 6.565365744135691e-02 +1867 1901 -9.365152023069208e-02 +1867 1902 -2.071439731675966e-01 +1867 1903 -5.010677298616108e-02 +1867 1904 1.247251953696806e-01 +1867 1905 -2.237629970634502e-02 +1867 1906 -6.683554557781619e-02 +1867 1907 8.001126076632671e-02 +1867 1908 -3.362050583248455e-02 +1868 1873 4.811158329878761e-02 +1868 1874 -1.164268237939101e-01 +1868 1875 1.009370353828469e-01 +1868 1876 3.613279323195708e-02 +1868 1877 -2.263595638964284e-01 +1868 1878 1.124088651417514e-01 +1868 1879 7.109171977955336e-01 +1868 1880 9.801237676746007e-01 +1868 1881 9.932762028182606e-01 +1868 1900 9.932762028182608e-01 +1868 1901 9.801237676746006e-01 +1868 1902 7.109171977955339e-01 +1868 1903 1.124088651417514e-01 +1868 1904 -2.263595638964285e-01 +1868 1905 3.613279323195707e-02 +1868 1906 1.009370353828469e-01 +1868 1907 -1.164268237939100e-01 +1868 1908 4.811158329878761e-02 +1869 1873 -3.362050583248454e-02 +1869 1874 8.001126076632673e-02 +1869 1875 -6.683554557781621e-02 +1869 1876 -2.237629970634502e-02 +1869 1877 1.247251953696805e-01 +1869 1878 -5.010677298616108e-02 +1869 1879 -2.071439731675965e-01 +1869 1880 -9.365152023069209e-02 +1869 1881 6.565365744135690e-02 +1869 1900 -5.755658390964827e-02 +1869 1901 1.175590121763705e-01 +1869 1902 5.453324425206556e-01 +1869 1903 9.772041559577636e-01 +1869 1904 7.220650334136122e-01 +1869 1905 -7.035531268752394e-02 +1869 1906 -1.632953212690477e-01 +1869 1907 1.729389305228546e-01 +1869 1908 -6.899335049541490e-02 +1870 1873 2.236576952567727e-02 +1870 1874 -5.276030473240920e-02 +1870 1875 4.325121028990322e-02 +1870 1876 1.403341243148206e-02 +1870 1877 -7.455725140302112e-02 +1870 1878 2.793485847486071e-02 +1870 1879 1.051000962006396e-01 +1870 1880 4.265186386815178e-02 +1870 1881 -2.757068474110299e-02 +1870 1900 2.570767009641045e-02 +1870 1901 -4.811885553863170e-02 +1870 1902 -1.711660602912906e-01 +1870 1903 -7.954492469654866e-02 +1870 1904 5.323155226899953e-01 +1870 1905 1.002415479616464e+00 +1870 1906 3.642942065094308e-01 +1870 1907 -2.881124078576536e-01 +1870 1908 1.046612031640127e-01 +1871 1873 -1.284443828279115e-02 +1871 1874 3.015884103136382e-02 +1871 1875 -2.448347659537348e-02 +1871 1876 -7.820632800320013e-03 +1871 1877 4.062188650978136e-02 +1871 1878 -1.476812971757920e-02 +1871 1879 -5.358173644527559e-02 +1871 1880 -2.096995323672021e-02 +1871 1881 1.323313804878302e-02 +1871 1900 -1.256361223272003e-02 +1871 1901 2.293253914396384e-02 +1871 1902 7.670746208201275e-02 +1871 1903 3.112452985382569e-02 +1871 1904 -1.439621421628996e-01 +1871 1905 5.826103953348259e-02 +1871 1906 8.229048909617078e-01 +1871 1907 8.343268197451105e-01 +1871 1908 -1.892021217766592e-01 +1872 1873 4.192808171658150e-03 +1872 1874 -9.824645887494977e-03 +1872 1875 7.942152029251368e-03 +1872 1876 2.520055549235034e-03 +1872 1877 -1.296759263271960e-02 +1872 1878 4.657915058915502e-03 +1872 1879 1.666728813825644e-02 +1872 1880 6.437602044020781e-03 +1872 1881 -4.028549736136366e-03 +1872 1900 3.848762214796555e-03 +1872 1901 -6.964455901063737e-03 +1872 1902 -2.283271683293556e-02 +1872 1903 -8.910497086827958e-03 +1872 1904 3.811891211199980e-02 +1872 1905 -1.281053516843188e-02 +1872 1906 -8.471515173090287e-02 +1872 1907 3.496883302058122e-01 +1872 1908 1.125329052227214e+00 +1927 1936 1.125329052227214e+00 +1927 1937 3.496883302058122e-01 +1927 1938 -8.471515173090287e-02 +1927 1939 -1.281053516843188e-02 +1927 1940 3.811891211199978e-02 +1927 1941 -8.910497086827956e-03 +1927 1942 -2.283271683293555e-02 +1927 1943 -6.964455901063736e-03 +1927 1944 3.848762214796554e-03 +1927 1963 -4.028549736136366e-03 +1927 1964 6.437602044020779e-03 +1927 1965 1.666728813825643e-02 +1927 1966 4.657915058915501e-03 +1927 1967 -1.296759263271960e-02 +1927 1968 2.520055549235032e-03 +1927 1969 7.942152029251364e-03 +1927 1970 -9.824645887494973e-03 +1927 1971 4.192808171658150e-03 +1928 1936 -1.892021217766592e-01 +1928 1937 8.343268197451107e-01 +1928 1938 8.229048909617080e-01 +1928 1939 5.826103953348261e-02 +1928 1940 -1.439621421628995e-01 +1928 1941 3.112452985382569e-02 +1928 1942 7.670746208201273e-02 +1928 1943 2.293253914396385e-02 +1928 1944 -1.256361223272003e-02 +1928 1963 1.323313804878303e-02 +1928 1964 -2.096995323672021e-02 +1928 1965 -5.358173644527560e-02 +1928 1966 -1.476812971757920e-02 +1928 1967 4.062188650978137e-02 +1928 1968 -7.820632800320009e-03 +1928 1969 -2.448347659537347e-02 +1928 1970 3.015884103136381e-02 +1928 1971 -1.284443828279115e-02 +1929 1936 1.046612031640127e-01 +1929 1937 -2.881124078576537e-01 +1929 1938 3.642942065094310e-01 +1929 1939 1.002415479616464e+00 +1929 1940 5.323155226899952e-01 +1929 1941 -7.954492469654867e-02 +1929 1942 -1.711660602912905e-01 +1929 1943 -4.811885553863171e-02 +1929 1944 2.570767009641045e-02 +1929 1963 -2.757068474110300e-02 +1929 1964 4.265186386815178e-02 +1929 1965 1.051000962006396e-01 +1929 1966 2.793485847486072e-02 +1929 1967 -7.455725140302115e-02 +1929 1968 1.403341243148206e-02 +1929 1969 4.325121028990322e-02 +1929 1970 -5.276030473240920e-02 +1929 1971 2.236576952567728e-02 +1930 1936 -6.899335049541490e-02 +1930 1937 1.729389305228546e-01 +1930 1938 -1.632953212690478e-01 +1930 1939 -7.035531268752397e-02 +1930 1940 7.220650334136118e-01 +1930 1941 9.772041559577636e-01 +1930 1942 5.453324425206555e-01 +1930 1943 1.175590121763705e-01 +1930 1944 -5.755658390964827e-02 +1930 1963 6.565365744135691e-02 +1930 1964 -9.365152023069208e-02 +1930 1965 -2.071439731675966e-01 +1930 1966 -5.010677298616108e-02 +1930 1967 1.247251953696806e-01 +1930 1968 -2.237629970634502e-02 +1930 1969 -6.683554557781619e-02 +1930 1970 8.001126076632671e-02 +1930 1971 -3.362050583248455e-02 +1931 1936 4.811158329878761e-02 +1931 1937 -1.164268237939101e-01 +1931 1938 1.009370353828469e-01 +1931 1939 3.613279323195708e-02 +1931 1940 -2.263595638964284e-01 +1931 1941 1.124088651417514e-01 +1931 1942 7.109171977955336e-01 +1931 1943 9.801237676746007e-01 +1931 1944 9.932762028182606e-01 +1931 1963 9.932762028182608e-01 +1931 1964 9.801237676746006e-01 +1931 1965 7.109171977955339e-01 +1931 1966 1.124088651417514e-01 +1931 1967 -2.263595638964285e-01 +1931 1968 3.613279323195707e-02 +1931 1969 1.009370353828469e-01 +1931 1970 -1.164268237939100e-01 +1931 1971 4.811158329878761e-02 +1932 1936 -3.362050583248454e-02 +1932 1937 8.001126076632673e-02 +1932 1938 -6.683554557781621e-02 +1932 1939 -2.237629970634502e-02 +1932 1940 1.247251953696805e-01 +1932 1941 -5.010677298616108e-02 +1932 1942 -2.071439731675965e-01 +1932 1943 -9.365152023069209e-02 +1932 1944 6.565365744135690e-02 +1932 1963 -5.755658390964827e-02 +1932 1964 1.175590121763705e-01 +1932 1965 5.453324425206556e-01 +1932 1966 9.772041559577636e-01 +1932 1967 7.220650334136122e-01 +1932 1968 -7.035531268752394e-02 +1932 1969 -1.632953212690477e-01 +1932 1970 1.729389305228546e-01 +1932 1971 -6.899335049541490e-02 +1933 1936 2.236576952567727e-02 +1933 1937 -5.276030473240920e-02 +1933 1938 4.325121028990322e-02 +1933 1939 1.403341243148206e-02 +1933 1940 -7.455725140302112e-02 +1933 1941 2.793485847486071e-02 +1933 1942 1.051000962006396e-01 +1933 1943 4.265186386815178e-02 +1933 1944 -2.757068474110299e-02 +1933 1963 2.570767009641045e-02 +1933 1964 -4.811885553863170e-02 +1933 1965 -1.711660602912906e-01 +1933 1966 -7.954492469654866e-02 +1933 1967 5.323155226899953e-01 +1933 1968 1.002415479616464e+00 +1933 1969 3.642942065094308e-01 +1933 1970 -2.881124078576536e-01 +1933 1971 1.046612031640127e-01 +1934 1936 -1.284443828279115e-02 +1934 1937 3.015884103136382e-02 +1934 1938 -2.448347659537348e-02 +1934 1939 -7.820632800320013e-03 +1934 1940 4.062188650978136e-02 +1934 1941 -1.476812971757920e-02 +1934 1942 -5.358173644527559e-02 +1934 1943 -2.096995323672021e-02 +1934 1944 1.323313804878302e-02 +1934 1963 -1.256361223272003e-02 +1934 1964 2.293253914396384e-02 +1934 1965 7.670746208201275e-02 +1934 1966 3.112452985382569e-02 +1934 1967 -1.439621421628996e-01 +1934 1968 5.826103953348259e-02 +1934 1969 8.229048909617078e-01 +1934 1970 8.343268197451105e-01 +1934 1971 -1.892021217766592e-01 +1935 1936 4.192808171658150e-03 +1935 1937 -9.824645887494977e-03 +1935 1938 7.942152029251368e-03 +1935 1939 2.520055549235034e-03 +1935 1940 -1.296759263271960e-02 +1935 1941 4.657915058915502e-03 +1935 1942 1.666728813825644e-02 +1935 1943 6.437602044020781e-03 +1935 1944 -4.028549736136366e-03 +1935 1963 3.848762214796555e-03 +1935 1964 -6.964455901063737e-03 +1935 1965 -2.283271683293556e-02 +1935 1966 -8.910497086827958e-03 +1935 1967 3.811891211199980e-02 +1935 1968 -1.281053516843188e-02 +1935 1969 -8.471515173090287e-02 +1935 1970 3.496883302058122e-01 +1935 1971 1.125329052227214e+00 +2008 2017 1.125329052227214e+00 +2008 2018 3.496883302058122e-01 +2008 2019 -8.471515173090287e-02 +2008 2020 -1.281053516843188e-02 +2008 2021 3.811891211199978e-02 +2008 2022 -8.910497086827956e-03 +2008 2023 -2.283271683293555e-02 +2008 2024 -6.964455901063736e-03 +2008 2025 3.848762214796554e-03 +2008 2044 -4.028549736136366e-03 +2008 2045 6.437602044020779e-03 +2008 2046 1.666728813825643e-02 +2008 2047 4.657915058915501e-03 +2008 2048 -1.296759263271960e-02 +2008 2049 2.520055549235032e-03 +2008 2050 7.942152029251364e-03 +2008 2051 -9.824645887494973e-03 +2008 2052 4.192808171658150e-03 +2009 2017 -1.892021217766592e-01 +2009 2018 8.343268197451107e-01 +2009 2019 8.229048909617080e-01 +2009 2020 5.826103953348261e-02 +2009 2021 -1.439621421628995e-01 +2009 2022 3.112452985382569e-02 +2009 2023 7.670746208201273e-02 +2009 2024 2.293253914396385e-02 +2009 2025 -1.256361223272003e-02 +2009 2044 1.323313804878303e-02 +2009 2045 -2.096995323672021e-02 +2009 2046 -5.358173644527560e-02 +2009 2047 -1.476812971757920e-02 +2009 2048 4.062188650978137e-02 +2009 2049 -7.820632800320009e-03 +2009 2050 -2.448347659537347e-02 +2009 2051 3.015884103136381e-02 +2009 2052 -1.284443828279115e-02 +2010 2017 1.046612031640127e-01 +2010 2018 -2.881124078576537e-01 +2010 2019 3.642942065094310e-01 +2010 2020 1.002415479616464e+00 +2010 2021 5.323155226899952e-01 +2010 2022 -7.954492469654867e-02 +2010 2023 -1.711660602912905e-01 +2010 2024 -4.811885553863171e-02 +2010 2025 2.570767009641045e-02 +2010 2044 -2.757068474110300e-02 +2010 2045 4.265186386815178e-02 +2010 2046 1.051000962006396e-01 +2010 2047 2.793485847486072e-02 +2010 2048 -7.455725140302115e-02 +2010 2049 1.403341243148206e-02 +2010 2050 4.325121028990322e-02 +2010 2051 -5.276030473240920e-02 +2010 2052 2.236576952567728e-02 +2011 2017 -6.899335049541490e-02 +2011 2018 1.729389305228546e-01 +2011 2019 -1.632953212690478e-01 +2011 2020 -7.035531268752397e-02 +2011 2021 7.220650334136118e-01 +2011 2022 9.772041559577636e-01 +2011 2023 5.453324425206555e-01 +2011 2024 1.175590121763705e-01 +2011 2025 -5.755658390964827e-02 +2011 2044 6.565365744135691e-02 +2011 2045 -9.365152023069208e-02 +2011 2046 -2.071439731675966e-01 +2011 2047 -5.010677298616108e-02 +2011 2048 1.247251953696806e-01 +2011 2049 -2.237629970634502e-02 +2011 2050 -6.683554557781619e-02 +2011 2051 8.001126076632671e-02 +2011 2052 -3.362050583248455e-02 +2012 2017 4.811158329878761e-02 +2012 2018 -1.164268237939101e-01 +2012 2019 1.009370353828469e-01 +2012 2020 3.613279323195708e-02 +2012 2021 -2.263595638964284e-01 +2012 2022 1.124088651417514e-01 +2012 2023 7.109171977955336e-01 +2012 2024 9.801237676746007e-01 +2012 2025 9.932762028182606e-01 +2012 2044 9.932762028182608e-01 +2012 2045 9.801237676746006e-01 +2012 2046 7.109171977955339e-01 +2012 2047 1.124088651417514e-01 +2012 2048 -2.263595638964285e-01 +2012 2049 3.613279323195707e-02 +2012 2050 1.009370353828469e-01 +2012 2051 -1.164268237939100e-01 +2012 2052 4.811158329878761e-02 +2013 2017 -3.362050583248454e-02 +2013 2018 8.001126076632673e-02 +2013 2019 -6.683554557781621e-02 +2013 2020 -2.237629970634502e-02 +2013 2021 1.247251953696805e-01 +2013 2022 -5.010677298616108e-02 +2013 2023 -2.071439731675965e-01 +2013 2024 -9.365152023069209e-02 +2013 2025 6.565365744135690e-02 +2013 2044 -5.755658390964827e-02 +2013 2045 1.175590121763705e-01 +2013 2046 5.453324425206556e-01 +2013 2047 9.772041559577636e-01 +2013 2048 7.220650334136122e-01 +2013 2049 -7.035531268752394e-02 +2013 2050 -1.632953212690477e-01 +2013 2051 1.729389305228546e-01 +2013 2052 -6.899335049541490e-02 +2014 2017 2.236576952567727e-02 +2014 2018 -5.276030473240920e-02 +2014 2019 4.325121028990322e-02 +2014 2020 1.403341243148206e-02 +2014 2021 -7.455725140302112e-02 +2014 2022 2.793485847486071e-02 +2014 2023 1.051000962006396e-01 +2014 2024 4.265186386815178e-02 +2014 2025 -2.757068474110299e-02 +2014 2044 2.570767009641045e-02 +2014 2045 -4.811885553863170e-02 +2014 2046 -1.711660602912906e-01 +2014 2047 -7.954492469654866e-02 +2014 2048 5.323155226899953e-01 +2014 2049 1.002415479616464e+00 +2014 2050 3.642942065094308e-01 +2014 2051 -2.881124078576536e-01 +2014 2052 1.046612031640127e-01 +2015 2017 -1.284443828279115e-02 +2015 2018 3.015884103136382e-02 +2015 2019 -2.448347659537348e-02 +2015 2020 -7.820632800320013e-03 +2015 2021 4.062188650978136e-02 +2015 2022 -1.476812971757920e-02 +2015 2023 -5.358173644527559e-02 +2015 2024 -2.096995323672021e-02 +2015 2025 1.323313804878302e-02 +2015 2044 -1.256361223272003e-02 +2015 2045 2.293253914396384e-02 +2015 2046 7.670746208201275e-02 +2015 2047 3.112452985382569e-02 +2015 2048 -1.439621421628996e-01 +2015 2049 5.826103953348259e-02 +2015 2050 8.229048909617078e-01 +2015 2051 8.343268197451105e-01 +2015 2052 -1.892021217766592e-01 +2016 2017 4.192808171658150e-03 +2016 2018 -9.824645887494977e-03 +2016 2019 7.942152029251368e-03 +2016 2020 2.520055549235034e-03 +2016 2021 -1.296759263271960e-02 +2016 2022 4.657915058915502e-03 +2016 2023 1.666728813825644e-02 +2016 2024 6.437602044020781e-03 +2016 2025 -4.028549736136366e-03 +2016 2044 3.848762214796555e-03 +2016 2045 -6.964455901063737e-03 +2016 2046 -2.283271683293556e-02 +2016 2047 -8.910497086827958e-03 +2016 2048 3.811891211199980e-02 +2016 2049 -1.281053516843188e-02 +2016 2050 -8.471515173090287e-02 +2016 2051 3.496883302058122e-01 +2016 2052 1.125329052227214e+00 +2071 2080 1.125329052227214e+00 +2071 2081 3.496883302058122e-01 +2071 2082 -8.471515173090287e-02 +2071 2083 -1.281053516843188e-02 +2071 2084 3.811891211199978e-02 +2071 2085 -8.910497086827956e-03 +2071 2086 -2.283271683293555e-02 +2071 2087 -6.964455901063736e-03 +2071 2088 3.848762214796554e-03 +2071 2107 -4.028549736136366e-03 +2071 2108 6.437602044020779e-03 +2071 2109 1.666728813825643e-02 +2071 2110 4.657915058915501e-03 +2071 2111 -1.296759263271960e-02 +2071 2112 2.520055549235032e-03 +2071 2113 7.942152029251364e-03 +2071 2114 -9.824645887494973e-03 +2071 2115 4.192808171658150e-03 +2072 2080 -1.892021217766592e-01 +2072 2081 8.343268197451107e-01 +2072 2082 8.229048909617080e-01 +2072 2083 5.826103953348261e-02 +2072 2084 -1.439621421628995e-01 +2072 2085 3.112452985382569e-02 +2072 2086 7.670746208201273e-02 +2072 2087 2.293253914396385e-02 +2072 2088 -1.256361223272003e-02 +2072 2107 1.323313804878303e-02 +2072 2108 -2.096995323672021e-02 +2072 2109 -5.358173644527560e-02 +2072 2110 -1.476812971757920e-02 +2072 2111 4.062188650978137e-02 +2072 2112 -7.820632800320009e-03 +2072 2113 -2.448347659537347e-02 +2072 2114 3.015884103136381e-02 +2072 2115 -1.284443828279115e-02 +2073 2080 1.046612031640127e-01 +2073 2081 -2.881124078576537e-01 +2073 2082 3.642942065094310e-01 +2073 2083 1.002415479616464e+00 +2073 2084 5.323155226899952e-01 +2073 2085 -7.954492469654867e-02 +2073 2086 -1.711660602912905e-01 +2073 2087 -4.811885553863171e-02 +2073 2088 2.570767009641045e-02 +2073 2107 -2.757068474110300e-02 +2073 2108 4.265186386815178e-02 +2073 2109 1.051000962006396e-01 +2073 2110 2.793485847486072e-02 +2073 2111 -7.455725140302115e-02 +2073 2112 1.403341243148206e-02 +2073 2113 4.325121028990322e-02 +2073 2114 -5.276030473240920e-02 +2073 2115 2.236576952567728e-02 +2074 2080 -6.899335049541490e-02 +2074 2081 1.729389305228546e-01 +2074 2082 -1.632953212690478e-01 +2074 2083 -7.035531268752397e-02 +2074 2084 7.220650334136118e-01 +2074 2085 9.772041559577636e-01 +2074 2086 5.453324425206555e-01 +2074 2087 1.175590121763705e-01 +2074 2088 -5.755658390964827e-02 +2074 2107 6.565365744135691e-02 +2074 2108 -9.365152023069208e-02 +2074 2109 -2.071439731675966e-01 +2074 2110 -5.010677298616108e-02 +2074 2111 1.247251953696806e-01 +2074 2112 -2.237629970634502e-02 +2074 2113 -6.683554557781619e-02 +2074 2114 8.001126076632671e-02 +2074 2115 -3.362050583248455e-02 +2075 2080 4.811158329878761e-02 +2075 2081 -1.164268237939101e-01 +2075 2082 1.009370353828469e-01 +2075 2083 3.613279323195708e-02 +2075 2084 -2.263595638964284e-01 +2075 2085 1.124088651417514e-01 +2075 2086 7.109171977955336e-01 +2075 2087 9.801237676746007e-01 +2075 2088 9.932762028182606e-01 +2075 2107 9.932762028182608e-01 +2075 2108 9.801237676746006e-01 +2075 2109 7.109171977955339e-01 +2075 2110 1.124088651417514e-01 +2075 2111 -2.263595638964285e-01 +2075 2112 3.613279323195707e-02 +2075 2113 1.009370353828469e-01 +2075 2114 -1.164268237939100e-01 +2075 2115 4.811158329878761e-02 +2076 2080 -3.362050583248454e-02 +2076 2081 8.001126076632673e-02 +2076 2082 -6.683554557781621e-02 +2076 2083 -2.237629970634502e-02 +2076 2084 1.247251953696805e-01 +2076 2085 -5.010677298616108e-02 +2076 2086 -2.071439731675965e-01 +2076 2087 -9.365152023069209e-02 +2076 2088 6.565365744135690e-02 +2076 2107 -5.755658390964827e-02 +2076 2108 1.175590121763705e-01 +2076 2109 5.453324425206556e-01 +2076 2110 9.772041559577636e-01 +2076 2111 7.220650334136122e-01 +2076 2112 -7.035531268752394e-02 +2076 2113 -1.632953212690477e-01 +2076 2114 1.729389305228546e-01 +2076 2115 -6.899335049541490e-02 +2077 2080 2.236576952567727e-02 +2077 2081 -5.276030473240920e-02 +2077 2082 4.325121028990322e-02 +2077 2083 1.403341243148206e-02 +2077 2084 -7.455725140302112e-02 +2077 2085 2.793485847486071e-02 +2077 2086 1.051000962006396e-01 +2077 2087 4.265186386815178e-02 +2077 2088 -2.757068474110299e-02 +2077 2107 2.570767009641045e-02 +2077 2108 -4.811885553863170e-02 +2077 2109 -1.711660602912906e-01 +2077 2110 -7.954492469654866e-02 +2077 2111 5.323155226899953e-01 +2077 2112 1.002415479616464e+00 +2077 2113 3.642942065094308e-01 +2077 2114 -2.881124078576536e-01 +2077 2115 1.046612031640127e-01 +2078 2080 -1.284443828279115e-02 +2078 2081 3.015884103136382e-02 +2078 2082 -2.448347659537348e-02 +2078 2083 -7.820632800320013e-03 +2078 2084 4.062188650978136e-02 +2078 2085 -1.476812971757920e-02 +2078 2086 -5.358173644527559e-02 +2078 2087 -2.096995323672021e-02 +2078 2088 1.323313804878302e-02 +2078 2107 -1.256361223272003e-02 +2078 2108 2.293253914396384e-02 +2078 2109 7.670746208201275e-02 +2078 2110 3.112452985382569e-02 +2078 2111 -1.439621421628996e-01 +2078 2112 5.826103953348259e-02 +2078 2113 8.229048909617078e-01 +2078 2114 8.343268197451105e-01 +2078 2115 -1.892021217766592e-01 +2079 2080 4.192808171658150e-03 +2079 2081 -9.824645887494977e-03 +2079 2082 7.942152029251368e-03 +2079 2083 2.520055549235034e-03 +2079 2084 -1.296759263271960e-02 +2079 2085 4.657915058915502e-03 +2079 2086 1.666728813825644e-02 +2079 2087 6.437602044020781e-03 +2079 2088 -4.028549736136366e-03 +2079 2107 3.848762214796555e-03 +2079 2108 -6.964455901063737e-03 +2079 2109 -2.283271683293556e-02 +2079 2110 -8.910497086827958e-03 +2079 2111 3.811891211199980e-02 +2079 2112 -1.281053516843188e-02 +2079 2113 -8.471515173090287e-02 +2079 2114 3.496883302058122e-01 +2079 2115 1.125329052227214e+00 +2143 2152 1.125329052227214e+00 +2143 2153 3.496883302058122e-01 +2143 2154 -8.471515173090287e-02 +2143 2155 -1.281053516843188e-02 +2143 2156 3.811891211199978e-02 +2143 2157 -8.910497086827956e-03 +2143 2158 -2.283271683293555e-02 +2143 2159 -6.964455901063736e-03 +2143 2160 3.848762214796554e-03 +2143 2179 -4.028549736136366e-03 +2143 2180 6.437602044020779e-03 +2143 2181 1.666728813825643e-02 +2143 2182 4.657915058915501e-03 +2143 2183 -1.296759263271960e-02 +2143 2184 2.520055549235032e-03 +2143 2185 7.942152029251364e-03 +2143 2186 -9.824645887494973e-03 +2143 2187 4.192808171658150e-03 +2144 2152 -1.892021217766592e-01 +2144 2153 8.343268197451107e-01 +2144 2154 8.229048909617080e-01 +2144 2155 5.826103953348261e-02 +2144 2156 -1.439621421628995e-01 +2144 2157 3.112452985382569e-02 +2144 2158 7.670746208201273e-02 +2144 2159 2.293253914396385e-02 +2144 2160 -1.256361223272003e-02 +2144 2179 1.323313804878303e-02 +2144 2180 -2.096995323672021e-02 +2144 2181 -5.358173644527560e-02 +2144 2182 -1.476812971757920e-02 +2144 2183 4.062188650978137e-02 +2144 2184 -7.820632800320009e-03 +2144 2185 -2.448347659537347e-02 +2144 2186 3.015884103136381e-02 +2144 2187 -1.284443828279115e-02 +2145 2152 1.046612031640127e-01 +2145 2153 -2.881124078576537e-01 +2145 2154 3.642942065094310e-01 +2145 2155 1.002415479616464e+00 +2145 2156 5.323155226899952e-01 +2145 2157 -7.954492469654867e-02 +2145 2158 -1.711660602912905e-01 +2145 2159 -4.811885553863171e-02 +2145 2160 2.570767009641045e-02 +2145 2179 -2.757068474110300e-02 +2145 2180 4.265186386815178e-02 +2145 2181 1.051000962006396e-01 +2145 2182 2.793485847486072e-02 +2145 2183 -7.455725140302115e-02 +2145 2184 1.403341243148206e-02 +2145 2185 4.325121028990322e-02 +2145 2186 -5.276030473240920e-02 +2145 2187 2.236576952567728e-02 +2146 2152 -6.899335049541490e-02 +2146 2153 1.729389305228546e-01 +2146 2154 -1.632953212690478e-01 +2146 2155 -7.035531268752397e-02 +2146 2156 7.220650334136118e-01 +2146 2157 9.772041559577636e-01 +2146 2158 5.453324425206555e-01 +2146 2159 1.175590121763705e-01 +2146 2160 -5.755658390964827e-02 +2146 2179 6.565365744135691e-02 +2146 2180 -9.365152023069208e-02 +2146 2181 -2.071439731675966e-01 +2146 2182 -5.010677298616108e-02 +2146 2183 1.247251953696806e-01 +2146 2184 -2.237629970634502e-02 +2146 2185 -6.683554557781619e-02 +2146 2186 8.001126076632671e-02 +2146 2187 -3.362050583248455e-02 +2147 2152 4.811158329878761e-02 +2147 2153 -1.164268237939101e-01 +2147 2154 1.009370353828469e-01 +2147 2155 3.613279323195708e-02 +2147 2156 -2.263595638964284e-01 +2147 2157 1.124088651417514e-01 +2147 2158 7.109171977955336e-01 +2147 2159 9.801237676746007e-01 +2147 2160 9.932762028182606e-01 +2147 2179 9.932762028182608e-01 +2147 2180 9.801237676746006e-01 +2147 2181 7.109171977955339e-01 +2147 2182 1.124088651417514e-01 +2147 2183 -2.263595638964285e-01 +2147 2184 3.613279323195707e-02 +2147 2185 1.009370353828469e-01 +2147 2186 -1.164268237939100e-01 +2147 2187 4.811158329878761e-02 +2148 2152 -3.362050583248454e-02 +2148 2153 8.001126076632673e-02 +2148 2154 -6.683554557781621e-02 +2148 2155 -2.237629970634502e-02 +2148 2156 1.247251953696805e-01 +2148 2157 -5.010677298616108e-02 +2148 2158 -2.071439731675965e-01 +2148 2159 -9.365152023069209e-02 +2148 2160 6.565365744135690e-02 +2148 2179 -5.755658390964827e-02 +2148 2180 1.175590121763705e-01 +2148 2181 5.453324425206556e-01 +2148 2182 9.772041559577636e-01 +2148 2183 7.220650334136122e-01 +2148 2184 -7.035531268752394e-02 +2148 2185 -1.632953212690477e-01 +2148 2186 1.729389305228546e-01 +2148 2187 -6.899335049541490e-02 +2149 2152 2.236576952567727e-02 +2149 2153 -5.276030473240920e-02 +2149 2154 4.325121028990322e-02 +2149 2155 1.403341243148206e-02 +2149 2156 -7.455725140302112e-02 +2149 2157 2.793485847486071e-02 +2149 2158 1.051000962006396e-01 +2149 2159 4.265186386815178e-02 +2149 2160 -2.757068474110299e-02 +2149 2179 2.570767009641045e-02 +2149 2180 -4.811885553863170e-02 +2149 2181 -1.711660602912906e-01 +2149 2182 -7.954492469654866e-02 +2149 2183 5.323155226899953e-01 +2149 2184 1.002415479616464e+00 +2149 2185 3.642942065094308e-01 +2149 2186 -2.881124078576536e-01 +2149 2187 1.046612031640127e-01 +2150 2152 -1.284443828279115e-02 +2150 2153 3.015884103136382e-02 +2150 2154 -2.448347659537348e-02 +2150 2155 -7.820632800320013e-03 +2150 2156 4.062188650978136e-02 +2150 2157 -1.476812971757920e-02 +2150 2158 -5.358173644527559e-02 +2150 2159 -2.096995323672021e-02 +2150 2160 1.323313804878302e-02 +2150 2179 -1.256361223272003e-02 +2150 2180 2.293253914396384e-02 +2150 2181 7.670746208201275e-02 +2150 2182 3.112452985382569e-02 +2150 2183 -1.439621421628996e-01 +2150 2184 5.826103953348259e-02 +2150 2185 8.229048909617078e-01 +2150 2186 8.343268197451105e-01 +2150 2187 -1.892021217766592e-01 +2151 2152 4.192808171658150e-03 +2151 2153 -9.824645887494977e-03 +2151 2154 7.942152029251368e-03 +2151 2155 2.520055549235034e-03 +2151 2156 -1.296759263271960e-02 +2151 2157 4.657915058915502e-03 +2151 2158 1.666728813825644e-02 +2151 2159 6.437602044020781e-03 +2151 2160 -4.028549736136366e-03 +2151 2179 3.848762214796555e-03 +2151 2180 -6.964455901063737e-03 +2151 2181 -2.283271683293556e-02 +2151 2182 -8.910497086827958e-03 +2151 2183 3.811891211199980e-02 +2151 2184 -1.281053516843188e-02 +2151 2185 -8.471515173090287e-02 +2151 2186 3.496883302058122e-01 +2151 2187 1.125329052227214e+00 +2206 2215 1.125329052227214e+00 +2206 2216 3.496883302058122e-01 +2206 2217 -8.471515173090287e-02 +2206 2218 -1.281053516843188e-02 +2206 2219 3.811891211199978e-02 +2206 2220 -8.910497086827956e-03 +2206 2221 -2.283271683293555e-02 +2206 2222 -6.964455901063736e-03 +2206 2223 3.848762214796554e-03 +2206 2242 -4.028549736136366e-03 +2206 2243 6.437602044020779e-03 +2206 2244 1.666728813825643e-02 +2206 2245 4.657915058915501e-03 +2206 2246 -1.296759263271960e-02 +2206 2247 2.520055549235032e-03 +2206 2248 7.942152029251364e-03 +2206 2249 -9.824645887494973e-03 +2206 2250 4.192808171658150e-03 +2207 2215 -1.892021217766592e-01 +2207 2216 8.343268197451107e-01 +2207 2217 8.229048909617080e-01 +2207 2218 5.826103953348261e-02 +2207 2219 -1.439621421628995e-01 +2207 2220 3.112452985382569e-02 +2207 2221 7.670746208201273e-02 +2207 2222 2.293253914396385e-02 +2207 2223 -1.256361223272003e-02 +2207 2242 1.323313804878303e-02 +2207 2243 -2.096995323672021e-02 +2207 2244 -5.358173644527560e-02 +2207 2245 -1.476812971757920e-02 +2207 2246 4.062188650978137e-02 +2207 2247 -7.820632800320009e-03 +2207 2248 -2.448347659537347e-02 +2207 2249 3.015884103136381e-02 +2207 2250 -1.284443828279115e-02 +2208 2215 1.046612031640127e-01 +2208 2216 -2.881124078576537e-01 +2208 2217 3.642942065094310e-01 +2208 2218 1.002415479616464e+00 +2208 2219 5.323155226899952e-01 +2208 2220 -7.954492469654867e-02 +2208 2221 -1.711660602912905e-01 +2208 2222 -4.811885553863171e-02 +2208 2223 2.570767009641045e-02 +2208 2242 -2.757068474110300e-02 +2208 2243 4.265186386815178e-02 +2208 2244 1.051000962006396e-01 +2208 2245 2.793485847486072e-02 +2208 2246 -7.455725140302115e-02 +2208 2247 1.403341243148206e-02 +2208 2248 4.325121028990322e-02 +2208 2249 -5.276030473240920e-02 +2208 2250 2.236576952567728e-02 +2209 2215 -6.899335049541490e-02 +2209 2216 1.729389305228546e-01 +2209 2217 -1.632953212690478e-01 +2209 2218 -7.035531268752397e-02 +2209 2219 7.220650334136118e-01 +2209 2220 9.772041559577636e-01 +2209 2221 5.453324425206555e-01 +2209 2222 1.175590121763705e-01 +2209 2223 -5.755658390964827e-02 +2209 2242 6.565365744135691e-02 +2209 2243 -9.365152023069208e-02 +2209 2244 -2.071439731675966e-01 +2209 2245 -5.010677298616108e-02 +2209 2246 1.247251953696806e-01 +2209 2247 -2.237629970634502e-02 +2209 2248 -6.683554557781619e-02 +2209 2249 8.001126076632671e-02 +2209 2250 -3.362050583248455e-02 +2210 2215 4.811158329878761e-02 +2210 2216 -1.164268237939101e-01 +2210 2217 1.009370353828469e-01 +2210 2218 3.613279323195708e-02 +2210 2219 -2.263595638964284e-01 +2210 2220 1.124088651417514e-01 +2210 2221 7.109171977955336e-01 +2210 2222 9.801237676746007e-01 +2210 2223 9.932762028182606e-01 +2210 2242 9.932762028182608e-01 +2210 2243 9.801237676746006e-01 +2210 2244 7.109171977955339e-01 +2210 2245 1.124088651417514e-01 +2210 2246 -2.263595638964285e-01 +2210 2247 3.613279323195707e-02 +2210 2248 1.009370353828469e-01 +2210 2249 -1.164268237939100e-01 +2210 2250 4.811158329878761e-02 +2211 2215 -3.362050583248454e-02 +2211 2216 8.001126076632673e-02 +2211 2217 -6.683554557781621e-02 +2211 2218 -2.237629970634502e-02 +2211 2219 1.247251953696805e-01 +2211 2220 -5.010677298616108e-02 +2211 2221 -2.071439731675965e-01 +2211 2222 -9.365152023069209e-02 +2211 2223 6.565365744135690e-02 +2211 2242 -5.755658390964827e-02 +2211 2243 1.175590121763705e-01 +2211 2244 5.453324425206556e-01 +2211 2245 9.772041559577636e-01 +2211 2246 7.220650334136122e-01 +2211 2247 -7.035531268752394e-02 +2211 2248 -1.632953212690477e-01 +2211 2249 1.729389305228546e-01 +2211 2250 -6.899335049541490e-02 +2212 2215 2.236576952567727e-02 +2212 2216 -5.276030473240920e-02 +2212 2217 4.325121028990322e-02 +2212 2218 1.403341243148206e-02 +2212 2219 -7.455725140302112e-02 +2212 2220 2.793485847486071e-02 +2212 2221 1.051000962006396e-01 +2212 2222 4.265186386815178e-02 +2212 2223 -2.757068474110299e-02 +2212 2242 2.570767009641045e-02 +2212 2243 -4.811885553863170e-02 +2212 2244 -1.711660602912906e-01 +2212 2245 -7.954492469654866e-02 +2212 2246 5.323155226899953e-01 +2212 2247 1.002415479616464e+00 +2212 2248 3.642942065094308e-01 +2212 2249 -2.881124078576536e-01 +2212 2250 1.046612031640127e-01 +2213 2215 -1.284443828279115e-02 +2213 2216 3.015884103136382e-02 +2213 2217 -2.448347659537348e-02 +2213 2218 -7.820632800320013e-03 +2213 2219 4.062188650978136e-02 +2213 2220 -1.476812971757920e-02 +2213 2221 -5.358173644527559e-02 +2213 2222 -2.096995323672021e-02 +2213 2223 1.323313804878302e-02 +2213 2242 -1.256361223272003e-02 +2213 2243 2.293253914396384e-02 +2213 2244 7.670746208201275e-02 +2213 2245 3.112452985382569e-02 +2213 2246 -1.439621421628996e-01 +2213 2247 5.826103953348259e-02 +2213 2248 8.229048909617078e-01 +2213 2249 8.343268197451105e-01 +2213 2250 -1.892021217766592e-01 +2214 2215 4.192808171658150e-03 +2214 2216 -9.824645887494977e-03 +2214 2217 7.942152029251368e-03 +2214 2218 2.520055549235034e-03 +2214 2219 -1.296759263271960e-02 +2214 2220 4.657915058915502e-03 +2214 2221 1.666728813825644e-02 +2214 2222 6.437602044020781e-03 +2214 2223 -4.028549736136366e-03 +2214 2242 3.848762214796555e-03 +2214 2243 -6.964455901063737e-03 +2214 2244 -2.283271683293556e-02 +2214 2245 -8.910497086827958e-03 +2214 2246 3.811891211199980e-02 +2214 2247 -1.281053516843188e-02 +2214 2248 -8.471515173090287e-02 +2214 2249 3.496883302058122e-01 +2214 2250 1.125329052227214e+00 diff --git a/packages/muelu/research/caglusa/transfer4.mtx b/packages/muelu/research/caglusa/transfer4.mtx new file mode 100644 index 000000000000..da093b14ad01 --- /dev/null +++ b/packages/muelu/research/caglusa/transfer4.mtx @@ -0,0 +1,10371 @@ +%%MatrixMarket matrix coordinate real general +% +2268 2268 10368 +37 46 1.129411500546784e+00 +37 47 3.670587123461224e-01 +37 48 -8.049160724422064e-02 +37 49 -2.032779703371170e-02 +37 50 3.979771743152476e-02 +37 51 -3.653023273099719e-03 +37 52 -2.390769583422672e-02 +37 53 -1.192764283693718e-02 +37 54 -1.348774781601022e-03 +37 55 -1.927879913695869e-02 +37 56 -8.917196571637897e-03 +37 57 1.149451447894719e-02 +37 58 1.241273109870015e-02 +37 59 -1.090472327570898e-02 +37 60 -1.791847139963846e-03 +37 61 9.605069530915568e-03 +37 62 -9.403212964596546e-03 +37 63 3.742046373507516e-03 +38 46 -1.954658507609646e-01 +38 47 8.172051897065897e-01 +38 48 8.485883218629846e-01 +38 49 9.418268414471946e-02 +38 50 -1.517806004204933e-01 +38 51 1.284495107653860e-02 +38 52 8.073455683811782e-02 +38 53 3.944978508915502e-02 +38 54 4.421028511261784e-03 +38 55 6.430777110290091e-02 +38 56 2.941185106925198e-02 +38 57 -3.727073768123609e-02 +38 58 -3.956180224284107e-02 +38 59 3.426009015924943e-02 +38 60 5.569100012395127e-03 +38 61 -2.962963414084064e-02 +38 62 2.887150304495056e-02 +38 63 -1.146382092326903e-02 +39 46 1.082520994427544e-01 +39 47 -2.889831904537400e-01 +39 48 3.248829650141348e-01 +39 49 9.970774308689467e-01 +39 50 5.961024869195356e-01 +39 51 -3.367981223730957e-02 +39 52 -1.831797001588231e-01 +39 53 -8.387339051456290e-02 +39 54 -9.153920411521620e-03 +39 55 -1.403134860597824e-01 +39 56 -6.202098009210710e-02 +39 57 7.483826745891405e-02 +39 58 7.585142918501503e-02 +39 59 -6.333628236330374e-02 +39 60 -1.002900382440928e-02 +39 61 5.242362868626488e-02 +39 62 -5.053361078568499e-02 +39 63 1.996278304732560e-02 +40 46 -7.138223443736702e-02 +40 47 1.740834065912312e-01 +40 48 -1.484845065565620e-01 +40 49 -1.049235629513360e-01 +40 50 6.609088867175748e-01 +40 51 9.949463440350268e-01 +40 52 6.382749766949400e-01 +40 53 2.153988514319247e-01 +40 54 2.132780628751801e-02 +40 55 4.016232544653943e-01 +40 56 1.543422580342274e-01 +40 57 -1.578659711615841e-01 +40 58 -1.407094312971146e-01 +40 59 1.076704357915659e-01 +40 60 1.610950972130835e-02 +40 61 -8.125713486768604e-02 +40 62 7.670781547409070e-02 +40 63 -3.001128424595489e-02 +41 46 4.978351309021659e-02 +41 47 -1.173453856460456e-01 +41 48 9.221850329093995e-02 +41 49 5.474453575062167e-02 +41 50 -2.222222222222224e-01 +41 51 4.193559628619540e-02 +41 52 6.214620396774779e-01 +41 53 9.411301078682682e-01 +41 54 9.992308119045477e-01 +41 55 8.278477954392949e-01 +41 56 9.674363587446353e-01 +41 57 9.247079030335047e-01 +41 58 3.586798271031739e-01 +41 59 -2.041549616389801e-01 +41 60 -2.645201730416461e-02 +41 61 1.234841274752059e-01 +41 62 -1.118256204949328e-01 +41 63 4.295470619527602e-02 +42 46 -3.479092359412759e-02 +42 47 8.068968438828850e-02 +42 48 -6.118162989078881e-02 +42 49 -3.407479357032987e-02 +42 50 1.239997546686380e-01 +42 51 -1.932067089943150e-02 +42 52 -2.003414469256311e-01 +42 53 -1.448427411451554e-01 +42 54 -2.040102646753046e-02 +42 55 -1.975954228585655e-01 +42 56 -1.152192884137944e-01 +42 57 2.479644820829805e-01 +42 58 8.525257551601357e-01 +42 59 8.790469159003547e-01 +42 60 5.438963477219833e-02 +42 61 -2.028705486769895e-01 +42 62 1.667687693892568e-01 +42 63 -6.162176444162512e-02 +43 46 2.314511493126580e-02 +43 47 -5.322385868251331e-02 +43 48 3.963041032797538e-02 +43 49 2.141880768979494e-02 +43 50 -7.448107462312177e-02 +43 51 1.087558270779069e-02 +43 52 1.035174746041493e-01 +43 53 6.804174656093516e-02 +43 54 8.940094922500905e-03 +43 55 9.727024557022103e-02 +43 56 5.312855434465211e-02 +43 57 -9.488787671960129e-02 +43 58 -1.693562845488862e-01 +43 59 3.332953273953558e-01 +43 60 9.893322785608479e-01 +43 61 4.836645840152318e-01 +43 62 -2.810263216499292e-01 +43 63 9.356790625904444e-02 +44 46 -1.329223336631334e-02 +44 47 3.042868713306708e-02 +44 48 -2.244483970189554e-02 +44 49 -1.194967046758751e-02 +44 50 4.066948930938207e-02 +44 51 -5.772473560016135e-03 +44 52 -5.312732759263696e-02 +44 53 -3.378505081770156e-02 +44 54 -4.344146984209206e-03 +44 55 -4.906283545438337e-02 +44 56 -2.622294708672096e-02 +44 57 4.443454994987948e-02 +44 58 7.079696169522892e-02 +44 59 -1.042152868047739e-01 +44 60 -3.527955770725234e-02 +44 61 7.368286240746810e-01 +44 62 8.820295805961272e-01 +44 63 -1.697679375944120e-01 +45 46 4.339014147752001e-03 +45 47 -9.913245383000176e-03 +45 48 7.282382897431911e-03 +45 49 3.852365568882107e-03 +45 50 -1.299443778081731e-02 +45 51 1.823505864305507e-03 +45 52 1.656712269663253e-02 +45 53 1.040833436407406e-02 +45 54 1.328127019033700e-03 +45 55 1.520147693187847e-02 +45 56 8.061389971493475e-03 +45 57 -1.341513144180458e-02 +45 58 -2.063918615341183e-02 +45 59 2.833848483624093e-02 +45 60 8.151902909040299e-03 +45 61 -9.224871609678294e-02 +45 62 2.984110973907181e-01 +45 63 1.112637365330107e+00 +64 73 1.121496109519629e+00 +64 74 3.337714682645330e-01 +64 75 -8.784171983802982e-02 +64 76 -6.054059071081550e-03 +64 77 3.581468700213188e-02 +64 78 -1.325717275337829e-02 +64 79 -2.084168245043991e-02 +64 80 -2.156636620475033e-03 +64 81 8.224868937522655e-03 +64 82 -9.119197464262449e-03 +64 83 2.104266184682257e-03 +64 84 1.597136003720133e-02 +64 85 7.233284760850963e-03 +64 86 -1.265402077883446e-02 +64 87 1.232479383921775e-03 +64 88 8.507818082537064e-03 +64 89 -9.719999626669789e-03 +64 90 4.056073820312314e-03 +65 73 -1.833267155554792e-01 +65 74 8.496052943251210e-01 +65 75 7.978124774257968e-01 +65 76 2.709112098463756e-02 +65 77 -1.341009959651938e-01 +65 78 4.603749937463538e-02 +65 79 6.969985820549102e-02 +65 80 7.073583005504249e-03 +65 81 -2.675090448249165e-02 +65 82 3.008346487896355e-02 +65 83 -6.878577509574103e-03 +65 84 -5.147043285304124e-02 +65 85 -2.296833469170231e-02 +65 86 3.967378200088185e-02 +65 87 -3.826530502171589e-03 +65 88 -2.623252505678739e-02 +65 89 2.983957599313218e-02 +65 90 -1.242564713429128e-02 +66 73 1.012997478615406e-01 +66 74 -2.866596804778791e-01 +66 75 4.009285655348370e-01 +66 76 1.003092729754150e+00 +66 77 4.718042883536035e-01 +66 78 -1.151051233747767e-01 +66 79 -1.533011412395481e-01 +66 80 -1.467336790749112e-02 +66 81 5.417647031984339e-02 +66 82 -6.347065826161072e-02 +66 83 1.413095968572469e-02 +66 84 1.016285359894872e-01 +66 85 4.361555150731137e-02 +66 86 -7.297122858953668e-02 +66 87 6.873636058247622e-03 +66 88 4.636253866511417e-02 +66 89 -5.220965998265591e-02 +66 90 2.163688115667334e-02 +67 73 -6.675829549001004e-02 +67 74 1.714825278878419e-01 +67 75 -1.763260094650452e-01 +67 76 -3.524913251503622e-02 +67 77 7.751613393474791e-01 +67 78 9.500818362211343e-01 +67 79 4.551820017945926e-01 +67 80 3.440881837089142e-02 +67 81 -1.173436103509174e-01 +67 82 1.582637096187132e-01 +67 83 -3.205658723743712e-02 +67 84 -2.040533508482636e-01 +67 85 -7.898266143119366e-02 +67 86 1.226433507083531e-01 +67 87 -1.098389774586482e-02 +67 88 -7.170870669864601e-02 +67 89 7.919894876866958e-02 +67 90 -3.252580339149844e-02 +68 73 4.654764921312253e-02 +68 74 -1.153084751520933e-01 +68 75 1.084975613502230e-01 +68 76 1.782365365319639e-02 +68 77 -2.253712020788845e-01 +68 78 1.833451203871191e-01 +68 79 7.871848513645204e-01 +68 80 9.980475420281747e-01 +68 81 9.659358568042388e-01 +68 82 9.659358568042388e-01 +68 83 9.980475420281747e-01 +68 84 7.871848513645214e-01 +68 85 1.833451203871189e-01 +68 86 -2.253712020788838e-01 +68 87 1.782365365319722e-02 +68 88 1.084975613502237e-01 +68 89 -1.153084751520924e-01 +68 90 4.654764921312531e-02 +69 73 -3.252580339149647e-02 +69 74 7.919894876867017e-02 +69 75 -7.170870669864554e-02 +69 76 -1.098389774586430e-02 +69 77 1.226433507083534e-01 +69 78 -7.898266143119359e-02 +69 79 -2.040533508482631e-01 +69 80 -3.205658723743707e-02 +69 81 1.582637096187145e-01 +69 82 -1.173436103509164e-01 +69 83 3.440881837089136e-02 +69 84 4.551820017945921e-01 +69 85 9.500818362211344e-01 +69 86 7.751613393474793e-01 +69 87 -3.524913251503787e-02 +69 88 -1.763260094650463e-01 +69 89 1.714825278878406e-01 +69 90 -6.675829549001404e-02 +70 73 2.163688115667205e-02 +70 74 -5.220965998265634e-02 +70 75 4.636253866511390e-02 +70 76 6.873636058247302e-03 +70 77 -7.297122858953690e-02 +70 78 4.361555150731138e-02 +70 79 1.016285359894871e-01 +70 80 1.413095968572469e-02 +70 81 -6.347065826161129e-02 +70 82 5.417647031984299e-02 +70 83 -1.467336790749113e-02 +70 84 -1.533011412395484e-01 +70 85 -1.151051233747769e-01 +70 86 4.718042883536023e-01 +70 87 1.003092729754151e+00 +70 88 4.009285655348395e-01 +70 89 -2.866596804778768e-01 +70 90 1.012997478615466e-01 +71 73 -1.242564713429054e-02 +71 74 2.983957599313243e-02 +71 75 -2.623252505678725e-02 +71 76 -3.826530502171411e-03 +71 77 3.967378200088199e-02 +71 78 -2.296833469170232e-02 +71 79 -5.147043285304119e-02 +71 80 -6.878577509574105e-03 +71 81 3.008346487896381e-02 +71 82 -2.675090448249145e-02 +71 83 7.073583005504251e-03 +71 84 6.969985820549111e-02 +71 85 4.603749937463543e-02 +71 86 -1.341009959651933e-01 +71 87 2.709112098463885e-02 +71 88 7.978124774257961e-01 +71 89 8.496052943251204e-01 +71 90 -1.833267155554903e-01 +72 73 4.056073820312092e-03 +72 74 -9.719999626669916e-03 +72 75 8.507818082537056e-03 +72 76 1.232479383921723e-03 +72 77 -1.265402077883456e-02 +72 78 7.233284760850999e-03 +72 79 1.597136003720138e-02 +72 80 2.104266184682268e-03 +72 81 -9.119197464262574e-03 +72 82 8.224868937522632e-03 +72 83 -2.156636620475044e-03 +72 84 -2.084168245044004e-02 +72 85 -1.325717275337837e-02 +72 86 3.581468700213196e-02 +72 87 -6.054059071081874e-03 +72 88 -8.784171983803080e-02 +72 89 3.337714682645320e-01 +72 90 1.121496109519637e+00 +100 109 1.121496109519629e+00 +100 110 3.337714682645320e-01 +100 111 -8.784171983803080e-02 +100 112 -6.054059071081879e-03 +100 113 3.581468700213206e-02 +100 114 -1.325717275337835e-02 +100 115 -2.084168245044001e-02 +100 116 -2.156636620475045e-03 +100 117 8.224868937522696e-03 +100 118 -9.119197464262567e-03 +100 119 2.104266184682268e-03 +100 120 1.597136003720142e-02 +100 121 7.233284760851101e-03 +100 122 -1.265402077883447e-02 +100 123 1.232479383921778e-03 +100 124 8.507818082537089e-03 +100 125 -9.719999626669817e-03 +100 126 4.056073820312327e-03 +101 109 -1.833267155554790e-01 +101 110 8.496052943251203e-01 +101 111 7.978124774257961e-01 +101 112 2.709112098463887e-02 +101 113 -1.341009959651937e-01 +101 114 4.603749937463534e-02 +101 115 6.969985820549099e-02 +101 116 7.073583005504250e-03 +101 117 -2.675090448249165e-02 +101 118 3.008346487896378e-02 +101 119 -6.878577509574104e-03 +101 120 -5.147043285304127e-02 +101 121 -2.296833469170264e-02 +101 122 3.967378200088167e-02 +101 123 -3.826530502171579e-03 +101 124 -2.623252505678734e-02 +101 125 2.983957599313212e-02 +101 126 -1.242564713429126e-02 +102 109 1.012997478615400e-01 +102 110 -2.866596804778766e-01 +102 111 4.009285655348391e-01 +102 112 1.003092729754151e+00 +102 113 4.718042883536031e-01 +102 114 -1.151051233747766e-01 +102 115 -1.533011412395480e-01 +102 116 -1.467336790749111e-02 +102 117 5.417647031984335e-02 +102 118 -6.347065826161118e-02 +102 119 1.413095968572468e-02 +102 120 1.016285359894872e-01 +102 121 4.361555150731197e-02 +102 122 -7.297122858953628e-02 +102 123 6.873636058247599e-03 +102 124 4.636253866511404e-02 +102 125 -5.220965998265576e-02 +102 126 2.163688115667329e-02 +103 109 -6.675829549000972e-02 +103 110 1.714825278878406e-01 +103 111 -1.763260094650463e-01 +103 112 -3.524913251503787e-02 +103 113 7.751613393474791e-01 +103 114 9.500818362211338e-01 +103 115 4.551820017945925e-01 +103 116 3.440881837089142e-02 +103 117 -1.173436103509174e-01 +103 118 1.582637096187146e-01 +103 119 -3.205658723743712e-02 +103 120 -2.040533508482638e-01 +103 121 -7.898266143119480e-02 +103 122 1.226433507083526e-01 +103 123 -1.098389774586479e-02 +103 124 -7.170870669864587e-02 +103 125 7.919894876866941e-02 +103 126 -3.252580339149837e-02 +104 109 4.654764921312229e-02 +104 110 -1.153084751520924e-01 +104 111 1.084975613502237e-01 +104 112 1.782365365319724e-02 +104 113 -2.253712020788844e-01 +104 114 1.833451203871190e-01 +104 115 7.871848513645202e-01 +104 116 9.980475420281747e-01 +104 117 9.659358568042387e-01 +104 118 9.659358568042380e-01 +104 119 9.980475420281747e-01 +104 120 7.871848513645219e-01 +104 121 1.833451203871217e-01 +104 122 -2.253712020788828e-01 +104 123 1.782365365319718e-02 +104 124 1.084975613502234e-01 +104 125 -1.153084751520921e-01 +104 126 4.654764921312522e-02 +105 109 -3.252580339149635e-02 +105 110 7.919894876866962e-02 +105 111 -7.170870669864604e-02 +105 112 -1.098389774586483e-02 +105 113 1.226433507083535e-01 +105 114 -7.898266143119360e-02 +105 115 -2.040533508482632e-01 +105 116 -3.205658723743707e-02 +105 117 1.582637096187145e-01 +105 118 -1.173436103509171e-01 +105 119 3.440881837089137e-02 +105 120 4.551820017945922e-01 +105 121 9.500818362211337e-01 +105 122 7.751613393474791e-01 +105 123 -3.524913251503787e-02 +105 124 -1.763260094650463e-01 +105 125 1.714825278878406e-01 +105 126 -6.675829549001404e-02 +106 109 2.163688115667201e-02 +106 110 -5.220965998265609e-02 +106 111 4.636253866511433e-02 +106 112 6.873636058247651e-03 +106 113 -7.297122858953713e-02 +106 114 4.361555150731149e-02 +106 115 1.016285359894874e-01 +106 116 1.413095968572473e-02 +106 117 -6.347065826161148e-02 +106 118 5.417647031984351e-02 +106 119 -1.467336790749117e-02 +106 120 -1.533011412395489e-01 +106 121 -1.151051233747787e-01 +106 122 4.718042883536014e-01 +106 123 1.003092729754151e+00 +106 124 4.009285655348399e-01 +106 125 -2.866596804778771e-01 +106 126 1.012997478615467e-01 +107 109 -1.242564713429051e-02 +107 110 2.983957599313226e-02 +107 111 -2.623252505678746e-02 +107 112 -3.826530502171602e-03 +107 113 3.967378200088206e-02 +107 114 -2.296833469170236e-02 +107 115 -5.147043285304129e-02 +107 116 -6.878577509574120e-03 +107 117 3.008346487896388e-02 +107 118 -2.675090448249169e-02 +107 119 7.073583005504268e-03 +107 120 6.969985820549132e-02 +107 121 4.603749937463613e-02 +107 122 -1.341009959651930e-01 +107 123 2.709112098463885e-02 +107 124 7.978124774257962e-01 +107 125 8.496052943251204e-01 +107 126 -1.833267155554904e-01 +108 109 4.056073820312080e-03 +108 110 -9.719999626669857e-03 +108 111 8.507818082537125e-03 +108 112 1.232479383921785e-03 +108 113 -1.265402077883458e-02 +108 114 7.233284760851008e-03 +108 115 1.597136003720141e-02 +108 116 2.104266184682273e-03 +108 117 -9.119197464262593e-03 +108 118 8.224868937522705e-03 +108 119 -2.156636620475048e-03 +108 120 -2.084168245044009e-02 +108 121 -1.325717275337857e-02 +108 122 3.581468700213186e-02 +108 123 -6.054059071081869e-03 +108 124 -8.784171983803077e-02 +108 125 3.337714682645319e-01 +108 126 1.121496109519637e+00 +127 136 1.121496109519637e+00 +127 137 3.337714682645320e-01 +127 138 -8.784171983803080e-02 +127 139 -6.054059071081879e-03 +127 140 3.581468700213206e-02 +127 141 -1.325717275337835e-02 +127 142 -2.084168245044001e-02 +127 143 -2.156636620475045e-03 +127 144 8.224868937522696e-03 +127 145 -9.119197464262567e-03 +127 146 2.104266184682268e-03 +127 147 1.597136003720142e-02 +127 148 7.233284760851101e-03 +127 149 -1.265402077883447e-02 +127 150 1.232479383921778e-03 +127 151 8.507818082537089e-03 +127 152 -9.719999626669817e-03 +127 153 4.056073820312327e-03 +128 136 -1.833267155554903e-01 +128 137 8.496052943251203e-01 +128 138 7.978124774257961e-01 +128 139 2.709112098463887e-02 +128 140 -1.341009959651937e-01 +128 141 4.603749937463534e-02 +128 142 6.969985820549099e-02 +128 143 7.073583005504250e-03 +128 144 -2.675090448249165e-02 +128 145 3.008346487896378e-02 +128 146 -6.878577509574104e-03 +128 147 -5.147043285304127e-02 +128 148 -2.296833469170264e-02 +128 149 3.967378200088167e-02 +128 150 -3.826530502171579e-03 +128 151 -2.623252505678734e-02 +128 152 2.983957599313212e-02 +128 153 -1.242564713429126e-02 +129 136 1.012997478615465e-01 +129 137 -2.866596804778766e-01 +129 138 4.009285655348391e-01 +129 139 1.003092729754151e+00 +129 140 4.718042883536031e-01 +129 141 -1.151051233747766e-01 +129 142 -1.533011412395480e-01 +129 143 -1.467336790749111e-02 +129 144 5.417647031984335e-02 +129 145 -6.347065826161118e-02 +129 146 1.413095968572468e-02 +129 147 1.016285359894872e-01 +129 148 4.361555150731197e-02 +129 149 -7.297122858953628e-02 +129 150 6.873636058247599e-03 +129 151 4.636253866511404e-02 +129 152 -5.220965998265576e-02 +129 153 2.163688115667329e-02 +130 136 -6.675829549001402e-02 +130 137 1.714825278878406e-01 +130 138 -1.763260094650463e-01 +130 139 -3.524913251503787e-02 +130 140 7.751613393474791e-01 +130 141 9.500818362211338e-01 +130 142 4.551820017945925e-01 +130 143 3.440881837089142e-02 +130 144 -1.173436103509174e-01 +130 145 1.582637096187146e-01 +130 146 -3.205658723743712e-02 +130 147 -2.040533508482638e-01 +130 148 -7.898266143119480e-02 +130 149 1.226433507083526e-01 +130 150 -1.098389774586479e-02 +130 151 -7.170870669864587e-02 +130 152 7.919894876866941e-02 +130 153 -3.252580339149837e-02 +131 136 4.654764921312531e-02 +131 137 -1.153084751520924e-01 +131 138 1.084975613502237e-01 +131 139 1.782365365319724e-02 +131 140 -2.253712020788844e-01 +131 141 1.833451203871190e-01 +131 142 7.871848513645202e-01 +131 143 9.980475420281747e-01 +131 144 9.659358568042387e-01 +131 145 9.659358568042380e-01 +131 146 9.980475420281747e-01 +131 147 7.871848513645219e-01 +131 148 1.833451203871217e-01 +131 149 -2.253712020788828e-01 +131 150 1.782365365319718e-02 +131 151 1.084975613502234e-01 +131 152 -1.153084751520921e-01 +131 153 4.654764921312522e-02 +132 136 -3.252580339149845e-02 +132 137 7.919894876866962e-02 +132 138 -7.170870669864604e-02 +132 139 -1.098389774586483e-02 +132 140 1.226433507083535e-01 +132 141 -7.898266143119360e-02 +132 142 -2.040533508482632e-01 +132 143 -3.205658723743707e-02 +132 144 1.582637096187145e-01 +132 145 -1.173436103509171e-01 +132 146 3.440881837089137e-02 +132 147 4.551820017945922e-01 +132 148 9.500818362211337e-01 +132 149 7.751613393474791e-01 +132 150 -3.524913251503787e-02 +132 151 -1.763260094650463e-01 +132 152 1.714825278878406e-01 +132 153 -6.675829549001404e-02 +133 136 2.163688115667341e-02 +133 137 -5.220965998265609e-02 +133 138 4.636253866511433e-02 +133 139 6.873636058247651e-03 +133 140 -7.297122858953713e-02 +133 141 4.361555150731149e-02 +133 142 1.016285359894874e-01 +133 143 1.413095968572473e-02 +133 144 -6.347065826161148e-02 +133 145 5.417647031984351e-02 +133 146 -1.467336790749117e-02 +133 147 -1.533011412395489e-01 +133 148 -1.151051233747787e-01 +133 149 4.718042883536014e-01 +133 150 1.003092729754151e+00 +133 151 4.009285655348399e-01 +133 152 -2.866596804778771e-01 +133 153 1.012997478615467e-01 +134 136 -1.242564713429132e-02 +134 137 2.983957599313226e-02 +134 138 -2.623252505678746e-02 +134 139 -3.826530502171602e-03 +134 140 3.967378200088206e-02 +134 141 -2.296833469170236e-02 +134 142 -5.147043285304129e-02 +134 143 -6.878577509574120e-03 +134 144 3.008346487896388e-02 +134 145 -2.675090448249169e-02 +134 146 7.073583005504268e-03 +134 147 6.969985820549132e-02 +134 148 4.603749937463613e-02 +134 149 -1.341009959651930e-01 +134 150 2.709112098463885e-02 +134 151 7.978124774257962e-01 +134 152 8.496052943251204e-01 +134 153 -1.833267155554904e-01 +135 136 4.056073820312343e-03 +135 137 -9.719999626669857e-03 +135 138 8.507818082537125e-03 +135 139 1.232479383921785e-03 +135 140 -1.265402077883458e-02 +135 141 7.233284760851008e-03 +135 142 1.597136003720141e-02 +135 143 2.104266184682273e-03 +135 144 -9.119197464262593e-03 +135 145 8.224868937522705e-03 +135 146 -2.156636620475048e-03 +135 147 -2.084168245044009e-02 +135 148 -1.325717275337857e-02 +135 149 3.581468700213186e-02 +135 150 -6.054059071081869e-03 +135 151 -8.784171983803077e-02 +135 152 3.337714682645319e-01 +135 153 1.121496109519637e+00 +172 181 1.121496109519636e+00 +172 182 3.337714682645341e-01 +172 183 -8.784171983802881e-02 +172 184 -6.054059071081806e-03 +172 185 3.581468700213155e-02 +172 186 -1.325717275337847e-02 +172 187 -2.084168245043995e-02 +172 188 -2.156636620475035e-03 +172 189 8.224868937522660e-03 +172 190 -9.119197464262532e-03 +172 191 2.104266184682260e-03 +172 192 1.597136003720134e-02 +172 193 7.233284760851064e-03 +172 194 -1.265402077883439e-02 +172 195 1.232479383921770e-03 +172 196 8.507818082536953e-03 +172 197 -9.719999626670039e-03 +172 198 4.056073820311856e-03 +173 181 -1.833267155554907e-01 +173 182 8.496052943251220e-01 +173 183 7.978124774257971e-01 +173 184 2.709112098463889e-02 +173 185 -1.341009959651932e-01 +173 186 4.603749937463623e-02 +173 187 6.969985820549149e-02 +173 188 7.073583005504289e-03 +173 189 -2.675090448249179e-02 +173 190 3.008346487896396e-02 +173 191 -6.878577509574143e-03 +173 192 -5.147043285304152e-02 +173 193 -2.296833469170273e-02 +173 194 3.967378200088182e-02 +173 195 -3.826530502171591e-03 +173 196 -2.623252505678717e-02 +173 197 2.983957599313308e-02 +173 198 -1.242564713428993e-02 +174 181 1.012997478615477e-01 +174 182 -2.866596804778820e-01 +174 183 4.009285655348350e-01 +174 184 1.003092729754151e+00 +174 185 4.718042883536022e-01 +174 186 -1.151051233747790e-01 +174 187 -1.533011412395494e-01 +174 188 -1.467336790749123e-02 +174 189 5.417647031984377e-02 +174 190 -6.347065826161172e-02 +174 191 1.413095968572479e-02 +174 192 1.016285359894880e-01 +174 193 4.361555150731226e-02 +174 194 -7.297122858953674e-02 +174 195 6.873636058247640e-03 +174 196 4.636253866511387e-02 +174 197 -5.220965998265761e-02 +174 198 2.163688115667104e-02 +175 181 -6.675829549001457e-02 +175 182 1.714825278878431e-01 +175 183 -1.763260094650438e-01 +175 184 -3.524913251503778e-02 +175 185 7.751613393474784e-01 +175 186 9.500818362211338e-01 +175 187 4.551820017945926e-01 +175 188 3.440881837089143e-02 +175 189 -1.173436103509174e-01 +175 190 1.582637096187147e-01 +175 191 -3.205658723743714e-02 +175 192 -2.040533508482639e-01 +175 193 -7.898266143119483e-02 +175 194 1.226433507083526e-01 +175 195 -1.098389774586479e-02 +175 196 -7.170870669864518e-02 +175 197 7.919894876867173e-02 +175 198 -3.252580339149481e-02 +176 181 4.654764921312549e-02 +176 182 -1.153084751520936e-01 +176 183 1.084975613502217e-01 +176 184 1.782365365319710e-02 +176 185 -2.253712020788822e-01 +176 186 1.833451203871214e-01 +176 187 7.871848513645213e-01 +176 188 9.980475420281747e-01 +176 189 9.659358568042385e-01 +176 190 9.659358568042382e-01 +176 191 9.980475420281748e-01 +176 192 7.871848513645214e-01 +176 193 1.833451203871215e-01 +176 194 -2.253712020788824e-01 +176 195 1.782365365319713e-02 +176 196 1.084975613502222e-01 +176 197 -1.153084751520952e-01 +176 198 4.654764921312001e-02 +177 181 -3.252580339149862e-02 +177 182 7.919894876867055e-02 +177 183 -7.170870669864482e-02 +177 184 -1.098389774586476e-02 +177 185 1.226433507083524e-01 +177 186 -7.898266143119473e-02 +177 187 -2.040533508482637e-01 +177 188 -3.205658723743711e-02 +177 189 1.582637096187146e-01 +177 190 -1.173436103509173e-01 +177 191 3.440881837089141e-02 +177 192 4.551820017945924e-01 +177 193 9.500818362211337e-01 +177 194 7.751613393474788e-01 +177 195 -3.524913251503783e-02 +177 196 -1.763260094650445e-01 +177 197 1.714825278878455e-01 +177 198 -6.675829549000666e-02 +178 181 2.163688115667355e-02 +178 182 -5.220965998265676e-02 +178 183 4.636253866511358e-02 +178 184 6.873636058247611e-03 +178 185 -7.297122858953654e-02 +178 186 4.361555150731216e-02 +178 187 1.016285359894877e-01 +178 188 1.413095968572477e-02 +178 189 -6.347065826161161e-02 +178 190 5.417647031984366e-02 +178 191 -1.467336790749121e-02 +178 192 -1.533011412395492e-01 +178 193 -1.151051233747789e-01 +178 194 4.718042883536017e-01 +178 195 1.003092729754151e+00 +178 196 4.009285655348360e-01 +178 197 -2.866596804778855e-01 +178 198 1.012997478615356e-01 +179 181 -1.242564713429132e-02 +179 182 2.983957599313247e-02 +179 183 -2.623252505678688e-02 +179 184 -3.826530502171558e-03 +179 185 3.967378200088152e-02 +179 186 -2.296833469170257e-02 +179 187 -5.147043285304119e-02 +179 188 -6.878577509574097e-03 +179 189 3.008346487896377e-02 +179 190 -2.675090448249161e-02 +179 191 7.073583005504245e-03 +179 192 6.969985820549104e-02 +179 193 4.603749937463595e-02 +179 194 -1.341009959651925e-01 +179 195 2.709112098463877e-02 +179 196 7.978124774257954e-01 +179 197 8.496052943251287e-01 +179 198 -1.833267155554679e-01 +180 181 4.056073820312278e-03 +180 182 -9.719999626669765e-03 +180 183 8.507818082536797e-03 +180 184 1.232479383921750e-03 +180 185 -1.265402077883420e-02 +180 186 7.233284760850957e-03 +180 187 1.597136003720111e-02 +180 188 2.104266184682229e-03 +180 189 -9.119197464262402e-03 +180 190 8.224868937522540e-03 +180 191 -2.156636620475005e-03 +180 192 -2.084168245043965e-02 +180 193 -1.325717275337828e-02 +180 194 3.581468700213104e-02 +180 195 -6.054059071081722e-03 +180 196 -8.784171983802759e-02 +180 197 3.337714682645294e-01 +180 198 1.121496109519620e+00 +199 208 1.121496109519621e+00 +199 209 3.337714682645296e-01 +199 210 -8.784171983802763e-02 +199 211 -6.054059071081724e-03 +199 212 3.581468700213108e-02 +199 213 -1.325717275337829e-02 +199 214 -2.084168245043966e-02 +199 215 -2.156636620475006e-03 +199 216 8.224868937522551e-03 +199 217 -9.119197464262409e-03 +199 218 2.104266184682231e-03 +199 219 1.597136003720112e-02 +199 220 7.233284760850968e-03 +199 221 -1.265402077883422e-02 +199 222 1.232479383921753e-03 +199 223 8.507818082536839e-03 +199 224 -9.719999626669907e-03 +199 225 4.056073820311803e-03 +200 208 -1.833267155554679e-01 +200 209 8.496052943251285e-01 +200 210 7.978124774257953e-01 +200 211 2.709112098463876e-02 +200 212 -1.341009959651925e-01 +200 213 4.603749937463596e-02 +200 214 6.969985820549106e-02 +200 215 7.073583005504246e-03 +200 216 -2.675090448249163e-02 +200 217 3.008346487896378e-02 +200 218 -6.878577509574100e-03 +200 219 -5.147043285304120e-02 +200 220 -2.296833469170259e-02 +200 221 3.967378200088156e-02 +200 222 -3.826530502171565e-03 +200 223 -2.623252505678700e-02 +200 224 2.983957599313289e-02 +200 225 -1.242564713428985e-02 +201 208 1.012997478615356e-01 +201 209 -2.866596804778855e-01 +201 210 4.009285655348359e-01 +201 211 1.003092729754151e+00 +201 212 4.718042883536018e-01 +201 213 -1.151051233747789e-01 +201 214 -1.533011412395492e-01 +201 215 -1.467336790749121e-02 +201 216 5.417647031984368e-02 +201 217 -6.347065826161161e-02 +201 218 1.413095968572477e-02 +201 219 1.016285359894878e-01 +201 220 4.361555150731219e-02 +201 221 -7.297122858953661e-02 +201 222 6.873636058247624e-03 +201 223 4.636253866511378e-02 +201 224 -5.220965998265749e-02 +201 225 2.163688115667100e-02 +202 208 -6.675829549000668e-02 +202 209 1.714825278878455e-01 +202 210 -1.763260094650445e-01 +202 211 -3.524913251503782e-02 +202 212 7.751613393474790e-01 +202 213 9.500818362211340e-01 +202 214 4.551820017945925e-01 +202 215 3.440881837089142e-02 +202 216 -1.173436103509174e-01 +202 217 1.582637096187147e-01 +202 218 -3.205658723743713e-02 +202 219 -2.040533508482638e-01 +202 220 -7.898266143119481e-02 +202 221 1.226433507083525e-01 +202 222 -1.098389774586478e-02 +202 223 -7.170870669864514e-02 +202 224 7.919894876867167e-02 +202 225 -3.252580339149479e-02 +203 208 4.654764921312001e-02 +203 209 -1.153084751520952e-01 +203 210 1.084975613502221e-01 +203 211 1.782365365319713e-02 +203 212 -2.253712020788824e-01 +203 213 1.833451203871215e-01 +203 214 7.871848513645213e-01 +203 215 9.980475420281749e-01 +203 216 9.659358568042388e-01 +203 217 9.659358568042387e-01 +203 218 9.980475420281750e-01 +203 219 7.871848513645214e-01 +203 220 1.833451203871215e-01 +203 221 -2.253712020788824e-01 +203 222 1.782365365319713e-02 +203 223 1.084975613502221e-01 +203 224 -1.153084751520952e-01 +203 225 4.654764921312000e-02 +204 208 -3.252580339149479e-02 +204 209 7.919894876867167e-02 +204 210 -7.170870669864511e-02 +204 211 -1.098389774586478e-02 +204 212 1.226433507083525e-01 +204 213 -7.898266143119478e-02 +204 214 -2.040533508482637e-01 +204 215 -3.205658723743712e-02 +204 216 1.582637096187146e-01 +204 217 -1.173436103509173e-01 +204 218 3.440881837089142e-02 +204 219 4.551820017945925e-01 +204 220 9.500818362211341e-01 +204 221 7.751613393474787e-01 +204 222 -3.524913251503782e-02 +204 223 -1.763260094650445e-01 +204 224 1.714825278878454e-01 +204 225 -6.675829549000664e-02 +205 208 2.163688115667100e-02 +205 209 -5.220965998265750e-02 +205 210 4.636253866511377e-02 +205 211 6.873636058247624e-03 +205 212 -7.297122858953663e-02 +205 213 4.361555150731218e-02 +205 214 1.016285359894878e-01 +205 215 1.413095968572477e-02 +205 216 -6.347065826161162e-02 +205 217 5.417647031984368e-02 +205 218 -1.467336790749121e-02 +205 219 -1.533011412395492e-01 +205 220 -1.151051233747789e-01 +205 221 4.718042883536017e-01 +205 222 1.003092729754151e+00 +205 223 4.009285655348360e-01 +205 224 -2.866596804778854e-01 +205 225 1.012997478615356e-01 +206 208 -1.242564713428986e-02 +206 209 2.983957599313289e-02 +206 210 -2.623252505678699e-02 +206 211 -3.826530502171565e-03 +206 212 3.967378200088157e-02 +206 213 -2.296833469170258e-02 +206 214 -5.147043285304119e-02 +206 215 -6.878577509574098e-03 +206 216 3.008346487896378e-02 +206 217 -2.675090448249162e-02 +206 218 7.073583005504246e-03 +206 219 6.969985820549106e-02 +206 220 4.603749937463596e-02 +206 221 -1.341009959651925e-01 +206 222 2.709112098463877e-02 +206 223 7.978124774257953e-01 +206 224 8.496052943251283e-01 +206 225 -1.833267155554679e-01 +207 208 4.056073820311802e-03 +207 209 -9.719999626669905e-03 +207 210 8.507818082536835e-03 +207 211 1.232479383921753e-03 +207 212 -1.265402077883422e-02 +207 213 7.233284760850963e-03 +207 214 1.597136003720112e-02 +207 215 2.104266184682230e-03 +207 216 -9.119197464262409e-03 +207 217 8.224868937522545e-03 +207 218 -2.156636620475006e-03 +207 219 -2.084168245043966e-02 +207 220 -1.325717275337829e-02 +207 221 3.581468700213105e-02 +207 222 -6.054059071081722e-03 +207 223 -8.784171983802760e-02 +207 224 3.337714682645294e-01 +207 225 1.121496109519621e+00 +235 244 1.121496109519621e+00 +235 245 3.337714682645296e-01 +235 246 -8.784171983802763e-02 +235 247 -6.054059071081724e-03 +235 248 3.581468700213108e-02 +235 249 -1.325717275337829e-02 +235 250 -2.084168245043966e-02 +235 251 -2.156636620475006e-03 +235 252 8.224868937522551e-03 +235 253 -9.119197464262409e-03 +235 254 2.104266184682231e-03 +235 255 1.597136003720112e-02 +235 256 7.233284760850968e-03 +235 257 -1.265402077883422e-02 +235 258 1.232479383921753e-03 +235 259 8.507818082536839e-03 +235 260 -9.719999626669907e-03 +235 261 4.056073820311803e-03 +236 244 -1.833267155554679e-01 +236 245 8.496052943251285e-01 +236 246 7.978124774257953e-01 +236 247 2.709112098463876e-02 +236 248 -1.341009959651925e-01 +236 249 4.603749937463596e-02 +236 250 6.969985820549106e-02 +236 251 7.073583005504246e-03 +236 252 -2.675090448249163e-02 +236 253 3.008346487896378e-02 +236 254 -6.878577509574100e-03 +236 255 -5.147043285304120e-02 +236 256 -2.296833469170259e-02 +236 257 3.967378200088156e-02 +236 258 -3.826530502171565e-03 +236 259 -2.623252505678700e-02 +236 260 2.983957599313289e-02 +236 261 -1.242564713428985e-02 +237 244 1.012997478615356e-01 +237 245 -2.866596804778855e-01 +237 246 4.009285655348359e-01 +237 247 1.003092729754151e+00 +237 248 4.718042883536018e-01 +237 249 -1.151051233747789e-01 +237 250 -1.533011412395492e-01 +237 251 -1.467336790749121e-02 +237 252 5.417647031984368e-02 +237 253 -6.347065826161161e-02 +237 254 1.413095968572477e-02 +237 255 1.016285359894878e-01 +237 256 4.361555150731219e-02 +237 257 -7.297122858953661e-02 +237 258 6.873636058247624e-03 +237 259 4.636253866511378e-02 +237 260 -5.220965998265749e-02 +237 261 2.163688115667100e-02 +238 244 -6.675829549000668e-02 +238 245 1.714825278878455e-01 +238 246 -1.763260094650445e-01 +238 247 -3.524913251503782e-02 +238 248 7.751613393474790e-01 +238 249 9.500818362211340e-01 +238 250 4.551820017945925e-01 +238 251 3.440881837089142e-02 +238 252 -1.173436103509174e-01 +238 253 1.582637096187147e-01 +238 254 -3.205658723743713e-02 +238 255 -2.040533508482638e-01 +238 256 -7.898266143119481e-02 +238 257 1.226433507083525e-01 +238 258 -1.098389774586478e-02 +238 259 -7.170870669864514e-02 +238 260 7.919894876867167e-02 +238 261 -3.252580339149479e-02 +239 244 4.654764921312001e-02 +239 245 -1.153084751520952e-01 +239 246 1.084975613502221e-01 +239 247 1.782365365319713e-02 +239 248 -2.253712020788824e-01 +239 249 1.833451203871215e-01 +239 250 7.871848513645213e-01 +239 251 9.980475420281749e-01 +239 252 9.659358568042388e-01 +239 253 9.659358568042387e-01 +239 254 9.980475420281750e-01 +239 255 7.871848513645214e-01 +239 256 1.833451203871215e-01 +239 257 -2.253712020788824e-01 +239 258 1.782365365319713e-02 +239 259 1.084975613502221e-01 +239 260 -1.153084751520952e-01 +239 261 4.654764921312000e-02 +240 244 -3.252580339149479e-02 +240 245 7.919894876867167e-02 +240 246 -7.170870669864511e-02 +240 247 -1.098389774586478e-02 +240 248 1.226433507083525e-01 +240 249 -7.898266143119478e-02 +240 250 -2.040533508482637e-01 +240 251 -3.205658723743712e-02 +240 252 1.582637096187146e-01 +240 253 -1.173436103509173e-01 +240 254 3.440881837089142e-02 +240 255 4.551820017945925e-01 +240 256 9.500818362211341e-01 +240 257 7.751613393474787e-01 +240 258 -3.524913251503782e-02 +240 259 -1.763260094650445e-01 +240 260 1.714825278878454e-01 +240 261 -6.675829549000664e-02 +241 244 2.163688115667100e-02 +241 245 -5.220965998265750e-02 +241 246 4.636253866511377e-02 +241 247 6.873636058247624e-03 +241 248 -7.297122858953663e-02 +241 249 4.361555150731218e-02 +241 250 1.016285359894878e-01 +241 251 1.413095968572477e-02 +241 252 -6.347065826161162e-02 +241 253 5.417647031984368e-02 +241 254 -1.467336790749121e-02 +241 255 -1.533011412395492e-01 +241 256 -1.151051233747789e-01 +241 257 4.718042883536017e-01 +241 258 1.003092729754151e+00 +241 259 4.009285655348360e-01 +241 260 -2.866596804778854e-01 +241 261 1.012997478615356e-01 +242 244 -1.242564713428986e-02 +242 245 2.983957599313289e-02 +242 246 -2.623252505678699e-02 +242 247 -3.826530502171565e-03 +242 248 3.967378200088157e-02 +242 249 -2.296833469170258e-02 +242 250 -5.147043285304119e-02 +242 251 -6.878577509574098e-03 +242 252 3.008346487896378e-02 +242 253 -2.675090448249162e-02 +242 254 7.073583005504246e-03 +242 255 6.969985820549106e-02 +242 256 4.603749937463596e-02 +242 257 -1.341009959651925e-01 +242 258 2.709112098463877e-02 +242 259 7.978124774257953e-01 +242 260 8.496052943251283e-01 +242 261 -1.833267155554679e-01 +243 244 4.056073820311802e-03 +243 245 -9.719999626669905e-03 +243 246 8.507818082536835e-03 +243 247 1.232479383921753e-03 +243 248 -1.265402077883422e-02 +243 249 7.233284760850963e-03 +243 250 1.597136003720112e-02 +243 251 2.104266184682230e-03 +243 252 -9.119197464262409e-03 +243 253 8.224868937522545e-03 +243 254 -2.156636620475006e-03 +243 255 -2.084168245043966e-02 +243 256 -1.325717275337829e-02 +243 257 3.581468700213105e-02 +243 258 -6.054059071081722e-03 +243 259 -8.784171983802760e-02 +243 260 3.337714682645294e-01 +243 261 1.121496109519621e+00 +262 271 1.121496109519621e+00 +262 272 3.337714682645296e-01 +262 273 -8.784171983802763e-02 +262 274 -6.054059071081724e-03 +262 275 3.581468700213108e-02 +262 276 -1.325717275337829e-02 +262 277 -2.084168245043966e-02 +262 278 -2.156636620475006e-03 +262 279 8.224868937522551e-03 +262 280 -9.119197464262409e-03 +262 281 2.104266184682231e-03 +262 282 1.597136003720112e-02 +262 283 7.233284760850968e-03 +262 284 -1.265402077883422e-02 +262 285 1.232479383921753e-03 +262 286 8.507818082536839e-03 +262 287 -9.719999626669907e-03 +262 288 4.056073820311803e-03 +263 271 -1.833267155554679e-01 +263 272 8.496052943251285e-01 +263 273 7.978124774257953e-01 +263 274 2.709112098463876e-02 +263 275 -1.341009959651925e-01 +263 276 4.603749937463596e-02 +263 277 6.969985820549106e-02 +263 278 7.073583005504246e-03 +263 279 -2.675090448249163e-02 +263 280 3.008346487896378e-02 +263 281 -6.878577509574100e-03 +263 282 -5.147043285304120e-02 +263 283 -2.296833469170259e-02 +263 284 3.967378200088156e-02 +263 285 -3.826530502171565e-03 +263 286 -2.623252505678700e-02 +263 287 2.983957599313289e-02 +263 288 -1.242564713428985e-02 +264 271 1.012997478615356e-01 +264 272 -2.866596804778855e-01 +264 273 4.009285655348359e-01 +264 274 1.003092729754151e+00 +264 275 4.718042883536018e-01 +264 276 -1.151051233747789e-01 +264 277 -1.533011412395492e-01 +264 278 -1.467336790749121e-02 +264 279 5.417647031984368e-02 +264 280 -6.347065826161161e-02 +264 281 1.413095968572477e-02 +264 282 1.016285359894878e-01 +264 283 4.361555150731219e-02 +264 284 -7.297122858953661e-02 +264 285 6.873636058247624e-03 +264 286 4.636253866511378e-02 +264 287 -5.220965998265749e-02 +264 288 2.163688115667100e-02 +265 271 -6.675829549000668e-02 +265 272 1.714825278878455e-01 +265 273 -1.763260094650445e-01 +265 274 -3.524913251503782e-02 +265 275 7.751613393474790e-01 +265 276 9.500818362211340e-01 +265 277 4.551820017945925e-01 +265 278 3.440881837089142e-02 +265 279 -1.173436103509174e-01 +265 280 1.582637096187147e-01 +265 281 -3.205658723743713e-02 +265 282 -2.040533508482638e-01 +265 283 -7.898266143119481e-02 +265 284 1.226433507083525e-01 +265 285 -1.098389774586478e-02 +265 286 -7.170870669864514e-02 +265 287 7.919894876867167e-02 +265 288 -3.252580339149479e-02 +266 271 4.654764921312001e-02 +266 272 -1.153084751520952e-01 +266 273 1.084975613502221e-01 +266 274 1.782365365319713e-02 +266 275 -2.253712020788824e-01 +266 276 1.833451203871215e-01 +266 277 7.871848513645213e-01 +266 278 9.980475420281749e-01 +266 279 9.659358568042388e-01 +266 280 9.659358568042387e-01 +266 281 9.980475420281750e-01 +266 282 7.871848513645214e-01 +266 283 1.833451203871215e-01 +266 284 -2.253712020788824e-01 +266 285 1.782365365319713e-02 +266 286 1.084975613502221e-01 +266 287 -1.153084751520952e-01 +266 288 4.654764921312000e-02 +267 271 -3.252580339149479e-02 +267 272 7.919894876867167e-02 +267 273 -7.170870669864511e-02 +267 274 -1.098389774586478e-02 +267 275 1.226433507083525e-01 +267 276 -7.898266143119478e-02 +267 277 -2.040533508482637e-01 +267 278 -3.205658723743712e-02 +267 279 1.582637096187146e-01 +267 280 -1.173436103509173e-01 +267 281 3.440881837089142e-02 +267 282 4.551820017945925e-01 +267 283 9.500818362211341e-01 +267 284 7.751613393474787e-01 +267 285 -3.524913251503782e-02 +267 286 -1.763260094650445e-01 +267 287 1.714825278878454e-01 +267 288 -6.675829549000664e-02 +268 271 2.163688115667100e-02 +268 272 -5.220965998265750e-02 +268 273 4.636253866511377e-02 +268 274 6.873636058247624e-03 +268 275 -7.297122858953663e-02 +268 276 4.361555150731218e-02 +268 277 1.016285359894878e-01 +268 278 1.413095968572477e-02 +268 279 -6.347065826161162e-02 +268 280 5.417647031984368e-02 +268 281 -1.467336790749121e-02 +268 282 -1.533011412395492e-01 +268 283 -1.151051233747789e-01 +268 284 4.718042883536017e-01 +268 285 1.003092729754151e+00 +268 286 4.009285655348360e-01 +268 287 -2.866596804778854e-01 +268 288 1.012997478615356e-01 +269 271 -1.242564713428986e-02 +269 272 2.983957599313289e-02 +269 273 -2.623252505678699e-02 +269 274 -3.826530502171565e-03 +269 275 3.967378200088157e-02 +269 276 -2.296833469170258e-02 +269 277 -5.147043285304119e-02 +269 278 -6.878577509574098e-03 +269 279 3.008346487896378e-02 +269 280 -2.675090448249162e-02 +269 281 7.073583005504246e-03 +269 282 6.969985820549106e-02 +269 283 4.603749937463596e-02 +269 284 -1.341009959651925e-01 +269 285 2.709112098463877e-02 +269 286 7.978124774257953e-01 +269 287 8.496052943251283e-01 +269 288 -1.833267155554679e-01 +270 271 4.056073820311802e-03 +270 272 -9.719999626669905e-03 +270 273 8.507818082536835e-03 +270 274 1.232479383921753e-03 +270 275 -1.265402077883422e-02 +270 276 7.233284760850963e-03 +270 277 1.597136003720112e-02 +270 278 2.104266184682230e-03 +270 279 -9.119197464262409e-03 +270 280 8.224868937522545e-03 +270 281 -2.156636620475006e-03 +270 282 -2.084168245043966e-02 +270 283 -1.325717275337829e-02 +270 284 3.581468700213105e-02 +270 285 -6.054059071081722e-03 +270 286 -8.784171983802760e-02 +270 287 3.337714682645294e-01 +270 288 1.121496109519621e+00 +316 325 1.121496109519621e+00 +316 326 3.337714682645254e-01 +316 327 -8.784171983803062e-02 +316 328 -6.054059071081856e-03 +316 329 3.581468700213172e-02 +316 330 -1.325717275337852e-02 +316 331 -2.084168245043984e-02 +316 332 -2.156636620475042e-03 +316 333 8.224868937522447e-03 +316 334 -9.119197464262268e-03 +316 335 2.104266184682266e-03 +316 336 1.597136003720132e-02 +316 337 7.233284760851093e-03 +316 338 -1.265402077883446e-02 +316 339 1.232479383921780e-03 +316 340 8.507818082537037e-03 +316 341 -9.719999626669784e-03 +316 342 4.056073820310753e-03 +317 325 -1.833267155554674e-01 +317 326 8.496052943251265e-01 +317 327 7.978124774258017e-01 +317 328 2.709112098463870e-02 +317 329 -1.341009959651922e-01 +317 330 4.603749937463587e-02 +317 331 6.969985820549034e-02 +317 332 7.073583005504234e-03 +317 333 -2.675090448249081e-02 +317 334 3.008346487896275e-02 +317 335 -6.878577509574089e-03 +317 336 -5.147043285304089e-02 +317 337 -2.296833469170258e-02 +317 338 3.967378200088160e-02 +317 339 -3.826530502171582e-03 +317 340 -2.623252505678715e-02 +317 341 2.983957599313199e-02 +317 342 -1.242564713428643e-02 +318 325 1.012997478615335e-01 +318 326 -2.866596804778757e-01 +318 327 4.009285655348331e-01 +318 328 1.003092729754151e+00 +318 329 4.718042883536003e-01 +318 330 -1.151051233747784e-01 +318 331 -1.533011412395470e-01 +318 332 -1.467336790749114e-02 +318 333 5.417647031984189e-02 +318 334 -6.347065826160919e-02 +318 335 1.413095968572470e-02 +318 336 1.016285359894869e-01 +318 337 4.361555150731201e-02 +318 338 -7.297122858953638e-02 +318 339 6.873636058247627e-03 +318 340 4.636253866511385e-02 +318 341 -5.220965998265570e-02 +318 342 2.163688115666493e-02 +319 325 -6.675829549000552e-02 +319 326 1.714825278878403e-01 +319 327 -1.763260094650451e-01 +319 328 -3.524913251503798e-02 +319 329 7.751613393474797e-01 +319 330 9.500818362211337e-01 +319 331 4.551820017945857e-01 +319 332 3.440881837089139e-02 +319 333 -1.173436103509141e-01 +319 334 1.582637096187088e-01 +319 335 -3.205658723743710e-02 +319 336 -2.040533508482630e-01 +319 337 -7.898266143119480e-02 +319 338 1.226433507083526e-01 +319 339 -1.098389774586483e-02 +319 340 -7.170870669864551e-02 +319 341 7.919894876866927e-02 +319 342 -3.252580339148582e-02 +320 325 4.654764921311925e-02 +320 326 -1.153084751520918e-01 +320 327 1.084975613502227e-01 +320 328 1.782365365319722e-02 +320 329 -2.253712020788828e-01 +320 330 1.833451203871216e-01 +320 331 7.871848513645266e-01 +320 332 9.980475420281749e-01 +320 333 9.659358568042407e-01 +320 334 9.659358568042410e-01 +320 335 9.980475420281750e-01 +320 336 7.871848513645266e-01 +320 337 1.833451203871216e-01 +320 338 -2.253712020788828e-01 +320 339 1.782365365319722e-02 +320 340 1.084975613502227e-01 +320 341 -1.153084751520918e-01 +320 342 4.654764921310723e-02 +321 325 -3.252580339149424e-02 +321 326 7.919894876866930e-02 +321 327 -7.170870669864551e-02 +321 328 -1.098389774586483e-02 +321 329 1.226433507083526e-01 +321 330 -7.898266143119477e-02 +321 331 -2.040533508482630e-01 +321 332 -3.205658723743710e-02 +321 333 1.582637096187088e-01 +321 334 -1.173436103509142e-01 +321 335 3.440881837089139e-02 +321 336 4.551820017945857e-01 +321 337 9.500818362211341e-01 +321 338 7.751613393474795e-01 +321 339 -3.524913251503798e-02 +321 340 -1.763260094650451e-01 +321 341 1.714825278878403e-01 +321 342 -6.675829548998834e-02 +322 325 2.163688115667054e-02 +322 326 -5.220965998265572e-02 +322 327 4.636253866511385e-02 +322 328 6.873636058247627e-03 +322 329 -7.297122858953639e-02 +322 330 4.361555150731200e-02 +322 331 1.016285359894869e-01 +322 332 1.413095968572470e-02 +322 333 -6.347065826160918e-02 +322 334 5.417647031984189e-02 +322 335 -1.467336790749114e-02 +322 336 -1.533011412395470e-01 +322 337 -1.151051233747784e-01 +322 338 4.718042883536002e-01 +322 339 1.003092729754151e+00 +322 340 4.009285655348331e-01 +322 341 -2.866596804778757e-01 +322 342 1.012997478615076e-01 +323 325 -1.242564713428964e-02 +323 326 2.983957599313199e-02 +323 327 -2.623252505678715e-02 +323 328 -3.826530502171581e-03 +323 329 3.967378200088158e-02 +323 330 -2.296833469170257e-02 +323 331 -5.147043285304088e-02 +323 332 -6.878577509574086e-03 +323 333 3.008346487896273e-02 +323 334 -2.675090448249081e-02 +323 335 7.073583005504234e-03 +323 336 6.969985820549032e-02 +323 337 4.603749937463587e-02 +323 338 -1.341009959651922e-01 +323 339 2.709112098463870e-02 +323 340 7.978124774258015e-01 +323 341 8.496052943251261e-01 +323 342 -1.833267155554221e-01 +324 325 4.056073820311804e-03 +324 326 -9.719999626669786e-03 +324 327 8.507818082537037e-03 +324 328 1.232479383921780e-03 +324 329 -1.265402077883446e-02 +324 330 7.233284760851091e-03 +324 331 1.597136003720132e-02 +324 332 2.104266184682266e-03 +324 333 -9.119197464262265e-03 +324 334 8.224868937522448e-03 +324 335 -2.156636620475042e-03 +324 336 -2.084168245043984e-02 +324 337 -1.325717275337852e-02 +324 338 3.581468700213172e-02 +324 339 -6.054059071081856e-03 +324 340 -8.784171983803062e-02 +324 341 3.337714682645253e-01 +324 342 1.121496109519592e+00 +343 352 1.121496109519592e+00 +343 353 3.337714682645254e-01 +343 354 -8.784171983803062e-02 +343 355 -6.054059071081856e-03 +343 356 3.581468700213172e-02 +343 357 -1.325717275337852e-02 +343 358 -2.084168245043984e-02 +343 359 -2.156636620475042e-03 +343 360 8.224868937522447e-03 +343 361 -9.119197464262268e-03 +343 362 2.104266184682266e-03 +343 363 1.597136003720132e-02 +343 364 7.233284760851093e-03 +343 365 -1.265402077883446e-02 +343 366 1.232479383921780e-03 +343 367 8.507818082537037e-03 +343 368 -9.719999626669784e-03 +343 369 4.056073820310753e-03 +344 352 -1.833267155554221e-01 +344 353 8.496052943251265e-01 +344 354 7.978124774258017e-01 +344 355 2.709112098463870e-02 +344 356 -1.341009959651922e-01 +344 357 4.603749937463587e-02 +344 358 6.969985820549034e-02 +344 359 7.073583005504234e-03 +344 360 -2.675090448249081e-02 +344 361 3.008346487896275e-02 +344 362 -6.878577509574089e-03 +344 363 -5.147043285304089e-02 +344 364 -2.296833469170258e-02 +344 365 3.967378200088160e-02 +344 366 -3.826530502171582e-03 +344 367 -2.623252505678715e-02 +344 368 2.983957599313199e-02 +344 369 -1.242564713428643e-02 +345 352 1.012997478615076e-01 +345 353 -2.866596804778757e-01 +345 354 4.009285655348331e-01 +345 355 1.003092729754151e+00 +345 356 4.718042883536003e-01 +345 357 -1.151051233747784e-01 +345 358 -1.533011412395470e-01 +345 359 -1.467336790749114e-02 +345 360 5.417647031984189e-02 +345 361 -6.347065826160919e-02 +345 362 1.413095968572470e-02 +345 363 1.016285359894869e-01 +345 364 4.361555150731201e-02 +345 365 -7.297122858953638e-02 +345 366 6.873636058247627e-03 +345 367 4.636253866511385e-02 +345 368 -5.220965998265570e-02 +345 369 2.163688115666493e-02 +346 352 -6.675829548998832e-02 +346 353 1.714825278878403e-01 +346 354 -1.763260094650451e-01 +346 355 -3.524913251503798e-02 +346 356 7.751613393474797e-01 +346 357 9.500818362211337e-01 +346 358 4.551820017945857e-01 +346 359 3.440881837089139e-02 +346 360 -1.173436103509141e-01 +346 361 1.582637096187088e-01 +346 362 -3.205658723743710e-02 +346 363 -2.040533508482630e-01 +346 364 -7.898266143119480e-02 +346 365 1.226433507083526e-01 +346 366 -1.098389774586483e-02 +346 367 -7.170870669864551e-02 +346 368 7.919894876866927e-02 +346 369 -3.252580339148582e-02 +347 352 4.654764921310722e-02 +347 353 -1.153084751520918e-01 +347 354 1.084975613502227e-01 +347 355 1.782365365319722e-02 +347 356 -2.253712020788828e-01 +347 357 1.833451203871216e-01 +347 358 7.871848513645266e-01 +347 359 9.980475420281749e-01 +347 360 9.659358568042407e-01 +347 361 9.659358568042410e-01 +347 362 9.980475420281750e-01 +347 363 7.871848513645266e-01 +347 364 1.833451203871216e-01 +347 365 -2.253712020788828e-01 +347 366 1.782365365319722e-02 +347 367 1.084975613502227e-01 +347 368 -1.153084751520918e-01 +347 369 4.654764921310723e-02 +348 352 -3.252580339148581e-02 +348 353 7.919894876866930e-02 +348 354 -7.170870669864551e-02 +348 355 -1.098389774586483e-02 +348 356 1.226433507083526e-01 +348 357 -7.898266143119477e-02 +348 358 -2.040533508482630e-01 +348 359 -3.205658723743710e-02 +348 360 1.582637096187088e-01 +348 361 -1.173436103509142e-01 +348 362 3.440881837089139e-02 +348 363 4.551820017945857e-01 +348 364 9.500818362211341e-01 +348 365 7.751613393474795e-01 +348 366 -3.524913251503798e-02 +348 367 -1.763260094650451e-01 +348 368 1.714825278878403e-01 +348 369 -6.675829548998834e-02 +349 352 2.163688115666493e-02 +349 353 -5.220965998265572e-02 +349 354 4.636253866511385e-02 +349 355 6.873636058247627e-03 +349 356 -7.297122858953639e-02 +349 357 4.361555150731200e-02 +349 358 1.016285359894869e-01 +349 359 1.413095968572470e-02 +349 360 -6.347065826160918e-02 +349 361 5.417647031984189e-02 +349 362 -1.467336790749114e-02 +349 363 -1.533011412395470e-01 +349 364 -1.151051233747784e-01 +349 365 4.718042883536002e-01 +349 366 1.003092729754151e+00 +349 367 4.009285655348331e-01 +349 368 -2.866596804778757e-01 +349 369 1.012997478615076e-01 +350 352 -1.242564713428642e-02 +350 353 2.983957599313199e-02 +350 354 -2.623252505678715e-02 +350 355 -3.826530502171581e-03 +350 356 3.967378200088158e-02 +350 357 -2.296833469170257e-02 +350 358 -5.147043285304088e-02 +350 359 -6.878577509574086e-03 +350 360 3.008346487896273e-02 +350 361 -2.675090448249081e-02 +350 362 7.073583005504234e-03 +350 363 6.969985820549032e-02 +350 364 4.603749937463587e-02 +350 365 -1.341009959651922e-01 +350 366 2.709112098463870e-02 +350 367 7.978124774258015e-01 +350 368 8.496052943251261e-01 +350 369 -1.833267155554221e-01 +351 352 4.056073820310752e-03 +351 353 -9.719999626669786e-03 +351 354 8.507818082537037e-03 +351 355 1.232479383921780e-03 +351 356 -1.265402077883446e-02 +351 357 7.233284760851091e-03 +351 358 1.597136003720132e-02 +351 359 2.104266184682266e-03 +351 360 -9.119197464262265e-03 +351 361 8.224868937522448e-03 +351 362 -2.156636620475042e-03 +351 363 -2.084168245043984e-02 +351 364 -1.325717275337852e-02 +351 365 3.581468700213172e-02 +351 366 -6.054059071081856e-03 +351 367 -8.784171983803062e-02 +351 368 3.337714682645253e-01 +351 369 1.121496109519592e+00 +379 388 1.121496109519592e+00 +379 389 3.337714682645254e-01 +379 390 -8.784171983803062e-02 +379 391 -6.054059071081856e-03 +379 392 3.581468700213172e-02 +379 393 -1.325717275337852e-02 +379 394 -2.084168245043984e-02 +379 395 -2.156636620475042e-03 +379 396 8.224868937522447e-03 +379 397 -9.119197464262268e-03 +379 398 2.104266184682266e-03 +379 399 1.597136003720132e-02 +379 400 7.233284760851093e-03 +379 401 -1.265402077883446e-02 +379 402 1.232479383921780e-03 +379 403 8.507818082537037e-03 +379 404 -9.719999626669784e-03 +379 405 4.056073820310753e-03 +380 388 -1.833267155554221e-01 +380 389 8.496052943251265e-01 +380 390 7.978124774258017e-01 +380 391 2.709112098463870e-02 +380 392 -1.341009959651922e-01 +380 393 4.603749937463587e-02 +380 394 6.969985820549034e-02 +380 395 7.073583005504234e-03 +380 396 -2.675090448249081e-02 +380 397 3.008346487896275e-02 +380 398 -6.878577509574089e-03 +380 399 -5.147043285304089e-02 +380 400 -2.296833469170258e-02 +380 401 3.967378200088160e-02 +380 402 -3.826530502171582e-03 +380 403 -2.623252505678715e-02 +380 404 2.983957599313199e-02 +380 405 -1.242564713428643e-02 +381 388 1.012997478615076e-01 +381 389 -2.866596804778757e-01 +381 390 4.009285655348331e-01 +381 391 1.003092729754151e+00 +381 392 4.718042883536003e-01 +381 393 -1.151051233747784e-01 +381 394 -1.533011412395470e-01 +381 395 -1.467336790749114e-02 +381 396 5.417647031984189e-02 +381 397 -6.347065826160919e-02 +381 398 1.413095968572470e-02 +381 399 1.016285359894869e-01 +381 400 4.361555150731201e-02 +381 401 -7.297122858953638e-02 +381 402 6.873636058247627e-03 +381 403 4.636253866511385e-02 +381 404 -5.220965998265570e-02 +381 405 2.163688115666493e-02 +382 388 -6.675829548998832e-02 +382 389 1.714825278878403e-01 +382 390 -1.763260094650451e-01 +382 391 -3.524913251503798e-02 +382 392 7.751613393474797e-01 +382 393 9.500818362211337e-01 +382 394 4.551820017945857e-01 +382 395 3.440881837089139e-02 +382 396 -1.173436103509141e-01 +382 397 1.582637096187088e-01 +382 398 -3.205658723743710e-02 +382 399 -2.040533508482630e-01 +382 400 -7.898266143119480e-02 +382 401 1.226433507083526e-01 +382 402 -1.098389774586483e-02 +382 403 -7.170870669864551e-02 +382 404 7.919894876866927e-02 +382 405 -3.252580339148582e-02 +383 388 4.654764921310722e-02 +383 389 -1.153084751520918e-01 +383 390 1.084975613502227e-01 +383 391 1.782365365319722e-02 +383 392 -2.253712020788828e-01 +383 393 1.833451203871216e-01 +383 394 7.871848513645266e-01 +383 395 9.980475420281749e-01 +383 396 9.659358568042407e-01 +383 397 9.659358568042410e-01 +383 398 9.980475420281750e-01 +383 399 7.871848513645266e-01 +383 400 1.833451203871216e-01 +383 401 -2.253712020788828e-01 +383 402 1.782365365319722e-02 +383 403 1.084975613502227e-01 +383 404 -1.153084751520918e-01 +383 405 4.654764921310723e-02 +384 388 -3.252580339148581e-02 +384 389 7.919894876866930e-02 +384 390 -7.170870669864551e-02 +384 391 -1.098389774586483e-02 +384 392 1.226433507083526e-01 +384 393 -7.898266143119477e-02 +384 394 -2.040533508482630e-01 +384 395 -3.205658723743710e-02 +384 396 1.582637096187088e-01 +384 397 -1.173436103509142e-01 +384 398 3.440881837089139e-02 +384 399 4.551820017945857e-01 +384 400 9.500818362211341e-01 +384 401 7.751613393474795e-01 +384 402 -3.524913251503798e-02 +384 403 -1.763260094650451e-01 +384 404 1.714825278878403e-01 +384 405 -6.675829548998834e-02 +385 388 2.163688115666493e-02 +385 389 -5.220965998265572e-02 +385 390 4.636253866511385e-02 +385 391 6.873636058247627e-03 +385 392 -7.297122858953639e-02 +385 393 4.361555150731200e-02 +385 394 1.016285359894869e-01 +385 395 1.413095968572470e-02 +385 396 -6.347065826160918e-02 +385 397 5.417647031984189e-02 +385 398 -1.467336790749114e-02 +385 399 -1.533011412395470e-01 +385 400 -1.151051233747784e-01 +385 401 4.718042883536002e-01 +385 402 1.003092729754151e+00 +385 403 4.009285655348331e-01 +385 404 -2.866596804778757e-01 +385 405 1.012997478615076e-01 +386 388 -1.242564713428642e-02 +386 389 2.983957599313199e-02 +386 390 -2.623252505678715e-02 +386 391 -3.826530502171581e-03 +386 392 3.967378200088158e-02 +386 393 -2.296833469170257e-02 +386 394 -5.147043285304088e-02 +386 395 -6.878577509574086e-03 +386 396 3.008346487896273e-02 +386 397 -2.675090448249081e-02 +386 398 7.073583005504234e-03 +386 399 6.969985820549032e-02 +386 400 4.603749937463587e-02 +386 401 -1.341009959651922e-01 +386 402 2.709112098463870e-02 +386 403 7.978124774258015e-01 +386 404 8.496052943251261e-01 +386 405 -1.833267155554221e-01 +387 388 4.056073820310752e-03 +387 389 -9.719999626669786e-03 +387 390 8.507818082537037e-03 +387 391 1.232479383921780e-03 +387 392 -1.265402077883446e-02 +387 393 7.233284760851091e-03 +387 394 1.597136003720132e-02 +387 395 2.104266184682266e-03 +387 396 -9.119197464262265e-03 +387 397 8.224868937522448e-03 +387 398 -2.156636620475042e-03 +387 399 -2.084168245043984e-02 +387 400 -1.325717275337852e-02 +387 401 3.581468700213172e-02 +387 402 -6.054059071081856e-03 +387 403 -8.784171983803062e-02 +387 404 3.337714682645253e-01 +387 405 1.121496109519592e+00 +406 415 1.121496109519592e+00 +406 416 3.337714682645254e-01 +406 417 -8.784171983803062e-02 +406 418 -6.054059071081856e-03 +406 419 3.581468700213172e-02 +406 420 -1.325717275337852e-02 +406 421 -2.084168245043984e-02 +406 422 -2.156636620475042e-03 +406 423 8.224868937522447e-03 +406 424 -9.119197464262268e-03 +406 425 2.104266184682266e-03 +406 426 1.597136003720132e-02 +406 427 7.233284760851093e-03 +406 428 -1.265402077883446e-02 +406 429 1.232479383921780e-03 +406 430 8.507818082537037e-03 +406 431 -9.719999626669784e-03 +406 432 4.056073820310753e-03 +407 415 -1.833267155554221e-01 +407 416 8.496052943251265e-01 +407 417 7.978124774258017e-01 +407 418 2.709112098463870e-02 +407 419 -1.341009959651922e-01 +407 420 4.603749937463587e-02 +407 421 6.969985820549034e-02 +407 422 7.073583005504234e-03 +407 423 -2.675090448249081e-02 +407 424 3.008346487896275e-02 +407 425 -6.878577509574089e-03 +407 426 -5.147043285304089e-02 +407 427 -2.296833469170258e-02 +407 428 3.967378200088160e-02 +407 429 -3.826530502171582e-03 +407 430 -2.623252505678715e-02 +407 431 2.983957599313199e-02 +407 432 -1.242564713428643e-02 +408 415 1.012997478615076e-01 +408 416 -2.866596804778757e-01 +408 417 4.009285655348331e-01 +408 418 1.003092729754151e+00 +408 419 4.718042883536003e-01 +408 420 -1.151051233747784e-01 +408 421 -1.533011412395470e-01 +408 422 -1.467336790749114e-02 +408 423 5.417647031984189e-02 +408 424 -6.347065826160919e-02 +408 425 1.413095968572470e-02 +408 426 1.016285359894869e-01 +408 427 4.361555150731201e-02 +408 428 -7.297122858953638e-02 +408 429 6.873636058247627e-03 +408 430 4.636253866511385e-02 +408 431 -5.220965998265570e-02 +408 432 2.163688115666493e-02 +409 415 -6.675829548998832e-02 +409 416 1.714825278878403e-01 +409 417 -1.763260094650451e-01 +409 418 -3.524913251503798e-02 +409 419 7.751613393474797e-01 +409 420 9.500818362211337e-01 +409 421 4.551820017945857e-01 +409 422 3.440881837089139e-02 +409 423 -1.173436103509141e-01 +409 424 1.582637096187088e-01 +409 425 -3.205658723743710e-02 +409 426 -2.040533508482630e-01 +409 427 -7.898266143119480e-02 +409 428 1.226433507083526e-01 +409 429 -1.098389774586483e-02 +409 430 -7.170870669864551e-02 +409 431 7.919894876866927e-02 +409 432 -3.252580339148582e-02 +410 415 4.654764921310722e-02 +410 416 -1.153084751520918e-01 +410 417 1.084975613502227e-01 +410 418 1.782365365319722e-02 +410 419 -2.253712020788828e-01 +410 420 1.833451203871216e-01 +410 421 7.871848513645266e-01 +410 422 9.980475420281749e-01 +410 423 9.659358568042407e-01 +410 424 9.659358568042410e-01 +410 425 9.980475420281750e-01 +410 426 7.871848513645266e-01 +410 427 1.833451203871216e-01 +410 428 -2.253712020788828e-01 +410 429 1.782365365319722e-02 +410 430 1.084975613502227e-01 +410 431 -1.153084751520918e-01 +410 432 4.654764921310723e-02 +411 415 -3.252580339148581e-02 +411 416 7.919894876866930e-02 +411 417 -7.170870669864551e-02 +411 418 -1.098389774586483e-02 +411 419 1.226433507083526e-01 +411 420 -7.898266143119477e-02 +411 421 -2.040533508482630e-01 +411 422 -3.205658723743710e-02 +411 423 1.582637096187088e-01 +411 424 -1.173436103509142e-01 +411 425 3.440881837089139e-02 +411 426 4.551820017945857e-01 +411 427 9.500818362211341e-01 +411 428 7.751613393474795e-01 +411 429 -3.524913251503798e-02 +411 430 -1.763260094650451e-01 +411 431 1.714825278878403e-01 +411 432 -6.675829548998834e-02 +412 415 2.163688115666493e-02 +412 416 -5.220965998265572e-02 +412 417 4.636253866511385e-02 +412 418 6.873636058247627e-03 +412 419 -7.297122858953639e-02 +412 420 4.361555150731200e-02 +412 421 1.016285359894869e-01 +412 422 1.413095968572470e-02 +412 423 -6.347065826160918e-02 +412 424 5.417647031984189e-02 +412 425 -1.467336790749114e-02 +412 426 -1.533011412395470e-01 +412 427 -1.151051233747784e-01 +412 428 4.718042883536002e-01 +412 429 1.003092729754151e+00 +412 430 4.009285655348331e-01 +412 431 -2.866596804778757e-01 +412 432 1.012997478615076e-01 +413 415 -1.242564713428642e-02 +413 416 2.983957599313199e-02 +413 417 -2.623252505678715e-02 +413 418 -3.826530502171581e-03 +413 419 3.967378200088158e-02 +413 420 -2.296833469170257e-02 +413 421 -5.147043285304088e-02 +413 422 -6.878577509574086e-03 +413 423 3.008346487896273e-02 +413 424 -2.675090448249081e-02 +413 425 7.073583005504234e-03 +413 426 6.969985820549032e-02 +413 427 4.603749937463587e-02 +413 428 -1.341009959651922e-01 +413 429 2.709112098463870e-02 +413 430 7.978124774258015e-01 +413 431 8.496052943251261e-01 +413 432 -1.833267155554221e-01 +414 415 4.056073820310752e-03 +414 416 -9.719999626669786e-03 +414 417 8.507818082537037e-03 +414 418 1.232479383921780e-03 +414 419 -1.265402077883446e-02 +414 420 7.233284760851091e-03 +414 421 1.597136003720132e-02 +414 422 2.104266184682266e-03 +414 423 -9.119197464262265e-03 +414 424 8.224868937522448e-03 +414 425 -2.156636620475042e-03 +414 426 -2.084168245043984e-02 +414 427 -1.325717275337852e-02 +414 428 3.581468700213172e-02 +414 429 -6.054059071081856e-03 +414 430 -8.784171983803062e-02 +414 431 3.337714682645253e-01 +414 432 1.121496109519592e+00 +451 460 1.121496109519592e+00 +451 461 3.337714682645254e-01 +451 462 -8.784171983803062e-02 +451 463 -6.054059071081856e-03 +451 464 3.581468700213172e-02 +451 465 -1.325717275337852e-02 +451 466 -2.084168245043984e-02 +451 467 -2.156636620475042e-03 +451 468 8.224868937522447e-03 +451 469 -9.119197464262268e-03 +451 470 2.104266184682266e-03 +451 471 1.597136003720132e-02 +451 472 7.233284760851093e-03 +451 473 -1.265402077883446e-02 +451 474 1.232479383921780e-03 +451 475 8.507818082537037e-03 +451 476 -9.719999626669784e-03 +451 477 4.056073820310753e-03 +452 460 -1.833267155554221e-01 +452 461 8.496052943251265e-01 +452 462 7.978124774258017e-01 +452 463 2.709112098463870e-02 +452 464 -1.341009959651922e-01 +452 465 4.603749937463587e-02 +452 466 6.969985820549034e-02 +452 467 7.073583005504234e-03 +452 468 -2.675090448249081e-02 +452 469 3.008346487896275e-02 +452 470 -6.878577509574089e-03 +452 471 -5.147043285304089e-02 +452 472 -2.296833469170258e-02 +452 473 3.967378200088160e-02 +452 474 -3.826530502171582e-03 +452 475 -2.623252505678715e-02 +452 476 2.983957599313199e-02 +452 477 -1.242564713428643e-02 +453 460 1.012997478615076e-01 +453 461 -2.866596804778757e-01 +453 462 4.009285655348331e-01 +453 463 1.003092729754151e+00 +453 464 4.718042883536003e-01 +453 465 -1.151051233747784e-01 +453 466 -1.533011412395470e-01 +453 467 -1.467336790749114e-02 +453 468 5.417647031984189e-02 +453 469 -6.347065826160919e-02 +453 470 1.413095968572470e-02 +453 471 1.016285359894869e-01 +453 472 4.361555150731201e-02 +453 473 -7.297122858953638e-02 +453 474 6.873636058247627e-03 +453 475 4.636253866511385e-02 +453 476 -5.220965998265570e-02 +453 477 2.163688115666493e-02 +454 460 -6.675829548998832e-02 +454 461 1.714825278878403e-01 +454 462 -1.763260094650451e-01 +454 463 -3.524913251503798e-02 +454 464 7.751613393474797e-01 +454 465 9.500818362211337e-01 +454 466 4.551820017945857e-01 +454 467 3.440881837089139e-02 +454 468 -1.173436103509141e-01 +454 469 1.582637096187088e-01 +454 470 -3.205658723743710e-02 +454 471 -2.040533508482630e-01 +454 472 -7.898266143119480e-02 +454 473 1.226433507083526e-01 +454 474 -1.098389774586483e-02 +454 475 -7.170870669864551e-02 +454 476 7.919894876866927e-02 +454 477 -3.252580339148582e-02 +455 460 4.654764921310722e-02 +455 461 -1.153084751520918e-01 +455 462 1.084975613502227e-01 +455 463 1.782365365319722e-02 +455 464 -2.253712020788828e-01 +455 465 1.833451203871216e-01 +455 466 7.871848513645266e-01 +455 467 9.980475420281749e-01 +455 468 9.659358568042407e-01 +455 469 9.659358568042410e-01 +455 470 9.980475420281750e-01 +455 471 7.871848513645266e-01 +455 472 1.833451203871216e-01 +455 473 -2.253712020788828e-01 +455 474 1.782365365319722e-02 +455 475 1.084975613502227e-01 +455 476 -1.153084751520918e-01 +455 477 4.654764921310723e-02 +456 460 -3.252580339148581e-02 +456 461 7.919894876866930e-02 +456 462 -7.170870669864551e-02 +456 463 -1.098389774586483e-02 +456 464 1.226433507083526e-01 +456 465 -7.898266143119477e-02 +456 466 -2.040533508482630e-01 +456 467 -3.205658723743710e-02 +456 468 1.582637096187088e-01 +456 469 -1.173436103509142e-01 +456 470 3.440881837089139e-02 +456 471 4.551820017945857e-01 +456 472 9.500818362211341e-01 +456 473 7.751613393474795e-01 +456 474 -3.524913251503798e-02 +456 475 -1.763260094650451e-01 +456 476 1.714825278878403e-01 +456 477 -6.675829548998834e-02 +457 460 2.163688115666493e-02 +457 461 -5.220965998265572e-02 +457 462 4.636253866511385e-02 +457 463 6.873636058247627e-03 +457 464 -7.297122858953639e-02 +457 465 4.361555150731200e-02 +457 466 1.016285359894869e-01 +457 467 1.413095968572470e-02 +457 468 -6.347065826160918e-02 +457 469 5.417647031984189e-02 +457 470 -1.467336790749114e-02 +457 471 -1.533011412395470e-01 +457 472 -1.151051233747784e-01 +457 473 4.718042883536002e-01 +457 474 1.003092729754151e+00 +457 475 4.009285655348331e-01 +457 476 -2.866596804778757e-01 +457 477 1.012997478615076e-01 +458 460 -1.242564713428642e-02 +458 461 2.983957599313199e-02 +458 462 -2.623252505678715e-02 +458 463 -3.826530502171581e-03 +458 464 3.967378200088158e-02 +458 465 -2.296833469170257e-02 +458 466 -5.147043285304088e-02 +458 467 -6.878577509574086e-03 +458 468 3.008346487896273e-02 +458 469 -2.675090448249081e-02 +458 470 7.073583005504234e-03 +458 471 6.969985820549032e-02 +458 472 4.603749937463587e-02 +458 473 -1.341009959651922e-01 +458 474 2.709112098463870e-02 +458 475 7.978124774258015e-01 +458 476 8.496052943251261e-01 +458 477 -1.833267155554221e-01 +459 460 4.056073820310752e-03 +459 461 -9.719999626669786e-03 +459 462 8.507818082537037e-03 +459 463 1.232479383921780e-03 +459 464 -1.265402077883446e-02 +459 465 7.233284760851091e-03 +459 466 1.597136003720132e-02 +459 467 2.104266184682266e-03 +459 468 -9.119197464262265e-03 +459 469 8.224868937522448e-03 +459 470 -2.156636620475042e-03 +459 471 -2.084168245043984e-02 +459 472 -1.325717275337852e-02 +459 473 3.581468700213172e-02 +459 474 -6.054059071081856e-03 +459 475 -8.784171983803062e-02 +459 476 3.337714682645253e-01 +459 477 1.121496109519592e+00 +478 487 1.121496109519592e+00 +478 488 3.337714682645254e-01 +478 489 -8.784171983803062e-02 +478 490 -6.054059071081856e-03 +478 491 3.581468700213172e-02 +478 492 -1.325717275337852e-02 +478 493 -2.084168245043984e-02 +478 494 -2.156636620475042e-03 +478 495 8.224868937522447e-03 +478 496 -9.119197464262268e-03 +478 497 2.104266184682266e-03 +478 498 1.597136003720132e-02 +478 499 7.233284760851093e-03 +478 500 -1.265402077883446e-02 +478 501 1.232479383921780e-03 +478 502 8.507818082537037e-03 +478 503 -9.719999626669784e-03 +478 504 4.056073820310753e-03 +479 487 -1.833267155554221e-01 +479 488 8.496052943251265e-01 +479 489 7.978124774258017e-01 +479 490 2.709112098463870e-02 +479 491 -1.341009959651922e-01 +479 492 4.603749937463587e-02 +479 493 6.969985820549034e-02 +479 494 7.073583005504234e-03 +479 495 -2.675090448249081e-02 +479 496 3.008346487896275e-02 +479 497 -6.878577509574089e-03 +479 498 -5.147043285304089e-02 +479 499 -2.296833469170258e-02 +479 500 3.967378200088160e-02 +479 501 -3.826530502171582e-03 +479 502 -2.623252505678715e-02 +479 503 2.983957599313199e-02 +479 504 -1.242564713428643e-02 +480 487 1.012997478615076e-01 +480 488 -2.866596804778757e-01 +480 489 4.009285655348331e-01 +480 490 1.003092729754151e+00 +480 491 4.718042883536003e-01 +480 492 -1.151051233747784e-01 +480 493 -1.533011412395470e-01 +480 494 -1.467336790749114e-02 +480 495 5.417647031984189e-02 +480 496 -6.347065826160919e-02 +480 497 1.413095968572470e-02 +480 498 1.016285359894869e-01 +480 499 4.361555150731201e-02 +480 500 -7.297122858953638e-02 +480 501 6.873636058247627e-03 +480 502 4.636253866511385e-02 +480 503 -5.220965998265570e-02 +480 504 2.163688115666493e-02 +481 487 -6.675829548998832e-02 +481 488 1.714825278878403e-01 +481 489 -1.763260094650451e-01 +481 490 -3.524913251503798e-02 +481 491 7.751613393474797e-01 +481 492 9.500818362211337e-01 +481 493 4.551820017945857e-01 +481 494 3.440881837089139e-02 +481 495 -1.173436103509141e-01 +481 496 1.582637096187088e-01 +481 497 -3.205658723743710e-02 +481 498 -2.040533508482630e-01 +481 499 -7.898266143119480e-02 +481 500 1.226433507083526e-01 +481 501 -1.098389774586483e-02 +481 502 -7.170870669864551e-02 +481 503 7.919894876866927e-02 +481 504 -3.252580339148582e-02 +482 487 4.654764921310722e-02 +482 488 -1.153084751520918e-01 +482 489 1.084975613502227e-01 +482 490 1.782365365319722e-02 +482 491 -2.253712020788828e-01 +482 492 1.833451203871216e-01 +482 493 7.871848513645266e-01 +482 494 9.980475420281749e-01 +482 495 9.659358568042407e-01 +482 496 9.659358568042410e-01 +482 497 9.980475420281750e-01 +482 498 7.871848513645266e-01 +482 499 1.833451203871216e-01 +482 500 -2.253712020788828e-01 +482 501 1.782365365319722e-02 +482 502 1.084975613502227e-01 +482 503 -1.153084751520918e-01 +482 504 4.654764921310723e-02 +483 487 -3.252580339148581e-02 +483 488 7.919894876866930e-02 +483 489 -7.170870669864551e-02 +483 490 -1.098389774586483e-02 +483 491 1.226433507083526e-01 +483 492 -7.898266143119477e-02 +483 493 -2.040533508482630e-01 +483 494 -3.205658723743710e-02 +483 495 1.582637096187088e-01 +483 496 -1.173436103509142e-01 +483 497 3.440881837089139e-02 +483 498 4.551820017945857e-01 +483 499 9.500818362211341e-01 +483 500 7.751613393474795e-01 +483 501 -3.524913251503798e-02 +483 502 -1.763260094650451e-01 +483 503 1.714825278878403e-01 +483 504 -6.675829548998834e-02 +484 487 2.163688115666493e-02 +484 488 -5.220965998265572e-02 +484 489 4.636253866511385e-02 +484 490 6.873636058247627e-03 +484 491 -7.297122858953639e-02 +484 492 4.361555150731200e-02 +484 493 1.016285359894869e-01 +484 494 1.413095968572470e-02 +484 495 -6.347065826160918e-02 +484 496 5.417647031984189e-02 +484 497 -1.467336790749114e-02 +484 498 -1.533011412395470e-01 +484 499 -1.151051233747784e-01 +484 500 4.718042883536002e-01 +484 501 1.003092729754151e+00 +484 502 4.009285655348331e-01 +484 503 -2.866596804778757e-01 +484 504 1.012997478615076e-01 +485 487 -1.242564713428642e-02 +485 488 2.983957599313199e-02 +485 489 -2.623252505678715e-02 +485 490 -3.826530502171581e-03 +485 491 3.967378200088158e-02 +485 492 -2.296833469170257e-02 +485 493 -5.147043285304088e-02 +485 494 -6.878577509574086e-03 +485 495 3.008346487896273e-02 +485 496 -2.675090448249081e-02 +485 497 7.073583005504234e-03 +485 498 6.969985820549032e-02 +485 499 4.603749937463587e-02 +485 500 -1.341009959651922e-01 +485 501 2.709112098463870e-02 +485 502 7.978124774258015e-01 +485 503 8.496052943251261e-01 +485 504 -1.833267155554221e-01 +486 487 4.056073820310752e-03 +486 488 -9.719999626669786e-03 +486 489 8.507818082537037e-03 +486 490 1.232479383921780e-03 +486 491 -1.265402077883446e-02 +486 492 7.233284760851091e-03 +486 493 1.597136003720132e-02 +486 494 2.104266184682266e-03 +486 495 -9.119197464262265e-03 +486 496 8.224868937522448e-03 +486 497 -2.156636620475042e-03 +486 498 -2.084168245043984e-02 +486 499 -1.325717275337852e-02 +486 500 3.581468700213172e-02 +486 501 -6.054059071081856e-03 +486 502 -8.784171983803062e-02 +486 503 3.337714682645253e-01 +486 504 1.121496109519592e+00 +514 523 1.121496109519592e+00 +514 524 3.337714682645254e-01 +514 525 -8.784171983803062e-02 +514 526 -6.054059071081856e-03 +514 527 3.581468700213172e-02 +514 528 -1.325717275337852e-02 +514 529 -2.084168245043984e-02 +514 530 -2.156636620475042e-03 +514 531 8.224868937522447e-03 +514 532 -9.119197464262268e-03 +514 533 2.104266184682266e-03 +514 534 1.597136003720132e-02 +514 535 7.233284760851093e-03 +514 536 -1.265402077883446e-02 +514 537 1.232479383921780e-03 +514 538 8.507818082537037e-03 +514 539 -9.719999626669784e-03 +514 540 4.056073820310753e-03 +515 523 -1.833267155554221e-01 +515 524 8.496052943251265e-01 +515 525 7.978124774258017e-01 +515 526 2.709112098463870e-02 +515 527 -1.341009959651922e-01 +515 528 4.603749937463587e-02 +515 529 6.969985820549034e-02 +515 530 7.073583005504234e-03 +515 531 -2.675090448249081e-02 +515 532 3.008346487896275e-02 +515 533 -6.878577509574089e-03 +515 534 -5.147043285304089e-02 +515 535 -2.296833469170258e-02 +515 536 3.967378200088160e-02 +515 537 -3.826530502171582e-03 +515 538 -2.623252505678715e-02 +515 539 2.983957599313199e-02 +515 540 -1.242564713428643e-02 +516 523 1.012997478615076e-01 +516 524 -2.866596804778757e-01 +516 525 4.009285655348331e-01 +516 526 1.003092729754151e+00 +516 527 4.718042883536003e-01 +516 528 -1.151051233747784e-01 +516 529 -1.533011412395470e-01 +516 530 -1.467336790749114e-02 +516 531 5.417647031984189e-02 +516 532 -6.347065826160919e-02 +516 533 1.413095968572470e-02 +516 534 1.016285359894869e-01 +516 535 4.361555150731201e-02 +516 536 -7.297122858953638e-02 +516 537 6.873636058247627e-03 +516 538 4.636253866511385e-02 +516 539 -5.220965998265570e-02 +516 540 2.163688115666493e-02 +517 523 -6.675829548998832e-02 +517 524 1.714825278878403e-01 +517 525 -1.763260094650451e-01 +517 526 -3.524913251503798e-02 +517 527 7.751613393474797e-01 +517 528 9.500818362211337e-01 +517 529 4.551820017945857e-01 +517 530 3.440881837089139e-02 +517 531 -1.173436103509141e-01 +517 532 1.582637096187088e-01 +517 533 -3.205658723743710e-02 +517 534 -2.040533508482630e-01 +517 535 -7.898266143119480e-02 +517 536 1.226433507083526e-01 +517 537 -1.098389774586483e-02 +517 538 -7.170870669864551e-02 +517 539 7.919894876866927e-02 +517 540 -3.252580339148582e-02 +518 523 4.654764921310722e-02 +518 524 -1.153084751520918e-01 +518 525 1.084975613502227e-01 +518 526 1.782365365319722e-02 +518 527 -2.253712020788828e-01 +518 528 1.833451203871216e-01 +518 529 7.871848513645266e-01 +518 530 9.980475420281749e-01 +518 531 9.659358568042407e-01 +518 532 9.659358568042410e-01 +518 533 9.980475420281750e-01 +518 534 7.871848513645266e-01 +518 535 1.833451203871216e-01 +518 536 -2.253712020788828e-01 +518 537 1.782365365319722e-02 +518 538 1.084975613502227e-01 +518 539 -1.153084751520918e-01 +518 540 4.654764921310723e-02 +519 523 -3.252580339148581e-02 +519 524 7.919894876866930e-02 +519 525 -7.170870669864551e-02 +519 526 -1.098389774586483e-02 +519 527 1.226433507083526e-01 +519 528 -7.898266143119477e-02 +519 529 -2.040533508482630e-01 +519 530 -3.205658723743710e-02 +519 531 1.582637096187088e-01 +519 532 -1.173436103509142e-01 +519 533 3.440881837089139e-02 +519 534 4.551820017945857e-01 +519 535 9.500818362211341e-01 +519 536 7.751613393474795e-01 +519 537 -3.524913251503798e-02 +519 538 -1.763260094650451e-01 +519 539 1.714825278878403e-01 +519 540 -6.675829548998834e-02 +520 523 2.163688115666493e-02 +520 524 -5.220965998265572e-02 +520 525 4.636253866511385e-02 +520 526 6.873636058247627e-03 +520 527 -7.297122858953639e-02 +520 528 4.361555150731200e-02 +520 529 1.016285359894869e-01 +520 530 1.413095968572470e-02 +520 531 -6.347065826160918e-02 +520 532 5.417647031984189e-02 +520 533 -1.467336790749114e-02 +520 534 -1.533011412395470e-01 +520 535 -1.151051233747784e-01 +520 536 4.718042883536002e-01 +520 537 1.003092729754151e+00 +520 538 4.009285655348331e-01 +520 539 -2.866596804778757e-01 +520 540 1.012997478615076e-01 +521 523 -1.242564713428642e-02 +521 524 2.983957599313199e-02 +521 525 -2.623252505678715e-02 +521 526 -3.826530502171581e-03 +521 527 3.967378200088158e-02 +521 528 -2.296833469170257e-02 +521 529 -5.147043285304088e-02 +521 530 -6.878577509574086e-03 +521 531 3.008346487896273e-02 +521 532 -2.675090448249081e-02 +521 533 7.073583005504234e-03 +521 534 6.969985820549032e-02 +521 535 4.603749937463587e-02 +521 536 -1.341009959651922e-01 +521 537 2.709112098463870e-02 +521 538 7.978124774258015e-01 +521 539 8.496052943251261e-01 +521 540 -1.833267155554221e-01 +522 523 4.056073820310752e-03 +522 524 -9.719999626669786e-03 +522 525 8.507818082537037e-03 +522 526 1.232479383921780e-03 +522 527 -1.265402077883446e-02 +522 528 7.233284760851091e-03 +522 529 1.597136003720132e-02 +522 530 2.104266184682266e-03 +522 531 -9.119197464262265e-03 +522 532 8.224868937522448e-03 +522 533 -2.156636620475042e-03 +522 534 -2.084168245043984e-02 +522 535 -1.325717275337852e-02 +522 536 3.581468700213172e-02 +522 537 -6.054059071081856e-03 +522 538 -8.784171983803062e-02 +522 539 3.337714682645253e-01 +522 540 1.121496109519592e+00 +541 550 1.121496109519592e+00 +541 551 3.337714682645254e-01 +541 552 -8.784171983803062e-02 +541 553 -6.054059071081856e-03 +541 554 3.581468700213172e-02 +541 555 -1.325717275337852e-02 +541 556 -2.084168245043984e-02 +541 557 -2.156636620475042e-03 +541 558 8.224868937522447e-03 +541 559 -9.119197464262268e-03 +541 560 2.104266184682266e-03 +541 561 1.597136003720132e-02 +541 562 7.233284760851093e-03 +541 563 -1.265402077883446e-02 +541 564 1.232479383921780e-03 +541 565 8.507818082537037e-03 +541 566 -9.719999626669784e-03 +541 567 4.056073820310753e-03 +542 550 -1.833267155554221e-01 +542 551 8.496052943251265e-01 +542 552 7.978124774258017e-01 +542 553 2.709112098463870e-02 +542 554 -1.341009959651922e-01 +542 555 4.603749937463587e-02 +542 556 6.969985820549034e-02 +542 557 7.073583005504234e-03 +542 558 -2.675090448249081e-02 +542 559 3.008346487896275e-02 +542 560 -6.878577509574089e-03 +542 561 -5.147043285304089e-02 +542 562 -2.296833469170258e-02 +542 563 3.967378200088160e-02 +542 564 -3.826530502171582e-03 +542 565 -2.623252505678715e-02 +542 566 2.983957599313199e-02 +542 567 -1.242564713428643e-02 +543 550 1.012997478615076e-01 +543 551 -2.866596804778757e-01 +543 552 4.009285655348331e-01 +543 553 1.003092729754151e+00 +543 554 4.718042883536003e-01 +543 555 -1.151051233747784e-01 +543 556 -1.533011412395470e-01 +543 557 -1.467336790749114e-02 +543 558 5.417647031984189e-02 +543 559 -6.347065826160919e-02 +543 560 1.413095968572470e-02 +543 561 1.016285359894869e-01 +543 562 4.361555150731201e-02 +543 563 -7.297122858953638e-02 +543 564 6.873636058247627e-03 +543 565 4.636253866511385e-02 +543 566 -5.220965998265570e-02 +543 567 2.163688115666493e-02 +544 550 -6.675829548998832e-02 +544 551 1.714825278878403e-01 +544 552 -1.763260094650451e-01 +544 553 -3.524913251503798e-02 +544 554 7.751613393474797e-01 +544 555 9.500818362211337e-01 +544 556 4.551820017945857e-01 +544 557 3.440881837089139e-02 +544 558 -1.173436103509141e-01 +544 559 1.582637096187088e-01 +544 560 -3.205658723743710e-02 +544 561 -2.040533508482630e-01 +544 562 -7.898266143119480e-02 +544 563 1.226433507083526e-01 +544 564 -1.098389774586483e-02 +544 565 -7.170870669864551e-02 +544 566 7.919894876866927e-02 +544 567 -3.252580339148582e-02 +545 550 4.654764921310722e-02 +545 551 -1.153084751520918e-01 +545 552 1.084975613502227e-01 +545 553 1.782365365319722e-02 +545 554 -2.253712020788828e-01 +545 555 1.833451203871216e-01 +545 556 7.871848513645266e-01 +545 557 9.980475420281749e-01 +545 558 9.659358568042407e-01 +545 559 9.659358568042410e-01 +545 560 9.980475420281750e-01 +545 561 7.871848513645266e-01 +545 562 1.833451203871216e-01 +545 563 -2.253712020788828e-01 +545 564 1.782365365319722e-02 +545 565 1.084975613502227e-01 +545 566 -1.153084751520918e-01 +545 567 4.654764921310723e-02 +546 550 -3.252580339148581e-02 +546 551 7.919894876866930e-02 +546 552 -7.170870669864551e-02 +546 553 -1.098389774586483e-02 +546 554 1.226433507083526e-01 +546 555 -7.898266143119477e-02 +546 556 -2.040533508482630e-01 +546 557 -3.205658723743710e-02 +546 558 1.582637096187088e-01 +546 559 -1.173436103509142e-01 +546 560 3.440881837089139e-02 +546 561 4.551820017945857e-01 +546 562 9.500818362211341e-01 +546 563 7.751613393474795e-01 +546 564 -3.524913251503798e-02 +546 565 -1.763260094650451e-01 +546 566 1.714825278878403e-01 +546 567 -6.675829548998834e-02 +547 550 2.163688115666493e-02 +547 551 -5.220965998265572e-02 +547 552 4.636253866511385e-02 +547 553 6.873636058247627e-03 +547 554 -7.297122858953639e-02 +547 555 4.361555150731200e-02 +547 556 1.016285359894869e-01 +547 557 1.413095968572470e-02 +547 558 -6.347065826160918e-02 +547 559 5.417647031984189e-02 +547 560 -1.467336790749114e-02 +547 561 -1.533011412395470e-01 +547 562 -1.151051233747784e-01 +547 563 4.718042883536002e-01 +547 564 1.003092729754151e+00 +547 565 4.009285655348331e-01 +547 566 -2.866596804778757e-01 +547 567 1.012997478615076e-01 +548 550 -1.242564713428642e-02 +548 551 2.983957599313199e-02 +548 552 -2.623252505678715e-02 +548 553 -3.826530502171581e-03 +548 554 3.967378200088158e-02 +548 555 -2.296833469170257e-02 +548 556 -5.147043285304088e-02 +548 557 -6.878577509574086e-03 +548 558 3.008346487896273e-02 +548 559 -2.675090448249081e-02 +548 560 7.073583005504234e-03 +548 561 6.969985820549032e-02 +548 562 4.603749937463587e-02 +548 563 -1.341009959651922e-01 +548 564 2.709112098463870e-02 +548 565 7.978124774258015e-01 +548 566 8.496052943251261e-01 +548 567 -1.833267155554221e-01 +549 550 4.056073820310752e-03 +549 551 -9.719999626669786e-03 +549 552 8.507818082537037e-03 +549 553 1.232479383921780e-03 +549 554 -1.265402077883446e-02 +549 555 7.233284760851091e-03 +549 556 1.597136003720132e-02 +549 557 2.104266184682266e-03 +549 558 -9.119197464262265e-03 +549 559 8.224868937522448e-03 +549 560 -2.156636620475042e-03 +549 561 -2.084168245043984e-02 +549 562 -1.325717275337852e-02 +549 563 3.581468700213172e-02 +549 564 -6.054059071081856e-03 +549 565 -8.784171983803062e-02 +549 566 3.337714682645253e-01 +549 567 1.121496109519592e+00 +604 613 1.121496109519592e+00 +604 614 3.337714682645254e-01 +604 615 -8.784171983803073e-02 +604 616 -6.054059071079536e-03 +604 617 3.581468700213239e-02 +604 618 -1.325717275337685e-02 +604 619 -2.084168245043929e-02 +604 620 -2.156636620475591e-03 +604 621 8.224868937522247e-03 +604 622 -9.119197464262043e-03 +604 623 2.104266184681644e-03 +604 624 1.597136003720087e-02 +604 625 7.233284760850112e-03 +604 626 -1.265402077883464e-02 +604 627 1.232479383921313e-03 +604 628 8.507818082536901e-03 +604 629 -9.719999626669022e-03 +604 630 4.056073820312656e-03 +605 613 -1.833267155554220e-01 +605 614 8.496052943251258e-01 +605 615 7.978124774258021e-01 +605 616 2.709112098462815e-02 +605 617 -1.341009959651946e-01 +605 618 4.603749937463008e-02 +605 619 6.969985820548839e-02 +605 620 7.073583005506033e-03 +605 621 -2.675090448249013e-02 +605 622 3.008346487896198e-02 +605 623 -6.878577509572051e-03 +605 624 -5.147043285303941e-02 +605 625 -2.296833469169944e-02 +605 626 3.967378200088213e-02 +605 627 -3.826530502170128e-03 +605 628 -2.623252505678671e-02 +605 629 2.983957599312962e-02 +605 630 -1.242564713429224e-02 +606 613 1.012997478615071e-01 +606 614 -2.866596804778744e-01 +606 615 4.009285655348318e-01 +606 616 1.003092729754150e+00 +606 617 4.718042883536069e-01 +606 618 -1.151051233747639e-01 +606 619 -1.533011412395422e-01 +606 620 -1.467336790749483e-02 +606 621 5.417647031984031e-02 +606 622 -6.347065826160735e-02 +606 623 1.413095968572048e-02 +606 624 1.016285359894836e-01 +606 625 4.361555150730587e-02 +606 626 -7.297122858953710e-02 +606 627 6.873636058244994e-03 +606 628 4.636253866511290e-02 +606 629 -5.220965998265139e-02 +606 630 2.163688115667499e-02 +607 613 -6.675829548998859e-02 +607 614 1.714825278878409e-01 +607 615 -1.763260094650456e-01 +607 616 -3.524913251502515e-02 +607 617 7.751613393474810e-01 +607 618 9.500818362211395e-01 +607 619 4.551820017945849e-01 +607 620 3.440881837090105e-02 +607 621 -1.173436103509134e-01 +607 622 1.582637096187082e-01 +607 623 -3.205658723742841e-02 +607 624 -2.040533508482607e-01 +607 625 -7.898266143118503e-02 +607 626 1.226433507083560e-01 +607 627 -1.098389774586082e-02 +607 628 -7.170870669864524e-02 +607 629 7.919894876866407e-02 +607 630 -3.252580339150146e-02 +608 613 4.654764921310833e-02 +608 614 -1.153084751520946e-01 +608 615 1.084975613502255e-01 +608 616 1.782365365319109e-02 +608 617 -2.253712020788924e-01 +608 618 1.833451203870999e-01 +608 619 7.871848513645243e-01 +608 620 9.980475420281738e-01 +608 621 9.659358568042403e-01 +608 622 9.659358568042403e-01 +608 623 9.980475420281760e-01 +608 624 7.871848513645235e-01 +608 625 1.833451203870995e-01 +608 626 -2.253712020788914e-01 +608 627 1.782365365319094e-02 +608 628 1.084975613502236e-01 +608 629 -1.153084751520857e-01 +608 630 4.654764921313018e-02 +609 613 -3.252580339148627e-02 +609 614 7.919894876867042e-02 +609 615 -7.170870669864664e-02 +609 616 -1.098389774586093e-02 +609 617 1.226433507083568e-01 +609 618 -7.898266143118537e-02 +609 619 -2.040533508482614e-01 +609 620 -3.205658723744553e-02 +609 621 1.582637096187085e-01 +609 622 -1.173436103509137e-01 +609 623 3.440881837088149e-02 +609 624 4.551820017945855e-01 +609 625 9.500818362211398e-01 +609 626 7.751613393474794e-01 +609 627 -3.524913251502495e-02 +609 628 -1.763260094650430e-01 +609 629 1.714825278878285e-01 +609 630 -6.675829549002009e-02 +610 613 2.163688115666500e-02 +610 614 -5.220965998265589e-02 +610 615 4.636253866511406e-02 +610 616 6.873636058245101e-03 +610 617 -7.297122858953799e-02 +610 618 4.361555150730629e-02 +610 619 1.016285359894845e-01 +610 620 1.413095968572822e-02 +610 621 -6.347065826160785e-02 +610 622 5.417647031984073e-02 +610 623 -1.467336790748672e-02 +610 624 -1.533011412395432e-01 +610 625 -1.151051233747646e-01 +610 626 4.718042883536085e-01 +610 627 1.003092729754150e+00 +610 628 4.009285655348280e-01 +610 629 -2.866596804778569e-01 +610 630 1.012997478615555e-01 +611 613 -1.242564713428673e-02 +611 614 2.983957599313275e-02 +611 615 -2.623252505678785e-02 +611 616 -3.826530502170258e-03 +611 617 3.967378200088333e-02 +611 618 -2.296833469170009e-02 +611 619 -5.147043285304082e-02 +611 620 -6.878577509575963e-03 +611 621 3.008346487896277e-02 +611 622 -2.675090448249083e-02 +611 623 7.073583005502269e-03 +611 624 6.969985820549016e-02 +611 625 4.603749937463118e-02 +611 626 -1.341009959651975e-01 +611 627 2.709112098462864e-02 +611 628 7.978124774258091e-01 +611 629 8.496052943251245e-01 +611 630 -1.833267155555128e-01 +612 613 4.056073820310975e-03 +612 614 -9.719999626670320e-03 +612 615 8.507818082537517e-03 +612 616 1.232479383921391e-03 +612 617 -1.265402077883539e-02 +612 618 7.233284760850531e-03 +612 619 1.597136003720178e-02 +612 620 2.104266184682907e-03 +612 621 -9.119197464262560e-03 +612 622 8.224868937522710e-03 +612 623 -2.156636620474512e-03 +612 624 -2.084168245044045e-02 +612 625 -1.325717275337759e-02 +612 626 3.581468700213437e-02 +612 627 -6.054059071079870e-03 +612 628 -8.784171983803556e-02 +612 629 3.337714682645163e-01 +612 630 1.121496109519653e+00 +631 640 1.121496109519653e+00 +631 641 3.337714682645714e-01 +631 642 -8.784171983803558e-02 +631 643 -6.054059071079867e-03 +631 644 3.581468700213436e-02 +631 645 -1.325717275337758e-02 +631 646 -2.084168245044044e-02 +631 647 -2.156636620475710e-03 +631 648 8.224868937522698e-03 +631 649 -9.119197464262546e-03 +631 650 2.104266184681760e-03 +631 651 1.597136003720175e-02 +631 652 7.233284760850512e-03 +631 653 -1.265402077883533e-02 +631 654 1.232479383921381e-03 +631 655 8.507818082537370e-03 +631 656 -9.719999626669558e-03 +631 657 4.056073820312880e-03 +632 640 -1.833267155555127e-01 +632 641 8.496052943250727e-01 +632 642 7.978124774258091e-01 +632 643 2.709112098462862e-02 +632 644 -1.341009959651975e-01 +632 645 4.603749937463113e-02 +632 646 6.969985820549007e-02 +632 647 7.073583005506204e-03 +632 648 -2.675090448249079e-02 +632 649 3.008346487896271e-02 +632 650 -6.878577509572217e-03 +632 651 -5.147043285304069e-02 +632 652 -2.296833469170002e-02 +632 653 3.967378200088315e-02 +632 654 -3.826530502170227e-03 +632 655 -2.623252505678739e-02 +632 656 2.983957599313041e-02 +632 657 -1.242564713429257e-02 +633 640 1.012997478615555e-01 +633 641 -2.866596804778632e-01 +633 642 4.009285655348281e-01 +633 643 1.003092729754150e+00 +633 644 4.718042883536085e-01 +633 645 -1.151051233747645e-01 +633 646 -1.533011412395431e-01 +633 647 -1.467336790749493e-02 +633 648 5.417647031984067e-02 +633 649 -6.347065826160776e-02 +633 650 1.413095968572057e-02 +633 651 1.016285359894843e-01 +633 652 4.361555150730619e-02 +633 653 -7.297122858953765e-02 +633 654 6.873636058245047e-03 +633 655 4.636253866511327e-02 +633 656 -5.220965998265183e-02 +633 657 2.163688115667517e-02 +634 640 -6.675829549002014e-02 +634 641 1.714825278878344e-01 +634 642 -1.763260094650432e-01 +634 643 -3.524913251502497e-02 +634 644 7.751613393474800e-01 +634 645 9.500818362211397e-01 +634 646 4.551820017945855e-01 +634 647 3.440881837090111e-02 +634 648 -1.173436103509136e-01 +634 649 1.582637096187084e-01 +634 650 -3.205658723742846e-02 +634 651 -2.040533508482612e-01 +634 652 -7.898266143118524e-02 +634 653 1.226433507083564e-01 +634 654 -1.098389774586085e-02 +634 655 -7.170870669864547e-02 +634 656 7.919894876866436e-02 +634 657 -3.252580339150158e-02 +635 640 4.654764921313025e-02 +635 641 -1.153084751520903e-01 +635 642 1.084975613502238e-01 +635 643 1.782365365319096e-02 +635 644 -2.253712020788916e-01 +635 645 1.833451203870996e-01 +635 646 7.871848513645239e-01 +635 647 9.980475420281737e-01 +635 648 9.659358568042402e-01 +635 649 9.659358568042401e-01 +635 650 9.980475420281757e-01 +635 651 7.871848513645238e-01 +635 652 1.833451203870997e-01 +635 653 -2.253712020788916e-01 +635 654 1.782365365319097e-02 +635 655 1.084975613502237e-01 +635 656 -1.153084751520859e-01 +635 657 4.654764921313027e-02 +636 640 -3.252580339150157e-02 +636 641 7.919894876866750e-02 +636 642 -7.170870669864547e-02 +636 643 -1.098389774586085e-02 +636 644 1.226433507083564e-01 +636 645 -7.898266143118522e-02 +636 646 -2.040533508482612e-01 +636 647 -3.205658723744551e-02 +636 648 1.582637096187085e-01 +636 649 -1.173436103509136e-01 +636 650 3.440881837088147e-02 +636 651 4.551820017945854e-01 +636 652 9.500818362211400e-01 +636 653 7.751613393474800e-01 +636 654 -3.524913251502498e-02 +636 655 -1.763260094650432e-01 +636 656 1.714825278878287e-01 +636 657 -6.675829549002017e-02 +637 640 2.163688115667516e-02 +637 641 -5.220965998265393e-02 +637 642 4.636253866511327e-02 +637 643 6.873636058245044e-03 +637 644 -7.297122858953764e-02 +637 645 4.361555150730616e-02 +637 646 1.016285359894843e-01 +637 647 1.413095968572820e-02 +637 648 -6.347065826160775e-02 +637 649 5.417647031984065e-02 +637 650 -1.467336790748669e-02 +637 651 -1.533011412395430e-01 +637 652 -1.151051233747645e-01 +637 653 4.718042883536084e-01 +637 654 1.003092729754150e+00 +637 655 4.009285655348280e-01 +637 656 -2.866596804778571e-01 +637 657 1.012997478615555e-01 +638 640 -1.242564713429257e-02 +638 641 2.983957599313164e-02 +638 642 -2.623252505678740e-02 +638 643 -3.826530502170227e-03 +638 644 3.967378200088316e-02 +638 645 -2.296833469170003e-02 +638 646 -5.147043285304072e-02 +638 647 -6.878577509575954e-03 +638 648 3.008346487896273e-02 +638 649 -2.675090448249079e-02 +638 650 7.073583005502259e-03 +638 651 6.969985820549009e-02 +638 652 4.603749937463117e-02 +638 653 -1.341009959651975e-01 +638 654 2.709112098462864e-02 +638 655 7.978124774258092e-01 +638 656 8.496052943251251e-01 +638 657 -1.833267155555129e-01 +639 640 4.056073820312879e-03 +639 641 -9.719999626669961e-03 +639 642 8.507818082537370e-03 +639 643 1.232479383921380e-03 +639 644 -1.265402077883533e-02 +639 645 7.233284760850510e-03 +639 646 1.597136003720175e-02 +639 647 2.104266184682904e-03 +639 648 -9.119197464262546e-03 +639 649 8.224868937522696e-03 +639 650 -2.156636620474508e-03 +639 651 -2.084168245044043e-02 +639 652 -1.325717275337758e-02 +639 653 3.581468700213436e-02 +639 654 -6.054059071079870e-03 +639 655 -8.784171983803557e-02 +639 656 3.337714682645164e-01 +639 657 1.121496109519654e+00 +667 676 1.121496109519653e+00 +667 677 3.337714682645714e-01 +667 678 -8.784171983803558e-02 +667 679 -6.054059071079867e-03 +667 680 3.581468700213436e-02 +667 681 -1.325717275337758e-02 +667 682 -2.084168245044044e-02 +667 683 -2.156636620475710e-03 +667 684 8.224868937522698e-03 +667 685 -9.119197464262546e-03 +667 686 2.104266184681760e-03 +667 687 1.597136003720175e-02 +667 688 7.233284760850512e-03 +667 689 -1.265402077883533e-02 +667 690 1.232479383921381e-03 +667 691 8.507818082537370e-03 +667 692 -9.719999626669558e-03 +667 693 4.056073820312880e-03 +668 676 -1.833267155555127e-01 +668 677 8.496052943250727e-01 +668 678 7.978124774258091e-01 +668 679 2.709112098462862e-02 +668 680 -1.341009959651975e-01 +668 681 4.603749937463113e-02 +668 682 6.969985820549007e-02 +668 683 7.073583005506204e-03 +668 684 -2.675090448249079e-02 +668 685 3.008346487896271e-02 +668 686 -6.878577509572217e-03 +668 687 -5.147043285304069e-02 +668 688 -2.296833469170002e-02 +668 689 3.967378200088315e-02 +668 690 -3.826530502170227e-03 +668 691 -2.623252505678739e-02 +668 692 2.983957599313041e-02 +668 693 -1.242564713429257e-02 +669 676 1.012997478615555e-01 +669 677 -2.866596804778632e-01 +669 678 4.009285655348281e-01 +669 679 1.003092729754150e+00 +669 680 4.718042883536085e-01 +669 681 -1.151051233747645e-01 +669 682 -1.533011412395431e-01 +669 683 -1.467336790749493e-02 +669 684 5.417647031984067e-02 +669 685 -6.347065826160776e-02 +669 686 1.413095968572057e-02 +669 687 1.016285359894843e-01 +669 688 4.361555150730619e-02 +669 689 -7.297122858953765e-02 +669 690 6.873636058245047e-03 +669 691 4.636253866511327e-02 +669 692 -5.220965998265183e-02 +669 693 2.163688115667517e-02 +670 676 -6.675829549002014e-02 +670 677 1.714825278878344e-01 +670 678 -1.763260094650432e-01 +670 679 -3.524913251502497e-02 +670 680 7.751613393474800e-01 +670 681 9.500818362211397e-01 +670 682 4.551820017945855e-01 +670 683 3.440881837090111e-02 +670 684 -1.173436103509136e-01 +670 685 1.582637096187084e-01 +670 686 -3.205658723742846e-02 +670 687 -2.040533508482612e-01 +670 688 -7.898266143118524e-02 +670 689 1.226433507083564e-01 +670 690 -1.098389774586085e-02 +670 691 -7.170870669864547e-02 +670 692 7.919894876866436e-02 +670 693 -3.252580339150158e-02 +671 676 4.654764921313025e-02 +671 677 -1.153084751520903e-01 +671 678 1.084975613502238e-01 +671 679 1.782365365319096e-02 +671 680 -2.253712020788916e-01 +671 681 1.833451203870996e-01 +671 682 7.871848513645239e-01 +671 683 9.980475420281737e-01 +671 684 9.659358568042402e-01 +671 685 9.659358568042401e-01 +671 686 9.980475420281757e-01 +671 687 7.871848513645238e-01 +671 688 1.833451203870997e-01 +671 689 -2.253712020788916e-01 +671 690 1.782365365319097e-02 +671 691 1.084975613502237e-01 +671 692 -1.153084751520859e-01 +671 693 4.654764921313027e-02 +672 676 -3.252580339150157e-02 +672 677 7.919894876866750e-02 +672 678 -7.170870669864547e-02 +672 679 -1.098389774586085e-02 +672 680 1.226433507083564e-01 +672 681 -7.898266143118522e-02 +672 682 -2.040533508482612e-01 +672 683 -3.205658723744551e-02 +672 684 1.582637096187085e-01 +672 685 -1.173436103509136e-01 +672 686 3.440881837088147e-02 +672 687 4.551820017945854e-01 +672 688 9.500818362211400e-01 +672 689 7.751613393474800e-01 +672 690 -3.524913251502498e-02 +672 691 -1.763260094650432e-01 +672 692 1.714825278878287e-01 +672 693 -6.675829549002017e-02 +673 676 2.163688115667516e-02 +673 677 -5.220965998265393e-02 +673 678 4.636253866511327e-02 +673 679 6.873636058245044e-03 +673 680 -7.297122858953764e-02 +673 681 4.361555150730616e-02 +673 682 1.016285359894843e-01 +673 683 1.413095968572820e-02 +673 684 -6.347065826160775e-02 +673 685 5.417647031984065e-02 +673 686 -1.467336790748669e-02 +673 687 -1.533011412395430e-01 +673 688 -1.151051233747645e-01 +673 689 4.718042883536084e-01 +673 690 1.003092729754150e+00 +673 691 4.009285655348280e-01 +673 692 -2.866596804778571e-01 +673 693 1.012997478615555e-01 +674 676 -1.242564713429257e-02 +674 677 2.983957599313164e-02 +674 678 -2.623252505678740e-02 +674 679 -3.826530502170227e-03 +674 680 3.967378200088316e-02 +674 681 -2.296833469170003e-02 +674 682 -5.147043285304072e-02 +674 683 -6.878577509575954e-03 +674 684 3.008346487896273e-02 +674 685 -2.675090448249079e-02 +674 686 7.073583005502259e-03 +674 687 6.969985820549009e-02 +674 688 4.603749937463117e-02 +674 689 -1.341009959651975e-01 +674 690 2.709112098462864e-02 +674 691 7.978124774258092e-01 +674 692 8.496052943251251e-01 +674 693 -1.833267155555129e-01 +675 676 4.056073820312879e-03 +675 677 -9.719999626669961e-03 +675 678 8.507818082537370e-03 +675 679 1.232479383921380e-03 +675 680 -1.265402077883533e-02 +675 681 7.233284760850510e-03 +675 682 1.597136003720175e-02 +675 683 2.104266184682904e-03 +675 684 -9.119197464262546e-03 +675 685 8.224868937522696e-03 +675 686 -2.156636620474508e-03 +675 687 -2.084168245044043e-02 +675 688 -1.325717275337758e-02 +675 689 3.581468700213436e-02 +675 690 -6.054059071079870e-03 +675 691 -8.784171983803557e-02 +675 692 3.337714682645164e-01 +675 693 1.121496109519654e+00 +694 703 1.121496109519653e+00 +694 704 3.337714682645714e-01 +694 705 -8.784171983803558e-02 +694 706 -6.054059071079867e-03 +694 707 3.581468700213436e-02 +694 708 -1.325717275337758e-02 +694 709 -2.084168245044044e-02 +694 710 -2.156636620475710e-03 +694 711 8.224868937522698e-03 +694 712 -9.119197464262546e-03 +694 713 2.104266184681760e-03 +694 714 1.597136003720175e-02 +694 715 7.233284760850512e-03 +694 716 -1.265402077883533e-02 +694 717 1.232479383921381e-03 +694 718 8.507818082537370e-03 +694 719 -9.719999626669558e-03 +694 720 4.056073820312880e-03 +695 703 -1.833267155555127e-01 +695 704 8.496052943250727e-01 +695 705 7.978124774258091e-01 +695 706 2.709112098462862e-02 +695 707 -1.341009959651975e-01 +695 708 4.603749937463113e-02 +695 709 6.969985820549007e-02 +695 710 7.073583005506204e-03 +695 711 -2.675090448249079e-02 +695 712 3.008346487896271e-02 +695 713 -6.878577509572217e-03 +695 714 -5.147043285304069e-02 +695 715 -2.296833469170002e-02 +695 716 3.967378200088315e-02 +695 717 -3.826530502170227e-03 +695 718 -2.623252505678739e-02 +695 719 2.983957599313041e-02 +695 720 -1.242564713429257e-02 +696 703 1.012997478615555e-01 +696 704 -2.866596804778632e-01 +696 705 4.009285655348281e-01 +696 706 1.003092729754150e+00 +696 707 4.718042883536085e-01 +696 708 -1.151051233747645e-01 +696 709 -1.533011412395431e-01 +696 710 -1.467336790749493e-02 +696 711 5.417647031984067e-02 +696 712 -6.347065826160776e-02 +696 713 1.413095968572057e-02 +696 714 1.016285359894843e-01 +696 715 4.361555150730619e-02 +696 716 -7.297122858953765e-02 +696 717 6.873636058245047e-03 +696 718 4.636253866511327e-02 +696 719 -5.220965998265183e-02 +696 720 2.163688115667517e-02 +697 703 -6.675829549002014e-02 +697 704 1.714825278878344e-01 +697 705 -1.763260094650432e-01 +697 706 -3.524913251502497e-02 +697 707 7.751613393474800e-01 +697 708 9.500818362211397e-01 +697 709 4.551820017945855e-01 +697 710 3.440881837090111e-02 +697 711 -1.173436103509136e-01 +697 712 1.582637096187084e-01 +697 713 -3.205658723742846e-02 +697 714 -2.040533508482612e-01 +697 715 -7.898266143118524e-02 +697 716 1.226433507083564e-01 +697 717 -1.098389774586085e-02 +697 718 -7.170870669864547e-02 +697 719 7.919894876866436e-02 +697 720 -3.252580339150158e-02 +698 703 4.654764921313025e-02 +698 704 -1.153084751520903e-01 +698 705 1.084975613502238e-01 +698 706 1.782365365319096e-02 +698 707 -2.253712020788916e-01 +698 708 1.833451203870996e-01 +698 709 7.871848513645239e-01 +698 710 9.980475420281737e-01 +698 711 9.659358568042402e-01 +698 712 9.659358568042401e-01 +698 713 9.980475420281757e-01 +698 714 7.871848513645238e-01 +698 715 1.833451203870997e-01 +698 716 -2.253712020788916e-01 +698 717 1.782365365319097e-02 +698 718 1.084975613502237e-01 +698 719 -1.153084751520859e-01 +698 720 4.654764921313027e-02 +699 703 -3.252580339150157e-02 +699 704 7.919894876866750e-02 +699 705 -7.170870669864547e-02 +699 706 -1.098389774586085e-02 +699 707 1.226433507083564e-01 +699 708 -7.898266143118522e-02 +699 709 -2.040533508482612e-01 +699 710 -3.205658723744551e-02 +699 711 1.582637096187085e-01 +699 712 -1.173436103509136e-01 +699 713 3.440881837088147e-02 +699 714 4.551820017945854e-01 +699 715 9.500818362211400e-01 +699 716 7.751613393474800e-01 +699 717 -3.524913251502498e-02 +699 718 -1.763260094650432e-01 +699 719 1.714825278878287e-01 +699 720 -6.675829549002017e-02 +700 703 2.163688115667516e-02 +700 704 -5.220965998265393e-02 +700 705 4.636253866511327e-02 +700 706 6.873636058245044e-03 +700 707 -7.297122858953764e-02 +700 708 4.361555150730616e-02 +700 709 1.016285359894843e-01 +700 710 1.413095968572820e-02 +700 711 -6.347065826160775e-02 +700 712 5.417647031984065e-02 +700 713 -1.467336790748669e-02 +700 714 -1.533011412395430e-01 +700 715 -1.151051233747645e-01 +700 716 4.718042883536084e-01 +700 717 1.003092729754150e+00 +700 718 4.009285655348280e-01 +700 719 -2.866596804778571e-01 +700 720 1.012997478615555e-01 +701 703 -1.242564713429257e-02 +701 704 2.983957599313164e-02 +701 705 -2.623252505678740e-02 +701 706 -3.826530502170227e-03 +701 707 3.967378200088316e-02 +701 708 -2.296833469170003e-02 +701 709 -5.147043285304072e-02 +701 710 -6.878577509575954e-03 +701 711 3.008346487896273e-02 +701 712 -2.675090448249079e-02 +701 713 7.073583005502259e-03 +701 714 6.969985820549009e-02 +701 715 4.603749937463117e-02 +701 716 -1.341009959651975e-01 +701 717 2.709112098462864e-02 +701 718 7.978124774258092e-01 +701 719 8.496052943251251e-01 +701 720 -1.833267155555129e-01 +702 703 4.056073820312879e-03 +702 704 -9.719999626669961e-03 +702 705 8.507818082537370e-03 +702 706 1.232479383921380e-03 +702 707 -1.265402077883533e-02 +702 708 7.233284760850510e-03 +702 709 1.597136003720175e-02 +702 710 2.104266184682904e-03 +702 711 -9.119197464262546e-03 +702 712 8.224868937522696e-03 +702 713 -2.156636620474508e-03 +702 714 -2.084168245044043e-02 +702 715 -1.325717275337758e-02 +702 716 3.581468700213436e-02 +702 717 -6.054059071079870e-03 +702 718 -8.784171983803557e-02 +702 719 3.337714682645164e-01 +702 720 1.121496109519654e+00 +739 748 1.121496109519653e+00 +739 749 3.337714682645714e-01 +739 750 -8.784171983803558e-02 +739 751 -6.054059071079867e-03 +739 752 3.581468700213436e-02 +739 753 -1.325717275337758e-02 +739 754 -2.084168245044044e-02 +739 755 -2.156636620475710e-03 +739 756 8.224868937522698e-03 +739 757 -9.119197464262546e-03 +739 758 2.104266184681760e-03 +739 759 1.597136003720175e-02 +739 760 7.233284760850512e-03 +739 761 -1.265402077883533e-02 +739 762 1.232479383921381e-03 +739 763 8.507818082537370e-03 +739 764 -9.719999626669558e-03 +739 765 4.056073820312880e-03 +740 748 -1.833267155555127e-01 +740 749 8.496052943250727e-01 +740 750 7.978124774258091e-01 +740 751 2.709112098462862e-02 +740 752 -1.341009959651975e-01 +740 753 4.603749937463113e-02 +740 754 6.969985820549007e-02 +740 755 7.073583005506204e-03 +740 756 -2.675090448249079e-02 +740 757 3.008346487896271e-02 +740 758 -6.878577509572217e-03 +740 759 -5.147043285304069e-02 +740 760 -2.296833469170002e-02 +740 761 3.967378200088315e-02 +740 762 -3.826530502170227e-03 +740 763 -2.623252505678739e-02 +740 764 2.983957599313041e-02 +740 765 -1.242564713429257e-02 +741 748 1.012997478615555e-01 +741 749 -2.866596804778632e-01 +741 750 4.009285655348281e-01 +741 751 1.003092729754150e+00 +741 752 4.718042883536085e-01 +741 753 -1.151051233747645e-01 +741 754 -1.533011412395431e-01 +741 755 -1.467336790749493e-02 +741 756 5.417647031984067e-02 +741 757 -6.347065826160776e-02 +741 758 1.413095968572057e-02 +741 759 1.016285359894843e-01 +741 760 4.361555150730619e-02 +741 761 -7.297122858953765e-02 +741 762 6.873636058245047e-03 +741 763 4.636253866511327e-02 +741 764 -5.220965998265183e-02 +741 765 2.163688115667517e-02 +742 748 -6.675829549002014e-02 +742 749 1.714825278878344e-01 +742 750 -1.763260094650432e-01 +742 751 -3.524913251502497e-02 +742 752 7.751613393474800e-01 +742 753 9.500818362211397e-01 +742 754 4.551820017945855e-01 +742 755 3.440881837090111e-02 +742 756 -1.173436103509136e-01 +742 757 1.582637096187084e-01 +742 758 -3.205658723742846e-02 +742 759 -2.040533508482612e-01 +742 760 -7.898266143118524e-02 +742 761 1.226433507083564e-01 +742 762 -1.098389774586085e-02 +742 763 -7.170870669864547e-02 +742 764 7.919894876866436e-02 +742 765 -3.252580339150158e-02 +743 748 4.654764921313025e-02 +743 749 -1.153084751520903e-01 +743 750 1.084975613502238e-01 +743 751 1.782365365319096e-02 +743 752 -2.253712020788916e-01 +743 753 1.833451203870996e-01 +743 754 7.871848513645239e-01 +743 755 9.980475420281737e-01 +743 756 9.659358568042402e-01 +743 757 9.659358568042401e-01 +743 758 9.980475420281757e-01 +743 759 7.871848513645238e-01 +743 760 1.833451203870997e-01 +743 761 -2.253712020788916e-01 +743 762 1.782365365319097e-02 +743 763 1.084975613502237e-01 +743 764 -1.153084751520859e-01 +743 765 4.654764921313027e-02 +744 748 -3.252580339150157e-02 +744 749 7.919894876866750e-02 +744 750 -7.170870669864547e-02 +744 751 -1.098389774586085e-02 +744 752 1.226433507083564e-01 +744 753 -7.898266143118522e-02 +744 754 -2.040533508482612e-01 +744 755 -3.205658723744551e-02 +744 756 1.582637096187085e-01 +744 757 -1.173436103509136e-01 +744 758 3.440881837088147e-02 +744 759 4.551820017945854e-01 +744 760 9.500818362211400e-01 +744 761 7.751613393474800e-01 +744 762 -3.524913251502498e-02 +744 763 -1.763260094650432e-01 +744 764 1.714825278878287e-01 +744 765 -6.675829549002017e-02 +745 748 2.163688115667516e-02 +745 749 -5.220965998265393e-02 +745 750 4.636253866511327e-02 +745 751 6.873636058245044e-03 +745 752 -7.297122858953764e-02 +745 753 4.361555150730616e-02 +745 754 1.016285359894843e-01 +745 755 1.413095968572820e-02 +745 756 -6.347065826160775e-02 +745 757 5.417647031984065e-02 +745 758 -1.467336790748669e-02 +745 759 -1.533011412395430e-01 +745 760 -1.151051233747645e-01 +745 761 4.718042883536084e-01 +745 762 1.003092729754150e+00 +745 763 4.009285655348280e-01 +745 764 -2.866596804778571e-01 +745 765 1.012997478615555e-01 +746 748 -1.242564713429257e-02 +746 749 2.983957599313164e-02 +746 750 -2.623252505678740e-02 +746 751 -3.826530502170227e-03 +746 752 3.967378200088316e-02 +746 753 -2.296833469170003e-02 +746 754 -5.147043285304072e-02 +746 755 -6.878577509575954e-03 +746 756 3.008346487896273e-02 +746 757 -2.675090448249079e-02 +746 758 7.073583005502259e-03 +746 759 6.969985820549009e-02 +746 760 4.603749937463117e-02 +746 761 -1.341009959651975e-01 +746 762 2.709112098462864e-02 +746 763 7.978124774258092e-01 +746 764 8.496052943251251e-01 +746 765 -1.833267155555129e-01 +747 748 4.056073820312879e-03 +747 749 -9.719999626669961e-03 +747 750 8.507818082537370e-03 +747 751 1.232479383921380e-03 +747 752 -1.265402077883533e-02 +747 753 7.233284760850510e-03 +747 754 1.597136003720175e-02 +747 755 2.104266184682904e-03 +747 756 -9.119197464262546e-03 +747 757 8.224868937522696e-03 +747 758 -2.156636620474508e-03 +747 759 -2.084168245044043e-02 +747 760 -1.325717275337758e-02 +747 761 3.581468700213436e-02 +747 762 -6.054059071079870e-03 +747 763 -8.784171983803557e-02 +747 764 3.337714682645164e-01 +747 765 1.121496109519654e+00 +766 775 1.121496109519653e+00 +766 776 3.337714682645714e-01 +766 777 -8.784171983803558e-02 +766 778 -6.054059071079867e-03 +766 779 3.581468700213436e-02 +766 780 -1.325717275337758e-02 +766 781 -2.084168245044044e-02 +766 782 -2.156636620475710e-03 +766 783 8.224868937522698e-03 +766 784 -9.119197464262546e-03 +766 785 2.104266184681760e-03 +766 786 1.597136003720175e-02 +766 787 7.233284760850512e-03 +766 788 -1.265402077883533e-02 +766 789 1.232479383921381e-03 +766 790 8.507818082537370e-03 +766 791 -9.719999626669558e-03 +766 792 4.056073820312880e-03 +767 775 -1.833267155555127e-01 +767 776 8.496052943250727e-01 +767 777 7.978124774258091e-01 +767 778 2.709112098462862e-02 +767 779 -1.341009959651975e-01 +767 780 4.603749937463113e-02 +767 781 6.969985820549007e-02 +767 782 7.073583005506204e-03 +767 783 -2.675090448249079e-02 +767 784 3.008346487896271e-02 +767 785 -6.878577509572217e-03 +767 786 -5.147043285304069e-02 +767 787 -2.296833469170002e-02 +767 788 3.967378200088315e-02 +767 789 -3.826530502170227e-03 +767 790 -2.623252505678739e-02 +767 791 2.983957599313041e-02 +767 792 -1.242564713429257e-02 +768 775 1.012997478615555e-01 +768 776 -2.866596804778632e-01 +768 777 4.009285655348281e-01 +768 778 1.003092729754150e+00 +768 779 4.718042883536085e-01 +768 780 -1.151051233747645e-01 +768 781 -1.533011412395431e-01 +768 782 -1.467336790749493e-02 +768 783 5.417647031984067e-02 +768 784 -6.347065826160776e-02 +768 785 1.413095968572057e-02 +768 786 1.016285359894843e-01 +768 787 4.361555150730619e-02 +768 788 -7.297122858953765e-02 +768 789 6.873636058245047e-03 +768 790 4.636253866511327e-02 +768 791 -5.220965998265183e-02 +768 792 2.163688115667517e-02 +769 775 -6.675829549002014e-02 +769 776 1.714825278878344e-01 +769 777 -1.763260094650432e-01 +769 778 -3.524913251502497e-02 +769 779 7.751613393474800e-01 +769 780 9.500818362211397e-01 +769 781 4.551820017945855e-01 +769 782 3.440881837090111e-02 +769 783 -1.173436103509136e-01 +769 784 1.582637096187084e-01 +769 785 -3.205658723742846e-02 +769 786 -2.040533508482612e-01 +769 787 -7.898266143118524e-02 +769 788 1.226433507083564e-01 +769 789 -1.098389774586085e-02 +769 790 -7.170870669864547e-02 +769 791 7.919894876866436e-02 +769 792 -3.252580339150158e-02 +770 775 4.654764921313025e-02 +770 776 -1.153084751520903e-01 +770 777 1.084975613502238e-01 +770 778 1.782365365319096e-02 +770 779 -2.253712020788916e-01 +770 780 1.833451203870996e-01 +770 781 7.871848513645239e-01 +770 782 9.980475420281737e-01 +770 783 9.659358568042402e-01 +770 784 9.659358568042401e-01 +770 785 9.980475420281757e-01 +770 786 7.871848513645238e-01 +770 787 1.833451203870997e-01 +770 788 -2.253712020788916e-01 +770 789 1.782365365319097e-02 +770 790 1.084975613502237e-01 +770 791 -1.153084751520859e-01 +770 792 4.654764921313027e-02 +771 775 -3.252580339150157e-02 +771 776 7.919894876866750e-02 +771 777 -7.170870669864547e-02 +771 778 -1.098389774586085e-02 +771 779 1.226433507083564e-01 +771 780 -7.898266143118522e-02 +771 781 -2.040533508482612e-01 +771 782 -3.205658723744551e-02 +771 783 1.582637096187085e-01 +771 784 -1.173436103509136e-01 +771 785 3.440881837088147e-02 +771 786 4.551820017945854e-01 +771 787 9.500818362211400e-01 +771 788 7.751613393474800e-01 +771 789 -3.524913251502498e-02 +771 790 -1.763260094650432e-01 +771 791 1.714825278878287e-01 +771 792 -6.675829549002017e-02 +772 775 2.163688115667516e-02 +772 776 -5.220965998265393e-02 +772 777 4.636253866511327e-02 +772 778 6.873636058245044e-03 +772 779 -7.297122858953764e-02 +772 780 4.361555150730616e-02 +772 781 1.016285359894843e-01 +772 782 1.413095968572820e-02 +772 783 -6.347065826160775e-02 +772 784 5.417647031984065e-02 +772 785 -1.467336790748669e-02 +772 786 -1.533011412395430e-01 +772 787 -1.151051233747645e-01 +772 788 4.718042883536084e-01 +772 789 1.003092729754150e+00 +772 790 4.009285655348280e-01 +772 791 -2.866596804778571e-01 +772 792 1.012997478615555e-01 +773 775 -1.242564713429257e-02 +773 776 2.983957599313164e-02 +773 777 -2.623252505678740e-02 +773 778 -3.826530502170227e-03 +773 779 3.967378200088316e-02 +773 780 -2.296833469170003e-02 +773 781 -5.147043285304072e-02 +773 782 -6.878577509575954e-03 +773 783 3.008346487896273e-02 +773 784 -2.675090448249079e-02 +773 785 7.073583005502259e-03 +773 786 6.969985820549009e-02 +773 787 4.603749937463117e-02 +773 788 -1.341009959651975e-01 +773 789 2.709112098462864e-02 +773 790 7.978124774258092e-01 +773 791 8.496052943251251e-01 +773 792 -1.833267155555129e-01 +774 775 4.056073820312879e-03 +774 776 -9.719999626669961e-03 +774 777 8.507818082537370e-03 +774 778 1.232479383921380e-03 +774 779 -1.265402077883533e-02 +774 780 7.233284760850510e-03 +774 781 1.597136003720175e-02 +774 782 2.104266184682904e-03 +774 783 -9.119197464262546e-03 +774 784 8.224868937522696e-03 +774 785 -2.156636620474508e-03 +774 786 -2.084168245044043e-02 +774 787 -1.325717275337758e-02 +774 788 3.581468700213436e-02 +774 789 -6.054059071079870e-03 +774 790 -8.784171983803557e-02 +774 791 3.337714682645164e-01 +774 792 1.121496109519654e+00 +802 811 1.121496109519653e+00 +802 812 3.337714682645714e-01 +802 813 -8.784171983803558e-02 +802 814 -6.054059071079867e-03 +802 815 3.581468700213436e-02 +802 816 -1.325717275337758e-02 +802 817 -2.084168245044044e-02 +802 818 -2.156636620475710e-03 +802 819 8.224868937522698e-03 +802 820 -9.119197464262546e-03 +802 821 2.104266184681760e-03 +802 822 1.597136003720175e-02 +802 823 7.233284760850512e-03 +802 824 -1.265402077883533e-02 +802 825 1.232479383921381e-03 +802 826 8.507818082537370e-03 +802 827 -9.719999626669558e-03 +802 828 4.056073820312880e-03 +803 811 -1.833267155555127e-01 +803 812 8.496052943250727e-01 +803 813 7.978124774258091e-01 +803 814 2.709112098462862e-02 +803 815 -1.341009959651975e-01 +803 816 4.603749937463113e-02 +803 817 6.969985820549007e-02 +803 818 7.073583005506204e-03 +803 819 -2.675090448249079e-02 +803 820 3.008346487896271e-02 +803 821 -6.878577509572217e-03 +803 822 -5.147043285304069e-02 +803 823 -2.296833469170002e-02 +803 824 3.967378200088315e-02 +803 825 -3.826530502170227e-03 +803 826 -2.623252505678739e-02 +803 827 2.983957599313041e-02 +803 828 -1.242564713429257e-02 +804 811 1.012997478615555e-01 +804 812 -2.866596804778632e-01 +804 813 4.009285655348281e-01 +804 814 1.003092729754150e+00 +804 815 4.718042883536085e-01 +804 816 -1.151051233747645e-01 +804 817 -1.533011412395431e-01 +804 818 -1.467336790749493e-02 +804 819 5.417647031984067e-02 +804 820 -6.347065826160776e-02 +804 821 1.413095968572057e-02 +804 822 1.016285359894843e-01 +804 823 4.361555150730619e-02 +804 824 -7.297122858953765e-02 +804 825 6.873636058245047e-03 +804 826 4.636253866511327e-02 +804 827 -5.220965998265183e-02 +804 828 2.163688115667517e-02 +805 811 -6.675829549002014e-02 +805 812 1.714825278878344e-01 +805 813 -1.763260094650432e-01 +805 814 -3.524913251502497e-02 +805 815 7.751613393474800e-01 +805 816 9.500818362211397e-01 +805 817 4.551820017945855e-01 +805 818 3.440881837090111e-02 +805 819 -1.173436103509136e-01 +805 820 1.582637096187084e-01 +805 821 -3.205658723742846e-02 +805 822 -2.040533508482612e-01 +805 823 -7.898266143118524e-02 +805 824 1.226433507083564e-01 +805 825 -1.098389774586085e-02 +805 826 -7.170870669864547e-02 +805 827 7.919894876866436e-02 +805 828 -3.252580339150158e-02 +806 811 4.654764921313025e-02 +806 812 -1.153084751520903e-01 +806 813 1.084975613502238e-01 +806 814 1.782365365319096e-02 +806 815 -2.253712020788916e-01 +806 816 1.833451203870996e-01 +806 817 7.871848513645239e-01 +806 818 9.980475420281737e-01 +806 819 9.659358568042402e-01 +806 820 9.659358568042401e-01 +806 821 9.980475420281757e-01 +806 822 7.871848513645238e-01 +806 823 1.833451203870997e-01 +806 824 -2.253712020788916e-01 +806 825 1.782365365319097e-02 +806 826 1.084975613502237e-01 +806 827 -1.153084751520859e-01 +806 828 4.654764921313027e-02 +807 811 -3.252580339150157e-02 +807 812 7.919894876866750e-02 +807 813 -7.170870669864547e-02 +807 814 -1.098389774586085e-02 +807 815 1.226433507083564e-01 +807 816 -7.898266143118522e-02 +807 817 -2.040533508482612e-01 +807 818 -3.205658723744551e-02 +807 819 1.582637096187085e-01 +807 820 -1.173436103509136e-01 +807 821 3.440881837088147e-02 +807 822 4.551820017945854e-01 +807 823 9.500818362211400e-01 +807 824 7.751613393474800e-01 +807 825 -3.524913251502498e-02 +807 826 -1.763260094650432e-01 +807 827 1.714825278878287e-01 +807 828 -6.675829549002017e-02 +808 811 2.163688115667516e-02 +808 812 -5.220965998265393e-02 +808 813 4.636253866511327e-02 +808 814 6.873636058245044e-03 +808 815 -7.297122858953764e-02 +808 816 4.361555150730616e-02 +808 817 1.016285359894843e-01 +808 818 1.413095968572820e-02 +808 819 -6.347065826160775e-02 +808 820 5.417647031984065e-02 +808 821 -1.467336790748669e-02 +808 822 -1.533011412395430e-01 +808 823 -1.151051233747645e-01 +808 824 4.718042883536084e-01 +808 825 1.003092729754150e+00 +808 826 4.009285655348280e-01 +808 827 -2.866596804778571e-01 +808 828 1.012997478615555e-01 +809 811 -1.242564713429257e-02 +809 812 2.983957599313164e-02 +809 813 -2.623252505678740e-02 +809 814 -3.826530502170227e-03 +809 815 3.967378200088316e-02 +809 816 -2.296833469170003e-02 +809 817 -5.147043285304072e-02 +809 818 -6.878577509575954e-03 +809 819 3.008346487896273e-02 +809 820 -2.675090448249079e-02 +809 821 7.073583005502259e-03 +809 822 6.969985820549009e-02 +809 823 4.603749937463117e-02 +809 824 -1.341009959651975e-01 +809 825 2.709112098462864e-02 +809 826 7.978124774258092e-01 +809 827 8.496052943251251e-01 +809 828 -1.833267155555129e-01 +810 811 4.056073820312879e-03 +810 812 -9.719999626669961e-03 +810 813 8.507818082537370e-03 +810 814 1.232479383921380e-03 +810 815 -1.265402077883533e-02 +810 816 7.233284760850510e-03 +810 817 1.597136003720175e-02 +810 818 2.104266184682904e-03 +810 819 -9.119197464262546e-03 +810 820 8.224868937522696e-03 +810 821 -2.156636620474508e-03 +810 822 -2.084168245044043e-02 +810 823 -1.325717275337758e-02 +810 824 3.581468700213436e-02 +810 825 -6.054059071079870e-03 +810 826 -8.784171983803557e-02 +810 827 3.337714682645164e-01 +810 828 1.121496109519654e+00 +829 838 1.121496109519653e+00 +829 839 3.337714682645714e-01 +829 840 -8.784171983803558e-02 +829 841 -6.054059071079867e-03 +829 842 3.581468700213436e-02 +829 843 -1.325717275337758e-02 +829 844 -2.084168245044044e-02 +829 845 -2.156636620475710e-03 +829 846 8.224868937522698e-03 +829 847 -9.119197464262546e-03 +829 848 2.104266184681760e-03 +829 849 1.597136003720175e-02 +829 850 7.233284760850512e-03 +829 851 -1.265402077883533e-02 +829 852 1.232479383921381e-03 +829 853 8.507818082537370e-03 +829 854 -9.719999626669558e-03 +829 855 4.056073820312880e-03 +830 838 -1.833267155555127e-01 +830 839 8.496052943250727e-01 +830 840 7.978124774258091e-01 +830 841 2.709112098462862e-02 +830 842 -1.341009959651975e-01 +830 843 4.603749937463113e-02 +830 844 6.969985820549007e-02 +830 845 7.073583005506204e-03 +830 846 -2.675090448249079e-02 +830 847 3.008346487896271e-02 +830 848 -6.878577509572217e-03 +830 849 -5.147043285304069e-02 +830 850 -2.296833469170002e-02 +830 851 3.967378200088315e-02 +830 852 -3.826530502170227e-03 +830 853 -2.623252505678739e-02 +830 854 2.983957599313041e-02 +830 855 -1.242564713429257e-02 +831 838 1.012997478615555e-01 +831 839 -2.866596804778632e-01 +831 840 4.009285655348281e-01 +831 841 1.003092729754150e+00 +831 842 4.718042883536085e-01 +831 843 -1.151051233747645e-01 +831 844 -1.533011412395431e-01 +831 845 -1.467336790749493e-02 +831 846 5.417647031984067e-02 +831 847 -6.347065826160776e-02 +831 848 1.413095968572057e-02 +831 849 1.016285359894843e-01 +831 850 4.361555150730619e-02 +831 851 -7.297122858953765e-02 +831 852 6.873636058245047e-03 +831 853 4.636253866511327e-02 +831 854 -5.220965998265183e-02 +831 855 2.163688115667517e-02 +832 838 -6.675829549002014e-02 +832 839 1.714825278878344e-01 +832 840 -1.763260094650432e-01 +832 841 -3.524913251502497e-02 +832 842 7.751613393474800e-01 +832 843 9.500818362211397e-01 +832 844 4.551820017945855e-01 +832 845 3.440881837090111e-02 +832 846 -1.173436103509136e-01 +832 847 1.582637096187084e-01 +832 848 -3.205658723742846e-02 +832 849 -2.040533508482612e-01 +832 850 -7.898266143118524e-02 +832 851 1.226433507083564e-01 +832 852 -1.098389774586085e-02 +832 853 -7.170870669864547e-02 +832 854 7.919894876866436e-02 +832 855 -3.252580339150158e-02 +833 838 4.654764921313025e-02 +833 839 -1.153084751520903e-01 +833 840 1.084975613502238e-01 +833 841 1.782365365319096e-02 +833 842 -2.253712020788916e-01 +833 843 1.833451203870996e-01 +833 844 7.871848513645239e-01 +833 845 9.980475420281737e-01 +833 846 9.659358568042402e-01 +833 847 9.659358568042401e-01 +833 848 9.980475420281757e-01 +833 849 7.871848513645238e-01 +833 850 1.833451203870997e-01 +833 851 -2.253712020788916e-01 +833 852 1.782365365319097e-02 +833 853 1.084975613502237e-01 +833 854 -1.153084751520859e-01 +833 855 4.654764921313027e-02 +834 838 -3.252580339150157e-02 +834 839 7.919894876866750e-02 +834 840 -7.170870669864547e-02 +834 841 -1.098389774586085e-02 +834 842 1.226433507083564e-01 +834 843 -7.898266143118522e-02 +834 844 -2.040533508482612e-01 +834 845 -3.205658723744551e-02 +834 846 1.582637096187085e-01 +834 847 -1.173436103509136e-01 +834 848 3.440881837088147e-02 +834 849 4.551820017945854e-01 +834 850 9.500818362211400e-01 +834 851 7.751613393474800e-01 +834 852 -3.524913251502498e-02 +834 853 -1.763260094650432e-01 +834 854 1.714825278878287e-01 +834 855 -6.675829549002017e-02 +835 838 2.163688115667516e-02 +835 839 -5.220965998265393e-02 +835 840 4.636253866511327e-02 +835 841 6.873636058245044e-03 +835 842 -7.297122858953764e-02 +835 843 4.361555150730616e-02 +835 844 1.016285359894843e-01 +835 845 1.413095968572820e-02 +835 846 -6.347065826160775e-02 +835 847 5.417647031984065e-02 +835 848 -1.467336790748669e-02 +835 849 -1.533011412395430e-01 +835 850 -1.151051233747645e-01 +835 851 4.718042883536084e-01 +835 852 1.003092729754150e+00 +835 853 4.009285655348280e-01 +835 854 -2.866596804778571e-01 +835 855 1.012997478615555e-01 +836 838 -1.242564713429257e-02 +836 839 2.983957599313164e-02 +836 840 -2.623252505678740e-02 +836 841 -3.826530502170227e-03 +836 842 3.967378200088316e-02 +836 843 -2.296833469170003e-02 +836 844 -5.147043285304072e-02 +836 845 -6.878577509575954e-03 +836 846 3.008346487896273e-02 +836 847 -2.675090448249079e-02 +836 848 7.073583005502259e-03 +836 849 6.969985820549009e-02 +836 850 4.603749937463117e-02 +836 851 -1.341009959651975e-01 +836 852 2.709112098462864e-02 +836 853 7.978124774258092e-01 +836 854 8.496052943251251e-01 +836 855 -1.833267155555129e-01 +837 838 4.056073820312879e-03 +837 839 -9.719999626669961e-03 +837 840 8.507818082537370e-03 +837 841 1.232479383921380e-03 +837 842 -1.265402077883533e-02 +837 843 7.233284760850510e-03 +837 844 1.597136003720175e-02 +837 845 2.104266184682904e-03 +837 846 -9.119197464262546e-03 +837 847 8.224868937522696e-03 +837 848 -2.156636620474508e-03 +837 849 -2.084168245044043e-02 +837 850 -1.325717275337758e-02 +837 851 3.581468700213436e-02 +837 852 -6.054059071079870e-03 +837 853 -8.784171983803557e-02 +837 854 3.337714682645164e-01 +837 855 1.121496109519654e+00 +883 892 1.121496109519653e+00 +883 893 3.337714682645714e-01 +883 894 -8.784171983803558e-02 +883 895 -6.054059071079867e-03 +883 896 3.581468700213436e-02 +883 897 -1.325717275337758e-02 +883 898 -2.084168245044044e-02 +883 899 -2.156636620475710e-03 +883 900 8.224868937522698e-03 +883 901 -9.119197464262546e-03 +883 902 2.104266184681760e-03 +883 903 1.597136003720175e-02 +883 904 7.233284760850512e-03 +883 905 -1.265402077883533e-02 +883 906 1.232479383921381e-03 +883 907 8.507818082537370e-03 +883 908 -9.719999626669558e-03 +883 909 4.056073820312880e-03 +884 892 -1.833267155555127e-01 +884 893 8.496052943250727e-01 +884 894 7.978124774258091e-01 +884 895 2.709112098462862e-02 +884 896 -1.341009959651975e-01 +884 897 4.603749937463113e-02 +884 898 6.969985820549007e-02 +884 899 7.073583005506204e-03 +884 900 -2.675090448249079e-02 +884 901 3.008346487896271e-02 +884 902 -6.878577509572217e-03 +884 903 -5.147043285304069e-02 +884 904 -2.296833469170002e-02 +884 905 3.967378200088315e-02 +884 906 -3.826530502170227e-03 +884 907 -2.623252505678739e-02 +884 908 2.983957599313041e-02 +884 909 -1.242564713429257e-02 +885 892 1.012997478615555e-01 +885 893 -2.866596804778632e-01 +885 894 4.009285655348281e-01 +885 895 1.003092729754150e+00 +885 896 4.718042883536085e-01 +885 897 -1.151051233747645e-01 +885 898 -1.533011412395431e-01 +885 899 -1.467336790749493e-02 +885 900 5.417647031984067e-02 +885 901 -6.347065826160776e-02 +885 902 1.413095968572057e-02 +885 903 1.016285359894843e-01 +885 904 4.361555150730619e-02 +885 905 -7.297122858953765e-02 +885 906 6.873636058245047e-03 +885 907 4.636253866511327e-02 +885 908 -5.220965998265183e-02 +885 909 2.163688115667517e-02 +886 892 -6.675829549002014e-02 +886 893 1.714825278878344e-01 +886 894 -1.763260094650432e-01 +886 895 -3.524913251502497e-02 +886 896 7.751613393474800e-01 +886 897 9.500818362211397e-01 +886 898 4.551820017945855e-01 +886 899 3.440881837090111e-02 +886 900 -1.173436103509136e-01 +886 901 1.582637096187084e-01 +886 902 -3.205658723742846e-02 +886 903 -2.040533508482612e-01 +886 904 -7.898266143118524e-02 +886 905 1.226433507083564e-01 +886 906 -1.098389774586085e-02 +886 907 -7.170870669864547e-02 +886 908 7.919894876866436e-02 +886 909 -3.252580339150158e-02 +887 892 4.654764921313025e-02 +887 893 -1.153084751520903e-01 +887 894 1.084975613502238e-01 +887 895 1.782365365319096e-02 +887 896 -2.253712020788916e-01 +887 897 1.833451203870996e-01 +887 898 7.871848513645239e-01 +887 899 9.980475420281737e-01 +887 900 9.659358568042402e-01 +887 901 9.659358568042401e-01 +887 902 9.980475420281757e-01 +887 903 7.871848513645238e-01 +887 904 1.833451203870997e-01 +887 905 -2.253712020788916e-01 +887 906 1.782365365319097e-02 +887 907 1.084975613502237e-01 +887 908 -1.153084751520859e-01 +887 909 4.654764921313027e-02 +888 892 -3.252580339150157e-02 +888 893 7.919894876866750e-02 +888 894 -7.170870669864547e-02 +888 895 -1.098389774586085e-02 +888 896 1.226433507083564e-01 +888 897 -7.898266143118522e-02 +888 898 -2.040533508482612e-01 +888 899 -3.205658723744551e-02 +888 900 1.582637096187085e-01 +888 901 -1.173436103509136e-01 +888 902 3.440881837088147e-02 +888 903 4.551820017945854e-01 +888 904 9.500818362211400e-01 +888 905 7.751613393474800e-01 +888 906 -3.524913251502498e-02 +888 907 -1.763260094650432e-01 +888 908 1.714825278878287e-01 +888 909 -6.675829549002017e-02 +889 892 2.163688115667516e-02 +889 893 -5.220965998265393e-02 +889 894 4.636253866511327e-02 +889 895 6.873636058245044e-03 +889 896 -7.297122858953764e-02 +889 897 4.361555150730616e-02 +889 898 1.016285359894843e-01 +889 899 1.413095968572820e-02 +889 900 -6.347065826160775e-02 +889 901 5.417647031984065e-02 +889 902 -1.467336790748669e-02 +889 903 -1.533011412395430e-01 +889 904 -1.151051233747645e-01 +889 905 4.718042883536084e-01 +889 906 1.003092729754150e+00 +889 907 4.009285655348280e-01 +889 908 -2.866596804778571e-01 +889 909 1.012997478615555e-01 +890 892 -1.242564713429257e-02 +890 893 2.983957599313164e-02 +890 894 -2.623252505678740e-02 +890 895 -3.826530502170227e-03 +890 896 3.967378200088316e-02 +890 897 -2.296833469170003e-02 +890 898 -5.147043285304072e-02 +890 899 -6.878577509575954e-03 +890 900 3.008346487896273e-02 +890 901 -2.675090448249079e-02 +890 902 7.073583005502259e-03 +890 903 6.969985820549009e-02 +890 904 4.603749937463117e-02 +890 905 -1.341009959651975e-01 +890 906 2.709112098462864e-02 +890 907 7.978124774258092e-01 +890 908 8.496052943251251e-01 +890 909 -1.833267155555129e-01 +891 892 4.056073820312879e-03 +891 893 -9.719999626669961e-03 +891 894 8.507818082537370e-03 +891 895 1.232479383921380e-03 +891 896 -1.265402077883533e-02 +891 897 7.233284760850510e-03 +891 898 1.597136003720175e-02 +891 899 2.104266184682904e-03 +891 900 -9.119197464262546e-03 +891 901 8.224868937522696e-03 +891 902 -2.156636620474508e-03 +891 903 -2.084168245044043e-02 +891 904 -1.325717275337758e-02 +891 905 3.581468700213436e-02 +891 906 -6.054059071079870e-03 +891 907 -8.784171983803557e-02 +891 908 3.337714682645164e-01 +891 909 1.121496109519654e+00 +910 919 1.121496109519653e+00 +910 920 3.337714682645714e-01 +910 921 -8.784171983803558e-02 +910 922 -6.054059071079867e-03 +910 923 3.581468700213436e-02 +910 924 -1.325717275337758e-02 +910 925 -2.084168245044044e-02 +910 926 -2.156636620475710e-03 +910 927 8.224868937522698e-03 +910 928 -9.119197464262546e-03 +910 929 2.104266184681760e-03 +910 930 1.597136003720175e-02 +910 931 7.233284760850512e-03 +910 932 -1.265402077883533e-02 +910 933 1.232479383921381e-03 +910 934 8.507818082537370e-03 +910 935 -9.719999626669558e-03 +910 936 4.056073820312880e-03 +911 919 -1.833267155555127e-01 +911 920 8.496052943250727e-01 +911 921 7.978124774258091e-01 +911 922 2.709112098462862e-02 +911 923 -1.341009959651975e-01 +911 924 4.603749937463113e-02 +911 925 6.969985820549007e-02 +911 926 7.073583005506204e-03 +911 927 -2.675090448249079e-02 +911 928 3.008346487896271e-02 +911 929 -6.878577509572217e-03 +911 930 -5.147043285304069e-02 +911 931 -2.296833469170002e-02 +911 932 3.967378200088315e-02 +911 933 -3.826530502170227e-03 +911 934 -2.623252505678739e-02 +911 935 2.983957599313041e-02 +911 936 -1.242564713429257e-02 +912 919 1.012997478615555e-01 +912 920 -2.866596804778632e-01 +912 921 4.009285655348281e-01 +912 922 1.003092729754150e+00 +912 923 4.718042883536085e-01 +912 924 -1.151051233747645e-01 +912 925 -1.533011412395431e-01 +912 926 -1.467336790749493e-02 +912 927 5.417647031984067e-02 +912 928 -6.347065826160776e-02 +912 929 1.413095968572057e-02 +912 930 1.016285359894843e-01 +912 931 4.361555150730619e-02 +912 932 -7.297122858953765e-02 +912 933 6.873636058245047e-03 +912 934 4.636253866511327e-02 +912 935 -5.220965998265183e-02 +912 936 2.163688115667517e-02 +913 919 -6.675829549002014e-02 +913 920 1.714825278878344e-01 +913 921 -1.763260094650432e-01 +913 922 -3.524913251502497e-02 +913 923 7.751613393474800e-01 +913 924 9.500818362211397e-01 +913 925 4.551820017945855e-01 +913 926 3.440881837090111e-02 +913 927 -1.173436103509136e-01 +913 928 1.582637096187084e-01 +913 929 -3.205658723742846e-02 +913 930 -2.040533508482612e-01 +913 931 -7.898266143118524e-02 +913 932 1.226433507083564e-01 +913 933 -1.098389774586085e-02 +913 934 -7.170870669864547e-02 +913 935 7.919894876866436e-02 +913 936 -3.252580339150158e-02 +914 919 4.654764921313025e-02 +914 920 -1.153084751520903e-01 +914 921 1.084975613502238e-01 +914 922 1.782365365319096e-02 +914 923 -2.253712020788916e-01 +914 924 1.833451203870996e-01 +914 925 7.871848513645239e-01 +914 926 9.980475420281737e-01 +914 927 9.659358568042402e-01 +914 928 9.659358568042401e-01 +914 929 9.980475420281757e-01 +914 930 7.871848513645238e-01 +914 931 1.833451203870997e-01 +914 932 -2.253712020788916e-01 +914 933 1.782365365319097e-02 +914 934 1.084975613502237e-01 +914 935 -1.153084751520859e-01 +914 936 4.654764921313027e-02 +915 919 -3.252580339150157e-02 +915 920 7.919894876866750e-02 +915 921 -7.170870669864547e-02 +915 922 -1.098389774586085e-02 +915 923 1.226433507083564e-01 +915 924 -7.898266143118522e-02 +915 925 -2.040533508482612e-01 +915 926 -3.205658723744551e-02 +915 927 1.582637096187085e-01 +915 928 -1.173436103509136e-01 +915 929 3.440881837088147e-02 +915 930 4.551820017945854e-01 +915 931 9.500818362211400e-01 +915 932 7.751613393474800e-01 +915 933 -3.524913251502498e-02 +915 934 -1.763260094650432e-01 +915 935 1.714825278878287e-01 +915 936 -6.675829549002017e-02 +916 919 2.163688115667516e-02 +916 920 -5.220965998265393e-02 +916 921 4.636253866511327e-02 +916 922 6.873636058245044e-03 +916 923 -7.297122858953764e-02 +916 924 4.361555150730616e-02 +916 925 1.016285359894843e-01 +916 926 1.413095968572820e-02 +916 927 -6.347065826160775e-02 +916 928 5.417647031984065e-02 +916 929 -1.467336790748669e-02 +916 930 -1.533011412395430e-01 +916 931 -1.151051233747645e-01 +916 932 4.718042883536084e-01 +916 933 1.003092729754150e+00 +916 934 4.009285655348280e-01 +916 935 -2.866596804778571e-01 +916 936 1.012997478615555e-01 +917 919 -1.242564713429257e-02 +917 920 2.983957599313164e-02 +917 921 -2.623252505678740e-02 +917 922 -3.826530502170227e-03 +917 923 3.967378200088316e-02 +917 924 -2.296833469170003e-02 +917 925 -5.147043285304072e-02 +917 926 -6.878577509575954e-03 +917 927 3.008346487896273e-02 +917 928 -2.675090448249079e-02 +917 929 7.073583005502259e-03 +917 930 6.969985820549009e-02 +917 931 4.603749937463117e-02 +917 932 -1.341009959651975e-01 +917 933 2.709112098462864e-02 +917 934 7.978124774258092e-01 +917 935 8.496052943251251e-01 +917 936 -1.833267155555129e-01 +918 919 4.056073820312879e-03 +918 920 -9.719999626669961e-03 +918 921 8.507818082537370e-03 +918 922 1.232479383921380e-03 +918 923 -1.265402077883533e-02 +918 924 7.233284760850510e-03 +918 925 1.597136003720175e-02 +918 926 2.104266184682904e-03 +918 927 -9.119197464262546e-03 +918 928 8.224868937522696e-03 +918 929 -2.156636620474508e-03 +918 930 -2.084168245044043e-02 +918 931 -1.325717275337758e-02 +918 932 3.581468700213436e-02 +918 933 -6.054059071079870e-03 +918 934 -8.784171983803557e-02 +918 935 3.337714682645164e-01 +918 936 1.121496109519654e+00 +946 955 1.121496109519653e+00 +946 956 3.337714682645714e-01 +946 957 -8.784171983803558e-02 +946 958 -6.054059071079867e-03 +946 959 3.581468700213436e-02 +946 960 -1.325717275337758e-02 +946 961 -2.084168245044044e-02 +946 962 -2.156636620475710e-03 +946 963 8.224868937522698e-03 +946 964 -9.119197464262546e-03 +946 965 2.104266184681760e-03 +946 966 1.597136003720175e-02 +946 967 7.233284760850512e-03 +946 968 -1.265402077883533e-02 +946 969 1.232479383921381e-03 +946 970 8.507818082537370e-03 +946 971 -9.719999626669558e-03 +946 972 4.056073820312880e-03 +947 955 -1.833267155555127e-01 +947 956 8.496052943250727e-01 +947 957 7.978124774258091e-01 +947 958 2.709112098462862e-02 +947 959 -1.341009959651975e-01 +947 960 4.603749937463113e-02 +947 961 6.969985820549007e-02 +947 962 7.073583005506204e-03 +947 963 -2.675090448249079e-02 +947 964 3.008346487896271e-02 +947 965 -6.878577509572217e-03 +947 966 -5.147043285304069e-02 +947 967 -2.296833469170002e-02 +947 968 3.967378200088315e-02 +947 969 -3.826530502170227e-03 +947 970 -2.623252505678739e-02 +947 971 2.983957599313041e-02 +947 972 -1.242564713429257e-02 +948 955 1.012997478615555e-01 +948 956 -2.866596804778632e-01 +948 957 4.009285655348281e-01 +948 958 1.003092729754150e+00 +948 959 4.718042883536085e-01 +948 960 -1.151051233747645e-01 +948 961 -1.533011412395431e-01 +948 962 -1.467336790749493e-02 +948 963 5.417647031984067e-02 +948 964 -6.347065826160776e-02 +948 965 1.413095968572057e-02 +948 966 1.016285359894843e-01 +948 967 4.361555150730619e-02 +948 968 -7.297122858953765e-02 +948 969 6.873636058245047e-03 +948 970 4.636253866511327e-02 +948 971 -5.220965998265183e-02 +948 972 2.163688115667517e-02 +949 955 -6.675829549002014e-02 +949 956 1.714825278878344e-01 +949 957 -1.763260094650432e-01 +949 958 -3.524913251502497e-02 +949 959 7.751613393474800e-01 +949 960 9.500818362211397e-01 +949 961 4.551820017945855e-01 +949 962 3.440881837090111e-02 +949 963 -1.173436103509136e-01 +949 964 1.582637096187084e-01 +949 965 -3.205658723742846e-02 +949 966 -2.040533508482612e-01 +949 967 -7.898266143118524e-02 +949 968 1.226433507083564e-01 +949 969 -1.098389774586085e-02 +949 970 -7.170870669864547e-02 +949 971 7.919894876866436e-02 +949 972 -3.252580339150158e-02 +950 955 4.654764921313025e-02 +950 956 -1.153084751520903e-01 +950 957 1.084975613502238e-01 +950 958 1.782365365319096e-02 +950 959 -2.253712020788916e-01 +950 960 1.833451203870996e-01 +950 961 7.871848513645239e-01 +950 962 9.980475420281737e-01 +950 963 9.659358568042402e-01 +950 964 9.659358568042401e-01 +950 965 9.980475420281757e-01 +950 966 7.871848513645238e-01 +950 967 1.833451203870997e-01 +950 968 -2.253712020788916e-01 +950 969 1.782365365319097e-02 +950 970 1.084975613502237e-01 +950 971 -1.153084751520859e-01 +950 972 4.654764921313027e-02 +951 955 -3.252580339150157e-02 +951 956 7.919894876866750e-02 +951 957 -7.170870669864547e-02 +951 958 -1.098389774586085e-02 +951 959 1.226433507083564e-01 +951 960 -7.898266143118522e-02 +951 961 -2.040533508482612e-01 +951 962 -3.205658723744551e-02 +951 963 1.582637096187085e-01 +951 964 -1.173436103509136e-01 +951 965 3.440881837088147e-02 +951 966 4.551820017945854e-01 +951 967 9.500818362211400e-01 +951 968 7.751613393474800e-01 +951 969 -3.524913251502498e-02 +951 970 -1.763260094650432e-01 +951 971 1.714825278878287e-01 +951 972 -6.675829549002017e-02 +952 955 2.163688115667516e-02 +952 956 -5.220965998265393e-02 +952 957 4.636253866511327e-02 +952 958 6.873636058245044e-03 +952 959 -7.297122858953764e-02 +952 960 4.361555150730616e-02 +952 961 1.016285359894843e-01 +952 962 1.413095968572820e-02 +952 963 -6.347065826160775e-02 +952 964 5.417647031984065e-02 +952 965 -1.467336790748669e-02 +952 966 -1.533011412395430e-01 +952 967 -1.151051233747645e-01 +952 968 4.718042883536084e-01 +952 969 1.003092729754150e+00 +952 970 4.009285655348280e-01 +952 971 -2.866596804778571e-01 +952 972 1.012997478615555e-01 +953 955 -1.242564713429257e-02 +953 956 2.983957599313164e-02 +953 957 -2.623252505678740e-02 +953 958 -3.826530502170227e-03 +953 959 3.967378200088316e-02 +953 960 -2.296833469170003e-02 +953 961 -5.147043285304072e-02 +953 962 -6.878577509575954e-03 +953 963 3.008346487896273e-02 +953 964 -2.675090448249079e-02 +953 965 7.073583005502259e-03 +953 966 6.969985820549009e-02 +953 967 4.603749937463117e-02 +953 968 -1.341009959651975e-01 +953 969 2.709112098462864e-02 +953 970 7.978124774258092e-01 +953 971 8.496052943251251e-01 +953 972 -1.833267155555129e-01 +954 955 4.056073820312879e-03 +954 956 -9.719999626669961e-03 +954 957 8.507818082537370e-03 +954 958 1.232479383921380e-03 +954 959 -1.265402077883533e-02 +954 960 7.233284760850510e-03 +954 961 1.597136003720175e-02 +954 962 2.104266184682904e-03 +954 963 -9.119197464262546e-03 +954 964 8.224868937522696e-03 +954 965 -2.156636620474508e-03 +954 966 -2.084168245044043e-02 +954 967 -1.325717275337758e-02 +954 968 3.581468700213436e-02 +954 969 -6.054059071079870e-03 +954 970 -8.784171983803557e-02 +954 971 3.337714682645164e-01 +954 972 1.121496109519654e+00 +973 982 1.121496109519653e+00 +973 983 3.337714682645714e-01 +973 984 -8.784171983803558e-02 +973 985 -6.054059071079867e-03 +973 986 3.581468700213436e-02 +973 987 -1.325717275337758e-02 +973 988 -2.084168245044044e-02 +973 989 -2.156636620475710e-03 +973 990 8.224868937522698e-03 +973 991 -9.119197464262546e-03 +973 992 2.104266184681760e-03 +973 993 1.597136003720175e-02 +973 994 7.233284760850512e-03 +973 995 -1.265402077883533e-02 +973 996 1.232479383921381e-03 +973 997 8.507818082537370e-03 +973 998 -9.719999626669558e-03 +973 999 4.056073820312880e-03 +974 982 -1.833267155555127e-01 +974 983 8.496052943250727e-01 +974 984 7.978124774258091e-01 +974 985 2.709112098462862e-02 +974 986 -1.341009959651975e-01 +974 987 4.603749937463113e-02 +974 988 6.969985820549007e-02 +974 989 7.073583005506204e-03 +974 990 -2.675090448249079e-02 +974 991 3.008346487896271e-02 +974 992 -6.878577509572217e-03 +974 993 -5.147043285304069e-02 +974 994 -2.296833469170002e-02 +974 995 3.967378200088315e-02 +974 996 -3.826530502170227e-03 +974 997 -2.623252505678739e-02 +974 998 2.983957599313041e-02 +974 999 -1.242564713429257e-02 +975 982 1.012997478615555e-01 +975 983 -2.866596804778632e-01 +975 984 4.009285655348281e-01 +975 985 1.003092729754150e+00 +975 986 4.718042883536085e-01 +975 987 -1.151051233747645e-01 +975 988 -1.533011412395431e-01 +975 989 -1.467336790749493e-02 +975 990 5.417647031984067e-02 +975 991 -6.347065826160776e-02 +975 992 1.413095968572057e-02 +975 993 1.016285359894843e-01 +975 994 4.361555150730619e-02 +975 995 -7.297122858953765e-02 +975 996 6.873636058245047e-03 +975 997 4.636253866511327e-02 +975 998 -5.220965998265183e-02 +975 999 2.163688115667517e-02 +976 982 -6.675829549002014e-02 +976 983 1.714825278878344e-01 +976 984 -1.763260094650432e-01 +976 985 -3.524913251502497e-02 +976 986 7.751613393474800e-01 +976 987 9.500818362211397e-01 +976 988 4.551820017945855e-01 +976 989 3.440881837090111e-02 +976 990 -1.173436103509136e-01 +976 991 1.582637096187084e-01 +976 992 -3.205658723742846e-02 +976 993 -2.040533508482612e-01 +976 994 -7.898266143118524e-02 +976 995 1.226433507083564e-01 +976 996 -1.098389774586085e-02 +976 997 -7.170870669864547e-02 +976 998 7.919894876866436e-02 +976 999 -3.252580339150158e-02 +977 982 4.654764921313025e-02 +977 983 -1.153084751520903e-01 +977 984 1.084975613502238e-01 +977 985 1.782365365319096e-02 +977 986 -2.253712020788916e-01 +977 987 1.833451203870996e-01 +977 988 7.871848513645239e-01 +977 989 9.980475420281737e-01 +977 990 9.659358568042402e-01 +977 991 9.659358568042401e-01 +977 992 9.980475420281757e-01 +977 993 7.871848513645238e-01 +977 994 1.833451203870997e-01 +977 995 -2.253712020788916e-01 +977 996 1.782365365319097e-02 +977 997 1.084975613502237e-01 +977 998 -1.153084751520859e-01 +977 999 4.654764921313027e-02 +978 982 -3.252580339150157e-02 +978 983 7.919894876866750e-02 +978 984 -7.170870669864547e-02 +978 985 -1.098389774586085e-02 +978 986 1.226433507083564e-01 +978 987 -7.898266143118522e-02 +978 988 -2.040533508482612e-01 +978 989 -3.205658723744551e-02 +978 990 1.582637096187085e-01 +978 991 -1.173436103509136e-01 +978 992 3.440881837088147e-02 +978 993 4.551820017945854e-01 +978 994 9.500818362211400e-01 +978 995 7.751613393474800e-01 +978 996 -3.524913251502498e-02 +978 997 -1.763260094650432e-01 +978 998 1.714825278878287e-01 +978 999 -6.675829549002017e-02 +979 982 2.163688115667516e-02 +979 983 -5.220965998265393e-02 +979 984 4.636253866511327e-02 +979 985 6.873636058245044e-03 +979 986 -7.297122858953764e-02 +979 987 4.361555150730616e-02 +979 988 1.016285359894843e-01 +979 989 1.413095968572820e-02 +979 990 -6.347065826160775e-02 +979 991 5.417647031984065e-02 +979 992 -1.467336790748669e-02 +979 993 -1.533011412395430e-01 +979 994 -1.151051233747645e-01 +979 995 4.718042883536084e-01 +979 996 1.003092729754150e+00 +979 997 4.009285655348280e-01 +979 998 -2.866596804778571e-01 +979 999 1.012997478615555e-01 +980 982 -1.242564713429257e-02 +980 983 2.983957599313164e-02 +980 984 -2.623252505678740e-02 +980 985 -3.826530502170227e-03 +980 986 3.967378200088316e-02 +980 987 -2.296833469170003e-02 +980 988 -5.147043285304072e-02 +980 989 -6.878577509575954e-03 +980 990 3.008346487896273e-02 +980 991 -2.675090448249079e-02 +980 992 7.073583005502259e-03 +980 993 6.969985820549009e-02 +980 994 4.603749937463117e-02 +980 995 -1.341009959651975e-01 +980 996 2.709112098462864e-02 +980 997 7.978124774258092e-01 +980 998 8.496052943251251e-01 +980 999 -1.833267155555129e-01 +981 982 4.056073820312879e-03 +981 983 -9.719999626669961e-03 +981 984 8.507818082537370e-03 +981 985 1.232479383921380e-03 +981 986 -1.265402077883533e-02 +981 987 7.233284760850510e-03 +981 988 1.597136003720175e-02 +981 989 2.104266184682904e-03 +981 990 -9.119197464262546e-03 +981 991 8.224868937522696e-03 +981 992 -2.156636620474508e-03 +981 993 -2.084168245044043e-02 +981 994 -1.325717275337758e-02 +981 995 3.581468700213436e-02 +981 996 -6.054059071079870e-03 +981 997 -8.784171983803557e-02 +981 998 3.337714682645164e-01 +981 999 1.121496109519654e+00 +1018 1027 1.121496109519653e+00 +1018 1028 3.337714682645714e-01 +1018 1029 -8.784171983803558e-02 +1018 1030 -6.054059071079867e-03 +1018 1031 3.581468700213436e-02 +1018 1032 -1.325717275337758e-02 +1018 1033 -2.084168245044044e-02 +1018 1034 -2.156636620475710e-03 +1018 1035 8.224868937522698e-03 +1018 1036 -9.119197464262546e-03 +1018 1037 2.104266184681760e-03 +1018 1038 1.597136003720175e-02 +1018 1039 7.233284760850512e-03 +1018 1040 -1.265402077883533e-02 +1018 1041 1.232479383921381e-03 +1018 1042 8.507818082537370e-03 +1018 1043 -9.719999626669558e-03 +1018 1044 4.056073820312880e-03 +1019 1027 -1.833267155555127e-01 +1019 1028 8.496052943250727e-01 +1019 1029 7.978124774258091e-01 +1019 1030 2.709112098462862e-02 +1019 1031 -1.341009959651975e-01 +1019 1032 4.603749937463113e-02 +1019 1033 6.969985820549007e-02 +1019 1034 7.073583005506204e-03 +1019 1035 -2.675090448249079e-02 +1019 1036 3.008346487896271e-02 +1019 1037 -6.878577509572217e-03 +1019 1038 -5.147043285304069e-02 +1019 1039 -2.296833469170002e-02 +1019 1040 3.967378200088315e-02 +1019 1041 -3.826530502170227e-03 +1019 1042 -2.623252505678739e-02 +1019 1043 2.983957599313041e-02 +1019 1044 -1.242564713429257e-02 +1020 1027 1.012997478615555e-01 +1020 1028 -2.866596804778632e-01 +1020 1029 4.009285655348281e-01 +1020 1030 1.003092729754150e+00 +1020 1031 4.718042883536085e-01 +1020 1032 -1.151051233747645e-01 +1020 1033 -1.533011412395431e-01 +1020 1034 -1.467336790749493e-02 +1020 1035 5.417647031984067e-02 +1020 1036 -6.347065826160776e-02 +1020 1037 1.413095968572057e-02 +1020 1038 1.016285359894843e-01 +1020 1039 4.361555150730619e-02 +1020 1040 -7.297122858953765e-02 +1020 1041 6.873636058245047e-03 +1020 1042 4.636253866511327e-02 +1020 1043 -5.220965998265183e-02 +1020 1044 2.163688115667517e-02 +1021 1027 -6.675829549002014e-02 +1021 1028 1.714825278878344e-01 +1021 1029 -1.763260094650432e-01 +1021 1030 -3.524913251502497e-02 +1021 1031 7.751613393474800e-01 +1021 1032 9.500818362211397e-01 +1021 1033 4.551820017945855e-01 +1021 1034 3.440881837090111e-02 +1021 1035 -1.173436103509136e-01 +1021 1036 1.582637096187084e-01 +1021 1037 -3.205658723742846e-02 +1021 1038 -2.040533508482612e-01 +1021 1039 -7.898266143118524e-02 +1021 1040 1.226433507083564e-01 +1021 1041 -1.098389774586085e-02 +1021 1042 -7.170870669864547e-02 +1021 1043 7.919894876866436e-02 +1021 1044 -3.252580339150158e-02 +1022 1027 4.654764921313025e-02 +1022 1028 -1.153084751520903e-01 +1022 1029 1.084975613502238e-01 +1022 1030 1.782365365319096e-02 +1022 1031 -2.253712020788916e-01 +1022 1032 1.833451203870996e-01 +1022 1033 7.871848513645239e-01 +1022 1034 9.980475420281737e-01 +1022 1035 9.659358568042402e-01 +1022 1036 9.659358568042401e-01 +1022 1037 9.980475420281757e-01 +1022 1038 7.871848513645238e-01 +1022 1039 1.833451203870997e-01 +1022 1040 -2.253712020788916e-01 +1022 1041 1.782365365319097e-02 +1022 1042 1.084975613502237e-01 +1022 1043 -1.153084751520859e-01 +1022 1044 4.654764921313027e-02 +1023 1027 -3.252580339150157e-02 +1023 1028 7.919894876866750e-02 +1023 1029 -7.170870669864547e-02 +1023 1030 -1.098389774586085e-02 +1023 1031 1.226433507083564e-01 +1023 1032 -7.898266143118522e-02 +1023 1033 -2.040533508482612e-01 +1023 1034 -3.205658723744551e-02 +1023 1035 1.582637096187085e-01 +1023 1036 -1.173436103509136e-01 +1023 1037 3.440881837088147e-02 +1023 1038 4.551820017945854e-01 +1023 1039 9.500818362211400e-01 +1023 1040 7.751613393474800e-01 +1023 1041 -3.524913251502498e-02 +1023 1042 -1.763260094650432e-01 +1023 1043 1.714825278878287e-01 +1023 1044 -6.675829549002017e-02 +1024 1027 2.163688115667516e-02 +1024 1028 -5.220965998265393e-02 +1024 1029 4.636253866511327e-02 +1024 1030 6.873636058245044e-03 +1024 1031 -7.297122858953764e-02 +1024 1032 4.361555150730616e-02 +1024 1033 1.016285359894843e-01 +1024 1034 1.413095968572820e-02 +1024 1035 -6.347065826160775e-02 +1024 1036 5.417647031984065e-02 +1024 1037 -1.467336790748669e-02 +1024 1038 -1.533011412395430e-01 +1024 1039 -1.151051233747645e-01 +1024 1040 4.718042883536084e-01 +1024 1041 1.003092729754150e+00 +1024 1042 4.009285655348280e-01 +1024 1043 -2.866596804778571e-01 +1024 1044 1.012997478615555e-01 +1025 1027 -1.242564713429257e-02 +1025 1028 2.983957599313164e-02 +1025 1029 -2.623252505678740e-02 +1025 1030 -3.826530502170227e-03 +1025 1031 3.967378200088316e-02 +1025 1032 -2.296833469170003e-02 +1025 1033 -5.147043285304072e-02 +1025 1034 -6.878577509575954e-03 +1025 1035 3.008346487896273e-02 +1025 1036 -2.675090448249079e-02 +1025 1037 7.073583005502259e-03 +1025 1038 6.969985820549009e-02 +1025 1039 4.603749937463117e-02 +1025 1040 -1.341009959651975e-01 +1025 1041 2.709112098462864e-02 +1025 1042 7.978124774258092e-01 +1025 1043 8.496052943251251e-01 +1025 1044 -1.833267155555129e-01 +1026 1027 4.056073820312879e-03 +1026 1028 -9.719999626669961e-03 +1026 1029 8.507818082537370e-03 +1026 1030 1.232479383921380e-03 +1026 1031 -1.265402077883533e-02 +1026 1032 7.233284760850510e-03 +1026 1033 1.597136003720175e-02 +1026 1034 2.104266184682904e-03 +1026 1035 -9.119197464262546e-03 +1026 1036 8.224868937522696e-03 +1026 1037 -2.156636620474508e-03 +1026 1038 -2.084168245044043e-02 +1026 1039 -1.325717275337758e-02 +1026 1040 3.581468700213436e-02 +1026 1041 -6.054059071079870e-03 +1026 1042 -8.784171983803557e-02 +1026 1043 3.337714682645164e-01 +1026 1044 1.121496109519654e+00 +1045 1054 1.121496109519653e+00 +1045 1055 3.337714682645714e-01 +1045 1056 -8.784171983803558e-02 +1045 1057 -6.054059071079867e-03 +1045 1058 3.581468700213436e-02 +1045 1059 -1.325717275337758e-02 +1045 1060 -2.084168245044044e-02 +1045 1061 -2.156636620475710e-03 +1045 1062 8.224868937522698e-03 +1045 1063 -9.119197464262546e-03 +1045 1064 2.104266184681760e-03 +1045 1065 1.597136003720175e-02 +1045 1066 7.233284760850512e-03 +1045 1067 -1.265402077883533e-02 +1045 1068 1.232479383921381e-03 +1045 1069 8.507818082537370e-03 +1045 1070 -9.719999626669558e-03 +1045 1071 4.056073820312880e-03 +1046 1054 -1.833267155555127e-01 +1046 1055 8.496052943250727e-01 +1046 1056 7.978124774258091e-01 +1046 1057 2.709112098462862e-02 +1046 1058 -1.341009959651975e-01 +1046 1059 4.603749937463113e-02 +1046 1060 6.969985820549007e-02 +1046 1061 7.073583005506204e-03 +1046 1062 -2.675090448249079e-02 +1046 1063 3.008346487896271e-02 +1046 1064 -6.878577509572217e-03 +1046 1065 -5.147043285304069e-02 +1046 1066 -2.296833469170002e-02 +1046 1067 3.967378200088315e-02 +1046 1068 -3.826530502170227e-03 +1046 1069 -2.623252505678739e-02 +1046 1070 2.983957599313041e-02 +1046 1071 -1.242564713429257e-02 +1047 1054 1.012997478615555e-01 +1047 1055 -2.866596804778632e-01 +1047 1056 4.009285655348281e-01 +1047 1057 1.003092729754150e+00 +1047 1058 4.718042883536085e-01 +1047 1059 -1.151051233747645e-01 +1047 1060 -1.533011412395431e-01 +1047 1061 -1.467336790749493e-02 +1047 1062 5.417647031984067e-02 +1047 1063 -6.347065826160776e-02 +1047 1064 1.413095968572057e-02 +1047 1065 1.016285359894843e-01 +1047 1066 4.361555150730619e-02 +1047 1067 -7.297122858953765e-02 +1047 1068 6.873636058245047e-03 +1047 1069 4.636253866511327e-02 +1047 1070 -5.220965998265183e-02 +1047 1071 2.163688115667517e-02 +1048 1054 -6.675829549002014e-02 +1048 1055 1.714825278878344e-01 +1048 1056 -1.763260094650432e-01 +1048 1057 -3.524913251502497e-02 +1048 1058 7.751613393474800e-01 +1048 1059 9.500818362211397e-01 +1048 1060 4.551820017945855e-01 +1048 1061 3.440881837090111e-02 +1048 1062 -1.173436103509136e-01 +1048 1063 1.582637096187084e-01 +1048 1064 -3.205658723742846e-02 +1048 1065 -2.040533508482612e-01 +1048 1066 -7.898266143118524e-02 +1048 1067 1.226433507083564e-01 +1048 1068 -1.098389774586085e-02 +1048 1069 -7.170870669864547e-02 +1048 1070 7.919894876866436e-02 +1048 1071 -3.252580339150158e-02 +1049 1054 4.654764921313025e-02 +1049 1055 -1.153084751520903e-01 +1049 1056 1.084975613502238e-01 +1049 1057 1.782365365319096e-02 +1049 1058 -2.253712020788916e-01 +1049 1059 1.833451203870996e-01 +1049 1060 7.871848513645239e-01 +1049 1061 9.980475420281737e-01 +1049 1062 9.659358568042402e-01 +1049 1063 9.659358568042401e-01 +1049 1064 9.980475420281757e-01 +1049 1065 7.871848513645238e-01 +1049 1066 1.833451203870997e-01 +1049 1067 -2.253712020788916e-01 +1049 1068 1.782365365319097e-02 +1049 1069 1.084975613502237e-01 +1049 1070 -1.153084751520859e-01 +1049 1071 4.654764921313027e-02 +1050 1054 -3.252580339150157e-02 +1050 1055 7.919894876866750e-02 +1050 1056 -7.170870669864547e-02 +1050 1057 -1.098389774586085e-02 +1050 1058 1.226433507083564e-01 +1050 1059 -7.898266143118522e-02 +1050 1060 -2.040533508482612e-01 +1050 1061 -3.205658723744551e-02 +1050 1062 1.582637096187085e-01 +1050 1063 -1.173436103509136e-01 +1050 1064 3.440881837088147e-02 +1050 1065 4.551820017945854e-01 +1050 1066 9.500818362211400e-01 +1050 1067 7.751613393474800e-01 +1050 1068 -3.524913251502498e-02 +1050 1069 -1.763260094650432e-01 +1050 1070 1.714825278878287e-01 +1050 1071 -6.675829549002017e-02 +1051 1054 2.163688115667516e-02 +1051 1055 -5.220965998265393e-02 +1051 1056 4.636253866511327e-02 +1051 1057 6.873636058245044e-03 +1051 1058 -7.297122858953764e-02 +1051 1059 4.361555150730616e-02 +1051 1060 1.016285359894843e-01 +1051 1061 1.413095968572820e-02 +1051 1062 -6.347065826160775e-02 +1051 1063 5.417647031984065e-02 +1051 1064 -1.467336790748669e-02 +1051 1065 -1.533011412395430e-01 +1051 1066 -1.151051233747645e-01 +1051 1067 4.718042883536084e-01 +1051 1068 1.003092729754150e+00 +1051 1069 4.009285655348280e-01 +1051 1070 -2.866596804778571e-01 +1051 1071 1.012997478615555e-01 +1052 1054 -1.242564713429257e-02 +1052 1055 2.983957599313164e-02 +1052 1056 -2.623252505678740e-02 +1052 1057 -3.826530502170227e-03 +1052 1058 3.967378200088316e-02 +1052 1059 -2.296833469170003e-02 +1052 1060 -5.147043285304072e-02 +1052 1061 -6.878577509575954e-03 +1052 1062 3.008346487896273e-02 +1052 1063 -2.675090448249079e-02 +1052 1064 7.073583005502259e-03 +1052 1065 6.969985820549009e-02 +1052 1066 4.603749937463117e-02 +1052 1067 -1.341009959651975e-01 +1052 1068 2.709112098462864e-02 +1052 1069 7.978124774258092e-01 +1052 1070 8.496052943251251e-01 +1052 1071 -1.833267155555129e-01 +1053 1054 4.056073820312879e-03 +1053 1055 -9.719999626669961e-03 +1053 1056 8.507818082537370e-03 +1053 1057 1.232479383921380e-03 +1053 1058 -1.265402077883533e-02 +1053 1059 7.233284760850510e-03 +1053 1060 1.597136003720175e-02 +1053 1061 2.104266184682904e-03 +1053 1062 -9.119197464262546e-03 +1053 1063 8.224868937522696e-03 +1053 1064 -2.156636620474508e-03 +1053 1065 -2.084168245044043e-02 +1053 1066 -1.325717275337758e-02 +1053 1067 3.581468700213436e-02 +1053 1068 -6.054059071079870e-03 +1053 1069 -8.784171983803557e-02 +1053 1070 3.337714682645164e-01 +1053 1071 1.121496109519654e+00 +1081 1090 1.121496109519653e+00 +1081 1091 3.337714682645714e-01 +1081 1092 -8.784171983803558e-02 +1081 1093 -6.054059071079867e-03 +1081 1094 3.581468700213436e-02 +1081 1095 -1.325717275337758e-02 +1081 1096 -2.084168245044044e-02 +1081 1097 -2.156636620475710e-03 +1081 1098 8.224868937522698e-03 +1081 1099 -9.119197464262546e-03 +1081 1100 2.104266184681760e-03 +1081 1101 1.597136003720175e-02 +1081 1102 7.233284760850512e-03 +1081 1103 -1.265402077883533e-02 +1081 1104 1.232479383921381e-03 +1081 1105 8.507818082537370e-03 +1081 1106 -9.719999626669558e-03 +1081 1107 4.056073820312880e-03 +1082 1090 -1.833267155555127e-01 +1082 1091 8.496052943250727e-01 +1082 1092 7.978124774258091e-01 +1082 1093 2.709112098462862e-02 +1082 1094 -1.341009959651975e-01 +1082 1095 4.603749937463113e-02 +1082 1096 6.969985820549007e-02 +1082 1097 7.073583005506204e-03 +1082 1098 -2.675090448249079e-02 +1082 1099 3.008346487896271e-02 +1082 1100 -6.878577509572217e-03 +1082 1101 -5.147043285304069e-02 +1082 1102 -2.296833469170002e-02 +1082 1103 3.967378200088315e-02 +1082 1104 -3.826530502170227e-03 +1082 1105 -2.623252505678739e-02 +1082 1106 2.983957599313041e-02 +1082 1107 -1.242564713429257e-02 +1083 1090 1.012997478615555e-01 +1083 1091 -2.866596804778632e-01 +1083 1092 4.009285655348281e-01 +1083 1093 1.003092729754150e+00 +1083 1094 4.718042883536085e-01 +1083 1095 -1.151051233747645e-01 +1083 1096 -1.533011412395431e-01 +1083 1097 -1.467336790749493e-02 +1083 1098 5.417647031984067e-02 +1083 1099 -6.347065826160776e-02 +1083 1100 1.413095968572057e-02 +1083 1101 1.016285359894843e-01 +1083 1102 4.361555150730619e-02 +1083 1103 -7.297122858953765e-02 +1083 1104 6.873636058245047e-03 +1083 1105 4.636253866511327e-02 +1083 1106 -5.220965998265183e-02 +1083 1107 2.163688115667517e-02 +1084 1090 -6.675829549002014e-02 +1084 1091 1.714825278878344e-01 +1084 1092 -1.763260094650432e-01 +1084 1093 -3.524913251502497e-02 +1084 1094 7.751613393474800e-01 +1084 1095 9.500818362211397e-01 +1084 1096 4.551820017945855e-01 +1084 1097 3.440881837090111e-02 +1084 1098 -1.173436103509136e-01 +1084 1099 1.582637096187084e-01 +1084 1100 -3.205658723742846e-02 +1084 1101 -2.040533508482612e-01 +1084 1102 -7.898266143118524e-02 +1084 1103 1.226433507083564e-01 +1084 1104 -1.098389774586085e-02 +1084 1105 -7.170870669864547e-02 +1084 1106 7.919894876866436e-02 +1084 1107 -3.252580339150158e-02 +1085 1090 4.654764921313025e-02 +1085 1091 -1.153084751520903e-01 +1085 1092 1.084975613502238e-01 +1085 1093 1.782365365319096e-02 +1085 1094 -2.253712020788916e-01 +1085 1095 1.833451203870996e-01 +1085 1096 7.871848513645239e-01 +1085 1097 9.980475420281737e-01 +1085 1098 9.659358568042402e-01 +1085 1099 9.659358568042401e-01 +1085 1100 9.980475420281757e-01 +1085 1101 7.871848513645238e-01 +1085 1102 1.833451203870997e-01 +1085 1103 -2.253712020788916e-01 +1085 1104 1.782365365319097e-02 +1085 1105 1.084975613502237e-01 +1085 1106 -1.153084751520859e-01 +1085 1107 4.654764921313027e-02 +1086 1090 -3.252580339150157e-02 +1086 1091 7.919894876866750e-02 +1086 1092 -7.170870669864547e-02 +1086 1093 -1.098389774586085e-02 +1086 1094 1.226433507083564e-01 +1086 1095 -7.898266143118522e-02 +1086 1096 -2.040533508482612e-01 +1086 1097 -3.205658723744551e-02 +1086 1098 1.582637096187085e-01 +1086 1099 -1.173436103509136e-01 +1086 1100 3.440881837088147e-02 +1086 1101 4.551820017945854e-01 +1086 1102 9.500818362211400e-01 +1086 1103 7.751613393474800e-01 +1086 1104 -3.524913251502498e-02 +1086 1105 -1.763260094650432e-01 +1086 1106 1.714825278878287e-01 +1086 1107 -6.675829549002017e-02 +1087 1090 2.163688115667516e-02 +1087 1091 -5.220965998265393e-02 +1087 1092 4.636253866511327e-02 +1087 1093 6.873636058245044e-03 +1087 1094 -7.297122858953764e-02 +1087 1095 4.361555150730616e-02 +1087 1096 1.016285359894843e-01 +1087 1097 1.413095968572820e-02 +1087 1098 -6.347065826160775e-02 +1087 1099 5.417647031984065e-02 +1087 1100 -1.467336790748669e-02 +1087 1101 -1.533011412395430e-01 +1087 1102 -1.151051233747645e-01 +1087 1103 4.718042883536084e-01 +1087 1104 1.003092729754150e+00 +1087 1105 4.009285655348280e-01 +1087 1106 -2.866596804778571e-01 +1087 1107 1.012997478615555e-01 +1088 1090 -1.242564713429257e-02 +1088 1091 2.983957599313164e-02 +1088 1092 -2.623252505678740e-02 +1088 1093 -3.826530502170227e-03 +1088 1094 3.967378200088316e-02 +1088 1095 -2.296833469170003e-02 +1088 1096 -5.147043285304072e-02 +1088 1097 -6.878577509575954e-03 +1088 1098 3.008346487896273e-02 +1088 1099 -2.675090448249079e-02 +1088 1100 7.073583005502259e-03 +1088 1101 6.969985820549009e-02 +1088 1102 4.603749937463117e-02 +1088 1103 -1.341009959651975e-01 +1088 1104 2.709112098462864e-02 +1088 1105 7.978124774258092e-01 +1088 1106 8.496052943251251e-01 +1088 1107 -1.833267155555129e-01 +1089 1090 4.056073820312879e-03 +1089 1091 -9.719999626669961e-03 +1089 1092 8.507818082537370e-03 +1089 1093 1.232479383921380e-03 +1089 1094 -1.265402077883533e-02 +1089 1095 7.233284760850510e-03 +1089 1096 1.597136003720175e-02 +1089 1097 2.104266184682904e-03 +1089 1098 -9.119197464262546e-03 +1089 1099 8.224868937522696e-03 +1089 1100 -2.156636620474508e-03 +1089 1101 -2.084168245044043e-02 +1089 1102 -1.325717275337758e-02 +1089 1103 3.581468700213436e-02 +1089 1104 -6.054059071079870e-03 +1089 1105 -8.784171983803557e-02 +1089 1106 3.337714682645164e-01 +1089 1107 1.121496109519654e+00 +1108 1117 1.121496109519653e+00 +1108 1118 3.337714682645714e-01 +1108 1119 -8.784171983803558e-02 +1108 1120 -6.054059071079867e-03 +1108 1121 3.581468700213436e-02 +1108 1122 -1.325717275337758e-02 +1108 1123 -2.084168245044044e-02 +1108 1124 -2.156636620475710e-03 +1108 1125 8.224868937522698e-03 +1108 1126 -9.119197464262546e-03 +1108 1127 2.104266184681760e-03 +1108 1128 1.597136003720175e-02 +1108 1129 7.233284760850512e-03 +1108 1130 -1.265402077883533e-02 +1108 1131 1.232479383921381e-03 +1108 1132 8.507818082537370e-03 +1108 1133 -9.719999626669558e-03 +1108 1134 4.056073820312880e-03 +1109 1117 -1.833267155555127e-01 +1109 1118 8.496052943250727e-01 +1109 1119 7.978124774258091e-01 +1109 1120 2.709112098462862e-02 +1109 1121 -1.341009959651975e-01 +1109 1122 4.603749937463113e-02 +1109 1123 6.969985820549007e-02 +1109 1124 7.073583005506204e-03 +1109 1125 -2.675090448249079e-02 +1109 1126 3.008346487896271e-02 +1109 1127 -6.878577509572217e-03 +1109 1128 -5.147043285304069e-02 +1109 1129 -2.296833469170002e-02 +1109 1130 3.967378200088315e-02 +1109 1131 -3.826530502170227e-03 +1109 1132 -2.623252505678739e-02 +1109 1133 2.983957599313041e-02 +1109 1134 -1.242564713429257e-02 +1110 1117 1.012997478615555e-01 +1110 1118 -2.866596804778632e-01 +1110 1119 4.009285655348281e-01 +1110 1120 1.003092729754150e+00 +1110 1121 4.718042883536085e-01 +1110 1122 -1.151051233747645e-01 +1110 1123 -1.533011412395431e-01 +1110 1124 -1.467336790749493e-02 +1110 1125 5.417647031984067e-02 +1110 1126 -6.347065826160776e-02 +1110 1127 1.413095968572057e-02 +1110 1128 1.016285359894843e-01 +1110 1129 4.361555150730619e-02 +1110 1130 -7.297122858953765e-02 +1110 1131 6.873636058245047e-03 +1110 1132 4.636253866511327e-02 +1110 1133 -5.220965998265183e-02 +1110 1134 2.163688115667517e-02 +1111 1117 -6.675829549002014e-02 +1111 1118 1.714825278878344e-01 +1111 1119 -1.763260094650432e-01 +1111 1120 -3.524913251502497e-02 +1111 1121 7.751613393474800e-01 +1111 1122 9.500818362211397e-01 +1111 1123 4.551820017945855e-01 +1111 1124 3.440881837090111e-02 +1111 1125 -1.173436103509136e-01 +1111 1126 1.582637096187084e-01 +1111 1127 -3.205658723742846e-02 +1111 1128 -2.040533508482612e-01 +1111 1129 -7.898266143118524e-02 +1111 1130 1.226433507083564e-01 +1111 1131 -1.098389774586085e-02 +1111 1132 -7.170870669864547e-02 +1111 1133 7.919894876866436e-02 +1111 1134 -3.252580339150158e-02 +1112 1117 4.654764921313025e-02 +1112 1118 -1.153084751520903e-01 +1112 1119 1.084975613502238e-01 +1112 1120 1.782365365319096e-02 +1112 1121 -2.253712020788916e-01 +1112 1122 1.833451203870996e-01 +1112 1123 7.871848513645239e-01 +1112 1124 9.980475420281737e-01 +1112 1125 9.659358568042402e-01 +1112 1126 9.659358568042401e-01 +1112 1127 9.980475420281757e-01 +1112 1128 7.871848513645238e-01 +1112 1129 1.833451203870997e-01 +1112 1130 -2.253712020788916e-01 +1112 1131 1.782365365319097e-02 +1112 1132 1.084975613502237e-01 +1112 1133 -1.153084751520859e-01 +1112 1134 4.654764921313027e-02 +1113 1117 -3.252580339150157e-02 +1113 1118 7.919894876866750e-02 +1113 1119 -7.170870669864547e-02 +1113 1120 -1.098389774586085e-02 +1113 1121 1.226433507083564e-01 +1113 1122 -7.898266143118522e-02 +1113 1123 -2.040533508482612e-01 +1113 1124 -3.205658723744551e-02 +1113 1125 1.582637096187085e-01 +1113 1126 -1.173436103509136e-01 +1113 1127 3.440881837088147e-02 +1113 1128 4.551820017945854e-01 +1113 1129 9.500818362211400e-01 +1113 1130 7.751613393474800e-01 +1113 1131 -3.524913251502498e-02 +1113 1132 -1.763260094650432e-01 +1113 1133 1.714825278878287e-01 +1113 1134 -6.675829549002017e-02 +1114 1117 2.163688115667516e-02 +1114 1118 -5.220965998265393e-02 +1114 1119 4.636253866511327e-02 +1114 1120 6.873636058245044e-03 +1114 1121 -7.297122858953764e-02 +1114 1122 4.361555150730616e-02 +1114 1123 1.016285359894843e-01 +1114 1124 1.413095968572820e-02 +1114 1125 -6.347065826160775e-02 +1114 1126 5.417647031984065e-02 +1114 1127 -1.467336790748669e-02 +1114 1128 -1.533011412395430e-01 +1114 1129 -1.151051233747645e-01 +1114 1130 4.718042883536084e-01 +1114 1131 1.003092729754150e+00 +1114 1132 4.009285655348280e-01 +1114 1133 -2.866596804778571e-01 +1114 1134 1.012997478615555e-01 +1115 1117 -1.242564713429257e-02 +1115 1118 2.983957599313164e-02 +1115 1119 -2.623252505678740e-02 +1115 1120 -3.826530502170227e-03 +1115 1121 3.967378200088316e-02 +1115 1122 -2.296833469170003e-02 +1115 1123 -5.147043285304072e-02 +1115 1124 -6.878577509575954e-03 +1115 1125 3.008346487896273e-02 +1115 1126 -2.675090448249079e-02 +1115 1127 7.073583005502259e-03 +1115 1128 6.969985820549009e-02 +1115 1129 4.603749937463117e-02 +1115 1130 -1.341009959651975e-01 +1115 1131 2.709112098462864e-02 +1115 1132 7.978124774258092e-01 +1115 1133 8.496052943251251e-01 +1115 1134 -1.833267155555129e-01 +1116 1117 4.056073820312879e-03 +1116 1118 -9.719999626669961e-03 +1116 1119 8.507818082537370e-03 +1116 1120 1.232479383921380e-03 +1116 1121 -1.265402077883533e-02 +1116 1122 7.233284760850510e-03 +1116 1123 1.597136003720175e-02 +1116 1124 2.104266184682904e-03 +1116 1125 -9.119197464262546e-03 +1116 1126 8.224868937522696e-03 +1116 1127 -2.156636620474508e-03 +1116 1128 -2.084168245044043e-02 +1116 1129 -1.325717275337758e-02 +1116 1130 3.581468700213436e-02 +1116 1131 -6.054059071079870e-03 +1116 1132 -8.784171983803557e-02 +1116 1133 3.337714682645164e-01 +1116 1134 1.121496109519654e+00 +1171 1180 1.121496109519654e+00 +1171 1181 3.337714682645710e-01 +1171 1182 -8.784171983803532e-02 +1171 1183 -6.054059071084507e-03 +1171 1184 3.581468700213301e-02 +1171 1185 -1.325717275338091e-02 +1171 1186 -2.084168245044154e-02 +1171 1187 -2.156636620475813e-03 +1171 1188 8.224868937524055e-03 +1171 1189 -9.119197464264166e-03 +1171 1190 2.104266184683004e-03 +1171 1191 1.597136003720263e-02 +1171 1192 7.233284760852466e-03 +1171 1193 -1.265402077883497e-02 +1171 1194 1.232479383922314e-03 +1171 1195 8.507818082537639e-03 +1171 1196 -9.719999626670681e-03 +1171 1197 4.056073820313279e-03 +1172 1180 -1.833267155555132e-01 +1172 1181 8.496052943250737e-01 +1172 1182 7.978124774258083e-01 +1172 1183 2.709112098464974e-02 +1172 1184 -1.341009959651927e-01 +1172 1185 4.603749937464269e-02 +1172 1186 6.969985820549394e-02 +1172 1187 7.073583005506557e-03 +1172 1188 -2.675090448249523e-02 +1172 1189 3.008346487896816e-02 +1172 1190 -6.878577509576293e-03 +1172 1191 -5.147043285304365e-02 +1172 1192 -2.296833469170629e-02 +1172 1193 3.967378200088206e-02 +1172 1194 -3.826530502173132e-03 +1172 1195 -2.623252505678828e-02 +1172 1196 2.983957599313392e-02 +1172 1197 -1.242564713429382e-02 +1173 1180 1.012997478615565e-01 +1173 1181 -2.866596804778658e-01 +1173 1182 4.009285655348308e-01 +1173 1183 1.003092729754152e+00 +1173 1184 4.718042883535953e-01 +1173 1185 -1.151051233747934e-01 +1173 1186 -1.533011412395528e-01 +1173 1187 -1.467336790749577e-02 +1173 1188 5.417647031984996e-02 +1173 1189 -6.347065826161992e-02 +1173 1190 1.413095968572901e-02 +1173 1191 1.016285359894909e-01 +1173 1192 4.361555150731847e-02 +1173 1193 -7.297122858953624e-02 +1173 1194 6.873636058250313e-03 +1173 1195 4.636253866511519e-02 +1173 1196 -5.220965998265836e-02 +1173 1197 2.163688115667749e-02 +1174 1180 -6.675829549001966e-02 +1174 1181 1.714825278878332e-01 +1174 1182 -1.763260094650420e-01 +1174 1183 -3.524913251505064e-02 +1174 1184 7.751613393474772e-01 +1174 1185 9.500818362211283e-01 +1174 1186 4.551820017945873e-01 +1174 1187 3.440881837090144e-02 +1174 1188 -1.173436103509276e-01 +1174 1189 1.582637096187326e-01 +1174 1190 -3.205658723744585e-02 +1174 1191 -2.040533508482659e-01 +1174 1192 -7.898266143120473e-02 +1174 1193 1.226433507083496e-01 +1174 1194 -1.098389774586887e-02 +1174 1195 -7.170870669864604e-02 +1174 1196 7.919894876867167e-02 +1174 1197 -3.252580339150398e-02 +1175 1180 4.654764921312805e-02 +1175 1181 -1.153084751520847e-01 +1175 1182 1.084975613502183e-01 +1175 1183 1.782365365320323e-02 +1175 1184 -2.253712020788724e-01 +1175 1185 1.833451203871429e-01 +1175 1186 7.871848513645284e-01 +1175 1187 9.980475420281739e-01 +1175 1188 9.659358568042328e-01 +1175 1189 9.659358568042319e-01 +1175 1190 9.980475420281738e-01 +1175 1191 7.871848513645299e-01 +1175 1192 1.833451203871438e-01 +1175 1193 -2.253712020788743e-01 +1175 1194 1.782365365320351e-02 +1175 1195 1.084975613502220e-01 +1175 1196 -1.153084751520938e-01 +1175 1197 4.654764921313247e-02 +1176 1180 -3.252580339150066e-02 +1176 1181 7.919894876866518e-02 +1176 1182 -7.170870669864320e-02 +1176 1183 -1.098389774586864e-02 +1176 1184 1.226433507083479e-01 +1176 1185 -7.898266143120396e-02 +1176 1186 -2.040533508482645e-01 +1176 1187 -3.205658723744569e-02 +1176 1188 1.582637096187319e-01 +1176 1189 -1.173436103509269e-01 +1176 1190 3.440881837090125e-02 +1176 1191 4.551820017945857e-01 +1176 1192 9.500818362211276e-01 +1176 1193 7.751613393474798e-01 +1176 1194 -3.524913251505101e-02 +1176 1195 -1.763260094650472e-01 +1176 1196 1.714825278878465e-01 +1176 1197 -6.675829549002540e-02 +1177 1180 2.163688115667504e-02 +1177 1181 -5.220965998265360e-02 +1177 1182 4.636253866511287e-02 +1177 1183 6.873636058250100e-03 +1177 1184 -7.297122858953449e-02 +1177 1185 4.361555150731759e-02 +1177 1186 1.016285359894891e-01 +1177 1187 1.413095968572880e-02 +1177 1188 -6.347065826161899e-02 +1177 1189 5.417647031984908e-02 +1177 1190 -1.467336790749554e-02 +1177 1191 -1.533011412395507e-01 +1177 1192 -1.151051233747921e-01 +1177 1193 4.718042883535920e-01 +1177 1194 1.003092729754152e+00 +1177 1195 4.009285655348385e-01 +1177 1196 -2.866596804778885e-01 +1177 1197 1.012997478615633e-01 +1178 1180 -1.242564713429194e-02 +1178 1181 2.983957599313010e-02 +1178 1182 -2.623252505678599e-02 +1178 1183 -3.826530502172870e-03 +1178 1184 3.967378200087964e-02 +1178 1185 -2.296833469170497e-02 +1178 1186 -5.147043285304084e-02 +1178 1187 -6.878577509575930e-03 +1178 1188 3.008346487896660e-02 +1178 1189 -2.675090448249380e-02 +1178 1190 7.073583005506183e-03 +1178 1191 6.969985820549038e-02 +1178 1192 4.603749937464048e-02 +1178 1193 -1.341009959651867e-01 +1178 1194 2.709112098464873e-02 +1178 1195 7.978124774257939e-01 +1178 1196 8.496052943251798e-01 +1178 1197 -1.833267155555124e-01 +1179 1180 4.056073820312435e-03 +1179 1181 -9.719999626668887e-03 +1179 1182 8.507818082536412e-03 +1179 1183 1.232479383922159e-03 +1179 1184 -1.265402077883346e-02 +1179 1185 7.233284760851628e-03 +1179 1186 1.597136003720082e-02 +1179 1187 2.104266184682767e-03 +1179 1188 -9.119197464263143e-03 +1179 1189 8.224868937523123e-03 +1179 1190 -2.156636620475569e-03 +1179 1191 -2.084168245043921e-02 +1179 1192 -1.325717275337943e-02 +1179 1193 3.581468700212905e-02 +1179 1194 -6.054059071083838e-03 +1179 1195 -8.784171983802566e-02 +1179 1196 3.337714682644795e-01 +1179 1197 1.121496109519649e+00 +1198 1207 1.121496109519649e+00 +1198 1208 3.337714682644795e-01 +1198 1209 -8.784171983802572e-02 +1198 1210 -6.054059071083844e-03 +1198 1211 3.581468700212909e-02 +1198 1212 -1.325717275337946e-02 +1198 1213 -2.084168245043926e-02 +1198 1214 -2.156636620475578e-03 +1198 1215 8.224868937523158e-03 +1198 1216 -9.119197464263170e-03 +1198 1217 2.104266184682774e-03 +1198 1218 1.597136003720089e-02 +1198 1219 7.233284760851673e-03 +1198 1220 -1.265402077883358e-02 +1198 1221 1.232479383922180e-03 +1198 1222 8.507818082536710e-03 +1198 1223 -9.719999626669619e-03 +1198 1224 4.056073820312835e-03 +1199 1207 -1.833267155555124e-01 +1199 1208 8.496052943251796e-01 +1199 1209 7.978124774257941e-01 +1199 1210 2.709112098464875e-02 +1199 1211 -1.341009959651868e-01 +1199 1212 4.603749937464056e-02 +1199 1213 6.969985820549053e-02 +1199 1214 7.073583005506207e-03 +1199 1215 -2.675090448249390e-02 +1199 1216 3.008346487896668e-02 +1199 1217 -6.878577509575953e-03 +1199 1218 -5.147043285304106e-02 +1199 1219 -2.296833469170511e-02 +1199 1220 3.967378200088001e-02 +1199 1221 -3.826530502172934e-03 +1199 1222 -2.623252505678690e-02 +1199 1223 2.983957599313234e-02 +1199 1224 -1.242564713429316e-02 +1200 1207 1.012997478615632e-01 +1200 1208 -2.866596804778883e-01 +1200 1209 4.009285655348384e-01 +1200 1210 1.003092729754152e+00 +1200 1211 4.718042883535921e-01 +1200 1212 -1.151051233747923e-01 +1200 1213 -1.533011412395509e-01 +1200 1214 -1.467336790749558e-02 +1200 1215 5.417647031984925e-02 +1200 1216 -6.347065826161911e-02 +1200 1217 1.413095968572883e-02 +1200 1218 1.016285359894895e-01 +1200 1219 4.361555150731782e-02 +1200 1220 -7.297122858953511e-02 +1200 1221 6.873636058250207e-03 +1200 1222 4.636253866511445e-02 +1200 1223 -5.220965998265751e-02 +1200 1224 2.163688115667714e-02 +1201 1207 -6.675829549002528e-02 +1201 1208 1.714825278878462e-01 +1201 1209 -1.763260094650470e-01 +1201 1210 -3.524913251505096e-02 +1201 1211 7.751613393474790e-01 +1201 1212 9.500818362211276e-01 +1201 1213 4.551820017945858e-01 +1201 1214 3.440881837090131e-02 +1201 1215 -1.173436103509271e-01 +1201 1216 1.582637096187321e-01 +1201 1217 -3.205658723744573e-02 +1201 1218 -2.040533508482650e-01 +1201 1219 -7.898266143120429e-02 +1201 1220 1.226433507083488e-01 +1201 1221 -1.098389774586880e-02 +1201 1222 -7.170870669864556e-02 +1201 1223 7.919894876867110e-02 +1201 1224 -3.252580339150374e-02 +1202 1207 4.654764921313230e-02 +1202 1208 -1.153084751520934e-01 +1202 1209 1.084975613502217e-01 +1202 1210 1.782365365320347e-02 +1202 1211 -2.253712020788738e-01 +1202 1212 1.833451203871435e-01 +1202 1213 7.871848513645289e-01 +1202 1214 9.980475420281738e-01 +1202 1215 9.659358568042323e-01 +1202 1216 9.659358568042320e-01 +1202 1217 9.980475420281736e-01 +1202 1218 7.871848513645292e-01 +1202 1219 1.833451203871434e-01 +1202 1220 -2.253712020788738e-01 +1202 1221 1.782365365320347e-02 +1202 1222 1.084975613502217e-01 +1202 1223 -1.153084751520934e-01 +1202 1224 4.654764921313230e-02 +1203 1207 -3.252580339150375e-02 +1203 1208 7.919894876867110e-02 +1203 1209 -7.170870669864558e-02 +1203 1210 -1.098389774586881e-02 +1203 1211 1.226433507083489e-01 +1203 1212 -7.898266143120435e-02 +1203 1213 -2.040533508482650e-01 +1203 1214 -3.205658723744574e-02 +1203 1215 1.582637096187322e-01 +1203 1216 -1.173436103509271e-01 +1203 1217 3.440881837090131e-02 +1203 1218 4.551820017945861e-01 +1203 1219 9.500818362211275e-01 +1203 1220 7.751613393474791e-01 +1203 1221 -3.524913251505098e-02 +1203 1222 -1.763260094650470e-01 +1203 1223 1.714825278878462e-01 +1203 1224 -6.675829549002529e-02 +1204 1207 2.163688115667714e-02 +1204 1208 -5.220965998265751e-02 +1204 1209 4.636253866511447e-02 +1204 1210 6.873636058250207e-03 +1204 1211 -7.297122858953514e-02 +1204 1212 4.361555150731784e-02 +1204 1213 1.016285359894895e-01 +1204 1214 1.413095968572884e-02 +1204 1215 -6.347065826161916e-02 +1204 1216 5.417647031984923e-02 +1204 1217 -1.467336790749558e-02 +1204 1218 -1.533011412395509e-01 +1204 1219 -1.151051233747923e-01 +1204 1220 4.718042883535921e-01 +1204 1221 1.003092729754152e+00 +1204 1222 4.009285655348384e-01 +1204 1223 -2.866596804778884e-01 +1204 1224 1.012997478615632e-01 +1205 1207 -1.242564713429316e-02 +1205 1208 2.983957599313233e-02 +1205 1209 -2.623252505678690e-02 +1205 1210 -3.826530502172932e-03 +1205 1211 3.967378200088001e-02 +1205 1212 -2.296833469170512e-02 +1205 1213 -5.147043285304104e-02 +1205 1214 -6.878577509575953e-03 +1205 1215 3.008346487896668e-02 +1205 1216 -2.675090448249389e-02 +1205 1217 7.073583005506205e-03 +1205 1218 6.969985820549054e-02 +1205 1219 4.603749937464054e-02 +1205 1220 -1.341009959651868e-01 +1205 1221 2.709112098464875e-02 +1205 1222 7.978124774257940e-01 +1205 1223 8.496052943251796e-01 +1205 1224 -1.833267155555124e-01 +1206 1207 4.056073820312835e-03 +1206 1208 -9.719999626669617e-03 +1206 1209 8.507818082536710e-03 +1206 1210 1.232479383922180e-03 +1206 1211 -1.265402077883358e-02 +1206 1212 7.233284760851675e-03 +1206 1213 1.597136003720089e-02 +1206 1214 2.104266184682774e-03 +1206 1215 -9.119197464263174e-03 +1206 1216 8.224868937523154e-03 +1206 1217 -2.156636620475577e-03 +1206 1218 -2.084168245043927e-02 +1206 1219 -1.325717275337946e-02 +1206 1220 3.581468700212909e-02 +1206 1221 -6.054059071083845e-03 +1206 1222 -8.784171983802572e-02 +1206 1223 3.337714682644796e-01 +1206 1224 1.121496109519649e+00 +1234 1243 1.121496109519649e+00 +1234 1244 3.337714682644795e-01 +1234 1245 -8.784171983802572e-02 +1234 1246 -6.054059071083844e-03 +1234 1247 3.581468700212909e-02 +1234 1248 -1.325717275337946e-02 +1234 1249 -2.084168245043926e-02 +1234 1250 -2.156636620475578e-03 +1234 1251 8.224868937523158e-03 +1234 1252 -9.119197464263170e-03 +1234 1253 2.104266184682774e-03 +1234 1254 1.597136003720089e-02 +1234 1255 7.233284760851673e-03 +1234 1256 -1.265402077883358e-02 +1234 1257 1.232479383922180e-03 +1234 1258 8.507818082536710e-03 +1234 1259 -9.719999626669619e-03 +1234 1260 4.056073820312835e-03 +1235 1243 -1.833267155555124e-01 +1235 1244 8.496052943251796e-01 +1235 1245 7.978124774257941e-01 +1235 1246 2.709112098464875e-02 +1235 1247 -1.341009959651868e-01 +1235 1248 4.603749937464056e-02 +1235 1249 6.969985820549053e-02 +1235 1250 7.073583005506207e-03 +1235 1251 -2.675090448249390e-02 +1235 1252 3.008346487896668e-02 +1235 1253 -6.878577509575953e-03 +1235 1254 -5.147043285304106e-02 +1235 1255 -2.296833469170511e-02 +1235 1256 3.967378200088001e-02 +1235 1257 -3.826530502172934e-03 +1235 1258 -2.623252505678690e-02 +1235 1259 2.983957599313234e-02 +1235 1260 -1.242564713429316e-02 +1236 1243 1.012997478615632e-01 +1236 1244 -2.866596804778883e-01 +1236 1245 4.009285655348384e-01 +1236 1246 1.003092729754152e+00 +1236 1247 4.718042883535921e-01 +1236 1248 -1.151051233747923e-01 +1236 1249 -1.533011412395509e-01 +1236 1250 -1.467336790749558e-02 +1236 1251 5.417647031984925e-02 +1236 1252 -6.347065826161911e-02 +1236 1253 1.413095968572883e-02 +1236 1254 1.016285359894895e-01 +1236 1255 4.361555150731782e-02 +1236 1256 -7.297122858953511e-02 +1236 1257 6.873636058250207e-03 +1236 1258 4.636253866511445e-02 +1236 1259 -5.220965998265751e-02 +1236 1260 2.163688115667714e-02 +1237 1243 -6.675829549002528e-02 +1237 1244 1.714825278878462e-01 +1237 1245 -1.763260094650470e-01 +1237 1246 -3.524913251505096e-02 +1237 1247 7.751613393474790e-01 +1237 1248 9.500818362211276e-01 +1237 1249 4.551820017945858e-01 +1237 1250 3.440881837090131e-02 +1237 1251 -1.173436103509271e-01 +1237 1252 1.582637096187321e-01 +1237 1253 -3.205658723744573e-02 +1237 1254 -2.040533508482650e-01 +1237 1255 -7.898266143120429e-02 +1237 1256 1.226433507083488e-01 +1237 1257 -1.098389774586880e-02 +1237 1258 -7.170870669864556e-02 +1237 1259 7.919894876867110e-02 +1237 1260 -3.252580339150374e-02 +1238 1243 4.654764921313230e-02 +1238 1244 -1.153084751520934e-01 +1238 1245 1.084975613502217e-01 +1238 1246 1.782365365320347e-02 +1238 1247 -2.253712020788738e-01 +1238 1248 1.833451203871435e-01 +1238 1249 7.871848513645289e-01 +1238 1250 9.980475420281738e-01 +1238 1251 9.659358568042323e-01 +1238 1252 9.659358568042320e-01 +1238 1253 9.980475420281736e-01 +1238 1254 7.871848513645292e-01 +1238 1255 1.833451203871434e-01 +1238 1256 -2.253712020788738e-01 +1238 1257 1.782365365320347e-02 +1238 1258 1.084975613502217e-01 +1238 1259 -1.153084751520934e-01 +1238 1260 4.654764921313230e-02 +1239 1243 -3.252580339150375e-02 +1239 1244 7.919894876867110e-02 +1239 1245 -7.170870669864558e-02 +1239 1246 -1.098389774586881e-02 +1239 1247 1.226433507083489e-01 +1239 1248 -7.898266143120435e-02 +1239 1249 -2.040533508482650e-01 +1239 1250 -3.205658723744574e-02 +1239 1251 1.582637096187322e-01 +1239 1252 -1.173436103509271e-01 +1239 1253 3.440881837090131e-02 +1239 1254 4.551820017945861e-01 +1239 1255 9.500818362211275e-01 +1239 1256 7.751613393474791e-01 +1239 1257 -3.524913251505098e-02 +1239 1258 -1.763260094650470e-01 +1239 1259 1.714825278878462e-01 +1239 1260 -6.675829549002529e-02 +1240 1243 2.163688115667714e-02 +1240 1244 -5.220965998265751e-02 +1240 1245 4.636253866511447e-02 +1240 1246 6.873636058250207e-03 +1240 1247 -7.297122858953514e-02 +1240 1248 4.361555150731784e-02 +1240 1249 1.016285359894895e-01 +1240 1250 1.413095968572884e-02 +1240 1251 -6.347065826161916e-02 +1240 1252 5.417647031984923e-02 +1240 1253 -1.467336790749558e-02 +1240 1254 -1.533011412395509e-01 +1240 1255 -1.151051233747923e-01 +1240 1256 4.718042883535921e-01 +1240 1257 1.003092729754152e+00 +1240 1258 4.009285655348384e-01 +1240 1259 -2.866596804778884e-01 +1240 1260 1.012997478615632e-01 +1241 1243 -1.242564713429316e-02 +1241 1244 2.983957599313233e-02 +1241 1245 -2.623252505678690e-02 +1241 1246 -3.826530502172932e-03 +1241 1247 3.967378200088001e-02 +1241 1248 -2.296833469170512e-02 +1241 1249 -5.147043285304104e-02 +1241 1250 -6.878577509575953e-03 +1241 1251 3.008346487896668e-02 +1241 1252 -2.675090448249389e-02 +1241 1253 7.073583005506205e-03 +1241 1254 6.969985820549054e-02 +1241 1255 4.603749937464054e-02 +1241 1256 -1.341009959651868e-01 +1241 1257 2.709112098464875e-02 +1241 1258 7.978124774257940e-01 +1241 1259 8.496052943251796e-01 +1241 1260 -1.833267155555124e-01 +1242 1243 4.056073820312835e-03 +1242 1244 -9.719999626669617e-03 +1242 1245 8.507818082536710e-03 +1242 1246 1.232479383922180e-03 +1242 1247 -1.265402077883358e-02 +1242 1248 7.233284760851675e-03 +1242 1249 1.597136003720089e-02 +1242 1250 2.104266184682774e-03 +1242 1251 -9.119197464263174e-03 +1242 1252 8.224868937523154e-03 +1242 1253 -2.156636620475577e-03 +1242 1254 -2.084168245043927e-02 +1242 1255 -1.325717275337946e-02 +1242 1256 3.581468700212909e-02 +1242 1257 -6.054059071083845e-03 +1242 1258 -8.784171983802572e-02 +1242 1259 3.337714682644796e-01 +1242 1260 1.121496109519649e+00 +1261 1270 1.121496109519649e+00 +1261 1271 3.337714682644795e-01 +1261 1272 -8.784171983802572e-02 +1261 1273 -6.054059071083844e-03 +1261 1274 3.581468700212909e-02 +1261 1275 -1.325717275337946e-02 +1261 1276 -2.084168245043926e-02 +1261 1277 -2.156636620475578e-03 +1261 1278 8.224868937523158e-03 +1261 1279 -9.119197464263170e-03 +1261 1280 2.104266184682774e-03 +1261 1281 1.597136003720089e-02 +1261 1282 7.233284760851673e-03 +1261 1283 -1.265402077883358e-02 +1261 1284 1.232479383922180e-03 +1261 1285 8.507818082536710e-03 +1261 1286 -9.719999626669619e-03 +1261 1287 4.056073820312835e-03 +1262 1270 -1.833267155555124e-01 +1262 1271 8.496052943251796e-01 +1262 1272 7.978124774257941e-01 +1262 1273 2.709112098464875e-02 +1262 1274 -1.341009959651868e-01 +1262 1275 4.603749937464056e-02 +1262 1276 6.969985820549053e-02 +1262 1277 7.073583005506207e-03 +1262 1278 -2.675090448249390e-02 +1262 1279 3.008346487896668e-02 +1262 1280 -6.878577509575953e-03 +1262 1281 -5.147043285304106e-02 +1262 1282 -2.296833469170511e-02 +1262 1283 3.967378200088001e-02 +1262 1284 -3.826530502172934e-03 +1262 1285 -2.623252505678690e-02 +1262 1286 2.983957599313234e-02 +1262 1287 -1.242564713429316e-02 +1263 1270 1.012997478615632e-01 +1263 1271 -2.866596804778883e-01 +1263 1272 4.009285655348384e-01 +1263 1273 1.003092729754152e+00 +1263 1274 4.718042883535921e-01 +1263 1275 -1.151051233747923e-01 +1263 1276 -1.533011412395509e-01 +1263 1277 -1.467336790749558e-02 +1263 1278 5.417647031984925e-02 +1263 1279 -6.347065826161911e-02 +1263 1280 1.413095968572883e-02 +1263 1281 1.016285359894895e-01 +1263 1282 4.361555150731782e-02 +1263 1283 -7.297122858953511e-02 +1263 1284 6.873636058250207e-03 +1263 1285 4.636253866511445e-02 +1263 1286 -5.220965998265751e-02 +1263 1287 2.163688115667714e-02 +1264 1270 -6.675829549002528e-02 +1264 1271 1.714825278878462e-01 +1264 1272 -1.763260094650470e-01 +1264 1273 -3.524913251505096e-02 +1264 1274 7.751613393474790e-01 +1264 1275 9.500818362211276e-01 +1264 1276 4.551820017945858e-01 +1264 1277 3.440881837090131e-02 +1264 1278 -1.173436103509271e-01 +1264 1279 1.582637096187321e-01 +1264 1280 -3.205658723744573e-02 +1264 1281 -2.040533508482650e-01 +1264 1282 -7.898266143120429e-02 +1264 1283 1.226433507083488e-01 +1264 1284 -1.098389774586880e-02 +1264 1285 -7.170870669864556e-02 +1264 1286 7.919894876867110e-02 +1264 1287 -3.252580339150374e-02 +1265 1270 4.654764921313230e-02 +1265 1271 -1.153084751520934e-01 +1265 1272 1.084975613502217e-01 +1265 1273 1.782365365320347e-02 +1265 1274 -2.253712020788738e-01 +1265 1275 1.833451203871435e-01 +1265 1276 7.871848513645289e-01 +1265 1277 9.980475420281738e-01 +1265 1278 9.659358568042323e-01 +1265 1279 9.659358568042320e-01 +1265 1280 9.980475420281736e-01 +1265 1281 7.871848513645292e-01 +1265 1282 1.833451203871434e-01 +1265 1283 -2.253712020788738e-01 +1265 1284 1.782365365320347e-02 +1265 1285 1.084975613502217e-01 +1265 1286 -1.153084751520934e-01 +1265 1287 4.654764921313230e-02 +1266 1270 -3.252580339150375e-02 +1266 1271 7.919894876867110e-02 +1266 1272 -7.170870669864558e-02 +1266 1273 -1.098389774586881e-02 +1266 1274 1.226433507083489e-01 +1266 1275 -7.898266143120435e-02 +1266 1276 -2.040533508482650e-01 +1266 1277 -3.205658723744574e-02 +1266 1278 1.582637096187322e-01 +1266 1279 -1.173436103509271e-01 +1266 1280 3.440881837090131e-02 +1266 1281 4.551820017945861e-01 +1266 1282 9.500818362211275e-01 +1266 1283 7.751613393474791e-01 +1266 1284 -3.524913251505098e-02 +1266 1285 -1.763260094650470e-01 +1266 1286 1.714825278878462e-01 +1266 1287 -6.675829549002529e-02 +1267 1270 2.163688115667714e-02 +1267 1271 -5.220965998265751e-02 +1267 1272 4.636253866511447e-02 +1267 1273 6.873636058250207e-03 +1267 1274 -7.297122858953514e-02 +1267 1275 4.361555150731784e-02 +1267 1276 1.016285359894895e-01 +1267 1277 1.413095968572884e-02 +1267 1278 -6.347065826161916e-02 +1267 1279 5.417647031984923e-02 +1267 1280 -1.467336790749558e-02 +1267 1281 -1.533011412395509e-01 +1267 1282 -1.151051233747923e-01 +1267 1283 4.718042883535921e-01 +1267 1284 1.003092729754152e+00 +1267 1285 4.009285655348384e-01 +1267 1286 -2.866596804778884e-01 +1267 1287 1.012997478615632e-01 +1268 1270 -1.242564713429316e-02 +1268 1271 2.983957599313233e-02 +1268 1272 -2.623252505678690e-02 +1268 1273 -3.826530502172932e-03 +1268 1274 3.967378200088001e-02 +1268 1275 -2.296833469170512e-02 +1268 1276 -5.147043285304104e-02 +1268 1277 -6.878577509575953e-03 +1268 1278 3.008346487896668e-02 +1268 1279 -2.675090448249389e-02 +1268 1280 7.073583005506205e-03 +1268 1281 6.969985820549054e-02 +1268 1282 4.603749937464054e-02 +1268 1283 -1.341009959651868e-01 +1268 1284 2.709112098464875e-02 +1268 1285 7.978124774257940e-01 +1268 1286 8.496052943251796e-01 +1268 1287 -1.833267155555124e-01 +1269 1270 4.056073820312835e-03 +1269 1271 -9.719999626669617e-03 +1269 1272 8.507818082536710e-03 +1269 1273 1.232479383922180e-03 +1269 1274 -1.265402077883358e-02 +1269 1275 7.233284760851675e-03 +1269 1276 1.597136003720089e-02 +1269 1277 2.104266184682774e-03 +1269 1278 -9.119197464263174e-03 +1269 1279 8.224868937523154e-03 +1269 1280 -2.156636620475577e-03 +1269 1281 -2.084168245043927e-02 +1269 1282 -1.325717275337946e-02 +1269 1283 3.581468700212909e-02 +1269 1284 -6.054059071083845e-03 +1269 1285 -8.784171983802572e-02 +1269 1286 3.337714682644796e-01 +1269 1287 1.121496109519649e+00 +1306 1315 1.121496109519649e+00 +1306 1316 3.337714682644795e-01 +1306 1317 -8.784171983802572e-02 +1306 1318 -6.054059071083844e-03 +1306 1319 3.581468700212909e-02 +1306 1320 -1.325717275337946e-02 +1306 1321 -2.084168245043926e-02 +1306 1322 -2.156636620475578e-03 +1306 1323 8.224868937523158e-03 +1306 1324 -9.119197464263170e-03 +1306 1325 2.104266184682774e-03 +1306 1326 1.597136003720089e-02 +1306 1327 7.233284760851673e-03 +1306 1328 -1.265402077883358e-02 +1306 1329 1.232479383922180e-03 +1306 1330 8.507818082536710e-03 +1306 1331 -9.719999626669619e-03 +1306 1332 4.056073820312835e-03 +1307 1315 -1.833267155555124e-01 +1307 1316 8.496052943251796e-01 +1307 1317 7.978124774257941e-01 +1307 1318 2.709112098464875e-02 +1307 1319 -1.341009959651868e-01 +1307 1320 4.603749937464056e-02 +1307 1321 6.969985820549053e-02 +1307 1322 7.073583005506207e-03 +1307 1323 -2.675090448249390e-02 +1307 1324 3.008346487896668e-02 +1307 1325 -6.878577509575953e-03 +1307 1326 -5.147043285304106e-02 +1307 1327 -2.296833469170511e-02 +1307 1328 3.967378200088001e-02 +1307 1329 -3.826530502172934e-03 +1307 1330 -2.623252505678690e-02 +1307 1331 2.983957599313234e-02 +1307 1332 -1.242564713429316e-02 +1308 1315 1.012997478615632e-01 +1308 1316 -2.866596804778883e-01 +1308 1317 4.009285655348384e-01 +1308 1318 1.003092729754152e+00 +1308 1319 4.718042883535921e-01 +1308 1320 -1.151051233747923e-01 +1308 1321 -1.533011412395509e-01 +1308 1322 -1.467336790749558e-02 +1308 1323 5.417647031984925e-02 +1308 1324 -6.347065826161911e-02 +1308 1325 1.413095968572883e-02 +1308 1326 1.016285359894895e-01 +1308 1327 4.361555150731782e-02 +1308 1328 -7.297122858953511e-02 +1308 1329 6.873636058250207e-03 +1308 1330 4.636253866511445e-02 +1308 1331 -5.220965998265751e-02 +1308 1332 2.163688115667714e-02 +1309 1315 -6.675829549002528e-02 +1309 1316 1.714825278878462e-01 +1309 1317 -1.763260094650470e-01 +1309 1318 -3.524913251505096e-02 +1309 1319 7.751613393474790e-01 +1309 1320 9.500818362211276e-01 +1309 1321 4.551820017945858e-01 +1309 1322 3.440881837090131e-02 +1309 1323 -1.173436103509271e-01 +1309 1324 1.582637096187321e-01 +1309 1325 -3.205658723744573e-02 +1309 1326 -2.040533508482650e-01 +1309 1327 -7.898266143120429e-02 +1309 1328 1.226433507083488e-01 +1309 1329 -1.098389774586880e-02 +1309 1330 -7.170870669864556e-02 +1309 1331 7.919894876867110e-02 +1309 1332 -3.252580339150374e-02 +1310 1315 4.654764921313230e-02 +1310 1316 -1.153084751520934e-01 +1310 1317 1.084975613502217e-01 +1310 1318 1.782365365320347e-02 +1310 1319 -2.253712020788738e-01 +1310 1320 1.833451203871435e-01 +1310 1321 7.871848513645289e-01 +1310 1322 9.980475420281738e-01 +1310 1323 9.659358568042323e-01 +1310 1324 9.659358568042320e-01 +1310 1325 9.980475420281736e-01 +1310 1326 7.871848513645292e-01 +1310 1327 1.833451203871434e-01 +1310 1328 -2.253712020788738e-01 +1310 1329 1.782365365320347e-02 +1310 1330 1.084975613502217e-01 +1310 1331 -1.153084751520934e-01 +1310 1332 4.654764921313230e-02 +1311 1315 -3.252580339150375e-02 +1311 1316 7.919894876867110e-02 +1311 1317 -7.170870669864558e-02 +1311 1318 -1.098389774586881e-02 +1311 1319 1.226433507083489e-01 +1311 1320 -7.898266143120435e-02 +1311 1321 -2.040533508482650e-01 +1311 1322 -3.205658723744574e-02 +1311 1323 1.582637096187322e-01 +1311 1324 -1.173436103509271e-01 +1311 1325 3.440881837090131e-02 +1311 1326 4.551820017945861e-01 +1311 1327 9.500818362211275e-01 +1311 1328 7.751613393474791e-01 +1311 1329 -3.524913251505098e-02 +1311 1330 -1.763260094650470e-01 +1311 1331 1.714825278878462e-01 +1311 1332 -6.675829549002529e-02 +1312 1315 2.163688115667714e-02 +1312 1316 -5.220965998265751e-02 +1312 1317 4.636253866511447e-02 +1312 1318 6.873636058250207e-03 +1312 1319 -7.297122858953514e-02 +1312 1320 4.361555150731784e-02 +1312 1321 1.016285359894895e-01 +1312 1322 1.413095968572884e-02 +1312 1323 -6.347065826161916e-02 +1312 1324 5.417647031984923e-02 +1312 1325 -1.467336790749558e-02 +1312 1326 -1.533011412395509e-01 +1312 1327 -1.151051233747923e-01 +1312 1328 4.718042883535921e-01 +1312 1329 1.003092729754152e+00 +1312 1330 4.009285655348384e-01 +1312 1331 -2.866596804778884e-01 +1312 1332 1.012997478615632e-01 +1313 1315 -1.242564713429316e-02 +1313 1316 2.983957599313233e-02 +1313 1317 -2.623252505678690e-02 +1313 1318 -3.826530502172932e-03 +1313 1319 3.967378200088001e-02 +1313 1320 -2.296833469170512e-02 +1313 1321 -5.147043285304104e-02 +1313 1322 -6.878577509575953e-03 +1313 1323 3.008346487896668e-02 +1313 1324 -2.675090448249389e-02 +1313 1325 7.073583005506205e-03 +1313 1326 6.969985820549054e-02 +1313 1327 4.603749937464054e-02 +1313 1328 -1.341009959651868e-01 +1313 1329 2.709112098464875e-02 +1313 1330 7.978124774257940e-01 +1313 1331 8.496052943251796e-01 +1313 1332 -1.833267155555124e-01 +1314 1315 4.056073820312835e-03 +1314 1316 -9.719999626669617e-03 +1314 1317 8.507818082536710e-03 +1314 1318 1.232479383922180e-03 +1314 1319 -1.265402077883358e-02 +1314 1320 7.233284760851675e-03 +1314 1321 1.597136003720089e-02 +1314 1322 2.104266184682774e-03 +1314 1323 -9.119197464263174e-03 +1314 1324 8.224868937523154e-03 +1314 1325 -2.156636620475577e-03 +1314 1326 -2.084168245043927e-02 +1314 1327 -1.325717275337946e-02 +1314 1328 3.581468700212909e-02 +1314 1329 -6.054059071083845e-03 +1314 1330 -8.784171983802572e-02 +1314 1331 3.337714682644796e-01 +1314 1332 1.121496109519649e+00 +1333 1342 1.121496109519649e+00 +1333 1343 3.337714682644795e-01 +1333 1344 -8.784171983802572e-02 +1333 1345 -6.054059071083844e-03 +1333 1346 3.581468700212909e-02 +1333 1347 -1.325717275337946e-02 +1333 1348 -2.084168245043926e-02 +1333 1349 -2.156636620475578e-03 +1333 1350 8.224868937523158e-03 +1333 1351 -9.119197464263170e-03 +1333 1352 2.104266184682774e-03 +1333 1353 1.597136003720089e-02 +1333 1354 7.233284760851673e-03 +1333 1355 -1.265402077883358e-02 +1333 1356 1.232479383922180e-03 +1333 1357 8.507818082536710e-03 +1333 1358 -9.719999626669619e-03 +1333 1359 4.056073820312835e-03 +1334 1342 -1.833267155555124e-01 +1334 1343 8.496052943251796e-01 +1334 1344 7.978124774257941e-01 +1334 1345 2.709112098464875e-02 +1334 1346 -1.341009959651868e-01 +1334 1347 4.603749937464056e-02 +1334 1348 6.969985820549053e-02 +1334 1349 7.073583005506207e-03 +1334 1350 -2.675090448249390e-02 +1334 1351 3.008346487896668e-02 +1334 1352 -6.878577509575953e-03 +1334 1353 -5.147043285304106e-02 +1334 1354 -2.296833469170511e-02 +1334 1355 3.967378200088001e-02 +1334 1356 -3.826530502172934e-03 +1334 1357 -2.623252505678690e-02 +1334 1358 2.983957599313234e-02 +1334 1359 -1.242564713429316e-02 +1335 1342 1.012997478615632e-01 +1335 1343 -2.866596804778883e-01 +1335 1344 4.009285655348384e-01 +1335 1345 1.003092729754152e+00 +1335 1346 4.718042883535921e-01 +1335 1347 -1.151051233747923e-01 +1335 1348 -1.533011412395509e-01 +1335 1349 -1.467336790749558e-02 +1335 1350 5.417647031984925e-02 +1335 1351 -6.347065826161911e-02 +1335 1352 1.413095968572883e-02 +1335 1353 1.016285359894895e-01 +1335 1354 4.361555150731782e-02 +1335 1355 -7.297122858953511e-02 +1335 1356 6.873636058250207e-03 +1335 1357 4.636253866511445e-02 +1335 1358 -5.220965998265751e-02 +1335 1359 2.163688115667714e-02 +1336 1342 -6.675829549002528e-02 +1336 1343 1.714825278878462e-01 +1336 1344 -1.763260094650470e-01 +1336 1345 -3.524913251505096e-02 +1336 1346 7.751613393474790e-01 +1336 1347 9.500818362211276e-01 +1336 1348 4.551820017945858e-01 +1336 1349 3.440881837090131e-02 +1336 1350 -1.173436103509271e-01 +1336 1351 1.582637096187321e-01 +1336 1352 -3.205658723744573e-02 +1336 1353 -2.040533508482650e-01 +1336 1354 -7.898266143120429e-02 +1336 1355 1.226433507083488e-01 +1336 1356 -1.098389774586880e-02 +1336 1357 -7.170870669864556e-02 +1336 1358 7.919894876867110e-02 +1336 1359 -3.252580339150374e-02 +1337 1342 4.654764921313230e-02 +1337 1343 -1.153084751520934e-01 +1337 1344 1.084975613502217e-01 +1337 1345 1.782365365320347e-02 +1337 1346 -2.253712020788738e-01 +1337 1347 1.833451203871435e-01 +1337 1348 7.871848513645289e-01 +1337 1349 9.980475420281738e-01 +1337 1350 9.659358568042323e-01 +1337 1351 9.659358568042320e-01 +1337 1352 9.980475420281736e-01 +1337 1353 7.871848513645292e-01 +1337 1354 1.833451203871434e-01 +1337 1355 -2.253712020788738e-01 +1337 1356 1.782365365320347e-02 +1337 1357 1.084975613502217e-01 +1337 1358 -1.153084751520934e-01 +1337 1359 4.654764921313230e-02 +1338 1342 -3.252580339150375e-02 +1338 1343 7.919894876867110e-02 +1338 1344 -7.170870669864558e-02 +1338 1345 -1.098389774586881e-02 +1338 1346 1.226433507083489e-01 +1338 1347 -7.898266143120435e-02 +1338 1348 -2.040533508482650e-01 +1338 1349 -3.205658723744574e-02 +1338 1350 1.582637096187322e-01 +1338 1351 -1.173436103509271e-01 +1338 1352 3.440881837090131e-02 +1338 1353 4.551820017945861e-01 +1338 1354 9.500818362211275e-01 +1338 1355 7.751613393474791e-01 +1338 1356 -3.524913251505098e-02 +1338 1357 -1.763260094650470e-01 +1338 1358 1.714825278878462e-01 +1338 1359 -6.675829549002529e-02 +1339 1342 2.163688115667714e-02 +1339 1343 -5.220965998265751e-02 +1339 1344 4.636253866511447e-02 +1339 1345 6.873636058250207e-03 +1339 1346 -7.297122858953514e-02 +1339 1347 4.361555150731784e-02 +1339 1348 1.016285359894895e-01 +1339 1349 1.413095968572884e-02 +1339 1350 -6.347065826161916e-02 +1339 1351 5.417647031984923e-02 +1339 1352 -1.467336790749558e-02 +1339 1353 -1.533011412395509e-01 +1339 1354 -1.151051233747923e-01 +1339 1355 4.718042883535921e-01 +1339 1356 1.003092729754152e+00 +1339 1357 4.009285655348384e-01 +1339 1358 -2.866596804778884e-01 +1339 1359 1.012997478615632e-01 +1340 1342 -1.242564713429316e-02 +1340 1343 2.983957599313233e-02 +1340 1344 -2.623252505678690e-02 +1340 1345 -3.826530502172932e-03 +1340 1346 3.967378200088001e-02 +1340 1347 -2.296833469170512e-02 +1340 1348 -5.147043285304104e-02 +1340 1349 -6.878577509575953e-03 +1340 1350 3.008346487896668e-02 +1340 1351 -2.675090448249389e-02 +1340 1352 7.073583005506205e-03 +1340 1353 6.969985820549054e-02 +1340 1354 4.603749937464054e-02 +1340 1355 -1.341009959651868e-01 +1340 1356 2.709112098464875e-02 +1340 1357 7.978124774257940e-01 +1340 1358 8.496052943251796e-01 +1340 1359 -1.833267155555124e-01 +1341 1342 4.056073820312835e-03 +1341 1343 -9.719999626669617e-03 +1341 1344 8.507818082536710e-03 +1341 1345 1.232479383922180e-03 +1341 1346 -1.265402077883358e-02 +1341 1347 7.233284760851675e-03 +1341 1348 1.597136003720089e-02 +1341 1349 2.104266184682774e-03 +1341 1350 -9.119197464263174e-03 +1341 1351 8.224868937523154e-03 +1341 1352 -2.156636620475577e-03 +1341 1353 -2.084168245043927e-02 +1341 1354 -1.325717275337946e-02 +1341 1355 3.581468700212909e-02 +1341 1356 -6.054059071083845e-03 +1341 1357 -8.784171983802572e-02 +1341 1358 3.337714682644796e-01 +1341 1359 1.121496109519649e+00 +1369 1378 1.121496109519649e+00 +1369 1379 3.337714682644795e-01 +1369 1380 -8.784171983802572e-02 +1369 1381 -6.054059071083844e-03 +1369 1382 3.581468700212909e-02 +1369 1383 -1.325717275337946e-02 +1369 1384 -2.084168245043926e-02 +1369 1385 -2.156636620475578e-03 +1369 1386 8.224868937523158e-03 +1369 1387 -9.119197464263170e-03 +1369 1388 2.104266184682774e-03 +1369 1389 1.597136003720089e-02 +1369 1390 7.233284760851673e-03 +1369 1391 -1.265402077883358e-02 +1369 1392 1.232479383922180e-03 +1369 1393 8.507818082536710e-03 +1369 1394 -9.719999626669619e-03 +1369 1395 4.056073820312835e-03 +1370 1378 -1.833267155555124e-01 +1370 1379 8.496052943251796e-01 +1370 1380 7.978124774257941e-01 +1370 1381 2.709112098464875e-02 +1370 1382 -1.341009959651868e-01 +1370 1383 4.603749937464056e-02 +1370 1384 6.969985820549053e-02 +1370 1385 7.073583005506207e-03 +1370 1386 -2.675090448249390e-02 +1370 1387 3.008346487896668e-02 +1370 1388 -6.878577509575953e-03 +1370 1389 -5.147043285304106e-02 +1370 1390 -2.296833469170511e-02 +1370 1391 3.967378200088001e-02 +1370 1392 -3.826530502172934e-03 +1370 1393 -2.623252505678690e-02 +1370 1394 2.983957599313234e-02 +1370 1395 -1.242564713429316e-02 +1371 1378 1.012997478615632e-01 +1371 1379 -2.866596804778883e-01 +1371 1380 4.009285655348384e-01 +1371 1381 1.003092729754152e+00 +1371 1382 4.718042883535921e-01 +1371 1383 -1.151051233747923e-01 +1371 1384 -1.533011412395509e-01 +1371 1385 -1.467336790749558e-02 +1371 1386 5.417647031984925e-02 +1371 1387 -6.347065826161911e-02 +1371 1388 1.413095968572883e-02 +1371 1389 1.016285359894895e-01 +1371 1390 4.361555150731782e-02 +1371 1391 -7.297122858953511e-02 +1371 1392 6.873636058250207e-03 +1371 1393 4.636253866511445e-02 +1371 1394 -5.220965998265751e-02 +1371 1395 2.163688115667714e-02 +1372 1378 -6.675829549002528e-02 +1372 1379 1.714825278878462e-01 +1372 1380 -1.763260094650470e-01 +1372 1381 -3.524913251505096e-02 +1372 1382 7.751613393474790e-01 +1372 1383 9.500818362211276e-01 +1372 1384 4.551820017945858e-01 +1372 1385 3.440881837090131e-02 +1372 1386 -1.173436103509271e-01 +1372 1387 1.582637096187321e-01 +1372 1388 -3.205658723744573e-02 +1372 1389 -2.040533508482650e-01 +1372 1390 -7.898266143120429e-02 +1372 1391 1.226433507083488e-01 +1372 1392 -1.098389774586880e-02 +1372 1393 -7.170870669864556e-02 +1372 1394 7.919894876867110e-02 +1372 1395 -3.252580339150374e-02 +1373 1378 4.654764921313230e-02 +1373 1379 -1.153084751520934e-01 +1373 1380 1.084975613502217e-01 +1373 1381 1.782365365320347e-02 +1373 1382 -2.253712020788738e-01 +1373 1383 1.833451203871435e-01 +1373 1384 7.871848513645289e-01 +1373 1385 9.980475420281738e-01 +1373 1386 9.659358568042323e-01 +1373 1387 9.659358568042320e-01 +1373 1388 9.980475420281736e-01 +1373 1389 7.871848513645292e-01 +1373 1390 1.833451203871434e-01 +1373 1391 -2.253712020788738e-01 +1373 1392 1.782365365320347e-02 +1373 1393 1.084975613502217e-01 +1373 1394 -1.153084751520934e-01 +1373 1395 4.654764921313230e-02 +1374 1378 -3.252580339150375e-02 +1374 1379 7.919894876867110e-02 +1374 1380 -7.170870669864558e-02 +1374 1381 -1.098389774586881e-02 +1374 1382 1.226433507083489e-01 +1374 1383 -7.898266143120435e-02 +1374 1384 -2.040533508482650e-01 +1374 1385 -3.205658723744574e-02 +1374 1386 1.582637096187322e-01 +1374 1387 -1.173436103509271e-01 +1374 1388 3.440881837090131e-02 +1374 1389 4.551820017945861e-01 +1374 1390 9.500818362211275e-01 +1374 1391 7.751613393474791e-01 +1374 1392 -3.524913251505098e-02 +1374 1393 -1.763260094650470e-01 +1374 1394 1.714825278878462e-01 +1374 1395 -6.675829549002529e-02 +1375 1378 2.163688115667714e-02 +1375 1379 -5.220965998265751e-02 +1375 1380 4.636253866511447e-02 +1375 1381 6.873636058250207e-03 +1375 1382 -7.297122858953514e-02 +1375 1383 4.361555150731784e-02 +1375 1384 1.016285359894895e-01 +1375 1385 1.413095968572884e-02 +1375 1386 -6.347065826161916e-02 +1375 1387 5.417647031984923e-02 +1375 1388 -1.467336790749558e-02 +1375 1389 -1.533011412395509e-01 +1375 1390 -1.151051233747923e-01 +1375 1391 4.718042883535921e-01 +1375 1392 1.003092729754152e+00 +1375 1393 4.009285655348384e-01 +1375 1394 -2.866596804778884e-01 +1375 1395 1.012997478615632e-01 +1376 1378 -1.242564713429316e-02 +1376 1379 2.983957599313233e-02 +1376 1380 -2.623252505678690e-02 +1376 1381 -3.826530502172932e-03 +1376 1382 3.967378200088001e-02 +1376 1383 -2.296833469170512e-02 +1376 1384 -5.147043285304104e-02 +1376 1385 -6.878577509575953e-03 +1376 1386 3.008346487896668e-02 +1376 1387 -2.675090448249389e-02 +1376 1388 7.073583005506205e-03 +1376 1389 6.969985820549054e-02 +1376 1390 4.603749937464054e-02 +1376 1391 -1.341009959651868e-01 +1376 1392 2.709112098464875e-02 +1376 1393 7.978124774257940e-01 +1376 1394 8.496052943251796e-01 +1376 1395 -1.833267155555124e-01 +1377 1378 4.056073820312835e-03 +1377 1379 -9.719999626669617e-03 +1377 1380 8.507818082536710e-03 +1377 1381 1.232479383922180e-03 +1377 1382 -1.265402077883358e-02 +1377 1383 7.233284760851675e-03 +1377 1384 1.597136003720089e-02 +1377 1385 2.104266184682774e-03 +1377 1386 -9.119197464263174e-03 +1377 1387 8.224868937523154e-03 +1377 1388 -2.156636620475577e-03 +1377 1389 -2.084168245043927e-02 +1377 1390 -1.325717275337946e-02 +1377 1391 3.581468700212909e-02 +1377 1392 -6.054059071083845e-03 +1377 1393 -8.784171983802572e-02 +1377 1394 3.337714682644796e-01 +1377 1395 1.121496109519649e+00 +1396 1405 1.121496109519649e+00 +1396 1406 3.337714682644795e-01 +1396 1407 -8.784171983802572e-02 +1396 1408 -6.054059071083844e-03 +1396 1409 3.581468700212909e-02 +1396 1410 -1.325717275337946e-02 +1396 1411 -2.084168245043926e-02 +1396 1412 -2.156636620475578e-03 +1396 1413 8.224868937523158e-03 +1396 1414 -9.119197464263170e-03 +1396 1415 2.104266184682774e-03 +1396 1416 1.597136003720089e-02 +1396 1417 7.233284760851673e-03 +1396 1418 -1.265402077883358e-02 +1396 1419 1.232479383922180e-03 +1396 1420 8.507818082536710e-03 +1396 1421 -9.719999626669619e-03 +1396 1422 4.056073820312835e-03 +1397 1405 -1.833267155555124e-01 +1397 1406 8.496052943251796e-01 +1397 1407 7.978124774257941e-01 +1397 1408 2.709112098464875e-02 +1397 1409 -1.341009959651868e-01 +1397 1410 4.603749937464056e-02 +1397 1411 6.969985820549053e-02 +1397 1412 7.073583005506207e-03 +1397 1413 -2.675090448249390e-02 +1397 1414 3.008346487896668e-02 +1397 1415 -6.878577509575953e-03 +1397 1416 -5.147043285304106e-02 +1397 1417 -2.296833469170511e-02 +1397 1418 3.967378200088001e-02 +1397 1419 -3.826530502172934e-03 +1397 1420 -2.623252505678690e-02 +1397 1421 2.983957599313234e-02 +1397 1422 -1.242564713429316e-02 +1398 1405 1.012997478615632e-01 +1398 1406 -2.866596804778883e-01 +1398 1407 4.009285655348384e-01 +1398 1408 1.003092729754152e+00 +1398 1409 4.718042883535921e-01 +1398 1410 -1.151051233747923e-01 +1398 1411 -1.533011412395509e-01 +1398 1412 -1.467336790749558e-02 +1398 1413 5.417647031984925e-02 +1398 1414 -6.347065826161911e-02 +1398 1415 1.413095968572883e-02 +1398 1416 1.016285359894895e-01 +1398 1417 4.361555150731782e-02 +1398 1418 -7.297122858953511e-02 +1398 1419 6.873636058250207e-03 +1398 1420 4.636253866511445e-02 +1398 1421 -5.220965998265751e-02 +1398 1422 2.163688115667714e-02 +1399 1405 -6.675829549002528e-02 +1399 1406 1.714825278878462e-01 +1399 1407 -1.763260094650470e-01 +1399 1408 -3.524913251505096e-02 +1399 1409 7.751613393474790e-01 +1399 1410 9.500818362211276e-01 +1399 1411 4.551820017945858e-01 +1399 1412 3.440881837090131e-02 +1399 1413 -1.173436103509271e-01 +1399 1414 1.582637096187321e-01 +1399 1415 -3.205658723744573e-02 +1399 1416 -2.040533508482650e-01 +1399 1417 -7.898266143120429e-02 +1399 1418 1.226433507083488e-01 +1399 1419 -1.098389774586880e-02 +1399 1420 -7.170870669864556e-02 +1399 1421 7.919894876867110e-02 +1399 1422 -3.252580339150374e-02 +1400 1405 4.654764921313230e-02 +1400 1406 -1.153084751520934e-01 +1400 1407 1.084975613502217e-01 +1400 1408 1.782365365320347e-02 +1400 1409 -2.253712020788738e-01 +1400 1410 1.833451203871435e-01 +1400 1411 7.871848513645289e-01 +1400 1412 9.980475420281738e-01 +1400 1413 9.659358568042323e-01 +1400 1414 9.659358568042320e-01 +1400 1415 9.980475420281736e-01 +1400 1416 7.871848513645292e-01 +1400 1417 1.833451203871434e-01 +1400 1418 -2.253712020788738e-01 +1400 1419 1.782365365320347e-02 +1400 1420 1.084975613502217e-01 +1400 1421 -1.153084751520934e-01 +1400 1422 4.654764921313230e-02 +1401 1405 -3.252580339150375e-02 +1401 1406 7.919894876867110e-02 +1401 1407 -7.170870669864558e-02 +1401 1408 -1.098389774586881e-02 +1401 1409 1.226433507083489e-01 +1401 1410 -7.898266143120435e-02 +1401 1411 -2.040533508482650e-01 +1401 1412 -3.205658723744574e-02 +1401 1413 1.582637096187322e-01 +1401 1414 -1.173436103509271e-01 +1401 1415 3.440881837090131e-02 +1401 1416 4.551820017945861e-01 +1401 1417 9.500818362211275e-01 +1401 1418 7.751613393474791e-01 +1401 1419 -3.524913251505098e-02 +1401 1420 -1.763260094650470e-01 +1401 1421 1.714825278878462e-01 +1401 1422 -6.675829549002529e-02 +1402 1405 2.163688115667714e-02 +1402 1406 -5.220965998265751e-02 +1402 1407 4.636253866511447e-02 +1402 1408 6.873636058250207e-03 +1402 1409 -7.297122858953514e-02 +1402 1410 4.361555150731784e-02 +1402 1411 1.016285359894895e-01 +1402 1412 1.413095968572884e-02 +1402 1413 -6.347065826161916e-02 +1402 1414 5.417647031984923e-02 +1402 1415 -1.467336790749558e-02 +1402 1416 -1.533011412395509e-01 +1402 1417 -1.151051233747923e-01 +1402 1418 4.718042883535921e-01 +1402 1419 1.003092729754152e+00 +1402 1420 4.009285655348384e-01 +1402 1421 -2.866596804778884e-01 +1402 1422 1.012997478615632e-01 +1403 1405 -1.242564713429316e-02 +1403 1406 2.983957599313233e-02 +1403 1407 -2.623252505678690e-02 +1403 1408 -3.826530502172932e-03 +1403 1409 3.967378200088001e-02 +1403 1410 -2.296833469170512e-02 +1403 1411 -5.147043285304104e-02 +1403 1412 -6.878577509575953e-03 +1403 1413 3.008346487896668e-02 +1403 1414 -2.675090448249389e-02 +1403 1415 7.073583005506205e-03 +1403 1416 6.969985820549054e-02 +1403 1417 4.603749937464054e-02 +1403 1418 -1.341009959651868e-01 +1403 1419 2.709112098464875e-02 +1403 1420 7.978124774257940e-01 +1403 1421 8.496052943251796e-01 +1403 1422 -1.833267155555124e-01 +1404 1405 4.056073820312835e-03 +1404 1406 -9.719999626669617e-03 +1404 1407 8.507818082536710e-03 +1404 1408 1.232479383922180e-03 +1404 1409 -1.265402077883358e-02 +1404 1410 7.233284760851675e-03 +1404 1411 1.597136003720089e-02 +1404 1412 2.104266184682774e-03 +1404 1413 -9.119197464263174e-03 +1404 1414 8.224868937523154e-03 +1404 1415 -2.156636620475577e-03 +1404 1416 -2.084168245043927e-02 +1404 1417 -1.325717275337946e-02 +1404 1418 3.581468700212909e-02 +1404 1419 -6.054059071083845e-03 +1404 1420 -8.784171983802572e-02 +1404 1421 3.337714682644796e-01 +1404 1422 1.121496109519649e+00 +1450 1459 1.121496109519649e+00 +1450 1460 3.337714682644795e-01 +1450 1461 -8.784171983802572e-02 +1450 1462 -6.054059071083844e-03 +1450 1463 3.581468700212909e-02 +1450 1464 -1.325717275337946e-02 +1450 1465 -2.084168245043926e-02 +1450 1466 -2.156636620475578e-03 +1450 1467 8.224868937523158e-03 +1450 1468 -9.119197464263170e-03 +1450 1469 2.104266184682774e-03 +1450 1470 1.597136003720089e-02 +1450 1471 7.233284760851673e-03 +1450 1472 -1.265402077883358e-02 +1450 1473 1.232479383922180e-03 +1450 1474 8.507818082536710e-03 +1450 1475 -9.719999626669619e-03 +1450 1476 4.056073820312835e-03 +1451 1459 -1.833267155555124e-01 +1451 1460 8.496052943251796e-01 +1451 1461 7.978124774257941e-01 +1451 1462 2.709112098464875e-02 +1451 1463 -1.341009959651868e-01 +1451 1464 4.603749937464056e-02 +1451 1465 6.969985820549053e-02 +1451 1466 7.073583005506207e-03 +1451 1467 -2.675090448249390e-02 +1451 1468 3.008346487896668e-02 +1451 1469 -6.878577509575953e-03 +1451 1470 -5.147043285304106e-02 +1451 1471 -2.296833469170511e-02 +1451 1472 3.967378200088001e-02 +1451 1473 -3.826530502172934e-03 +1451 1474 -2.623252505678690e-02 +1451 1475 2.983957599313234e-02 +1451 1476 -1.242564713429316e-02 +1452 1459 1.012997478615632e-01 +1452 1460 -2.866596804778883e-01 +1452 1461 4.009285655348384e-01 +1452 1462 1.003092729754152e+00 +1452 1463 4.718042883535921e-01 +1452 1464 -1.151051233747923e-01 +1452 1465 -1.533011412395509e-01 +1452 1466 -1.467336790749558e-02 +1452 1467 5.417647031984925e-02 +1452 1468 -6.347065826161911e-02 +1452 1469 1.413095968572883e-02 +1452 1470 1.016285359894895e-01 +1452 1471 4.361555150731782e-02 +1452 1472 -7.297122858953511e-02 +1452 1473 6.873636058250207e-03 +1452 1474 4.636253866511445e-02 +1452 1475 -5.220965998265751e-02 +1452 1476 2.163688115667714e-02 +1453 1459 -6.675829549002528e-02 +1453 1460 1.714825278878462e-01 +1453 1461 -1.763260094650470e-01 +1453 1462 -3.524913251505096e-02 +1453 1463 7.751613393474790e-01 +1453 1464 9.500818362211276e-01 +1453 1465 4.551820017945858e-01 +1453 1466 3.440881837090131e-02 +1453 1467 -1.173436103509271e-01 +1453 1468 1.582637096187321e-01 +1453 1469 -3.205658723744573e-02 +1453 1470 -2.040533508482650e-01 +1453 1471 -7.898266143120429e-02 +1453 1472 1.226433507083488e-01 +1453 1473 -1.098389774586880e-02 +1453 1474 -7.170870669864556e-02 +1453 1475 7.919894876867110e-02 +1453 1476 -3.252580339150374e-02 +1454 1459 4.654764921313230e-02 +1454 1460 -1.153084751520934e-01 +1454 1461 1.084975613502217e-01 +1454 1462 1.782365365320347e-02 +1454 1463 -2.253712020788738e-01 +1454 1464 1.833451203871435e-01 +1454 1465 7.871848513645289e-01 +1454 1466 9.980475420281738e-01 +1454 1467 9.659358568042323e-01 +1454 1468 9.659358568042320e-01 +1454 1469 9.980475420281736e-01 +1454 1470 7.871848513645292e-01 +1454 1471 1.833451203871434e-01 +1454 1472 -2.253712020788738e-01 +1454 1473 1.782365365320347e-02 +1454 1474 1.084975613502217e-01 +1454 1475 -1.153084751520934e-01 +1454 1476 4.654764921313230e-02 +1455 1459 -3.252580339150375e-02 +1455 1460 7.919894876867110e-02 +1455 1461 -7.170870669864558e-02 +1455 1462 -1.098389774586881e-02 +1455 1463 1.226433507083489e-01 +1455 1464 -7.898266143120435e-02 +1455 1465 -2.040533508482650e-01 +1455 1466 -3.205658723744574e-02 +1455 1467 1.582637096187322e-01 +1455 1468 -1.173436103509271e-01 +1455 1469 3.440881837090131e-02 +1455 1470 4.551820017945861e-01 +1455 1471 9.500818362211275e-01 +1455 1472 7.751613393474791e-01 +1455 1473 -3.524913251505098e-02 +1455 1474 -1.763260094650470e-01 +1455 1475 1.714825278878462e-01 +1455 1476 -6.675829549002529e-02 +1456 1459 2.163688115667714e-02 +1456 1460 -5.220965998265751e-02 +1456 1461 4.636253866511447e-02 +1456 1462 6.873636058250207e-03 +1456 1463 -7.297122858953514e-02 +1456 1464 4.361555150731784e-02 +1456 1465 1.016285359894895e-01 +1456 1466 1.413095968572884e-02 +1456 1467 -6.347065826161916e-02 +1456 1468 5.417647031984923e-02 +1456 1469 -1.467336790749558e-02 +1456 1470 -1.533011412395509e-01 +1456 1471 -1.151051233747923e-01 +1456 1472 4.718042883535921e-01 +1456 1473 1.003092729754152e+00 +1456 1474 4.009285655348384e-01 +1456 1475 -2.866596804778884e-01 +1456 1476 1.012997478615632e-01 +1457 1459 -1.242564713429316e-02 +1457 1460 2.983957599313233e-02 +1457 1461 -2.623252505678690e-02 +1457 1462 -3.826530502172932e-03 +1457 1463 3.967378200088001e-02 +1457 1464 -2.296833469170512e-02 +1457 1465 -5.147043285304104e-02 +1457 1466 -6.878577509575953e-03 +1457 1467 3.008346487896668e-02 +1457 1468 -2.675090448249389e-02 +1457 1469 7.073583005506205e-03 +1457 1470 6.969985820549054e-02 +1457 1471 4.603749937464054e-02 +1457 1472 -1.341009959651868e-01 +1457 1473 2.709112098464875e-02 +1457 1474 7.978124774257940e-01 +1457 1475 8.496052943251796e-01 +1457 1476 -1.833267155555124e-01 +1458 1459 4.056073820312835e-03 +1458 1460 -9.719999626669617e-03 +1458 1461 8.507818082536710e-03 +1458 1462 1.232479383922180e-03 +1458 1463 -1.265402077883358e-02 +1458 1464 7.233284760851675e-03 +1458 1465 1.597136003720089e-02 +1458 1466 2.104266184682774e-03 +1458 1467 -9.119197464263174e-03 +1458 1468 8.224868937523154e-03 +1458 1469 -2.156636620475577e-03 +1458 1470 -2.084168245043927e-02 +1458 1471 -1.325717275337946e-02 +1458 1472 3.581468700212909e-02 +1458 1473 -6.054059071083845e-03 +1458 1474 -8.784171983802572e-02 +1458 1475 3.337714682644796e-01 +1458 1476 1.121496109519649e+00 +1477 1486 1.121496109519649e+00 +1477 1487 3.337714682644795e-01 +1477 1488 -8.784171983802572e-02 +1477 1489 -6.054059071083844e-03 +1477 1490 3.581468700212909e-02 +1477 1491 -1.325717275337946e-02 +1477 1492 -2.084168245043926e-02 +1477 1493 -2.156636620475578e-03 +1477 1494 8.224868937523158e-03 +1477 1495 -9.119197464263170e-03 +1477 1496 2.104266184682774e-03 +1477 1497 1.597136003720089e-02 +1477 1498 7.233284760851673e-03 +1477 1499 -1.265402077883358e-02 +1477 1500 1.232479383922180e-03 +1477 1501 8.507818082536710e-03 +1477 1502 -9.719999626669619e-03 +1477 1503 4.056073820312835e-03 +1478 1486 -1.833267155555124e-01 +1478 1487 8.496052943251796e-01 +1478 1488 7.978124774257941e-01 +1478 1489 2.709112098464875e-02 +1478 1490 -1.341009959651868e-01 +1478 1491 4.603749937464056e-02 +1478 1492 6.969985820549053e-02 +1478 1493 7.073583005506207e-03 +1478 1494 -2.675090448249390e-02 +1478 1495 3.008346487896668e-02 +1478 1496 -6.878577509575953e-03 +1478 1497 -5.147043285304106e-02 +1478 1498 -2.296833469170511e-02 +1478 1499 3.967378200088001e-02 +1478 1500 -3.826530502172934e-03 +1478 1501 -2.623252505678690e-02 +1478 1502 2.983957599313234e-02 +1478 1503 -1.242564713429316e-02 +1479 1486 1.012997478615632e-01 +1479 1487 -2.866596804778883e-01 +1479 1488 4.009285655348384e-01 +1479 1489 1.003092729754152e+00 +1479 1490 4.718042883535921e-01 +1479 1491 -1.151051233747923e-01 +1479 1492 -1.533011412395509e-01 +1479 1493 -1.467336790749558e-02 +1479 1494 5.417647031984925e-02 +1479 1495 -6.347065826161911e-02 +1479 1496 1.413095968572883e-02 +1479 1497 1.016285359894895e-01 +1479 1498 4.361555150731782e-02 +1479 1499 -7.297122858953511e-02 +1479 1500 6.873636058250207e-03 +1479 1501 4.636253866511445e-02 +1479 1502 -5.220965998265751e-02 +1479 1503 2.163688115667714e-02 +1480 1486 -6.675829549002528e-02 +1480 1487 1.714825278878462e-01 +1480 1488 -1.763260094650470e-01 +1480 1489 -3.524913251505096e-02 +1480 1490 7.751613393474790e-01 +1480 1491 9.500818362211276e-01 +1480 1492 4.551820017945858e-01 +1480 1493 3.440881837090131e-02 +1480 1494 -1.173436103509271e-01 +1480 1495 1.582637096187321e-01 +1480 1496 -3.205658723744573e-02 +1480 1497 -2.040533508482650e-01 +1480 1498 -7.898266143120429e-02 +1480 1499 1.226433507083488e-01 +1480 1500 -1.098389774586880e-02 +1480 1501 -7.170870669864556e-02 +1480 1502 7.919894876867110e-02 +1480 1503 -3.252580339150374e-02 +1481 1486 4.654764921313230e-02 +1481 1487 -1.153084751520934e-01 +1481 1488 1.084975613502217e-01 +1481 1489 1.782365365320347e-02 +1481 1490 -2.253712020788738e-01 +1481 1491 1.833451203871435e-01 +1481 1492 7.871848513645289e-01 +1481 1493 9.980475420281738e-01 +1481 1494 9.659358568042323e-01 +1481 1495 9.659358568042320e-01 +1481 1496 9.980475420281736e-01 +1481 1497 7.871848513645292e-01 +1481 1498 1.833451203871434e-01 +1481 1499 -2.253712020788738e-01 +1481 1500 1.782365365320347e-02 +1481 1501 1.084975613502217e-01 +1481 1502 -1.153084751520934e-01 +1481 1503 4.654764921313230e-02 +1482 1486 -3.252580339150375e-02 +1482 1487 7.919894876867110e-02 +1482 1488 -7.170870669864558e-02 +1482 1489 -1.098389774586881e-02 +1482 1490 1.226433507083489e-01 +1482 1491 -7.898266143120435e-02 +1482 1492 -2.040533508482650e-01 +1482 1493 -3.205658723744574e-02 +1482 1494 1.582637096187322e-01 +1482 1495 -1.173436103509271e-01 +1482 1496 3.440881837090131e-02 +1482 1497 4.551820017945861e-01 +1482 1498 9.500818362211275e-01 +1482 1499 7.751613393474791e-01 +1482 1500 -3.524913251505098e-02 +1482 1501 -1.763260094650470e-01 +1482 1502 1.714825278878462e-01 +1482 1503 -6.675829549002529e-02 +1483 1486 2.163688115667714e-02 +1483 1487 -5.220965998265751e-02 +1483 1488 4.636253866511447e-02 +1483 1489 6.873636058250207e-03 +1483 1490 -7.297122858953514e-02 +1483 1491 4.361555150731784e-02 +1483 1492 1.016285359894895e-01 +1483 1493 1.413095968572884e-02 +1483 1494 -6.347065826161916e-02 +1483 1495 5.417647031984923e-02 +1483 1496 -1.467336790749558e-02 +1483 1497 -1.533011412395509e-01 +1483 1498 -1.151051233747923e-01 +1483 1499 4.718042883535921e-01 +1483 1500 1.003092729754152e+00 +1483 1501 4.009285655348384e-01 +1483 1502 -2.866596804778884e-01 +1483 1503 1.012997478615632e-01 +1484 1486 -1.242564713429316e-02 +1484 1487 2.983957599313233e-02 +1484 1488 -2.623252505678690e-02 +1484 1489 -3.826530502172932e-03 +1484 1490 3.967378200088001e-02 +1484 1491 -2.296833469170512e-02 +1484 1492 -5.147043285304104e-02 +1484 1493 -6.878577509575953e-03 +1484 1494 3.008346487896668e-02 +1484 1495 -2.675090448249389e-02 +1484 1496 7.073583005506205e-03 +1484 1497 6.969985820549054e-02 +1484 1498 4.603749937464054e-02 +1484 1499 -1.341009959651868e-01 +1484 1500 2.709112098464875e-02 +1484 1501 7.978124774257940e-01 +1484 1502 8.496052943251796e-01 +1484 1503 -1.833267155555124e-01 +1485 1486 4.056073820312835e-03 +1485 1487 -9.719999626669617e-03 +1485 1488 8.507818082536710e-03 +1485 1489 1.232479383922180e-03 +1485 1490 -1.265402077883358e-02 +1485 1491 7.233284760851675e-03 +1485 1492 1.597136003720089e-02 +1485 1493 2.104266184682774e-03 +1485 1494 -9.119197464263174e-03 +1485 1495 8.224868937523154e-03 +1485 1496 -2.156636620475577e-03 +1485 1497 -2.084168245043927e-02 +1485 1498 -1.325717275337946e-02 +1485 1499 3.581468700212909e-02 +1485 1500 -6.054059071083845e-03 +1485 1501 -8.784171983802572e-02 +1485 1502 3.337714682644796e-01 +1485 1503 1.121496109519649e+00 +1513 1522 1.121496109519649e+00 +1513 1523 3.337714682644795e-01 +1513 1524 -8.784171983802572e-02 +1513 1525 -6.054059071083844e-03 +1513 1526 3.581468700212909e-02 +1513 1527 -1.325717275337946e-02 +1513 1528 -2.084168245043926e-02 +1513 1529 -2.156636620475578e-03 +1513 1530 8.224868937523158e-03 +1513 1531 -9.119197464263170e-03 +1513 1532 2.104266184682774e-03 +1513 1533 1.597136003720089e-02 +1513 1534 7.233284760851673e-03 +1513 1535 -1.265402077883358e-02 +1513 1536 1.232479383922180e-03 +1513 1537 8.507818082536710e-03 +1513 1538 -9.719999626669619e-03 +1513 1539 4.056073820312835e-03 +1514 1522 -1.833267155555124e-01 +1514 1523 8.496052943251796e-01 +1514 1524 7.978124774257941e-01 +1514 1525 2.709112098464875e-02 +1514 1526 -1.341009959651868e-01 +1514 1527 4.603749937464056e-02 +1514 1528 6.969985820549053e-02 +1514 1529 7.073583005506207e-03 +1514 1530 -2.675090448249390e-02 +1514 1531 3.008346487896668e-02 +1514 1532 -6.878577509575953e-03 +1514 1533 -5.147043285304106e-02 +1514 1534 -2.296833469170511e-02 +1514 1535 3.967378200088001e-02 +1514 1536 -3.826530502172934e-03 +1514 1537 -2.623252505678690e-02 +1514 1538 2.983957599313234e-02 +1514 1539 -1.242564713429316e-02 +1515 1522 1.012997478615632e-01 +1515 1523 -2.866596804778883e-01 +1515 1524 4.009285655348384e-01 +1515 1525 1.003092729754152e+00 +1515 1526 4.718042883535921e-01 +1515 1527 -1.151051233747923e-01 +1515 1528 -1.533011412395509e-01 +1515 1529 -1.467336790749558e-02 +1515 1530 5.417647031984925e-02 +1515 1531 -6.347065826161911e-02 +1515 1532 1.413095968572883e-02 +1515 1533 1.016285359894895e-01 +1515 1534 4.361555150731782e-02 +1515 1535 -7.297122858953511e-02 +1515 1536 6.873636058250207e-03 +1515 1537 4.636253866511445e-02 +1515 1538 -5.220965998265751e-02 +1515 1539 2.163688115667714e-02 +1516 1522 -6.675829549002528e-02 +1516 1523 1.714825278878462e-01 +1516 1524 -1.763260094650470e-01 +1516 1525 -3.524913251505096e-02 +1516 1526 7.751613393474790e-01 +1516 1527 9.500818362211276e-01 +1516 1528 4.551820017945858e-01 +1516 1529 3.440881837090131e-02 +1516 1530 -1.173436103509271e-01 +1516 1531 1.582637096187321e-01 +1516 1532 -3.205658723744573e-02 +1516 1533 -2.040533508482650e-01 +1516 1534 -7.898266143120429e-02 +1516 1535 1.226433507083488e-01 +1516 1536 -1.098389774586880e-02 +1516 1537 -7.170870669864556e-02 +1516 1538 7.919894876867110e-02 +1516 1539 -3.252580339150374e-02 +1517 1522 4.654764921313230e-02 +1517 1523 -1.153084751520934e-01 +1517 1524 1.084975613502217e-01 +1517 1525 1.782365365320347e-02 +1517 1526 -2.253712020788738e-01 +1517 1527 1.833451203871435e-01 +1517 1528 7.871848513645289e-01 +1517 1529 9.980475420281738e-01 +1517 1530 9.659358568042323e-01 +1517 1531 9.659358568042320e-01 +1517 1532 9.980475420281736e-01 +1517 1533 7.871848513645292e-01 +1517 1534 1.833451203871434e-01 +1517 1535 -2.253712020788738e-01 +1517 1536 1.782365365320347e-02 +1517 1537 1.084975613502217e-01 +1517 1538 -1.153084751520934e-01 +1517 1539 4.654764921313230e-02 +1518 1522 -3.252580339150375e-02 +1518 1523 7.919894876867110e-02 +1518 1524 -7.170870669864558e-02 +1518 1525 -1.098389774586881e-02 +1518 1526 1.226433507083489e-01 +1518 1527 -7.898266143120435e-02 +1518 1528 -2.040533508482650e-01 +1518 1529 -3.205658723744574e-02 +1518 1530 1.582637096187322e-01 +1518 1531 -1.173436103509271e-01 +1518 1532 3.440881837090131e-02 +1518 1533 4.551820017945861e-01 +1518 1534 9.500818362211275e-01 +1518 1535 7.751613393474791e-01 +1518 1536 -3.524913251505098e-02 +1518 1537 -1.763260094650470e-01 +1518 1538 1.714825278878462e-01 +1518 1539 -6.675829549002529e-02 +1519 1522 2.163688115667714e-02 +1519 1523 -5.220965998265751e-02 +1519 1524 4.636253866511447e-02 +1519 1525 6.873636058250207e-03 +1519 1526 -7.297122858953514e-02 +1519 1527 4.361555150731784e-02 +1519 1528 1.016285359894895e-01 +1519 1529 1.413095968572884e-02 +1519 1530 -6.347065826161916e-02 +1519 1531 5.417647031984923e-02 +1519 1532 -1.467336790749558e-02 +1519 1533 -1.533011412395509e-01 +1519 1534 -1.151051233747923e-01 +1519 1535 4.718042883535921e-01 +1519 1536 1.003092729754152e+00 +1519 1537 4.009285655348384e-01 +1519 1538 -2.866596804778884e-01 +1519 1539 1.012997478615632e-01 +1520 1522 -1.242564713429316e-02 +1520 1523 2.983957599313233e-02 +1520 1524 -2.623252505678690e-02 +1520 1525 -3.826530502172932e-03 +1520 1526 3.967378200088001e-02 +1520 1527 -2.296833469170512e-02 +1520 1528 -5.147043285304104e-02 +1520 1529 -6.878577509575953e-03 +1520 1530 3.008346487896668e-02 +1520 1531 -2.675090448249389e-02 +1520 1532 7.073583005506205e-03 +1520 1533 6.969985820549054e-02 +1520 1534 4.603749937464054e-02 +1520 1535 -1.341009959651868e-01 +1520 1536 2.709112098464875e-02 +1520 1537 7.978124774257940e-01 +1520 1538 8.496052943251796e-01 +1520 1539 -1.833267155555124e-01 +1521 1522 4.056073820312835e-03 +1521 1523 -9.719999626669617e-03 +1521 1524 8.507818082536710e-03 +1521 1525 1.232479383922180e-03 +1521 1526 -1.265402077883358e-02 +1521 1527 7.233284760851675e-03 +1521 1528 1.597136003720089e-02 +1521 1529 2.104266184682774e-03 +1521 1530 -9.119197464263174e-03 +1521 1531 8.224868937523154e-03 +1521 1532 -2.156636620475577e-03 +1521 1533 -2.084168245043927e-02 +1521 1534 -1.325717275337946e-02 +1521 1535 3.581468700212909e-02 +1521 1536 -6.054059071083845e-03 +1521 1537 -8.784171983802572e-02 +1521 1538 3.337714682644796e-01 +1521 1539 1.121496109519649e+00 +1540 1549 1.121496109519649e+00 +1540 1550 3.337714682644795e-01 +1540 1551 -8.784171983802572e-02 +1540 1552 -6.054059071083844e-03 +1540 1553 3.581468700212909e-02 +1540 1554 -1.325717275337946e-02 +1540 1555 -2.084168245043926e-02 +1540 1556 -2.156636620475578e-03 +1540 1557 8.224868937523158e-03 +1540 1558 -9.119197464263170e-03 +1540 1559 2.104266184682774e-03 +1540 1560 1.597136003720089e-02 +1540 1561 7.233284760851673e-03 +1540 1562 -1.265402077883358e-02 +1540 1563 1.232479383922180e-03 +1540 1564 8.507818082536710e-03 +1540 1565 -9.719999626669619e-03 +1540 1566 4.056073820312835e-03 +1541 1549 -1.833267155555124e-01 +1541 1550 8.496052943251796e-01 +1541 1551 7.978124774257941e-01 +1541 1552 2.709112098464875e-02 +1541 1553 -1.341009959651868e-01 +1541 1554 4.603749937464056e-02 +1541 1555 6.969985820549053e-02 +1541 1556 7.073583005506207e-03 +1541 1557 -2.675090448249390e-02 +1541 1558 3.008346487896668e-02 +1541 1559 -6.878577509575953e-03 +1541 1560 -5.147043285304106e-02 +1541 1561 -2.296833469170511e-02 +1541 1562 3.967378200088001e-02 +1541 1563 -3.826530502172934e-03 +1541 1564 -2.623252505678690e-02 +1541 1565 2.983957599313234e-02 +1541 1566 -1.242564713429316e-02 +1542 1549 1.012997478615632e-01 +1542 1550 -2.866596804778883e-01 +1542 1551 4.009285655348384e-01 +1542 1552 1.003092729754152e+00 +1542 1553 4.718042883535921e-01 +1542 1554 -1.151051233747923e-01 +1542 1555 -1.533011412395509e-01 +1542 1556 -1.467336790749558e-02 +1542 1557 5.417647031984925e-02 +1542 1558 -6.347065826161911e-02 +1542 1559 1.413095968572883e-02 +1542 1560 1.016285359894895e-01 +1542 1561 4.361555150731782e-02 +1542 1562 -7.297122858953511e-02 +1542 1563 6.873636058250207e-03 +1542 1564 4.636253866511445e-02 +1542 1565 -5.220965998265751e-02 +1542 1566 2.163688115667714e-02 +1543 1549 -6.675829549002528e-02 +1543 1550 1.714825278878462e-01 +1543 1551 -1.763260094650470e-01 +1543 1552 -3.524913251505096e-02 +1543 1553 7.751613393474790e-01 +1543 1554 9.500818362211276e-01 +1543 1555 4.551820017945858e-01 +1543 1556 3.440881837090131e-02 +1543 1557 -1.173436103509271e-01 +1543 1558 1.582637096187321e-01 +1543 1559 -3.205658723744573e-02 +1543 1560 -2.040533508482650e-01 +1543 1561 -7.898266143120429e-02 +1543 1562 1.226433507083488e-01 +1543 1563 -1.098389774586880e-02 +1543 1564 -7.170870669864556e-02 +1543 1565 7.919894876867110e-02 +1543 1566 -3.252580339150374e-02 +1544 1549 4.654764921313230e-02 +1544 1550 -1.153084751520934e-01 +1544 1551 1.084975613502217e-01 +1544 1552 1.782365365320347e-02 +1544 1553 -2.253712020788738e-01 +1544 1554 1.833451203871435e-01 +1544 1555 7.871848513645289e-01 +1544 1556 9.980475420281738e-01 +1544 1557 9.659358568042323e-01 +1544 1558 9.659358568042320e-01 +1544 1559 9.980475420281736e-01 +1544 1560 7.871848513645292e-01 +1544 1561 1.833451203871434e-01 +1544 1562 -2.253712020788738e-01 +1544 1563 1.782365365320347e-02 +1544 1564 1.084975613502217e-01 +1544 1565 -1.153084751520934e-01 +1544 1566 4.654764921313230e-02 +1545 1549 -3.252580339150375e-02 +1545 1550 7.919894876867110e-02 +1545 1551 -7.170870669864558e-02 +1545 1552 -1.098389774586881e-02 +1545 1553 1.226433507083489e-01 +1545 1554 -7.898266143120435e-02 +1545 1555 -2.040533508482650e-01 +1545 1556 -3.205658723744574e-02 +1545 1557 1.582637096187322e-01 +1545 1558 -1.173436103509271e-01 +1545 1559 3.440881837090131e-02 +1545 1560 4.551820017945861e-01 +1545 1561 9.500818362211275e-01 +1545 1562 7.751613393474791e-01 +1545 1563 -3.524913251505098e-02 +1545 1564 -1.763260094650470e-01 +1545 1565 1.714825278878462e-01 +1545 1566 -6.675829549002529e-02 +1546 1549 2.163688115667714e-02 +1546 1550 -5.220965998265751e-02 +1546 1551 4.636253866511447e-02 +1546 1552 6.873636058250207e-03 +1546 1553 -7.297122858953514e-02 +1546 1554 4.361555150731784e-02 +1546 1555 1.016285359894895e-01 +1546 1556 1.413095968572884e-02 +1546 1557 -6.347065826161916e-02 +1546 1558 5.417647031984923e-02 +1546 1559 -1.467336790749558e-02 +1546 1560 -1.533011412395509e-01 +1546 1561 -1.151051233747923e-01 +1546 1562 4.718042883535921e-01 +1546 1563 1.003092729754152e+00 +1546 1564 4.009285655348384e-01 +1546 1565 -2.866596804778884e-01 +1546 1566 1.012997478615632e-01 +1547 1549 -1.242564713429316e-02 +1547 1550 2.983957599313233e-02 +1547 1551 -2.623252505678690e-02 +1547 1552 -3.826530502172932e-03 +1547 1553 3.967378200088001e-02 +1547 1554 -2.296833469170512e-02 +1547 1555 -5.147043285304104e-02 +1547 1556 -6.878577509575953e-03 +1547 1557 3.008346487896668e-02 +1547 1558 -2.675090448249389e-02 +1547 1559 7.073583005506205e-03 +1547 1560 6.969985820549054e-02 +1547 1561 4.603749937464054e-02 +1547 1562 -1.341009959651868e-01 +1547 1563 2.709112098464875e-02 +1547 1564 7.978124774257940e-01 +1547 1565 8.496052943251796e-01 +1547 1566 -1.833267155555124e-01 +1548 1549 4.056073820312835e-03 +1548 1550 -9.719999626669617e-03 +1548 1551 8.507818082536710e-03 +1548 1552 1.232479383922180e-03 +1548 1553 -1.265402077883358e-02 +1548 1554 7.233284760851675e-03 +1548 1555 1.597136003720089e-02 +1548 1556 2.104266184682774e-03 +1548 1557 -9.119197464263174e-03 +1548 1558 8.224868937523154e-03 +1548 1559 -2.156636620475577e-03 +1548 1560 -2.084168245043927e-02 +1548 1561 -1.325717275337946e-02 +1548 1562 3.581468700212909e-02 +1548 1563 -6.054059071083845e-03 +1548 1564 -8.784171983802572e-02 +1548 1565 3.337714682644796e-01 +1548 1566 1.121496109519649e+00 +1585 1594 1.121496109519649e+00 +1585 1595 3.337714682644795e-01 +1585 1596 -8.784171983802572e-02 +1585 1597 -6.054059071083844e-03 +1585 1598 3.581468700212909e-02 +1585 1599 -1.325717275337946e-02 +1585 1600 -2.084168245043926e-02 +1585 1601 -2.156636620475578e-03 +1585 1602 8.224868937523158e-03 +1585 1603 -9.119197464263170e-03 +1585 1604 2.104266184682774e-03 +1585 1605 1.597136003720089e-02 +1585 1606 7.233284760851673e-03 +1585 1607 -1.265402077883358e-02 +1585 1608 1.232479383922180e-03 +1585 1609 8.507818082536710e-03 +1585 1610 -9.719999626669619e-03 +1585 1611 4.056073820312835e-03 +1586 1594 -1.833267155555124e-01 +1586 1595 8.496052943251796e-01 +1586 1596 7.978124774257941e-01 +1586 1597 2.709112098464875e-02 +1586 1598 -1.341009959651868e-01 +1586 1599 4.603749937464056e-02 +1586 1600 6.969985820549053e-02 +1586 1601 7.073583005506207e-03 +1586 1602 -2.675090448249390e-02 +1586 1603 3.008346487896668e-02 +1586 1604 -6.878577509575953e-03 +1586 1605 -5.147043285304106e-02 +1586 1606 -2.296833469170511e-02 +1586 1607 3.967378200088001e-02 +1586 1608 -3.826530502172934e-03 +1586 1609 -2.623252505678690e-02 +1586 1610 2.983957599313234e-02 +1586 1611 -1.242564713429316e-02 +1587 1594 1.012997478615632e-01 +1587 1595 -2.866596804778883e-01 +1587 1596 4.009285655348384e-01 +1587 1597 1.003092729754152e+00 +1587 1598 4.718042883535921e-01 +1587 1599 -1.151051233747923e-01 +1587 1600 -1.533011412395509e-01 +1587 1601 -1.467336790749558e-02 +1587 1602 5.417647031984925e-02 +1587 1603 -6.347065826161911e-02 +1587 1604 1.413095968572883e-02 +1587 1605 1.016285359894895e-01 +1587 1606 4.361555150731782e-02 +1587 1607 -7.297122858953511e-02 +1587 1608 6.873636058250207e-03 +1587 1609 4.636253866511445e-02 +1587 1610 -5.220965998265751e-02 +1587 1611 2.163688115667714e-02 +1588 1594 -6.675829549002528e-02 +1588 1595 1.714825278878462e-01 +1588 1596 -1.763260094650470e-01 +1588 1597 -3.524913251505096e-02 +1588 1598 7.751613393474790e-01 +1588 1599 9.500818362211276e-01 +1588 1600 4.551820017945858e-01 +1588 1601 3.440881837090131e-02 +1588 1602 -1.173436103509271e-01 +1588 1603 1.582637096187321e-01 +1588 1604 -3.205658723744573e-02 +1588 1605 -2.040533508482650e-01 +1588 1606 -7.898266143120429e-02 +1588 1607 1.226433507083488e-01 +1588 1608 -1.098389774586880e-02 +1588 1609 -7.170870669864556e-02 +1588 1610 7.919894876867110e-02 +1588 1611 -3.252580339150374e-02 +1589 1594 4.654764921313230e-02 +1589 1595 -1.153084751520934e-01 +1589 1596 1.084975613502217e-01 +1589 1597 1.782365365320347e-02 +1589 1598 -2.253712020788738e-01 +1589 1599 1.833451203871435e-01 +1589 1600 7.871848513645289e-01 +1589 1601 9.980475420281738e-01 +1589 1602 9.659358568042323e-01 +1589 1603 9.659358568042320e-01 +1589 1604 9.980475420281736e-01 +1589 1605 7.871848513645292e-01 +1589 1606 1.833451203871434e-01 +1589 1607 -2.253712020788738e-01 +1589 1608 1.782365365320347e-02 +1589 1609 1.084975613502217e-01 +1589 1610 -1.153084751520934e-01 +1589 1611 4.654764921313230e-02 +1590 1594 -3.252580339150375e-02 +1590 1595 7.919894876867110e-02 +1590 1596 -7.170870669864558e-02 +1590 1597 -1.098389774586881e-02 +1590 1598 1.226433507083489e-01 +1590 1599 -7.898266143120435e-02 +1590 1600 -2.040533508482650e-01 +1590 1601 -3.205658723744574e-02 +1590 1602 1.582637096187322e-01 +1590 1603 -1.173436103509271e-01 +1590 1604 3.440881837090131e-02 +1590 1605 4.551820017945861e-01 +1590 1606 9.500818362211275e-01 +1590 1607 7.751613393474791e-01 +1590 1608 -3.524913251505098e-02 +1590 1609 -1.763260094650470e-01 +1590 1610 1.714825278878462e-01 +1590 1611 -6.675829549002529e-02 +1591 1594 2.163688115667714e-02 +1591 1595 -5.220965998265751e-02 +1591 1596 4.636253866511447e-02 +1591 1597 6.873636058250207e-03 +1591 1598 -7.297122858953514e-02 +1591 1599 4.361555150731784e-02 +1591 1600 1.016285359894895e-01 +1591 1601 1.413095968572884e-02 +1591 1602 -6.347065826161916e-02 +1591 1603 5.417647031984923e-02 +1591 1604 -1.467336790749558e-02 +1591 1605 -1.533011412395509e-01 +1591 1606 -1.151051233747923e-01 +1591 1607 4.718042883535921e-01 +1591 1608 1.003092729754152e+00 +1591 1609 4.009285655348384e-01 +1591 1610 -2.866596804778884e-01 +1591 1611 1.012997478615632e-01 +1592 1594 -1.242564713429316e-02 +1592 1595 2.983957599313233e-02 +1592 1596 -2.623252505678690e-02 +1592 1597 -3.826530502172932e-03 +1592 1598 3.967378200088001e-02 +1592 1599 -2.296833469170512e-02 +1592 1600 -5.147043285304104e-02 +1592 1601 -6.878577509575953e-03 +1592 1602 3.008346487896668e-02 +1592 1603 -2.675090448249389e-02 +1592 1604 7.073583005506205e-03 +1592 1605 6.969985820549054e-02 +1592 1606 4.603749937464054e-02 +1592 1607 -1.341009959651868e-01 +1592 1608 2.709112098464875e-02 +1592 1609 7.978124774257940e-01 +1592 1610 8.496052943251796e-01 +1592 1611 -1.833267155555124e-01 +1593 1594 4.056073820312835e-03 +1593 1595 -9.719999626669617e-03 +1593 1596 8.507818082536710e-03 +1593 1597 1.232479383922180e-03 +1593 1598 -1.265402077883358e-02 +1593 1599 7.233284760851675e-03 +1593 1600 1.597136003720089e-02 +1593 1601 2.104266184682774e-03 +1593 1602 -9.119197464263174e-03 +1593 1603 8.224868937523154e-03 +1593 1604 -2.156636620475577e-03 +1593 1605 -2.084168245043927e-02 +1593 1606 -1.325717275337946e-02 +1593 1607 3.581468700212909e-02 +1593 1608 -6.054059071083845e-03 +1593 1609 -8.784171983802572e-02 +1593 1610 3.337714682644796e-01 +1593 1611 1.121496109519649e+00 +1612 1621 1.121496109519649e+00 +1612 1622 3.337714682644795e-01 +1612 1623 -8.784171983802572e-02 +1612 1624 -6.054059071083844e-03 +1612 1625 3.581468700212909e-02 +1612 1626 -1.325717275337946e-02 +1612 1627 -2.084168245043926e-02 +1612 1628 -2.156636620475578e-03 +1612 1629 8.224868937523158e-03 +1612 1630 -9.119197464263170e-03 +1612 1631 2.104266184682774e-03 +1612 1632 1.597136003720089e-02 +1612 1633 7.233284760851673e-03 +1612 1634 -1.265402077883358e-02 +1612 1635 1.232479383922180e-03 +1612 1636 8.507818082536710e-03 +1612 1637 -9.719999626669619e-03 +1612 1638 4.056073820312835e-03 +1613 1621 -1.833267155555124e-01 +1613 1622 8.496052943251796e-01 +1613 1623 7.978124774257941e-01 +1613 1624 2.709112098464875e-02 +1613 1625 -1.341009959651868e-01 +1613 1626 4.603749937464056e-02 +1613 1627 6.969985820549053e-02 +1613 1628 7.073583005506207e-03 +1613 1629 -2.675090448249390e-02 +1613 1630 3.008346487896668e-02 +1613 1631 -6.878577509575953e-03 +1613 1632 -5.147043285304106e-02 +1613 1633 -2.296833469170511e-02 +1613 1634 3.967378200088001e-02 +1613 1635 -3.826530502172934e-03 +1613 1636 -2.623252505678690e-02 +1613 1637 2.983957599313234e-02 +1613 1638 -1.242564713429316e-02 +1614 1621 1.012997478615632e-01 +1614 1622 -2.866596804778883e-01 +1614 1623 4.009285655348384e-01 +1614 1624 1.003092729754152e+00 +1614 1625 4.718042883535921e-01 +1614 1626 -1.151051233747923e-01 +1614 1627 -1.533011412395509e-01 +1614 1628 -1.467336790749558e-02 +1614 1629 5.417647031984925e-02 +1614 1630 -6.347065826161911e-02 +1614 1631 1.413095968572883e-02 +1614 1632 1.016285359894895e-01 +1614 1633 4.361555150731782e-02 +1614 1634 -7.297122858953511e-02 +1614 1635 6.873636058250207e-03 +1614 1636 4.636253866511445e-02 +1614 1637 -5.220965998265751e-02 +1614 1638 2.163688115667714e-02 +1615 1621 -6.675829549002528e-02 +1615 1622 1.714825278878462e-01 +1615 1623 -1.763260094650470e-01 +1615 1624 -3.524913251505096e-02 +1615 1625 7.751613393474790e-01 +1615 1626 9.500818362211276e-01 +1615 1627 4.551820017945858e-01 +1615 1628 3.440881837090131e-02 +1615 1629 -1.173436103509271e-01 +1615 1630 1.582637096187321e-01 +1615 1631 -3.205658723744573e-02 +1615 1632 -2.040533508482650e-01 +1615 1633 -7.898266143120429e-02 +1615 1634 1.226433507083488e-01 +1615 1635 -1.098389774586880e-02 +1615 1636 -7.170870669864556e-02 +1615 1637 7.919894876867110e-02 +1615 1638 -3.252580339150374e-02 +1616 1621 4.654764921313230e-02 +1616 1622 -1.153084751520934e-01 +1616 1623 1.084975613502217e-01 +1616 1624 1.782365365320347e-02 +1616 1625 -2.253712020788738e-01 +1616 1626 1.833451203871435e-01 +1616 1627 7.871848513645289e-01 +1616 1628 9.980475420281738e-01 +1616 1629 9.659358568042323e-01 +1616 1630 9.659358568042320e-01 +1616 1631 9.980475420281736e-01 +1616 1632 7.871848513645292e-01 +1616 1633 1.833451203871434e-01 +1616 1634 -2.253712020788738e-01 +1616 1635 1.782365365320347e-02 +1616 1636 1.084975613502217e-01 +1616 1637 -1.153084751520934e-01 +1616 1638 4.654764921313230e-02 +1617 1621 -3.252580339150375e-02 +1617 1622 7.919894876867110e-02 +1617 1623 -7.170870669864558e-02 +1617 1624 -1.098389774586881e-02 +1617 1625 1.226433507083489e-01 +1617 1626 -7.898266143120435e-02 +1617 1627 -2.040533508482650e-01 +1617 1628 -3.205658723744574e-02 +1617 1629 1.582637096187322e-01 +1617 1630 -1.173436103509271e-01 +1617 1631 3.440881837090131e-02 +1617 1632 4.551820017945861e-01 +1617 1633 9.500818362211275e-01 +1617 1634 7.751613393474791e-01 +1617 1635 -3.524913251505098e-02 +1617 1636 -1.763260094650470e-01 +1617 1637 1.714825278878462e-01 +1617 1638 -6.675829549002529e-02 +1618 1621 2.163688115667714e-02 +1618 1622 -5.220965998265751e-02 +1618 1623 4.636253866511447e-02 +1618 1624 6.873636058250207e-03 +1618 1625 -7.297122858953514e-02 +1618 1626 4.361555150731784e-02 +1618 1627 1.016285359894895e-01 +1618 1628 1.413095968572884e-02 +1618 1629 -6.347065826161916e-02 +1618 1630 5.417647031984923e-02 +1618 1631 -1.467336790749558e-02 +1618 1632 -1.533011412395509e-01 +1618 1633 -1.151051233747923e-01 +1618 1634 4.718042883535921e-01 +1618 1635 1.003092729754152e+00 +1618 1636 4.009285655348384e-01 +1618 1637 -2.866596804778884e-01 +1618 1638 1.012997478615632e-01 +1619 1621 -1.242564713429316e-02 +1619 1622 2.983957599313233e-02 +1619 1623 -2.623252505678690e-02 +1619 1624 -3.826530502172932e-03 +1619 1625 3.967378200088001e-02 +1619 1626 -2.296833469170512e-02 +1619 1627 -5.147043285304104e-02 +1619 1628 -6.878577509575953e-03 +1619 1629 3.008346487896668e-02 +1619 1630 -2.675090448249389e-02 +1619 1631 7.073583005506205e-03 +1619 1632 6.969985820549054e-02 +1619 1633 4.603749937464054e-02 +1619 1634 -1.341009959651868e-01 +1619 1635 2.709112098464875e-02 +1619 1636 7.978124774257940e-01 +1619 1637 8.496052943251796e-01 +1619 1638 -1.833267155555124e-01 +1620 1621 4.056073820312835e-03 +1620 1622 -9.719999626669617e-03 +1620 1623 8.507818082536710e-03 +1620 1624 1.232479383922180e-03 +1620 1625 -1.265402077883358e-02 +1620 1626 7.233284760851675e-03 +1620 1627 1.597136003720089e-02 +1620 1628 2.104266184682774e-03 +1620 1629 -9.119197464263174e-03 +1620 1630 8.224868937523154e-03 +1620 1631 -2.156636620475577e-03 +1620 1632 -2.084168245043927e-02 +1620 1633 -1.325717275337946e-02 +1620 1634 3.581468700212909e-02 +1620 1635 -6.054059071083845e-03 +1620 1636 -8.784171983802572e-02 +1620 1637 3.337714682644796e-01 +1620 1638 1.121496109519649e+00 +1648 1657 1.121496109519649e+00 +1648 1658 3.337714682644795e-01 +1648 1659 -8.784171983802572e-02 +1648 1660 -6.054059071083844e-03 +1648 1661 3.581468700212909e-02 +1648 1662 -1.325717275337946e-02 +1648 1663 -2.084168245043926e-02 +1648 1664 -2.156636620475578e-03 +1648 1665 8.224868937523158e-03 +1648 1666 -9.119197464263170e-03 +1648 1667 2.104266184682774e-03 +1648 1668 1.597136003720089e-02 +1648 1669 7.233284760851673e-03 +1648 1670 -1.265402077883358e-02 +1648 1671 1.232479383922180e-03 +1648 1672 8.507818082536710e-03 +1648 1673 -9.719999626669619e-03 +1648 1674 4.056073820312835e-03 +1649 1657 -1.833267155555124e-01 +1649 1658 8.496052943251796e-01 +1649 1659 7.978124774257941e-01 +1649 1660 2.709112098464875e-02 +1649 1661 -1.341009959651868e-01 +1649 1662 4.603749937464056e-02 +1649 1663 6.969985820549053e-02 +1649 1664 7.073583005506207e-03 +1649 1665 -2.675090448249390e-02 +1649 1666 3.008346487896668e-02 +1649 1667 -6.878577509575953e-03 +1649 1668 -5.147043285304106e-02 +1649 1669 -2.296833469170511e-02 +1649 1670 3.967378200088001e-02 +1649 1671 -3.826530502172934e-03 +1649 1672 -2.623252505678690e-02 +1649 1673 2.983957599313234e-02 +1649 1674 -1.242564713429316e-02 +1650 1657 1.012997478615632e-01 +1650 1658 -2.866596804778883e-01 +1650 1659 4.009285655348384e-01 +1650 1660 1.003092729754152e+00 +1650 1661 4.718042883535921e-01 +1650 1662 -1.151051233747923e-01 +1650 1663 -1.533011412395509e-01 +1650 1664 -1.467336790749558e-02 +1650 1665 5.417647031984925e-02 +1650 1666 -6.347065826161911e-02 +1650 1667 1.413095968572883e-02 +1650 1668 1.016285359894895e-01 +1650 1669 4.361555150731782e-02 +1650 1670 -7.297122858953511e-02 +1650 1671 6.873636058250207e-03 +1650 1672 4.636253866511445e-02 +1650 1673 -5.220965998265751e-02 +1650 1674 2.163688115667714e-02 +1651 1657 -6.675829549002528e-02 +1651 1658 1.714825278878462e-01 +1651 1659 -1.763260094650470e-01 +1651 1660 -3.524913251505096e-02 +1651 1661 7.751613393474790e-01 +1651 1662 9.500818362211276e-01 +1651 1663 4.551820017945858e-01 +1651 1664 3.440881837090131e-02 +1651 1665 -1.173436103509271e-01 +1651 1666 1.582637096187321e-01 +1651 1667 -3.205658723744573e-02 +1651 1668 -2.040533508482650e-01 +1651 1669 -7.898266143120429e-02 +1651 1670 1.226433507083488e-01 +1651 1671 -1.098389774586880e-02 +1651 1672 -7.170870669864556e-02 +1651 1673 7.919894876867110e-02 +1651 1674 -3.252580339150374e-02 +1652 1657 4.654764921313230e-02 +1652 1658 -1.153084751520934e-01 +1652 1659 1.084975613502217e-01 +1652 1660 1.782365365320347e-02 +1652 1661 -2.253712020788738e-01 +1652 1662 1.833451203871435e-01 +1652 1663 7.871848513645289e-01 +1652 1664 9.980475420281738e-01 +1652 1665 9.659358568042323e-01 +1652 1666 9.659358568042320e-01 +1652 1667 9.980475420281736e-01 +1652 1668 7.871848513645292e-01 +1652 1669 1.833451203871434e-01 +1652 1670 -2.253712020788738e-01 +1652 1671 1.782365365320347e-02 +1652 1672 1.084975613502217e-01 +1652 1673 -1.153084751520934e-01 +1652 1674 4.654764921313230e-02 +1653 1657 -3.252580339150375e-02 +1653 1658 7.919894876867110e-02 +1653 1659 -7.170870669864558e-02 +1653 1660 -1.098389774586881e-02 +1653 1661 1.226433507083489e-01 +1653 1662 -7.898266143120435e-02 +1653 1663 -2.040533508482650e-01 +1653 1664 -3.205658723744574e-02 +1653 1665 1.582637096187322e-01 +1653 1666 -1.173436103509271e-01 +1653 1667 3.440881837090131e-02 +1653 1668 4.551820017945861e-01 +1653 1669 9.500818362211275e-01 +1653 1670 7.751613393474791e-01 +1653 1671 -3.524913251505098e-02 +1653 1672 -1.763260094650470e-01 +1653 1673 1.714825278878462e-01 +1653 1674 -6.675829549002529e-02 +1654 1657 2.163688115667714e-02 +1654 1658 -5.220965998265751e-02 +1654 1659 4.636253866511447e-02 +1654 1660 6.873636058250207e-03 +1654 1661 -7.297122858953514e-02 +1654 1662 4.361555150731784e-02 +1654 1663 1.016285359894895e-01 +1654 1664 1.413095968572884e-02 +1654 1665 -6.347065826161916e-02 +1654 1666 5.417647031984923e-02 +1654 1667 -1.467336790749558e-02 +1654 1668 -1.533011412395509e-01 +1654 1669 -1.151051233747923e-01 +1654 1670 4.718042883535921e-01 +1654 1671 1.003092729754152e+00 +1654 1672 4.009285655348384e-01 +1654 1673 -2.866596804778884e-01 +1654 1674 1.012997478615632e-01 +1655 1657 -1.242564713429316e-02 +1655 1658 2.983957599313233e-02 +1655 1659 -2.623252505678690e-02 +1655 1660 -3.826530502172932e-03 +1655 1661 3.967378200088001e-02 +1655 1662 -2.296833469170512e-02 +1655 1663 -5.147043285304104e-02 +1655 1664 -6.878577509575953e-03 +1655 1665 3.008346487896668e-02 +1655 1666 -2.675090448249389e-02 +1655 1667 7.073583005506205e-03 +1655 1668 6.969985820549054e-02 +1655 1669 4.603749937464054e-02 +1655 1670 -1.341009959651868e-01 +1655 1671 2.709112098464875e-02 +1655 1672 7.978124774257940e-01 +1655 1673 8.496052943251796e-01 +1655 1674 -1.833267155555124e-01 +1656 1657 4.056073820312835e-03 +1656 1658 -9.719999626669617e-03 +1656 1659 8.507818082536710e-03 +1656 1660 1.232479383922180e-03 +1656 1661 -1.265402077883358e-02 +1656 1662 7.233284760851675e-03 +1656 1663 1.597136003720089e-02 +1656 1664 2.104266184682774e-03 +1656 1665 -9.119197464263174e-03 +1656 1666 8.224868937523154e-03 +1656 1667 -2.156636620475577e-03 +1656 1668 -2.084168245043927e-02 +1656 1669 -1.325717275337946e-02 +1656 1670 3.581468700212909e-02 +1656 1671 -6.054059071083845e-03 +1656 1672 -8.784171983802572e-02 +1656 1673 3.337714682644796e-01 +1656 1674 1.121496109519649e+00 +1675 1684 1.121496109519649e+00 +1675 1685 3.337714682644795e-01 +1675 1686 -8.784171983802572e-02 +1675 1687 -6.054059071083844e-03 +1675 1688 3.581468700212909e-02 +1675 1689 -1.325717275337946e-02 +1675 1690 -2.084168245043926e-02 +1675 1691 -2.156636620475578e-03 +1675 1692 8.224868937523158e-03 +1675 1693 -9.119197464263170e-03 +1675 1694 2.104266184682774e-03 +1675 1695 1.597136003720089e-02 +1675 1696 7.233284760851673e-03 +1675 1697 -1.265402077883358e-02 +1675 1698 1.232479383922180e-03 +1675 1699 8.507818082536710e-03 +1675 1700 -9.719999626669619e-03 +1675 1701 4.056073820312835e-03 +1676 1684 -1.833267155555124e-01 +1676 1685 8.496052943251796e-01 +1676 1686 7.978124774257941e-01 +1676 1687 2.709112098464875e-02 +1676 1688 -1.341009959651868e-01 +1676 1689 4.603749937464056e-02 +1676 1690 6.969985820549053e-02 +1676 1691 7.073583005506207e-03 +1676 1692 -2.675090448249390e-02 +1676 1693 3.008346487896668e-02 +1676 1694 -6.878577509575953e-03 +1676 1695 -5.147043285304106e-02 +1676 1696 -2.296833469170511e-02 +1676 1697 3.967378200088001e-02 +1676 1698 -3.826530502172934e-03 +1676 1699 -2.623252505678690e-02 +1676 1700 2.983957599313234e-02 +1676 1701 -1.242564713429316e-02 +1677 1684 1.012997478615632e-01 +1677 1685 -2.866596804778883e-01 +1677 1686 4.009285655348384e-01 +1677 1687 1.003092729754152e+00 +1677 1688 4.718042883535921e-01 +1677 1689 -1.151051233747923e-01 +1677 1690 -1.533011412395509e-01 +1677 1691 -1.467336790749558e-02 +1677 1692 5.417647031984925e-02 +1677 1693 -6.347065826161911e-02 +1677 1694 1.413095968572883e-02 +1677 1695 1.016285359894895e-01 +1677 1696 4.361555150731782e-02 +1677 1697 -7.297122858953511e-02 +1677 1698 6.873636058250207e-03 +1677 1699 4.636253866511445e-02 +1677 1700 -5.220965998265751e-02 +1677 1701 2.163688115667714e-02 +1678 1684 -6.675829549002528e-02 +1678 1685 1.714825278878462e-01 +1678 1686 -1.763260094650470e-01 +1678 1687 -3.524913251505096e-02 +1678 1688 7.751613393474790e-01 +1678 1689 9.500818362211276e-01 +1678 1690 4.551820017945858e-01 +1678 1691 3.440881837090131e-02 +1678 1692 -1.173436103509271e-01 +1678 1693 1.582637096187321e-01 +1678 1694 -3.205658723744573e-02 +1678 1695 -2.040533508482650e-01 +1678 1696 -7.898266143120429e-02 +1678 1697 1.226433507083488e-01 +1678 1698 -1.098389774586880e-02 +1678 1699 -7.170870669864556e-02 +1678 1700 7.919894876867110e-02 +1678 1701 -3.252580339150374e-02 +1679 1684 4.654764921313230e-02 +1679 1685 -1.153084751520934e-01 +1679 1686 1.084975613502217e-01 +1679 1687 1.782365365320347e-02 +1679 1688 -2.253712020788738e-01 +1679 1689 1.833451203871435e-01 +1679 1690 7.871848513645289e-01 +1679 1691 9.980475420281738e-01 +1679 1692 9.659358568042323e-01 +1679 1693 9.659358568042320e-01 +1679 1694 9.980475420281736e-01 +1679 1695 7.871848513645292e-01 +1679 1696 1.833451203871434e-01 +1679 1697 -2.253712020788738e-01 +1679 1698 1.782365365320347e-02 +1679 1699 1.084975613502217e-01 +1679 1700 -1.153084751520934e-01 +1679 1701 4.654764921313230e-02 +1680 1684 -3.252580339150375e-02 +1680 1685 7.919894876867110e-02 +1680 1686 -7.170870669864558e-02 +1680 1687 -1.098389774586881e-02 +1680 1688 1.226433507083489e-01 +1680 1689 -7.898266143120435e-02 +1680 1690 -2.040533508482650e-01 +1680 1691 -3.205658723744574e-02 +1680 1692 1.582637096187322e-01 +1680 1693 -1.173436103509271e-01 +1680 1694 3.440881837090131e-02 +1680 1695 4.551820017945861e-01 +1680 1696 9.500818362211275e-01 +1680 1697 7.751613393474791e-01 +1680 1698 -3.524913251505098e-02 +1680 1699 -1.763260094650470e-01 +1680 1700 1.714825278878462e-01 +1680 1701 -6.675829549002529e-02 +1681 1684 2.163688115667714e-02 +1681 1685 -5.220965998265751e-02 +1681 1686 4.636253866511447e-02 +1681 1687 6.873636058250207e-03 +1681 1688 -7.297122858953514e-02 +1681 1689 4.361555150731784e-02 +1681 1690 1.016285359894895e-01 +1681 1691 1.413095968572884e-02 +1681 1692 -6.347065826161916e-02 +1681 1693 5.417647031984923e-02 +1681 1694 -1.467336790749558e-02 +1681 1695 -1.533011412395509e-01 +1681 1696 -1.151051233747923e-01 +1681 1697 4.718042883535921e-01 +1681 1698 1.003092729754152e+00 +1681 1699 4.009285655348384e-01 +1681 1700 -2.866596804778884e-01 +1681 1701 1.012997478615632e-01 +1682 1684 -1.242564713429316e-02 +1682 1685 2.983957599313233e-02 +1682 1686 -2.623252505678690e-02 +1682 1687 -3.826530502172932e-03 +1682 1688 3.967378200088001e-02 +1682 1689 -2.296833469170512e-02 +1682 1690 -5.147043285304104e-02 +1682 1691 -6.878577509575953e-03 +1682 1692 3.008346487896668e-02 +1682 1693 -2.675090448249389e-02 +1682 1694 7.073583005506205e-03 +1682 1695 6.969985820549054e-02 +1682 1696 4.603749937464054e-02 +1682 1697 -1.341009959651868e-01 +1682 1698 2.709112098464875e-02 +1682 1699 7.978124774257940e-01 +1682 1700 8.496052943251796e-01 +1682 1701 -1.833267155555124e-01 +1683 1684 4.056073820312835e-03 +1683 1685 -9.719999626669617e-03 +1683 1686 8.507818082536710e-03 +1683 1687 1.232479383922180e-03 +1683 1688 -1.265402077883358e-02 +1683 1689 7.233284760851675e-03 +1683 1690 1.597136003720089e-02 +1683 1691 2.104266184682774e-03 +1683 1692 -9.119197464263174e-03 +1683 1693 8.224868937523154e-03 +1683 1694 -2.156636620475577e-03 +1683 1695 -2.084168245043927e-02 +1683 1696 -1.325717275337946e-02 +1683 1697 3.581468700212909e-02 +1683 1698 -6.054059071083845e-03 +1683 1699 -8.784171983802572e-02 +1683 1700 3.337714682644796e-01 +1683 1701 1.121496109519649e+00 +1738 1747 1.121496109519649e+00 +1738 1748 3.337714682644795e-01 +1738 1749 -8.784171983802572e-02 +1738 1750 -6.054059071083844e-03 +1738 1751 3.581468700212909e-02 +1738 1752 -1.325717275337946e-02 +1738 1753 -2.084168245043926e-02 +1738 1754 -2.156636620475578e-03 +1738 1755 8.224868937523158e-03 +1738 1756 -9.119197464263170e-03 +1738 1757 2.104266184682774e-03 +1738 1758 1.597136003720089e-02 +1738 1759 7.233284760851673e-03 +1738 1760 -1.265402077883358e-02 +1738 1761 1.232479383922180e-03 +1738 1762 8.507818082536710e-03 +1738 1763 -9.719999626669619e-03 +1738 1764 4.056073820312835e-03 +1739 1747 -1.833267155555124e-01 +1739 1748 8.496052943251796e-01 +1739 1749 7.978124774257941e-01 +1739 1750 2.709112098464875e-02 +1739 1751 -1.341009959651868e-01 +1739 1752 4.603749937464056e-02 +1739 1753 6.969985820549053e-02 +1739 1754 7.073583005506207e-03 +1739 1755 -2.675090448249390e-02 +1739 1756 3.008346487896668e-02 +1739 1757 -6.878577509575953e-03 +1739 1758 -5.147043285304106e-02 +1739 1759 -2.296833469170511e-02 +1739 1760 3.967378200088001e-02 +1739 1761 -3.826530502172934e-03 +1739 1762 -2.623252505678690e-02 +1739 1763 2.983957599313234e-02 +1739 1764 -1.242564713429316e-02 +1740 1747 1.012997478615632e-01 +1740 1748 -2.866596804778883e-01 +1740 1749 4.009285655348384e-01 +1740 1750 1.003092729754152e+00 +1740 1751 4.718042883535921e-01 +1740 1752 -1.151051233747923e-01 +1740 1753 -1.533011412395509e-01 +1740 1754 -1.467336790749558e-02 +1740 1755 5.417647031984925e-02 +1740 1756 -6.347065826161911e-02 +1740 1757 1.413095968572883e-02 +1740 1758 1.016285359894895e-01 +1740 1759 4.361555150731782e-02 +1740 1760 -7.297122858953511e-02 +1740 1761 6.873636058250207e-03 +1740 1762 4.636253866511445e-02 +1740 1763 -5.220965998265751e-02 +1740 1764 2.163688115667714e-02 +1741 1747 -6.675829549002528e-02 +1741 1748 1.714825278878462e-01 +1741 1749 -1.763260094650470e-01 +1741 1750 -3.524913251505096e-02 +1741 1751 7.751613393474790e-01 +1741 1752 9.500818362211276e-01 +1741 1753 4.551820017945858e-01 +1741 1754 3.440881837090131e-02 +1741 1755 -1.173436103509271e-01 +1741 1756 1.582637096187321e-01 +1741 1757 -3.205658723744573e-02 +1741 1758 -2.040533508482650e-01 +1741 1759 -7.898266143120429e-02 +1741 1760 1.226433507083488e-01 +1741 1761 -1.098389774586880e-02 +1741 1762 -7.170870669864556e-02 +1741 1763 7.919894876867110e-02 +1741 1764 -3.252580339150374e-02 +1742 1747 4.654764921313230e-02 +1742 1748 -1.153084751520934e-01 +1742 1749 1.084975613502217e-01 +1742 1750 1.782365365320347e-02 +1742 1751 -2.253712020788738e-01 +1742 1752 1.833451203871435e-01 +1742 1753 7.871848513645289e-01 +1742 1754 9.980475420281738e-01 +1742 1755 9.659358568042323e-01 +1742 1756 9.659358568042320e-01 +1742 1757 9.980475420281736e-01 +1742 1758 7.871848513645292e-01 +1742 1759 1.833451203871434e-01 +1742 1760 -2.253712020788738e-01 +1742 1761 1.782365365320347e-02 +1742 1762 1.084975613502217e-01 +1742 1763 -1.153084751520934e-01 +1742 1764 4.654764921313230e-02 +1743 1747 -3.252580339150375e-02 +1743 1748 7.919894876867110e-02 +1743 1749 -7.170870669864558e-02 +1743 1750 -1.098389774586881e-02 +1743 1751 1.226433507083489e-01 +1743 1752 -7.898266143120435e-02 +1743 1753 -2.040533508482650e-01 +1743 1754 -3.205658723744574e-02 +1743 1755 1.582637096187322e-01 +1743 1756 -1.173436103509271e-01 +1743 1757 3.440881837090131e-02 +1743 1758 4.551820017945861e-01 +1743 1759 9.500818362211275e-01 +1743 1760 7.751613393474791e-01 +1743 1761 -3.524913251505098e-02 +1743 1762 -1.763260094650470e-01 +1743 1763 1.714825278878462e-01 +1743 1764 -6.675829549002529e-02 +1744 1747 2.163688115667714e-02 +1744 1748 -5.220965998265751e-02 +1744 1749 4.636253866511447e-02 +1744 1750 6.873636058250207e-03 +1744 1751 -7.297122858953514e-02 +1744 1752 4.361555150731784e-02 +1744 1753 1.016285359894895e-01 +1744 1754 1.413095968572884e-02 +1744 1755 -6.347065826161916e-02 +1744 1756 5.417647031984923e-02 +1744 1757 -1.467336790749558e-02 +1744 1758 -1.533011412395509e-01 +1744 1759 -1.151051233747923e-01 +1744 1760 4.718042883535921e-01 +1744 1761 1.003092729754152e+00 +1744 1762 4.009285655348384e-01 +1744 1763 -2.866596804778884e-01 +1744 1764 1.012997478615632e-01 +1745 1747 -1.242564713429316e-02 +1745 1748 2.983957599313233e-02 +1745 1749 -2.623252505678690e-02 +1745 1750 -3.826530502172932e-03 +1745 1751 3.967378200088001e-02 +1745 1752 -2.296833469170512e-02 +1745 1753 -5.147043285304104e-02 +1745 1754 -6.878577509575953e-03 +1745 1755 3.008346487896668e-02 +1745 1756 -2.675090448249389e-02 +1745 1757 7.073583005506205e-03 +1745 1758 6.969985820549054e-02 +1745 1759 4.603749937464054e-02 +1745 1760 -1.341009959651868e-01 +1745 1761 2.709112098464875e-02 +1745 1762 7.978124774257940e-01 +1745 1763 8.496052943251796e-01 +1745 1764 -1.833267155555124e-01 +1746 1747 4.056073820312835e-03 +1746 1748 -9.719999626669617e-03 +1746 1749 8.507818082536710e-03 +1746 1750 1.232479383922180e-03 +1746 1751 -1.265402077883358e-02 +1746 1752 7.233284760851675e-03 +1746 1753 1.597136003720089e-02 +1746 1754 2.104266184682774e-03 +1746 1755 -9.119197464263174e-03 +1746 1756 8.224868937523154e-03 +1746 1757 -2.156636620475577e-03 +1746 1758 -2.084168245043927e-02 +1746 1759 -1.325717275337946e-02 +1746 1760 3.581468700212909e-02 +1746 1761 -6.054059071083845e-03 +1746 1762 -8.784171983802572e-02 +1746 1763 3.337714682644796e-01 +1746 1764 1.121496109519649e+00 +1765 1774 1.121496109519649e+00 +1765 1775 3.337714682644795e-01 +1765 1776 -8.784171983802572e-02 +1765 1777 -6.054059071083844e-03 +1765 1778 3.581468700212909e-02 +1765 1779 -1.325717275337946e-02 +1765 1780 -2.084168245043926e-02 +1765 1781 -2.156636620475578e-03 +1765 1782 8.224868937523158e-03 +1765 1783 -9.119197464263170e-03 +1765 1784 2.104266184682774e-03 +1765 1785 1.597136003720089e-02 +1765 1786 7.233284760851673e-03 +1765 1787 -1.265402077883358e-02 +1765 1788 1.232479383922180e-03 +1765 1789 8.507818082536710e-03 +1765 1790 -9.719999626669619e-03 +1765 1791 4.056073820312835e-03 +1766 1774 -1.833267155555124e-01 +1766 1775 8.496052943251796e-01 +1766 1776 7.978124774257941e-01 +1766 1777 2.709112098464875e-02 +1766 1778 -1.341009959651868e-01 +1766 1779 4.603749937464056e-02 +1766 1780 6.969985820549053e-02 +1766 1781 7.073583005506207e-03 +1766 1782 -2.675090448249390e-02 +1766 1783 3.008346487896668e-02 +1766 1784 -6.878577509575953e-03 +1766 1785 -5.147043285304106e-02 +1766 1786 -2.296833469170511e-02 +1766 1787 3.967378200088001e-02 +1766 1788 -3.826530502172934e-03 +1766 1789 -2.623252505678690e-02 +1766 1790 2.983957599313234e-02 +1766 1791 -1.242564713429316e-02 +1767 1774 1.012997478615632e-01 +1767 1775 -2.866596804778883e-01 +1767 1776 4.009285655348384e-01 +1767 1777 1.003092729754152e+00 +1767 1778 4.718042883535921e-01 +1767 1779 -1.151051233747923e-01 +1767 1780 -1.533011412395509e-01 +1767 1781 -1.467336790749558e-02 +1767 1782 5.417647031984925e-02 +1767 1783 -6.347065826161911e-02 +1767 1784 1.413095968572883e-02 +1767 1785 1.016285359894895e-01 +1767 1786 4.361555150731782e-02 +1767 1787 -7.297122858953511e-02 +1767 1788 6.873636058250207e-03 +1767 1789 4.636253866511445e-02 +1767 1790 -5.220965998265751e-02 +1767 1791 2.163688115667714e-02 +1768 1774 -6.675829549002528e-02 +1768 1775 1.714825278878462e-01 +1768 1776 -1.763260094650470e-01 +1768 1777 -3.524913251505096e-02 +1768 1778 7.751613393474790e-01 +1768 1779 9.500818362211276e-01 +1768 1780 4.551820017945858e-01 +1768 1781 3.440881837090131e-02 +1768 1782 -1.173436103509271e-01 +1768 1783 1.582637096187321e-01 +1768 1784 -3.205658723744573e-02 +1768 1785 -2.040533508482650e-01 +1768 1786 -7.898266143120429e-02 +1768 1787 1.226433507083488e-01 +1768 1788 -1.098389774586880e-02 +1768 1789 -7.170870669864556e-02 +1768 1790 7.919894876867110e-02 +1768 1791 -3.252580339150374e-02 +1769 1774 4.654764921313230e-02 +1769 1775 -1.153084751520934e-01 +1769 1776 1.084975613502217e-01 +1769 1777 1.782365365320347e-02 +1769 1778 -2.253712020788738e-01 +1769 1779 1.833451203871435e-01 +1769 1780 7.871848513645289e-01 +1769 1781 9.980475420281738e-01 +1769 1782 9.659358568042323e-01 +1769 1783 9.659358568042320e-01 +1769 1784 9.980475420281736e-01 +1769 1785 7.871848513645292e-01 +1769 1786 1.833451203871434e-01 +1769 1787 -2.253712020788738e-01 +1769 1788 1.782365365320347e-02 +1769 1789 1.084975613502217e-01 +1769 1790 -1.153084751520934e-01 +1769 1791 4.654764921313230e-02 +1770 1774 -3.252580339150375e-02 +1770 1775 7.919894876867110e-02 +1770 1776 -7.170870669864558e-02 +1770 1777 -1.098389774586881e-02 +1770 1778 1.226433507083489e-01 +1770 1779 -7.898266143120435e-02 +1770 1780 -2.040533508482650e-01 +1770 1781 -3.205658723744574e-02 +1770 1782 1.582637096187322e-01 +1770 1783 -1.173436103509271e-01 +1770 1784 3.440881837090131e-02 +1770 1785 4.551820017945861e-01 +1770 1786 9.500818362211275e-01 +1770 1787 7.751613393474791e-01 +1770 1788 -3.524913251505098e-02 +1770 1789 -1.763260094650470e-01 +1770 1790 1.714825278878462e-01 +1770 1791 -6.675829549002529e-02 +1771 1774 2.163688115667714e-02 +1771 1775 -5.220965998265751e-02 +1771 1776 4.636253866511447e-02 +1771 1777 6.873636058250207e-03 +1771 1778 -7.297122858953514e-02 +1771 1779 4.361555150731784e-02 +1771 1780 1.016285359894895e-01 +1771 1781 1.413095968572884e-02 +1771 1782 -6.347065826161916e-02 +1771 1783 5.417647031984923e-02 +1771 1784 -1.467336790749558e-02 +1771 1785 -1.533011412395509e-01 +1771 1786 -1.151051233747923e-01 +1771 1787 4.718042883535921e-01 +1771 1788 1.003092729754152e+00 +1771 1789 4.009285655348384e-01 +1771 1790 -2.866596804778884e-01 +1771 1791 1.012997478615632e-01 +1772 1774 -1.242564713429316e-02 +1772 1775 2.983957599313233e-02 +1772 1776 -2.623252505678690e-02 +1772 1777 -3.826530502172932e-03 +1772 1778 3.967378200088001e-02 +1772 1779 -2.296833469170512e-02 +1772 1780 -5.147043285304104e-02 +1772 1781 -6.878577509575953e-03 +1772 1782 3.008346487896668e-02 +1772 1783 -2.675090448249389e-02 +1772 1784 7.073583005506205e-03 +1772 1785 6.969985820549054e-02 +1772 1786 4.603749937464054e-02 +1772 1787 -1.341009959651868e-01 +1772 1788 2.709112098464875e-02 +1772 1789 7.978124774257940e-01 +1772 1790 8.496052943251796e-01 +1772 1791 -1.833267155555124e-01 +1773 1774 4.056073820312835e-03 +1773 1775 -9.719999626669617e-03 +1773 1776 8.507818082536710e-03 +1773 1777 1.232479383922180e-03 +1773 1778 -1.265402077883358e-02 +1773 1779 7.233284760851675e-03 +1773 1780 1.597136003720089e-02 +1773 1781 2.104266184682774e-03 +1773 1782 -9.119197464263174e-03 +1773 1783 8.224868937523154e-03 +1773 1784 -2.156636620475577e-03 +1773 1785 -2.084168245043927e-02 +1773 1786 -1.325717275337946e-02 +1773 1787 3.581468700212909e-02 +1773 1788 -6.054059071083845e-03 +1773 1789 -8.784171983802572e-02 +1773 1790 3.337714682644796e-01 +1773 1791 1.121496109519649e+00 +1801 1810 1.121496109519649e+00 +1801 1811 3.337714682644795e-01 +1801 1812 -8.784171983802572e-02 +1801 1813 -6.054059071083844e-03 +1801 1814 3.581468700212909e-02 +1801 1815 -1.325717275337946e-02 +1801 1816 -2.084168245043926e-02 +1801 1817 -2.156636620475578e-03 +1801 1818 8.224868937523158e-03 +1801 1819 -9.119197464263170e-03 +1801 1820 2.104266184682774e-03 +1801 1821 1.597136003720089e-02 +1801 1822 7.233284760851673e-03 +1801 1823 -1.265402077883358e-02 +1801 1824 1.232479383922180e-03 +1801 1825 8.507818082536710e-03 +1801 1826 -9.719999626669619e-03 +1801 1827 4.056073820312835e-03 +1802 1810 -1.833267155555124e-01 +1802 1811 8.496052943251796e-01 +1802 1812 7.978124774257941e-01 +1802 1813 2.709112098464875e-02 +1802 1814 -1.341009959651868e-01 +1802 1815 4.603749937464056e-02 +1802 1816 6.969985820549053e-02 +1802 1817 7.073583005506207e-03 +1802 1818 -2.675090448249390e-02 +1802 1819 3.008346487896668e-02 +1802 1820 -6.878577509575953e-03 +1802 1821 -5.147043285304106e-02 +1802 1822 -2.296833469170511e-02 +1802 1823 3.967378200088001e-02 +1802 1824 -3.826530502172934e-03 +1802 1825 -2.623252505678690e-02 +1802 1826 2.983957599313234e-02 +1802 1827 -1.242564713429316e-02 +1803 1810 1.012997478615632e-01 +1803 1811 -2.866596804778883e-01 +1803 1812 4.009285655348384e-01 +1803 1813 1.003092729754152e+00 +1803 1814 4.718042883535921e-01 +1803 1815 -1.151051233747923e-01 +1803 1816 -1.533011412395509e-01 +1803 1817 -1.467336790749558e-02 +1803 1818 5.417647031984925e-02 +1803 1819 -6.347065826161911e-02 +1803 1820 1.413095968572883e-02 +1803 1821 1.016285359894895e-01 +1803 1822 4.361555150731782e-02 +1803 1823 -7.297122858953511e-02 +1803 1824 6.873636058250207e-03 +1803 1825 4.636253866511445e-02 +1803 1826 -5.220965998265751e-02 +1803 1827 2.163688115667714e-02 +1804 1810 -6.675829549002528e-02 +1804 1811 1.714825278878462e-01 +1804 1812 -1.763260094650470e-01 +1804 1813 -3.524913251505096e-02 +1804 1814 7.751613393474790e-01 +1804 1815 9.500818362211276e-01 +1804 1816 4.551820017945858e-01 +1804 1817 3.440881837090131e-02 +1804 1818 -1.173436103509271e-01 +1804 1819 1.582637096187321e-01 +1804 1820 -3.205658723744573e-02 +1804 1821 -2.040533508482650e-01 +1804 1822 -7.898266143120429e-02 +1804 1823 1.226433507083488e-01 +1804 1824 -1.098389774586880e-02 +1804 1825 -7.170870669864556e-02 +1804 1826 7.919894876867110e-02 +1804 1827 -3.252580339150374e-02 +1805 1810 4.654764921313230e-02 +1805 1811 -1.153084751520934e-01 +1805 1812 1.084975613502217e-01 +1805 1813 1.782365365320347e-02 +1805 1814 -2.253712020788738e-01 +1805 1815 1.833451203871435e-01 +1805 1816 7.871848513645289e-01 +1805 1817 9.980475420281738e-01 +1805 1818 9.659358568042323e-01 +1805 1819 9.659358568042320e-01 +1805 1820 9.980475420281736e-01 +1805 1821 7.871848513645292e-01 +1805 1822 1.833451203871434e-01 +1805 1823 -2.253712020788738e-01 +1805 1824 1.782365365320347e-02 +1805 1825 1.084975613502217e-01 +1805 1826 -1.153084751520934e-01 +1805 1827 4.654764921313230e-02 +1806 1810 -3.252580339150375e-02 +1806 1811 7.919894876867110e-02 +1806 1812 -7.170870669864558e-02 +1806 1813 -1.098389774586881e-02 +1806 1814 1.226433507083489e-01 +1806 1815 -7.898266143120435e-02 +1806 1816 -2.040533508482650e-01 +1806 1817 -3.205658723744574e-02 +1806 1818 1.582637096187322e-01 +1806 1819 -1.173436103509271e-01 +1806 1820 3.440881837090131e-02 +1806 1821 4.551820017945861e-01 +1806 1822 9.500818362211275e-01 +1806 1823 7.751613393474791e-01 +1806 1824 -3.524913251505098e-02 +1806 1825 -1.763260094650470e-01 +1806 1826 1.714825278878462e-01 +1806 1827 -6.675829549002529e-02 +1807 1810 2.163688115667714e-02 +1807 1811 -5.220965998265751e-02 +1807 1812 4.636253866511447e-02 +1807 1813 6.873636058250207e-03 +1807 1814 -7.297122858953514e-02 +1807 1815 4.361555150731784e-02 +1807 1816 1.016285359894895e-01 +1807 1817 1.413095968572884e-02 +1807 1818 -6.347065826161916e-02 +1807 1819 5.417647031984923e-02 +1807 1820 -1.467336790749558e-02 +1807 1821 -1.533011412395509e-01 +1807 1822 -1.151051233747923e-01 +1807 1823 4.718042883535921e-01 +1807 1824 1.003092729754152e+00 +1807 1825 4.009285655348384e-01 +1807 1826 -2.866596804778884e-01 +1807 1827 1.012997478615632e-01 +1808 1810 -1.242564713429316e-02 +1808 1811 2.983957599313233e-02 +1808 1812 -2.623252505678690e-02 +1808 1813 -3.826530502172932e-03 +1808 1814 3.967378200088001e-02 +1808 1815 -2.296833469170512e-02 +1808 1816 -5.147043285304104e-02 +1808 1817 -6.878577509575953e-03 +1808 1818 3.008346487896668e-02 +1808 1819 -2.675090448249389e-02 +1808 1820 7.073583005506205e-03 +1808 1821 6.969985820549054e-02 +1808 1822 4.603749937464054e-02 +1808 1823 -1.341009959651868e-01 +1808 1824 2.709112098464875e-02 +1808 1825 7.978124774257940e-01 +1808 1826 8.496052943251796e-01 +1808 1827 -1.833267155555124e-01 +1809 1810 4.056073820312835e-03 +1809 1811 -9.719999626669617e-03 +1809 1812 8.507818082536710e-03 +1809 1813 1.232479383922180e-03 +1809 1814 -1.265402077883358e-02 +1809 1815 7.233284760851675e-03 +1809 1816 1.597136003720089e-02 +1809 1817 2.104266184682774e-03 +1809 1818 -9.119197464263174e-03 +1809 1819 8.224868937523154e-03 +1809 1820 -2.156636620475577e-03 +1809 1821 -2.084168245043927e-02 +1809 1822 -1.325717275337946e-02 +1809 1823 3.581468700212909e-02 +1809 1824 -6.054059071083845e-03 +1809 1825 -8.784171983802572e-02 +1809 1826 3.337714682644796e-01 +1809 1827 1.121496109519649e+00 +1828 1837 1.121496109519649e+00 +1828 1838 3.337714682644795e-01 +1828 1839 -8.784171983802572e-02 +1828 1840 -6.054059071083844e-03 +1828 1841 3.581468700212909e-02 +1828 1842 -1.325717275337946e-02 +1828 1843 -2.084168245043926e-02 +1828 1844 -2.156636620475578e-03 +1828 1845 8.224868937523158e-03 +1828 1846 -9.119197464263170e-03 +1828 1847 2.104266184682774e-03 +1828 1848 1.597136003720089e-02 +1828 1849 7.233284760851673e-03 +1828 1850 -1.265402077883358e-02 +1828 1851 1.232479383922180e-03 +1828 1852 8.507818082536710e-03 +1828 1853 -9.719999626669619e-03 +1828 1854 4.056073820312835e-03 +1829 1837 -1.833267155555124e-01 +1829 1838 8.496052943251796e-01 +1829 1839 7.978124774257941e-01 +1829 1840 2.709112098464875e-02 +1829 1841 -1.341009959651868e-01 +1829 1842 4.603749937464056e-02 +1829 1843 6.969985820549053e-02 +1829 1844 7.073583005506207e-03 +1829 1845 -2.675090448249390e-02 +1829 1846 3.008346487896668e-02 +1829 1847 -6.878577509575953e-03 +1829 1848 -5.147043285304106e-02 +1829 1849 -2.296833469170511e-02 +1829 1850 3.967378200088001e-02 +1829 1851 -3.826530502172934e-03 +1829 1852 -2.623252505678690e-02 +1829 1853 2.983957599313234e-02 +1829 1854 -1.242564713429316e-02 +1830 1837 1.012997478615632e-01 +1830 1838 -2.866596804778883e-01 +1830 1839 4.009285655348384e-01 +1830 1840 1.003092729754152e+00 +1830 1841 4.718042883535921e-01 +1830 1842 -1.151051233747923e-01 +1830 1843 -1.533011412395509e-01 +1830 1844 -1.467336790749558e-02 +1830 1845 5.417647031984925e-02 +1830 1846 -6.347065826161911e-02 +1830 1847 1.413095968572883e-02 +1830 1848 1.016285359894895e-01 +1830 1849 4.361555150731782e-02 +1830 1850 -7.297122858953511e-02 +1830 1851 6.873636058250207e-03 +1830 1852 4.636253866511445e-02 +1830 1853 -5.220965998265751e-02 +1830 1854 2.163688115667714e-02 +1831 1837 -6.675829549002528e-02 +1831 1838 1.714825278878462e-01 +1831 1839 -1.763260094650470e-01 +1831 1840 -3.524913251505096e-02 +1831 1841 7.751613393474790e-01 +1831 1842 9.500818362211276e-01 +1831 1843 4.551820017945858e-01 +1831 1844 3.440881837090131e-02 +1831 1845 -1.173436103509271e-01 +1831 1846 1.582637096187321e-01 +1831 1847 -3.205658723744573e-02 +1831 1848 -2.040533508482650e-01 +1831 1849 -7.898266143120429e-02 +1831 1850 1.226433507083488e-01 +1831 1851 -1.098389774586880e-02 +1831 1852 -7.170870669864556e-02 +1831 1853 7.919894876867110e-02 +1831 1854 -3.252580339150374e-02 +1832 1837 4.654764921313230e-02 +1832 1838 -1.153084751520934e-01 +1832 1839 1.084975613502217e-01 +1832 1840 1.782365365320347e-02 +1832 1841 -2.253712020788738e-01 +1832 1842 1.833451203871435e-01 +1832 1843 7.871848513645289e-01 +1832 1844 9.980475420281738e-01 +1832 1845 9.659358568042323e-01 +1832 1846 9.659358568042320e-01 +1832 1847 9.980475420281736e-01 +1832 1848 7.871848513645292e-01 +1832 1849 1.833451203871434e-01 +1832 1850 -2.253712020788738e-01 +1832 1851 1.782365365320347e-02 +1832 1852 1.084975613502217e-01 +1832 1853 -1.153084751520934e-01 +1832 1854 4.654764921313230e-02 +1833 1837 -3.252580339150375e-02 +1833 1838 7.919894876867110e-02 +1833 1839 -7.170870669864558e-02 +1833 1840 -1.098389774586881e-02 +1833 1841 1.226433507083489e-01 +1833 1842 -7.898266143120435e-02 +1833 1843 -2.040533508482650e-01 +1833 1844 -3.205658723744574e-02 +1833 1845 1.582637096187322e-01 +1833 1846 -1.173436103509271e-01 +1833 1847 3.440881837090131e-02 +1833 1848 4.551820017945861e-01 +1833 1849 9.500818362211275e-01 +1833 1850 7.751613393474791e-01 +1833 1851 -3.524913251505098e-02 +1833 1852 -1.763260094650470e-01 +1833 1853 1.714825278878462e-01 +1833 1854 -6.675829549002529e-02 +1834 1837 2.163688115667714e-02 +1834 1838 -5.220965998265751e-02 +1834 1839 4.636253866511447e-02 +1834 1840 6.873636058250207e-03 +1834 1841 -7.297122858953514e-02 +1834 1842 4.361555150731784e-02 +1834 1843 1.016285359894895e-01 +1834 1844 1.413095968572884e-02 +1834 1845 -6.347065826161916e-02 +1834 1846 5.417647031984923e-02 +1834 1847 -1.467336790749558e-02 +1834 1848 -1.533011412395509e-01 +1834 1849 -1.151051233747923e-01 +1834 1850 4.718042883535921e-01 +1834 1851 1.003092729754152e+00 +1834 1852 4.009285655348384e-01 +1834 1853 -2.866596804778884e-01 +1834 1854 1.012997478615632e-01 +1835 1837 -1.242564713429316e-02 +1835 1838 2.983957599313233e-02 +1835 1839 -2.623252505678690e-02 +1835 1840 -3.826530502172932e-03 +1835 1841 3.967378200088001e-02 +1835 1842 -2.296833469170512e-02 +1835 1843 -5.147043285304104e-02 +1835 1844 -6.878577509575953e-03 +1835 1845 3.008346487896668e-02 +1835 1846 -2.675090448249389e-02 +1835 1847 7.073583005506205e-03 +1835 1848 6.969985820549054e-02 +1835 1849 4.603749937464054e-02 +1835 1850 -1.341009959651868e-01 +1835 1851 2.709112098464875e-02 +1835 1852 7.978124774257940e-01 +1835 1853 8.496052943251796e-01 +1835 1854 -1.833267155555124e-01 +1836 1837 4.056073820312835e-03 +1836 1838 -9.719999626669617e-03 +1836 1839 8.507818082536710e-03 +1836 1840 1.232479383922180e-03 +1836 1841 -1.265402077883358e-02 +1836 1842 7.233284760851675e-03 +1836 1843 1.597136003720089e-02 +1836 1844 2.104266184682774e-03 +1836 1845 -9.119197464263174e-03 +1836 1846 8.224868937523154e-03 +1836 1847 -2.156636620475577e-03 +1836 1848 -2.084168245043927e-02 +1836 1849 -1.325717275337946e-02 +1836 1850 3.581468700212909e-02 +1836 1851 -6.054059071083845e-03 +1836 1852 -8.784171983802572e-02 +1836 1853 3.337714682644796e-01 +1836 1854 1.121496109519649e+00 +1873 1882 1.121496109519649e+00 +1873 1883 3.337714682644795e-01 +1873 1884 -8.784171983802572e-02 +1873 1885 -6.054059071083844e-03 +1873 1886 3.581468700212909e-02 +1873 1887 -1.325717275337946e-02 +1873 1888 -2.084168245043926e-02 +1873 1889 -2.156636620475578e-03 +1873 1890 8.224868937523158e-03 +1873 1891 -9.119197464263170e-03 +1873 1892 2.104266184682774e-03 +1873 1893 1.597136003720089e-02 +1873 1894 7.233284760851673e-03 +1873 1895 -1.265402077883358e-02 +1873 1896 1.232479383922180e-03 +1873 1897 8.507818082536710e-03 +1873 1898 -9.719999626669619e-03 +1873 1899 4.056073820312835e-03 +1874 1882 -1.833267155555124e-01 +1874 1883 8.496052943251796e-01 +1874 1884 7.978124774257941e-01 +1874 1885 2.709112098464875e-02 +1874 1886 -1.341009959651868e-01 +1874 1887 4.603749937464056e-02 +1874 1888 6.969985820549053e-02 +1874 1889 7.073583005506207e-03 +1874 1890 -2.675090448249390e-02 +1874 1891 3.008346487896668e-02 +1874 1892 -6.878577509575953e-03 +1874 1893 -5.147043285304106e-02 +1874 1894 -2.296833469170511e-02 +1874 1895 3.967378200088001e-02 +1874 1896 -3.826530502172934e-03 +1874 1897 -2.623252505678690e-02 +1874 1898 2.983957599313234e-02 +1874 1899 -1.242564713429316e-02 +1875 1882 1.012997478615632e-01 +1875 1883 -2.866596804778883e-01 +1875 1884 4.009285655348384e-01 +1875 1885 1.003092729754152e+00 +1875 1886 4.718042883535921e-01 +1875 1887 -1.151051233747923e-01 +1875 1888 -1.533011412395509e-01 +1875 1889 -1.467336790749558e-02 +1875 1890 5.417647031984925e-02 +1875 1891 -6.347065826161911e-02 +1875 1892 1.413095968572883e-02 +1875 1893 1.016285359894895e-01 +1875 1894 4.361555150731782e-02 +1875 1895 -7.297122858953511e-02 +1875 1896 6.873636058250207e-03 +1875 1897 4.636253866511445e-02 +1875 1898 -5.220965998265751e-02 +1875 1899 2.163688115667714e-02 +1876 1882 -6.675829549002528e-02 +1876 1883 1.714825278878462e-01 +1876 1884 -1.763260094650470e-01 +1876 1885 -3.524913251505096e-02 +1876 1886 7.751613393474790e-01 +1876 1887 9.500818362211276e-01 +1876 1888 4.551820017945858e-01 +1876 1889 3.440881837090131e-02 +1876 1890 -1.173436103509271e-01 +1876 1891 1.582637096187321e-01 +1876 1892 -3.205658723744573e-02 +1876 1893 -2.040533508482650e-01 +1876 1894 -7.898266143120429e-02 +1876 1895 1.226433507083488e-01 +1876 1896 -1.098389774586880e-02 +1876 1897 -7.170870669864556e-02 +1876 1898 7.919894876867110e-02 +1876 1899 -3.252580339150374e-02 +1877 1882 4.654764921313230e-02 +1877 1883 -1.153084751520934e-01 +1877 1884 1.084975613502217e-01 +1877 1885 1.782365365320347e-02 +1877 1886 -2.253712020788738e-01 +1877 1887 1.833451203871435e-01 +1877 1888 7.871848513645289e-01 +1877 1889 9.980475420281738e-01 +1877 1890 9.659358568042323e-01 +1877 1891 9.659358568042320e-01 +1877 1892 9.980475420281736e-01 +1877 1893 7.871848513645292e-01 +1877 1894 1.833451203871434e-01 +1877 1895 -2.253712020788738e-01 +1877 1896 1.782365365320347e-02 +1877 1897 1.084975613502217e-01 +1877 1898 -1.153084751520934e-01 +1877 1899 4.654764921313230e-02 +1878 1882 -3.252580339150375e-02 +1878 1883 7.919894876867110e-02 +1878 1884 -7.170870669864558e-02 +1878 1885 -1.098389774586881e-02 +1878 1886 1.226433507083489e-01 +1878 1887 -7.898266143120435e-02 +1878 1888 -2.040533508482650e-01 +1878 1889 -3.205658723744574e-02 +1878 1890 1.582637096187322e-01 +1878 1891 -1.173436103509271e-01 +1878 1892 3.440881837090131e-02 +1878 1893 4.551820017945861e-01 +1878 1894 9.500818362211275e-01 +1878 1895 7.751613393474791e-01 +1878 1896 -3.524913251505098e-02 +1878 1897 -1.763260094650470e-01 +1878 1898 1.714825278878462e-01 +1878 1899 -6.675829549002529e-02 +1879 1882 2.163688115667714e-02 +1879 1883 -5.220965998265751e-02 +1879 1884 4.636253866511447e-02 +1879 1885 6.873636058250207e-03 +1879 1886 -7.297122858953514e-02 +1879 1887 4.361555150731784e-02 +1879 1888 1.016285359894895e-01 +1879 1889 1.413095968572884e-02 +1879 1890 -6.347065826161916e-02 +1879 1891 5.417647031984923e-02 +1879 1892 -1.467336790749558e-02 +1879 1893 -1.533011412395509e-01 +1879 1894 -1.151051233747923e-01 +1879 1895 4.718042883535921e-01 +1879 1896 1.003092729754152e+00 +1879 1897 4.009285655348384e-01 +1879 1898 -2.866596804778884e-01 +1879 1899 1.012997478615632e-01 +1880 1882 -1.242564713429316e-02 +1880 1883 2.983957599313233e-02 +1880 1884 -2.623252505678690e-02 +1880 1885 -3.826530502172932e-03 +1880 1886 3.967378200088001e-02 +1880 1887 -2.296833469170512e-02 +1880 1888 -5.147043285304104e-02 +1880 1889 -6.878577509575953e-03 +1880 1890 3.008346487896668e-02 +1880 1891 -2.675090448249389e-02 +1880 1892 7.073583005506205e-03 +1880 1893 6.969985820549054e-02 +1880 1894 4.603749937464054e-02 +1880 1895 -1.341009959651868e-01 +1880 1896 2.709112098464875e-02 +1880 1897 7.978124774257940e-01 +1880 1898 8.496052943251796e-01 +1880 1899 -1.833267155555124e-01 +1881 1882 4.056073820312835e-03 +1881 1883 -9.719999626669617e-03 +1881 1884 8.507818082536710e-03 +1881 1885 1.232479383922180e-03 +1881 1886 -1.265402077883358e-02 +1881 1887 7.233284760851675e-03 +1881 1888 1.597136003720089e-02 +1881 1889 2.104266184682774e-03 +1881 1890 -9.119197464263174e-03 +1881 1891 8.224868937523154e-03 +1881 1892 -2.156636620475577e-03 +1881 1893 -2.084168245043927e-02 +1881 1894 -1.325717275337946e-02 +1881 1895 3.581468700212909e-02 +1881 1896 -6.054059071083845e-03 +1881 1897 -8.784171983802572e-02 +1881 1898 3.337714682644796e-01 +1881 1899 1.121496109519649e+00 +1900 1909 1.121496109519649e+00 +1900 1910 3.337714682644795e-01 +1900 1911 -8.784171983802572e-02 +1900 1912 -6.054059071083844e-03 +1900 1913 3.581468700212909e-02 +1900 1914 -1.325717275337946e-02 +1900 1915 -2.084168245043926e-02 +1900 1916 -2.156636620475578e-03 +1900 1917 8.224868937523158e-03 +1900 1918 -9.119197464263170e-03 +1900 1919 2.104266184682774e-03 +1900 1920 1.597136003720089e-02 +1900 1921 7.233284760851673e-03 +1900 1922 -1.265402077883358e-02 +1900 1923 1.232479383922180e-03 +1900 1924 8.507818082536710e-03 +1900 1925 -9.719999626669619e-03 +1900 1926 4.056073820312835e-03 +1901 1909 -1.833267155555124e-01 +1901 1910 8.496052943251796e-01 +1901 1911 7.978124774257941e-01 +1901 1912 2.709112098464875e-02 +1901 1913 -1.341009959651868e-01 +1901 1914 4.603749937464056e-02 +1901 1915 6.969985820549053e-02 +1901 1916 7.073583005506207e-03 +1901 1917 -2.675090448249390e-02 +1901 1918 3.008346487896668e-02 +1901 1919 -6.878577509575953e-03 +1901 1920 -5.147043285304106e-02 +1901 1921 -2.296833469170511e-02 +1901 1922 3.967378200088001e-02 +1901 1923 -3.826530502172934e-03 +1901 1924 -2.623252505678690e-02 +1901 1925 2.983957599313234e-02 +1901 1926 -1.242564713429316e-02 +1902 1909 1.012997478615632e-01 +1902 1910 -2.866596804778883e-01 +1902 1911 4.009285655348384e-01 +1902 1912 1.003092729754152e+00 +1902 1913 4.718042883535921e-01 +1902 1914 -1.151051233747923e-01 +1902 1915 -1.533011412395509e-01 +1902 1916 -1.467336790749558e-02 +1902 1917 5.417647031984925e-02 +1902 1918 -6.347065826161911e-02 +1902 1919 1.413095968572883e-02 +1902 1920 1.016285359894895e-01 +1902 1921 4.361555150731782e-02 +1902 1922 -7.297122858953511e-02 +1902 1923 6.873636058250207e-03 +1902 1924 4.636253866511445e-02 +1902 1925 -5.220965998265751e-02 +1902 1926 2.163688115667714e-02 +1903 1909 -6.675829549002528e-02 +1903 1910 1.714825278878462e-01 +1903 1911 -1.763260094650470e-01 +1903 1912 -3.524913251505096e-02 +1903 1913 7.751613393474790e-01 +1903 1914 9.500818362211276e-01 +1903 1915 4.551820017945858e-01 +1903 1916 3.440881837090131e-02 +1903 1917 -1.173436103509271e-01 +1903 1918 1.582637096187321e-01 +1903 1919 -3.205658723744573e-02 +1903 1920 -2.040533508482650e-01 +1903 1921 -7.898266143120429e-02 +1903 1922 1.226433507083488e-01 +1903 1923 -1.098389774586880e-02 +1903 1924 -7.170870669864556e-02 +1903 1925 7.919894876867110e-02 +1903 1926 -3.252580339150374e-02 +1904 1909 4.654764921313230e-02 +1904 1910 -1.153084751520934e-01 +1904 1911 1.084975613502217e-01 +1904 1912 1.782365365320347e-02 +1904 1913 -2.253712020788738e-01 +1904 1914 1.833451203871435e-01 +1904 1915 7.871848513645289e-01 +1904 1916 9.980475420281738e-01 +1904 1917 9.659358568042323e-01 +1904 1918 9.659358568042320e-01 +1904 1919 9.980475420281736e-01 +1904 1920 7.871848513645292e-01 +1904 1921 1.833451203871434e-01 +1904 1922 -2.253712020788738e-01 +1904 1923 1.782365365320347e-02 +1904 1924 1.084975613502217e-01 +1904 1925 -1.153084751520934e-01 +1904 1926 4.654764921313230e-02 +1905 1909 -3.252580339150375e-02 +1905 1910 7.919894876867110e-02 +1905 1911 -7.170870669864558e-02 +1905 1912 -1.098389774586881e-02 +1905 1913 1.226433507083489e-01 +1905 1914 -7.898266143120435e-02 +1905 1915 -2.040533508482650e-01 +1905 1916 -3.205658723744574e-02 +1905 1917 1.582637096187322e-01 +1905 1918 -1.173436103509271e-01 +1905 1919 3.440881837090131e-02 +1905 1920 4.551820017945861e-01 +1905 1921 9.500818362211275e-01 +1905 1922 7.751613393474791e-01 +1905 1923 -3.524913251505098e-02 +1905 1924 -1.763260094650470e-01 +1905 1925 1.714825278878462e-01 +1905 1926 -6.675829549002529e-02 +1906 1909 2.163688115667714e-02 +1906 1910 -5.220965998265751e-02 +1906 1911 4.636253866511447e-02 +1906 1912 6.873636058250207e-03 +1906 1913 -7.297122858953514e-02 +1906 1914 4.361555150731784e-02 +1906 1915 1.016285359894895e-01 +1906 1916 1.413095968572884e-02 +1906 1917 -6.347065826161916e-02 +1906 1918 5.417647031984923e-02 +1906 1919 -1.467336790749558e-02 +1906 1920 -1.533011412395509e-01 +1906 1921 -1.151051233747923e-01 +1906 1922 4.718042883535921e-01 +1906 1923 1.003092729754152e+00 +1906 1924 4.009285655348384e-01 +1906 1925 -2.866596804778884e-01 +1906 1926 1.012997478615632e-01 +1907 1909 -1.242564713429316e-02 +1907 1910 2.983957599313233e-02 +1907 1911 -2.623252505678690e-02 +1907 1912 -3.826530502172932e-03 +1907 1913 3.967378200088001e-02 +1907 1914 -2.296833469170512e-02 +1907 1915 -5.147043285304104e-02 +1907 1916 -6.878577509575953e-03 +1907 1917 3.008346487896668e-02 +1907 1918 -2.675090448249389e-02 +1907 1919 7.073583005506205e-03 +1907 1920 6.969985820549054e-02 +1907 1921 4.603749937464054e-02 +1907 1922 -1.341009959651868e-01 +1907 1923 2.709112098464875e-02 +1907 1924 7.978124774257940e-01 +1907 1925 8.496052943251796e-01 +1907 1926 -1.833267155555124e-01 +1908 1909 4.056073820312835e-03 +1908 1910 -9.719999626669617e-03 +1908 1911 8.507818082536710e-03 +1908 1912 1.232479383922180e-03 +1908 1913 -1.265402077883358e-02 +1908 1914 7.233284760851675e-03 +1908 1915 1.597136003720089e-02 +1908 1916 2.104266184682774e-03 +1908 1917 -9.119197464263174e-03 +1908 1918 8.224868937523154e-03 +1908 1919 -2.156636620475577e-03 +1908 1920 -2.084168245043927e-02 +1908 1921 -1.325717275337946e-02 +1908 1922 3.581468700212909e-02 +1908 1923 -6.054059071083845e-03 +1908 1924 -8.784171983802572e-02 +1908 1925 3.337714682644796e-01 +1908 1926 1.121496109519649e+00 +1936 1945 1.121496109519649e+00 +1936 1946 3.337714682644795e-01 +1936 1947 -8.784171983802572e-02 +1936 1948 -6.054059071083844e-03 +1936 1949 3.581468700212909e-02 +1936 1950 -1.325717275337946e-02 +1936 1951 -2.084168245043926e-02 +1936 1952 -2.156636620475578e-03 +1936 1953 8.224868937523158e-03 +1936 1954 -9.119197464263170e-03 +1936 1955 2.104266184682774e-03 +1936 1956 1.597136003720089e-02 +1936 1957 7.233284760851673e-03 +1936 1958 -1.265402077883358e-02 +1936 1959 1.232479383922180e-03 +1936 1960 8.507818082536710e-03 +1936 1961 -9.719999626669619e-03 +1936 1962 4.056073820312835e-03 +1937 1945 -1.833267155555124e-01 +1937 1946 8.496052943251796e-01 +1937 1947 7.978124774257941e-01 +1937 1948 2.709112098464875e-02 +1937 1949 -1.341009959651868e-01 +1937 1950 4.603749937464056e-02 +1937 1951 6.969985820549053e-02 +1937 1952 7.073583005506207e-03 +1937 1953 -2.675090448249390e-02 +1937 1954 3.008346487896668e-02 +1937 1955 -6.878577509575953e-03 +1937 1956 -5.147043285304106e-02 +1937 1957 -2.296833469170511e-02 +1937 1958 3.967378200088001e-02 +1937 1959 -3.826530502172934e-03 +1937 1960 -2.623252505678690e-02 +1937 1961 2.983957599313234e-02 +1937 1962 -1.242564713429316e-02 +1938 1945 1.012997478615632e-01 +1938 1946 -2.866596804778883e-01 +1938 1947 4.009285655348384e-01 +1938 1948 1.003092729754152e+00 +1938 1949 4.718042883535921e-01 +1938 1950 -1.151051233747923e-01 +1938 1951 -1.533011412395509e-01 +1938 1952 -1.467336790749558e-02 +1938 1953 5.417647031984925e-02 +1938 1954 -6.347065826161911e-02 +1938 1955 1.413095968572883e-02 +1938 1956 1.016285359894895e-01 +1938 1957 4.361555150731782e-02 +1938 1958 -7.297122858953511e-02 +1938 1959 6.873636058250207e-03 +1938 1960 4.636253866511445e-02 +1938 1961 -5.220965998265751e-02 +1938 1962 2.163688115667714e-02 +1939 1945 -6.675829549002528e-02 +1939 1946 1.714825278878462e-01 +1939 1947 -1.763260094650470e-01 +1939 1948 -3.524913251505096e-02 +1939 1949 7.751613393474790e-01 +1939 1950 9.500818362211276e-01 +1939 1951 4.551820017945858e-01 +1939 1952 3.440881837090131e-02 +1939 1953 -1.173436103509271e-01 +1939 1954 1.582637096187321e-01 +1939 1955 -3.205658723744573e-02 +1939 1956 -2.040533508482650e-01 +1939 1957 -7.898266143120429e-02 +1939 1958 1.226433507083488e-01 +1939 1959 -1.098389774586880e-02 +1939 1960 -7.170870669864556e-02 +1939 1961 7.919894876867110e-02 +1939 1962 -3.252580339150374e-02 +1940 1945 4.654764921313230e-02 +1940 1946 -1.153084751520934e-01 +1940 1947 1.084975613502217e-01 +1940 1948 1.782365365320347e-02 +1940 1949 -2.253712020788738e-01 +1940 1950 1.833451203871435e-01 +1940 1951 7.871848513645289e-01 +1940 1952 9.980475420281738e-01 +1940 1953 9.659358568042323e-01 +1940 1954 9.659358568042320e-01 +1940 1955 9.980475420281736e-01 +1940 1956 7.871848513645292e-01 +1940 1957 1.833451203871434e-01 +1940 1958 -2.253712020788738e-01 +1940 1959 1.782365365320347e-02 +1940 1960 1.084975613502217e-01 +1940 1961 -1.153084751520934e-01 +1940 1962 4.654764921313230e-02 +1941 1945 -3.252580339150375e-02 +1941 1946 7.919894876867110e-02 +1941 1947 -7.170870669864558e-02 +1941 1948 -1.098389774586881e-02 +1941 1949 1.226433507083489e-01 +1941 1950 -7.898266143120435e-02 +1941 1951 -2.040533508482650e-01 +1941 1952 -3.205658723744574e-02 +1941 1953 1.582637096187322e-01 +1941 1954 -1.173436103509271e-01 +1941 1955 3.440881837090131e-02 +1941 1956 4.551820017945861e-01 +1941 1957 9.500818362211275e-01 +1941 1958 7.751613393474791e-01 +1941 1959 -3.524913251505098e-02 +1941 1960 -1.763260094650470e-01 +1941 1961 1.714825278878462e-01 +1941 1962 -6.675829549002529e-02 +1942 1945 2.163688115667714e-02 +1942 1946 -5.220965998265751e-02 +1942 1947 4.636253866511447e-02 +1942 1948 6.873636058250207e-03 +1942 1949 -7.297122858953514e-02 +1942 1950 4.361555150731784e-02 +1942 1951 1.016285359894895e-01 +1942 1952 1.413095968572884e-02 +1942 1953 -6.347065826161916e-02 +1942 1954 5.417647031984923e-02 +1942 1955 -1.467336790749558e-02 +1942 1956 -1.533011412395509e-01 +1942 1957 -1.151051233747923e-01 +1942 1958 4.718042883535921e-01 +1942 1959 1.003092729754152e+00 +1942 1960 4.009285655348384e-01 +1942 1961 -2.866596804778884e-01 +1942 1962 1.012997478615632e-01 +1943 1945 -1.242564713429316e-02 +1943 1946 2.983957599313233e-02 +1943 1947 -2.623252505678690e-02 +1943 1948 -3.826530502172932e-03 +1943 1949 3.967378200088001e-02 +1943 1950 -2.296833469170512e-02 +1943 1951 -5.147043285304104e-02 +1943 1952 -6.878577509575953e-03 +1943 1953 3.008346487896668e-02 +1943 1954 -2.675090448249389e-02 +1943 1955 7.073583005506205e-03 +1943 1956 6.969985820549054e-02 +1943 1957 4.603749937464054e-02 +1943 1958 -1.341009959651868e-01 +1943 1959 2.709112098464875e-02 +1943 1960 7.978124774257940e-01 +1943 1961 8.496052943251796e-01 +1943 1962 -1.833267155555124e-01 +1944 1945 4.056073820312835e-03 +1944 1946 -9.719999626669617e-03 +1944 1947 8.507818082536710e-03 +1944 1948 1.232479383922180e-03 +1944 1949 -1.265402077883358e-02 +1944 1950 7.233284760851675e-03 +1944 1951 1.597136003720089e-02 +1944 1952 2.104266184682774e-03 +1944 1953 -9.119197464263174e-03 +1944 1954 8.224868937523154e-03 +1944 1955 -2.156636620475577e-03 +1944 1956 -2.084168245043927e-02 +1944 1957 -1.325717275337946e-02 +1944 1958 3.581468700212909e-02 +1944 1959 -6.054059071083845e-03 +1944 1960 -8.784171983802572e-02 +1944 1961 3.337714682644796e-01 +1944 1962 1.121496109519649e+00 +1963 1972 1.121496109519649e+00 +1963 1973 3.337714682644795e-01 +1963 1974 -8.784171983802572e-02 +1963 1975 -6.054059071083844e-03 +1963 1976 3.581468700212909e-02 +1963 1977 -1.325717275337946e-02 +1963 1978 -2.084168245043926e-02 +1963 1979 -2.156636620475578e-03 +1963 1980 8.224868937523158e-03 +1963 1981 -9.119197464263170e-03 +1963 1982 2.104266184682774e-03 +1963 1983 1.597136003720089e-02 +1963 1984 7.233284760851673e-03 +1963 1985 -1.265402077883358e-02 +1963 1986 1.232479383922180e-03 +1963 1987 8.507818082536710e-03 +1963 1988 -9.719999626669619e-03 +1963 1989 4.056073820312835e-03 +1964 1972 -1.833267155555124e-01 +1964 1973 8.496052943251796e-01 +1964 1974 7.978124774257941e-01 +1964 1975 2.709112098464875e-02 +1964 1976 -1.341009959651868e-01 +1964 1977 4.603749937464056e-02 +1964 1978 6.969985820549053e-02 +1964 1979 7.073583005506207e-03 +1964 1980 -2.675090448249390e-02 +1964 1981 3.008346487896668e-02 +1964 1982 -6.878577509575953e-03 +1964 1983 -5.147043285304106e-02 +1964 1984 -2.296833469170511e-02 +1964 1985 3.967378200088001e-02 +1964 1986 -3.826530502172934e-03 +1964 1987 -2.623252505678690e-02 +1964 1988 2.983957599313234e-02 +1964 1989 -1.242564713429316e-02 +1965 1972 1.012997478615632e-01 +1965 1973 -2.866596804778883e-01 +1965 1974 4.009285655348384e-01 +1965 1975 1.003092729754152e+00 +1965 1976 4.718042883535921e-01 +1965 1977 -1.151051233747923e-01 +1965 1978 -1.533011412395509e-01 +1965 1979 -1.467336790749558e-02 +1965 1980 5.417647031984925e-02 +1965 1981 -6.347065826161911e-02 +1965 1982 1.413095968572883e-02 +1965 1983 1.016285359894895e-01 +1965 1984 4.361555150731782e-02 +1965 1985 -7.297122858953511e-02 +1965 1986 6.873636058250207e-03 +1965 1987 4.636253866511445e-02 +1965 1988 -5.220965998265751e-02 +1965 1989 2.163688115667714e-02 +1966 1972 -6.675829549002528e-02 +1966 1973 1.714825278878462e-01 +1966 1974 -1.763260094650470e-01 +1966 1975 -3.524913251505096e-02 +1966 1976 7.751613393474790e-01 +1966 1977 9.500818362211276e-01 +1966 1978 4.551820017945858e-01 +1966 1979 3.440881837090131e-02 +1966 1980 -1.173436103509271e-01 +1966 1981 1.582637096187321e-01 +1966 1982 -3.205658723744573e-02 +1966 1983 -2.040533508482650e-01 +1966 1984 -7.898266143120429e-02 +1966 1985 1.226433507083488e-01 +1966 1986 -1.098389774586880e-02 +1966 1987 -7.170870669864556e-02 +1966 1988 7.919894876867110e-02 +1966 1989 -3.252580339150374e-02 +1967 1972 4.654764921313230e-02 +1967 1973 -1.153084751520934e-01 +1967 1974 1.084975613502217e-01 +1967 1975 1.782365365320347e-02 +1967 1976 -2.253712020788738e-01 +1967 1977 1.833451203871435e-01 +1967 1978 7.871848513645289e-01 +1967 1979 9.980475420281738e-01 +1967 1980 9.659358568042323e-01 +1967 1981 9.659358568042320e-01 +1967 1982 9.980475420281736e-01 +1967 1983 7.871848513645292e-01 +1967 1984 1.833451203871434e-01 +1967 1985 -2.253712020788738e-01 +1967 1986 1.782365365320347e-02 +1967 1987 1.084975613502217e-01 +1967 1988 -1.153084751520934e-01 +1967 1989 4.654764921313230e-02 +1968 1972 -3.252580339150375e-02 +1968 1973 7.919894876867110e-02 +1968 1974 -7.170870669864558e-02 +1968 1975 -1.098389774586881e-02 +1968 1976 1.226433507083489e-01 +1968 1977 -7.898266143120435e-02 +1968 1978 -2.040533508482650e-01 +1968 1979 -3.205658723744574e-02 +1968 1980 1.582637096187322e-01 +1968 1981 -1.173436103509271e-01 +1968 1982 3.440881837090131e-02 +1968 1983 4.551820017945861e-01 +1968 1984 9.500818362211275e-01 +1968 1985 7.751613393474791e-01 +1968 1986 -3.524913251505098e-02 +1968 1987 -1.763260094650470e-01 +1968 1988 1.714825278878462e-01 +1968 1989 -6.675829549002529e-02 +1969 1972 2.163688115667714e-02 +1969 1973 -5.220965998265751e-02 +1969 1974 4.636253866511447e-02 +1969 1975 6.873636058250207e-03 +1969 1976 -7.297122858953514e-02 +1969 1977 4.361555150731784e-02 +1969 1978 1.016285359894895e-01 +1969 1979 1.413095968572884e-02 +1969 1980 -6.347065826161916e-02 +1969 1981 5.417647031984923e-02 +1969 1982 -1.467336790749558e-02 +1969 1983 -1.533011412395509e-01 +1969 1984 -1.151051233747923e-01 +1969 1985 4.718042883535921e-01 +1969 1986 1.003092729754152e+00 +1969 1987 4.009285655348384e-01 +1969 1988 -2.866596804778884e-01 +1969 1989 1.012997478615632e-01 +1970 1972 -1.242564713429316e-02 +1970 1973 2.983957599313233e-02 +1970 1974 -2.623252505678690e-02 +1970 1975 -3.826530502172932e-03 +1970 1976 3.967378200088001e-02 +1970 1977 -2.296833469170512e-02 +1970 1978 -5.147043285304104e-02 +1970 1979 -6.878577509575953e-03 +1970 1980 3.008346487896668e-02 +1970 1981 -2.675090448249389e-02 +1970 1982 7.073583005506205e-03 +1970 1983 6.969985820549054e-02 +1970 1984 4.603749937464054e-02 +1970 1985 -1.341009959651868e-01 +1970 1986 2.709112098464875e-02 +1970 1987 7.978124774257940e-01 +1970 1988 8.496052943251796e-01 +1970 1989 -1.833267155555124e-01 +1971 1972 4.056073820312835e-03 +1971 1973 -9.719999626669617e-03 +1971 1974 8.507818082536710e-03 +1971 1975 1.232479383922180e-03 +1971 1976 -1.265402077883358e-02 +1971 1977 7.233284760851675e-03 +1971 1978 1.597136003720089e-02 +1971 1979 2.104266184682774e-03 +1971 1980 -9.119197464263174e-03 +1971 1981 8.224868937523154e-03 +1971 1982 -2.156636620475577e-03 +1971 1983 -2.084168245043927e-02 +1971 1984 -1.325717275337946e-02 +1971 1985 3.581468700212909e-02 +1971 1986 -6.054059071083845e-03 +1971 1987 -8.784171983802572e-02 +1971 1988 3.337714682644796e-01 +1971 1989 1.121496109519649e+00 +2017 2026 1.121496109519649e+00 +2017 2027 3.337714682644795e-01 +2017 2028 -8.784171983802572e-02 +2017 2029 -6.054059071083844e-03 +2017 2030 3.581468700212909e-02 +2017 2031 -1.325717275337946e-02 +2017 2032 -2.084168245043926e-02 +2017 2033 -2.156636620475578e-03 +2017 2034 8.224868937523158e-03 +2017 2035 -9.119197464263170e-03 +2017 2036 2.104266184682774e-03 +2017 2037 1.597136003720089e-02 +2017 2038 7.233284760851673e-03 +2017 2039 -1.265402077883358e-02 +2017 2040 1.232479383922180e-03 +2017 2041 8.507818082536710e-03 +2017 2042 -9.719999626669619e-03 +2017 2043 4.056073820312835e-03 +2018 2026 -1.833267155555124e-01 +2018 2027 8.496052943251796e-01 +2018 2028 7.978124774257941e-01 +2018 2029 2.709112098464875e-02 +2018 2030 -1.341009959651868e-01 +2018 2031 4.603749937464056e-02 +2018 2032 6.969985820549053e-02 +2018 2033 7.073583005506207e-03 +2018 2034 -2.675090448249390e-02 +2018 2035 3.008346487896668e-02 +2018 2036 -6.878577509575953e-03 +2018 2037 -5.147043285304106e-02 +2018 2038 -2.296833469170511e-02 +2018 2039 3.967378200088001e-02 +2018 2040 -3.826530502172934e-03 +2018 2041 -2.623252505678690e-02 +2018 2042 2.983957599313234e-02 +2018 2043 -1.242564713429316e-02 +2019 2026 1.012997478615632e-01 +2019 2027 -2.866596804778883e-01 +2019 2028 4.009285655348384e-01 +2019 2029 1.003092729754152e+00 +2019 2030 4.718042883535921e-01 +2019 2031 -1.151051233747923e-01 +2019 2032 -1.533011412395509e-01 +2019 2033 -1.467336790749558e-02 +2019 2034 5.417647031984925e-02 +2019 2035 -6.347065826161911e-02 +2019 2036 1.413095968572883e-02 +2019 2037 1.016285359894895e-01 +2019 2038 4.361555150731782e-02 +2019 2039 -7.297122858953511e-02 +2019 2040 6.873636058250207e-03 +2019 2041 4.636253866511445e-02 +2019 2042 -5.220965998265751e-02 +2019 2043 2.163688115667714e-02 +2020 2026 -6.675829549002528e-02 +2020 2027 1.714825278878462e-01 +2020 2028 -1.763260094650470e-01 +2020 2029 -3.524913251505096e-02 +2020 2030 7.751613393474790e-01 +2020 2031 9.500818362211276e-01 +2020 2032 4.551820017945858e-01 +2020 2033 3.440881837090131e-02 +2020 2034 -1.173436103509271e-01 +2020 2035 1.582637096187321e-01 +2020 2036 -3.205658723744573e-02 +2020 2037 -2.040533508482650e-01 +2020 2038 -7.898266143120429e-02 +2020 2039 1.226433507083488e-01 +2020 2040 -1.098389774586880e-02 +2020 2041 -7.170870669864556e-02 +2020 2042 7.919894876867110e-02 +2020 2043 -3.252580339150374e-02 +2021 2026 4.654764921313230e-02 +2021 2027 -1.153084751520934e-01 +2021 2028 1.084975613502217e-01 +2021 2029 1.782365365320347e-02 +2021 2030 -2.253712020788738e-01 +2021 2031 1.833451203871435e-01 +2021 2032 7.871848513645289e-01 +2021 2033 9.980475420281738e-01 +2021 2034 9.659358568042323e-01 +2021 2035 9.659358568042320e-01 +2021 2036 9.980475420281736e-01 +2021 2037 7.871848513645292e-01 +2021 2038 1.833451203871434e-01 +2021 2039 -2.253712020788738e-01 +2021 2040 1.782365365320347e-02 +2021 2041 1.084975613502217e-01 +2021 2042 -1.153084751520934e-01 +2021 2043 4.654764921313230e-02 +2022 2026 -3.252580339150375e-02 +2022 2027 7.919894876867110e-02 +2022 2028 -7.170870669864558e-02 +2022 2029 -1.098389774586881e-02 +2022 2030 1.226433507083489e-01 +2022 2031 -7.898266143120435e-02 +2022 2032 -2.040533508482650e-01 +2022 2033 -3.205658723744574e-02 +2022 2034 1.582637096187322e-01 +2022 2035 -1.173436103509271e-01 +2022 2036 3.440881837090131e-02 +2022 2037 4.551820017945861e-01 +2022 2038 9.500818362211275e-01 +2022 2039 7.751613393474791e-01 +2022 2040 -3.524913251505098e-02 +2022 2041 -1.763260094650470e-01 +2022 2042 1.714825278878462e-01 +2022 2043 -6.675829549002529e-02 +2023 2026 2.163688115667714e-02 +2023 2027 -5.220965998265751e-02 +2023 2028 4.636253866511447e-02 +2023 2029 6.873636058250207e-03 +2023 2030 -7.297122858953514e-02 +2023 2031 4.361555150731784e-02 +2023 2032 1.016285359894895e-01 +2023 2033 1.413095968572884e-02 +2023 2034 -6.347065826161916e-02 +2023 2035 5.417647031984923e-02 +2023 2036 -1.467336790749558e-02 +2023 2037 -1.533011412395509e-01 +2023 2038 -1.151051233747923e-01 +2023 2039 4.718042883535921e-01 +2023 2040 1.003092729754152e+00 +2023 2041 4.009285655348384e-01 +2023 2042 -2.866596804778884e-01 +2023 2043 1.012997478615632e-01 +2024 2026 -1.242564713429316e-02 +2024 2027 2.983957599313233e-02 +2024 2028 -2.623252505678690e-02 +2024 2029 -3.826530502172932e-03 +2024 2030 3.967378200088001e-02 +2024 2031 -2.296833469170512e-02 +2024 2032 -5.147043285304104e-02 +2024 2033 -6.878577509575953e-03 +2024 2034 3.008346487896668e-02 +2024 2035 -2.675090448249389e-02 +2024 2036 7.073583005506205e-03 +2024 2037 6.969985820549054e-02 +2024 2038 4.603749937464054e-02 +2024 2039 -1.341009959651868e-01 +2024 2040 2.709112098464875e-02 +2024 2041 7.978124774257940e-01 +2024 2042 8.496052943251796e-01 +2024 2043 -1.833267155555124e-01 +2025 2026 4.056073820312835e-03 +2025 2027 -9.719999626669617e-03 +2025 2028 8.507818082536710e-03 +2025 2029 1.232479383922180e-03 +2025 2030 -1.265402077883358e-02 +2025 2031 7.233284760851675e-03 +2025 2032 1.597136003720089e-02 +2025 2033 2.104266184682774e-03 +2025 2034 -9.119197464263174e-03 +2025 2035 8.224868937523154e-03 +2025 2036 -2.156636620475577e-03 +2025 2037 -2.084168245043927e-02 +2025 2038 -1.325717275337946e-02 +2025 2039 3.581468700212909e-02 +2025 2040 -6.054059071083845e-03 +2025 2041 -8.784171983802572e-02 +2025 2042 3.337714682644796e-01 +2025 2043 1.121496109519649e+00 +2044 2053 1.121496109519649e+00 +2044 2054 3.337714682644795e-01 +2044 2055 -8.784171983802572e-02 +2044 2056 -6.054059071083844e-03 +2044 2057 3.581468700212909e-02 +2044 2058 -1.325717275337946e-02 +2044 2059 -2.084168245043926e-02 +2044 2060 -2.156636620475578e-03 +2044 2061 8.224868937523158e-03 +2044 2062 -9.119197464263170e-03 +2044 2063 2.104266184682774e-03 +2044 2064 1.597136003720089e-02 +2044 2065 7.233284760851673e-03 +2044 2066 -1.265402077883358e-02 +2044 2067 1.232479383922180e-03 +2044 2068 8.507818082536710e-03 +2044 2069 -9.719999626669619e-03 +2044 2070 4.056073820312835e-03 +2045 2053 -1.833267155555124e-01 +2045 2054 8.496052943251796e-01 +2045 2055 7.978124774257941e-01 +2045 2056 2.709112098464875e-02 +2045 2057 -1.341009959651868e-01 +2045 2058 4.603749937464056e-02 +2045 2059 6.969985820549053e-02 +2045 2060 7.073583005506207e-03 +2045 2061 -2.675090448249390e-02 +2045 2062 3.008346487896668e-02 +2045 2063 -6.878577509575953e-03 +2045 2064 -5.147043285304106e-02 +2045 2065 -2.296833469170511e-02 +2045 2066 3.967378200088001e-02 +2045 2067 -3.826530502172934e-03 +2045 2068 -2.623252505678690e-02 +2045 2069 2.983957599313234e-02 +2045 2070 -1.242564713429316e-02 +2046 2053 1.012997478615632e-01 +2046 2054 -2.866596804778883e-01 +2046 2055 4.009285655348384e-01 +2046 2056 1.003092729754152e+00 +2046 2057 4.718042883535921e-01 +2046 2058 -1.151051233747923e-01 +2046 2059 -1.533011412395509e-01 +2046 2060 -1.467336790749558e-02 +2046 2061 5.417647031984925e-02 +2046 2062 -6.347065826161911e-02 +2046 2063 1.413095968572883e-02 +2046 2064 1.016285359894895e-01 +2046 2065 4.361555150731782e-02 +2046 2066 -7.297122858953511e-02 +2046 2067 6.873636058250207e-03 +2046 2068 4.636253866511445e-02 +2046 2069 -5.220965998265751e-02 +2046 2070 2.163688115667714e-02 +2047 2053 -6.675829549002528e-02 +2047 2054 1.714825278878462e-01 +2047 2055 -1.763260094650470e-01 +2047 2056 -3.524913251505096e-02 +2047 2057 7.751613393474790e-01 +2047 2058 9.500818362211276e-01 +2047 2059 4.551820017945858e-01 +2047 2060 3.440881837090131e-02 +2047 2061 -1.173436103509271e-01 +2047 2062 1.582637096187321e-01 +2047 2063 -3.205658723744573e-02 +2047 2064 -2.040533508482650e-01 +2047 2065 -7.898266143120429e-02 +2047 2066 1.226433507083488e-01 +2047 2067 -1.098389774586880e-02 +2047 2068 -7.170870669864556e-02 +2047 2069 7.919894876867110e-02 +2047 2070 -3.252580339150374e-02 +2048 2053 4.654764921313230e-02 +2048 2054 -1.153084751520934e-01 +2048 2055 1.084975613502217e-01 +2048 2056 1.782365365320347e-02 +2048 2057 -2.253712020788738e-01 +2048 2058 1.833451203871435e-01 +2048 2059 7.871848513645289e-01 +2048 2060 9.980475420281738e-01 +2048 2061 9.659358568042323e-01 +2048 2062 9.659358568042320e-01 +2048 2063 9.980475420281736e-01 +2048 2064 7.871848513645292e-01 +2048 2065 1.833451203871434e-01 +2048 2066 -2.253712020788738e-01 +2048 2067 1.782365365320347e-02 +2048 2068 1.084975613502217e-01 +2048 2069 -1.153084751520934e-01 +2048 2070 4.654764921313230e-02 +2049 2053 -3.252580339150375e-02 +2049 2054 7.919894876867110e-02 +2049 2055 -7.170870669864558e-02 +2049 2056 -1.098389774586881e-02 +2049 2057 1.226433507083489e-01 +2049 2058 -7.898266143120435e-02 +2049 2059 -2.040533508482650e-01 +2049 2060 -3.205658723744574e-02 +2049 2061 1.582637096187322e-01 +2049 2062 -1.173436103509271e-01 +2049 2063 3.440881837090131e-02 +2049 2064 4.551820017945861e-01 +2049 2065 9.500818362211275e-01 +2049 2066 7.751613393474791e-01 +2049 2067 -3.524913251505098e-02 +2049 2068 -1.763260094650470e-01 +2049 2069 1.714825278878462e-01 +2049 2070 -6.675829549002529e-02 +2050 2053 2.163688115667714e-02 +2050 2054 -5.220965998265751e-02 +2050 2055 4.636253866511447e-02 +2050 2056 6.873636058250207e-03 +2050 2057 -7.297122858953514e-02 +2050 2058 4.361555150731784e-02 +2050 2059 1.016285359894895e-01 +2050 2060 1.413095968572884e-02 +2050 2061 -6.347065826161916e-02 +2050 2062 5.417647031984923e-02 +2050 2063 -1.467336790749558e-02 +2050 2064 -1.533011412395509e-01 +2050 2065 -1.151051233747923e-01 +2050 2066 4.718042883535921e-01 +2050 2067 1.003092729754152e+00 +2050 2068 4.009285655348384e-01 +2050 2069 -2.866596804778884e-01 +2050 2070 1.012997478615632e-01 +2051 2053 -1.242564713429316e-02 +2051 2054 2.983957599313233e-02 +2051 2055 -2.623252505678690e-02 +2051 2056 -3.826530502172932e-03 +2051 2057 3.967378200088001e-02 +2051 2058 -2.296833469170512e-02 +2051 2059 -5.147043285304104e-02 +2051 2060 -6.878577509575953e-03 +2051 2061 3.008346487896668e-02 +2051 2062 -2.675090448249389e-02 +2051 2063 7.073583005506205e-03 +2051 2064 6.969985820549054e-02 +2051 2065 4.603749937464054e-02 +2051 2066 -1.341009959651868e-01 +2051 2067 2.709112098464875e-02 +2051 2068 7.978124774257940e-01 +2051 2069 8.496052943251796e-01 +2051 2070 -1.833267155555124e-01 +2052 2053 4.056073820312835e-03 +2052 2054 -9.719999626669617e-03 +2052 2055 8.507818082536710e-03 +2052 2056 1.232479383922180e-03 +2052 2057 -1.265402077883358e-02 +2052 2058 7.233284760851675e-03 +2052 2059 1.597136003720089e-02 +2052 2060 2.104266184682774e-03 +2052 2061 -9.119197464263174e-03 +2052 2062 8.224868937523154e-03 +2052 2063 -2.156636620475577e-03 +2052 2064 -2.084168245043927e-02 +2052 2065 -1.325717275337946e-02 +2052 2066 3.581468700212909e-02 +2052 2067 -6.054059071083845e-03 +2052 2068 -8.784171983802572e-02 +2052 2069 3.337714682644796e-01 +2052 2070 1.121496109519649e+00 +2080 2089 1.121496109519649e+00 +2080 2090 3.337714682644795e-01 +2080 2091 -8.784171983802572e-02 +2080 2092 -6.054059071083844e-03 +2080 2093 3.581468700212909e-02 +2080 2094 -1.325717275337946e-02 +2080 2095 -2.084168245043926e-02 +2080 2096 -2.156636620475578e-03 +2080 2097 8.224868937523158e-03 +2080 2098 -9.119197464263170e-03 +2080 2099 2.104266184682774e-03 +2080 2100 1.597136003720089e-02 +2080 2101 7.233284760851673e-03 +2080 2102 -1.265402077883358e-02 +2080 2103 1.232479383922180e-03 +2080 2104 8.507818082536710e-03 +2080 2105 -9.719999626669619e-03 +2080 2106 4.056073820312835e-03 +2081 2089 -1.833267155555124e-01 +2081 2090 8.496052943251796e-01 +2081 2091 7.978124774257941e-01 +2081 2092 2.709112098464875e-02 +2081 2093 -1.341009959651868e-01 +2081 2094 4.603749937464056e-02 +2081 2095 6.969985820549053e-02 +2081 2096 7.073583005506207e-03 +2081 2097 -2.675090448249390e-02 +2081 2098 3.008346487896668e-02 +2081 2099 -6.878577509575953e-03 +2081 2100 -5.147043285304106e-02 +2081 2101 -2.296833469170511e-02 +2081 2102 3.967378200088001e-02 +2081 2103 -3.826530502172934e-03 +2081 2104 -2.623252505678690e-02 +2081 2105 2.983957599313234e-02 +2081 2106 -1.242564713429316e-02 +2082 2089 1.012997478615632e-01 +2082 2090 -2.866596804778883e-01 +2082 2091 4.009285655348384e-01 +2082 2092 1.003092729754152e+00 +2082 2093 4.718042883535921e-01 +2082 2094 -1.151051233747923e-01 +2082 2095 -1.533011412395509e-01 +2082 2096 -1.467336790749558e-02 +2082 2097 5.417647031984925e-02 +2082 2098 -6.347065826161911e-02 +2082 2099 1.413095968572883e-02 +2082 2100 1.016285359894895e-01 +2082 2101 4.361555150731782e-02 +2082 2102 -7.297122858953511e-02 +2082 2103 6.873636058250207e-03 +2082 2104 4.636253866511445e-02 +2082 2105 -5.220965998265751e-02 +2082 2106 2.163688115667714e-02 +2083 2089 -6.675829549002528e-02 +2083 2090 1.714825278878462e-01 +2083 2091 -1.763260094650470e-01 +2083 2092 -3.524913251505096e-02 +2083 2093 7.751613393474790e-01 +2083 2094 9.500818362211276e-01 +2083 2095 4.551820017945858e-01 +2083 2096 3.440881837090131e-02 +2083 2097 -1.173436103509271e-01 +2083 2098 1.582637096187321e-01 +2083 2099 -3.205658723744573e-02 +2083 2100 -2.040533508482650e-01 +2083 2101 -7.898266143120429e-02 +2083 2102 1.226433507083488e-01 +2083 2103 -1.098389774586880e-02 +2083 2104 -7.170870669864556e-02 +2083 2105 7.919894876867110e-02 +2083 2106 -3.252580339150374e-02 +2084 2089 4.654764921313230e-02 +2084 2090 -1.153084751520934e-01 +2084 2091 1.084975613502217e-01 +2084 2092 1.782365365320347e-02 +2084 2093 -2.253712020788738e-01 +2084 2094 1.833451203871435e-01 +2084 2095 7.871848513645289e-01 +2084 2096 9.980475420281738e-01 +2084 2097 9.659358568042323e-01 +2084 2098 9.659358568042320e-01 +2084 2099 9.980475420281736e-01 +2084 2100 7.871848513645292e-01 +2084 2101 1.833451203871434e-01 +2084 2102 -2.253712020788738e-01 +2084 2103 1.782365365320347e-02 +2084 2104 1.084975613502217e-01 +2084 2105 -1.153084751520934e-01 +2084 2106 4.654764921313230e-02 +2085 2089 -3.252580339150375e-02 +2085 2090 7.919894876867110e-02 +2085 2091 -7.170870669864558e-02 +2085 2092 -1.098389774586881e-02 +2085 2093 1.226433507083489e-01 +2085 2094 -7.898266143120435e-02 +2085 2095 -2.040533508482650e-01 +2085 2096 -3.205658723744574e-02 +2085 2097 1.582637096187322e-01 +2085 2098 -1.173436103509271e-01 +2085 2099 3.440881837090131e-02 +2085 2100 4.551820017945861e-01 +2085 2101 9.500818362211275e-01 +2085 2102 7.751613393474791e-01 +2085 2103 -3.524913251505098e-02 +2085 2104 -1.763260094650470e-01 +2085 2105 1.714825278878462e-01 +2085 2106 -6.675829549002529e-02 +2086 2089 2.163688115667714e-02 +2086 2090 -5.220965998265751e-02 +2086 2091 4.636253866511447e-02 +2086 2092 6.873636058250207e-03 +2086 2093 -7.297122858953514e-02 +2086 2094 4.361555150731784e-02 +2086 2095 1.016285359894895e-01 +2086 2096 1.413095968572884e-02 +2086 2097 -6.347065826161916e-02 +2086 2098 5.417647031984923e-02 +2086 2099 -1.467336790749558e-02 +2086 2100 -1.533011412395509e-01 +2086 2101 -1.151051233747923e-01 +2086 2102 4.718042883535921e-01 +2086 2103 1.003092729754152e+00 +2086 2104 4.009285655348384e-01 +2086 2105 -2.866596804778884e-01 +2086 2106 1.012997478615632e-01 +2087 2089 -1.242564713429316e-02 +2087 2090 2.983957599313233e-02 +2087 2091 -2.623252505678690e-02 +2087 2092 -3.826530502172932e-03 +2087 2093 3.967378200088001e-02 +2087 2094 -2.296833469170512e-02 +2087 2095 -5.147043285304104e-02 +2087 2096 -6.878577509575953e-03 +2087 2097 3.008346487896668e-02 +2087 2098 -2.675090448249389e-02 +2087 2099 7.073583005506205e-03 +2087 2100 6.969985820549054e-02 +2087 2101 4.603749937464054e-02 +2087 2102 -1.341009959651868e-01 +2087 2103 2.709112098464875e-02 +2087 2104 7.978124774257940e-01 +2087 2105 8.496052943251796e-01 +2087 2106 -1.833267155555124e-01 +2088 2089 4.056073820312835e-03 +2088 2090 -9.719999626669617e-03 +2088 2091 8.507818082536710e-03 +2088 2092 1.232479383922180e-03 +2088 2093 -1.265402077883358e-02 +2088 2094 7.233284760851675e-03 +2088 2095 1.597136003720089e-02 +2088 2096 2.104266184682774e-03 +2088 2097 -9.119197464263174e-03 +2088 2098 8.224868937523154e-03 +2088 2099 -2.156636620475577e-03 +2088 2100 -2.084168245043927e-02 +2088 2101 -1.325717275337946e-02 +2088 2102 3.581468700212909e-02 +2088 2103 -6.054059071083845e-03 +2088 2104 -8.784171983802572e-02 +2088 2105 3.337714682644796e-01 +2088 2106 1.121496109519649e+00 +2107 2116 1.121496109519649e+00 +2107 2117 3.337714682644795e-01 +2107 2118 -8.784171983802572e-02 +2107 2119 -6.054059071083844e-03 +2107 2120 3.581468700212909e-02 +2107 2121 -1.325717275337946e-02 +2107 2122 -2.084168245043926e-02 +2107 2123 -2.156636620475578e-03 +2107 2124 8.224868937523158e-03 +2107 2125 -9.119197464263170e-03 +2107 2126 2.104266184682774e-03 +2107 2127 1.597136003720089e-02 +2107 2128 7.233284760851673e-03 +2107 2129 -1.265402077883358e-02 +2107 2130 1.232479383922180e-03 +2107 2131 8.507818082536710e-03 +2107 2132 -9.719999626669619e-03 +2107 2133 4.056073820312835e-03 +2108 2116 -1.833267155555124e-01 +2108 2117 8.496052943251796e-01 +2108 2118 7.978124774257941e-01 +2108 2119 2.709112098464875e-02 +2108 2120 -1.341009959651868e-01 +2108 2121 4.603749937464056e-02 +2108 2122 6.969985820549053e-02 +2108 2123 7.073583005506207e-03 +2108 2124 -2.675090448249390e-02 +2108 2125 3.008346487896668e-02 +2108 2126 -6.878577509575953e-03 +2108 2127 -5.147043285304106e-02 +2108 2128 -2.296833469170511e-02 +2108 2129 3.967378200088001e-02 +2108 2130 -3.826530502172934e-03 +2108 2131 -2.623252505678690e-02 +2108 2132 2.983957599313234e-02 +2108 2133 -1.242564713429316e-02 +2109 2116 1.012997478615632e-01 +2109 2117 -2.866596804778883e-01 +2109 2118 4.009285655348384e-01 +2109 2119 1.003092729754152e+00 +2109 2120 4.718042883535921e-01 +2109 2121 -1.151051233747923e-01 +2109 2122 -1.533011412395509e-01 +2109 2123 -1.467336790749558e-02 +2109 2124 5.417647031984925e-02 +2109 2125 -6.347065826161911e-02 +2109 2126 1.413095968572883e-02 +2109 2127 1.016285359894895e-01 +2109 2128 4.361555150731782e-02 +2109 2129 -7.297122858953511e-02 +2109 2130 6.873636058250207e-03 +2109 2131 4.636253866511445e-02 +2109 2132 -5.220965998265751e-02 +2109 2133 2.163688115667714e-02 +2110 2116 -6.675829549002528e-02 +2110 2117 1.714825278878462e-01 +2110 2118 -1.763260094650470e-01 +2110 2119 -3.524913251505096e-02 +2110 2120 7.751613393474790e-01 +2110 2121 9.500818362211276e-01 +2110 2122 4.551820017945858e-01 +2110 2123 3.440881837090131e-02 +2110 2124 -1.173436103509271e-01 +2110 2125 1.582637096187321e-01 +2110 2126 -3.205658723744573e-02 +2110 2127 -2.040533508482650e-01 +2110 2128 -7.898266143120429e-02 +2110 2129 1.226433507083488e-01 +2110 2130 -1.098389774586880e-02 +2110 2131 -7.170870669864556e-02 +2110 2132 7.919894876867110e-02 +2110 2133 -3.252580339150374e-02 +2111 2116 4.654764921313230e-02 +2111 2117 -1.153084751520934e-01 +2111 2118 1.084975613502217e-01 +2111 2119 1.782365365320347e-02 +2111 2120 -2.253712020788738e-01 +2111 2121 1.833451203871435e-01 +2111 2122 7.871848513645289e-01 +2111 2123 9.980475420281738e-01 +2111 2124 9.659358568042323e-01 +2111 2125 9.659358568042320e-01 +2111 2126 9.980475420281736e-01 +2111 2127 7.871848513645292e-01 +2111 2128 1.833451203871434e-01 +2111 2129 -2.253712020788738e-01 +2111 2130 1.782365365320347e-02 +2111 2131 1.084975613502217e-01 +2111 2132 -1.153084751520934e-01 +2111 2133 4.654764921313230e-02 +2112 2116 -3.252580339150375e-02 +2112 2117 7.919894876867110e-02 +2112 2118 -7.170870669864558e-02 +2112 2119 -1.098389774586881e-02 +2112 2120 1.226433507083489e-01 +2112 2121 -7.898266143120435e-02 +2112 2122 -2.040533508482650e-01 +2112 2123 -3.205658723744574e-02 +2112 2124 1.582637096187322e-01 +2112 2125 -1.173436103509271e-01 +2112 2126 3.440881837090131e-02 +2112 2127 4.551820017945861e-01 +2112 2128 9.500818362211275e-01 +2112 2129 7.751613393474791e-01 +2112 2130 -3.524913251505098e-02 +2112 2131 -1.763260094650470e-01 +2112 2132 1.714825278878462e-01 +2112 2133 -6.675829549002529e-02 +2113 2116 2.163688115667714e-02 +2113 2117 -5.220965998265751e-02 +2113 2118 4.636253866511447e-02 +2113 2119 6.873636058250207e-03 +2113 2120 -7.297122858953514e-02 +2113 2121 4.361555150731784e-02 +2113 2122 1.016285359894895e-01 +2113 2123 1.413095968572884e-02 +2113 2124 -6.347065826161916e-02 +2113 2125 5.417647031984923e-02 +2113 2126 -1.467336790749558e-02 +2113 2127 -1.533011412395509e-01 +2113 2128 -1.151051233747923e-01 +2113 2129 4.718042883535921e-01 +2113 2130 1.003092729754152e+00 +2113 2131 4.009285655348384e-01 +2113 2132 -2.866596804778884e-01 +2113 2133 1.012997478615632e-01 +2114 2116 -1.242564713429316e-02 +2114 2117 2.983957599313233e-02 +2114 2118 -2.623252505678690e-02 +2114 2119 -3.826530502172932e-03 +2114 2120 3.967378200088001e-02 +2114 2121 -2.296833469170512e-02 +2114 2122 -5.147043285304104e-02 +2114 2123 -6.878577509575953e-03 +2114 2124 3.008346487896668e-02 +2114 2125 -2.675090448249389e-02 +2114 2126 7.073583005506205e-03 +2114 2127 6.969985820549054e-02 +2114 2128 4.603749937464054e-02 +2114 2129 -1.341009959651868e-01 +2114 2130 2.709112098464875e-02 +2114 2131 7.978124774257940e-01 +2114 2132 8.496052943251796e-01 +2114 2133 -1.833267155555124e-01 +2115 2116 4.056073820312835e-03 +2115 2117 -9.719999626669617e-03 +2115 2118 8.507818082536710e-03 +2115 2119 1.232479383922180e-03 +2115 2120 -1.265402077883358e-02 +2115 2121 7.233284760851675e-03 +2115 2122 1.597136003720089e-02 +2115 2123 2.104266184682774e-03 +2115 2124 -9.119197464263174e-03 +2115 2125 8.224868937523154e-03 +2115 2126 -2.156636620475577e-03 +2115 2127 -2.084168245043927e-02 +2115 2128 -1.325717275337946e-02 +2115 2129 3.581468700212909e-02 +2115 2130 -6.054059071083845e-03 +2115 2131 -8.784171983802572e-02 +2115 2132 3.337714682644796e-01 +2115 2133 1.121496109519649e+00 +2152 2161 1.121496109519649e+00 +2152 2162 3.337714682644795e-01 +2152 2163 -8.784171983802572e-02 +2152 2164 -6.054059071083844e-03 +2152 2165 3.581468700212909e-02 +2152 2166 -1.325717275337946e-02 +2152 2167 -2.084168245043926e-02 +2152 2168 -2.156636620475578e-03 +2152 2169 8.224868937523158e-03 +2152 2170 -9.119197464263170e-03 +2152 2171 2.104266184682774e-03 +2152 2172 1.597136003720089e-02 +2152 2173 7.233284760851673e-03 +2152 2174 -1.265402077883358e-02 +2152 2175 1.232479383922180e-03 +2152 2176 8.507818082536710e-03 +2152 2177 -9.719999626669619e-03 +2152 2178 4.056073820312835e-03 +2153 2161 -1.833267155555124e-01 +2153 2162 8.496052943251796e-01 +2153 2163 7.978124774257941e-01 +2153 2164 2.709112098464875e-02 +2153 2165 -1.341009959651868e-01 +2153 2166 4.603749937464056e-02 +2153 2167 6.969985820549053e-02 +2153 2168 7.073583005506207e-03 +2153 2169 -2.675090448249390e-02 +2153 2170 3.008346487896668e-02 +2153 2171 -6.878577509575953e-03 +2153 2172 -5.147043285304106e-02 +2153 2173 -2.296833469170511e-02 +2153 2174 3.967378200088001e-02 +2153 2175 -3.826530502172934e-03 +2153 2176 -2.623252505678690e-02 +2153 2177 2.983957599313234e-02 +2153 2178 -1.242564713429316e-02 +2154 2161 1.012997478615632e-01 +2154 2162 -2.866596804778883e-01 +2154 2163 4.009285655348384e-01 +2154 2164 1.003092729754152e+00 +2154 2165 4.718042883535921e-01 +2154 2166 -1.151051233747923e-01 +2154 2167 -1.533011412395509e-01 +2154 2168 -1.467336790749558e-02 +2154 2169 5.417647031984925e-02 +2154 2170 -6.347065826161911e-02 +2154 2171 1.413095968572883e-02 +2154 2172 1.016285359894895e-01 +2154 2173 4.361555150731782e-02 +2154 2174 -7.297122858953511e-02 +2154 2175 6.873636058250207e-03 +2154 2176 4.636253866511445e-02 +2154 2177 -5.220965998265751e-02 +2154 2178 2.163688115667714e-02 +2155 2161 -6.675829549002528e-02 +2155 2162 1.714825278878462e-01 +2155 2163 -1.763260094650470e-01 +2155 2164 -3.524913251505096e-02 +2155 2165 7.751613393474790e-01 +2155 2166 9.500818362211276e-01 +2155 2167 4.551820017945858e-01 +2155 2168 3.440881837090131e-02 +2155 2169 -1.173436103509271e-01 +2155 2170 1.582637096187321e-01 +2155 2171 -3.205658723744573e-02 +2155 2172 -2.040533508482650e-01 +2155 2173 -7.898266143120429e-02 +2155 2174 1.226433507083488e-01 +2155 2175 -1.098389774586880e-02 +2155 2176 -7.170870669864556e-02 +2155 2177 7.919894876867110e-02 +2155 2178 -3.252580339150374e-02 +2156 2161 4.654764921313230e-02 +2156 2162 -1.153084751520934e-01 +2156 2163 1.084975613502217e-01 +2156 2164 1.782365365320347e-02 +2156 2165 -2.253712020788738e-01 +2156 2166 1.833451203871435e-01 +2156 2167 7.871848513645289e-01 +2156 2168 9.980475420281738e-01 +2156 2169 9.659358568042323e-01 +2156 2170 9.659358568042320e-01 +2156 2171 9.980475420281736e-01 +2156 2172 7.871848513645292e-01 +2156 2173 1.833451203871434e-01 +2156 2174 -2.253712020788738e-01 +2156 2175 1.782365365320347e-02 +2156 2176 1.084975613502217e-01 +2156 2177 -1.153084751520934e-01 +2156 2178 4.654764921313230e-02 +2157 2161 -3.252580339150375e-02 +2157 2162 7.919894876867110e-02 +2157 2163 -7.170870669864558e-02 +2157 2164 -1.098389774586881e-02 +2157 2165 1.226433507083489e-01 +2157 2166 -7.898266143120435e-02 +2157 2167 -2.040533508482650e-01 +2157 2168 -3.205658723744574e-02 +2157 2169 1.582637096187322e-01 +2157 2170 -1.173436103509271e-01 +2157 2171 3.440881837090131e-02 +2157 2172 4.551820017945861e-01 +2157 2173 9.500818362211275e-01 +2157 2174 7.751613393474791e-01 +2157 2175 -3.524913251505098e-02 +2157 2176 -1.763260094650470e-01 +2157 2177 1.714825278878462e-01 +2157 2178 -6.675829549002529e-02 +2158 2161 2.163688115667714e-02 +2158 2162 -5.220965998265751e-02 +2158 2163 4.636253866511447e-02 +2158 2164 6.873636058250207e-03 +2158 2165 -7.297122858953514e-02 +2158 2166 4.361555150731784e-02 +2158 2167 1.016285359894895e-01 +2158 2168 1.413095968572884e-02 +2158 2169 -6.347065826161916e-02 +2158 2170 5.417647031984923e-02 +2158 2171 -1.467336790749558e-02 +2158 2172 -1.533011412395509e-01 +2158 2173 -1.151051233747923e-01 +2158 2174 4.718042883535921e-01 +2158 2175 1.003092729754152e+00 +2158 2176 4.009285655348384e-01 +2158 2177 -2.866596804778884e-01 +2158 2178 1.012997478615632e-01 +2159 2161 -1.242564713429316e-02 +2159 2162 2.983957599313233e-02 +2159 2163 -2.623252505678690e-02 +2159 2164 -3.826530502172932e-03 +2159 2165 3.967378200088001e-02 +2159 2166 -2.296833469170512e-02 +2159 2167 -5.147043285304104e-02 +2159 2168 -6.878577509575953e-03 +2159 2169 3.008346487896668e-02 +2159 2170 -2.675090448249389e-02 +2159 2171 7.073583005506205e-03 +2159 2172 6.969985820549054e-02 +2159 2173 4.603749937464054e-02 +2159 2174 -1.341009959651868e-01 +2159 2175 2.709112098464875e-02 +2159 2176 7.978124774257940e-01 +2159 2177 8.496052943251796e-01 +2159 2178 -1.833267155555124e-01 +2160 2161 4.056073820312835e-03 +2160 2162 -9.719999626669617e-03 +2160 2163 8.507818082536710e-03 +2160 2164 1.232479383922180e-03 +2160 2165 -1.265402077883358e-02 +2160 2166 7.233284760851675e-03 +2160 2167 1.597136003720089e-02 +2160 2168 2.104266184682774e-03 +2160 2169 -9.119197464263174e-03 +2160 2170 8.224868937523154e-03 +2160 2171 -2.156636620475577e-03 +2160 2172 -2.084168245043927e-02 +2160 2173 -1.325717275337946e-02 +2160 2174 3.581468700212909e-02 +2160 2175 -6.054059071083845e-03 +2160 2176 -8.784171983802572e-02 +2160 2177 3.337714682644796e-01 +2160 2178 1.121496109519649e+00 +2179 2188 1.121496109519649e+00 +2179 2189 3.337714682644795e-01 +2179 2190 -8.784171983802572e-02 +2179 2191 -6.054059071083844e-03 +2179 2192 3.581468700212909e-02 +2179 2193 -1.325717275337946e-02 +2179 2194 -2.084168245043926e-02 +2179 2195 -2.156636620475578e-03 +2179 2196 8.224868937523158e-03 +2179 2197 -9.119197464263170e-03 +2179 2198 2.104266184682774e-03 +2179 2199 1.597136003720089e-02 +2179 2200 7.233284760851673e-03 +2179 2201 -1.265402077883358e-02 +2179 2202 1.232479383922180e-03 +2179 2203 8.507818082536710e-03 +2179 2204 -9.719999626669619e-03 +2179 2205 4.056073820312835e-03 +2180 2188 -1.833267155555124e-01 +2180 2189 8.496052943251796e-01 +2180 2190 7.978124774257941e-01 +2180 2191 2.709112098464875e-02 +2180 2192 -1.341009959651868e-01 +2180 2193 4.603749937464056e-02 +2180 2194 6.969985820549053e-02 +2180 2195 7.073583005506207e-03 +2180 2196 -2.675090448249390e-02 +2180 2197 3.008346487896668e-02 +2180 2198 -6.878577509575953e-03 +2180 2199 -5.147043285304106e-02 +2180 2200 -2.296833469170511e-02 +2180 2201 3.967378200088001e-02 +2180 2202 -3.826530502172934e-03 +2180 2203 -2.623252505678690e-02 +2180 2204 2.983957599313234e-02 +2180 2205 -1.242564713429316e-02 +2181 2188 1.012997478615632e-01 +2181 2189 -2.866596804778883e-01 +2181 2190 4.009285655348384e-01 +2181 2191 1.003092729754152e+00 +2181 2192 4.718042883535921e-01 +2181 2193 -1.151051233747923e-01 +2181 2194 -1.533011412395509e-01 +2181 2195 -1.467336790749558e-02 +2181 2196 5.417647031984925e-02 +2181 2197 -6.347065826161911e-02 +2181 2198 1.413095968572883e-02 +2181 2199 1.016285359894895e-01 +2181 2200 4.361555150731782e-02 +2181 2201 -7.297122858953511e-02 +2181 2202 6.873636058250207e-03 +2181 2203 4.636253866511445e-02 +2181 2204 -5.220965998265751e-02 +2181 2205 2.163688115667714e-02 +2182 2188 -6.675829549002528e-02 +2182 2189 1.714825278878462e-01 +2182 2190 -1.763260094650470e-01 +2182 2191 -3.524913251505096e-02 +2182 2192 7.751613393474790e-01 +2182 2193 9.500818362211276e-01 +2182 2194 4.551820017945858e-01 +2182 2195 3.440881837090131e-02 +2182 2196 -1.173436103509271e-01 +2182 2197 1.582637096187321e-01 +2182 2198 -3.205658723744573e-02 +2182 2199 -2.040533508482650e-01 +2182 2200 -7.898266143120429e-02 +2182 2201 1.226433507083488e-01 +2182 2202 -1.098389774586880e-02 +2182 2203 -7.170870669864556e-02 +2182 2204 7.919894876867110e-02 +2182 2205 -3.252580339150374e-02 +2183 2188 4.654764921313230e-02 +2183 2189 -1.153084751520934e-01 +2183 2190 1.084975613502217e-01 +2183 2191 1.782365365320347e-02 +2183 2192 -2.253712020788738e-01 +2183 2193 1.833451203871435e-01 +2183 2194 7.871848513645289e-01 +2183 2195 9.980475420281738e-01 +2183 2196 9.659358568042323e-01 +2183 2197 9.659358568042320e-01 +2183 2198 9.980475420281736e-01 +2183 2199 7.871848513645292e-01 +2183 2200 1.833451203871434e-01 +2183 2201 -2.253712020788738e-01 +2183 2202 1.782365365320347e-02 +2183 2203 1.084975613502217e-01 +2183 2204 -1.153084751520934e-01 +2183 2205 4.654764921313230e-02 +2184 2188 -3.252580339150375e-02 +2184 2189 7.919894876867110e-02 +2184 2190 -7.170870669864558e-02 +2184 2191 -1.098389774586881e-02 +2184 2192 1.226433507083489e-01 +2184 2193 -7.898266143120435e-02 +2184 2194 -2.040533508482650e-01 +2184 2195 -3.205658723744574e-02 +2184 2196 1.582637096187322e-01 +2184 2197 -1.173436103509271e-01 +2184 2198 3.440881837090131e-02 +2184 2199 4.551820017945861e-01 +2184 2200 9.500818362211275e-01 +2184 2201 7.751613393474791e-01 +2184 2202 -3.524913251505098e-02 +2184 2203 -1.763260094650470e-01 +2184 2204 1.714825278878462e-01 +2184 2205 -6.675829549002529e-02 +2185 2188 2.163688115667714e-02 +2185 2189 -5.220965998265751e-02 +2185 2190 4.636253866511447e-02 +2185 2191 6.873636058250207e-03 +2185 2192 -7.297122858953514e-02 +2185 2193 4.361555150731784e-02 +2185 2194 1.016285359894895e-01 +2185 2195 1.413095968572884e-02 +2185 2196 -6.347065826161916e-02 +2185 2197 5.417647031984923e-02 +2185 2198 -1.467336790749558e-02 +2185 2199 -1.533011412395509e-01 +2185 2200 -1.151051233747923e-01 +2185 2201 4.718042883535921e-01 +2185 2202 1.003092729754152e+00 +2185 2203 4.009285655348384e-01 +2185 2204 -2.866596804778884e-01 +2185 2205 1.012997478615632e-01 +2186 2188 -1.242564713429316e-02 +2186 2189 2.983957599313233e-02 +2186 2190 -2.623252505678690e-02 +2186 2191 -3.826530502172932e-03 +2186 2192 3.967378200088001e-02 +2186 2193 -2.296833469170512e-02 +2186 2194 -5.147043285304104e-02 +2186 2195 -6.878577509575953e-03 +2186 2196 3.008346487896668e-02 +2186 2197 -2.675090448249389e-02 +2186 2198 7.073583005506205e-03 +2186 2199 6.969985820549054e-02 +2186 2200 4.603749937464054e-02 +2186 2201 -1.341009959651868e-01 +2186 2202 2.709112098464875e-02 +2186 2203 7.978124774257940e-01 +2186 2204 8.496052943251796e-01 +2186 2205 -1.833267155555124e-01 +2187 2188 4.056073820312835e-03 +2187 2189 -9.719999626669617e-03 +2187 2190 8.507818082536710e-03 +2187 2191 1.232479383922180e-03 +2187 2192 -1.265402077883358e-02 +2187 2193 7.233284760851675e-03 +2187 2194 1.597136003720089e-02 +2187 2195 2.104266184682774e-03 +2187 2196 -9.119197464263174e-03 +2187 2197 8.224868937523154e-03 +2187 2198 -2.156636620475577e-03 +2187 2199 -2.084168245043927e-02 +2187 2200 -1.325717275337946e-02 +2187 2201 3.581468700212909e-02 +2187 2202 -6.054059071083845e-03 +2187 2203 -8.784171983802572e-02 +2187 2204 3.337714682644796e-01 +2187 2205 1.121496109519649e+00 +2215 2224 1.121496109519649e+00 +2215 2225 3.337714682644795e-01 +2215 2226 -8.784171983802572e-02 +2215 2227 -6.054059071083844e-03 +2215 2228 3.581468700212909e-02 +2215 2229 -1.325717275337946e-02 +2215 2230 -2.084168245043926e-02 +2215 2231 -2.156636620475578e-03 +2215 2232 8.224868937523158e-03 +2215 2233 -9.119197464263170e-03 +2215 2234 2.104266184682774e-03 +2215 2235 1.597136003720089e-02 +2215 2236 7.233284760851673e-03 +2215 2237 -1.265402077883358e-02 +2215 2238 1.232479383922180e-03 +2215 2239 8.507818082536710e-03 +2215 2240 -9.719999626669619e-03 +2215 2241 4.056073820312835e-03 +2216 2224 -1.833267155555124e-01 +2216 2225 8.496052943251796e-01 +2216 2226 7.978124774257941e-01 +2216 2227 2.709112098464875e-02 +2216 2228 -1.341009959651868e-01 +2216 2229 4.603749937464056e-02 +2216 2230 6.969985820549053e-02 +2216 2231 7.073583005506207e-03 +2216 2232 -2.675090448249390e-02 +2216 2233 3.008346487896668e-02 +2216 2234 -6.878577509575953e-03 +2216 2235 -5.147043285304106e-02 +2216 2236 -2.296833469170511e-02 +2216 2237 3.967378200088001e-02 +2216 2238 -3.826530502172934e-03 +2216 2239 -2.623252505678690e-02 +2216 2240 2.983957599313234e-02 +2216 2241 -1.242564713429316e-02 +2217 2224 1.012997478615632e-01 +2217 2225 -2.866596804778883e-01 +2217 2226 4.009285655348384e-01 +2217 2227 1.003092729754152e+00 +2217 2228 4.718042883535921e-01 +2217 2229 -1.151051233747923e-01 +2217 2230 -1.533011412395509e-01 +2217 2231 -1.467336790749558e-02 +2217 2232 5.417647031984925e-02 +2217 2233 -6.347065826161911e-02 +2217 2234 1.413095968572883e-02 +2217 2235 1.016285359894895e-01 +2217 2236 4.361555150731782e-02 +2217 2237 -7.297122858953511e-02 +2217 2238 6.873636058250207e-03 +2217 2239 4.636253866511445e-02 +2217 2240 -5.220965998265751e-02 +2217 2241 2.163688115667714e-02 +2218 2224 -6.675829549002528e-02 +2218 2225 1.714825278878462e-01 +2218 2226 -1.763260094650470e-01 +2218 2227 -3.524913251505096e-02 +2218 2228 7.751613393474790e-01 +2218 2229 9.500818362211276e-01 +2218 2230 4.551820017945858e-01 +2218 2231 3.440881837090131e-02 +2218 2232 -1.173436103509271e-01 +2218 2233 1.582637096187321e-01 +2218 2234 -3.205658723744573e-02 +2218 2235 -2.040533508482650e-01 +2218 2236 -7.898266143120429e-02 +2218 2237 1.226433507083488e-01 +2218 2238 -1.098389774586880e-02 +2218 2239 -7.170870669864556e-02 +2218 2240 7.919894876867110e-02 +2218 2241 -3.252580339150374e-02 +2219 2224 4.654764921313230e-02 +2219 2225 -1.153084751520934e-01 +2219 2226 1.084975613502217e-01 +2219 2227 1.782365365320347e-02 +2219 2228 -2.253712020788738e-01 +2219 2229 1.833451203871435e-01 +2219 2230 7.871848513645289e-01 +2219 2231 9.980475420281738e-01 +2219 2232 9.659358568042323e-01 +2219 2233 9.659358568042320e-01 +2219 2234 9.980475420281736e-01 +2219 2235 7.871848513645292e-01 +2219 2236 1.833451203871434e-01 +2219 2237 -2.253712020788738e-01 +2219 2238 1.782365365320347e-02 +2219 2239 1.084975613502217e-01 +2219 2240 -1.153084751520934e-01 +2219 2241 4.654764921313230e-02 +2220 2224 -3.252580339150375e-02 +2220 2225 7.919894876867110e-02 +2220 2226 -7.170870669864558e-02 +2220 2227 -1.098389774586881e-02 +2220 2228 1.226433507083489e-01 +2220 2229 -7.898266143120435e-02 +2220 2230 -2.040533508482650e-01 +2220 2231 -3.205658723744574e-02 +2220 2232 1.582637096187322e-01 +2220 2233 -1.173436103509271e-01 +2220 2234 3.440881837090131e-02 +2220 2235 4.551820017945861e-01 +2220 2236 9.500818362211275e-01 +2220 2237 7.751613393474791e-01 +2220 2238 -3.524913251505098e-02 +2220 2239 -1.763260094650470e-01 +2220 2240 1.714825278878462e-01 +2220 2241 -6.675829549002529e-02 +2221 2224 2.163688115667714e-02 +2221 2225 -5.220965998265751e-02 +2221 2226 4.636253866511447e-02 +2221 2227 6.873636058250207e-03 +2221 2228 -7.297122858953514e-02 +2221 2229 4.361555150731784e-02 +2221 2230 1.016285359894895e-01 +2221 2231 1.413095968572884e-02 +2221 2232 -6.347065826161916e-02 +2221 2233 5.417647031984923e-02 +2221 2234 -1.467336790749558e-02 +2221 2235 -1.533011412395509e-01 +2221 2236 -1.151051233747923e-01 +2221 2237 4.718042883535921e-01 +2221 2238 1.003092729754152e+00 +2221 2239 4.009285655348384e-01 +2221 2240 -2.866596804778884e-01 +2221 2241 1.012997478615632e-01 +2222 2224 -1.242564713429316e-02 +2222 2225 2.983957599313233e-02 +2222 2226 -2.623252505678690e-02 +2222 2227 -3.826530502172932e-03 +2222 2228 3.967378200088001e-02 +2222 2229 -2.296833469170512e-02 +2222 2230 -5.147043285304104e-02 +2222 2231 -6.878577509575953e-03 +2222 2232 3.008346487896668e-02 +2222 2233 -2.675090448249389e-02 +2222 2234 7.073583005506205e-03 +2222 2235 6.969985820549054e-02 +2222 2236 4.603749937464054e-02 +2222 2237 -1.341009959651868e-01 +2222 2238 2.709112098464875e-02 +2222 2239 7.978124774257940e-01 +2222 2240 8.496052943251796e-01 +2222 2241 -1.833267155555124e-01 +2223 2224 4.056073820312835e-03 +2223 2225 -9.719999626669617e-03 +2223 2226 8.507818082536710e-03 +2223 2227 1.232479383922180e-03 +2223 2228 -1.265402077883358e-02 +2223 2229 7.233284760851675e-03 +2223 2230 1.597136003720089e-02 +2223 2231 2.104266184682774e-03 +2223 2232 -9.119197464263174e-03 +2223 2233 8.224868937523154e-03 +2223 2234 -2.156636620475577e-03 +2223 2235 -2.084168245043927e-02 +2223 2236 -1.325717275337946e-02 +2223 2237 3.581468700212909e-02 +2223 2238 -6.054059071083845e-03 +2223 2239 -8.784171983802572e-02 +2223 2240 3.337714682644796e-01 +2223 2241 1.121496109519649e+00 +2242 2251 1.121496109519649e+00 +2242 2252 3.337714682644795e-01 +2242 2253 -8.784171983802572e-02 +2242 2254 -6.054059071083844e-03 +2242 2255 3.581468700212909e-02 +2242 2256 -1.325717275337946e-02 +2242 2257 -2.084168245043926e-02 +2242 2258 -2.156636620475578e-03 +2242 2259 8.224868937523158e-03 +2242 2260 -9.119197464263170e-03 +2242 2261 2.104266184682774e-03 +2242 2262 1.597136003720089e-02 +2242 2263 7.233284760851673e-03 +2242 2264 -1.265402077883358e-02 +2242 2265 1.232479383922180e-03 +2242 2266 8.507818082536710e-03 +2242 2267 -9.719999626669619e-03 +2242 2268 4.056073820312835e-03 +2243 2251 -1.833267155555124e-01 +2243 2252 8.496052943251796e-01 +2243 2253 7.978124774257941e-01 +2243 2254 2.709112098464875e-02 +2243 2255 -1.341009959651868e-01 +2243 2256 4.603749937464056e-02 +2243 2257 6.969985820549053e-02 +2243 2258 7.073583005506207e-03 +2243 2259 -2.675090448249390e-02 +2243 2260 3.008346487896668e-02 +2243 2261 -6.878577509575953e-03 +2243 2262 -5.147043285304106e-02 +2243 2263 -2.296833469170511e-02 +2243 2264 3.967378200088001e-02 +2243 2265 -3.826530502172934e-03 +2243 2266 -2.623252505678690e-02 +2243 2267 2.983957599313234e-02 +2243 2268 -1.242564713429316e-02 +2244 2251 1.012997478615632e-01 +2244 2252 -2.866596804778883e-01 +2244 2253 4.009285655348384e-01 +2244 2254 1.003092729754152e+00 +2244 2255 4.718042883535921e-01 +2244 2256 -1.151051233747923e-01 +2244 2257 -1.533011412395509e-01 +2244 2258 -1.467336790749558e-02 +2244 2259 5.417647031984925e-02 +2244 2260 -6.347065826161911e-02 +2244 2261 1.413095968572883e-02 +2244 2262 1.016285359894895e-01 +2244 2263 4.361555150731782e-02 +2244 2264 -7.297122858953511e-02 +2244 2265 6.873636058250207e-03 +2244 2266 4.636253866511445e-02 +2244 2267 -5.220965998265751e-02 +2244 2268 2.163688115667714e-02 +2245 2251 -6.675829549002528e-02 +2245 2252 1.714825278878462e-01 +2245 2253 -1.763260094650470e-01 +2245 2254 -3.524913251505096e-02 +2245 2255 7.751613393474790e-01 +2245 2256 9.500818362211276e-01 +2245 2257 4.551820017945858e-01 +2245 2258 3.440881837090131e-02 +2245 2259 -1.173436103509271e-01 +2245 2260 1.582637096187321e-01 +2245 2261 -3.205658723744573e-02 +2245 2262 -2.040533508482650e-01 +2245 2263 -7.898266143120429e-02 +2245 2264 1.226433507083488e-01 +2245 2265 -1.098389774586880e-02 +2245 2266 -7.170870669864556e-02 +2245 2267 7.919894876867110e-02 +2245 2268 -3.252580339150374e-02 +2246 2251 4.654764921313230e-02 +2246 2252 -1.153084751520934e-01 +2246 2253 1.084975613502217e-01 +2246 2254 1.782365365320347e-02 +2246 2255 -2.253712020788738e-01 +2246 2256 1.833451203871435e-01 +2246 2257 7.871848513645289e-01 +2246 2258 9.980475420281738e-01 +2246 2259 9.659358568042323e-01 +2246 2260 9.659358568042320e-01 +2246 2261 9.980475420281736e-01 +2246 2262 7.871848513645292e-01 +2246 2263 1.833451203871434e-01 +2246 2264 -2.253712020788738e-01 +2246 2265 1.782365365320347e-02 +2246 2266 1.084975613502217e-01 +2246 2267 -1.153084751520934e-01 +2246 2268 4.654764921313230e-02 +2247 2251 -3.252580339150375e-02 +2247 2252 7.919894876867110e-02 +2247 2253 -7.170870669864558e-02 +2247 2254 -1.098389774586881e-02 +2247 2255 1.226433507083489e-01 +2247 2256 -7.898266143120435e-02 +2247 2257 -2.040533508482650e-01 +2247 2258 -3.205658723744574e-02 +2247 2259 1.582637096187322e-01 +2247 2260 -1.173436103509271e-01 +2247 2261 3.440881837090131e-02 +2247 2262 4.551820017945861e-01 +2247 2263 9.500818362211275e-01 +2247 2264 7.751613393474791e-01 +2247 2265 -3.524913251505098e-02 +2247 2266 -1.763260094650470e-01 +2247 2267 1.714825278878462e-01 +2247 2268 -6.675829549002529e-02 +2248 2251 2.163688115667714e-02 +2248 2252 -5.220965998265751e-02 +2248 2253 4.636253866511447e-02 +2248 2254 6.873636058250207e-03 +2248 2255 -7.297122858953514e-02 +2248 2256 4.361555150731784e-02 +2248 2257 1.016285359894895e-01 +2248 2258 1.413095968572884e-02 +2248 2259 -6.347065826161916e-02 +2248 2260 5.417647031984923e-02 +2248 2261 -1.467336790749558e-02 +2248 2262 -1.533011412395509e-01 +2248 2263 -1.151051233747923e-01 +2248 2264 4.718042883535921e-01 +2248 2265 1.003092729754152e+00 +2248 2266 4.009285655348384e-01 +2248 2267 -2.866596804778884e-01 +2248 2268 1.012997478615632e-01 +2249 2251 -1.242564713429316e-02 +2249 2252 2.983957599313233e-02 +2249 2253 -2.623252505678690e-02 +2249 2254 -3.826530502172932e-03 +2249 2255 3.967378200088001e-02 +2249 2256 -2.296833469170512e-02 +2249 2257 -5.147043285304104e-02 +2249 2258 -6.878577509575953e-03 +2249 2259 3.008346487896668e-02 +2249 2260 -2.675090448249389e-02 +2249 2261 7.073583005506205e-03 +2249 2262 6.969985820549054e-02 +2249 2263 4.603749937464054e-02 +2249 2264 -1.341009959651868e-01 +2249 2265 2.709112098464875e-02 +2249 2266 7.978124774257940e-01 +2249 2267 8.496052943251796e-01 +2249 2268 -1.833267155555124e-01 +2250 2251 4.056073820312835e-03 +2250 2252 -9.719999626669617e-03 +2250 2253 8.507818082536710e-03 +2250 2254 1.232479383922180e-03 +2250 2255 -1.265402077883358e-02 +2250 2256 7.233284760851675e-03 +2250 2257 1.597136003720089e-02 +2250 2258 2.104266184682774e-03 +2250 2259 -9.119197464263174e-03 +2250 2260 8.224868937523154e-03 +2250 2261 -2.156636620475577e-03 +2250 2262 -2.084168245043927e-02 +2250 2263 -1.325717275337946e-02 +2250 2264 3.581468700212909e-02 +2250 2265 -6.054059071083845e-03 +2250 2266 -8.784171983802572e-02 +2250 2267 3.337714682644796e-01 +2250 2268 1.121496109519649e+00 From 77a45dd9856da83f343186974e351e279e608328 Mon Sep 17 00:00:00 2001 From: rstumin Date: Fri, 22 Oct 2021 00:23:18 -0600 Subject: [PATCH 59/98] one more casting fix --- .../src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp index 4d2d1d67fb9d..84ff4905b2d4 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_SaPFactory_def.hpp @@ -633,7 +633,7 @@ namespace MueLu { while ((Teuchos::ScalarTraits::magnitude(rowSumDeviation) > Teuchos::ScalarTraits::magnitude(as(1.e-10)*rsumTarget))){ // && ( (closestToLeftBound < nEntries ) || (closestToRghtBound < nEntries))) { if (closestToRghtBound != closestToLeftBound) - delta = rowSumDeviation/ (closestToRghtBound - closestToLeftBound); + delta = rowSumDeviation/ as(closestToRghtBound - closestToLeftBound); else delta = aBigNumber; if (Teuchos::ScalarTraits::magnitude(closestToLeftBoundDist) <= Teuchos::ScalarTraits::magnitude(closestToRghtBoundDist)) { From 511cf50efc9320939f0725713ef20bb305ad3f00 Mon Sep 17 00:00:00 2001 From: Steve Skutnik Date: Fri, 22 Oct 2021 16:45:27 -0400 Subject: [PATCH 60/98] ML: Fix socket references for Windows builds --- packages/ml/src/CMakeLists.txt | 4 ++++ packages/ml/src/MLAPI/MLAPI_Workspace.cpp | 4 ++++ packages/ml/src/Utils/ml_epetra_utils.cpp | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/ml/src/CMakeLists.txt b/packages/ml/src/CMakeLists.txt index 122c357215dd..4201ff7553ce 100644 --- a/packages/ml/src/CMakeLists.txt +++ b/packages/ml/src/CMakeLists.txt @@ -329,3 +329,7 @@ TRIBITS_ADD_LIBRARY( HEADERS ${HEADERS} SOURCES ${SOURCES} ) + +if (WIN32) + target_link_libraries (ml PUBLIC ws2_32) +endif () diff --git a/packages/ml/src/MLAPI/MLAPI_Workspace.cpp b/packages/ml/src/MLAPI/MLAPI_Workspace.cpp index adea81e4e75d..f58e7dda54da 100644 --- a/packages/ml/src/MLAPI/MLAPI_Workspace.cpp +++ b/packages/ml/src/MLAPI/MLAPI_Workspace.cpp @@ -16,6 +16,10 @@ #ifdef _MSC_VER #include "winprocess.h" #endif +#include +#ifdef _WIN32 +#include +#endif namespace MLAPI { diff --git a/packages/ml/src/Utils/ml_epetra_utils.cpp b/packages/ml/src/Utils/ml_epetra_utils.cpp index 34fab14d69da..70f81f7ef76f 100644 --- a/packages/ml/src/Utils/ml_epetra_utils.cpp +++ b/packages/ml/src/Utils/ml_epetra_utils.cpp @@ -43,6 +43,10 @@ #ifdef _MSC_VER # include "winprocess.h" #endif +#include +#ifdef _WIN32 +#include +#endif #ifdef HAVE_ML_TEUCHOS using namespace Teuchos; @@ -52,7 +56,6 @@ using namespace Teuchos; #include "EpetraExt_MatrixMatrix.h" #endif - // ====================================================================== typedef struct { From 71a927685106eaa07e3f68d49c4e46e2ad10e56e Mon Sep 17 00:00:00 2001 From: Steve Skutnik Date: Fri, 22 Oct 2021 12:08:33 -0400 Subject: [PATCH 61/98] Fix TeuchosParameterlist Windows build configuration Corrects an error in the target_link_libraries macro for TeuchosParameterlist such that it can correctly target the Windows socket library (ws2_w32.a) --- packages/teuchos/parameterlist/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/teuchos/parameterlist/src/CMakeLists.txt b/packages/teuchos/parameterlist/src/CMakeLists.txt index 2374fe597f79..e5db66fa4013 100644 --- a/packages/teuchos/parameterlist/src/CMakeLists.txt +++ b/packages/teuchos/parameterlist/src/CMakeLists.txt @@ -25,5 +25,5 @@ TRIBITS_ADD_LIBRARY( ) if (WIN32) - target_link_libraries (teuchosparameterlist ws2_32) + target_link_libraries (teuchosparameterlist PUBLIC ws2_32) endif () From d3a9411ad1ccdaa4a87de7ddd042f9d0025fcbed Mon Sep 17 00:00:00 2001 From: Steve Skutnik Date: Fri, 22 Oct 2021 16:53:44 -0400 Subject: [PATCH 62/98] Fix invalid enum reference for Thyra SpmdVectorDefaultBase --- .../adapter_support/Thyra_SpmdVectorDefaultBase_def.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/thyra/core/src/support/operator_vector/adapter_support/Thyra_SpmdVectorDefaultBase_def.hpp b/packages/thyra/core/src/support/operator_vector/adapter_support/Thyra_SpmdVectorDefaultBase_def.hpp index 3213c3a961ec..560f819c4228 100644 --- a/packages/thyra/core/src/support/operator_vector/adapter_support/Thyra_SpmdVectorDefaultBase_def.hpp +++ b/packages/thyra/core/src/support/operator_vector/adapter_support/Thyra_SpmdVectorDefaultBase_def.hpp @@ -57,7 +57,7 @@ #include "Teuchos_Assert.hpp" #include "Teuchos_dyn_cast.hpp" #include "Teuchos_Assert.hpp" - +#include "Teuchos_Range1D.hpp" namespace Thyra { @@ -200,7 +200,7 @@ void SpmdVectorDefaultBase::acquireDetachedVectorViewImpl( #ifdef THYRA_DEBUG TEUCHOS_ASSERT(sub_vec); #endif - if( rng_in == Range1D::Invalid ) { + if( rng_in == Range1D::INVALID ) { // Just return an null view *sub_vec = RTOpPack::ConstSubVectorView(); return; @@ -270,7 +270,7 @@ void SpmdVectorDefaultBase::acquireNonconstDetachedVectorViewImpl( #ifdef THYRA_DEBUG TEUCHOS_ASSERT(sub_vec); #endif - if( rng_in == Range1D::Invalid ) { + if( rng_in == Range1D::INVALID ) { // Just return an null view *sub_vec = RTOpPack::SubVectorView(); return; From d02666c64de6819d0e0faa049db907fe82494852 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Fri, 22 Oct 2021 16:29:53 -0600 Subject: [PATCH 63/98] shylubasker: remove deprecated code --- packages/shylu/shylu_node/basker/src/shylubasker_def.hpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp b/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp index b5f973fb1248..8a2da3fd7c5a 100644 --- a/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp +++ b/packages/shylu/shylu_node/basker/src/shylubasker_def.hpp @@ -2202,11 +2202,7 @@ namespace BaskerNS //Next test if Kokkos has that many threads! //This is a common mistake in mpi-based apps #ifdef KOKKOS_ENABLE_OPENMP - #ifdef KOKKOS_ENABLE_DEPRECATED_CODE - int check_value = Kokkos::OpenMP::max_hardware_threads(); - #else int check_value = Kokkos::OpenMP::impl_max_hardware_threads(); - #endif if(nthreads > check_value) { BASKER_ASSERT(0==1, "Basker SetThreads Assert: Number of thread not available"); From 06d8083a598f714c7cab35bb02203b0a1dfbddfc Mon Sep 17 00:00:00 2001 From: Jennifer Loe Date: Mon, 25 Oct 2021 08:43:33 -0600 Subject: [PATCH 64/98] Belos: Kokkos solvers adapter (#9827) * Added Belos-Kokkos Adapter and tests. --- packages/belos/CMakeLists.txt | 4 + packages/belos/cmake/Belos_config.h.in | 3 + packages/belos/cmake/Dependencies.cmake | 2 +- packages/belos/kokkos/CMakeLists.txt | 4 + .../kokkos/example/BlockCGKokkosExFile.cpp | 215 + .../kokkos/example/BlockGmresKokkosExFile.cpp | 223 + packages/belos/kokkos/example/CMakeLists.txt | 23 + packages/belos/kokkos/example/bcsstk12.mtx | 17874 ++++++++++++++++ .../belos/kokkos/src/BelosKokkosAdapter.hpp | 686 + packages/belos/kokkos/src/CMakeLists.txt | 39 + .../kokkos/test/BelosKokkosMVOPTester.hpp | 1610 ++ packages/belos/kokkos/test/CMakeLists.txt | 8 + packages/belos/kokkos/test/KokkosMVOPTest.cpp | 553 + 13 files changed, 21243 insertions(+), 1 deletion(-) create mode 100644 packages/belos/kokkos/CMakeLists.txt create mode 100644 packages/belos/kokkos/example/BlockCGKokkosExFile.cpp create mode 100644 packages/belos/kokkos/example/BlockGmresKokkosExFile.cpp create mode 100644 packages/belos/kokkos/example/CMakeLists.txt create mode 100644 packages/belos/kokkos/example/bcsstk12.mtx create mode 100644 packages/belos/kokkos/src/BelosKokkosAdapter.hpp create mode 100644 packages/belos/kokkos/src/CMakeLists.txt create mode 100644 packages/belos/kokkos/test/BelosKokkosMVOPTester.hpp create mode 100644 packages/belos/kokkos/test/CMakeLists.txt create mode 100644 packages/belos/kokkos/test/KokkosMVOPTest.cpp diff --git a/packages/belos/CMakeLists.txt b/packages/belos/CMakeLists.txt index 3f82f7e5de80..1e6b02c137dc 100644 --- a/packages/belos/CMakeLists.txt +++ b/packages/belos/CMakeLists.txt @@ -112,6 +112,10 @@ IF (Belos_ENABLE_Tpetra) ADD_SUBDIRECTORY(tpetra) ENDIF() +IF (Belos_ENABLE_KokkosKernels) + ADD_SUBDIRECTORY(kokkos) +ENDIF() + IF (Belos_ENABLE_Xpetra) ADD_SUBDIRECTORY(xpetra) ENDIF() diff --git a/packages/belos/cmake/Belos_config.h.in b/packages/belos/cmake/Belos_config.h.in index 58033a25f870..a0e404b5ff0c 100644 --- a/packages/belos/cmake/Belos_config.h.in +++ b/packages/belos/cmake/Belos_config.h.in @@ -13,6 +13,9 @@ /* Define if want to build with EpetraExt enabled */ #cmakedefine HAVE_BELOS_EPETRAEXT +/* Define if want to build with KokkosKernels enabled */ +#cmakedefine HAVE_BELOS_KOKKOSKERNELS + /* Define if want to build with ML enabled */ #cmakedefine HAVE_BELOS_ML diff --git a/packages/belos/cmake/Dependencies.cmake b/packages/belos/cmake/Dependencies.cmake index 532176ceebff..ea5f6a8a3df6 100644 --- a/packages/belos/cmake/Dependencies.cmake +++ b/packages/belos/cmake/Dependencies.cmake @@ -1,5 +1,5 @@ SET(LIB_REQUIRED_DEP_PACKAGES Teuchos) -SET(LIB_OPTIONAL_DEP_PACKAGES Epetra Tpetra Xpetra Thyra AztecOO Triutils) +SET(LIB_OPTIONAL_DEP_PACKAGES Epetra Tpetra Xpetra Thyra AztecOO Triutils KokkosKernels) SET(TEST_REQUIRED_DEP_PACKAGES) SET(TEST_OPTIONAL_DEP_PACKAGES Galeri Triutils EpetraExt Ifpack ML AztecOO) SET(LIB_REQUIRED_DEP_TPLS) diff --git a/packages/belos/kokkos/CMakeLists.txt b/packages/belos/kokkos/CMakeLists.txt new file mode 100644 index 000000000000..635ad11fded6 --- /dev/null +++ b/packages/belos/kokkos/CMakeLists.txt @@ -0,0 +1,4 @@ +ADD_SUBDIRECTORY(src) + +TRIBITS_ADD_TEST_DIRECTORIES(test) +TRIBITS_ADD_EXAMPLE_DIRECTORIES(example) diff --git a/packages/belos/kokkos/example/BlockCGKokkosExFile.cpp b/packages/belos/kokkos/example/BlockCGKokkosExFile.cpp new file mode 100644 index 000000000000..47f7887ee3b4 --- /dev/null +++ b/packages/belos/kokkos/example/BlockCGKokkosExFile.cpp @@ -0,0 +1,215 @@ +//@HEADER +// ************************************************************************ +// +// Belos: Block Linear Solvers Package +// Copyright 2004 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +//@HEADER +// +// This driver reads a problem from a file, which must be in Matrix Market (*.mtx). +// The problem right-hand side will be generated randomly. +// +// NOTE: No preconditioner is used in this example. +// +#include "BelosConfigDefs.hpp" +#include "BelosLinearProblem.hpp" +#include "BelosBlockCGSolMgr.hpp" +#include "BelosOutputManager.hpp" + +#include "Teuchos_CommandLineProcessor.hpp" +#include "Teuchos_ParameterList.hpp" +#include "Teuchos_StandardCatchMacros.hpp" + +#include "BelosKokkosAdapter.hpp" +#include "KokkosKernels_IOUtils.hpp" +#ifdef HAVE_MPI + #include +#endif + +int main(int argc, char *argv[]) { + +#ifdef HAVE_MPI + MPI_Init(&argc,&argv); +#endif + +bool success = true; + Kokkos::initialize(); + { + + typedef double ST; + typedef int OT; + typedef Kokkos::DefaultExecutionSpace EXSP; + typedef Teuchos::ScalarTraits SCT; + typedef SCT::magnitudeType MT; + typedef Belos::KokkosMultiVec MV; + typedef Belos::KokkosCrsOperator OP; + typedef Belos::MultiVec KMV; + typedef Belos::Operator KOP; + typedef Belos::MultiVecTraits MVT; + typedef Belos::OperatorTraits OPT; + + using Teuchos::ParameterList; + using Teuchos::RCP; + using Teuchos::rcp; + using Teuchos::rcpFromRef; + +bool verbose = true; +try { + int frequency = 25; // frequency of status test output. + int numrhs = 1; // number of right-hand sides to solve for + int maxiters = -1; // maximum number of iterations allowed per linear system + bool expresidual = false; // use explicit residual + std::string filename("bcsstk12.mtx"); // example matrix + MT tol = 1.0e-5; // relative residual tolerance + + Teuchos::CommandLineProcessor cmdp(false,true); + cmdp.setOption("verbose","quiet",&verbose,"Print messages and results."); + cmdp.setOption("expres","impres",&expresidual,"Use explicit residual throughout."); + cmdp.setOption("frequency",&frequency,"Solvers frequency for printing residuals (#iters)."); + cmdp.setOption("filename",&filename,"Filename for test matrix. Acceptable file extensions: *.hb,*.mtx,*.triU,*.triS"); + cmdp.setOption("tol",&tol,"Relative residual tolerance used by Gmres solver."); + cmdp.setOption("num-rhs",&numrhs,"Number of right-hand sides to be solved for."); + cmdp.setOption("max-iters",&maxiters,"Maximum number of iterations per linear system (-1 = adapted to problem/block size)."); + + if (cmdp.parse(argc,argv) != Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL) { + return -1; + } + if (!verbose) + frequency = -1; // reset frequency if test is not verbose + + // Read in a matrix Market file and use it to test the Kokkos Operator. + KokkosSparse::CrsMatrix crsMat = + KokkosKernels::Impl::read_kokkos_crst_matrix>(filename.c_str()); + RCP> A = + rcp(new Belos::KokkosCrsOperator(crsMat)); + OT numRows = crsMat.numRows(); + + Teuchos::RCP X = Teuchos::rcp( new MV(numRows, numrhs) ); + X->MvRandom(); + Teuchos::RCP B = Teuchos::rcp( new MV(numRows, numrhs) ); + OPT::Apply(*A,*X,*B); + X->MvInit(0.0); + + // + // ********Other information used by block solver*********** + // *****************(can be user specified)****************** + // + const int NumGlobalElements = B->GetGlobalLength(); + if (maxiters == -1) + maxiters = NumGlobalElements - 1; // maximum number of iterations to run + + ParameterList belosList; + belosList.set( "Maximum Iterations", maxiters ); // Maximum number of iterations allowed + belosList.set( "Convergence Tolerance", tol ); // Relative convergence tolerance requested + belosList.set( "Explicit Residual Test", expresidual); // use explicit residual + + if (verbose) { + belosList.set( "Verbosity", Belos::Errors + Belos::Warnings + + Belos::StatusTestDetails + Belos::FinalSummary + Belos::TimingDetails); + if (frequency > 0) + belosList.set( "Output Frequency", frequency ); + } + else + belosList.set( "Verbosity", Belos::Errors + Belos::Warnings ); + + // + // Construct an unpreconditioned linear problem instance. + // + Belos::LinearProblem problem( A, X, B ); + bool set = problem.setProblem(); + if (set == false) { + std::cout << std::endl << "ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl; + return -1; + } + // + // ******************************************************************* + // **************Start the block CG iteration************************* + // ******************************************************************* + // + // Create an iterative solver manager. + RCP< Belos::SolverManager > newSolver + = rcp( new Belos::BlockCGSolMgr(rcpFromRef(problem), rcpFromRef(belosList)) ); + + // + // **********Print out information about problem******************* + // + std::cout << std::endl << std::endl; + std::cout << "Dimension of matrix: " << NumGlobalElements << std::endl; + std::cout << "Number of right-hand sides: " << numrhs << std::endl; + std::cout << "Max number of Gmres iterations: " << maxiters << std::endl; + std::cout << "Relative residual tolerance: " << tol << std::endl; + std::cout << std::endl; + // + // Perform solve + // + Belos::ReturnType ret; + ret = newSolver->solve(); + + // + // Compute actual residuals. + // + bool badRes = false; + std::vector actual_resids( numrhs ); + std::vector rhs_norm( numrhs ); + MV resid(numRows, numrhs); + OPT::Apply( *A, *X, resid ); + MVT::MvAddMv( -1.0, resid, 1.0, *B, resid ); + MVT::MvNorm( resid, actual_resids ); + MVT::MvNorm( *B, rhs_norm ); + std::cout<< "---------- Actual Residuals (normalized) ----------"< tol) badRes = true; + } + + if (ret!=Belos::Converged || badRes) { + success = false; + std::cout << std::endl << "ERROR: Belos did not converge!" << std::endl; + } else { + success = true; + std::cout << std::endl << "SUCCESS: Belos converged!" << std::endl; + } + + } + TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success); + } + Kokkos::finalize(); +#ifdef HAVE_MPI + MPI_Finalize(); +#endif + return success ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/packages/belos/kokkos/example/BlockGmresKokkosExFile.cpp b/packages/belos/kokkos/example/BlockGmresKokkosExFile.cpp new file mode 100644 index 000000000000..0b7a969128a5 --- /dev/null +++ b/packages/belos/kokkos/example/BlockGmresKokkosExFile.cpp @@ -0,0 +1,223 @@ +//@HEADER +// ************************************************************************ +// +// Belos: Block Linear Solvers Package +// Copyright 2004 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +//@HEADER +// +// This driver reads a problem from a file, which must be in Matrix Market (*.mtx). +// The problem right-hand side will be generated randomly. +// +// NOTE: No preconditioner is used in this example. +// +#include "BelosConfigDefs.hpp" +#include "BelosLinearProblem.hpp" +#include "BelosBlockGmresSolMgr.hpp" +#include "BelosOutputManager.hpp" + +#include "Teuchos_CommandLineProcessor.hpp" +#include "Teuchos_ParameterList.hpp" +#include "Teuchos_StandardCatchMacros.hpp" + +#include "BelosKokkosAdapter.hpp" +#include "KokkosKernels_IOUtils.hpp" +#ifdef HAVE_MPI + #include +#endif + +int main(int argc, char *argv[]) { + +#ifdef HAVE_MPI + MPI_Init(&argc,&argv); +#endif + +bool success = true; + Kokkos::initialize(); + { + + typedef double ST; + typedef int OT; + typedef Kokkos::DefaultExecutionSpace EXSP; + typedef Teuchos::ScalarTraits SCT; + typedef SCT::magnitudeType MT; + typedef Belos::KokkosMultiVec MV; + typedef Belos::KokkosCrsOperator OP; + typedef Belos::MultiVec KMV; + typedef Belos::Operator KOP; + typedef Belos::MultiVecTraits MVT; + typedef Belos::OperatorTraits OPT; + + using Teuchos::ParameterList; + using Teuchos::RCP; + using Teuchos::rcp; + using Teuchos::rcpFromRef; + +bool verbose = true; +try { + int frequency = 25; // frequency of status test output. + int numrhs = 1; // number of right-hand sides to solve for + int maxiters = -1; // maximum number of iterations allowed per linear system + int maxsubspace = 50; // maximum number of blocks the solver can use for the subspace + int maxrestarts = 35; // number of restarts allowed + bool expresidual = false; // use explicit residual + std::string filename("bcsstk12.mtx"); // example matrix + std::string rhsfile(""); + MT tol = 1.0e-5; // relative residual tolerance + + Teuchos::CommandLineProcessor cmdp(false,true); + cmdp.setOption("verbose","quiet",&verbose,"Print messages and results."); + cmdp.setOption("expres","impres",&expresidual,"Use explicit residual throughout."); + cmdp.setOption("frequency",&frequency,"Solvers frequency for printing residuals (#iters)."); + cmdp.setOption("filename",&filename,"Filename for test matrix. Acceptable file extensions: *.hb,*.mtx,*.triU,*.triS"); + cmdp.setOption("rhsfile",&rhsfile,"Filename for right-hand side. (*.mtx file) "); + cmdp.setOption("tol",&tol,"Relative residual tolerance used by Gmres solver."); + cmdp.setOption("num-rhs",&numrhs,"Number of right-hand sides to be solved for."); + cmdp.setOption("max-iters",&maxiters,"Maximum number of iterations per linear system (-1 = adapted to problem/block size)."); + cmdp.setOption("max-subspace",&maxsubspace,"Maximum number of blocks the solver can use for the subspace."); + cmdp.setOption("max-restarts",&maxrestarts,"Maximum number of restarts allowed for GMRES solver."); + + if (cmdp.parse(argc,argv) != Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL) { + return -1; + } + if (!verbose) + frequency = -1; // reset frequency if test is not verbose + + // Read in a matrix Market file and use it to test the Kokkos Operator. + KokkosSparse::CrsMatrix crsMat = + KokkosKernels::Impl::read_kokkos_crst_matrix>(filename.c_str()); + RCP> A = + rcp(new Belos::KokkosCrsOperator(crsMat)); + OT numRows = crsMat.numRows(); + + Teuchos::RCP X = Teuchos::rcp( new MV(numRows, numrhs) ); + X->MvRandom(); + Teuchos::RCP B = Teuchos::rcp( new MV(numRows, numrhs) ); + OPT::Apply(*A,*X,*B); + X->MvInit(0.0); + + // + // ********Other information used by block solver*********** + // *****************(can be user specified)****************** + // + const int NumGlobalElements = B->GetGlobalLength(); + if (maxiters == -1) + maxiters = NumGlobalElements - 1; // maximum number of iterations to run + + ParameterList belosList; + belosList.set( "Maximum Iterations", maxiters ); // Maximum number of iterations allowed + belosList.set( "Convergence Tolerance", tol ); // Relative convergence tolerance requested + belosList.set( "Num Blocks", maxsubspace); // Maximum number of blocks in Krylov factorization + belosList.set( "Maximum Restarts", maxrestarts ); // Maximum number of restarts allowed + belosList.set( "Explicit Residual Test", expresidual); // use explicit residual + + if (verbose) { + belosList.set( "Verbosity", Belos::Errors + Belos::Warnings + + Belos::StatusTestDetails + Belos::FinalSummary + Belos::TimingDetails); + if (frequency > 0) + belosList.set( "Output Frequency", frequency ); + } + else + belosList.set( "Verbosity", Belos::Errors + Belos::Warnings ); + + // + // Construct an unpreconditioned linear problem instance. + // + Belos::LinearProblem problem( A, X, B ); + bool set = problem.setProblem(); + if (set == false) { + std::cout << std::endl << "ERROR: Belos::LinearProblem failed to set up correctly!" << std::endl; + return -1; + } + // + // ******************************************************************* + // **************Start the block Gmres iteration************************* + // ******************************************************************* + // + // Create an iterative solver manager. + RCP< Belos::SolverManager > newSolver + = rcp( new Belos::BlockGmresSolMgr(rcpFromRef(problem), rcpFromRef(belosList)) ); + + // + // **********Print out information about problem******************* + // + std::cout << std::endl << std::endl; + std::cout << "Dimension of matrix: " << NumGlobalElements << std::endl; + std::cout << "Number of right-hand sides: " << numrhs << std::endl; + std::cout << "Max number of Gmres iterations: " << maxiters << std::endl; + std::cout << "Relative residual tolerance: " << tol << std::endl; + std::cout << std::endl; + // + // Perform solve + // + Belos::ReturnType ret; + ret = newSolver->solve(); + + // + // Compute actual residuals. + // + bool badRes = false; + std::vector actual_resids( numrhs ); + std::vector rhs_norm( numrhs ); + MV resid(numRows, numrhs); + OPT::Apply( *A, *X, resid ); + MVT::MvAddMv( -1.0, resid, 1.0, *B, resid ); + MVT::MvNorm( resid, actual_resids ); + MVT::MvNorm( *B, rhs_norm ); + std::cout<< "---------- Actual Residuals (normalized) ----------"< tol) badRes = true; + } + + if (ret!=Belos::Converged || badRes) { + success = false; + std::cout << std::endl << "ERROR: Belos did not converge!" << std::endl; + } else { + success = true; + std::cout << std::endl << "SUCCESS: Belos converged!" << std::endl; + } + + } + TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose, std::cerr, success); + } + Kokkos::finalize(); +#ifdef HAVE_MPI + MPI_Finalize(); +#endif + return success ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/packages/belos/kokkos/example/CMakeLists.txt b/packages/belos/kokkos/example/CMakeLists.txt new file mode 100644 index 000000000000..b493959ea9af --- /dev/null +++ b/packages/belos/kokkos/example/CMakeLists.txt @@ -0,0 +1,23 @@ +INCLUDE_DIRECTORIES(${Belos_SOURCE_DIR}/kokkos/src) + +TRIBITS_ADD_EXECUTABLE_AND_TEST( + Kokkos_BlockGmresEx + SOURCES BlockGmresKokkosExFile.cpp + ARGS "--verbose" + "--verbose --num-rhs=4" + COMM serial mpi + ) + +TRIBITS_ADD_EXECUTABLE_AND_TEST( + Kokkos_BlockCGEx + SOURCES BlockCGKokkosExFile.cpp + ARGS "--verbose" + "--verbose --num-rhs=4" + COMM serial mpi + ) + +TRIBITS_COPY_FILES_TO_BINARY_DIR(CopyExampleMtxFiles + SOURCE_DIR ${Belos_SOURCE_DIR}/kokkos/example + SOURCE_FILES bcsstk12.mtx + EXEDEPS Kokkos_BlockCGEx Kokkos_BlockGmresEx + ) diff --git a/packages/belos/kokkos/example/bcsstk12.mtx b/packages/belos/kokkos/example/bcsstk12.mtx new file mode 100644 index 000000000000..d734671ce1d3 --- /dev/null +++ b/packages/belos/kokkos/example/bcsstk12.mtx @@ -0,0 +1,17874 @@ +%%MatrixMarket matrix coordinate real symmetric +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/bcsstk12 +% name: HB/bcsstk12 +% [SYMMETRIC STIFFNESS MATRIX, ORE CAR (CONSISTENT MASSES)] +% id: 34 +% date: 1982 +% author: J. Lewis +% ed: I. Duff, R. Grimes, J. Lewis +% fields: title A name id kind notes date author ed +% kind: duplicate structural problem +%------------------------------------------------------------------------------- +% notes: +% duplicate of HB/bcsstk11 +%------------------------------------------------------------------------------- +1473 1473 17857 +1 1 1011851.60912 +2 1 4110093.43272 +3 1 -4.47034835815e-8 +4 1 -311975.890718 +5 1 -1184718.57235 +6 1 9.31322574615e-9 +52 1 22134.9913963 +53 1 90320.9940529 +54 1 -18909.0650259 +55 1 -144050.092155 +56 1 -547025.666412 +57 1 358351.461509 +2 2 16788621.6609 +3 2 -1.9371509552e-7 +4 2 -1184718.57235 +5 2 -4498931.28739 +6 2 2.98023223877e-8 +52 2 90320.9940529 +53 2 370626.696215 +54 2 4631.25243447 +55 2 -547025.666412 +56 2 -2077312.65726 +57 2 1360828.33484 +3 3 18240145.4814 +4 3 1.02445483208e-8 +5 3 3.35276126862e-8 +6 3 758227.34113 +52 3 18909.0650259 +53 3 -4631.25243457 +54 3 -5293544.01962 +55 3 358351.461509 +56 3 1360828.33484 +57 3 -2284273.33935 +4 4 2350262.38096 +5 4 4600302.12491 +6 4 -2.421438694e-8 +7 4 2.98023223877e-8 +8 4 -1.19209289551e-7 +10 4 -413671.243673 +11 4 -1334423.36669 +12 4 1.58324837685e-8 +52 4 -144050.092155 +53 4 -547025.666412 +54 4 -358351.461509 +55 4 -474420.971735 +56 4 131724.797327 +57 4 -23329.9193232 +58 4 800256.904552 +59 4 8988441.97885 +61 4 -193836.559394 +62 4 -625279.223852 +63 4 416676.259817 +5 5 17048556.8253 +6 5 -8.19563865662e-8 +7 5 5.96046447754e-8 +10 5 -1334423.36669 +11 5 -4304591.50545 +12 5 4.842877388e-8 +52 5 -547025.666412 +53 5 -2077312.65726 +54 5 -1360828.33484 +55 5 131724.797327 +56 5 -28174.6046034 +57 5 6684.54707694 +58 5 -6040684.68178 +59 5 -800256.904552 +61 5 -625279.223852 +62 5 -2017029.75436 +63 5 1344116.96715 +6 6 36176122.0894 +10 6 1.30385160446e-8 +11 6 3.72529029846e-8 +12 6 830431.306934 +52 6 -358351.461509 +53 6 -1360828.33484 +54 6 -2284273.33935 +55 6 23329.9193232 +56 6 -6684.54707697 +57 6 -14301137.6219 +61 6 416676.259817 +62 6 1344116.96715 +63 6 -2296979.40748 +7 7 305878308.174 +8 7 66094123.115 +55 7 -800256.904552 +56 7 6040684.68178 +58 7 64525494.457 +59 7 -4237812.99363 +8 8 549336918.275 +55 8 -8988441.97885 +56 8 800256.904552 +58 8 -4237812.99363 +59 8 48915452.1011 +9 9 715555.555556 +60 9 -357777.777778 +10 10 1816739.3315 +11 10 5341279.87864 +12 10 -3.53902578354e-8 +13 10 -544032.43723 +14 10 -1483724.82881 +15 10 2.23517417908e-8 +55 10 -193836.559394 +56 10 -625279.223852 +57 10 -416676.259817 +61 10 24667.0078013 +62 10 73754.1287474 +63 10 -27106.375452 +64 10 -260348.273704 +65 10 -710040.746465 +66 10 484442.198447 +11 11 15814018.062 +12 11 -1.11758708954e-7 +13 11 -1483724.82881 +14 11 -4046522.26039 +15 11 5.96046447754e-8 +55 11 -625279.223852 +56 11 -2017029.75436 +57 11 -1344116.96715 +61 11 73754.1287474 +62 11 222052.369365 +63 11 9164.38855485 +64 11 -710040.746465 +65 11 -1936474.76309 +66 11 1321205.99576 +12 12 18448886.5844 +13 12 2.14204192162e-8 +14 12 5.58793544769e-8 +15 12 931107.693647 +55 12 -416676.259817 +56 12 -1344116.96715 +57 12 -2296979.40748 +61 12 27106.375452 +62 12 -9164.3885549 +63 12 -5492991.14412 +64 12 484442.198447 +65 12 1321205.99576 +66 12 -2315242.24089 +13 13 2558539.62181 +14 13 6138307.60949 +15 13 -5.21540641785e-8 +16 13 -759692.612592 +17 13 -1651505.67955 +18 13 2.79396772385e-8 +61 13 -260348.273704 +62 13 -710040.746465 +63 13 -484442.198447 +64 13 12227.6197723 +65 13 33038.3525623 +66 13 -41457.2556898 +67 13 -379286.632065 +68 13 -824536.156663 +69 13 588085.337671 +14 14 14915778.6682 +15 14 -1.26659870148e-7 +16 14 -1651505.67955 +17 14 -3590229.73815 +18 14 6.14672899246e-8 +61 14 -710040.746465 +62 14 -1936474.76309 +63 14 -1321205.99576 +64 14 33038.3525623 +65 14 89431.3340662 +66 14 17103.8438088 +67 14 -824536.156663 +68 14 -1792469.90579 +69 14 1278446.38624 +15 15 18669379.7869 +16 15 2.88709998131e-8 +17 15 6.14672899246e-8 +18 15 1124555.53479 +61 15 -484442.198447 +62 15 -1321205.99576 +63 15 -2315242.24089 +64 15 41457.2556898 +65 15 -17103.8438089 +66 15 -5695176.55864 +67 15 588085.337671 +68 15 1278446.38624 +69 15 -2352102.70813 +16 16 3880798.16119 +17 16 7110485.96967 +18 16 -4.47034835815e-8 +19 16 -1076372.38828 +20 16 -1736084.49722 +21 16 2.60770320892e-8 +64 16 -379286.632065 +65 16 -824536.156663 +66 16 -588085.337671 +67 16 -52167.0393845 +68 16 -83826.4031562 +69 16 -61373.985991 +70 16 -590912.90871 +71 16 -953085.336629 +72 16 741520.302649 +17 17 13318817.2723 +18 17 -8.94069671631e-8 +19 17 -1736084.49722 +20 17 -2800136.28584 +21 17 4.28408384323e-8 +64 17 -824536.156663 +65 17 -1792469.90579 +66 17 -1278446.38624 +67 17 -83826.4031562 +68 17 -134521.304433 +69 17 32978.3592395 +70 17 -953085.336629 +71 17 -1537234.41392 +72 17 1196000.48814 +18 18 19146980.3477 +19 18 1.86264514923e-8 +20 18 3.35276126862e-8 +21 18 1520483.39551 +64 18 -588085.337671 +65 18 -1278446.38624 +66 18 -2352102.70813 +67 18 61373.985991 +68 18 -32978.3592395 +69 18 -6109264.54972 +70 18 741520.302649 +71 18 1196000.48814 +72 18 -2434642.38116 +19 19 6516876.42304 +20 19 8531914.96891 +21 19 -2.23517417908e-8 +22 19 -2626121.17726 +23 19 -2984228.61052 +24 19 9.31322574615e-9 +67 19 -590912.90871 +68 19 -953085.336629 +69 19 -741520.302649 +70 19 222027.67781 +71 19 227177.812693 +72 19 -75251.5247453 +73 19 -1038306.19785 +74 19 -1179893.40665 +75 19 929649.114512 +20 20 11512089.4984 +21 20 -3.72529029846e-8 +22 20 -2984228.61052 +23 20 -3391168.87559 +24 20 1.11758708954e-8 +67 20 -953085.336629 +68 20 -1537234.41392 +69 20 -1196000.48814 +70 20 227177.812693 +71 20 217630.207531 +72 20 55832.4159336 +73 20 -1179893.40665 +74 20 -1340787.9621 +75 20 1056419.44831 +21 21 18361731.7736 +22 21 1.86264514923e-9 +23 21 1.86264514923e-9 +24 21 -125380.553907 +67 21 -741520.302649 +68 21 -1196000.48814 +69 21 -2434642.38116 +70 21 75251.5247453 +71 21 -55832.4159336 +72 21 -5287984.36193 +73 21 929649.114512 +74 21 1056419.44831 +75 21 -2155790.5645 +22 22 11197028.9194 +23 22 7624235.1212 +24 22 -1.49011611938e-8 +25 22 -1154846.00933 +26 22 -476225.158488 +27 22 9.31322574615e-9 +70 22 -1038306.19785 +71 22 -1179893.40665 +72 22 -929649.114512 +73 22 -908773.635179 +74 22 -175831.894858 +75 22 -148519.569575 +76 22 -1760951.03338 +77 22 -726165.37459 +78 22 1300948.03845 +23 23 6560950.4012 +24 23 -7.45058059692e-9 +25 23 -476225.158488 +26 23 -196381.508655 +27 23 3.72529029846e-9 +70 23 -1179893.40665 +71 23 -1340787.9621 +72 23 -1056419.44831 +73 23 -175831.894858 +74 23 153537.59263 +75 23 207978.412157 +76 23 -726165.37459 +77 23 -299449.639006 +78 23 536473.417918 +24 24 21281133.3311 +25 24 3.72529029846e-9 +26 24 9.31322574615e-10 +27 24 4075797.18655 +70 24 -929649.114512 +71 24 -1056419.44831 +72 24 -2155790.5645 +73 24 148519.569575 +74 24 -207978.412157 +75 24 -7295491.64648 +76 24 1300948.03845 +77 24 536473.417918 +78 24 -3164492.7709 +25 25 14087608.2601 +26 25 -2.23517417908e-8 +27 25 -7.45058059692e-9 +28 25 -1154846.00933 +29 25 476225.158488 +30 25 9.31322574615e-9 +73 25 -1760951.03338 +74 25 -726165.37459 +75 25 -1300948.03845 +76 25 -2367056.05396 +77 25 1.11758708954e-8 +78 25 -1.86264514923e-9 +79 25 -1760951.03338 +80 25 726165.37459 +81 25 1300948.03845 +26 26 2395597.11087 +28 26 476225.158488 +29 26 -196381.508655 +30 26 -3.72529029846e-9 +73 26 -726165.37459 +74 26 -299449.639006 +75 26 -536473.417918 +76 26 9.31322574615e-9 +77 26 -402517.768767 +78 26 429178.734334 +79 26 726165.37459 +80 26 -299449.639006 +81 26 -536473.417918 +27 27 25315942.1547 +28 27 3.72529029846e-9 +29 27 -9.31322574615e-10 +30 27 4075797.18655 +73 27 -1300948.03845 +74 27 -536473.417918 +75 27 -3164492.7709 +76 27 1.86264514923e-9 +77 27 -429178.734334 +78 27 -10404782.7221 +79 27 1300948.03845 +80 27 -536473.417918 +81 27 -3164492.7709 +28 28 11197028.9194 +29 28 -7624235.1212 +30 28 1.49011611938e-8 +31 28 -2626121.17726 +32 28 2984228.61052 +33 28 -1.11758708954e-8 +76 28 -1760951.03338 +77 28 726165.37459 +78 28 -1300948.03845 +79 28 -908773.635179 +80 28 175831.894858 +81 28 148519.569575 +82 28 -1038306.19785 +83 28 1179893.40665 +84 28 929649.114512 +29 29 6560950.4012 +30 29 -2.23517417908e-8 +31 29 2984228.61052 +32 29 -3391168.87559 +33 29 1.11758708954e-8 +76 29 726165.37459 +77 29 -299449.639006 +78 29 536473.417918 +79 29 175831.894858 +80 29 153537.59263 +81 29 207978.412157 +82 29 1179893.40665 +83 29 -1340787.9621 +84 29 -1056419.44831 +30 30 21281133.3311 +31 30 -1.49011611938e-8 +32 30 1.67638063431e-8 +33 30 -125380.553907 +76 30 -1300948.03845 +77 30 536473.417918 +78 30 -3164492.7709 +79 30 -148519.569575 +80 30 -207978.412157 +81 30 -7295491.64648 +82 30 929649.114512 +83 30 -1056419.44831 +84 30 -2155790.5645 +31 31 6516876.42304 +32 31 -8531914.96891 +33 31 2.60770320892e-8 +34 31 -1076372.38828 +35 31 1736084.49722 +36 31 -1.30385160446e-8 +79 31 -1038306.19785 +80 31 1179893.40665 +81 31 -929649.114512 +82 31 222027.67781 +83 31 -227177.812693 +84 31 75251.5247453 +85 31 -590912.90871 +86 31 953085.336629 +87 31 741520.302649 +32 32 11512089.4984 +33 32 -3.72529029846e-8 +34 32 1736084.49722 +35 32 -2800136.28584 +36 32 2.04890966415e-8 +79 32 1179893.40665 +80 32 -1340787.9621 +81 32 1056419.44831 +82 32 -227177.812693 +83 32 217630.207531 +84 32 55832.4159336 +85 32 953085.336629 +86 32 -1537234.41392 +87 32 -1196000.48814 +33 33 18361731.7736 +34 33 -1.67638063431e-8 +35 33 2.79396772385e-8 +36 33 1520483.39551 +79 33 -929649.114512 +80 33 1056419.44831 +81 33 -2155790.5645 +82 33 -75251.5247453 +83 33 -55832.4159336 +84 33 -5287984.36193 +85 33 741520.302649 +86 33 -1196000.48814 +87 33 -2434642.38116 +34 34 3880798.16119 +35 34 -7110485.96967 +36 34 2.60770320892e-8 +37 34 -759692.612592 +38 34 1651505.67955 +39 34 -1.67638063431e-8 +82 34 -590912.90871 +83 34 953085.336629 +84 34 -741520.302649 +85 34 -52167.0393845 +86 34 83826.4031562 +87 34 61373.985991 +88 34 -379286.632065 +89 34 824536.156663 +90 34 588085.337671 +35 35 13318817.2723 +36 35 -4.47034835815e-8 +37 35 1651505.67955 +38 35 -3590229.73815 +39 35 3.72529029846e-8 +82 35 953085.336629 +83 35 -1537234.41392 +84 35 1196000.48814 +85 35 83826.4031562 +86 35 -134521.304433 +87 35 32978.3592395 +88 35 824536.156663 +89 35 -1792469.90579 +90 35 -1278446.38624 +36 36 19146980.3477 +37 36 -2.14204192162e-8 +38 36 4.842877388e-8 +39 36 1124555.53479 +82 36 -741520.302649 +83 36 1196000.48814 +84 36 -2434642.38116 +85 36 -61373.985991 +86 36 -32978.3592395 +87 36 -6109264.54972 +88 36 588085.337671 +89 36 -1278446.38624 +90 36 -2352102.70813 +37 37 2558539.62181 +38 37 -6138307.60949 +39 37 4.28408384323e-8 +40 37 -544032.43723 +41 37 1483724.82881 +42 37 -2.421438694e-8 +85 37 -379286.632065 +86 37 824536.156663 +87 37 -588085.337671 +88 37 12227.6197723 +89 37 -33038.3525623 +90 37 41457.2556898 +91 37 -260348.273704 +92 37 710040.746465 +93 37 484442.198447 +38 38 14915778.6682 +39 38 -1.19209289551e-7 +40 38 1483724.82881 +41 38 -4046522.26039 +42 38 7.07805156708e-8 +85 38 824536.156663 +86 38 -1792469.90579 +87 38 1278446.38624 +88 38 -33038.3525623 +89 38 89431.3340662 +90 38 17103.8438088 +91 38 710040.746465 +92 38 -1936474.76309 +93 38 -1321205.99576 +39 39 18669379.7869 +40 39 -2.60770320892e-8 +41 39 7.45058059692e-8 +42 39 931107.693647 +85 39 -588085.337671 +86 39 1278446.38624 +87 39 -2352102.70813 +88 39 -41457.2556898 +89 39 -17103.8438089 +90 39 -5695176.55864 +91 39 484442.198447 +92 39 -1321205.99576 +93 39 -2315242.24089 +40 40 1816739.3315 +41 40 -5341279.87864 +42 40 3.91155481339e-8 +43 40 -413671.243673 +44 40 1334423.36669 +45 40 -8.38190317154e-9 +88 40 -260348.273704 +89 40 710040.746465 +90 40 -484442.198447 +91 40 24667.0078013 +92 40 -73754.1287475 +93 40 27106.375452 +94 40 -193836.559394 +95 40 625279.223852 +96 40 416676.259817 +41 41 15814018.062 +42 41 -1.19209289551e-7 +43 41 1334423.36669 +44 41 -4304591.50545 +45 41 2.98023223877e-8 +88 41 710040.746465 +89 41 -1936474.76309 +90 41 1321205.99576 +91 41 -73754.1287475 +92 41 222052.369365 +93 41 9164.38855486 +94 41 625279.223852 +95 41 -2017029.75436 +96 41 -1344116.96715 +42 42 18448886.5844 +43 42 -1.11758708954e-8 +44 42 3.72529029846e-8 +45 42 830431.306934 +88 42 -484442.198447 +89 42 1321205.99576 +90 42 -2315242.24089 +91 42 -27106.375452 +92 42 -9164.38855491 +93 42 -5492991.14412 +94 42 416676.259817 +95 42 -1344116.96715 +96 42 -2296979.40748 +43 43 2350262.78049 +44 43 -4600302.86075 +45 43 2.04890966415e-8 +46 43 -7.45058059692e-9 +49 43 -311975.890718 +50 43 1184718.57235 +51 43 -1.11758708954e-8 +91 43 -193836.559394 +92 43 625279.223852 +93 43 -416676.259817 +94 43 -474421.1715 +95 43 -131724.429407 +96 43 23329.9193232 +97 43 -800250.281991 +98 43 8988445.57462 +100 43 -144050.092155 +101 43 547025.666412 +102 43 358351.461509 +44 44 17048556.4258 +45 44 -7.45058059692e-8 +46 44 5.96046447754e-8 +47 44 7.45058059692e-9 +49 44 1184718.57235 +50 44 -4498931.28739 +51 44 3.72529029846e-8 +91 44 625279.223852 +92 44 -2017029.75436 +93 44 1344116.96715 +94 44 -131724.429407 +95 44 -28174.4048386 +96 44 6684.54707695 +97 44 -6040681.08601 +98 44 800250.281991 +100 44 547025.666412 +101 44 -2077312.65726 +102 44 -1360828.33484 +45 45 36176122.0894 +49 45 -1.39698386192e-8 +50 45 4.842877388e-8 +51 45 758227.34113 +91 45 -416676.259817 +92 45 1344116.96715 +93 45 -2296979.40748 +94 45 -23329.9193232 +95 45 -6684.54707698 +96 45 -14301137.6219 +100 45 358351.461509 +101 45 -1360828.33484 +102 45 -2284273.33935 +46 46 305878011.196 +47 46 -66093576.1502 +94 46 800250.281991 +95 46 6040681.08601 +97 46 64525513.4986 +98 46 4237777.92342 +47 47 549337215.254 +94 47 -8988445.57462 +95 47 -800250.281991 +97 47 4237777.92342 +98 47 48915433.0595 +48 48 715555.555556 +99 48 -357777.777778 +49 49 1011851.60912 +50 49 -4110093.43272 +51 49 5.96046447754e-8 +94 49 -144050.092155 +95 49 547025.666412 +96 49 -358351.461509 +100 49 22134.9913963 +101 49 -90320.9940529 +102 49 18909.0650259 +50 50 16788621.6609 +51 50 -2.45869159698e-7 +94 50 547025.666412 +95 50 -2077312.65726 +96 50 1360828.33484 +100 50 -90320.9940529 +101 50 370626.696215 +102 50 4631.25243447 +51 51 18240145.4814 +94 51 -358351.461509 +95 51 1360828.33484 +96 51 -2284273.33935 +100 51 -18909.0650259 +101 51 -4631.25243458 +102 51 -5293544.01962 +52 52 1011851.60912 +53 52 4110093.43272 +54 52 -4.47034835815e-8 +55 52 -311975.890718 +56 52 -1184718.57235 +57 52 1.02445483208e-8 +103 52 22134.9913963 +104 52 90320.9940529 +105 52 -18909.0650259 +106 52 -144050.092155 +107 52 -547025.666412 +108 52 358351.461509 +53 53 16788621.6609 +54 53 -1.9371509552e-7 +55 53 -1184718.57235 +56 53 -4498931.28739 +57 53 3.35276126862e-8 +103 53 90320.9940529 +104 53 370626.696215 +105 53 4631.25243447 +106 53 -547025.666412 +107 53 -2077312.65726 +108 53 1360828.33484 +54 54 18240145.4814 +55 54 9.31322574615e-9 +56 54 2.98023223877e-8 +57 54 758227.34113 +103 54 18909.0650259 +104 54 -4631.25243457 +105 54 -5293544.01962 +106 54 358351.461509 +107 54 1360828.33484 +108 54 -2284273.33935 +55 55 2350262.38096 +56 55 4600302.12491 +57 55 -2.60770320892e-8 +58 55 2.98023223877e-8 +59 55 -1.19209289551e-7 +61 55 -413671.243673 +62 55 -1334423.36669 +63 55 1.58324837685e-8 +103 55 -144050.092155 +104 55 -547025.666412 +105 55 -358351.461509 +106 55 -474420.971735 +107 55 131724.797327 +108 55 -23329.9193232 +109 55 800256.904552 +110 55 8988441.97885 +112 55 -193836.559394 +113 55 -625279.223852 +114 55 416676.259817 +56 56 17048556.8253 +57 56 -8.94069671631e-8 +58 56 5.96046447754e-8 +61 56 -1334423.36669 +62 56 -4304591.50545 +63 56 4.842877388e-8 +103 56 -547025.666412 +104 56 -2077312.65726 +105 56 -1360828.33484 +106 56 131724.797327 +107 56 -28174.6046033 +108 56 6684.54707694 +109 56 -6040684.68178 +110 56 -800256.904552 +112 56 -625279.223852 +113 56 -2017029.75436 +114 56 1344116.96715 +57 57 36176122.0894 +61 57 1.30385160446e-8 +62 57 3.72529029846e-8 +63 57 830431.306934 +103 57 -358351.461509 +104 57 -1360828.33484 +105 57 -2284273.33935 +106 57 23329.9193232 +107 57 -6684.54707697 +108 57 -14301137.6219 +112 57 416676.259817 +113 57 1344116.96715 +114 57 -2296979.40748 +58 58 305878308.174 +59 58 66094123.115 +106 58 -800256.904552 +107 58 6040684.68178 +109 58 64525494.457 +110 58 -4237812.99363 +59 59 549336918.275 +106 59 -8988441.97885 +107 59 800256.904552 +109 59 -4237812.99363 +110 59 48915452.1011 +60 60 715555.555556 +111 60 -357777.777778 +61 61 1816739.3315 +62 61 5341279.87864 +63 61 -3.53902578354e-8 +64 61 -544032.43723 +65 61 -1483724.82881 +66 61 2.23517417908e-8 +106 61 -193836.559394 +107 61 -625279.223852 +108 61 -416676.259817 +112 61 24667.0078013 +113 61 73754.1287475 +114 61 -27106.375452 +115 61 -260348.273704 +116 61 -710040.746465 +117 61 484442.198447 +62 62 15814018.062 +63 62 -1.11758708954e-7 +64 62 -1483724.82881 +65 62 -4046522.26039 +66 62 5.96046447754e-8 +106 62 -625279.223852 +107 62 -2017029.75436 +108 62 -1344116.96715 +112 62 73754.1287475 +113 62 222052.369365 +114 62 9164.38855485 +115 62 -710040.746465 +116 62 -1936474.76309 +117 62 1321205.99576 +63 63 18448886.5844 +64 63 1.86264514923e-8 +65 63 4.842877388e-8 +66 63 931107.693647 +106 63 -416676.259817 +107 63 -1344116.96715 +108 63 -2296979.40748 +112 63 27106.375452 +113 63 -9164.38855491 +114 63 -5492991.14412 +115 63 484442.198447 +116 63 1321205.99576 +117 63 -2315242.24089 +64 64 2558539.62181 +65 64 6138307.60949 +66 64 -4.842877388e-8 +67 64 -759692.612592 +68 64 -1651505.67955 +69 64 2.98023223877e-8 +112 64 -260348.273704 +113 64 -710040.746465 +114 64 -484442.198447 +115 64 12227.6197723 +116 64 33038.3525623 +117 64 -41457.2556898 +118 64 -379286.632065 +119 64 -824536.156663 +120 64 588085.337671 +65 65 14915778.6682 +66 65 -1.19209289551e-7 +67 65 -1651505.67955 +68 65 -3590229.73815 +69 65 6.33299350738e-8 +112 65 -710040.746465 +113 65 -1936474.76309 +114 65 -1321205.99576 +115 65 33038.3525623 +116 65 89431.3340662 +117 65 17103.8438088 +118 65 -824536.156663 +119 65 -1792469.90579 +120 65 1278446.38624 +66 66 18669379.7869 +67 66 2.70083546639e-8 +68 66 5.77419996262e-8 +69 66 1124555.53479 +112 66 -484442.198447 +113 66 -1321205.99576 +114 66 -2315242.24089 +115 66 41457.2556898 +116 66 -17103.8438089 +117 66 -5695176.55864 +118 66 588085.337671 +119 66 1278446.38624 +120 66 -2352102.70813 +67 67 3880798.16119 +68 67 7110485.96967 +69 67 -4.09781932831e-8 +70 67 -1076372.38828 +71 67 -1736084.49722 +72 67 2.23517417908e-8 +115 67 -379286.632065 +116 67 -824536.156663 +117 67 -588085.337671 +118 67 -52167.0393845 +119 67 -83826.4031562 +120 67 -61373.985991 +121 67 -590912.90871 +122 67 -953085.336629 +123 67 741520.302649 +68 68 13318817.2723 +69 68 -8.19563865662e-8 +70 68 -1736084.49722 +71 68 -2800136.28584 +72 68 3.72529029846e-8 +115 68 -824536.156663 +116 68 -1792469.90579 +117 68 -1278446.38624 +118 68 -83826.4031562 +119 68 -134521.304433 +120 68 32978.3592395 +121 68 -953085.336629 +122 68 -1537234.41392 +123 68 1196000.48814 +69 69 19146980.3477 +70 69 1.67638063431e-8 +71 69 2.98023223877e-8 +72 69 1520483.39551 +115 69 -588085.337671 +116 69 -1278446.38624 +117 69 -2352102.70813 +118 69 61373.985991 +119 69 -32978.3592395 +120 69 -6109264.54972 +121 69 741520.302649 +122 69 1196000.48814 +123 69 -2434642.38116 +70 70 6516876.42304 +71 70 8531914.96891 +72 70 -2.60770320892e-8 +73 70 -2626121.17726 +74 70 -2984228.61052 +75 70 1.11758708954e-8 +118 70 -590912.90871 +119 70 -953085.336629 +120 70 -741520.302649 +121 70 222027.67781 +122 70 227177.812693 +123 70 -75251.5247453 +124 70 -1038306.19785 +125 70 -1179893.40665 +126 70 929649.114512 +71 71 11512089.4984 +72 71 -3.72529029846e-8 +73 71 -2984228.61052 +74 71 -3391168.87559 +75 71 1.49011611938e-8 +118 71 -953085.336629 +119 71 -1537234.41392 +120 71 -1196000.48814 +121 71 227177.812693 +122 71 217630.207531 +123 71 55832.4159336 +124 71 -1179893.40665 +125 71 -1340787.9621 +126 71 1056419.44831 +72 72 18361731.7736 +73 72 1.86264514923e-9 +74 72 1.86264514923e-9 +75 72 -125380.553907 +118 72 -741520.302649 +119 72 -1196000.48814 +120 72 -2434642.38116 +121 72 75251.5247453 +122 72 -55832.4159336 +123 72 -5287984.36193 +124 72 929649.114512 +125 72 1056419.44831 +126 72 -2155790.5645 +73 73 11197028.9194 +74 73 7624235.1212 +76 73 -1154846.00933 +77 73 -476225.158488 +121 73 -1038306.19785 +122 73 -1179893.40665 +123 73 -929649.114512 +124 73 -908773.635179 +125 73 -175831.894858 +126 73 -148519.569575 +127 73 -1760951.03338 +128 73 -726165.37459 +129 73 1300948.03845 +74 74 6560950.4012 +75 74 -7.45058059692e-9 +76 74 -476225.158488 +77 74 -196381.508655 +121 74 -1179893.40665 +122 74 -1340787.9621 +123 74 -1056419.44831 +124 74 -175831.894858 +125 74 153537.59263 +126 74 207978.412157 +127 74 -726165.37459 +128 74 -299449.639006 +129 74 536473.417918 +75 75 21281133.3311 +76 75 -7.45058059692e-9 +77 75 -2.79396772385e-9 +78 75 4075797.18655 +121 75 -929649.114512 +122 75 -1056419.44831 +123 75 -2155790.5645 +124 75 148519.569575 +125 75 -207978.412157 +126 75 -7295491.64648 +127 75 1300948.03845 +128 75 536473.417918 +129 75 -3164492.7709 +76 76 14087608.2601 +77 76 -7.45058059692e-9 +78 76 7.45058059692e-9 +79 76 -1154846.00933 +80 76 476225.158488 +124 76 -1760951.03338 +125 76 -726165.37459 +126 76 -1300948.03845 +127 76 -2367056.05396 +128 76 1.11758708954e-8 +129 76 1.86264514923e-9 +130 76 -1760951.03338 +131 76 726165.37459 +132 76 1300948.03845 +77 77 2395597.11087 +78 77 7.45058059692e-9 +79 77 476225.158488 +80 77 -196381.508655 +124 77 -726165.37459 +125 77 -299449.639006 +126 77 -536473.417918 +127 77 9.31322574615e-9 +128 77 -402517.768767 +129 77 429178.734334 +130 77 726165.37459 +131 77 -299449.639006 +132 77 -536473.417918 +78 78 25315942.1547 +79 78 -7.45058059692e-9 +80 78 2.79396772385e-9 +81 78 4075797.18655 +124 78 -1300948.03845 +125 78 -536473.417918 +126 78 -3164492.7709 +128 78 -429178.734334 +129 78 -10404782.7221 +130 78 1300948.03845 +131 78 -536473.417918 +132 78 -3164492.7709 +79 79 11197028.9194 +80 79 -7624235.1212 +81 79 3.72529029846e-9 +82 79 -2626121.17726 +83 79 2984228.61052 +84 79 -5.58793544769e-9 +127 79 -1760951.03338 +128 79 726165.37459 +129 79 -1300948.03845 +130 79 -908773.635179 +131 79 175831.894858 +132 79 148519.569575 +133 79 -1038306.19785 +134 79 1179893.40665 +135 79 929649.114512 +80 80 6560950.4012 +82 80 2984228.61052 +83 80 -3391168.87559 +84 80 5.58793544769e-9 +127 80 726165.37459 +128 80 -299449.639006 +129 80 536473.417918 +130 80 175831.894858 +131 80 153537.59263 +132 80 207978.412157 +133 80 1179893.40665 +134 80 -1340787.9621 +135 80 -1056419.44831 +81 81 21281133.3311 +82 81 -1.30385160446e-8 +83 81 1.30385160446e-8 +84 81 -125380.553907 +127 81 -1300948.03845 +128 81 536473.417918 +129 81 -3164492.7709 +130 81 -148519.569575 +131 81 -207978.412157 +132 81 -7295491.64648 +133 81 929649.114512 +134 81 -1056419.44831 +135 81 -2155790.5645 +82 82 6516876.42304 +83 82 -8531914.96891 +84 82 2.60770320892e-8 +85 82 -1076372.38828 +86 82 1736084.49722 +87 82 -2.04890966415e-8 +130 82 -1038306.19785 +131 82 1179893.40665 +132 82 -929649.114512 +133 82 222027.67781 +134 82 -227177.812693 +135 82 75251.5247453 +136 82 -590912.90871 +137 82 953085.336629 +138 82 741520.302649 +83 83 11512089.4984 +84 83 -3.72529029846e-8 +85 83 1736084.49722 +86 83 -2800136.28584 +87 83 3.35276126862e-8 +130 83 1179893.40665 +131 83 -1340787.9621 +132 83 1056419.44831 +133 83 -227177.812693 +134 83 217630.207531 +135 83 55832.4159336 +136 83 953085.336629 +137 83 -1537234.41392 +138 83 -1196000.48814 +84 84 18361731.7736 +85 84 -2.23517417908e-8 +86 84 3.53902578354e-8 +87 84 1520483.39551 +130 84 -929649.114512 +131 84 1056419.44831 +132 84 -2155790.5645 +133 84 -75251.5247453 +134 84 -55832.4159336 +135 84 -5287984.36193 +136 84 741520.302649 +137 84 -1196000.48814 +138 84 -2434642.38116 +85 85 3880798.16119 +86 85 -7110485.96967 +87 85 3.72529029846e-8 +88 85 -759692.612592 +89 85 1651505.67955 +90 85 -1.86264514923e-8 +133 85 -590912.90871 +134 85 953085.336629 +135 85 -741520.302649 +136 85 -52167.0393845 +137 85 83826.4031562 +138 85 61373.985991 +139 85 -379286.632065 +140 85 824536.156663 +141 85 588085.337671 +86 86 13318817.2723 +87 86 -6.70552253723e-8 +88 86 1651505.67955 +89 86 -3590229.73815 +90 86 4.09781932831e-8 +133 86 953085.336629 +134 86 -1537234.41392 +135 86 1196000.48814 +136 86 83826.4031562 +137 86 -134521.304433 +138 86 32978.3592395 +139 86 824536.156663 +140 86 -1792469.90579 +141 86 -1278446.38624 +87 87 19146980.3477 +88 87 -2.51457095146e-8 +89 87 5.40167093277e-8 +90 87 1124555.53479 +133 87 -741520.302649 +134 87 1196000.48814 +135 87 -2434642.38116 +136 87 -61373.985991 +137 87 -32978.3592395 +138 87 -6109264.54972 +139 87 588085.337671 +140 87 -1278446.38624 +141 87 -2352102.70813 +88 88 2558539.62181 +89 88 -6138307.60949 +90 88 4.09781932831e-8 +91 88 -544032.43723 +92 88 1483724.82881 +93 88 -2.32830643654e-8 +136 88 -379286.632065 +137 88 824536.156663 +138 88 -588085.337671 +139 88 12227.6197723 +140 88 -33038.3525623 +141 88 41457.2556898 +142 88 -260348.273704 +143 88 710040.746465 +144 88 484442.198447 +89 89 14915778.6682 +90 89 -1.04308128357e-7 +91 89 1483724.82881 +92 89 -4046522.26039 +93 89 6.70552253723e-8 +136 89 824536.156663 +137 89 -1792469.90579 +138 89 1278446.38624 +139 89 -33038.3525623 +140 89 89431.3340663 +141 89 17103.8438088 +142 89 710040.746465 +143 89 -1936474.76309 +144 89 -1321205.99576 +90 90 18669379.7869 +91 90 -2.79396772385e-8 +92 90 8.19563865662e-8 +93 90 931107.693647 +136 90 -588085.337671 +137 90 1278446.38624 +138 90 -2352102.70813 +139 90 -41457.2556898 +140 90 -17103.8438089 +141 90 -5695176.55864 +142 90 484442.198447 +143 90 -1321205.99576 +144 90 -2315242.24089 +91 91 1816739.3315 +92 91 -5341279.87864 +93 91 3.53902578354e-8 +94 91 -413671.243673 +95 91 1334423.36669 +96 91 -7.45058059692e-9 +139 91 -260348.273704 +140 91 710040.746465 +141 91 -484442.198447 +142 91 24667.0078013 +143 91 -73754.1287475 +144 91 27106.375452 +145 91 -193836.559394 +146 91 625279.223852 +147 91 416676.259817 +92 92 15814018.062 +93 92 -1.04308128357e-7 +94 92 1334423.36669 +95 92 -4304591.50545 +96 92 2.60770320892e-8 +139 92 710040.746465 +140 92 -1936474.76309 +141 92 1321205.99576 +142 92 -73754.1287475 +143 92 222052.369365 +144 92 9164.38855485 +145 92 625279.223852 +146 92 -2017029.75436 +147 92 -1344116.96715 +93 93 18448886.5844 +94 93 -1.210719347e-8 +95 93 4.09781932831e-8 +96 93 830431.306934 +139 93 -484442.198447 +140 93 1321205.99576 +141 93 -2315242.24089 +142 93 -27106.375452 +143 93 -9164.3885549 +144 93 -5492991.14412 +145 93 416676.259817 +146 93 -1344116.96715 +147 93 -2296979.40748 +94 94 2350262.78049 +95 94 -4600302.86075 +96 94 2.04890966415e-8 +97 94 -7.45058059692e-9 +100 94 -311975.890718 +101 94 1184718.57235 +102 94 -1.02445483208e-8 +142 94 -193836.559394 +143 94 625279.223852 +144 94 -416676.259817 +145 94 -474421.1715 +146 94 -131724.429407 +147 94 23329.9193232 +148 94 -800250.281991 +149 94 8988445.57462 +151 94 -144050.092155 +152 94 547025.666412 +153 94 358351.461509 +95 95 17048556.4258 +96 95 -7.45058059692e-8 +97 95 5.96046447754e-8 +98 95 7.45058059692e-9 +100 95 1184718.57235 +101 95 -4498931.28739 +102 95 3.35276126862e-8 +142 95 625279.223852 +143 95 -2017029.75436 +144 95 1344116.96715 +145 95 -131724.429407 +146 95 -28174.4048385 +147 95 6684.54707694 +148 95 -6040681.08601 +149 95 800250.281991 +151 95 547025.666412 +152 95 -2077312.65726 +153 95 -1360828.33484 +96 96 36176122.0894 +100 96 -1.30385160446e-8 +101 96 4.47034835815e-8 +102 96 758227.34113 +142 96 -416676.259817 +143 96 1344116.96715 +144 96 -2296979.40748 +145 96 -23329.9193232 +146 96 -6684.54707698 +147 96 -14301137.6219 +151 96 358351.461509 +152 96 -1360828.33484 +153 96 -2284273.33935 +97 97 305878011.196 +98 97 -66093576.1502 +145 97 800250.281991 +146 97 6040681.08601 +148 97 64525513.4986 +149 97 4237777.92342 +98 98 549337215.254 +145 98 -8988445.57462 +146 98 -800250.281991 +148 98 4237777.92342 +149 98 48915433.0595 +99 99 715555.555556 +150 99 -357777.777778 +100 100 1011851.60912 +101 100 -4110093.43272 +102 100 6.33299350738e-8 +145 100 -144050.092155 +146 100 547025.666412 +147 100 -358351.461509 +151 100 22134.9913963 +152 100 -90320.994053 +153 100 18909.0650259 +101 101 16788621.6609 +102 101 -2.60770320892e-7 +145 101 547025.666412 +146 101 -2077312.65726 +147 101 1360828.33484 +151 101 -90320.994053 +152 101 370626.696215 +153 101 4631.25243446 +102 102 18240145.4814 +145 102 -358351.461509 +146 102 1360828.33484 +147 102 -2284273.33935 +151 102 -18909.0650259 +152 102 -4631.25243459 +153 102 -5293544.01962 +103 103 1011851.60912 +104 103 4110093.43272 +105 103 -4.28408384323e-8 +106 103 -311975.890718 +107 103 -1184718.57235 +108 103 1.11758708954e-8 +154 103 22134.9913963 +155 103 90320.9940529 +156 103 -18909.0650259 +157 103 -144050.092155 +158 103 -547025.666412 +159 103 358351.461509 +104 104 16788621.6609 +105 104 -1.86264514923e-7 +106 104 -1184718.57235 +107 104 -4498931.28739 +108 104 3.72529029846e-8 +154 104 90320.9940529 +155 104 370626.696215 +156 104 4631.25243447 +157 104 -547025.666412 +158 104 -2077312.65726 +159 104 1360828.33484 +105 105 18240145.4814 +106 105 1.11758708954e-8 +107 105 3.72529029846e-8 +108 105 758227.34113 +154 105 18909.0650259 +155 105 -4631.25243456 +156 105 -5293544.01962 +157 105 358351.461509 +158 105 1360828.33484 +159 105 -2284273.33935 +106 106 2350262.38096 +107 106 4600302.12491 +108 106 -2.60770320892e-8 +109 106 2.98023223877e-8 +110 106 -1.19209289551e-7 +112 106 -413671.243673 +113 106 -1334423.36669 +114 106 1.58324837685e-8 +154 106 -144050.092155 +155 106 -547025.666412 +156 106 -358351.461509 +157 106 -474420.971735 +158 106 131724.797327 +159 106 -23329.9193232 +160 106 800256.904552 +161 106 8988441.97885 +163 106 -193836.559394 +164 106 -625279.223852 +165 106 416676.259817 +107 107 17048556.8253 +108 107 -8.94069671631e-8 +109 107 5.96046447754e-8 +112 107 -1334423.36669 +113 107 -4304591.50545 +114 107 4.842877388e-8 +154 107 -547025.666412 +155 107 -2077312.65726 +156 107 -1360828.33484 +157 107 131724.797327 +158 107 -28174.6046034 +159 107 6684.54707693 +160 107 -6040684.68178 +161 107 -800256.904552 +163 107 -625279.223852 +164 107 -2017029.75436 +165 107 1344116.96715 +108 108 36176122.0894 +112 108 1.30385160446e-8 +113 108 3.72529029846e-8 +114 108 830431.306934 +154 108 -358351.461509 +155 108 -1360828.33484 +156 108 -2284273.33935 +157 108 23329.9193232 +158 108 -6684.54707697 +159 108 -14301137.6219 +163 108 416676.259817 +164 108 1344116.96715 +165 108 -2296979.40748 +109 109 305878308.174 +110 109 66094123.115 +157 109 -800256.904552 +158 109 6040684.68178 +160 109 64525494.457 +161 109 -4237812.99363 +110 110 549336918.275 +157 110 -8988441.97885 +158 110 800256.904552 +160 110 -4237812.99363 +161 110 48915452.1011 +111 111 715555.555556 +162 111 -357777.777778 +112 112 1816739.3315 +113 112 5341279.87864 +114 112 -3.72529029846e-8 +115 112 -544032.43723 +116 112 -1483724.82881 +117 112 2.23517417908e-8 +157 112 -193836.559394 +158 112 -625279.223852 +159 112 -416676.259817 +163 112 24667.0078012 +164 112 73754.1287474 +165 112 -27106.375452 +166 112 -260348.273704 +167 112 -710040.746465 +168 112 484442.198447 +113 113 15814018.062 +114 113 -1.19209289551e-7 +115 113 -1483724.82881 +116 113 -4046522.26039 +117 113 5.96046447754e-8 +157 113 -625279.223852 +158 113 -2017029.75436 +159 113 -1344116.96715 +163 113 73754.1287474 +164 113 222052.369365 +165 113 9164.38855485 +166 113 -710040.746465 +167 113 -1936474.76309 +168 113 1321205.99576 +114 114 18448886.5844 +115 114 2.32830643654e-8 +116 114 6.33299350738e-8 +117 114 931107.693647 +157 114 -416676.259817 +158 114 -1344116.96715 +159 114 -2296979.40748 +163 114 27106.375452 +164 114 -9164.3885549 +165 114 -5492991.14412 +166 114 484442.198447 +167 114 1321205.99576 +168 114 -2315242.24089 +115 115 2558539.62181 +116 115 6138307.60949 +117 115 -5.58793544769e-8 +118 115 -759692.612592 +119 115 -1651505.67955 +120 115 2.70083546639e-8 +163 115 -260348.273704 +164 115 -710040.746465 +165 115 -484442.198447 +166 115 12227.6197723 +167 115 33038.3525623 +168 115 -41457.2556898 +169 115 -379286.632065 +170 115 -824536.156663 +171 115 588085.337671 +116 116 14915778.6682 +117 116 -1.34110450745e-7 +118 116 -1651505.67955 +119 116 -3590229.73815 +120 116 5.77419996262e-8 +163 116 -710040.746465 +164 116 -1936474.76309 +165 116 -1321205.99576 +166 116 33038.3525623 +167 116 89431.3340662 +168 116 17103.8438088 +169 116 -824536.156663 +170 116 -1792469.90579 +171 116 1278446.38624 +117 117 18669379.7869 +118 117 2.51457095146e-8 +119 117 5.40167093277e-8 +120 117 1124555.53479 +163 117 -484442.198447 +164 117 -1321205.99576 +165 117 -2315242.24089 +166 117 41457.2556898 +167 117 -17103.8438089 +168 117 -5695176.55864 +169 117 588085.337671 +170 117 1278446.38624 +171 117 -2352102.70813 +118 118 3880798.16119 +119 118 7110485.96967 +120 118 -4.842877388e-8 +121 118 -1076372.38828 +122 118 -1736084.49722 +123 118 2.98023223877e-8 +166 118 -379286.632065 +167 118 -824536.156663 +168 118 -588085.337671 +169 118 -52167.0393845 +170 118 -83826.4031562 +171 118 -61373.985991 +172 118 -590912.90871 +173 118 -953085.336629 +174 118 741520.302649 +119 119 13318817.2723 +120 119 -9.685754776e-8 +121 119 -1736084.49722 +122 119 -2800136.28584 +123 119 4.842877388e-8 +166 119 -824536.156663 +167 119 -1792469.90579 +168 119 -1278446.38624 +169 119 -83826.4031562 +170 119 -134521.304433 +171 119 32978.3592395 +172 119 -953085.336629 +173 119 -1537234.41392 +174 119 1196000.48814 +120 120 19146980.3477 +121 120 2.421438694e-8 +122 120 3.91155481339e-8 +123 120 1520483.39551 +166 120 -588085.337671 +167 120 -1278446.38624 +168 120 -2352102.70813 +169 120 61373.985991 +170 120 -32978.3592395 +171 120 -6109264.54972 +172 120 741520.302649 +173 120 1196000.48814 +174 120 -2434642.38116 +121 121 6516876.42304 +122 121 8531914.96891 +123 121 -2.23517417908e-8 +124 121 -2626121.17726 +125 121 -2984228.61052 +126 121 9.31322574615e-9 +169 121 -590912.90871 +170 121 -953085.336629 +171 121 -741520.302649 +172 121 222027.67781 +173 121 227177.812693 +174 121 -75251.5247453 +175 121 -1038306.19785 +176 121 -1179893.40665 +177 121 929649.114512 +122 122 11512089.4984 +123 122 -3.72529029846e-8 +124 122 -2984228.61052 +125 122 -3391168.87559 +126 122 1.11758708954e-8 +169 122 -953085.336629 +170 122 -1537234.41392 +171 122 -1196000.48814 +172 122 227177.812693 +173 122 217630.207531 +174 122 55832.4159336 +175 122 -1179893.40665 +176 122 -1340787.9621 +177 122 1056419.44831 +123 123 18361731.7736 +124 123 3.72529029846e-9 +125 123 5.58793544769e-9 +126 123 -125380.553907 +169 123 -741520.302649 +170 123 -1196000.48814 +171 123 -2434642.38116 +172 123 75251.5247453 +173 123 -55832.4159336 +174 123 -5287984.36193 +175 123 929649.114512 +176 123 1056419.44831 +177 123 -2155790.5645 +124 124 11197028.9194 +125 124 7624235.1212 +126 124 -2.23517417908e-8 +127 124 -1154846.00933 +128 124 -476225.158488 +129 124 5.58793544769e-9 +172 124 -1038306.19785 +173 124 -1179893.40665 +174 124 -929649.114512 +175 124 -908773.635179 +176 124 -175831.894858 +177 124 -148519.569575 +178 124 -1760951.03338 +179 124 -726165.37459 +180 124 1300948.03845 +125 125 6560950.4012 +126 125 -1.49011611938e-8 +127 125 -476225.158488 +128 125 -196381.508655 +129 125 2.79396772385e-9 +172 125 -1179893.40665 +173 125 -1340787.9621 +174 125 -1056419.44831 +175 125 -175831.894858 +176 125 153537.59263 +177 125 207978.412157 +178 125 -726165.37459 +179 125 -299449.639006 +180 125 536473.417918 +126 126 21281133.3311 +127 126 3.72529029846e-9 +128 126 1.86264514923e-9 +129 126 4075797.18655 +172 126 -929649.114512 +173 126 -1056419.44831 +174 126 -2155790.5645 +175 126 148519.569575 +176 126 -207978.412157 +177 126 -7295491.64648 +178 126 1300948.03845 +179 126 536473.417918 +180 126 -3164492.7709 +127 127 14087608.2601 +128 127 7.45058059692e-9 +129 127 -7.45058059692e-9 +130 127 -1154846.00933 +131 127 476225.158488 +132 127 5.58793544769e-9 +175 127 -1760951.03338 +176 127 -726165.37459 +177 127 -1300948.03845 +178 127 -2367056.05396 +181 127 -1760951.03338 +182 127 726165.37459 +183 127 1300948.03845 +128 128 2395597.11087 +129 128 7.45058059692e-9 +130 128 476225.158488 +131 128 -196381.508655 +132 128 -2.79396772385e-9 +175 128 -726165.37459 +176 128 -299449.639006 +177 128 -536473.417918 +179 128 -402517.768767 +180 128 429178.734334 +181 128 726165.37459 +182 128 -299449.639006 +183 128 -536473.417918 +129 129 25315942.1547 +130 129 3.72529029846e-9 +131 129 -1.86264514923e-9 +132 129 4075797.18655 +175 129 -1300948.03845 +176 129 -536473.417918 +177 129 -3164492.7709 +178 129 5.58793544769e-9 +179 129 -429178.734334 +180 129 -10404782.7221 +181 129 1300948.03845 +182 129 -536473.417918 +183 129 -3164492.7709 +130 130 11197028.9194 +131 130 -7624235.1212 +132 130 1.49011611938e-8 +133 130 -2626121.17726 +134 130 2984228.61052 +135 130 -9.31322574615e-9 +178 130 -1760951.03338 +179 130 726165.37459 +180 130 -1300948.03845 +181 130 -908773.635179 +182 130 175831.894858 +183 130 148519.569575 +184 130 -1038306.19785 +185 130 1179893.40665 +186 130 929649.114512 +131 131 6560950.4012 +132 131 -7.45058059692e-9 +133 131 2984228.61052 +134 131 -3391168.87559 +135 131 9.31322574615e-9 +178 131 726165.37459 +179 131 -299449.639006 +180 131 536473.417918 +181 131 175831.894858 +182 131 153537.59263 +183 131 207978.412157 +184 131 1179893.40665 +185 131 -1340787.9621 +186 131 -1056419.44831 +132 132 21281133.3311 +133 132 -1.49011611938e-8 +134 132 1.67638063431e-8 +135 132 -125380.553907 +178 132 -1300948.03845 +179 132 536473.417918 +180 132 -3164492.7709 +181 132 -148519.569575 +182 132 -207978.412157 +183 132 -7295491.64648 +184 132 929649.114512 +185 132 -1056419.44831 +186 132 -2155790.5645 +133 133 6516876.42304 +134 133 -8531914.96891 +135 133 1.86264514923e-8 +136 133 -1076372.38828 +137 133 1736084.49722 +138 133 -1.30385160446e-8 +181 133 -1038306.19785 +182 133 1179893.40665 +183 133 -929649.114512 +184 133 222027.67781 +185 133 -227177.812693 +186 133 75251.5247453 +187 133 -590912.90871 +188 133 953085.336629 +189 133 741520.302649 +134 134 11512089.4984 +135 134 -2.98023223877e-8 +136 134 1736084.49722 +137 134 -2800136.28584 +138 134 2.04890966415e-8 +181 134 1179893.40665 +182 134 -1340787.9621 +183 134 1056419.44831 +184 134 -227177.812693 +185 134 217630.207531 +186 134 55832.4159336 +187 134 953085.336629 +188 134 -1537234.41392 +189 134 -1196000.48814 +135 135 18361731.7736 +136 135 -1.67638063431e-8 +137 135 2.79396772385e-8 +138 135 1520483.39551 +181 135 -929649.114512 +182 135 1056419.44831 +183 135 -2155790.5645 +184 135 -75251.5247453 +185 135 -55832.4159336 +186 135 -5287984.36193 +187 135 741520.302649 +188 135 -1196000.48814 +189 135 -2434642.38116 +136 136 3880798.16119 +137 136 -7110485.96967 +138 136 3.35276126862e-8 +139 136 -759692.612592 +140 136 1651505.67955 +141 136 -2.04890966415e-8 +184 136 -590912.90871 +185 136 953085.336629 +186 136 -741520.302649 +187 136 -52167.0393845 +188 136 83826.4031562 +189 136 61373.985991 +190 136 -379286.632065 +191 136 824536.156663 +192 136 588085.337671 +137 137 13318817.2723 +138 137 -5.96046447754e-8 +139 137 1651505.67955 +140 137 -3590229.73815 +141 137 4.47034835815e-8 +184 137 953085.336629 +185 137 -1537234.41392 +186 137 1196000.48814 +187 137 83826.4031562 +188 137 -134521.304433 +189 137 32978.3592395 +190 137 824536.156663 +191 137 -1792469.90579 +192 137 -1278446.38624 +138 138 19146980.3477 +139 138 -2.70083546639e-8 +140 138 5.77419996262e-8 +141 138 1124555.53479 +184 138 -741520.302649 +185 138 1196000.48814 +186 138 -2434642.38116 +187 138 -61373.985991 +188 138 -32978.3592395 +189 138 -6109264.54972 +190 138 588085.337671 +191 138 -1278446.38624 +192 138 -2352102.70813 +139 139 2558539.62181 +140 139 -6138307.60949 +141 139 4.28408384323e-8 +142 139 -544032.43723 +143 139 1483724.82881 +144 139 -2.51457095146e-8 +187 139 -379286.632065 +188 139 824536.156663 +189 139 -588085.337671 +190 139 12227.6197723 +191 139 -33038.3525623 +192 139 41457.2556898 +193 139 -260348.273704 +194 139 710040.746465 +195 139 484442.198447 +140 140 14915778.6682 +141 140 -1.19209289551e-7 +142 140 1483724.82881 +143 140 -4046522.26039 +144 140 7.07805156708e-8 +187 140 824536.156663 +188 140 -1792469.90579 +189 140 1278446.38624 +190 140 -33038.3525623 +191 140 89431.3340662 +192 140 17103.8438088 +193 140 710040.746465 +194 140 -1936474.76309 +195 140 -1321205.99576 +141 141 18669379.7869 +142 141 -2.60770320892e-8 +143 141 7.45058059692e-8 +144 141 931107.693647 +187 141 -588085.337671 +188 141 1278446.38624 +189 141 -2352102.70813 +190 141 -41457.2556898 +191 141 -17103.8438089 +192 141 -5695176.55864 +193 141 484442.198447 +194 141 -1321205.99576 +195 141 -2315242.24089 +142 142 1816739.3315 +143 142 -5341279.87864 +144 142 3.53902578354e-8 +145 142 -413671.243673 +146 142 1334423.36669 +147 142 -7.45058059692e-9 +190 142 -260348.273704 +191 142 710040.746465 +192 142 -484442.198447 +193 142 24667.0078013 +194 142 -73754.1287474 +195 142 27106.375452 +196 142 -193836.559394 +197 142 625279.223852 +198 142 416676.259817 +143 143 15814018.062 +144 143 -1.04308128357e-7 +145 143 1334423.36669 +146 143 -4304591.50545 +147 143 2.60770320892e-8 +190 143 710040.746465 +191 143 -1936474.76309 +192 143 1321205.99576 +193 143 -73754.1287474 +194 143 222052.369365 +195 143 9164.38855485 +196 143 625279.223852 +197 143 -2017029.75436 +198 143 -1344116.96715 +144 144 18448886.5844 +145 144 -9.31322574615e-9 +146 144 2.98023223877e-8 +147 144 830431.306934 +190 144 -484442.198447 +191 144 1321205.99576 +192 144 -2315242.24089 +193 144 -27106.375452 +194 144 -9164.3885549 +195 144 -5492991.14412 +196 144 416676.259817 +197 144 -1344116.96715 +198 144 -2296979.40748 +145 145 2350262.78049 +146 145 -4600302.86075 +147 145 1.86264514923e-8 +148 145 -7.45058059692e-9 +151 145 -311975.890718 +152 145 1184718.57235 +153 145 -1.11758708954e-8 +193 145 -193836.559394 +194 145 625279.223852 +195 145 -416676.259817 +196 145 -474421.1715 +197 145 -131724.429407 +198 145 23329.9193232 +199 145 -800250.281991 +200 145 8988445.57462 +202 145 -144050.092155 +203 145 547025.666412 +204 145 358351.461509 +146 146 17048556.4258 +147 146 -6.70552253723e-8 +148 146 5.96046447754e-8 +149 146 7.45058059692e-9 +151 146 1184718.57235 +152 146 -4498931.28739 +153 146 3.72529029846e-8 +193 146 625279.223852 +194 146 -2017029.75436 +195 146 1344116.96715 +196 146 -131724.429407 +197 146 -28174.4048386 +198 146 6684.54707694 +199 146 -6040681.08601 +200 146 800250.281991 +202 146 547025.666412 +203 146 -2077312.65726 +204 146 -1360828.33484 +147 147 36176122.0894 +151 147 -1.39698386192e-8 +152 147 4.842877388e-8 +153 147 758227.34113 +193 147 -416676.259817 +194 147 1344116.96715 +195 147 -2296979.40748 +196 147 -23329.9193232 +197 147 -6684.54707698 +198 147 -14301137.6219 +202 147 358351.461509 +203 147 -1360828.33484 +204 147 -2284273.33935 +148 148 305878011.196 +149 148 -66093576.1502 +196 148 800250.281991 +197 148 6040681.08601 +199 148 64525513.4986 +200 148 4237777.92342 +149 149 549337215.254 +196 149 -8988445.57462 +197 149 -800250.281991 +199 149 4237777.92342 +200 149 48915433.0595 +150 150 715555.555556 +201 150 -357777.777778 +151 151 1011851.60912 +152 151 -4110093.43272 +153 151 6.51925802231e-8 +196 151 -144050.092155 +197 151 547025.666412 +198 151 -358351.461509 +202 151 22134.9913963 +203 151 -90320.9940529 +204 151 18909.0650259 +152 152 16788621.6609 +153 152 -2.68220901489e-7 +196 152 547025.666412 +197 152 -2077312.65726 +198 152 1360828.33484 +202 152 -90320.9940529 +203 152 370626.696215 +204 152 4631.25243446 +153 153 18240145.4814 +196 153 -358351.461509 +197 153 1360828.33484 +198 153 -2284273.33935 +202 153 -18909.0650259 +203 153 -4631.25243458 +204 153 -5293544.01962 +154 154 1011851.60912 +155 154 4110093.43272 +156 154 -4.842877388e-8 +157 154 -311975.890718 +158 154 -1184718.57235 +159 154 1.02445483208e-8 +205 154 22134.9913963 +206 154 90320.994053 +207 154 -18909.0650259 +208 154 -144050.092155 +209 154 -547025.666412 +210 154 358351.461509 +155 155 16788621.6609 +156 155 -2.08616256714e-7 +157 155 -1184718.57235 +158 155 -4498931.28739 +159 155 3.35276126862e-8 +205 155 90320.994053 +206 155 370626.696215 +207 155 4631.25243448 +208 155 -547025.666412 +209 155 -2077312.65726 +210 155 1360828.33484 +156 156 18240145.4814 +157 156 9.31322574615e-9 +158 156 2.98023223877e-8 +159 156 758227.34113 +205 156 18909.0650259 +206 156 -4631.25243456 +207 156 -5293544.01962 +208 156 358351.461509 +209 156 1360828.33484 +210 156 -2284273.33935 +157 157 2350262.38096 +158 157 4600302.12491 +159 157 -2.98023223877e-8 +160 157 2.98023223877e-8 +161 157 -1.19209289551e-7 +163 157 -413671.243673 +164 157 -1334423.36669 +165 157 1.67638063431e-8 +205 157 -144050.092155 +206 157 -547025.666412 +207 157 -358351.461509 +208 157 -474420.971735 +209 157 131724.797327 +210 157 -23329.9193232 +211 157 800256.904552 +212 157 8988441.97885 +214 157 -193836.559394 +215 157 -625279.223852 +216 157 416676.259817 +158 158 17048556.8253 +159 158 -9.685754776e-8 +160 158 5.96046447754e-8 +163 158 -1334423.36669 +164 158 -4304591.50545 +165 158 5.21540641785e-8 +205 158 -547025.666412 +206 158 -2077312.65726 +207 158 -1360828.33484 +208 158 131724.797327 +209 158 -28174.6046033 +210 158 6684.54707694 +211 158 -6040684.68178 +212 158 -800256.904552 +214 158 -625279.223852 +215 158 -2017029.75436 +216 158 1344116.96715 +159 159 36176122.0894 +163 159 1.39698386192e-8 +164 159 4.09781932831e-8 +165 159 830431.306934 +205 159 -358351.461509 +206 159 -1360828.33484 +207 159 -2284273.33935 +208 159 23329.9193232 +209 159 -6684.54707697 +210 159 -14301137.6219 +214 159 416676.259817 +215 159 1344116.96715 +216 159 -2296979.40748 +160 160 305878308.174 +161 160 66094123.115 +208 160 -800256.904552 +209 160 6040684.68178 +211 160 64525494.457 +212 160 -4237812.99363 +161 161 549336918.275 +208 161 -8988441.97885 +209 161 800256.904552 +211 161 -4237812.99363 +212 161 48915452.1011 +162 162 715555.555556 +213 162 -357777.777778 +163 163 1816739.3315 +164 163 5341279.87864 +165 163 -3.91155481339e-8 +166 163 -544032.43723 +167 163 -1483724.82881 +168 163 2.51457095146e-8 +208 163 -193836.559394 +209 163 -625279.223852 +210 163 -416676.259817 +214 163 24667.0078013 +215 163 73754.1287475 +216 163 -27106.375452 +217 163 -260348.273704 +218 163 -710040.746465 +219 163 484442.198447 +164 164 15814018.062 +165 164 -1.26659870148e-7 +166 164 -1483724.82881 +167 164 -4046522.26039 +168 164 6.70552253723e-8 +208 164 -625279.223852 +209 164 -2017029.75436 +210 164 -1344116.96715 +214 164 73754.1287475 +215 164 222052.369365 +216 164 9164.38855485 +217 164 -710040.746465 +218 164 -1936474.76309 +219 164 1321205.99576 +165 165 18448886.5844 +166 165 2.23517417908e-8 +167 165 5.96046447754e-8 +168 165 931107.693647 +208 165 -416676.259817 +209 165 -1344116.96715 +210 165 -2296979.40748 +214 165 27106.375452 +215 165 -9164.3885549 +216 165 -5492991.14412 +217 165 484442.198447 +218 165 1321205.99576 +219 165 -2315242.24089 +166 166 2558539.62181 +167 166 6138307.60949 +168 166 -5.21540641785e-8 +169 166 -759692.612592 +170 166 -1651505.67955 +171 166 3.16649675369e-8 +214 166 -260348.273704 +215 166 -710040.746465 +216 166 -484442.198447 +217 166 12227.6197723 +218 166 33038.3525623 +219 166 -41457.2556898 +220 166 -379286.632065 +221 166 -824536.156663 +222 166 588085.337671 +167 167 14915778.6682 +168 167 -1.26659870148e-7 +169 167 -1651505.67955 +170 167 -3590229.73815 +171 167 6.70552253723e-8 +214 167 -710040.746465 +215 167 -1936474.76309 +216 167 -1321205.99576 +217 167 33038.3525623 +218 167 89431.3340663 +219 167 17103.8438088 +220 167 -824536.156663 +221 167 -1792469.90579 +222 167 1278446.38624 +168 168 18669379.7869 +169 168 2.88709998131e-8 +170 168 6.14672899246e-8 +171 168 1124555.53479 +214 168 -484442.198447 +215 168 -1321205.99576 +216 168 -2315242.24089 +217 168 41457.2556898 +218 168 -17103.8438089 +219 168 -5695176.55864 +220 168 588085.337671 +221 168 1278446.38624 +222 168 -2352102.70813 +169 169 3880798.16119 +170 169 7110485.96967 +171 169 -4.09781932831e-8 +172 169 -1076372.38828 +173 169 -1736084.49722 +174 169 2.421438694e-8 +217 169 -379286.632065 +218 169 -824536.156663 +219 169 -588085.337671 +220 169 -52167.0393845 +221 169 -83826.4031561 +222 169 -61373.985991 +223 169 -590912.90871 +224 169 -953085.336629 +225 169 741520.302649 +170 170 13318817.2723 +171 170 -8.19563865662e-8 +172 170 -1736084.49722 +173 170 -2800136.28584 +174 170 3.91155481339e-8 +217 170 -824536.156663 +218 170 -1792469.90579 +219 170 -1278446.38624 +220 170 -83826.4031561 +221 170 -134521.304432 +222 170 32978.3592395 +223 170 -953085.336629 +224 170 -1537234.41392 +225 170 1196000.48814 +171 171 19146980.3477 +172 171 1.86264514923e-8 +173 171 3.35276126862e-8 +174 171 1520483.39551 +217 171 -588085.337671 +218 171 -1278446.38624 +219 171 -2352102.70813 +220 171 61373.985991 +221 171 -32978.3592395 +222 171 -6109264.54972 +223 171 741520.302649 +224 171 1196000.48814 +225 171 -2434642.38116 +172 172 6516876.42304 +173 172 8531914.96891 +174 172 -1.86264514923e-8 +175 172 -2626121.17726 +176 172 -2984228.61052 +177 172 5.58793544769e-9 +220 172 -590912.90871 +221 172 -953085.336629 +222 172 -741520.302649 +223 172 222027.67781 +224 172 227177.812693 +225 172 -75251.5247453 +226 172 -1038306.19785 +227 172 -1179893.40665 +228 172 929649.114512 +173 173 11512089.4984 +174 173 -2.98023223877e-8 +175 173 -2984228.61052 +176 173 -3391168.87559 +177 173 9.31322574615e-9 +220 173 -953085.336629 +221 173 -1537234.41392 +222 173 -1196000.48814 +223 173 227177.812693 +224 173 217630.207531 +225 173 55832.4159336 +226 173 -1179893.40665 +227 173 -1340787.9621 +228 173 1056419.44831 +174 174 18361731.7736 +175 174 1.86264514923e-9 +176 174 3.72529029846e-9 +177 174 -125380.553907 +220 174 -741520.302649 +221 174 -1196000.48814 +222 174 -2434642.38116 +223 174 75251.5247453 +224 174 -55832.4159336 +225 174 -5287984.36193 +226 174 929649.114512 +227 174 1056419.44831 +228 174 -2155790.5645 +175 175 11197028.9194 +176 175 7624235.1212 +177 175 -2.98023223877e-8 +178 175 -1154846.00933 +179 175 -476225.158488 +180 175 1.67638063431e-8 +223 175 -1038306.19785 +224 175 -1179893.40665 +225 175 -929649.114512 +226 175 -908773.635179 +227 175 -175831.894858 +228 175 -148519.569575 +229 175 -1760951.03338 +230 175 -726165.37459 +231 175 1300948.03845 +176 176 6560950.4012 +177 176 -1.49011611938e-8 +178 176 -476225.158488 +179 176 -196381.508655 +180 176 7.45058059692e-9 +223 176 -1179893.40665 +224 176 -1340787.9621 +225 176 -1056419.44831 +226 176 -175831.894858 +227 176 153537.59263 +228 176 207978.412157 +229 176 -726165.37459 +230 176 -299449.639006 +231 176 536473.417918 +177 177 21281133.3311 +180 177 4075797.18655 +223 177 -929649.114512 +224 177 -1056419.44831 +225 177 -2155790.5645 +226 177 148519.569575 +227 177 -207978.412157 +228 177 -7295491.64648 +229 177 1300948.03845 +230 177 536473.417918 +231 177 -3164492.7709 +178 178 14087608.2601 +179 178 7.45058059692e-9 +180 178 -7.45058059692e-9 +181 178 -1154846.00933 +182 178 476225.158488 +183 178 1.67638063431e-8 +226 178 -1760951.03338 +227 178 -726165.37459 +228 178 -1300948.03845 +229 178 -2367056.05396 +230 178 7.45058059692e-9 +231 178 -9.31322574615e-9 +232 178 -1760951.03338 +233 178 726165.37459 +234 178 1300948.03845 +179 179 2395597.11087 +180 179 1.49011611938e-8 +181 179 476225.158488 +182 179 -196381.508655 +183 179 -7.45058059692e-9 +226 179 -726165.37459 +227 179 -299449.639006 +228 179 -536473.417918 +229 179 1.11758708954e-8 +230 179 -402517.768767 +231 179 429178.734334 +232 179 726165.37459 +233 179 -299449.639006 +234 179 -536473.417918 +180 180 25315942.1547 +183 180 4075797.18655 +226 180 -1300948.03845 +227 180 -536473.417918 +228 180 -3164492.7709 +229 180 5.58793544769e-9 +230 180 -429178.734334 +231 180 -10404782.7221 +232 180 1300948.03845 +233 180 -536473.417918 +234 180 -3164492.7709 +181 181 11197028.9194 +182 181 -7624235.1212 +183 181 3.35276126862e-8 +184 181 -2626121.17726 +185 181 2984228.61052 +186 181 -9.31322574615e-9 +229 181 -1760951.03338 +230 181 726165.37459 +231 181 -1300948.03845 +232 181 -908773.635179 +233 181 175831.894858 +234 181 148519.569575 +235 181 -1038306.19785 +236 181 1179893.40665 +237 181 929649.114512 +182 182 6560950.4012 +183 182 -2.23517417908e-8 +184 182 2984228.61052 +185 182 -3391168.87559 +186 182 9.31322574615e-9 +229 182 726165.37459 +230 182 -299449.639006 +231 182 536473.417918 +232 182 175831.894858 +233 182 153537.59263 +234 182 207978.412157 +235 182 1179893.40665 +236 182 -1340787.9621 +237 182 -1056419.44831 +183 183 21281133.3311 +184 183 -1.30385160446e-8 +185 183 1.49011611938e-8 +186 183 -125380.553907 +229 183 -1300948.03845 +230 183 536473.417918 +231 183 -3164492.7709 +232 183 -148519.569575 +233 183 -207978.412157 +234 183 -7295491.64648 +235 183 929649.114512 +236 183 -1056419.44831 +237 183 -2155790.5645 +184 184 6516876.42304 +185 184 -8531914.96891 +186 184 1.86264514923e-8 +187 184 -1076372.38828 +188 184 1736084.49722 +189 184 -1.30385160446e-8 +232 184 -1038306.19785 +233 184 1179893.40665 +234 184 -929649.114512 +235 184 222027.67781 +236 184 -227177.812693 +237 184 75251.5247453 +238 184 -590912.90871 +239 184 953085.336629 +240 184 741520.302649 +185 185 11512089.4984 +186 185 -2.23517417908e-8 +187 185 1736084.49722 +188 185 -2800136.28584 +189 185 2.04890966415e-8 +232 185 1179893.40665 +233 185 -1340787.9621 +234 185 1056419.44831 +235 185 -227177.812693 +236 185 217630.207531 +237 185 55832.4159336 +238 185 953085.336629 +239 185 -1537234.41392 +240 185 -1196000.48814 +186 186 18361731.7736 +187 186 -1.67638063431e-8 +188 186 2.60770320892e-8 +189 186 1520483.39551 +232 186 -929649.114512 +233 186 1056419.44831 +234 186 -2155790.5645 +235 186 -75251.5247453 +236 186 -55832.4159336 +237 186 -5287984.36193 +238 186 741520.302649 +239 186 -1196000.48814 +240 186 -2434642.38116 +187 187 3880798.16119 +188 187 -7110485.96967 +189 187 3.72529029846e-8 +190 187 -759692.612592 +191 187 1651505.67955 +192 187 -1.67638063431e-8 +235 187 -590912.90871 +236 187 953085.336629 +237 187 -741520.302649 +238 187 -52167.0393845 +239 187 83826.4031561 +240 187 61373.985991 +241 187 -379286.632065 +242 187 824536.156663 +243 187 588085.337671 +188 188 13318817.2723 +189 188 -6.70552253723e-8 +190 188 1651505.67955 +191 188 -3590229.73815 +192 188 3.72529029846e-8 +235 188 953085.336629 +236 188 -1537234.41392 +237 188 1196000.48814 +238 188 83826.4031561 +239 188 -134521.304432 +240 188 32978.3592395 +241 188 824536.156663 +242 188 -1792469.90579 +243 188 -1278446.38624 +189 189 19146980.3477 +190 189 -2.32830643654e-8 +191 189 5.02914190292e-8 +192 189 1124555.53479 +235 189 -741520.302649 +236 189 1196000.48814 +237 189 -2434642.38116 +238 189 -61373.985991 +239 189 -32978.3592395 +240 189 -6109264.54972 +241 189 588085.337671 +242 189 -1278446.38624 +243 189 -2352102.70813 +190 190 2558539.62181 +191 190 -6138307.60949 +192 190 4.28408384323e-8 +193 190 -544032.43723 +194 190 1483724.82881 +195 190 -2.421438694e-8 +238 190 -379286.632065 +239 190 824536.156663 +240 190 -588085.337671 +241 190 12227.6197724 +242 190 -33038.3525623 +243 190 41457.2556898 +244 190 -260348.273704 +245 190 710040.746465 +246 190 484442.198447 +191 191 14915778.6682 +192 191 -1.11758708954e-7 +193 191 1483724.82881 +194 191 -4046522.26039 +195 191 6.70552253723e-8 +238 191 824536.156663 +239 191 -1792469.90579 +240 191 1278446.38624 +241 191 -33038.3525623 +242 191 89431.3340663 +243 191 17103.8438088 +244 191 710040.746465 +245 191 -1936474.76309 +246 191 -1321205.99576 +192 192 18669379.7869 +193 192 -2.70083546639e-8 +194 192 7.82310962677e-8 +195 192 931107.693647 +238 192 -588085.337671 +239 192 1278446.38624 +240 192 -2352102.70813 +241 192 -41457.2556898 +242 192 -17103.8438089 +243 192 -5695176.55864 +244 192 484442.198447 +245 192 -1321205.99576 +246 192 -2315242.24089 +193 193 1816739.3315 +194 193 -5341279.87864 +195 193 3.53902578354e-8 +196 193 -413671.243673 +197 193 1334423.36669 +198 193 -7.45058059692e-9 +241 193 -260348.273704 +242 193 710040.746465 +243 193 -484442.198447 +244 193 24667.0078013 +245 193 -73754.1287475 +246 193 27106.375452 +247 193 -193836.559394 +248 193 625279.223852 +249 193 416676.259817 +194 194 15814018.062 +195 194 -1.04308128357e-7 +196 194 1334423.36669 +197 194 -4304591.50545 +198 194 2.60770320892e-8 +241 194 710040.746465 +242 194 -1936474.76309 +243 194 1321205.99576 +244 194 -73754.1287475 +245 194 222052.369365 +246 194 9164.38855485 +247 194 625279.223852 +248 194 -2017029.75436 +249 194 -1344116.96715 +195 195 18448886.5844 +196 195 -1.11758708954e-8 +197 195 3.72529029846e-8 +198 195 830431.306934 +241 195 -484442.198447 +242 195 1321205.99576 +243 195 -2315242.24089 +244 195 -27106.375452 +245 195 -9164.3885549 +246 195 -5492991.14412 +247 195 416676.259817 +248 195 -1344116.96715 +249 195 -2296979.40748 +196 196 2350262.78049 +197 196 -4600302.86075 +198 196 1.86264514923e-8 +199 196 -7.45058059692e-9 +202 196 -311975.890718 +203 196 1184718.57235 +204 196 -9.31322574615e-9 +244 196 -193836.559394 +245 196 625279.223852 +246 196 -416676.259817 +247 196 -474421.1715 +248 196 -131724.429407 +249 196 23329.9193232 +250 196 -800250.281991 +251 196 8988445.57462 +253 196 -144050.092155 +254 196 547025.666412 +255 196 358351.461509 +197 197 17048556.4258 +198 197 -6.70552253723e-8 +199 197 5.96046447754e-8 +200 197 7.45058059692e-9 +202 197 1184718.57235 +203 197 -4498931.28739 +204 197 2.98023223877e-8 +244 197 625279.223852 +245 197 -2017029.75436 +246 197 1344116.96715 +247 197 -131724.429407 +248 197 -28174.4048385 +249 197 6684.54707694 +250 197 -6040681.08601 +251 197 800250.281991 +253 197 547025.666412 +254 197 -2077312.65726 +255 197 -1360828.33484 +198 198 36176122.0894 +202 198 -1.11758708954e-8 +203 198 3.72529029846e-8 +204 198 758227.34113 +244 198 -416676.259817 +245 198 1344116.96715 +246 198 -2296979.40748 +247 198 -23329.9193232 +248 198 -6684.54707698 +249 198 -14301137.6219 +253 198 358351.461509 +254 198 -1360828.33484 +255 198 -2284273.33935 +199 199 305878011.196 +200 199 -66093576.1502 +247 199 800250.281991 +248 199 6040681.08601 +250 199 64525513.4986 +251 199 4237777.92342 +200 200 549337215.254 +247 200 -8988445.57462 +248 200 -800250.281991 +250 200 4237777.92342 +251 200 48915433.0595 +201 201 715555.555556 +252 201 -357777.777778 +202 202 1011851.60912 +203 202 -4110093.43272 +204 202 6.33299350738e-8 +247 202 -144050.092155 +248 202 547025.666412 +249 202 -358351.461509 +253 202 22134.9913963 +254 202 -90320.994053 +255 202 18909.0650259 +203 203 16788621.6609 +204 203 -2.53319740295e-7 +247 203 547025.666412 +248 203 -2077312.65726 +249 203 1360828.33484 +253 203 -90320.994053 +254 203 370626.696215 +255 203 4631.25243446 +204 204 18240145.4814 +247 204 -358351.461509 +248 204 1360828.33484 +249 204 -2284273.33935 +253 204 -18909.0650259 +254 204 -4631.25243459 +255 204 -5293544.01962 +205 205 1011851.60912 +206 205 4110093.43272 +207 205 -4.47034835815e-8 +208 205 -311975.890718 +209 205 -1184718.57235 +210 205 1.11758708954e-8 +256 205 22134.9913963 +257 205 90320.9940529 +258 205 -18909.0650259 +259 205 -144050.092155 +260 205 -547025.666412 +261 205 358351.461509 +206 206 16788621.6609 +207 206 -1.9371509552e-7 +208 206 -1184718.57235 +209 206 -4498931.28739 +210 206 3.72529029846e-8 +256 206 90320.9940529 +257 206 370626.696215 +258 206 4631.25243447 +259 206 -547025.666412 +260 206 -2077312.65726 +261 206 1360828.33484 +207 207 18240145.4814 +208 207 1.11758708954e-8 +209 207 3.72529029846e-8 +210 207 758227.34113 +256 207 18909.0650259 +257 207 -4631.25243456 +258 207 -5293544.01962 +259 207 358351.461509 +260 207 1360828.33484 +261 207 -2284273.33935 +208 208 2350262.38096 +209 208 4600302.12491 +210 208 -2.98023223877e-8 +211 208 2.98023223877e-8 +212 208 -1.19209289551e-7 +214 208 -413671.243673 +215 208 -1334423.36669 +216 208 1.58324837685e-8 +256 208 -144050.092155 +257 208 -547025.666412 +258 208 -358351.461509 +259 208 -474420.971735 +260 208 131724.797327 +261 208 -23329.9193232 +262 208 800256.904552 +263 208 8988441.97885 +265 208 -193836.559394 +266 208 -625279.223852 +267 208 416676.259817 +209 209 17048556.8253 +210 209 -9.685754776e-8 +211 209 5.96046447754e-8 +214 209 -1334423.36669 +215 209 -4304591.50545 +216 209 4.842877388e-8 +256 209 -547025.666412 +257 209 -2077312.65726 +258 209 -1360828.33484 +259 209 131724.797327 +260 209 -28174.6046033 +261 209 6684.54707694 +262 209 -6040684.68178 +263 209 -800256.904552 +265 209 -625279.223852 +266 209 -2017029.75436 +267 209 1344116.96715 +210 210 36176122.0894 +214 210 1.30385160446e-8 +215 210 3.72529029846e-8 +216 210 830431.306934 +256 210 -358351.461509 +257 210 -1360828.33484 +258 210 -2284273.33935 +259 210 23329.9193232 +260 210 -6684.54707697 +261 210 -14301137.6219 +265 210 416676.259817 +266 210 1344116.96715 +267 210 -2296979.40748 +211 211 305878308.174 +212 211 66094123.115 +259 211 -800256.904552 +260 211 6040684.68178 +262 211 64525494.457 +263 211 -4237812.99363 +212 212 549336918.275 +259 212 -8988441.97885 +260 212 800256.904552 +262 212 -4237812.99363 +263 212 48915452.1011 +213 213 715555.555556 +264 213 -357777.777778 +214 214 1816739.3315 +215 214 5341279.87864 +216 214 -3.72529029846e-8 +217 214 -544032.43723 +218 214 -1483724.82881 +219 214 2.51457095146e-8 +259 214 -193836.559394 +260 214 -625279.223852 +261 214 -416676.259817 +265 214 24667.0078013 +266 214 73754.1287475 +267 214 -27106.375452 +268 214 -260348.273704 +269 214 -710040.746465 +270 214 484442.198447 +215 215 15814018.062 +216 215 -1.19209289551e-7 +217 215 -1483724.82881 +218 215 -4046522.26039 +219 215 6.70552253723e-8 +259 215 -625279.223852 +260 215 -2017029.75436 +261 215 -1344116.96715 +265 215 73754.1287475 +266 215 222052.369365 +267 215 9164.38855485 +268 215 -710040.746465 +269 215 -1936474.76309 +270 215 1321205.99576 +216 216 18448886.5844 +217 216 2.60770320892e-8 +218 216 6.70552253723e-8 +219 216 931107.693647 +259 216 -416676.259817 +260 216 -1344116.96715 +261 216 -2296979.40748 +265 216 27106.375452 +266 216 -9164.38855491 +267 216 -5492991.14412 +268 216 484442.198447 +269 216 1321205.99576 +270 216 -2315242.24089 +217 217 2558539.62181 +218 217 6138307.60949 +219 217 -5.58793544769e-8 +220 217 -759692.612592 +221 217 -1651505.67955 +222 217 2.79396772385e-8 +265 217 -260348.273704 +266 217 -710040.746465 +267 217 -484442.198447 +268 217 12227.6197723 +269 217 33038.3525623 +270 217 -41457.2556898 +271 217 -379286.632065 +272 217 -824536.156663 +273 217 588085.337671 +218 218 14915778.6682 +219 218 -1.41561031342e-7 +220 218 -1651505.67955 +221 218 -3590229.73815 +222 218 6.14672899246e-8 +265 218 -710040.746465 +266 218 -1936474.76309 +267 218 -1321205.99576 +268 218 33038.3525623 +269 218 89431.3340663 +270 218 17103.8438088 +271 218 -824536.156663 +272 218 -1792469.90579 +273 218 1278446.38624 +219 219 18669379.7869 +220 219 2.70083546639e-8 +221 219 5.77419996262e-8 +222 219 1124555.53479 +265 219 -484442.198447 +266 219 -1321205.99576 +267 219 -2315242.24089 +268 219 41457.2556898 +269 219 -17103.8438089 +270 219 -5695176.55864 +271 219 588085.337671 +272 219 1278446.38624 +273 219 -2352102.70813 +220 220 3880798.16119 +221 220 7110485.96967 +222 220 -4.09781932831e-8 +223 220 -1076372.38828 +224 220 -1736084.49722 +225 220 2.421438694e-8 +268 220 -379286.632065 +269 220 -824536.156663 +270 220 -588085.337671 +271 220 -52167.0393845 +272 220 -83826.4031562 +273 220 -61373.985991 +274 220 -590912.90871 +275 220 -953085.336629 +276 220 741520.302649 +221 221 13318817.2723 +222 221 -8.19563865662e-8 +223 221 -1736084.49722 +224 221 -2800136.28584 +225 221 3.91155481339e-8 +268 221 -824536.156663 +269 221 -1792469.90579 +270 221 -1278446.38624 +271 221 -83826.4031562 +272 221 -134521.304433 +273 221 32978.3592395 +274 221 -953085.336629 +275 221 -1537234.41392 +276 221 1196000.48814 +222 222 19146980.3477 +223 222 1.49011611938e-8 +224 222 2.79396772385e-8 +225 222 1520483.39551 +268 222 -588085.337671 +269 222 -1278446.38624 +270 222 -2352102.70813 +271 222 61373.985991 +272 222 -32978.3592395 +273 222 -6109264.54972 +274 222 741520.302649 +275 222 1196000.48814 +276 222 -2434642.38116 +223 223 6516876.42304 +224 223 8531914.96891 +225 223 -1.49011611938e-8 +226 223 -2626121.17726 +227 223 -2984228.61052 +228 223 1.30385160446e-8 +271 223 -590912.90871 +272 223 -953085.336629 +273 223 -741520.302649 +274 223 222027.67781 +275 223 227177.812693 +276 223 -75251.5247453 +277 223 -1038306.19785 +278 223 -1179893.40665 +279 223 929649.114512 +224 224 11512089.4984 +225 224 -1.49011611938e-8 +226 224 -2984228.61052 +227 224 -3391168.87559 +228 224 1.30385160446e-8 +271 224 -953085.336629 +272 224 -1537234.41392 +273 224 -1196000.48814 +274 224 227177.812693 +275 224 217630.207531 +276 224 55832.4159336 +277 224 -1179893.40665 +278 224 -1340787.9621 +279 224 1056419.44831 +225 225 18361731.7736 +226 225 3.72529029846e-9 +227 225 5.58793544769e-9 +228 225 -125380.553907 +271 225 -741520.302649 +272 225 -1196000.48814 +273 225 -2434642.38116 +274 225 75251.5247453 +275 225 -55832.4159336 +276 225 -5287984.36193 +277 225 929649.114512 +278 225 1056419.44831 +279 225 -2155790.5645 +226 226 11197028.9194 +227 226 7624235.1212 +228 226 2.23517417908e-8 +229 226 -1154846.00933 +230 226 -476225.158488 +231 226 -3.72529029846e-9 +274 226 -1038306.19785 +275 226 -1179893.40665 +276 226 -929649.114512 +277 226 -908773.635179 +278 226 -175831.894858 +279 226 -148519.569575 +280 226 -1760951.03338 +281 226 -726165.37459 +282 226 1300948.03845 +227 227 6560950.4012 +228 227 7.45058059692e-9 +229 227 -476225.158488 +230 227 -196381.508655 +231 227 -1.86264514923e-9 +274 227 -1179893.40665 +275 227 -1340787.9621 +276 227 -1056419.44831 +277 227 -175831.894858 +278 227 153537.59263 +279 227 207978.412157 +280 227 -726165.37459 +281 227 -299449.639006 +282 227 536473.417918 +228 228 21281133.3311 +229 228 -3.72529029846e-9 +230 228 -1.86264514923e-9 +231 228 4075797.18655 +274 228 -929649.114512 +275 228 -1056419.44831 +276 228 -2155790.5645 +277 228 148519.569575 +278 228 -207978.412157 +279 228 -7295491.64648 +280 228 1300948.03845 +281 228 536473.417918 +282 228 -3164492.7709 +229 229 14087608.2601 +230 229 -7.45058059692e-9 +231 229 7.45058059692e-9 +232 229 -1154846.00933 +233 229 476225.158488 +234 229 -3.72529029846e-9 +277 229 -1760951.03338 +278 229 -726165.37459 +279 229 -1300948.03845 +280 229 -2367056.05396 +281 229 1.11758708954e-8 +282 229 1.86264514923e-9 +283 229 -1760951.03338 +284 229 726165.37459 +285 229 1300948.03845 +230 230 2395597.11087 +231 230 -7.45058059692e-9 +232 230 476225.158488 +233 230 -196381.508655 +234 230 1.86264514923e-9 +277 230 -726165.37459 +278 230 -299449.639006 +279 230 -536473.417918 +280 230 9.31322574615e-9 +281 230 -402517.768767 +282 230 429178.734334 +283 230 726165.37459 +284 230 -299449.639006 +285 230 -536473.417918 +231 231 25315942.1547 +232 231 -3.72529029846e-9 +233 231 1.86264514923e-9 +234 231 4075797.18655 +277 231 -1300948.03845 +278 231 -536473.417918 +279 231 -3164492.7709 +281 231 -429178.734334 +282 231 -10404782.7221 +283 231 1300948.03845 +284 231 -536473.417918 +285 231 -3164492.7709 +232 232 11197028.9194 +233 232 -7624235.1212 +234 232 -1.49011611938e-8 +235 232 -2626121.17726 +236 232 2984228.61052 +237 232 -5.58793544769e-9 +280 232 -1760951.03338 +281 232 726165.37459 +282 232 -1300948.03845 +283 232 -908773.635179 +284 232 175831.894858 +285 232 148519.569575 +286 232 -1038306.19785 +287 232 1179893.40665 +288 232 929649.114512 +233 233 6560950.4012 +234 233 7.45058059692e-9 +235 233 2984228.61052 +236 233 -3391168.87559 +237 233 5.58793544769e-9 +280 233 726165.37459 +281 233 -299449.639006 +282 233 536473.417918 +283 233 175831.894858 +284 233 153537.59263 +285 233 207978.412157 +286 233 1179893.40665 +287 233 -1340787.9621 +288 233 -1056419.44831 +234 234 21281133.3311 +235 234 -1.49011611938e-8 +236 234 1.67638063431e-8 +237 234 -125380.553907 +280 234 -1300948.03845 +281 234 536473.417918 +282 234 -3164492.7709 +283 234 -148519.569575 +284 234 -207978.412157 +285 234 -7295491.64648 +286 234 929649.114512 +287 234 -1056419.44831 +288 234 -2155790.5645 +235 235 6516876.42304 +236 235 -8531914.96891 +237 235 3.72529029846e-8 +238 235 -1076372.38828 +239 235 1736084.49722 +240 235 -1.30385160446e-8 +283 235 -1038306.19785 +284 235 1179893.40665 +285 235 -929649.114512 +286 235 222027.67781 +287 235 -227177.812693 +288 235 75251.5247453 +289 235 -590912.90871 +290 235 953085.336629 +291 235 741520.302649 +236 236 11512089.4984 +237 236 -4.47034835815e-8 +238 236 1736084.49722 +239 236 -2800136.28584 +240 236 2.04890966415e-8 +283 236 1179893.40665 +284 236 -1340787.9621 +285 236 1056419.44831 +286 236 -227177.812693 +287 236 217630.207531 +288 236 55832.4159336 +289 236 953085.336629 +290 236 -1537234.41392 +291 236 -1196000.48814 +237 237 18361731.7736 +238 237 -2.23517417908e-8 +239 237 3.72529029846e-8 +240 237 1520483.39551 +283 237 -929649.114512 +284 237 1056419.44831 +285 237 -2155790.5645 +286 237 -75251.5247453 +287 237 -55832.4159336 +288 237 -5287984.36193 +289 237 741520.302649 +290 237 -1196000.48814 +291 237 -2434642.38116 +238 238 3880798.16119 +239 238 -7110485.96967 +240 238 3.72529029846e-8 +241 238 -759692.612592 +242 238 1651505.67955 +243 238 -1.86264514923e-8 +286 238 -590912.90871 +287 238 953085.336629 +288 238 -741520.302649 +289 238 -52167.0393845 +290 238 83826.4031562 +291 238 61373.985991 +292 238 -379286.632065 +293 238 824536.156663 +294 238 588085.337671 +239 239 13318817.2723 +240 239 -6.70552253723e-8 +241 239 1651505.67955 +242 239 -3590229.73815 +243 239 4.09781932831e-8 +286 239 953085.336629 +287 239 -1537234.41392 +288 239 1196000.48814 +289 239 83826.4031562 +290 239 -134521.304432 +291 239 32978.3592395 +292 239 824536.156663 +293 239 -1792469.90579 +294 239 -1278446.38624 +240 240 19146980.3477 +241 240 -2.51457095146e-8 +242 240 5.40167093277e-8 +243 240 1124555.53479 +286 240 -741520.302649 +287 240 1196000.48814 +288 240 -2434642.38116 +289 240 -61373.985991 +290 240 -32978.3592395 +291 240 -6109264.54972 +292 240 588085.337671 +293 240 -1278446.38624 +294 240 -2352102.70813 +241 241 2558539.62181 +242 241 -6138307.60949 +243 241 4.28408384323e-8 +244 241 -544032.43723 +245 241 1483724.82881 +246 241 -2.23517417908e-8 +289 241 -379286.632065 +290 241 824536.156663 +291 241 -588085.337671 +292 241 12227.6197723 +293 241 -33038.3525623 +294 241 41457.2556898 +295 241 -260348.273704 +296 241 710040.746465 +297 241 484442.198447 +242 242 14915778.6682 +243 242 -1.11758708954e-7 +244 242 1483724.82881 +245 242 -4046522.26039 +246 242 6.33299350738e-8 +289 242 824536.156663 +290 242 -1792469.90579 +291 242 1278446.38624 +292 242 -33038.3525623 +293 242 89431.3340663 +294 242 17103.8438088 +295 242 710040.746465 +296 242 -1936474.76309 +297 242 -1321205.99576 +243 243 18669379.7869 +244 243 -2.60770320892e-8 +245 243 7.45058059692e-8 +246 243 931107.693647 +289 243 -588085.337671 +290 243 1278446.38624 +291 243 -2352102.70813 +292 243 -41457.2556898 +293 243 -17103.8438089 +294 243 -5695176.55864 +295 243 484442.198447 +296 243 -1321205.99576 +297 243 -2315242.24089 +244 244 1816739.3315 +245 244 -5341279.87864 +246 244 3.35276126862e-8 +247 244 -413671.243673 +248 244 1334423.36669 +249 244 -6.51925802231e-9 +292 244 -260348.273704 +293 244 710040.746465 +294 244 -484442.198447 +295 244 24667.0078013 +296 244 -73754.1287475 +297 244 27106.375452 +298 244 -193836.559394 +299 244 625279.223852 +300 244 416676.259817 +245 245 15814018.062 +246 245 -9.685754776e-8 +247 245 1334423.36669 +248 245 -4304591.50545 +249 245 2.23517417908e-8 +292 245 710040.746465 +293 245 -1936474.76309 +294 245 1321205.99576 +295 245 -73754.1287475 +296 245 222052.369365 +297 245 9164.38855486 +298 245 625279.223852 +299 245 -2017029.75436 +300 245 -1344116.96715 +246 246 18448886.5844 +247 246 -9.31322574615e-9 +248 246 2.98023223877e-8 +249 246 830431.306934 +292 246 -484442.198447 +293 246 1321205.99576 +294 246 -2315242.24089 +295 246 -27106.375452 +296 246 -9164.38855491 +297 246 -5492991.14412 +298 246 416676.259817 +299 246 -1344116.96715 +300 246 -2296979.40748 +247 247 2350262.78049 +248 247 -4600302.86075 +249 247 1.86264514923e-8 +250 247 -7.45058059692e-9 +253 247 -311975.890718 +254 247 1184718.57235 +255 247 -1.02445483208e-8 +295 247 -193836.559394 +296 247 625279.223852 +297 247 -416676.259817 +298 247 -474421.1715 +299 247 -131724.429407 +300 247 23329.9193232 +301 247 -800250.281991 +302 247 8988445.57462 +304 247 -144050.092155 +305 247 547025.666412 +306 247 358351.461509 +248 248 17048556.4258 +249 248 -6.70552253723e-8 +250 248 5.96046447754e-8 +251 248 7.45058059692e-9 +253 248 1184718.57235 +254 248 -4498931.28739 +255 248 3.72529029846e-8 +295 248 625279.223852 +296 248 -2017029.75436 +297 248 1344116.96715 +298 248 -131724.429407 +299 248 -28174.4048384 +300 248 6684.54707695 +301 248 -6040681.08601 +302 248 800250.281991 +304 248 547025.666412 +305 248 -2077312.65726 +306 248 -1360828.33484 +249 249 36176122.0894 +253 249 -1.210719347e-8 +254 249 4.09781932831e-8 +255 249 758227.34113 +295 249 -416676.259817 +296 249 1344116.96715 +297 249 -2296979.40748 +298 249 -23329.9193232 +299 249 -6684.54707698 +300 249 -14301137.6219 +304 249 358351.461509 +305 249 -1360828.33484 +306 249 -2284273.33935 +250 250 305878011.196 +251 250 -66093576.1502 +298 250 800250.281991 +299 250 6040681.08601 +301 250 64525513.4986 +302 250 4237777.92342 +251 251 549337215.254 +298 251 -8988445.57462 +299 251 -800250.281991 +301 251 4237777.92342 +302 251 48915433.0595 +252 252 715555.555556 +303 252 -357777.777778 +253 253 1011851.60912 +254 253 -4110093.43272 +255 253 6.33299350738e-8 +298 253 -144050.092155 +299 253 547025.666412 +300 253 -358351.461509 +304 253 22134.9913963 +305 253 -90320.994053 +306 253 18909.0650259 +254 254 16788621.6609 +255 254 -2.60770320892e-7 +298 254 547025.666412 +299 254 -2077312.65726 +300 254 1360828.33484 +304 254 -90320.994053 +305 254 370626.696215 +306 254 4631.25243446 +255 255 18240145.4814 +298 255 -358351.461509 +299 255 1360828.33484 +300 255 -2284273.33935 +304 255 -18909.0650259 +305 255 -4631.25243459 +306 255 -5293544.01962 +256 256 983097.517609 +257 256 3993191.05725 +258 256 -3.72529029846e-8 +259 256 -268071.177508 +260 256 -1017991.81332 +261 256 1.39698386192e-8 +257 257 16310675.5472 +258 257 -1.56462192535e-7 +259 257 -1017991.81332 +260 257 -3865791.69616 +261 257 4.842877388e-8 +258 258 19175351.0344 +259 258 7.45058059692e-9 +260 258 2.60770320892e-8 +261 258 1324183.34296 +259 259 2528206.57902 +260 259 4472508.77878 +261 259 -1.86264514923e-8 +262 259 -161794.959894 +263 259 1643725.47145 +265 259 -354732.167298 +266 259 -1144297.31386 +267 259 1.76951289177e-8 +307 259 -183325.791023 +308 259 -591373.519429 +309 259 416676.259817 +260 260 16817023.5501 +261 260 -6.70552253723e-8 +262 260 -2239699.42799 +263 260 161794.959894 +265 260 -1144297.31386 +266 260 -3691281.65763 +267 260 5.21540641785e-8 +307 260 -591373.519429 +308 260 -1907656.51429 +309 260 1344116.96715 +261 261 39001825.1235 +265 261 1.39698386192e-8 +266 261 4.09781932831e-8 +267 261 1397983.15475 +307 261 416676.259817 +308 261 1344116.96715 +309 261 -2538358.87127 +262 262 329627273.449 +263 262 65098710.708 +263 263 569419268.28 +264 264 790573.476703 +265 265 1768961.88645 +266 265 5200497.8108 +267 265 -3.91155481339e-8 +268 265 -465133.879389 +269 265 -1268546.94379 +270 265 2.32830643654e-8 +307 265 -89281.9039061 +308 265 -261158.775213 +309 265 -27106.375452 +310 265 -246970.319543 +311 265 -673555.416935 +312 265 484442.198447 +266 266 15396260.6937 +267 266 -1.26659870148e-7 +268 266 -1268546.94379 +269 266 -3459673.48306 +270 266 6.70552253723e-8 +307 266 -261158.775213 +308 266 -769227.571739 +309 266 9164.38855484 +310 266 -673555.416935 +311 266 -1836969.31891 +312 266 1321205.99576 +267 267 19430253.1852 +268 267 1.67638063431e-8 +269 267 4.09781932831e-8 +270 267 1501024.18544 +307 267 27106.375452 +308 267 -9164.38855489 +309 267 -7121142.78387 +310 267 484442.198447 +311 267 1321205.99576 +312 267 -2564546.07772 +268 268 2497002.01247 +269 268 5989724.5569 +270 268 -4.47034835815e-8 +271 268 -645500.420471 +272 268 -1403261.78363 +273 268 2.98023223877e-8 +307 268 -246970.319543 +308 268 -673555.416935 +309 268 -484442.198447 +310 268 -150094.32553 +311 268 -356091.902114 +312 268 -41457.2556898 +313 268 -361895.781536 +314 268 -786729.959862 +315 268 588085.337671 +269 269 14552393.0113 +270 269 -9.685754776e-8 +271 269 -1403261.78363 +272 269 -3050569.09485 +273 269 6.33299350738e-8 +307 269 -673555.416935 +308 269 -1836969.31891 +309 269 -1321205.99576 +310 269 -356091.902114 +311 269 -855385.258208 +312 269 17103.8438088 +313 269 -786729.959862 +314 269 -1710282.52144 +315 269 1278446.38624 +270 270 19697338.3132 +271 270 2.51457095146e-8 +272 270 5.40167093277e-8 +273 270 1699467.28443 +307 270 -484442.198447 +308 270 -1321205.99576 +309 270 -2564546.07772 +310 270 41457.2556898 +311 270 -17103.8438089 +312 270 -7353984.06298 +313 270 588085.337671 +314 270 1278446.38624 +315 270 -2616778.13471 +271 271 3805513.9161 +272 271 6969546.89216 +273 271 -4.09781932831e-8 +274 271 -900913.14915 +275 271 -1453085.72444 +276 271 2.23517417908e-8 +310 271 -361895.781536 +311 271 -786729.959862 +312 271 -588085.337671 +313 271 -304176.348108 +314 271 -544599.533137 +315 271 -61373.985991 +316 271 -570661.636677 +317 271 -920421.994641 +318 271 741520.302649 +272 272 13049076.8844 +273 272 -8.19563865662e-8 +274 272 -1453085.72444 +275 272 -2343686.65232 +276 272 3.72529029846e-8 +310 272 -786729.959862 +311 272 -1710282.52144 +312 272 -1278446.38624 +313 272 -544599.533137 +314 272 -995761.387375 +315 272 32978.3592395 +316 272 -920421.994641 +317 272 -1484551.60426 +318 272 1196000.48814 +273 273 20269767.9526 +274 273 2.23517417908e-8 +275 273 3.53902578354e-8 +276 273 2107431.22341 +310 273 -588085.337671 +311 273 -1278446.38624 +312 273 -2616778.13471 +313 273 61373.985991 +314 273 -32978.3592395 +315 273 -7832517.92941 +316 273 741520.302649 +317 273 1196000.48814 +318 273 -2731360.75727 +274 274 6311393.43185 +275 274 8279110.50413 +276 274 -3.35276126862e-8 +277 274 -2301041.15788 +278 274 -2614819.49759 +279 274 2.23517417908e-8 +313 274 -570661.636677 +314 274 -920421.994641 +315 274 -741520.302649 +316 274 -175770.085153 +317 274 -298827.840692 +318 274 -75251.5247453 +319 274 -955815.974241 +320 274 -1086154.51618 +321 274 929649.114512 +275 275 11193680.9464 +276 275 -5.21540641785e-8 +277 275 -2614819.49759 +278 275 -2971385.79271 +279 275 2.60770320892e-8 +313 275 -920421.994641 +314 275 -1484551.60426 +315 275 -1196000.48814 +316 275 -298827.840692 +317 275 -499398.232929 +318 275 55832.4159336 +319 275 -1086154.51618 +320 275 -1234266.49566 +321 275 1056419.44831 +276 276 19292741.7183 +277 276 1.67638063431e-8 +278 276 1.86264514923e-8 +279 276 427942.721782 +313 276 -741520.302649 +314 276 -1196000.48814 +315 276 -2731360.75727 +316 276 75251.5247453 +317 276 -55832.4159336 +318 276 -6893760.43768 +319 276 929649.114512 +320 276 1056419.44831 +321 276 -2324577.161 +277 277 11173430.2083 +278 277 7495059.08719 +279 277 -5.21540641785e-8 +280 277 -678836.974673 +281 277 -279932.773061 +282 277 9.31322574615e-9 +316 277 -955815.974241 +317 277 -1086154.51618 +318 277 -929649.114512 +319 277 -1698063.33368 +320 277 -676945.37624 +321 277 -148519.569575 +322 277 -1831641.90145 +323 277 -755316.248019 +324 277 1300948.03845 +278 278 6371949.42588 +279 278 -1.86264514923e-8 +280 278 -279932.773061 +281 278 -115436.195077 +282 278 2.79396772385e-9 +316 278 -1086154.51618 +317 278 -1234266.49566 +318 278 -1056419.44831 +319 278 -676945.37624 +320 278 -252690.316209 +321 278 207978.412157 +322 278 -755316.248019 +323 278 -311470.61774 +324 278 536473.417918 +279 279 22658086.7563 +280 279 -1.86264514923e-9 +282 279 4790763.62708 +316 279 -929649.114512 +317 279 -1056419.44831 +318 279 -2324577.161 +319 279 148519.569575 +320 279 -207978.412157 +321 279 -9252258.07493 +322 279 1300948.03845 +323 279 536473.417918 +324 279 -3684182.88731 +280 280 14370371.7322 +281 280 7.45058059692e-9 +282 280 -7.45058059692e-9 +283 280 -678836.974673 +284 280 279932.773061 +285 280 9.31322574615e-9 +319 280 -1831641.90145 +320 280 -755316.248019 +321 280 -1300948.03845 +322 280 -3460455.85927 +323 280 -3.72529029846e-9 +324 280 -5.58793544769e-9 +325 280 -1831641.90145 +326 280 755316.248019 +327 280 1300948.03845 +281 281 2443681.02578 +282 281 1.11758708954e-8 +283 281 279932.773061 +284 281 -115436.195077 +285 281 -2.79396772385e-9 +319 281 -755316.248019 +320 281 -311470.61774 +321 281 -536473.417918 +322 281 -3.72529029846e-9 +323 281 -588450.353367 +324 281 429178.734334 +325 281 755316.248019 +326 281 -311470.61774 +327 281 -536473.417918 +282 282 27394702.6193 +283 282 -1.86264514923e-9 +285 282 4790763.62708 +319 282 -1300948.03845 +320 282 -536473.417918 +321 282 -3684182.88731 +322 282 3.72529029846e-9 +323 282 -429178.734334 +324 282 -12874095.835 +325 282 1300948.03845 +326 282 -536473.417918 +327 282 -3684182.88731 +283 283 11173430.2083 +284 283 -7495059.08719 +285 283 2.98023223877e-8 +286 283 -2301041.15788 +287 283 2614819.49759 +288 283 -5.58793544769e-9 +322 283 -1831641.90145 +323 283 755316.248019 +324 283 -1300948.03845 +325 283 -1698063.33368 +326 283 676945.37624 +327 283 148519.569575 +328 283 -955815.974241 +329 283 1086154.51618 +330 283 929649.114512 +284 284 6371949.42588 +286 284 2614819.49759 +287 284 -2971385.79271 +288 284 3.72529029846e-9 +322 284 755316.248019 +323 284 -311470.61774 +324 284 536473.417918 +325 284 676945.37624 +326 284 -252690.316209 +327 284 207978.412157 +328 284 1086154.51618 +329 284 -1234266.49566 +330 284 -1056419.44831 +285 285 22658086.7563 +286 285 -9.31322574615e-9 +287 285 1.30385160446e-8 +288 285 427942.721782 +322 285 -1300948.03845 +323 285 536473.417918 +324 285 -3684182.88731 +325 285 -148519.569575 +326 285 -207978.412157 +327 285 -9252258.07493 +328 285 929649.114512 +329 285 -1056419.44831 +330 285 -2324577.161 +286 286 6311393.43185 +287 286 -8279110.50413 +288 286 2.98023223877e-8 +289 286 -900913.14915 +290 286 1453085.72444 +291 286 -1.67638063431e-8 +325 286 -955815.974241 +326 286 1086154.51618 +327 286 -929649.114512 +328 286 -175770.085153 +329 286 298827.840692 +330 286 75251.5247453 +331 286 -570661.636677 +332 286 920421.994641 +333 286 741520.302649 +287 287 11193680.9464 +288 287 -4.47034835815e-8 +289 287 1453085.72444 +290 287 -2343686.65232 +291 287 2.60770320892e-8 +325 287 1086154.51618 +326 287 -1234266.49566 +327 287 1056419.44831 +328 287 298827.840692 +329 287 -499398.232929 +330 287 55832.4159336 +331 287 920421.994641 +332 287 -1484551.60426 +333 287 -1196000.48814 +288 288 19292741.7183 +289 288 -1.67638063431e-8 +290 288 2.79396772385e-8 +291 288 2107431.22341 +325 288 -929649.114512 +326 288 1056419.44831 +327 288 -2324577.161 +328 288 -75251.5247453 +329 288 -55832.4159336 +330 288 -6893760.43768 +331 288 741520.302649 +332 288 -1196000.48814 +333 288 -2731360.75727 +289 289 3805513.9161 +290 289 -6969546.89216 +291 289 2.98023223877e-8 +292 289 -645500.420471 +293 289 1403261.78363 +294 289 -2.04890966415e-8 +328 289 -570661.636677 +329 289 920421.994641 +330 289 -741520.302649 +331 289 -304176.348108 +332 289 544599.533137 +333 289 61373.985991 +334 289 -361895.781536 +335 289 786729.959862 +336 289 588085.337671 +290 290 13049076.8844 +291 290 -5.96046447754e-8 +292 290 1403261.78363 +293 290 -3050569.09485 +294 290 4.47034835815e-8 +328 290 920421.994641 +329 290 -1484551.60426 +330 290 1196000.48814 +331 290 544599.533137 +332 290 -995761.387374 +333 290 32978.3592395 +334 290 786729.959862 +335 290 -1710282.52144 +336 290 -1278446.38624 +291 291 20269767.9526 +292 291 -2.51457095146e-8 +293 291 5.40167093277e-8 +294 291 1699467.28443 +328 291 -741520.302649 +329 291 1196000.48814 +330 291 -2731360.75727 +331 291 -61373.985991 +332 291 -32978.3592395 +333 291 -7832517.9294 +334 291 588085.337671 +335 291 -1278446.38624 +336 291 -2616778.13471 +292 292 2497002.01247 +293 292 -5989724.5569 +294 292 3.53902578354e-8 +295 292 -465133.879389 +296 292 1268546.94379 +297 292 -1.95577740669e-8 +331 292 -361895.781536 +332 292 786729.959862 +333 292 -588085.337671 +334 292 -150094.32553 +335 292 356091.902114 +336 292 41457.2556898 +337 292 -246970.319543 +338 292 673555.416935 +339 292 484442.198447 +293 293 14552393.0113 +294 293 -8.19563865662e-8 +295 293 1268546.94379 +296 293 -3459673.48306 +297 293 4.842877388e-8 +331 293 786729.959862 +332 293 -1710282.52144 +333 293 1278446.38624 +334 293 356091.902114 +335 293 -855385.258208 +336 293 17103.8438089 +337 293 673555.416935 +338 293 -1836969.31891 +339 293 -1321205.99576 +294 294 19697338.3132 +295 294 -2.98023223877e-8 +296 294 8.94069671631e-8 +297 294 1501024.18544 +331 294 -588085.337671 +332 294 1278446.38624 +333 294 -2616778.13471 +334 294 -41457.2556898 +335 294 -17103.8438089 +336 294 -7353984.06298 +337 294 484442.198447 +338 294 -1321205.99576 +339 294 -2564546.07772 +295 295 1768961.88645 +296 295 -5200497.8108 +297 295 4.28408384323e-8 +298 295 -354732.167298 +299 295 1144297.31386 +300 295 -7.45058059692e-9 +334 295 -246970.319543 +335 295 673555.416935 +336 295 -484442.198447 +337 295 -89281.9039061 +338 295 261158.775213 +339 295 27106.375452 +296 296 15396260.6937 +297 296 -1.26659870148e-7 +298 296 1144297.31386 +299 296 -3691281.65763 +300 296 2.60770320892e-8 +334 296 673555.416935 +335 296 -1836969.31891 +336 296 1321205.99576 +337 296 261158.775213 +338 296 -769227.571739 +339 296 9164.38855485 +297 297 19430253.1852 +298 297 -1.02445483208e-8 +299 297 3.35276126862e-8 +300 297 1397983.15475 +334 297 -484442.198447 +335 297 1321205.99576 +336 297 -2564546.07772 +337 297 -27106.375452 +338 297 -9164.38855489 +339 297 -7121142.78387 +298 298 2528206.97157 +299 298 -4472509.50178 +300 298 1.30385160446e-8 +301 298 161793.620953 +302 298 1643724.74446 +304 298 -268071.177508 +305 298 1017991.81332 +306 298 -7.45058059692e-9 +337 298 -183325.791023 +338 298 591373.519429 +339 298 -416676.259817 +299 299 16817023.1576 +300 299 -4.47034835815e-8 +301 299 -2239700.15498 +302 299 -161793.620953 +304 299 1017991.81332 +305 299 -3865791.69616 +306 299 2.98023223877e-8 +337 299 591373.519429 +338 299 -1907656.51429 +339 299 1344116.96715 +300 300 39001825.1235 +304 300 -1.58324837685e-8 +305 300 5.58793544769e-8 +306 300 1324183.34296 +337 300 -416676.259817 +338 300 1344116.96715 +339 300 -2538358.87127 +301 301 329626980.943 +302 301 -65098171.9808 +302 302 569419560.785 +303 303 790573.476703 +304 304 983097.517609 +305 304 -3993191.05725 +306 304 5.21540641785e-8 +305 305 16310675.5472 +306 305 -2.16066837311e-7 +306 306 19175351.0344 +307 307 1902223.18075 +308 307 5590205.99024 +309 307 -2.421438694e-8 +310 307 -77037.3094958 +311 307 -210101.75317 +312 307 1.86264514923e-8 +340 307 -718178.246541 +341 307 -2108958.17516 +342 307 -27106.375452 +343 307 -300633.375282 +344 307 -819909.205315 +345 307 484442.198447 +308 308 16543837.5893 +309 308 -8.19563865662e-8 +310 308 -210101.75317 +311 308 -573004.781374 +312 308 4.842877388e-8 +340 308 -2108958.17516 +341 308 -6236511.30779 +342 308 9164.38855485 +343 308 -819909.205315 +344 308 -2236116.0145 +345 308 1321205.99576 +309 309 30501291.4656 +310 309 2.421438694e-8 +311 309 6.70552253723e-8 +312 309 5508023.65258 +340 309 27106.375452 +341 309 -9164.3885549 +342 309 -19001911.4947 +343 309 484442.198447 +344 309 1321205.99576 +345 309 -5113778.6239 +310 310 2722764.08058 +311 310 6525095.96362 +312 310 -4.842877388e-8 +313 310 -76937.6348729 +314 310 -167255.727985 +315 310 2.32830643654e-8 +340 310 -300633.375282 +341 310 -819909.205315 +342 310 -484442.198447 +343 310 -1057312.76972 +344 310 -2529098.59693 +345 310 -41457.2556898 +346 310 -451882.564601 +347 310 -982353.401306 +348 310 588085.337671 +311 311 15837837.4467 +312 311 -1.26659870148e-7 +313 311 -167255.727985 +314 311 -363599.408662 +315 311 5.21540641785e-8 +340 311 -819909.205315 +341 311 -2236116.0145 +342 311 -1321205.99576 +343 311 -2529098.59693 +344 311 -6126929.2712 +345 311 17103.8438088 +346 311 -982353.401306 +347 311 -2135550.8724 +348 311 1278446.38624 +312 312 31131706.3634 +313 312 3.16649675369e-8 +314 312 6.89178705216e-8 +315 312 5787467.22392 +340 312 -484442.198447 +341 312 -1321205.99576 +342 312 -5113778.6239 +343 312 41457.2556898 +344 312 -17103.8438089 +345 312 -19507359.9875 +346 312 588085.337671 +347 312 1278446.38624 +348 312 -5270750.35301 +313 313 4267595.81742 +314 313 7796294.34309 +315 313 -5.21540641785e-8 +316 313 -4790.05038338 +317 313 -7725.88771512 +318 313 2.04890966415e-8 +343 313 -451882.564601 +344 313 -982353.401306 +345 313 -588085.337671 +346 313 -1747893.8743 +347 313 -3178566.02079 +348 313 -61373.985991 +349 313 -749357.926948 +350 313 -1208641.81766 +351 313 741520.302649 +314 314 14559614.5621 +315 314 -9.685754776e-8 +316 314 -7725.88771512 +317 314 -12461.109218 +318 314 2.98023223877e-8 +343 314 -982353.401306 +344 314 -2135550.8724 +345 314 -1278446.38624 +346 314 -3178566.02079 +347 314 -5907985.37222 +348 314 32978.3592395 +349 314 -1208641.81766 +350 314 -1949422.28655 +351 314 1196000.48814 +315 315 32450763.4987 +316 315 1.11758708954e-8 +317 315 2.421438694e-8 +318 315 6373223.13441 +343 315 -588085.337671 +344 315 -1278446.38624 +345 315 -5270750.35301 +346 315 61373.985991 +347 315 -32978.3592395 +348 315 -20553554.1703 +349 315 741520.302649 +350 315 1196000.48814 +351 315 -5606492.51233 +316 316 6563466.92161 +317 316 8716568.29938 +318 316 -2.23517417908e-8 +319 316 -797223.130676 +320 316 -905935.375768 +321 316 1.86264514923e-8 +346 316 -749357.926948 +347 316 -1208641.81766 +348 316 -741520.302649 +349 316 -2303950.19297 +350 316 -3145795.04337 +351 316 -75251.5247453 +352 316 -1005897.92455 +353 316 -1143065.82336 +354 316 929649.114512 +317 317 11934357.6383 +318 317 -3.72529029846e-8 +319 317 -905935.375768 +320 317 -1029472.01792 +321 317 2.04890966415e-8 +346 317 -1208641.81766 +347 317 -1949422.28655 +348 317 -1196000.48814 +349 317 -3145795.04337 +350 317 -4425847.45616 +351 317 55832.4159336 +352 317 -1143065.82336 +353 317 -1298938.43563 +354 317 1056419.44831 +318 318 30008520.3637 +319 318 1.30385160446e-8 +320 318 1.86264514923e-8 +321 318 4063389.39899 +346 318 -741520.302649 +347 318 -1196000.48814 +348 318 -5606492.51233 +349 318 75251.5247453 +350 318 -55832.4159336 +351 318 -18547112.2702 +352 318 929649.114512 +353 318 1056419.44831 +354 318 -4341829.75862 +319 319 13789595.5493 +320 319 8526963.46189 +321 319 -1.49011611938e-8 +322 319 2189391.67462 +323 319 902841.927677 +324 319 3.72529029846e-9 +349 319 -1005897.92455 +350 319 -1143065.82336 +351 319 -929649.114512 +352 319 -6588902.98151 +353 319 -3583442.90451 +354 319 -148519.569575 +355 319 -3101441.97781 +356 319 -1278945.14549 +357 319 1300948.03845 +320 320 6744151.21474 +321 320 -2.23517417908e-8 +322 320 902841.927677 +323 320 372305.949557 +324 320 2.79396772385e-9 +349 320 -1143065.82336 +350 320 -1298938.43563 +351 320 -1056419.44831 +352 320 -3583442.90451 +353 320 -2462219.22114 +354 320 207978.412157 +355 320 -1278945.14549 +356 320 -527400.059996 +357 320 536473.417918 +321 321 37051709.8254 +322 321 1.86264514923e-9 +324 321 10537577.5004 +349 321 -929649.114512 +350 321 -1056419.44831 +351 321 -4341829.75862 +352 321 148519.569575 +353 321 -207978.412157 +354 321 -23874563.7281 +355 321 1300948.03845 +356 321 536473.417918 +357 321 -8175265.11488 +322 322 19732335.5073 +323 322 -1.49011611938e-8 +324 322 -7.45058059692e-9 +325 322 2189391.67462 +326 322 -902841.927677 +327 322 3.72529029846e-9 +352 322 -3101441.97781 +353 322 -1278945.14549 +354 322 -1300948.03845 +355 322 -10784495.2388 +356 322 1.49011611938e-8 +358 322 -3101441.97781 +359 322 1278945.14549 +360 322 1300948.03845 +323 323 3355482.70929 +325 323 -902841.927677 +326 323 372305.949557 +327 323 -2.79396772385e-9 +352 323 -1278945.14549 +353 323 -527400.059996 +354 323 -536473.417918 +355 323 1.49011611938e-8 +356 323 -1833902.89956 +357 323 429178.734334 +358 323 1278945.14549 +359 323 -527400.059996 +360 323 -536473.417918 +324 324 47437791.9854 +325 324 1.86264514923e-9 +327 324 10537577.5004 +352 324 -1300948.03845 +353 324 -536473.417918 +354 324 -8175265.11488 +355 324 5.58793544769e-9 +356 324 -429178.734334 +357 324 -31919955.1469 +358 324 1300948.03845 +359 324 -536473.417918 +360 324 -8175265.11488 +325 325 13789595.5493 +326 325 -8526963.46189 +327 325 3.72529029846e-9 +328 325 -797223.130676 +329 325 905935.375768 +330 325 -1.11758708954e-8 +355 325 -3101441.97781 +356 325 1278945.14549 +357 325 -1300948.03845 +358 325 -6588902.98151 +359 325 3583442.90451 +360 325 148519.569575 +361 325 -1005897.92455 +362 325 1143065.82336 +363 325 929649.114512 +326 326 6744151.21474 +327 326 -2.23517417908e-8 +328 326 905935.375768 +329 326 -1029472.01792 +330 326 1.30385160446e-8 +355 326 1278945.14549 +356 326 -527400.059996 +357 326 536473.417918 +358 326 3583442.90451 +359 326 -2462219.22114 +360 326 207978.412157 +361 326 1143065.82336 +362 326 -1298938.43563 +363 326 -1056419.44831 +327 327 37051709.8254 +328 327 -2.23517417908e-8 +329 327 2.23517417908e-8 +330 327 4063389.39899 +355 327 -1300948.03845 +356 327 536473.417918 +357 327 -8175265.11488 +358 327 -148519.569575 +359 327 -207978.412157 +360 327 -23874563.7281 +361 327 929649.114512 +362 327 -1056419.44831 +363 327 -4341829.75862 +328 328 6563466.92161 +329 328 -8716568.29938 +330 328 1.11758708954e-8 +331 328 -4790.05038338 +332 328 7725.88771513 +333 328 -1.49011611938e-8 +358 328 -1005897.92455 +359 328 1143065.82336 +360 328 -929649.114512 +361 328 -2303950.19297 +362 328 3145795.04337 +363 328 75251.5247453 +364 328 -749357.926948 +365 328 1208641.81766 +366 328 741520.302649 +329 329 11934357.6383 +330 329 -1.49011611938e-8 +331 329 7725.88771514 +332 329 -12461.109218 +333 329 2.60770320892e-8 +358 329 1143065.82336 +359 329 -1298938.43563 +360 329 1056419.44831 +361 329 3145795.04337 +362 329 -4425847.45616 +363 329 55832.4159336 +364 329 1208641.81766 +365 329 -1949422.28655 +366 329 -1196000.48814 +330 330 30008520.3637 +331 330 -1.67638063431e-8 +332 330 2.421438694e-8 +333 330 6373223.13441 +358 330 -929649.114512 +359 330 1056419.44831 +360 330 -4341829.75862 +361 330 -75251.5247453 +362 330 -55832.4159336 +363 330 -18547112.2702 +364 330 741520.302649 +365 330 -1196000.48814 +366 330 -5606492.51233 +331 331 4267595.81742 +332 331 -7796294.34309 +333 331 4.09781932831e-8 +334 331 -76937.6348729 +335 331 167255.727985 +336 331 -1.95577740669e-8 +361 331 -749357.926948 +362 331 1208641.81766 +363 331 -741520.302649 +364 331 -1747893.8743 +365 331 3178566.02079 +366 331 61373.985991 +367 331 -451882.564601 +368 331 982353.401306 +369 331 588085.337671 +332 332 14559614.5621 +333 332 -8.19563865662e-8 +334 332 167255.727985 +335 332 -363599.408662 +336 332 4.28408384323e-8 +361 332 1208641.81766 +362 332 -1949422.28655 +363 332 1196000.48814 +364 332 3178566.02079 +365 332 -5907985.37222 +366 332 32978.3592395 +367 332 982353.401306 +368 332 -2135550.8724 +369 332 -1278446.38624 +333 333 32450763.4987 +334 333 -1.76951289177e-8 +335 333 3.72529029846e-8 +336 333 5787467.22392 +361 333 -741520.302649 +362 333 1196000.48814 +363 333 -5606492.51233 +364 333 -61373.985991 +365 333 -32978.3592395 +366 333 -20553554.1703 +367 333 588085.337671 +368 333 -1278446.38624 +369 333 -5270750.35301 +334 334 2722764.08058 +335 334 -6525095.96362 +336 334 3.91155481339e-8 +337 334 -77037.3094958 +338 334 210101.75317 +339 334 -2.51457095146e-8 +364 334 -451882.564601 +365 334 982353.401306 +366 334 -588085.337671 +367 334 -1057312.76972 +368 334 2529098.59693 +369 334 41457.2556898 +370 334 -300633.375282 +371 334 819909.205315 +372 334 484442.198447 +335 335 15837837.4467 +336 335 -1.04308128357e-7 +337 335 210101.75317 +338 335 -573004.781374 +339 335 7.45058059692e-8 +364 335 982353.401306 +365 335 -2135550.8724 +366 335 1278446.38624 +367 335 2529098.59693 +368 335 -6126929.2712 +369 335 17103.8438089 +370 335 819909.205315 +371 335 -2236116.0145 +372 335 -1321205.99576 +336 336 31131706.3633 +337 336 -2.32830643654e-8 +338 336 6.33299350738e-8 +339 336 5508023.65258 +364 336 -588085.337671 +365 336 1278446.38624 +366 336 -5270750.35301 +367 336 -41457.2556898 +368 336 -17103.8438089 +369 336 -19507359.9875 +370 336 484442.198447 +371 336 -1321205.99576 +372 336 -5113778.6239 +337 337 1902223.18075 +338 337 -5590205.99024 +339 337 2.60770320892e-8 +367 337 -300633.375282 +368 337 819909.205315 +369 337 -484442.198447 +370 337 -718178.246541 +371 337 2108958.17516 +372 337 27106.375452 +338 338 16543837.5893 +339 338 -7.45058059692e-8 +367 338 819909.205315 +368 338 -2236116.0145 +369 338 1321205.99576 +370 338 2108958.17516 +371 338 -6236511.30779 +372 338 9164.38855486 +339 339 30501291.4656 +367 339 -484442.198447 +368 339 1321205.99576 +369 339 -5113778.6239 +370 339 -27106.375452 +371 339 -9164.38855491 +372 339 -19001911.4947 +340 340 1902223.18075 +341 340 5590205.99024 +342 340 -4.842877388e-8 +343 340 -77037.3094958 +344 340 -210101.75317 +345 340 2.70083546639e-8 +376 340 -183325.791023 +377 340 -591373.519429 +378 340 -416676.259817 +382 340 -89281.9039061 +383 340 -261158.775213 +384 340 -27106.375452 +385 340 -246970.319543 +386 340 -673555.416935 +387 340 484442.198447 +341 341 16543837.5893 +342 341 -1.41561031342e-7 +343 341 -210101.75317 +344 341 -573004.781374 +345 341 7.45058059692e-8 +376 341 -591373.519429 +377 341 -1907656.51429 +378 341 -1344116.96715 +382 341 -261158.775213 +383 341 -769227.571739 +384 341 9164.38855484 +385 341 -673555.416935 +386 341 -1836969.31891 +387 341 1321205.99576 +342 342 30501291.4656 +343 342 1.58324837685e-8 +344 342 4.09781932831e-8 +345 342 5508023.65258 +376 342 -416676.259817 +377 342 -1344116.96715 +378 342 -2538358.87127 +382 342 27106.375452 +383 342 -9164.38855489 +384 342 -7121142.78386 +385 342 484442.198447 +386 342 1321205.99576 +387 342 -2564546.07772 +343 343 2722764.08058 +344 343 6525095.96362 +345 343 -5.21540641785e-8 +346 343 -76937.6348729 +347 343 -167255.727985 +348 343 3.35276126862e-8 +382 343 -246970.319543 +383 343 -673555.416935 +384 343 -484442.198447 +385 343 -150094.325529 +386 343 -356091.902114 +387 343 -41457.2556898 +388 343 -361895.781536 +389 343 -786729.959862 +390 343 588085.337671 +344 344 15837837.4467 +345 344 -1.11758708954e-7 +346 344 -167255.727985 +347 344 -363599.408662 +348 344 7.264316082e-8 +382 344 -673555.416935 +383 344 -1836969.31891 +384 344 -1321205.99576 +385 344 -356091.902114 +386 344 -855385.258208 +387 344 17103.8438088 +388 344 -786729.959862 +389 344 -1710282.52144 +390 344 1278446.38624 +345 345 31131706.3633 +346 345 1.86264514923e-8 +347 345 4.09781932831e-8 +348 345 5787467.22392 +382 345 -484442.198447 +383 345 -1321205.99576 +384 345 -2564546.07772 +385 345 41457.2556898 +386 345 -17103.8438089 +387 345 -7353984.06298 +388 345 588085.337671 +389 345 1278446.38624 +390 345 -2616778.13471 +346 346 4267595.81742 +347 346 7796294.34309 +348 346 -2.23517417908e-8 +349 346 -4790.05038347 +350 346 -7725.88771528 +351 346 1.86264514923e-8 +385 346 -361895.781536 +386 346 -786729.959862 +387 346 -588085.337671 +388 346 -304176.348108 +389 346 -544599.533136 +390 346 -61373.985991 +391 346 -570661.636677 +392 346 -920421.994641 +393 346 741520.302649 +347 347 14559614.5621 +348 347 -5.21540641785e-8 +349 347 -7725.88771528 +350 347 -12461.1092182 +351 347 3.16649675369e-8 +385 347 -786729.959862 +386 347 -1710282.52144 +387 347 -1278446.38624 +388 347 -544599.533136 +389 347 -995761.387374 +390 347 32978.3592395 +391 347 -920421.994641 +392 347 -1484551.60426 +393 347 1196000.48814 +348 348 32450763.4987 +349 348 1.67638063431e-8 +350 348 2.421438694e-8 +351 348 6373223.13441 +385 348 -588085.337671 +386 348 -1278446.38624 +387 348 -2616778.13471 +388 348 61373.985991 +389 348 -32978.3592395 +390 348 -7832517.9294 +391 348 741520.302649 +392 348 1196000.48814 +393 348 -2731360.75727 +349 349 6563466.92161 +350 349 8716568.29938 +351 349 -4.47034835815e-8 +352 349 -797223.130676 +353 349 -905935.375768 +354 349 1.86264514923e-8 +388 349 -570661.636677 +389 349 -920421.994641 +390 349 -741520.302649 +391 349 -175770.085153 +392 349 -298827.840692 +393 349 -75251.5247453 +394 349 -955815.974241 +395 349 -1086154.51618 +396 349 929649.114512 +350 350 11934357.6383 +351 350 -5.21540641785e-8 +352 350 -905935.375768 +353 350 -1029472.01792 +354 350 2.421438694e-8 +388 350 -920421.994641 +389 350 -1484551.60426 +390 350 -1196000.48814 +391 350 -298827.840692 +392 350 -499398.232928 +393 350 55832.4159336 +394 350 -1086154.51618 +395 350 -1234266.49566 +396 350 1056419.44831 +351 351 30008520.3637 +352 351 1.30385160446e-8 +353 351 1.49011611938e-8 +354 351 4063389.39899 +388 351 -741520.302649 +389 351 -1196000.48814 +390 351 -2731360.75727 +391 351 75251.5247453 +392 351 -55832.4159336 +393 351 -6893760.43768 +394 351 929649.114512 +395 351 1056419.44831 +396 351 -2324577.161 +352 352 13789595.5493 +353 352 8526963.46189 +354 352 -3.72529029846e-8 +355 352 2189391.67462 +356 352 902841.927677 +357 352 9.31322574615e-9 +391 352 -955815.974241 +392 352 -1086154.51618 +393 352 -929649.114512 +394 352 -1698063.33368 +395 352 -676945.37624 +396 352 -148519.569575 +397 352 -1831641.90145 +398 352 -755316.248019 +399 352 1300948.03845 +353 353 6744151.21474 +354 353 -3.72529029846e-9 +355 353 902841.927677 +356 353 372305.949557 +357 353 2.79396772385e-9 +391 353 -1086154.51618 +392 353 -1234266.49566 +393 353 -1056419.44831 +394 353 -676945.37624 +395 353 -252690.316209 +396 353 207978.412157 +397 353 -755316.248019 +398 353 -311470.61774 +399 353 536473.417918 +354 354 37051709.8254 +355 354 -3.72529029846e-9 +356 354 -9.31322574615e-10 +357 354 10537577.5004 +391 354 -929649.114512 +392 354 -1056419.44831 +393 354 -2324577.161 +394 354 148519.569575 +395 354 -207978.412157 +396 354 -9252258.07493 +397 354 1300948.03845 +398 354 536473.417918 +399 354 -3684182.88731 +355 355 19732335.5073 +357 355 -7.45058059692e-9 +358 355 2189391.67462 +359 355 -902841.927677 +360 355 9.31322574615e-9 +394 355 -1831641.90145 +395 355 -755316.248019 +396 355 -1300948.03845 +397 355 -3460455.85927 +398 355 -7.45058059692e-9 +399 355 -5.58793544769e-9 +400 355 -1831641.90145 +401 355 755316.248019 +402 355 1300948.03845 +356 356 3355482.70929 +357 356 3.72529029846e-9 +358 356 -902841.927677 +359 356 372305.949557 +360 356 -2.79396772385e-9 +394 356 -755316.248019 +395 356 -311470.61774 +396 356 -536473.417918 +397 356 -7.45058059692e-9 +398 356 -588450.353367 +399 356 429178.734334 +400 356 755316.248019 +401 356 -311470.61774 +402 356 -536473.417918 +357 357 47437791.9854 +358 357 -3.72529029846e-9 +359 357 9.31322574615e-10 +360 357 10537577.5004 +394 357 -1300948.03845 +395 357 -536473.417918 +396 357 -3684182.88731 +398 357 -429178.734334 +399 357 -12874095.835 +400 357 1300948.03845 +401 357 -536473.417918 +402 357 -3684182.88731 +358 358 13789595.5493 +359 358 -8526963.46189 +360 358 1.49011611938e-8 +361 358 -797223.130676 +362 358 905935.375768 +363 358 -7.45058059692e-9 +397 358 -1831641.90145 +398 358 755316.248019 +399 358 -1300948.03845 +400 358 -1698063.33368 +401 358 676945.37624 +402 358 148519.569575 +403 358 -955815.974241 +404 358 1086154.51618 +405 358 929649.114512 +359 359 6744151.21474 +360 359 7.45058059692e-9 +361 359 905935.375768 +362 359 -1029472.01792 +363 359 5.58793544769e-9 +397 359 755316.248019 +398 359 -311470.61774 +399 359 536473.417918 +400 359 676945.37624 +401 359 -252690.316209 +402 359 207978.412157 +403 359 1086154.51618 +404 359 -1234266.49566 +405 359 -1056419.44831 +360 360 37051709.8254 +361 360 -9.31322574615e-9 +362 360 9.31322574615e-9 +363 360 4063389.39899 +397 360 -1300948.03845 +398 360 536473.417918 +399 360 -3684182.88731 +400 360 -148519.569575 +401 360 -207978.412157 +402 360 -9252258.07493 +403 360 929649.114512 +404 360 -1056419.44831 +405 360 -2324577.161 +361 361 6563466.92161 +362 361 -8716568.29938 +363 361 2.23517417908e-8 +364 361 -4790.05038348 +365 361 7725.8877153 +366 361 -1.30385160446e-8 +400 361 -955815.974241 +401 361 1086154.51618 +402 361 -929649.114512 +403 361 -175770.085153 +404 361 298827.840692 +405 361 75251.5247453 +406 361 -570661.636677 +407 361 920421.994641 +408 361 741520.302649 +362 362 11934357.6383 +363 362 -2.98023223877e-8 +364 362 7725.88771529 +365 362 -12461.1092182 +366 362 1.86264514923e-8 +400 362 1086154.51618 +401 362 -1234266.49566 +402 362 1056419.44831 +403 362 298827.840692 +404 362 -499398.232928 +405 362 55832.4159336 +406 362 920421.994641 +407 362 -1484551.60426 +408 362 -1196000.48814 +363 363 30008520.3637 +364 363 -1.30385160446e-8 +365 363 2.60770320892e-8 +366 363 6373223.13441 +400 363 -929649.114512 +401 363 1056419.44831 +402 363 -2324577.161 +403 363 -75251.5247453 +404 363 -55832.4159336 +405 363 -6893760.43768 +406 363 741520.302649 +407 363 -1196000.48814 +408 363 -2731360.75727 +364 364 4267595.81742 +365 364 -7796294.34309 +366 364 1.86264514923e-8 +367 364 -76937.6348729 +368 364 167255.727985 +369 364 -1.11758708954e-8 +403 364 -570661.636677 +404 364 920421.994641 +405 364 -741520.302649 +406 364 -304176.348108 +407 364 544599.533136 +408 364 61373.985991 +409 364 -361895.781536 +410 364 786729.959862 +411 364 588085.337671 +365 365 14559614.5621 +366 365 -3.72529029846e-8 +367 365 167255.727985 +368 365 -363599.408662 +369 365 2.421438694e-8 +403 365 920421.994641 +404 365 -1484551.60426 +405 365 1196000.48814 +406 365 544599.533136 +407 365 -995761.387374 +408 365 32978.3592395 +409 365 786729.959862 +410 365 -1710282.52144 +411 365 -1278446.38624 +366 366 32450763.4987 +367 366 -2.23517417908e-8 +368 366 5.02914190292e-8 +369 366 5787467.22392 +403 366 -741520.302649 +404 366 1196000.48814 +405 366 -2731360.75727 +406 366 -61373.985991 +407 366 -32978.3592395 +408 366 -7832517.9294 +409 366 588085.337671 +410 366 -1278446.38624 +411 366 -2616778.13471 +367 367 2722764.08058 +368 367 -6525095.96362 +369 367 4.28408384323e-8 +370 367 -77037.3094958 +371 367 210101.75317 +372 367 -1.86264514923e-8 +406 367 -361895.781536 +407 367 786729.959862 +408 367 -588085.337671 +409 367 -150094.325529 +410 367 356091.902114 +411 367 41457.2556898 +412 367 -246970.319543 +413 367 673555.416935 +414 367 484442.198447 +368 368 15837837.4467 +369 368 -9.685754776e-8 +370 368 210101.75317 +371 368 -573004.781374 +372 368 4.842877388e-8 +406 368 786729.959862 +407 368 -1710282.52144 +408 368 1278446.38624 +409 368 356091.902114 +410 368 -855385.258208 +411 368 17103.8438089 +412 368 673555.416935 +413 368 -1836969.31891 +414 368 -1321205.99576 +369 369 31131706.3633 +370 369 -2.98023223877e-8 +371 369 8.56816768646e-8 +372 369 5508023.65258 +406 369 -588085.337671 +407 369 1278446.38624 +408 369 -2616778.13471 +409 369 -41457.2556898 +410 369 -17103.8438089 +411 369 -7353984.06298 +412 369 484442.198447 +413 369 -1321205.99576 +414 369 -2564546.07772 +370 370 1902223.18075 +371 370 -5590205.99024 +372 370 4.09781932831e-8 +409 370 -246970.319543 +410 370 673555.416935 +411 370 -484442.198447 +412 370 -89281.9039061 +413 370 261158.775213 +414 370 27106.375452 +415 370 -183325.791023 +416 370 591373.519429 +417 370 416676.259817 +371 371 16543837.5893 +372 371 -1.11758708954e-7 +409 371 673555.416935 +410 371 -1836969.31891 +411 371 1321205.99576 +412 371 261158.775213 +413 371 -769227.571739 +414 371 9164.38855485 +415 371 591373.519429 +416 371 -1907656.51429 +417 371 -1344116.96715 +372 372 30501291.4656 +409 372 -484442.198447 +410 372 1321205.99576 +411 372 -2564546.07772 +412 372 -27106.375452 +413 372 -9164.38855489 +414 372 -7121142.78386 +415 372 416676.259817 +416 372 -1344116.96715 +417 372 -2538358.87127 +373 373 983097.51761 +374 373 3993191.05725 +375 373 -4.09781932831e-8 +376 373 -268071.177508 +377 373 -1017991.81332 +378 373 6.51925802231e-9 +424 373 22134.9913963 +425 373 90320.994053 +426 373 -18909.0650259 +427 373 -144050.092155 +428 373 -547025.666412 +429 373 358351.461509 +374 374 16310675.5472 +375 374 -1.71363353729e-7 +376 374 -1017991.81332 +377 374 -3865791.69616 +378 374 2.60770320892e-8 +424 374 90320.994053 +425 374 370626.696215 +426 374 4631.25243447 +427 374 -547025.666412 +428 374 -2077312.65726 +429 374 1360828.33484 +375 375 19175351.0344 +376 375 1.210719347e-8 +377 375 4.09781932831e-8 +378 375 1324183.34296 +424 375 18909.0650259 +425 375 -4631.25243456 +426 375 -5293544.01962 +427 375 358351.461509 +428 375 1360828.33484 +429 375 -2284273.33935 +376 376 2528206.57902 +377 376 4472508.77878 +378 376 -2.60770320892e-8 +379 376 161794.959894 +380 376 -1643725.47145 +382 376 -354732.167298 +383 376 -1144297.31386 +384 376 1.30385160446e-8 +424 376 -144050.092155 +425 376 -547025.666412 +426 376 -358351.461509 +427 376 -474420.971735 +428 376 131724.797328 +429 376 -23329.9193232 +430 376 800256.904552 +431 376 8988441.97885 +433 376 -193836.559394 +434 376 -625279.223852 +435 376 416676.259817 +377 377 16817023.5501 +378 377 -8.94069671631e-8 +379 377 2239699.42799 +380 377 -161794.959894 +382 377 -1144297.31386 +383 377 -3691281.65763 +384 377 4.09781932831e-8 +424 377 -547025.666412 +425 377 -2077312.65726 +426 377 -1360828.33484 +427 377 131724.797328 +428 377 -28174.604603 +429 377 6684.54707693 +430 377 -6040684.68178 +431 377 -800256.904552 +433 377 -625279.223852 +434 377 -2017029.75436 +435 377 1344116.96715 +378 378 39001825.1235 +382 378 1.210719347e-8 +383 378 3.35276126862e-8 +384 378 1397983.15475 +424 378 -358351.461509 +425 378 -1360828.33484 +426 378 -2284273.33935 +427 378 23329.9193232 +428 378 -6684.54707697 +429 378 -14301137.6219 +433 378 416676.259817 +434 378 1344116.96715 +435 378 -2296979.40748 +379 379 329627273.449 +380 379 65098710.708 +427 379 -800256.904552 +428 379 6040684.68178 +430 379 64525494.457 +431 379 -4237812.99363 +380 380 569419268.28 +427 380 -8988441.97885 +428 380 800256.904552 +430 380 -4237812.99363 +431 380 48915452.1011 +381 381 790573.476703 +432 381 -357777.777778 +382 382 1768961.88645 +383 382 5200497.8108 +384 382 -2.98023223877e-8 +385 382 -465133.879389 +386 382 -1268546.94379 +387 382 1.86264514923e-8 +427 382 -193836.559394 +428 382 -625279.223852 +429 382 -416676.259817 +433 382 24667.0078013 +434 382 73754.1287476 +435 382 -27106.375452 +436 382 -260348.273704 +437 382 -710040.746465 +438 382 484442.198447 +383 383 15396260.6937 +384 383 -8.94069671631e-8 +385 383 -1268546.94379 +386 383 -3459673.48306 +387 383 4.47034835815e-8 +427 383 -625279.223852 +428 383 -2017029.75436 +429 383 -1344116.96715 +433 383 73754.1287476 +434 383 222052.369366 +435 383 9164.38855485 +436 383 -710040.746465 +437 383 -1936474.76309 +438 383 1321205.99576 +384 384 19430253.1852 +385 384 2.04890966415e-8 +386 384 5.96046447754e-8 +387 384 1501024.18544 +427 384 -416676.259817 +428 384 -1344116.96715 +429 384 -2296979.40748 +433 384 27106.375452 +434 384 -9164.3885549 +435 384 -5492991.14412 +436 384 484442.198447 +437 384 1321205.99576 +438 384 -2315242.24089 +385 385 2497002.01247 +386 385 5989724.5569 +387 385 -5.21540641785e-8 +388 385 -645500.420471 +389 385 -1403261.78363 +390 385 2.60770320892e-8 +433 385 -260348.273704 +434 385 -710040.746465 +435 385 -484442.198447 +436 385 12227.6197724 +437 385 33038.3525624 +438 385 -41457.2556898 +439 385 -379286.632065 +440 385 -824536.156663 +441 385 588085.337671 +386 386 14552393.0113 +387 386 -1.26659870148e-7 +388 386 -1403261.78363 +389 386 -3050569.09485 +390 386 5.77419996262e-8 +433 386 -710040.746465 +434 386 -1936474.76309 +435 386 -1321205.99576 +436 386 33038.3525624 +437 386 89431.3340665 +438 386 17103.8438088 +439 386 -824536.156663 +440 386 -1792469.90579 +441 386 1278446.38624 +387 387 19697338.3132 +388 387 2.32830643654e-8 +389 387 5.21540641785e-8 +390 387 1699467.28443 +433 387 -484442.198447 +434 387 -1321205.99576 +435 387 -2315242.24089 +436 387 41457.2556898 +437 387 -17103.8438089 +438 387 -5695176.55864 +439 387 588085.337671 +440 387 1278446.38624 +441 387 -2352102.70813 +388 388 3805513.9161 +389 388 6969546.89216 +390 388 -4.47034835815e-8 +391 388 -900913.14915 +392 388 -1453085.72444 +393 388 2.23517417908e-8 +436 388 -379286.632065 +437 388 -824536.156663 +438 388 -588085.337671 +439 388 -52167.0393845 +440 388 -83826.4031561 +441 388 -61373.985991 +442 388 -590912.90871 +443 388 -953085.336629 +444 388 741520.302649 +389 389 13049076.8844 +390 389 -8.94069671631e-8 +391 389 -1453085.72444 +392 389 -2343686.65232 +393 389 3.53902578354e-8 +436 389 -824536.156663 +437 389 -1792469.90579 +438 389 -1278446.38624 +439 389 -83826.4031561 +440 389 -134521.304432 +441 389 32978.3592395 +442 389 -953085.336629 +443 389 -1537234.41392 +444 389 1196000.48814 +390 390 20269767.9526 +391 390 1.67638063431e-8 +392 390 2.98023223877e-8 +393 390 2107431.22341 +436 390 -588085.337671 +437 390 -1278446.38624 +438 390 -2352102.70813 +439 390 61373.985991 +440 390 -32978.3592395 +441 390 -6109264.54972 +442 390 741520.302649 +443 390 1196000.48814 +444 390 -2434642.38116 +391 391 6311393.43185 +392 391 8279110.50413 +393 391 -3.35276126862e-8 +394 391 -2301041.15788 +395 391 -2614819.49759 +396 391 1.67638063431e-8 +439 391 -590912.90871 +440 391 -953085.336629 +441 391 -741520.302649 +442 391 222027.67781 +443 391 227177.812693 +444 391 -75251.5247453 +445 391 -1038306.19785 +446 391 -1179893.40665 +447 391 929649.114512 +392 392 11193680.9464 +393 392 -4.47034835815e-8 +394 392 -2614819.49759 +395 392 -2971385.79271 +396 392 1.67638063431e-8 +439 392 -953085.336629 +440 392 -1537234.41392 +441 392 -1196000.48814 +442 392 227177.812693 +443 392 217630.207531 +444 392 55832.4159336 +445 392 -1179893.40665 +446 392 -1340787.9621 +447 392 1056419.44831 +393 393 19292741.7183 +394 393 1.11758708954e-8 +395 393 1.49011611938e-8 +396 393 427942.721781 +439 393 -741520.302649 +440 393 -1196000.48814 +441 393 -2434642.38116 +442 393 75251.5247453 +443 393 -55832.4159336 +444 393 -5287984.36193 +445 393 929649.114512 +446 393 1056419.44831 +447 393 -2155790.5645 +394 394 11173430.2083 +395 394 7495059.08719 +396 394 -2.23517417908e-8 +397 394 -678836.974673 +398 394 -279932.773061 +399 394 7.45058059692e-9 +442 394 -1038306.19785 +443 394 -1179893.40665 +444 394 -929649.114512 +445 394 -908773.635179 +446 394 -175831.894858 +447 394 -148519.569575 +448 394 -1760951.03338 +449 394 -726165.37459 +450 394 1300948.03845 +395 395 6371949.42588 +396 395 -2.23517417908e-8 +397 395 -279932.773061 +398 395 -115436.195077 +399 395 3.72529029846e-9 +442 395 -1179893.40665 +443 395 -1340787.9621 +444 395 -1056419.44831 +445 395 -175831.894858 +446 395 153537.59263 +447 395 207978.412157 +448 395 -726165.37459 +449 395 -299449.639006 +450 395 536473.417918 +396 396 22658086.7563 +398 396 -9.31322574615e-10 +399 396 4790763.62708 +442 396 -929649.114512 +443 396 -1056419.44831 +444 396 -2155790.5645 +445 396 148519.569575 +446 396 -207978.412157 +447 396 -7295491.64648 +448 396 1300948.03845 +449 396 536473.417918 +450 396 -3164492.7709 +397 397 14370371.7322 +398 397 1.49011611938e-8 +399 397 -7.45058059692e-9 +400 397 -678836.974673 +401 397 279932.773061 +402 397 7.45058059692e-9 +445 397 -1760951.03338 +446 397 -726165.37459 +447 397 -1300948.03845 +448 397 -2367056.05396 +450 397 -5.58793544769e-9 +451 397 -1760951.03338 +452 397 726165.37459 +453 397 1300948.03845 +398 398 2443681.02578 +399 398 1.49011611938e-8 +400 398 279932.773061 +401 398 -115436.195077 +402 398 -3.72529029846e-9 +445 398 -726165.37459 +446 398 -299449.639006 +447 398 -536473.417918 +449 398 -402517.768767 +450 398 429178.734334 +451 398 726165.37459 +452 398 -299449.639006 +453 398 -536473.417918 +399 399 27394702.6193 +401 399 9.31322574615e-10 +402 399 4790763.62708 +445 399 -1300948.03845 +446 399 -536473.417918 +447 399 -3164492.7709 +448 399 3.72529029846e-9 +449 399 -429178.734334 +450 399 -10404782.7221 +451 399 1300948.03845 +452 399 -536473.417918 +453 399 -3164492.7709 +400 400 11173430.2083 +401 400 -7495059.08719 +402 400 1.86264514923e-8 +403 400 -2301041.15788 +404 400 2614819.49759 +405 400 -1.30385160446e-8 +448 400 -1760951.03338 +449 400 726165.37459 +450 400 -1300948.03845 +451 400 -908773.635179 +452 400 175831.894858 +453 400 148519.569575 +454 400 -1038306.19785 +455 400 1179893.40665 +456 400 929649.114512 +401 401 6371949.42588 +402 401 -2.98023223877e-8 +403 401 2614819.49759 +404 401 -2971385.79271 +405 401 1.49011611938e-8 +448 401 726165.37459 +449 401 -299449.639006 +450 401 536473.417918 +451 401 175831.894858 +452 401 153537.59263 +453 401 207978.412157 +454 401 1179893.40665 +455 401 -1340787.9621 +456 401 -1056419.44831 +402 402 22658086.7563 +403 402 -2.04890966415e-8 +404 402 2.04890966415e-8 +405 402 427942.721781 +448 402 -1300948.03845 +449 402 536473.417918 +450 402 -3164492.7709 +451 402 -148519.569575 +452 402 -207978.412157 +453 402 -7295491.64648 +454 402 929649.114512 +455 402 -1056419.44831 +456 402 -2155790.5645 +403 403 6311393.43185 +404 403 -8279110.50413 +405 403 2.98023223877e-8 +406 403 -900913.14915 +407 403 1453085.72444 +408 403 -1.86264514923e-8 +451 403 -1038306.19785 +452 403 1179893.40665 +453 403 -929649.114512 +454 403 222027.67781 +455 403 -227177.812693 +456 403 75251.5247453 +457 403 -590912.90871 +458 403 953085.336629 +459 403 741520.302649 +404 404 11193680.9464 +405 404 -3.72529029846e-8 +406 404 1453085.72444 +407 404 -2343686.65232 +408 404 2.79396772385e-8 +451 404 1179893.40665 +452 404 -1340787.9621 +453 404 1056419.44831 +454 404 -227177.812693 +455 404 217630.207531 +456 404 55832.4159336 +457 404 953085.336629 +458 404 -1537234.41392 +459 404 -1196000.48814 +405 405 19292741.7183 +406 405 -2.04890966415e-8 +407 405 3.35276126862e-8 +408 405 2107431.22341 +451 405 -929649.114512 +452 405 1056419.44831 +453 405 -2155790.5645 +454 405 -75251.5247453 +455 405 -55832.4159336 +456 405 -5287984.36193 +457 405 741520.302649 +458 405 -1196000.48814 +459 405 -2434642.38116 +406 406 3805513.9161 +407 406 -6969546.89216 +408 406 3.72529029846e-8 +409 406 -645500.420471 +410 406 1403261.78363 +411 406 -2.04890966415e-8 +454 406 -590912.90871 +455 406 953085.336629 +456 406 -741520.302649 +457 406 -52167.0393845 +458 406 83826.4031561 +459 406 61373.985991 +460 406 -379286.632065 +461 406 824536.156663 +462 406 588085.337671 +407 407 13049076.8844 +408 407 -6.70552253723e-8 +409 407 1403261.78363 +410 407 -3050569.09485 +411 407 4.47034835815e-8 +454 407 953085.336629 +455 407 -1537234.41392 +456 407 1196000.48814 +457 407 83826.4031561 +458 407 -134521.304432 +459 407 32978.3592395 +460 407 824536.156663 +461 407 -1792469.90579 +462 407 -1278446.38624 +408 408 20269767.9526 +409 408 -2.51457095146e-8 +410 408 5.40167093277e-8 +411 408 1699467.28443 +454 408 -741520.302649 +455 408 1196000.48814 +456 408 -2434642.38116 +457 408 -61373.985991 +458 408 -32978.3592395 +459 408 -6109264.54972 +460 408 588085.337671 +461 408 -1278446.38624 +462 408 -2352102.70813 +409 409 2497002.01247 +410 409 -5989724.5569 +411 409 4.842877388e-8 +412 409 -465133.879389 +413 409 1268546.94379 +414 409 -2.51457095146e-8 +457 409 -379286.632065 +458 409 824536.156663 +459 409 -588085.337671 +460 409 12227.6197724 +461 409 -33038.3525624 +462 409 41457.2556898 +463 409 -260348.273704 +464 409 710040.746465 +465 409 484442.198447 +410 410 14552393.0113 +411 410 -1.19209289551e-7 +412 410 1268546.94379 +413 410 -3459673.48306 +414 410 7.45058059692e-8 +457 410 824536.156663 +458 410 -1792469.90579 +459 410 1278446.38624 +460 410 -33038.3525624 +461 410 89431.3340665 +462 410 17103.8438088 +463 410 710040.746465 +464 410 -1936474.76309 +465 410 -1321205.99576 +411 411 19697338.3132 +412 411 -2.421438694e-8 +413 411 6.33299350738e-8 +414 411 1501024.18544 +457 411 -588085.337671 +458 411 1278446.38624 +459 411 -2352102.70813 +460 411 -41457.2556898 +461 411 -17103.8438089 +462 411 -5695176.55864 +463 411 484442.198447 +464 411 -1321205.99576 +465 411 -2315242.24089 +412 412 1768961.88645 +413 412 -5200497.8108 +414 412 2.98023223877e-8 +415 412 -354732.167298 +416 412 1144297.31386 +417 412 -7.45058059692e-9 +460 412 -260348.273704 +461 412 710040.746465 +462 412 -484442.198447 +463 412 24667.0078013 +464 412 -73754.1287476 +465 412 27106.375452 +466 412 -193836.559394 +467 412 625279.223852 +468 412 416676.259817 +413 413 15396260.6937 +414 413 -8.19563865662e-8 +415 413 1144297.31386 +416 413 -3691281.65763 +417 413 2.60770320892e-8 +460 413 710040.746465 +461 413 -1936474.76309 +462 413 1321205.99576 +463 413 -73754.1287476 +464 413 222052.369366 +465 413 9164.38855486 +466 413 625279.223852 +467 413 -2017029.75436 +468 413 -1344116.96715 +414 414 19430253.1852 +415 414 -9.31322574615e-9 +416 414 2.98023223877e-8 +417 414 1397983.15475 +460 414 -484442.198447 +461 414 1321205.99576 +462 414 -2315242.24089 +463 414 -27106.375452 +464 414 -9164.38855491 +465 414 -5492991.14412 +466 414 416676.259817 +467 414 -1344116.96715 +468 414 -2296979.40748 +415 415 2528206.97157 +416 415 -4472509.50178 +417 415 2.23517417908e-8 +418 415 -161793.620953 +419 415 -1643724.74446 +421 415 -268071.177508 +422 415 1017991.81332 +423 415 -1.210719347e-8 +463 415 -193836.559394 +464 415 625279.223852 +465 415 -416676.259817 +466 415 -474421.1715 +467 415 -131724.429407 +468 415 23329.9193232 +469 415 -800250.281991 +470 415 8988445.57462 +472 415 -144050.092155 +473 415 547025.666412 +474 415 358351.461509 +416 416 16817023.1576 +417 416 -8.19563865662e-8 +418 416 2239700.15498 +419 416 161793.620953 +421 416 1017991.81332 +422 416 -3865791.69616 +423 416 4.09781932831e-8 +463 416 625279.223852 +464 416 -2017029.75436 +465 416 1344116.96715 +466 416 -131724.429407 +467 416 -28174.4048382 +468 416 6684.54707694 +469 416 -6040681.08601 +470 416 800250.281991 +472 416 547025.666412 +473 416 -2077312.65726 +474 416 -1360828.33484 +417 417 39001825.1235 +421 417 -1.11758708954e-8 +422 417 4.09781932831e-8 +423 417 1324183.34296 +463 417 -416676.259817 +464 417 1344116.96715 +465 417 -2296979.40748 +466 417 -23329.9193232 +467 417 -6684.54707698 +468 417 -14301137.6219 +472 417 358351.461509 +473 417 -1360828.33484 +474 417 -2284273.33935 +418 418 329626980.943 +419 418 -65098171.9808 +466 418 800250.281991 +467 418 6040681.08601 +469 418 64525513.4986 +470 418 4237777.92342 +419 419 569419560.785 +466 419 -8988445.57462 +467 419 -800250.281991 +469 419 4237777.92342 +470 419 48915433.0595 +420 420 790573.476703 +471 420 -357777.777778 +421 421 983097.51761 +422 421 -3993191.05725 +423 421 5.40167093277e-8 +466 421 -144050.092155 +467 421 547025.666412 +468 421 -358351.461509 +472 421 22134.9913963 +473 421 -90320.994053 +474 421 18909.0650259 +422 422 16310675.5472 +423 422 -2.30967998505e-7 +466 422 547025.666412 +467 422 -2077312.65726 +468 422 1360828.33484 +472 422 -90320.994053 +473 422 370626.696215 +474 422 4631.25243447 +423 423 19175351.0344 +466 423 -358351.461509 +467 423 1360828.33484 +468 423 -2284273.33935 +472 423 -18909.0650259 +473 423 -4631.25243458 +474 423 -5293544.01962 +424 424 1011851.60912 +425 424 4110093.43272 +426 424 -4.65661287308e-8 +427 424 -311975.890718 +428 424 -1184718.57235 +429 424 9.31322574615e-9 +475 424 22134.9913963 +476 424 90320.994053 +477 424 -18909.0650259 +478 424 -144050.092155 +479 424 -547025.666412 +480 424 358351.461509 +425 425 16788621.6609 +426 425 -2.01165676117e-7 +427 425 -1184718.57235 +428 425 -4498931.28739 +429 425 2.98023223877e-8 +475 425 90320.994053 +476 425 370626.696215 +477 425 4631.25243447 +478 425 -547025.666412 +479 425 -2077312.65726 +480 425 1360828.33484 +426 426 18240145.4814 +427 426 9.31322574615e-9 +428 426 2.98023223877e-8 +429 426 758227.34113 +475 426 18909.0650259 +476 426 -4631.25243456 +477 426 -5293544.01962 +478 426 358351.461509 +479 426 1360828.33484 +480 426 -2284273.33935 +427 427 2350262.38096 +428 427 4600302.12491 +429 427 -2.421438694e-8 +430 427 2.98023223877e-8 +431 427 -1.19209289551e-7 +433 427 -413671.243673 +434 427 -1334423.36669 +435 427 1.58324837685e-8 +475 427 -144050.092155 +476 427 -547025.666412 +477 427 -358351.461509 +478 427 -474420.971735 +479 427 131724.797327 +480 427 -23329.9193232 +481 427 800256.904552 +482 427 8988441.97885 +484 427 -193836.559394 +485 427 -625279.223852 +486 427 416676.259817 +428 428 17048556.8253 +429 428 -8.19563865662e-8 +430 428 5.96046447754e-8 +433 428 -1334423.36669 +434 428 -4304591.50545 +435 428 4.842877388e-8 +475 428 -547025.666412 +476 428 -2077312.65726 +477 428 -1360828.33484 +478 428 131724.797327 +479 428 -28174.6046032 +480 428 6684.54707693 +481 428 -6040684.68178 +482 428 -800256.904552 +484 428 -625279.223852 +485 428 -2017029.75436 +486 428 1344116.96715 +429 429 36176122.0894 +433 429 1.39698386192e-8 +434 429 4.09781932831e-8 +435 429 830431.306934 +475 429 -358351.461509 +476 429 -1360828.33484 +477 429 -2284273.33935 +478 429 23329.9193232 +479 429 -6684.54707697 +480 429 -14301137.6219 +484 429 416676.259817 +485 429 1344116.96715 +486 429 -2296979.40748 +430 430 305878308.174 +431 430 66094123.115 +478 430 -800256.904552 +479 430 6040684.68178 +481 430 64525494.457 +482 430 -4237812.99363 +431 431 549336918.275 +478 431 -8988441.97885 +479 431 800256.904552 +481 431 -4237812.99363 +482 431 48915452.1011 +432 432 715555.555556 +483 432 -357777.777778 +433 433 1816739.3315 +434 433 5341279.87864 +435 433 -3.35276126862e-8 +436 433 -544032.43723 +437 433 -1483724.82881 +438 433 2.23517417908e-8 +478 433 -193836.559394 +479 433 -625279.223852 +480 433 -416676.259817 +484 433 24667.0078013 +485 433 73754.1287475 +486 433 -27106.375452 +487 433 -260348.273704 +488 433 -710040.746465 +489 433 484442.198447 +434 434 15814018.062 +435 434 -1.04308128357e-7 +436 434 -1483724.82881 +437 434 -4046522.26039 +438 434 5.96046447754e-8 +478 434 -625279.223852 +479 434 -2017029.75436 +480 434 -1344116.96715 +484 434 73754.1287475 +485 434 222052.369365 +486 434 9164.38855485 +487 434 -710040.746465 +488 434 -1936474.76309 +489 434 1321205.99576 +435 435 18448886.5844 +436 435 2.421438694e-8 +437 435 6.33299350738e-8 +438 435 931107.693647 +478 435 -416676.259817 +479 435 -1344116.96715 +480 435 -2296979.40748 +484 435 27106.375452 +485 435 -9164.38855491 +486 435 -5492991.14412 +487 435 484442.198447 +488 435 1321205.99576 +489 435 -2315242.24089 +436 436 2558539.62181 +437 436 6138307.60949 +438 436 -5.21540641785e-8 +439 436 -759692.612592 +440 436 -1651505.67955 +441 436 2.60770320892e-8 +484 436 -260348.273704 +485 436 -710040.746465 +486 436 -484442.198447 +487 436 12227.6197724 +488 436 33038.3525624 +489 436 -41457.2556898 +490 436 -379286.632065 +491 436 -824536.156663 +492 436 588085.337671 +437 437 14915778.6682 +438 437 -1.34110450745e-7 +439 437 -1651505.67955 +440 437 -3590229.73815 +441 437 5.77419996262e-8 +484 437 -710040.746465 +485 437 -1936474.76309 +486 437 -1321205.99576 +487 437 33038.3525624 +488 437 89431.3340664 +489 437 17103.8438088 +490 437 -824536.156663 +491 437 -1792469.90579 +492 437 1278446.38624 +438 438 18669379.7869 +439 438 2.32830643654e-8 +440 438 5.21540641785e-8 +441 438 1124555.53479 +484 438 -484442.198447 +485 438 -1321205.99576 +486 438 -2315242.24089 +487 438 41457.2556898 +488 438 -17103.8438089 +489 438 -5695176.55864 +490 438 588085.337671 +491 438 1278446.38624 +492 438 -2352102.70813 +439 439 3880798.16119 +440 439 7110485.96967 +441 439 -4.842877388e-8 +442 439 -1076372.38828 +443 439 -1736084.49722 +444 439 2.421438694e-8 +487 439 -379286.632065 +488 439 -824536.156663 +489 439 -588085.337671 +490 439 -52167.0393845 +491 439 -83826.4031561 +492 439 -61373.985991 +493 439 -590912.90871 +494 439 -953085.336629 +495 439 741520.302649 +440 440 13318817.2723 +441 440 -9.685754776e-8 +442 440 -1736084.49722 +443 440 -2800136.28584 +444 440 3.91155481339e-8 +487 440 -824536.156663 +488 440 -1792469.90579 +489 440 -1278446.38624 +490 440 -83826.4031561 +491 440 -134521.304432 +492 440 32978.3592395 +493 440 -953085.336629 +494 440 -1537234.41392 +495 440 1196000.48814 +441 441 19146980.3477 +442 441 1.67638063431e-8 +443 441 2.98023223877e-8 +444 441 1520483.39551 +487 441 -588085.337671 +488 441 -1278446.38624 +489 441 -2352102.70813 +490 441 61373.985991 +491 441 -32978.3592395 +492 441 -6109264.54972 +493 441 741520.302649 +494 441 1196000.48814 +495 441 -2434642.38116 +442 442 6516876.42304 +443 442 8531914.96891 +444 442 -1.86264514923e-8 +445 442 -2626121.17726 +446 442 -2984228.61052 +447 442 1.30385160446e-8 +490 442 -590912.90871 +491 442 -953085.336629 +492 442 -741520.302649 +493 442 222027.67781 +494 442 227177.812693 +495 442 -75251.5247453 +496 442 -1038306.19785 +497 442 -1179893.40665 +498 442 929649.114512 +443 443 11512089.4984 +444 443 -2.23517417908e-8 +445 443 -2984228.61052 +446 443 -3391168.87559 +447 443 1.30385160446e-8 +490 443 -953085.336629 +491 443 -1537234.41392 +492 443 -1196000.48814 +493 443 227177.812693 +494 443 217630.207531 +495 443 55832.4159336 +496 443 -1179893.40665 +497 443 -1340787.9621 +498 443 1056419.44831 +444 444 18361731.7736 +445 444 7.45058059692e-9 +446 444 9.31322574615e-9 +447 444 -125380.553907 +490 444 -741520.302649 +491 444 -1196000.48814 +492 444 -2434642.38116 +493 444 75251.5247453 +494 444 -55832.4159336 +495 444 -5287984.36193 +496 444 929649.114512 +497 444 1056419.44831 +498 444 -2155790.5645 +445 445 11197028.9194 +446 445 7624235.1212 +447 445 -1.49011611938e-8 +448 445 -1154846.00933 +449 445 -476225.158488 +450 445 7.45058059692e-9 +493 445 -1038306.19785 +494 445 -1179893.40665 +495 445 -929649.114512 +496 445 -908773.635179 +497 445 -175831.894858 +498 445 -148519.569575 +499 445 -1760951.03338 +500 445 -726165.37459 +501 445 1300948.03845 +446 446 6560950.4012 +447 446 -7.45058059692e-9 +448 446 -476225.158488 +449 446 -196381.508655 +450 446 2.79396772385e-9 +493 446 -1179893.40665 +494 446 -1340787.9621 +495 446 -1056419.44831 +496 446 -175831.894858 +497 446 153537.59263 +498 446 207978.412157 +499 446 -726165.37459 +500 446 -299449.639006 +501 446 536473.417918 +447 447 21281133.3311 +450 447 4075797.18655 +493 447 -929649.114512 +494 447 -1056419.44831 +495 447 -2155790.5645 +496 447 148519.569575 +497 447 -207978.412157 +498 447 -7295491.64648 +499 447 1300948.03845 +500 447 536473.417918 +501 447 -3164492.7709 +448 448 14087608.2601 +450 448 -7.45058059692e-9 +451 448 -1154846.00933 +452 448 476225.158488 +453 448 7.45058059692e-9 +496 448 -1760951.03338 +497 448 -726165.37459 +498 448 -1300948.03845 +499 448 -2367056.05396 +501 448 -5.58793544769e-9 +502 448 -1760951.03338 +503 448 726165.37459 +504 448 1300948.03845 +449 449 2395597.11087 +450 449 7.45058059692e-9 +451 449 476225.158488 +452 449 -196381.508655 +453 449 -2.79396772385e-9 +496 449 -726165.37459 +497 449 -299449.639006 +498 449 -536473.417918 +500 449 -402517.768767 +501 449 429178.734334 +502 449 726165.37459 +503 449 -299449.639006 +504 449 -536473.417918 +450 450 25315942.1547 +453 450 4075797.18655 +496 450 -1300948.03845 +497 450 -536473.417918 +498 450 -3164492.7709 +499 450 3.72529029846e-9 +500 450 -429178.734334 +501 450 -10404782.7221 +502 450 1300948.03845 +503 450 -536473.417918 +504 450 -3164492.7709 +451 451 11197028.9194 +452 451 -7624235.1212 +453 451 1.49011611938e-8 +454 451 -2626121.17726 +455 451 2984228.61052 +456 451 -9.31322574615e-9 +499 451 -1760951.03338 +500 451 726165.37459 +501 451 -1300948.03845 +502 451 -908773.635179 +503 451 175831.894858 +504 451 148519.569575 +505 451 -1038306.19785 +506 451 1179893.40665 +507 451 929649.114512 +452 452 6560950.4012 +453 452 -7.45058059692e-9 +454 452 2984228.61052 +455 452 -3391168.87559 +456 452 9.31322574615e-9 +499 452 726165.37459 +500 452 -299449.639006 +501 452 536473.417918 +502 452 175831.894858 +503 452 153537.59263 +504 452 207978.412157 +505 452 1179893.40665 +506 452 -1340787.9621 +507 452 -1056419.44831 +453 453 21281133.3311 +454 453 -1.49011611938e-8 +455 453 1.67638063431e-8 +456 453 -125380.553907 +499 453 -1300948.03845 +500 453 536473.417918 +501 453 -3164492.7709 +502 453 -148519.569575 +503 453 -207978.412157 +504 453 -7295491.64648 +505 453 929649.114512 +506 453 -1056419.44831 +507 453 -2155790.5645 +454 454 6516876.42304 +455 454 -8531914.96891 +456 454 2.23517417908e-8 +457 454 -1076372.38828 +458 454 1736084.49722 +459 454 -1.49011611938e-8 +502 454 -1038306.19785 +503 454 1179893.40665 +504 454 -929649.114512 +505 454 222027.67781 +506 454 -227177.812693 +507 454 75251.5247453 +508 454 -590912.90871 +509 454 953085.336629 +510 454 741520.302649 +455 455 11512089.4984 +456 455 -2.98023223877e-8 +457 455 1736084.49722 +458 455 -2800136.28584 +459 455 2.421438694e-8 +502 455 1179893.40665 +503 455 -1340787.9621 +504 455 1056419.44831 +505 455 -227177.812693 +506 455 217630.207531 +507 455 55832.4159336 +508 455 953085.336629 +509 455 -1537234.41392 +510 455 -1196000.48814 +456 456 18361731.7736 +457 456 -2.04890966415e-8 +458 456 3.35276126862e-8 +459 456 1520483.39551 +502 456 -929649.114512 +503 456 1056419.44831 +504 456 -2155790.5645 +505 456 -75251.5247453 +506 456 -55832.4159336 +507 456 -5287984.36193 +508 456 741520.302649 +509 456 -1196000.48814 +510 456 -2434642.38116 +457 457 3880798.16119 +458 457 -7110485.96967 +459 457 3.35276126862e-8 +460 457 -759692.612592 +461 457 1651505.67955 +462 457 -1.86264514923e-8 +505 457 -590912.90871 +506 457 953085.336629 +507 457 -741520.302649 +508 457 -52167.0393845 +509 457 83826.4031561 +510 457 61373.985991 +511 457 -379286.632065 +512 457 824536.156663 +513 457 588085.337671 +458 458 13318817.2723 +459 458 -5.96046447754e-8 +460 458 1651505.67955 +461 458 -3590229.73815 +462 458 4.09781932831e-8 +505 458 953085.336629 +506 458 -1537234.41392 +507 458 1196000.48814 +508 458 83826.4031561 +509 458 -134521.304432 +510 458 32978.3592395 +511 458 824536.156663 +512 458 -1792469.90579 +513 458 -1278446.38624 +459 459 19146980.3477 +460 459 -2.14204192162e-8 +461 459 4.842877388e-8 +462 459 1124555.53479 +505 459 -741520.302649 +506 459 1196000.48814 +507 459 -2434642.38116 +508 459 -61373.985991 +509 459 -32978.3592395 +510 459 -6109264.54972 +511 459 588085.337671 +512 459 -1278446.38624 +513 459 -2352102.70813 +460 460 2558539.62181 +461 460 -6138307.60949 +462 460 4.28408384323e-8 +463 460 -544032.43723 +464 460 1483724.82881 +465 460 -2.421438694e-8 +508 460 -379286.632065 +509 460 824536.156663 +510 460 -588085.337671 +511 460 12227.6197724 +512 460 -33038.3525624 +513 460 41457.2556898 +514 460 -260348.273704 +515 460 710040.746465 +516 460 484442.198447 +461 461 14915778.6682 +462 461 -1.11758708954e-7 +463 461 1483724.82881 +464 461 -4046522.26039 +465 461 7.07805156708e-8 +508 461 824536.156663 +509 461 -1792469.90579 +510 461 1278446.38624 +511 461 -33038.3525624 +512 461 89431.3340665 +513 461 17103.8438088 +514 461 710040.746465 +515 461 -1936474.76309 +516 461 -1321205.99576 +462 462 18669379.7869 +463 462 -2.70083546639e-8 +464 462 7.82310962677e-8 +465 462 931107.693647 +508 462 -588085.337671 +509 462 1278446.38624 +510 462 -2352102.70813 +511 462 -41457.2556898 +512 462 -17103.8438089 +513 462 -5695176.55864 +514 462 484442.198447 +515 462 -1321205.99576 +516 462 -2315242.24089 +463 463 1816739.3315 +464 463 -5341279.87864 +465 463 3.53902578354e-8 +466 463 -413671.243673 +467 463 1334423.36669 +468 463 -5.58793544769e-9 +511 463 -260348.273704 +512 463 710040.746465 +513 463 -484442.198447 +514 463 24667.0078013 +515 463 -73754.1287475 +516 463 27106.375452 +517 463 -193836.559394 +518 463 625279.223852 +519 463 416676.259817 +464 464 15814018.062 +465 464 -1.04308128357e-7 +466 464 1334423.36669 +467 464 -4304591.50545 +468 464 2.23517417908e-8 +511 464 710040.746465 +512 464 -1936474.76309 +513 464 1321205.99576 +514 464 -73754.1287475 +515 464 222052.369365 +516 464 9164.38855486 +517 464 625279.223852 +518 464 -2017029.75436 +519 464 -1344116.96715 +465 465 18448886.5844 +466 465 -1.02445483208e-8 +467 465 3.35276126862e-8 +468 465 830431.306934 +511 465 -484442.198447 +512 465 1321205.99576 +513 465 -2315242.24089 +514 465 -27106.375452 +515 465 -9164.38855491 +516 465 -5492991.14412 +517 465 416676.259817 +518 465 -1344116.96715 +519 465 -2296979.40748 +466 466 2350262.78049 +467 466 -4600302.86075 +468 466 2.04890966415e-8 +469 466 -7.45058059692e-9 +472 466 -311975.890718 +473 466 1184718.57235 +474 466 -1.02445483208e-8 +514 466 -193836.559394 +515 466 625279.223852 +516 466 -416676.259817 +517 466 -474421.1715 +518 466 -131724.429407 +519 466 23329.9193232 +520 466 -800250.281991 +521 466 8988445.57462 +523 466 -144050.092155 +524 466 547025.666412 +525 466 358351.461509 +467 467 17048556.4258 +468 467 -7.45058059692e-8 +469 467 5.96046447754e-8 +470 467 7.45058059692e-9 +472 467 1184718.57235 +473 467 -4498931.28739 +474 467 3.35276126862e-8 +514 467 625279.223852 +515 467 -2017029.75436 +516 467 1344116.96715 +517 467 -131724.429407 +518 467 -28174.4048384 +519 467 6684.54707695 +520 467 -6040681.08601 +521 467 800250.281991 +523 467 547025.666412 +524 467 -2077312.65726 +525 467 -1360828.33484 +468 468 36176122.0894 +472 468 -1.210719347e-8 +473 468 4.09781932831e-8 +474 468 758227.34113 +514 468 -416676.259817 +515 468 1344116.96715 +516 468 -2296979.40748 +517 468 -23329.9193232 +518 468 -6684.54707699 +519 468 -14301137.6219 +523 468 358351.461509 +524 468 -1360828.33484 +525 468 -2284273.33935 +469 469 305878011.196 +470 469 -66093576.1502 +517 469 800250.281991 +518 469 6040681.08601 +520 469 64525513.4986 +521 469 4237777.92342 +470 470 549337215.254 +517 470 -8988445.57462 +518 470 -800250.281991 +520 470 4237777.92342 +521 470 48915433.0595 +471 471 715555.555556 +522 471 -357777.777778 +472 472 1011851.60912 +473 472 -4110093.43272 +474 472 6.14672899246e-8 +517 472 -144050.092155 +518 472 547025.666412 +519 472 -358351.461509 +523 472 22134.9913963 +524 472 -90320.994053 +525 472 18909.0650259 +473 473 16788621.6609 +474 473 -2.53319740295e-7 +517 473 547025.666412 +518 473 -2077312.65726 +519 473 1360828.33484 +523 473 -90320.994053 +524 473 370626.696215 +525 473 4631.25243446 +474 474 18240145.4814 +517 474 -358351.461509 +518 474 1360828.33484 +519 474 -2284273.33935 +523 474 -18909.0650259 +524 474 -4631.25243459 +525 474 -5293544.01962 +475 475 1011851.60912 +476 475 4110093.43272 +477 475 -4.842877388e-8 +478 475 -311975.890718 +479 475 -1184718.57235 +480 475 1.02445483208e-8 +526 475 22134.9913963 +527 475 90320.9940529 +528 475 -18909.0650259 +529 475 -144050.092155 +530 475 -547025.666412 +531 475 358351.461509 +476 476 16788621.6609 +477 476 -2.08616256714e-7 +478 476 -1184718.57235 +479 476 -4498931.28739 +480 476 3.35276126862e-8 +526 476 90320.9940529 +527 476 370626.696215 +528 476 4631.25243447 +529 476 -547025.666412 +530 476 -2077312.65726 +531 476 1360828.33484 +477 477 18240145.4814 +478 477 9.31322574615e-9 +479 477 2.98023223877e-8 +480 477 758227.34113 +526 477 18909.0650259 +527 477 -4631.25243456 +528 477 -5293544.01962 +529 477 358351.461509 +530 477 1360828.33484 +531 477 -2284273.33935 +478 478 2350262.38096 +479 478 4600302.12491 +480 478 -2.421438694e-8 +481 478 2.98023223877e-8 +482 478 -1.19209289551e-7 +484 478 -413671.243673 +485 478 -1334423.36669 +486 478 1.49011611938e-8 +526 478 -144050.092155 +527 478 -547025.666412 +528 478 -358351.461509 +529 478 -474420.971735 +530 478 131724.797327 +531 478 -23329.9193232 +532 478 800256.904552 +533 478 8988441.97885 +535 478 -193836.559394 +536 478 -625279.223852 +537 478 416676.259817 +479 479 17048556.8253 +480 479 -8.19563865662e-8 +481 479 5.96046447754e-8 +484 479 -1334423.36669 +485 479 -4304591.50545 +486 479 4.47034835815e-8 +526 479 -547025.666412 +527 479 -2077312.65726 +528 479 -1360828.33484 +529 479 131724.797327 +530 479 -28174.6046032 +531 479 6684.54707693 +532 479 -6040684.68178 +533 479 -800256.904552 +535 479 -625279.223852 +536 479 -2017029.75436 +537 479 1344116.96715 +480 480 36176122.0894 +484 480 1.210719347e-8 +485 480 3.35276126862e-8 +486 480 830431.306934 +526 480 -358351.461509 +527 480 -1360828.33484 +528 480 -2284273.33935 +529 480 23329.9193232 +530 480 -6684.54707697 +531 480 -14301137.6219 +535 480 416676.259817 +536 480 1344116.96715 +537 480 -2296979.40748 +481 481 305878308.174 +482 481 66094123.115 +529 481 -800256.904552 +530 481 6040684.68178 +532 481 64525494.457 +533 481 -4237812.99363 +482 482 549336918.275 +529 482 -8988441.97885 +530 482 800256.904552 +532 482 -4237812.99363 +533 482 48915452.1011 +483 483 715555.555556 +534 483 -357777.777778 +484 484 1816739.3315 +485 484 5341279.87864 +486 484 -3.72529029846e-8 +487 484 -544032.43723 +488 484 -1483724.82881 +489 484 2.23517417908e-8 +529 484 -193836.559394 +530 484 -625279.223852 +531 484 -416676.259817 +535 484 24667.0078013 +536 484 73754.1287475 +537 484 -27106.375452 +538 484 -260348.273704 +539 484 -710040.746465 +540 484 484442.198447 +485 485 15814018.062 +486 485 -1.19209289551e-7 +487 485 -1483724.82881 +488 485 -4046522.26039 +489 485 5.96046447754e-8 +529 485 -625279.223852 +530 485 -2017029.75436 +531 485 -1344116.96715 +535 485 73754.1287475 +536 485 222052.369365 +537 485 9164.38855485 +538 485 -710040.746465 +539 485 -1936474.76309 +540 485 1321205.99576 +486 486 18448886.5844 +487 486 1.95577740669e-8 +488 486 5.21540641785e-8 +489 486 931107.693647 +529 486 -416676.259817 +530 486 -1344116.96715 +531 486 -2296979.40748 +535 486 27106.375452 +536 486 -9164.3885549 +537 486 -5492991.14412 +538 486 484442.198447 +539 486 1321205.99576 +540 486 -2315242.24089 +487 487 2558539.62181 +488 487 6138307.60949 +489 487 -4.842877388e-8 +490 487 -759692.612592 +491 487 -1651505.67955 +492 487 2.60770320892e-8 +535 487 -260348.273704 +536 487 -710040.746465 +537 487 -484442.198447 +538 487 12227.6197724 +539 487 33038.3525624 +540 487 -41457.2556898 +541 487 -379286.632065 +542 487 -824536.156663 +543 487 588085.337671 +488 488 14915778.6682 +489 488 -1.19209289551e-7 +490 488 -1651505.67955 +491 488 -3590229.73815 +492 488 5.77419996262e-8 +535 488 -710040.746465 +536 488 -1936474.76309 +537 488 -1321205.99576 +538 488 33038.3525624 +539 488 89431.3340664 +540 488 17103.8438088 +541 488 -824536.156663 +542 488 -1792469.90579 +543 488 1278446.38624 +489 489 18669379.7869 +490 489 2.32830643654e-8 +491 489 5.21540641785e-8 +492 489 1124555.53479 +535 489 -484442.198447 +536 489 -1321205.99576 +537 489 -2315242.24089 +538 489 41457.2556898 +539 489 -17103.8438089 +540 489 -5695176.55864 +541 489 588085.337671 +542 489 1278446.38624 +543 489 -2352102.70813 +490 490 3880798.16119 +491 490 7110485.96967 +492 490 -4.842877388e-8 +493 490 -1076372.38828 +494 490 -1736084.49722 +495 490 2.421438694e-8 +538 490 -379286.632065 +539 490 -824536.156663 +540 490 -588085.337671 +541 490 -52167.0393845 +542 490 -83826.4031561 +543 490 -61373.985991 +544 490 -590912.90871 +545 490 -953085.336629 +546 490 741520.302649 +491 491 13318817.2723 +492 491 -9.685754776e-8 +493 491 -1736084.49722 +494 491 -2800136.28584 +495 491 3.91155481339e-8 +538 491 -824536.156663 +539 491 -1792469.90579 +540 491 -1278446.38624 +541 491 -83826.4031561 +542 491 -134521.304432 +543 491 32978.3592395 +544 491 -953085.336629 +545 491 -1537234.41392 +546 491 1196000.48814 +492 492 19146980.3477 +493 492 1.67638063431e-8 +494 492 2.98023223877e-8 +495 492 1520483.39551 +538 492 -588085.337671 +539 492 -1278446.38624 +540 492 -2352102.70813 +541 492 61373.985991 +542 492 -32978.3592395 +543 492 -6109264.54972 +544 492 741520.302649 +545 492 1196000.48814 +546 492 -2434642.38116 +493 493 6516876.42304 +494 493 8531914.96891 +495 493 -1.49011611938e-8 +496 493 -2626121.17726 +497 493 -2984228.61052 +498 493 9.31322574615e-9 +541 493 -590912.90871 +542 493 -953085.336629 +543 493 -741520.302649 +544 493 222027.67781 +545 493 227177.812693 +546 493 -75251.5247453 +547 493 -1038306.19785 +548 493 -1179893.40665 +549 493 929649.114512 +494 494 11512089.4984 +495 494 -2.23517417908e-8 +496 494 -2984228.61052 +497 494 -3391168.87559 +498 494 1.11758708954e-8 +541 494 -953085.336629 +542 494 -1537234.41392 +543 494 -1196000.48814 +544 494 227177.812693 +545 494 217630.207531 +546 494 55832.4159336 +547 494 -1179893.40665 +548 494 -1340787.9621 +549 494 1056419.44831 +495 495 18361731.7736 +496 495 1.86264514923e-9 +497 495 1.86264514923e-9 +498 495 -125380.553907 +541 495 -741520.302649 +542 495 -1196000.48814 +543 495 -2434642.38116 +544 495 75251.5247453 +545 495 -55832.4159336 +546 495 -5287984.36193 +547 495 929649.114512 +548 495 1056419.44831 +549 495 -2155790.5645 +496 496 11197028.9194 +497 496 7624235.1212 +498 496 -1.49011611938e-8 +499 496 -1154846.00933 +500 496 -476225.158488 +501 496 7.45058059692e-9 +544 496 -1038306.19785 +545 496 -1179893.40665 +546 496 -929649.114512 +547 496 -908773.635179 +548 496 -175831.894858 +549 496 -148519.569575 +550 496 -1760951.03338 +551 496 -726165.37459 +552 496 1300948.03845 +497 497 6560950.4012 +498 497 -7.45058059692e-9 +499 497 -476225.158488 +500 497 -196381.508655 +501 497 2.79396772385e-9 +544 497 -1179893.40665 +545 497 -1340787.9621 +546 497 -1056419.44831 +547 497 -175831.894858 +548 497 153537.59263 +549 497 207978.412157 +550 497 -726165.37459 +551 497 -299449.639006 +552 497 536473.417918 +498 498 21281133.3311 +501 498 4075797.18655 +544 498 -929649.114512 +545 498 -1056419.44831 +546 498 -2155790.5645 +547 498 148519.569575 +548 498 -207978.412157 +549 498 -7295491.64648 +550 498 1300948.03845 +551 498 536473.417918 +552 498 -3164492.7709 +499 499 14087608.2601 +501 499 -7.45058059692e-9 +502 499 -1154846.00933 +503 499 476225.158488 +504 499 7.45058059692e-9 +547 499 -1760951.03338 +548 499 -726165.37459 +549 499 -1300948.03845 +550 499 -2367056.05396 +552 499 -5.58793544769e-9 +553 499 -1760951.03338 +554 499 726165.37459 +555 499 1300948.03845 +500 500 2395597.11087 +501 500 7.45058059692e-9 +502 500 476225.158488 +503 500 -196381.508655 +504 500 -2.79396772385e-9 +547 500 -726165.37459 +548 500 -299449.639006 +549 500 -536473.417918 +551 500 -402517.768767 +552 500 429178.734334 +553 500 726165.37459 +554 500 -299449.639006 +555 500 -536473.417918 +501 501 25315942.1547 +504 501 4075797.18655 +547 501 -1300948.03845 +548 501 -536473.417918 +549 501 -3164492.7709 +550 501 3.72529029846e-9 +551 501 -429178.734334 +552 501 -10404782.7221 +553 501 1300948.03845 +554 501 -536473.417918 +555 501 -3164492.7709 +502 502 11197028.9194 +503 502 -7624235.1212 +504 502 1.11758708954e-8 +505 502 -2626121.17726 +506 502 2984228.61052 +507 502 -5.58793544769e-9 +550 502 -1760951.03338 +551 502 726165.37459 +552 502 -1300948.03845 +553 502 -908773.635179 +554 502 175831.894858 +555 502 148519.569575 +556 502 -1038306.19785 +557 502 1179893.40665 +558 502 929649.114512 +503 503 6560950.4012 +504 503 -7.45058059692e-9 +505 503 2984228.61052 +506 503 -3391168.87559 +507 503 5.58793544769e-9 +550 503 726165.37459 +551 503 -299449.639006 +552 503 536473.417918 +553 503 175831.894858 +554 503 153537.59263 +555 503 207978.412157 +556 503 1179893.40665 +557 503 -1340787.9621 +558 503 -1056419.44831 +504 504 21281133.3311 +505 504 -1.30385160446e-8 +506 504 1.30385160446e-8 +507 504 -125380.553907 +550 504 -1300948.03845 +551 504 536473.417918 +552 504 -3164492.7709 +553 504 -148519.569575 +554 504 -207978.412157 +555 504 -7295491.64648 +556 504 929649.114512 +557 504 -1056419.44831 +558 504 -2155790.5645 +505 505 6516876.42304 +506 505 -8531914.96891 +507 505 2.98023223877e-8 +508 505 -1076372.38828 +509 505 1736084.49722 +510 505 -1.49011611938e-8 +553 505 -1038306.19785 +554 505 1179893.40665 +555 505 -929649.114512 +556 505 222027.67781 +557 505 -227177.812693 +558 505 75251.5247453 +559 505 -590912.90871 +560 505 953085.336629 +561 505 741520.302649 +506 506 11512089.4984 +507 506 -3.72529029846e-8 +508 506 1736084.49722 +509 506 -2800136.28584 +510 506 2.421438694e-8 +553 506 1179893.40665 +554 506 -1340787.9621 +555 506 1056419.44831 +556 506 -227177.812693 +557 506 217630.207531 +558 506 55832.4159336 +559 506 953085.336629 +560 506 -1537234.41392 +561 506 -1196000.48814 +507 507 18361731.7736 +508 507 -2.04890966415e-8 +509 507 3.35276126862e-8 +510 507 1520483.39551 +553 507 -929649.114512 +554 507 1056419.44831 +555 507 -2155790.5645 +556 507 -75251.5247453 +557 507 -55832.4159336 +558 507 -5287984.36193 +559 507 741520.302649 +560 507 -1196000.48814 +561 507 -2434642.38116 +508 508 3880798.16119 +509 508 -7110485.96967 +510 508 3.35276126862e-8 +511 508 -759692.612592 +512 508 1651505.67955 +513 508 -1.86264514923e-8 +556 508 -590912.90871 +557 508 953085.336629 +558 508 -741520.302649 +559 508 -52167.0393845 +560 508 83826.4031561 +561 508 61373.985991 +562 508 -379286.632065 +563 508 824536.156663 +564 508 588085.337671 +509 509 13318817.2723 +510 509 -5.96046447754e-8 +511 509 1651505.67955 +512 509 -3590229.73815 +513 509 4.09781932831e-8 +556 509 953085.336629 +557 509 -1537234.41392 +558 509 1196000.48814 +559 509 83826.4031561 +560 509 -134521.304432 +561 509 32978.3592395 +562 509 824536.156663 +563 509 -1792469.90579 +564 509 -1278446.38624 +510 510 19146980.3477 +511 510 -2.14204192162e-8 +512 510 4.842877388e-8 +513 510 1124555.53479 +556 510 -741520.302649 +557 510 1196000.48814 +558 510 -2434642.38116 +559 510 -61373.985991 +560 510 -32978.3592395 +561 510 -6109264.54972 +562 510 588085.337671 +563 510 -1278446.38624 +564 510 -2352102.70813 +511 511 2558539.62181 +512 511 -6138307.60949 +513 511 4.28408384323e-8 +514 511 -544032.43723 +515 511 1483724.82881 +516 511 -2.32830643654e-8 +559 511 -379286.632065 +560 511 824536.156663 +561 511 -588085.337671 +562 511 12227.6197724 +563 511 -33038.3525624 +564 511 41457.2556898 +565 511 -260348.273704 +566 511 710040.746465 +567 511 484442.198447 +512 512 14915778.6682 +513 512 -1.04308128357e-7 +514 512 1483724.82881 +515 512 -4046522.26039 +516 512 6.70552253723e-8 +559 512 824536.156663 +560 512 -1792469.90579 +561 512 1278446.38624 +562 512 -33038.3525624 +563 512 89431.3340665 +564 512 17103.8438088 +565 512 710040.746465 +566 512 -1936474.76309 +567 512 -1321205.99576 +513 513 18669379.7869 +514 513 -2.60770320892e-8 +515 513 7.45058059692e-8 +516 513 931107.693647 +559 513 -588085.337671 +560 513 1278446.38624 +561 513 -2352102.70813 +562 513 -41457.2556898 +563 513 -17103.8438089 +564 513 -5695176.55864 +565 513 484442.198447 +566 513 -1321205.99576 +567 513 -2315242.24089 +514 514 1816739.3315 +515 514 -5341279.87864 +516 514 3.53902578354e-8 +517 514 -413671.243673 +518 514 1334423.36669 +519 514 -6.51925802231e-9 +562 514 -260348.273704 +563 514 710040.746465 +564 514 -484442.198447 +565 514 24667.0078013 +566 514 -73754.1287475 +567 514 27106.375452 +568 514 -193836.559394 +569 514 625279.223852 +570 514 416676.259817 +515 515 15814018.062 +516 515 -1.04308128357e-7 +517 515 1334423.36669 +518 515 -4304591.50545 +519 515 2.60770320892e-8 +562 515 710040.746465 +563 515 -1936474.76309 +564 515 1321205.99576 +565 515 -73754.1287475 +566 515 222052.369366 +567 515 9164.38855486 +568 515 625279.223852 +569 515 -2017029.75436 +570 515 -1344116.96715 +516 516 18448886.5844 +517 516 -1.11758708954e-8 +518 516 3.35276126862e-8 +519 516 830431.306934 +562 516 -484442.198447 +563 516 1321205.99576 +564 516 -2315242.24089 +565 516 -27106.375452 +566 516 -9164.38855491 +567 516 -5492991.14412 +568 516 416676.259817 +569 516 -1344116.96715 +570 516 -2296979.40748 +517 517 2350262.78049 +518 517 -4600302.86075 +519 517 1.86264514923e-8 +520 517 -7.45058059692e-9 +523 517 -311975.890718 +524 517 1184718.57235 +525 517 -1.11758708954e-8 +565 517 -193836.559394 +566 517 625279.223852 +567 517 -416676.259817 +568 517 -474421.1715 +569 517 -131724.429407 +570 517 23329.9193232 +571 517 -800250.281991 +572 517 8988445.57462 +574 517 -144050.092155 +575 517 547025.666412 +576 517 358351.461509 +518 518 17048556.4258 +519 518 -6.70552253723e-8 +520 518 5.96046447754e-8 +521 518 7.45058059692e-9 +523 518 1184718.57235 +524 518 -4498931.28739 +525 518 3.72529029846e-8 +565 518 625279.223852 +566 518 -2017029.75436 +567 518 1344116.96715 +568 518 -131724.429407 +569 518 -28174.4048383 +570 518 6684.54707695 +571 518 -6040681.08601 +572 518 800250.281991 +574 518 547025.666412 +575 518 -2077312.65726 +576 518 -1360828.33484 +519 519 36176122.0894 +523 519 -1.30385160446e-8 +524 519 4.47034835815e-8 +525 519 758227.34113 +565 519 -416676.259817 +566 519 1344116.96715 +567 519 -2296979.40748 +568 519 -23329.9193232 +569 519 -6684.54707699 +570 519 -14301137.6219 +574 519 358351.461509 +575 519 -1360828.33484 +576 519 -2284273.33935 +520 520 305878011.196 +521 520 -66093576.1502 +568 520 800250.281991 +569 520 6040681.08601 +571 520 64525513.4986 +572 520 4237777.92342 +521 521 549337215.254 +568 521 -8988445.57462 +569 521 -800250.281991 +571 521 4237777.92342 +572 521 48915433.0595 +522 522 715555.555556 +573 522 -357777.777778 +523 523 1011851.60912 +524 523 -4110093.43272 +525 523 6.14672899246e-8 +568 523 -144050.092155 +569 523 547025.666412 +570 523 -358351.461509 +574 523 22134.9913963 +575 523 -90320.994053 +576 523 18909.0650259 +524 524 16788621.6609 +525 524 -2.53319740295e-7 +568 524 547025.666412 +569 524 -2077312.65726 +570 524 1360828.33484 +574 524 -90320.994053 +575 524 370626.696215 +576 524 4631.25243446 +525 525 18240145.4814 +568 525 -358351.461509 +569 525 1360828.33484 +570 525 -2284273.33935 +574 525 -18909.0650259 +575 525 -4631.25243459 +576 525 -5293544.01962 +526 526 1011851.60912 +527 526 4110093.43272 +528 526 -4.65661287308e-8 +529 526 -311975.890718 +530 526 -1184718.57235 +531 526 1.02445483208e-8 +577 526 22134.9913963 +578 526 90320.994053 +579 526 -18909.0650259 +580 526 -144050.092155 +581 526 -547025.666412 +582 526 358351.461509 +527 527 16788621.6609 +528 527 -2.01165676117e-7 +529 527 -1184718.57235 +530 527 -4498931.28739 +531 527 3.35276126862e-8 +577 527 90320.994053 +578 527 370626.696215 +579 527 4631.25243448 +580 527 -547025.666412 +581 527 -2077312.65726 +582 527 1360828.33484 +528 528 18240145.4814 +529 528 8.38190317154e-9 +530 528 2.60770320892e-8 +531 528 758227.34113 +577 528 18909.0650259 +578 528 -4631.25243456 +579 528 -5293544.01962 +580 528 358351.461509 +581 528 1360828.33484 +582 528 -2284273.33935 +529 529 2350262.38096 +530 529 4600302.12491 +531 529 -2.23517417908e-8 +532 529 2.98023223877e-8 +533 529 -1.19209289551e-7 +535 529 -413671.243673 +536 529 -1334423.36669 +537 529 1.49011611938e-8 +577 529 -144050.092155 +578 529 -547025.666412 +579 529 -358351.461509 +580 529 -474420.971735 +581 529 131724.797327 +582 529 -23329.9193232 +583 529 800256.904552 +584 529 8988441.97885 +586 529 -193836.559394 +587 529 -625279.223852 +588 529 416676.259817 +530 530 17048556.8253 +531 530 -7.45058059692e-8 +532 530 5.96046447754e-8 +535 530 -1334423.36669 +536 530 -4304591.50545 +537 530 4.47034835815e-8 +577 530 -547025.666412 +578 530 -2077312.65726 +579 530 -1360828.33484 +580 530 131724.797327 +581 530 -28174.6046032 +582 530 6684.54707693 +583 530 -6040684.68178 +584 530 -800256.904552 +586 530 -625279.223852 +587 530 -2017029.75436 +588 530 1344116.96715 +531 531 36176122.0894 +535 531 1.210719347e-8 +536 531 3.35276126862e-8 +537 531 830431.306934 +577 531 -358351.461509 +578 531 -1360828.33484 +579 531 -2284273.33935 +580 531 23329.9193232 +581 531 -6684.54707697 +582 531 -14301137.6219 +586 531 416676.259817 +587 531 1344116.96715 +588 531 -2296979.40748 +532 532 305878308.174 +533 532 66094123.115 +580 532 -800256.904552 +581 532 6040684.68178 +583 532 64525494.457 +584 532 -4237812.99363 +533 533 549336918.275 +580 533 -8988441.97885 +581 533 800256.904552 +583 533 -4237812.99363 +584 533 48915452.1011 +534 534 715555.555556 +585 534 -357777.777778 +535 535 1816739.3315 +536 535 5341279.87864 +537 535 -3.72529029846e-8 +538 535 -544032.43723 +539 535 -1483724.82881 +540 535 2.23517417908e-8 +580 535 -193836.559394 +581 535 -625279.223852 +582 535 -416676.259817 +586 535 24667.0078013 +587 535 73754.1287475 +588 535 -27106.375452 +589 535 -260348.273704 +590 535 -710040.746465 +591 535 484442.198447 +536 536 15814018.062 +537 536 -1.19209289551e-7 +538 536 -1483724.82881 +539 536 -4046522.26039 +540 536 5.96046447754e-8 +580 536 -625279.223852 +581 536 -2017029.75436 +582 536 -1344116.96715 +586 536 73754.1287475 +587 536 222052.369365 +588 536 9164.38855485 +589 536 -710040.746465 +590 536 -1936474.76309 +591 536 1321205.99576 +537 537 18448886.5844 +538 537 1.95577740669e-8 +539 537 5.21540641785e-8 +540 537 931107.693647 +580 537 -416676.259817 +581 537 -1344116.96715 +582 537 -2296979.40748 +586 537 27106.375452 +587 537 -9164.3885549 +588 537 -5492991.14412 +589 537 484442.198447 +590 537 1321205.99576 +591 537 -2315242.24089 +538 538 2558539.62181 +539 538 6138307.60949 +540 538 -4.842877388e-8 +541 538 -759692.612592 +542 538 -1651505.67955 +543 538 2.79396772385e-8 +586 538 -260348.273704 +587 538 -710040.746465 +588 538 -484442.198447 +589 538 12227.6197723 +590 538 33038.3525623 +591 538 -41457.2556898 +592 538 -379286.632065 +593 538 -824536.156663 +594 538 588085.337671 +539 539 14915778.6682 +540 539 -1.19209289551e-7 +541 539 -1651505.67955 +542 539 -3590229.73815 +543 539 6.14672899246e-8 +586 539 -710040.746465 +587 539 -1936474.76309 +588 539 -1321205.99576 +589 539 33038.3525623 +590 539 89431.3340663 +591 539 17103.8438088 +592 539 -824536.156663 +593 539 -1792469.90579 +594 539 1278446.38624 +540 540 18669379.7869 +541 540 2.70083546639e-8 +542 540 5.77419996262e-8 +543 540 1124555.53479 +586 540 -484442.198447 +587 540 -1321205.99576 +588 540 -2315242.24089 +589 540 41457.2556898 +590 540 -17103.8438089 +591 540 -5695176.55864 +592 540 588085.337671 +593 540 1278446.38624 +594 540 -2352102.70813 +541 541 3880798.16119 +542 541 7110485.96967 +543 541 -4.47034835815e-8 +544 541 -1076372.38828 +545 541 -1736084.49722 +546 541 2.421438694e-8 +589 541 -379286.632065 +590 541 -824536.156663 +591 541 -588085.337671 +592 541 -52167.0393845 +593 541 -83826.4031561 +594 541 -61373.985991 +595 541 -590912.90871 +596 541 -953085.336629 +597 541 741520.302649 +542 542 13318817.2723 +543 542 -8.94069671631e-8 +544 542 -1736084.49722 +545 542 -2800136.28584 +546 542 3.91155481339e-8 +589 542 -824536.156663 +590 542 -1792469.90579 +591 542 -1278446.38624 +592 542 -83826.4031561 +593 542 -134521.304432 +594 542 32978.3592395 +595 542 -953085.336629 +596 542 -1537234.41392 +597 542 1196000.48814 +543 543 19146980.3477 +544 543 1.67638063431e-8 +545 543 2.98023223877e-8 +546 543 1520483.39551 +589 543 -588085.337671 +590 543 -1278446.38624 +591 543 -2352102.70813 +592 543 61373.985991 +593 543 -32978.3592395 +594 543 -6109264.54972 +595 543 741520.302649 +596 543 1196000.48814 +597 543 -2434642.38116 +544 544 6516876.42304 +545 544 8531914.96891 +546 544 -1.49011611938e-8 +547 544 -2626121.17726 +548 544 -2984228.61052 +549 544 5.58793544769e-9 +592 544 -590912.90871 +593 544 -953085.336629 +594 544 -741520.302649 +595 544 222027.67781 +596 544 227177.812693 +597 544 -75251.5247453 +598 544 -1038306.19785 +599 544 -1179893.40665 +600 544 929649.114512 +545 545 11512089.4984 +546 545 -2.23517417908e-8 +547 545 -2984228.61052 +548 545 -3391168.87559 +549 545 9.31322574615e-9 +592 545 -953085.336629 +593 545 -1537234.41392 +594 545 -1196000.48814 +595 545 227177.812693 +596 545 217630.207531 +597 545 55832.4159336 +598 545 -1179893.40665 +599 545 -1340787.9621 +600 545 1056419.44831 +546 546 18361731.7736 +549 546 -125380.553907 +592 546 -741520.302649 +593 546 -1196000.48814 +594 546 -2434642.38116 +595 546 75251.5247453 +596 546 -55832.4159336 +597 546 -5287984.36193 +598 546 929649.114512 +599 546 1056419.44831 +600 546 -2155790.5645 +547 547 11197028.9194 +548 547 7624235.1212 +549 547 1.49011611938e-8 +550 547 -1154846.00933 +551 547 -476225.158488 +595 547 -1038306.19785 +596 547 -1179893.40665 +597 547 -929649.114512 +598 547 -908773.635179 +599 547 -175831.894858 +600 547 -148519.569575 +601 547 -1760951.03338 +602 547 -726165.37459 +603 547 1300948.03845 +548 548 6560950.4012 +549 548 7.45058059692e-9 +550 548 -476225.158488 +551 548 -196381.508655 +595 548 -1179893.40665 +596 548 -1340787.9621 +597 548 -1056419.44831 +598 548 -175831.894858 +599 548 153537.59263 +600 548 207978.412157 +601 548 -726165.37459 +602 548 -299449.639006 +603 548 536473.417918 +549 549 21281133.3311 +552 549 4075797.18655 +595 549 -929649.114512 +596 549 -1056419.44831 +597 549 -2155790.5645 +598 549 148519.569575 +599 549 -207978.412157 +600 549 -7295491.64648 +601 549 1300948.03845 +602 549 536473.417918 +603 549 -3164492.7709 +550 550 14087608.2601 +551 550 -7.45058059692e-9 +552 550 -7.45058059692e-9 +553 550 -1154846.00933 +554 550 476225.158488 +598 550 -1760951.03338 +599 550 -726165.37459 +600 550 -1300948.03845 +601 550 -2367056.05396 +602 550 1.11758708954e-8 +603 550 1.86264514923e-9 +604 550 -1760951.03338 +605 550 726165.37459 +606 550 1300948.03845 +551 551 2395597.11087 +552 551 -7.45058059692e-9 +553 551 476225.158488 +554 551 -196381.508655 +598 551 -726165.37459 +599 551 -299449.639006 +600 551 -536473.417918 +601 551 9.31322574615e-9 +602 551 -402517.768767 +603 551 429178.734334 +604 551 726165.37459 +605 551 -299449.639006 +606 551 -536473.417918 +552 552 25315942.1547 +555 552 4075797.18655 +598 552 -1300948.03845 +599 552 -536473.417918 +600 552 -3164492.7709 +602 552 -429178.734334 +603 552 -10404782.7221 +604 552 1300948.03845 +605 552 -536473.417918 +606 552 -3164492.7709 +553 553 11197028.9194 +554 553 -7624235.1212 +555 553 -1.86264514923e-8 +556 553 -2626121.17726 +557 553 2984228.61052 +558 553 -5.58793544769e-9 +601 553 -1760951.03338 +602 553 726165.37459 +603 553 -1300948.03845 +604 553 -908773.635179 +605 553 175831.894858 +606 553 148519.569575 +607 553 -1038306.19785 +608 553 1179893.40665 +609 553 929649.114512 +554 554 6560950.4012 +555 554 7.45058059692e-9 +556 554 2984228.61052 +557 554 -3391168.87559 +558 554 5.58793544769e-9 +601 554 726165.37459 +602 554 -299449.639006 +603 554 536473.417918 +604 554 175831.894858 +605 554 153537.59263 +606 554 207978.412157 +607 554 1179893.40665 +608 554 -1340787.9621 +609 554 -1056419.44831 +555 555 21281133.3311 +556 555 -1.30385160446e-8 +557 555 1.30385160446e-8 +558 555 -125380.553907 +601 555 -1300948.03845 +602 555 536473.417918 +603 555 -3164492.7709 +604 555 -148519.569575 +605 555 -207978.412157 +606 555 -7295491.64648 +607 555 929649.114512 +608 555 -1056419.44831 +609 555 -2155790.5645 +556 556 6516876.42304 +557 556 -8531914.96891 +558 556 2.98023223877e-8 +559 556 -1076372.38828 +560 556 1736084.49722 +561 556 -1.49011611938e-8 +604 556 -1038306.19785 +605 556 1179893.40665 +606 556 -929649.114512 +607 556 222027.67781 +608 556 -227177.812693 +609 556 75251.5247453 +610 556 -590912.90871 +611 556 953085.336629 +612 556 741520.302649 +557 557 11512089.4984 +558 557 -3.72529029846e-8 +559 557 1736084.49722 +560 557 -2800136.28584 +561 557 2.421438694e-8 +604 557 1179893.40665 +605 557 -1340787.9621 +606 557 1056419.44831 +607 557 -227177.812693 +608 557 217630.207531 +609 557 55832.4159336 +610 557 953085.336629 +611 557 -1537234.41392 +612 557 -1196000.48814 +558 558 18361731.7736 +559 558 -1.86264514923e-8 +560 558 3.16649675369e-8 +561 558 1520483.39551 +604 558 -929649.114512 +605 558 1056419.44831 +606 558 -2155790.5645 +607 558 -75251.5247453 +608 558 -55832.4159336 +609 558 -5287984.36193 +610 558 741520.302649 +611 558 -1196000.48814 +612 558 -2434642.38116 +559 559 3880798.16119 +560 559 -7110485.96967 +561 559 2.60770320892e-8 +562 559 -759692.612592 +563 559 1651505.67955 +564 559 -1.67638063431e-8 +607 559 -590912.90871 +608 559 953085.336629 +609 559 -741520.302649 +610 559 -52167.0393845 +611 559 83826.4031561 +612 559 61373.985991 +613 559 -379286.632065 +614 559 824536.156663 +615 559 588085.337671 +560 560 13318817.2723 +561 560 -4.47034835815e-8 +562 560 1651505.67955 +563 560 -3590229.73815 +564 560 3.72529029846e-8 +607 560 953085.336629 +608 560 -1537234.41392 +609 560 1196000.48814 +610 560 83826.4031561 +611 560 -134521.304432 +612 560 32978.3592395 +613 560 824536.156663 +614 560 -1792469.90579 +615 560 -1278446.38624 +561 561 19146980.3477 +562 561 -2.14204192162e-8 +563 561 4.842877388e-8 +564 561 1124555.53479 +607 561 -741520.302649 +608 561 1196000.48814 +609 561 -2434642.38116 +610 561 -61373.985991 +611 561 -32978.3592395 +612 561 -6109264.54972 +613 561 588085.337671 +614 561 -1278446.38624 +615 561 -2352102.70813 +562 562 2558539.62181 +563 562 -6138307.60949 +564 562 4.28408384323e-8 +565 562 -544032.43723 +566 562 1483724.82881 +567 562 -2.32830643654e-8 +610 562 -379286.632065 +611 562 824536.156663 +612 562 -588085.337671 +613 562 12227.6197724 +614 562 -33038.3525623 +615 562 41457.2556898 +616 562 -260348.273704 +617 562 710040.746465 +618 562 484442.198447 +563 563 14915778.6682 +564 563 -1.11758708954e-7 +565 563 1483724.82881 +566 563 -4046522.26039 +567 563 6.70552253723e-8 +610 563 824536.156663 +611 563 -1792469.90579 +612 563 1278446.38624 +613 563 -33038.3525623 +614 563 89431.3340664 +615 563 17103.8438088 +616 563 710040.746465 +617 563 -1936474.76309 +618 563 -1321205.99576 +564 564 18669379.7869 +565 564 -2.60770320892e-8 +566 564 7.45058059692e-8 +567 564 931107.693647 +610 564 -588085.337671 +611 564 1278446.38624 +612 564 -2352102.70813 +613 564 -41457.2556898 +614 564 -17103.8438089 +615 564 -5695176.55864 +616 564 484442.198447 +617 564 -1321205.99576 +618 564 -2315242.24089 +565 565 1816739.3315 +566 565 -5341279.87864 +567 565 3.53902578354e-8 +568 565 -413671.243673 +569 565 1334423.36669 +570 565 -6.51925802231e-9 +613 565 -260348.273704 +614 565 710040.746465 +615 565 -484442.198447 +616 565 24667.0078013 +617 565 -73754.1287475 +618 565 27106.375452 +619 565 -193836.559394 +620 565 625279.223852 +621 565 416676.259817 +566 566 15814018.062 +567 566 -1.04308128357e-7 +568 566 1334423.36669 +569 566 -4304591.50545 +570 566 2.60770320892e-8 +613 566 710040.746465 +614 566 -1936474.76309 +615 566 1321205.99576 +616 566 -73754.1287475 +617 566 222052.369366 +618 566 9164.38855486 +619 566 625279.223852 +620 566 -2017029.75436 +621 566 -1344116.96715 +567 567 18448886.5844 +568 567 -1.11758708954e-8 +569 567 3.35276126862e-8 +570 567 830431.306934 +613 567 -484442.198447 +614 567 1321205.99576 +615 567 -2315242.24089 +616 567 -27106.375452 +617 567 -9164.38855491 +618 567 -5492991.14412 +619 567 416676.259817 +620 567 -1344116.96715 +621 567 -2296979.40748 +568 568 2350262.78049 +569 568 -4600302.86075 +570 568 1.86264514923e-8 +571 568 -7.45058059692e-9 +574 568 -311975.890718 +575 568 1184718.57235 +576 568 -1.11758708954e-8 +616 568 -193836.559394 +617 568 625279.223852 +618 568 -416676.259817 +619 568 -474421.1715 +620 568 -131724.429407 +621 568 23329.9193232 +622 568 -800250.281991 +623 568 8988445.57462 +625 568 -144050.092155 +626 568 547025.666412 +627 568 358351.461509 +569 569 17048556.4258 +570 569 -6.70552253723e-8 +571 569 5.96046447754e-8 +572 569 7.45058059692e-9 +574 569 1184718.57235 +575 569 -4498931.28739 +576 569 3.72529029846e-8 +616 569 625279.223852 +617 569 -2017029.75436 +618 569 1344116.96715 +619 569 -131724.429407 +620 569 -28174.4048383 +621 569 6684.54707695 +622 569 -6040681.08601 +623 569 800250.281991 +625 569 547025.666412 +626 569 -2077312.65726 +627 569 -1360828.33484 +570 570 36176122.0894 +574 570 -1.30385160446e-8 +575 570 4.47034835815e-8 +576 570 758227.34113 +616 570 -416676.259817 +617 570 1344116.96715 +618 570 -2296979.40748 +619 570 -23329.9193232 +620 570 -6684.54707699 +621 570 -14301137.6219 +625 570 358351.461509 +626 570 -1360828.33484 +627 570 -2284273.33935 +571 571 305878011.196 +572 571 -66093576.1502 +619 571 800250.281991 +620 571 6040681.08601 +622 571 64525513.4986 +623 571 4237777.92342 +572 572 549337215.254 +619 572 -8988445.57462 +620 572 -800250.281991 +622 572 4237777.92342 +623 572 48915433.0595 +573 573 715555.555556 +624 573 -357777.777778 +574 574 1011851.60912 +575 574 -4110093.43272 +576 574 6.33299350738e-8 +619 574 -144050.092155 +620 574 547025.666412 +621 574 -358351.461509 +625 574 22134.9913963 +626 574 -90320.994053 +627 574 18909.0650259 +575 575 16788621.6609 +576 575 -2.60770320892e-7 +619 575 547025.666412 +620 575 -2077312.65726 +621 575 1360828.33484 +625 575 -90320.994053 +626 575 370626.696215 +627 575 4631.25243446 +576 576 18240145.4814 +619 576 -358351.461509 +620 576 1360828.33484 +621 576 -2284273.33935 +625 576 -18909.0650259 +626 576 -4631.25243459 +627 576 -5293544.01962 +577 577 1011851.60912 +578 577 4110093.43272 +579 577 -4.842877388e-8 +580 577 -311975.890718 +581 577 -1184718.57235 +582 577 1.02445483208e-8 +628 577 22134.9913963 +629 577 90320.994053 +630 577 -18909.0650259 +631 577 -144050.092155 +632 577 -547025.666412 +633 577 358351.461509 +578 578 16788621.6609 +579 578 -2.08616256714e-7 +580 578 -1184718.57235 +581 578 -4498931.28739 +582 578 3.35276126862e-8 +628 578 90320.994053 +629 578 370626.696215 +630 578 4631.25243447 +631 578 -547025.666412 +632 578 -2077312.65726 +633 578 1360828.33484 +579 579 18240145.4814 +580 579 8.38190317154e-9 +581 579 2.60770320892e-8 +582 579 758227.34113 +628 579 18909.0650259 +629 579 -4631.25243456 +630 579 -5293544.01962 +631 579 358351.461509 +632 579 1360828.33484 +633 579 -2284273.33935 +580 580 2350262.38096 +581 580 4600302.12491 +582 580 -2.23517417908e-8 +583 580 2.98023223877e-8 +584 580 -1.19209289551e-7 +586 580 -413671.243673 +587 580 -1334423.36669 +588 580 1.49011611938e-8 +628 580 -144050.092155 +629 580 -547025.666412 +630 580 -358351.461509 +631 580 -474420.971735 +632 580 131724.797327 +633 580 -23329.9193232 +634 580 800256.904552 +635 580 8988441.97885 +637 580 -193836.559394 +638 580 -625279.223852 +639 580 416676.259817 +581 581 17048556.8253 +582 581 -7.45058059692e-8 +583 581 5.96046447754e-8 +586 581 -1334423.36669 +587 581 -4304591.50545 +588 581 4.47034835815e-8 +628 581 -547025.666412 +629 581 -2077312.65726 +630 581 -1360828.33484 +631 581 131724.797327 +632 581 -28174.6046032 +633 581 6684.54707693 +634 581 -6040684.68178 +635 581 -800256.904552 +637 581 -625279.223852 +638 581 -2017029.75436 +639 581 1344116.96715 +582 582 36176122.0894 +586 582 1.210719347e-8 +587 582 3.35276126862e-8 +588 582 830431.306934 +628 582 -358351.461509 +629 582 -1360828.33484 +630 582 -2284273.33935 +631 582 23329.9193232 +632 582 -6684.54707697 +633 582 -14301137.6219 +637 582 416676.259817 +638 582 1344116.96715 +639 582 -2296979.40748 +583 583 305878308.174 +584 583 66094123.115 +631 583 -800256.904552 +632 583 6040684.68178 +634 583 64525494.457 +635 583 -4237812.99363 +584 584 549336918.275 +631 584 -8988441.97885 +632 584 800256.904552 +634 584 -4237812.99363 +635 584 48915452.1011 +585 585 715555.555556 +636 585 -357777.777778 +586 586 1816739.3315 +587 586 5341279.87864 +588 586 -3.72529029846e-8 +589 586 -544032.43723 +590 586 -1483724.82881 +591 586 2.23517417908e-8 +631 586 -193836.559394 +632 586 -625279.223852 +633 586 -416676.259817 +637 586 24667.0078013 +638 586 73754.1287475 +639 586 -27106.375452 +640 586 -260348.273704 +641 586 -710040.746465 +642 586 484442.198447 +587 587 15814018.062 +588 587 -1.19209289551e-7 +589 587 -1483724.82881 +590 587 -4046522.26039 +591 587 5.96046447754e-8 +631 587 -625279.223852 +632 587 -2017029.75436 +633 587 -1344116.96715 +637 587 73754.1287475 +638 587 222052.369365 +639 587 9164.38855485 +640 587 -710040.746465 +641 587 -1936474.76309 +642 587 1321205.99576 +588 588 18448886.5844 +589 588 1.95577740669e-8 +590 588 5.21540641785e-8 +591 588 931107.693647 +631 588 -416676.259817 +632 588 -1344116.96715 +633 588 -2296979.40748 +637 588 27106.375452 +638 588 -9164.3885549 +639 588 -5492991.14412 +640 588 484442.198447 +641 588 1321205.99576 +642 588 -2315242.24089 +589 589 2558539.62181 +590 589 6138307.60949 +591 589 -5.21540641785e-8 +592 589 -759692.612592 +593 589 -1651505.67955 +594 589 2.98023223877e-8 +637 589 -260348.273704 +638 589 -710040.746465 +639 589 -484442.198447 +640 589 12227.6197723 +641 589 33038.3525623 +642 589 -41457.2556898 +643 589 -379286.632065 +644 589 -824536.156663 +645 589 588085.337671 +590 590 14915778.6682 +591 590 -1.26659870148e-7 +592 590 -1651505.67955 +593 590 -3590229.73815 +594 590 6.33299350738e-8 +637 590 -710040.746465 +638 590 -1936474.76309 +639 590 -1321205.99576 +640 590 33038.3525623 +641 590 89431.3340663 +642 590 17103.8438088 +643 590 -824536.156663 +644 590 -1792469.90579 +645 590 1278446.38624 +591 591 18669379.7869 +592 591 2.70083546639e-8 +593 591 5.77419996262e-8 +594 591 1124555.53479 +637 591 -484442.198447 +638 591 -1321205.99576 +639 591 -2315242.24089 +640 591 41457.2556898 +641 591 -17103.8438089 +642 591 -5695176.55864 +643 591 588085.337671 +644 591 1278446.38624 +645 591 -2352102.70813 +592 592 3880798.16119 +593 592 7110485.96967 +594 592 -4.09781932831e-8 +595 592 -1076372.38828 +596 592 -1736084.49722 +597 592 2.421438694e-8 +640 592 -379286.632065 +641 592 -824536.156663 +642 592 -588085.337671 +643 592 -52167.0393845 +644 592 -83826.4031561 +645 592 -61373.985991 +646 592 -590912.90871 +647 592 -953085.336629 +648 592 741520.302649 +593 593 13318817.2723 +594 593 -8.19563865662e-8 +595 593 -1736084.49722 +596 593 -2800136.28584 +597 593 3.91155481339e-8 +640 593 -824536.156663 +641 593 -1792469.90579 +642 593 -1278446.38624 +643 593 -83826.4031561 +644 593 -134521.304432 +645 593 32978.3592395 +646 593 -953085.336629 +647 593 -1537234.41392 +648 593 1196000.48814 +594 594 19146980.3477 +595 594 1.67638063431e-8 +596 594 2.98023223877e-8 +597 594 1520483.39551 +640 594 -588085.337671 +641 594 -1278446.38624 +642 594 -2352102.70813 +643 594 61373.985991 +644 594 -32978.3592395 +645 594 -6109264.54972 +646 594 741520.302649 +647 594 1196000.48814 +648 594 -2434642.38116 +595 595 6516876.42304 +596 595 8531914.96891 +597 595 -1.49011611938e-8 +598 595 -2626121.17726 +599 595 -2984228.61052 +600 595 5.58793544769e-9 +643 595 -590912.90871 +644 595 -953085.336629 +645 595 -741520.302649 +646 595 222027.67781 +647 595 227177.812693 +648 595 -75251.5247453 +649 595 -1038306.19785 +650 595 -1179893.40665 +651 595 929649.114512 +596 596 11512089.4984 +597 596 -2.23517417908e-8 +598 596 -2984228.61052 +599 596 -3391168.87559 +600 596 9.31322574615e-9 +643 596 -953085.336629 +644 596 -1537234.41392 +645 596 -1196000.48814 +646 596 227177.812693 +647 596 217630.207531 +648 596 55832.4159336 +649 596 -1179893.40665 +650 596 -1340787.9621 +651 596 1056419.44831 +597 597 18361731.7736 +600 597 -125380.553907 +643 597 -741520.302649 +644 597 -1196000.48814 +645 597 -2434642.38116 +646 597 75251.5247453 +647 597 -55832.4159336 +648 597 -5287984.36193 +649 597 929649.114512 +650 597 1056419.44831 +651 597 -2155790.5645 +598 598 11197028.9194 +599 598 7624235.1212 +600 598 -7.45058059692e-9 +601 598 -1154846.00933 +602 598 -476225.158488 +603 598 1.86264514923e-9 +646 598 -1038306.19785 +647 598 -1179893.40665 +648 598 -929649.114512 +649 598 -908773.635179 +650 598 -175831.894858 +651 598 -148519.569575 +652 598 -1760951.03338 +653 598 -726165.37459 +654 598 1300948.03845 +599 599 6560950.4012 +601 599 -476225.158488 +602 599 -196381.508655 +603 599 9.31322574615e-10 +646 599 -1179893.40665 +647 599 -1340787.9621 +648 599 -1056419.44831 +649 599 -175831.894858 +650 599 153537.59263 +651 599 207978.412157 +652 599 -726165.37459 +653 599 -299449.639006 +654 599 536473.417918 +600 600 21281133.3311 +603 600 4075797.18655 +646 600 -929649.114512 +647 600 -1056419.44831 +648 600 -2155790.5645 +649 600 148519.569575 +650 600 -207978.412157 +651 600 -7295491.64648 +652 600 1300948.03845 +653 600 536473.417918 +654 600 -3164492.7709 +601 601 14087608.2601 +602 601 -7.45058059692e-9 +603 601 -7.45058059692e-9 +604 601 -1154846.00933 +605 601 476225.158488 +606 601 1.86264514923e-9 +649 601 -1760951.03338 +650 601 -726165.37459 +651 601 -1300948.03845 +652 601 -2367056.05396 +653 601 1.11758708954e-8 +654 601 1.86264514923e-9 +655 601 -1760951.03338 +656 601 726165.37459 +657 601 1300948.03845 +602 602 2395597.11087 +603 602 7.45058059692e-9 +604 602 476225.158488 +605 602 -196381.508655 +606 602 -9.31322574615e-10 +649 602 -726165.37459 +650 602 -299449.639006 +651 602 -536473.417918 +652 602 9.31322574615e-9 +653 602 -402517.768767 +654 602 429178.734334 +655 602 726165.37459 +656 602 -299449.639006 +657 602 -536473.417918 +603 603 25315942.1547 +606 603 4075797.18655 +649 603 -1300948.03845 +650 603 -536473.417918 +651 603 -3164492.7709 +653 603 -429178.734334 +654 603 -10404782.7221 +655 603 1300948.03845 +656 603 -536473.417918 +657 603 -3164492.7709 +604 604 11197028.9194 +605 604 -7624235.1212 +606 604 3.72529029846e-9 +607 604 -2626121.17726 +608 604 2984228.61052 +609 604 -5.58793544769e-9 +652 604 -1760951.03338 +653 604 726165.37459 +654 604 -1300948.03845 +655 604 -908773.635179 +656 604 175831.894858 +657 604 148519.569575 +658 604 -1038306.19785 +659 604 1179893.40665 +660 604 929649.114512 +605 605 6560950.4012 +607 605 2984228.61052 +608 605 -3391168.87559 +609 605 5.58793544769e-9 +652 605 726165.37459 +653 605 -299449.639006 +654 605 536473.417918 +655 605 175831.894858 +656 605 153537.59263 +657 605 207978.412157 +658 605 1179893.40665 +659 605 -1340787.9621 +660 605 -1056419.44831 +606 606 21281133.3311 +607 606 -1.30385160446e-8 +608 606 1.30385160446e-8 +609 606 -125380.553907 +652 606 -1300948.03845 +653 606 536473.417918 +654 606 -3164492.7709 +655 606 -148519.569575 +656 606 -207978.412157 +657 606 -7295491.64648 +658 606 929649.114512 +659 606 -1056419.44831 +660 606 -2155790.5645 +607 607 6516876.42304 +608 607 -8531914.96891 +609 607 2.98023223877e-8 +610 607 -1076372.38828 +611 607 1736084.49722 +612 607 -1.49011611938e-8 +655 607 -1038306.19785 +656 607 1179893.40665 +657 607 -929649.114512 +658 607 222027.67781 +659 607 -227177.812693 +660 607 75251.5247453 +661 607 -590912.90871 +662 607 953085.336629 +663 607 741520.302649 +608 608 11512089.4984 +609 608 -3.72529029846e-8 +610 608 1736084.49722 +611 608 -2800136.28584 +612 608 2.421438694e-8 +655 608 1179893.40665 +656 608 -1340787.9621 +657 608 1056419.44831 +658 608 -227177.812693 +659 608 217630.207531 +660 608 55832.4159336 +661 608 953085.336629 +662 608 -1537234.41392 +663 608 -1196000.48814 +609 609 18361731.7736 +610 609 -1.86264514923e-8 +611 609 3.16649675369e-8 +612 609 1520483.39551 +655 609 -929649.114512 +656 609 1056419.44831 +657 609 -2155790.5645 +658 609 -75251.5247453 +659 609 -55832.4159336 +660 609 -5287984.36193 +661 609 741520.302649 +662 609 -1196000.48814 +663 609 -2434642.38116 +610 610 3880798.16119 +611 610 -7110485.96967 +612 610 2.98023223877e-8 +613 610 -759692.612592 +614 610 1651505.67955 +615 610 -1.86264514923e-8 +658 610 -590912.90871 +659 610 953085.336629 +660 610 -741520.302649 +661 610 -52167.0393845 +662 610 83826.4031561 +663 610 61373.985991 +664 610 -379286.632065 +665 610 824536.156663 +666 610 588085.337671 +611 611 13318817.2723 +612 611 -5.21540641785e-8 +613 611 1651505.67955 +614 611 -3590229.73815 +615 611 4.09781932831e-8 +658 611 953085.336629 +659 611 -1537234.41392 +660 611 1196000.48814 +661 611 83826.4031561 +662 611 -134521.304432 +663 611 32978.3592395 +664 611 824536.156663 +665 611 -1792469.90579 +666 611 -1278446.38624 +612 612 19146980.3477 +613 612 -2.51457095146e-8 +614 612 5.40167093277e-8 +615 612 1124555.53479 +658 612 -741520.302649 +659 612 1196000.48814 +660 612 -2434642.38116 +661 612 -61373.985991 +662 612 -32978.3592395 +663 612 -6109264.54972 +664 612 588085.337671 +665 612 -1278446.38624 +666 612 -2352102.70813 +613 613 2558539.62181 +614 613 -6138307.60949 +615 613 4.28408384323e-8 +616 613 -544032.43723 +617 613 1483724.82881 +618 613 -2.32830643654e-8 +661 613 -379286.632065 +662 613 824536.156663 +663 613 -588085.337671 +664 613 12227.6197724 +665 613 -33038.3525623 +666 613 41457.2556898 +667 613 -260348.273704 +668 613 710040.746465 +669 613 484442.198447 +614 614 14915778.6682 +615 614 -1.11758708954e-7 +616 614 1483724.82881 +617 614 -4046522.26039 +618 614 6.70552253723e-8 +661 614 824536.156663 +662 614 -1792469.90579 +663 614 1278446.38624 +664 614 -33038.3525623 +665 614 89431.3340664 +666 614 17103.8438088 +667 614 710040.746465 +668 614 -1936474.76309 +669 614 -1321205.99576 +615 615 18669379.7869 +616 615 -2.60770320892e-8 +617 615 7.45058059692e-8 +618 615 931107.693647 +661 615 -588085.337671 +662 615 1278446.38624 +663 615 -2352102.70813 +664 615 -41457.2556898 +665 615 -17103.8438089 +666 615 -5695176.55864 +667 615 484442.198447 +668 615 -1321205.99576 +669 615 -2315242.24089 +616 616 1816739.3315 +617 616 -5341279.87864 +618 616 3.53902578354e-8 +619 616 -413671.243673 +620 616 1334423.36669 +621 616 -6.51925802231e-9 +664 616 -260348.273704 +665 616 710040.746465 +666 616 -484442.198447 +667 616 24667.0078013 +668 616 -73754.1287475 +669 616 27106.375452 +670 616 -193836.559394 +671 616 625279.223852 +672 616 416676.259817 +617 617 15814018.062 +618 617 -1.04308128357e-7 +619 617 1334423.36669 +620 617 -4304591.50545 +621 617 2.60770320892e-8 +664 617 710040.746465 +665 617 -1936474.76309 +666 617 1321205.99576 +667 617 -73754.1287475 +668 617 222052.369366 +669 617 9164.38855486 +670 617 625279.223852 +671 617 -2017029.75436 +672 617 -1344116.96715 +618 618 18448886.5844 +619 618 -1.11758708954e-8 +620 618 3.35276126862e-8 +621 618 830431.306934 +664 618 -484442.198447 +665 618 1321205.99576 +666 618 -2315242.24089 +667 618 -27106.375452 +668 618 -9164.38855491 +669 618 -5492991.14412 +670 618 416676.259817 +671 618 -1344116.96715 +672 618 -2296979.40748 +619 619 2350262.78049 +620 619 -4600302.86075 +621 619 1.86264514923e-8 +622 619 -7.45058059692e-9 +625 619 -311975.890718 +626 619 1184718.57235 +627 619 -1.11758708954e-8 +667 619 -193836.559394 +668 619 625279.223852 +669 619 -416676.259817 +670 619 -474421.1715 +671 619 -131724.429407 +672 619 23329.9193232 +673 619 -800250.281991 +674 619 8988445.57462 +676 619 -144050.092155 +677 619 547025.666412 +678 619 358351.461509 +620 620 17048556.4258 +621 620 -6.70552253723e-8 +622 620 5.96046447754e-8 +623 620 7.45058059692e-9 +625 620 1184718.57235 +626 620 -4498931.28739 +627 620 3.72529029846e-8 +667 620 625279.223852 +668 620 -2017029.75436 +669 620 1344116.96715 +670 620 -131724.429407 +671 620 -28174.4048383 +672 620 6684.54707695 +673 620 -6040681.08601 +674 620 800250.281991 +676 620 547025.666412 +677 620 -2077312.65726 +678 620 -1360828.33484 +621 621 36176122.0894 +625 621 -1.30385160446e-8 +626 621 4.47034835815e-8 +627 621 758227.34113 +667 621 -416676.259817 +668 621 1344116.96715 +669 621 -2296979.40748 +670 621 -23329.9193232 +671 621 -6684.54707699 +672 621 -14301137.6219 +676 621 358351.461509 +677 621 -1360828.33484 +678 621 -2284273.33935 +622 622 305878011.196 +623 622 -66093576.1502 +670 622 800250.281991 +671 622 6040681.08601 +673 622 64525513.4986 +674 622 4237777.92342 +623 623 549337215.254 +670 623 -8988445.57462 +671 623 -800250.281991 +673 623 4237777.92342 +674 623 48915433.0595 +624 624 715555.555556 +675 624 -357777.777778 +625 625 1011851.60912 +626 625 -4110093.43272 +627 625 6.14672899246e-8 +670 625 -144050.092155 +671 625 547025.666412 +672 625 -358351.461509 +676 625 22134.9913963 +677 625 -90320.994053 +678 625 18909.0650259 +626 626 16788621.6609 +627 626 -2.53319740295e-7 +670 626 547025.666412 +671 626 -2077312.65726 +672 626 1360828.33484 +676 626 -90320.994053 +677 626 370626.696215 +678 626 4631.25243446 +627 627 18240145.4814 +670 627 -358351.461509 +671 627 1360828.33484 +672 627 -2284273.33935 +676 627 -18909.0650259 +677 627 -4631.25243459 +678 627 -5293544.01962 +628 628 983097.517609 +629 628 3993191.05725 +630 628 -3.91155481339e-8 +631 628 -268071.177508 +632 628 -1017991.81332 +633 628 1.30385160446e-8 +629 629 16310675.5472 +630 629 -1.63912773132e-7 +631 629 -1017991.81332 +632 629 -3865791.69616 +633 629 4.47034835815e-8 +630 630 19175351.0344 +631 630 5.58793544769e-9 +632 630 1.86264514923e-8 +633 630 1324183.34296 +631 631 2528206.57902 +632 631 4472508.77878 +633 631 -1.49011611938e-8 +634 631 -161794.959894 +635 631 1643725.47145 +637 631 -354732.167298 +638 631 -1144297.31386 +639 631 1.49011611938e-8 +679 631 -183325.791023 +680 631 -591373.519429 +681 631 416676.259817 +632 632 16817023.5501 +633 632 -5.21540641785e-8 +634 632 -2239699.42799 +635 632 161794.959894 +637 632 -1144297.31386 +638 632 -3691281.65763 +639 632 4.47034835815e-8 +679 632 -591373.519429 +680 632 -1907656.51429 +681 632 1344116.96715 +633 633 39001825.1235 +637 633 1.210719347e-8 +638 633 3.35276126862e-8 +639 633 1397983.15475 +679 633 416676.259817 +680 633 1344116.96715 +681 633 -2538358.87127 +634 634 329627273.449 +635 634 65098710.708 +635 635 569419268.28 +636 636 790573.476703 +637 637 1768961.88645 +638 637 5200497.8108 +639 637 -4.28408384323e-8 +640 637 -465133.879389 +641 637 -1268546.94379 +642 637 2.421438694e-8 +679 637 -89281.9039061 +680 637 -261158.775213 +681 637 -27106.375452 +682 637 -246970.319543 +683 637 -673555.416935 +684 637 484442.198447 +638 638 15396260.6937 +639 638 -1.34110450745e-7 +640 638 -1268546.94379 +641 638 -3459673.48306 +642 638 7.07805156708e-8 +679 638 -261158.775213 +680 638 -769227.571739 +681 638 9164.38855484 +682 638 -673555.416935 +683 638 -1836969.31891 +684 638 1321205.99576 +639 639 19430253.1852 +640 639 1.58324837685e-8 +641 639 3.72529029846e-8 +642 639 1501024.18544 +679 639 27106.375452 +680 639 -9164.38855489 +681 639 -7121142.78387 +682 639 484442.198447 +683 639 1321205.99576 +684 639 -2564546.07772 +640 640 2497002.01247 +641 640 5989724.5569 +642 640 -4.842877388e-8 +643 640 -645500.420471 +644 640 -1403261.78363 +645 640 3.16649675369e-8 +679 640 -246970.319543 +680 640 -673555.416935 +681 640 -484442.198447 +682 640 -150094.32553 +683 640 -356091.902114 +684 640 -41457.2556898 +685 640 -361895.781536 +686 640 -786729.959862 +687 640 588085.337671 +641 641 14552393.0113 +642 641 -1.04308128357e-7 +643 641 -1403261.78363 +644 641 -3050569.09485 +645 641 6.70552253723e-8 +679 641 -673555.416935 +680 641 -1836969.31891 +681 641 -1321205.99576 +682 641 -356091.902114 +683 641 -855385.258208 +684 641 17103.8438088 +685 641 -786729.959862 +686 641 -1710282.52144 +687 641 1278446.38624 +642 642 19697338.3132 +643 642 2.51457095146e-8 +644 642 5.40167093277e-8 +645 642 1699467.28443 +679 642 -484442.198447 +680 642 -1321205.99576 +681 642 -2564546.07772 +682 642 41457.2556898 +683 642 -17103.8438089 +684 642 -7353984.06298 +685 642 588085.337671 +686 642 1278446.38624 +687 642 -2616778.13471 +643 643 3805513.9161 +644 643 6969546.89216 +645 643 -4.09781932831e-8 +646 643 -900913.14915 +647 643 -1453085.72444 +648 643 2.23517417908e-8 +682 643 -361895.781536 +683 643 -786729.959862 +684 643 -588085.337671 +685 643 -304176.348108 +686 643 -544599.533137 +687 643 -61373.985991 +688 643 -570661.636677 +689 643 -920421.994641 +690 643 741520.302649 +644 644 13049076.8844 +645 644 -8.19563865662e-8 +646 644 -1453085.72444 +647 644 -2343686.65232 +648 644 3.72529029846e-8 +682 644 -786729.959862 +683 644 -1710282.52144 +684 644 -1278446.38624 +685 644 -544599.533137 +686 644 -995761.387375 +687 644 32978.3592395 +688 644 -920421.994641 +689 644 -1484551.60426 +690 644 1196000.48814 +645 645 20269767.9526 +646 645 1.67638063431e-8 +647 645 2.98023223877e-8 +648 645 2107431.22341 +682 645 -588085.337671 +683 645 -1278446.38624 +684 645 -2616778.13471 +685 645 61373.985991 +686 645 -32978.3592395 +687 645 -7832517.92941 +688 645 741520.302649 +689 645 1196000.48814 +690 645 -2731360.75727 +646 646 6311393.43185 +647 646 8279110.50413 +648 646 -2.60770320892e-8 +649 646 -2301041.15788 +650 646 -2614819.49759 +651 646 1.86264514923e-8 +685 646 -570661.636677 +686 646 -920421.994641 +687 646 -741520.302649 +688 646 -175770.085153 +689 646 -298827.840692 +690 646 -75251.5247453 +691 646 -955815.974241 +692 646 -1086154.51618 +693 646 929649.114512 +647 647 11193680.9464 +648 647 -3.72529029846e-8 +649 647 -2614819.49759 +650 647 -2971385.79271 +651 647 2.421438694e-8 +685 647 -920421.994641 +686 647 -1484551.60426 +687 647 -1196000.48814 +688 647 -298827.840692 +689 647 -499398.232929 +690 647 55832.4159336 +691 647 -1086154.51618 +692 647 -1234266.49566 +693 647 1056419.44831 +648 648 19292741.7183 +649 648 1.11758708954e-8 +650 648 1.30385160446e-8 +651 648 427942.721782 +685 648 -741520.302649 +686 648 -1196000.48814 +687 648 -2731360.75727 +688 648 75251.5247453 +689 648 -55832.4159336 +690 648 -6893760.43768 +691 648 929649.114512 +692 648 1056419.44831 +693 648 -2324577.161 +649 649 11173430.2083 +650 649 7495059.08719 +651 649 -3.72529029846e-8 +652 649 -678836.974673 +653 649 -279932.773061 +654 649 9.31322574615e-9 +688 649 -955815.974241 +689 649 -1086154.51618 +690 649 -929649.114512 +691 649 -1698063.33368 +692 649 -676945.37624 +693 649 -148519.569575 +694 649 -1831641.90145 +695 649 -755316.248019 +696 649 1300948.03845 +650 650 6371949.42588 +651 650 -7.45058059692e-9 +652 650 -279932.773061 +653 650 -115436.195077 +654 650 2.79396772385e-9 +688 650 -1086154.51618 +689 650 -1234266.49566 +690 650 -1056419.44831 +691 650 -676945.37624 +692 650 -252690.316209 +693 650 207978.412157 +694 650 -755316.248019 +695 650 -311470.61774 +696 650 536473.417918 +651 651 22658086.7563 +652 651 -1.86264514923e-9 +654 651 4790763.62708 +688 651 -929649.114512 +689 651 -1056419.44831 +690 651 -2324577.161 +691 651 148519.569575 +692 651 -207978.412157 +693 651 -9252258.07493 +694 651 1300948.03845 +695 651 536473.417918 +696 651 -3684182.88731 +652 652 14370371.7322 +654 652 -7.45058059692e-9 +655 652 -678836.974673 +656 652 279932.773061 +657 652 9.31322574615e-9 +691 652 -1831641.90145 +692 652 -755316.248019 +693 652 -1300948.03845 +694 652 -3460455.85927 +695 652 1.11758708954e-8 +697 652 -1831641.90145 +698 652 755316.248019 +699 652 1300948.03845 +653 653 2443681.02578 +654 653 7.45058059692e-9 +655 653 279932.773061 +656 653 -115436.195077 +657 653 -2.79396772385e-9 +691 653 -755316.248019 +692 653 -311470.61774 +693 653 -536473.417918 +694 653 1.11758708954e-8 +695 653 -588450.353367 +696 653 429178.734334 +697 653 755316.248019 +698 653 -311470.61774 +699 653 -536473.417918 +654 654 27394702.6193 +655 654 -1.86264514923e-9 +657 654 4790763.62708 +691 654 -1300948.03845 +692 654 -536473.417918 +693 654 -3684182.88731 +694 654 3.72529029846e-9 +695 654 -429178.734334 +696 654 -12874095.835 +697 654 1300948.03845 +698 654 -536473.417918 +699 654 -3684182.88731 +655 655 11173430.2083 +656 655 -7495059.08719 +657 655 1.49011611938e-8 +658 655 -2301041.15788 +659 655 2614819.49759 +660 655 -7.45058059692e-9 +694 655 -1831641.90145 +695 655 755316.248019 +696 655 -1300948.03845 +697 655 -1698063.33368 +698 655 676945.37624 +699 655 148519.569575 +700 655 -955815.974241 +701 655 1086154.51618 +702 655 929649.114512 +656 656 6371949.42588 +657 656 7.45058059692e-9 +658 656 2614819.49759 +659 656 -2971385.79271 +660 656 7.45058059692e-9 +694 656 755316.248019 +695 656 -311470.61774 +696 656 536473.417918 +697 656 676945.37624 +698 656 -252690.316209 +699 656 207978.412157 +700 656 1086154.51618 +701 656 -1234266.49566 +702 656 -1056419.44831 +657 657 22658086.7563 +658 657 -1.67638063431e-8 +659 657 1.86264514923e-8 +660 657 427942.721782 +694 657 -1300948.03845 +695 657 536473.417918 +696 657 -3684182.88731 +697 657 -148519.569575 +698 657 -207978.412157 +699 657 -9252258.07493 +700 657 929649.114512 +701 657 -1056419.44831 +702 657 -2324577.161 +658 658 6311393.43185 +659 658 -8279110.50413 +660 658 3.35276126862e-8 +661 658 -900913.14915 +662 658 1453085.72444 +663 658 -1.67638063431e-8 +697 658 -955815.974241 +698 658 1086154.51618 +699 658 -929649.114512 +700 658 -175770.085153 +701 658 298827.840692 +702 658 75251.5247453 +703 658 -570661.636677 +704 658 920421.994641 +705 658 741520.302649 +659 659 11193680.9464 +660 659 -4.47034835815e-8 +661 659 1453085.72444 +662 659 -2343686.65232 +663 659 2.60770320892e-8 +697 659 1086154.51618 +698 659 -1234266.49566 +699 659 1056419.44831 +700 659 298827.840692 +701 659 -499398.232929 +702 659 55832.4159336 +703 659 920421.994641 +704 659 -1484551.60426 +705 659 -1196000.48814 +660 660 19292741.7183 +661 660 -1.67638063431e-8 +662 660 2.79396772385e-8 +663 660 2107431.22341 +697 660 -929649.114512 +698 660 1056419.44831 +699 660 -2324577.161 +700 660 -75251.5247453 +701 660 -55832.4159336 +702 660 -6893760.43768 +703 660 741520.302649 +704 660 -1196000.48814 +705 660 -2731360.75727 +661 661 3805513.9161 +662 661 -6969546.89216 +663 661 2.60770320892e-8 +664 661 -645500.420471 +665 661 1403261.78363 +666 661 -1.86264514923e-8 +700 661 -570661.636677 +701 661 920421.994641 +702 661 -741520.302649 +703 661 -304176.348108 +704 661 544599.533137 +705 661 61373.985991 +706 661 -361895.781536 +707 661 786729.959862 +708 661 588085.337671 +662 662 13049076.8844 +663 662 -5.21540641785e-8 +664 662 1403261.78363 +665 662 -3050569.09485 +666 662 4.09781932831e-8 +700 662 920421.994641 +701 662 -1484551.60426 +702 662 1196000.48814 +703 662 544599.533137 +704 662 -995761.387375 +705 662 32978.3592395 +706 662 786729.959862 +707 662 -1710282.52144 +708 662 -1278446.38624 +663 663 20269767.9526 +664 663 -2.70083546639e-8 +665 663 5.77419996262e-8 +666 663 1699467.28443 +700 663 -741520.302649 +701 663 1196000.48814 +702 663 -2731360.75727 +703 663 -61373.985991 +704 663 -32978.3592395 +705 663 -7832517.92941 +706 663 588085.337671 +707 663 -1278446.38624 +708 663 -2616778.13471 +664 664 2497002.01247 +665 664 -5989724.5569 +666 664 4.28408384323e-8 +667 664 -465133.879389 +668 664 1268546.94379 +669 664 -2.04890966415e-8 +703 664 -361895.781536 +704 664 786729.959862 +705 664 -588085.337671 +706 664 -150094.32553 +707 664 356091.902114 +708 664 41457.2556898 +709 664 -246970.319543 +710 664 673555.416935 +711 664 484442.198447 +665 665 14552393.0113 +666 665 -9.685754776e-8 +667 665 1268546.94379 +668 665 -3459673.48306 +669 665 5.21540641785e-8 +703 665 786729.959862 +704 665 -1710282.52144 +705 665 1278446.38624 +706 665 356091.902114 +707 665 -855385.258208 +708 665 17103.8438088 +709 665 673555.416935 +710 665 -1836969.31891 +711 665 -1321205.99576 +666 666 19697338.3132 +667 666 -2.60770320892e-8 +668 666 7.82310962677e-8 +669 666 1501024.18544 +703 666 -588085.337671 +704 666 1278446.38624 +705 666 -2616778.13471 +706 666 -41457.2556898 +707 666 -17103.8438089 +708 666 -7353984.06298 +709 666 484442.198447 +710 666 -1321205.99576 +711 666 -2564546.07772 +667 667 1768961.88645 +668 667 -5200497.8108 +669 667 3.72529029846e-8 +670 667 -354732.167298 +671 667 1144297.31386 +672 667 -8.38190317154e-9 +706 667 -246970.319543 +707 667 673555.416935 +708 667 -484442.198447 +709 667 -89281.9039061 +710 667 261158.775213 +711 667 27106.375452 +668 668 15396260.6937 +669 668 -1.11758708954e-7 +670 668 1144297.31386 +671 668 -3691281.65763 +672 668 2.98023223877e-8 +706 668 673555.416935 +707 668 -1836969.31891 +708 668 1321205.99576 +709 668 261158.775213 +710 668 -769227.571739 +711 668 9164.38855485 +669 669 19430253.1852 +670 669 -1.30385160446e-8 +671 669 4.09781932831e-8 +672 669 1397983.15475 +706 669 -484442.198447 +707 669 1321205.99576 +708 669 -2564546.07772 +709 669 -27106.375452 +710 669 -9164.38855489 +711 669 -7121142.78387 +670 670 2528206.97157 +671 670 -4472509.50178 +672 670 1.67638063431e-8 +673 670 161793.620953 +674 670 1643724.74446 +676 670 -268071.177508 +677 670 1017991.81332 +678 670 -1.02445483208e-8 +709 670 -183325.791023 +710 670 591373.519429 +711 670 -416676.259817 +671 671 16817023.1576 +672 671 -5.96046447754e-8 +673 671 -2239700.15498 +674 671 -161793.620953 +676 671 1017991.81332 +677 671 -3865791.69616 +678 671 3.72529029846e-8 +709 671 591373.519429 +710 671 -1907656.51429 +711 671 1344116.96715 +672 672 39001825.1235 +676 672 -1.49011611938e-8 +677 672 5.21540641785e-8 +678 672 1324183.34296 +709 672 -416676.259817 +710 672 1344116.96715 +711 672 -2538358.87127 +673 673 329626980.943 +674 673 -65098171.9808 +674 674 569419560.785 +675 675 790573.476703 +676 676 983097.517609 +677 676 -3993191.05725 +678 676 4.65661287308e-8 +677 677 16310675.5472 +678 677 -1.86264514923e-7 +678 678 19175351.0344 +679 679 1902223.18074 +680 679 5590205.99024 +681 679 -3.53902578354e-8 +682 679 -77037.3094959 +683 679 -210101.753171 +684 679 1.86264514923e-8 +898 679 -718178.246541 +899 679 -2108958.17516 +900 679 -27106.375452 +901 679 -300633.375282 +902 679 -819909.205315 +903 679 484442.198447 +680 680 16543837.5893 +681 680 -1.11758708954e-7 +682 680 -210101.753171 +683 680 -573004.781374 +684 680 4.842877388e-8 +898 680 -2108958.17516 +899 680 -6236511.30779 +900 680 9164.38855486 +901 680 -819909.205315 +902 680 -2236116.0145 +903 680 1321205.99576 +681 681 30501291.4656 +682 681 2.14204192162e-8 +683 681 5.96046447754e-8 +684 681 5508023.65257 +898 681 27106.375452 +899 681 -9164.38855489 +900 681 -19001911.4947 +901 681 484442.198447 +902 681 1321205.99576 +903 681 -5113778.6239 +682 682 2722764.08058 +683 682 6525095.96362 +684 682 -4.47034835815e-8 +685 682 -76937.634873 +686 682 -167255.727985 +687 682 2.421438694e-8 +898 682 -300633.375282 +899 682 -819909.205315 +900 682 -484442.198447 +901 682 -1057312.76972 +902 682 -2529098.59693 +903 682 -41457.2556898 +904 682 -451882.564601 +905 682 -982353.401306 +906 682 588085.337671 +683 683 15837837.4467 +684 683 -1.04308128357e-7 +685 683 -167255.727985 +686 683 -363599.408663 +687 683 5.21540641785e-8 +898 683 -819909.205315 +899 683 -2236116.0145 +900 683 -1321205.99576 +901 683 -2529098.59693 +902 683 -6126929.2712 +903 683 17103.8438088 +904 683 -982353.401306 +905 683 -2135550.8724 +906 683 1278446.38624 +684 684 31131706.3633 +685 684 3.53902578354e-8 +686 684 7.63684511185e-8 +687 684 5787467.22392 +898 684 -484442.198447 +899 684 -1321205.99576 +900 684 -5113778.6239 +901 684 41457.2556898 +902 684 -17103.8438089 +903 684 -19507359.9875 +904 684 588085.337671 +905 684 1278446.38624 +906 684 -5270750.35301 +685 685 4267595.81742 +686 685 7796294.34309 +687 685 -5.21540641785e-8 +688 685 -4790.05038338 +689 685 -7725.88771512 +690 685 2.04890966415e-8 +901 685 -451882.564601 +902 685 -982353.401306 +903 685 -588085.337671 +904 685 -1747893.8743 +905 685 -3178566.02079 +906 685 -61373.985991 +907 685 -749357.926948 +908 685 -1208641.81766 +909 685 741520.302649 +686 686 14559614.5621 +687 686 -9.685754776e-8 +688 686 -7725.88771512 +689 686 -12461.109218 +690 686 2.98023223877e-8 +901 686 -982353.401306 +902 686 -2135550.8724 +903 686 -1278446.38624 +904 686 -3178566.02079 +905 686 -5907985.37222 +906 686 32978.3592395 +907 686 -1208641.81766 +908 686 -1949422.28655 +909 686 1196000.48814 +687 687 32450763.4987 +688 687 1.11758708954e-8 +689 687 2.421438694e-8 +690 687 6373223.13441 +901 687 -588085.337671 +902 687 -1278446.38624 +903 687 -5270750.35301 +904 687 61373.985991 +905 687 -32978.3592395 +906 687 -20553554.1703 +907 687 741520.302649 +908 687 1196000.48814 +909 687 -5606492.51233 +688 688 6563466.92161 +689 688 8716568.29938 +690 688 -2.23517417908e-8 +691 688 -797223.130676 +692 688 -905935.375768 +693 688 1.86264514923e-8 +904 688 -749357.926948 +905 688 -1208641.81766 +906 688 -741520.302649 +907 688 -2303950.19297 +908 688 -3145795.04337 +909 688 -75251.5247453 +910 688 -1005897.92455 +911 688 -1143065.82336 +912 688 929649.114512 +689 689 11934357.6383 +690 689 -3.72529029846e-8 +691 689 -905935.375768 +692 689 -1029472.01792 +693 689 2.04890966415e-8 +904 689 -1208641.81766 +905 689 -1949422.28655 +906 689 -1196000.48814 +907 689 -3145795.04337 +908 689 -4425847.45616 +909 689 55832.4159336 +910 689 -1143065.82336 +911 689 -1298938.43563 +912 689 1056419.44831 +690 690 30008520.3637 +691 690 1.67638063431e-8 +692 690 2.04890966415e-8 +693 690 4063389.39899 +904 690 -741520.302649 +905 690 -1196000.48814 +906 690 -5606492.51233 +907 690 75251.5247453 +908 690 -55832.4159336 +909 690 -18547112.2702 +910 690 929649.114512 +911 690 1056419.44831 +912 690 -4341829.75862 +691 691 13789595.5493 +692 691 8526963.46189 +693 691 -2.23517417908e-8 +694 691 2189391.67462 +695 691 902841.927677 +696 691 3.72529029846e-9 +907 691 -1005897.92455 +908 691 -1143065.82336 +909 691 -929649.114512 +910 691 -6588902.98151 +911 691 -3583442.90451 +912 691 -148519.569575 +913 691 -3101441.97781 +914 691 -1278945.14549 +915 691 1300948.03845 +692 692 6744151.21474 +693 692 -2.23517417908e-8 +694 692 902841.927677 +695 692 372305.949557 +696 692 2.79396772385e-9 +907 692 -1143065.82336 +908 692 -1298938.43563 +909 692 -1056419.44831 +910 692 -3583442.90451 +911 692 -2462219.22114 +912 692 207978.412157 +913 692 -1278945.14549 +914 692 -527400.059996 +915 692 536473.417918 +693 693 37051709.8254 +695 693 -9.31322574615e-10 +696 693 10537577.5004 +907 693 -929649.114512 +908 693 -1056419.44831 +909 693 -4341829.75862 +910 693 148519.569575 +911 693 -207978.412157 +912 693 -23874563.7281 +913 693 1300948.03845 +914 693 536473.417918 +915 693 -8175265.11488 +694 694 19732335.5073 +695 694 -1.49011611938e-8 +696 694 -7.45058059692e-9 +697 694 2189391.67462 +698 694 -902841.927677 +699 694 3.72529029846e-9 +910 694 -3101441.97781 +911 694 -1278945.14549 +912 694 -1300948.03845 +913 694 -10784495.2388 +914 694 1.49011611938e-8 +916 694 -3101441.97781 +917 694 1278945.14549 +918 694 1300948.03845 +695 695 3355482.70929 +697 695 -902841.927677 +698 695 372305.949557 +699 695 -2.79396772385e-9 +910 695 -1278945.14549 +911 695 -527400.059996 +912 695 -536473.417918 +913 695 1.49011611938e-8 +914 695 -1833902.89956 +915 695 429178.734334 +916 695 1278945.14549 +917 695 -527400.059996 +918 695 -536473.417918 +696 696 47437791.9854 +698 696 9.31322574615e-10 +699 696 10537577.5004 +910 696 -1300948.03845 +911 696 -536473.417918 +912 696 -8175265.11488 +913 696 5.58793544769e-9 +914 696 -429178.734334 +915 696 -31919955.1469 +916 696 1300948.03845 +917 696 -536473.417918 +918 696 -8175265.11488 +697 697 13789595.5493 +698 697 -8526963.46189 +699 697 -7.45058059692e-9 +700 697 -797223.130676 +701 697 905935.375768 +702 697 -5.58793544769e-9 +913 697 -3101441.97781 +914 697 1278945.14549 +915 697 -1300948.03845 +916 697 -6588902.98151 +917 697 3583442.90451 +918 697 148519.569575 +919 697 -1005897.92455 +920 697 1143065.82336 +921 697 929649.114512 +698 698 6744151.21474 +699 698 -7.45058059692e-9 +700 698 905935.375768 +701 698 -1029472.01792 +702 698 7.45058059692e-9 +913 698 1278945.14549 +914 698 -527400.059996 +915 698 536473.417918 +916 698 3583442.90451 +917 698 -2462219.22114 +918 698 207978.412157 +919 698 1143065.82336 +920 698 -1298938.43563 +921 698 -1056419.44831 +699 699 37051709.8254 +700 699 -9.31322574615e-9 +701 699 7.45058059692e-9 +702 699 4063389.39899 +913 699 -1300948.03845 +914 699 536473.417918 +915 699 -8175265.11488 +916 699 -148519.569575 +917 699 -207978.412157 +918 699 -23874563.7281 +919 699 929649.114512 +920 699 -1056419.44831 +921 699 -4341829.75862 +700 700 6563466.92161 +701 700 -8716568.29938 +702 700 1.11758708954e-8 +703 700 -4790.05038338 +704 700 7725.88771513 +705 700 -1.49011611938e-8 +916 700 -1005897.92455 +917 700 1143065.82336 +918 700 -929649.114512 +919 700 -2303950.19297 +920 700 3145795.04337 +921 700 75251.5247453 +922 700 -749357.926948 +923 700 1208641.81766 +924 700 741520.302649 +701 701 11934357.6383 +702 701 -1.49011611938e-8 +703 701 7725.88771514 +704 701 -12461.109218 +705 701 2.60770320892e-8 +916 701 1143065.82336 +917 701 -1298938.43563 +918 701 1056419.44831 +919 701 3145795.04337 +920 701 -4425847.45616 +921 701 55832.4159336 +922 701 1208641.81766 +923 701 -1949422.28655 +924 701 -1196000.48814 +702 702 30008520.3637 +703 702 -1.67638063431e-8 +704 702 2.421438694e-8 +705 702 6373223.13441 +916 702 -929649.114512 +917 702 1056419.44831 +918 702 -4341829.75862 +919 702 -75251.5247453 +920 702 -55832.4159336 +921 702 -18547112.2702 +922 702 741520.302649 +923 702 -1196000.48814 +924 702 -5606492.51233 +703 703 4267595.81742 +704 703 -7796294.34309 +705 703 3.72529029846e-8 +706 703 -76937.634873 +707 703 167255.727985 +708 703 -2.14204192162e-8 +919 703 -749357.926948 +920 703 1208641.81766 +921 703 -741520.302649 +922 703 -1747893.8743 +923 703 3178566.02079 +924 703 61373.985991 +925 703 -451882.564601 +926 703 982353.401306 +927 703 588085.337671 +704 704 14559614.5621 +705 704 -7.45058059692e-8 +706 704 167255.727985 +707 704 -363599.408663 +708 704 4.65661287308e-8 +919 704 1208641.81766 +920 704 -1949422.28655 +921 704 1196000.48814 +922 704 3178566.02079 +923 704 -5907985.37222 +924 704 32978.3592395 +925 704 982353.401306 +926 704 -2135550.8724 +927 704 -1278446.38624 +705 705 32450763.4987 +706 705 -1.58324837685e-8 +707 705 3.53902578354e-8 +708 705 5787467.22392 +919 705 -741520.302649 +920 705 1196000.48814 +921 705 -5606492.51233 +922 705 -61373.985991 +923 705 -32978.3592395 +924 705 -20553554.1703 +925 705 588085.337671 +926 705 -1278446.38624 +927 705 -5270750.35301 +706 706 2722764.08058 +707 706 -6525095.96362 +708 706 4.09781932831e-8 +709 706 -77037.3094959 +710 706 210101.753171 +711 706 -2.51457095146e-8 +922 706 -451882.564601 +923 706 982353.401306 +924 706 -588085.337671 +925 706 -1057312.76972 +926 706 2529098.59693 +927 706 41457.2556898 +928 706 -300633.375282 +929 706 819909.205315 +930 706 484442.198447 +707 707 15837837.4467 +708 707 -1.04308128357e-7 +709 707 210101.753171 +710 707 -573004.781374 +711 707 7.45058059692e-8 +922 707 982353.401306 +923 707 -2135550.8724 +924 707 1278446.38624 +925 707 2529098.59693 +926 707 -6126929.2712 +927 707 17103.8438089 +928 707 819909.205315 +929 707 -2236116.0145 +930 707 -1321205.99576 +708 708 31131706.3633 +709 708 -2.23517417908e-8 +710 708 5.96046447754e-8 +711 708 5508023.65257 +922 708 -588085.337671 +923 708 1278446.38624 +924 708 -5270750.35301 +925 708 -41457.2556898 +926 708 -17103.8438089 +927 708 -19507359.9875 +928 708 484442.198447 +929 708 -1321205.99576 +930 708 -5113778.6239 +709 709 1902223.18074 +710 709 -5590205.99024 +711 709 2.421438694e-8 +925 709 -300633.375282 +926 709 819909.205315 +927 709 -484442.198447 +928 709 -718178.246541 +929 709 2108958.17516 +930 709 27106.375452 +710 710 16543837.5893 +711 710 -7.45058059692e-8 +925 710 819909.205315 +926 710 -2236116.0145 +927 710 1321205.99576 +928 710 2108958.17516 +929 710 -6236511.30779 +930 710 9164.38855486 +711 711 30501291.4656 +925 711 -484442.198447 +926 711 1321205.99576 +927 711 -5113778.6239 +928 711 -27106.375452 +929 711 -9164.38855491 +930 711 -19001911.4947 +712 712 1011851.60912 +713 712 4110093.43272 +714 712 -4.842877388e-8 +715 712 -311975.890718 +716 712 -1184718.57235 +717 712 1.02445483208e-8 +763 712 22134.9913963 +764 712 90320.994053 +765 712 -18909.0650259 +766 712 -144050.092155 +767 712 -547025.666412 +768 712 358351.461509 +1354 712 22134.9913963 +1355 712 90320.994053 +1356 712 18909.0650259 +1357 712 -144050.092155 +1358 712 -547025.666412 +1359 712 -358351.461509 +713 713 16788621.6609 +714 713 -2.08616256714e-7 +715 713 -1184718.57235 +716 713 -4498931.28739 +717 713 3.35276126862e-8 +763 713 90320.994053 +764 713 370626.696215 +765 713 4631.25243448 +766 713 -547025.666412 +767 713 -2077312.65726 +768 713 1360828.33484 +1354 713 90320.994053 +1355 713 370626.696215 +1356 713 -4631.25243456 +1357 713 -547025.666412 +1358 713 -2077312.65726 +1359 713 -1360828.33484 +714 714 18240145.4814 +715 714 1.11758708954e-8 +716 714 3.72529029846e-8 +717 714 758227.34113 +763 714 18909.0650259 +764 714 -4631.25243456 +765 714 -5293544.01962 +766 714 358351.461509 +767 714 1360828.33484 +768 714 -2284273.33935 +1354 714 -18909.0650259 +1355 714 4631.25243448 +1356 714 -5293544.01962 +1357 714 -358351.461509 +1358 714 -1360828.33484 +1359 714 -2284273.33935 +715 715 2350262.38096 +716 715 4600302.12491 +717 715 -2.60770320892e-8 +718 715 2.98023223877e-8 +719 715 -1.19209289551e-7 +721 715 -413671.243673 +722 715 -1334423.36669 +723 715 1.58324837685e-8 +763 715 -144050.092155 +764 715 -547025.666412 +765 715 -358351.461509 +766 715 -474420.971735 +767 715 131724.797328 +768 715 -23329.9193232 +769 715 800256.904552 +770 715 8988441.97885 +772 715 -193836.559394 +773 715 -625279.223852 +774 715 416676.259817 +1354 715 -144050.092155 +1355 715 -547025.666412 +1356 715 358351.461509 +1357 715 -474420.971735 +1358 715 131724.797328 +1359 715 23329.9193232 +1360 715 -800256.904552 +1361 715 -8988441.97885 +1363 715 -193836.559394 +1364 715 -625279.223852 +1365 715 -416676.259817 +716 716 17048556.8253 +717 716 -8.94069671631e-8 +718 716 5.96046447754e-8 +721 716 -1334423.36669 +722 716 -4304591.50545 +723 716 4.842877388e-8 +763 716 -547025.666412 +764 716 -2077312.65726 +765 716 -1360828.33484 +766 716 131724.797328 +767 716 -28174.604603 +768 716 6684.54707694 +769 716 -6040684.68178 +770 716 -800256.904552 +772 716 -625279.223852 +773 716 -2017029.75436 +774 716 1344116.96715 +1354 716 -547025.666412 +1355 716 -2077312.65726 +1356 716 1360828.33484 +1357 716 131724.797328 +1358 716 -28174.604603 +1359 716 -6684.54707697 +1360 716 6040684.68178 +1361 716 800256.904552 +1363 716 -625279.223852 +1364 716 -2017029.75436 +1365 716 -1344116.96715 +717 717 36176122.0894 +721 717 1.39698386192e-8 +722 717 4.09781932831e-8 +723 717 830431.306934 +763 717 -358351.461509 +764 717 -1360828.33484 +765 717 -2284273.33935 +766 717 23329.9193232 +767 717 -6684.54707697 +768 717 -14301137.6219 +772 717 416676.259817 +773 717 1344116.96715 +774 717 -2296979.40748 +1354 717 358351.461509 +1355 717 1360828.33484 +1356 717 -2284273.33935 +1357 717 -23329.9193232 +1358 717 6684.54707694 +1359 717 -14301137.6219 +1363 717 -416676.259817 +1364 717 -1344116.96715 +1365 717 -2296979.40748 +718 718 305878308.174 +719 718 66094123.115 +766 718 -800256.904552 +767 718 6040684.68178 +769 718 64525494.457 +770 718 -4237812.99363 +1357 718 800256.904552 +1358 718 -6040684.68178 +1360 718 64525494.457 +1361 718 -4237812.99363 +719 719 549336918.275 +766 719 -8988441.97885 +767 719 800256.904552 +769 719 -4237812.99363 +770 719 48915452.1011 +1357 719 8988441.97885 +1358 719 -800256.904552 +1360 719 -4237812.99363 +1361 719 48915452.1011 +720 720 715555.555556 +771 720 -357777.777778 +1362 720 -357777.777778 +721 721 1816739.3315 +722 721 5341279.87864 +723 721 -3.53902578354e-8 +724 721 -544032.43723 +725 721 -1483724.82881 +726 721 2.04890966415e-8 +766 721 -193836.559394 +767 721 -625279.223852 +768 721 -416676.259817 +772 721 24667.0078013 +773 721 73754.1287476 +774 721 -27106.375452 +775 721 -260348.273704 +776 721 -710040.746465 +777 721 484442.198447 +1357 721 -193836.559394 +1358 721 -625279.223852 +1359 721 416676.259817 +1363 721 24667.0078013 +1364 721 73754.1287476 +1365 721 27106.375452 +1366 721 -260348.273704 +1367 721 -710040.746465 +1368 721 -484442.198447 +722 722 15814018.062 +723 722 -1.11758708954e-7 +724 722 -1483724.82881 +725 722 -4046522.26039 +726 722 5.58793544769e-8 +766 722 -625279.223852 +767 722 -2017029.75436 +768 722 -1344116.96715 +772 722 73754.1287476 +773 722 222052.369366 +774 722 9164.38855485 +775 722 -710040.746465 +776 722 -1936474.76309 +777 722 1321205.99576 +1357 722 -625279.223852 +1358 722 -2017029.75436 +1359 722 1344116.96715 +1363 722 73754.1287476 +1364 722 222052.369366 +1365 722 -9164.3885549 +1366 722 -710040.746465 +1367 722 -1936474.76309 +1368 722 -1321205.99576 +723 723 18448886.5844 +724 723 2.04890966415e-8 +725 723 5.58793544769e-8 +726 723 931107.693646 +766 723 -416676.259817 +767 723 -1344116.96715 +768 723 -2296979.40748 +772 723 27106.375452 +773 723 -9164.3885549 +774 723 -5492991.14412 +775 723 484442.198447 +776 723 1321205.99576 +777 723 -2315242.24089 +1357 723 416676.259817 +1358 723 1344116.96715 +1359 723 -2296979.40748 +1363 723 -27106.375452 +1364 723 9164.38855485 +1365 723 -5492991.14412 +1366 723 -484442.198447 +1367 723 -1321205.99576 +1368 723 -2315242.24089 +724 724 2558539.62181 +725 724 6138307.60949 +726 724 -5.58793544769e-8 +727 724 -759692.612592 +728 724 -1651505.67955 +729 724 2.98023223877e-8 +772 724 -260348.273704 +773 724 -710040.746465 +774 724 -484442.198447 +775 724 12227.6197724 +776 724 33038.3525624 +777 724 -41457.2556898 +778 724 -379286.632065 +779 724 -824536.156663 +780 724 588085.337671 +1363 724 -260348.273704 +1364 724 -710040.746465 +1365 724 484442.198447 +1366 724 12227.6197724 +1367 724 33038.3525624 +1368 724 41457.2556898 +1369 724 -379286.632065 +1370 724 -824536.156663 +1371 724 -588085.337671 +725 725 14915778.6682 +726 725 -1.34110450745e-7 +727 725 -1651505.67955 +728 725 -3590229.73815 +729 725 6.33299350738e-8 +772 725 -710040.746465 +773 725 -1936474.76309 +774 725 -1321205.99576 +775 725 33038.3525624 +776 725 89431.3340664 +777 725 17103.8438088 +778 725 -824536.156663 +779 725 -1792469.90579 +780 725 1278446.38624 +1363 725 -710040.746465 +1364 725 -1936474.76309 +1365 725 1321205.99576 +1366 725 33038.3525624 +1367 725 89431.3340664 +1368 725 -17103.8438089 +1369 725 -824536.156663 +1370 725 -1792469.90579 +1371 725 -1278446.38624 +726 726 18669379.7869 +727 726 2.70083546639e-8 +728 726 5.77419996262e-8 +729 726 1124555.53479 +772 726 -484442.198447 +773 726 -1321205.99576 +774 726 -2315242.24089 +775 726 41457.2556898 +776 726 -17103.8438089 +777 726 -5695176.55864 +778 726 588085.337671 +779 726 1278446.38624 +780 726 -2352102.70813 +1363 726 484442.198447 +1364 726 1321205.99576 +1365 726 -2315242.24089 +1366 726 -41457.2556898 +1367 726 17103.8438088 +1368 726 -5695176.55864 +1369 726 -588085.337671 +1370 726 -1278446.38624 +1371 726 -2352102.70813 +727 727 3880798.16119 +728 727 7110485.96967 +729 727 -4.47034835815e-8 +730 727 -1076372.38828 +731 727 -1736084.49722 +732 727 2.421438694e-8 +775 727 -379286.632065 +776 727 -824536.156663 +777 727 -588085.337671 +778 727 -52167.0393845 +779 727 -83826.4031561 +780 727 -61373.985991 +781 727 -590912.90871 +782 727 -953085.336629 +783 727 741520.302649 +1366 727 -379286.632065 +1367 727 -824536.156663 +1368 727 588085.337671 +1369 727 -52167.0393845 +1370 727 -83826.4031561 +1371 727 61373.985991 +1372 727 -590912.90871 +1373 727 -953085.336629 +1374 727 -741520.302649 +728 728 13318817.2723 +729 728 -8.94069671631e-8 +730 728 -1736084.49722 +731 728 -2800136.28584 +732 728 3.91155481339e-8 +775 728 -824536.156663 +776 728 -1792469.90579 +777 728 -1278446.38624 +778 728 -83826.4031561 +779 728 -134521.304432 +780 728 32978.3592395 +781 728 -953085.336629 +782 728 -1537234.41392 +783 728 1196000.48814 +1366 728 -824536.156663 +1367 728 -1792469.90579 +1368 728 1278446.38624 +1369 728 -83826.4031561 +1370 728 -134521.304432 +1371 728 -32978.3592395 +1372 728 -953085.336629 +1373 728 -1537234.41392 +1374 728 -1196000.48814 +729 729 19146980.3477 +730 729 2.23517417908e-8 +731 729 3.53902578354e-8 +732 729 1520483.39551 +775 729 -588085.337671 +776 729 -1278446.38624 +777 729 -2352102.70813 +778 729 61373.985991 +779 729 -32978.3592395 +780 729 -6109264.54972 +781 729 741520.302649 +782 729 1196000.48814 +783 729 -2434642.38116 +1366 729 588085.337671 +1367 729 1278446.38624 +1368 729 -2352102.70813 +1369 729 -61373.985991 +1370 729 32978.3592395 +1371 729 -6109264.54972 +1372 729 -741520.302649 +1373 729 -1196000.48814 +1374 729 -2434642.38116 +730 730 6516876.42304 +731 730 8531914.96891 +732 730 -2.23517417908e-8 +733 730 -2626121.17726 +734 730 -2984228.61052 +735 730 1.30385160446e-8 +778 730 -590912.90871 +779 730 -953085.336629 +780 730 -741520.302649 +781 730 222027.67781 +782 730 227177.812693 +783 730 -75251.5247453 +784 730 -1038306.19785 +785 730 -1179893.40665 +786 730 929649.114512 +1369 730 -590912.90871 +1370 730 -953085.336629 +1371 730 741520.302649 +1372 730 222027.67781 +1373 730 227177.812693 +1374 730 75251.5247453 +1375 730 -1038306.19785 +1376 730 -1179893.40665 +1377 730 -929649.114512 +731 731 11512089.4984 +732 731 -2.98023223877e-8 +733 731 -2984228.61052 +734 731 -3391168.87559 +735 731 1.30385160446e-8 +778 731 -953085.336629 +779 731 -1537234.41392 +780 731 -1196000.48814 +781 731 227177.812693 +782 731 217630.207531 +783 731 55832.4159336 +784 731 -1179893.40665 +785 731 -1340787.9621 +786 731 1056419.44831 +1369 731 -953085.336629 +1370 731 -1537234.41392 +1371 731 1196000.48814 +1372 731 227177.812693 +1373 731 217630.207531 +1374 731 -55832.4159336 +1375 731 -1179893.40665 +1376 731 -1340787.9621 +1377 731 -1056419.44831 +732 732 18361731.7736 +733 732 3.72529029846e-9 +734 732 5.58793544769e-9 +735 732 -125380.553907 +778 732 -741520.302649 +779 732 -1196000.48814 +780 732 -2434642.38116 +781 732 75251.5247453 +782 732 -55832.4159336 +783 732 -5287984.36193 +784 732 929649.114512 +785 732 1056419.44831 +786 732 -2155790.5645 +1369 732 741520.302649 +1370 732 1196000.48814 +1371 732 -2434642.38116 +1372 732 -75251.5247453 +1373 732 55832.4159336 +1374 732 -5287984.36193 +1375 732 -929649.114512 +1376 732 -1056419.44831 +1377 732 -2155790.5645 +733 733 11197028.9194 +734 733 7624235.1212 +735 733 -7.45058059692e-9 +736 733 -1154846.00933 +737 733 -476225.158488 +738 733 1.86264514923e-9 +781 733 -1038306.19785 +782 733 -1179893.40665 +783 733 -929649.114512 +784 733 -908773.635179 +785 733 -175831.894858 +786 733 -148519.569575 +787 733 -1760951.03338 +788 733 -726165.37459 +789 733 1300948.03845 +1372 733 -1038306.19785 +1373 733 -1179893.40665 +1374 733 929649.114512 +1375 733 -908773.635179 +1376 733 -175831.894858 +1377 733 148519.569575 +1378 733 -1760951.03338 +1379 733 -726165.37459 +1380 733 -1300948.03845 +734 734 6560950.4012 +735 734 -3.72529029846e-9 +736 734 -476225.158488 +737 734 -196381.508655 +738 734 9.31322574615e-10 +781 734 -1179893.40665 +782 734 -1340787.9621 +783 734 -1056419.44831 +784 734 -175831.894858 +785 734 153537.59263 +786 734 207978.412157 +787 734 -726165.37459 +788 734 -299449.639006 +789 734 536473.417918 +1372 734 -1179893.40665 +1373 734 -1340787.9621 +1374 734 1056419.44831 +1375 734 -175831.894858 +1376 734 153537.59263 +1377 734 -207978.412157 +1378 734 -726165.37459 +1379 734 -299449.639006 +1380 734 -536473.417918 +735 735 21281133.3311 +738 735 4075797.18655 +781 735 -929649.114512 +782 735 -1056419.44831 +783 735 -2155790.5645 +784 735 148519.569575 +785 735 -207978.412157 +786 735 -7295491.64648 +787 735 1300948.03845 +788 735 536473.417918 +789 735 -3164492.7709 +1372 735 929649.114512 +1373 735 1056419.44831 +1374 735 -2155790.5645 +1375 735 -148519.569575 +1376 735 207978.412157 +1377 735 -7295491.64648 +1378 735 -1300948.03845 +1379 735 -536473.417918 +1380 735 -3164492.7709 +736 736 14087608.2601 +737 736 -1.49011611938e-8 +738 736 -7.45058059692e-9 +739 736 -1154846.00933 +740 736 476225.158488 +741 736 1.86264514923e-9 +784 736 -1760951.03338 +785 736 -726165.37459 +786 736 -1300948.03845 +787 736 -2367056.05396 +788 736 1.11758708954e-8 +789 736 1.86264514923e-9 +790 736 -1760951.03338 +791 736 726165.37459 +792 736 1300948.03845 +1375 736 -1760951.03338 +1376 736 -726165.37459 +1377 736 1300948.03845 +1378 736 -2367056.05396 +1379 736 9.31322574615e-9 +1381 736 -1760951.03338 +1382 736 726165.37459 +1383 736 -1300948.03845 +737 737 2395597.11087 +738 737 3.72529029846e-9 +739 737 476225.158488 +740 737 -196381.508655 +741 737 -9.31322574615e-10 +784 737 -726165.37459 +785 737 -299449.639006 +786 737 -536473.417918 +787 737 9.31322574615e-9 +788 737 -402517.768767 +789 737 429178.734334 +790 737 726165.37459 +791 737 -299449.639006 +792 737 -536473.417918 +1375 737 -726165.37459 +1376 737 -299449.639006 +1377 737 536473.417918 +1378 737 1.11758708954e-8 +1379 737 -402517.768767 +1380 737 -429178.734334 +1381 737 726165.37459 +1382 737 -299449.639006 +1383 737 536473.417918 +738 738 25315942.1547 +741 738 4075797.18655 +784 738 -1300948.03845 +785 738 -536473.417918 +786 738 -3164492.7709 +788 738 -429178.734334 +789 738 -10404782.7221 +790 738 1300948.03845 +791 738 -536473.417918 +792 738 -3164492.7709 +1375 738 1300948.03845 +1376 738 536473.417918 +1377 738 -3164492.7709 +1378 738 1.86264514923e-9 +1379 738 429178.734334 +1380 738 -10404782.7221 +1381 738 -1300948.03845 +1382 738 536473.417918 +1383 738 -3164492.7709 +739 739 11197028.9194 +740 739 -7624235.1212 +741 739 7.45058059692e-9 +742 739 -2626121.17726 +743 739 2984228.61052 +744 739 -5.58793544769e-9 +787 739 -1760951.03338 +788 739 726165.37459 +789 739 -1300948.03845 +790 739 -908773.635179 +791 739 175831.894858 +792 739 148519.569575 +793 739 -1038306.19785 +794 739 1179893.40665 +795 739 929649.114512 +1378 739 -1760951.03338 +1379 739 726165.37459 +1380 739 1300948.03845 +1381 739 -908773.635179 +1382 739 175831.894858 +1383 739 -148519.569575 +1384 739 -1038306.19785 +1385 739 1179893.40665 +1386 739 -929649.114512 +740 740 6560950.4012 +741 740 -7.45058059692e-9 +742 740 2984228.61052 +743 740 -3391168.87559 +744 740 5.58793544769e-9 +787 740 726165.37459 +788 740 -299449.639006 +789 740 536473.417918 +790 740 175831.894858 +791 740 153537.59263 +792 740 207978.412157 +793 740 1179893.40665 +794 740 -1340787.9621 +795 740 -1056419.44831 +1378 740 726165.37459 +1379 740 -299449.639006 +1380 740 -536473.417918 +1381 740 175831.894858 +1382 740 153537.59263 +1383 740 -207978.412157 +1384 740 1179893.40665 +1385 740 -1340787.9621 +1386 740 1056419.44831 +741 741 21281133.3311 +742 741 -1.11758708954e-8 +743 741 1.11758708954e-8 +744 741 -125380.553907 +787 741 -1300948.03845 +788 741 536473.417918 +789 741 -3164492.7709 +790 741 -148519.569575 +791 741 -207978.412157 +792 741 -7295491.64648 +793 741 929649.114512 +794 741 -1056419.44831 +795 741 -2155790.5645 +1378 741 1300948.03845 +1379 741 -536473.417918 +1380 741 -3164492.7709 +1381 741 148519.569575 +1382 741 207978.412157 +1383 741 -7295491.64648 +1384 741 -929649.114512 +1385 741 1056419.44831 +1386 741 -2155790.5645 +742 742 6516876.42304 +743 742 -8531914.96891 +744 742 2.98023223877e-8 +745 742 -1076372.38828 +746 742 1736084.49722 +747 742 -1.67638063431e-8 +790 742 -1038306.19785 +791 742 1179893.40665 +792 742 -929649.114512 +793 742 222027.67781 +794 742 -227177.812693 +795 742 75251.5247453 +796 742 -590912.90871 +797 742 953085.336629 +798 742 741520.302649 +1381 742 -1038306.19785 +1382 742 1179893.40665 +1383 742 929649.114512 +1384 742 222027.67781 +1385 742 -227177.812693 +1386 742 -75251.5247453 +1387 742 -590912.90871 +1388 742 953085.336629 +1389 742 -741520.302649 +743 743 11512089.4984 +744 743 -3.72529029846e-8 +745 743 1736084.49722 +746 743 -2800136.28584 +747 743 2.60770320892e-8 +790 743 1179893.40665 +791 743 -1340787.9621 +792 743 1056419.44831 +793 743 -227177.812693 +794 743 217630.207531 +795 743 55832.4159336 +796 743 953085.336629 +797 743 -1537234.41392 +798 743 -1196000.48814 +1381 743 1179893.40665 +1382 743 -1340787.9621 +1383 743 -1056419.44831 +1384 743 -227177.812693 +1385 743 217630.207531 +1386 743 -55832.4159336 +1387 743 953085.336629 +1388 743 -1537234.41392 +1389 743 1196000.48814 +744 744 18361731.7736 +745 744 -2.04890966415e-8 +746 744 3.35276126862e-8 +747 744 1520483.39551 +790 744 -929649.114512 +791 744 1056419.44831 +792 744 -2155790.5645 +793 744 -75251.5247453 +794 744 -55832.4159336 +795 744 -5287984.36193 +796 744 741520.302649 +797 744 -1196000.48814 +798 744 -2434642.38116 +1381 744 929649.114512 +1382 744 -1056419.44831 +1383 744 -2155790.5645 +1384 744 75251.5247453 +1385 744 55832.4159336 +1386 744 -5287984.36193 +1387 744 -741520.302649 +1388 744 1196000.48814 +1389 744 -2434642.38116 +745 745 3880798.16119 +746 745 -7110485.96967 +747 745 3.72529029846e-8 +748 745 -759692.612592 +749 745 1651505.67955 +750 745 -1.86264514923e-8 +793 745 -590912.90871 +794 745 953085.336629 +795 745 -741520.302649 +796 745 -52167.0393845 +797 745 83826.4031561 +798 745 61373.985991 +799 745 -379286.632065 +800 745 824536.156663 +801 745 588085.337671 +1384 745 -590912.90871 +1385 745 953085.336629 +1386 745 741520.302649 +1387 745 -52167.0393845 +1388 745 83826.4031561 +1389 745 -61373.985991 +1390 745 -379286.632065 +1391 745 824536.156663 +1392 745 -588085.337671 +746 746 13318817.2723 +747 746 -6.70552253723e-8 +748 746 1651505.67955 +749 746 -3590229.73815 +750 746 4.09781932831e-8 +793 746 953085.336629 +794 746 -1537234.41392 +795 746 1196000.48814 +796 746 83826.4031561 +797 746 -134521.304432 +798 746 32978.3592395 +799 746 824536.156663 +800 746 -1792469.90579 +801 746 -1278446.38624 +1384 746 953085.336629 +1385 746 -1537234.41392 +1386 746 -1196000.48814 +1387 746 83826.4031561 +1388 746 -134521.304432 +1389 746 -32978.3592395 +1390 746 824536.156663 +1391 746 -1792469.90579 +1392 746 1278446.38624 +747 747 19146980.3477 +748 747 -2.51457095146e-8 +749 747 5.40167093277e-8 +750 747 1124555.53479 +793 747 -741520.302649 +794 747 1196000.48814 +795 747 -2434642.38116 +796 747 -61373.985991 +797 747 -32978.3592395 +798 747 -6109264.54972 +799 747 588085.337671 +800 747 -1278446.38624 +801 747 -2352102.70813 +1384 747 741520.302649 +1385 747 -1196000.48814 +1386 747 -2434642.38116 +1387 747 61373.985991 +1388 747 32978.3592395 +1389 747 -6109264.54972 +1390 747 -588085.337671 +1391 747 1278446.38624 +1392 747 -2352102.70813 +748 748 2558539.62181 +749 748 -6138307.60949 +750 748 4.28408384323e-8 +751 748 -544032.43723 +752 748 1483724.82881 +753 748 -2.51457095146e-8 +796 748 -379286.632065 +797 748 824536.156663 +798 748 -588085.337671 +799 748 12227.6197724 +800 748 -33038.3525624 +801 748 41457.2556898 +802 748 -260348.273704 +803 748 710040.746465 +804 748 484442.198447 +1387 748 -379286.632065 +1388 748 824536.156663 +1389 748 588085.337671 +1390 748 12227.6197724 +1391 748 -33038.3525624 +1392 748 -41457.2556898 +1393 748 -260348.273704 +1394 748 710040.746465 +1395 748 -484442.198447 +749 749 14915778.6682 +750 749 -1.19209289551e-7 +751 749 1483724.82881 +752 749 -4046522.26039 +753 749 7.07805156708e-8 +796 749 824536.156663 +797 749 -1792469.90579 +798 749 1278446.38624 +799 749 -33038.3525624 +800 749 89431.3340665 +801 749 17103.8438088 +802 749 710040.746465 +803 749 -1936474.76309 +804 749 -1321205.99576 +1387 749 824536.156663 +1388 749 -1792469.90579 +1389 749 -1278446.38624 +1390 749 -33038.3525624 +1391 749 89431.3340665 +1392 749 -17103.8438089 +1393 749 710040.746465 +1394 749 -1936474.76309 +1395 749 1321205.99576 +750 750 18669379.7869 +751 750 -2.79396772385e-8 +752 750 7.82310962677e-8 +753 750 931107.693646 +796 750 -588085.337671 +797 750 1278446.38624 +798 750 -2352102.70813 +799 750 -41457.2556898 +800 750 -17103.8438089 +801 750 -5695176.55864 +802 750 484442.198447 +803 750 -1321205.99576 +804 750 -2315242.24089 +1387 750 588085.337671 +1388 750 -1278446.38624 +1389 750 -2352102.70813 +1390 750 41457.2556898 +1391 750 17103.8438088 +1392 750 -5695176.55864 +1393 750 -484442.198447 +1394 750 1321205.99576 +1395 750 -2315242.24089 +751 751 1816739.3315 +752 751 -5341279.87864 +753 751 3.72529029846e-8 +754 751 -413671.243673 +755 751 1334423.36669 +756 751 -8.38190317154e-9 +799 751 -260348.273704 +800 751 710040.746465 +801 751 -484442.198447 +802 751 24667.0078013 +803 751 -73754.1287476 +804 751 27106.375452 +805 751 -193836.559394 +806 751 625279.223852 +807 751 416676.259817 +1390 751 -260348.273704 +1391 751 710040.746465 +1392 751 484442.198447 +1393 751 24667.0078013 +1394 751 -73754.1287476 +1395 751 -27106.375452 +1396 751 -193836.559394 +1397 751 625279.223852 +1398 751 -416676.259817 +752 752 15814018.062 +753 752 -1.11758708954e-7 +754 752 1334423.36669 +755 752 -4304591.50545 +756 752 2.98023223877e-8 +799 752 710040.746465 +800 752 -1936474.76309 +801 752 1321205.99576 +802 752 -73754.1287476 +803 752 222052.369366 +804 752 9164.38855486 +805 752 625279.223852 +806 752 -2017029.75436 +807 752 -1344116.96715 +1390 752 710040.746465 +1391 752 -1936474.76309 +1392 752 -1321205.99576 +1393 752 -73754.1287476 +1394 752 222052.369366 +1395 752 -9164.38855491 +1396 752 625279.223852 +1397 752 -2017029.75436 +1398 752 1344116.96715 +753 753 18448886.5844 +754 753 -1.11758708954e-8 +755 753 3.72529029846e-8 +756 753 830431.306934 +799 753 -484442.198447 +800 753 1321205.99576 +801 753 -2315242.24089 +802 753 -27106.375452 +803 753 -9164.38855491 +804 753 -5492991.14412 +805 753 416676.259817 +806 753 -1344116.96715 +807 753 -2296979.40748 +1390 753 484442.198447 +1391 753 -1321205.99576 +1392 753 -2315242.24089 +1393 753 27106.375452 +1394 753 9164.38855486 +1395 753 -5492991.14412 +1396 753 -416676.259817 +1397 753 1344116.96715 +1398 753 -2296979.40748 +754 754 2350262.78049 +755 754 -4600302.86075 +756 754 2.04890966415e-8 +757 754 -7.45058059692e-9 +760 754 -311975.890718 +761 754 1184718.57235 +762 754 -1.02445483208e-8 +802 754 -193836.559394 +803 754 625279.223852 +804 754 -416676.259817 +805 754 -474421.1715 +806 754 -131724.429407 +807 754 23329.9193232 +808 754 -800250.281991 +809 754 8988445.57462 +811 754 -144050.092155 +812 754 547025.666412 +813 754 358351.461509 +1393 754 -193836.559394 +1394 754 625279.223852 +1395 754 416676.259817 +1396 754 -474421.1715 +1397 754 -131724.429407 +1398 754 -23329.9193232 +1399 754 800250.281991 +1400 754 -8988445.57462 +1402 754 -144050.092155 +1403 754 547025.666412 +1404 754 -358351.461509 +755 755 17048556.4258 +756 755 -7.45058059692e-8 +757 755 5.96046447754e-8 +758 755 7.45058059692e-9 +760 755 1184718.57235 +761 755 -4498931.28739 +762 755 3.35276126862e-8 +802 755 625279.223852 +803 755 -2017029.75436 +804 755 1344116.96715 +805 755 -131724.429407 +806 755 -28174.4048381 +807 755 6684.54707694 +808 755 -6040681.08601 +809 755 800250.281991 +811 755 547025.666412 +812 755 -2077312.65726 +813 755 -1360828.33484 +1393 755 625279.223852 +1394 755 -2017029.75436 +1395 755 -1344116.96715 +1396 755 -131724.429407 +1397 755 -28174.4048381 +1398 755 -6684.54707698 +1399 755 6040681.08601 +1400 755 -800250.281991 +1402 755 547025.666412 +1403 755 -2077312.65726 +1404 755 1360828.33484 +756 756 36176122.0894 +760 756 -1.30385160446e-8 +761 756 4.47034835815e-8 +762 756 758227.341129 +802 756 -416676.259817 +803 756 1344116.96715 +804 756 -2296979.40748 +805 756 -23329.9193232 +806 756 -6684.54707698 +807 756 -14301137.6219 +811 756 358351.461509 +812 756 -1360828.33484 +813 756 -2284273.33935 +1393 756 416676.259817 +1394 756 -1344116.96715 +1395 756 -2296979.40748 +1396 756 23329.9193232 +1397 756 6684.54707694 +1398 756 -14301137.6219 +1402 756 -358351.461509 +1403 756 1360828.33484 +1404 756 -2284273.33935 +757 757 305878011.196 +758 757 -66093576.1502 +805 757 800250.281991 +806 757 6040681.08601 +808 757 64525513.4986 +809 757 4237777.92342 +1396 757 -800250.281991 +1397 757 -6040681.08601 +1399 757 64525513.4986 +1400 757 4237777.92342 +758 758 549337215.254 +805 758 -8988445.57462 +806 758 -800250.281991 +808 758 4237777.92342 +809 758 48915433.0595 +1396 758 8988445.57462 +1397 758 800250.281991 +1399 758 4237777.92342 +1400 758 48915433.0595 +759 759 715555.555556 +810 759 -357777.777778 +1401 759 -357777.777778 +760 760 1011851.60912 +761 760 -4110093.43272 +762 760 6.14672899246e-8 +805 760 -144050.092155 +806 760 547025.666412 +807 760 -358351.461509 +811 760 22134.9913963 +812 760 -90320.994053 +813 760 18909.0650259 +1396 760 -144050.092155 +1397 760 547025.666412 +1398 760 358351.461509 +1402 760 22134.9913963 +1403 760 -90320.994053 +1404 760 -18909.0650259 +761 761 16788621.6609 +762 761 -2.53319740295e-7 +805 761 547025.666412 +806 761 -2077312.65726 +807 761 1360828.33484 +811 761 -90320.994053 +812 761 370626.696215 +813 761 4631.25243446 +1396 761 547025.666412 +1397 761 -2077312.65726 +1398 761 -1360828.33484 +1402 761 -90320.994053 +1403 761 370626.696215 +1404 761 -4631.25243458 +762 762 18240145.4814 +805 762 -358351.461509 +806 762 1360828.33484 +807 762 -2284273.33935 +811 762 -18909.0650259 +812 762 -4631.25243458 +813 762 -5293544.01962 +1396 762 358351.461509 +1397 762 -1360828.33484 +1398 762 -2284273.33935 +1402 762 18909.0650259 +1403 762 4631.25243446 +1404 762 -5293544.01962 +763 763 1011851.60912 +764 763 4110093.43272 +765 763 -4.842877388e-8 +766 763 -311975.890718 +767 763 -1184718.57235 +768 763 1.02445483208e-8 +814 763 22134.9913963 +815 763 90320.994053 +816 763 -18909.0650259 +817 763 -144050.092155 +818 763 -547025.666412 +819 763 358351.461509 +764 764 16788621.6609 +765 764 -2.08616256714e-7 +766 764 -1184718.57235 +767 764 -4498931.28739 +768 764 3.35276126862e-8 +814 764 90320.994053 +815 764 370626.696215 +816 764 4631.25243447 +817 764 -547025.666412 +818 764 -2077312.65726 +819 764 1360828.33484 +765 765 18240145.4814 +766 765 1.11758708954e-8 +767 765 3.72529029846e-8 +768 765 758227.34113 +814 765 18909.0650259 +815 765 -4631.25243456 +816 765 -5293544.01962 +817 765 358351.461509 +818 765 1360828.33484 +819 765 -2284273.33935 +766 766 2350262.38096 +767 766 4600302.12491 +768 766 -2.60770320892e-8 +769 766 2.98023223877e-8 +770 766 -1.19209289551e-7 +772 766 -413671.243673 +773 766 -1334423.36669 +774 766 1.58324837685e-8 +814 766 -144050.092155 +815 766 -547025.666412 +816 766 -358351.461509 +817 766 -474420.971735 +818 766 131724.797328 +819 766 -23329.9193232 +820 766 800256.904552 +821 766 8988441.97885 +823 766 -193836.559394 +824 766 -625279.223852 +825 766 416676.259817 +767 767 17048556.8253 +768 767 -8.94069671631e-8 +769 767 5.96046447754e-8 +772 767 -1334423.36669 +773 767 -4304591.50545 +774 767 4.842877388e-8 +814 767 -547025.666412 +815 767 -2077312.65726 +816 767 -1360828.33484 +817 767 131724.797328 +818 767 -28174.604603 +819 767 6684.54707694 +820 767 -6040684.68178 +821 767 -800256.904552 +823 767 -625279.223852 +824 767 -2017029.75436 +825 767 1344116.96715 +768 768 36176122.0894 +772 768 1.39698386192e-8 +773 768 4.09781932831e-8 +774 768 830431.306934 +814 768 -358351.461509 +815 768 -1360828.33484 +816 768 -2284273.33935 +817 768 23329.9193232 +818 768 -6684.54707697 +819 768 -14301137.6219 +823 768 416676.259817 +824 768 1344116.96715 +825 768 -2296979.40748 +769 769 305878308.174 +770 769 66094123.115 +817 769 -800256.904552 +818 769 6040684.68178 +820 769 64525494.457 +821 769 -4237812.99363 +770 770 549336918.275 +817 770 -8988441.97885 +818 770 800256.904552 +820 770 -4237812.99363 +821 770 48915452.1011 +771 771 715555.555556 +822 771 -357777.777778 +772 772 1816739.3315 +773 772 5341279.87864 +774 772 -3.53902578354e-8 +775 772 -544032.43723 +776 772 -1483724.82881 +777 772 2.04890966415e-8 +817 772 -193836.559394 +818 772 -625279.223852 +819 772 -416676.259817 +823 772 24667.0078013 +824 772 73754.1287476 +825 772 -27106.375452 +826 772 -260348.273704 +827 772 -710040.746465 +828 772 484442.198447 +773 773 15814018.062 +774 773 -1.11758708954e-7 +775 773 -1483724.82881 +776 773 -4046522.26039 +777 773 5.58793544769e-8 +817 773 -625279.223852 +818 773 -2017029.75436 +819 773 -1344116.96715 +823 773 73754.1287476 +824 773 222052.369366 +825 773 9164.38855485 +826 773 -710040.746465 +827 773 -1936474.76309 +828 773 1321205.99576 +774 774 18448886.5844 +775 774 2.04890966415e-8 +776 774 5.58793544769e-8 +777 774 931107.693646 +817 774 -416676.259817 +818 774 -1344116.96715 +819 774 -2296979.40748 +823 774 27106.375452 +824 774 -9164.3885549 +825 774 -5492991.14412 +826 774 484442.198447 +827 774 1321205.99576 +828 774 -2315242.24089 +775 775 2558539.62181 +776 775 6138307.60949 +777 775 -5.58793544769e-8 +778 775 -759692.612592 +779 775 -1651505.67955 +780 775 2.98023223877e-8 +823 775 -260348.273704 +824 775 -710040.746465 +825 775 -484442.198447 +826 775 12227.6197724 +827 775 33038.3525624 +828 775 -41457.2556898 +829 775 -379286.632065 +830 775 -824536.156663 +831 775 588085.337671 +776 776 14915778.6682 +777 776 -1.34110450745e-7 +778 776 -1651505.67955 +779 776 -3590229.73815 +780 776 6.33299350738e-8 +823 776 -710040.746465 +824 776 -1936474.76309 +825 776 -1321205.99576 +826 776 33038.3525624 +827 776 89431.3340664 +828 776 17103.8438088 +829 776 -824536.156663 +830 776 -1792469.90579 +831 776 1278446.38624 +777 777 18669379.7869 +778 777 2.70083546639e-8 +779 777 5.77419996262e-8 +780 777 1124555.53479 +823 777 -484442.198447 +824 777 -1321205.99576 +825 777 -2315242.24089 +826 777 41457.2556898 +827 777 -17103.8438089 +828 777 -5695176.55864 +829 777 588085.337671 +830 777 1278446.38624 +831 777 -2352102.70813 +778 778 3880798.16119 +779 778 7110485.96967 +780 778 -4.47034835815e-8 +781 778 -1076372.38828 +782 778 -1736084.49722 +783 778 2.421438694e-8 +826 778 -379286.632065 +827 778 -824536.156663 +828 778 -588085.337671 +829 778 -52167.0393845 +830 778 -83826.4031561 +831 778 -61373.985991 +832 778 -590912.90871 +833 778 -953085.336629 +834 778 741520.302649 +779 779 13318817.2723 +780 779 -8.94069671631e-8 +781 779 -1736084.49722 +782 779 -2800136.28584 +783 779 3.91155481339e-8 +826 779 -824536.156663 +827 779 -1792469.90579 +828 779 -1278446.38624 +829 779 -83826.4031561 +830 779 -134521.304432 +831 779 32978.3592395 +832 779 -953085.336629 +833 779 -1537234.41392 +834 779 1196000.48814 +780 780 19146980.3477 +781 780 2.23517417908e-8 +782 780 3.53902578354e-8 +783 780 1520483.39551 +826 780 -588085.337671 +827 780 -1278446.38624 +828 780 -2352102.70813 +829 780 61373.985991 +830 780 -32978.3592395 +831 780 -6109264.54972 +832 780 741520.302649 +833 780 1196000.48814 +834 780 -2434642.38116 +781 781 6516876.42304 +782 781 8531914.96891 +783 781 -2.23517417908e-8 +784 781 -2626121.17726 +785 781 -2984228.61052 +786 781 1.30385160446e-8 +829 781 -590912.90871 +830 781 -953085.336629 +831 781 -741520.302649 +832 781 222027.67781 +833 781 227177.812693 +834 781 -75251.5247453 +835 781 -1038306.19785 +836 781 -1179893.40665 +837 781 929649.114512 +782 782 11512089.4984 +783 782 -2.98023223877e-8 +784 782 -2984228.61052 +785 782 -3391168.87559 +786 782 1.30385160446e-8 +829 782 -953085.336629 +830 782 -1537234.41392 +831 782 -1196000.48814 +832 782 227177.812693 +833 782 217630.207531 +834 782 55832.4159336 +835 782 -1179893.40665 +836 782 -1340787.9621 +837 782 1056419.44831 +783 783 18361731.7736 +784 783 3.72529029846e-9 +785 783 5.58793544769e-9 +786 783 -125380.553907 +829 783 -741520.302649 +830 783 -1196000.48814 +831 783 -2434642.38116 +832 783 75251.5247453 +833 783 -55832.4159336 +834 783 -5287984.36193 +835 783 929649.114512 +836 783 1056419.44831 +837 783 -2155790.5645 +784 784 11197028.9194 +785 784 7624235.1212 +786 784 -7.45058059692e-9 +787 784 -1154846.00933 +788 784 -476225.158488 +789 784 1.86264514923e-9 +832 784 -1038306.19785 +833 784 -1179893.40665 +834 784 -929649.114512 +835 784 -908773.635179 +836 784 -175831.894858 +837 784 -148519.569575 +838 784 -1760951.03338 +839 784 -726165.37459 +840 784 1300948.03845 +785 785 6560950.4012 +787 785 -476225.158488 +788 785 -196381.508655 +789 785 9.31322574615e-10 +832 785 -1179893.40665 +833 785 -1340787.9621 +834 785 -1056419.44831 +835 785 -175831.894858 +836 785 153537.59263 +837 785 207978.412157 +838 785 -726165.37459 +839 785 -299449.639006 +840 785 536473.417918 +786 786 21281133.3311 +789 786 4075797.18655 +832 786 -929649.114512 +833 786 -1056419.44831 +834 786 -2155790.5645 +835 786 148519.569575 +836 786 -207978.412157 +837 786 -7295491.64648 +838 786 1300948.03845 +839 786 536473.417918 +840 786 -3164492.7709 +787 787 14087608.2601 +788 787 -7.45058059692e-9 +789 787 -7.45058059692e-9 +790 787 -1154846.00933 +791 787 476225.158488 +792 787 1.86264514923e-9 +835 787 -1760951.03338 +836 787 -726165.37459 +837 787 -1300948.03845 +838 787 -2367056.05396 +839 787 1.11758708954e-8 +840 787 1.86264514923e-9 +841 787 -1760951.03338 +842 787 726165.37459 +843 787 1300948.03845 +788 788 2395597.11087 +789 788 7.45058059692e-9 +790 788 476225.158488 +791 788 -196381.508655 +792 788 -9.31322574615e-10 +835 788 -726165.37459 +836 788 -299449.639006 +837 788 -536473.417918 +838 788 9.31322574615e-9 +839 788 -402517.768767 +840 788 429178.734334 +841 788 726165.37459 +842 788 -299449.639006 +843 788 -536473.417918 +789 789 25315942.1547 +792 789 4075797.18655 +835 789 -1300948.03845 +836 789 -536473.417918 +837 789 -3164492.7709 +839 789 -429178.734334 +840 789 -10404782.7221 +841 789 1300948.03845 +842 789 -536473.417918 +843 789 -3164492.7709 +790 790 11197028.9194 +791 790 -7624235.1212 +792 790 7.45058059692e-9 +793 790 -2626121.17726 +794 790 2984228.61052 +795 790 -5.58793544769e-9 +838 790 -1760951.03338 +839 790 726165.37459 +840 790 -1300948.03845 +841 790 -908773.635179 +842 790 175831.894858 +843 790 148519.569575 +844 790 -1038306.19785 +845 790 1179893.40665 +846 790 929649.114512 +791 791 6560950.4012 +793 791 2984228.61052 +794 791 -3391168.87559 +795 791 5.58793544769e-9 +838 791 726165.37459 +839 791 -299449.639006 +840 791 536473.417918 +841 791 175831.894858 +842 791 153537.59263 +843 791 207978.412157 +844 791 1179893.40665 +845 791 -1340787.9621 +846 791 -1056419.44831 +792 792 21281133.3311 +793 792 -1.11758708954e-8 +794 792 1.11758708954e-8 +795 792 -125380.553907 +838 792 -1300948.03845 +839 792 536473.417918 +840 792 -3164492.7709 +841 792 -148519.569575 +842 792 -207978.412157 +843 792 -7295491.64648 +844 792 929649.114512 +845 792 -1056419.44831 +846 792 -2155790.5645 +793 793 6516876.42304 +794 793 -8531914.96891 +795 793 2.98023223877e-8 +796 793 -1076372.38828 +797 793 1736084.49722 +798 793 -1.67638063431e-8 +841 793 -1038306.19785 +842 793 1179893.40665 +843 793 -929649.114512 +844 793 222027.67781 +845 793 -227177.812693 +846 793 75251.5247453 +847 793 -590912.90871 +848 793 953085.336629 +849 793 741520.302649 +794 794 11512089.4984 +795 794 -3.72529029846e-8 +796 794 1736084.49722 +797 794 -2800136.28584 +798 794 2.60770320892e-8 +841 794 1179893.40665 +842 794 -1340787.9621 +843 794 1056419.44831 +844 794 -227177.812693 +845 794 217630.207531 +846 794 55832.4159336 +847 794 953085.336629 +848 794 -1537234.41392 +849 794 -1196000.48814 +795 795 18361731.7736 +796 795 -2.04890966415e-8 +797 795 3.35276126862e-8 +798 795 1520483.39551 +841 795 -929649.114512 +842 795 1056419.44831 +843 795 -2155790.5645 +844 795 -75251.5247453 +845 795 -55832.4159336 +846 795 -5287984.36193 +847 795 741520.302649 +848 795 -1196000.48814 +849 795 -2434642.38116 +796 796 3880798.16119 +797 796 -7110485.96967 +798 796 3.72529029846e-8 +799 796 -759692.612592 +800 796 1651505.67955 +801 796 -1.86264514923e-8 +844 796 -590912.90871 +845 796 953085.336629 +846 796 -741520.302649 +847 796 -52167.0393845 +848 796 83826.4031561 +849 796 61373.985991 +850 796 -379286.632065 +851 796 824536.156663 +852 796 588085.337671 +797 797 13318817.2723 +798 797 -6.70552253723e-8 +799 797 1651505.67955 +800 797 -3590229.73815 +801 797 4.09781932831e-8 +844 797 953085.336629 +845 797 -1537234.41392 +846 797 1196000.48814 +847 797 83826.4031561 +848 797 -134521.304432 +849 797 32978.3592395 +850 797 824536.156663 +851 797 -1792469.90579 +852 797 -1278446.38624 +798 798 19146980.3477 +799 798 -2.51457095146e-8 +800 798 5.40167093277e-8 +801 798 1124555.53479 +844 798 -741520.302649 +845 798 1196000.48814 +846 798 -2434642.38116 +847 798 -61373.985991 +848 798 -32978.3592395 +849 798 -6109264.54972 +850 798 588085.337671 +851 798 -1278446.38624 +852 798 -2352102.70813 +799 799 2558539.62181 +800 799 -6138307.60949 +801 799 4.28408384323e-8 +802 799 -544032.43723 +803 799 1483724.82881 +804 799 -2.51457095146e-8 +847 799 -379286.632065 +848 799 824536.156663 +849 799 -588085.337671 +850 799 12227.6197724 +851 799 -33038.3525624 +852 799 41457.2556898 +853 799 -260348.273704 +854 799 710040.746465 +855 799 484442.198447 +800 800 14915778.6682 +801 800 -1.19209289551e-7 +802 800 1483724.82881 +803 800 -4046522.26039 +804 800 7.07805156708e-8 +847 800 824536.156663 +848 800 -1792469.90579 +849 800 1278446.38624 +850 800 -33038.3525624 +851 800 89431.3340665 +852 800 17103.8438088 +853 800 710040.746465 +854 800 -1936474.76309 +855 800 -1321205.99576 +801 801 18669379.7869 +802 801 -2.79396772385e-8 +803 801 7.82310962677e-8 +804 801 931107.693646 +847 801 -588085.337671 +848 801 1278446.38624 +849 801 -2352102.70813 +850 801 -41457.2556898 +851 801 -17103.8438089 +852 801 -5695176.55864 +853 801 484442.198447 +854 801 -1321205.99576 +855 801 -2315242.24089 +802 802 1816739.3315 +803 802 -5341279.87864 +804 802 3.72529029846e-8 +805 802 -413671.243673 +806 802 1334423.36669 +807 802 -8.38190317154e-9 +850 802 -260348.273704 +851 802 710040.746465 +852 802 -484442.198447 +853 802 24667.0078013 +854 802 -73754.1287476 +855 802 27106.375452 +856 802 -193836.559394 +857 802 625279.223852 +858 802 416676.259817 +803 803 15814018.062 +804 803 -1.11758708954e-7 +805 803 1334423.36669 +806 803 -4304591.50545 +807 803 2.98023223877e-8 +850 803 710040.746465 +851 803 -1936474.76309 +852 803 1321205.99576 +853 803 -73754.1287476 +854 803 222052.369366 +855 803 9164.38855486 +856 803 625279.223852 +857 803 -2017029.75436 +858 803 -1344116.96715 +804 804 18448886.5844 +805 804 -1.11758708954e-8 +806 804 3.72529029846e-8 +807 804 830431.306934 +850 804 -484442.198447 +851 804 1321205.99576 +852 804 -2315242.24089 +853 804 -27106.375452 +854 804 -9164.38855491 +855 804 -5492991.14412 +856 804 416676.259817 +857 804 -1344116.96715 +858 804 -2296979.40748 +805 805 2350262.78049 +806 805 -4600302.86075 +807 805 2.04890966415e-8 +808 805 -7.45058059692e-9 +811 805 -311975.890718 +812 805 1184718.57235 +813 805 -1.02445483208e-8 +853 805 -193836.559394 +854 805 625279.223852 +855 805 -416676.259817 +856 805 -474421.1715 +857 805 -131724.429407 +858 805 23329.9193232 +859 805 -800250.281991 +860 805 8988445.57462 +862 805 -144050.092155 +863 805 547025.666412 +864 805 358351.461509 +806 806 17048556.4258 +807 806 -7.45058059692e-8 +808 806 5.96046447754e-8 +809 806 7.45058059692e-9 +811 806 1184718.57235 +812 806 -4498931.28739 +813 806 3.35276126862e-8 +853 806 625279.223852 +854 806 -2017029.75436 +855 806 1344116.96715 +856 806 -131724.429407 +857 806 -28174.4048381 +858 806 6684.54707694 +859 806 -6040681.08601 +860 806 800250.281991 +862 806 547025.666412 +863 806 -2077312.65726 +864 806 -1360828.33484 +807 807 36176122.0894 +811 807 -1.30385160446e-8 +812 807 4.47034835815e-8 +813 807 758227.341129 +853 807 -416676.259817 +854 807 1344116.96715 +855 807 -2296979.40748 +856 807 -23329.9193232 +857 807 -6684.54707698 +858 807 -14301137.6219 +862 807 358351.461509 +863 807 -1360828.33484 +864 807 -2284273.33935 +808 808 305878011.196 +809 808 -66093576.1502 +856 808 800250.281991 +857 808 6040681.08601 +859 808 64525513.4986 +860 808 4237777.92342 +809 809 549337215.254 +856 809 -8988445.57462 +857 809 -800250.281991 +859 809 4237777.92342 +860 809 48915433.0595 +810 810 715555.555556 +861 810 -357777.777778 +811 811 1011851.60912 +812 811 -4110093.43272 +813 811 6.14672899246e-8 +856 811 -144050.092155 +857 811 547025.666412 +858 811 -358351.461509 +862 811 22134.9913963 +863 811 -90320.9940531 +864 811 18909.0650259 +812 812 16788621.6609 +813 812 -2.53319740295e-7 +856 812 547025.666412 +857 812 -2077312.65726 +858 812 1360828.33484 +862 812 -90320.9940531 +863 812 370626.696215 +864 812 4631.25243447 +813 813 18240145.4814 +856 813 -358351.461509 +857 813 1360828.33484 +858 813 -2284273.33935 +862 813 -18909.0650259 +863 813 -4631.25243458 +864 813 -5293544.01962 +814 814 1011851.60912 +815 814 4110093.43272 +816 814 -4.65661287308e-8 +817 814 -311975.890718 +818 814 -1184718.57235 +819 814 1.02445483208e-8 +865 814 22134.9913963 +866 814 90320.994053 +867 814 -18909.0650259 +868 814 -144050.092155 +869 814 -547025.666412 +870 814 358351.461509 +815 815 16788621.6609 +816 815 -2.01165676117e-7 +817 815 -1184718.57235 +818 815 -4498931.28739 +819 815 3.35276126862e-8 +865 815 90320.994053 +866 815 370626.696215 +867 815 4631.25243447 +868 815 -547025.666412 +869 815 -2077312.65726 +870 815 1360828.33484 +816 816 18240145.4814 +817 816 1.11758708954e-8 +818 816 3.72529029846e-8 +819 816 758227.34113 +865 816 18909.0650259 +866 816 -4631.25243456 +867 816 -5293544.01962 +868 816 358351.461509 +869 816 1360828.33484 +870 816 -2284273.33935 +817 817 2350262.38096 +818 817 4600302.12491 +819 817 -2.60770320892e-8 +820 817 2.98023223877e-8 +821 817 -1.19209289551e-7 +823 817 -413671.243673 +824 817 -1334423.36669 +825 817 1.58324837685e-8 +865 817 -144050.092155 +866 817 -547025.666412 +867 817 -358351.461509 +868 817 -474420.971735 +869 817 131724.797328 +870 817 -23329.9193232 +871 817 800256.904552 +872 817 8988441.97885 +874 817 -193836.559394 +875 817 -625279.223852 +876 817 416676.259817 +818 818 17048556.8253 +819 818 -8.94069671631e-8 +820 818 5.96046447754e-8 +823 818 -1334423.36669 +824 818 -4304591.50545 +825 818 4.842877388e-8 +865 818 -547025.666412 +866 818 -2077312.65726 +867 818 -1360828.33484 +868 818 131724.797328 +869 818 -28174.604603 +870 818 6684.54707694 +871 818 -6040684.68178 +872 818 -800256.904552 +874 818 -625279.223852 +875 818 -2017029.75436 +876 818 1344116.96715 +819 819 36176122.0894 +823 819 1.39698386192e-8 +824 819 4.09781932831e-8 +825 819 830431.306934 +865 819 -358351.461509 +866 819 -1360828.33484 +867 819 -2284273.33935 +868 819 23329.9193232 +869 819 -6684.54707697 +870 819 -14301137.6219 +874 819 416676.259817 +875 819 1344116.96715 +876 819 -2296979.40748 +820 820 305878308.174 +821 820 66094123.115 +868 820 -800256.904552 +869 820 6040684.68178 +871 820 64525494.457 +872 820 -4237812.99363 +821 821 549336918.275 +868 821 -8988441.97885 +869 821 800256.904552 +871 821 -4237812.99363 +872 821 48915452.1011 +822 822 715555.555556 +873 822 -357777.777778 +823 823 1816739.3315 +824 823 5341279.87864 +825 823 -3.53902578354e-8 +826 823 -544032.43723 +827 823 -1483724.82881 +828 823 2.04890966415e-8 +868 823 -193836.559394 +869 823 -625279.223852 +870 823 -416676.259817 +874 823 24667.0078013 +875 823 73754.1287476 +876 823 -27106.375452 +877 823 -260348.273704 +878 823 -710040.746465 +879 823 484442.198447 +824 824 15814018.062 +825 824 -1.11758708954e-7 +826 824 -1483724.82881 +827 824 -4046522.26039 +828 824 5.58793544769e-8 +868 824 -625279.223852 +869 824 -2017029.75436 +870 824 -1344116.96715 +874 824 73754.1287476 +875 824 222052.369366 +876 824 9164.38855485 +877 824 -710040.746465 +878 824 -1936474.76309 +879 824 1321205.99576 +825 825 18448886.5844 +826 825 2.04890966415e-8 +827 825 5.58793544769e-8 +828 825 931107.693646 +868 825 -416676.259817 +869 825 -1344116.96715 +870 825 -2296979.40748 +874 825 27106.375452 +875 825 -9164.3885549 +876 825 -5492991.14412 +877 825 484442.198447 +878 825 1321205.99576 +879 825 -2315242.24089 +826 826 2558539.62181 +827 826 6138307.60949 +828 826 -5.58793544769e-8 +829 826 -759692.612592 +830 826 -1651505.67955 +831 826 2.98023223877e-8 +874 826 -260348.273704 +875 826 -710040.746465 +876 826 -484442.198447 +877 826 12227.6197724 +878 826 33038.3525624 +879 826 -41457.2556898 +880 826 -379286.632065 +881 826 -824536.156663 +882 826 588085.337671 +827 827 14915778.6682 +828 827 -1.34110450745e-7 +829 827 -1651505.67955 +830 827 -3590229.73815 +831 827 6.33299350738e-8 +874 827 -710040.746465 +875 827 -1936474.76309 +876 827 -1321205.99576 +877 827 33038.3525624 +878 827 89431.3340664 +879 827 17103.8438088 +880 827 -824536.156663 +881 827 -1792469.90579 +882 827 1278446.38624 +828 828 18669379.7869 +829 828 2.70083546639e-8 +830 828 5.77419996262e-8 +831 828 1124555.53479 +874 828 -484442.198447 +875 828 -1321205.99576 +876 828 -2315242.24089 +877 828 41457.2556898 +878 828 -17103.8438089 +879 828 -5695176.55864 +880 828 588085.337671 +881 828 1278446.38624 +882 828 -2352102.70813 +829 829 3880798.16119 +830 829 7110485.96967 +831 829 -4.47034835815e-8 +832 829 -1076372.38828 +833 829 -1736084.49722 +834 829 2.421438694e-8 +877 829 -379286.632065 +878 829 -824536.156663 +879 829 -588085.337671 +880 829 -52167.0393845 +881 829 -83826.4031561 +882 829 -61373.985991 +883 829 -590912.90871 +884 829 -953085.336629 +885 829 741520.302649 +830 830 13318817.2723 +831 830 -8.94069671631e-8 +832 830 -1736084.49722 +833 830 -2800136.28584 +834 830 3.91155481339e-8 +877 830 -824536.156663 +878 830 -1792469.90579 +879 830 -1278446.38624 +880 830 -83826.4031561 +881 830 -134521.304432 +882 830 32978.3592395 +883 830 -953085.336629 +884 830 -1537234.41392 +885 830 1196000.48814 +831 831 19146980.3477 +832 831 2.23517417908e-8 +833 831 3.53902578354e-8 +834 831 1520483.39551 +877 831 -588085.337671 +878 831 -1278446.38624 +879 831 -2352102.70813 +880 831 61373.985991 +881 831 -32978.3592395 +882 831 -6109264.54972 +883 831 741520.302649 +884 831 1196000.48814 +885 831 -2434642.38116 +832 832 6516876.42304 +833 832 8531914.96891 +834 832 -2.23517417908e-8 +835 832 -2626121.17726 +836 832 -2984228.61052 +837 832 1.30385160446e-8 +880 832 -590912.90871 +881 832 -953085.336629 +882 832 -741520.302649 +883 832 222027.67781 +884 832 227177.812693 +885 832 -75251.5247453 +886 832 -1038306.19785 +887 832 -1179893.40665 +888 832 929649.114512 +833 833 11512089.4984 +834 833 -2.98023223877e-8 +835 833 -2984228.61052 +836 833 -3391168.87559 +837 833 1.30385160446e-8 +880 833 -953085.336629 +881 833 -1537234.41392 +882 833 -1196000.48814 +883 833 227177.812693 +884 833 217630.207531 +885 833 55832.4159336 +886 833 -1179893.40665 +887 833 -1340787.9621 +888 833 1056419.44831 +834 834 18361731.7736 +835 834 5.58793544769e-9 +836 834 7.45058059692e-9 +837 834 -125380.553907 +880 834 -741520.302649 +881 834 -1196000.48814 +882 834 -2434642.38116 +883 834 75251.5247453 +884 834 -55832.4159336 +885 834 -5287984.36193 +886 834 929649.114512 +887 834 1056419.44831 +888 834 -2155790.5645 +835 835 11197028.9194 +836 835 7624235.1212 +837 835 -1.49011611938e-8 +838 835 -1154846.00933 +839 835 -476225.158488 +840 835 1.86264514923e-9 +883 835 -1038306.19785 +884 835 -1179893.40665 +885 835 -929649.114512 +886 835 -908773.635179 +887 835 -175831.894858 +888 835 -148519.569575 +889 835 -1760951.03338 +890 835 -726165.37459 +891 835 1300948.03845 +836 836 6560950.4012 +837 836 -7.45058059692e-9 +838 836 -476225.158488 +839 836 -196381.508655 +840 836 9.31322574615e-10 +883 836 -1179893.40665 +884 836 -1340787.9621 +885 836 -1056419.44831 +886 836 -175831.894858 +887 836 153537.59263 +888 836 207978.412157 +889 836 -726165.37459 +890 836 -299449.639006 +891 836 536473.417918 +837 837 21281133.3311 +840 837 4075797.18655 +883 837 -929649.114512 +884 837 -1056419.44831 +885 837 -2155790.5645 +886 837 148519.569575 +887 837 -207978.412157 +888 837 -7295491.64648 +889 837 1300948.03845 +890 837 536473.417918 +891 837 -3164492.7709 +838 838 14087608.2601 +839 838 -7.45058059692e-9 +840 838 -7.45058059692e-9 +841 838 -1154846.00933 +842 838 476225.158488 +843 838 1.86264514923e-9 +886 838 -1760951.03338 +887 838 -726165.37459 +888 838 -1300948.03845 +889 838 -2367056.05396 +890 838 1.11758708954e-8 +891 838 1.86264514923e-9 +892 838 -1760951.03338 +893 838 726165.37459 +894 838 1300948.03845 +839 839 2395597.11087 +840 839 7.45058059692e-9 +841 839 476225.158488 +842 839 -196381.508655 +843 839 -9.31322574615e-10 +886 839 -726165.37459 +887 839 -299449.639006 +888 839 -536473.417918 +889 839 9.31322574615e-9 +890 839 -402517.768767 +891 839 429178.734334 +892 839 726165.37459 +893 839 -299449.639006 +894 839 -536473.417918 +840 840 25315942.1547 +843 840 4075797.18655 +886 840 -1300948.03845 +887 840 -536473.417918 +888 840 -3164492.7709 +890 840 -429178.734334 +891 840 -10404782.7221 +892 840 1300948.03845 +893 840 -536473.417918 +894 840 -3164492.7709 +841 841 11197028.9194 +842 841 -7624235.1212 +843 841 7.45058059692e-9 +844 841 -2626121.17726 +845 841 2984228.61052 +846 841 -5.58793544769e-9 +889 841 -1760951.03338 +890 841 726165.37459 +891 841 -1300948.03845 +892 841 -908773.635179 +893 841 175831.894858 +894 841 148519.569575 +895 841 -1038306.19785 +896 841 1179893.40665 +897 841 929649.114512 +842 842 6560950.4012 +844 842 2984228.61052 +845 842 -3391168.87559 +846 842 5.58793544769e-9 +889 842 726165.37459 +890 842 -299449.639006 +891 842 536473.417918 +892 842 175831.894858 +893 842 153537.59263 +894 842 207978.412157 +895 842 1179893.40665 +896 842 -1340787.9621 +897 842 -1056419.44831 +843 843 21281133.3311 +844 843 -9.31322574615e-9 +845 843 7.45058059692e-9 +846 843 -125380.553907 +889 843 -1300948.03845 +890 843 536473.417918 +891 843 -3164492.7709 +892 843 -148519.569575 +893 843 -207978.412157 +894 843 -7295491.64648 +895 843 929649.114512 +896 843 -1056419.44831 +897 843 -2155790.5645 +844 844 6516876.42304 +845 844 -8531914.96891 +846 844 1.86264514923e-8 +847 844 -1076372.38828 +848 844 1736084.49722 +849 844 -1.67638063431e-8 +892 844 -1038306.19785 +893 844 1179893.40665 +894 844 -929649.114512 +895 844 222027.67781 +896 844 -227177.812693 +897 844 75251.5247453 +1405 844 -590912.90871 +1406 844 953085.336629 +1407 844 741520.302649 +845 845 11512089.4984 +846 845 -2.23517417908e-8 +847 845 1736084.49722 +848 845 -2800136.28584 +849 845 2.60770320892e-8 +892 845 1179893.40665 +893 845 -1340787.9621 +894 845 1056419.44831 +895 845 -227177.812693 +896 845 217630.207531 +897 845 55832.4159336 +1405 845 953085.336629 +1406 845 -1537234.41392 +1407 845 -1196000.48814 +846 846 18361731.7736 +847 846 -2.04890966415e-8 +848 846 3.35276126862e-8 +849 846 1520483.39551 +892 846 -929649.114512 +893 846 1056419.44831 +894 846 -2155790.5645 +895 846 -75251.5247453 +896 846 -55832.4159336 +897 846 -5287984.36193 +1405 846 741520.302649 +1406 846 -1196000.48814 +1407 846 -2434642.38116 +847 847 3880798.16119 +848 847 -7110485.96967 +849 847 3.72529029846e-8 +850 847 -759692.612592 +851 847 1651505.67955 +852 847 -1.86264514923e-8 +895 847 -590912.90871 +896 847 953085.336629 +897 847 -741520.302649 +1405 847 -52167.0393845 +1406 847 83826.4031561 +1407 847 61373.985991 +1408 847 -379286.632065 +1409 847 824536.156663 +1410 847 588085.337671 +848 848 13318817.2723 +849 848 -6.70552253723e-8 +850 848 1651505.67955 +851 848 -3590229.73815 +852 848 4.09781932831e-8 +895 848 953085.336629 +896 848 -1537234.41392 +897 848 1196000.48814 +1405 848 83826.4031561 +1406 848 -134521.304432 +1407 848 32978.3592395 +1408 848 824536.156663 +1409 848 -1792469.90579 +1410 848 -1278446.38624 +849 849 19146980.3477 +850 849 -2.51457095146e-8 +851 849 5.40167093277e-8 +852 849 1124555.53479 +895 849 -741520.302649 +896 849 1196000.48814 +897 849 -2434642.38116 +1405 849 -61373.985991 +1406 849 -32978.3592395 +1407 849 -6109264.54972 +1408 849 588085.337671 +1409 849 -1278446.38624 +1410 849 -2352102.70813 +850 850 2558539.62181 +851 850 -6138307.60949 +852 850 4.28408384323e-8 +853 850 -544032.43723 +854 850 1483724.82881 +855 850 -2.51457095146e-8 +1405 850 -379286.632065 +1406 850 824536.156663 +1407 850 -588085.337671 +1408 850 12227.6197724 +1409 850 -33038.3525624 +1410 850 41457.2556898 +1411 850 -260348.273704 +1412 850 710040.746465 +1413 850 484442.198447 +851 851 14915778.6682 +852 851 -1.19209289551e-7 +853 851 1483724.82881 +854 851 -4046522.26039 +855 851 7.07805156708e-8 +1405 851 824536.156663 +1406 851 -1792469.90579 +1407 851 1278446.38624 +1408 851 -33038.3525624 +1409 851 89431.3340665 +1410 851 17103.8438088 +1411 851 710040.746465 +1412 851 -1936474.76309 +1413 851 -1321205.99576 +852 852 18669379.7869 +853 852 -2.79396772385e-8 +854 852 7.82310962677e-8 +855 852 931107.693646 +1405 852 -588085.337671 +1406 852 1278446.38624 +1407 852 -2352102.70813 +1408 852 -41457.2556898 +1409 852 -17103.8438089 +1410 852 -5695176.55864 +1411 852 484442.198447 +1412 852 -1321205.99576 +1413 852 -2315242.24089 +853 853 1816739.3315 +854 853 -5341279.87864 +855 853 3.72529029846e-8 +856 853 -413671.243673 +857 853 1334423.36669 +858 853 -8.38190317154e-9 +1408 853 -260348.273704 +1409 853 710040.746465 +1410 853 -484442.198447 +1411 853 24667.0078013 +1412 853 -73754.1287476 +1413 853 27106.375452 +1414 853 -193836.559394 +1415 853 625279.223852 +1416 853 416676.259817 +854 854 15814018.062 +855 854 -1.11758708954e-7 +856 854 1334423.36669 +857 854 -4304591.50545 +858 854 2.98023223877e-8 +1408 854 710040.746465 +1409 854 -1936474.76309 +1410 854 1321205.99576 +1411 854 -73754.1287476 +1412 854 222052.369366 +1413 854 9164.38855486 +1414 854 625279.223852 +1415 854 -2017029.75436 +1416 854 -1344116.96715 +855 855 18448886.5844 +856 855 -1.11758708954e-8 +857 855 3.72529029846e-8 +858 855 830431.306934 +1408 855 -484442.198447 +1409 855 1321205.99576 +1410 855 -2315242.24089 +1411 855 -27106.375452 +1412 855 -9164.38855491 +1413 855 -5492991.14412 +1414 855 416676.259817 +1415 855 -1344116.96715 +1416 855 -2296979.40748 +856 856 2350262.78049 +857 856 -4600302.86075 +858 856 2.04890966415e-8 +859 856 -7.45058059692e-9 +862 856 -311975.890718 +863 856 1184718.57235 +864 856 -1.02445483208e-8 +1411 856 -193836.559394 +1412 856 625279.223852 +1413 856 -416676.259817 +1414 856 -474421.1715 +1415 856 -131724.429407 +1416 856 23329.9193232 +1417 856 -800250.281991 +1418 856 8988445.57462 +1420 856 -144050.092155 +1421 856 547025.666412 +1422 856 358351.461509 +857 857 17048556.4258 +858 857 -7.45058059692e-8 +859 857 5.96046447754e-8 +860 857 7.45058059692e-9 +862 857 1184718.57235 +863 857 -4498931.28739 +864 857 3.35276126862e-8 +1411 857 625279.223852 +1412 857 -2017029.75436 +1413 857 1344116.96715 +1414 857 -131724.429407 +1415 857 -28174.4048381 +1416 857 6684.54707694 +1417 857 -6040681.08601 +1418 857 800250.281991 +1420 857 547025.666412 +1421 857 -2077312.65726 +1422 857 -1360828.33484 +858 858 36176122.0894 +862 858 -1.30385160446e-8 +863 858 4.47034835815e-8 +864 858 758227.341129 +1411 858 -416676.259817 +1412 858 1344116.96715 +1413 858 -2296979.40748 +1414 858 -23329.9193232 +1415 858 -6684.54707698 +1416 858 -14301137.6219 +1420 858 358351.461509 +1421 858 -1360828.33484 +1422 858 -2284273.33935 +859 859 305878011.196 +860 859 -66093576.1502 +1414 859 800250.281991 +1415 859 6040681.08601 +1417 859 64525513.4986 +1418 859 4237777.92342 +860 860 549337215.254 +1414 860 -8988445.57462 +1415 860 -800250.281991 +1417 860 4237777.92342 +1418 860 48915433.0595 +861 861 715555.555556 +1419 861 -357777.777778 +862 862 1011851.60912 +863 862 -4110093.43272 +864 862 6.33299350738e-8 +1414 862 -144050.092155 +1415 862 547025.666412 +1416 862 -358351.461509 +1420 862 22134.9913963 +1421 862 -90320.9940531 +1422 862 18909.0650259 +863 863 16788621.6609 +864 863 -2.60770320892e-7 +1414 863 547025.666412 +1415 863 -2077312.65726 +1416 863 1360828.33484 +1420 863 -90320.9940531 +1421 863 370626.696215 +1422 863 4631.25243447 +864 864 18240145.4814 +1414 864 -358351.461509 +1415 864 1360828.33484 +1416 864 -2284273.33935 +1420 864 -18909.0650259 +1421 864 -4631.25243458 +1422 864 -5293544.01962 +865 865 1011851.60912 +866 865 4110093.43272 +867 865 -4.65661287308e-8 +868 865 -311975.890718 +869 865 -1184718.57235 +870 865 1.02445483208e-8 +1423 865 22134.9913963 +1424 865 90320.994053 +1425 865 -18909.0650259 +1426 865 -144050.092155 +1427 865 -547025.666412 +1428 865 358351.461509 +866 866 16788621.6609 +867 866 -2.01165676117e-7 +868 866 -1184718.57235 +869 866 -4498931.28739 +870 866 3.35276126862e-8 +1423 866 90320.994053 +1424 866 370626.696215 +1425 866 4631.25243447 +1426 866 -547025.666412 +1427 866 -2077312.65726 +1428 866 1360828.33484 +867 867 18240145.4814 +868 867 1.02445483208e-8 +869 867 3.35276126862e-8 +870 867 758227.341129 +1423 867 18909.0650259 +1424 867 -4631.25243456 +1425 867 -5293544.01962 +1426 867 358351.461509 +1427 867 1360828.33484 +1428 867 -2284273.33935 +868 868 2350262.38096 +869 868 4600302.12491 +870 868 -2.98023223877e-8 +871 868 2.98023223877e-8 +872 868 -1.19209289551e-7 +874 868 -413671.243673 +875 868 -1334423.36669 +876 868 1.58324837685e-8 +1423 868 -144050.092155 +1424 868 -547025.666412 +1425 868 -358351.461509 +1426 868 -474420.971735 +1427 868 131724.797328 +1428 868 -23329.9193232 +1429 868 800256.904552 +1430 868 8988441.97885 +1432 868 -193836.559394 +1433 868 -625279.223852 +1434 868 416676.259817 +869 869 17048556.8253 +870 869 -9.685754776e-8 +871 869 5.96046447754e-8 +874 869 -1334423.36669 +875 869 -4304591.50545 +876 869 4.842877388e-8 +1423 869 -547025.666412 +1424 869 -2077312.65726 +1425 869 -1360828.33484 +1426 869 131724.797328 +1427 869 -28174.6046029 +1428 869 6684.54707694 +1429 869 -6040684.68178 +1430 869 -800256.904552 +1432 869 -625279.223852 +1433 869 -2017029.75436 +1434 869 1344116.96715 +870 870 36176122.0894 +874 870 1.210719347e-8 +875 870 3.35276126862e-8 +876 870 830431.306934 +1423 870 -358351.461509 +1424 870 -1360828.33484 +1425 870 -2284273.33935 +1426 870 23329.9193232 +1427 870 -6684.54707696 +1428 870 -14301137.6219 +1432 870 416676.259817 +1433 870 1344116.96715 +1434 870 -2296979.40748 +871 871 305878308.174 +872 871 66094123.115 +1426 871 -800256.904552 +1427 871 6040684.68178 +1429 871 64525494.457 +1430 871 -4237812.99363 +872 872 549336918.275 +1426 872 -8988441.97885 +1427 872 800256.904552 +1429 872 -4237812.99363 +1430 872 48915452.1011 +873 873 715555.555556 +1431 873 -357777.777778 +874 874 1816739.3315 +875 874 5341279.87864 +876 874 -3.53902578354e-8 +877 874 -544032.43723 +878 874 -1483724.82881 +879 874 2.04890966415e-8 +1426 874 -193836.559394 +1427 874 -625279.223852 +1428 874 -416676.259817 +1432 874 24667.0078013 +1433 874 73754.1287476 +1434 874 -27106.375452 +1435 874 -260348.273704 +1436 874 -710040.746465 +1437 874 484442.198447 +875 875 15814018.062 +876 875 -1.11758708954e-7 +877 875 -1483724.82881 +878 875 -4046522.26039 +879 875 5.58793544769e-8 +1426 875 -625279.223852 +1427 875 -2017029.75436 +1428 875 -1344116.96715 +1432 875 73754.1287476 +1433 875 222052.369366 +1434 875 9164.38855485 +1435 875 -710040.746465 +1436 875 -1936474.76309 +1437 875 1321205.99576 +876 876 18448886.5844 +877 876 1.95577740669e-8 +878 876 5.21540641785e-8 +879 876 931107.693646 +1426 876 -416676.259817 +1427 876 -1344116.96715 +1428 876 -2296979.40748 +1432 876 27106.375452 +1433 876 -9164.38855491 +1434 876 -5492991.14412 +1435 876 484442.198447 +1436 876 1321205.99576 +1437 876 -2315242.24089 +877 877 2558539.62181 +878 877 6138307.60949 +879 877 -5.21540641785e-8 +880 877 -759692.612592 +881 877 -1651505.67955 +882 877 2.98023223877e-8 +1432 877 -260348.273704 +1433 877 -710040.746465 +1434 877 -484442.198447 +1435 877 12227.6197724 +1436 877 33038.3525624 +1437 877 -41457.2556898 +1438 877 -379286.632065 +1439 877 -824536.156663 +1440 877 588085.337671 +878 878 14915778.6682 +879 878 -1.26659870148e-7 +880 878 -1651505.67955 +881 878 -3590229.73815 +882 878 6.33299350738e-8 +1432 878 -710040.746465 +1433 878 -1936474.76309 +1434 878 -1321205.99576 +1435 878 33038.3525624 +1436 878 89431.3340664 +1437 878 17103.8438088 +1438 878 -824536.156663 +1439 878 -1792469.90579 +1440 878 1278446.38624 +879 879 18669379.7869 +880 879 2.70083546639e-8 +881 879 5.77419996262e-8 +882 879 1124555.53479 +1432 879 -484442.198447 +1433 879 -1321205.99576 +1434 879 -2315242.24089 +1435 879 41457.2556898 +1436 879 -17103.8438089 +1437 879 -5695176.55864 +1438 879 588085.337671 +1439 879 1278446.38624 +1440 879 -2352102.70813 +880 880 3880798.16119 +881 880 7110485.96967 +882 880 -4.47034835815e-8 +883 880 -1076372.38828 +884 880 -1736084.49722 +885 880 2.421438694e-8 +1435 880 -379286.632065 +1436 880 -824536.156663 +1437 880 -588085.337671 +1438 880 -52167.0393845 +1439 880 -83826.4031561 +1440 880 -61373.985991 +1441 880 -590912.90871 +1442 880 -953085.336629 +1443 880 741520.302649 +881 881 13318817.2723 +882 881 -8.94069671631e-8 +883 881 -1736084.49722 +884 881 -2800136.28584 +885 881 3.91155481339e-8 +1435 881 -824536.156663 +1436 881 -1792469.90579 +1437 881 -1278446.38624 +1438 881 -83826.4031561 +1439 881 -134521.304432 +1440 881 32978.3592395 +1441 881 -953085.336629 +1442 881 -1537234.41392 +1443 881 1196000.48814 +882 882 19146980.3477 +883 882 2.23517417908e-8 +884 882 3.53902578354e-8 +885 882 1520483.39551 +1435 882 -588085.337671 +1436 882 -1278446.38624 +1437 882 -2352102.70813 +1438 882 61373.985991 +1439 882 -32978.3592395 +1440 882 -6109264.54972 +1441 882 741520.302649 +1442 882 1196000.48814 +1443 882 -2434642.38116 +883 883 6516876.42304 +884 883 8531914.96891 +885 883 -2.23517417908e-8 +886 883 -2626121.17726 +887 883 -2984228.61052 +888 883 1.30385160446e-8 +1438 883 -590912.90871 +1439 883 -953085.336629 +1440 883 -741520.302649 +1441 883 222027.67781 +1442 883 227177.812693 +1443 883 -75251.5247453 +1444 883 -1038306.19785 +1445 883 -1179893.40665 +1446 883 929649.114512 +884 884 11512089.4984 +885 884 -2.98023223877e-8 +886 884 -2984228.61052 +887 884 -3391168.87559 +888 884 1.30385160446e-8 +1438 884 -953085.336629 +1439 884 -1537234.41392 +1440 884 -1196000.48814 +1441 884 227177.812693 +1442 884 217630.207531 +1443 884 55832.4159336 +1444 884 -1179893.40665 +1445 884 -1340787.9621 +1446 884 1056419.44831 +885 885 18361731.7736 +886 885 5.58793544769e-9 +887 885 7.45058059692e-9 +888 885 -125380.553907 +1438 885 -741520.302649 +1439 885 -1196000.48814 +1440 885 -2434642.38116 +1441 885 75251.5247453 +1442 885 -55832.4159336 +1443 885 -5287984.36193 +1444 885 929649.114512 +1445 885 1056419.44831 +1446 885 -2155790.5645 +886 886 11197028.9194 +887 886 7624235.1212 +888 886 -1.49011611938e-8 +889 886 -1154846.00933 +890 886 -476225.158488 +891 886 1.86264514923e-9 +1441 886 -1038306.19785 +1442 886 -1179893.40665 +1443 886 -929649.114512 +1444 886 -908773.635179 +1445 886 -175831.894858 +1446 886 -148519.569575 +1447 886 -1760951.03338 +1448 886 -726165.37459 +1449 886 1300948.03845 +887 887 6560950.4012 +888 887 -7.45058059692e-9 +889 887 -476225.158488 +890 887 -196381.508655 +891 887 9.31322574615e-10 +1441 887 -1179893.40665 +1442 887 -1340787.9621 +1443 887 -1056419.44831 +1444 887 -175831.894858 +1445 887 153537.59263 +1446 887 207978.412157 +1447 887 -726165.37459 +1448 887 -299449.639006 +1449 887 536473.417918 +888 888 21281133.3311 +891 888 4075797.18655 +1441 888 -929649.114512 +1442 888 -1056419.44831 +1443 888 -2155790.5645 +1444 888 148519.569575 +1445 888 -207978.412157 +1446 888 -7295491.64648 +1447 888 1300948.03845 +1448 888 536473.417918 +1449 888 -3164492.7709 +889 889 14087608.2601 +890 889 -7.45058059692e-9 +891 889 -7.45058059692e-9 +892 889 -1154846.00933 +893 889 476225.158488 +894 889 1.86264514923e-9 +1444 889 -1760951.03338 +1445 889 -726165.37459 +1446 889 -1300948.03845 +1447 889 -2367056.05396 +1448 889 1.11758708954e-8 +1449 889 1.86264514923e-9 +1450 889 -1760951.03338 +1451 889 726165.37459 +1452 889 1300948.03845 +890 890 2395597.11087 +891 890 7.45058059692e-9 +892 890 476225.158488 +893 890 -196381.508655 +894 890 -9.31322574615e-10 +1444 890 -726165.37459 +1445 890 -299449.639006 +1446 890 -536473.417918 +1447 890 9.31322574615e-9 +1448 890 -402517.768767 +1449 890 429178.734334 +1450 890 726165.37459 +1451 890 -299449.639006 +1452 890 -536473.417918 +891 891 25315942.1547 +894 891 4075797.18655 +1444 891 -1300948.03845 +1445 891 -536473.417918 +1446 891 -3164492.7709 +1448 891 -429178.734334 +1449 891 -10404782.7221 +1450 891 1300948.03845 +1451 891 -536473.417918 +1452 891 -3164492.7709 +892 892 11197028.9194 +893 892 -7624235.1212 +894 892 7.45058059692e-9 +895 892 -2626121.17726 +896 892 2984228.61052 +897 892 -5.58793544769e-9 +1447 892 -1760951.03338 +1448 892 726165.37459 +1449 892 -1300948.03845 +1450 892 -908773.635179 +1451 892 175831.894858 +1452 892 148519.569575 +1453 892 -1038306.19785 +1454 892 1179893.40665 +1455 892 929649.114512 +893 893 6560950.4012 +895 893 2984228.61052 +896 893 -3391168.87559 +897 893 5.58793544769e-9 +1447 893 726165.37459 +1448 893 -299449.639006 +1449 893 536473.417918 +1450 893 175831.894858 +1451 893 153537.59263 +1452 893 207978.412157 +1453 893 1179893.40665 +1454 893 -1340787.9621 +1455 893 -1056419.44831 +894 894 21281133.3311 +895 894 -1.30385160446e-8 +896 894 1.30385160446e-8 +897 894 -125380.553907 +1447 894 -1300948.03845 +1448 894 536473.417918 +1449 894 -3164492.7709 +1450 894 -148519.569575 +1451 894 -207978.412157 +1452 894 -7295491.64648 +1453 894 929649.114512 +1454 894 -1056419.44831 +1455 894 -2155790.5645 +895 895 6516876.42304 +896 895 -8531914.96891 +897 895 2.60770320892e-8 +1405 895 -1076372.38828 +1406 895 1736084.49722 +1407 895 -1.67638063431e-8 +1450 895 -1038306.19785 +1451 895 1179893.40665 +1452 895 -929649.114512 +1453 895 222027.67781 +1454 895 -227177.812693 +1455 895 75251.5247453 +1456 895 -590912.90871 +1457 895 953085.336629 +1458 895 741520.302649 +896 896 11512089.4984 +897 896 -2.98023223877e-8 +1405 896 1736084.49722 +1406 896 -2800136.28584 +1407 896 2.60770320892e-8 +1450 896 1179893.40665 +1451 896 -1340787.9621 +1452 896 1056419.44831 +1453 896 -227177.812693 +1454 896 217630.207531 +1455 896 55832.4159336 +1456 896 953085.336629 +1457 896 -1537234.41392 +1458 896 -1196000.48814 +897 897 18361731.7736 +1405 897 -2.04890966415e-8 +1406 897 3.35276126862e-8 +1407 897 1520483.39551 +1450 897 -929649.114512 +1451 897 1056419.44831 +1452 897 -2155790.5645 +1453 897 -75251.5247453 +1454 897 -55832.4159336 +1455 897 -5287984.36193 +1456 897 741520.302649 +1457 897 -1196000.48814 +1458 897 -2434642.38116 +898 898 1902223.18074 +899 898 5590205.99024 +900 898 -2.60770320892e-8 +901 898 -77037.3094959 +902 898 -210101.75317 +903 898 2.60770320892e-8 +934 898 -183325.791023 +935 898 -591373.519429 +936 898 -416676.259817 +940 898 -89281.9039062 +941 898 -261158.775213 +942 898 -27106.375452 +943 898 -246970.319543 +944 898 -673555.416935 +945 898 484442.198447 +899 899 16543837.5893 +900 899 -5.96046447754e-8 +901 899 -210101.75317 +902 899 -573004.781374 +903 899 6.70552253723e-8 +934 899 -591373.519429 +935 899 -1907656.51429 +936 899 -1344116.96715 +940 899 -261158.775213 +941 899 -769227.57174 +942 899 9164.38855486 +943 899 -673555.416935 +944 899 -1836969.31891 +945 899 1321205.99576 +900 900 30501291.4656 +901 900 1.58324837685e-8 +902 900 4.47034835815e-8 +903 900 5508023.65257 +934 900 -416676.259817 +935 900 -1344116.96715 +936 900 -2538358.87127 +940 900 27106.375452 +941 900 -9164.38855491 +942 900 -7121142.78387 +943 900 484442.198447 +944 900 1321205.99576 +945 900 -2564546.07772 +901 901 2722764.08058 +902 901 6525095.96362 +903 901 -5.58793544769e-8 +904 901 -76937.634873 +905 901 -167255.727985 +906 901 3.07336449623e-8 +940 901 -246970.319543 +941 901 -673555.416935 +942 901 -484442.198447 +943 901 -150094.32553 +944 901 -356091.902114 +945 901 -41457.2556898 +946 901 -361895.781536 +947 901 -786729.959862 +948 901 588085.337671 +902 902 15837837.4467 +903 902 -1.34110450745e-7 +904 902 -167255.727985 +905 902 -363599.408663 +906 902 6.51925802231e-8 +940 902 -673555.416935 +941 902 -1836969.31891 +942 902 -1321205.99576 +943 902 -356091.902114 +944 902 -855385.258209 +945 902 17103.8438088 +946 902 -786729.959862 +947 902 -1710282.52144 +948 902 1278446.38624 +903 903 31131706.3633 +904 903 1.95577740669e-8 +905 903 4.09781932831e-8 +906 903 5787467.22392 +940 903 -484442.198447 +941 903 -1321205.99576 +942 903 -2564546.07772 +943 903 41457.2556898 +944 903 -17103.8438089 +945 903 -7353984.06298 +946 903 588085.337671 +947 903 1278446.38624 +948 903 -2616778.13471 +904 904 4267595.81742 +905 904 7796294.34309 +906 904 -1.11758708954e-8 +907 904 -4790.05038338 +908 904 -7725.88771513 +909 904 1.30385160446e-8 +943 904 -361895.781536 +944 904 -786729.959862 +945 904 -588085.337671 +946 904 -304176.348108 +947 904 -544599.533137 +948 904 -61373.985991 +949 904 -570661.636677 +950 904 -920421.994641 +951 904 741520.302649 +905 905 14559614.5621 +906 905 -2.98023223877e-8 +907 905 -7725.88771513 +908 905 -12461.109218 +909 905 2.04890966415e-8 +943 905 -786729.959862 +944 905 -1710282.52144 +945 905 -1278446.38624 +946 905 -544599.533137 +947 905 -995761.387374 +948 905 32978.3592395 +949 905 -920421.994641 +950 905 -1484551.60426 +951 905 1196000.48814 +906 906 32450763.4987 +907 906 2.04890966415e-8 +908 906 3.35276126862e-8 +909 906 6373223.13441 +943 906 -588085.337671 +944 906 -1278446.38624 +945 906 -2616778.13471 +946 906 61373.985991 +947 906 -32978.3592395 +948 906 -7832517.9294 +949 906 741520.302649 +950 906 1196000.48814 +951 906 -2731360.75727 +907 907 6563466.92161 +908 907 8716568.29938 +909 907 -5.96046447754e-8 +910 907 -797223.130676 +911 907 -905935.375768 +912 907 1.86264514923e-8 +946 907 -570661.636677 +947 907 -920421.994641 +948 907 -741520.302649 +949 907 -175770.085153 +950 907 -298827.840693 +951 907 -75251.5247454 +952 907 -955815.974241 +953 907 -1086154.51618 +954 907 929649.114512 +908 908 11934357.6383 +909 908 -8.19563865662e-8 +910 908 -905935.375768 +911 908 -1029472.01792 +912 908 2.23517417908e-8 +946 908 -920421.994641 +947 908 -1484551.60426 +948 908 -1196000.48814 +949 908 -298827.840693 +950 908 -499398.232929 +951 908 55832.4159336 +952 908 -1086154.51618 +953 908 -1234266.49566 +954 908 1056419.44831 +909 909 30008520.3637 +910 909 -7.45058059692e-9 +911 909 -7.45058059692e-9 +912 909 4063389.39899 +946 909 -741520.302649 +947 909 -1196000.48814 +948 909 -2731360.75727 +949 909 75251.5247453 +950 909 -55832.4159336 +951 909 -6893760.43768 +952 909 929649.114512 +953 909 1056419.44831 +954 909 -2324577.161 +910 910 13789595.5493 +911 910 8526963.46189 +912 910 -7.45058059692e-9 +913 910 2189391.67462 +914 910 902841.927677 +915 910 9.31322574615e-9 +949 910 -955815.974241 +950 910 -1086154.51618 +951 910 -929649.114512 +952 910 -1698063.33368 +953 910 -676945.37624 +954 910 -148519.569575 +955 910 -1831641.90145 +956 910 -755316.248019 +957 910 1300948.03845 +911 911 6744151.21474 +912 911 1.86264514923e-8 +913 911 902841.927677 +914 911 372305.949557 +915 911 2.79396772385e-9 +949 911 -1086154.51618 +950 911 -1234266.49566 +951 911 -1056419.44831 +952 911 -676945.37624 +953 911 -252690.316209 +954 911 207978.412157 +955 911 -755316.248019 +956 911 -311470.61774 +957 911 536473.417918 +912 912 37051709.8254 +913 912 -3.72529029846e-9 +914 912 -9.31322574615e-10 +915 912 10537577.5004 +949 912 -929649.114512 +950 912 -1056419.44831 +951 912 -2324577.161 +952 912 148519.569575 +953 912 -207978.412157 +954 912 -9252258.07493 +955 912 1300948.03845 +956 912 536473.417918 +957 912 -3684182.88731 +913 913 19732335.5073 +914 913 1.49011611938e-8 +915 913 -7.45058059692e-9 +916 913 2189391.67462 +917 913 -902841.927677 +918 913 9.31322574615e-9 +952 913 -1831641.90145 +953 913 -755316.248019 +954 913 -1300948.03845 +955 913 -3460455.85927 +956 913 -2.60770320892e-8 +957 913 -5.58793544769e-9 +958 913 -1831641.90145 +959 913 755316.248019 +960 913 1300948.03845 +914 914 3355482.70929 +915 914 3.72529029846e-9 +916 914 -902841.927677 +917 914 372305.949557 +918 914 -2.79396772385e-9 +952 914 -755316.248019 +953 914 -311470.61774 +954 914 -536473.417918 +955 914 -2.23517417908e-8 +956 914 -588450.353367 +957 914 429178.734334 +958 914 755316.248019 +959 914 -311470.61774 +960 914 -536473.417918 +915 915 47437791.9854 +916 915 -3.72529029846e-9 +917 915 9.31322574615e-10 +918 915 10537577.5004 +952 915 -1300948.03845 +953 915 -536473.417918 +954 915 -3684182.88731 +955 915 3.72529029846e-9 +956 915 -429178.734334 +957 915 -12874095.835 +958 915 1300948.03845 +959 915 -536473.417918 +960 915 -3684182.88731 +916 916 13789595.5493 +917 916 -8526963.46189 +918 916 7.45058059692e-9 +919 916 -797223.130676 +920 916 905935.375768 +921 916 -1.86264514923e-9 +955 916 -1831641.90145 +956 916 755316.248019 +957 916 -1300948.03845 +958 916 -1698063.33368 +959 916 676945.37624 +960 916 148519.569575 +961 916 -955815.974241 +962 916 1086154.51618 +963 916 929649.114512 +917 917 6744151.21474 +918 917 7.45058059692e-9 +919 917 905935.375768 +920 917 -1029472.01792 +921 917 1.86264514923e-9 +955 917 755316.248019 +956 917 -311470.61774 +957 917 536473.417918 +958 917 676945.37624 +959 917 -252690.316209 +960 917 207978.412157 +961 917 1086154.51618 +962 917 -1234266.49566 +963 917 -1056419.44831 +918 918 37051709.8254 +919 918 -1.67638063431e-8 +920 918 1.86264514923e-8 +921 918 4063389.39899 +955 918 -1300948.03845 +956 918 536473.417918 +957 918 -3684182.88731 +958 918 -148519.569575 +959 918 -207978.412157 +960 918 -9252258.07493 +961 918 929649.114512 +962 918 -1056419.44831 +963 918 -2324577.161 +919 919 6563466.92161 +920 919 -8716568.29938 +921 919 5.58793544769e-8 +922 919 -4790.05038339 +923 919 7725.88771515 +924 919 -1.86264514923e-8 +958 919 -955815.974241 +959 919 1086154.51618 +960 919 -929649.114512 +961 919 -175770.085153 +962 919 298827.840693 +963 919 75251.5247453 +964 919 -570661.636677 +965 919 920421.994641 +966 919 741520.302649 +920 920 11934357.6383 +921 920 -6.70552253723e-8 +922 920 7725.88771515 +923 920 -12461.109218 +924 920 2.98023223877e-8 +958 920 1086154.51618 +959 920 -1234266.49566 +960 920 1056419.44831 +961 920 298827.840693 +962 920 -499398.232929 +963 920 55832.4159336 +964 920 920421.994641 +965 920 -1484551.60426 +966 920 -1196000.48814 +921 921 30008520.3637 +922 921 -1.11758708954e-8 +923 921 2.04890966415e-8 +924 921 6373223.13441 +958 921 -929649.114512 +959 921 1056419.44831 +960 921 -2324577.161 +961 921 -75251.5247453 +962 921 -55832.4159336 +963 921 -6893760.43768 +964 921 741520.302649 +965 921 -1196000.48814 +966 921 -2731360.75727 +922 922 4267595.81742 +923 922 -7796294.34309 +924 922 7.45058059692e-9 +925 922 -76937.634873 +926 922 167255.727985 +927 922 -1.30385160446e-8 +961 922 -570661.636677 +962 922 920421.994641 +963 922 -741520.302649 +964 922 -304176.348108 +965 922 544599.533137 +966 922 61373.985991 +967 922 -361895.781536 +968 922 786729.959862 +969 922 588085.337671 +923 923 14559614.5621 +924 923 -1.49011611938e-8 +925 923 167255.727985 +926 923 -363599.408663 +927 923 2.79396772385e-8 +961 923 920421.994641 +962 923 -1484551.60426 +963 923 1196000.48814 +964 923 544599.533137 +965 923 -995761.387374 +966 923 32978.3592395 +967 923 786729.959862 +968 923 -1710282.52144 +969 923 -1278446.38624 +924 924 32450763.4987 +925 924 -2.60770320892e-8 +926 924 5.58793544769e-8 +927 924 5787467.22392 +961 924 -741520.302649 +962 924 1196000.48814 +963 924 -2731360.75727 +964 924 -61373.985991 +965 924 -32978.3592395 +966 924 -7832517.9294 +967 924 588085.337671 +968 924 -1278446.38624 +969 924 -2616778.13471 +925 925 2722764.08058 +926 925 -6525095.96362 +927 925 4.842877388e-8 +928 925 -77037.3094959 +929 925 210101.75317 +930 925 -2.14204192162e-8 +964 925 -361895.781536 +965 925 786729.959862 +966 925 -588085.337671 +967 925 -150094.32553 +968 925 356091.902114 +969 925 41457.2556898 +970 925 -246970.319543 +971 925 673555.416935 +972 925 484442.198447 +926 926 15837837.4467 +927 926 -1.19209289551e-7 +928 926 210101.75317 +929 926 -573004.781374 +930 926 6.33299350738e-8 +964 926 786729.959862 +965 926 -1710282.52144 +966 926 1278446.38624 +967 926 356091.902114 +968 926 -855385.258209 +969 926 17103.8438088 +970 926 673555.416935 +971 926 -1836969.31891 +972 926 -1321205.99576 +927 927 31131706.3633 +928 927 -3.16649675369e-8 +929 927 8.56816768646e-8 +930 927 5508023.65257 +964 927 -588085.337671 +965 927 1278446.38624 +966 927 -2616778.13471 +967 927 -41457.2556898 +968 927 -17103.8438089 +969 927 -7353984.06298 +970 927 484442.198447 +971 927 -1321205.99576 +972 927 -2564546.07772 +928 928 1902223.18074 +929 928 -5590205.99024 +930 928 4.09781932831e-8 +967 928 -246970.319543 +968 928 673555.416935 +969 928 -484442.198447 +970 928 -89281.9039062 +971 928 261158.775213 +972 928 27106.375452 +973 928 -183325.791023 +974 928 591373.519429 +975 928 416676.259817 +929 929 16543837.5893 +930 929 -1.11758708954e-7 +967 929 673555.416935 +968 929 -1836969.31891 +969 929 1321205.99576 +970 929 261158.775213 +971 929 -769227.57174 +972 929 9164.38855485 +973 929 591373.519429 +974 929 -1907656.51429 +975 929 -1344116.96715 +930 930 30501291.4656 +967 930 -484442.198447 +968 930 1321205.99576 +969 930 -2564546.07772 +970 930 -27106.375452 +971 930 -9164.38855492 +972 930 -7121142.78387 +973 930 416676.259817 +974 930 -1344116.96715 +975 930 -2538358.87127 +931 931 983097.51761 +932 931 3993191.05725 +933 931 -4.842877388e-8 +934 931 -268071.177508 +935 931 -1017991.81332 +936 931 8.38190317154e-9 +982 931 22134.9913964 +983 931 90320.9940531 +984 931 -18909.0650259 +985 931 -144050.092155 +986 931 -547025.666412 +987 931 358351.461509 +932 932 16310675.5472 +933 932 -2.01165676117e-7 +934 932 -1017991.81332 +935 932 -3865791.69616 +936 932 2.60770320892e-8 +982 932 90320.9940531 +983 932 370626.696215 +984 932 4631.25243447 +985 932 -547025.666412 +986 932 -2077312.65726 +987 932 1360828.33484 +933 933 19175351.0344 +934 933 1.210719347e-8 +935 933 4.47034835815e-8 +936 933 1324183.34296 +982 933 18909.0650259 +983 933 -4631.25243456 +984 933 -5293544.01962 +985 933 358351.461509 +986 933 1360828.33484 +987 933 -2284273.33935 +934 934 2528206.57902 +935 934 4472508.77878 +936 934 -1.49011611938e-8 +937 934 161794.959894 +938 934 -1643725.47145 +940 934 -354732.167298 +941 934 -1144297.31386 +942 934 6.51925802231e-9 +982 934 -144050.092155 +983 934 -547025.666412 +984 934 -358351.461509 +985 934 -474420.971735 +986 934 131724.797328 +987 934 -23329.9193232 +988 934 800256.904552 +989 934 8988441.97885 +991 934 -193836.559394 +992 934 -625279.223852 +993 934 416676.259817 +935 935 16817023.5501 +936 935 -5.21540641785e-8 +937 935 2239699.42799 +938 935 -161794.959894 +940 935 -1144297.31386 +941 935 -3691281.65763 +942 935 1.86264514923e-8 +982 935 -547025.666412 +983 935 -2077312.65726 +984 935 -1360828.33484 +985 935 131724.797328 +986 935 -28174.6046026 +987 935 6684.54707693 +988 935 -6040684.68178 +989 935 -800256.904552 +991 935 -625279.223852 +992 935 -2017029.75436 +993 935 1344116.96715 +936 936 39001825.1235 +940 936 1.02445483208e-8 +941 936 3.35276126862e-8 +942 936 1397983.15475 +982 936 -358351.461509 +983 936 -1360828.33484 +984 936 -2284273.33935 +985 936 23329.9193232 +986 936 -6684.54707697 +987 936 -14301137.6219 +991 936 416676.259817 +992 936 1344116.96715 +993 936 -2296979.40748 +937 937 329627273.449 +938 937 65098710.708 +985 937 -800256.904552 +986 937 6040684.68178 +988 937 64525494.457 +989 937 -4237812.99363 +938 938 569419268.28 +985 938 -8988441.97885 +986 938 800256.904552 +988 938 -4237812.99363 +989 938 48915452.1011 +939 939 790573.476703 +990 939 -357777.777778 +940 940 1768961.88645 +941 940 5200497.8108 +942 940 -3.53902578354e-8 +943 940 -465133.879389 +944 940 -1268546.94379 +945 940 2.23517417908e-8 +985 940 -193836.559394 +986 940 -625279.223852 +987 940 -416676.259817 +991 940 24667.0078013 +992 940 73754.1287477 +993 940 -27106.375452 +994 940 -260348.273704 +995 940 -710040.746465 +996 940 484442.198447 +941 941 15396260.6937 +942 941 -1.19209289551e-7 +943 941 -1268546.94379 +944 941 -3459673.48306 +945 941 5.96046447754e-8 +985 941 -625279.223852 +986 941 -2017029.75436 +987 941 -1344116.96715 +991 941 73754.1287477 +992 941 222052.369366 +993 941 9164.38855485 +994 941 -710040.746465 +995 941 -1936474.76309 +996 941 1321205.99576 +942 942 19430253.1852 +943 942 2.14204192162e-8 +944 942 5.58793544769e-8 +945 942 1501024.18544 +985 942 -416676.259817 +986 942 -1344116.96715 +987 942 -2296979.40748 +991 942 27106.375452 +992 942 -9164.38855489 +993 942 -5492991.14412 +994 942 484442.198447 +995 942 1321205.99576 +996 942 -2315242.24089 +943 943 2497002.01247 +944 943 5989724.5569 +945 943 -5.58793544769e-8 +946 943 -645500.420471 +947 943 -1403261.78363 +948 943 2.79396772385e-8 +991 943 -260348.273704 +992 943 -710040.746465 +993 943 -484442.198447 +994 943 12227.6197724 +995 943 33038.3525625 +996 943 -41457.2556898 +997 943 -379286.632065 +998 943 -824536.156663 +999 943 588085.337671 +944 944 14552393.0113 +945 944 -1.34110450745e-7 +946 944 -1403261.78363 +947 944 -3050569.09485 +948 944 6.14672899246e-8 +991 944 -710040.746465 +992 944 -1936474.76309 +993 944 -1321205.99576 +994 944 33038.3525625 +995 944 89431.3340668 +996 944 17103.8438088 +997 944 -824536.156663 +998 944 -1792469.90579 +999 944 1278446.38624 +945 945 19697338.3132 +946 945 2.79396772385e-8 +947 945 6.14672899246e-8 +948 945 1699467.28443 +991 945 -484442.198447 +992 945 -1321205.99576 +993 945 -2315242.24089 +994 945 41457.2556898 +995 945 -17103.8438089 +996 945 -5695176.55864 +997 945 588085.337671 +998 945 1278446.38624 +999 945 -2352102.70813 +946 946 3805513.9161 +947 946 6969546.89216 +948 946 -5.21540641785e-8 +949 946 -900913.14915 +950 946 -1453085.72444 +951 946 2.23517417908e-8 +994 946 -379286.632065 +995 946 -824536.156663 +996 946 -588085.337671 +997 946 -52167.0393844 +998 946 -83826.4031559 +999 946 -61373.985991 +1000 946 -590912.90871 +1001 946 -953085.336629 +1002 946 741520.302649 +947 947 13049076.8844 +948 947 -1.04308128357e-7 +949 947 -1453085.72444 +950 947 -2343686.65232 +951 947 3.91155481339e-8 +994 947 -824536.156663 +995 947 -1792469.90579 +996 947 -1278446.38624 +997 947 -83826.4031559 +998 947 -134521.304432 +999 947 32978.3592395 +1000 947 -953085.336629 +1001 947 -1537234.41392 +1002 947 1196000.48814 +948 948 20269767.9526 +949 948 1.49011611938e-8 +950 948 2.421438694e-8 +951 948 2107431.22341 +994 948 -588085.337671 +995 948 -1278446.38624 +996 948 -2352102.70813 +997 948 61373.985991 +998 948 -32978.3592395 +999 948 -6109264.54972 +1000 948 741520.302649 +1001 948 1196000.48814 +1002 948 -2434642.38116 +949 949 6311393.43185 +950 949 8279110.50413 +951 949 -1.11758708954e-8 +952 949 -2301041.15788 +953 949 -2614819.49759 +954 949 9.31322574615e-9 +997 949 -590912.90871 +998 949 -953085.336629 +999 949 -741520.302649 +1000 949 222027.677811 +1001 949 227177.812693 +1002 949 -75251.5247453 +1003 949 -1038306.19785 +1004 949 -1179893.40665 +1005 949 929649.114512 +950 950 11193680.9464 +951 950 -1.49011611938e-8 +952 950 -2614819.49759 +953 950 -2971385.79271 +954 950 1.30385160446e-8 +997 950 -953085.336629 +998 950 -1537234.41392 +999 950 -1196000.48814 +1000 950 227177.812693 +1001 950 217630.207531 +1002 950 55832.4159336 +1003 950 -1179893.40665 +1004 950 -1340787.9621 +1005 950 1056419.44831 +951 951 19292741.7183 +952 951 1.49011611938e-8 +953 951 1.67638063431e-8 +954 951 427942.721781 +997 951 -741520.302649 +998 951 -1196000.48814 +999 951 -2434642.38116 +1000 951 75251.5247453 +1001 951 -55832.4159336 +1002 951 -5287984.36193 +1003 951 929649.114512 +1004 951 1056419.44831 +1005 951 -2155790.5645 +952 952 11173430.2083 +953 952 7495059.08719 +954 952 -3.72529029846e-8 +955 952 -678836.974673 +956 952 -279932.773061 +957 952 3.72529029846e-9 +1000 952 -1038306.19785 +1001 952 -1179893.40665 +1002 952 -929649.114512 +1003 952 -908773.635179 +1004 952 -175831.894858 +1005 952 -148519.569575 +1006 952 -1760951.03338 +1007 952 -726165.37459 +1008 952 1300948.03845 +953 953 6371949.42588 +954 953 -3.72529029846e-8 +955 953 -279932.773061 +956 953 -115436.195077 +957 953 2.79396772385e-9 +1000 953 -1179893.40665 +1001 953 -1340787.9621 +1002 953 -1056419.44831 +1003 953 -175831.894858 +1004 953 153537.59263 +1005 953 207978.412157 +1006 953 -726165.37459 +1007 953 -299449.639006 +1008 953 536473.417918 +954 954 22658086.7563 +955 954 -5.58793544769e-9 +956 954 -3.72529029846e-9 +957 954 4790763.62708 +1000 954 -929649.114512 +1001 954 -1056419.44831 +1002 954 -2155790.5645 +1003 954 148519.569575 +1004 954 -207978.412157 +1005 954 -7295491.64648 +1006 954 1300948.03845 +1007 954 536473.417918 +1008 954 -3164492.7709 +955 955 14370371.7322 +956 955 5.21540641785e-8 +957 955 -7.45058059692e-9 +958 955 -678836.974673 +959 955 279932.773061 +960 955 3.72529029846e-9 +1003 955 -1760951.03338 +1004 955 -726165.37459 +1005 955 -1300948.03845 +1006 955 -2367056.05396 +1007 955 -1.67638063431e-8 +1008 955 -5.58793544769e-9 +1009 955 -1760951.03338 +1010 955 726165.37459 +1011 955 1300948.03845 +956 956 2443681.02578 +957 956 1.49011611938e-8 +958 956 279932.773061 +959 956 -115436.195077 +960 956 -2.79396772385e-9 +1003 956 -726165.37459 +1004 956 -299449.639006 +1005 956 -536473.417918 +1006 956 -2.04890966415e-8 +1007 956 -402517.768767 +1008 956 429178.734334 +1009 956 726165.37459 +1010 956 -299449.639006 +1011 956 -536473.417918 +957 957 27394702.6193 +958 957 -5.58793544769e-9 +959 957 3.72529029846e-9 +960 957 4790763.62708 +1003 957 -1300948.03845 +1004 957 -536473.417918 +1005 957 -3164492.7709 +1007 957 -429178.734334 +1008 957 -10404782.7221 +1009 957 1300948.03845 +1010 957 -536473.417918 +1011 957 -3164492.7709 +958 958 11173430.2083 +959 958 -7495059.08719 +960 958 1.49011611938e-8 +961 958 -2301041.15788 +962 958 2614819.49759 +963 958 -7.45058059692e-9 +1006 958 -1760951.03338 +1007 958 726165.37459 +1008 958 -1300948.03845 +1009 958 -908773.635179 +1010 958 175831.894858 +1011 958 148519.569575 +1012 958 -1038306.19785 +1013 958 1179893.40665 +1014 958 929649.114512 +959 959 6371949.42588 +960 959 -1.49011611938e-8 +961 959 2614819.49759 +962 959 -2971385.79271 +963 959 7.45058059692e-9 +1006 959 726165.37459 +1007 959 -299449.639006 +1008 959 536473.417918 +1009 959 175831.894858 +1010 959 153537.59263 +1011 959 207978.412157 +1012 959 1179893.40665 +1013 959 -1340787.9621 +1014 959 -1056419.44831 +960 960 22658086.7563 +961 960 -7.45058059692e-9 +962 960 7.45058059692e-9 +963 960 427942.721781 +1006 960 -1300948.03845 +1007 960 536473.417918 +1008 960 -3164492.7709 +1009 960 -148519.569575 +1010 960 -207978.412157 +1011 960 -7295491.64648 +1012 960 929649.114512 +1013 960 -1056419.44831 +1014 960 -2155790.5645 +961 961 6311393.43185 +962 961 -8279110.50413 +964 961 -900913.14915 +965 961 1453085.72444 +966 961 -1.30385160446e-8 +1009 961 -1038306.19785 +1010 961 1179893.40665 +1011 961 -929649.114512 +1012 961 222027.677811 +1013 961 -227177.812693 +1014 961 75251.5247453 +1015 961 -590912.90871 +1016 961 953085.336629 +1017 961 741520.302649 +962 962 11193680.9464 +964 962 1453085.72444 +965 962 -2343686.65232 +966 962 1.86264514923e-8 +1009 962 1179893.40665 +1010 962 -1340787.9621 +1011 962 1056419.44831 +1012 962 -227177.812693 +1013 962 217630.207531 +1014 962 55832.4159336 +1015 962 953085.336629 +1016 962 -1537234.41392 +1017 962 -1196000.48814 +963 963 19292741.7183 +964 963 -2.60770320892e-8 +965 963 4.47034835815e-8 +966 963 2107431.22341 +1009 963 -929649.114512 +1010 963 1056419.44831 +1011 963 -2155790.5645 +1012 963 -75251.5247453 +1013 963 -55832.4159336 +1014 963 -5287984.36193 +1015 963 741520.302649 +1016 963 -1196000.48814 +1017 963 -2434642.38116 +964 964 3805513.9161 +965 964 -6969546.89216 +966 964 4.47034835815e-8 +967 964 -645500.420471 +968 964 1403261.78363 +969 964 -1.86264514923e-8 +1012 964 -590912.90871 +1013 964 953085.336629 +1014 964 -741520.302649 +1015 964 -52167.0393844 +1016 964 83826.4031559 +1017 964 61373.985991 +1018 964 -379286.632065 +1019 964 824536.156663 +1020 964 588085.337671 +965 965 13049076.8844 +966 965 -8.19563865662e-8 +967 965 1403261.78363 +968 965 -3050569.09485 +969 965 4.09781932831e-8 +1012 965 953085.336629 +1013 965 -1537234.41392 +1014 965 1196000.48814 +1015 965 83826.4031559 +1016 965 -134521.304432 +1017 965 32978.3592395 +1018 965 824536.156663 +1019 965 -1792469.90579 +1020 965 -1278446.38624 +966 966 20269767.9526 +967 966 -2.51457095146e-8 +968 966 5.40167093277e-8 +969 966 1699467.28443 +1012 966 -741520.302649 +1013 966 1196000.48814 +1014 966 -2434642.38116 +1015 966 -61373.985991 +1016 966 -32978.3592395 +1017 966 -6109264.54972 +1018 966 588085.337671 +1019 966 -1278446.38624 +1020 966 -2352102.70813 +967 967 2497002.01247 +968 967 -5989724.5569 +969 967 4.47034835815e-8 +970 967 -465133.879389 +971 967 1268546.94379 +972 967 -2.51457095146e-8 +1015 967 -379286.632065 +1016 967 824536.156663 +1017 967 -588085.337671 +1018 967 12227.6197724 +1019 967 -33038.3525625 +1020 967 41457.2556898 +1021 967 -260348.273704 +1022 967 710040.746465 +1023 967 484442.198447 +968 968 14552393.0113 +969 968 -1.19209289551e-7 +970 968 1268546.94379 +971 968 -3459673.48306 +972 968 7.07805156708e-8 +1015 968 824536.156663 +1016 968 -1792469.90579 +1017 968 1278446.38624 +1018 968 -33038.3525625 +1019 968 89431.3340668 +1020 968 17103.8438088 +1021 968 710040.746465 +1022 968 -1936474.76309 +1023 968 -1321205.99576 +969 969 19697338.3132 +970 969 -2.79396772385e-8 +971 969 7.82310962677e-8 +972 969 1501024.18544 +1015 969 -588085.337671 +1016 969 1278446.38624 +1017 969 -2352102.70813 +1018 969 -41457.2556898 +1019 969 -17103.8438089 +1020 969 -5695176.55864 +1021 969 484442.198447 +1022 969 -1321205.99576 +1023 969 -2315242.24089 +970 970 1768961.88645 +971 970 -5200497.8108 +972 970 4.28408384323e-8 +973 970 -354732.167298 +974 970 1144297.31386 +975 970 -1.02445483208e-8 +1018 970 -260348.273704 +1019 970 710040.746465 +1020 970 -484442.198447 +1021 970 24667.0078013 +1022 970 -73754.1287477 +1023 970 27106.375452 +1024 970 -193836.559394 +1025 970 625279.223852 +1026 970 416676.259817 +971 971 15396260.6937 +972 971 -1.26659870148e-7 +973 971 1144297.31386 +974 971 -3691281.65763 +975 971 4.09781932831e-8 +1018 971 710040.746465 +1019 971 -1936474.76309 +1020 971 1321205.99576 +1021 971 -73754.1287477 +1022 971 222052.369366 +1023 971 9164.38855486 +1024 971 625279.223852 +1025 971 -2017029.75436 +1026 971 -1344116.96715 +972 972 19430253.1852 +973 972 -7.45058059692e-9 +974 972 2.23517417908e-8 +975 972 1397983.15475 +1018 972 -484442.198447 +1019 972 1321205.99576 +1020 972 -2315242.24089 +1021 972 -27106.375452 +1022 972 -9164.38855491 +1023 972 -5492991.14412 +1024 972 416676.259817 +1025 972 -1344116.96715 +1026 972 -2296979.40748 +973 973 2528206.97157 +974 973 -4472509.50178 +975 973 1.86264514923e-8 +976 973 -161793.620953 +977 973 -1643724.74446 +979 973 -268071.177508 +980 973 1017991.81332 +981 973 -1.02445483208e-8 +1021 973 -193836.559394 +1022 973 625279.223852 +1023 973 -416676.259817 +1024 973 -474421.1715 +1025 973 -131724.429408 +1026 973 23329.9193232 +1027 973 -800250.281991 +1028 973 8988445.57462 +1030 973 -144050.092155 +1031 973 547025.666412 +1032 973 358351.461509 +974 974 16817023.1576 +975 974 -6.70552253723e-8 +976 974 2239700.15498 +977 974 161793.620953 +979 974 1017991.81332 +980 974 -3865791.69616 +981 974 4.09781932831e-8 +1021 974 625279.223852 +1022 974 -2017029.75436 +1023 974 1344116.96715 +1024 974 -131724.429408 +1025 974 -28174.4048378 +1026 974 6684.54707694 +1027 974 -6040681.08601 +1028 974 800250.281991 +1030 974 547025.666412 +1031 974 -2077312.65726 +1032 974 -1360828.33484 +975 975 39001825.1235 +979 975 -1.02445483208e-8 +980 975 3.35276126862e-8 +981 975 1324183.34296 +1021 975 -416676.259817 +1022 975 1344116.96715 +1023 975 -2296979.40748 +1024 975 -23329.9193232 +1025 975 -6684.54707699 +1026 975 -14301137.6219 +1030 975 358351.461509 +1031 975 -1360828.33484 +1032 975 -2284273.33935 +976 976 329626980.943 +977 976 -65098171.9808 +1024 976 800250.281991 +1025 976 6040681.08601 +1027 976 64525513.4986 +1028 976 4237777.92342 +977 977 569419560.785 +1024 977 -8988445.57462 +1025 977 -800250.281991 +1027 977 4237777.92342 +1028 977 48915433.0595 +978 978 790573.476703 +1029 978 -357777.777778 +979 979 983097.51761 +980 979 -3993191.05725 +981 979 6.14672899246e-8 +1024 979 -144050.092155 +1025 979 547025.666412 +1026 979 -358351.461509 +1030 979 22134.9913964 +1031 979 -90320.9940531 +1032 979 18909.0650259 +980 980 16310675.5472 +981 980 -2.53319740295e-7 +1024 980 547025.666412 +1025 980 -2077312.65726 +1026 980 1360828.33484 +1030 980 -90320.9940531 +1031 980 370626.696215 +1032 980 4631.25243446 +981 981 19175351.0344 +1024 981 -358351.461509 +1025 981 1360828.33484 +1026 981 -2284273.33935 +1030 981 -18909.0650259 +1031 981 -4631.25243459 +1032 981 -5293544.01962 +982 982 1011851.60912 +983 982 4110093.43272 +984 982 -4.65661287308e-8 +985 982 -311975.890718 +986 982 -1184718.57235 +987 982 1.02445483208e-8 +1033 982 22134.9913964 +1034 982 90320.9940531 +1035 982 -18909.0650259 +1036 982 -144050.092155 +1037 982 -547025.666412 +1038 982 358351.461509 +983 983 16788621.6609 +984 983 -2.01165676117e-7 +985 983 -1184718.57235 +986 983 -4498931.28739 +987 983 3.35276126862e-8 +1033 983 90320.9940531 +1034 983 370626.696215 +1035 983 4631.25243447 +1036 983 -547025.666412 +1037 983 -2077312.65726 +1038 983 1360828.33484 +984 984 18240145.4814 +985 984 1.02445483208e-8 +986 984 3.35276126862e-8 +987 984 758227.341129 +1033 984 18909.0650259 +1034 984 -4631.25243456 +1035 984 -5293544.01962 +1036 984 358351.461509 +1037 984 1360828.33484 +1038 984 -2284273.33935 +985 985 2350262.38096 +986 985 4600302.12491 +987 985 -2.421438694e-8 +988 985 2.98023223877e-8 +989 985 -1.19209289551e-7 +991 985 -413671.243673 +992 985 -1334423.36669 +993 985 1.58324837685e-8 +1033 985 -144050.092155 +1034 985 -547025.666412 +1035 985 -358351.461509 +1036 985 -474420.971735 +1037 985 131724.797328 +1038 985 -23329.9193232 +1039 985 800256.904552 +1040 985 8988441.97885 +1042 985 -193836.559394 +1043 985 -625279.223852 +1044 985 416676.259817 +986 986 17048556.8253 +987 986 -8.19563865662e-8 +988 986 5.96046447754e-8 +991 986 -1334423.36669 +992 986 -4304591.50545 +993 986 4.842877388e-8 +1033 986 -547025.666412 +1034 986 -2077312.65726 +1035 986 -1360828.33484 +1036 986 131724.797328 +1037 986 -28174.6046026 +1038 986 6684.54707693 +1039 986 -6040684.68178 +1040 986 -800256.904552 +1042 986 -625279.223852 +1043 986 -2017029.75436 +1044 986 1344116.96715 +987 987 36176122.0894 +991 987 1.39698386192e-8 +992 987 4.09781932831e-8 +993 987 830431.306933 +1033 987 -358351.461509 +1034 987 -1360828.33484 +1035 987 -2284273.33935 +1036 987 23329.9193232 +1037 987 -6684.54707697 +1038 987 -14301137.6219 +1042 987 416676.259817 +1043 987 1344116.96715 +1044 987 -2296979.40748 +988 988 305878308.174 +989 988 66094123.115 +1036 988 -800256.904552 +1037 988 6040684.68178 +1039 988 64525494.457 +1040 988 -4237812.99363 +989 989 549336918.275 +1036 989 -8988441.97885 +1037 989 800256.904552 +1039 989 -4237812.99363 +1040 989 48915452.1011 +990 990 715555.555556 +1041 990 -357777.777778 +991 991 1816739.3315 +992 991 5341279.87864 +993 991 -3.72529029846e-8 +994 991 -544032.43723 +995 991 -1483724.82881 +996 991 2.23517417908e-8 +1036 991 -193836.559394 +1037 991 -625279.223852 +1038 991 -416676.259817 +1042 991 24667.0078013 +1043 991 73754.1287477 +1044 991 -27106.375452 +1045 991 -260348.273704 +1046 991 -710040.746465 +1047 991 484442.198447 +992 992 15814018.062 +993 992 -1.19209289551e-7 +994 992 -1483724.82881 +995 992 -4046522.26039 +996 992 5.96046447754e-8 +1036 992 -625279.223852 +1037 992 -2017029.75436 +1038 992 -1344116.96715 +1042 992 73754.1287477 +1043 992 222052.369366 +1044 992 9164.38855485 +1045 992 -710040.746465 +1046 992 -1936474.76309 +1047 992 1321205.99576 +993 993 18448886.5844 +994 993 1.95577740669e-8 +995 993 5.21540641785e-8 +996 993 931107.693646 +1036 993 -416676.259817 +1037 993 -1344116.96715 +1038 993 -2296979.40748 +1042 993 27106.375452 +1043 993 -9164.38855489 +1044 993 -5492991.14412 +1045 993 484442.198447 +1046 993 1321205.99576 +1047 993 -2315242.24089 +994 994 2558539.62181 +995 994 6138307.60949 +996 994 -5.21540641785e-8 +997 994 -759692.612592 +998 994 -1651505.67955 +999 994 2.98023223877e-8 +1042 994 -260348.273704 +1043 994 -710040.746465 +1044 994 -484442.198447 +1045 994 12227.6197724 +1046 994 33038.3525625 +1047 994 -41457.2556898 +1048 994 -379286.632065 +1049 994 -824536.156663 +1050 994 588085.337671 +995 995 14915778.6682 +996 995 -1.26659870148e-7 +997 995 -1651505.67955 +998 995 -3590229.73815 +999 995 6.33299350738e-8 +1042 995 -710040.746465 +1043 995 -1936474.76309 +1044 995 -1321205.99576 +1045 995 33038.3525625 +1046 995 89431.3340668 +1047 995 17103.8438088 +1048 995 -824536.156663 +1049 995 -1792469.90579 +1050 995 1278446.38624 +996 996 18669379.7869 +997 996 2.79396772385e-8 +998 996 6.14672899246e-8 +999 996 1124555.53479 +1042 996 -484442.198447 +1043 996 -1321205.99576 +1044 996 -2315242.24089 +1045 996 41457.2556898 +1046 996 -17103.8438089 +1047 996 -5695176.55864 +1048 996 588085.337671 +1049 996 1278446.38624 +1050 996 -2352102.70813 +997 997 3880798.16119 +998 997 7110485.96967 +999 997 -4.842877388e-8 +1000 997 -1076372.38828 +1001 997 -1736084.49722 +1002 997 2.60770320892e-8 +1045 997 -379286.632065 +1046 997 -824536.156663 +1047 997 -588085.337671 +1048 997 -52167.0393844 +1049 997 -83826.403156 +1050 997 -61373.985991 +1051 997 -590912.90871 +1052 997 -953085.336629 +1053 997 741520.302649 +998 998 13318817.2723 +999 998 -9.685754776e-8 +1000 998 -1736084.49722 +1001 998 -2800136.28584 +1002 998 4.09781932831e-8 +1045 998 -824536.156663 +1046 998 -1792469.90579 +1047 998 -1278446.38624 +1048 998 -83826.403156 +1049 998 -134521.304432 +1050 998 32978.3592395 +1051 998 -953085.336629 +1052 998 -1537234.41392 +1053 998 1196000.48814 +999 999 19146980.3477 +1000 999 1.67638063431e-8 +1001 999 2.98023223877e-8 +1002 999 1520483.39551 +1045 999 -588085.337671 +1046 999 -1278446.38624 +1047 999 -2352102.70813 +1048 999 61373.985991 +1049 999 -32978.3592395 +1050 999 -6109264.54972 +1051 999 741520.302649 +1052 999 1196000.48814 +1053 999 -2434642.38116 +1000 1000 6516876.42304 +1001 1000 8531914.96891 +1002 1000 -1.11758708954e-8 +1003 1000 -2626121.17726 +1004 1000 -2984228.61052 +1005 1000 9.31322574615e-9 +1048 1000 -590912.90871 +1049 1000 -953085.336629 +1050 1000 -741520.302649 +1051 1000 222027.67781 +1052 1000 227177.812693 +1053 1000 -75251.5247453 +1054 1000 -1038306.19785 +1055 1000 -1179893.40665 +1056 1000 929649.114512 +1001 1001 11512089.4984 +1002 1001 -2.23517417908e-8 +1003 1001 -2984228.61052 +1004 1001 -3391168.87559 +1005 1001 1.11758708954e-8 +1048 1001 -953085.336629 +1049 1001 -1537234.41392 +1050 1001 -1196000.48814 +1051 1001 227177.812693 +1052 1001 217630.207531 +1053 1001 55832.4159336 +1054 1001 -1179893.40665 +1055 1001 -1340787.9621 +1056 1001 1056419.44831 +1002 1002 18361731.7736 +1003 1002 3.72529029846e-9 +1004 1002 5.58793544769e-9 +1005 1002 -125380.553908 +1048 1002 -741520.302649 +1049 1002 -1196000.48814 +1050 1002 -2434642.38116 +1051 1002 75251.5247453 +1052 1002 -55832.4159336 +1053 1002 -5287984.36193 +1054 1002 929649.114512 +1055 1002 1056419.44831 +1056 1002 -2155790.5645 +1003 1003 11197028.9194 +1004 1003 7624235.1212 +1005 1003 -1.49011611938e-8 +1006 1003 -1154846.00933 +1007 1003 -476225.158488 +1008 1003 9.31322574615e-9 +1051 1003 -1038306.19785 +1052 1003 -1179893.40665 +1053 1003 -929649.114512 +1054 1003 -908773.635179 +1055 1003 -175831.894858 +1056 1003 -148519.569575 +1057 1003 -1760951.03338 +1058 1003 -726165.37459 +1059 1003 1300948.03845 +1004 1004 6560950.4012 +1005 1004 -7.45058059692e-9 +1006 1004 -476225.158488 +1007 1004 -196381.508655 +1008 1004 3.72529029846e-9 +1051 1004 -1179893.40665 +1052 1004 -1340787.9621 +1053 1004 -1056419.44831 +1054 1004 -175831.894858 +1055 1004 153537.59263 +1056 1004 207978.412157 +1057 1004 -726165.37459 +1058 1004 -299449.639006 +1059 1004 536473.417918 +1005 1005 21281133.3311 +1006 1005 1.86264514923e-9 +1007 1005 9.31322574615e-10 +1008 1005 4075797.18655 +1051 1005 -929649.114512 +1052 1005 -1056419.44831 +1053 1005 -2155790.5645 +1054 1005 148519.569575 +1055 1005 -207978.412157 +1056 1005 -7295491.64648 +1057 1005 1300948.03845 +1058 1005 536473.417918 +1059 1005 -3164492.7709 +1006 1006 14087608.2601 +1007 1006 4.47034835815e-8 +1008 1006 -7.45058059692e-9 +1009 1006 -1154846.00933 +1010 1006 476225.158488 +1011 1006 9.31322574615e-9 +1054 1006 -1760951.03338 +1055 1006 -726165.37459 +1056 1006 -1300948.03845 +1057 1006 -2367056.05396 +1058 1006 -1.86264514923e-8 +1059 1006 -5.58793544769e-9 +1060 1006 -1760951.03338 +1061 1006 726165.37459 +1062 1006 1300948.03845 +1007 1007 2395597.11087 +1008 1007 7.45058059692e-9 +1009 1007 476225.158488 +1010 1007 -196381.508655 +1011 1007 -3.72529029846e-9 +1054 1007 -726165.37459 +1055 1007 -299449.639006 +1056 1007 -536473.417918 +1057 1007 -2.04890966415e-8 +1058 1007 -402517.768767 +1059 1007 429178.734334 +1060 1007 726165.37459 +1061 1007 -299449.639006 +1062 1007 -536473.417918 +1008 1008 25315942.1547 +1009 1008 1.86264514923e-9 +1010 1008 -9.31322574615e-10 +1011 1008 4075797.18655 +1054 1008 -1300948.03845 +1055 1008 -536473.417918 +1056 1008 -3164492.7709 +1057 1008 3.72529029846e-9 +1058 1008 -429178.734334 +1059 1008 -10404782.7221 +1060 1008 1300948.03845 +1061 1008 -536473.417918 +1062 1008 -3164492.7709 +1009 1009 11197028.9194 +1010 1009 -7624235.1212 +1011 1009 1.49011611938e-8 +1012 1009 -2626121.17726 +1013 1009 2984228.61052 +1014 1009 -9.31322574615e-9 +1057 1009 -1760951.03338 +1058 1009 726165.37459 +1059 1009 -1300948.03845 +1060 1009 -908773.635179 +1061 1009 175831.894858 +1062 1009 148519.569575 +1063 1009 -1038306.19785 +1064 1009 1179893.40665 +1065 1009 929649.114512 +1010 1010 6560950.4012 +1011 1010 -7.45058059692e-9 +1012 1010 2984228.61052 +1013 1010 -3391168.87559 +1014 1010 9.31322574615e-9 +1057 1010 726165.37459 +1058 1010 -299449.639006 +1059 1010 536473.417918 +1060 1010 175831.894858 +1061 1010 153537.59263 +1062 1010 207978.412157 +1063 1010 1179893.40665 +1064 1010 -1340787.9621 +1065 1010 -1056419.44831 +1011 1011 21281133.3311 +1012 1011 -1.67638063431e-8 +1013 1011 1.67638063431e-8 +1014 1011 -125380.553908 +1057 1011 -1300948.03845 +1058 1011 536473.417918 +1059 1011 -3164492.7709 +1060 1011 -148519.569575 +1061 1011 -207978.412157 +1062 1011 -7295491.64648 +1063 1011 929649.114512 +1064 1011 -1056419.44831 +1065 1011 -2155790.5645 +1012 1012 6516876.42304 +1013 1012 -8531914.96891 +1014 1012 2.98023223877e-8 +1015 1012 -1076372.38828 +1016 1012 1736084.49722 +1017 1012 -1.30385160446e-8 +1060 1012 -1038306.19785 +1061 1012 1179893.40665 +1062 1012 -929649.114512 +1063 1012 222027.677811 +1064 1012 -227177.812693 +1065 1012 75251.5247453 +1066 1012 -590912.90871 +1067 1012 953085.336629 +1068 1012 741520.302649 +1013 1013 11512089.4984 +1014 1013 -3.72529029846e-8 +1015 1013 1736084.49722 +1016 1013 -2800136.28584 +1017 1013 2.23517417908e-8 +1060 1013 1179893.40665 +1061 1013 -1340787.9621 +1062 1013 1056419.44831 +1063 1013 -227177.812693 +1064 1013 217630.207531 +1065 1013 55832.4159336 +1066 1013 953085.336629 +1067 1013 -1537234.41392 +1068 1013 -1196000.48814 +1014 1014 18361731.7736 +1015 1014 -2.23517417908e-8 +1016 1014 3.53902578354e-8 +1017 1014 1520483.39551 +1060 1014 -929649.114512 +1061 1014 1056419.44831 +1062 1014 -2155790.5645 +1063 1014 -75251.5247453 +1064 1014 -55832.4159336 +1065 1014 -5287984.36193 +1066 1014 741520.302649 +1067 1014 -1196000.48814 +1068 1014 -2434642.38116 +1015 1015 3880798.16119 +1016 1015 -7110485.96967 +1017 1015 4.09781932831e-8 +1018 1015 -759692.612592 +1019 1015 1651505.67955 +1020 1015 -1.86264514923e-8 +1063 1015 -590912.90871 +1064 1015 953085.336629 +1065 1015 -741520.302649 +1066 1015 -52167.0393844 +1067 1015 83826.403156 +1068 1015 61373.985991 +1069 1015 -379286.632065 +1070 1015 824536.156663 +1071 1015 588085.337671 +1016 1016 13318817.2723 +1017 1016 -7.45058059692e-8 +1018 1016 1651505.67955 +1019 1016 -3590229.73815 +1020 1016 4.09781932831e-8 +1063 1016 953085.336629 +1064 1016 -1537234.41392 +1065 1016 1196000.48814 +1066 1016 83826.403156 +1067 1016 -134521.304432 +1068 1016 32978.3592395 +1069 1016 824536.156663 +1070 1016 -1792469.90579 +1071 1016 -1278446.38624 +1017 1017 19146980.3477 +1018 1017 -2.32830643654e-8 +1019 1017 5.02914190292e-8 +1020 1017 1124555.53479 +1063 1017 -741520.302649 +1064 1017 1196000.48814 +1065 1017 -2434642.38116 +1066 1017 -61373.985991 +1067 1017 -32978.3592395 +1068 1017 -6109264.54972 +1069 1017 588085.337671 +1070 1017 -1278446.38624 +1071 1017 -2352102.70813 +1018 1018 2558539.62181 +1019 1018 -6138307.60949 +1020 1018 4.09781932831e-8 +1021 1018 -544032.43723 +1022 1018 1483724.82881 +1023 1018 -2.51457095146e-8 +1066 1018 -379286.632065 +1067 1018 824536.156663 +1068 1018 -588085.337671 +1069 1018 12227.6197724 +1070 1018 -33038.3525625 +1071 1018 41457.2556898 +1072 1018 -260348.273704 +1073 1018 710040.746465 +1074 1018 484442.198447 +1019 1019 14915778.6682 +1020 1019 -1.04308128357e-7 +1021 1019 1483724.82881 +1022 1019 -4046522.26039 +1023 1019 7.07805156708e-8 +1066 1019 824536.156663 +1067 1019 -1792469.90579 +1068 1019 1278446.38624 +1069 1019 -33038.3525625 +1070 1019 89431.3340668 +1071 1019 17103.8438088 +1072 1019 710040.746465 +1073 1019 -1936474.76309 +1074 1019 -1321205.99576 +1020 1020 18669379.7869 +1021 1020 -2.79396772385e-8 +1022 1020 7.82310962677e-8 +1023 1020 931107.693646 +1066 1020 -588085.337671 +1067 1020 1278446.38624 +1068 1020 -2352102.70813 +1069 1020 -41457.2556898 +1070 1020 -17103.8438089 +1071 1020 -5695176.55864 +1072 1020 484442.198447 +1073 1020 -1321205.99576 +1074 1020 -2315242.24089 +1021 1021 1816739.3315 +1022 1021 -5341279.87864 +1023 1021 3.72529029846e-8 +1024 1021 -413671.243673 +1025 1021 1334423.36669 +1026 1021 -6.51925802231e-9 +1069 1021 -260348.273704 +1070 1021 710040.746465 +1071 1021 -484442.198447 +1072 1021 24667.0078013 +1073 1021 -73754.1287477 +1074 1021 27106.375452 +1075 1021 -193836.559394 +1076 1021 625279.223852 +1077 1021 416676.259817 +1022 1022 15814018.062 +1023 1022 -1.11758708954e-7 +1024 1022 1334423.36669 +1025 1022 -4304591.50545 +1026 1022 2.60770320892e-8 +1069 1022 710040.746465 +1070 1022 -1936474.76309 +1071 1022 1321205.99576 +1072 1022 -73754.1287477 +1073 1022 222052.369366 +1074 1022 9164.38855486 +1075 1022 625279.223852 +1076 1022 -2017029.75436 +1077 1022 -1344116.96715 +1023 1023 18448886.5844 +1024 1023 -1.11758708954e-8 +1025 1023 3.35276126862e-8 +1026 1023 830431.306933 +1069 1023 -484442.198447 +1070 1023 1321205.99576 +1071 1023 -2315242.24089 +1072 1023 -27106.375452 +1073 1023 -9164.38855491 +1074 1023 -5492991.14412 +1075 1023 416676.259817 +1076 1023 -1344116.96715 +1077 1023 -2296979.40748 +1024 1024 2350262.78049 +1025 1024 -4600302.86075 +1026 1024 1.86264514923e-8 +1027 1024 -7.45058059692e-9 +1030 1024 -311975.890718 +1031 1024 1184718.57235 +1032 1024 -9.31322574615e-9 +1072 1024 -193836.559394 +1073 1024 625279.223852 +1074 1024 -416676.259817 +1075 1024 -474421.1715 +1076 1024 -131724.429408 +1077 1024 23329.9193232 +1078 1024 -800250.281991 +1079 1024 8988445.57462 +1081 1024 -144050.092155 +1082 1024 547025.666412 +1083 1024 358351.461509 +1025 1025 17048556.4258 +1026 1025 -6.70552253723e-8 +1027 1025 5.96046447754e-8 +1028 1025 7.45058059692e-9 +1030 1025 1184718.57235 +1031 1025 -4498931.28739 +1032 1025 3.35276126862e-8 +1072 1025 625279.223852 +1073 1025 -2017029.75436 +1074 1025 1344116.96715 +1075 1025 -131724.429408 +1076 1025 -28174.4048378 +1077 1025 6684.54707694 +1078 1025 -6040681.08601 +1079 1025 800250.281991 +1081 1025 547025.666412 +1082 1025 -2077312.65726 +1083 1025 -1360828.33484 +1026 1026 36176122.0894 +1030 1026 -1.30385160446e-8 +1031 1026 4.47034835815e-8 +1032 1026 758227.341129 +1072 1026 -416676.259817 +1073 1026 1344116.96715 +1074 1026 -2296979.40748 +1075 1026 -23329.9193232 +1076 1026 -6684.54707699 +1077 1026 -14301137.6219 +1081 1026 358351.461509 +1082 1026 -1360828.33484 +1083 1026 -2284273.33935 +1027 1027 305878011.196 +1028 1027 -66093576.1502 +1075 1027 800250.281991 +1076 1027 6040681.08601 +1078 1027 64525513.4986 +1079 1027 4237777.92342 +1028 1028 549337215.254 +1075 1028 -8988445.57462 +1076 1028 -800250.281991 +1078 1028 4237777.92342 +1079 1028 48915433.0595 +1029 1029 715555.555556 +1080 1029 -357777.777778 +1030 1030 1011851.60912 +1031 1030 -4110093.43272 +1032 1030 6.14672899246e-8 +1075 1030 -144050.092155 +1076 1030 547025.666412 +1077 1030 -358351.461509 +1081 1030 22134.9913964 +1082 1030 -90320.9940531 +1083 1030 18909.0650259 +1031 1031 16788621.6609 +1032 1031 -2.53319740295e-7 +1075 1031 547025.666412 +1076 1031 -2077312.65726 +1077 1031 1360828.33484 +1081 1031 -90320.9940531 +1082 1031 370626.696215 +1083 1031 4631.25243446 +1032 1032 18240145.4814 +1075 1032 -358351.461509 +1076 1032 1360828.33484 +1077 1032 -2284273.33935 +1081 1032 -18909.0650259 +1082 1032 -4631.25243459 +1083 1032 -5293544.01962 +1033 1033 1011851.60912 +1034 1033 4110093.43272 +1035 1033 -4.65661287308e-8 +1036 1033 -311975.890718 +1037 1033 -1184718.57235 +1038 1033 1.02445483208e-8 +1084 1033 22134.9913964 +1085 1033 90320.9940531 +1086 1033 -18909.0650259 +1087 1033 -144050.092155 +1088 1033 -547025.666412 +1089 1033 358351.461509 +1034 1034 16788621.6609 +1035 1034 -2.01165676117e-7 +1036 1034 -1184718.57235 +1037 1034 -4498931.28739 +1038 1034 3.35276126862e-8 +1084 1034 90320.9940531 +1085 1034 370626.696215 +1086 1034 4631.25243447 +1087 1034 -547025.666412 +1088 1034 -2077312.65726 +1089 1034 1360828.33484 +1035 1035 18240145.4814 +1036 1035 1.02445483208e-8 +1037 1035 3.35276126862e-8 +1038 1035 758227.341129 +1084 1035 18909.0650259 +1085 1035 -4631.25243456 +1086 1035 -5293544.01962 +1087 1035 358351.461509 +1088 1035 1360828.33484 +1089 1035 -2284273.33935 +1036 1036 2350262.38096 +1037 1036 4600302.12491 +1038 1036 -2.421438694e-8 +1039 1036 2.98023223877e-8 +1040 1036 -1.19209289551e-7 +1042 1036 -413671.243673 +1043 1036 -1334423.36669 +1044 1036 1.58324837685e-8 +1084 1036 -144050.092155 +1085 1036 -547025.666412 +1086 1036 -358351.461509 +1087 1036 -474420.971735 +1088 1036 131724.797328 +1089 1036 -23329.9193232 +1090 1036 800256.904552 +1091 1036 8988441.97885 +1093 1036 -193836.559394 +1094 1036 -625279.223852 +1095 1036 416676.259817 +1037 1037 17048556.8253 +1038 1037 -8.19563865662e-8 +1039 1037 5.96046447754e-8 +1042 1037 -1334423.36669 +1043 1037 -4304591.50545 +1044 1037 4.842877388e-8 +1084 1037 -547025.666412 +1085 1037 -2077312.65726 +1086 1037 -1360828.33484 +1087 1037 131724.797328 +1088 1037 -28174.6046026 +1089 1037 6684.54707693 +1090 1037 -6040684.68178 +1091 1037 -800256.904552 +1093 1037 -625279.223852 +1094 1037 -2017029.75436 +1095 1037 1344116.96715 +1038 1038 36176122.0894 +1042 1038 1.39698386192e-8 +1043 1038 4.09781932831e-8 +1044 1038 830431.306933 +1084 1038 -358351.461509 +1085 1038 -1360828.33484 +1086 1038 -2284273.33935 +1087 1038 23329.9193232 +1088 1038 -6684.54707697 +1089 1038 -14301137.6219 +1093 1038 416676.259817 +1094 1038 1344116.96715 +1095 1038 -2296979.40748 +1039 1039 305878308.174 +1040 1039 66094123.115 +1087 1039 -800256.904552 +1088 1039 6040684.68178 +1090 1039 64525494.457 +1091 1039 -4237812.99363 +1040 1040 549336918.275 +1087 1040 -8988441.97885 +1088 1040 800256.904552 +1090 1040 -4237812.99363 +1091 1040 48915452.1011 +1041 1041 715555.555556 +1092 1041 -357777.777778 +1042 1042 1816739.3315 +1043 1042 5341279.87864 +1044 1042 -3.72529029846e-8 +1045 1042 -544032.43723 +1046 1042 -1483724.82881 +1047 1042 2.23517417908e-8 +1087 1042 -193836.559394 +1088 1042 -625279.223852 +1089 1042 -416676.259817 +1093 1042 24667.0078013 +1094 1042 73754.1287477 +1095 1042 -27106.375452 +1096 1042 -260348.273704 +1097 1042 -710040.746465 +1098 1042 484442.198447 +1043 1043 15814018.062 +1044 1043 -1.19209289551e-7 +1045 1043 -1483724.82881 +1046 1043 -4046522.26039 +1047 1043 5.96046447754e-8 +1087 1043 -625279.223852 +1088 1043 -2017029.75436 +1089 1043 -1344116.96715 +1093 1043 73754.1287477 +1094 1043 222052.369366 +1095 1043 9164.38855485 +1096 1043 -710040.746465 +1097 1043 -1936474.76309 +1098 1043 1321205.99576 +1044 1044 18448886.5844 +1045 1044 1.95577740669e-8 +1046 1044 5.21540641785e-8 +1047 1044 931107.693646 +1087 1044 -416676.259817 +1088 1044 -1344116.96715 +1089 1044 -2296979.40748 +1093 1044 27106.375452 +1094 1044 -9164.38855489 +1095 1044 -5492991.14412 +1096 1044 484442.198447 +1097 1044 1321205.99576 +1098 1044 -2315242.24089 +1045 1045 2558539.62181 +1046 1045 6138307.60949 +1047 1045 -5.21540641785e-8 +1048 1045 -759692.612592 +1049 1045 -1651505.67955 +1050 1045 2.98023223877e-8 +1093 1045 -260348.273704 +1094 1045 -710040.746465 +1095 1045 -484442.198447 +1096 1045 12227.6197724 +1097 1045 33038.3525625 +1098 1045 -41457.2556898 +1099 1045 -379286.632065 +1100 1045 -824536.156663 +1101 1045 588085.337671 +1046 1046 14915778.6682 +1047 1046 -1.26659870148e-7 +1048 1046 -1651505.67955 +1049 1046 -3590229.73815 +1050 1046 6.33299350738e-8 +1093 1046 -710040.746465 +1094 1046 -1936474.76309 +1095 1046 -1321205.99576 +1096 1046 33038.3525625 +1097 1046 89431.3340668 +1098 1046 17103.8438088 +1099 1046 -824536.156663 +1100 1046 -1792469.90579 +1101 1046 1278446.38624 +1047 1047 18669379.7869 +1048 1047 2.88709998131e-8 +1049 1047 6.14672899246e-8 +1050 1047 1124555.53479 +1093 1047 -484442.198447 +1094 1047 -1321205.99576 +1095 1047 -2315242.24089 +1096 1047 41457.2556898 +1097 1047 -17103.8438089 +1098 1047 -5695176.55864 +1099 1047 588085.337671 +1100 1047 1278446.38624 +1101 1047 -2352102.70813 +1048 1048 3880798.16119 +1049 1048 7110485.96967 +1050 1048 -4.842877388e-8 +1051 1048 -1076372.38828 +1052 1048 -1736084.49722 +1053 1048 2.60770320892e-8 +1096 1048 -379286.632065 +1097 1048 -824536.156663 +1098 1048 -588085.337671 +1099 1048 -52167.0393844 +1100 1048 -83826.403156 +1101 1048 -61373.985991 +1102 1048 -590912.90871 +1103 1048 -953085.336629 +1104 1048 741520.302649 +1049 1049 13318817.2723 +1050 1049 -9.685754776e-8 +1051 1049 -1736084.49722 +1052 1049 -2800136.28584 +1053 1049 4.09781932831e-8 +1096 1049 -824536.156663 +1097 1049 -1792469.90579 +1098 1049 -1278446.38624 +1099 1049 -83826.403156 +1100 1049 -134521.304432 +1101 1049 32978.3592395 +1102 1049 -953085.336629 +1103 1049 -1537234.41392 +1104 1049 1196000.48814 +1050 1050 19146980.3477 +1051 1050 1.86264514923e-8 +1052 1050 3.16649675369e-8 +1053 1050 1520483.39551 +1096 1050 -588085.337671 +1097 1050 -1278446.38624 +1098 1050 -2352102.70813 +1099 1050 61373.985991 +1100 1050 -32978.3592395 +1101 1050 -6109264.54972 +1102 1050 741520.302649 +1103 1050 1196000.48814 +1104 1050 -2434642.38116 +1051 1051 6516876.42304 +1052 1051 8531914.96891 +1053 1051 -1.49011611938e-8 +1054 1051 -2626121.17726 +1055 1051 -2984228.61052 +1056 1051 9.31322574615e-9 +1099 1051 -590912.90871 +1100 1051 -953085.336629 +1101 1051 -741520.302649 +1102 1051 222027.67781 +1103 1051 227177.812693 +1104 1051 -75251.5247453 +1105 1051 -1038306.19785 +1106 1051 -1179893.40665 +1107 1051 929649.114512 +1052 1052 11512089.4984 +1053 1052 -2.23517417908e-8 +1054 1052 -2984228.61052 +1055 1052 -3391168.87559 +1056 1052 1.11758708954e-8 +1099 1052 -953085.336629 +1100 1052 -1537234.41392 +1101 1052 -1196000.48814 +1102 1052 227177.812693 +1103 1052 217630.207531 +1104 1052 55832.4159336 +1105 1052 -1179893.40665 +1106 1052 -1340787.9621 +1107 1052 1056419.44831 +1053 1053 18361731.7736 +1054 1053 3.72529029846e-9 +1055 1053 5.58793544769e-9 +1056 1053 -125380.553908 +1099 1053 -741520.302649 +1100 1053 -1196000.48814 +1101 1053 -2434642.38116 +1102 1053 75251.5247453 +1103 1053 -55832.4159336 +1104 1053 -5287984.36193 +1105 1053 929649.114512 +1106 1053 1056419.44831 +1107 1053 -2155790.5645 +1054 1054 11197028.9194 +1055 1054 7624235.1212 +1056 1054 -1.49011611938e-8 +1057 1054 -1154846.00933 +1058 1054 -476225.158488 +1059 1054 7.45058059692e-9 +1102 1054 -1038306.19785 +1103 1054 -1179893.40665 +1104 1054 -929649.114512 +1105 1054 -908773.635179 +1106 1054 -175831.894858 +1107 1054 -148519.569575 +1108 1054 -1760951.03338 +1109 1054 -726165.37459 +1110 1054 1300948.03845 +1055 1055 6560950.4012 +1056 1055 -7.45058059692e-9 +1057 1055 -476225.158488 +1058 1055 -196381.508655 +1059 1055 2.79396772385e-9 +1102 1055 -1179893.40665 +1103 1055 -1340787.9621 +1104 1055 -1056419.44831 +1105 1055 -175831.894858 +1106 1055 153537.59263 +1107 1055 207978.412157 +1108 1055 -726165.37459 +1109 1055 -299449.639006 +1110 1055 536473.417918 +1056 1056 21281133.3311 +1059 1056 4075797.18655 +1102 1056 -929649.114512 +1103 1056 -1056419.44831 +1104 1056 -2155790.5645 +1105 1056 148519.569575 +1106 1056 -207978.412157 +1107 1056 -7295491.64648 +1108 1056 1300948.03845 +1109 1056 536473.417918 +1110 1056 -3164492.7709 +1057 1057 14087608.2601 +1058 1057 2.98023223877e-8 +1059 1057 -7.45058059692e-9 +1060 1057 -1154846.00933 +1061 1057 476225.158488 +1062 1057 7.45058059692e-9 +1105 1057 -1760951.03338 +1106 1057 -726165.37459 +1107 1057 -1300948.03845 +1108 1057 -2367056.05396 +1109 1057 -9.31322574615e-9 +1110 1057 -5.58793544769e-9 +1111 1057 -1760951.03338 +1112 1057 726165.37459 +1113 1057 1300948.03845 +1058 1058 2395597.11087 +1059 1058 7.45058059692e-9 +1060 1058 476225.158488 +1061 1058 -196381.508655 +1062 1058 -2.79396772385e-9 +1105 1058 -726165.37459 +1106 1058 -299449.639006 +1107 1058 -536473.417918 +1108 1058 -7.45058059692e-9 +1109 1058 -402517.768767 +1110 1058 429178.734334 +1111 1058 726165.37459 +1112 1058 -299449.639006 +1113 1058 -536473.417918 +1059 1059 25315942.1547 +1062 1059 4075797.18655 +1105 1059 -1300948.03845 +1106 1059 -536473.417918 +1107 1059 -3164492.7709 +1108 1059 3.72529029846e-9 +1109 1059 -429178.734334 +1110 1059 -10404782.7221 +1111 1059 1300948.03845 +1112 1059 -536473.417918 +1113 1059 -3164492.7709 +1060 1060 11197028.9194 +1061 1060 -7624235.1212 +1062 1060 1.49011611938e-8 +1063 1060 -2626121.17726 +1064 1060 2984228.61052 +1065 1060 -9.31322574615e-9 +1108 1060 -1760951.03338 +1109 1060 726165.37459 +1110 1060 -1300948.03845 +1111 1060 -908773.635179 +1112 1060 175831.894858 +1113 1060 148519.569575 +1114 1060 -1038306.19785 +1115 1060 1179893.40665 +1116 1060 929649.114512 +1061 1061 6560950.4012 +1062 1061 -7.45058059692e-9 +1063 1061 2984228.61052 +1064 1061 -3391168.87559 +1065 1061 9.31322574615e-9 +1108 1061 726165.37459 +1109 1061 -299449.639006 +1110 1061 536473.417918 +1111 1061 175831.894858 +1112 1061 153537.59263 +1113 1061 207978.412157 +1114 1061 1179893.40665 +1115 1061 -1340787.9621 +1116 1061 -1056419.44831 +1062 1062 21281133.3311 +1063 1062 -1.67638063431e-8 +1064 1062 1.67638063431e-8 +1065 1062 -125380.553908 +1108 1062 -1300948.03845 +1109 1062 536473.417918 +1110 1062 -3164492.7709 +1111 1062 -148519.569575 +1112 1062 -207978.412157 +1113 1062 -7295491.64648 +1114 1062 929649.114512 +1115 1062 -1056419.44831 +1116 1062 -2155790.5645 +1063 1063 6516876.42304 +1064 1063 -8531914.96891 +1065 1063 2.98023223877e-8 +1066 1063 -1076372.38828 +1067 1063 1736084.49722 +1068 1063 -1.49011611938e-8 +1111 1063 -1038306.19785 +1112 1063 1179893.40665 +1113 1063 -929649.114512 +1114 1063 222027.677811 +1115 1063 -227177.812693 +1116 1063 75251.5247453 +1117 1063 -590912.90871 +1118 1063 953085.336629 +1119 1063 741520.302649 +1064 1064 11512089.4984 +1065 1064 -3.72529029846e-8 +1066 1064 1736084.49722 +1067 1064 -2800136.28584 +1068 1064 2.421438694e-8 +1111 1064 1179893.40665 +1112 1064 -1340787.9621 +1113 1064 1056419.44831 +1114 1064 -227177.812693 +1115 1064 217630.207531 +1116 1064 55832.4159336 +1117 1064 953085.336629 +1118 1064 -1537234.41392 +1119 1064 -1196000.48814 +1065 1065 18361731.7736 +1066 1065 -2.23517417908e-8 +1067 1065 3.53902578354e-8 +1068 1065 1520483.39551 +1111 1065 -929649.114512 +1112 1065 1056419.44831 +1113 1065 -2155790.5645 +1114 1065 -75251.5247453 +1115 1065 -55832.4159336 +1116 1065 -5287984.36193 +1117 1065 741520.302649 +1118 1065 -1196000.48814 +1119 1065 -2434642.38116 +1066 1066 3880798.16119 +1067 1066 -7110485.96967 +1068 1066 4.09781932831e-8 +1069 1066 -759692.612592 +1070 1066 1651505.67955 +1071 1066 -1.86264514923e-8 +1114 1066 -590912.90871 +1115 1066 953085.336629 +1116 1066 -741520.302649 +1117 1066 -52167.0393844 +1118 1066 83826.403156 +1119 1066 61373.985991 +1120 1066 -379286.632065 +1121 1066 824536.156663 +1122 1066 588085.337671 +1067 1067 13318817.2723 +1068 1067 -7.45058059692e-8 +1069 1067 1651505.67955 +1070 1067 -3590229.73815 +1071 1067 4.09781932831e-8 +1114 1067 953085.336629 +1115 1067 -1537234.41392 +1116 1067 1196000.48814 +1117 1067 83826.403156 +1118 1067 -134521.304432 +1119 1067 32978.3592395 +1120 1067 824536.156663 +1121 1067 -1792469.90579 +1122 1067 -1278446.38624 +1068 1068 19146980.3477 +1069 1068 -2.51457095146e-8 +1070 1068 5.40167093277e-8 +1071 1068 1124555.53479 +1114 1068 -741520.302649 +1115 1068 1196000.48814 +1116 1068 -2434642.38116 +1117 1068 -61373.985991 +1118 1068 -32978.3592395 +1119 1068 -6109264.54972 +1120 1068 588085.337671 +1121 1068 -1278446.38624 +1122 1068 -2352102.70813 +1069 1069 2558539.62181 +1070 1069 -6138307.60949 +1071 1069 4.09781932831e-8 +1072 1069 -544032.43723 +1073 1069 1483724.82881 +1074 1069 -2.51457095146e-8 +1117 1069 -379286.632065 +1118 1069 824536.156663 +1119 1069 -588085.337671 +1120 1069 12227.6197724 +1121 1069 -33038.3525625 +1122 1069 41457.2556898 +1123 1069 -260348.273704 +1124 1069 710040.746465 +1125 1069 484442.198447 +1070 1070 14915778.6682 +1071 1070 -1.11758708954e-7 +1072 1070 1483724.82881 +1073 1070 -4046522.26039 +1074 1070 7.07805156708e-8 +1117 1070 824536.156663 +1118 1070 -1792469.90579 +1119 1070 1278446.38624 +1120 1070 -33038.3525625 +1121 1070 89431.3340668 +1122 1070 17103.8438088 +1123 1070 710040.746465 +1124 1070 -1936474.76309 +1125 1070 -1321205.99576 +1071 1071 18669379.7869 +1072 1071 -2.79396772385e-8 +1073 1071 7.82310962677e-8 +1074 1071 931107.693646 +1117 1071 -588085.337671 +1118 1071 1278446.38624 +1119 1071 -2352102.70813 +1120 1071 -41457.2556898 +1121 1071 -17103.8438089 +1122 1071 -5695176.55864 +1123 1071 484442.198447 +1124 1071 -1321205.99576 +1125 1071 -2315242.24089 +1072 1072 1816739.3315 +1073 1072 -5341279.87864 +1074 1072 3.72529029846e-8 +1075 1072 -413671.243673 +1076 1072 1334423.36669 +1077 1072 -6.51925802231e-9 +1120 1072 -260348.273704 +1121 1072 710040.746465 +1122 1072 -484442.198447 +1123 1072 24667.0078013 +1124 1072 -73754.1287477 +1125 1072 27106.375452 +1126 1072 -193836.559394 +1127 1072 625279.223852 +1128 1072 416676.259817 +1073 1073 15814018.062 +1074 1073 -1.11758708954e-7 +1075 1073 1334423.36669 +1076 1073 -4304591.50545 +1077 1073 2.60770320892e-8 +1120 1073 710040.746465 +1121 1073 -1936474.76309 +1122 1073 1321205.99576 +1123 1073 -73754.1287477 +1124 1073 222052.369366 +1125 1073 9164.38855486 +1126 1073 625279.223852 +1127 1073 -2017029.75436 +1128 1073 -1344116.96715 +1074 1074 18448886.5844 +1075 1074 -1.11758708954e-8 +1076 1074 3.35276126862e-8 +1077 1074 830431.306933 +1120 1074 -484442.198447 +1121 1074 1321205.99576 +1122 1074 -2315242.24089 +1123 1074 -27106.375452 +1124 1074 -9164.38855491 +1125 1074 -5492991.14412 +1126 1074 416676.259817 +1127 1074 -1344116.96715 +1128 1074 -2296979.40748 +1075 1075 2350262.78049 +1076 1075 -4600302.86075 +1077 1075 1.86264514923e-8 +1078 1075 -7.45058059692e-9 +1081 1075 -311975.890718 +1082 1075 1184718.57235 +1083 1075 -9.31322574615e-9 +1123 1075 -193836.559394 +1124 1075 625279.223852 +1125 1075 -416676.259817 +1126 1075 -474421.1715 +1127 1075 -131724.429408 +1128 1075 23329.9193232 +1129 1075 -800250.281991 +1130 1075 8988445.57462 +1132 1075 -144050.092155 +1133 1075 547025.666412 +1134 1075 358351.461509 +1076 1076 17048556.4258 +1077 1076 -6.70552253723e-8 +1078 1076 5.96046447754e-8 +1079 1076 7.45058059692e-9 +1081 1076 1184718.57235 +1082 1076 -4498931.28739 +1083 1076 3.35276126862e-8 +1123 1076 625279.223852 +1124 1076 -2017029.75436 +1125 1076 1344116.96715 +1126 1076 -131724.429408 +1127 1076 -28174.4048378 +1128 1076 6684.54707694 +1129 1076 -6040681.08601 +1130 1076 800250.281991 +1132 1076 547025.666412 +1133 1076 -2077312.65726 +1134 1076 -1360828.33484 +1077 1077 36176122.0894 +1081 1077 -1.30385160446e-8 +1082 1077 4.47034835815e-8 +1083 1077 758227.341129 +1123 1077 -416676.259817 +1124 1077 1344116.96715 +1125 1077 -2296979.40748 +1126 1077 -23329.9193232 +1127 1077 -6684.54707699 +1128 1077 -14301137.6219 +1132 1077 358351.461509 +1133 1077 -1360828.33484 +1134 1077 -2284273.33935 +1078 1078 305878011.196 +1079 1078 -66093576.1502 +1126 1078 800250.281991 +1127 1078 6040681.08601 +1129 1078 64525513.4986 +1130 1078 4237777.92342 +1079 1079 549337215.254 +1126 1079 -8988445.57462 +1127 1079 -800250.281991 +1129 1079 4237777.92342 +1130 1079 48915433.0595 +1080 1080 715555.555556 +1131 1080 -357777.777778 +1081 1081 1011851.60912 +1082 1081 -4110093.43272 +1083 1081 6.14672899246e-8 +1126 1081 -144050.092155 +1127 1081 547025.666412 +1128 1081 -358351.461509 +1132 1081 22134.9913964 +1133 1081 -90320.9940531 +1134 1081 18909.0650259 +1082 1082 16788621.6609 +1083 1082 -2.53319740295e-7 +1126 1082 547025.666412 +1127 1082 -2077312.65726 +1128 1082 1360828.33484 +1132 1082 -90320.9940531 +1133 1082 370626.696215 +1134 1082 4631.25243446 +1083 1083 18240145.4814 +1126 1083 -358351.461509 +1127 1083 1360828.33484 +1128 1083 -2284273.33935 +1132 1083 -18909.0650259 +1133 1083 -4631.25243459 +1134 1083 -5293544.01962 +1084 1084 1011851.60912 +1085 1084 4110093.43272 +1086 1084 -4.65661287308e-8 +1087 1084 -311975.890718 +1088 1084 -1184718.57235 +1089 1084 9.31322574615e-9 +1135 1084 22134.9913963 +1136 1084 90320.994053 +1137 1084 -18909.0650259 +1138 1084 -144050.092155 +1139 1084 -547025.666412 +1140 1084 358351.461509 +1085 1085 16788621.6609 +1086 1085 -2.01165676117e-7 +1087 1085 -1184718.57235 +1088 1085 -4498931.28739 +1089 1085 2.98023223877e-8 +1135 1085 90320.994053 +1136 1085 370626.696215 +1137 1085 4631.25243448 +1138 1085 -547025.666412 +1139 1085 -2077312.65726 +1140 1085 1360828.33484 +1086 1086 18240145.4814 +1087 1086 1.02445483208e-8 +1088 1086 3.35276126862e-8 +1089 1086 758227.341129 +1135 1086 18909.0650259 +1136 1086 -4631.25243456 +1137 1086 -5293544.01962 +1138 1086 358351.461509 +1139 1086 1360828.33484 +1140 1086 -2284273.33935 +1087 1087 2350262.38096 +1088 1087 4600302.12491 +1089 1087 -2.98023223877e-8 +1090 1087 2.98023223877e-8 +1091 1087 -1.19209289551e-7 +1093 1087 -413671.243673 +1094 1087 -1334423.36669 +1095 1087 1.58324837685e-8 +1135 1087 -144050.092155 +1136 1087 -547025.666412 +1137 1087 -358351.461509 +1138 1087 -474420.971735 +1139 1087 131724.797327 +1140 1087 -23329.9193232 +1141 1087 800256.904552 +1142 1087 8988441.97885 +1144 1087 -193836.559394 +1145 1087 -625279.223852 +1146 1087 416676.259817 +1088 1088 17048556.8253 +1089 1088 -9.685754776e-8 +1090 1088 5.96046447754e-8 +1093 1088 -1334423.36669 +1094 1088 -4304591.50545 +1095 1088 4.842877388e-8 +1135 1088 -547025.666412 +1136 1088 -2077312.65726 +1137 1088 -1360828.33484 +1138 1088 131724.797327 +1139 1088 -28174.604603 +1140 1088 6684.54707694 +1141 1088 -6040684.68178 +1142 1088 -800256.904552 +1144 1088 -625279.223852 +1145 1088 -2017029.75436 +1146 1088 1344116.96715 +1089 1089 36176122.0894 +1093 1089 1.210719347e-8 +1094 1089 3.35276126862e-8 +1095 1089 830431.306934 +1135 1089 -358351.461509 +1136 1089 -1360828.33484 +1137 1089 -2284273.33935 +1138 1089 23329.9193232 +1139 1089 -6684.54707697 +1140 1089 -14301137.6219 +1144 1089 416676.259817 +1145 1089 1344116.96715 +1146 1089 -2296979.40748 +1090 1090 305878308.174 +1091 1090 66094123.115 +1138 1090 -800256.904552 +1139 1090 6040684.68178 +1141 1090 64525494.457 +1142 1090 -4237812.99363 +1091 1091 549336918.275 +1138 1091 -8988441.97885 +1139 1091 800256.904552 +1141 1091 -4237812.99363 +1142 1091 48915452.1011 +1092 1092 715555.555556 +1143 1092 -357777.777778 +1093 1093 1816739.3315 +1094 1093 5341279.87864 +1095 1093 -3.53902578354e-8 +1096 1093 -544032.43723 +1097 1093 -1483724.82881 +1098 1093 2.23517417908e-8 +1138 1093 -193836.559394 +1139 1093 -625279.223852 +1140 1093 -416676.259817 +1144 1093 24667.0078013 +1145 1093 73754.1287476 +1146 1093 -27106.375452 +1147 1093 -260348.273704 +1148 1093 -710040.746465 +1149 1093 484442.198447 +1094 1094 15814018.062 +1095 1094 -1.11758708954e-7 +1096 1094 -1483724.82881 +1097 1094 -4046522.26039 +1098 1094 5.96046447754e-8 +1138 1094 -625279.223852 +1139 1094 -2017029.75436 +1140 1094 -1344116.96715 +1144 1094 73754.1287476 +1145 1094 222052.369366 +1146 1094 9164.38855485 +1147 1094 -710040.746465 +1148 1094 -1936474.76309 +1149 1094 1321205.99576 +1095 1095 18448886.5844 +1096 1095 1.95577740669e-8 +1097 1095 5.21540641785e-8 +1098 1095 931107.693646 +1138 1095 -416676.259817 +1139 1095 -1344116.96715 +1140 1095 -2296979.40748 +1144 1095 27106.375452 +1145 1095 -9164.3885549 +1146 1095 -5492991.14412 +1147 1095 484442.198447 +1148 1095 1321205.99576 +1149 1095 -2315242.24089 +1096 1096 2558539.62181 +1097 1096 6138307.60949 +1098 1096 -5.21540641785e-8 +1099 1096 -759692.612592 +1100 1096 -1651505.67955 +1101 1096 2.98023223877e-8 +1144 1096 -260348.273704 +1145 1096 -710040.746465 +1146 1096 -484442.198447 +1147 1096 12227.6197724 +1148 1096 33038.3525624 +1149 1096 -41457.2556898 +1150 1096 -379286.632065 +1151 1096 -824536.156663 +1152 1096 588085.337671 +1097 1097 14915778.6682 +1098 1097 -1.26659870148e-7 +1099 1097 -1651505.67955 +1100 1097 -3590229.73815 +1101 1097 6.33299350738e-8 +1144 1097 -710040.746465 +1145 1097 -1936474.76309 +1146 1097 -1321205.99576 +1147 1097 33038.3525624 +1148 1097 89431.3340665 +1149 1097 17103.8438088 +1150 1097 -824536.156663 +1151 1097 -1792469.90579 +1152 1097 1278446.38624 +1098 1098 18669379.7869 +1099 1098 2.88709998131e-8 +1100 1098 6.14672899246e-8 +1101 1098 1124555.53479 +1144 1098 -484442.198447 +1145 1098 -1321205.99576 +1146 1098 -2315242.24089 +1147 1098 41457.2556898 +1148 1098 -17103.8438089 +1149 1098 -5695176.55864 +1150 1098 588085.337671 +1151 1098 1278446.38624 +1152 1098 -2352102.70813 +1099 1099 3880798.16119 +1100 1099 7110485.96967 +1101 1099 -4.842877388e-8 +1102 1099 -1076372.38828 +1103 1099 -1736084.49722 +1104 1099 2.60770320892e-8 +1147 1099 -379286.632065 +1148 1099 -824536.156663 +1149 1099 -588085.337671 +1150 1099 -52167.0393844 +1151 1099 -83826.403156 +1152 1099 -61373.985991 +1153 1099 -590912.90871 +1154 1099 -953085.336629 +1155 1099 741520.302649 +1100 1100 13318817.2723 +1101 1100 -9.685754776e-8 +1102 1100 -1736084.49722 +1103 1100 -2800136.28584 +1104 1100 4.09781932831e-8 +1147 1100 -824536.156663 +1148 1100 -1792469.90579 +1149 1100 -1278446.38624 +1150 1100 -83826.403156 +1151 1100 -134521.304432 +1152 1100 32978.3592395 +1153 1100 -953085.336629 +1154 1100 -1537234.41392 +1155 1100 1196000.48814 +1101 1101 19146980.3477 +1102 1101 1.86264514923e-8 +1103 1101 3.16649675369e-8 +1104 1101 1520483.39551 +1147 1101 -588085.337671 +1148 1101 -1278446.38624 +1149 1101 -2352102.70813 +1150 1101 61373.985991 +1151 1101 -32978.3592395 +1152 1101 -6109264.54972 +1153 1101 741520.302649 +1154 1101 1196000.48814 +1155 1101 -2434642.38116 +1102 1102 6516876.42304 +1103 1102 8531914.96891 +1104 1102 -1.49011611938e-8 +1105 1102 -2626121.17726 +1106 1102 -2984228.61052 +1107 1102 9.31322574615e-9 +1150 1102 -590912.90871 +1151 1102 -953085.336629 +1152 1102 -741520.302649 +1153 1102 222027.67781 +1154 1102 227177.812693 +1155 1102 -75251.5247453 +1156 1102 -1038306.19785 +1157 1102 -1179893.40665 +1158 1102 929649.114512 +1103 1103 11512089.4984 +1104 1103 -2.23517417908e-8 +1105 1103 -2984228.61052 +1106 1103 -3391168.87559 +1107 1103 1.11758708954e-8 +1150 1103 -953085.336629 +1151 1103 -1537234.41392 +1152 1103 -1196000.48814 +1153 1103 227177.812693 +1154 1103 217630.207531 +1155 1103 55832.4159336 +1156 1103 -1179893.40665 +1157 1103 -1340787.9621 +1158 1103 1056419.44831 +1104 1104 18361731.7736 +1105 1104 3.72529029846e-9 +1106 1104 5.58793544769e-9 +1107 1104 -125380.553907 +1150 1104 -741520.302649 +1151 1104 -1196000.48814 +1152 1104 -2434642.38116 +1153 1104 75251.5247453 +1154 1104 -55832.4159336 +1155 1104 -5287984.36193 +1156 1104 929649.114512 +1157 1104 1056419.44831 +1158 1104 -2155790.5645 +1105 1105 11197028.9194 +1106 1105 7624235.1212 +1107 1105 -2.23517417908e-8 +1108 1105 -1154846.00933 +1109 1105 -476225.158488 +1110 1105 7.45058059692e-9 +1153 1105 -1038306.19785 +1154 1105 -1179893.40665 +1155 1105 -929649.114512 +1156 1105 -908773.635179 +1157 1105 -175831.894858 +1158 1105 -148519.569575 +1159 1105 -1760951.03338 +1160 1105 -726165.37459 +1161 1105 1300948.03845 +1106 1106 6560950.4012 +1107 1106 -1.49011611938e-8 +1108 1106 -476225.158488 +1109 1106 -196381.508655 +1110 1106 2.79396772385e-9 +1153 1106 -1179893.40665 +1154 1106 -1340787.9621 +1155 1106 -1056419.44831 +1156 1106 -175831.894858 +1157 1106 153537.59263 +1158 1106 207978.412157 +1159 1106 -726165.37459 +1160 1106 -299449.639006 +1161 1106 536473.417918 +1107 1107 21281133.3311 +1110 1107 4075797.18655 +1153 1107 -929649.114512 +1154 1107 -1056419.44831 +1155 1107 -2155790.5645 +1156 1107 148519.569575 +1157 1107 -207978.412157 +1158 1107 -7295491.64648 +1159 1107 1300948.03845 +1160 1107 536473.417918 +1161 1107 -3164492.7709 +1108 1108 14087608.2601 +1109 1108 7.45058059692e-9 +1110 1108 -7.45058059692e-9 +1111 1108 -1154846.00933 +1112 1108 476225.158488 +1113 1108 7.45058059692e-9 +1156 1108 -1760951.03338 +1157 1108 -726165.37459 +1158 1108 -1300948.03845 +1159 1108 -2367056.05396 +1160 1108 -9.31322574615e-9 +1161 1108 -5.58793544769e-9 +1162 1108 -1760951.03338 +1163 1108 726165.37459 +1164 1108 1300948.03845 +1109 1109 2395597.11087 +1110 1109 7.45058059692e-9 +1111 1109 476225.158488 +1112 1109 -196381.508655 +1113 1109 -2.79396772385e-9 +1156 1109 -726165.37459 +1157 1109 -299449.639006 +1158 1109 -536473.417918 +1159 1109 -7.45058059692e-9 +1160 1109 -402517.768767 +1161 1109 429178.734334 +1162 1109 726165.37459 +1163 1109 -299449.639006 +1164 1109 -536473.417918 +1110 1110 25315942.1547 +1113 1110 4075797.18655 +1156 1110 -1300948.03845 +1157 1110 -536473.417918 +1158 1110 -3164492.7709 +1159 1110 3.72529029846e-9 +1160 1110 -429178.734334 +1161 1110 -10404782.7221 +1162 1110 1300948.03845 +1163 1110 -536473.417918 +1164 1110 -3164492.7709 +1111 1111 11197028.9194 +1112 1111 -7624235.1212 +1113 1111 1.86264514923e-8 +1114 1111 -2626121.17726 +1115 1111 2984228.61052 +1116 1111 -9.31322574615e-9 +1159 1111 -1760951.03338 +1160 1111 726165.37459 +1161 1111 -1300948.03845 +1162 1111 -908773.635179 +1163 1111 175831.894858 +1164 1111 148519.569575 +1165 1111 -1038306.19785 +1166 1111 1179893.40665 +1167 1111 929649.114512 +1112 1112 6560950.4012 +1113 1112 -1.49011611938e-8 +1114 1112 2984228.61052 +1115 1112 -3391168.87559 +1116 1112 9.31322574615e-9 +1159 1112 726165.37459 +1160 1112 -299449.639006 +1161 1112 536473.417918 +1162 1112 175831.894858 +1163 1112 153537.59263 +1164 1112 207978.412157 +1165 1112 1179893.40665 +1166 1112 -1340787.9621 +1167 1112 -1056419.44831 +1113 1113 21281133.3311 +1114 1113 -1.86264514923e-8 +1115 1113 2.04890966415e-8 +1116 1113 -125380.553907 +1159 1113 -1300948.03845 +1160 1113 536473.417918 +1161 1113 -3164492.7709 +1162 1113 -148519.569575 +1163 1113 -207978.412157 +1164 1113 -7295491.64648 +1165 1113 929649.114512 +1166 1113 -1056419.44831 +1167 1113 -2155790.5645 +1114 1114 6516876.42304 +1115 1114 -8531914.96891 +1116 1114 2.98023223877e-8 +1117 1114 -1076372.38828 +1118 1114 1736084.49722 +1119 1114 -1.49011611938e-8 +1162 1114 -1038306.19785 +1163 1114 1179893.40665 +1164 1114 -929649.114512 +1165 1114 222027.67781 +1166 1114 -227177.812693 +1167 1114 75251.5247453 +1168 1114 -590912.90871 +1169 1114 953085.336629 +1170 1114 741520.302649 +1115 1115 11512089.4984 +1116 1115 -3.72529029846e-8 +1117 1115 1736084.49722 +1118 1115 -2800136.28584 +1119 1115 2.421438694e-8 +1162 1115 1179893.40665 +1163 1115 -1340787.9621 +1164 1115 1056419.44831 +1165 1115 -227177.812693 +1166 1115 217630.207531 +1167 1115 55832.4159336 +1168 1115 953085.336629 +1169 1115 -1537234.41392 +1170 1115 -1196000.48814 +1116 1116 18361731.7736 +1117 1116 -2.23517417908e-8 +1118 1116 3.53902578354e-8 +1119 1116 1520483.39551 +1162 1116 -929649.114512 +1163 1116 1056419.44831 +1164 1116 -2155790.5645 +1165 1116 -75251.5247453 +1166 1116 -55832.4159336 +1167 1116 -5287984.36193 +1168 1116 741520.302649 +1169 1116 -1196000.48814 +1170 1116 -2434642.38116 +1117 1117 3880798.16119 +1118 1117 -7110485.96967 +1119 1117 4.09781932831e-8 +1120 1117 -759692.612592 +1121 1117 1651505.67955 +1122 1117 -1.86264514923e-8 +1165 1117 -590912.90871 +1166 1117 953085.336629 +1167 1117 -741520.302649 +1168 1117 -52167.0393844 +1169 1117 83826.403156 +1170 1117 61373.985991 +1171 1117 -379286.632065 +1172 1117 824536.156663 +1173 1117 588085.337671 +1118 1118 13318817.2723 +1119 1118 -7.45058059692e-8 +1120 1118 1651505.67955 +1121 1118 -3590229.73815 +1122 1118 4.09781932831e-8 +1165 1118 953085.336629 +1166 1118 -1537234.41392 +1167 1118 1196000.48814 +1168 1118 83826.403156 +1169 1118 -134521.304432 +1170 1118 32978.3592395 +1171 1118 824536.156663 +1172 1118 -1792469.90579 +1173 1118 -1278446.38624 +1119 1119 19146980.3477 +1120 1119 -2.51457095146e-8 +1121 1119 5.40167093277e-8 +1122 1119 1124555.53479 +1165 1119 -741520.302649 +1166 1119 1196000.48814 +1167 1119 -2434642.38116 +1168 1119 -61373.985991 +1169 1119 -32978.3592395 +1170 1119 -6109264.54972 +1171 1119 588085.337671 +1172 1119 -1278446.38624 +1173 1119 -2352102.70813 +1120 1120 2558539.62181 +1121 1120 -6138307.60949 +1122 1120 4.28408384323e-8 +1123 1120 -544032.43723 +1124 1120 1483724.82881 +1125 1120 -2.51457095146e-8 +1168 1120 -379286.632065 +1169 1120 824536.156663 +1170 1120 -588085.337671 +1171 1120 12227.6197724 +1172 1120 -33038.3525625 +1173 1120 41457.2556898 +1174 1120 -260348.273704 +1175 1120 710040.746465 +1176 1120 484442.198447 +1121 1121 14915778.6682 +1122 1121 -1.19209289551e-7 +1123 1121 1483724.82881 +1124 1121 -4046522.26039 +1125 1121 7.07805156708e-8 +1168 1121 824536.156663 +1169 1121 -1792469.90579 +1170 1121 1278446.38624 +1171 1121 -33038.3525625 +1172 1121 89431.3340666 +1173 1121 17103.8438088 +1174 1121 710040.746465 +1175 1121 -1936474.76309 +1176 1121 -1321205.99576 +1122 1122 18669379.7869 +1123 1122 -2.79396772385e-8 +1124 1122 7.82310962677e-8 +1125 1122 931107.693646 +1168 1122 -588085.337671 +1169 1122 1278446.38624 +1170 1122 -2352102.70813 +1171 1122 -41457.2556898 +1172 1122 -17103.8438089 +1173 1122 -5695176.55864 +1174 1122 484442.198447 +1175 1122 -1321205.99576 +1176 1122 -2315242.24089 +1123 1123 1816739.3315 +1124 1123 -5341279.87864 +1125 1123 3.91155481339e-8 +1126 1123 -413671.243673 +1127 1123 1334423.36669 +1128 1123 -8.38190317154e-9 +1171 1123 -260348.273704 +1172 1123 710040.746465 +1173 1123 -484442.198447 +1174 1123 24667.0078013 +1175 1123 -73754.1287476 +1176 1123 27106.375452 +1177 1123 -193836.559394 +1178 1123 625279.223852 +1179 1123 416676.259817 +1124 1124 15814018.062 +1125 1124 -1.19209289551e-7 +1126 1124 1334423.36669 +1127 1124 -4304591.50545 +1128 1124 2.98023223877e-8 +1171 1124 710040.746465 +1172 1124 -1936474.76309 +1173 1124 1321205.99576 +1174 1124 -73754.1287476 +1175 1124 222052.369366 +1176 1124 9164.38855486 +1177 1124 625279.223852 +1178 1124 -2017029.75436 +1179 1124 -1344116.96715 +1125 1125 18448886.5844 +1126 1125 -1.210719347e-8 +1127 1125 3.72529029846e-8 +1128 1125 830431.306933 +1171 1125 -484442.198447 +1172 1125 1321205.99576 +1173 1125 -2315242.24089 +1174 1125 -27106.375452 +1175 1125 -9164.38855491 +1176 1125 -5492991.14412 +1177 1125 416676.259817 +1178 1125 -1344116.96715 +1179 1125 -2296979.40748 +1126 1126 2350262.78049 +1127 1126 -4600302.86075 +1128 1126 1.86264514923e-8 +1129 1126 -7.45058059692e-9 +1132 1126 -311975.890718 +1133 1126 1184718.57235 +1134 1126 -9.31322574615e-9 +1174 1126 -193836.559394 +1175 1126 625279.223852 +1176 1126 -416676.259817 +1177 1126 -474421.1715 +1178 1126 -131724.429407 +1179 1126 23329.9193232 +1180 1126 -800250.281991 +1181 1126 8988445.57462 +1183 1126 -144050.092155 +1184 1126 547025.666412 +1185 1126 358351.461509 +1127 1127 17048556.4258 +1128 1127 -6.70552253723e-8 +1129 1127 5.96046447754e-8 +1130 1127 7.45058059692e-9 +1132 1127 1184718.57235 +1133 1127 -4498931.28739 +1134 1127 3.35276126862e-8 +1174 1127 625279.223852 +1175 1127 -2017029.75436 +1176 1127 1344116.96715 +1177 1127 -131724.429407 +1178 1127 -28174.4048382 +1179 1127 6684.54707695 +1180 1127 -6040681.08601 +1181 1127 800250.281991 +1183 1127 547025.666412 +1184 1127 -2077312.65726 +1185 1127 -1360828.33484 +1128 1128 36176122.0894 +1132 1128 -1.39698386192e-8 +1133 1128 4.842877388e-8 +1134 1128 758227.341129 +1174 1128 -416676.259817 +1175 1128 1344116.96715 +1176 1128 -2296979.40748 +1177 1128 -23329.9193232 +1178 1128 -6684.54707698 +1179 1128 -14301137.6219 +1183 1128 358351.461509 +1184 1128 -1360828.33484 +1185 1128 -2284273.33935 +1129 1129 305878011.196 +1130 1129 -66093576.1502 +1177 1129 800250.281991 +1178 1129 6040681.08601 +1180 1129 64525513.4986 +1181 1129 4237777.92342 +1130 1130 549337215.254 +1177 1130 -8988445.57462 +1178 1130 -800250.281991 +1180 1130 4237777.92342 +1181 1130 48915433.0595 +1131 1131 715555.555556 +1182 1131 -357777.777778 +1132 1132 1011851.60912 +1133 1132 -4110093.43272 +1134 1132 6.14672899246e-8 +1177 1132 -144050.092155 +1178 1132 547025.666412 +1179 1132 -358351.461509 +1183 1132 22134.9913963 +1184 1132 -90320.994053 +1185 1132 18909.0650259 +1133 1133 16788621.6609 +1134 1133 -2.53319740295e-7 +1177 1133 547025.666412 +1178 1133 -2077312.65726 +1179 1133 1360828.33484 +1183 1133 -90320.994053 +1184 1133 370626.696215 +1185 1133 4631.25243446 +1134 1134 18240145.4814 +1177 1134 -358351.461509 +1178 1134 1360828.33484 +1179 1134 -2284273.33935 +1183 1134 -18909.0650259 +1184 1134 -4631.25243459 +1185 1134 -5293544.01962 +1135 1135 1011851.60912 +1136 1135 4110093.43272 +1137 1135 -5.21540641785e-8 +1138 1135 -311975.890718 +1139 1135 -1184718.57235 +1140 1135 1.02445483208e-8 +1186 1135 22134.9913963 +1187 1135 90320.994053 +1188 1135 -18909.0650259 +1189 1135 -144050.092155 +1190 1135 -547025.666412 +1191 1135 358351.461509 +1136 1136 16788621.6609 +1137 1136 -2.16066837311e-7 +1138 1136 -1184718.57235 +1139 1136 -4498931.28739 +1140 1136 3.35276126862e-8 +1186 1136 90320.994053 +1187 1136 370626.696215 +1188 1136 4631.25243448 +1189 1136 -547025.666412 +1190 1136 -2077312.65726 +1191 1136 1360828.33484 +1137 1137 18240145.4814 +1138 1137 9.31322574615e-9 +1139 1137 2.98023223877e-8 +1140 1137 758227.34113 +1186 1137 18909.0650259 +1187 1137 -4631.25243456 +1188 1137 -5293544.01962 +1189 1137 358351.461509 +1190 1137 1360828.33484 +1191 1137 -2284273.33935 +1138 1138 2350262.38096 +1139 1138 4600302.12491 +1140 1138 -2.79396772385e-8 +1141 1138 2.98023223877e-8 +1142 1138 -1.19209289551e-7 +1144 1138 -413671.243673 +1145 1138 -1334423.36669 +1146 1138 1.58324837685e-8 +1186 1138 -144050.092155 +1187 1138 -547025.666412 +1188 1138 -358351.461509 +1189 1138 -474420.971735 +1190 1138 131724.797327 +1191 1138 -23329.9193232 +1192 1138 800256.904552 +1193 1138 8988441.97885 +1195 1138 -193836.559394 +1196 1138 -625279.223852 +1197 1138 416676.259817 +1139 1139 17048556.8253 +1140 1139 -8.94069671631e-8 +1141 1139 5.96046447754e-8 +1144 1139 -1334423.36669 +1145 1139 -4304591.50545 +1146 1139 4.842877388e-8 +1186 1139 -547025.666412 +1187 1139 -2077312.65726 +1188 1139 -1360828.33484 +1189 1139 131724.797327 +1190 1139 -28174.604603 +1191 1139 6684.54707694 +1192 1139 -6040684.68178 +1193 1139 -800256.904552 +1195 1139 -625279.223852 +1196 1139 -2017029.75436 +1197 1139 1344116.96715 +1140 1140 36176122.0894 +1144 1140 1.210719347e-8 +1145 1140 3.35276126862e-8 +1146 1140 830431.306934 +1186 1140 -358351.461509 +1187 1140 -1360828.33484 +1188 1140 -2284273.33935 +1189 1140 23329.9193232 +1190 1140 -6684.54707697 +1191 1140 -14301137.6219 +1195 1140 416676.259817 +1196 1140 1344116.96715 +1197 1140 -2296979.40748 +1141 1141 305878308.174 +1142 1141 66094123.115 +1189 1141 -800256.904552 +1190 1141 6040684.68178 +1192 1141 64525494.457 +1193 1141 -4237812.99363 +1142 1142 549336918.275 +1189 1142 -8988441.97885 +1190 1142 800256.904552 +1192 1142 -4237812.99363 +1193 1142 48915452.1011 +1143 1143 715555.555556 +1194 1143 -357777.777778 +1144 1144 1816739.3315 +1145 1144 5341279.87864 +1146 1144 -3.53902578354e-8 +1147 1144 -544032.43723 +1148 1144 -1483724.82881 +1149 1144 2.04890966415e-8 +1189 1144 -193836.559394 +1190 1144 -625279.223852 +1191 1144 -416676.259817 +1195 1144 24667.0078013 +1196 1144 73754.1287476 +1197 1144 -27106.375452 +1198 1144 -260348.273704 +1199 1144 -710040.746465 +1200 1144 484442.198447 +1145 1145 15814018.062 +1146 1145 -1.11758708954e-7 +1147 1145 -1483724.82881 +1148 1145 -4046522.26039 +1149 1145 5.58793544769e-8 +1189 1145 -625279.223852 +1190 1145 -2017029.75436 +1191 1145 -1344116.96715 +1195 1145 73754.1287476 +1196 1145 222052.369366 +1197 1145 9164.38855485 +1198 1145 -710040.746465 +1199 1145 -1936474.76309 +1200 1145 1321205.99576 +1146 1146 18448886.5844 +1147 1146 1.95577740669e-8 +1148 1146 5.21540641785e-8 +1149 1146 931107.693646 +1189 1146 -416676.259817 +1190 1146 -1344116.96715 +1191 1146 -2296979.40748 +1195 1146 27106.375452 +1196 1146 -9164.3885549 +1197 1146 -5492991.14412 +1198 1146 484442.198447 +1199 1146 1321205.99576 +1200 1146 -2315242.24089 +1147 1147 2558539.62181 +1148 1147 6138307.60949 +1149 1147 -5.58793544769e-8 +1150 1147 -759692.612592 +1151 1147 -1651505.67955 +1152 1147 2.98023223877e-8 +1195 1147 -260348.273704 +1196 1147 -710040.746465 +1197 1147 -484442.198447 +1198 1147 12227.6197724 +1199 1147 33038.3525624 +1200 1147 -41457.2556898 +1201 1147 -379286.632065 +1202 1147 -824536.156663 +1203 1147 588085.337671 +1148 1148 14915778.6682 +1149 1148 -1.34110450745e-7 +1150 1148 -1651505.67955 +1151 1148 -3590229.73815 +1152 1148 6.33299350738e-8 +1195 1148 -710040.746465 +1196 1148 -1936474.76309 +1197 1148 -1321205.99576 +1198 1148 33038.3525624 +1199 1148 89431.3340665 +1200 1148 17103.8438088 +1201 1148 -824536.156663 +1202 1148 -1792469.90579 +1203 1148 1278446.38624 +1149 1149 18669379.7869 +1150 1149 2.88709998131e-8 +1151 1149 6.14672899246e-8 +1152 1149 1124555.53479 +1195 1149 -484442.198447 +1196 1149 -1321205.99576 +1197 1149 -2315242.24089 +1198 1149 41457.2556898 +1199 1149 -17103.8438089 +1200 1149 -5695176.55864 +1201 1149 588085.337671 +1202 1149 1278446.38624 +1203 1149 -2352102.70813 +1150 1150 3880798.16119 +1151 1150 7110485.96967 +1152 1150 -4.842877388e-8 +1153 1150 -1076372.38828 +1154 1150 -1736084.49722 +1155 1150 2.60770320892e-8 +1198 1150 -379286.632065 +1199 1150 -824536.156663 +1200 1150 -588085.337671 +1201 1150 -52167.0393844 +1202 1150 -83826.403156 +1203 1150 -61373.985991 +1204 1150 -590912.90871 +1205 1150 -953085.336629 +1206 1150 741520.302649 +1151 1151 13318817.2723 +1152 1151 -9.685754776e-8 +1153 1151 -1736084.49722 +1154 1151 -2800136.28584 +1155 1151 4.09781932831e-8 +1198 1151 -824536.156663 +1199 1151 -1792469.90579 +1200 1151 -1278446.38624 +1201 1151 -83826.403156 +1202 1151 -134521.304432 +1203 1151 32978.3592395 +1204 1151 -953085.336629 +1205 1151 -1537234.41392 +1206 1151 1196000.48814 +1152 1152 19146980.3477 +1153 1152 1.86264514923e-8 +1154 1152 3.16649675369e-8 +1155 1152 1520483.39551 +1198 1152 -588085.337671 +1199 1152 -1278446.38624 +1200 1152 -2352102.70813 +1201 1152 61373.985991 +1202 1152 -32978.3592395 +1203 1152 -6109264.54972 +1204 1152 741520.302649 +1205 1152 1196000.48814 +1206 1152 -2434642.38116 +1153 1153 6516876.42304 +1154 1153 8531914.96891 +1155 1153 -2.60770320892e-8 +1156 1153 -2626121.17726 +1157 1153 -2984228.61052 +1158 1153 9.31322574615e-9 +1201 1153 -590912.90871 +1202 1153 -953085.336629 +1203 1153 -741520.302649 +1204 1153 222027.67781 +1205 1153 227177.812693 +1206 1153 -75251.5247453 +1207 1153 -1038306.19785 +1208 1153 -1179893.40665 +1209 1153 929649.114512 +1154 1154 11512089.4984 +1155 1154 -3.72529029846e-8 +1156 1154 -2984228.61052 +1157 1154 -3391168.87559 +1158 1154 1.11758708954e-8 +1201 1154 -953085.336629 +1202 1154 -1537234.41392 +1203 1154 -1196000.48814 +1204 1154 227177.812693 +1205 1154 217630.207531 +1206 1154 55832.4159336 +1207 1154 -1179893.40665 +1208 1154 -1340787.9621 +1209 1154 1056419.44831 +1155 1155 18361731.7736 +1156 1155 1.86264514923e-9 +1157 1155 3.72529029846e-9 +1158 1155 -125380.553906 +1201 1155 -741520.302649 +1202 1155 -1196000.48814 +1203 1155 -2434642.38116 +1204 1155 75251.5247453 +1205 1155 -55832.4159336 +1206 1155 -5287984.36193 +1207 1155 929649.114512 +1208 1155 1056419.44831 +1209 1155 -2155790.5645 +1156 1156 11197028.9194 +1157 1156 7624235.1212 +1158 1156 -1.49011611938e-8 +1159 1156 -1154846.00933 +1160 1156 -476225.158488 +1161 1156 7.45058059692e-9 +1204 1156 -1038306.19785 +1205 1156 -1179893.40665 +1206 1156 -929649.114512 +1207 1156 -908773.635179 +1208 1156 -175831.894858 +1209 1156 -148519.569575 +1210 1156 -1760951.03338 +1211 1156 -726165.37459 +1212 1156 1300948.03845 +1157 1157 6560950.4012 +1159 1157 -476225.158488 +1160 1157 -196381.508655 +1161 1157 2.79396772385e-9 +1204 1157 -1179893.40665 +1205 1157 -1340787.9621 +1206 1157 -1056419.44831 +1207 1157 -175831.894858 +1208 1157 153537.59263 +1209 1157 207978.412157 +1210 1157 -726165.37459 +1211 1157 -299449.639006 +1212 1157 536473.417918 +1158 1158 21281133.3311 +1161 1158 4075797.18655 +1204 1158 -929649.114512 +1205 1158 -1056419.44831 +1206 1158 -2155790.5645 +1207 1158 148519.569575 +1208 1158 -207978.412157 +1209 1158 -7295491.64648 +1210 1158 1300948.03845 +1211 1158 536473.417918 +1212 1158 -3164492.7709 +1159 1159 14087608.2601 +1160 1159 7.45058059692e-9 +1161 1159 -7.45058059692e-9 +1162 1159 -1154846.00933 +1163 1159 476225.158488 +1164 1159 7.45058059692e-9 +1207 1159 -1760951.03338 +1208 1159 -726165.37459 +1209 1159 -1300948.03845 +1210 1159 -2367056.05396 +1211 1159 -9.31322574615e-9 +1212 1159 -5.58793544769e-9 +1213 1159 -1760951.03338 +1214 1159 726165.37459 +1215 1159 1300948.03845 +1160 1160 2395597.11087 +1161 1160 7.45058059692e-9 +1162 1160 476225.158488 +1163 1160 -196381.508655 +1164 1160 -2.79396772385e-9 +1207 1160 -726165.37459 +1208 1160 -299449.639006 +1209 1160 -536473.417918 +1210 1160 -7.45058059692e-9 +1211 1160 -402517.768767 +1212 1160 429178.734334 +1213 1160 726165.37459 +1214 1160 -299449.639006 +1215 1160 -536473.417918 +1161 1161 25315942.1547 +1164 1161 4075797.18655 +1207 1161 -1300948.03845 +1208 1161 -536473.417918 +1209 1161 -3164492.7709 +1210 1161 3.72529029846e-9 +1211 1161 -429178.734334 +1212 1161 -10404782.7221 +1213 1161 1300948.03845 +1214 1161 -536473.417918 +1215 1161 -3164492.7709 +1162 1162 11197028.9194 +1163 1162 -7624235.1212 +1164 1162 3.72529029846e-9 +1165 1162 -2626121.17726 +1166 1162 2984228.61052 +1167 1162 -7.45058059692e-9 +1210 1162 -1760951.03338 +1211 1162 726165.37459 +1212 1162 -1300948.03845 +1213 1162 -908773.635179 +1214 1162 175831.894858 +1215 1162 148519.569575 +1216 1162 -1038306.19785 +1217 1162 1179893.40665 +1218 1162 929649.114512 +1163 1163 6560950.4012 +1165 1163 2984228.61052 +1166 1163 -3391168.87559 +1167 1163 7.45058059692e-9 +1210 1163 726165.37459 +1211 1163 -299449.639006 +1212 1163 536473.417918 +1213 1163 175831.894858 +1214 1163 153537.59263 +1215 1163 207978.412157 +1216 1163 1179893.40665 +1217 1163 -1340787.9621 +1218 1163 -1056419.44831 +1164 1164 21281133.3311 +1165 1164 -1.30385160446e-8 +1166 1164 1.30385160446e-8 +1167 1164 -125380.553906 +1210 1164 -1300948.03845 +1211 1164 536473.417918 +1212 1164 -3164492.7709 +1213 1164 -148519.569575 +1214 1164 -207978.412157 +1215 1164 -7295491.64648 +1216 1164 929649.114512 +1217 1164 -1056419.44831 +1218 1164 -2155790.5645 +1165 1165 6516876.42304 +1166 1165 -8531914.96891 +1167 1165 3.72529029846e-8 +1168 1165 -1076372.38828 +1169 1165 1736084.49722 +1170 1165 -1.49011611938e-8 +1213 1165 -1038306.19785 +1214 1165 1179893.40665 +1215 1165 -929649.114512 +1216 1165 222027.67781 +1217 1165 -227177.812693 +1218 1165 75251.5247453 +1219 1165 -590912.90871 +1220 1165 953085.336629 +1221 1165 741520.302649 +1166 1166 11512089.4984 +1167 1166 -4.47034835815e-8 +1168 1166 1736084.49722 +1169 1166 -2800136.28584 +1170 1166 2.421438694e-8 +1213 1166 1179893.40665 +1214 1166 -1340787.9621 +1215 1166 1056419.44831 +1216 1166 -227177.812693 +1217 1166 217630.207531 +1218 1166 55832.4159336 +1219 1166 953085.336629 +1220 1166 -1537234.41392 +1221 1166 -1196000.48814 +1167 1167 18361731.7736 +1168 1167 -2.23517417908e-8 +1169 1167 3.53902578354e-8 +1170 1167 1520483.39551 +1213 1167 -929649.114512 +1214 1167 1056419.44831 +1215 1167 -2155790.5645 +1216 1167 -75251.5247453 +1217 1167 -55832.4159336 +1218 1167 -5287984.36193 +1219 1167 741520.302649 +1220 1167 -1196000.48814 +1221 1167 -2434642.38116 +1168 1168 3880798.16119 +1169 1168 -7110485.96967 +1170 1168 4.09781932831e-8 +1171 1168 -759692.612592 +1172 1168 1651505.67955 +1173 1168 -1.86264514923e-8 +1216 1168 -590912.90871 +1217 1168 953085.336629 +1218 1168 -741520.302649 +1219 1168 -52167.0393844 +1220 1168 83826.403156 +1221 1168 61373.985991 +1222 1168 -379286.632065 +1223 1168 824536.156663 +1224 1168 588085.337671 +1169 1169 13318817.2723 +1170 1169 -7.45058059692e-8 +1171 1169 1651505.67955 +1172 1169 -3590229.73815 +1173 1169 4.09781932831e-8 +1216 1169 953085.336629 +1217 1169 -1537234.41392 +1218 1169 1196000.48814 +1219 1169 83826.403156 +1220 1169 -134521.304432 +1221 1169 32978.3592395 +1222 1169 824536.156663 +1223 1169 -1792469.90579 +1224 1169 -1278446.38624 +1170 1170 19146980.3477 +1171 1170 -2.51457095146e-8 +1172 1170 5.40167093277e-8 +1173 1170 1124555.53479 +1216 1170 -741520.302649 +1217 1170 1196000.48814 +1218 1170 -2434642.38116 +1219 1170 -61373.985991 +1220 1170 -32978.3592395 +1221 1170 -6109264.54972 +1222 1170 588085.337671 +1223 1170 -1278446.38624 +1224 1170 -2352102.70813 +1171 1171 2558539.62181 +1172 1171 -6138307.60949 +1173 1171 4.28408384323e-8 +1174 1171 -544032.43723 +1175 1171 1483724.82881 +1176 1171 -2.51457095146e-8 +1219 1171 -379286.632065 +1220 1171 824536.156663 +1221 1171 -588085.337671 +1222 1171 12227.6197724 +1223 1171 -33038.3525625 +1224 1171 41457.2556898 +1225 1171 -260348.273704 +1226 1171 710040.746465 +1227 1171 484442.198447 +1172 1172 14915778.6682 +1173 1172 -1.19209289551e-7 +1174 1172 1483724.82881 +1175 1172 -4046522.26039 +1176 1172 7.07805156708e-8 +1219 1172 824536.156663 +1220 1172 -1792469.90579 +1221 1172 1278446.38624 +1222 1172 -33038.3525625 +1223 1172 89431.3340666 +1224 1172 17103.8438088 +1225 1172 710040.746465 +1226 1172 -1936474.76309 +1227 1172 -1321205.99576 +1173 1173 18669379.7869 +1174 1173 -2.79396772385e-8 +1175 1173 7.82310962677e-8 +1176 1173 931107.693646 +1219 1173 -588085.337671 +1220 1173 1278446.38624 +1221 1173 -2352102.70813 +1222 1173 -41457.2556898 +1223 1173 -17103.8438089 +1224 1173 -5695176.55864 +1225 1173 484442.198447 +1226 1173 -1321205.99576 +1227 1173 -2315242.24089 +1174 1174 1816739.3315 +1175 1174 -5341279.87864 +1176 1174 3.72529029846e-8 +1177 1174 -413671.243673 +1178 1174 1334423.36669 +1179 1174 -7.45058059692e-9 +1222 1174 -260348.273704 +1223 1174 710040.746465 +1224 1174 -484442.198447 +1225 1174 24667.0078013 +1226 1174 -73754.1287476 +1227 1174 27106.375452 +1228 1174 -193836.559394 +1229 1174 625279.223852 +1230 1174 416676.259817 +1175 1175 15814018.062 +1176 1175 -1.11758708954e-7 +1177 1175 1334423.36669 +1178 1175 -4304591.50545 +1179 1175 2.60770320892e-8 +1222 1175 710040.746465 +1223 1175 -1936474.76309 +1224 1175 1321205.99576 +1225 1175 -73754.1287476 +1226 1175 222052.369366 +1227 1175 9164.38855486 +1228 1175 625279.223852 +1229 1175 -2017029.75436 +1230 1175 -1344116.96715 +1176 1176 18448886.5844 +1177 1176 -1.02445483208e-8 +1178 1176 3.35276126862e-8 +1179 1176 830431.306934 +1222 1176 -484442.198447 +1223 1176 1321205.99576 +1224 1176 -2315242.24089 +1225 1176 -27106.375452 +1226 1176 -9164.38855491 +1227 1176 -5492991.14412 +1228 1176 416676.259817 +1229 1176 -1344116.96715 +1230 1176 -2296979.40748 +1177 1177 2350262.78049 +1178 1177 -4600302.86075 +1179 1177 1.86264514923e-8 +1180 1177 -7.45058059692e-9 +1183 1177 -311975.890718 +1184 1177 1184718.57235 +1185 1177 -9.31322574615e-9 +1225 1177 -193836.559394 +1226 1177 625279.223852 +1227 1177 -416676.259817 +1228 1177 -474421.1715 +1229 1177 -131724.429407 +1230 1177 23329.9193232 +1231 1177 -800250.281991 +1232 1177 8988445.57462 +1234 1177 -144050.092155 +1235 1177 547025.666412 +1236 1177 358351.461509 +1178 1178 17048556.4258 +1179 1178 -6.70552253723e-8 +1180 1178 5.96046447754e-8 +1181 1178 7.45058059692e-9 +1183 1178 1184718.57235 +1184 1178 -4498931.28739 +1185 1178 3.35276126862e-8 +1225 1178 625279.223852 +1226 1178 -2017029.75436 +1227 1178 1344116.96715 +1228 1178 -131724.429407 +1229 1178 -28174.4048382 +1230 1178 6684.54707695 +1231 1178 -6040681.08601 +1232 1178 800250.281991 +1234 1178 547025.666412 +1235 1178 -2077312.65726 +1236 1178 -1360828.33484 +1179 1179 36176122.0894 +1183 1179 -1.30385160446e-8 +1184 1179 4.47034835815e-8 +1185 1179 758227.34113 +1225 1179 -416676.259817 +1226 1179 1344116.96715 +1227 1179 -2296979.40748 +1228 1179 -23329.9193232 +1229 1179 -6684.54707698 +1230 1179 -14301137.6219 +1234 1179 358351.461509 +1235 1179 -1360828.33484 +1236 1179 -2284273.33935 +1180 1180 305878011.196 +1181 1180 -66093576.1502 +1228 1180 800250.281991 +1229 1180 6040681.08601 +1231 1180 64525513.4986 +1232 1180 4237777.92342 +1181 1181 549337215.254 +1228 1181 -8988445.57462 +1229 1181 -800250.281991 +1231 1181 4237777.92342 +1232 1181 48915433.0595 +1182 1182 715555.555556 +1233 1182 -357777.777778 +1183 1183 1011851.60912 +1184 1183 -4110093.43272 +1185 1183 6.14672899246e-8 +1228 1183 -144050.092155 +1229 1183 547025.666412 +1230 1183 -358351.461509 +1234 1183 22134.9913963 +1235 1183 -90320.994053 +1236 1183 18909.0650259 +1184 1184 16788621.6609 +1185 1184 -2.53319740295e-7 +1228 1184 547025.666412 +1229 1184 -2077312.65726 +1230 1184 1360828.33484 +1234 1184 -90320.994053 +1235 1184 370626.696215 +1236 1184 4631.25243446 +1185 1185 18240145.4814 +1228 1185 -358351.461509 +1229 1185 1360828.33484 +1230 1185 -2284273.33935 +1234 1185 -18909.0650259 +1235 1185 -4631.25243459 +1236 1185 -5293544.01962 +1186 1186 983097.517609 +1187 1186 3993191.05725 +1188 1186 -5.02914190292e-8 +1189 1186 -268071.177508 +1190 1186 -1017991.81332 +1191 1186 1.30385160446e-8 +1187 1187 16310675.5472 +1188 1187 -2.08616256714e-7 +1189 1187 -1017991.81332 +1190 1187 -3865791.69616 +1191 1187 4.842877388e-8 +1188 1188 19175351.0344 +1189 1188 8.38190317154e-9 +1190 1188 2.60770320892e-8 +1191 1188 1324183.34296 +1189 1189 2528206.57902 +1190 1189 4472508.77878 +1191 1189 -2.421438694e-8 +1192 1189 -161794.959894 +1193 1189 1643725.47145 +1195 1189 -354732.167298 +1196 1189 -1144297.31386 +1197 1189 1.49011611938e-8 +1237 1189 -183325.791023 +1238 1189 -591373.519429 +1239 1189 416676.259817 +1190 1190 16817023.5501 +1191 1190 -7.45058059692e-8 +1192 1190 -2239699.42799 +1193 1190 161794.959894 +1195 1190 -1144297.31386 +1196 1190 -3691281.65763 +1197 1190 4.842877388e-8 +1237 1190 -591373.519429 +1238 1190 -1907656.51429 +1239 1190 1344116.96715 +1191 1191 39001825.1235 +1195 1191 7.45058059692e-9 +1196 1191 1.86264514923e-8 +1197 1191 1397983.15475 +1237 1191 416676.259817 +1238 1191 1344116.96715 +1239 1191 -2538358.87127 +1192 1192 329627273.449 +1193 1192 65098710.708 +1193 1193 569419268.28 +1194 1194 790573.476703 +1195 1195 1768961.88645 +1196 1195 5200497.8108 +1197 1195 -2.23517417908e-8 +1198 1195 -465133.879389 +1199 1195 -1268546.94379 +1200 1195 2.04890966415e-8 +1237 1195 -89281.9039061 +1238 1195 -261158.775213 +1239 1195 -27106.375452 +1240 1195 -246970.319543 +1241 1195 -673555.416935 +1242 1195 484442.198447 +1196 1196 15396260.6937 +1197 1196 -5.96046447754e-8 +1198 1196 -1268546.94379 +1199 1196 -3459673.48306 +1200 1196 5.58793544769e-8 +1237 1196 -261158.775213 +1238 1196 -769227.571739 +1239 1196 9164.38855487 +1240 1196 -673555.416935 +1241 1196 -1836969.31891 +1242 1196 1321205.99576 +1197 1197 19430253.1852 +1198 1197 1.95577740669e-8 +1199 1197 5.21540641785e-8 +1200 1197 1501024.18544 +1237 1197 27106.375452 +1238 1197 -9164.3885549 +1239 1197 -7121142.78387 +1240 1197 484442.198447 +1241 1197 1321205.99576 +1242 1197 -2564546.07772 +1198 1198 2497002.01247 +1199 1198 5989724.5569 +1200 1198 -4.842877388e-8 +1201 1198 -645500.420471 +1202 1198 -1403261.78363 +1203 1198 2.79396772385e-8 +1237 1198 -246970.319543 +1238 1198 -673555.416935 +1239 1198 -484442.198447 +1240 1198 -150094.325529 +1241 1198 -356091.902114 +1242 1198 -41457.2556898 +1243 1198 -361895.781536 +1244 1198 -786729.959862 +1245 1198 588085.337671 +1199 1199 14552393.0113 +1200 1199 -1.19209289551e-7 +1201 1199 -1403261.78363 +1202 1199 -3050569.09485 +1203 1199 5.96046447754e-8 +1237 1199 -673555.416935 +1238 1199 -1836969.31891 +1239 1199 -1321205.99576 +1240 1199 -356091.902114 +1241 1199 -855385.258208 +1242 1199 17103.8438088 +1243 1199 -786729.959862 +1244 1199 -1710282.52144 +1245 1199 1278446.38624 +1200 1200 19697338.3132 +1201 1200 2.98023223877e-8 +1202 1200 6.51925802231e-8 +1203 1200 1699467.28443 +1237 1200 -484442.198447 +1238 1200 -1321205.99576 +1239 1200 -2564546.07772 +1240 1200 41457.2556898 +1241 1200 -17103.8438089 +1242 1200 -7353984.06298 +1243 1200 588085.337671 +1244 1200 1278446.38624 +1245 1200 -2616778.13471 +1201 1201 3805513.9161 +1202 1201 6969546.89216 +1203 1201 -4.09781932831e-8 +1204 1201 -900913.14915 +1205 1201 -1453085.72444 +1206 1201 2.23517417908e-8 +1240 1201 -361895.781536 +1241 1201 -786729.959862 +1242 1201 -588085.337671 +1243 1201 -304176.348108 +1244 1201 -544599.533137 +1245 1201 -61373.985991 +1246 1201 -570661.636677 +1247 1201 -920421.994641 +1248 1201 741520.302649 +1202 1202 13049076.8844 +1203 1202 -8.19563865662e-8 +1204 1202 -1453085.72444 +1205 1202 -2343686.65232 +1206 1202 3.35276126862e-8 +1240 1202 -786729.959862 +1241 1202 -1710282.52144 +1242 1202 -1278446.38624 +1243 1202 -544599.533137 +1244 1202 -995761.387374 +1245 1202 32978.3592395 +1246 1202 -920421.994641 +1247 1202 -1484551.60426 +1248 1202 1196000.48814 +1203 1203 20269767.9526 +1204 1203 2.04890966415e-8 +1205 1203 3.72529029846e-8 +1206 1203 2107431.22341 +1240 1203 -588085.337671 +1241 1203 -1278446.38624 +1242 1203 -2616778.13471 +1243 1203 61373.985991 +1244 1203 -32978.3592395 +1245 1203 -7832517.9294 +1246 1203 741520.302649 +1247 1203 1196000.48814 +1248 1203 -2731360.75727 +1204 1204 6311393.43185 +1205 1204 8279110.50413 +1206 1204 -5.21540641785e-8 +1207 1204 -2301041.15788 +1208 1204 -2614819.49759 +1209 1204 2.60770320892e-8 +1243 1204 -570661.636677 +1244 1204 -920421.994641 +1245 1204 -741520.302649 +1246 1204 -175770.085153 +1247 1204 -298827.840693 +1248 1204 -75251.5247454 +1249 1204 -955815.974241 +1250 1204 -1086154.51618 +1251 1204 929649.114512 +1205 1205 11193680.9464 +1206 1205 -7.45058059692e-8 +1207 1205 -2614819.49759 +1208 1205 -2971385.79271 +1209 1205 2.79396772385e-8 +1243 1205 -920421.994641 +1244 1205 -1484551.60426 +1245 1205 -1196000.48814 +1246 1205 -298827.840693 +1247 1205 -499398.232929 +1248 1205 55832.4159336 +1249 1205 -1086154.51618 +1250 1205 -1234266.49566 +1251 1205 1056419.44831 +1206 1206 19292741.7183 +1207 1206 3.72529029846e-9 +1208 1206 5.58793544769e-9 +1209 1206 427942.721782 +1243 1206 -741520.302649 +1244 1206 -1196000.48814 +1245 1206 -2731360.75727 +1246 1206 75251.5247453 +1247 1206 -55832.4159336 +1248 1206 -6893760.43768 +1249 1206 929649.114512 +1250 1206 1056419.44831 +1251 1206 -2324577.161 +1207 1207 11173430.2083 +1208 1207 7495059.08719 +1209 1207 -7.45058059692e-9 +1210 1207 -678836.974673 +1211 1207 -279932.773061 +1212 1207 7.45058059692e-9 +1246 1207 -955815.974241 +1247 1207 -1086154.51618 +1248 1207 -929649.114512 +1249 1207 -1698063.33368 +1250 1207 -676945.37624 +1251 1207 -148519.569575 +1252 1207 -1831641.90145 +1253 1207 -755316.248019 +1254 1207 1300948.03845 +1208 1208 6371949.42588 +1209 1208 1.11758708954e-8 +1210 1208 -279932.773061 +1211 1208 -115436.195077 +1212 1208 1.86264514923e-9 +1246 1208 -1086154.51618 +1247 1208 -1234266.49566 +1248 1208 -1056419.44831 +1249 1208 -676945.37624 +1250 1208 -252690.316209 +1251 1208 207978.412157 +1252 1208 -755316.248019 +1253 1208 -311470.61774 +1254 1208 536473.417918 +1209 1209 22658086.7563 +1211 1209 9.31322574615e-10 +1212 1209 4790763.62708 +1246 1209 -929649.114512 +1247 1209 -1056419.44831 +1248 1209 -2324577.161 +1249 1209 148519.569575 +1250 1209 -207978.412157 +1251 1209 -9252258.07493 +1252 1209 1300948.03845 +1253 1209 536473.417918 +1254 1209 -3684182.88731 +1210 1210 14370371.7322 +1211 1210 5.96046447754e-8 +1212 1210 -7.45058059692e-9 +1213 1210 -678836.974673 +1214 1210 279932.773061 +1215 1210 7.45058059692e-9 +1249 1210 -1831641.90145 +1250 1210 -755316.248019 +1251 1210 -1300948.03845 +1252 1210 -3460455.85927 +1253 1210 -6.33299350738e-8 +1254 1210 -5.58793544769e-9 +1255 1210 -1831641.90145 +1256 1210 755316.248019 +1257 1210 1300948.03845 +1211 1211 2443681.02578 +1212 1211 -3.72529029846e-9 +1213 1211 279932.773061 +1214 1211 -115436.195077 +1215 1211 -1.86264514923e-9 +1249 1211 -755316.248019 +1250 1211 -311470.61774 +1251 1211 -536473.417918 +1252 1211 -6.33299350738e-8 +1253 1211 -588450.353367 +1254 1211 429178.734334 +1255 1211 755316.248019 +1256 1211 -311470.61774 +1257 1211 -536473.417918 +1212 1212 27394702.6193 +1214 1212 -9.31322574615e-10 +1215 1212 4790763.62708 +1249 1212 -1300948.03845 +1250 1212 -536473.417918 +1251 1212 -3684182.88731 +1252 1212 3.72529029846e-9 +1253 1212 -429178.734334 +1254 1212 -12874095.835 +1255 1212 1300948.03845 +1256 1212 -536473.417918 +1257 1212 -3684182.88731 +1213 1213 11173430.2083 +1214 1213 -7495059.08719 +1215 1213 -7.45058059692e-9 +1216 1213 -2301041.15788 +1217 1213 2614819.49759 +1252 1213 -1831641.90145 +1253 1213 755316.248019 +1254 1213 -1300948.03845 +1255 1213 -1698063.33368 +1256 1213 676945.37624 +1257 1213 148519.569575 +1258 1213 -955815.974241 +1259 1213 1086154.51618 +1260 1213 929649.114512 +1214 1214 6371949.42588 +1215 1214 1.49011611938e-8 +1216 1214 2614819.49759 +1217 1214 -2971385.79271 +1252 1214 755316.248019 +1253 1214 -311470.61774 +1254 1214 536473.417918 +1255 1214 676945.37624 +1256 1214 -252690.316209 +1257 1214 207978.412157 +1258 1214 1086154.51618 +1259 1214 -1234266.49566 +1260 1214 -1056419.44831 +1215 1215 22658086.7563 +1216 1215 -1.67638063431e-8 +1217 1215 1.86264514923e-8 +1218 1215 427942.721782 +1252 1215 -1300948.03845 +1253 1215 536473.417918 +1254 1215 -3684182.88731 +1255 1215 -148519.569575 +1256 1215 -207978.412157 +1257 1215 -9252258.07493 +1258 1215 929649.114512 +1259 1215 -1056419.44831 +1260 1215 -2324577.161 +1216 1216 6311393.43185 +1217 1216 -8279110.50413 +1218 1216 4.47034835815e-8 +1219 1216 -900913.14915 +1220 1216 1453085.72444 +1221 1216 -1.86264514923e-8 +1255 1216 -955815.974241 +1256 1216 1086154.51618 +1257 1216 -929649.114512 +1258 1216 -175770.085153 +1259 1216 298827.840692 +1260 1216 75251.5247453 +1261 1216 -570661.636677 +1262 1216 920421.994641 +1263 1216 741520.302649 +1217 1217 11193680.9464 +1218 1217 -6.70552253723e-8 +1219 1217 1453085.72444 +1220 1217 -2343686.65232 +1221 1217 3.16649675369e-8 +1255 1217 1086154.51618 +1256 1217 -1234266.49566 +1257 1217 1056419.44831 +1258 1217 298827.840692 +1259 1217 -499398.232929 +1260 1217 55832.4159336 +1261 1217 920421.994641 +1262 1217 -1484551.60426 +1263 1217 -1196000.48814 +1218 1218 19292741.7183 +1219 1218 -1.67638063431e-8 +1220 1218 2.421438694e-8 +1221 1218 2107431.22341 +1255 1218 -929649.114512 +1256 1218 1056419.44831 +1257 1218 -2324577.161 +1258 1218 -75251.5247453 +1259 1218 -55832.4159336 +1260 1218 -6893760.43768 +1261 1218 741520.302649 +1262 1218 -1196000.48814 +1263 1218 -2731360.75727 +1219 1219 3805513.9161 +1220 1219 -6969546.89216 +1221 1219 2.98023223877e-8 +1222 1219 -645500.420471 +1223 1219 1403261.78363 +1224 1219 -2.04890966415e-8 +1258 1219 -570661.636677 +1259 1219 920421.994641 +1260 1219 -741520.302649 +1261 1219 -304176.348108 +1262 1219 544599.533137 +1263 1219 61373.985991 +1264 1219 -361895.781536 +1265 1219 786729.959862 +1266 1219 588085.337671 +1220 1220 13049076.8844 +1221 1220 -5.21540641785e-8 +1222 1220 1403261.78363 +1223 1220 -3050569.09485 +1224 1220 4.47034835815e-8 +1258 1220 920421.994641 +1259 1220 -1484551.60426 +1260 1220 1196000.48814 +1261 1220 544599.533137 +1262 1220 -995761.387374 +1263 1220 32978.3592395 +1264 1220 786729.959862 +1265 1220 -1710282.52144 +1266 1220 -1278446.38624 +1221 1221 20269767.9526 +1222 1221 -2.32830643654e-8 +1223 1221 5.02914190292e-8 +1224 1221 1699467.28443 +1258 1221 -741520.302649 +1259 1221 1196000.48814 +1260 1221 -2731360.75727 +1261 1221 -61373.985991 +1262 1221 -32978.3592395 +1263 1221 -7832517.9294 +1264 1221 588085.337671 +1265 1221 -1278446.38624 +1266 1221 -2616778.13471 +1222 1222 2497002.01247 +1223 1222 -5989724.5569 +1224 1222 3.91155481339e-8 +1225 1222 -465133.879389 +1226 1222 1268546.94379 +1227 1222 -2.60770320892e-8 +1261 1222 -361895.781536 +1262 1222 786729.959862 +1263 1222 -588085.337671 +1264 1222 -150094.32553 +1265 1222 356091.902114 +1266 1222 41457.2556898 +1267 1222 -246970.319543 +1268 1222 673555.416935 +1269 1222 484442.198447 +1223 1223 14552393.0113 +1224 1223 -1.04308128357e-7 +1225 1223 1268546.94379 +1226 1223 -3459673.48306 +1227 1223 7.45058059692e-8 +1261 1223 786729.959862 +1262 1223 -1710282.52144 +1263 1223 1278446.38624 +1264 1223 356091.902114 +1265 1223 -855385.258208 +1266 1223 17103.8438088 +1267 1223 673555.416935 +1268 1223 -1836969.31891 +1269 1223 -1321205.99576 +1224 1224 19697338.3132 +1225 1224 -2.88709998131e-8 +1226 1224 8.19563865662e-8 +1227 1224 1501024.18544 +1261 1224 -588085.337671 +1262 1224 1278446.38624 +1263 1224 -2616778.13471 +1264 1224 -41457.2556898 +1265 1224 -17103.8438089 +1266 1224 -7353984.06298 +1267 1224 484442.198447 +1268 1224 -1321205.99576 +1269 1224 -2564546.07772 +1225 1225 1768961.88645 +1226 1225 -5200497.8108 +1227 1225 3.16649675369e-8 +1228 1225 -354732.167298 +1229 1225 1144297.31386 +1230 1225 -6.51925802231e-9 +1264 1225 -246970.319543 +1265 1225 673555.416935 +1266 1225 -484442.198447 +1267 1225 -89281.9039061 +1268 1225 261158.775213 +1269 1225 27106.375452 +1226 1226 15396260.6937 +1227 1226 -8.94069671631e-8 +1228 1226 1144297.31386 +1229 1226 -3691281.65763 +1230 1226 1.86264514923e-8 +1264 1226 673555.416935 +1265 1226 -1836969.31891 +1266 1226 1321205.99576 +1267 1226 261158.775213 +1268 1226 -769227.571739 +1269 1226 9164.38855486 +1227 1227 19430253.1852 +1228 1227 -1.58324837685e-8 +1229 1227 5.58793544769e-8 +1230 1227 1397983.15475 +1264 1227 -484442.198447 +1265 1227 1321205.99576 +1266 1227 -2564546.07772 +1267 1227 -27106.375452 +1268 1227 -9164.38855492 +1269 1227 -7121142.78387 +1228 1228 2528206.97157 +1229 1228 -4472509.50178 +1230 1228 2.421438694e-8 +1231 1228 161793.620953 +1232 1228 1643724.74446 +1234 1228 -268071.177508 +1235 1228 1017991.81332 +1236 1228 -7.45058059692e-9 +1267 1228 -183325.791023 +1268 1228 591373.519429 +1269 1228 -416676.259817 +1229 1229 16817023.1576 +1230 1229 -7.45058059692e-8 +1231 1229 -2239700.15498 +1232 1229 -161793.620953 +1234 1229 1017991.81332 +1235 1229 -3865791.69616 +1236 1229 2.23517417908e-8 +1267 1229 591373.519429 +1268 1229 -1907656.51429 +1269 1229 1344116.96715 +1230 1230 39001825.1235 +1234 1230 -1.39698386192e-8 +1235 1230 5.21540641785e-8 +1236 1230 1324183.34296 +1267 1230 -416676.259817 +1268 1230 1344116.96715 +1269 1230 -2538358.87127 +1231 1231 329626980.943 +1232 1231 -65098171.9808 +1232 1232 569419560.785 +1233 1233 790573.476703 +1234 1234 983097.517609 +1235 1234 -3993191.05725 +1236 1234 5.58793544769e-8 +1235 1235 16310675.5472 +1236 1235 -2.30967998505e-7 +1236 1236 19175351.0344 +1237 1237 1902223.18074 +1238 1237 5590205.99024 +1239 1237 -2.98023223877e-8 +1240 1237 -77037.309496 +1241 1237 -210101.753171 +1242 1237 2.04890966415e-8 +1270 1237 -718178.246541 +1271 1237 -2108958.17516 +1272 1237 -27106.375452 +1273 1237 -300633.375282 +1274 1237 -819909.205315 +1275 1237 484442.198447 +1238 1238 16543837.5893 +1239 1238 -1.11758708954e-7 +1240 1238 -210101.753171 +1241 1238 -573004.781375 +1242 1238 5.58793544769e-8 +1270 1238 -2108958.17516 +1271 1238 -6236511.30779 +1272 1238 9164.38855486 +1273 1238 -819909.205315 +1274 1238 -2236116.0145 +1275 1238 1321205.99576 +1239 1239 30501291.4656 +1240 1239 1.95577740669e-8 +1241 1239 4.842877388e-8 +1242 1239 5508023.65257 +1270 1239 27106.375452 +1271 1239 -9164.3885549 +1272 1239 -19001911.4947 +1273 1239 484442.198447 +1274 1239 1321205.99576 +1275 1239 -5113778.6239 +1240 1240 2722764.08058 +1241 1240 6525095.96362 +1242 1240 -3.35276126862e-8 +1243 1240 -76937.6348731 +1244 1240 -167255.727985 +1245 1240 2.04890966415e-8 +1270 1240 -300633.375282 +1271 1240 -819909.205315 +1272 1240 -484442.198447 +1273 1240 -1057312.76972 +1274 1240 -2529098.59693 +1275 1240 -41457.2556898 +1276 1240 -451882.564601 +1277 1240 -982353.401306 +1278 1240 588085.337671 +1241 1241 15837837.4467 +1242 1241 -8.19563865662e-8 +1243 1241 -167255.727985 +1244 1241 -363599.408663 +1245 1241 4.65661287308e-8 +1270 1241 -819909.205315 +1271 1241 -2236116.0145 +1272 1241 -1321205.99576 +1273 1241 -2529098.59693 +1274 1241 -6126929.2712 +1275 1241 17103.8438088 +1276 1241 -982353.401306 +1277 1241 -2135550.8724 +1278 1241 1278446.38624 +1242 1242 31131706.3633 +1243 1242 2.88709998131e-8 +1244 1242 6.33299350738e-8 +1245 1242 5787467.22392 +1270 1242 -484442.198447 +1271 1242 -1321205.99576 +1272 1242 -5113778.6239 +1273 1242 41457.2556898 +1274 1242 -17103.8438089 +1275 1242 -19507359.9875 +1276 1242 588085.337671 +1277 1242 1278446.38624 +1278 1242 -5270750.35301 +1243 1243 4267595.81742 +1244 1243 7796294.34309 +1245 1243 -7.45058059692e-8 +1246 1243 -4790.05038357 +1247 1243 -7725.88771543 +1248 1243 2.60770320892e-8 +1273 1243 -451882.564601 +1274 1243 -982353.401306 +1275 1243 -588085.337671 +1276 1243 -1747893.8743 +1277 1243 -3178566.02079 +1278 1243 -61373.985991 +1279 1243 -749357.926948 +1280 1243 -1208641.81766 +1281 1243 741520.302649 +1244 1244 14559614.5621 +1245 1244 -1.34110450745e-7 +1246 1244 -7725.88771543 +1247 1244 -12461.1092184 +1248 1244 3.91155481339e-8 +1273 1244 -982353.401306 +1274 1244 -2135550.8724 +1275 1244 -1278446.38624 +1276 1244 -3178566.02079 +1277 1244 -5907985.37222 +1278 1244 32978.3592395 +1279 1244 -1208641.81766 +1280 1244 -1949422.28655 +1281 1244 1196000.48814 +1245 1245 32450763.4987 +1246 1245 1.67638063431e-8 +1247 1245 2.79396772385e-8 +1248 1245 6373223.13441 +1273 1245 -588085.337671 +1274 1245 -1278446.38624 +1275 1245 -5270750.35301 +1276 1245 61373.985991 +1277 1245 -32978.3592395 +1278 1245 -20553554.1703 +1279 1245 741520.302649 +1280 1245 1196000.48814 +1281 1245 -5606492.51233 +1246 1246 6563466.92161 +1247 1246 8716568.29938 +1248 1246 3.72529029846e-9 +1249 1246 -797223.130676 +1250 1246 -905935.375768 +1251 1246 9.31322574615e-9 +1276 1246 -749357.926948 +1277 1246 -1208641.81766 +1278 1246 -741520.302649 +1279 1246 -2303950.19297 +1280 1246 -3145795.04337 +1281 1246 -75251.5247453 +1282 1246 -1005897.92455 +1283 1246 -1143065.82336 +1284 1246 929649.114512 +1247 1247 11934357.6383 +1248 1247 7.45058059692e-9 +1249 1247 -905935.375768 +1250 1247 -1029472.01792 +1251 1247 1.11758708954e-8 +1276 1247 -1208641.81766 +1277 1247 -1949422.28655 +1278 1247 -1196000.48814 +1279 1247 -3145795.04337 +1280 1247 -4425847.45616 +1281 1247 55832.4159336 +1282 1247 -1143065.82336 +1283 1247 -1298938.43563 +1284 1247 1056419.44831 +1248 1248 30008520.3637 +1249 1248 1.49011611938e-8 +1250 1248 1.67638063431e-8 +1251 1248 4063389.39899 +1276 1248 -741520.302649 +1277 1248 -1196000.48814 +1278 1248 -5606492.51233 +1279 1248 75251.5247453 +1280 1248 -55832.4159336 +1281 1248 -18547112.2702 +1282 1248 929649.114512 +1283 1248 1056419.44831 +1284 1248 -4341829.75862 +1249 1249 13789595.5493 +1250 1249 8526963.46189 +1251 1249 -2.98023223877e-8 +1252 1249 2189391.67461 +1253 1249 902841.927676 +1254 1249 3.72529029846e-9 +1279 1249 -1005897.92455 +1280 1249 -1143065.82336 +1281 1249 -929649.114512 +1282 1249 -6588902.98151 +1283 1249 -3583442.90451 +1284 1249 -148519.569575 +1285 1249 -3101441.97781 +1286 1249 -1278945.14549 +1287 1249 1300948.03845 +1250 1250 6744151.21474 +1251 1250 -4.47034835815e-8 +1252 1250 902841.927676 +1253 1250 372305.949557 +1254 1250 2.79396772385e-9 +1279 1250 -1143065.82336 +1280 1250 -1298938.43563 +1281 1250 -1056419.44831 +1282 1250 -3583442.90451 +1283 1250 -2462219.22114 +1284 1250 207978.412157 +1285 1250 -1278945.14549 +1286 1250 -527400.059995 +1287 1250 536473.417918 +1251 1251 37051709.8254 +1253 1251 -9.31322574615e-10 +1254 1251 10537577.5004 +1279 1251 -929649.114512 +1280 1251 -1056419.44831 +1281 1251 -4341829.75862 +1282 1251 148519.569575 +1283 1251 -207978.412157 +1284 1251 -23874563.7281 +1285 1251 1300948.03845 +1286 1251 536473.417918 +1287 1251 -8175265.11488 +1252 1252 19732335.5073 +1253 1252 5.06639480591e-7 +1254 1252 7.45058059692e-9 +1255 1252 2189391.67461 +1256 1252 -902841.927676 +1257 1252 3.72529029846e-9 +1282 1252 -3101441.97781 +1283 1252 -1278945.14549 +1284 1252 -1300948.03845 +1285 1252 -10784495.2387 +1286 1252 -4.61935997009e-7 +1287 1252 -1.86264514923e-9 +1288 1252 -3101441.97781 +1289 1252 1278945.14549 +1290 1252 1300948.03845 +1253 1253 3355482.70929 +1254 1253 7.45058059692e-9 +1255 1253 -902841.927676 +1256 1253 372305.949557 +1257 1253 -2.79396772385e-9 +1282 1253 -1278945.14549 +1283 1253 -527400.059995 +1284 1253 -536473.417918 +1285 1253 -4.61935997009e-7 +1286 1253 -1833902.89956 +1287 1253 429178.734334 +1288 1253 1278945.14549 +1289 1253 -527400.059995 +1290 1253 -536473.417918 +1254 1254 47437791.9854 +1256 1254 9.31322574615e-10 +1257 1254 10537577.5004 +1282 1254 -1300948.03845 +1283 1254 -536473.417918 +1284 1254 -8175265.11488 +1286 1254 -429178.734334 +1287 1254 -31919955.1469 +1288 1254 1300948.03845 +1289 1254 -536473.417918 +1290 1254 -8175265.11488 +1255 1255 13789595.5493 +1256 1255 -8526963.46189 +1257 1255 1.86264514923e-8 +1258 1255 -797223.130676 +1259 1255 905935.375768 +1260 1255 -9.31322574615e-9 +1285 1255 -3101441.97781 +1286 1255 1278945.14549 +1287 1255 -1300948.03845 +1288 1255 -6588902.98151 +1289 1255 3583442.90451 +1290 1255 148519.569575 +1291 1255 -1005897.92455 +1292 1255 1143065.82336 +1293 1255 929649.114512 +1256 1256 6744151.21474 +1257 1256 -2.23517417908e-8 +1258 1256 905935.375768 +1259 1256 -1029472.01792 +1260 1256 9.31322574615e-9 +1285 1256 1278945.14549 +1286 1256 -527400.059995 +1287 1256 536473.417918 +1288 1256 3583442.90451 +1289 1256 -2462219.22114 +1290 1256 207978.412157 +1291 1256 1143065.82336 +1292 1256 -1298938.43563 +1293 1256 -1056419.44831 +1257 1257 37051709.8254 +1258 1257 -1.11758708954e-8 +1259 1257 1.30385160446e-8 +1260 1257 4063389.39899 +1285 1257 -1300948.03845 +1286 1257 536473.417918 +1287 1257 -8175265.11488 +1288 1257 -148519.569575 +1289 1257 -207978.412157 +1290 1257 -23874563.7281 +1291 1257 929649.114512 +1292 1257 -1056419.44831 +1293 1257 -4341829.75862 +1258 1258 6563466.92161 +1259 1258 -8716568.29938 +1260 1258 7.45058059692e-9 +1261 1258 -4790.05038359 +1262 1258 7725.88771547 +1263 1258 -7.45058059692e-9 +1288 1258 -1005897.92455 +1289 1258 1143065.82336 +1290 1258 -929649.114512 +1291 1258 -2303950.19297 +1292 1258 3145795.04337 +1293 1258 75251.5247453 +1294 1258 -749357.926948 +1295 1258 1208641.81766 +1296 1258 741520.302649 +1259 1259 11934357.6383 +1260 1259 -7.45058059692e-9 +1261 1259 7725.88771547 +1262 1259 -12461.1092185 +1263 1259 1.30385160446e-8 +1288 1259 1143065.82336 +1289 1259 -1298938.43563 +1290 1259 1056419.44831 +1291 1259 3145795.04337 +1292 1259 -4425847.45616 +1293 1259 55832.4159336 +1294 1259 1208641.81766 +1295 1259 -1949422.28655 +1296 1259 -1196000.48814 +1260 1260 30008520.3637 +1261 1260 -2.23517417908e-8 +1262 1260 3.53902578354e-8 +1263 1260 6373223.13441 +1288 1260 -929649.114512 +1289 1260 1056419.44831 +1290 1260 -4341829.75862 +1291 1260 -75251.5247453 +1292 1260 -55832.4159336 +1293 1260 -18547112.2702 +1294 1260 741520.302649 +1295 1260 -1196000.48814 +1296 1260 -5606492.51233 +1261 1261 4267595.81742 +1262 1261 -7796294.34309 +1263 1261 6.70552253723e-8 +1264 1261 -76937.6348731 +1265 1261 167255.727985 +1266 1261 -2.51457095146e-8 +1291 1261 -749357.926948 +1292 1261 1208641.81766 +1293 1261 -741520.302649 +1294 1261 -1747893.8743 +1295 1261 3178566.02079 +1296 1261 61373.985991 +1297 1261 -451882.564601 +1298 1261 982353.401306 +1299 1261 588085.337671 +1262 1262 14559614.5621 +1263 1262 -1.19209289551e-7 +1264 1262 167255.727985 +1265 1262 -363599.408663 +1266 1262 5.40167093277e-8 +1291 1262 1208641.81766 +1292 1262 -1949422.28655 +1293 1262 1196000.48814 +1294 1262 3178566.02079 +1295 1262 -5907985.37222 +1296 1262 32978.3592395 +1297 1262 982353.401306 +1298 1262 -2135550.8724 +1299 1262 -1278446.38624 +1263 1263 32450763.4987 +1264 1263 -1.86264514923e-8 +1265 1263 4.28408384323e-8 +1266 1263 5787467.22392 +1291 1263 -741520.302649 +1292 1263 1196000.48814 +1293 1263 -5606492.51233 +1294 1263 -61373.985991 +1295 1263 -32978.3592395 +1296 1263 -20553554.1703 +1297 1263 588085.337671 +1298 1263 -1278446.38624 +1299 1263 -5270750.35301 +1264 1264 2722764.08058 +1265 1264 -6525095.96362 +1266 1264 5.02914190292e-8 +1267 1264 -77037.309496 +1268 1264 210101.753171 +1269 1264 -2.70083546639e-8 +1294 1264 -451882.564601 +1295 1264 982353.401306 +1296 1264 -588085.337671 +1297 1264 -1057312.76972 +1298 1264 2529098.59693 +1299 1264 41457.2556898 +1300 1264 -300633.375282 +1301 1264 819909.205315 +1302 1264 484442.198447 +1265 1265 15837837.4467 +1266 1265 -1.26659870148e-7 +1267 1265 210101.753171 +1268 1265 -573004.781375 +1269 1265 7.45058059692e-8 +1294 1265 982353.401306 +1295 1265 -2135550.8724 +1296 1265 1278446.38624 +1297 1265 2529098.59693 +1298 1265 -6126929.2712 +1299 1265 17103.8438089 +1300 1265 819909.205315 +1301 1265 -2236116.0145 +1302 1265 -1321205.99576 +1266 1266 31131706.3633 +1267 1266 -2.60770320892e-8 +1268 1266 7.82310962677e-8 +1269 1266 5508023.65257 +1294 1266 -588085.337671 +1295 1266 1278446.38624 +1296 1266 -5270750.35301 +1297 1266 -41457.2556898 +1298 1266 -17103.8438089 +1299 1266 -19507359.9875 +1300 1266 484442.198447 +1301 1266 -1321205.99576 +1302 1266 -5113778.6239 +1267 1267 1902223.18074 +1268 1267 -5590205.99024 +1269 1267 4.28408384323e-8 +1297 1267 -300633.375282 +1298 1267 819909.205315 +1299 1267 -484442.198447 +1300 1267 -718178.246541 +1301 1267 2108958.17516 +1302 1267 27106.375452 +1268 1268 16543837.5893 +1269 1268 -1.41561031342e-7 +1297 1268 819909.205315 +1298 1268 -2236116.0145 +1299 1268 1321205.99576 +1300 1268 2108958.17516 +1301 1268 -6236511.30779 +1302 1268 9164.38855485 +1269 1269 30501291.4656 +1297 1269 -484442.198447 +1298 1269 1321205.99576 +1299 1269 -5113778.6239 +1300 1269 -27106.375452 +1301 1269 -9164.38855491 +1302 1269 -19001911.4947 +1270 1270 1902223.18074 +1271 1270 5590205.99024 +1272 1270 -5.40167093277e-8 +1273 1270 -77037.309496 +1274 1270 -210101.753171 +1275 1270 2.79396772385e-8 +1306 1270 -183325.791023 +1307 1270 -591373.519429 +1308 1270 -416676.259817 +1312 1270 -89281.9039061 +1313 1270 -261158.775213 +1314 1270 -27106.375452 +1315 1270 -246970.319543 +1316 1270 -673555.416935 +1317 1270 484442.198447 +1271 1271 16543837.5893 +1272 1271 -1.56462192535e-7 +1273 1271 -210101.753171 +1274 1271 -573004.781375 +1275 1271 7.07805156708e-8 +1306 1271 -591373.519429 +1307 1271 -1907656.51429 +1308 1271 -1344116.96715 +1312 1271 -261158.775213 +1313 1271 -769227.571739 +1314 1271 9164.38855484 +1315 1271 -673555.416935 +1316 1271 -1836969.31891 +1317 1271 1321205.99576 +1272 1272 30501291.4656 +1273 1272 1.95577740669e-8 +1274 1272 5.21540641785e-8 +1275 1272 5508023.65257 +1306 1272 -416676.259817 +1307 1272 -1344116.96715 +1308 1272 -2538358.87127 +1312 1272 27106.375452 +1313 1272 -9164.3885549 +1314 1272 -7121142.78386 +1315 1272 484442.198447 +1316 1272 1321205.99576 +1317 1272 -2564546.07772 +1273 1273 2722764.08058 +1274 1273 6525095.96362 +1275 1273 -5.96046447754e-8 +1276 1273 -76937.6348732 +1277 1273 -167255.727985 +1278 1273 3.81842255592e-8 +1312 1273 -246970.319543 +1313 1273 -673555.416935 +1314 1273 -484442.198447 +1315 1273 -150094.325529 +1316 1273 -356091.902113 +1317 1273 -41457.2556898 +1318 1273 -361895.781536 +1319 1273 -786729.959862 +1320 1273 588085.337671 +1274 1274 15837837.4467 +1275 1274 -1.41561031342e-7 +1276 1274 -167255.727985 +1277 1274 -363599.408663 +1278 1274 8.38190317154e-8 +1312 1274 -673555.416935 +1313 1274 -1836969.31891 +1314 1274 -1321205.99576 +1315 1274 -356091.902113 +1316 1274 -855385.258208 +1317 1274 17103.8438088 +1318 1274 -786729.959862 +1319 1274 -1710282.52144 +1320 1274 1278446.38624 +1275 1275 31131706.3633 +1276 1275 2.51457095146e-8 +1277 1275 5.40167093277e-8 +1278 1275 5787467.22392 +1312 1275 -484442.198447 +1313 1275 -1321205.99576 +1314 1275 -2564546.07772 +1315 1275 41457.2556898 +1316 1275 -17103.8438089 +1317 1275 -7353984.06298 +1318 1275 588085.337671 +1319 1275 1278446.38624 +1320 1275 -2616778.13471 +1276 1276 4267595.81742 +1277 1276 7796294.34309 +1278 1276 -1.49011611938e-8 +1279 1276 -4790.05038368 +1280 1276 -7725.88771562 +1281 1276 1.49011611938e-8 +1315 1276 -361895.781536 +1316 1276 -786729.959862 +1317 1276 -588085.337671 +1318 1276 -304176.348108 +1319 1276 -544599.533136 +1320 1276 -61373.985991 +1321 1276 -570661.636677 +1322 1276 -920421.994641 +1323 1276 741520.302649 +1277 1277 14559614.5621 +1278 1277 -3.72529029846e-8 +1279 1277 -7725.88771562 +1280 1277 -12461.1092187 +1281 1277 2.421438694e-8 +1315 1277 -786729.959862 +1316 1277 -1710282.52144 +1317 1277 -1278446.38624 +1318 1277 -544599.533136 +1319 1277 -995761.387374 +1320 1277 32978.3592395 +1321 1277 -920421.994641 +1322 1277 -1484551.60426 +1323 1277 1196000.48814 +1278 1278 32450763.4987 +1279 1278 1.30385160446e-8 +1280 1278 2.04890966415e-8 +1281 1278 6373223.13441 +1315 1278 -588085.337671 +1316 1278 -1278446.38624 +1317 1278 -2616778.13471 +1318 1278 61373.985991 +1319 1278 -32978.3592395 +1320 1278 -7832517.9294 +1321 1278 741520.302649 +1322 1278 1196000.48814 +1323 1278 -2731360.75727 +1279 1279 6563466.92161 +1280 1279 8716568.29938 +1281 1279 -4.842877388e-8 +1282 1279 -797223.130676 +1283 1279 -905935.375769 +1284 1279 2.421438694e-8 +1318 1279 -570661.636677 +1319 1279 -920421.994641 +1320 1279 -741520.302649 +1321 1279 -175770.085153 +1322 1279 -298827.840692 +1323 1279 -75251.5247454 +1324 1279 -955815.974241 +1325 1279 -1086154.51618 +1326 1279 929649.114512 +1280 1280 11934357.6383 +1281 1280 -7.45058059692e-8 +1282 1280 -905935.375769 +1283 1280 -1029472.01792 +1284 1280 2.79396772385e-8 +1318 1280 -920421.994641 +1319 1280 -1484551.60426 +1320 1280 -1196000.48814 +1321 1280 -298827.840692 +1322 1280 -499398.232928 +1323 1280 55832.4159336 +1324 1280 -1086154.51618 +1325 1280 -1234266.49566 +1326 1280 1056419.44831 +1281 1281 30008520.3637 +1282 1281 3.72529029846e-9 +1283 1281 5.58793544769e-9 +1284 1281 4063389.39899 +1318 1281 -741520.302649 +1319 1281 -1196000.48814 +1320 1281 -2731360.75727 +1321 1281 75251.5247453 +1322 1281 -55832.4159336 +1323 1281 -6893760.43768 +1324 1281 929649.114512 +1325 1281 1056419.44831 +1326 1281 -2324577.161 +1282 1282 13789595.5493 +1283 1282 8526963.46189 +1284 1282 -7.45058059692e-9 +1285 1282 2189391.67461 +1286 1282 902841.927676 +1287 1282 1.30385160446e-8 +1321 1282 -955815.974241 +1322 1282 -1086154.51618 +1323 1282 -929649.114512 +1324 1282 -1698063.33368 +1325 1282 -676945.37624 +1326 1282 -148519.569575 +1327 1282 -1831641.90145 +1328 1282 -755316.248019 +1329 1282 1300948.03845 +1283 1283 6744151.21474 +1284 1283 1.49011611938e-8 +1285 1283 902841.927676 +1286 1283 372305.949557 +1287 1283 5.58793544769e-9 +1321 1283 -1086154.51618 +1322 1283 -1234266.49566 +1323 1283 -1056419.44831 +1324 1283 -676945.37624 +1325 1283 -252690.316209 +1326 1283 207978.412157 +1327 1283 -755316.248019 +1328 1283 -311470.61774 +1329 1283 536473.417918 +1284 1284 37051709.8254 +1285 1284 3.72529029846e-9 +1286 1284 1.86264514923e-9 +1287 1284 10537577.5004 +1321 1284 -929649.114512 +1322 1284 -1056419.44831 +1323 1284 -2324577.161 +1324 1284 148519.569575 +1325 1284 -207978.412157 +1326 1284 -9252258.07493 +1327 1284 1300948.03845 +1328 1284 536473.417918 +1329 1284 -3684182.88731 +1285 1285 19732335.5073 +1286 1285 4.54485416412e-7 +1287 1285 -1.49011611938e-8 +1288 1285 2189391.67461 +1289 1285 -902841.927676 +1290 1285 1.30385160446e-8 +1324 1285 -1831641.90145 +1325 1285 -755316.248019 +1326 1285 -1300948.03845 +1327 1285 -3460455.85927 +1328 1285 -1.11758708954e-8 +1329 1285 -5.58793544769e-9 +1330 1285 -1831641.90145 +1331 1285 755316.248019 +1332 1285 1300948.03845 +1286 1286 3355482.70929 +1287 1286 1.49011611938e-8 +1288 1286 -902841.927676 +1289 1286 372305.949557 +1290 1286 -5.58793544769e-9 +1324 1286 -755316.248019 +1325 1286 -311470.61774 +1326 1286 -536473.417918 +1327 1286 -1.11758708954e-8 +1328 1286 -588450.353367 +1329 1286 429178.734334 +1330 1286 755316.248019 +1331 1286 -311470.61774 +1332 1286 -536473.417918 +1287 1287 47437791.9854 +1288 1287 3.72529029846e-9 +1289 1287 -1.86264514923e-9 +1290 1287 10537577.5004 +1324 1287 -1300948.03845 +1325 1287 -536473.417918 +1326 1287 -3684182.88731 +1327 1287 3.72529029846e-9 +1328 1287 -429178.734334 +1329 1287 -12874095.835 +1330 1287 1300948.03845 +1331 1287 -536473.417918 +1332 1287 -3684182.88731 +1288 1288 13789595.5493 +1289 1288 -8526963.46189 +1290 1288 -1.49011611938e-8 +1291 1288 -797223.130677 +1292 1288 905935.375769 +1293 1288 1.86264514923e-9 +1327 1288 -1831641.90145 +1328 1288 755316.248019 +1329 1288 -1300948.03845 +1330 1288 -1698063.33368 +1331 1288 676945.37624 +1332 1288 148519.569575 +1333 1288 -955815.974241 +1334 1288 1086154.51618 +1335 1288 929649.114512 +1289 1289 6744151.21474 +1290 1289 2.23517417908e-8 +1291 1289 905935.375769 +1292 1289 -1029472.01792 +1293 1289 -1.86264514923e-9 +1327 1289 755316.248019 +1328 1289 -311470.61774 +1329 1289 536473.417918 +1330 1289 676945.37624 +1331 1289 -252690.316209 +1332 1289 207978.412157 +1333 1289 1086154.51618 +1334 1289 -1234266.49566 +1335 1289 -1056419.44831 +1290 1290 37051709.8254 +1291 1290 -9.31322574615e-9 +1292 1290 1.11758708954e-8 +1293 1290 4063389.39899 +1327 1290 -1300948.03845 +1328 1290 536473.417918 +1329 1290 -3684182.88731 +1330 1290 -148519.569575 +1331 1290 -207978.412157 +1332 1290 -9252258.07493 +1333 1290 929649.114512 +1334 1290 -1056419.44831 +1335 1290 -2324577.161 +1291 1291 6563466.92161 +1292 1291 -8716568.29938 +1293 1291 4.47034835815e-8 +1294 1291 -4790.05038369 +1295 1291 7725.88771563 +1296 1291 -1.11758708954e-8 +1330 1291 -955815.974241 +1331 1291 1086154.51618 +1332 1291 -929649.114512 +1333 1291 -175770.085153 +1334 1291 298827.840692 +1335 1291 75251.5247453 +1336 1291 -570661.636677 +1337 1291 920421.994641 +1338 1291 741520.302649 +1292 1292 11934357.6383 +1293 1292 -5.96046447754e-8 +1294 1292 7725.88771563 +1295 1292 -12461.1092188 +1296 1292 1.67638063431e-8 +1330 1292 1086154.51618 +1331 1292 -1234266.49566 +1332 1292 1056419.44831 +1333 1292 298827.840692 +1334 1292 -499398.232928 +1335 1292 55832.4159336 +1336 1292 920421.994641 +1337 1292 -1484551.60426 +1338 1292 -1196000.48814 +1293 1293 30008520.3637 +1294 1293 -1.11758708954e-8 +1295 1293 2.04890966415e-8 +1296 1293 6373223.13441 +1330 1293 -929649.114512 +1331 1293 1056419.44831 +1332 1293 -2324577.161 +1333 1293 -75251.5247453 +1334 1293 -55832.4159336 +1335 1293 -6893760.43768 +1336 1293 741520.302649 +1337 1293 -1196000.48814 +1338 1293 -2731360.75727 +1294 1294 4267595.81742 +1295 1294 -7796294.34309 +1296 1294 7.45058059692e-9 +1297 1294 -76937.6348732 +1298 1294 167255.727985 +1299 1294 -1.11758708954e-8 +1333 1294 -570661.636677 +1334 1294 920421.994641 +1335 1294 -741520.302649 +1336 1294 -304176.348108 +1337 1294 544599.533136 +1338 1294 61373.985991 +1339 1294 -361895.781536 +1340 1294 786729.959862 +1341 1294 588085.337671 +1295 1295 14559614.5621 +1296 1295 -1.49011611938e-8 +1297 1295 167255.727985 +1298 1295 -363599.408663 +1299 1295 2.421438694e-8 +1333 1295 920421.994641 +1334 1295 -1484551.60426 +1335 1295 1196000.48814 +1336 1295 544599.533136 +1337 1295 -995761.387374 +1338 1295 32978.3592395 +1339 1295 786729.959862 +1340 1295 -1710282.52144 +1341 1295 -1278446.38624 +1296 1296 32450763.4987 +1297 1296 -2.23517417908e-8 +1298 1296 5.02914190292e-8 +1299 1296 5787467.22392 +1333 1296 -741520.302649 +1334 1296 1196000.48814 +1335 1296 -2731360.75727 +1336 1296 -61373.985991 +1337 1296 -32978.3592395 +1338 1296 -7832517.9294 +1339 1296 588085.337671 +1340 1296 -1278446.38624 +1341 1296 -2616778.13471 +1297 1297 2722764.08058 +1298 1297 -6525095.96362 +1299 1297 4.47034835815e-8 +1300 1297 -77037.309496 +1301 1297 210101.753171 +1302 1297 -2.04890966415e-8 +1336 1297 -361895.781536 +1337 1297 786729.959862 +1338 1297 -588085.337671 +1339 1297 -150094.325529 +1340 1297 356091.902113 +1341 1297 41457.2556898 +1342 1297 -246970.319543 +1343 1297 673555.416935 +1344 1297 484442.198447 +1298 1298 15837837.4467 +1299 1298 -1.04308128357e-7 +1300 1298 210101.753171 +1301 1298 -573004.781375 +1302 1298 5.96046447754e-8 +1336 1298 786729.959862 +1337 1298 -1710282.52144 +1338 1298 1278446.38624 +1339 1298 356091.902113 +1340 1298 -855385.258208 +1341 1298 17103.8438088 +1342 1298 673555.416935 +1343 1298 -1836969.31891 +1344 1298 -1321205.99576 +1299 1299 31131706.3633 +1300 1299 -2.88709998131e-8 +1301 1299 7.82310962677e-8 +1302 1299 5508023.65257 +1336 1299 -588085.337671 +1337 1299 1278446.38624 +1338 1299 -2616778.13471 +1339 1299 -41457.2556898 +1340 1299 -17103.8438089 +1341 1299 -7353984.06298 +1342 1299 484442.198447 +1343 1299 -1321205.99576 +1344 1299 -2564546.07772 +1300 1300 1902223.18074 +1301 1300 -5590205.99024 +1302 1300 5.21540641785e-8 +1339 1300 -246970.319543 +1340 1300 673555.416935 +1341 1300 -484442.198447 +1342 1300 -89281.9039061 +1343 1300 261158.775213 +1344 1300 27106.375452 +1345 1300 -183325.791023 +1346 1300 591373.519429 +1347 1300 416676.259817 +1301 1301 16543837.5893 +1302 1301 -1.41561031342e-7 +1339 1301 673555.416935 +1340 1301 -1836969.31891 +1341 1301 1321205.99576 +1342 1301 261158.775213 +1343 1301 -769227.571739 +1344 1301 9164.38855483 +1345 1301 591373.519429 +1346 1301 -1907656.51429 +1347 1301 -1344116.96715 +1302 1302 30501291.4656 +1339 1302 -484442.198447 +1340 1302 1321205.99576 +1341 1302 -2564546.07772 +1342 1302 -27106.375452 +1343 1302 -9164.38855491 +1344 1302 -7121142.78387 +1345 1302 416676.259817 +1346 1302 -1344116.96715 +1347 1302 -2538358.87127 +1303 1303 983097.51761 +1304 1303 3993191.05725 +1305 1303 -5.96046447754e-8 +1306 1303 -268071.177508 +1307 1303 -1017991.81332 +1308 1303 9.31322574615e-9 +1354 1303 22134.9913963 +1355 1303 90320.994053 +1356 1303 -18909.0650259 +1357 1303 -144050.092155 +1358 1303 -547025.666412 +1359 1303 358351.461509 +1304 1304 16310675.5472 +1305 1304 -2.68220901489e-7 +1306 1304 -1017991.81332 +1307 1304 -3865791.69616 +1308 1304 2.98023223877e-8 +1354 1304 90320.994053 +1355 1304 370626.696215 +1356 1304 4631.25243448 +1357 1304 -547025.666412 +1358 1304 -2077312.65726 +1359 1304 1360828.33484 +1305 1305 19175351.0344 +1306 1305 9.31322574615e-9 +1307 1305 2.98023223877e-8 +1308 1305 1324183.34296 +1354 1305 18909.0650259 +1355 1305 -4631.25243456 +1356 1305 -5293544.01962 +1357 1305 358351.461509 +1358 1305 1360828.33484 +1359 1305 -2284273.33935 +1306 1306 2528206.57902 +1307 1306 4472508.77878 +1308 1306 -3.72529029846e-8 +1309 1306 161794.959894 +1310 1306 -1643725.47145 +1312 1306 -354732.167298 +1313 1306 -1144297.31386 +1314 1306 2.23517417908e-8 +1354 1306 -144050.092155 +1355 1306 -547025.666412 +1356 1306 -358351.461509 +1357 1306 -474420.971735 +1358 1306 131724.797328 +1359 1306 -23329.9193232 +1360 1306 800256.904552 +1361 1306 8988441.97885 +1363 1306 -193836.559394 +1364 1306 -625279.223852 +1365 1306 416676.259817 +1307 1307 16817023.5501 +1308 1307 -1.19209289551e-7 +1309 1307 2239699.42799 +1310 1307 -161794.959894 +1312 1307 -1144297.31386 +1313 1307 -3691281.65763 +1314 1307 7.07805156708e-8 +1354 1307 -547025.666412 +1355 1307 -2077312.65726 +1356 1307 -1360828.33484 +1357 1307 131724.797328 +1358 1307 -28174.604603 +1359 1307 6684.54707694 +1360 1307 -6040684.68178 +1361 1307 -800256.904552 +1363 1307 -625279.223852 +1364 1307 -2017029.75436 +1365 1307 1344116.96715 +1308 1308 39001825.1235 +1312 1308 1.86264514923e-8 +1313 1308 5.58793544769e-8 +1314 1308 1397983.15475 +1354 1308 -358351.461509 +1355 1308 -1360828.33484 +1356 1308 -2284273.33935 +1357 1308 23329.9193232 +1358 1308 -6684.54707697 +1359 1308 -14301137.6219 +1363 1308 416676.259817 +1364 1308 1344116.96715 +1365 1308 -2296979.40748 +1309 1309 329627273.449 +1310 1309 65098710.708 +1357 1309 -800256.904552 +1358 1309 6040684.68178 +1360 1309 64525494.457 +1361 1309 -4237812.99363 +1310 1310 569419268.28 +1357 1310 -8988441.97885 +1358 1310 800256.904552 +1360 1310 -4237812.99363 +1361 1310 48915452.1011 +1311 1311 790573.476703 +1362 1311 -357777.777778 +1312 1312 1768961.88645 +1313 1312 5200497.8108 +1314 1312 -3.53902578354e-8 +1315 1312 -465133.879389 +1316 1312 -1268546.94379 +1317 1312 2.23517417908e-8 +1357 1312 -193836.559394 +1358 1312 -625279.223852 +1359 1312 -416676.259817 +1363 1312 24667.0078013 +1364 1312 73754.1287476 +1365 1312 -27106.375452 +1366 1312 -260348.273704 +1367 1312 -710040.746465 +1368 1312 484442.198447 +1313 1313 15396260.6937 +1314 1313 -1.11758708954e-7 +1315 1313 -1268546.94379 +1316 1313 -3459673.48306 +1317 1313 5.96046447754e-8 +1357 1313 -625279.223852 +1358 1313 -2017029.75436 +1359 1313 -1344116.96715 +1363 1313 73754.1287476 +1364 1313 222052.369366 +1365 1313 9164.38855485 +1366 1313 -710040.746465 +1367 1313 -1936474.76309 +1368 1313 1321205.99576 +1314 1314 19430253.1852 +1315 1314 1.95577740669e-8 +1316 1314 5.21540641785e-8 +1317 1314 1501024.18544 +1357 1314 -416676.259817 +1358 1314 -1344116.96715 +1359 1314 -2296979.40748 +1363 1314 27106.375452 +1364 1314 -9164.3885549 +1365 1314 -5492991.14412 +1366 1314 484442.198447 +1367 1314 1321205.99576 +1368 1314 -2315242.24089 +1315 1315 2497002.01247 +1316 1315 5989724.5569 +1317 1315 -5.21540641785e-8 +1318 1315 -645500.420471 +1319 1315 -1403261.78363 +1320 1315 2.98023223877e-8 +1363 1315 -260348.273704 +1364 1315 -710040.746465 +1365 1315 -484442.198447 +1366 1315 12227.6197724 +1367 1315 33038.3525625 +1368 1315 -41457.2556898 +1369 1315 -379286.632065 +1370 1315 -824536.156663 +1371 1315 588085.337671 +1316 1316 14552393.0113 +1317 1316 -1.26659870148e-7 +1318 1316 -1403261.78363 +1319 1316 -3050569.09485 +1320 1316 6.33299350738e-8 +1363 1316 -710040.746465 +1364 1316 -1936474.76309 +1365 1316 -1321205.99576 +1366 1316 33038.3525625 +1367 1316 89431.3340666 +1368 1316 17103.8438088 +1369 1316 -824536.156663 +1370 1316 -1792469.90579 +1371 1316 1278446.38624 +1317 1317 19697338.3132 +1318 1317 2.70083546639e-8 +1319 1317 5.77419996262e-8 +1320 1317 1699467.28443 +1363 1317 -484442.198447 +1364 1317 -1321205.99576 +1365 1317 -2315242.24089 +1366 1317 41457.2556898 +1367 1317 -17103.8438089 +1368 1317 -5695176.55864 +1369 1317 588085.337671 +1370 1317 1278446.38624 +1371 1317 -2352102.70813 +1318 1318 3805513.9161 +1319 1318 6969546.89216 +1320 1318 -4.842877388e-8 +1321 1318 -900913.14915 +1322 1318 -1453085.72444 +1323 1318 2.04890966415e-8 +1366 1318 -379286.632065 +1367 1318 -824536.156663 +1368 1318 -588085.337671 +1369 1318 -52167.0393844 +1370 1318 -83826.403156 +1371 1318 -61373.985991 +1372 1318 -590912.90871 +1373 1318 -953085.336629 +1374 1318 741520.302649 +1319 1319 13049076.8844 +1320 1319 -1.04308128357e-7 +1321 1319 -1453085.72444 +1322 1319 -2343686.65232 +1323 1319 3.53902578354e-8 +1366 1319 -824536.156663 +1367 1319 -1792469.90579 +1368 1319 -1278446.38624 +1369 1319 -83826.403156 +1370 1319 -134521.304432 +1371 1319 32978.3592395 +1372 1319 -953085.336629 +1373 1319 -1537234.41392 +1374 1319 1196000.48814 +1320 1320 20269767.9526 +1321 1320 1.67638063431e-8 +1322 1320 2.60770320892e-8 +1323 1320 2107431.22341 +1366 1320 -588085.337671 +1367 1320 -1278446.38624 +1368 1320 -2352102.70813 +1369 1320 61373.985991 +1370 1320 -32978.3592395 +1371 1320 -6109264.54972 +1372 1320 741520.302649 +1373 1320 1196000.48814 +1374 1320 -2434642.38116 +1321 1321 6311393.43185 +1322 1321 8279110.50413 +1323 1321 -1.49011611938e-8 +1324 1321 -2301041.15788 +1325 1321 -2614819.49759 +1326 1321 1.49011611938e-8 +1369 1321 -590912.90871 +1370 1321 -953085.336629 +1371 1321 -741520.302649 +1372 1321 222027.67781 +1373 1321 227177.812693 +1374 1321 -75251.5247453 +1375 1321 -1038306.19785 +1376 1321 -1179893.40665 +1377 1321 929649.114512 +1322 1322 11193680.9464 +1323 1322 -1.49011611938e-8 +1324 1322 -2614819.49759 +1325 1322 -2971385.79271 +1326 1322 1.67638063431e-8 +1369 1322 -953085.336629 +1370 1322 -1537234.41392 +1371 1322 -1196000.48814 +1372 1322 227177.812693 +1373 1322 217630.207531 +1374 1322 55832.4159336 +1375 1322 -1179893.40665 +1376 1322 -1340787.9621 +1377 1322 1056419.44831 +1323 1323 19292741.7183 +1324 1323 1.49011611938e-8 +1325 1323 1.67638063431e-8 +1326 1323 427942.721781 +1369 1323 -741520.302649 +1370 1323 -1196000.48814 +1371 1323 -2434642.38116 +1372 1323 75251.5247453 +1373 1323 -55832.4159336 +1374 1323 -5287984.36193 +1375 1323 929649.114512 +1376 1323 1056419.44831 +1377 1323 -2155790.5645 +1324 1324 11173430.2083 +1325 1324 7495059.08719 +1326 1324 -2.23517417908e-8 +1327 1324 -678836.974673 +1328 1324 -279932.773061 +1329 1324 3.72529029846e-9 +1372 1324 -1038306.19785 +1373 1324 -1179893.40665 +1374 1324 -929649.114512 +1375 1324 -908773.635179 +1376 1324 -175831.894858 +1377 1324 -148519.569575 +1378 1324 -1760951.03338 +1379 1324 -726165.37459 +1380 1324 1300948.03845 +1325 1325 6371949.42588 +1326 1325 -2.23517417908e-8 +1327 1325 -279932.773061 +1328 1325 -115436.195077 +1329 1325 9.31322574615e-10 +1372 1325 -1179893.40665 +1373 1325 -1340787.9621 +1374 1325 -1056419.44831 +1375 1325 -175831.894858 +1376 1325 153537.59263 +1377 1325 207978.412157 +1378 1325 -726165.37459 +1379 1325 -299449.639006 +1380 1325 536473.417918 +1326 1326 22658086.7563 +1327 1326 -3.72529029846e-9 +1328 1326 -1.86264514923e-9 +1329 1326 4790763.62708 +1372 1326 -929649.114512 +1373 1326 -1056419.44831 +1374 1326 -2155790.5645 +1375 1326 148519.569575 +1376 1326 -207978.412157 +1377 1326 -7295491.64648 +1378 1326 1300948.03845 +1379 1326 536473.417918 +1380 1326 -3164492.7709 +1327 1327 14370371.7322 +1328 1327 1.49011611938e-8 +1330 1327 -678836.974673 +1331 1327 279932.773061 +1332 1327 3.72529029846e-9 +1375 1327 -1760951.03338 +1376 1327 -726165.37459 +1377 1327 -1300948.03845 +1378 1327 -2367056.05396 +1379 1327 -9.31322574615e-9 +1380 1327 -5.58793544769e-9 +1381 1327 -1760951.03338 +1382 1327 726165.37459 +1383 1327 1300948.03845 +1328 1328 2443681.02578 +1329 1328 7.45058059692e-9 +1330 1328 279932.773061 +1331 1328 -115436.195077 +1332 1328 -9.31322574615e-10 +1375 1328 -726165.37459 +1376 1328 -299449.639006 +1377 1328 -536473.417918 +1378 1328 -7.45058059692e-9 +1379 1328 -402517.768767 +1380 1328 429178.734334 +1381 1328 726165.37459 +1382 1328 -299449.639006 +1383 1328 -536473.417918 +1329 1329 27394702.6193 +1330 1329 -3.72529029846e-9 +1331 1329 1.86264514923e-9 +1332 1329 4790763.62708 +1375 1329 -1300948.03845 +1376 1329 -536473.417918 +1377 1329 -3164492.7709 +1378 1329 3.72529029846e-9 +1379 1329 -429178.734334 +1380 1329 -10404782.7221 +1381 1329 1300948.03845 +1382 1329 -536473.417918 +1383 1329 -3164492.7709 +1330 1330 11173430.2083 +1331 1330 -7495059.08719 +1332 1330 2.98023223877e-8 +1333 1330 -2301041.15788 +1334 1330 2614819.49759 +1335 1330 -1.11758708954e-8 +1378 1330 -1760951.03338 +1379 1330 726165.37459 +1380 1330 -1300948.03845 +1381 1330 -908773.635179 +1382 1330 175831.894858 +1383 1330 148519.569575 +1384 1330 -1038306.19785 +1385 1330 1179893.40665 +1386 1330 929649.114512 +1331 1331 6371949.42588 +1332 1331 -2.23517417908e-8 +1333 1331 2614819.49759 +1334 1331 -2971385.79271 +1335 1331 1.11758708954e-8 +1378 1331 726165.37459 +1379 1331 -299449.639006 +1380 1331 536473.417918 +1381 1331 175831.894858 +1382 1331 153537.59263 +1383 1331 207978.412157 +1384 1331 1179893.40665 +1385 1331 -1340787.9621 +1386 1331 -1056419.44831 +1332 1332 22658086.7563 +1333 1332 -7.45058059692e-9 +1334 1332 9.31322574615e-9 +1335 1332 427942.721781 +1378 1332 -1300948.03845 +1379 1332 536473.417918 +1380 1332 -3164492.7709 +1381 1332 -148519.569575 +1382 1332 -207978.412157 +1383 1332 -7295491.64648 +1384 1332 929649.114512 +1385 1332 -1056419.44831 +1386 1332 -2155790.5645 +1333 1333 6311393.43185 +1334 1333 -8279110.50413 +1335 1333 7.45058059692e-9 +1336 1333 -900913.14915 +1337 1333 1453085.72444 +1338 1333 -1.67638063431e-8 +1381 1333 -1038306.19785 +1382 1333 1179893.40665 +1383 1333 -929649.114512 +1384 1333 222027.67781 +1385 1333 -227177.812693 +1386 1333 75251.5247453 +1387 1333 -590912.90871 +1388 1333 953085.336629 +1389 1333 741520.302649 +1334 1334 11193680.9464 +1335 1334 -7.45058059692e-9 +1336 1334 1453085.72444 +1337 1334 -2343686.65232 +1338 1334 2.421438694e-8 +1381 1334 1179893.40665 +1382 1334 -1340787.9621 +1383 1334 1056419.44831 +1384 1334 -227177.812693 +1385 1334 217630.207531 +1386 1334 55832.4159336 +1387 1334 953085.336629 +1388 1334 -1537234.41392 +1389 1334 -1196000.48814 +1335 1335 19292741.7183 +1336 1335 -1.86264514923e-8 +1337 1335 3.35276126862e-8 +1338 1335 2107431.22341 +1381 1335 -929649.114512 +1382 1335 1056419.44831 +1383 1335 -2155790.5645 +1384 1335 -75251.5247453 +1385 1335 -55832.4159336 +1386 1335 -5287984.36193 +1387 1335 741520.302649 +1388 1335 -1196000.48814 +1389 1335 -2434642.38116 +1336 1336 3805513.9161 +1337 1336 -6969546.89216 +1338 1336 3.35276126862e-8 +1339 1336 -645500.420471 +1340 1336 1403261.78363 +1341 1336 -2.04890966415e-8 +1384 1336 -590912.90871 +1385 1336 953085.336629 +1386 1336 -741520.302649 +1387 1336 -52167.0393844 +1388 1336 83826.403156 +1389 1336 61373.985991 +1390 1336 -379286.632065 +1391 1336 824536.156663 +1392 1336 588085.337671 +1337 1337 13049076.8844 +1338 1337 -6.70552253723e-8 +1339 1337 1403261.78363 +1340 1337 -3050569.09485 +1341 1337 4.47034835815e-8 +1384 1337 953085.336629 +1385 1337 -1537234.41392 +1386 1337 1196000.48814 +1387 1337 83826.403156 +1388 1337 -134521.304432 +1389 1337 32978.3592395 +1390 1337 824536.156663 +1391 1337 -1792469.90579 +1392 1337 -1278446.38624 +1338 1338 20269767.9526 +1339 1338 -2.60770320892e-8 +1340 1338 5.77419996262e-8 +1341 1338 1699467.28443 +1384 1338 -741520.302649 +1385 1338 1196000.48814 +1386 1338 -2434642.38116 +1387 1338 -61373.985991 +1388 1338 -32978.3592395 +1389 1338 -6109264.54972 +1390 1338 588085.337671 +1391 1338 -1278446.38624 +1392 1338 -2352102.70813 +1339 1339 2497002.01247 +1340 1339 -5989724.5569 +1341 1339 4.65661287308e-8 +1342 1339 -465133.879389 +1343 1339 1268546.94379 +1344 1339 -2.51457095146e-8 +1387 1339 -379286.632065 +1388 1339 824536.156663 +1389 1339 -588085.337671 +1390 1339 12227.6197724 +1391 1339 -33038.3525625 +1392 1339 41457.2556898 +1393 1339 -260348.273704 +1394 1339 710040.746465 +1395 1339 484442.198447 +1340 1340 14552393.0113 +1341 1340 -1.26659870148e-7 +1342 1340 1268546.94379 +1343 1340 -3459673.48306 +1344 1340 7.07805156708e-8 +1387 1340 824536.156663 +1388 1340 -1792469.90579 +1389 1340 1278446.38624 +1390 1340 -33038.3525625 +1391 1340 89431.3340666 +1392 1340 17103.8438088 +1393 1340 710040.746465 +1394 1340 -1936474.76309 +1395 1340 -1321205.99576 +1341 1341 19697338.3132 +1342 1341 -2.79396772385e-8 +1343 1341 7.82310962677e-8 +1344 1341 1501024.18544 +1387 1341 -588085.337671 +1388 1341 1278446.38624 +1389 1341 -2352102.70813 +1390 1341 -41457.2556898 +1391 1341 -17103.8438089 +1392 1341 -5695176.55864 +1393 1341 484442.198447 +1394 1341 -1321205.99576 +1395 1341 -2315242.24089 +1342 1342 1768961.88645 +1343 1342 -5200497.8108 +1344 1342 3.53902578354e-8 +1345 1342 -354732.167298 +1346 1342 1144297.31386 +1347 1342 -1.210719347e-8 +1390 1342 -260348.273704 +1391 1342 710040.746465 +1392 1342 -484442.198447 +1393 1342 24667.0078013 +1394 1342 -73754.1287476 +1395 1342 27106.375452 +1396 1342 -193836.559394 +1397 1342 625279.223852 +1398 1342 416676.259817 +1343 1343 15396260.6937 +1344 1343 -1.04308128357e-7 +1345 1343 1144297.31386 +1346 1343 -3691281.65763 +1347 1343 4.09781932831e-8 +1390 1343 710040.746465 +1391 1343 -1936474.76309 +1392 1343 1321205.99576 +1393 1343 -73754.1287476 +1394 1343 222052.369366 +1395 1343 9164.38855486 +1396 1343 625279.223852 +1397 1343 -2017029.75436 +1398 1343 -1344116.96715 +1344 1344 19430253.1852 +1345 1344 -1.95577740669e-8 +1346 1344 6.70552253723e-8 +1347 1344 1397983.15475 +1390 1344 -484442.198447 +1391 1344 1321205.99576 +1392 1344 -2315242.24089 +1393 1344 -27106.375452 +1394 1344 -9164.38855491 +1395 1344 -5492991.14412 +1396 1344 416676.259817 +1397 1344 -1344116.96715 +1398 1344 -2296979.40748 +1345 1345 2528206.97157 +1346 1345 -4472509.50178 +1347 1345 3.72529029846e-8 +1348 1345 -161793.620953 +1349 1345 -1643724.74446 +1351 1345 -268071.177508 +1352 1345 1017991.81332 +1353 1345 -1.02445483208e-8 +1393 1345 -193836.559394 +1394 1345 625279.223852 +1395 1345 -416676.259817 +1396 1345 -474421.1715 +1397 1345 -131724.429407 +1398 1345 23329.9193232 +1399 1345 -800250.281991 +1400 1345 8988445.57462 +1402 1345 -144050.092155 +1403 1345 547025.666412 +1404 1345 358351.461509 +1346 1346 16817023.1576 +1347 1346 -1.19209289551e-7 +1348 1346 2239700.15498 +1349 1346 161793.620953 +1351 1346 1017991.81332 +1352 1346 -3865791.69616 +1353 1346 3.35276126862e-8 +1393 1346 625279.223852 +1394 1346 -2017029.75436 +1395 1346 1344116.96715 +1396 1346 -131724.429407 +1397 1346 -28174.4048381 +1398 1346 6684.54707694 +1399 1346 -6040681.08601 +1400 1346 800250.281991 +1402 1346 547025.666412 +1403 1346 -2077312.65726 +1404 1346 -1360828.33484 +1347 1347 39001825.1235 +1351 1347 -1.30385160446e-8 +1352 1347 4.47034835815e-8 +1353 1347 1324183.34296 +1393 1347 -416676.259817 +1394 1347 1344116.96715 +1395 1347 -2296979.40748 +1396 1347 -23329.9193232 +1397 1347 -6684.54707698 +1398 1347 -14301137.6219 +1402 1347 358351.461509 +1403 1347 -1360828.33484 +1404 1347 -2284273.33935 +1348 1348 329626980.943 +1349 1348 -65098171.9808 +1396 1348 800250.281991 +1397 1348 6040681.08601 +1399 1348 64525513.4986 +1400 1348 4237777.92342 +1349 1349 569419560.785 +1396 1349 -8988445.57462 +1397 1349 -800250.281991 +1399 1349 4237777.92342 +1400 1349 48915433.0595 +1350 1350 790573.476703 +1401 1350 -357777.777778 +1351 1351 983097.51761 +1352 1351 -3993191.05725 +1353 1351 7.07805156708e-8 +1396 1351 -144050.092155 +1397 1351 547025.666412 +1398 1351 -358351.461509 +1402 1351 22134.9913963 +1403 1351 -90320.994053 +1404 1351 18909.0650259 +1352 1352 16310675.5472 +1353 1352 -2.98023223877e-7 +1396 1352 547025.666412 +1397 1352 -2077312.65726 +1398 1352 1360828.33484 +1402 1352 -90320.994053 +1403 1352 370626.696215 +1404 1352 4631.25243446 +1353 1353 19175351.0344 +1396 1353 -358351.461509 +1397 1353 1360828.33484 +1398 1353 -2284273.33935 +1402 1353 -18909.0650259 +1403 1353 -4631.25243458 +1404 1353 -5293544.01962 +1354 1354 1011851.60912 +1355 1354 4110093.43272 +1356 1354 -4.842877388e-8 +1357 1354 -311975.890718 +1358 1354 -1184718.57235 +1359 1354 1.02445483208e-8 +1355 1355 16788621.6609 +1356 1355 -2.08616256714e-7 +1357 1355 -1184718.57235 +1358 1355 -4498931.28739 +1359 1355 3.35276126862e-8 +1356 1356 18240145.4814 +1357 1356 1.11758708954e-8 +1358 1356 3.72529029846e-8 +1359 1356 758227.34113 +1357 1357 2350262.38096 +1358 1357 4600302.12491 +1359 1357 -2.60770320892e-8 +1360 1357 2.98023223877e-8 +1361 1357 -1.19209289551e-7 +1363 1357 -413671.243673 +1364 1357 -1334423.36669 +1365 1357 1.58324837685e-8 +1358 1358 17048556.8253 +1359 1358 -8.94069671631e-8 +1360 1358 5.96046447754e-8 +1363 1358 -1334423.36669 +1364 1358 -4304591.50545 +1365 1358 4.842877388e-8 +1359 1359 36176122.0894 +1363 1359 1.39698386192e-8 +1364 1359 4.09781932831e-8 +1365 1359 830431.306934 +1360 1360 305878308.174 +1361 1360 66094123.115 +1361 1361 549336918.275 +1362 1362 715555.555556 +1363 1363 1816739.3315 +1364 1363 5341279.87864 +1365 1363 -3.53902578354e-8 +1366 1363 -544032.43723 +1367 1363 -1483724.82881 +1368 1363 2.04890966415e-8 +1364 1364 15814018.062 +1365 1364 -1.11758708954e-7 +1366 1364 -1483724.82881 +1367 1364 -4046522.26039 +1368 1364 5.58793544769e-8 +1365 1365 18448886.5844 +1366 1365 2.04890966415e-8 +1367 1365 5.58793544769e-8 +1368 1365 931107.693646 +1366 1366 2558539.62181 +1367 1366 6138307.60949 +1368 1366 -5.21540641785e-8 +1369 1366 -759692.612592 +1370 1366 -1651505.67955 +1371 1366 2.98023223877e-8 +1367 1367 14915778.6682 +1368 1367 -1.34110450745e-7 +1369 1367 -1651505.67955 +1370 1367 -3590229.73815 +1371 1367 6.33299350738e-8 +1368 1368 18669379.7869 +1369 1368 2.88709998131e-8 +1370 1368 6.14672899246e-8 +1371 1368 1124555.53479 +1369 1369 3880798.16119 +1370 1369 7110485.96967 +1371 1369 -4.842877388e-8 +1372 1369 -1076372.38828 +1373 1369 -1736084.49722 +1374 1369 2.421438694e-8 +1370 1370 13318817.2723 +1371 1370 -9.685754776e-8 +1372 1370 -1736084.49722 +1373 1370 -2800136.28584 +1374 1370 3.91155481339e-8 +1371 1371 19146980.3477 +1372 1371 2.23517417908e-8 +1373 1371 3.53902578354e-8 +1374 1371 1520483.39551 +1372 1372 6516876.42304 +1373 1372 8531914.96891 +1374 1372 -2.23517417908e-8 +1375 1372 -2626121.17726 +1376 1372 -2984228.61052 +1377 1372 1.30385160446e-8 +1373 1373 11512089.4984 +1374 1373 -2.98023223877e-8 +1375 1373 -2984228.61052 +1376 1373 -3391168.87559 +1377 1373 1.30385160446e-8 +1374 1374 18361731.7736 +1375 1374 3.72529029846e-9 +1376 1374 5.58793544769e-9 +1377 1374 -125380.553907 +1375 1375 11197028.9194 +1376 1375 7624235.1212 +1377 1375 1.49011611938e-8 +1378 1375 -1154846.00933 +1379 1375 -476225.158488 +1376 1376 6560950.4012 +1377 1376 3.72529029846e-9 +1378 1376 -476225.158488 +1379 1376 -196381.508655 +1377 1377 21281133.3311 +1380 1377 4075797.18655 +1378 1378 14087608.2601 +1379 1378 -7.45058059692e-9 +1380 1378 -7.45058059692e-9 +1381 1378 -1154846.00933 +1382 1378 476225.158488 +1379 1379 2395597.11087 +1380 1379 -1.86264514923e-8 +1381 1379 476225.158488 +1382 1379 -196381.508655 +1380 1380 25315942.1547 +1383 1380 4075797.18655 +1381 1381 11197028.9194 +1382 1381 -7624235.1212 +1383 1381 -1.49011611938e-8 +1384 1381 -2626121.17726 +1385 1381 2984228.61052 +1386 1381 -5.58793544769e-9 +1382 1382 6560950.4012 +1383 1382 -7.45058059692e-9 +1384 1382 2984228.61052 +1385 1382 -3391168.87559 +1386 1382 5.58793544769e-9 +1383 1383 21281133.3311 +1384 1383 -1.11758708954e-8 +1385 1383 1.11758708954e-8 +1386 1383 -125380.553907 +1384 1384 6516876.42304 +1385 1384 -8531914.96891 +1386 1384 2.98023223877e-8 +1387 1384 -1076372.38828 +1388 1384 1736084.49722 +1389 1384 -1.67638063431e-8 +1385 1385 11512089.4984 +1386 1385 -3.72529029846e-8 +1387 1385 1736084.49722 +1388 1385 -2800136.28584 +1389 1385 2.60770320892e-8 +1386 1386 18361731.7736 +1387 1386 -2.04890966415e-8 +1388 1386 3.35276126862e-8 +1389 1386 1520483.39551 +1387 1387 3880798.16119 +1388 1387 -7110485.96967 +1389 1387 3.72529029846e-8 +1390 1387 -759692.612592 +1391 1387 1651505.67955 +1392 1387 -1.86264514923e-8 +1388 1388 13318817.2723 +1389 1388 -6.70552253723e-8 +1390 1388 1651505.67955 +1391 1388 -3590229.73815 +1392 1388 4.09781932831e-8 +1389 1389 19146980.3477 +1390 1389 -2.51457095146e-8 +1391 1389 5.40167093277e-8 +1392 1389 1124555.53479 +1390 1390 2558539.62181 +1391 1390 -6138307.60949 +1392 1390 4.09781932831e-8 +1393 1390 -544032.43723 +1394 1390 1483724.82881 +1395 1390 -2.51457095146e-8 +1391 1391 14915778.6682 +1392 1391 -1.19209289551e-7 +1393 1391 1483724.82881 +1394 1391 -4046522.26039 +1395 1391 7.07805156708e-8 +1392 1392 18669379.7869 +1393 1392 -2.79396772385e-8 +1394 1392 7.82310962677e-8 +1395 1392 931107.693646 +1393 1393 1816739.3315 +1394 1393 -5341279.87864 +1395 1393 3.72529029846e-8 +1396 1393 -413671.243673 +1397 1393 1334423.36669 +1398 1393 -8.38190317154e-9 +1394 1394 15814018.062 +1395 1394 -1.11758708954e-7 +1396 1394 1334423.36669 +1397 1394 -4304591.50545 +1398 1394 2.98023223877e-8 +1395 1395 18448886.5844 +1396 1395 -1.11758708954e-8 +1397 1395 3.72529029846e-8 +1398 1395 830431.306934 +1396 1396 2350262.78049 +1397 1396 -4600302.86075 +1398 1396 2.04890966415e-8 +1399 1396 -7.45058059692e-9 +1402 1396 -311975.890718 +1403 1396 1184718.57235 +1404 1396 -1.02445483208e-8 +1397 1397 17048556.4258 +1398 1397 -7.45058059692e-8 +1399 1397 5.96046447754e-8 +1400 1397 7.45058059692e-9 +1402 1397 1184718.57235 +1403 1397 -4498931.28739 +1404 1397 3.35276126862e-8 +1398 1398 36176122.0894 +1402 1398 -1.30385160446e-8 +1403 1398 4.47034835815e-8 +1404 1398 758227.341129 +1399 1399 305878011.196 +1400 1399 -66093576.1502 +1400 1400 549337215.254 +1401 1401 715555.555556 +1402 1402 1011851.60912 +1403 1402 -4110093.43272 +1404 1402 6.14672899246e-8 +1403 1403 16788621.6609 +1404 1403 -2.53319740295e-7 +1404 1404 18240145.4814 +1405 1405 3880798.16119 +1406 1405 -7110485.96967 +1407 1405 3.72529029846e-8 +1408 1405 -759692.612592 +1409 1405 1651505.67955 +1410 1405 -1.86264514923e-8 +1453 1405 -590912.90871 +1454 1405 953085.336629 +1455 1405 -741520.302649 +1456 1405 -52167.0393845 +1457 1405 83826.4031561 +1458 1405 61373.985991 +1459 1405 -379286.632065 +1460 1405 824536.156663 +1461 1405 588085.337671 +1406 1406 13318817.2723 +1407 1406 -6.70552253723e-8 +1408 1406 1651505.67955 +1409 1406 -3590229.73815 +1410 1406 4.09781932831e-8 +1453 1406 953085.336629 +1454 1406 -1537234.41392 +1455 1406 1196000.48814 +1456 1406 83826.4031561 +1457 1406 -134521.304432 +1458 1406 32978.3592395 +1459 1406 824536.156663 +1460 1406 -1792469.90579 +1461 1406 -1278446.38624 +1407 1407 19146980.3477 +1408 1407 -2.51457095146e-8 +1409 1407 5.40167093277e-8 +1410 1407 1124555.53479 +1453 1407 -741520.302649 +1454 1407 1196000.48814 +1455 1407 -2434642.38116 +1456 1407 -61373.985991 +1457 1407 -32978.3592395 +1458 1407 -6109264.54972 +1459 1407 588085.337671 +1460 1407 -1278446.38624 +1461 1407 -2352102.70813 +1408 1408 2558539.62181 +1409 1408 -6138307.60949 +1410 1408 4.09781932831e-8 +1411 1408 -544032.43723 +1412 1408 1483724.82881 +1413 1408 -2.51457095146e-8 +1456 1408 -379286.632065 +1457 1408 824536.156663 +1458 1408 -588085.337671 +1459 1408 12227.6197724 +1460 1408 -33038.3525624 +1461 1408 41457.2556898 +1462 1408 -260348.273704 +1463 1408 710040.746465 +1464 1408 484442.198447 +1409 1409 14915778.6682 +1410 1409 -1.11758708954e-7 +1411 1409 1483724.82881 +1412 1409 -4046522.26039 +1413 1409 7.07805156708e-8 +1456 1409 824536.156663 +1457 1409 -1792469.90579 +1458 1409 1278446.38624 +1459 1409 -33038.3525624 +1460 1409 89431.3340665 +1461 1409 17103.8438088 +1462 1409 710040.746465 +1463 1409 -1936474.76309 +1464 1409 -1321205.99576 +1410 1410 18669379.7869 +1411 1410 -2.88709998131e-8 +1412 1410 8.19563865662e-8 +1413 1410 931107.693646 +1456 1410 -588085.337671 +1457 1410 1278446.38624 +1458 1410 -2352102.70813 +1459 1410 -41457.2556898 +1460 1410 -17103.8438089 +1461 1410 -5695176.55864 +1462 1410 484442.198447 +1463 1410 -1321205.99576 +1464 1410 -2315242.24089 +1411 1411 1816739.3315 +1412 1411 -5341279.87864 +1413 1411 4.09781932831e-8 +1414 1411 -413671.243673 +1415 1411 1334423.36669 +1416 1411 -8.38190317154e-9 +1459 1411 -260348.273704 +1460 1411 710040.746465 +1461 1411 -484442.198447 +1462 1411 24667.0078013 +1463 1411 -73754.1287476 +1464 1411 27106.375452 +1465 1411 -193836.559394 +1466 1411 625279.223852 +1467 1411 416676.259817 +1412 1412 15814018.062 +1413 1412 -1.26659870148e-7 +1414 1412 1334423.36669 +1415 1412 -4304591.50545 +1416 1412 2.98023223877e-8 +1459 1412 710040.746465 +1460 1412 -1936474.76309 +1461 1412 1321205.99576 +1462 1412 -73754.1287476 +1463 1412 222052.369366 +1464 1412 9164.38855485 +1465 1412 625279.223852 +1466 1412 -2017029.75436 +1467 1412 -1344116.96715 +1413 1413 18448886.5844 +1414 1413 -1.02445483208e-8 +1415 1413 3.35276126862e-8 +1416 1413 830431.306934 +1459 1413 -484442.198447 +1460 1413 1321205.99576 +1461 1413 -2315242.24089 +1462 1413 -27106.375452 +1463 1413 -9164.3885549 +1464 1413 -5492991.14412 +1465 1413 416676.259817 +1466 1413 -1344116.96715 +1467 1413 -2296979.40748 +1414 1414 2350262.78049 +1415 1414 -4600302.86075 +1416 1414 2.04890966415e-8 +1417 1414 -7.45058059692e-9 +1420 1414 -311975.890718 +1421 1414 1184718.57235 +1422 1414 -1.02445483208e-8 +1462 1414 -193836.559394 +1463 1414 625279.223852 +1464 1414 -416676.259817 +1465 1414 -474421.1715 +1466 1414 -131724.429408 +1467 1414 23329.9193232 +1468 1414 -800250.281991 +1469 1414 8988445.57462 +1471 1414 -144050.092155 +1472 1414 547025.666412 +1473 1414 358351.461509 +1415 1415 17048556.4258 +1416 1415 -7.45058059692e-8 +1417 1415 5.96046447754e-8 +1418 1415 7.45058059692e-9 +1420 1415 1184718.57235 +1421 1415 -4498931.28739 +1422 1415 3.35276126862e-8 +1462 1415 625279.223852 +1463 1415 -2017029.75436 +1464 1415 1344116.96715 +1465 1415 -131724.429408 +1466 1415 -28174.4048381 +1467 1415 6684.54707695 +1468 1415 -6040681.08601 +1469 1415 800250.281991 +1471 1415 547025.666412 +1472 1415 -2077312.65726 +1473 1415 -1360828.33484 +1416 1416 36176122.0894 +1420 1416 -1.30385160446e-8 +1421 1416 4.47034835815e-8 +1422 1416 758227.341129 +1462 1416 -416676.259817 +1463 1416 1344116.96715 +1464 1416 -2296979.40748 +1465 1416 -23329.9193232 +1466 1416 -6684.54707698 +1467 1416 -14301137.6219 +1471 1416 358351.461509 +1472 1416 -1360828.33484 +1473 1416 -2284273.33935 +1417 1417 305878011.196 +1418 1417 -66093576.1502 +1465 1417 800250.281991 +1466 1417 6040681.08601 +1468 1417 64525513.4986 +1469 1417 4237777.92342 +1418 1418 549337215.254 +1465 1418 -8988445.57462 +1466 1418 -800250.281991 +1468 1418 4237777.92342 +1469 1418 48915433.0595 +1419 1419 715555.555556 +1470 1419 -357777.777778 +1420 1420 1011851.60912 +1421 1420 -4110093.43272 +1422 1420 6.33299350738e-8 +1465 1420 -144050.092155 +1466 1420 547025.666412 +1467 1420 -358351.461509 +1471 1420 22134.9913963 +1472 1420 -90320.9940531 +1473 1420 18909.0650259 +1421 1421 16788621.6609 +1422 1421 -2.60770320892e-7 +1465 1421 547025.666412 +1466 1421 -2077312.65726 +1467 1421 1360828.33484 +1471 1421 -90320.9940531 +1472 1421 370626.696215 +1473 1421 4631.25243447 +1422 1422 18240145.4814 +1465 1422 -358351.461509 +1466 1422 1360828.33484 +1467 1422 -2284273.33935 +1471 1422 -18909.0650259 +1472 1422 -4631.25243459 +1473 1422 -5293544.01962 +1423 1423 1011851.60912 +1424 1423 4110093.43272 +1425 1423 -4.65661287308e-8 +1426 1423 -311975.890718 +1427 1423 -1184718.57235 +1428 1423 1.30385160446e-8 +1424 1424 16788621.6609 +1425 1424 -2.01165676117e-7 +1426 1424 -1184718.57235 +1427 1424 -4498931.28739 +1428 1424 4.47034835815e-8 +1425 1425 18240145.4814 +1426 1425 1.210719347e-8 +1427 1425 4.09781932831e-8 +1428 1425 758227.34113 +1426 1426 2350262.38096 +1427 1426 4600302.12491 +1428 1426 -2.421438694e-8 +1429 1426 2.98023223877e-8 +1430 1426 -1.19209289551e-7 +1432 1426 -413671.243673 +1433 1426 -1334423.36669 +1434 1426 1.49011611938e-8 +1427 1427 17048556.8253 +1428 1427 -8.19563865662e-8 +1429 1427 5.96046447754e-8 +1432 1427 -1334423.36669 +1433 1427 -4304591.50545 +1434 1427 4.47034835815e-8 +1428 1428 36176122.0894 +1432 1428 1.49011611938e-8 +1433 1428 4.47034835815e-8 +1434 1428 830431.306934 +1429 1429 305878308.174 +1430 1429 66094123.115 +1430 1430 549336918.275 +1431 1431 715555.555556 +1432 1432 1816739.3315 +1433 1432 5341279.87864 +1434 1432 -3.53902578354e-8 +1435 1432 -544032.43723 +1436 1432 -1483724.82881 +1437 1432 2.04890966415e-8 +1433 1433 15814018.062 +1434 1433 -1.11758708954e-7 +1435 1433 -1483724.82881 +1436 1433 -4046522.26039 +1437 1433 5.58793544769e-8 +1434 1434 18448886.5844 +1435 1434 2.23517417908e-8 +1436 1434 5.96046447754e-8 +1437 1434 931107.693647 +1435 1435 2558539.62181 +1436 1435 6138307.60949 +1437 1435 -5.58793544769e-8 +1438 1435 -759692.612592 +1439 1435 -1651505.67955 +1440 1435 2.98023223877e-8 +1436 1436 14915778.6682 +1437 1436 -1.34110450745e-7 +1438 1436 -1651505.67955 +1439 1436 -3590229.73815 +1440 1436 6.33299350738e-8 +1437 1437 18669379.7869 +1438 1437 2.70083546639e-8 +1439 1437 5.77419996262e-8 +1440 1437 1124555.53479 +1438 1438 3880798.16119 +1439 1438 7110485.96967 +1440 1438 -4.47034835815e-8 +1441 1438 -1076372.38828 +1442 1438 -1736084.49722 +1443 1438 2.79396772385e-8 +1439 1439 13318817.2723 +1440 1439 -8.94069671631e-8 +1441 1439 -1736084.49722 +1442 1439 -2800136.28584 +1443 1439 4.47034835815e-8 +1440 1440 19146980.3477 +1441 1440 2.23517417908e-8 +1442 1440 3.53902578354e-8 +1443 1440 1520483.39551 +1441 1441 6516876.42304 +1442 1441 8531914.96891 +1443 1441 -2.23517417908e-8 +1444 1441 -2626121.17726 +1445 1441 -2984228.61052 +1446 1441 9.31322574615e-9 +1442 1442 11512089.4984 +1443 1442 -3.72529029846e-8 +1444 1442 -2984228.61052 +1445 1442 -3391168.87559 +1446 1442 1.11758708954e-8 +1443 1443 18361731.7736 +1444 1443 3.72529029846e-9 +1445 1443 5.58793544769e-9 +1446 1443 -125380.553907 +1444 1444 11197028.9194 +1445 1444 7624235.1212 +1446 1444 -1.49011611938e-8 +1447 1444 -1154846.00933 +1448 1444 -476225.158488 +1449 1444 1.86264514923e-9 +1445 1445 6560950.4012 +1446 1445 -7.45058059692e-9 +1447 1445 -476225.158488 +1448 1445 -196381.508655 +1449 1445 9.31322574615e-10 +1446 1446 21281133.3311 +1449 1446 4075797.18655 +1447 1447 14087608.2601 +1448 1447 -7.45058059692e-9 +1449 1447 -7.45058059692e-9 +1450 1447 -1154846.00933 +1451 1447 476225.158488 +1452 1447 1.86264514923e-9 +1448 1448 2395597.11087 +1449 1448 7.45058059692e-9 +1450 1448 476225.158488 +1451 1448 -196381.508655 +1452 1448 -9.31322574615e-10 +1449 1449 25315942.1547 +1452 1449 4075797.18655 +1450 1450 11197028.9194 +1451 1450 -7624235.1212 +1452 1450 1.11758708954e-8 +1453 1450 -2626121.17726 +1454 1450 2984228.61052 +1455 1450 -7.45058059692e-9 +1451 1451 6560950.4012 +1452 1451 -7.45058059692e-9 +1453 1451 2984228.61052 +1454 1451 -3391168.87559 +1455 1451 7.45058059692e-9 +1452 1452 21281133.3311 +1453 1452 -2.04890966415e-8 +1454 1452 2.23517417908e-8 +1455 1452 -125380.553907 +1453 1453 6516876.42304 +1454 1453 -8531914.96891 +1455 1453 3.72529029846e-8 +1456 1453 -1076372.38828 +1457 1453 1736084.49722 +1458 1453 -1.30385160446e-8 +1454 1454 11512089.4984 +1455 1454 -4.47034835815e-8 +1456 1454 1736084.49722 +1457 1454 -2800136.28584 +1458 1454 2.04890966415e-8 +1455 1455 18361731.7736 +1456 1455 -2.04890966415e-8 +1457 1455 3.35276126862e-8 +1458 1455 1520483.39551 +1456 1456 3880798.16119 +1457 1456 -7110485.96967 +1458 1456 4.09781932831e-8 +1459 1456 -759692.612592 +1460 1456 1651505.67955 +1461 1456 -1.86264514923e-8 +1457 1457 13318817.2723 +1458 1457 -7.45058059692e-8 +1459 1457 1651505.67955 +1460 1457 -3590229.73815 +1461 1457 4.09781932831e-8 +1458 1458 19146980.3477 +1459 1458 -2.51457095146e-8 +1460 1458 5.40167093277e-8 +1461 1458 1124555.53479 +1459 1459 2558539.62181 +1460 1459 -6138307.60949 +1461 1459 4.28408384323e-8 +1462 1459 -544032.43723 +1463 1459 1483724.82881 +1464 1459 -2.79396772385e-8 +1460 1460 14915778.6682 +1461 1460 -1.19209289551e-7 +1462 1460 1483724.82881 +1463 1460 -4046522.26039 +1464 1460 7.82310962677e-8 +1461 1461 18669379.7869 +1462 1461 -2.79396772385e-8 +1463 1461 8.19563865662e-8 +1464 1461 931107.693647 +1462 1462 1816739.3315 +1463 1462 -5341279.87864 +1464 1462 3.72529029846e-8 +1465 1462 -413671.243673 +1466 1462 1334423.36669 +1467 1462 -7.45058059692e-9 +1463 1463 15814018.062 +1464 1463 -1.11758708954e-7 +1465 1463 1334423.36669 +1466 1463 -4304591.50545 +1467 1463 2.60770320892e-8 +1464 1464 18448886.5844 +1465 1464 -1.02445483208e-8 +1466 1464 3.35276126862e-8 +1467 1464 830431.306934 +1465 1465 2350262.78049 +1466 1465 -4600302.86075 +1467 1465 1.86264514923e-8 +1468 1465 -7.45058059692e-9 +1471 1465 -311975.890718 +1472 1465 1184718.57235 +1473 1465 -1.02445483208e-8 +1466 1466 17048556.4258 +1467 1466 -6.70552253723e-8 +1468 1466 5.96046447754e-8 +1469 1466 7.45058059692e-9 +1471 1466 1184718.57235 +1472 1466 -4498931.28739 +1473 1466 3.35276126862e-8 +1467 1467 36176122.0894 +1471 1467 -1.39698386192e-8 +1472 1467 4.842877388e-8 +1473 1467 758227.34113 +1468 1468 305878011.196 +1469 1468 -66093576.1502 +1469 1469 549337215.254 +1470 1470 715555.555556 +1471 1471 1011851.60912 +1472 1471 -4110093.43272 +1473 1471 6.33299350738e-8 +1472 1472 16788621.6609 +1473 1472 -2.60770320892e-7 +1473 1473 18240145.4814 diff --git a/packages/belos/kokkos/src/BelosKokkosAdapter.hpp b/packages/belos/kokkos/src/BelosKokkosAdapter.hpp new file mode 100644 index 000000000000..745258f9f433 --- /dev/null +++ b/packages/belos/kokkos/src/BelosKokkosAdapter.hpp @@ -0,0 +1,686 @@ +//@HEADER +// ************************************************************************ +// +// Belos: Block Linear Solvers Package +// Copyright 2004 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Jennifer A. Loe (jloe@sandia.gov) +// +// ************************************************************************ +//@HEADER + +/*! \file BelosKokkosAdapter.hpp + \brief Implementation of the interface between Belos virtual classes and Kokkos concrete classes. + Allows the user to use a Kokkos::view as a Belos::MultiVector in the Belos solvers. + \warning Note: This class does not currently allow the user to run Belos solvers which + require accessing non-contiguous columns of data in memory. +*/ + +#include +#include +#include +#include + +#include +#include +#include + +#include + + +#ifndef BELOS_KOKKOS_ADAPTER_HPP +#define BELOS_KOKKOS_ADAPTER_HPP +namespace Belos { + +//Forward class declaration of KokkosCrsOperator: +template +class KokkosCrsOperator; + +/// \class KokkosMultiVec +/// \brief Implementation of Belos::MultiVec using Kokkos::View. +/// \author Jennifer Loe +/// +/// \tparam ScalarType The type of entries of the multivector. +/// \tparam Device The Kokkos::ExecutionSpace where the multivector +/// should reside. +/// +/// Belos::MultiVec offers a simple abstract interface for +/// multivector operations in Belos solver algorithms. This class +/// implements Belos::MultiVec using Kokkos::View. +template +class KokkosMultiVec : public MultiVec { + +public: + + using ViewVectorType = Kokkos::View; + using ConstViewVectorType = Kokkos::View; + using ViewMatrixType = Kokkos::View; + using ConstViewMatrixType = Kokkos::View; + + //Unmanaged view types: + using UMHostViewVectorType = + Kokkos::View>; + using UMHostConstViewVectorType = + Kokkos::View>; + using UMHostViewMatrixType = + Kokkos::View>; + using UMHostConstViewMatrixType = + Kokkos::View>; + +protected: + ViewMatrixType myView; + +public: + //! @name Constructors/Destructor + //@{ + + /// \brief Returns a multivector with `numrows` rows and `numvecs` columns. + /// + /// The `label` string indicates the label for the internal `Kokkos::view`. + /// If `zeroOut` is set to `true`, the multivector will be initialized to zeros. + KokkosMultiVec (const std::string label, const int numrows, const int numvecs, const bool zeroOut = true) : + myView (Kokkos::view_alloc(Kokkos::WithoutInitializing,label),numrows,numvecs) + { if (zeroOut) { Kokkos::deep_copy(myView,0); } } + + /// \brief Returns a multivector with `numrows` rows and `numvecs` columns. + /// + /// If `zeroOut` is set to `true`, the multivector will be initialized to zeros. + KokkosMultiVec (const int numrows, const int numvecs, const bool zeroOut = true) : + myView (Kokkos::view_alloc(Kokkos::WithoutInitializing,"MV"),numrows,numvecs) + { if (zeroOut) { Kokkos::deep_copy(myView,0); } } + + /// \brief Returns a single column multivector with `numrows` rows. + /// + /// If `zeroOut` is set to `true`, the multivector will be initialized to zeros. + KokkosMultiVec (const int numrows, const bool zeroOut = true) : + myView(Kokkos::view_alloc(Kokkos::WithoutInitializing,"MV"),numrows,1) + { if (zeroOut) { Kokkos::deep_copy(myView,0); } } + + //! Copy constructor (performs deep copy). + + /// This copy constructor returns a new KokksMultiVec containing a + /// deep copy of the multivector given by the user. + KokkosMultiVec (const KokkosMultiVec &sourceVec) : + myView(Kokkos::view_alloc(Kokkos::WithoutInitializing,"MV"),(int)sourceVec.GetGlobalLength(),sourceVec.GetNumberVecs()) + { Kokkos::deep_copy(myView,sourceVec.GetInternalViewConst()); } + + //! Copy constructor for type conversion. (Performs deep copy.) + + /// This copy constructor returns a new KokksMultiVec containing a + /// deep copy of the multivector given by the user. + /// The internal data of the multivector is converted from + /// `ScalarType` to `ScalarType2`. + template < class ScalarType2 > + KokkosMultiVec (const KokkosMultiVec &sourceVec) : + myView(Kokkos::view_alloc(Kokkos::WithoutInitializing, "MV"),(int)sourceVec.GetGlobalLength(),sourceVec.GetNumberVecs()) + { Kokkos::deep_copy(myView,sourceVec.GetInternalViewConst()); } + + //! Assignment operator (performs deep copy). + + /// This `=` operator performs a deep copy of + /// the right-hand side KokkosMultiVec to the + /// left-hand side KokkosMultiVec. The left-hand + /// side MultiVec will be resized if necessary. + KokkosMultiVec & operator=(const KokkosMultiVec & sourceVec) { + int len = sourceVec.GetGlobalLength(); + int cols = sourceVec.GetNumberVecs(); + if( len != (int)myView.extent(0) || cols != (int)myView.extent(1) ){ + Kokkos::resize(myView, len, cols); + } + Kokkos::deep_copy(myView,sourceVec.GetInternalViewConst()); + return *this; + } + + //! Assignment operator for type conversion. (Performs deep copy.) + + /// This `=` operator performs a deep copy of + /// the right-hand side KokkosMultiVec to the + /// left-hand side KokkosMultiVec. The left-hand + /// side MultiVec will be resized if necessary. + /// The internal data of the right-hand side multivec + /// is converted from `ScalarType` to `ScalarType2`. + template < class ScalarType2 > + KokkosMultiVec & operator=(const KokkosMultiVec & sourceVec) { + int len = sourceVec.GetGlobalLength(); + int cols = sourceVec.GetNumberVecs(); + if( len != (int)myView.extent(0) || cols != (int)myView.extent(1) ){ + Kokkos::resize(myView, len, cols); + } + Kokkos::deep_copy(myView,sourceVec.GetInternalViewConst()); + return *this; + } + + //! Create a KokkosMultiVec from a given `Kokkos::view`. + + /// Returns a KokkosMultiVec that internally stores the + /// data given in `sourceView`. If `makeCopy` has value + /// `true`, then this function makes a deep copy of the + /// `Kokkos::view`. If `false`, then the KokkosMultiVec stores a + /// shallow copy of the given `Kokkos::view`. (This option assumes that + /// the user will make no changes to that view outside of + /// the KokkosMultiVec interface.) + KokkosMultiVec (const ViewMatrixType & sourceView, bool makeCopy = true) { + if( makeCopy ){ + if( sourceView.extent(0) != myView.extent(0) || sourceView.extent(1) != myView.extent(1) ){ + Kokkos::resize(myView, sourceView.extent(0), sourceView.extent(1)); + } + Kokkos::deep_copy(myView, sourceView); + } + else{ + myView = sourceView; + } + } + + //! Create a KokkosMultiVec with ScalarType2 from a given `Kokkos::view` with ScalarType1. + + /// Returns a KokkosMultiVec that internally stores the + /// data given in `sourceView`. This function always makes + /// a deep copy of the sourceView in order to change scalar + /// types. + template < class ScalarType2 > //TODO: Fix this so that passing in a view without device specified actually compiles... + KokkosMultiVec (const Kokkos::View & sourceView) : + myView(Kokkos::view_alloc(Kokkos::WithoutInitializing, "MV"),sourceView.extent(0),sourceView.extent(1)) + { Kokkos::deep_copy(myView,sourceView); } + + //! Destructor (default) + ~KokkosMultiVec(){} + + //@} + + //! @name Data Access Methods + //@{ + + //! Reader (const) method for internal view. + + /// Returns the (const) view that stores internal data + /// for the KokkosMultiVec. + ConstViewMatrixType GetInternalViewConst() const { + return myView; + } + + //! Reader/Writer method for internal view. + + /// Returns the view that stores internal data + /// for the KokkosMultiVec. + /// \warning ** Be careful!! ** The KokkosMultiVec does + /// NOT expect users to use this function to + /// make changes to its internal data. Most + /// necessary changes can be made via other functions. + /// Make sure you know what you are doing! + ViewMatrixType GetInternalViewNonConst(){ + return myView; + } + //@} + + //! @name Copy/View functions inherited from Belos::MultiVec + //@{ + + //! Creates a MultiVec with same data distribution as `this`. + + /// A virtual "copy constructor" that returns a pointer to a new + /// Belos::MultiVec. (Underneath, the vector is a KokkosMultiVec, + /// and its properties can be accessed via `dynamic_cast`.) + /// This vector's entries are + /// not copied; instead, a new MultiVec is created with the same + /// data distribution, but with numvecs columns (numvecs > 0). + /// Multivector entries are not initialized. + /// + /// \param numvecs [in] The number of columns in the output + /// multivector. Must be positive. + MultiVec * Clone ( const int numvecs ) const{ + KokkosMultiVec * ptr = new KokkosMultiVec(myView.extent(0),numvecs, false); + return ptr; + } + + //! \brief Creates a MultiVec which is a (deep) copy of `this`. + /// + /// A virtual "copy constructor" returning a pointer to a new + /// object of Belos::MultiVec. (KokkosMultiVec underneath.) + /// All of this vector's entries are + /// copied and a new stand-alone multivector is created. (deep + /// copy). + MultiVec * CloneCopy () const{ + KokkosMultiVec * ptr = new KokkosMultiVec(myView.extent(0),myView.extent(1), false); + Kokkos::deep_copy(ptr->GetInternalViewNonConst(),myView); + return ptr; + } + + //! \brief Creates a MultiVec which is a (deep) copy of selected columns of `this`. + /// + /// A virtual "copy constructor" returning a pointer to a new Belos::MultiVec. + /// This vector's entries are copied and a new + /// stand-alone MultiVector is created where only selected columns + /// are chosen. (deep copy). + /// Indexing is zero-based, so an `std::vector index` with values 0, 3, 5 would + /// indicate copying the first, 4th, and 6th columns of the original multivector. + /// Indices need not be contiguous or ordered. + /// Result is `output[:,i] = (*this)[:,index[i]]`. + MultiVec * CloneCopy ( const std::vector& index ) const{ + // JAL- If debug options needed, could add validity checks of index. + // See debug code in belos/src/tpetra/BelosMultiVecTraits_Tpetra.hpp. + int numvecs = index.size(); + KokkosMultiVec * B = new KokkosMultiVec("B",myView.extent(0),numvecs, false); + bool isContigAscending = true; + + //Check whether the given indices are contiguous and ascending. + for(unsigned int i=0; i< (index.size()-1); i++){ + if( index[i+1] != index[i]+1 ){ + isContigAscending = false; + } + } + + //Copy the vectors: (Case depends on indices.) + if(isContigAscending && index.size()==(unsigned)this->GetNumberVecs()){ //Copy entire multivec. + Kokkos::deep_copy(B->GetInternalViewNonConst(),myView); + } + else if (isContigAscending){ //Copy contiguous subset + ViewMatrixType ThisSub = Kokkos::subview(myView, Kokkos::ALL, std::make_pair(index.front(), index.back()+1)); + Kokkos::deep_copy(B->GetInternalViewNonConst(),ThisSub); + } + else{ //Copy columns one by one + for(unsigned int i=0; iGetInternalViewNonConst(), Kokkos::ALL, i); + auto ThisSub = Kokkos::subview(myView, Kokkos::ALL, index[i]); + Kokkos::deep_copy(Bsub, ThisSub); + } + } + return B; + } + + //! \brief Creates a (read-only) MultiVec which is a shallow copy of selected columns of `this`. + /// + /// A virtual view constructor returning a pointer to a new Belos::MultiVec with + /// selected columns. (Column indexing is zero-based.) The view is read-only. + /// This vector's entries are shared and hence no + /// memory is allocated for the columns. (Internally, we create + /// a `Kokkos::subview`.) + /// \warning At this time, the Kokkos-Belos adapter only supports + /// viewing column indices that form a contiguous subset in memory. + /// Thus, the values in `index` must be contiguous and ascending (e.g. 0,1,2,3). + const MultiVec * CloneView ( const std::vector& index ) const { //TODO This isn't const!! + bool isContigAscending = true; + //Check whether the given indices are contiguous and ascending. + for(unsigned int i=0; i< (index.size()-1); i++){ + if( index[i+1] != index[i]+1 ){ + isContigAscending = false; + } + } + if(isContigAscending ){ + const KokkosMultiVec * B = + new KokkosMultiVec(Kokkos::subview(myView, Kokkos::ALL, std::make_pair(index.front(), index.back()+1)),false); + return B; + } + else{ + throw std::runtime_error("CloneView asked for non-contiguous subset. \n This feature is not yet supported in Belos for Kokkos."); + } + } + + + //! \brief Creates a nonconst MultiVec which is a shallow copy of selected columns of `this`. + /// + /// A virtual view constructor returning a pointer to a new Belos::MultiVec with + /// selected columns. (Column indexing is zero-based.) + /// This vector's entries are shared and hence no + /// memory is allocated for the columns. (Internally, we create + /// a `Kokkos::subview`.) Writing to this view will change the + /// entries of the original multivector. + /// \warning At this time, the Kokkos-Belos adapter only supports + /// viewing column indices that form a contiguous subset in memory. + /// Thus, the values in `index` must be contiguous and ascending (e.g. 0,1,2,3). + MultiVec * CloneViewNonConst ( const std::vector& index ){ + bool isContigAscending = true; + //Check whether the given indices are contiguous and ascending. + for(unsigned int i=0; i< (index.size()-1); i++){ + if( index[i+1] != index[i]+1 ){ + isContigAscending = false; + } + } + if(isContigAscending ){ + KokkosMultiVec * B = + new KokkosMultiVec(Kokkos::subview(myView, Kokkos::ALL, std::make_pair(index.front(), index.back()+1)),false); + return B; + } + else{ + throw std::runtime_error("CloneViewNonConst asked for non-contiguous subset. \n This feature is not yet supported in Belos for Kokkos."); + } + } + + //! Copy the vectors in A to the vectors in (*this) specified by index. (Deep copy.) + + /// Copies vectors of A to a sub-block of vectors of this multivector. (Deep copy.) + /// The sub-block to be overwritten is given by the indices and need not be contiguous. + /// Result is (*this)[:,index[i]] = A[:,i]. + /// Column indexing is zero-based. + /// + void SetBlock ( const MultiVec& A, const std::vector& index ){ + KokkosMultiVec *A_vec = dynamic_cast(&const_cast &>(A)); + + if( index.size() > myView.extent(1) ){ + throw std::runtime_error("Error in KokkosMultiVec::SetBlock. A cannot have more vectors than (*this)."); + } + bool isContigAscending = true; + //Check whether the given indices are contiguous and ascending. + for(unsigned int i=0; i< (index.size()-1); i++){ + if( index[i+1] != index[i]+1 ){ + isContigAscending = false; + } + } + + //Perform deep copy of sub block: + if(isContigAscending && index.size()==(unsigned)this->GetNumberVecs()){ //Copy entire multivec. + Kokkos::deep_copy(myView,A_vec->GetInternalViewConst()); + } + else if (isContigAscending){ //Copy contiguous subset + ConstViewMatrixType Asub = Kokkos::subview(A_vec->GetInternalViewConst(), Kokkos::ALL, std::make_pair(0,(int)index.size())); + ViewMatrixType ThisSub = Kokkos::subview(myView, Kokkos::ALL, std::make_pair(index.front(), index.back()+1)); + Kokkos::deep_copy(ThisSub, Asub); + } + else{ //Copy columns one by one + for(unsigned int i=0; iGetInternalViewConst(), Kokkos::ALL, i); + ViewVectorType ThisSub = Kokkos::subview(myView, Kokkos::ALL, index[i]); + Kokkos::deep_copy(ThisSub, Asub); + } + } + } + //@} + + //! @name Attribue functions inherited from Belos::MultiVec + //@{ + //! Returns the number of rows in the multivector. + ptrdiff_t GetGlobalLength () const { + return static_cast(myView.extent(0)); + } + + //! Returns the number of columns in the multivector. + int GetNumberVecs () const { return myView.extent(1); } + //@} + + //! @name Mathematical functions inherited from Belos::MultiVec + //@{ + //! \brief `*this <- alpha * A * B + beta * (*this)` + /// + /// where alpha and beta are scalars and the dimensions of `A*B` match + /// the dimensions of `(*this)`. + void MvTimesMatAddMv ( const ScalarType alpha, const MultiVec& A, + const Teuchos::SerialDenseMatrix& B, const ScalarType beta ){ + KokkosMultiVec *A_vec = dynamic_cast(&const_cast &>(A)); + if( myView.extent(1) == 1 && A_vec->GetInternalViewConst().extent(1) == 1){ //B is a scalar. + ScalarType scal1 = alpha*B(0,0); + ViewVectorType mysub = Kokkos::subview(myView, Kokkos::ALL, 0); + ConstViewVectorType Asub = Kokkos::subview(A_vec->GetInternalViewConst(), Kokkos::ALL, 0); + KokkosBlas::axpby(scal1, Asub, beta, mysub); + } + else{ + UMHostConstViewMatrixType mat_h(B.values(), A_vec->GetInternalViewConst().extent(1), myView.extent(1)); + ViewMatrixType mat_d(Kokkos::view_alloc(Kokkos::WithoutInitializing,"mat"), A_vec->GetInternalViewConst().extent(1), myView.extent(1)); + Kokkos::deep_copy(mat_d, mat_h); + if( myView.extent(1) == 1 ){ // B has only 1 col + ConstViewVectorType Bsub = Kokkos::subview(mat_d, Kokkos::ALL, 0); + ViewVectorType mysub = Kokkos::subview(myView, Kokkos::ALL, 0); + KokkosBlas::gemv("N", alpha, A_vec->GetInternalViewConst(), Bsub, beta, mysub); + } + else{ + KokkosBlas::gemm("N", "N", alpha, A_vec->GetInternalViewConst(), mat_d, beta, myView); + } + } + } + + //! `*this <- alpha * A + beta * B` + /// + /// Scale and add two vectors. Store the result in `*this`. + void MvAddMv ( const ScalarType alpha, const MultiVec& A, const ScalarType beta, + const MultiVec& B){ + KokkosMultiVec *A_vec = dynamic_cast(&const_cast &>(A)); + KokkosMultiVec *B_vec = dynamic_cast(&const_cast &>(B)); + + KokkosBlas::update(alpha, A_vec->GetInternalViewConst(), beta, B_vec->GetInternalViewConst(), (ScalarType) 0.0, myView); + } + + /// `*this <- alpha * this` + /// + //! Scale (multiply) each element of the vectors in \c *this with \c alpha. + void MvScale ( const ScalarType alpha ) { + KokkosBlas::scal(myView, alpha, myView); + } + + /// `*this[:,i] <- alpha[i] * this[:,i]` + /// + //! Scale (multiply) each element of the \c i-th vector in \c *this with \c alpha[i]. + void MvScale ( const std::vector& alpha ){ + + //Move scalar values to a Kokkos View: + UMHostConstViewVectorType scalars_h(alpha.data(), alpha.size()); + ViewVectorType scalars_d(Kokkos::view_alloc(Kokkos::WithoutInitializing,"scalars_d"), alpha.size()); + Kokkos::deep_copy(scalars_d, scalars_h); + + KokkosBlas::scal(myView, scalars_d, myView); + } + + //! B <- alpha * A^T * (*this) + /// + /// Computes matrix product with transpose. Result is a dense matrix. + /// Conjugate transpose is used as appropriate. + void MvTransMv ( const ScalarType alpha, const MultiVec& A, Teuchos::SerialDenseMatrix& B ) const{ + KokkosMultiVec *A_vec = dynamic_cast(&const_cast &>(A)); + if(A_vec->myView.extent(1) == 1 && myView.extent(1) == 1){ + ConstViewVectorType Asub = Kokkos::subview(A_vec->GetInternalViewConst(), Kokkos::ALL, 0); + ViewVectorType mysub = Kokkos::subview(myView, Kokkos::ALL, 0); + ScalarType soln = KokkosBlas::dot(Asub, mysub); + soln = alpha*soln; + B(0,0) = soln; + } + // *** + // For MvTransMv, this option runs slower than GEMM on NVIDIA V100. + // Do not enable for now. + // **** + // else if( myView.extent(1) == 1 ){ // Only 1 col in soln vec + // ViewVectorType soln(Kokkos::view_alloc(Kokkos::WithoutInitializing,"soln"), A_vec->GetInternalViewConst().extent(1)); + // ViewVectorType mysub = Kokkos::subview(myView, Kokkos::ALL, 0); + // KokkosBlas::gemv("C", alpha, A_vec->GetInternalViewConst(), mysub, ScalarType(0.0), soln); + // for( unsigned int i = 0; i < soln.extent(0); i++){ + // B(i,0) = soln(i); + // } + // } + else{ + UMHostViewMatrixType soln_h(B.values(), A_vec->GetInternalViewConst().extent(1), myView.extent(1)); + ViewMatrixType soln_d(Kokkos::view_alloc(Kokkos::WithoutInitializing,"mat"), A_vec->GetInternalViewConst().extent(1), myView.extent(1)); + KokkosBlas::gemm("C", "N", alpha, A_vec->GetInternalViewConst(), myView, ScalarType(0.0), soln_d); + Kokkos::deep_copy(soln_h, soln_d); + } + } + + + //! b[i] = A[i]^T * this[i] + + /// Performs a dot product between A and (*this). + /// Uses conjugate transpose when appropriate. + /// Output is a vector. + void MvDot ( const MultiVec& A, std::vector& b ) const{ + //Put output vector in unmanaged Kokkos view: + UMHostViewVectorType dotView_h(b.data(),myView.extent(1)); + ViewVectorType dotView_d(Kokkos::view_alloc(Kokkos::WithoutInitializing,"Dot"),myView.extent(1)); + + KokkosMultiVec *A_vec = dynamic_cast(&const_cast &>(A)); + + KokkosBlas::dot(dotView_d, A_vec->GetInternalViewConst(), myView); + Kokkos::deep_copy(dotView_h, dotView_d); + } + + //! alpha[i] = norm of i-th column of (*this) + + /// Valid norm types are Belos::TwoNorm, Belos::OneNorm, + /// and Belos::InfNorm. + void MvNorm ( std::vector& normvec, NormType norm_type = TwoNorm ) const{ + + //Put output vector in unmanaged Kokkos view: + UMHostViewVectorType normView_h(normvec.data(),myView.extent(1)); + ViewVectorType normView_d(Kokkos::view_alloc(Kokkos::WithoutInitializing,"Norm"),myView.extent(1)); + + switch( norm_type ) { + case ( OneNorm ) : + KokkosBlas::nrm1(normView_d, myView); + break; + case ( TwoNorm ) : + KokkosBlas::nrm2(normView_d, myView); + break; + case ( InfNorm ) : + KokkosBlas::nrminf(normView_d, myView); + break; + default: + TEUCHOS_TEST_FOR_EXCEPTION(true, std::invalid_argument, + "Belos::KokkosMultiVec::MvNorm: Invalid norm_type " + << norm_type << ". The current list of valid norm " + "types is {OneNorm, TwoNorm, InfNorm}."); + } + Kokkos::deep_copy(normView_h, normView_d); + } + //@} + + //! @name Initialization functions inherited from Belos::MultiVec + //@{ + //! Fill all columns of *this with random values. + void MvRandom() { + int rand_seed = std::rand(); + Kokkos::Random_XorShift64_Pool<> pool(rand_seed); + Kokkos::fill_random(myView, pool, -1,1); + } + + //! Initialize each element of (*this) to the scalar value alpha. + void MvInit ( const ScalarType alpha ) { + Kokkos::deep_copy(myView,alpha); + } + //@} + + //! @name Print function inherited from Belos::MultiVec + //@{ + //! Print (*this) to the given output stream. + + /// (This function will first copy the multivector to host space + /// if needed.) + void MvPrint( std::ostream& os ) const { + typename ViewMatrixType::HostMirror hostView("myViewMirror", myView.extent(0), myView.extent(1)); + Kokkos::deep_copy(hostView, myView); + for(unsigned int i = 0; i < (hostView.extent(0)); i++){ + for (unsigned int j = 0; j < (hostView.extent(1)); j++){ + os << hostView(i , j) << " "; + } + os << std::endl; + } + os << std::endl; + } + //@} + +}; + +/// \class KokkosCrsOperator +/// \brief Implementation of Belos::Operator using KokkosSparse::CrsMatrix. +template +class KokkosCrsOperator : public Operator { + +private: + // Shallow copy of the CrsMatrix used for SpMV. + KokkosSparse::CrsMatrix myMatrix; + +public: + //! @name Constructor/Destructor + //@{ + //! Constructor obtains a shallow copy of the given CrsMatrix. + KokkosCrsOperator (const KokkosSparse::CrsMatrix mat) + : myMatrix(mat) {} + + //! Destructor. + ~KokkosCrsOperator(){} + //@} + + //! @name Methods relating to applying the operator + //@{ + + /// \brief Apply the operator to x, putting the result in y. + /// + /// Take the KokkosMultiVec \c x and apply the operator (or its + /// transpose or Hermitian transpose) to it, writing the result + /// into the KokkosMultiVec \c y. (This performs a sparse matrix- + /// vector product.) + /// + /// \param x [in] The input multivector. + /// + /// \param y [out] The output multivector. x and y may not alias + /// (i.e., be views of) one another. + /// + /// \param trans [in] Whether to apply the operator (Belos::NOTRANS), its + /// transpose (Belos::TRANS), or its Hermitian transpose (Belos::CONJTRANS). + /// The default is Belos::NOTRANS. (Defined in BelosTypes.hpp.) + /// + void Apply (const MultiVec& x, MultiVec& y, ETrans trans=NOTRANS) const{ + + // Determine transpose mode: + char mode[] = "X"; + switch(trans){ + case NOTRANS: + mode[0]='N'; + break; + case TRANS: + mode[0]='T'; + break; + case CONJTRANS: + mode[0]='C'; + break; + default: + TEUCHOS_TEST_FOR_EXCEPTION(true, std::invalid_argument, + "Belos::KokkosCrsOperator::Apply: Invalid ETrans type "); + } + + //Use dynamic_cast to tell the compiler these are Kokkos Multivecs. + KokkosMultiVec *x_vec = + dynamic_cast *>(&const_cast &>(x)); + KokkosMultiVec *y_vec = dynamic_cast *>(&y); + + //KokkosSparse::spmv computes y = beta*y + alpha*Op(A)*x + ScalarType alpha = 1.0; + ScalarType beta = 0; + KokkosSparse::spmv(mode, alpha, myMatrix, x_vec->GetInternalViewConst(), beta, y_vec->GetInternalViewNonConst()); + } + + /// \brief Whether this operator implements applying the transpose. + /// + /// This function returns true since we can always apply the transpose + /// of a Kokkos::CrsMatrix. + /// + bool HasApplyTranspose () const { + return true; + } + //@} +}; +}// end namespace Belos +#endif diff --git a/packages/belos/kokkos/src/CMakeLists.txt b/packages/belos/kokkos/src/CMakeLists.txt new file mode 100644 index 000000000000..4d8c6851c1f1 --- /dev/null +++ b/packages/belos/kokkos/src/CMakeLists.txt @@ -0,0 +1,39 @@ + + +# +# A) Package-specific configuration options +# + +# +# B) Define the header and source files (and directories) +# + +# +# src +# + +SET(HEADERS "") +SET(SOURCES "") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) + +# +# Core Files +# + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +APPEND_SET(HEADERS + BelosKokkosAdapter.hpp + ) + +# +# C) Define the targets for package's library(s) +# +#TRIBITS_ADD_LIBRARY( +# beloskokkos +# HEADERS ${HEADERS} +# SOURCES ${SOURCES} +# DEPLIBS belos +# ) + diff --git a/packages/belos/kokkos/test/BelosKokkosMVOPTester.hpp b/packages/belos/kokkos/test/BelosKokkosMVOPTester.hpp new file mode 100644 index 000000000000..51a4be03b13e --- /dev/null +++ b/packages/belos/kokkos/test/BelosKokkosMVOPTester.hpp @@ -0,0 +1,1610 @@ +//@HEADER +// ************************************************************************ +// +// Belos: Block Linear Solvers Package +// Copyright 2004 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +//@HEADER +// +#ifndef BELOS_KOKKOS_MVOPTESTER_HPP +#define BELOS_KOKKOS_MVOPTESTER_HPP + +// Assumptions that I have made: +// * I assume/verify that a multivector must have at least one std::vector. This seems +// to be consistent with Epetra_MultiVec. +// * I do not assume that an operator is deterministic; I do assume that the +// operator, applied to 0, will return 0. + +/*! \file BelosKokkosMVOPTester.hpp + \brief Test routines for Kokkos MultiVecTraits and OperatorTraits conformity. + Note: This tester file is a direct copy of the BelosMVOPTester.hpp, + except that the tests for accessing non-contiguous columns of data have + been removed for the testing of the Kokkos adapter. +*/ + +#include "BelosConfigDefs.hpp" +#include "BelosTypes.hpp" + +#include "BelosMultiVecTraits.hpp" +#include "BelosOperatorTraits.hpp" +#include "BelosOutputManager.hpp" + +#include "Teuchos_RCP.hpp" +#include "Teuchos_SetScientific.hpp" +#include "Teuchos_SerialDenseHelpers.hpp" + +namespace Belos { + + /// \brief Test correctness of a MultiVecTraits specialization and + /// multivector implementation. + /// + /// \tparam ScalarType The type of the entries in the multivectors; + /// the first template parameter of MultiVecTraits. + /// \tparam MV The multivector type; the second template parameter + /// of MultiVecTraits. + /// + /// \param om [in/out] A valid OutputManager, for displaying test results. + /// + /// \param A [in] An initial multivector, to use for making new + /// multivectors. (Belos doesn't currently have a "vector space" + /// abstraction; making a new multivector requires a valid input + /// multivector to clone.) + /// + /// \return Test result: true if all tests passed, else false. + template< class ScalarType, class MV > + bool + TestKokkosMultiVecTraits (const Teuchos::RCP > &om, + const Teuchos::RCP &A) + { + using Teuchos::SetScientific; + using std::endl; + typedef MultiVecTraits MVT; + typedef Teuchos::ScalarTraits STS; + typedef typename STS::magnitudeType MagType; + + // Make sure that all floating-point numbers are printed with the + // right precision. + SetScientific sci (om->stream (Warnings)); + + // FIXME (mfh 09 Jan 2013) Added an arbitrary tolerance in case + // norms are not computed deterministically (which is possible + // even with MPI only, and more likely with threads). + const MagType tol = Teuchos::as (100) * STS::eps (); + + /* MVT Contract: + + Clone(MV,int) + CloneCopy(MV) + CloneCopy(MV,vector) + USER: will request positive number of vectors + MV: will return a multivector with exactly the number of + requested vectors. + vectors are the same dimension as the cloned MV + + + CloneView(MV,vector) [const and non-const] + USER: There is no assumed communication between creation and + destruction of a view. I.e., after a view is created, changes to the + source multivector are not reflected in the view. Likewise, until + destruction of the view, changes in the view are not reflected in the + source multivector. + + GetGlobalLength + MV: will always be positive (MV cannot have zero vectors) + + GetNumberVecs + MV: will always be positive (MV cannot have zero vectors) + + MvAddMv + USER: multivecs will be of the same dimension and same number of vecs + MV: input vectors will not be modified + performing C=0*A+1*B will assign B to C exactly + + MvTimesMatAddMv + USER: multivecs and serialdensematrix will be of the proper shape + MV: input arguments will not be modified + following arithmetic relations hold exactly: + A*I = A + 0*B = B + 1*B = B + + MvTransMv + USER: SerialDenseMatrix will be large enough to hold results. + MV: SerialDenseMatrix will not be resized. + Inner products will satisfy |a'*b| <= |a|*|b| + alpha == 0 => SerialDenseMatrix == 0 + + MvDot + USER: Results vector will be large enough for results. + Both multivectors will have the same number of vectors. + (Epetra crashes, otherwise.) + MV: Inner products will satisfy |a'*b| <= |a|*|b| + Results vector will not be resized. + + MvNorm + MV: vector norm is always non-negative, and zero + only for zero vectors. + results vector should not be resized + + SetBlock + USER: indices will be distinct + MV: assigns copies of the vectors to the specified + locations, leaving the other vectors untouched. + + MvRandom + MV: Generate zero vector with "zero" probability + Don't gen the same vectors twice. + + MvInit + MV: Init(alpha) sets all elements to alpha + + MvScale (two versions) + MV: scales multivector values + + MvPrint + MV: routine does not modify vectors (not tested here) + *********************************************************************/ + + const ScalarType one = STS::one(); + const ScalarType zero = STS::zero(); + const MagType zero_mag = Teuchos::ScalarTraits::zero(); + + // Don't change these two without checking the initialization of ind below + const int numvecs = 10; + const int numvecs_2 = 5; + + std::vector ind(numvecs_2); + std::vector indContig(numvecs_2); + + /* Initialize indices for selected copies/views + The MVT specialization should not assume that + these are ordered or even distinct. + Also retrieve the edges. + + However, to spice things up, grab the first std::vector, + last std::vector, and choose the others randomly. + */ + TEUCHOS_TEST_FOR_EXCEPT(numvecs_2 != 5); + ind[0] = 0; + ind[1] = 5; + ind[2] = 2; + ind[3] = 2; + ind[4] = 9; + + indContig[0] = 2; + indContig[1] = 3; + indContig[2] = 4; + indContig[3] = 5; + indContig[4] = 6; + + /*********** GetNumberVecs() ***************************************** + Verify: + 1) This number should be strictly positive + *********************************************************************/ + if ( MVT::GetNumberVecs(*A) <= 0 ) { + om->stream(Warnings) + << "*** ERROR *** MultiVectorTraits::GetNumberVecs()." << endl + << "Returned <= 0." << endl; + return false; + } + + + /*********** GetGlobalLength() *************************************** + Verify: + 1) This number should be strictly positive + *********************************************************************/ + if ( MVT::GetGlobalLength(*A) <= 0 ) { + om->stream(Warnings) + << "*** ERROR *** MultiVectorTraitsExt::GetGlobalLength()" << endl + << "Returned <= 0." << endl; + return false; + } + + + /*********** Clone() and MvNorm() ************************************ + Verify: + 1) Clone() allows us to specify the number of vectors + 2) Clone() returns a multivector of the same dimension + 3) Vector norms shouldn't be negative + 4) MvNorm result std::vector should not be resized + *********************************************************************/ + { + Teuchos::RCP B = MVT::Clone(*A,numvecs); + std::vector norms(2*numvecs); + bool ResizeWarning = false; + if ( MVT::GetNumberVecs(*B) != numvecs ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::Clone()." << endl + << "Did not allocate requested number of vectors." << endl; + return false; + } + if ( MVT::GetGlobalLength(*B) != MVT::GetGlobalLength(*A) ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::Clone()." << endl + << "Did not allocate requested number of vectors." << endl; + return false; + } + MVT::MvNorm(*B, norms); + if ( norms.size() != 2*numvecs && ResizeWarning==false ) { + om->stream(Warnings) + << "*** WARNING *** MultiVecTraits::MvNorm()." << endl + << "Method resized the output vector." << endl; + ResizeWarning = true; + } + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::Clone()." << endl + << "Vector had negative norm." << endl; + return false; + } + } + } + + + /*********** MvRandom() and MvNorm() and MvInit() ******************** + Verify: + 1) Set vectors to zero + 2) Check that norm is zero + 3) Perform MvRandom. + 4) Verify that vectors aren't zero anymore + 5) Perform MvRandom again. + 6) Verify that std::vector norms are different than before + + Without knowing something about the random distribution, + this is about the best that we can do, to make sure that MvRandom + did at least *something*. + + Also, make sure std::vector norms aren't negative. + *********************************************************************/ + { + Teuchos::RCP B = MVT::Clone(*A,numvecs); + std::vector norms(numvecs), norms2(numvecs); + + MVT::MvInit(*B); + MVT::MvNorm(*B, norms); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvInit() " + << "and MultiVecTraits::MvNorm()" << endl + << "Supposedly zero vector has non-zero norm." << endl; + return false; + } + } + MVT::MvRandom(*B); + MVT::MvNorm(*B, norms); + MVT::MvRandom(*B); + MVT::MvNorm(*B, norms2); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvRandom()." << endl + << "Random vector was empty (very unlikely)." << endl; + return false; + } + else if ( norms[i] < zero_mag || norms2[i] < zero_mag ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvRandom()." << endl + << "Vector had negative norm." << endl; + return false; + } + else if ( norms[i] == norms2[i] ) { + om->stream(Warnings) + << "*** ERROR *** MutliVecTraits::MvRandom()." << endl + << "Vectors not random enough." << endl; + return false; + } + } + } + + + /*********** MvRandom() and MvNorm() and MvScale() ******************* + Verify: + 1) Perform MvRandom. + 2) Verify that vectors aren't zero + 3) Set vectors to zero via MvScale + 4) Check that norm is zero + *********************************************************************/ + { + Teuchos::RCP B = MVT::Clone(*A,numvecs); + std::vector norms(numvecs); + + MVT::MvRandom(*B); + MVT::MvScale(*B,STS::zero()); + MVT::MvNorm(*B, norms); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvScale(alpha) " + << "Supposedly zero vector has non-zero norm." << endl; + return false; + } + } + + MVT::MvRandom(*B); + std::vector zeros(numvecs,STS::zero()); + MVT::MvScale(*B,zeros); + MVT::MvNorm(*B, norms); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvScale(alphas) " + << "Supposedly zero vector has non-zero norm." << endl; + return false; + } + } + } + + + /*********** MvInit() and MvNorm() *********************************** + A std::vector of ones of dimension n should have norm std::sqrt(n) + 1) Init vectors to all ones + 2) Verify that norm is std::sqrt(n) + 3) Verify that norms aren't negative + + Note: I'm not sure that we can expect this to hold in practice. + Maybe something like std::abs(norm-std::sqrt(n)) < STS::eps() ??? + The sum of 1^2==1 should be n, but what about std::sqrt(n)? + They may be using a different square root than ScalartTraits + On my iBook G4 and on jeter, this test works. + Right now, this has been demoted to a warning. + *********************************************************************/ + { + Teuchos::RCP B = MVT::Clone(*A,numvecs); + std::vector norms(numvecs); + + MVT::MvInit(*B,one); + MVT::MvNorm(*B, norms); + bool BadNormWarning = false; + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvRandom()." << endl + << "Vector had negative norm." << endl; + return false; + } + else if ( norms[i] != STS::squareroot(MVT::GetGlobalLength(*B)) && !BadNormWarning ) { + om->stream(Warnings) + << endl + << "Warning testing MultiVecTraits::MvInit()." << endl + << "Ones std::vector should have norm std::sqrt(dim)." << endl + << "norms[i]: " << norms[i] << "\tdim: " << MVT::GetGlobalLength(*B) << endl << endl; + BadNormWarning = true; + } + } + } + + + /*********** MvInit() and MvNorm() *********************************** + A std::vector of zeros of dimension n should have norm 0 + 1) Verify that norms aren't negative + 2) Verify that norms are zero + + We must know this works before the next tests. + *********************************************************************/ + { + Teuchos::RCP B = MVT::Clone(*A,numvecs); + std::vector norms(numvecs); + MVT::MvInit(*B, zero_mag); + MVT::MvNorm(*B, norms); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvInit()." << endl + << "Vector had negative norm." << endl; + return false; + } + else if ( norms[i] != zero_mag ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvInit()." << endl + << "Zero std::vector should have norm zero." << endl; + return false; + } + } + } + + + /*********** CloneCopy(MV,std::vector) and MvNorm ******************** + 1) Check quantity/length of vectors + 2) Check std::vector norms for agreement + 3) Zero out B and make sure that C norms are not affected + *********************************************************************/ + { + Teuchos::RCP B, C; + std::vector norms(numvecs), norms2(numvecs); + + B = MVT::Clone(*A,numvecs); + MVT::MvRandom(*B); + MVT::MvNorm(*B, norms); + C = MVT::CloneCopy(*B,ind); + MVT::MvNorm(*C, norms2); + if ( MVT::GetNumberVecs(*C) != numvecs_2 ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl + << "Wrong number of vectors." << endl; + return false; + } + if ( MVT::GetGlobalLength(*C) != MVT::GetGlobalLength(*B) ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl + << "Vector lengths don't match." << endl; + return false; + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl + << "Copied vectors do not agree: " + << norms2[i] << " != " << norms[ind[i]] << endl + << "Difference " << STS::magnitude (norms2[i] - norms[ind[i]]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + MVT::MvInit(*B,zero); + MVT::MvNorm(*C, norms); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy(ind)." << endl + << "Copied vectors were not independent." << endl + << norms2[i] << " != " << norms[i] << endl + << "Difference " << STS::magnitude (norms2[i] - norms[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + } + + /*********** CloneCopy(MV) and MvNorm ******************************** + 1) Check quantity + 2) Check value of norms + 3) Zero out B and make sure that C is still okay + *********************************************************************/ + { + Teuchos::RCP B, C; + std::vector norms(numvecs), norms2(numvecs); + + B = MVT::Clone(*A,numvecs); + MVT::MvRandom(*B); + MVT::MvNorm(*B, norms); + C = MVT::CloneCopy(*B); + MVT::MvNorm(*C, norms2); + if ( MVT::GetNumberVecs(*C) != numvecs ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy()." << endl + << "Wrong number of vectors." << endl; + return false; + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy()." << endl + << "Copied vectors do not agree: " + << norms2[i] << " != " << norms[i] << endl + << "Difference " << STS::magnitude (norms2[i] - norms[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + MVT::MvInit(*B,zero); + MVT::MvNorm(*C, norms); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneCopy()." << endl + << "Copied vectors were not independent." << endl + << norms2[i] << " != " << norms[i] << endl + << "Difference " << STS::magnitude (norms2[i] - norms[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + } + + + /*********** CloneView(MV,std::vector) and MvNorm ******************** + Check that we have a view of the selected vectors + 1) Check quantity + 2) Check value of norms + 3) Zero out B and make sure that C is zero as well + *********************************************************************/ + { + Teuchos::RCP B, C; + std::vector norms(numvecs), norms2(numvecs); + + B = MVT::Clone(*A,numvecs); + MVT::MvRandom(*B); + MVT::MvNorm(*B, norms); + C = MVT::CloneViewNonConst(*B,indContig); + MVT::MvNorm(*C, norms2); + if ( MVT::GetNumberVecs(*C) != numvecs_2 ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneView(indContig)." << endl + << "Wrong number of vectors." << endl; + return false; + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::CloneView(indContig)." << endl + << "Viewed vectors do not agree." << endl; + return false; + } + } + } + + + /*********** CloneView(const MV,std::vector) and MvNorm() ************ + Check that we have a view of the selected vectors. + 1) Check quantity + 2) Check value of norms for agreement + 3) Zero out B and make sure that C is zerod as well + *********************************************************************/ + { + Teuchos::RCP B; + Teuchos::RCP C; + std::vector normsB(numvecs), normsC(numvecs_2); + std::vector allind(numvecs); + for (int i=0; istream(Warnings) + << "*** ERROR *** const MultiVecTraits::CloneView(indContig)." << endl + << "Wrong number of vectors." << endl; + return false; + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** const MultiVecTraits::CloneView(indContig)." << endl + << "Viewed vectors do not agree." << endl; + return false; + } + } + } + + /*********** SetBlock() and MvNorm() ********************************* + SetBlock() will copy the vectors from C into B + 1) Verify that the specified vectors were copied + 2) Verify that the other vectors were not modified + 3) Verify that C was not modified + 4) Change C and then check B to make sure it was not modified + + Use a different index set than has been used so far (distinct entries). + This is because duplicate entries will cause the std::vector to be + overwritten, making it more difficult to test. + *********************************************************************/ + { + Teuchos::RCP B, C; //numvecs = 10, numvecs_2 = 5 + std::vector normsB1(numvecs), normsB2(numvecs), + normsC1(numvecs_2), normsC2(numvecs_2); + + B = MVT::Clone(*A,numvecs); + C = MVT::Clone(*A,numvecs_2); + // Just do every other one, interleaving the vectors of C into B + ind.resize(numvecs_2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Operation modified source vectors." << endl; + return false; + } + } + // check that the correct vectors of B were modified + // and the others were not + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Copied vectors do not agree: " << endl + << normsB2[i] << " != " << normsC1[i/2] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsC1[i/2]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + else { + // should be an original vector + if (STS::magnitude (normsB1[i] - normsB2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Incorrect vectors were modified." << endl + << normsB1[i] << " != " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsB2[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + } + MVT::MvInit(*C,zero); + MVT::MvNorm(*B,normsB1); + // verify that we copied and didn't reference + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Copied vectors were not independent." << endl + << normsB1[i] << " != " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB1[i] - normsB2[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + } + + + /*********** SetBlock() and MvNorm() ********************************* + SetBlock() will copy the vectors from C into B + 1) Verify that the specified vectors were copied + 2) Verify that the other vectors were not modified + 3) Verify that C was not modified + 4) Change C and then check B to make sure it was not modified + + Use a different index set than has been used so far (distinct entries). + This is because duplicate entries will cause the std::vector to be + overwritten, making it more difficult to test. + + These tests are the same as the ones above, except that the + number of indices (to be copied into B) is less than the number + of vectors in C, so that not all of C is put into B. + *********************************************************************/ + { + Teuchos::RCP B, C; + // set these: we assume below that setSize*2=BSize + const int CSize = 6, + setSize = 5, + BSize = 2*setSize; + std::vector normsB1(BSize), normsB2(BSize), + normsC1(CSize), normsC2(CSize); + + B = MVT::Clone(*A,BSize); + C = MVT::Clone(*A,CSize); + // Just do every other one, interleaving the vectors of C into B + ind.resize(setSize); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Operation modified source vectors." << endl; + return false; + } + } + // check that the correct vectors of B were modified + // and the others were not + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Copied vectors do not agree: " << endl + << normsB2[i] << " != " << normsC1[i/2] << endl + << "Difference " << diff << " exceeds the tolerance 100*eps = " + << tol << endl; + return false; + } + } + else { + // should be an original vector + const MagType diff = STS::magnitude (normsB1[i] - normsB2[i]); + //if ( normsB1[i] != normsB2[i] ) { + if (diff > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Incorrect vectors were modified." << endl + << normsB1[i] << " != " << normsB2[i] << endl + << "Difference " << diff << " exceeds the tolerance 100*eps = " + << tol << endl; + return false; + } + } + } + MVT::MvInit(*C,zero); + MVT::MvNorm(*B,normsB1); + // verify that we copied and didn't reference + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::SetBlock()." << endl + << "Copied vectors were not independent." << endl + << normsB1[i] << " != " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB1[i] - normsB2[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + } + + + /*********** MvTransMv() ********************************************* + Performs C = alpha * A^H * B, where + alpha is type ScalarType + A,B are type MV with p and q vectors, respectively + C is a SerialDenseMatrix ALREADY sized to p by q + + Verify: + 1) C is not resized by the routine + 3) Check that zero*(A^H B) == zero + 3) Check inner product inequality: + [ |a1|*|b1| ... |ap|*|b1| ] + [a1 ... ap]^H [b1 ... bq] <= [ ... |ai|*|bj| ... ] + [ |ap|*|b1| ... |ap|*|bq| ] + 4) Zero B and check that C is zero + 5) Zero A and check that C is zero + + Note: Should we really require that C is correctly sized already? + Epetra does (and crashes if it isn't.) + *********************************************************************/ + { + const int p = 7; + const int q = 9; + Teuchos::RCP B, C; + std::vector normsB(p), normsC(q); + Teuchos::SerialDenseMatrix SDM(p,q); + + B = MVT::Clone(*A,p); + C = MVT::Clone(*A,q); + + // randomize the multivectors + MVT::MvRandom(*B); + MVT::MvNorm(*B,normsB); + MVT::MvRandom(*C); + MVT::MvNorm(*C,normsC); + + // perform SDM = zero() * B^H * C + MVT::MvTransMv( zero, *B, *C, SDM ); + + // check the sizes: not allowed to have shrunk + if ( SDM.numRows() != p || SDM.numCols() != q ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTransMv()." << endl + << "Routine resized SerialDenseMatrix." << endl; + return false; + } + + // check that zero**A^H*B == zero + if ( SDM.normOne() != zero ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTransMv()." << endl + << "Scalar argument processed incorrectly." << endl; + return false; + } + + // perform SDM = one * B^H * C + MVT::MvTransMv( one, *B, *C, SDM ); + + // check the norms: a^H b = |a| |b| cos(theta) <= |a| |b| + // with equality only when a and b are colinear + for (int i=0; i STS::magnitude(normsB[i]*normsC[j]) ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTransMv()." << endl + << "Triangle inequality did not hold: " + << STS::magnitude(SDM(i,j)) + << " > " + << STS::magnitude(normsB[i]*normsC[j]) + << endl; + return false; + } + } + } + MVT::MvInit(*C); + MVT::MvRandom(*B); + MVT::MvTransMv( one, *B, *C, SDM ); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTransMv()." << endl + << "Inner products not zero for C==0." << endl; + return false; + } + } + } + MVT::MvInit(*B); + MVT::MvRandom(*C); + MVT::MvTransMv( one, *B, *C, SDM ); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTransMv()." << endl + << "Inner products not zero for B==0." << endl; + return false; + } + } + } + } + + + /*********** MvDot() ************************************************* + Verify: + 1) Results std::vector not resized + 2) Inner product inequalities are satisfied + 3) Zero vectors give zero inner products + *********************************************************************/ + { + const int p = 7; + const int q = 9; + Teuchos::RCP B, C; + std::vector iprods(p+q); + std::vector normsB(numvecs), normsC(numvecs); + + B = MVT::Clone(*A,p); + C = MVT::Clone(*A,p); + + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB); + MVT::MvNorm(*C,normsC); + MVT::MvDot( *B, *C, iprods ); + if ( iprods.size() != p+q ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvDot." << endl + << "Routine resized results std::vector." << endl; + return false; + } + for (int i=0; i STS::magnitude(normsB[i]*normsC[i]) ) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvDot()." << endl + << "Inner products not valid." << endl; + return false; + } + } + MVT::MvInit(*B); + MVT::MvRandom(*C); + MVT::MvDot( *B, *C, iprods ); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvDot()." << endl + << "Inner products not zero for B==0." << endl; + return false; + } + } + MVT::MvInit(*C); + MVT::MvRandom(*B); + MVT::MvDot( *B, *C, iprods ); + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvDot()." << endl + << "Inner products not zero for C==0." << endl; + return false; + } + } + } + + + /*********** MvAddMv() *********************************************** + D = alpha*B + beta*C + 1) Use alpha==0,beta==1 and check that D == C + 2) Use alpha==1,beta==0 and check that D == B + 3) Use D==0 and D!=0 and check that result is the same + 4) Check that input arguments are not modified + *********************************************************************/ + { + const int p = 7; + Teuchos::RCP B, C, D; + std::vector normsB1(p), normsB2(p), + normsC1(p), normsC2(p), + normsD1(p), normsD2(p); + + Teuchos::SerialDenseMatrix Alpha(1,1), Beta(1,1); + Teuchos::randomSyncedMatrix( Alpha ); + Teuchos::randomSyncedMatrix( Beta ); + ScalarType alpha = Alpha(0,0), + beta = Beta(0,0); + + B = MVT::Clone(*A,p); + C = MVT::Clone(*A,p); + D = MVT::Clone(*A,p); + + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + + // check that 0*B+1*C == C + MVT::MvAddMv(zero,*B,one,*C,*D); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + MVT::MvNorm(*D,normsD1); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsC1[i] - normsC2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsC1[i] - normsD1[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Assignment did not work." << endl; + return false; + } + } + + // check that 1*B+0*C == B + MVT::MvAddMv(one,*B,zero,*C,*D); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + MVT::MvNorm(*D,normsD1); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsC1[i] - normsC2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsB1[i] - normsD1[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Assignment did not work." << endl; + return false; + } + } + + // check that alpha*B+beta*C -> D is invariant under initial D + // first, try random D + MVT::MvRandom(*D); + MVT::MvAddMv(alpha,*B,beta,*C,*D); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + MVT::MvNorm(*D,normsD1); + // check that input args are not modified + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsC1[i] - normsC2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + } + // next, try zero D + MVT::MvInit(*D); + MVT::MvAddMv(alpha,*B,beta,*C,*D); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + MVT::MvNorm(*D,normsD2); + // check that input args are not modified and that D is the same + // as the above test + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsC1[i] - normsC2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Input arguments were modified." << endl; + return false; + } + else if (STS::magnitude (normsD1[i] - normsD2[i]) > tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv()." << endl + << "Results varies depending on initial state of dest vectors." << endl; + return false; + } + } + } + + /*********** MvAddMv() *********************************************** + Similar to above, but where B or C are potentially the same + object as D. This case is commonly used, for example, to affect + A <- alpha*A + via + MvAddMv(alpha,A,zero,A,A) + ** OR ** + MvAddMv(zero,A,alpha,A,A) + + The result is that the operation has to be "atomic". That is, + B and C are no longer reliable after D is modified, so that + the assignment to D must be the last thing to occur. + + D = alpha*B + beta*C + + 1) Use alpha==0,beta==1 and check that D == C + 2) Use alpha==1,beta==0 and check that D == B + *********************************************************************/ + { + const int p = 7; + Teuchos::RCP B, D; + Teuchos::RCP C; + std::vector normsB(p), + normsD(p); + std::vector lclindex(p); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl + << "Assignment did not work." << endl; + return false; + } + } + + // check that 1*B+0*C == B + MVT::MvAddMv(one,*B,zero,*C,*D); + MVT::MvNorm(*D,normsD); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvAddMv() #2" << endl + << "Assignment did not work." << endl; + return false; + } + } + + } + + /*********** MvTimesMatAddMv() 7 by 5 ******************************** + C = alpha*B*SDM + beta*C + 1) Use alpha==0, SDM!=0, beta==1 and check that C is unchanged + 2) Use alpha==0, SDM!=0, beta==0 and check that C is set to zero + 3) Use alpha==1, SDM==I, beta==0 and check that C is set to B + 4) Use alpha==1, SDM==0, beta==1 and check that C is unchanged + 5) Test with non-square matrices + 6) Always check that input arguments are not modified + *********************************************************************/ + { + const int p = 7, q = 5; + Teuchos::RCP B, C; + Teuchos::SerialDenseMatrix SDM(p,q); + std::vector normsC1(q), normsC2(q), + normsB1(p), normsB2(p); + + B = MVT::Clone(*A,p); + C = MVT::Clone(*A,q); + + // Test 1: alpha==0, SDM!=0, beta==1 and check that C is unchanged + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + Teuchos::randomSyncedMatrix(SDM); + MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 1 failed." << endl; + return false; + } + } + + // Test 2: alpha==0, SDM!=0, beta==0 and check that C is set to zero + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + Teuchos::randomSyncedMatrix(SDM); + MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 2 failed: " + << normsC2[i] + << " != " + << zero + << endl; + return false; + } + } + + // Test 3: alpha==1, SDM==|I|, beta==0 and check that C is set to B + // |0| + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + SDM.scale(zero); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 3 failed: " + << normsB1[i] + << " != " + << normsC2[i] + << endl; + return false; + } + } + + // Test 4: alpha==1, SDM==0, beta==1 and check that C is unchanged + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + SDM.scale(zero); + MVT::MvTimesMatAddMv(one,*B,SDM,one,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 4 failed." << endl; + return false; + } + } + } + + /*********** MvTimesMatAddMv() 5 by 7 ******************************** + C = alpha*B*SDM + beta*C + 1) Use alpha==0, SDM!=0, beta==1 and check that C is unchanged + 2) Use alpha==0, SDM!=0, beta==0 and check that C is set to zero + 3) Use alpha==1, SDM==I, beta==0 and check that C is set to B + 4) Use alpha==1, SDM==0, beta==1 and check that C is unchanged + 5) Test with non-square matrices + 6) Always check that input arguments are not modified + *********************************************************************/ + { + const int p = 5, q = 7; + Teuchos::RCP B, C; + Teuchos::SerialDenseMatrix SDM(p,q); + std::vector normsC1(q), normsC2(q), + normsB1(p), normsB2(p); + + B = MVT::Clone(*A,p); + C = MVT::Clone(*A,q); + + // Test 5: alpha==0, SDM!=0, beta==1 and check that C is unchanged + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + Teuchos::randomSyncedMatrix(SDM); + MVT::MvTimesMatAddMv(zero,*B,SDM,one,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 5 failed." << endl; + return false; + } + } + + // Test 6: alpha==0, SDM!=0, beta==0 and check that C is set to zero + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + Teuchos::randomSyncedMatrix(SDM); + MVT::MvTimesMatAddMv(zero,*B,SDM,zero,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 6 failed: " + << normsC2[i] + << " != " + << zero + << endl; + return false; + } + } + + // Test 7: alpha==1, SDM==[I 0], beta==0 and check that C is set to B + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + SDM.scale(zero); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 7 failed." << endl; + return false; + } + } + for (int i=p; istream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 7 failed." << endl; + return false; + } + } + + // Test 8: alpha==1, SDM==0, beta==1 and check that C is unchanged + MVT::MvRandom(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + MVT::MvNorm(*C,normsC1); + SDM.scale(zero); + MVT::MvTimesMatAddMv(one,*B,SDM,one,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Input vectors were modified." << endl; + return false; + } + } + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** MultiVecTraits::MvTimesMatAddMv()." << endl + << "Arithmetic test 8 failed." << endl; + return false; + } + } + } + + return true; + + } + + + + /// \brief Test correctness of OperatorTraits specialization and its + /// operator implementation. + /// + /// \tparam ScalarType The type of the entries in the multivectors; + /// the first template parameter of MultiVecTraits and + /// OperatorTraits. + /// \tparam MV The multivector type; the second template parameter + /// of MultiVecTraits and OperatorTraits. + /// \tparam OP The operator type; the third template parameter + /// of OperatorTraits. + /// + /// \param om [in/out] A valid OutputManager, for displaying test results. + /// + /// \param A [in] An initial multivector, to use for making new + /// multivectors. (Belos doesn't currently have a "vector space" + /// abstraction; making a new multivector requires a valid input + /// multivector to clone.) + /// + /// \param M [in] The operator to test. + /// + /// \return Test result: true if all tests passed, else false. + template< class ScalarType, class MV, class OP> + bool + TestKokkosOperatorTraits (const Teuchos::RCP > &om, + const Teuchos::RCP &A, + const Teuchos::RCP &M) + { + using Teuchos::SetScientific; + using std::endl; + typedef MultiVecTraits MVT; + typedef Teuchos::ScalarTraits STS; + typedef typename STS::magnitudeType MagType; + + // Make sure that all floating-point numbers are printed with the + // right precision. + SetScientific sci (om->stream (Warnings)); + + // FIXME (mfh 09 Jan 2013) Added an arbitrary tolerance in case + // norms are not computed deterministically (which is possible + // even with MPI only, and more likely with threads). + const MagType tol = Teuchos::as (100) * STS::eps (); + + /* OPT Contract: + Apply() + MV: OP*zero == zero + Warn if OP is not deterministic (OP*A != OP*A) + Does not modify input arguments + *********************************************************************/ + + typedef MultiVecTraits MVT; + typedef Teuchos::ScalarTraits STS; + typedef OperatorTraits OPT; + typedef typename STS::magnitudeType MagType; + + const int numvecs = 10; + + Teuchos::RCP B = MVT::Clone(*A,numvecs), + C = MVT::Clone(*A,numvecs); + + std::vector normsB1(numvecs), normsB2(numvecs), + normsC1(numvecs), normsC2(numvecs); + bool NonDeterministicWarning; + + /*********** Apply() ************************************************* + Verify: + 1) OP*B == OP*B; OP is deterministic (just warn on this) + 2) OP*zero == 0 + 3) OP*B doesn't modify B + 4) OP*B is invariant under initial state of destination vectors + *********************************************************************/ + MVT::MvInit(*B); + MVT::MvRandom(*C); + MVT::MvNorm(*B,normsB1); + OPT::Apply(*M,*B,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [1]" << endl + << "Apply() modified the input vectors." << endl + << "Original: " << normsB1[i] << "; After: " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsB1[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + if (normsC2[i] != STS::zero()) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [1]" << endl + << "Operator applied to zero did not return zero." << endl; + return false; + } + } + + // If we send in a random matrix, we should not get a zero return + MVT::MvRandom(*B); + MVT::MvNorm(*B,normsB1); + OPT::Apply(*M,*B,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + bool ZeroWarning = false; + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [2]" << endl + << "Apply() modified the input vectors." << endl + << "Original: " << normsB1[i] << "; After: " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsB1[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + if (normsC2[i] == STS::zero() && ZeroWarning==false ) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [2]" << endl + << "Operator applied to random vectors returned zero." << endl; + ZeroWarning = true; + } + } + + // Apply operator with C init'd to zero + MVT::MvRandom(*B); + MVT::MvNorm(*B,normsB1); + MVT::MvInit(*C); + OPT::Apply(*M,*B,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC1); + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [3]" << endl + << "Apply() modified the input vectors." << endl + << "Original: " << normsB1[i] << "; After: " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsB1[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + } + + // Apply operator with C init'd to random + // Check that result is the same as before; warn if not. + // This could be a result of a bug, or a stochastic + // operator. We do not want to prejudice against a + // stochastic operator. + MVT::MvRandom(*C); + OPT::Apply(*M,*B,*C); + MVT::MvNorm(*B,normsB2); + MVT::MvNorm(*C,normsC2); + NonDeterministicWarning = false; + for (int i=0; i tol) { + om->stream(Warnings) + << "*** ERROR *** OperatorTraits::Apply() [4]" << endl + << "Apply() modified the input vectors." << endl + << "Original: " << normsB1[i] << "; After: " << normsB2[i] << endl + << "Difference " << STS::magnitude (normsB2[i] - normsB1[i]) + << " exceeds the tolerance 100*eps = " << tol << endl; + return false; + } + if (normsC1[i] != normsC2[i] && !NonDeterministicWarning) { + om->stream(Warnings) + << endl + << "*** WARNING *** OperatorTraits::Apply() [4]" << endl + << "Apply() returned two different results." << endl << endl; + NonDeterministicWarning = true; + } + } + + return true; + + } + +} + +#endif diff --git a/packages/belos/kokkos/test/CMakeLists.txt b/packages/belos/kokkos/test/CMakeLists.txt new file mode 100644 index 000000000000..2a37af1bd697 --- /dev/null +++ b/packages/belos/kokkos/test/CMakeLists.txt @@ -0,0 +1,8 @@ +INCLUDE_DIRECTORIES(${Belos_SOURCE_DIR}/kokkos/src) + +TRIBITS_ADD_EXECUTABLE_AND_TEST( + KokkosMVOPTest + SOURCES KokkosMVOPTest.cpp + COMM serial mpi + ) + diff --git a/packages/belos/kokkos/test/KokkosMVOPTest.cpp b/packages/belos/kokkos/test/KokkosMVOPTest.cpp new file mode 100644 index 000000000000..1f64b64354f4 --- /dev/null +++ b/packages/belos/kokkos/test/KokkosMVOPTest.cpp @@ -0,0 +1,553 @@ +//@HEADER +// ************************************************************************ +// +// Belos: Block Linear Solvers Package +// Copyright 2004 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact Michael A. Heroux (maherou@sandia.gov) +// +// ************************************************************************ +//@HEADER +// +// This test uses the MVOPTester.hpp functions to test the Belos adapters +// to Kokkos. +// + + +#include "BelosConfigDefs.hpp" +#include "BelosKokkosMVOPTester.hpp" +#include "BelosOutputManager.hpp" +#include "BelosKokkosAdapter.hpp" + +#include "Teuchos_StandardCatchMacros.hpp" +#ifdef HAVE_MPI + #include +#endif + +using std::cout; +using std::endl; +using Teuchos::RCP; +using Belos::Warnings; +using Belos::OutputManager; + +template +bool TestKokkosMultiVecOneScalar(const Teuchos::RCP >& ); + +template +bool TestKokkosMultiVecTwoScalar(const Teuchos::RCP > & outputMgr); + +int main(int argc, char *argv[]) +{ +#ifdef HAVE_MPI + MPI_Init(&argc,&argv); +#endif + bool isPassed; + bool success = true; + Kokkos::initialize(); + { + bool verbose = false; + if (argc>1) { + if (argv[1][0]=='-' && argv[1][1]=='v') { + verbose = true; + } + } + typedef double ScalarType; + typedef float ScalarType2; + typedef Belos::MultiVec KMV; + typedef Belos::Operator KOP; + typedef Belos::MultiVec KMV2; + typedef Belos::Operator KOP2; + typedef Kokkos::DefaultExecutionSpace EXSP; + + // Create an output manager to handle the I/O from the solver (defaults to std::cout). + Teuchos::RCP > myOutputMgr = Teuchos::rcp( new Belos::OutputManager() ); + Teuchos::RCP > myOutputMgr2 = Teuchos::rcp( new Belos::OutputManager() ); + if (verbose) { + myOutputMgr->setVerbosity( Warnings ); + myOutputMgr2->setVerbosity( Warnings ); + } +try { + // number of global elements + int dim = 10; + int blockSize = 5; + std::vector norms(blockSize); + + + //***************************************************************************************************************************** + //***************************************************************************************************************************** + // Run native Kokkos::Multivec test (double). + isPassed = TestKokkosMultiVecOneScalar(myOutputMgr); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestKokkosMultiVecOneScalar() double. \n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestKokkosMultiVecOneScalar() double. ***\n\n"); + } + + // Run native Kokkos::Multivec test (single). + isPassed = TestKokkosMultiVecOneScalar(myOutputMgr2); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestKokkosMultiVecOneScalar() single. \n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestKokkosMultiVecOneScalar() single. ***\n\n"); + } + + //***************************************************************************************************************************** + //***************************************************************************************************************************** + // Run native Kokkos::Multivec tests with mixed single-double precisions: + isPassed = TestKokkosMultiVecTwoScalar(myOutputMgr); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestKokkosMultiVecTwoScalar() \n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestKokkosMultiVecTwoScalar() ***\n\n"); + } + + //***************************************************************************************************************************** + //***************************************************************************************************************************** + // Run Belos tests on Kokkos MultiVec (double precision): + Teuchos::RCP> ivec = Teuchos::rcp( new Belos::KokkosMultiVec(dim, blockSize) ); + ivec->MvRandom(); + isPassed = Belos::TestKokkosMultiVecTraits(myOutputMgr,ivec); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestMultiVecTraits() double.\n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestMultiVecTraits() double. ***\n\n"); + } + + // Run Belos tests on Kokkos MultiVec (single precision): + Teuchos::RCP> ivec_2 = Teuchos::rcp( new Belos::KokkosMultiVec(dim, blockSize) ); + ivec_2->MvRandom(); + isPassed = Belos::TestKokkosMultiVecTraits(myOutputMgr2,ivec_2); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestMultiVecTraits() single. \n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestMultiVecTraits() single. ***\n\n"); + } + //***************************************************************************************************************************** + //***************************************************************************************************************************** + // Read in a matrix Market file and use it to test the Kokkos Operator (double precision). + KokkosSparse::CrsMatrix crsMat = + KokkosKernels::Impl::read_kokkos_crst_matrix>("bcsstk13.mtx"); + Teuchos::RCP> myOp = + Teuchos::rcp(new Belos::KokkosCrsOperator(crsMat)); + + Teuchos::RCP> ivec3 = Teuchos::rcp( new Belos::KokkosMultiVec(2003, 2) ); + + isPassed = Belos::TestKokkosOperatorTraits(myOutputMgr,ivec3,myOp); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestOperatorTraits() double. \n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestOperatorTraits() double ***\n\n"); + } + // Read in a matrix Market file and use it to test the Kokkos Operator (single precision). + KokkosSparse::CrsMatrix crsMat2 = + KokkosKernels::Impl::read_kokkos_crst_matrix>("bcsstk13.mtx"); + Teuchos::RCP> myOp2 = + Teuchos::rcp(new Belos::KokkosCrsOperator(crsMat2)); + + Teuchos::RCP> ivec3_2 = Teuchos::rcp( new Belos::KokkosMultiVec(2003, 2) ); + + isPassed = Belos::TestKokkosOperatorTraits(myOutputMgr2,ivec3_2,myOp2); + success = isPassed && success; + if (isPassed) { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter PASSED TestOperatorTraits() single\n"); + } + else { + myOutputMgr->print(Belos::Warnings,"*** KokkosAdapter FAILED TestOperatorTraits() single ***\n\n"); + } + //***************************************************************************************************************************** + //***************************************************************************************************************************** + + if (!success) { + myOutputMgr->print(Belos::Warnings,"End Result: TEST FAILED\n"); + } else { + myOutputMgr->print(Belos::Warnings,"End Result: TEST PASSED\n"); + } + }//end try block + + + TEUCHOS_STANDARD_CATCH_STATEMENTS(verbose,std::cerr,success); + } + Kokkos::finalize(); +#ifdef HAVE_MPI + MPI_Finalize(); +#endif + return success ? EXIT_SUCCESS : EXIT_FAILURE; +} + +template +bool TestKokkosMultiVecOneScalar(const Teuchos::RCP > & outputMgr){ + int dim = 10; + int blockSize = 5; + std::vector norms(blockSize); + + /// Test KokkosMultiVec constructors: + // Test constructor #1: + Belos::KokkosMultiVec myVec1("myLabel", dim, blockSize); + if ( myVec1.GetNumberVecs() != blockSize ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 1 returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVec1.GetGlobalLength() != dim ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 1 returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVec1.MvNorm(norms); + for(int i = 0; i < blockSize; i++){ + if( norms[i] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 1 returned wrong nrm2 value. " + << "Vector was not initialized to zeros." << endl; + return false; + } + } + // Test constructor #2: + Belos::KokkosMultiVec myVec2(dim, blockSize); + if ( myVec2.GetNumberVecs() != blockSize ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 2 returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVec2.GetGlobalLength() != dim ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 2 returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVec2.MvNorm(norms); + for(int i = 0; i < blockSize; i++){ + if( norms[i] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 2 returned wrong nrm2 value. " + << "Vector was not initialized to zeros." << endl; + return false; + } + } + // Test constructor #3: + Belos::KokkosMultiVec myVec3(2*dim); + if ( myVec3.GetNumberVecs() != 1 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 3 returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVec3.GetGlobalLength() != 2*dim ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 3 returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVec3.MvNorm(norms); + if( norms[0] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec constructor 3 returned wrong nrm2 value. " + << "Vector was not initialized to zeros." << endl; + return false; + } + // Test copy constructor (should deep copy). + Belos::KokkosMultiVec myVecCopy(myVec3); + if ( myVecCopy.GetNumberVecs() != 1 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec copy constructor returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecCopy.GetGlobalLength() != 2*dim ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec copy constructor returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVecCopy.MvRandom(); + myVecCopy.MvNorm(norms); + if( norms[0] == 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec MvRandom did not fill with random values. " << endl; + return false; + } + myVec3.MvNorm(norms); + if( norms[0] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec copy constructor did not deep copy. " << endl; + return false; + } + // Test assignment operator (should also deep copy). + myVecCopy = myVec2; + if ( myVecCopy.GetNumberVecs() != blockSize ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec assignment = returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecCopy.GetGlobalLength() != dim ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec assignment = returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVec2.MvInit(3.0); + myVecCopy.MvNorm(norms); + for(int i = 0; i < blockSize; i++){ + if( norms[i] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec assignment = returned wrong nrm2 value. " + << "Vector was not deep copied." << endl; + return false; + } + } + // Test view to multivec: + int numCols2 = 4; + int numRows2 = 60; + Kokkos::View myView("View2MV", numRows2, numCols2); + typename Kokkos::View::HostMirror myView_h("View2MV_host", numRows2, numCols2); + Kokkos::deep_copy(myView, 42); + Belos::KokkosMultiVec myVec4( myView ); + if ( myVec4.GetNumberVecs() != (int)myView.extent(1) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVec4.GetGlobalLength() != (int)myView.extent(0) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + Kokkos::deep_copy(myView, 55); + Kokkos::deep_copy(myView_h, myVec4.GetInternalViewConst()); + if ( myView_h(5,1) != 42 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec view to multivec did not make a deep copy!" << endl; + return false; + } + // Tesst view to multivec with shallow copy: + Kokkos::deep_copy(myView, 100); + Belos::KokkosMultiVec myVec5( myView, false ); + if ( myVec5.GetNumberVecs() != (int)myView.extent(1) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec shallow returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVec5.GetGlobalLength() != (int)myView.extent(0) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec shallow returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + Kokkos::deep_copy(myView, 500); + Kokkos::deep_copy(myView_h, myVec5.GetInternalViewConst()); + if ( myView_h(5,1) != 500 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec view to multivec shallow made a deep copy!" << endl; + return false; + } + // Test GetInternalViewNonConst: + auto myView2 = myVec5.GetInternalViewNonConst(); + Kokkos::deep_copy(myView2, 0); + std::vector norms2(4); + myVec5.MvNorm(norms2); + for(int i = 0; i < (int)myView2.extent(1); i++){ + if( norms[i] != 0 ){ + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec GetInternalViewNonConst returned wrong nrm2 value. " + << "Vector was not editable." << endl; + return false; + } + } + + return true; +} + + +template +bool TestKokkosMultiVecTwoScalar(const Teuchos::RCP > & outputMgr){ + // Test view to multivec ST1 to ST2: + int numCols = 4; + int numRows = 60; + Kokkos::View myViewST1("View2MV1", numRows, numCols); + typename Kokkos::View::HostMirror myViewST2_h("View2MV1_host", numRows, numCols); + Kokkos::deep_copy(myViewST1, 42); + Belos::KokkosMultiVec myVecST2A( myViewST1 ); + if ( myVecST2A.GetNumberVecs() != (int)myViewST1.extent(1) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec 2 scalar returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST2A.GetGlobalLength() != (int)myViewST1.extent(0) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec 2 scalar returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + Kokkos::deep_copy(myViewST1, 55); + std::cout << "At line 424. " << std::endl; + Kokkos::deep_copy(myViewST2_h, myVecST2A.GetInternalViewConst()); + if ( myViewST2_h(5,1) != 42 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec view to multivec 2 scalar did not make a deep copy!" << endl; + return false; + } + // Test view to multivec ST2 to ST1: + Kokkos::View myViewST2("View2MV2", numRows, numCols); + typename Kokkos::View::HostMirror myViewST1_h("View2MV2_host", numRows, numCols); + Kokkos::deep_copy(myViewST2, 56); + Belos::KokkosMultiVec myVecST1A( myViewST2 ); + if ( myVecST1A.GetNumberVecs() != (int)myViewST2.extent(1) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec 2 scalar returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST1A.GetGlobalLength() != (int)myViewST2.extent(0) ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec view to multivec 2 scalar returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + Kokkos::deep_copy(myViewST2, 22); + std::cout << "At line 449. " << std::endl; + Kokkos::deep_copy(myViewST1_h, myVecST1A.GetInternalViewConst()); + if ( myViewST1_h(5,1) != 56 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec view to multivec 2 scalar did not make a deep copy!" << endl; + return false; + } + //Test multivec copy constructor ST1 to ST2: + Belos::KokkosMultiVec myVecST2B( myVecST1A ); + if ( myVecST1A.GetNumberVecs() != myVecST2B.GetNumberVecs() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated copy constructor returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST1A.GetGlobalLength() != myVecST2B.GetGlobalLength() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated copy constructor returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVecST1A.MvInit(3.0); + std::cout << "At line 471. " << std::endl; + Kokkos::deep_copy(myViewST2_h, myVecST2B.GetInternalViewConst()); + if ( myViewST2_h(5,1) != 56 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec templated copy constructor did not make a deep copy!" << endl; + return false; + } + //Test multivec copy constructor ST2 to ST1: + Belos::KokkosMultiVec myVecST1B( myVecST2A ); + if ( myVecST1B.GetNumberVecs() != myVecST2A.GetNumberVecs() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated copy constructor returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST1B.GetGlobalLength() != myVecST2A.GetGlobalLength() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated copy constructor returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVecST2A.MvInit(3.0); + Kokkos::deep_copy(myViewST1_h, myVecST1B.GetInternalViewConst()); + if ( myViewST1_h(5,1) != 42 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec templated copy constructor did not make a deep copy!" << endl; + return false; + } + //Test assignment operator ST1 to ST2: + Belos::KokkosMultiVec myVecST2C = myVecST1A; + if ( myVecST1A.GetNumberVecs() != myVecST2C.GetNumberVecs() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated assignment operator returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST1A.GetGlobalLength() != myVecST2C.GetGlobalLength() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated copy constructor returned wrong value " + << "*** ERROR *** KokkosMultiVec templated assignment operator returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVecST1A.MvInit(1.0); + std::cout << "At line 515. " << std::endl; + Kokkos::deep_copy(myViewST2_h, myVecST2C.GetInternalViewConst()); + if ( myViewST2_h(5,1) != 3 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec templated assign op did not make a deep copy!" << endl; + return false; + } + //Test assignement operator ST2 to ST1: + Belos::KokkosMultiVec myVecST1C = myVecST2A; + if ( myVecST1C.GetNumberVecs() != myVecST2A.GetNumberVecs() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated assignment operator returned wrong value " + << "for GetNumberVecs()." << endl; + return false; + } + if ( myVecST1C.GetGlobalLength() != myVecST2A.GetGlobalLength() ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultiVec templated assignment operator returned wrong value " + << "for GetGlobalLength()." << endl; + return false; + } + myVecST2A.MvInit(2.0); + Kokkos::deep_copy(myViewST1_h, myVecST1C.GetInternalViewConst()); + if ( myViewST1_h(5,1) != 3 ) { + outputMgr->stream(Warnings) + << "*** ERROR *** KokkosMultivec templated assign op did not make a deep copy!" << endl; + return false; + } + + return true; +} From 6e0ee32c24250a0de26a2c79d85076e23dcb7e77 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 25 Oct 2021 10:56:45 -0600 Subject: [PATCH 65/98] Tpetra: clean up includes/typedefs/setup functions for AsyncTransfer tests --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 195 ++++-------------- 1 file changed, 36 insertions(+), 159 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index e80c4f8ddd6b..55ef0433bf0c 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -42,164 +42,41 @@ #include #include +#include #include #include -#include -#include #include -#include "Tpetra_CrsGraph.hpp" -#include "Tpetra_CrsMatrix.hpp" -#include "Tpetra_MultiVector.hpp" + #include "Tpetra_Core.hpp" -#include "Tpetra_Distributor.hpp" -#include "Tpetra_Map.hpp" -#include "Tpetra_Util.hpp" -#include "Tpetra_Import.hpp" -#include "Tpetra_Import_Util.hpp" -#include "Tpetra_Import_Util2.hpp" -#include "Tpetra_Details_packCrsMatrix.hpp" -#include "Tpetra_Details_unpackCrsMatrixAndCombine.hpp" +#include "Tpetra_CrsMatrix.hpp" #include "Tpetra_Export.hpp" -#include "Tpetra_RowMatrixTransposer.hpp" -#include "TpetraExt_MatrixMatrix.hpp" -#include "Tpetra_Details_Behavior.hpp" -#include "Tpetra_Details_gathervPrint.hpp" -#include -#include +#include "Tpetra_Import.hpp" +#include "Tpetra_Map.hpp" +#include "Tpetra_MultiVector.hpp" namespace { + using std::endl; + using Teuchos::as; using Teuchos::Array; - using Teuchos::ArrayRCP; - using Teuchos::ArrayView; - using Teuchos::arrayViewFromVector; using Teuchos::Comm; using Teuchos::FancyOStream; - using Teuchos::getFancyOStream; - using Teuchos::includesVerbLevel; - using Teuchos::OrdinalTraits; - using Teuchos::OSTab; - using Teuchos::outArg; - using Teuchos::ParameterList; - using Teuchos::parameterList; using Teuchos::RCP; using Teuchos::rcp; - using Teuchos::rcpFromRef; - using Teuchos::REDUCE_MAX; - using Teuchos::reduceAll; + using Teuchos::OrdinalTraits; using Teuchos::ScalarTraits; using Teuchos::tuple; - using Tpetra::ADD; using Tpetra::DistObject; - using Tpetra::createContigMap; - using Tpetra::CrsGraph; using Tpetra::CrsMatrix; - using Tpetra::MultiVector; using Tpetra::Export; + using Tpetra::getDefaultComm; + using Tpetra::global_size_t; using Tpetra::Import; using Tpetra::INSERT; using Tpetra::Map; - using Tpetra::REPLACE; - using Tpetra::StaticProfile; - - using std::cerr; - using std::cout; - using std::ostream_iterator; - using std::endl; - - using Node = Tpetra::Map<>::node_type; - - // Command-line argument values (initially set to defaults). - bool testMpi = true; - double errorTolSlack = 1e+1; - std::string distributorSendType ("Send"); - bool barrierBetween = true; - bool verbose = false; - - TEUCHOS_STATIC_SETUP() - { - Teuchos::CommandLineProcessor &clp = Teuchos::UnitTestRepository::getCLP(); - clp.addOutputSetupOptions(true); - clp.setOption( - "test-mpi", "test-serial", &testMpi, - "Test MPI (if available) or force test of serial. In a serial build," - " this option is ignored and a serial comm is always used." ); - clp.setOption( - "error-tol-slack", &errorTolSlack, - "Slack off of machine epsilon used to check test results" ); - // FIXME (mfh 02 Apr 2012) It would be better to ask Distributor - // for the list of valid send types, but setOption() needs a const - // char[], not an std::string. - clp.setOption ("distributor-send-type", &distributorSendType, - "In MPI tests, the type of send operation that the Tpetra::" - "Distributor will use. Valid values include \"Isend\", " - "\"Rsend\", \"Send\", and \"Ssend\"."); - clp.setOption ("barrier-between", "no-barrier-between", &barrierBetween, - "In MPI tests, whether Tpetra::Distributor will execute a " - "barrier between posting receives and posting sends."); - clp.setOption ("verbose", "quiet", &verbose, "Whether to print verbose " - "output."); - } - - RCP > - getDefaultComm() - { - if (testMpi) { - return Tpetra::getDefaultComm (); - } - else { - return rcp (new Teuchos::SerialComm ()); - } - } - - RCP - getDistributorParameterList () - { - static RCP plist; // NOT THREAD SAFE, but that's OK here. - if (plist.is_null ()) { - plist = parameterList ("Tpetra::Distributor"); - plist->set ("Send type", distributorSendType); - plist->set ("Barrier between receives and sends", barrierBetween); - - if (verbose && getDefaultComm()->getRank() == 0) { - cout << "ParameterList for Distributor: " << *plist << endl; - } - - if (verbose) { - // Tell Distributor to print verbose output. - Teuchos::VerboseObject::setDefaultVerbLevel (Teuchos::VERB_EXTREME); - } - } - return plist; - } - - RCP getImportParameterList () { - return getDistributorParameterList (); // For now. - } - - RCP getExportParameterList () { - return parameterList (* (getDistributorParameterList ())); // For now. - } - - RCP getCrsGraphParameterList () { - static RCP plist; // NOT THREAD SAFE, but that's OK here. - if (plist.is_null ()) { - plist = parameterList ("Tpetra::CrsGraph"); - plist->set ("Import", * (getImportParameterList ())); - plist->set ("Export", * (getExportParameterList ())); - - if (verbose && getDefaultComm()->getRank() == 0) { - cout << "ParameterList for CrsGraph: " << *plist << endl; - } - } - return plist; - } - - RCP getCrsMatrixParameterList () { - return parameterList (* (getCrsGraphParameterList ())); // For now. - } + using Tpetra::MultiVector; // @@ -214,7 +91,7 @@ namespace { using mv_type = MultiVector; public: - MultiVectorTransferFixture(Teuchos::FancyOStream& o, bool& s) + MultiVectorTransferFixture(FancyOStream& o, bool& s) : out(o), success(s), comm(getDefaultComm()), @@ -252,7 +129,7 @@ namespace { private: void setupMaps(int collectRank) { const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + const global_size_t INVALID = OrdinalTraits::invalid(); const size_t sourceNumLocalElements = 3; const size_t totalElements = numProcs*sourceNumLocalElements; @@ -267,7 +144,7 @@ namespace { sourceMV->randomize(); targetMV = rcp(new mv_type(targetMap, 1)); - targetMV->putScalar(Teuchos::ScalarTraits::zero()); + targetMV->putScalar(ScalarTraits::zero()); } void compareMultiVectors(RCP resultMV, RCP referenceMV) { @@ -280,7 +157,7 @@ namespace { } } - Teuchos::FancyOStream& out; + FancyOStream& out; bool& success; RCP> comm; @@ -303,12 +180,12 @@ namespace { public: RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { RCP sourceMap = sourceMV->getMap(); - Import importer(sourceMap, targetMap, getImportParameterList()); + Import importer(sourceMap, targetMap); expertSetRemoteLIDsContiguous(importer, false); TEUCHOS_ASSERT(!importer.areRemoteLIDsContiguous()); RCP referenceMV = rcp(new mv_type(targetMap, 1)); - referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->putScalar(ScalarTraits::zero()); referenceMV->doImport(*sourceMV, importer, INSERT); TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); @@ -325,12 +202,12 @@ namespace { public: RCP generateWithClassicalCodePath(RCP sourceMV, RCP targetMap) const { RCP sourceMap = sourceMV->getMap(); - Export exporter(sourceMap, targetMap, getExportParameterList()); + Export exporter(sourceMap, targetMap); expertSetRemoteLIDsContiguous(exporter, false); TEUCHOS_ASSERT(!exporter.areRemoteLIDsContiguous()); RCP referenceMV = rcp(new mv_type(targetMap, 1)); - referenceMV->putScalar(Teuchos::ScalarTraits::zero()); + referenceMV->putScalar(ScalarTraits::zero()); referenceMV->doExport(*sourceMV, exporter, INSERT); TEUCHOS_ASSERT(!referenceMV->importsAreAliased()); @@ -346,7 +223,7 @@ namespace { using crs_type = CrsMatrix; public: - DiagonalCrsMatrixTransferFixture(Teuchos::FancyOStream& o, bool& s) + DiagonalCrsMatrixTransferFixture(FancyOStream& o, bool& s) : out(o), success(s), comm(getDefaultComm()), @@ -387,7 +264,7 @@ namespace { private: void setupMaps() { const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + const global_size_t INVALID = OrdinalTraits::invalid(); const size_t targetNumLocalElements = 3; const size_t totalElements = numProcs*targetNumLocalElements; @@ -398,8 +275,8 @@ namespace { } void setupMatrices() { - sourceMat = rcp(new crs_type(sourceMap, 1, StaticProfile, getCrsMatrixParameterList())); - targetMat = rcp(new crs_type(targetMap, 1, StaticProfile, getCrsMatrixParameterList())); + sourceMat = rcp(new crs_type(sourceMap, 1)); + targetMat = rcp(new crs_type(targetMap, 1)); for (GO row = sourceMap->getMinGlobalIndex(); row <= sourceMap->getMaxGlobalIndex(); row++) { sourceMat->insertGlobalValues(row, tuple(row), tuple(row)); @@ -468,7 +345,7 @@ namespace { } } - Teuchos::FancyOStream& out; + FancyOStream& out; bool& success; RCP> comm; @@ -491,7 +368,7 @@ namespace { public: RCP generateUsingAllInOne(RCP sourceMat, RCP targetMap) const { RCP sourceMap = sourceMat->getMap(); - Import importer(sourceMap, targetMap, getImportParameterList()); + Import importer(sourceMap, targetMap); Teuchos::ParameterList dummy; RCP referenceMat = Tpetra::importAndFillCompleteCrsMatrix( @@ -509,7 +386,7 @@ namespace { public: RCP generateUsingAllInOne(RCP sourceMat, RCP targetMap) const { RCP sourceMap = sourceMat->getMap(); - Export exporter(sourceMap, targetMap, getExportParameterList()); + Export exporter(sourceMap, targetMap); Teuchos::ParameterList dummy; RCP referenceMat = Tpetra::exportAndFillCompleteCrsMatrix( @@ -526,7 +403,7 @@ namespace { using crs_type = CrsMatrix; public: - LowerTriangularCrsMatrixTransferFixture(Teuchos::FancyOStream& o, bool& s) + LowerTriangularCrsMatrixTransferFixture(FancyOStream& o, bool& s) : out(o), success(s), comm(getDefaultComm()), @@ -589,7 +466,7 @@ namespace { private: void setupMaps() { const GO indexBase = 0; - const Tpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + const global_size_t INVALID = OrdinalTraits::invalid(); const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; const size_t targetNumLocalElements = 4; @@ -599,8 +476,8 @@ namespace { } void setupMatrices() { - sourceMat = rcp(new crs_type(sourceMap, 24, StaticProfile, getCrsMatrixParameterList())); - targetMat = rcp(new crs_type(targetMap, 24, StaticProfile, getCrsMatrixParameterList())); + sourceMat = rcp(new crs_type(sourceMap, 24)); + targetMat = rcp(new crs_type(targetMap, 24)); Array cols(1); Array vals(1); @@ -618,7 +495,7 @@ namespace { sourceMat->fillComplete(); } - Teuchos::FancyOStream& out; + FancyOStream& out; bool& success; RCP> comm; @@ -645,7 +522,7 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { - Import importer(source->getMap(), target->getMap(), getImportParameterList()); + Import importer(source->getMap(), target->getMap()); target->beginImport(*source, importer, INSERT); target->endImport(*source, importer, INSERT); } @@ -711,7 +588,7 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { - Export exporter(target->getMap(), source->getMap(), getExportParameterList()); + Export exporter(target->getMap(), source->getMap()); target->beginImport(*source, exporter, INSERT); target->endImport(*source, exporter, INSERT); } @@ -777,7 +654,7 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { - Export exporter(source->getMap(), target->getMap(), getExportParameterList()); + Export exporter(source->getMap(), target->getMap()); target->beginExport(*source, exporter, INSERT); target->endExport(*source, exporter, INSERT); } @@ -843,7 +720,7 @@ namespace { public: void operator()(DistObjectRCP source, DistObjectRCP target) const { - Import importer(target->getMap(), source->getMap(), getImportParameterList()); + Import importer(target->getMap(), source->getMap()); target->beginExport(*source, importer, INSERT); target->endExport(*source, importer, INSERT); } From 1da9e1404b518765dbcbde9f6dde85b3e7e60327 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 25 Oct 2021 10:58:37 -0600 Subject: [PATCH 66/98] Tpetra: fix template parameter ordering in AsyncTransfer for consistency --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 55ef0433bf0c..008a89978ed4 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -528,7 +528,7 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank0, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -541,7 +541,7 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank1, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -554,7 +554,7 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, DiagonalCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -567,7 +567,7 @@ namespace { fixture.checkResults(ReferenceImportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -594,7 +594,7 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank0, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -607,7 +607,7 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank1, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -620,7 +620,7 @@ namespace { fixture.checkResults(ReferenceImportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, DiagonalCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -633,7 +633,7 @@ namespace { fixture.checkResults(ReferenceImportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -660,7 +660,7 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank0, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -673,7 +673,7 @@ namespace { fixture.checkResults(ReferenceExportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank1, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -686,7 +686,7 @@ namespace { fixture.checkResults(ReferenceExportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, DiagonalCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -699,7 +699,7 @@ namespace { fixture.checkResults(ReferenceExportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -726,7 +726,7 @@ namespace { } }; - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank0, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -739,7 +739,7 @@ namespace { fixture.checkResults(ReferenceExportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank1, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -752,7 +752,7 @@ namespace { fixture.checkResults(ReferenceExportMultiVector()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, DiagonalCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -765,7 +765,7 @@ namespace { fixture.checkResults(ReferenceExportMatrix()); } - TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, LowerTriangularCrsMatrix, LO, GO, Scalar ) + TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); if (fixture.shouldSkipTest()) { @@ -784,22 +784,22 @@ namespace { // #define UNIT_TEST_GROUP_SC_LO_GO( SC, LO, GO ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank0, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank1, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, DiagonalCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank0, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank1, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, DiagonalCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, LowerTriangularCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank0, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank1, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, DiagonalCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, LowerTriangularCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank0, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank1, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, DiagonalCrsMatrix, LO, GO, SC ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, LowerTriangularCrsMatrix, LO, GO, SC ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank0, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, MultiVector_rank1, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, DiagonalCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardImport, LowerTriangularCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank0, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, MultiVector_rank1, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, DiagonalCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseImport, LowerTriangularCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank0, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, MultiVector_rank1, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, DiagonalCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncForwardExport, LowerTriangularCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank0, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, MultiVector_rank1, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, DiagonalCrsMatrix, SC, LO, GO ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( AsyncReverseExport, LowerTriangularCrsMatrix, SC, LO, GO ) \ TPETRA_ETI_MANGLING_TYPEDEFS() From ac8f397feb25d61a31c79b95d7a6ca47fc497de1 Mon Sep 17 00:00:00 2001 From: "Timothy A. Smith" Date: Mon, 25 Oct 2021 11:25:55 -0600 Subject: [PATCH 67/98] Tpetra: AsyncTransfer test cleanup: remove shouldSkipTest, fix maps, simplify MultiVector result check --- .../ImportExport2/AsyncTransfer_UnitTests.cpp | 104 ++---------------- 1 file changed, 9 insertions(+), 95 deletions(-) diff --git a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp index 008a89978ed4..d2f4459433cf 100644 --- a/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/AsyncTransfer_UnitTests.cpp @@ -101,15 +101,6 @@ namespace { ~MultiVectorTransferFixture() { } - bool shouldSkipTest() { - return numProcs < 2; - } - - void printSkippedTestMessage() { - out << "This test is only meaningful if running with multiple MPI " - "processes, but you ran it with only 1 process." << endl; - } - void setup(int collectRank) { setupMaps(collectRank); setupMultiVectors(); @@ -151,8 +142,8 @@ namespace { auto data = resultMV->getLocalViewHost(Tpetra::Access::ReadOnly); auto referenceData = referenceMV->getLocalViewHost(Tpetra::Access::ReadOnly); - for (GO globalRow = targetMap->getMinGlobalIndex(); globalRow <= targetMap->getMaxGlobalIndex(); ++globalRow) { - const LO localRow = targetMap->getLocalElement(globalRow); + TEST_EQUALITY(data.size(), referenceData.size()); + for (LO localRow = 0; localRow < as(data.size()); localRow++) { TEST_EQUALITY(data(localRow, 0), referenceData(localRow, 0)); } } @@ -233,15 +224,6 @@ namespace { ~DiagonalCrsMatrixTransferFixture() { } - bool shouldSkipTest() { - return numProcs < 2; - } - - void printSkippedTestMessage() { - out << "This test is only meaningful if running with multiple MPI " - "processes, but you ran it with only 1 process." << endl; - } - void setup() { setupMaps(); setupMatrices(); @@ -413,14 +395,6 @@ namespace { ~LowerTriangularCrsMatrixTransferFixture() { } - bool shouldSkipTest() { - return numProcs%2 != 0; - } - - void printSkippedTestMessage() { - out << "This test is only meaningful if running with an even number of MPI processes." << endl; - } - void setup() { setupMaps(); setupMatrices(); @@ -468,16 +442,20 @@ namespace { const GO indexBase = 0; const global_size_t INVALID = OrdinalTraits::invalid(); - const size_t sourceNumLocalElements = (myRank%2 == 0) ? 3 : 5; + const size_t sourceNumLocalElements = isExtraRank() ? 4 : (myRank%2 == 0 ? 3 : 5); const size_t targetNumLocalElements = 4; sourceMap = rcp(new map_type(INVALID, sourceNumLocalElements, indexBase, comm)); targetMap = rcp(new map_type(INVALID, targetNumLocalElements, indexBase, comm)); } + bool isExtraRank() { + return numProcs%2 == 1 && myRank == numProcs-1; + } + void setupMatrices() { - sourceMat = rcp(new crs_type(sourceMap, 24)); - targetMat = rcp(new crs_type(targetMap, 24)); + sourceMat = rcp(new crs_type(sourceMap, sourceMap->getGlobalNumElements())); + targetMat = rcp(new crs_type(targetMap, targetMap->getGlobalNumElements())); Array cols(1); Array vals(1); @@ -531,10 +509,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(0); fixture.performTransfer(ForwardImport()); @@ -544,10 +518,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(1); fixture.performTransfer(ForwardImport()); @@ -557,10 +527,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ForwardImport()); @@ -570,10 +536,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardImport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ForwardImport()); @@ -597,10 +559,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(0); fixture.performTransfer(ReverseImport()); @@ -610,10 +568,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(1); fixture.performTransfer(ReverseImport()); @@ -623,10 +577,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ReverseImport()); @@ -636,10 +586,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseImport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ReverseImport()); @@ -663,10 +609,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(0); fixture.performTransfer(ForwardExport()); @@ -676,10 +618,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(1); fixture.performTransfer(ForwardExport()); @@ -689,10 +627,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ForwardExport()); @@ -702,10 +636,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncForwardExport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ForwardExport()); @@ -729,10 +659,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank0, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(0); fixture.performTransfer(ReverseExport()); @@ -742,10 +668,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, MultiVector_rank1, Scalar, LO, GO ) { MultiVectorTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(1); fixture.performTransfer(ReverseExport()); @@ -755,10 +677,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, DiagonalCrsMatrix, Scalar, LO, GO ) { DiagonalCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ReverseExport()); @@ -768,10 +686,6 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( AsyncReverseExport, LowerTriangularCrsMatrix, Scalar, LO, GO ) { LowerTriangularCrsMatrixTransferFixture fixture(out, success); - if (fixture.shouldSkipTest()) { - fixture.printSkippedTestMessage(); - return; - } fixture.setup(); fixture.performTransfer(ReverseExport()); From d84e340173f3f72474d138bb7a64b123ab6d15b6 Mon Sep 17 00:00:00 2001 From: Brian Kelley Date: Mon, 25 Oct 2021 13:11:18 -0600 Subject: [PATCH 68/98] MueLu: remove dependence on Tpetra deprecated in MMKernelDriver. Remaining TODO: retest this with ViennaCL and MKL just in case --- .../muelu/test/scaling/MMKernelDriver.cpp | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/muelu/test/scaling/MMKernelDriver.cpp b/packages/muelu/test/scaling/MMKernelDriver.cpp index e8823986ec37..dfeb9d37f68b 100644 --- a/packages/muelu/test/scaling/MMKernelDriver.cpp +++ b/packages/muelu/test/scaling/MMKernelDriver.cpp @@ -275,18 +275,17 @@ void Multiply_ViennaCL(const Xpetra::Matrix Cu = Utilities::Op2TpetraCrs(rcp(&C,false)); RCP Cnc = Teuchos::rcp_const_cast(Cu); - const KCRS & Amat = Au->getLocalMatrix(); - const KCRS & Bmat = Bu->getLocalMatrix(); - KCRS Cmat = Cu->getLocalMatrix(); + const KCRS & Amat = Au->getLocalMatrixDevice(); + const KCRS & Bmat = Bu->getLocalMatrixDevice(); using no_init_view=Kokkos::ViewAllocateWithoutInitializing; c_lno_view_t Arowptr = Amat.graph.row_map, Browptr = Bmat.graph.row_map; lno_view_t Crowptr(no_init_view("Crowptr"),C.getNodeNumRows()+1); c_lno_nnz_view_t Acolind = Amat.graph.entries, Bcolind = Bmat.graph.entries; - lno_nnz_view_t Ccolind = Cmat.graph.entries; + lno_nnz_view_t Ccolind; const scalar_view_t Avals = Amat.values, Bvals = Bmat.values; - scalar_view_t Cvals = Cmat.values; + scalar_view_t Cvals; // ********************************** // Copy in the data for ViennaCL @@ -335,8 +334,8 @@ void Multiply_ViennaCL(const Xpetra::Matrix(CVCL.handle1()); const unsigned int * CcolindVCL = viennacl::cuda_arg(CVCL.handle2()); @@ -446,17 +445,14 @@ void Multiply_MKL_SPMM(const Xpetra::Matrix Cu = Utilities::Op2TpetraCrs(rcp(&C,false)); RCP Cnc = Teuchos::rcp_const_cast(Cu); - const KCRS & Amat = Au->getLocalMatrix(); - const KCRS & Bmat = Bu->getLocalMatrix(); - KCRS Cmat = Cu->getLocalMatrix(); + const KCRS & Amat = Au->getLocalMatrixDevice(); + const KCRS & Bmat = Bu->getLocalMatrixDevice(); if(A.getNodeNumRows()!=C.getNodeNumRows()) throw std::runtime_error("C is not sized correctly"); c_lno_view_t Arowptr = Amat.graph.row_map, Browptr = Bmat.graph.row_map; lno_view_t Crowptr(no_init_view("Crowptr"),C.getNodeNumRows()+1); c_lno_nnz_view_t Acolind = Amat.graph.entries, Bcolind = Bmat.graph.entries; - lno_nnz_view_t Ccolind = Cmat.graph.entries; const scalar_view_t Avals = Amat.values, Bvals = Bmat.values; - scalar_view_t Cvals = Cmat.values; sparse_matrix_t AMKL; sparse_matrix_t BMKL; @@ -536,6 +532,8 @@ void Multiply_MKL_SPMM(const Xpetra::Matrix crs_matrix_type; - typedef typename crs_matrix_type::local_matrix_type KCRS; - typedef typename KCRS::StaticCrsGraphType graph_t; - typedef typename graph_t::row_map_type::non_const_type lno_view_t; - typedef typename graph_t::row_map_type::const_type c_lno_view_t; - typedef typename graph_t::entries_type::non_const_type lno_nnz_view_t; - typedef typename graph_t::entries_type::const_type c_lno_nnz_view_t; - typedef typename KCRS::values_type::non_const_type scalar_view_t; - typedef typename KCRS::device_type device_t; + typedef typename crs_matrix_type::local_matrix_device_type KCRS; + typedef typename KCRS::StaticCrsGraphType graph_t; + typedef typename graph_t::row_map_type::non_const_type lno_view_t; + typedef typename graph_t::row_map_type::const_type c_lno_view_t; + typedef typename graph_t::entries_type::non_const_type lno_nnz_view_t; + typedef typename graph_t::entries_type::const_type c_lno_nnz_view_t; + typedef typename KCRS::values_type::non_const_type scalar_view_t; + typedef typename KCRS::device_type device_t; RCP Au = Utilities::Op2TpetraCrs(rcp(&A,false)); RCP Bu = Utilities::Op2TpetraCrs(rcp(&B,false)); RCP Cu = Utilities::Op2TpetraCrs(rcp(&C,false)); RCP Cnc = Teuchos::rcp_const_cast(Cu); - const KCRS & Amat = Au->getLocalMatrix(); - const KCRS & Bmat = Bu->getLocalMatrix(); - KCRS Cmat = Cu->getLocalMatrix(); + const KCRS & Amat = Au->getLocalMatrixDevice(); + const KCRS & Bmat = Bu->getLocalMatrixDevice(); c_lno_view_t Arowptr = Amat.graph.row_map, Browptr = Bmat.graph.row_map; lno_view_t Crowptr("Crowptr",A.getNodeNumRows()+1); c_lno_nnz_view_t Acolind = Amat.graph.entries, Bcolind = Bmat.graph.entries; - lno_nnz_view_t Ccolind = Cmat.graph.entries; const scalar_view_t Avals = Amat.values, Bvals = Bmat.values; - scalar_view_t Cvals = Cmat.values; + lno_nnz_view_t Ccolind; + scalar_view_t Cvals; // KokkosKernelsHandle typedef KokkosKernels::Experimental::KokkosKernelsHandle< From fd4b703bbb70cdae854863cb03d27555d25ffe39 Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Wed, 20 Oct 2021 14:43:51 +0200 Subject: [PATCH 69/98] Sacado: Make Sacado_FadKokkosTests_Cuda UVM free --- .../UnitTests/Fad_Fad_KokkosTests_Cuda.cpp | 4 -- .../sacado/test/UnitTests/Fad_KokkosTests.hpp | 50 ++++++++++++------- .../test/UnitTests/Fad_KokkosTests_Cuda.cpp | 4 -- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/packages/sacado/test/UnitTests/Fad_Fad_KokkosTests_Cuda.cpp b/packages/sacado/test/UnitTests/Fad_Fad_KokkosTests_Cuda.cpp index 4cc7eb8d0866..40ee81bc9c77 100644 --- a/packages/sacado/test/UnitTests/Fad_Fad_KokkosTests_Cuda.cpp +++ b/packages/sacado/test/UnitTests/Fad_Fad_KokkosTests_Cuda.cpp @@ -35,11 +35,7 @@ #include "Kokkos_Core.hpp" // Instantiate tests for Cuda device -#if defined(KOKKOS_ENABLE_CUDA_UVM) #define SACADO_TEST_DFAD 1 -#else -#define SACADO_TEST_DFAD 0 -#endif using Kokkos::Cuda; VIEW_FAD_TESTS_D( Cuda ) diff --git a/packages/sacado/test/UnitTests/Fad_KokkosTests.hpp b/packages/sacado/test/UnitTests/Fad_KokkosTests.hpp index 6303a13a9d69..ca379dc1bc64 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosTests.hpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosTests.hpp @@ -250,16 +250,16 @@ struct ValueAssignKernel { typedef typename Kokkos::ThreadLocalScalarType::type local_scalar_type; static const size_type stride = Kokkos::ViewScalarStride::stride; - const ViewType m_v; - const ValueType m_s; + const ViewType m_v; + const ViewType m_s; - ValueAssignKernel(const ViewType& v, const ValueType& s) : + ValueAssignKernel(const ViewType& v, const ViewType& s) : m_v(v), m_s(s) {}; // Multiply entries for row 'i' with a value KOKKOS_INLINE_FUNCTION void operator() (const size_type i) const { - local_scalar_type s = Sacado::partition_scalar(m_s); + local_scalar_type s = Sacado::partition_scalar(m_s(0)); m_v(i) = s; } @@ -272,7 +272,7 @@ struct ValueAssignKernel { } // Kernel launch - static void apply(const ViewType& v, const ValueType& s) { + static void apply(const ViewType& v, const ViewType& s) { const size_type nrow = v.extent(0); #if defined (KOKKOS_ENABLE_CUDA) && defined (SACADO_VIEW_CUDA_HIERARCHICAL) @@ -654,11 +654,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FadType a(fad_size, 2.3456); for (size_type i=0; i(0, fad_size), KOKKOS_LAMBDA(const int i) { + a(0).fastAccessDx(i) = 7.89 + i; + }); + ValueAssignKernel::apply( v, a ); // Copy to host host_view_type hv = Kokkos::create_mirror_view(v); Kokkos::deep_copy(hv, v); + host_view_type ha = Kokkos::create_mirror_view(a); + Kokkos::deep_copy(ha, a); + // Check success = true; for (size_type i=0; i(0, num_rows), KOKKOS_LAMBDA(const size_type i) { + for (size_type j = 0; j < fad_size; ++j) + v(i).fastAccessDx(j) = 7.89 + j; + }); // Create scalar view ScalarViewType s; @@ -1028,9 +1038,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( #else s = ScalarViewType ("scalar view", fad_size+1); #endif - Kokkos::deep_copy( s, FadType(fad_size,0.0) ); - // Call atomic_add kernel, which adds up entries in v + // Call atomic_add kernel, which adds up entries in v AtomicAddKernel::apply( v, s ); // Copy to host @@ -1038,7 +1047,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( Kokkos::deep_copy(hs, s); // Check - FadType b = num_rows*a; + auto hv = Kokkos::create_mirror_view(v); + Kokkos::deep_copy(hv, v); + + FadType b = num_rows*hv(0); success = checkFads(b, hs(), out); } @@ -2232,9 +2244,9 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, MultiplyUpdate, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, MultiplyConst, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, MultiplyMixed, F, L, D ) \ - TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, AtomicAdd, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, Rank8, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, Roger, F, L, D ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, AtomicAdd, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, AssignDifferentStrides, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, DynRankDimensionScalar, F, L, D ) \ TEUCHOS_UNIT_TEST_TEMPLATE_3_INSTANT( Kokkos_View_Fad, DynRankAssignStatic0, F, L, D ) \ diff --git a/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda.cpp b/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda.cpp index 354d205c6fa5..870392225039 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda.cpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda.cpp @@ -32,11 +32,7 @@ #include "Kokkos_Macros.hpp" -#if defined(KOKKOS_ENABLE_CUDA_UVM) #define SACADO_TEST_DFAD 1 -#else -#define SACADO_TEST_DFAD 0 -#endif #include "Fad_KokkosTests.hpp" // Instantiate tests for Cuda device. We can only test DFad is UVM is enabled. From 14c1e5272f2276f549deef9b6776f77ed8c37d8f Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Mon, 25 Oct 2021 22:01:24 +0200 Subject: [PATCH 70/98] Sacado: Re-enable Sacado unit tests for UVM-Off PR tester --- .../std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake b/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake index cf2af6363165..22b58523bac6 100644 --- a/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake +++ b/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake @@ -146,7 +146,6 @@ set (Domi_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (Kokkos_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (KokkosKernels_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (ROL_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") -set (Sacado_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (SEACAS_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (ShyLU_DD_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") set (STK_ENABLE_TESTS OFF CACHE BOOL "Turn off tests for non-UVM build") From 4d9a4f03663a93b886ced839a8b6b78ecdee04e5 Mon Sep 17 00:00:00 2001 From: Brian Kelley Date: Mon, 25 Oct 2021 14:48:21 -0600 Subject: [PATCH 71/98] MueLu: remove Tpetra deprecated from Region --- .../muelu/test/unit_tests/RegionMatrix.cpp | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/muelu/test/unit_tests/RegionMatrix.cpp b/packages/muelu/test/unit_tests/RegionMatrix.cpp index 580c104b7732..96d175bb6be8 100644 --- a/packages/muelu/test/unit_tests/RegionMatrix.cpp +++ b/packages/muelu/test/unit_tests/RegionMatrix.cpp @@ -328,18 +328,18 @@ void test_matrix(RCP > using entries_type = typename local_graph_type::entries_type; using values_type = typename local_matrix_type::values_type; - local_matrix_type orignalA = A->getLocalMatrix(); // Local matrix - entries_type refEntries = orignalA.graph.entries; // view of local column indices - values_type refValues = orignalA.values; // view of local values + local_matrix_type orignalA = A->getLocalMatrixDevice(); // Local matrix + entries_type refEntries = orignalA.graph.entries; // view of local column indices + values_type refValues = orignalA.values; // view of local values typename entries_type::HostMirror refEntries_h = Kokkos::create_mirror_view(refEntries); Kokkos::deep_copy(refEntries_h, refEntries); typename values_type::HostMirror refValues_h = Kokkos::create_mirror_view(refValues); Kokkos::deep_copy(refValues_h, refValues); - local_matrix_type compositeA = compositeMatrix->getLocalMatrix(); // Local matrix - entries_type compositeEntries = compositeA.graph.entries; // view of local column indices - values_type compositeValues = compositeA.values; // view of local values + local_matrix_type compositeA = compositeMatrix->getLocalMatrixDevice(); // Local matrix + entries_type compositeEntries = compositeA.graph.entries; // view of local column indices + values_type compositeValues = compositeA.values; // view of local values typename entries_type::HostMirror compositeEntries_h = Kokkos::create_mirror_view(compositeEntries); Kokkos::deep_copy(compositeEntries_h, compositeEntries); @@ -429,9 +429,9 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, CompositeToRegionMatrix, Scalar, using entries_type = typename local_graph_type::entries_type; using values_type = typename local_matrix_type::values_type; - local_matrix_type myLocalA = regionMats->getLocalMatrix(); // Local matrix - entries_type myEntries = myLocalA.graph.entries; // view of local column indices - values_type myValues = myLocalA.values; // view of local values + local_matrix_type myLocalA = regionMats->getLocalMatrixDevice(); // Local matrix + entries_type myEntries = myLocalA.graph.entries; // view of local column indices + values_type myValues = myLocalA.values; // view of local values typename entries_type::HostMirror myEntries_h = Kokkos::create_mirror_view(myEntries); Kokkos::deep_copy(myEntries_h, myEntries); @@ -447,8 +447,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, CompositeToRegionMatrix, Scalar, TEST_EQUALITY(regionMats->getNodeNumEntries(), 105); // In the serial case we can just compare to the values in A - entries_type refEntries = A->getLocalMatrix().graph.entries; - values_type refValues = A->getLocalMatrix().values; + entries_type refEntries = A->getLocalMatrixDevice().graph.entries; + values_type refValues = A->getLocalMatrixDevice().values; typename entries_type::HostMirror refEntries_h = Kokkos::create_mirror_view(refEntries); Kokkos::deep_copy(refEntries_h, refEntries); typename values_type::HostMirror refValues_h = Kokkos::create_mirror_view(refValues); @@ -619,18 +619,18 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, RegionToCompositeMatrix, Scalar, using entries_type = typename local_graph_type::entries_type; using values_type = typename local_matrix_type::values_type; - local_matrix_type orignalA = A->getLocalMatrix(); // Local matrix - entries_type refEntries = orignalA.graph.entries; // view of local column indices - values_type refValues = orignalA.values; // view of local values + local_matrix_type orignalA = A->getLocalMatrixDevice(); // Local matrix + entries_type refEntries = orignalA.graph.entries; // view of local column indices + values_type refValues = orignalA.values; // view of local values typename entries_type::HostMirror refEntries_h = Kokkos::create_mirror_view(refEntries); Kokkos::deep_copy(refEntries_h, refEntries); typename values_type::HostMirror refValues_h = Kokkos::create_mirror_view(refValues); Kokkos::deep_copy(refValues_h, refValues); - local_matrix_type compositeA = compositeMatrix->getLocalMatrix(); // Local matrix - entries_type compositeEntries = compositeA.graph.entries; // view of local column indices - values_type compositeValues = compositeA.values; // view of local values + local_matrix_type compositeA = compositeMatrix->getLocalMatrixDevice(); // Local matrix + entries_type compositeEntries = compositeA.graph.entries; // view of local column indices + values_type compositeValues = compositeA.values; // view of local values typename entries_type::HostMirror compositeEntries_h = Kokkos::create_mirror_view(compositeEntries); Kokkos::deep_copy(compositeEntries_h, compositeEntries); @@ -1120,9 +1120,9 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, Laplace2D, Scalar, LocalOrdinal, using entries_type = typename local_graph_type::entries_type; using values_type = typename local_matrix_type::values_type; - local_matrix_type myLocalA = regionMats->getLocalMatrix(); // Local matrix - entries_type myEntries = myLocalA.graph.entries; // view of local column indices - values_type myValues = myLocalA.values; // view of local values + local_matrix_type myLocalA = regionMats->getLocalMatrixDevice(); // Local matrix + entries_type myEntries = myLocalA.graph.entries; // view of local column indices + values_type myValues = myLocalA.values; // view of local values typename entries_type::HostMirror myEntries_h = Kokkos::create_mirror_view(myEntries); Kokkos::deep_copy(myEntries_h, myEntries); @@ -1139,8 +1139,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, Laplace2D, Scalar, LocalOrdinal, TEST_EQUALITY(regionMats->getNodeNumEntries(), 128); // In the serial case we can just compare to the values in A - entries_type refEntries = A->getLocalMatrix().graph.entries; - values_type refValues = A->getLocalMatrix().values; + entries_type refEntries = A->getLocalMatrixDevice().graph.entries; + values_type refValues = A->getLocalMatrixDevice().values; typename entries_type::HostMirror refEntries_h = Kokkos::create_mirror_view(refEntries); Kokkos::deep_copy(refEntries_h, refEntries); typename values_type::HostMirror refValues_h = Kokkos::create_mirror_view(refValues); @@ -1298,9 +1298,9 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, Laplace3D, Scalar, LocalOrdinal, using entries_type = typename local_graph_type::entries_type; using values_type = typename local_matrix_type::values_type; - local_matrix_type myLocalA = regionMats->getLocalMatrix(); // Local matrix - entries_type myEntries = myLocalA.graph.entries; // view of local column indices - values_type myValues = myLocalA.values; // view of local values + local_matrix_type myLocalA = regionMats->getLocalMatrixDevice(); // Local matrix + entries_type myEntries = myLocalA.graph.entries; // view of local column indices + values_type myValues = myLocalA.values; // view of local values typename entries_type::HostMirror myEntries_h = Kokkos::create_mirror_view(myEntries); Kokkos::deep_copy(myEntries_h, myEntries); @@ -1317,8 +1317,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(RegionMatrix, Laplace3D, Scalar, LocalOrdinal, TEST_EQUALITY(regionMats->getNodeNumEntries(), 692); // In the serial case we can just compare to the values in A - entries_type refEntries = A->getLocalMatrix().graph.entries; - values_type refValues = A->getLocalMatrix().values; + entries_type refEntries = A->getLocalMatrixDevice().graph.entries; + values_type refValues = A->getLocalMatrixDevice().values; typename entries_type::HostMirror refEntries_h = Kokkos::create_mirror_view(refEntries); Kokkos::deep_copy(refEntries_h, refEntries); typename values_type::HostMirror refValues_h = Kokkos::create_mirror_view(refValues); From dddef5c6c29abf0bf90609ff3e894c4656d71dd8 Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Mon, 25 Oct 2021 23:45:04 +0200 Subject: [PATCH 72/98] Sacado: Fad_KokkosAtomicTests_Cuda_Hierarchical UVM free --- .../test/UnitTests/Fad_KokkosAtomicTests.hpp | 20 ++++++++++++------- ...ad_KokkosAtomicTests_Cuda_Hierarchical.cpp | 5 +---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp index 8e0be8ed1560..aa8360bcaf83 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp @@ -261,10 +261,13 @@ bool testAtomic(const TagType& tag, Teuchos::FancyOStream& out) // Create and fill view ViewType v; + ViewType s0; #if defined (SACADO_DISABLE_FAD_VIEW_SPEC) - v = ViewType ("view", num_rows); + v = ViewType ("view", num_rows); + s0 = ViewType ("", 1); #else - v = ViewType ("view", num_rows, fad_size+1); + v = ViewType ("view", num_rows, fad_size+1); + s0 = ViewType ("", 1, fad_size+1); #endif host_view_type h_v = Kokkos::create_mirror_view(v); for (size_type i=0; i(num_rows, size_type(1), fad_size, i, size_type(0)); Kokkos::deep_copy(v, h_v); + Kokkos::deep_copy(s0, tag.init()); + // Create scalar view ScalarViewType s; - FadType s0 = FadType(fad_size,tag.init()); #if defined (SACADO_DISABLE_FAD_VIEW_SPEC) s = ScalarViewType ("scalar view"); #else s = ScalarViewType ("scalar view", fad_size+1); #endif - Kokkos::deep_copy( s, s0 ); + Kokkos::deep_copy( s, tag.init() ); // Call atomic_add kernel, which adds up entries in v AtomicKernel::apply( tag, v, s ); @@ -290,12 +294,14 @@ bool testAtomic(const TagType& tag, Teuchos::FancyOStream& out) Kokkos::deep_copy(hs, s); // Compute correct result - FadType b = s0; + auto b = Kokkos::create_mirror_view(s0); + Kokkos::deep_copy(b, s0); + for (size_type i=0; i LeftContiguous32; From 029e7838f6e8d7424a32ed899d6a5ea131787eb5 Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Tue, 26 Oct 2021 00:09:15 +0200 Subject: [PATCH 73/98] Sacado: Run DFad tests for remaining Sacado tests --- .../sacado/test/UnitTests/Fad_KokkosAtomicTests_Cuda.cpp | 5 +---- .../test/UnitTests/Fad_KokkosTests_Cuda_Hierarchical.cpp | 5 +---- .../test/UnitTests/Fad_KokkosTests_NoViewSpec_Cuda.cpp | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests_Cuda.cpp b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests_Cuda.cpp index 22b8b1a4cf53..7fb6b28e303c 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests_Cuda.cpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests_Cuda.cpp @@ -32,11 +32,8 @@ #include "Kokkos_Macros.hpp" -#if defined(KOKKOS_ENABLE_CUDA_UVM) #define SACADO_TEST_DFAD 1 -#else -#define SACADO_TEST_DFAD 0 -#endif + #include "Fad_KokkosAtomicTests.hpp" // Instantiate tests for Cuda device. We can only test DFad is UVM is enabled. diff --git a/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda_Hierarchical.cpp b/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda_Hierarchical.cpp index 442b093266e3..c693231fef59 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda_Hierarchical.cpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosTests_Cuda_Hierarchical.cpp @@ -37,11 +37,8 @@ #include "Kokkos_Macros.hpp" -#if defined(KOKKOS_ENABLE_CUDA_UVM) #define SACADO_TEST_DFAD 1 -#else -#define SACADO_TEST_DFAD 0 -#endif + #include "Fad_KokkosTests.hpp" typedef Kokkos::LayoutContiguous LeftContiguous32; diff --git a/packages/sacado/test/UnitTests/Fad_KokkosTests_NoViewSpec_Cuda.cpp b/packages/sacado/test/UnitTests/Fad_KokkosTests_NoViewSpec_Cuda.cpp index 7135f5deee40..40c49dab3569 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosTests_NoViewSpec_Cuda.cpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosTests_NoViewSpec_Cuda.cpp @@ -35,11 +35,8 @@ #include "Kokkos_Macros.hpp" -#if defined(KOKKOS_ENABLE_CUDA_UVM) #define SACADO_TEST_DFAD 1 -#else -#define SACADO_TEST_DFAD 0 -#endif + #include "Fad_KokkosTests.hpp" // Instantiate tests for Cuda device From 448daebe9f0105556673fd3a075a6081040b6786 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Fri, 22 Oct 2021 16:03:05 -0600 Subject: [PATCH 74/98] intrepid2: remove deprecation warnings remove Rank and MDRangePolicy from Experimental namespace --- packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp | 4 ++-- .../perf-test/ComputeBasis/test_hgrad_vector.hpp | 4 ++-- .../intrepid2/src/Cell/Intrepid2_CellToolsDefJacobian.hpp | 4 ++-- .../Intrepid2_FunctionSpaceToolsDef.hpp | 4 ++-- .../src/Shared/Intrepid2_ArrayToolsDefTensor.hpp | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp index fbc85c747cef..16186f06bbb0 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp +++ b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad.hpp @@ -210,8 +210,8 @@ namespace Intrepid2 { typedef F_hgrad_eval FunctorType; - using range_policy_type = Kokkos::Experimental::MDRangePolicy - < DeviceSpaceType, Kokkos::Experimental::Rank<2>, Kokkos::IndexType >; + using range_policy_type = Kokkos::MDRangePolicy + < DeviceSpaceType, Kokkos::Rank<2>, Kokkos::IndexType >; range_policy_type policy( { 0, 0 }, { numCells, numPoints } ); diff --git a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp index b2166912709a..f24dc63375ab 100644 --- a/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp +++ b/packages/intrepid2/perf-test/ComputeBasis/test_hgrad_vector.hpp @@ -173,8 +173,8 @@ namespace Intrepid2 { typedef F_hgrad_eval FunctorType; - using range_policy_type = Kokkos::Experimental::MDRangePolicy - < DeviceSpaceType, Kokkos::Experimental::Rank<2>, Kokkos::IndexType >; + using range_policy_type = Kokkos::MDRangePolicy + < DeviceSpaceType, Kokkos::Rank<2>, Kokkos::IndexType >; range_policy_type policy( { 0, 0 }, { numCellsAdjusted, numPoints } ); diff --git a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefJacobian.hpp b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefJacobian.hpp index b5371ac9ce59..9f0c32423b5b 100644 --- a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefJacobian.hpp +++ b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefJacobian.hpp @@ -805,8 +805,8 @@ namespace Intrepid2 { // resolve the -1 default argument for endCell into the true end cell index int endCellResolved = (endCell == -1) ? worksetCell.extent_int(0) : endCell; - using range_policy_type = Kokkos::Experimental::MDRangePolicy - < ExecSpaceType, Kokkos::Experimental::Rank<2>, Kokkos::IndexType >; + using range_policy_type = Kokkos::MDRangePolicy + < ExecSpaceType, Kokkos::Rank<2>, Kokkos::IndexType >; range_policy_type policy( { 0, 0 }, { jacobian.extent(0), jacobian.extent(1) } ); Kokkos::parallel_for( policy, FunctorType(jacobian, worksetCell, gradients, startCell, endCellResolved) ); diff --git a/packages/intrepid2/src/Discretization/FunctionSpaceTools/Intrepid2_FunctionSpaceToolsDef.hpp b/packages/intrepid2/src/Discretization/FunctionSpaceTools/Intrepid2_FunctionSpaceToolsDef.hpp index 56ec1249785d..465225c464cd 100644 --- a/packages/intrepid2/src/Discretization/FunctionSpaceTools/Intrepid2_FunctionSpaceToolsDef.hpp +++ b/packages/intrepid2/src/Discretization/FunctionSpaceTools/Intrepid2_FunctionSpaceToolsDef.hpp @@ -142,8 +142,8 @@ namespace Intrepid2 { // F = outputVals.extent(1), // P = outputVals.extent(2); - // using range_policy_type = Kokkos::Experimental::MDRangePolicy - // < DeviceType, Kokkos::Experimental::Rank<3>, Kokkos::IndexType >; + // using range_policy_type = Kokkos::MDRangePolicy + // < DeviceType, Kokkos::Rank<3>, Kokkos::IndexType >; // range_policy_type policy( { 0, 0, 0 }, // { C, F, P } ); diff --git a/packages/intrepid2/src/Shared/Intrepid2_ArrayToolsDefTensor.hpp b/packages/intrepid2/src/Shared/Intrepid2_ArrayToolsDefTensor.hpp index 571b752fbecb..922aa506aba7 100644 --- a/packages/intrepid2/src/Shared/Intrepid2_ArrayToolsDefTensor.hpp +++ b/packages/intrepid2/src/Shared/Intrepid2_ArrayToolsDefTensor.hpp @@ -793,14 +793,14 @@ namespace Intrepid2 { typedef FunctorArrayTools::F_matvecProduct FunctorType; if (hasField) { - using range_policy_type = Kokkos::Experimental::MDRangePolicy - < ExecSpaceType, Kokkos::Experimental::Rank<3>, Kokkos::IndexType >; + using range_policy_type = Kokkos::MDRangePolicy + < ExecSpaceType, Kokkos::Rank<3>, Kokkos::IndexType >; range_policy_type policy( { 0, 0, 0 }, { output.extent(0), output.extent(1), output.extent(2) } ); Kokkos::parallel_for( policy, FunctorType(output, leftInput, rightInput, isTranspose) ); } else { - using range_policy_type = Kokkos::Experimental::MDRangePolicy - < ExecSpaceType, Kokkos::Experimental::Rank<2>, Kokkos::IndexType >; + using range_policy_type = Kokkos::MDRangePolicy + < ExecSpaceType, Kokkos::Rank<2>, Kokkos::IndexType >; range_policy_type policy( { 0, 0 }, { output.extent(0), output.extent(1) } ); Kokkos::parallel_for( policy, FunctorType(output, leftInput, rightInput, isTranspose) ); From eb03da39cc1b39f518b7cf5d0a4e4eb4aa3ce26f Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Fri, 22 Oct 2021 16:06:09 -0600 Subject: [PATCH 75/98] amesos2: resolve unused warning in superlu interface --- packages/amesos2/src/Amesos2_Superlu_def.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/amesos2/src/Amesos2_Superlu_def.hpp b/packages/amesos2/src/Amesos2_Superlu_def.hpp index 5af71193dffa..14b58f1e71a5 100644 --- a/packages/amesos2/src/Amesos2_Superlu_def.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_def.hpp @@ -1060,7 +1060,6 @@ Superlu::triangular_solve_factor() if (data_.options.ConditionNumber == SLU::YES) { using STM = Teuchos::ScalarTraits; const magnitude_type eps = STM::eps (); - int n = data_.perm_r.extent(0); SCformat *Lstore = (SCformat*)(data_.L.Store); int nsuper = 1 + Lstore->nsuper; @@ -1077,6 +1076,7 @@ Superlu::triangular_solve_factor() condition_flag = (((double)max_cols * nsuper) * eps * multiply_fact >= data_.rcond); #ifdef HAVE_AMESOS2_VERBOSE_DEBUG + int n = data_.perm_r.extent(0); std::cout << this->getComm()->getRank() << " : anorm = " << data_.anorm << ", rcond = " << data_.rcond << ", n = " << n << ", num super cols = " << nsuper << ", max super cols = " << max_cols From 98bc0c8eca7212c57c9ec874b440c86117896bcf Mon Sep 17 00:00:00 2001 From: iyamazaki Date: Tue, 26 Oct 2021 00:33:41 -0600 Subject: [PATCH 76/98] Amesos2::SuperLU_dist: shift the local row and col scaling by offset --- packages/amesos2/src/Amesos2_Superludist_def.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/amesos2/src/Amesos2_Superludist_def.hpp b/packages/amesos2/src/Amesos2_Superludist_def.hpp index 4cd1fea25c5d..ef0ed950d7ef 100644 --- a/packages/amesos2/src/Amesos2_Superludist_def.hpp +++ b/packages/amesos2/src/Amesos2_Superludist_def.hpp @@ -572,7 +572,9 @@ namespace Amesos2 { if (data_.options.Equil == SLUD::YES && data_.rowequ) { SLUD::int_t ld = as(local_len_rhs); for(global_size_type j = 0; j < nrhs; ++j) { - for(size_t i = 0; i < local_len_rhs; ++i) bvals_[i + j*ld] *= data_.R[i]; + for(size_t i = 0; i < local_len_rhs; ++i) { + bvals_[i + j*ld] *= data_.R[first_global_row_b + i]; + } } } @@ -624,7 +626,9 @@ namespace Amesos2 { if (data_.options.Equil == SLUD::YES && data_.colequ) { SLUD::int_t ld = as(local_len_rhs); for(global_size_type j = 0; j < nrhs; ++j) { - for(size_t i = 0; i < local_len_rhs; ++i) xvals_[i + j*ld] *= data_.C[i]; + for(size_t i = 0; i < local_len_rhs; ++i) { + xvals_[i + j*ld] *= data_.C[first_global_row_b + i]; + } } } } From 0e6d9712163480d788b5127003f3841e0426fd66 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Mon, 25 Oct 2021 20:41:14 -0600 Subject: [PATCH 77/98] Disable override of Sacado_NEW_FAD_DESIGN_IS_DEFAULT with PR tester --- cmake/std/PullRequestLinuxCuda10.1.105TestingSettings.cmake | 4 +++- .../PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake | 4 +++- cmake/std/PullRequestLinuxCuda10.1.243TestingSettings.cmake | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cmake/std/PullRequestLinuxCuda10.1.105TestingSettings.cmake b/cmake/std/PullRequestLinuxCuda10.1.105TestingSettings.cmake index d684fc7c97be..9fc5038fdfdd 100644 --- a/cmake/std/PullRequestLinuxCuda10.1.105TestingSettings.cmake +++ b/cmake/std/PullRequestLinuxCuda10.1.105TestingSettings.cmake @@ -78,7 +78,9 @@ set (TPL_DLlib_LIBRARIES "-ldl" CACHE FILEPATH "Set by default for CUDA PR testi # The compile times for two Panzer files went up to over 6 hours. This # turns off one feature that allows these in about 24 minutes. Please remove # when issue #7532 is resolved. -set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) +# Compile time issues addressed by #8377. Commenting out the override of +# Sacado_NEW_FAD_DESIGN_IS_DEFAULT to return to default settings. +#set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) # Disable some packages that can't be tested with this PR build set (Trilinos_ENABLE_ShyLU_NodeTacho OFF CACHE BOOL diff --git a/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake b/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake index cf2af6363165..4af04bc73ee4 100644 --- a/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake +++ b/cmake/std/PullRequestLinuxCuda10.1.105uvmOffTestingSettings.cmake @@ -77,7 +77,9 @@ set (TPL_DLlib_LIBRARIES "-ldl" CACHE FILEPATH "Set by default for CUDA PR testi # The compile times for two Panzer files went up to over 6 hours. This # turns off one feature that allows these in about 24 minutes. Please remove # when issue #7532 is resolved. -set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) +# Compile time issues addressed by #8377. Commenting out the override of +# Sacado_NEW_FAD_DESIGN_IS_DEFAULT to return to default settings. +#set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) # Disable some packages that can't be tested with this PR build set (Trilinos_ENABLE_ShyLU_NodeTacho OFF CACHE BOOL diff --git a/cmake/std/PullRequestLinuxCuda10.1.243TestingSettings.cmake b/cmake/std/PullRequestLinuxCuda10.1.243TestingSettings.cmake index 07a87bbab985..c65b54ffffa5 100644 --- a/cmake/std/PullRequestLinuxCuda10.1.243TestingSettings.cmake +++ b/cmake/std/PullRequestLinuxCuda10.1.243TestingSettings.cmake @@ -84,7 +84,9 @@ set (TPL_DLlib_LIBRARIES "-ldl" CACHE FILEPATH "Set by default for CUDA PR testi # The compile times for two Panzer files went up to over 6 hours. This # turns off one feature that allows these in about 24 minutes. Please remove # when issue #7532 is resolved. -set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) +# Compile time issues addressed by #8377. Commenting out the override of +# Sacado_NEW_FAD_DESIGN_IS_DEFAULT to return to default settings. +#set (Sacado_NEW_FAD_DESIGN_IS_DEFAULT OFF CACHE BOOL "Temporary fix for issue #7532" ) # Disable some packages that can't be tested with this PR build set (Trilinos_ENABLE_ShyLU_NodeTacho OFF CACHE BOOL From 15c606f4c774b5a39fb9b90ce5b3aeeb3792d30e Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Tue, 19 Oct 2021 13:14:21 -0600 Subject: [PATCH 78/98] MueLu: Simplify passing precomputed objects --- .../MueLu_CreateXpetraPreconditioner.hpp | 6 +- .../MueCentral/MueLu_HierarchyUtils_def.hpp | 84 +++++++++++++++++-- packages/muelu/src/MueCentral/MueLu_Level.hpp | 2 +- packages/muelu/test/scaling/Driver.cpp | 5 ++ 4 files changed, 87 insertions(+), 10 deletions(-) diff --git a/packages/muelu/adapters/xpetra/MueLu_CreateXpetraPreconditioner.hpp b/packages/muelu/adapters/xpetra/MueLu_CreateXpetraPreconditioner.hpp index 69c7ebe30c59..a3c8fcd6f7a1 100644 --- a/packages/muelu/adapters/xpetra/MueLu_CreateXpetraPreconditioner.hpp +++ b/packages/muelu/adapters/xpetra/MueLu_CreateXpetraPreconditioner.hpp @@ -126,13 +126,13 @@ namespace MueLu { RCP H = mueLuFactory->CreateHierarchy(label); H->setlib(op->getDomainMap()->lib()); - // Stick the non-serializible data on the hierarchy. - HierarchyUtils::AddNonSerializableDataToHierarchy(*mueLuFactory,*H, nonSerialList); - // Set fine level operator H->GetLevel(0)->Set("A", op); H->SetProcRankVerbose(op->getDomainMap()->getComm()->getRank()); + // Stick the non-serializible data on the hierarchy. + HierarchyUtils::AddNonSerializableDataToHierarchy(*mueLuFactory,*H, nonSerialList); + mueLuFactory->SetupHierarchy(*H); tm->stop(); diff --git a/packages/muelu/src/MueCentral/MueLu_HierarchyUtils_def.hpp b/packages/muelu/src/MueCentral/MueLu_HierarchyUtils_def.hpp index 1c91ef188a51..cb2b805a156f 100644 --- a/packages/muelu/src/MueCentral/MueLu_HierarchyUtils_def.hpp +++ b/packages/muelu/src/MueCentral/MueLu_HierarchyUtils_def.hpp @@ -98,15 +98,52 @@ namespace MueLu { !IsParamMuemexVariable(name), Exceptions::InvalidArgument, std::string("MueLu::Utils::AddNonSerializableDataToHierarchy: parameter list contains unknown data type(") + name + ")"); + // Get a valid communicator and lib + RCP > comm; + if (!level->GetComm().is_null()) + comm = level->GetComm(); + else if (level->IsAvailable("A")) { + RCP mat; + level->Get("A", mat); + comm = mat->getMap()->getComm(); + } else { + RCP level0 = H.GetLevel(0); + if (!level0->GetComm().is_null()) + comm = level0->GetComm(); + else { + RCP mat; + level0->Get("A", mat); + comm = mat->getMap()->getComm(); + } + } + Xpetra::UnderlyingLib lib = level->lib(); + if (name == "A") { - level->Set(name, Teuchos::getValue > (levelListEntry->second),NoFactory::get()); + RCP mat; + if (levelListEntry->second.isType()) + // We might also want to read maps here. + mat = Xpetra::IO::Read(Teuchos::getValue(levelListEntry->second), lib, comm); + else + mat = Teuchos::getValue > (levelListEntry->second); + level->Set(name, mat, NoFactory::get()); M->SetFactory(name, NoFactory::getRCP()); // TAW: not sure about this: be aware that this affects all levels // However, A is accessible through NoFactory anyway, so it should // be fine here. } else if(name == "P" || name == "R" || name == "K" || name == "M") { + RCP mat; + if (levelListEntry->second.isType()) + // We might also want to read maps here. + mat = Xpetra::IO::Read(Teuchos::getValue(levelListEntry->second), lib, comm); + else + mat = Teuchos::getValue > (levelListEntry->second); + + RCP fact = M->GetFactory(name); + level->AddKeepFlag(name,fact.get(),MueLu::UserData); + level->Set(name, mat, fact.get()); + level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData); - level->Set(name, Teuchos::getValue > (levelListEntry->second), NoFactory::get()); + level->Set(name, mat, NoFactory::get()); } else if (name == "Mdiag") { @@ -115,15 +152,50 @@ namespace MueLu { } else if (name == "Nullspace") { - level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData); - level->Set(name, Teuchos::getValue >(levelListEntry->second), NoFactory::get()); + RCP vec; + if (levelListEntry->second.isType()) { + TEUCHOS_ASSERT(level->IsAvailable("A")); + RCP mat; + level->Get("A", mat); + auto map = mat->getMap(); + vec = Xpetra::IO::ReadMultiVector(Teuchos::getValue(levelListEntry->second), map); + } else + vec = Teuchos::getValue > (levelListEntry->second); + level->AddKeepFlag(name, NoFactory::get(), MueLu::UserData); + level->Set(name, vec, NoFactory::get()); //M->SetFactory(name, NoFactory::getRCP()); // TAW: generally it is a bad idea to overwrite the factory manager data here // One should do this only in very special cases } else if(name == "Coordinates") //Scalar of Coordinates MV is always double { + RCP vec; + if (levelListEntry->second.isType()) { + TEUCHOS_ASSERT(level->IsAvailable("A")); + RCP mat; + level->Get("A", mat); + size_t blkSize = mat->GetFixedBlockSize(); + RCP nodeMap = mat->getRowMap(); + if (blkSize > 1) { + // Create a nodal map, as coordinates have not been expanded to a DOF map yet. + RCP dofMap = mat->getRowMap(); + GO indexBase = dofMap->getIndexBase(); + size_t numLocalDOFs = dofMap->getNodeNumElements(); + TEUCHOS_TEST_FOR_EXCEPTION(numLocalDOFs % blkSize, Exceptions::RuntimeError, + "HierarchyUtils: block size (" << blkSize << ") is incompatible with the number of local dofs in a row map (" << numLocalDOFs); + ArrayView GIDs = dofMap->getNodeElementList(); + + Array nodeGIDs(numLocalDOFs/blkSize); + for (size_t i = 0; i < numLocalDOFs; i += blkSize) + nodeGIDs[i/blkSize] = (GIDs[i] - indexBase)/blkSize + indexBase; + + Xpetra::global_size_t INVALID = Teuchos::OrdinalTraits::invalid(); + nodeMap = MapFactory::Build(dofMap->lib(), INVALID, nodeGIDs(), indexBase, dofMap->getComm()); + } + vec = Xpetra::IO::coordinateType,LocalOrdinal,GlobalOrdinal,Node>::ReadMultiVector(Teuchos::getValue(levelListEntry->second), nodeMap); + } else + vec = Teuchos::getValue > (levelListEntry->second); level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData); - level->Set(name, Teuchos::getValue >(levelListEntry->second), NoFactory::get()); + level->Set(name, vec, NoFactory::get()); //M->SetFactory(name, NoFactory::getRCP()); // TAW: generally it is a bad idea to overwrite the factory manager data here } else if(name == "Node Comm") @@ -214,7 +286,6 @@ namespace MueLu { } else if(name == "Coordinates") {//Scalar of Coordinates MV is always double level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData); level->Set(name, Teuchos::getValue >(userListEntry->second), NoFactory::get()); - level->print(std::cout, MueLu::VERB_EXTREME); } else if(name == "Node Comm") { level->AddKeepFlag(name,NoFactory::get(),MueLu::UserData); @@ -282,6 +353,7 @@ namespace MueLu { throw std::runtime_error("Invalid non-serializable data on list"); } } + // level->print(std::cout, MueLu::Debug); } } } diff --git a/packages/muelu/src/MueCentral/MueLu_Level.hpp b/packages/muelu/src/MueCentral/MueLu_Level.hpp index f189fdc8f3f6..be33b4ed2d74 100644 --- a/packages/muelu/src/MueCentral/MueLu_Level.hpp +++ b/packages/muelu/src/MueCentral/MueLu_Level.hpp @@ -194,7 +194,7 @@ namespace MueLu { /* printf("(l=%d) getting \"%20s\" generated by %10p [actually, generated by %p (%43s)]\n", levelID_, ename.c_str(), factory, fac, fac->description().c_str());*/ - TEUCHOS_TEST_FOR_EXCEPTION(!IsKey(fac, ename), Exceptions::RuntimeError, "\"" + ename + "\" not found on level " + toString(GetLevelID()) + "."); + TEUCHOS_TEST_FOR_EXCEPTION(!IsKey(fac, ename), Exceptions::RuntimeError, "\"" + ename + "\" generated by factory \"" + fac->description() + "\" not found on level " + toString(GetLevelID()) + "."); if (!IsAvailable(ename, fac)) { TEUCHOS_TEST_FOR_EXCEPTION(NumRequests(fac, ename) < 1 && GetKeepFlag(ename, fac) == 0, Exceptions::RuntimeError, diff --git a/packages/muelu/test/scaling/Driver.cpp b/packages/muelu/test/scaling/Driver.cpp index e84784bd11fb..4f9bb5c03fa8 100644 --- a/packages/muelu/test/scaling/Driver.cpp +++ b/packages/muelu/test/scaling/Driver.cpp @@ -230,6 +230,7 @@ int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib& lib, int ar std::string rangeMapFile; clp.setOption("rangemap", &rangeMapFile, "rangemap data file"); std::string matrixFile; clp.setOption("matrix", &matrixFile, "matrix data file"); std::string rhsFile; clp.setOption("rhs", &rhsFile, "rhs data file"); + std::string solFile; clp.setOption("sol", &solFile, "write the solution to this file"); std::string coordFile; clp.setOption("coords", &coordFile, "coordinates data file"); std::string coordMapFile; clp.setOption("coordsmap", &coordMapFile, "coordinates map data file"); std::string nullFile; clp.setOption("nullspace", &nullFile, "nullspace data file"); @@ -563,6 +564,10 @@ MueLu::MueLu_AMGX_initialize_plugins(); }//end reruns + if (solFile != "") + Xpetra::IO::Write(solFile, *X); + + #ifdef HAVE_MUELU_AMGX // Finalize AMGX MueLu::MueLu_AMGX_finalize_plugins(); From 78fac347f6e5b7f155ba4d53378523dae5e63c66 Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Wed, 20 Oct 2021 13:54:14 -0600 Subject: [PATCH 79/98] MueLu: Rebase gold files --- .../Output/operator_solve_5_np1_epetra.gold | 25 ------------------- .../Output/operator_solve_5_np1_tpetra.gold | 25 ------------------- .../Output/operator_solve_5_np4_epetra.gold | 25 ------------------- .../Output/operator_solve_5_np4_tpetra.gold | 25 ------------------- .../Output/operator_solve_6_np1_epetra.gold | 22 ---------------- .../Output/operator_solve_6_np1_tpetra.gold | 22 ---------------- .../Output/operator_solve_6_np4_epetra.gold | 22 ---------------- .../Output/operator_solve_6_np4_tpetra.gold | 22 ---------------- .../Output/operator_solve_7_np1_epetra.gold | 22 ---------------- .../Output/operator_solve_7_np1_tpetra.gold | 22 ---------------- .../Output/operator_solve_7_np4_epetra.gold | 22 ---------------- .../Output/operator_solve_7_np4_tpetra.gold | 22 ---------------- .../Output/operator_solve_5_np1_tpetra.gold | 25 ------------------- .../Output/operator_solve_5_np4_tpetra.gold | 25 ------------------- .../Output/operator_solve_6_np1_tpetra.gold | 22 ---------------- .../Output/operator_solve_6_np4_tpetra.gold | 22 ---------------- .../Output/operator_solve_7_np1_tpetra.gold | 22 ---------------- .../Output/operator_solve_7_np4_tpetra.gold | 22 ---------------- 18 files changed, 414 deletions(-) diff --git a/packages/muelu/test/interface/default/Output/operator_solve_5_np1_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_5_np1_epetra.gold index 5df79af4ee13..cfd6b4cb2877 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_5_np1_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_5_np1_epetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_5_np1_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_5_np1_tpetra.gold index 56db68d6a235..a47f7f59617f 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_5_np1_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_5_np1_tpetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_5_np4_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_5_np4_epetra.gold index 97116a5e3822..e7b0bdd1e23d 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_5_np4_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_5_np4_epetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_5_np4_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_5_np4_tpetra.gold index 4f8366aa67da..7f67123c53fc 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_5_np4_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_5_np4_tpetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_6_np1_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_6_np1_epetra.gold index fd00a4b79e67..fc7703a6b858 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_6_np1_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_6_np1_epetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_6_np1_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_6_np1_tpetra.gold index eb86e150b9a8..4f7220c773d6 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_6_np1_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_6_np1_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_6_np4_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_6_np4_epetra.gold index 3c07213c30d1..7f2e4df41b0c 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_6_np4_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_6_np4_epetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_6_np4_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_6_np4_tpetra.gold index c14179bbd366..a32e937c5a07 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_6_np4_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_6_np4_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/default/Output/operator_solve_7_np1_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_7_np1_epetra.gold index 553c57aac0f5..9136ab9e667d 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_7_np1_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_7_np1_epetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> diff --git a/packages/muelu/test/interface/default/Output/operator_solve_7_np1_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_7_np1_tpetra.gold index 565507f9a78c..26b1dc8ef187 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_7_np1_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_7_np1_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> diff --git a/packages/muelu/test/interface/default/Output/operator_solve_7_np4_epetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_7_np4_epetra.gold index 9ffca77409c7..996f2f1c60d5 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_7_np4_epetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_7_np4_epetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 [unused] relaxation: damping factor = 1 [unused] Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> diff --git a/packages/muelu/test/interface/default/Output/operator_solve_7_np4_tpetra.gold b/packages/muelu/test/interface/default/Output/operator_solve_7_np4_tpetra.gold index c2cc052d8f54..7f07fca1fa52 100644 --- a/packages/muelu/test/interface/default/Output/operator_solve_7_np4_tpetra.gold +++ b/packages/muelu/test/interface/default/Output/operator_solve_7_np4_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory) -Matrix filtering (MueLu::FilteredAFactory) -Build (MueLu::CoalesceDropFactory) -Build (MueLu::AmalgamationFactory) -[empty list] -algorithm = "classical" classical algorithm = "default": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Filtered matrix is not being constructed as no filtering is being done -Build (MueLu::TentativePFactory) -Build (MueLu::UncoupledAggregationFactory) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregates (Phase 1 (main)) -BuildAggregates (Phase 2a (secondary)) -BuildAggregates (Phase 2b (expansion)) -BuildAggregates (Phase 3 (cleanup)) -Nullspace factory (MueLu::NullspaceFactory) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory) -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np1_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np1_tpetra.gold index d2369aa0b0b8..282e22593f7b 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np1_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np1_tpetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np4_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np4_tpetra.gold index 9401a0fbba43..ed3796b9fc90 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np4_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_5_np4_tpetra.gold @@ -6,31 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] -Transpose P (MueLu::TransPFactory) -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np1_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np1_tpetra.gold index dbe8eb0eebd0..600b17ed42f7 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np1_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np1_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np4_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np4_tpetra.gold index 3b8329245db7..14ac90e59970 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np4_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_6_np4_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Transpose P (MueLu::TransPFactory) matrixmatrix: kernel params -> [empty list] diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np1_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np1_tpetra.gold index d4fd71378201..26b1dc8ef187 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np1_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np1_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> diff --git a/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np4_tpetra.gold b/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np4_tpetra.gold index 15c4d606eda0..7f07fca1fa52 100644 --- a/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np4_tpetra.gold +++ b/packages/muelu/test/interface/kokkos/Output/operator_solve_7_np4_tpetra.gold @@ -6,28 +6,6 @@ smoother -> relaxation: sweeps = 1 relaxation: damping factor = 1 Level 1 -Prolongator smoothing (MueLu::SaPFactory_kokkos) -Build (MueLu::CoalesceDropFactory_kokkos) -Build (MueLu::AmalgamationFactory_kokkos) -[empty list] -algorithm = "classical": threshold = 0, blocksize = 1 -lightweight wrap = 1 -Build (MueLu::TentativePFactory_kokkos) -Build (MueLu::UncoupledAggregationFactory_kokkos) -BuildAggregates (Phase - (Dirichlet)) -BuildAggregatesDeterministic (Phase 1 (main)) -BuildAggregatesDeterministic (Phase 2a (secondary)) -BuildAggregatesDeterministic (Phase 2b (expansion)) -BuildAggregatesDeterministic (Phase 3 (cleanup)) -aggregation: deterministic = 1 [unused] -Nullspace factory (MueLu::NullspaceFactory_kokkos) -Fine level nullspace = Nullspace -Build (MueLu::CoarseMapFactory_kokkos) -[empty list] -matrixmatrix: kernel params -> - [empty list] -matrixmatrix: kernel params -> - [empty list] Computing Ac (MueLu::RAPFactory) transpose: use implicit = 1 matrixmatrix: kernel params -> From b155965ec39d77c095ca9286e70889ac5f450d18 Mon Sep 17 00:00:00 2001 From: Brian Kelley Date: Tue, 26 Oct 2021 16:04:47 -0600 Subject: [PATCH 80/98] MueLu: fix ReitzingerPFactory for non-UVM --- .../MueLu_ReitzingerPFactory_def.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_ReitzingerPFactory_def.hpp b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_ReitzingerPFactory_def.hpp index 883edffc743b..a5c69c6fcd6b 100644 --- a/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_ReitzingerPFactory_def.hpp +++ b/packages/muelu/src/Transfers/Smoothed-Aggregation/MueLu_ReitzingerPFactory_def.hpp @@ -388,13 +388,13 @@ namespace MueLu { ArrayView columns; ArrayView values; Pe->getLocalRowView(i,columns,values); - // FIXME: This won't work on fancy nodes - ArrayView values_nc = Teuchos::av_const_cast(values); + Teuchos::Array newValues(values.size()); for (LO j=0; j<(LO)values.size(); j++) - if ((values_nc[j] == one || values_nc[j] == neg_one)) - values_nc[j] = zero; + if ((values[j] == one || values[j] == neg_one)) + newValues[j] = zero; else - values_nc[j] /= two; + newValues[j] = values[j] / two; + Pe->replaceLocalValues(i,columns,newValues()); }//end for i < Ne Pe->fillComplete(Pe->getDomainMap(),Pe->getRangeMap()); } From 69402959951d12ae4de8aeaa18271fcc2efc3db5 Mon Sep 17 00:00:00 2001 From: Jacob Domagala Date: Wed, 27 Oct 2021 14:42:17 +0200 Subject: [PATCH 81/98] Sacado: Use Kokkos::View instead of Kokkos::View for singular Fad variables in Fad_KokkosTests and Fad_KokkosAtomicTests --- .../test/UnitTests/Fad_KokkosAtomicTests.hpp | 10 +++---- .../sacado/test/UnitTests/Fad_KokkosTests.hpp | 26 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp index aa8360bcaf83..472513c9b896 100644 --- a/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp +++ b/packages/sacado/test/UnitTests/Fad_KokkosAtomicTests.hpp @@ -261,13 +261,13 @@ bool testAtomic(const TagType& tag, Teuchos::FancyOStream& out) // Create and fill view ViewType v; - ViewType s0; + ScalarViewType s0; #if defined (SACADO_DISABLE_FAD_VIEW_SPEC) v = ViewType ("view", num_rows); - s0 = ViewType ("", 1); + s0 = ScalarViewType (""); #else v = ViewType ("view", num_rows, fad_size+1); - s0 = ViewType ("", 1, fad_size+1); + s0 = ScalarViewType ("", fad_size+1); #endif host_view_type h_v = Kokkos::create_mirror_view(v); for (size_type i=0; i +template struct ValueAssignKernel { typedef typename ViewType::execution_space execution_space; typedef typename ViewType::size_type size_type; @@ -251,15 +251,15 @@ struct ValueAssignKernel { static const size_type stride = Kokkos::ViewScalarStride::stride; const ViewType m_v; - const ViewType m_s; + const ScalarViewType m_s; - ValueAssignKernel(const ViewType& v, const ViewType& s) : + ValueAssignKernel(const ViewType& v, const ScalarViewType& s) : m_v(v), m_s(s) {}; // Multiply entries for row 'i' with a value KOKKOS_INLINE_FUNCTION void operator() (const size_type i) const { - local_scalar_type s = Sacado::partition_scalar(m_s(0)); + local_scalar_type s = Sacado::partition_scalar(m_s()); m_v(i) = s; } @@ -272,7 +272,7 @@ struct ValueAssignKernel { } // Kernel launch - static void apply(const ViewType& v, const ViewType& s) { + static void apply(const ViewType& v, const ScalarViewType& s) { const size_type nrow = v.extent(0); #if defined (KOKKOS_ENABLE_CUDA) && defined (SACADO_VIEW_CUDA_HIERARCHICAL) @@ -713,21 +713,23 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( Kokkos_View_Fad, ValueAssign, FadType, Layout, Device ) { typedef Kokkos::View ViewType; + typedef Kokkos::View ScalarViewType; typedef typename ViewType::size_type size_type; typedef typename ViewType::HostMirror host_view_type; + typedef typename ScalarViewType::HostMirror host_scalar_view_type; const size_type num_rows = global_num_rows; const size_type fad_size = global_fad_size; // Create and fill view ViewType v; - ViewType a; + ScalarViewType a; #if defined (SACADO_DISABLE_FAD_VIEW_SPEC) v = ViewType ("view", num_rows); - a = ViewType ("fad", 1); + a = ScalarViewType ("fad"); #else v = ViewType ("view", num_rows, fad_size+1); - a = ViewType ("fad", 1, fad_size+1); + a = ScalarViewType ("fad", fad_size+1); #endif typename ViewType::array_type va = v; Kokkos::deep_copy( va, 1.0 ); @@ -736,22 +738,22 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( Kokkos::deep_copy(a, 2.3456); Kokkos::parallel_for(Kokkos::RangePolicy< Device>(0, fad_size), KOKKOS_LAMBDA(const int i) { - a(0).fastAccessDx(i) = 7.89 + i; + a().fastAccessDx(i) = 7.89 + i; }); - ValueAssignKernel::apply( v, a ); + ValueAssignKernel::apply( v, a ); // Copy to host host_view_type hv = Kokkos::create_mirror_view(v); Kokkos::deep_copy(hv, v); - host_view_type ha = Kokkos::create_mirror_view(a); + host_scalar_view_type ha = Kokkos::create_mirror_view(a); Kokkos::deep_copy(ha, a); // Check success = true; for (size_type i=0; i Date: Tue, 26 Oct 2021 09:28:05 -0600 Subject: [PATCH 82/98] MueLu: Construct Ifpack2Smoother using Operator instead of Matrix --- .../muelu/research/caglusa/CMakeLists.txt | 2 +- .../Smoothers/MueLu_Ifpack2Smoother_decl.hpp | 2 +- .../Smoothers/MueLu_Ifpack2Smoother_def.hpp | 93 ++++++++++++------- .../muelu/src/Utils/MueLu_Utilities_decl.hpp | 90 +++++++++++------- .../muelu/src/Utils/MueLu_Utilities_def.hpp | 81 +++++++++------- .../src/Operator/Xpetra_TpetraOperator.hpp | 7 +- 6 files changed, 172 insertions(+), 103 deletions(-) diff --git a/packages/muelu/research/caglusa/CMakeLists.txt b/packages/muelu/research/caglusa/CMakeLists.txt index 0e96e0382f05..ee89be39796e 100644 --- a/packages/muelu/research/caglusa/CMakeLists.txt +++ b/packages/muelu/research/caglusa/CMakeLists.txt @@ -18,7 +18,7 @@ IF (${PACKAGE_NAME}_ENABLE_Tpetra AND ${PACKAGE_NAME}_ENABLE_Belos AND ${PACKAGE TRIBITS_COPY_FILES_TO_BINARY_DIR(caglusa_cp SOURCE_FILES - hierarchical.xml aux.xml + hierarchical.xml muelu.xml aux.xml rowmap.mtx coeffmap.mtx ghosted_coeffmap.mtx Anear.mtx basismatrix.mtx kernelApproximations.mtx transfer0.mtx transfer1.mtx transfer2.mtx transfer3.mtx transfer4.mtx diff --git a/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_decl.hpp b/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_decl.hpp index 2d6c7c141580..87b0c0a0d622 100644 --- a/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_decl.hpp +++ b/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_decl.hpp @@ -234,7 +234,7 @@ namespace MueLu { RCP > prec_; //! matrix, used in apply if solving residual equation - RCP A_; + RCP A_; }; // class Ifpack2Smoother diff --git a/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_def.hpp b/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_def.hpp index dcca37279288..e054c31dc2e5 100644 --- a/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_def.hpp +++ b/packages/muelu/src/Smoothers/MueLu_Ifpack2Smoother_def.hpp @@ -137,7 +137,14 @@ namespace MueLu { if(!precList.is_null() && precList->isParameter("partitioner: type") && precList->get("partitioner: type") == "linear" && !precList->isParameter("partitioner: local parts")) { - precList->set("partitioner: local parts", (int)A_->getNodeNumRows() / A_->GetFixedBlockSize()); + LO matrixBlockSize = 1; + int lclSize = A_->getRangeMap()->getNodeNumElements(); + RCP matA = rcp_dynamic_cast(A_); + if (!matA.is_null()) { + lclSize = matA->getNodeNumRows(); + matrixBlockSize = matA->GetFixedBlockSize(); + } + precList->set("partitioner: local parts", lclSize / matrixBlockSize); } prec_->setParameters(*precList); @@ -207,31 +214,38 @@ namespace MueLu { template void Ifpack2Smoother::Setup(Level& currentLevel) { FactoryMonitor m(*this, "Setup Smoother", currentLevel); - A_ = Factory::Get< RCP >(currentLevel, "A"); + A_ = Factory::Get< RCP >(currentLevel, "A"); ParameterList& paramList = const_cast(this->GetParameterList()); // If the user asked us to convert the matrix into BlockCrsMatrix form, we do that now - if(paramList.isParameter("smoother: use blockcrsmatrix storage") && paramList.get("smoother: use blockcrsmatrix storage") && A_->GetFixedBlockSize()) { - // NOTE: Don't think you can move this out of the if block. You can't. The test MueLu_MeshTyingBlocked_SimpleSmoother_2dof_medium_MPI_1 will fail - int blocksize = A_->GetFixedBlockSize(); - using TpetraBlockCrsMatrix = Xpetra::TpetraBlockCrsMatrix; - RCP AcrsWrap = rcp_dynamic_cast(A_); - if(AcrsWrap.is_null()) - throw std::runtime_error("Ifpack2Smoother: Cannot convert matrix A to CrsMatrixWrap object."); - RCP Acrs = AcrsWrap->getCrsMatrix(); - if(Acrs.is_null()) - throw std::runtime_error("Ifpack2Smoother: Cannot extract CrsMatrix from matrix A."); - RCP At = rcp_dynamic_cast(Acrs); - if(At.is_null()) - throw std::runtime_error("Ifpack2Smoother: Cannot extract TpetraCrsMatrix from matrix A."); - - RCP > blockCrs = Tpetra::convertToBlockCrsMatrix(*At->getTpetra_CrsMatrix(),blocksize); - RCP blockCrs_as_crs = rcp(new TpetraBlockCrsMatrix(blockCrs)); - RCP blockWrap = rcp(new CrsMatrixWrap(blockCrs_as_crs)); - A_ = blockWrap; - this->GetOStream(Statistics0) << "Ifpack2Smoother: Using BlockCrsMatrix storage with blocksize "<("smoother: use blockcrsmatrix storage")) { + int blocksize = 1; + RCP matA = rcp_dynamic_cast(A_); + if (!matA.is_null()) + blocksize = matA->GetFixedBlockSize(); + if (blocksize) { + // NOTE: Don't think you can move this out of the if block. You can't. The test MueLu_MeshTyingBlocked_SimpleSmoother_2dof_medium_MPI_1 will fail + + using TpetraBlockCrsMatrix = Xpetra::TpetraBlockCrsMatrix; + RCP AcrsWrap = rcp_dynamic_cast(A_); + if(AcrsWrap.is_null()) + throw std::runtime_error("Ifpack2Smoother: Cannot convert matrix A to CrsMatrixWrap object."); + RCP Acrs = AcrsWrap->getCrsMatrix(); + if(Acrs.is_null()) + throw std::runtime_error("Ifpack2Smoother: Cannot extract CrsMatrix from matrix A."); + RCP At = rcp_dynamic_cast(Acrs); + if(At.is_null()) + throw std::runtime_error("Ifpack2Smoother: Cannot extract TpetraCrsMatrix from matrix A."); + + RCP > blockCrs = Tpetra::convertToBlockCrsMatrix(*At->getTpetra_CrsMatrix(),blocksize); + RCP blockCrs_as_crs = rcp(new TpetraBlockCrsMatrix(blockCrs)); + RCP blockWrap = rcp(new CrsMatrixWrap(blockCrs_as_crs)); + A_ = blockWrap; + this->GetOStream(Statistics0) << "Ifpack2Smoother: Using BlockCrsMatrix storage with blocksize "<getMatrix(0,0)->getNodeNumRows(); size_t numPres = bA->getMatrix(1,0)->getNodeNumRows(); - size_t numRows = A_->getNodeNumRows(); + size_t numRows = rcp_dynamic_cast(A_, true)->getNodeNumRows(); ArrayRCP blockSeeds(numRows, Teuchos::OrdinalTraits::invalid()); @@ -423,8 +437,11 @@ namespace MueLu { ArrayRCP dof_ids; // We need to unamalgamate, if the FixedBlockSize > 1 - if(A_->GetFixedBlockSize() > 1) { - LO blocksize = (LO) A_->GetFixedBlockSize(); + LO blocksize = 1; + RCP matA = rcp_dynamic_cast(A_); + if (!matA.is_null()) + blocksize = matA->GetFixedBlockSize(); + if(blocksize > 1) { dof_ids.resize(aggregate_ids.size() * blocksize); for(LO i=0; i<(LO)aggregate_ids.size(); i++) { for(LO j=0; j<(LO)blocksize; j++) @@ -498,12 +515,13 @@ namespace MueLu { dimension = basis->getBaseCellTopology().getDimension(); else TEUCHOS_TEST_FOR_EXCEPTION(true,std::invalid_argument,"Unrecognized smoother neighborhood type. Supported types are node, edge, face."); + RCP matA = rcp_dynamic_cast(A_, true); vector> seeds; - MueLuIntrepid::FindGeometricSeedOrdinals(basis, *elemToNode, seeds, *A_->getRowMap(), *A_->getColMap()); + MueLuIntrepid::FindGeometricSeedOrdinals(basis, *elemToNode, seeds, *matA->getRowMap(), *matA->getColMap()); // Ifpack2 wants the seeds in an array of the same length as the number of local elements, // with local partition #s marked for the ones that are seeds, and invalid for the rest - int myNodeCount = A_->getRowMap()->getNodeNumElements(); + int myNodeCount = matA->getRowMap()->getNodeNumElements(); ArrayRCP nodeSeeds(myNodeCount,lo_invalid); int localPartitionNumber = 0; for (LocalOrdinal seed : seeds[dimension]) @@ -547,7 +565,8 @@ namespace MueLu { for(size_t k = 0; k < Teuchos::as(TVertLineIdSmoo.size()); k++) { if(maxPart < TVertLineIdSmoo[k]) maxPart = TVertLineIdSmoo[k]; } - size_t numLocalRows = A_->getNodeNumRows(); + RCP matA = rcp_dynamic_cast(A_, true); + size_t numLocalRows = matA->getNodeNumRows(); TEUCHOS_TEST_FOR_EXCEPTION(numLocalRows % TVertLineIdSmoo.size() != 0, Exceptions::RuntimeError, "MueLu::Ifpack2Smoother::Setup(): the number of local nodes is incompatible with the TVertLineIdsSmoo."); @@ -556,15 +575,15 @@ namespace MueLu { //It is encoded in either the MueLu Level, or in the Xpetra matrix block size. //This value is needed by Ifpack2 to do decoupled block relaxation. int actualDofsPerNode = numLocalRows / TVertLineIdSmoo.size(); - LO matrixBlockSize = A_->GetFixedBlockSize(); + LO matrixBlockSize = matA->GetFixedBlockSize(); if(matrixBlockSize > 1 && actualDofsPerNode > 1) { - TEUCHOS_TEST_FOR_EXCEPTION(actualDofsPerNode != A_->GetFixedBlockSize(), Exceptions::RuntimeError, + TEUCHOS_TEST_FOR_EXCEPTION(actualDofsPerNode != matrixBlockSize, Exceptions::RuntimeError, "MueLu::Ifpack2Smoother::Setup(): A is a block matrix but its block size and DOFs/node from partitioner disagree"); } else if(matrixBlockSize > 1) { - actualDofsPerNode = A_->GetFixedBlockSize(); + actualDofsPerNode = matrixBlockSize; } myparamList.set("partitioner: PDE equations", actualDofsPerNode); @@ -650,7 +669,11 @@ namespace MueLu { Factory::Get::magnitudeType,LO,GO,NO> > >(currentLevel, "Coordinates"); Teuchos::RCP::magnitudeType,LO,GO,NO> > coordinates = Teuchos::rcpFromRef(Xpetra::toTpetra::magnitudeType,LO,GO,NO>(*xCoordinates)); - size_t numDofsPerNode = A_->getNodeNumRows() / xCoordinates->getMap()->getNodeNumElements(); + RCP matA = rcp_dynamic_cast(A_); + size_t lclSize = A_->getRangeMap()->getNodeNumElements(); + if (!matA.is_null()) + lclSize = matA->getNodeNumRows(); + size_t numDofsPerNode = lclSize / xCoordinates->getMap()->getNodeNumElements(); myparamList.set("partitioner: coordinates", coordinates); myparamList.set("partitioner: PDE equations", (int) numDofsPerNode); } @@ -716,7 +739,9 @@ namespace MueLu { Teuchos::RCP > chebyPrec = rcp_dynamic_cast >(prec_); if (chebyPrec != Teuchos::null) { lambdaMax = chebyPrec->getLambdaMaxForApply(); - A_->SetMaxEigenvalueEstimate(lambdaMax); + RCP matA = rcp_dynamic_cast(A_); + if (!matA.is_null()) + matA->SetMaxEigenvalueEstimate(lambdaMax); this->GetOStream(Statistics1) << "chebyshev: max eigenvalue (calculated by Ifpack2)" << " = " << lambdaMax << std::endl; } TEUCHOS_TEST_FOR_EXCEPTION(lambdaMax == negone, Exceptions::RuntimeError, "MueLu::Ifpack2Smoother::Setup(): no maximum eigenvalue estimate"); diff --git a/packages/muelu/src/Utils/MueLu_Utilities_decl.hpp b/packages/muelu/src/Utils/MueLu_Utilities_decl.hpp index a1625473badb..7b06e46a8761 100644 --- a/packages/muelu/src/Utils/MueLu_Utilities_decl.hpp +++ b/packages/muelu/src/Utils/MueLu_Utilities_decl.hpp @@ -56,6 +56,7 @@ #ifdef HAVE_MUELU_TPETRA #include +#include #endif #include #include @@ -198,8 +199,8 @@ namespace MueLu { static const Tpetra::CrsMatrix& Op2TpetraCrs(const Xpetra::Matrix& Op); static Tpetra::CrsMatrix& Op2NonConstTpetraCrs(Xpetra::Matrix& Op); - static RCP > Op2TpetraRow(RCP > Op); - static RCP< Tpetra::RowMatrix > Op2NonConstTpetraRow(RCP > Op); + static RCP > Op2TpetraRow(RCP > Op); + static RCP< Tpetra::RowMatrix > Op2NonConstTpetraRow(RCP > Op); static const RCP > Map2TpetraMap(const Xpetra::Map& map); @@ -316,9 +317,13 @@ namespace MueLu { typedef Xpetra::CrsMatrixWrap CrsMatrixWrap; typedef Xpetra::CrsMatrix CrsMatrix; typedef Xpetra::Matrix Matrix; + typedef Xpetra::Operator Operator; typedef Xpetra::Vector Vector; typedef Xpetra::MultiVector MultiVector; typedef Xpetra::Map Map; +#ifdef HAVE_MUELU_TPETRA + typedef Xpetra::TpetraOperator TpetraOperator; +#endif #ifdef HAVE_MUELU_EPETRA typedef Xpetra::EpetraMapT EpetraMap; typedef Xpetra::EpetraMultiVectorT EpetraMultiVector; @@ -527,49 +532,66 @@ namespace MueLu { #endif } - static RCP > Op2TpetraRow(RCP Op) { + static RCP > Op2TpetraRow(RCP Op) { #if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \ (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT)))) throw Exceptions::RuntimeError("Op2TpetraRow: Tpetra has not been compiled with support for LO=GO=int."); #else - RCP crsOp = rcp_dynamic_cast(Op); - if (crsOp == Teuchos::null) - throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); - - RCP crsMat = crsOp->getCrsMatrix(); - const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); - RCP > tmp_BlockCrs; - if(!tmp_Crs.is_null()) { - return tmp_Crs->getTpetra_CrsMatrixNonConst(); - } - else { - tmp_BlockCrs= rcp_dynamic_cast >(crsMat); - if (tmp_BlockCrs.is_null()) - throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); - return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + RCP mat = rcp_dynamic_cast(Op); + if (!mat.is_null()) { + RCP crsOp = rcp_dynamic_cast(mat); + if (crsOp == Teuchos::null) + throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); + + RCP crsMat = crsOp->getCrsMatrix(); + const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); + RCP > tmp_BlockCrs; + if(!tmp_Crs.is_null()) { + return tmp_Crs->getTpetra_CrsMatrixNonConst(); + } + else { + tmp_BlockCrs= rcp_dynamic_cast >(crsMat); + if (tmp_BlockCrs.is_null()) + throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); + return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + } + } else { + RCP tpOp = rcp_dynamic_cast(Op, true); + RCP> tOp = tpOp->getOperatorConst(); + RCP > tRow = rcp_dynamic_cast >(tOp, true); + return tRow; } #endif } - static RCP< Tpetra::RowMatrix > Op2NonConstTpetraRow(RCP Op) { + + static RCP< Tpetra::RowMatrix > Op2NonConstTpetraRow(RCP Op) { #if ((defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_OPENMP) || !defined(HAVE_TPETRA_INST_INT_INT))) || \ (!defined(EPETRA_HAVE_OMP) && (!defined(HAVE_TPETRA_INST_SERIAL) || !defined(HAVE_TPETRA_INST_INT_INT)))) throw Exceptions::RuntimeError("Op2NonConstTpetraRow: Tpetra has not been compiled with support for LO=GO=int."); #else - RCP crsOp = rcp_dynamic_cast(Op); - if (crsOp == Teuchos::null) - throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); - - RCP crsMat = crsOp->getCrsMatrix(); - const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); - RCP > tmp_BlockCrs; - if(!tmp_Crs.is_null()) { - return tmp_Crs->getTpetra_CrsMatrixNonConst(); - } - else { - tmp_BlockCrs= rcp_dynamic_cast >(crsMat); - if (tmp_BlockCrs.is_null()) - throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); - return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + RCP mat = rcp_dynamic_cast(Op); + if (!mat.is_null()) { + RCP crsOp = rcp_dynamic_cast(mat); + if (crsOp == Teuchos::null) + throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); + + RCP crsMat = crsOp->getCrsMatrix(); + const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); + RCP > tmp_BlockCrs; + if(!tmp_Crs.is_null()) { + return tmp_Crs->getTpetra_CrsMatrixNonConst(); + } + else { + tmp_BlockCrs= rcp_dynamic_cast >(crsMat); + if (tmp_BlockCrs.is_null()) + throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); + return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + } + } else { + RCP tpOp = rcp_dynamic_cast(Op, true); + RCP> tOp = tpOp->getOperator(); + RCP > tRow = rcp_dynamic_cast >(tOp, true); + return tRow; } #endif }; diff --git a/packages/muelu/src/Utils/MueLu_Utilities_def.hpp b/packages/muelu/src/Utils/MueLu_Utilities_def.hpp index 85f1112797dc..d8b14fcba193 100644 --- a/packages/muelu/src/Utils/MueLu_Utilities_def.hpp +++ b/packages/muelu/src/Utils/MueLu_Utilities_def.hpp @@ -74,6 +74,7 @@ #include #include #include +#include #include #include #endif @@ -300,42 +301,58 @@ namespace MueLu { } template - RCP > Utilities::Op2TpetraRow(RCP > Op) { - RCP > crsOp = rcp_dynamic_cast >(Op); - if (crsOp == Teuchos::null) - throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); - - RCP > crsMat = crsOp->getCrsMatrix(); - const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); - RCP > tmp_BlockCrs; - if(!tmp_Crs.is_null()) { - return tmp_Crs->getTpetra_CrsMatrixNonConst(); - } - else { - tmp_BlockCrs= rcp_dynamic_cast >(crsMat); - if (tmp_BlockCrs.is_null()) - throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); - return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + RCP > Utilities::Op2TpetraRow(RCP > Op) { + RCP > mat = rcp_dynamic_cast >(Op); + if (!mat.is_null()) { + RCP > crsOp = rcp_dynamic_cast >(mat); + if (crsOp == Teuchos::null) + throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); + + RCP > crsMat = crsOp->getCrsMatrix(); + const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); + RCP > tmp_BlockCrs; + if(!tmp_Crs.is_null()) { + return tmp_Crs->getTpetra_CrsMatrixNonConst(); + } + else { + tmp_BlockCrs= rcp_dynamic_cast >(crsMat); + if (tmp_BlockCrs.is_null()) + throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); + return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + } + } else { + RCP > tpOp = rcp_dynamic_cast >(Op, true); + RCP> tOp = tpOp->getOperatorConst(); + RCP > tRow = rcp_dynamic_cast >(tOp, true); + return tRow; } } template - RCP > Utilities::Op2NonConstTpetraRow(RCP > Op) { - RCP > crsOp = rcp_dynamic_cast >(Op); - if (crsOp == Teuchos::null) - throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); - - RCP > crsMat = crsOp->getCrsMatrix(); - const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); - RCP > tmp_BlockCrs; - if(!tmp_Crs.is_null()) { - return tmp_Crs->getTpetra_CrsMatrixNonConst(); - } - else { - tmp_BlockCrs= rcp_dynamic_cast >(crsMat); - if (tmp_BlockCrs.is_null()) - throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); - return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + RCP > Utilities::Op2NonConstTpetraRow(RCP > Op) { + RCP > mat = rcp_dynamic_cast >(Op); + if (!mat.is_null()) { + RCP > crsOp = rcp_dynamic_cast >(mat); + if (crsOp == Teuchos::null) + throw Exceptions::BadCast("Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed"); + + RCP > crsMat = crsOp->getCrsMatrix(); + const RCP > tmp_Crs = rcp_dynamic_cast >(crsMat); + RCP > tmp_BlockCrs; + if(!tmp_Crs.is_null()) { + return tmp_Crs->getTpetra_CrsMatrixNonConst(); + } + else { + tmp_BlockCrs= rcp_dynamic_cast >(crsMat); + if (tmp_BlockCrs.is_null()) + throw Exceptions::BadCast("Cast from Xpetra::CrsMatrix to Xpetra::TpetraCrsMatrix and Xpetra::TpetraBlockCrsMatrix failed"); + return tmp_BlockCrs->getTpetra_BlockCrsMatrixNonConst(); + } + } else { + RCP > tpOp = rcp_dynamic_cast >(Op, true); + RCP> tOp = tpOp->getOperator(); + RCP > tRow = rcp_dynamic_cast >(tOp, true); + return tRow; } } diff --git a/packages/xpetra/src/Operator/Xpetra_TpetraOperator.hpp b/packages/xpetra/src/Operator/Xpetra_TpetraOperator.hpp index bf547e389234..99434ef46206 100644 --- a/packages/xpetra/src/Operator/Xpetra_TpetraOperator.hpp +++ b/packages/xpetra/src/Operator/Xpetra_TpetraOperator.hpp @@ -119,11 +119,16 @@ namespace Xpetra { //! @name Xpetra specific //@{ + TpetraOperator() { } + //! TpetraOperator constructor to wrap a Tpetra::Operator object TpetraOperator(const Teuchos::RCP > &op) : op_(op) { } //TODO removed const //! Gets the operator out - RCP > getOperator(){return op_;} + virtual RCP > getOperator(){return op_;} + + //! Gets the operator out + virtual RCP > getOperatorConst() const {return op_;} //! Compute a residual R = B - (*this) * X void residual(const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > & X, From e35f02fec058f450264c3db03728d8e4591896f5 Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Tue, 26 Oct 2021 09:29:26 -0600 Subject: [PATCH 83/98] MueLu: Derive HierarchicalOperator from RowMatrix --- packages/muelu/research/caglusa/main.cpp | 453 +++++++++++++++++++--- packages/muelu/research/caglusa/muelu.xml | 18 + 2 files changed, 422 insertions(+), 49 deletions(-) create mode 100644 packages/muelu/research/caglusa/muelu.xml diff --git a/packages/muelu/research/caglusa/main.cpp b/packages/muelu/research/caglusa/main.cpp index 8e70c329f5be..ad37e30af93e 100644 --- a/packages/muelu/research/caglusa/main.cpp +++ b/packages/muelu/research/caglusa/main.cpp @@ -1,19 +1,61 @@ -// Teuchos +// @HEADER +// +// *********************************************************************** +// +// MueLu: A package for multigrid based preconditioning +// Copyright 2012 Sandia Corporation +// +// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "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 SANDIA CORPORATION OR THE +// 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. +// +// Questions? Contact +// Jonathan Hu (jhu@sandia.gov) +// Ray Tuminaro (rstumin@sandia.gov) +// +// *********************************************************************** +// +// @HEADER #include #include -#include -#include +#include -#include +#include +#include +#include "MueLu_Exceptions.hpp" #include #ifdef HAVE_MUELU_BELOS #include #include -#include -#include #include // => This header defines Belos::XpetraOp #include // => This header defines Belos::MueLuOp #endif @@ -28,13 +70,40 @@ namespace Tpetra { class LocalOrdinal = typename Tpetra::Operator::local_ordinal_type, class GlobalOrdinal = typename Tpetra::Operator::global_ordinal_type, class Node = typename Tpetra::Operator::node_type> - class HierarchicalOperator : public Tpetra::Operator { + class HierarchicalOperator : public Tpetra::RowMatrix { public: using matrix_type = Tpetra::CrsMatrix; using vec_type = Tpetra::MultiVector; using map_type = Tpetra::Map; + //! The RowMatrix representing the base class of CrsMatrix + using row_matrix_type = RowMatrix; + + using impl_scalar_type = typename row_matrix_type::impl_scalar_type; + using mag_type = typename Kokkos::ArithTraits::mag_type; + + using local_inds_device_view_type = + typename row_matrix_type::local_inds_device_view_type; + using local_inds_host_view_type = + typename row_matrix_type::local_inds_host_view_type; + using nonconst_local_inds_host_view_type = + typename row_matrix_type::nonconst_local_inds_host_view_type; + + using global_inds_device_view_type = + typename row_matrix_type::global_inds_device_view_type; + using global_inds_host_view_type = + typename row_matrix_type::global_inds_host_view_type; + using nonconst_global_inds_host_view_type = + typename row_matrix_type::nonconst_global_inds_host_view_type; + + using values_device_view_type = + typename row_matrix_type::values_device_view_type; + using values_host_view_type = + typename row_matrix_type::values_host_view_type; + using nonconst_values_host_view_type = + typename row_matrix_type::nonconst_values_host_view_type; + //! @name Constructor/Destructor //@{ @@ -145,14 +214,42 @@ namespace Tpetra { RCP newBasisMatrix = rcp(new matrix_type(P->getDomainMap(), clusterCoeffMap_, 0)); MatrixMatrix::Multiply(*P, true, *basisMatrix_, false, *newBasisMatrix); - // auto out = Teuchos::getFancyOStream (Teuchos::rcpFromRef (std::cerr)); - // clusterCoeffMap_->describe(*out, Teuchos::VERB_EXTREME); - // clusterCoeffMap_->getComm()->barrier(); - // newBasisMatrix->getColMap()->describe(*out, Teuchos::VERB_EXTREME); - return rcp(new HierarchicalOperator(newNearField, kernelApproximations_, newBasisMatrix, transferMatrices_)); } + RCP toMatrix() { + const Scalar one = Teuchos::ScalarTraits::one(); + + // construct identity on clusterCoeffMap_ + RCP identity = rcp(new matrix_type(clusterCoeffMap_, 1)); + Teuchos::ArrayView gblRows = clusterCoeffMap_->getNodeElementList (); + for (auto it = gblRows.begin (); it != gblRows.end (); ++it) { + Teuchos::Array col (1, *it); + Teuchos::Array val (1, one); + identity->insertGlobalValues (*it, col (), val ()); + } + identity->fillComplete (); + + // transfer = basisMatrix_ * (identity + transferMatrices_[0]) * ... * (identity + transferMatrices_[n-1]) + RCP transfer = rcp(new matrix_type(*basisMatrix_)); + for (size_t i = 0; i temp = MatrixMatrix::add(one, false, *identity, one, false, *transferMatrices_[i]); + RCP temp2 = rcp(new matrix_type(basisMatrix_->getRowMap(), 0)); + MatrixMatrix::Multiply(*transfer, false, *temp, true, *temp2); + transfer = temp2; + } + + // farField = transfer * kernelApproximations_ * transfer^T + RCP temp = rcp(new matrix_type(basisMatrix_->getRowMap(), 0)); + MatrixMatrix::Multiply(*transfer, false, *kernelApproximations_, false, *temp); + RCP farField = rcp(new matrix_type(basisMatrix_->getRowMap(), 0)); + MatrixMatrix::Multiply(*temp, false, *transfer, true, *farField); + + // nearField_ + farField + return MatrixMatrix::add(one, false, *nearField_, one, false, *farField); + + } + double getCompression() { size_t nnz = (nearField_->getGlobalNumEntries() + kernelApproximations_->getGlobalNumEntries() + @@ -162,6 +259,171 @@ namespace Tpetra { return Teuchos::as(nnz) / (getDomainMap()->getGlobalNumElements()*getDomainMap()->getGlobalNumElements()); } + // Fake RowMatrix interface + Teuchos::RCP > getRowMap() const { + return nearField_->getRowMap(); + } + + Teuchos::RCP > getColMap() const { + return nearField_->getColMap(); + } + + Teuchos::RCP > getComm() const { + return nearField_->getDomainMap()->getComm(); + } + + Teuchos::RCP > getGraph() const { + return nearField_->getCrsGraph(); + } + + global_size_t getGlobalNumRows() const { + return nearField_->getGlobalNumRows(); + } + + global_size_t getGlobalNumCols() const { + return nearField_->getGlobalNumCols(); + } + + size_t getNodeNumRows() const { + return nearField_->getNodeNumRows(); + } + + size_t getNodeNumCols() const { + return nearField_->getNodeNumCols(); + } + + GlobalOrdinal getIndexBase() const { + return nearField_->getIndexBase(); + } + + global_size_t getGlobalNumEntries() const { + return nearField_->getGlobalNumEntries(); + } + + size_t getNodeNumEntries() const { + return nearField_->getNodeNumEntries(); + } + + size_t getNumEntriesInGlobalRow (GlobalOrdinal globalRow) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + size_t getNumEntriesInLocalRow (LocalOrdinal localRow) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + size_t getGlobalMaxNumRowEntries () const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + size_t getNodeMaxNumRowEntries () const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + bool hasColMap () const { + return false; + } + + bool isLocallyIndexed() const { + return true; + } + + bool isGloballyIndexed() const { + return true; + } + + bool isFillComplete() const { + return true; + } + + bool supportsRowViews() const { + return false; + } + + void + getGlobalRowCopy (GlobalOrdinal GlobalRow, + nonconst_global_inds_host_view_type &Indices, + nonconst_values_host_view_type &Values, + size_t& NumEntries) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + void + getGlobalRowCopy (GlobalOrdinal GlobalRow, + const Teuchos::ArrayView &Indices, + const Teuchos::ArrayView &Values, + size_t &NumEntries) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } +#endif + + void + getLocalRowCopy (LocalOrdinal LocalRow, + nonconst_local_inds_host_view_type &Indices, + nonconst_values_host_view_type &Values, + size_t& NumEntries) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + void + getLocalRowCopy (LocalOrdinal LocalRow, + const Teuchos::ArrayView &Indices, + const Teuchos::ArrayView &Values, + size_t &NumEntries) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } +#endif + + void + getGlobalRowView (GlobalOrdinal GlobalRow, + global_inds_host_view_type &indices, + values_host_view_type &values) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + void + getGlobalRowView (GlobalOrdinal GlobalRow, + Teuchos::ArrayView &indices, + Teuchos::ArrayView &values) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } +#endif + + void + getLocalRowView (LocalOrdinal LocalRow, + local_inds_host_view_type & indices, + values_host_view_type & values) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + void + getLocalRowView (LocalOrdinal LocalRow, + Teuchos::ArrayView& indices, + Teuchos::ArrayView& values) const { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } +#endif + + void getLocalDiagCopy (Vector &diag) const { + nearField_->getLocalDiagCopy(diag); + } + + void leftScale (const Vector& x) { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + void rightScale (const Vector& x) { + throw MueLu::Exceptions::RuntimeError("Not implemented."); + } + + mag_type getFrobeniusNorm() const { + return 0.; + } + private: void allocateMemory(size_t numVectors) const { @@ -187,7 +449,7 @@ namespace Xpetra { class LocalOrdinal, class GlobalOrdinal, class Node = KokkosClassic::DefaultNode::DefaultNodeType> - class HierarchicalOperator : public Xpetra::Operator { + class HierarchicalOperator : public TpetraOperator { public: using tHOp = Tpetra::HierarchicalOperator; @@ -205,17 +467,18 @@ namespace Xpetra { const RCP& kernelApproximations, const RCP& basisMatrix, std::vector >& transferMatrices) { - #include "MueLu_UseShortNames.hpp" + using TpCrs = TpetraCrsMatrix; + using CrsWrap = CrsMatrixWrap; std::vector > tTransferMatrices; for (size_t i = 0; i(rcp_dynamic_cast(transferMatrices[i])->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(); + auto transferT = rcp_dynamic_cast(rcp_dynamic_cast(transferMatrices[i])->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(); tTransferMatrices.push_back(transferT); } - op_ = rcp(new tHOp(rcp_dynamic_cast(rcp_dynamic_cast(nearField)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), - rcp_dynamic_cast(rcp_dynamic_cast(kernelApproximations)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), - rcp_dynamic_cast(rcp_dynamic_cast(basisMatrix)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + op_ = rcp(new tHOp(rcp_dynamic_cast(rcp_dynamic_cast(nearField)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + rcp_dynamic_cast(rcp_dynamic_cast(kernelApproximations)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), + rcp_dynamic_cast(rcp_dynamic_cast(basisMatrix)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst(), tTransferMatrices)); } @@ -250,14 +513,23 @@ namespace Xpetra { } RCP > restrict(const RCP& P) { - #include "MueLu_UseShortNames.hpp" - return rcp(new HierarchicalOperator(op_->restrict(rcp_dynamic_cast(rcp_dynamic_cast(P)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst()))); + return rcp(new HierarchicalOperator(op_->restrict(rcp_dynamic_cast >(rcp_dynamic_cast >(P)->getCrsMatrix(), true)->getTpetra_CrsMatrixNonConst()))); + } + + RCP toMatrix() { + auto tpMat = rcp(new TpetraCrsMatrix(op_->toMatrix())); + return rcp(new CrsMatrixWrap(rcp_dynamic_cast >(tpMat))); } double getCompression() { return op_->getCompression(); } + //! Gets the operator out + RCP > getOperator() { return op_; } + + RCP > getOperatorConst() const { return op_; } + private: RCP op_; }; @@ -268,8 +540,12 @@ template int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int argc, char *argv[]) { #include "MueLu_UseShortNames.hpp" - std::string xmlHierachical = "hierarchical.xml"; + std::string xmlHierachical = "hierarchical.xml"; + std::string xmlMueLu = "muelu.xml"; std::string xmlAuxHierarchy = "aux.xml"; + clp.setOption("xml", &xmlHierachical); + clp.setOption("xmlMueLu", &xmlMueLu); + clp.setOption("xmlAux", &xmlAuxHierarchy); switch (clp.parse(argc, argv)) { case Teuchos::CommandLineProcessor::PARSE_HELP_PRINTED: return EXIT_SUCCESS; break; @@ -285,6 +561,7 @@ int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int arg out.setOutputToRootOnly(0); bool success = true; const Scalar one = Teuchos::ScalarTraits::one(); + const Scalar zero = Teuchos::ScalarTraits::zero(); RCP< const Teuchos::Comm > comm = Teuchos::DefaultComm::getComm(); @@ -349,12 +626,17 @@ int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int arg // Xpetra::IO::Write("diff2.mtx", *X); } +#ifdef HAVE_MUELU_BELOS { // Solve linear system using unpreconditioned Krylov method + out << "\n*********************************************************\n"; + out << "Unpreconditioned Krylov method\n"; + out << "*********************************************************\n\n"; using MV = typename HOp::vec_type; using OP = Belos::OperatorT; + X->putScalar(zero); RCP belosOp = rcp(new Belos::XpetraOp(op)); RCP > belosProblem = rcp(new Belos::LinearProblem(belosOp, X, RHS)); @@ -385,46 +667,119 @@ int main_(Teuchos::CommandLineProcessor &clp, Xpetra::UnderlyingLib lib, int arg // Xpetra::IO::Write("X.mtx", *X); X->update(one, *X_ex, -one); - out << "|X-X_ex| = " << X->getVector(0)->norm2() << std::endl; + out << "|X-X_ex| = " << X->getVector(0)->norm2() << std::endl << std::endl; success &= (ret == Belos::Converged); } +#endif // HAVE_MUELU_BELOS + + { + // Solve linear system using a AMG preconditioned Krylov method + + //////////////////////////////////////////////////////////////// + // Build the auxiliary hierachy + out << "\n*********************************************************\n"; + out << "Building the auxiliary hierachy\n"; + out << "*********************************************************\n\n"; + + auto auxOp = Xpetra::IO::Read(hierachicalParams.get("auxiliary operator"), map); + auto coords = Xpetra::IO::coordinateType,LocalOrdinal,GlobalOrdinal,Node>::ReadMultiVector(hierachicalParams.get("coordinates"), map); + + Teuchos::ParameterList auxParams; + Teuchos::updateParametersFromXmlFileAndBroadcast(xmlAuxHierarchy, Teuchos::Ptr(&auxParams), *comm); + auxParams.sublist("user data").set("Coordinates", coords); + + auto auxH = MueLu::CreateXpetraPreconditioner(auxOp, auxParams); + + //////////////////////////////////////////////////////////////// + // Construct the main hierarchy + out << "\n*********************************************************\n"; + out << "Building the main hierachy\n"; + out << "*********************************************************\n\n"; + + Teuchos::ParameterList params; + Teuchos::updateParametersFromXmlFileAndBroadcast(xmlMueLu, Teuchos::Ptr(¶ms), *comm); + params.set("coarse: max size", 1); + params.set("max levels", auxH->GetNumLevels()); + + auto H = rcp(new Hierarchy()); + RCP lvl = H->GetLevel(0); + lvl->Set("A", rcp_dynamic_cast(op)); + lvl->Set("Coordinates", coords); + for(int lvlNo = 1; lvlNoGetNumLevels(); lvlNo++) { + H->AddNewLevel(); + RCP auxLvl = auxH->GetLevel(lvlNo); + // auto mgr = auxLvl->GetFactoryManager(); + // auxLvl->print(std::cout, MueLu::Debug); + RCP fineLvl = H->GetLevel(lvlNo-1); + lvl = H->GetLevel(lvlNo); + auto P = auxLvl->Get >("P"); + lvl->Set("P", P); + params.sublist("level "+std::to_string(lvlNo)).set("P", P); + + auto fineA = rcp_dynamic_cast(fineLvl->Get >("A")); + auto coarseA = fineA->restrict(P); + if (lvlNo+1 == auxH->GetNumLevels()) + lvl->Set("A", coarseA->toMatrix()); + else + lvl->Set("A", rcp_dynamic_cast(coarseA)); + } + + RCP mueLuFactory = rcp(new ParameterListInterpreter(params,op->getDomainMap()->getComm())); + H->setlib(op->getDomainMap()->lib()); + H->SetProcRankVerbose(op->getDomainMap()->getComm()->getRank()); + mueLuFactory->SetupHierarchy(*H); + H->IsPreconditioner(true); + + +#ifdef HAVE_MUELU_BELOS + //////////////////////////////////////////////////////////////// + // Set up the Krylov solver - // { - // // Solve linear system using a AMG preconditioned Krylov method + using MV = typename HOp::vec_type; + using OP = Belos::OperatorT; - // auto auxOp = Xpetra::IO::Read(hierachicalParams.get("auxiliary operator"), map); - // auto coords = Xpetra::IO::coordinateType,LocalOrdinal,GlobalOrdinal,Node>::ReadMultiVector(hierachicalParams.get("coordinates"), map); + X->putScalar(zero); + RCP belosOp = rcp(new Belos::XpetraOp(op)); + RCP belosPrec = rcp(new Belos::MueLuOp (H)); + RCP > belosProblem = rcp(new Belos::LinearProblem(belosOp, X, RHS)); - // Teuchos::ParameterList auxParams; - // Teuchos::updateParametersFromXmlFileAndBroadcast(xmlAuxHierarchy, Teuchos::Ptr(&auxParams), *comm); - // auxParams.sublist("user data").set("Coordinates", coords); + std::string belosType = "Pseudoblock CG"; + RCP belosList = Teuchos::parameterList(); + belosList->set("Maximum Iterations", 1000); // Maximum number of iterations allowed + belosList->set("Convergence Tolerance", 1e-5); // Relative convergence tolerance requested + belosList->set("Verbosity", Belos::Errors + Belos::Warnings + Belos::StatusTestDetails); + belosList->set("Output Frequency", 1); + belosList->set("Output Style", Belos::Brief); - // auto auxH = MueLu::CreateXpetraPreconditioner(auxOp, auxParams); + belosProblem->setRightPrec(belosPrec); - // auto H = rcp(new Hierarchy()); - // RCP lvl = H->GetLevel(0); - // lvl->Set("A", rcp_dynamic_cast(op)); - // for(int lvlNo = 1; lvlNoGetNumLevels(); lvlNo++) { - // H->AddNewLevel(); - // RCP auxLvl = auxH->GetLevel(lvlNo); - // RCP fineLvl = H->GetLevel(lvlNo-1); - // RCP lvl = H->GetLevel(lvlNo); - // auto P = auxLvl->Get >("P"); - // lvl->Set("P", P); + bool set = belosProblem->setProblem(); + if (set == false) { + throw MueLu::Exceptions::RuntimeError("ERROR: Belos::LinearProblem failed to set up correctly!"); + } - // auto fineA = rcp_dynamic_cast(fineLvl->Get >("A")); - // auto coarseA = fineA->restrict(P); - // lvl->Set("A", rcp_dynamic_cast(coarseA)); - // } + // Create an iterative solver manager + Belos::SolverFactory solverFactory; + RCP< Belos::SolverManager > solver = solverFactory.create(belosType, belosList); + solver->setProblem(belosProblem); + + // Perform solve + Belos::ReturnType ret = solver->solve(); + int numIts = solver->getNumIters(); + + // Get the number of iterations for this solve. + out << "Number of iterations performed for this solve: " << numIts << std::endl; + + // Xpetra::IO::Write("X.mtx", *X); + X->update(one, *X_ex, -one); + out << "|X-X_ex| = " << X->getVector(0)->norm2() << std::endl; - // RCP mueLuFactory = rcp(new ParameterListInterpreter(auxParams,op->getDomainMap()->getComm())); - // H->setlib(op->getDomainMap()->lib()); - // H->SetProcRankVerbose(op->getDomainMap()->getComm()->getRank()); - // mueLuFactory->SetupHierarchy(*H); + success &= (ret == Belos::Converged); - // } +#endif // HAVE_MUELU_BELOS + } return ( success ? EXIT_SUCCESS : EXIT_FAILURE ); } //main diff --git a/packages/muelu/research/caglusa/muelu.xml b/packages/muelu/research/caglusa/muelu.xml new file mode 100644 index 000000000000..1fa2cbd50020 --- /dev/null +++ b/packages/muelu/research/caglusa/muelu.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + > + + + + + From b34b94d5fc0c8373e5b6412210f25f96c794d593 Mon Sep 17 00:00:00 2001 From: kokkos-devops-admin <64657714+kokkos-devops-admin@users.noreply.github.com> Date: Wed, 27 Oct 2021 09:49:42 -0600 Subject: [PATCH 84/98] cmake/std/atdm: Fix typo --- cmake/std/atdm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/std/atdm/README.md b/cmake/std/atdm/README.md index fcb864ae26dc..ea0081dbe2bb 100644 --- a/cmake/std/atdm/README.md +++ b/cmake/std/atdm/README.md @@ -1572,7 +1572,7 @@ each system. These contributed configurations are used just like any other custom configuration as described in Custom systems and -configurations.. For example, to load the contributed custom 'weaver' +configurations. For example, to load the contributed custom 'weaver' configuration to do a CUDA optimized build, do: ``` From 8606fb3b8042a4ca67c42d8c8404d349128fe6ad Mon Sep 17 00:00:00 2001 From: Evan Harvey <57234914+e10harvey@users.noreply.github.com> Date: Wed, 27 Oct 2021 10:23:18 -0600 Subject: [PATCH 85/98] packages/framework: Fix typo --- .../pr_tools/trilinosprhelpers/TrilinosPRConfigurationBase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/framework/pr_tools/trilinosprhelpers/TrilinosPRConfigurationBase.py b/packages/framework/pr_tools/trilinosprhelpers/TrilinosPRConfigurationBase.py index 493d3d4d5c14..47565ba6ff0d 100644 --- a/packages/framework/pr_tools/trilinosprhelpers/TrilinosPRConfigurationBase.py +++ b/packages/framework/pr_tools/trilinosprhelpers/TrilinosPRConfigurationBase.py @@ -347,7 +347,7 @@ def config_script(self): """ Returns the configuration script name - This arbitrary name will be used for all runs until an override is established + This arbitrary name will be used for all runs until an override is established Returns: String containing the job-specific configuration script to load. From 46303e5ea28c69722b87c7577c307c32652e6d57 Mon Sep 17 00:00:00 2001 From: K Devine Date: Wed, 27 Oct 2021 12:02:04 -0600 Subject: [PATCH 86/98] Tpetra: deprecate and remove use of StaticProfile (#9865) * tpetra: #9799 deprecating constructors that take StaticProfile as argument; everything is static profile. Removed StaticProfile and pftype from library * tpetra: #9799 removing use of StaticProfile from Tpetra tests * tpetra: #9799 Fixed one test that was edited incorrectly. * tpetra: #9799 removed use of deprecated Tpetra::StaticProfile * ifpack2: #9799 corrected use of deprecated getLocalRowCopy --- .../Tpetra_CrsMatrix_Adapter_UnitTests.cpp | 4 +- .../amesos2/test/solvers/SolverFactory.cpp | 2 +- .../test/BlockDavidson/cxx_main_lap.cpp | 2 +- .../test/BlockKrylovSchur/cxx_main_lap.cpp | 2 +- .../anasazi/tpetra/test/IRTR/cxx_main_lap.cpp | 2 +- .../tpetra/test/MVOPTester/cxx_main.cpp | 2 +- .../tpetra/test/FixedPoint/test_fp_hb.cpp | 2 +- .../LinearSolverFactory.cpp | 2 +- .../LinearSolverFactory/SolverFactory.cpp | 2 +- .../test/MVOPTester/cxx_main_complex.cpp | 2 +- .../tpetra/test/Native/nonsymm_matrix.cpp | 2 +- .../example/RelaxationWithEquilibration.cpp | 16 +- packages/ifpack2/src/Ifpack2_ILUT_def.hpp | 4 +- .../src/Ifpack2_SparseContainer_def.hpp | 4 +- packages/ifpack2/src/Ifpack2_Utilities.hpp | 2 +- .../supportgraph/Ifpack2_SupportGraph_def.hpp | 2 +- .../test/unit_tests/Ifpack2_SolverFactory.cpp | 2 +- .../test/unit_tests/Ifpack2_UnitTest234.cpp | 3 +- .../unit_tests/Ifpack2_UnitTestChebyshev2.cpp | 2 +- .../Ifpack2_UnitTestContainerFactory.cpp | 2 +- .../unit_tests/Ifpack2_UnitTestHelpers.hpp | 25 ++- ...k2_UnitTestLocalSparseTriangularSolver.cpp | 3 +- .../unit_tests/Ifpack2_UnitTestRelaxation.cpp | 2 +- .../disc-fe/src/Panzer_L2Projection.cpp | 2 +- .../src/Panzer_LocalPartitioningUtilities.cpp | 3 +- ...zer_BlockedTpetraLinearObjFactory_impl.hpp | 3 +- .../Panzer_TpetraLinearObjFactory_impl.hpp | 3 +- .../src/solvers/MiniEM_DiscreteCurl.hpp | 2 +- .../src/solvers/MiniEM_DiscreteGradient.hpp | 2 +- .../shylu_dd/bddc/src/shylu_UtilBDDC.hpp | 4 +- ...tokhos_TpetraCrsMatrixMPVectorUnitTest.hpp | 22 +-- .../Stokhos_TpetraCrsMatrixUQPCEUnitTest.hpp | 16 +- .../stokhos/test/UnitTest/tpetra_mat_vec.cpp | 4 +- .../test/TpetraThyraWrappers_UnitTests.cpp | 2 +- .../AdditiveSchwarzHalo.cpp | 2 +- .../fem_assembly_TotalElementLoop.hpp | 4 +- .../advanced/Benchmarks/CrsMatrixMatVec.cpp | 3 +- .../CrsMatrix_sumIntoLocalValues.cpp | 6 +- .../Benchmarks/blockCrsMatrixMatVec.cpp | 3 +- .../example/advanced/Benchmarks/localView.cpp | 3 +- .../tpetra/core/inout/MatrixMarket_Tpetra.hpp | 18 +- .../tpetra/core/inout/Tpetra_MatrixIO_def.hpp | 2 +- .../src/Tpetra_BlockCrsMatrix_Helpers_def.hpp | 2 +- .../tpetra/core/src/Tpetra_ConfigDefs.hpp | 3 + .../tpetra/core/src/Tpetra_CrsGraph_decl.hpp | 62 ++++++- .../tpetra/core/src/Tpetra_CrsGraph_def.hpp | 94 ++++++++++- .../tpetra/core/src/Tpetra_CrsMatrix_decl.hpp | 58 +++++-- .../tpetra/core/src/Tpetra_CrsMatrix_def.hpp | 158 ++++++++++-------- .../tpetra/core/src/Tpetra_FECrsGraph_def.hpp | 8 +- .../tpetra/core/src/Tpetra_RowMatrix_def.hpp | 5 +- .../tpetra/core/test/Block/BlockCrsMatrix.cpp | 16 +- .../core/test/CrsGraph/CrsGraph_Issue601.cpp | 8 +- .../test/CrsGraph/CrsGraph_ReindexColumns.cpp | 4 +- .../CrsGraph/CrsGraph_StaticImportExport.cpp | 10 +- .../test/CrsGraph/CrsGraph_UnitTests0.cpp | 44 ++--- .../test/CrsGraph/CrsGraph_UnitTests1.cpp | 16 +- .../test/CrsGraph/CrsGraph_UnitTests_Swap.cpp | 3 +- .../CrsGraph_UnpackIntoStaticGraph.cpp | 4 +- .../test/CrsGraph/CrsGraph_getNumDiags.cpp | 6 +- .../CrsGraph_insertGlobalIndicesFiltered.cpp | 13 +- .../test/CrsMatrix/CrsMatrix_GetRowCopy.cpp | 6 +- .../CrsMatrix/CrsMatrix_LeftRightScale.cpp | 2 - .../CrsMatrix_MultipleFillCompletes.cpp | 2 +- .../CrsMatrix/CrsMatrix_NodeConversion.cpp | 2 - .../CrsMatrix_NonlocalAfterResume.cpp | 3 +- .../CrsMatrix/CrsMatrix_NonlocalSumInto.cpp | 2 +- .../CrsMatrix_NonlocalSumInto_Ignore.cpp | 2 +- .../CrsMatrix/CrsMatrix_ReindexColumns.cpp | 2 +- .../CrsMatrix_ReplaceDomainMapAndImporter.cpp | 2 - .../CrsMatrix_ReplaceRangeMapAndExporter.cpp | 2 - .../CrsMatrix_StaticImportExport.cpp | 10 +- .../CrsMatrix/CrsMatrix_TransformValues.cpp | 4 +- .../test/CrsMatrix/CrsMatrix_UnitTests.cpp | 6 +- .../test/CrsMatrix/CrsMatrix_UnitTests2.cpp | 3 +- .../test/CrsMatrix/CrsMatrix_UnitTests3.cpp | 11 +- .../test/CrsMatrix/CrsMatrix_UnitTests4.cpp | 9 +- .../CrsMatrix/CrsMatrix_UnitTests_Swap.cpp | 2 +- .../core/test/CrsMatrix/Equilibration.cpp | 8 +- .../test/CrsMatrix/Regression/Albany182.cpp | 7 +- .../Tpetra_Test_CrsMatrix_WithGraph.hpp | 24 ++- .../sumIntoStaticProfileExtraSpace.cpp | 5 +- .../core/test/Distributor/Issue1752.cpp | 6 +- .../Distributor/createfromsendsandrecvs.cpp | 3 +- .../test/FECrsGraph/FECrsGraph_UnitTests.cpp | 21 ++- .../FEMultiVector/FEMultiVector_UnitTests.cpp | 2 +- .../ImportExport_ImportConstructExpert.cpp | 3 +- .../core/test/ImportExport/UnpackLongRows.cpp | 4 +- .../ImportExport2/ImportExport2_UnitTests.cpp | 17 +- .../FECrs_MatrixMatrix_UnitTests.cpp | 6 +- .../MatrixMatrix/MatrixMatrix_UnitTests.cpp | 2 +- .../core/test/RowMatrixTransposer/main.cpp | 4 +- .../core/test/TpetraUtils_MatrixGenerator.hpp | 9 +- .../CrsGraph/Xpetra_TpetraCrsGraph_def.hpp | 8 +- .../CrsMatrix/Xpetra_TpetraCrsMatrix_def.hpp | 8 +- .../xpetra/sup/Utils/Xpetra_MatrixMatrix.hpp | 2 +- .../input/Zoltan2_TpetraRowGraphAdapter.hpp | 2 +- .../input/Zoltan2_TpetraRowMatrixAdapter.hpp | 2 +- .../core/src/input/Zoltan2_XpetraTraits.hpp | 2 +- .../zoltan2/sphynx/src/Zoltan2_Sphynx.hpp | 2 +- .../test/core/helpers/UserInputForTests.hpp | 4 +- 100 files changed, 523 insertions(+), 407 deletions(-) diff --git a/packages/amesos2/test/adapters/Tpetra_CrsMatrix_Adapter_UnitTests.cpp b/packages/amesos2/test/adapters/Tpetra_CrsMatrix_Adapter_UnitTests.cpp index 065775085f0b..c5f76bac01fd 100644 --- a/packages/amesos2/test/adapters/Tpetra_CrsMatrix_Adapter_UnitTests.cpp +++ b/packages/amesos2/test/adapters/Tpetra_CrsMatrix_Adapter_UnitTests.cpp @@ -197,7 +197,7 @@ namespace { // create a Map const size_t numLocal = 10; RCP > map = rcp( new Map(INVALID,numLocal,0,comm) ); - RCP eye = rcp( new MAT(map,1,Tpetra::StaticProfile) ); + RCP eye = rcp( new MAT(map,1) ); GO base = numLocal*rank; for( size_t i = 0; i < numLocal; ++i ){ eye->insertGlobalValues(base+i,tuple(base+i),tuple(ST::one())); @@ -230,7 +230,7 @@ namespace { // create a Map const size_t numLocal = 10; RCP > map = rcp( new Map(INVALID,numLocal,0,comm) ); - RCP eye = rcp( new MAT(map,1,Tpetra::StaticProfile) ); + RCP eye = rcp( new MAT(map,1) ); GO base = numLocal*rank; for( size_t i = 0; i < numLocal; ++i ){ eye->insertGlobalValues(base+i,tuple(base+i),tuple(ST::one())); diff --git a/packages/amesos2/test/solvers/SolverFactory.cpp b/packages/amesos2/test/solvers/SolverFactory.cpp index 39da8cff961e..6b51e67f0ab5 100644 --- a/packages/amesos2/test/solvers/SolverFactory.cpp +++ b/packages/amesos2/test/solvers/SolverFactory.cpp @@ -124,7 +124,7 @@ namespace { const size_t maxNumEntPerRow = 3; const SC two = static_cast (2.0); const SC minusOne = static_cast (-1.0); - RCP A (new MAT (rowMap, maxNumEntPerRow, Tpetra::StaticProfile)); + RCP A (new MAT (rowMap, maxNumEntPerRow)); if (rowMap->getNodeNumElements () != 0) { for (LO lclRow = rowMap->getMinLocalIndex (); diff --git a/packages/anasazi/tpetra/test/BlockDavidson/cxx_main_lap.cpp b/packages/anasazi/tpetra/test/BlockDavidson/cxx_main_lap.cpp index 7a9030691d1d..d104d911bbf3 100644 --- a/packages/anasazi/tpetra/test/BlockDavidson/cxx_main_lap.cpp +++ b/packages/anasazi/tpetra/test/BlockDavidson/cxx_main_lap.cpp @@ -117,7 +117,7 @@ int main(int argc, char *argv[]) // create map RCP > map = rcp (new Map<> (dim,0,comm)); - RCP > K = rcp (new CrsMatrix (map, 4, Tpetra::StaticProfile)); + RCP > K = rcp (new CrsMatrix (map, 4)); int base = MyPID*ROWS_PER_PROC; if (MyPID != NumImages-1) { for (int i=0; i > map = rcp (new Map<> (dim,0,comm)); - RCP > K = rcp (new CrsMatrix (map, 4, Tpetra::StaticProfile)); + RCP > K = rcp (new CrsMatrix (map, 4)); int base = MyPID*ROWS_PER_PROC; if (MyPID != NumImages-1) { for (int i=0; i > map = rcp (new Map<> (dim, 0, comm)); - RCP > K = rcp(new CrsMatrix(map,4,Tpetra::StaticProfile)); + RCP > K = rcp(new CrsMatrix(map,4)); int base = MyPID*ROWS_PER_PROC; if (MyPID != NumImages-1) { for (int i=0; i RCP > constructDiagMatrix(const RCP > &map) { - RCP > op = rcp( new CrsMatrix(map,1,Tpetra::StaticProfile) ); + RCP > op = rcp( new CrsMatrix(map,1) ); for (size_t i=0; igetNodeNumElements(); ++i) { op->insertGlobalValues(map->getGlobalElement(i),tuple(map->getGlobalElement(i)), tuple(ScalarTraits::one())); } diff --git a/packages/belos/tpetra/test/FixedPoint/test_fp_hb.cpp b/packages/belos/tpetra/test/FixedPoint/test_fp_hb.cpp index 6859d7173f1b..ab630b103d60 100644 --- a/packages/belos/tpetra/test/FixedPoint/test_fp_hb.cpp +++ b/packages/belos/tpetra/test/FixedPoint/test_fp_hb.cpp @@ -217,7 +217,7 @@ int main(int argc, char *argv[]) { int NumMyElements = diagonal.getMap()->getNodeNumElements(); auto MyGlobalElements = diagonal.getMap()->getNodeElementList(); Teuchos::ArrayRCP dd=diagonal.getDataNonConst(); - RCP > invDiagMatrix = Teuchos::rcp(new CrsMatrix(A->getRowMap(), 1, Tpetra::StaticProfile)); + RCP > invDiagMatrix = Teuchos::rcp(new CrsMatrix(A->getRowMap(), 1)); for (Teuchos_Ordinal i=0; iinsertGlobalValues(MyGlobalElements[i], diff --git a/packages/belos/tpetra/test/LinearSolverFactory/LinearSolverFactory.cpp b/packages/belos/tpetra/test/LinearSolverFactory/LinearSolverFactory.cpp index 160f3ab7f126..286349fa3c94 100644 --- a/packages/belos/tpetra/test/LinearSolverFactory/LinearSolverFactory.cpp +++ b/packages/belos/tpetra/test/LinearSolverFactory/LinearSolverFactory.cpp @@ -112,7 +112,7 @@ createTestMatrix (Teuchos::FancyOStream& out, // lets us use local indices. RCP colMap = rowMap; const size_t maxNumEntPerRow = 1; - RCP A (new MAT (rowMap, colMap, maxNumEntPerRow, Tpetra::StaticProfile)); + RCP A (new MAT (rowMap, colMap, maxNumEntPerRow)); if (rowMap->getNodeNumElements () != 0) { Teuchos::Array vals (1); diff --git a/packages/belos/tpetra/test/LinearSolverFactory/SolverFactory.cpp b/packages/belos/tpetra/test/LinearSolverFactory/SolverFactory.cpp index f7483a2c084b..b242507de441 100644 --- a/packages/belos/tpetra/test/LinearSolverFactory/SolverFactory.cpp +++ b/packages/belos/tpetra/test/LinearSolverFactory/SolverFactory.cpp @@ -86,7 +86,7 @@ createTestMatrix (Teuchos::FancyOStream& out, // lets us use local indices. RCP colMap = rowMap; const size_t maxNumEntPerRow = 1; - RCP A (new MAT (rowMap, colMap, maxNumEntPerRow, Tpetra::StaticProfile)); + RCP A (new MAT (rowMap, colMap, maxNumEntPerRow)); if (rowMap->getNodeNumElements () != 0) { Teuchos::Array vals (1); diff --git a/packages/belos/tpetra/test/MVOPTester/cxx_main_complex.cpp b/packages/belos/tpetra/test/MVOPTester/cxx_main_complex.cpp index f3348ad13b5f..a05eee75cc82 100644 --- a/packages/belos/tpetra/test/MVOPTester/cxx_main_complex.cpp +++ b/packages/belos/tpetra/test/MVOPTester/cxx_main_complex.cpp @@ -105,7 +105,7 @@ namespace { template RCP > constructDiagMatrix(const RCP > &map) { - RCP > op = rcp( new CrsMatrix(map,1,Tpetra::StaticProfile) ); + RCP > op = rcp( new CrsMatrix(map,1) ); for (size_t i=0; igetNodeNumElements(); ++i) { op->insertGlobalValues(map->getGlobalElement(i),tuple(map->getGlobalElement(i)), tuple(ScalarTraits::one())); } diff --git a/packages/belos/tpetra/test/Native/nonsymm_matrix.cpp b/packages/belos/tpetra/test/Native/nonsymm_matrix.cpp index e01e1ca73174..be9cb296283a 100644 --- a/packages/belos/tpetra/test/Native/nonsymm_matrix.cpp +++ b/packages/belos/tpetra/test/Native/nonsymm_matrix.cpp @@ -97,7 +97,7 @@ createNonsymmTridiagMatrix (const Teuchos::RCP >& rowMap, LO (rowMap->getNodeNumElements ()); const GO gblMinGblInd = rowMap->getMinAllGlobalIndex (); const GO gblMaxGblInd = rowMap->getMaxAllGlobalIndex (); - auto A = rcp (new crs_matrix_type (rowMap, 3, Tpetra::StaticProfile)); + auto A = rcp (new crs_matrix_type (rowMap, 3)); const SC ONE = STS::one (); const SC TWO = ONE + ONE; diff --git a/packages/ifpack2/example/RelaxationWithEquilibration.cpp b/packages/ifpack2/example/RelaxationWithEquilibration.cpp index 4eb218d7664b..307bdb956b79 100644 --- a/packages/ifpack2/example/RelaxationWithEquilibration.cpp +++ b/packages/ifpack2/example/RelaxationWithEquilibration.cpp @@ -380,17 +380,20 @@ tpetraToEpetraCrsMatrix (const Tpetra::CrsMatrix& A_t, // We can use static profile, since we know the structure in advance. Epetra_CrsMatrix A_e (Copy, rowMap, colMap, numEntPerRow.data (), true); - Teuchos::Array lclColIndsBuf (A_t.getNodeMaxNumRowEntries ()); - Teuchos::Array valsBuf (A_t.getNodeMaxNumRowEntries ()); + using tmatrix_t = Tpetra::CrsMatrix; + + typename tmatrix_t::nonconst_local_inds_host_view_type + lclColInds ("ifpack2::lclColInds", A_t.getNodeMaxNumRowEntries()); + typename tmatrix_t::nonconst_values_host_view_type + vals ("ifpack2::vals", A_t.getNodeMaxNumRowEntries()); + int lclErrCode = 0; for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { size_t numEnt = A_t.getNumEntriesInLocalRow (lclRow); - Teuchos::ArrayView lclColInds = lclColIndsBuf (0, numEnt); - Teuchos::ArrayView vals = valsBuf (0, numEnt); A_t.getLocalRowCopy (static_cast (lclRow), lclColInds, vals, numEnt); lclErrCode = A_e.InsertMyValues (lclRow, static_cast (numEnt), - vals.getRawPtr (), lclColInds.getRawPtr ()); + vals.data(), lclColInds.data()); if (lclErrCode != 0) { break; } @@ -880,8 +883,7 @@ gatherCrsMatrixAndMultiVector (LO& errCode, export_type exp (A.getRowMap (), rowMap_gathered); auto A_gathered = Teuchos::rcp (new crs_matrix_type (rowMap_gathered, - A.getGlobalMaxNumRowEntries (), - Tpetra::StaticProfile)); + A.getGlobalMaxNumRowEntries ())); A_gathered->doExport (A, exp, Tpetra::INSERT); auto domainMap_gathered = computeGatherMap (A.getDomainMap (), Teuchos::null); auto rangeMap_gathered = computeGatherMap (A.getRangeMap (), Teuchos::null); diff --git a/packages/ifpack2/src/Ifpack2_ILUT_def.hpp b/packages/ifpack2/src/Ifpack2_ILUT_def.hpp index 63d962a5b822..8295eeef7dbc 100644 --- a/packages/ifpack2/src/Ifpack2_ILUT_def.hpp +++ b/packages/ifpack2/src/Ifpack2_ILUT_def.hpp @@ -716,7 +716,7 @@ void ILUT::compute () } L_ = rcp (new crs_matrix_type (A_local_->getRowMap(), A_local_->getColMap(), - nnzPerRow(), Tpetra::StaticProfile)); + nnzPerRow())); for (local_ordinal_type row_i = 0 ; row_i < myNumRows ; ++row_i) { L_->insertLocalValues (row_i, L_tmp_idx[row_i](), L_tmpv[row_i]()); @@ -729,7 +729,7 @@ void ILUT::compute () } U_ = rcp (new crs_matrix_type (A_local_->getRowMap(), A_local_->getColMap(), - nnzPerRow(), Tpetra::StaticProfile)); + nnzPerRow())); for (local_ordinal_type row_i = 0 ; row_i < myNumRows ; ++row_i) { U_->insertLocalValues (row_i, U_tmp_idx[row_i](), U_tmpv[row_i]()); diff --git a/packages/ifpack2/src/Ifpack2_SparseContainer_def.hpp b/packages/ifpack2/src/Ifpack2_SparseContainer_def.hpp index 75c3d81e9090..fd5d282957c1 100644 --- a/packages/ifpack2/src/Ifpack2_SparseContainer_def.hpp +++ b/packages/ifpack2/src/Ifpack2_SparseContainer_def.hpp @@ -553,7 +553,7 @@ extract () } //now that row sizes are known, can allocate the diagonal matrix RCP tempMap(new InverseMap(blockPointSize, 0, this->localComm_)); - diagBlocks_[i] = rcp(new InverseCrs(tempMap, rowEntryCounts, Tpetra::StaticProfile)); + diagBlocks_[i] = rcp(new InverseCrs(tempMap, rowEntryCounts)); Inverses_[i] = rcp(new InverseType(diagBlocks_[i])); //insert the actual entries, one row at a time for(LO blockRow = 0; blockRow < blockSize; blockRow++) @@ -617,7 +617,7 @@ extract () rowEntryCounts[j] = this->getInputRowView(this->blockRows_[blockStart + j]).size(); } RCP tempMap(new InverseMap(blockSize, 0, this->localComm_)); - diagBlocks_[i] = rcp(new InverseCrs(tempMap, rowEntryCounts, Tpetra::StaticProfile)); + diagBlocks_[i] = rcp(new InverseCrs(tempMap, rowEntryCounts)); Inverses_[i] = rcp(new InverseType(diagBlocks_[i])); for(LO blockRow = 0; blockRow < blockSize; blockRow++) { diff --git a/packages/ifpack2/src/Ifpack2_Utilities.hpp b/packages/ifpack2/src/Ifpack2_Utilities.hpp index 274e8aea4640..69ad73cefc60 100644 --- a/packages/ifpack2/src/Ifpack2_Utilities.hpp +++ b/packages/ifpack2/src/Ifpack2_Utilities.hpp @@ -79,7 +79,7 @@ namespace Details { // make sure that we are using the correct diagonal column // indices, so it probably wouldn't help much. Teuchos::RCP diagonalGraph; - diagonalGraph = Teuchos::rcp(new crs_graph_type(graph.getRowMap(), maxDiagEntPerRow, Tpetra::StaticProfile)); + diagonalGraph = Teuchos::rcp(new crs_graph_type(graph.getRowMap(), maxDiagEntPerRow)); const map_type& meshRowMap = *(graph.getRowMap()); Teuchos::Array diagGblColInds(maxDiagEntPerRow); diff --git a/packages/ifpack2/src/supportgraph/Ifpack2_SupportGraph_def.hpp b/packages/ifpack2/src/supportgraph/Ifpack2_SupportGraph_def.hpp index 8f39d7b117ef..102f6076e9c0 100644 --- a/packages/ifpack2/src/supportgraph/Ifpack2_SupportGraph_def.hpp +++ b/packages/ifpack2/src/supportgraph/Ifpack2_SupportGraph_def.hpp @@ -473,7 +473,7 @@ SupportGraph::findSupport () // Create the CrsMatrix for the support graph Support_ = rcp (new crs_matrix_type (A_local_->getRowMap(), A_local_->getColMap(), - localnumnz, Tpetra::StaticProfile)); + localnumnz)); // Fill in the matrix with the stl vectors for each row for (size_t row = 0; row < num_verts; ++row) { diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_SolverFactory.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_SolverFactory.cpp index 6f5c32b197ea..0e4fd0068201 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_SolverFactory.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_SolverFactory.cpp @@ -73,7 +73,7 @@ namespace { // lets us use local indices. RCP colMap = rowMap; const size_t maxNumEntPerRow = 1; - RCP A (new MAT (rowMap, colMap, maxNumEntPerRow, Tpetra::StaticProfile)); + RCP A (new MAT (rowMap, colMap, maxNumEntPerRow)); if (rowMap->getNodeNumElements () != 0) { Teuchos::Array vals (1); diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTest234.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTest234.cpp index bf0ffbfe7212..43c860fd98fe 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTest234.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTest234.cpp @@ -119,8 +119,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL(Chebyshev, Issue234, SC) // For a diagonal matrix, we can use the row Map as the column Map. const size_t maxNumEntPerRow = 1; RCP A = - rcp (new crs_matrix_type (rowMap, colMap, maxNumEntPerRow, - Tpetra::StaticProfile)); + rcp (new crs_matrix_type (rowMap, colMap, maxNumEntPerRow)); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { A->insertLocalValues (lclRow, tuple (lclRow), tuple (ONE)); } diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestChebyshev2.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestChebyshev2.cpp index 83665ca935d7..4b8bbcee0bb1 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestChebyshev2.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestChebyshev2.cpp @@ -379,7 +379,7 @@ TEUCHOS_UNIT_TEST(Ifpack2Chebyshev, Convergence) RCP domainMap = rowMap; // Create the matrix, with static profile. - RCP A (new crs_matrix_type (rowMap, 3, Tpetra::StaticProfile)); + RCP A (new crs_matrix_type (rowMap, 3)); // Fill the matrix. Array cols (3); diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestContainerFactory.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestContainerFactory.cpp index 7a632a03b6c4..e3620888601d 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestContainerFactory.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestContainerFactory.cpp @@ -105,7 +105,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(ContainerFactory, TestTypesAndInput, SC, LO, G // For a diagonal matrix, we can use the row Map as the column Map. const size_t maxNumEntPerRow = 1; - RCP A = rcp (new crs_matrix_type (rowMap, colMap, maxNumEntPerRow, Tpetra::StaticProfile)); + RCP A = rcp (new crs_matrix_type (rowMap, colMap, maxNumEntPerRow)); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { A->insertLocalValues (lclRow, tuple (lclRow), tuple (ONE)); } diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestHelpers.hpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestHelpers.hpp index b11516eaf06c..2380213f3d97 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestHelpers.hpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestHelpers.hpp @@ -100,7 +100,7 @@ create_tridiag_graph (const LocalOrdinal num_rows_per_proc) rcp (new map_type (INVALID, num_rows_per_proc, indexBase, comm)); RCP > crsgraph = - rcp (new Tpetra::CrsGraph (rowmap, 3, Tpetra::StaticProfile)); + rcp (new Tpetra::CrsGraph (rowmap, 3)); Teuchos::Array cols; const LocalOrdinal lclNumRows = @@ -143,7 +143,7 @@ create_test_graph (const LocalOrdinal num_rows_per_proc) Teuchos::RCP > rowmap = Teuchos::rcp(new Tpetra::Map(INVALID, num_rows_per_proc, indexBase, comm)); size_t global_size = rowmap->getGlobalNumElements(); - Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, global_size, Tpetra::StaticProfile)); + Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, global_size)); Teuchos::Array cols; for(LocalOrdinal l_row = 0; (size_t) l_rowgetNodeNumElements(); l_row++) { @@ -180,7 +180,7 @@ Teuchos::RCP > create_banded_g Teuchos::RCP > rowmap = Teuchos::rcp(new Tpetra::Map(INVALID, num_rows_per_proc, indexBase, comm)); const size_t maxNumEntPerRow = 5; - Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow, Tpetra::StaticProfile)); + Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow)); // Fill the graph with only diagonal entries Teuchos::Array gblColInds (maxNumEntPerRow); @@ -219,7 +219,7 @@ template Teuchos::RCP > create_diagonal_graph(Teuchos::RCP > rowmap) { const size_t maxNumEntPerRow = 1; - Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow, Tpetra::StaticProfile)); + Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow)); // Fill the graph with only diagonal entries Teuchos::Array gblColInds (maxNumEntPerRow); @@ -325,7 +325,7 @@ Teuchos::RCP > create_dense_lo Teuchos::RCP > rowmap = Teuchos::rcp(new Tpetra::Map(INVALID, num_rows_per_proc, indexBase, comm)); const size_t maxNumEntPerRow = num_rows_per_proc; - Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow, Tpetra::StaticProfile)); + Teuchos::RCP > crsgraph = Teuchos::rcp(new Tpetra::CrsGraph(rowmap, maxNumEntPerRow)); // Fill the graph with only diagonal entries Teuchos::Array gblColInds (maxNumEntPerRow); @@ -353,8 +353,7 @@ Teuchos::RCP > c { Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, - 3/*tri-diagonal matrix*/, - Tpetra::StaticProfile)); + 3/*tri-diagonal matrix*/)); Teuchos::Array col(3); Teuchos::Array coef(3); @@ -403,7 +402,7 @@ Teuchos::RCP > c template Teuchos::RCP > create_test_matrix2(const Teuchos::RCP >& rowmap) { - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 3/*tri-diagonal matrix*/, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 3/*tri-diagonal matrix*/)); Teuchos::Array col(1); Teuchos::Array coef(1); @@ -458,7 +457,7 @@ Teuchos::RCP > c template Teuchos::RCP > create_test_matrix3(const Teuchos::RCP >& rowmap) { - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 3/*tri-diagonal matrix*/, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 3/*tri-diagonal matrix*/)); /* NOTE: this utility creates a matrix whose column map is equal to its row map. At processor boundaries, @@ -520,7 +519,7 @@ Teuchos::RCP > c template Teuchos::RCP > create_banded_matrix(const Teuchos::RCP >& rowmap, const GlobalOrdinal bw) { - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5)); Teuchos::Array col(1); Teuchos::Array coef(1); @@ -794,7 +793,7 @@ Teuchos::RCP > c // // Beyond this the matrix is diagonal. We also explicitly stick in some hard zeros for the line partitioning test - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 4, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 4)); Teuchos::Array indices(4); Teuchos::Array values(4); @@ -850,7 +849,7 @@ Teuchos::RCP > c // // Beyond this the matrix is diagonal. - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5)); Teuchos::Array indices(5); Teuchos::Array values(5); @@ -906,7 +905,7 @@ Teuchos::RCP > c // // Beyond this the matrix is diagonal. We also explicitly stick in some hard zeros for the line partitioning test - Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5, Tpetra::StaticProfile)); + Teuchos::RCP > crsmatrix = Teuchos::rcp(new Tpetra::CrsMatrix(rowmap, 5)); Teuchos::Array indices(5); Teuchos::Array values(5); diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestLocalSparseTriangularSolver.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestLocalSparseTriangularSolver.cpp index 4c4e6d0945c9..f15c6d2f0d09 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestLocalSparseTriangularSolver.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestLocalSparseTriangularSolver.cpp @@ -264,8 +264,7 @@ void testCompareToLocalSolve (bool& success, Teuchos::FancyOStream& out, out << "Construct the test matrix A" << endl; RCP A = rcp (new crs_matrix_type (rowMap, colMap, - static_cast (maxNumEntPerRow), - Tpetra::StaticProfile)); + static_cast (maxNumEntPerRow))); out << "Fill the test matrix A" << endl; // Pick the entries of the matrix so that triangular solves are diff --git a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestRelaxation.cpp b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestRelaxation.cpp index ba0840e058ad..0d5cf4be3cae 100644 --- a/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestRelaxation.cpp +++ b/packages/ifpack2/test/unit_tests/Ifpack2_UnitTestRelaxation.cpp @@ -504,7 +504,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(Ifpack2Relaxation, SGS_mult_sweeps, Scalar, Lo RCP domainMap = rowMap; RCP rangeMap = rowMap; RCP A = - rcp (new crs_matrix_type (rowMap, 6, Tpetra::StaticProfile)); + rcp (new crs_matrix_type (rowMap, 6)); { const size_t lclNumRows = rowMap->getNodeNumElements (); diff --git a/packages/panzer/disc-fe/src/Panzer_L2Projection.cpp b/packages/panzer/disc-fe/src/Panzer_L2Projection.cpp index 76c51845bc80..047a37c1c69e 100644 --- a/packages/panzer/disc-fe/src/Panzer_L2Projection.cpp +++ b/packages/panzer/disc-fe/src/Panzer_L2Projection.cpp @@ -363,7 +363,7 @@ namespace panzer { } Teuchos::ArrayView nEntriesPerRowView(nEntriesPerRow); - RCP ghostedGraph = rcp(new GraphType(ghostedTargetMap,ghostedSourceMap,nEntriesPerRowView,Tpetra::StaticProfile)); + RCP ghostedGraph = rcp(new GraphType(ghostedTargetMap,ghostedSourceMap,nEntriesPerRowView)); for (blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) { std::string blockId = *blockItr; diff --git a/packages/panzer/disc-fe/src/Panzer_LocalPartitioningUtilities.cpp b/packages/panzer/disc-fe/src/Panzer_LocalPartitioningUtilities.cpp index 0cc4ce01f54d..9ece49dac0e1 100644 --- a/packages/panzer/disc-fe/src/Panzer_LocalPartitioningUtilities.cpp +++ b/packages/panzer/disc-fe/src/Panzer_LocalPartitioningUtilities.cpp @@ -264,8 +264,7 @@ buildNodeToCellMatrix(const Teuchos::RCP > & comm, const unsigned int num_nodes_per_cell = owned_cells_to_nodes.extent(1); // The matrix is indexed by (global cell, global node) = local node - cell_to_node = rcp(new crs_type(cell_map,num_nodes_per_cell, - Tpetra::StaticProfile)); + cell_to_node = rcp(new crs_type(cell_map,num_nodes_per_cell)); std::vector local_node_indexes(num_nodes_per_cell); std::vector global_node_indexes(num_nodes_per_cell); diff --git a/packages/panzer/disc-fe/src/lof/Panzer_BlockedTpetraLinearObjFactory_impl.hpp b/packages/panzer/disc-fe/src/lof/Panzer_BlockedTpetraLinearObjFactory_impl.hpp index e35c070206a3..c0b0fa544945 100644 --- a/packages/panzer/disc-fe/src/lof/Panzer_BlockedTpetraLinearObjFactory_impl.hpp +++ b/packages/panzer/disc-fe/src/lof/Panzer_BlockedTpetraLinearObjFactory_impl.hpp @@ -1036,8 +1036,7 @@ buildTpetraGhostedGraph(int i,int j) const } } Teuchos::ArrayView nEntriesPerRowView(nEntriesPerRow); - RCP graph = rcp(new CrsGraphType(map_i,map_j, nEntriesPerRowView, - Tpetra::StaticProfile)); + RCP graph = rcp(new CrsGraphType(map_i,map_j, nEntriesPerRowView)); diff --git a/packages/panzer/disc-fe/src/lof/Panzer_TpetraLinearObjFactory_impl.hpp b/packages/panzer/disc-fe/src/lof/Panzer_TpetraLinearObjFactory_impl.hpp index 03b4b1502bc9..763ee9e34af5 100644 --- a/packages/panzer/disc-fe/src/lof/Panzer_TpetraLinearObjFactory_impl.hpp +++ b/packages/panzer/disc-fe/src/lof/Panzer_TpetraLinearObjFactory_impl.hpp @@ -712,8 +712,7 @@ buildGhostedGraph() const Teuchos::ArrayView nEntriesPerRowView(nEntriesPerRow); Teuchos::RCP graph = Teuchos::rcp(new CrsGraphType(rMap,cMap, - nEntriesPerRowView, - Tpetra::StaticProfile)); + nEntriesPerRowView)); // Now insert entries into the graph for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) { diff --git a/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteCurl.hpp b/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteCurl.hpp index 3713995d4541..54aed44dc9b2 100644 --- a/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteCurl.hpp +++ b/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteCurl.hpp @@ -176,7 +176,7 @@ void addDiscreteCurlToRequestHandler( edge_basis->getValues(Kokkos::subview(curlAtDofCoordsNonOriented, 0, Kokkos::ALL(), Kokkos::ALL(), Kokkos::ALL()), Kokkos::subview(dofCoords, 0, Kokkos::ALL(), Kokkos::ALL()), Intrepid2::OPERATOR_CURL); // create the global curl matrix - RCP curl_matrix = rcp(new matrix(rowmap,colmap,basisCoeffsLI.extent(1),Tpetra::StaticProfile)); + RCP curl_matrix = rcp(new matrix(rowmap,colmap,basisCoeffsLI.extent(1))); // loop over element blocks std::vector elementBlockIds; diff --git a/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteGradient.hpp b/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteGradient.hpp index c2055bcad0c0..48d736e05955 100644 --- a/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteGradient.hpp +++ b/packages/panzer/mini-em/src/solvers/MiniEM_DiscreteGradient.hpp @@ -96,7 +96,7 @@ void addDiscreteGradientToRequestHandler( RCP domainmap = global_tloc->getMapForBlock(nBlockIndex); RCP rowmap = global_tloc->getMapForBlock(eBlockIndex); RCP colmap = ghosted_tloc->getMapForBlock(nBlockIndex); - RCP grad_matrix = rcp(new matrix(rowmap, colmap, 2, Tpetra::StaticProfile)); + RCP grad_matrix = rcp(new matrix(rowmap, colmap, 2)); RCP field_pattern = blockedDOFMngr->getGeometricFieldPattern(); shards::CellTopology cell_topology = field_pattern->getCellTopology(); diff --git a/packages/shylu/shylu_dd/bddc/src/shylu_UtilBDDC.hpp b/packages/shylu/shylu_dd/bddc/src/shylu_UtilBDDC.hpp index 1d4864683f52..37b650b0c580 100644 --- a/packages/shylu/shylu_dd/bddc/src/shylu_UtilBDDC.hpp +++ b/packages/shylu/shylu_dd/bddc/src/shylu_UtilBDDC.hpp @@ -262,7 +262,7 @@ namespace bddc { 0, Comm)); RCP colMap = rcp(new Map(IGO, Teuchos::ArrayView(proc), 0, Comm) ); - CrsGraph nodeProcs(nodeMap, colMap, 1, Tpetra::StaticProfile); + CrsGraph nodeProcs(nodeMap, colMap, 1); std::vector zero(1, 0); for (LO i=0; i(zero)); @@ -315,7 +315,7 @@ namespace bddc { 0, Comm)); RCP colMap = rcp(new Map(IGO, Teuchos::ArrayView(proc), 0, Comm) ); - CrsGraph nodeProcs(nodeMap, colMap, 1, Tpetra::StaticProfile); + CrsGraph nodeProcs(nodeMap, colMap, 1); std::vector zero(1, 0); for (LO i=0; i(zero)); diff --git a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp index b3f44635b715..0bf286dc6bd6 100644 --- a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp +++ b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp @@ -657,7 +657,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -778,7 +778,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -915,7 +915,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1076,7 +1076,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1221,7 +1221,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1376,7 +1376,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1518,7 +1518,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(1), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(1))); Array columnIndices(1); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1672,7 +1672,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(1), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(1))); Array columnIndices(1); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1826,7 +1826,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(1), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(1))); Array columnIndices(1); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -2002,7 +2002,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -2164,7 +2164,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); diff --git a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixUQPCEUnitTest.hpp b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixUQPCEUnitTest.hpp index e35620acfab8..dd62e5e8c954 100644 --- a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixUQPCEUnitTest.hpp +++ b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixUQPCEUnitTest.hpp @@ -697,7 +697,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -843,7 +843,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1000,7 +1000,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1155,7 +1155,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1329,7 +1329,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1528,7 +1528,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1701,7 +1701,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -1885,7 +1885,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(3), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(3))); Array columnIndices(3); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); diff --git a/packages/stokhos/test/UnitTest/tpetra_mat_vec.cpp b/packages/stokhos/test/UnitTest/tpetra_mat_vec.cpp index 7aee742ec0f9..50c271213d28 100644 --- a/packages/stokhos/test/UnitTest/tpetra_mat_vec.cpp +++ b/packages/stokhos/test/UnitTest/tpetra_mat_vec.cpp @@ -43,7 +43,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); @@ -139,7 +139,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_2_DECL( Tpetra::createUniformContigMapWithNode( nrow, comm); RCP graph = - rcp(new Tpetra_CrsGraph(map, size_t(2), Tpetra::StaticProfile)); + rcp(new Tpetra_CrsGraph(map, size_t(2))); Array columnIndices(2); ArrayView myGIDs = map->getNodeElementList(); const size_t num_my_row = myGIDs.size(); diff --git a/packages/thyra/adapters/tpetra/test/TpetraThyraWrappers_UnitTests.cpp b/packages/thyra/adapters/tpetra/test/TpetraThyraWrappers_UnitTests.cpp index e6972f732d11..33b5c234a70c 100644 --- a/packages/thyra/adapters/tpetra/test/TpetraThyraWrappers_UnitTests.cpp +++ b/packages/thyra/adapters/tpetra/test/TpetraThyraWrappers_UnitTests.cpp @@ -140,7 +140,7 @@ createTriDiagonalTpetraOperator(const int numLocalRows) // Create a Tpetra::Matrix using the Map, with a static allocation dictated by numNz RCP< Tpetra::CrsMatrix > A = - Teuchos::rcp( new Tpetra::CrsMatrix(map, numNz (), Tpetra::StaticProfile) ); + Teuchos::rcp( new Tpetra::CrsMatrix(map, numNz ()) ); // We are done with NumNZ { diff --git a/packages/tpetra/core/example/Additive-Schwarz-Halo/AdditiveSchwarzHalo.cpp b/packages/tpetra/core/example/Additive-Schwarz-Halo/AdditiveSchwarzHalo.cpp index c00de918e429..da07c6bb5291 100644 --- a/packages/tpetra/core/example/Additive-Schwarz-Halo/AdditiveSchwarzHalo.cpp +++ b/packages/tpetra/core/example/Additive-Schwarz-Halo/AdditiveSchwarzHalo.cpp @@ -117,7 +117,7 @@ int main (int argc, char *argv[]) [ 1 2] this matrix has an eigenvalue lambda=3, with eigenvector v = [1 ... 1] */ - A = rcp (new MAT(map, 3, Tpetra::StaticProfile)); + A = rcp (new MAT(map, 3)); if (myImageID == 0) { Array vals(tuple(static_cast(2)*ST::one(), ST::one())); Array cols(tuple(myImageID, myImageID+1)); diff --git a/packages/tpetra/core/example/Finite-Element-Assembly/fem_assembly_TotalElementLoop.hpp b/packages/tpetra/core/example/Finite-Element-Assembly/fem_assembly_TotalElementLoop.hpp index 1a7ee2df3f0d..c58335c20f40 100644 --- a/packages/tpetra/core/example/Finite-Element-Assembly/fem_assembly_TotalElementLoop.hpp +++ b/packages/tpetra/core/example/Finite-Element-Assembly/fem_assembly_TotalElementLoop.hpp @@ -155,7 +155,7 @@ int executeTotalElementLoopSP_(const Teuchos::RCP >& co Teuchos::TimeMonitor::getStackedTimer()->startBaseTimer(); RCP timerElementLoopGraph = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("1) ElementLoop (Graph)"))); - RCP crs_graph = rcp(new crs_graph_type(row_map, maxEntriesPerRow, Tpetra::StaticProfile)); + RCP crs_graph = rcp(new crs_graph_type(row_map, maxEntriesPerRow)); // Using 4 because we're using quads for this example, so there will be 4 nodes associated with each element. Teuchos::Array global_ids_in_row(4); @@ -435,7 +435,7 @@ executeTotalElementLoopSPKokkos_ Teuchos::TimeMonitor::getStackedTimer()->startBaseTimer(); RCP timerElementLoopGraph = rcp(new TimeMonitor(*TimeMonitor::getNewTimer("1) ElementLoop (Graph)"))); - RCP crs_graph = rcp(new crs_graph_type(row_map, maxEntriesPerRow, Tpetra::StaticProfile)); + RCP crs_graph = rcp(new crs_graph_type(row_map, maxEntriesPerRow)); // Using 4 because we're using quads for this example, so there will be 4 nodes associated with each element. Teuchos::Array global_ids_in_row(4); diff --git a/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrixMatVec.cpp b/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrixMatVec.cpp index f6cebb6dad65..a5d2f1620ca8 100644 --- a/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrixMatVec.cpp +++ b/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrixMatVec.cpp @@ -219,8 +219,7 @@ getTpetraGraph (const Teuchos::RCP >& comm, const GO gblNumCols = static_cast (rowMap->getGlobalNumElements ()); // Create the graph structure of the sparse matrix. RCP G = - rcp (new graph_type (rowMap, opts.numEntPerRow, - Tpetra::StaticProfile)); + rcp (new graph_type (rowMap, opts.numEntPerRow)); // Fill in the sparse graph. Teuchos::Array gblColInds (opts.numEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { // for each of my rows diff --git a/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrix_sumIntoLocalValues.cpp b/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrix_sumIntoLocalValues.cpp index e6bb4b53726d..6252bbd9c266 100644 --- a/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrix_sumIntoLocalValues.cpp +++ b/packages/tpetra/core/example/advanced/Benchmarks/CrsMatrix_sumIntoLocalValues.cpp @@ -88,8 +88,7 @@ createCrsMatrix (RCP rowAndColMap, //TM mon (*TM::getNewCounter ("CrsMatrix constructor")); return rcp (new crs_matrix_type (rowAndColMap, rowAndColMap, - maxNumEntPerRow, - Tpetra::StaticProfile)); + maxNumEntPerRow)); } RCP @@ -99,8 +98,7 @@ createCrsGraph (RCP rowAndColMap, //TM mon (*TM::getNewCounter ("CrsGraph constructor")); return rcp (new crs_graph_type (rowAndColMap, rowAndColMap, - maxNumEntPerRow, - Tpetra::StaticProfile)); + maxNumEntPerRow)); } void diff --git a/packages/tpetra/core/example/advanced/Benchmarks/blockCrsMatrixMatVec.cpp b/packages/tpetra/core/example/advanced/Benchmarks/blockCrsMatrixMatVec.cpp index b0e3beb5996b..e3c1b087e177 100644 --- a/packages/tpetra/core/example/advanced/Benchmarks/blockCrsMatrixMatVec.cpp +++ b/packages/tpetra/core/example/advanced/Benchmarks/blockCrsMatrixMatVec.cpp @@ -460,8 +460,7 @@ getTpetraGraph (const Teuchos::RCP >& comm, const GO gblNumCols = static_cast (rowMap->getGlobalNumElements ()); // Create the graph structure of the sparse matrix. RCP G = - rcp (new graph_type (rowMap, opts.numEntPerRow, - Tpetra::StaticProfile)); + rcp (new graph_type (rowMap, opts.numEntPerRow)); // Fill in the sparse graph. Teuchos::Array gblColInds (opts.numEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { // for each of my rows diff --git a/packages/tpetra/core/example/advanced/Benchmarks/localView.cpp b/packages/tpetra/core/example/advanced/Benchmarks/localView.cpp index 51b0d744342e..7d7342239851 100644 --- a/packages/tpetra/core/example/advanced/Benchmarks/localView.cpp +++ b/packages/tpetra/core/example/advanced/Benchmarks/localView.cpp @@ -275,8 +275,7 @@ namespace { // (anonymous) const GO gblNumCols = static_cast (rowMap->getGlobalNumElements ()); // Create the graph structure of the sparse matrix. RCP G = - rcp (new graph_type (rowMap, opts.numEntPerRow, - Tpetra::StaticProfile)); + rcp (new graph_type (rowMap, opts.numEntPerRow)); // Fill in the graph structure of the sparse matrix. Teuchos::Array gblColInds (opts.numEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { // for each of my rows diff --git a/packages/tpetra/core/inout/MatrixMarket_Tpetra.hpp b/packages/tpetra/core/inout/MatrixMarket_Tpetra.hpp index 7c0896c4300d..811ee6623167 100644 --- a/packages/tpetra/core/inout/MatrixMarket_Tpetra.hpp +++ b/packages/tpetra/core/inout/MatrixMarket_Tpetra.hpp @@ -803,8 +803,7 @@ namespace Tpetra { // Construct the CrsMatrix, using the row map, with the // constructor specifying the number of nonzeros for each row. RCP A = - rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow (), - StaticProfile)); + rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow ())); // List of the global indices of my rows. // They may or may not be contiguous. @@ -894,7 +893,7 @@ namespace Tpetra { // constructor specifying the number of nonzeros for each row. RCP A = rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow(), - StaticProfile, constructorParams)); + constructorParams)); // List of the global indices of my rows. // They may or may not be contiguous. @@ -956,9 +955,9 @@ namespace Tpetra { RCP A; // the matrix to return. if (colMap.is_null ()) { // the user didn't provide a column Map - A = rcp (new sparse_matrix_type (rowMap, myNumEntriesPerRow, StaticProfile)); + A = rcp (new sparse_matrix_type (rowMap, myNumEntriesPerRow)); } else { // the user provided a column Map - A = rcp (new sparse_matrix_type (rowMap, colMap, myNumEntriesPerRow, StaticProfile)); + A = rcp (new sparse_matrix_type (rowMap, colMap, myNumEntriesPerRow)); } // List of the global indices of my rows. @@ -1571,7 +1570,7 @@ namespace Tpetra { RCP proc0Graph = rcp(new sparse_graph_type(proc0Map,numEntriesPerRow (), - StaticProfile,constructorParams)); + constructorParams)); if(myRank == rootRank) { typedef Teuchos::MatrixMarket::Raw::GraphElement element_type; @@ -1598,7 +1597,7 @@ namespace Tpetra { rcp(new map_type(dims[0],0,pComm,GloballyDistributed)); // Create the graph with that distribution too - distGraph = rcp(new sparse_graph_type(distMap,colMap,0,StaticProfile,constructorParams)); + distGraph = rcp(new sparse_graph_type(distMap,colMap,0,constructorParams)); // Create an importer/exporter/vandelay to redistribute the graph typedef Import import_type; @@ -1608,7 +1607,7 @@ namespace Tpetra { distGraph->doImport(*proc0Graph,importer,INSERT); } else { - distGraph = rcp(new sparse_graph_type(rowMap,colMap,0,StaticProfile,constructorParams)); + distGraph = rcp(new sparse_graph_type(rowMap,colMap,0,constructorParams)); // Create an importer/exporter/vandelay to redistribute the graph typedef Import import_type; @@ -3799,8 +3798,7 @@ namespace Tpetra { // know how many entries there are in each row, so we can use // static profile. RCP A_proc0 = - rcp (new sparse_matrix_type (gatherRowMap, gatherNumEntriesPerRow (), - Tpetra::StaticProfile)); + rcp (new sparse_matrix_type (gatherRowMap, gatherNumEntriesPerRow())); if (myRank == rootRank) { if (debug) { cerr << "-- Proc 0: Filling gather matrix" << endl; diff --git a/packages/tpetra/core/inout/Tpetra_MatrixIO_def.hpp b/packages/tpetra/core/inout/Tpetra_MatrixIO_def.hpp index fceedf05f7cb..63138d4fa4ad 100644 --- a/packages/tpetra/core/inout/Tpetra_MatrixIO_def.hpp +++ b/packages/tpetra/core/inout/Tpetra_MatrixIO_def.hpp @@ -203,7 +203,7 @@ readHBMatrix (const std::string &filename, else { domMap = createUniformContigMapWithNode(numCols,comm); } - A = rcp(new Tpetra::CrsMatrix(rowMap, myNNZ (), Tpetra::StaticProfile)); + A = rcp(new Tpetra::CrsMatrix(rowMap, myNNZ ())); // free this locally, A will keep it allocated as long as it is needed by A (up until allocation of nonzeros) { // Classic idiom for freeing an std::vector; resize doesn't diff --git a/packages/tpetra/core/src/Tpetra_BlockCrsMatrix_Helpers_def.hpp b/packages/tpetra/core/src/Tpetra_BlockCrsMatrix_Helpers_def.hpp index 5eb8b0dc1a90..cb636b540c10 100644 --- a/packages/tpetra/core/src/Tpetra_BlockCrsMatrix_Helpers_def.hpp +++ b/packages/tpetra/core/src/Tpetra_BlockCrsMatrix_Helpers_def.hpp @@ -329,7 +329,7 @@ namespace Tpetra { // We can use static profile because the point graph should have at least as many entries per // row as the mesh graph. RCP meshCrsGraph = rcp(new crs_graph_type(meshRowMap, meshColMap, - pointMatrix.getGlobalMaxNumRowEntries(), Tpetra::StaticProfile)); + pointMatrix.getGlobalMaxNumRowEntries())); // Fill the graph by walking through the matrix. For each mesh row, we query the collection of point // rows associated with it. The point column ids are converted to mesh column ids and put into an array. // As each point row collection is finished, the mesh column ids are sorted, made unique, and inserted diff --git a/packages/tpetra/core/src/Tpetra_ConfigDefs.hpp b/packages/tpetra/core/src/Tpetra_ConfigDefs.hpp index 66f40c403ba0..3e68282a3e7d 100644 --- a/packages/tpetra/core/src/Tpetra_ConfigDefs.hpp +++ b/packages/tpetra/core/src/Tpetra_ConfigDefs.hpp @@ -124,12 +124,15 @@ namespace Tpetra { IDNotPresent /*!< At least one of the specified indices was not present in the Map */ }; +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /*! Allocation profile for matrix/graph entries */ enum ProfileType { StaticProfile }; #define TPETRA_DEFAULT_PROFILE_TYPE Tpetra::StaticProfile +#endif + /*! Optimize storage option */ enum OptimizeOption { DoOptimizeStorage, /*!< Indicates that storage should be optimized */ diff --git a/packages/tpetra/core/src/Tpetra_CrsGraph_decl.hpp b/packages/tpetra/core/src/Tpetra_CrsGraph_decl.hpp index 989e4a55c041..13de58644f8f 100644 --- a/packages/tpetra/core/src/Tpetra_CrsGraph_decl.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsGraph_decl.hpp @@ -332,15 +332,22 @@ namespace Tpetra { /// \param maxNumEntriesPerRow [in] Maximum number of graph /// entries per row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const size_t maxNumEntriesPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const size_t maxNumEntriesPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying a (possibly different) upper @@ -351,15 +358,22 @@ namespace Tpetra { /// \param numEntPerRow [in] Maximum number of graph entries to /// allocate for each row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const Kokkos::DualView& numEntPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const Kokkos::DualView& numEntPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying a (possibly different) upper @@ -371,15 +385,22 @@ namespace Tpetra { /// \param numEntPerRow [in] Maximum number of graph entries to /// allocate for each row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::ArrayView& numEntPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::ArrayView& numEntPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); @@ -395,16 +416,24 @@ namespace Tpetra { /// \param maxNumEntriesPerRow [in] Maximum number of graph /// entries per row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const size_t maxNumEntriesPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const size_t maxNumEntriesPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying column Map and number of entries in each row. @@ -417,16 +446,24 @@ namespace Tpetra { /// \param numEntPerRow [in] Maximum number of graph entries to /// allocate for each row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Kokkos::DualView& numEntPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Kokkos::DualView& numEntPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying column Map and number of entries @@ -440,16 +477,24 @@ namespace Tpetra { /// \param numEntPerRow [in] Maximum number of graph entries to /// allocate for each row. This is a strict upper bound. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Teuchos::ArrayView& numEntPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Teuchos::ArrayView& numEntPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); @@ -1102,8 +1147,10 @@ namespace Tpetra { */ bool isStorageOptimized () const; +#ifdef TPETRA_ENABLE_DEPRECATED_CODE //! Returns \c true if the graph was allocated with static data structures. ProfileType getProfileType () const; +#endif /// \brief Get a copy of the given row, using global indices. /// @@ -2561,9 +2608,8 @@ namespace Tpetra { { using Teuchos::rcp; using graph_type = CrsGraph; - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; return rcp(new graph_type(map, maxNumEntriesPerRow, - pftype, params)); + params)); } /// \brief Nonmember CrsGraph constructor that fuses Import and diff --git a/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp b/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp index ba011df0095d..8e5df80becf9 100644 --- a/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp @@ -288,18 +288,30 @@ namespace Tpetra { return Details::Behavior::verbose("CrsGraph"); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const size_t maxNumEntriesPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, maxNumEntriesPerRow, params) + {} +#endif + + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const size_t maxNumEntriesPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , numAllocForAllRows_ (maxNumEntriesPerRow) { const char tfecfFuncName[] = - "CrsGraph(rowMap,maxNumEntriesPerRow,pftype,params): "; + "CrsGraph(rowMap,maxNumEntriesPerRow,params): "; staticAssertions (); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (maxNumEntriesPerRow == Teuchos::OrdinalTraits::invalid (), @@ -310,20 +322,33 @@ namespace Tpetra { checkInternalState (); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const size_t maxNumEntriesPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, colMap, maxNumEntriesPerRow, params) + {} +#endif + + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const size_t maxNumEntriesPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , colMap_ (colMap) , numAllocForAllRows_ (maxNumEntriesPerRow) { const char tfecfFuncName[] = - "CrsGraph(rowMap,colMap,maxNumEntriesPerRow,pftype,params): "; + "CrsGraph(rowMap,colMap,maxNumEntriesPerRow,params): "; staticAssertions (); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC( maxNumEntriesPerRow == Teuchos::OrdinalTraits::invalid (), @@ -334,18 +359,30 @@ namespace Tpetra { checkInternalState (); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::ArrayView& numEntPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, numEntPerRow, params) + {} +#endif + + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::ArrayView& numEntPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , numAllocForAllRows_ (0) { const char tfecfFuncName[] = - "CrsGraph(rowMap,numEntPerRow,pftype,params): "; + "CrsGraph(rowMap,numEntPerRow,params): "; staticAssertions (); const size_t lclNumRows = rowMap.is_null () ? @@ -388,19 +425,30 @@ namespace Tpetra { +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const Kokkos::DualView& numEntPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, numEntPerRow, params) + {} +#endif + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const Kokkos::DualView& numEntPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , k_numAllocPerRow_ (numEntPerRow.h_view) , numAllocForAllRows_ (0) { const char tfecfFuncName[] = - "CrsGraph(rowMap,numEntPerRow,pftype,params): "; + "CrsGraph(rowMap,numEntPerRow,params): "; staticAssertions (); const size_t lclNumRows = rowMap.is_null () ? @@ -427,13 +475,26 @@ namespace Tpetra { } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Kokkos::DualView& numEntPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, colMap, numEntPerRow, params) + {} +#endif + + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Kokkos::DualView& numEntPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , colMap_ (colMap) @@ -441,7 +502,7 @@ namespace Tpetra { , numAllocForAllRows_ (0) { const char tfecfFuncName[] = - "CrsGraph(rowMap,colMap,numEntPerRow,pftype,params): "; + "CrsGraph(rowMap,colMap,numEntPerRow,params): "; staticAssertions (); const size_t lclNumRows = rowMap.is_null () ? @@ -468,20 +529,33 @@ namespace Tpetra { } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsGraph:: CrsGraph (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Teuchos::ArrayView& numEntPerRow, const ProfileType /* pftype */, const Teuchos::RCP& params) : + CrsGraph ( + rowMap, colMap, numEntPerRow, params) + {} +#endif + + template + CrsGraph:: + CrsGraph (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Teuchos::ArrayView& numEntPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) , rowMap_ (rowMap) , colMap_ (colMap) , numAllocForAllRows_ (0) { const char tfecfFuncName[] = - "CrsGraph(rowMap,colMap,numEntPerRow,pftype,params): "; + "CrsGraph(rowMap,colMap,numEntPerRow,params): "; staticAssertions (); const size_t lclNumRows = rowMap.is_null () ? @@ -921,13 +995,16 @@ namespace Tpetra { return isOpt; } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED ProfileType CrsGraph:: getProfileType () const { return StaticProfile; } +#endif template global_size_t @@ -3318,8 +3395,7 @@ namespace Tpetra { // number of entries in each nonlocal row. RCP nonlocalGraph = - rcp(new crs_graph_type(nonlocalRowMap, numEntPerNonlocalRow(), - StaticProfile)); + rcp(new crs_graph_type(nonlocalRowMap, numEntPerNonlocalRow())); { size_type curPos = 0; for (auto mapIter = this->nonlocals_.begin (); @@ -7174,7 +7250,7 @@ namespace Tpetra { // If the user gave us a null destGraph, then construct the new // destination graph. We will replace its column Map later. if (destGraph.is_null()) { - destGraph = rcp(new this_type(MyRowMap, 0, StaticProfile, graphparams)); + destGraph = rcp(new this_type(MyRowMap, 0, graphparams)); } /***************************************************/ diff --git a/packages/tpetra/core/src/Tpetra_CrsMatrix_decl.hpp b/packages/tpetra/core/src/Tpetra_CrsMatrix_decl.hpp index 2fc74c0ee4e3..6feec1b68d92 100644 --- a/packages/tpetra/core/src/Tpetra_CrsMatrix_decl.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsMatrix_decl.hpp @@ -538,15 +538,23 @@ namespace Tpetra { /// entries per row. This is a strict upper bound. It may /// differ on different processes. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + TPETRA_DEPRECATED + CrsMatrix (const Teuchos::RCP& rowMap, + const size_t maxNumEntriesPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsMatrix (const Teuchos::RCP& rowMap, const size_t maxNumEntriesPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying (possibly different) number of entries in each row. @@ -557,15 +565,23 @@ namespace Tpetra { /// entries to allocate for each row. This is a strict upper /// bound. It may differ on different processes. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + TPETRA_DEPRECATED + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::ArrayView& numEntPerRowToAlloc, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::ArrayView& numEntPerRowToAlloc, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); @@ -583,16 +599,25 @@ namespace Tpetra { /// per row. This is a strict upper bound. It may differ on /// different processes. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + TPETRA_DEPRECATED + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const size_t maxNumEntPerRow, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const size_t maxNumEntPerRow, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); /// \brief Constructor specifying column Map and number of entries in each row. @@ -609,18 +634,26 @@ namespace Tpetra { /// entries to allocate for each row. This is a strict upper /// bound. It may differ on different processes. /// +#ifdef TPETRA_ENABLE_DEPRECATED_CODE /// \param pftype [in] If you specify this, then this must always /// be StaticProfile. No other values exist or are permitted. +#endif /// /// \param params [in/out] Optional list of parameters. If not /// null, any missing parameters will be filled in with their /// default values. +#ifdef TPETRA_ENABLE_DEPRECATED_CODE + TPETRA_DEPRECATED + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Teuchos::ArrayView& numEntPerRowToAlloc, + const ProfileType pftype, + const Teuchos::RCP& params = Teuchos::null); +#endif CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Teuchos::ArrayView& numEntPerRowToAlloc, - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE, const Teuchos::RCP& params = Teuchos::null); - /// \brief Constructor specifying a matrix and a previously /// constructed graph, presumably a subset of the matrix's graph. @@ -953,10 +986,6 @@ namespace Tpetra { /// possible upper bounds on the number of entries in each row /// of the matrix. This will avoid expensive reallocation if /// your bound was not large enough. - ///
  • If your upper bound on the number of entries in each row - /// will always be correct, create the matrix with - /// StaticProfile. This uses a faster and more compact data - /// structure to store the matrix.
  • ///
  • If you plan to reuse a matrix's graph structure, but /// change its values, in repeated fillComplete() / resumeFill() /// cycles, you can get the best performance by creating the @@ -1018,10 +1047,6 @@ namespace Tpetra { /// possible upper bounds on the number of entries in each row /// of the matrix. This will avoid expensive reallocation if /// your bound was not large enough.
  • - ///
  • If your upper bound on the number of entries in each row - /// will always be correct, create the matrix with - /// StaticProfile. This uses a faster and more compact data - /// structure to store the matrix.
  • ///
  • If you plan to reuse a matrix's graph structure, but /// change its values, in repeated fillComplete() / resumeFill() /// cycles, you can get the best performance by creating the @@ -2471,8 +2496,10 @@ namespace Tpetra { */ bool isStorageOptimized () const; +#ifdef TPETRA_ENABLE_DEPRECATED_CODE //! Returns \c true if the matrix was allocated with static data structures. - ProfileType getProfileType () const; + TPETRA_DEPRECATED ProfileType getProfileType () const; +#endif //! Indicates that the graph is static, so that new entries cannot be added to this matrix. bool isStaticGraph () const; @@ -4152,9 +4179,8 @@ namespace Tpetra { { using matrix_type = CrsMatrix; - const ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; return Teuchos::rcp(new matrix_type(map, maxNumEntriesPerRow, - pftype, params)); + params)); } template diff --git a/packages/tpetra/core/src/Tpetra_CrsMatrix_def.hpp b/packages/tpetra/core/src/Tpetra_CrsMatrix_def.hpp index bef5d73e27da..64589eee83b1 100644 --- a/packages/tpetra/core/src/Tpetra_CrsMatrix_def.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsMatrix_def.hpp @@ -140,25 +140,37 @@ struct AbsMax { namespace Tpetra { +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsMatrix:: CrsMatrix (const Teuchos::RCP& rowMap, size_t maxNumEntriesPerRow, const ProfileType pftype, const Teuchos::RCP& params) : + CrsMatrix ( + rowMap, maxNumEntriesPerRow, params) + {} +#endif + + template + CrsMatrix:: + CrsMatrix (const Teuchos::RCP& rowMap, + size_t maxNumEntriesPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) { - const char tfecfFuncName[] = "CrsMatrix(RCP, size_t, " - "ProfileType[, RCP]): "; + const char tfecfFuncName[] = "CrsMatrix(RCP, size_t " + "[, RCP]): "; Teuchos::RCP graph; try { graph = Teuchos::rcp (new crs_graph_type (rowMap, maxNumEntriesPerRow, - pftype, params)); + params)); } catch (std::exception& e) { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (true, std::runtime_error, "CrsGraph constructor (RCP, " - "size_t, ProfileType[, RCP]) threw an exception: " + "size_t [, RCP]) threw an exception: " << e.what ()); } // myGraph_ not null means that the matrix owns the graph. That's @@ -170,27 +182,39 @@ namespace Tpetra { checkInternalState (); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsMatrix:: CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::ArrayView& numEntPerRowToAlloc, const ProfileType pftype, const Teuchos::RCP& params) : + CrsMatrix ( + rowMap, numEntPerRowToAlloc, params) + {} +#endif + + template + CrsMatrix:: + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::ArrayView& numEntPerRowToAlloc, + const Teuchos::RCP& params) : dist_object_type (rowMap) { const char tfecfFuncName[] = "CrsMatrix(RCP, " - "ArrayView, ProfileType[, RCP]): "; + "ArrayView[, RCP]): "; Teuchos::RCP graph; try { using Teuchos::rcp; graph = rcp(new crs_graph_type(rowMap, numEntPerRowToAlloc, - pftype, params)); + params)); } catch (std::exception& e) { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (true, std::runtime_error, "CrsGraph constructor " - "(RCP, ArrayView, " - "ProfileType[, RCP]) threw an exception: " + "(RCP, ArrayView" + "[, RCP]) threw an exception: " << e.what ()); } // myGraph_ not null means that the matrix owns the graph. That's @@ -202,18 +226,30 @@ namespace Tpetra { checkInternalState (); } - +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsMatrix:: CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const size_t maxNumEntPerRow, const ProfileType pftype, const Teuchos::RCP& params) : + CrsMatrix ( + rowMap, colMap, maxNumEntPerRow, params) + {} +#endif + + template + CrsMatrix:: + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const size_t maxNumEntPerRow, + const Teuchos::RCP& params) : dist_object_type (rowMap) { const char tfecfFuncName[] = "CrsMatrix(RCP, " - "RCP, size_t, ProfileType[, RCP]): "; + "RCP, size_t[, RCP]): "; const char suffix[] = " Please report this bug to the Tpetra developers."; @@ -230,12 +266,12 @@ namespace Tpetra { try { graph = Teuchos::rcp (new crs_graph_type (rowMap, colMap, maxNumEntPerRow, - pftype, params)); + params)); } catch (std::exception& e) { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (true, std::runtime_error, "CrsGraph constructor (RCP, " - "RCP, size_t, ProfileType[, RCP]) threw an " + "RCP, size_t[, RCP]) threw an " "exception: " << e.what ()); } // myGraph_ not null means that the matrix owns the graph. That's @@ -247,28 +283,41 @@ namespace Tpetra { checkInternalState (); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED CrsMatrix:: CrsMatrix (const Teuchos::RCP& rowMap, const Teuchos::RCP& colMap, const Teuchos::ArrayView& numEntPerRowToAlloc, const ProfileType pftype, const Teuchos::RCP& params) : + CrsMatrix ( + rowMap, colMap, numEntPerRowToAlloc, params) + {} +#endif + + template + CrsMatrix:: + CrsMatrix (const Teuchos::RCP& rowMap, + const Teuchos::RCP& colMap, + const Teuchos::ArrayView& numEntPerRowToAlloc, + const Teuchos::RCP& params) : dist_object_type (rowMap) { const char tfecfFuncName[] = "CrsMatrix(RCP, RCP, " - "ArrayView, ProfileType[, RCP]): "; + "ArrayView[, RCP]): "; Teuchos::RCP graph; try { graph = Teuchos::rcp (new crs_graph_type (rowMap, colMap, numEntPerRowToAlloc, - pftype, params)); + params)); } catch (std::exception& e) { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (true, std::runtime_error, "CrsGraph constructor (RCP, " - "RCP, ArrayView, ProfileType[, " + "RCP, ArrayView[, " "RCP]) threw an exception: " << e.what ()); } // myGraph_ not null means that the matrix owns the graph. That's @@ -819,12 +868,15 @@ namespace Tpetra { return getCrsGraphRef ().getComm (); } +#ifdef TPETRA_ENABLE_DEPRECATED_CODE template + TPETRA_DEPRECATED ProfileType CrsMatrix:: getProfileType () const { return this->getCrsGraphRef ().getProfileType (); } +#endif template bool @@ -1198,27 +1250,9 @@ namespace Tpetra { } // Allocate matrix values. - // "Static profile" means that the number of matrix entries in - // each row was fixed at the time the CrsMatrix constructor was - // called. This lets us use 1-D storage for the matrix's - // values. ("1-D storage" means the same as that used by the - // three arrays in the compressed sparse row storage format.) - - if (debug) { - TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC - (this->staticGraph_.is_null (), std::logic_error, - "this->getProfileType() == StaticProfile, but staticGraph_ " - "is null." << suffix); - } - const size_t lclNumRows = this->staticGraph_->getNodeNumRows (); typename Graph::local_graph_device_type::row_map_type k_ptrs = this->staticGraph_->rowPtrsUnpacked_dev_; - TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC - (k_ptrs.extent (0) != lclNumRows+1, std::logic_error, - "With StaticProfile, row offsets array has length " - << k_ptrs.extent (0) << " != (lclNumRows+1) = " - << (lclNumRows+1) << "."); const size_t lclTotalNumEntries = this->staticGraph_->rowPtrsUnpacked_host_(lclNumRows); @@ -1353,22 +1387,16 @@ namespace Tpetra { typedef decltype (myGraph_->k_numRowEntries_) row_entries_type; - // StaticProfile means that the matrix's column indices and - // values are currently stored in a 1-D format, with row offsets - // in rowPtrsUnpacked_ and local column indices in lclIndsUnpacked_wdv. - - // StaticProfile also means that the graph's array of row - // offsets must already be allocated. typename Graph::local_graph_device_type::row_map_type curRowOffsets = myGraph_->rowPtrsUnpacked_dev_; if (debug) { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (curRowOffsets.extent (0) == 0, std::logic_error, - "(StaticProfile branch) curRowOffsets.extent(0) == 0."); + "curRowOffsets.extent(0) == 0."); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (curRowOffsets.extent (0) != lclNumRows + 1, std::logic_error, - "(StaticProfile branch) curRowOffsets.extent(0) = " + "curRowOffsets.extent(0) = " << curRowOffsets.extent (0) << " != lclNumRows + 1 = " << (lclNumRows + 1) << "."); const size_t numOffsets = curRowOffsets.extent (0); @@ -1376,7 +1404,7 @@ namespace Tpetra { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (numOffsets != 0 && myGraph_->lclIndsUnpacked_wdv.extent (0) != valToCheck, - std::logic_error, "(StaticProfile branch) numOffsets = " << + std::logic_error, "numOffsets = " << numOffsets << " != 0 and myGraph_->lclIndsUnpacked_wdv.extent(0) = " << myGraph_->lclIndsUnpacked_wdv.extent (0) << " != curRowOffsets(" << numOffsets << ") = " << valToCheck << "."); @@ -1403,7 +1431,7 @@ namespace Tpetra { // The matrix's current 1-D storage is "unpacked." This means // the row offsets may differ from what the final row offsets // should be. This could happen, for example, if the user - // specified StaticProfile in the constructor and set an upper + // set an upper // bound on the number of entries per row, but didn't fill all // those entries. if (debug && curRowOffsets.extent (0) != 0) { @@ -1413,14 +1441,14 @@ namespace Tpetra { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (static_cast (valToCheck) != static_cast (valuesUnpacked_wdv.extent (0)), - std::logic_error, "(StaticProfile unpacked branch) Before " + std::logic_error, "(unpacked branch) Before " "allocating or packing, curRowOffsets(" << (numOffsets-1) << ") = " << valToCheck << " != valuesUnpacked_wdv.extent(0)" " = " << valuesUnpacked_wdv.extent (0) << "."); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (static_cast (valToCheck) != static_cast (myGraph_->lclIndsUnpacked_wdv.extent (0)), - std::logic_error, "(StaticProfile unpacked branch) Before " + std::logic_error, "(unpacked branch) Before " "allocating or packing, curRowOffsets(" << (numOffsets-1) << ") = " << valToCheck << " != myGraph_->lclIndsUnpacked_wdv.extent(0) = " @@ -1461,13 +1489,13 @@ namespace Tpetra { TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (static_cast (k_ptrs.extent (0)) != lclNumRows + 1, std::logic_error, - "(StaticProfile unpacked branch) After packing k_ptrs, " + "(unpacked branch) After packing k_ptrs, " "k_ptrs.extent(0) = " << k_ptrs.extent (0) << " != " "lclNumRows+1 = " << (lclNumRows+1) << "."); const auto valToCheck = getEntryOnHost (k_ptrs, lclNumRows); TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (valToCheck != lclTotalNumEntries, std::logic_error, - "(StaticProfile unpacked branch) After filling k_ptrs, " + "(unpacked branch) After filling k_ptrs, " "k_ptrs(lclNumRows=" << lclNumRows << ") = " << valToCheck << " != total number of entries on the calling process = " << lclTotalNumEntries << "."); @@ -1529,7 +1557,7 @@ namespace Tpetra { range_type (0, lclNumRows), valsPacker); if (debug) { - const char myPrefix[] = "(StaticProfile \"Optimize Storage\"" + const char myPrefix[] = "(\"Optimize Storage\"" "=true branch) After packing, "; TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (k_ptrs.extent (0) == 0, std::logic_error, myPrefix @@ -1574,7 +1602,7 @@ namespace Tpetra { if (debug) { const char myPrefix[] = - "(StaticProfile \"Optimize Storage\"=false branch) "; + "(\"Optimize Storage\"=false branch) "; TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC (myGraph_->rowPtrsUnpacked_dev_.extent (0) == 0, std::logic_error, myPrefix << "myGraph->rowPtrsUnpacked_dev_.extent(0) = 0. This probably means " @@ -1636,13 +1664,9 @@ namespace Tpetra { // The graph has optimized storage when indices are allocated, // myGraph_->k_numRowEntries_ is empty, and there are more than - // zero rows on this process. It's impossible for the graph to - // have dynamic profile (getProfileType() == DynamicProfile) and - // be optimized (isStorageOptimized()). + // zero rows on this process. if (requestOptimizedStorage) { // Free the old, unpacked, unoptimized allocations. - // Change the graph from dynamic to static allocation profile - // Free graph data structures that are only needed for // unpacked 1-D storage. if (verbose) { @@ -1745,12 +1769,12 @@ namespace Tpetra { using row_entries_type = decltype (staticGraph_->k_numRowEntries_); - // StaticProfile means that the matrix's values are currently + // The matrix's values are currently // stored in a 1-D format. However, this format is "unpacked"; // it doesn't necessarily have the same row offsets as indicated // by the ptrs array returned by allocRowPtrs. This could - // happen, for example, if the user specified StaticProfile in - // the constructor and fixed the number of matrix entries in + // happen, for example, if the user + // fixed the number of matrix entries in // each row, but didn't fill all those entries. // // As above, we don't need to keep the "packed" row offsets @@ -2264,8 +2288,8 @@ namespace Tpetra { if (!graph.colMap_.is_null() && graph.isLocallyIndexed()) { // This branch is similar in function to the following branch, but for - // the special case that the target graph is locally indexed (and the - // profile type is StaticProfile). In this case, we cannot simply filter + // the special case that the target graph is locally indexed. + // In this case, we cannot simply filter // out global indices that don't exist on the receiving process and // insert the remaining (global) indices, but we must convert them (the // remaining global indices) to local and call `insertLocalValues`. @@ -4496,7 +4520,6 @@ CrsMatrix:: // return exclude that case. RCP nonlocalRowMap; - // Keep this for CrsGraph's constructor, so we can use StaticProfile. Teuchos::Array numEntPerNonlocalRow (myNumNonlocalRows); { Teuchos::Array myNonlocalGblRows (myNumNonlocalRows); @@ -4551,7 +4574,7 @@ CrsMatrix:: // 3. Use the values and column indices for each nonlocal row, as // stored in nonlocals_, to construct a CrsMatrix corresponding - // to nonlocal rows. We may use StaticProfile, since we have + // to nonlocal rows. We have // exact counts of the number of entries in each nonlocal row. if (verbose) { @@ -4560,8 +4583,7 @@ CrsMatrix:: std::cerr << os.str(); } RCP nonlocalMatrix = - rcp (new crs_matrix_type (nonlocalRowMap, numEntPerNonlocalRow (), - StaticProfile)); + rcp (new crs_matrix_type (nonlocalRowMap, numEntPerNonlocalRow ())); { size_type curPos = 0; for (auto mapIter = nonlocals_.begin (); mapIter != nonlocals_.end (); @@ -7927,8 +7949,7 @@ CrsMatrix:: // If A and B's row Maps are the same, we can compute an upper // bound on the number of entries in each row of C, before // actually computing the sum. A reasonable upper bound is the - // sum of the two entry counts in each row. If we choose this as - // the actual per-row upper bound, we can use static profile. + // sum of the two entry counts in each row. if (A_rowMap->isSameAs (*B_rowMap)) { const LO localNumRows = static_cast (A_rowMap->getNodeNumElements ()); Array C_maxNumEntriesPerRow (localNumRows, 0); @@ -7949,11 +7970,10 @@ CrsMatrix:: } // Construct the result matrix C. if (constructorSublist.is_null ()) { - C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow (), - StaticProfile)); + C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow ())); } else { C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow (), - StaticProfile, constructorSublist)); + constructorSublist)); } // Since A and B have the same row Maps, we could add them // together all at once and merge values before we call @@ -8332,7 +8352,7 @@ CrsMatrix:: // If the user gave us a null destMat, then construct the new // destination matrix. We will replace its column Map later. if (destMat.is_null ()) { - destMat = rcp (new this_type (MyRowMap, 0, StaticProfile, matrixparams)); + destMat = rcp (new this_type (MyRowMap, 0, matrixparams)); } /***************************************************/ diff --git a/packages/tpetra/core/src/Tpetra_FECrsGraph_def.hpp b/packages/tpetra/core/src/Tpetra_FECrsGraph_def.hpp index fce1ddc2cbfd..4869ead9cb68 100644 --- a/packages/tpetra/core/src/Tpetra_FECrsGraph_def.hpp +++ b/packages/tpetra/core/src/Tpetra_FECrsGraph_def.hpp @@ -78,7 +78,7 @@ FECrsGraph(const Teuchos::RCP & ownedRowMap, const Teuchos::RCP & ownedDomainMap, const Teuchos::RCP & ownedRangeMap, const Teuchos::RCP& params): - crs_graph_type(ownedPlusSharedRowMap, maxNumEntriesPerRow, StaticProfile, params), + crs_graph_type(ownedPlusSharedRowMap, maxNumEntriesPerRow, params), ownedRowsImporter_(ownedPlusSharedToOwnedimporter), ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap), ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) @@ -114,7 +114,7 @@ FECrsGraph (const Teuchos::RCP & ownedRowMap, const Teuchos::RCP & ownedDomainMap, const Teuchos::RCP & ownedRangeMap, const Teuchos::RCP& params): - crs_graph_type( ownedPlusSharedRowMap, numEntPerRow, StaticProfile, params), + crs_graph_type( ownedPlusSharedRowMap, numEntPerRow, params), ownedRowsImporter_(ownedPlusSharedToOwnedimporter), ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap), ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) @@ -152,7 +152,7 @@ FECrsGraph(const Teuchos::RCP & ownedRowMap, const Teuchos::RCP & ownedDomainMap, const Teuchos::RCP & ownedRangeMap, const Teuchos::RCP& params): - crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap,maxNumEntriesPerRow, StaticProfile, params), + crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap,maxNumEntriesPerRow, params), ownedRowsImporter_(ownedPlusSharedToOwnedimporter), ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap), ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) @@ -189,7 +189,7 @@ FECrsGraph (const Teuchos::RCP & ownedRowMap, const Teuchos::RCP & ownedDomainMap, const Teuchos::RCP & ownedRangeMap, const Teuchos::RCP& params): - crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap, numEntPerRow, StaticProfile, params), + crs_graph_type(ownedPlusSharedRowMap, ownedPlusSharedColMap, numEntPerRow, params), ownedRowsImporter_(ownedPlusSharedToOwnedimporter), ownedDomainMap_(ownedDomainMap.is_null() ? ownedRowMap : ownedDomainMap), ownedRangeMap_(ownedRangeMap.is_null() ? ownedRowMap : ownedRangeMap) diff --git a/packages/tpetra/core/src/Tpetra_RowMatrix_def.hpp b/packages/tpetra/core/src/Tpetra_RowMatrix_def.hpp index ad4f52c71ed1..40a7e0eec4e6 100644 --- a/packages/tpetra/core/src/Tpetra_RowMatrix_def.hpp +++ b/packages/tpetra/core/src/Tpetra_RowMatrix_def.hpp @@ -201,11 +201,10 @@ namespace Tpetra { } // Construct the result matrix C. if (constructorSublist.is_null ()) { - C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow (), - StaticProfile)); + C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow ())); } else { C = rcp (new crs_matrix_type (C_rowMap, C_maxNumEntriesPerRow (), - StaticProfile, constructorSublist)); + constructorSublist)); } // Since A and B have the same row Maps, we could add them // together all at once and merge values before we call diff --git a/packages/tpetra/core/test/Block/BlockCrsMatrix.cpp b/packages/tpetra/core/test/Block/BlockCrsMatrix.cpp index 3f2857822cce..e33f75f88ef5 100644 --- a/packages/tpetra/core/test/Block/BlockCrsMatrix.cpp +++ b/packages/tpetra/core/test/Block/BlockCrsMatrix.cpp @@ -99,7 +99,7 @@ namespace { // We just want to check that the constructors of BlockCrsMatrix // work. out << "Creating mesh graph" << endl; - graph_type graph (meshRowMapPtr, 0, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, 0); graph.fillComplete (); // Test the default constructor. We can't wrap this in a @@ -205,7 +205,7 @@ namespace { out << "Creating mesh graph" << endl; const size_t maxNumEntPerRow = 2; - graph_type graph (meshRowMapPtr, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, maxNumEntPerRow); // Fill the graph. gids_type gblColInds ("gblColIds",maxNumEntPerRow); @@ -911,7 +911,7 @@ namespace { out << "Creating mesh graph" << endl; const size_t maxNumEntPerRow = 2; - graph_type graph (meshRowMapPtr, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, maxNumEntPerRow); // Fill the graph. Teuchos::Array gblColInds (maxNumEntPerRow); @@ -1043,7 +1043,7 @@ namespace { out << "Creating mesh graph" << endl; const size_t maxNumEntPerRow = 2; - graph_type graph (meshRowMapPtr, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, maxNumEntPerRow); // Fill the graph. Teuchos::Array gblColInds (maxNumEntPerRow); @@ -1276,7 +1276,7 @@ namespace { // Make a graph. It happens to have two entries per row. out << "Creating mesh graph" << endl; - graph_type graph (meshRowMapPtr, 2, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, 2); if (meshRowMapPtr->getNodeNumElements () > 0) { const GO myMinGblRow = meshRowMapPtr->getMinGlobalIndex (); @@ -1401,7 +1401,7 @@ namespace { // Make a graph. It happens to have two entries per row. out << "Creating mesh graph" << endl; - graph_type graph (meshRowMapPtr, 2, Tpetra::StaticProfile); + graph_type graph (meshRowMapPtr, 2); if (meshRowMapPtr->getNodeNumElements () > 0) { const GO myMinGblRow = meshRowMapPtr->getMinGlobalIndex (); @@ -1584,7 +1584,7 @@ namespace { out << "Create graph with overlapping mesh row Map" << endl; // Make a graph. It happens to have two entries per row. - graph_type overlapGraph (overlapMeshRowMapPtr, 2, Tpetra::StaticProfile); + graph_type overlapGraph (overlapMeshRowMapPtr, 2); if (overlapMeshRowMapPtr->getNodeNumElements () > 0) { const GO myMinGblRow = overlapMeshRowMapPtr->getMinGlobalIndex (); const GO myMaxGblRow = overlapMeshRowMapPtr->getMaxGlobalIndex (); @@ -1618,7 +1618,7 @@ namespace { RCP graph; try { out << "Create empty graph with nonoverlapping mesh row Map" << endl; - graph = rcp (new graph_type (meshRowMapPtr, 0, Tpetra::StaticProfile)); + graph = rcp (new graph_type (meshRowMapPtr, 0)); out << "Create Export from overlap to nonoverlap mesh row Map" << endl; theExport = rcp (new export_type (overlapMeshRowMapPtr, meshRowMapPtr)); diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_Issue601.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_Issue601.cpp index b640b3b65f38..99a4654670b0 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_Issue601.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_Issue601.cpp @@ -97,11 +97,9 @@ namespace { // (anonymous) RCP rowMap = rcp (new map_type (INV, myGblRowInds (), indexBase, comm)); - const Tpetra::ProfileType profileTypes[1] = {Tpetra::StaticProfile}; bool insertLocalEntryValues[] = { true, false }; - // Test both dynamic and static profile. - for (Tpetra::ProfileType profileType : profileTypes) { + { Teuchos::OSTab tab2 (out); @@ -116,7 +114,7 @@ namespace { // (anonymous) Teuchos::OSTab tab3 (out); const size_t maxNumEntPerRow = static_cast (insertLocalEntry ? 2 : 1); - crs_graph_type G (rowMap, maxNumEntPerRow, profileType); + crs_graph_type G (rowMap, maxNumEntPerRow); const GO gblRow0 = static_cast (myRank); const GO gblRow1 = static_cast ((myRank + 1) % numProcs); @@ -211,7 +209,7 @@ namespace { // (anonymous) return; } } // insertLocalEntry - } // profileType + } } // diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_ReindexColumns.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_ReindexColumns.cpp index a678a86ef8cf..21c24c927816 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_ReindexColumns.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_ReindexColumns.cpp @@ -102,7 +102,7 @@ namespace { "to be contiguous, but is not."); const size_t maxNumEntPerRow = 3; - graph_type graph (rowMap, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (rowMap, maxNumEntPerRow); // Make the usual tridiagonal graph. Let the graph create its own // column Map. We'll use that column Map to create a new column @@ -561,7 +561,7 @@ namespace { "to be contiguous, but is not."); const size_t maxNumEntPerRow = 3; - graph_type graph (rowMap, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (rowMap, maxNumEntPerRow); // Make the usual tridiagonal graph. Let the graph create its own // column Map. We'll use that column Map to create a new column diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_StaticImportExport.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_StaticImportExport.cpp index 6591bf3fc383..496a84561aa1 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_StaticImportExport.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_StaticImportExport.cpp @@ -81,7 +81,7 @@ generate_crs_graph(const RCP>& map) using graph_type = Tpetra::CrsGraph; // Create a Tpetra::Matrix using the Map, with dynamic allocation. - auto A = rcp(new graph_type(map, 3, Tpetra::StaticProfile)); + auto A = rcp(new graph_type(map, 3)); // const size_t numMyElements = map->getNodeNumElements (); // The list of global elements owned by this MPI process. @@ -157,7 +157,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(CrsGraph, ImportToStaticGraph, LO, GO, NT) Tpetra::Details::Behavior::enable_verbose_behavior(); // Make a new sparse graph whose row map is the global Map. out << prefix << "Creating empty graph from global map.\n"; - B = rcp(new graph_type(global_map, 0, Tpetra::StaticProfile)); + B = rcp(new graph_type(global_map, 0)); out << prefix << "Empty graph from global map created.\n"; // Redistribute the data, NOT in place, from graph A (which lives @@ -259,7 +259,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(CrsGraph, ImportToStaticGraphLocal, LO, GO, NT Tpetra::Details::Behavior::enable_verbose_behavior(); // Make a new sparse graph whose row map is the global Map. out << prefix << "Creating empty graph from proc 0 map.\n"; - auto B = graph_type(proc_zero_map, 0, Tpetra::StaticProfile); + auto B = graph_type(proc_zero_map, 0); out << prefix << "Empty graph from proc 0 map created.\n"; // Redistribute the data, NOT in place, from graph A (which lives @@ -276,12 +276,12 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(CrsGraph, ImportToStaticGraphLocal, LO, GO, NT using export_type = Tpetra::Export; export_type exporter1(proc_zero_map, global_map); comm->barrier(); - auto B = graph_type(global_map, 0, Tpetra::StaticProfile); + auto B = graph_type(global_map, 0); B.doExport(*A, exporter1, Tpetra::INSERT); B.fillComplete(); export_type exporter2(global_map, global_map); - auto C = graph_type(global_map, 0, Tpetra::StaticProfile); + auto C = graph_type(global_map, 0); C.doExport(B, exporter2, Tpetra::INSERT); C.fillComplete(); } diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests0.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests0.cpp index f769d3387e06..303e27bc4188 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests0.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests0.cpp @@ -45,8 +45,6 @@ namespace { // (anonymous) - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Tpetra::TestingUtilities::arcp_from_view; using Teuchos::arcp; using Teuchos::arcpClone; @@ -237,7 +235,7 @@ namespace { // (anonymous) // send in a parameterlist, check the defaults RCP params = parameterList(); // create static-profile graph, fill-complete without inserting (and therefore, without allocating) - GRPH graph (map, 3, StaticProfile); + GRPH graph (map, 3); for (GO i = map->getMinGlobalIndex(); i <= map->getMaxGlobalIndex(); ++i) { graph.insertGlobalIndices (i, tuple (i)); } @@ -252,7 +250,6 @@ namespace { // (anonymous) graph.fillComplete(params); TEST_EQUALITY_CONST(params->get("Optimize Storage"), true); TEST_EQUALITY(graph.getNodeNumEntries(), 0); - TEST_EQUALITY_CONST(graph.getProfileType(), StaticProfile); TEST_EQUALITY_CONST(graph.isStorageOptimized(), true); int lclSuccess = success ? 1 : 0; @@ -358,9 +355,8 @@ namespace { // (anonymous) RCP params = parameterList(); for (int T=0; T<4; ++T) { if ( (T & 1) != 1 ) continue; - ProfileType pftype = StaticProfile; params->set("Optimize Storage",((T & 2) == 2)); - GRAPH trigraph(rmap,cmap, ginds.size(),pftype); // only allocate as much room as necessary + GRAPH trigraph(rmap,cmap, ginds.size()); // only allocate as much room as necessary size_t numindices; { @@ -380,12 +376,10 @@ namespace { // (anonymous) trigraph.insertGlobalIndices(myrowind,ginds(j,1)); } TEST_EQUALITY( trigraph.getNumEntriesInLocalRow(0), trigraph.getNumAllocatedEntriesInLocalRow(0) ); // test that we only allocated as much room as necessary - // If StaticProfile, then attempt to insert one additional entry + // Attempt to insert one additional entry // in my row that is not already in the row, and verify that it // throws an exception. - if (pftype == StaticProfile) { - TEST_THROW( trigraph.insertGlobalIndices(myrowind,tuple(myrowind+2)), std::runtime_error ); - } + TEST_THROW( trigraph.insertGlobalIndices(myrowind,tuple(myrowind+2)), std::runtime_error ); trigraph.fillComplete(params); // check that inserting global entries throws (inserting local entries is still allowed) { @@ -433,7 +427,7 @@ namespace { // (anonymous) // add too many entries to a static graph // let node i contribute to row i+1, where node the last node contributes to row 0 - GRAPH diaggraph(map,1,StaticProfile); + GRAPH diaggraph(map,1); GO grow = myRank; Array colinds(1); colinds[0] = grow; @@ -625,13 +619,12 @@ namespace { // (anonymous) for (int T=0; T<4; ++T) { if ( (T & 1) != 1 ) continue; - ProfileType pftype = StaticProfile; RCP params = parameterList (); params->set("Optimize Storage",((T & 2) == 2)); // create a diagonal graph, but where only my middle row has an entry ArrayRCP toalloc = arcpClone( tuple(0,1,0) ); - GRAPH ddgraph(map, toalloc (), pftype); + GRAPH ddgraph(map, toalloc ()); ddgraph.insertGlobalIndices(mymiddle, tuple(mymiddle)); { // before globalAssemble(), there should be one local entry on middle, none on the others @@ -640,11 +633,9 @@ namespace { // (anonymous) ddgraph.getGlobalRowView(mymiddle ,myrow_gbl); TEST_COMPARE_ARRAYS( myrow_gbl, tuple(mymiddle) ); ddgraph.getGlobalRowView(mymiddle+1,myrow_gbl); TEST_EQUALITY( myrow_gbl.size(), 0 ); } - if (pftype == StaticProfile) { // no room for more, on any row - TEST_THROW( ddgraph.insertGlobalIndices(mymiddle-1,tuple(mymiddle+1)), std::runtime_error ); - TEST_THROW( ddgraph.insertGlobalIndices(mymiddle ,tuple(mymiddle+1)), std::runtime_error ); - TEST_THROW( ddgraph.insertGlobalIndices(mymiddle+1,tuple(mymiddle+1)), std::runtime_error ); - } + TEST_THROW( ddgraph.insertGlobalIndices(mymiddle-1,tuple(mymiddle+1)), std::runtime_error ); + TEST_THROW( ddgraph.insertGlobalIndices(mymiddle ,tuple(mymiddle+1)), std::runtime_error ); + TEST_THROW( ddgraph.insertGlobalIndices(mymiddle+1,tuple(mymiddle+1)), std::runtime_error ); ddgraph.fillComplete(params); // after fillComplete(), there should be a single entry on my middle, corresponding to the diagonal, none on the others { @@ -693,8 +684,7 @@ namespace { // (anonymous) Teuchos::OSTab tab1 (out); - const Tpetra::ProfileType profileTypes[1] = {Tpetra::StaticProfile}; - for (ProfileType pftype : profileTypes) { + { Teuchos::OSTab tab2 (out); for (bool optimizeStorage : {false, true}) { out << "Optimize Storage: " << (optimizeStorage ? "true" : "false") @@ -713,7 +703,7 @@ namespace { // (anonymous) // contributed by a single off-node contribution, no // filtering. let node i contribute to row i+1, where node // the last node contributes to row 0 - GRAPH diaggraph (map, 1, pftype); + GRAPH diaggraph (map, 1); GO grow = myRank+1; if (as (grow) == numProcs) { grow = 0; @@ -735,11 +725,11 @@ namespace { // (anonymous) TEST_COMPARE_ARRAYS( myrow_gbl, tuple (myrowind) ); } - if (pftype == StaticProfile) { // no room for more + { // no room for more out << "Attempt to insert global column index " << (myrowind+1) << " into global row " << myrowind << "; it should throw, because the graph" - << " is StaticProfile, has an upper bound of one entry " + << " has an upper bound of one entry " << "per row, and already has a different column index " << grow << " in this row." << endl; @@ -780,7 +770,7 @@ namespace { // (anonymous) // contributions for column i of the graph: (i-1,i), (i,i), // (i+1,i). allocate only as much space as we need. some // hacking here to support this test when numProcs == 1 or 2 - GRAPH ngraph(map,3,pftype); + GRAPH ngraph(map,3); Array grows(3); grows[0] = (numProcs+myRank-1) % numProcs; // my left neighbor grows[1] = (numProcs+myRank ) % numProcs; // myself @@ -795,8 +785,8 @@ namespace { // (anonymous) out << "Calling globalAssemble()" << endl; ngraph.globalAssemble(); TEST_EQUALITY( ngraph.getNumEntriesInLocalRow(0), - ( numProcs == 1 && pftype == StaticProfile ? 1 : - ngraph.getNumAllocatedEntriesInLocalRow(0) )); + (numProcs == 1 ? 1 + : ngraph.getNumAllocatedEntriesInLocalRow(0) )); out << "Calling fillComplete(params)" << endl; ngraph.fillComplete (params); @@ -843,7 +833,7 @@ namespace { // (anonymous) STD_TESTS(ngraph); } } // optimizeStorage - } // pftype + } // All procs fail if any node fails int globalSuccess_int = -1; diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests1.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests1.cpp index 34ff87cfdcac..a898894b59ba 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests1.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests1.cpp @@ -46,8 +46,6 @@ namespace { // (anonymous) using Tpetra::TestingUtilities::getDefaultComm; - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Teuchos::arcp; using Teuchos::arcpClone; using Teuchos::Array; @@ -131,7 +129,7 @@ namespace { // (anonymous) { // create static-profile graph, fill-complete without inserting // (and therefore, without allocating) - GRAPH graph(map,1,StaticProfile); + GRAPH graph(map,1); graph.fillComplete(); } @@ -342,7 +340,7 @@ namespace { // (anonymous) RCP cmap = rcp (new map_type (INVALID, numLocal, 0, comm)); // must allocate enough for all submitted indices. - RCP G = rcp(new GRAPH(rmap,cmap,2,StaticProfile) ); + RCP G = rcp(new GRAPH(rmap,cmap,2) ); TEST_EQUALITY_CONST( G->hasColMap(), true ); const GO myrowind = rmap->getGlobalElement(0); @@ -389,7 +387,7 @@ namespace { // (anonymous) // create Map RCP map = rcp (new map_type (INVALID, 3, 0, comm)); { - GRAPH graph(map,1,StaticProfile); + GRAPH graph(map,1); // test labeling const std::string lbl("graphA"); std::string desc1 = graph.description(); @@ -400,7 +398,7 @@ namespace { // (anonymous) TEST_EQUALITY( graph.getObjectLabel(), lbl ); } { - GRAPH graph(map,1,StaticProfile); + GRAPH graph(map,1); // test describing at different verbosity levels if (myRank==0) out << "Describing with verbosity VERB_DEFAULT..." << endl; graph.describe(out); @@ -546,7 +544,7 @@ namespace { // (anonymous) colind[0] = Teuchos::as(0); colind[1] = Teuchos::as(1); - RCP G = rcp(new GRAPH(rmap,rmap,0,StaticProfile) ); + RCP G = rcp(new GRAPH(rmap,rmap,0) ); TEST_NOTHROW( G->setAllIndices(rowptr,colind) ); TEST_EQUALITY_CONST( G->hasColMap(), true ); @@ -571,7 +569,7 @@ namespace { // (anonymous) const size_t num_local = 1; RCP row_map = rcp(new map_type(Invalid, num_local, 0, comm)); - RCP G = rcp(new graph_type(row_map, 1, StaticProfile)); + RCP G = rcp(new graph_type(row_map, 1)); auto row = row_map->getGlobalElement(0); G->insertGlobalIndices(row, tuple(row, row, row, row)); G->insertGlobalIndices(row, tuple(row, row, row, row)); @@ -609,7 +607,7 @@ namespace { // (anonymous) colind[0] = Teuchos::as(0); colind[1] = Teuchos::as(1); - RCP G = rcp(new GRAPH(rmap,cmap,0,StaticProfile) ); + RCP G = rcp(new GRAPH(rmap,cmap,0) ); TEST_NOTHROW( G->setAllIndices(rowptr,colind) ); TEST_EQUALITY_CONST( G->hasColMap(), true ); diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests_Swap.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests_Swap.cpp index 80670e054fd5..26967669045a 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests_Swap.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnitTests_Swap.cpp @@ -341,7 +341,7 @@ class crsGraph_Swap_Tester } } - RCP output_graph(new graph_type(row_map, num_ent_per_row (), Tpetra::StaticProfile)); + RCP output_graph(new graph_type(row_map, num_ent_per_row ())); for(auto& r: gbl_rows) { @@ -412,7 +412,6 @@ using Teuchos::VERB_HIGH; using Teuchos::VERB_LOW; using Teuchos::VERB_MEDIUM; using Teuchos::VERB_NONE; -using Tpetra::StaticProfile; using Tpetra::TestingUtilities::getDefaultComm; typedef Tpetra::global_size_t GST; diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnpackIntoStaticGraph.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnpackIntoStaticGraph.cpp index c45620c22e2e..714d659b5902 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_UnpackIntoStaticGraph.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_UnpackIntoStaticGraph.cpp @@ -97,7 +97,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(CrsGraph, PackThenUnpackAndCombine, LO, GO, NT auto num_loc_rows = static_cast(4); const auto num_gbl_rows = Tpetra::global_size_t(num_loc_rows*comm->getSize()); auto map1 = rcp(new map_type(num_gbl_rows, 0, comm)); - auto A = rcp(new graph_type(map1, 1, Tpetra::StaticProfile)); + auto A = rcp(new graph_type(map1, 1)); for (LO loc_row=0; loc_rowgetGlobalElement(loc_row); A->insertGlobalIndices(gbl_row, tuple(gbl_row)); @@ -105,7 +105,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL(CrsGraph, PackThenUnpackAndCombine, LO, GO, NT // Off diagonal graph with half-bandwidth=1 and no diagonal entries out << "Building second graph" << endl; - auto B = rcp(new graph_type(map1, 2)); // could use StaticProfile + auto B = rcp(new graph_type(map1, 2)); for (LO loc_row=0; loc_rowgetGlobalElement(loc_row); // B[0,0:1] = [-, 1] diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_getNumDiags.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_getNumDiags.cpp index 65d92b9de9a4..49dbd6df8267 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_getNumDiags.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_getNumDiags.cpp @@ -90,7 +90,7 @@ namespace { // (anonymous) const GO actualLocalNumDiags = lclNumRows; const GO actualGlobalNumDiags = gblNumRows; - crs_graph_type graph (rowMap, 1, Tpetra::StaticProfile); + crs_graph_type graph (rowMap, 1); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { const GO gblRow = rowMap->getGlobalElement (lclRow); const GO gblCol = gblRow; @@ -131,7 +131,7 @@ namespace { // (anonymous) const GO actualGlobalNumDiags = gblNumRows; RCP colMap = rowMap; - crs_graph_type graph (rowMap, colMap, 1, Tpetra::StaticProfile); + crs_graph_type graph (rowMap, colMap, 1); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { const LO lclCol = lclRow; graph.insertLocalIndices (lclRow, 1, &lclCol); @@ -187,7 +187,7 @@ namespace { // (anonymous) gblColInds.size (), indexBase, comm)); } - crs_graph_type graph (rowMap, colMap, 1, Tpetra::StaticProfile); + crs_graph_type graph (rowMap, colMap, 1); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { // Not actually a diagonal entry, since the global indices differ. const LO lclCol = lclRow; diff --git a/packages/tpetra/core/test/CrsGraph/CrsGraph_insertGlobalIndicesFiltered.cpp b/packages/tpetra/core/test/CrsGraph/CrsGraph_insertGlobalIndicesFiltered.cpp index f569d81bb624..502b8f14e525 100644 --- a/packages/tpetra/core/test/CrsGraph/CrsGraph_insertGlobalIndicesFiltered.cpp +++ b/packages/tpetra/core/test/CrsGraph/CrsGraph_insertGlobalIndicesFiltered.cpp @@ -134,9 +134,8 @@ namespace { // (anonymous) // Buffer for storing output of getGlobalRowCopy. gids_type gblColIndsBuf("gcids",maxNumEntPerRow); - const Tpetra::ProfileType profileTypes[1] = {Tpetra::StaticProfile}; - for (auto profileType_src : profileTypes) { - crs_graph_type graph_src (rowMap_src, maxNumEntPerRow, profileType_src); + { + crs_graph_type graph_src (rowMap_src, maxNumEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { const GO gblRow = rowMap_src->getGlobalElement (lclRow); // Every row of the source graph gets the same column indices. @@ -144,10 +143,10 @@ namespace { // (anonymous) } graph_src.fillComplete (domMap, ranMap); - for (auto profileType_tgt : profileTypes) { + { // Filtering only happens if the target graph has a column // Map, so we must give it a column Map. - crs_graph_type graph_tgt (rowMap_tgt, colMap_tgt, maxNumEntPerRow, profileType_tgt); + crs_graph_type graph_tgt (rowMap_tgt, colMap_tgt, maxNumEntPerRow); // mfh 20 Jul 2017: If we clone this test in order to test // CrsMatrix column index filtering, then we should include @@ -167,8 +166,8 @@ namespace { // (anonymous) } } } - } // for each target graph profile type - } // for each source graph profile type + } + } // Make sure that the test succeeded on all processes. lclSuccess = success ? 1 : 0; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_GetRowCopy.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_GetRowCopy.cpp index 1bd18d60947e..9a8eadb71634 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_GetRowCopy.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_GetRowCopy.cpp @@ -42,7 +42,7 @@ */ // Test Tpetra::CrsMatrix::get{Global,Local}RowCopy for the case where -// the matrix has StaticProfile, but has never yet been made fill +// the matrix has never yet been made fill // complete. #include "Tpetra_TestingUtilities.hpp" @@ -91,7 +91,7 @@ namespace { indexBase, comm)); // Leave room for three locally owned entries per row. // We will only fill in two entries per row. - crs_matrix_type A (rowMap, 3, Tpetra::StaticProfile); + crs_matrix_type A (rowMap, 3); const GO gblNumCols = gblNumRows; out << "Fill the matrix" << endl; @@ -197,7 +197,7 @@ namespace { // Leave room for three locally owned entries per row. // We will only fill in two entries per row. - crs_matrix_type A (rowMap, colMap, 3, Tpetra::StaticProfile); + crs_matrix_type A (rowMap, colMap, 3); out << "Fill the matrix" << endl; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_LeftRightScale.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_LeftRightScale.cpp index a15a944cfb26..602151163ca8 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_LeftRightScale.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_LeftRightScale.cpp @@ -93,8 +93,6 @@ namespace { using Tpetra::createUniformContigMapWithNode; using Tpetra::createVector; using Tpetra::createCrsMatrix; - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Tpetra::OptimizeOption; using Tpetra::GloballyDistributed; using Tpetra::INSERT; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_MultipleFillCompletes.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_MultipleFillCompletes.cpp index 9cfd55d8118f..85a29b48892f 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_MultipleFillCompletes.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_MultipleFillCompletes.cpp @@ -93,7 +93,7 @@ namespace { if (myRank == 0) { cerr << " Create a matrix with room for 2 entries in each row" << endl; } - MAT matrix (map, 2, Tpetra::StaticProfile); // room for two on each row + MAT matrix (map, 2); // room for two on each row if (myRank == 0) { cerr << " Test insertGlobalValues does not throw " diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NodeConversion.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NodeConversion.cpp index 1d2cfb11e317..0cfd5cc8d3c3 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NodeConversion.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NodeConversion.cpp @@ -77,8 +77,6 @@ namespace { using Tpetra::createUniformContigMapWithNode; using Tpetra::createVector; using Tpetra::createCrsMatrix; - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Tpetra::OptimizeOption; using Tpetra::DoOptimizeStorage; using Tpetra::DoNotOptimizeStorage; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalAfterResume.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalAfterResume.cpp index f4c11f8aaec2..19033e3b2b84 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalAfterResume.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalAfterResume.cpp @@ -160,8 +160,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( CrsMatrix, NonlocalAfterResume, LO, GO, Scala //---------------------------------------------------------------------- // put in diagonal, locally //---------------------------------------------------------------------- - Tpetra::ProfileType pftype = Tpetra::StaticProfile; - Tpetra::CrsMatrix matrix(rmap,cmap,3,pftype); + Tpetra::CrsMatrix matrix(rmap,cmap,3); for (GO r=rmap->getMinGlobalIndex(); r <= rmap->getMaxGlobalIndex(); ++r) { matrix.insertGlobalValues(r,tuple(r),tuple(ST::one())); } diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto.cpp index 8e6674b7025b..929510230330 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto.cpp @@ -195,7 +195,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( CrsMatrix, NonlocalSumInto, LocalOrdinalType, RCP graph; { // We have a good upper bound for the number of entries per row, so use static profile. - RCP nonconstGraph (new crs_graph_type (rowMap, 2, Tpetra::StaticProfile)); + RCP nonconstGraph (new crs_graph_type (rowMap, 2)); TEUCHOS_TEST_FOR_EXCEPTION(globalMinRow >= globalMaxRow, std::logic_error, "This test only works if globalMinRow < globalMaxRow."); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto_Ignore.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto_Ignore.cpp index c96d0db780fd..1a6efb01d03b 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto_Ignore.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_NonlocalSumInto_Ignore.cpp @@ -210,7 +210,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( CrsMatrix, NonlocalSumInto_Ignore, LocalOrdin // is in the CrsMatrix_NonlocalSumInto.cpp test) so that there // would actually be room for the incoming entries from remote // calls to sumIntoGlobalValues(). - RCP nonconstGraph (new crs_graph_type (rowMap, 2, Tpetra::StaticProfile)); + RCP nonconstGraph (new crs_graph_type (rowMap, 2)); TEUCHOS_TEST_FOR_EXCEPTION(globalMinRow >= globalMaxRow, std::logic_error, "This test only works if globalMinRow < globalMaxRow."); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReindexColumns.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReindexColumns.cpp index cd82eea8fbfe..64c1aa4da47c 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReindexColumns.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReindexColumns.cpp @@ -102,7 +102,7 @@ namespace { "to be contiguous, but is not."); const size_t maxNumEntPerRow = 3; - graph_type graph (rowMap, maxNumEntPerRow, Tpetra::StaticProfile); + graph_type graph (rowMap, maxNumEntPerRow); // Make the usual tridiagonal graph. Let the graph create its own // column Map. We'll use that column Map to create a new column diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceDomainMapAndImporter.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceDomainMapAndImporter.cpp index 735e41e50c08..eec31e830020 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceDomainMapAndImporter.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceDomainMapAndImporter.cpp @@ -80,8 +80,6 @@ namespace { using Tpetra::global_size_t; using Tpetra::createContigMapWithNode; using Tpetra::createVector; - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Tpetra::OptimizeOption; using Tpetra::DoOptimizeStorage; using Tpetra::DoNotOptimizeStorage; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceRangeMapAndExporter.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceRangeMapAndExporter.cpp index 1496d0deae2c..015a0f65b25b 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceRangeMapAndExporter.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_ReplaceRangeMapAndExporter.cpp @@ -80,8 +80,6 @@ namespace { using Tpetra::global_size_t; using Tpetra::createContigMapWithNode; using Tpetra::createVector; - using Tpetra::ProfileType; - using Tpetra::StaticProfile; using Tpetra::OptimizeOption; using Tpetra::DoOptimizeStorage; using Tpetra::DoNotOptimizeStorage; diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_StaticImportExport.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_StaticImportExport.cpp index fa9639fa2b34..ee7afdc9347f 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_StaticImportExport.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_StaticImportExport.cpp @@ -85,7 +85,7 @@ generate_crs_matrix(const RCP>& map) const SC neg_one = static_cast(-1.0); // Create a Tpetra::Matrix using the Map, with dynamic allocation. - auto A = rcp(new matrix_type(map, 3, Tpetra::StaticProfile)); + auto A = rcp(new matrix_type(map, 3)); // const size_t numMyElements = map->getNodeNumElements (); // The list of global elements owned by this MPI process. @@ -161,7 +161,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, ImportToStaticMatrix, SC, LO, GO, N Tpetra::Details::Behavior::enable_verbose_behavior(); // Make a new sparse matrix whose row map is the global Map. out << prefix << "Creating empty matrix from global map.\n"; - B = rcp(new matrix_type(global_map, 0, Tpetra::StaticProfile)); + B = rcp(new matrix_type(global_map, 0)); out << prefix << "Empty matrix from global map created.\n"; // Redistribute the data, NOT in place, from matrix A (which lives @@ -263,7 +263,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, ImportToStaticMatrixLocal, SC, LO, Tpetra::Details::Behavior::enable_verbose_behavior(); // Make a new sparse matrix whose row map is the global Map. out << prefix << "Creating empty matrix from proc 0 map.\n"; - auto B = matrix_type(proc_zero_map, 0, Tpetra::StaticProfile); + auto B = matrix_type(proc_zero_map, 0); out << prefix << "Empty matrix from proc 0 map created.\n"; // Redistribute the data from matrix A (which lives @@ -280,7 +280,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, ImportToStaticMatrixLocal, SC, LO, export_type exporter1(proc_zero_map, global_map); comm->barrier(); out << prefix << "Creating empty matrix from global map.\n"; - auto B = matrix_type(global_map, 0, Tpetra::StaticProfile); + auto B = matrix_type(global_map, 0); B.doExport(*A, exporter1, Tpetra::INSERT); B.fillComplete(); @@ -288,7 +288,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(CrsMatrix, ImportToStaticMatrixLocal, SC, LO, export_type exporter2(global_map, global_map); comm->barrier(); out << prefix << "Creating another empty matrix from global map.\n"; - auto C = matrix_type(global_map, 0, Tpetra::StaticProfile); + auto C = matrix_type(global_map, 0); out << prefix << "Exporting between global map matrices\n"; C.doExport(B, exporter2, Tpetra::INSERT); C.fillComplete(); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_TransformValues.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_TransformValues.cpp index 53fbac871f5e..5ee1919ce884 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_TransformValues.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_TransformValues.cpp @@ -80,7 +80,7 @@ namespace { // (anonymous) RCP rowMap = rcp (new map_type (gblNumRows, lclNumRows, indexBase, comm)); - crs_matrix_type matrix (rowMap, 1, Tpetra::StaticProfile); + crs_matrix_type matrix (rowMap, 1); out << "Fill matrix by calling insertGlobalValues" << endl; if (rowMap->getNodeNumElements () != 0) { @@ -232,7 +232,7 @@ namespace { // (anonymous) RCP rowMap = rcp (new map_type (gblNumRows, lclNumRows, indexBase, comm)); - crs_matrix_type matrix (rowMap, 1, Tpetra::StaticProfile); + crs_matrix_type matrix (rowMap, 1); out << "Fill matrix by calling insertGlobalValues" << endl; if (rowMap->getNodeNumElements () != 0) { diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests.cpp index 3e3f4119591b..f3146663534a 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests.cpp @@ -114,13 +114,12 @@ namespace { // (anonymous) { RCPMap map = createContigMapWithNode(INVALID,numLocal,comm); MV mv(map,1); - zero = rcp( new MAT(map,0,TPETRA_DEFAULT_PROFILE_TYPE) ); + zero = rcp( new MAT(map,0) ); TEST_THROW(zero->apply(mv,mv), std::runtime_error); # if defined(HAVE_TPETRA_THROW_EFFICIENCY_WARNINGS) // throw exception because we required increased allocation TEST_THROW(zero->insertGlobalValues(map->getMinGlobalIndex(),tuple(0),tuple(ST::one())), std::runtime_error); # endif - TEST_ASSERT( zero->getProfileType() == TPETRA_DEFAULT_PROFILE_TYPE ); zero->fillComplete(); } STD_TESTS((*zero)); @@ -184,11 +183,10 @@ namespace { // (anonymous) GO base = numLocal*myImageID; RCP > eye; { - RCP eye_crs = rcp(new MAT(map,numLocal,TPETRA_DEFAULT_PROFILE_TYPE)); + RCP eye_crs = rcp(new MAT(map,numLocal)); for (size_t i=0; iinsertGlobalValues(base+i,tuple(base+i),tuple(ST::one())); } - TEST_ASSERT( eye_crs->getProfileType() == TPETRA_DEFAULT_PROFILE_TYPE ); eye_crs->fillComplete(); eye = eye_crs; } diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests2.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests2.cpp index ffddcfc6574a..c7357c878a0f 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests2.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests2.cpp @@ -257,14 +257,13 @@ inline void tupleToArray(Array &arr, const tuple &tup) RCP lclmap = createLocalMapWithNode (P, comm); // create the matrix - MAT A(rowmap,P,TPETRA_DEFAULT_PROFILE_TYPE); + MAT A(rowmap,P); for (GO i=0; i(M); ++i) { for (GO j=0; j(P); ++j) { A.insertGlobalValues( M*myImageID+i, tuple(j), tuple(M*myImageID+i + j*M*N) ); } } // call fillComplete() - TEST_EQUALITY_CONST( A.getProfileType() == TPETRA_DEFAULT_PROFILE_TYPE, true ); A.fillComplete(lclmap,rowmap); // build the input multivector X MV X(lclmap,numVecs); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests3.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests3.cpp index e798fbc6da9d..46df4bd9c225 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests3.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests3.cpp @@ -213,7 +213,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) // send in a parameterlist, check the defaults RCP defparams = parameterList(); // create static-profile matrix, fill-complete without inserting (and therefore, without allocating) - MAT matrix(map,1,Tpetra::StaticProfile); + MAT matrix(map,1); matrix.fillComplete(defparams); TEST_EQUALITY_CONST(defparams->get("Optimize Storage"), true); } @@ -222,7 +222,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) // send in a parameterlist, check the defaults RCP defparams = parameterList(); // create static-profile graph, fill-complete without inserting (and therefore, without allocating) - GRPH graph(map,1,Tpetra::StaticProfile); + GRPH graph(map,1); graph.fillComplete(defparams); TEST_EQUALITY_CONST(defparams->get("Optimize Storage"), true); } @@ -265,9 +265,8 @@ inline void tupleToArray(Array &arr, const tuple &tup) RCP params = parameterList(); for (int T=0; T<4; ++T) { if ( (T & 1) != 1 ) continue; - Tpetra::ProfileType pftype = Tpetra::StaticProfile; params->set("Optimize Storage",((T & 2) == 2)); - MAT matrix(rmap,cmap, ginds.size(), pftype); // only allocate as much room as necessary + MAT matrix(rmap,cmap, ginds.size()); // only allocate as much room as necessary RowMatrix &rowmatrix = matrix; typename MAT::nonconst_global_inds_host_view_type GCopy("gids",4); @@ -303,9 +302,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) // checks if an index exists the graph and only inserts if it doesn't. Thus, the // following test needs to be modified to insert another *unique* index and not a // repeat. - if (pftype == Tpetra::StaticProfile) { - TEST_THROW( matrix.insertGlobalValues(myrowind, tuple(myrowind+5), tuple(ST::one())), std::runtime_error ); - } + TEST_THROW( matrix.insertGlobalValues(myrowind, tuple(myrowind+5), tuple(ST::one())), std::runtime_error ); matrix.fillComplete(params); // check for throws and no-throws/values TEST_THROW( matrix.getGlobalRowView(myrowind,CGView,CSView), std::runtime_error ); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests4.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests4.cpp index 900d1f45c782..7052a750ef00 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests4.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests4.cpp @@ -361,8 +361,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) RCP > map = createContigMapWithNode(INVALID,1,comm); const Scalar SZERO = ScalarTraits::zero(); { - Tpetra::ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; - MAT matrix(map,map,1,pftype); + MAT matrix(map,map,1); TEST_EQUALITY_CONST( matrix.isFillActive(), true ); TEST_EQUALITY_CONST( matrix.isFillComplete(), false ); matrix.insertLocalValues( 0, tuple(0), tuple(0) ); @@ -395,8 +394,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) TEST_THROW( matrix.fillComplete(), std::runtime_error ); } { - Tpetra::ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; - MAT matrix(map,map,1,pftype); + MAT matrix(map,map,1); TEST_EQUALITY_CONST( matrix.isFillActive(), true ); TEST_EQUALITY_CONST( matrix.isFillComplete(), false ); matrix.insertLocalValues( 0, tuple(0), tuple(0) ); @@ -605,8 +603,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) auto map = createContigMapWithNode (INVALID, 1, comm); // construct matrix - Tpetra::ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; - CrsMatrix A (map, map, 1, pftype); + CrsMatrix A (map, map, 1); A.insertLocalValues (0, tuple (0), tuple (STS::zero ())); A.fillComplete (map, map); diff --git a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests_Swap.cpp b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests_Swap.cpp index f961cb8d1ffc..2b1294a95686 100644 --- a/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests_Swap.cpp +++ b/packages/tpetra/core/test/CrsMatrix/CrsMatrix_UnitTests_Swap.cpp @@ -410,7 +410,7 @@ class crsMatrix_Swap_Tester } } - RCP output_graph(new graph_type(row_map, num_ent_per_row (), Tpetra::StaticProfile)); + RCP output_graph(new graph_type(row_map, num_ent_per_row ())); for(auto& r: gbl_rows) { diff --git a/packages/tpetra/core/test/CrsMatrix/Equilibration.cpp b/packages/tpetra/core/test/CrsMatrix/Equilibration.cpp index cdcba5905354..3769504a1def 100644 --- a/packages/tpetra/core/test/CrsMatrix/Equilibration.cpp +++ b/packages/tpetra/core/test/CrsMatrix/Equilibration.cpp @@ -978,7 +978,7 @@ makeSymmetricPositiveDefiniteTridiagonalMatrixTest (Teuchos::FancyOStream& out, out << "Create CrsGraph" << endl; const size_t maxNumEntPerRow = 3; RCP G = - rcp (new crs_graph_type (rowMap, maxNumEntPerRow, Tpetra::StaticProfile)); + rcp (new crs_graph_type (rowMap, maxNumEntPerRow)); std::vector globalIndices (maxNumEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { @@ -1333,7 +1333,7 @@ makeMatrixTestWithExplicitZeroDiag (Teuchos::FancyOStream& out, out << "Create CrsGraph" << endl; const size_t maxNumEntPerRow = 1; RCP G = - rcp (new crs_graph_type (rowMap, maxNumEntPerRow, Tpetra::StaticProfile)); + rcp (new crs_graph_type (rowMap, maxNumEntPerRow)); std::vector globalIndices (maxNumEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { @@ -1571,7 +1571,7 @@ makeMatrixTestWithImplicitZeroDiag (Teuchos::FancyOStream& out, out << "Create CrsGraph" << endl; const size_t maxNumEntPerRow = 1; RCP G = - rcp (new crs_graph_type (rowMap, maxNumEntPerRow, Tpetra::StaticProfile)); + rcp (new crs_graph_type (rowMap, maxNumEntPerRow)); // Process 1 gets an implicit zero diagonal entry. std::vector globalIndices (maxNumEntPerRow); @@ -1809,7 +1809,7 @@ makeMatrixTestWithExplicitInfAndNan (Teuchos::FancyOStream& out, out << "Create CrsGraph" << endl; const size_t maxNumEntPerRow = 1; RCP G = - rcp (new crs_graph_type (rowMap, maxNumEntPerRow, Tpetra::StaticProfile)); + rcp (new crs_graph_type (rowMap, maxNumEntPerRow)); std::vector globalIndices (maxNumEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { diff --git a/packages/tpetra/core/test/CrsMatrix/Regression/Albany182.cpp b/packages/tpetra/core/test/CrsMatrix/Regression/Albany182.cpp index a1f52e31a5c8..ef9f17eeae7a 100644 --- a/packages/tpetra/core/test/CrsMatrix/Regression/Albany182.cpp +++ b/packages/tpetra/core/test/CrsMatrix/Regression/Albany182.cpp @@ -1003,15 +1003,14 @@ namespace { // (anonymous) out << "Target matrix is correct!" << endl; } - const Tpetra::ProfileType pftypes[1] = {Tpetra::StaticProfile}; - for (Tpetra::ProfileType profileType : pftypes) { - out << ">>> Target matrix is {StaticProfile, locally indexed}" << endl; + { + out << ">>> Target matrix is locally indexed" << endl; Teuchos::OSTab tab2 (out); const size_t maxNumEntPerRow = 10; // needs to be an upper bound RCP A_nonoverlapping = rcp (new CrsMatrixType (rowMap_nonoverlapping, colMap_expected, - maxNumEntPerRow, profileType)); + maxNumEntPerRow)); export_type exp (A_overlapping.getRowMap (), rowMap_nonoverlapping); A_nonoverlapping->doExport (A_overlapping, exp, Tpetra::ADD); A_nonoverlapping->fillComplete (domMap, ranMap); diff --git a/packages/tpetra/core/test/CrsMatrix/Tpetra_Test_CrsMatrix_WithGraph.hpp b/packages/tpetra/core/test/CrsMatrix/Tpetra_Test_CrsMatrix_WithGraph.hpp index 91aac2dfa621..1a077e9588f2 100644 --- a/packages/tpetra/core/test/CrsMatrix/Tpetra_Test_CrsMatrix_WithGraph.hpp +++ b/packages/tpetra/core/test/CrsMatrix/Tpetra_Test_CrsMatrix_WithGraph.hpp @@ -181,13 +181,13 @@ inline void tupleToArray(Array &arr, const tuple &tup) const size_t numLocal = 10; RCP > map = createContigMapWithNode(INVALID,numLocal,comm); { - Tpetra::CrsGraph diaggraph (map, 1, Tpetra::StaticProfile); + Tpetra::CrsGraph diaggraph (map, 1); // A pre-constructed graph must be fill complete before being used to construct a CrsMatrix TEST_THROW( MAT matrix(rcpFromRef(diaggraph)), std::runtime_error ); } { // create a simple diagonal graph - Tpetra::CrsGraph diaggraph (map, 1, Tpetra::StaticProfile); + Tpetra::CrsGraph diaggraph (map, 1); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { diaggraph.insertGlobalIndices(r,tuple(r)); } @@ -252,7 +252,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { out << "Create tridiagonal CrsGraph with StaticProfile" << endl; - GRPH trigraph (map, 3, Tpetra::StaticProfile); + GRPH trigraph (map, 3); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { if (r == map->getMinAllGlobalIndex()) { trigraph.insertGlobalIndices(r,tuple(r,r+1)); @@ -272,7 +272,6 @@ inline void tupleToArray(Array &arr, const tuple &tup) "and test allowed functionality" << endl; MAT matrix(rcpFromRef(trigraph)); - TEST_EQUALITY_CONST( matrix.getProfileType() == Tpetra::StaticProfile, true ); // insert throws exception: not allowed with static graph TEST_THROW( matrix.insertGlobalValues(map->getMinGlobalIndex(),tuple(map->getMinGlobalIndex()),tuple(ST::one())), std::runtime_error ); // suminto and replace are allowed @@ -321,7 +320,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { out << "Create a diagonal CrsGraph" << endl; - GRPH diaggraph (map, 1, Tpetra::StaticProfile); + GRPH diaggraph (map, 1); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { diaggraph.insertGlobalIndices(r,tuple(r)); } @@ -351,7 +350,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { out << "Create a diagonal CrsGraph" << endl; - GRPH diaggraph (map, 1, Tpetra::StaticProfile); + GRPH diaggraph (map, 1); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { diaggraph.insertGlobalIndices(r,tuple(r)); } @@ -376,7 +375,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { out << "Create a diagonal CrsGraph" << endl; - GRPH diaggraph (map, 1, Tpetra::StaticProfile); + GRPH diaggraph (map, 1); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { diaggraph.insertGlobalIndices(r,tuple(r)); } @@ -432,7 +431,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { out << "Create a diagonal CrsGraph" << endl; - RCP diaggraph = rcp( new GRPH (map, 1, Tpetra::StaticProfile) ); + RCP diaggraph = rcp( new GRPH (map, 1) ); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { diaggraph->insertGlobalIndices(r,tuple(r)); } @@ -489,7 +488,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) // First test: use a constant upper bound (3) on the number of // entries in each row, and insert using global indices. { - MAT bdmat (rmap, cmap, 3, Tpetra::StaticProfile); + MAT bdmat (rmap, cmap, 3); TEST_EQUALITY(bdmat.getRowMap(), rmap); TEST_EQUALITY_CONST(bdmat.hasColMap(), true); TEST_EQUALITY(bdmat.getColMap(), cmap); @@ -534,7 +533,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) { Teuchos::Array nnzperrow (numLocal); std::fill(nnzperrow.begin(), nnzperrow.end(), 3); - MAT bdmat (rmap, cmap, nnzperrow (), Tpetra::StaticProfile); + MAT bdmat (rmap, cmap, nnzperrow ()); TEST_EQUALITY(bdmat.getRowMap(), rmap); TEST_EQUALITY_CONST(bdmat.hasColMap(), true); TEST_EQUALITY(bdmat.getColMap(), cmap); @@ -604,7 +603,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) RCP > map = createContigMapWithNode(INVALID,numLocal,comm); out << "Create a tridiagonal CrsGraph" << endl; - Tpetra::CrsGraph graph (map, 3, Tpetra::StaticProfile); + Tpetra::CrsGraph graph (map, 3); for (GO r=map->getMinGlobalIndex(); r <= map->getMaxGlobalIndex(); ++r) { if (r == map->getMinAllGlobalIndex()) { graph.insertGlobalIndices(r,tuple(r,r+1)); @@ -623,7 +622,6 @@ inline void tupleToArray(Array &arr, const tuple &tup) out << "Create a CrsMatrix using the tridiagonal CrsGraph" << endl; MAT matrix(rcpFromRef(graph)); - TEST_ASSERT( matrix.getProfileType () == Tpetra::StaticProfile ); TEST_ASSERT( matrix.isStaticGraph () ); // Make sure that all processes finished and were successful. @@ -832,7 +830,7 @@ inline void tupleToArray(Array &arr, const tuple &tup) const size_t numLocal = 10; RCP > map = createContigMapWithNode(INVALID,numLocal,comm); { - MAT matrix(map, 1, Tpetra::StaticProfile); + MAT matrix(map, 1); // room for one on each row for (GO r=map->getMinGlobalIndex(); r<=map->getMaxGlobalIndex(); ++r) { diff --git a/packages/tpetra/core/test/CrsMatrix/sumIntoStaticProfileExtraSpace.cpp b/packages/tpetra/core/test/CrsMatrix/sumIntoStaticProfileExtraSpace.cpp index 4ffe85c8a1c7..a202399d2984 100644 --- a/packages/tpetra/core/test/CrsMatrix/sumIntoStaticProfileExtraSpace.cpp +++ b/packages/tpetra/core/test/CrsMatrix/sumIntoStaticProfileExtraSpace.cpp @@ -65,7 +65,7 @@ TEUCHOS_UNIT_TEST( CrsMatrix, sumIntoStaticProfileExtraSpace ) int lclSuccess = 1; int gblSuccess = 0; - out << "CrsMatrix: Test sumIntoLocalValues, StaticProfile, " + out << "CrsMatrix: Test sumIntoLocalValues, " "not yet fill complete, extra space in each row" << endl; Teuchos::OSTab tab1 (out); @@ -83,8 +83,7 @@ TEUCHOS_UNIT_TEST( CrsMatrix, sumIntoStaticProfileExtraSpace ) (new map_type (gblNumInds, lclNumInds, indexBase, comm)); constexpr size_t maxNumEntPerRow = 5; - crs_matrix_type A (rowAndColMap, rowAndColMap, maxNumEntPerRow, - Tpetra::StaticProfile); + crs_matrix_type A (rowAndColMap, rowAndColMap, maxNumEntPerRow); for (LO lclRow = 0; lclRow < lclNumInds; ++lclRow) { const size_t numEnt = A.getNumEntriesInLocalRow (lclRow); diff --git a/packages/tpetra/core/test/Distributor/Issue1752.cpp b/packages/tpetra/core/test/Distributor/Issue1752.cpp index d721a7444656..5c7830e58f57 100644 --- a/packages/tpetra/core/test/Distributor/Issue1752.cpp +++ b/packages/tpetra/core/test/Distributor/Issue1752.cpp @@ -236,7 +236,7 @@ TEUCHOS_UNIT_TEST(Distributor, ReverseDistributeToNonuniformMap) // Create matrix using the unique map out << std::right << std::setfill('*') << std::setw(80) << "Proc " << my_rank << ": Creating matrix with unique map" << endl; - matrix_type unique_mtx(unique_map, 3, Tpetra::StaticProfile); + matrix_type unique_mtx(unique_map, 3); fill_and_complete(unique_mtx); // Sanity check the unique matrix @@ -258,7 +258,7 @@ TEUCHOS_UNIT_TEST(Distributor, ReverseDistributeToNonuniformMap) import_type importer(unique_map, default_map); // Matrix built with default map - matrix_type default_mtx_fwd(default_map, 3, Tpetra::StaticProfile); + matrix_type default_mtx_fwd(default_map, 3); // Do a forward import (an import operation using an Import plan) from the // unique matrix to the default matrix. i.e., communicate entries @@ -285,7 +285,7 @@ TEUCHOS_UNIT_TEST(Distributor, ReverseDistributeToNonuniformMap) } // Matrix built with default map - matrix_type default_mtx_rev(default_map, 3, Tpetra::StaticProfile); + matrix_type default_mtx_rev(default_map, 3); // Do a reverse mode import (an import operation using an Export plan) from the // unique matrix to the default matrix. i.e., communicate entries diff --git a/packages/tpetra/core/test/Distributor/createfromsendsandrecvs.cpp b/packages/tpetra/core/test/Distributor/createfromsendsandrecvs.cpp index cc8da7481de2..944fb53e4153 100644 --- a/packages/tpetra/core/test/Distributor/createfromsendsandrecvs.cpp +++ b/packages/tpetra/core/test/Distributor/createfromsendsandrecvs.cpp @@ -84,8 +84,7 @@ namespace { // (anonymous) const GO gblNumCols = static_cast (rowMap->getGlobalNumElements ()); // Create the graph structure of the sparse matrix. RCP G = - rcp (new graph_type (rowMap, numEntPerRow, - Tpetra::StaticProfile)); + rcp (new graph_type (rowMap, numEntPerRow)); // Fill in the sparse graph. Teuchos::Array gblColInds (numEntPerRow); for (LO lclRow = 0; lclRow < lclNumRows; ++lclRow) { // for each of my rows diff --git a/packages/tpetra/core/test/FECrsGraph/FECrsGraph_UnitTests.cpp b/packages/tpetra/core/test/FECrsGraph/FECrsGraph_UnitTests.cpp index 026ba6db23a0..25afabe022ac 100644 --- a/packages/tpetra/core/test/FECrsGraph/FECrsGraph_UnitTests.cpp +++ b/packages/tpetra/core/test/FECrsGraph/FECrsGraph_UnitTests.cpp @@ -55,7 +55,6 @@ namespace { // (anonymous) using Tpetra::TestingUtilities::getDefaultComm; using Tpetra::createContigMapWithNode; using Tpetra::createNonContigMapWithNode; -using Tpetra::StaticProfile; using Teuchos::RCP; using Teuchos::ArrayRCP; using Teuchos::rcp; @@ -398,7 +397,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Diagonal, LO, GO, Node ) // Trivial test that makes sure a diagonal graph can be built - CG g1(map,1,StaticProfile); + CG g1(map,1); FEG g2(map,map,1); Tpetra::beginAssembly(g2); @@ -430,7 +429,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Diagonal_LocalIndex, LO, GO, Node // Trivial test that makes sure a diagonal graph can be built - CG g1(map,1,StaticProfile); + CG g1(map,1); FEG g2(map,map,map,1); Tpetra::beginAssembly(g2); @@ -466,9 +465,9 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Assemble1D, LO, GO, Node ) //pack.print(comm->getRank(),std::cout); // Comparative assembly - // FIXME: We should be able to get away with 3 for StaticProfile here, but we need 4 since duplicates are + // FIXME: We should be able to get away with 3 here, but we need 4 since duplicates are // not being handled correctly. - CG g1(pack.uniqueMap,4,StaticProfile); + CG g1(pack.uniqueMap,4); FEG g2(pack.uniqueMap,pack.overlapMap,4); g2.beginAssembly(); @@ -509,10 +508,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Assemble1D_LocalIndex, LO, GO, No // pack.print(comm->getRank(),std::cout);fflush(stdout); // Comparative assembly - // FIXME: We should be able to get away with 3 for StaticProfile here, but we need 4 since duplicates are + // FIXME: We should be able to get away with 3 here, but we need 4 since duplicates are // not being handled correctly. - CG g1(pack.uniqueMap,4,StaticProfile); + CG g1(pack.uniqueMap,4); FEG g2(pack.uniqueMap,pack.overlapMap,pack.overlapMap,4); g2.beginAssembly(); @@ -552,8 +551,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Assemble2D_OPSDomain, LO, GO, Nod // Comparative assembly - CG g0(pack.overlapMap,9,StaticProfile); - CG g1(pack.uniqueMap,9,StaticProfile); + CG g0(pack.overlapMap,9); + CG g1(pack.uniqueMap,9); FEG g2(pack.uniqueMap,pack.overlapMap,9); FEG g3(pack.uniqueMap,pack.overlapMap,9,pack.overlapMap); @@ -576,7 +575,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Assemble2D_OPSDomain, LO, GO, Nod Tpetra::Import import(pack.uniqueMap,pack.overlapMap); Teuchos::FancyOStream myout(Teuchos::rcpFromRef(std::cout)); - CG g11(pack.uniqueMap,9,StaticProfile); + CG g11(pack.uniqueMap,9); g11.doExport(g0,import,Tpetra::INSERT); g11.fillComplete(pack.uniqueMap,pack.uniqueMap); success = compare_final_graph_structure(out,g11,g1); @@ -595,7 +594,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_3_DECL( FECrsGraph, Assemble2D_OPSDomain, LO, GO, Nod // a) use overlapMap as domainMap during fillComplete (this will generate the // correct colMap), and b) reset domainMap to be the unique map (so that the // checks in compare_final_graph_structure do not fail b/c of the domain map). - CG g12(pack.uniqueMap,9,StaticProfile); + CG g12(pack.uniqueMap,9); g12.doExport(g0,import,Tpetra::INSERT); g12.fillComplete(pack.overlapMap,pack.uniqueMap); auto importer = g12.getImporter(); diff --git a/packages/tpetra/core/test/FEMultiVector/FEMultiVector_UnitTests.cpp b/packages/tpetra/core/test/FEMultiVector/FEMultiVector_UnitTests.cpp index f1e6ead3d6b8..231b484ea0e6 100644 --- a/packages/tpetra/core/test/FEMultiVector/FEMultiVector_UnitTests.cpp +++ b/packages/tpetra/core/test/FEMultiVector/FEMultiVector_UnitTests.cpp @@ -120,7 +120,7 @@ namespace { // create CrsGraph object RCP > graph = - rcp (new Tpetra::CrsGraph (map, 3, Tpetra::StaticProfile)); + rcp (new Tpetra::CrsGraph (map, 3)); // Create a simple tridiagonal source graph. Array entry(1); diff --git a/packages/tpetra/core/test/ImportExport/ImportExport_ImportConstructExpert.cpp b/packages/tpetra/core/test/ImportExport/ImportExport_ImportConstructExpert.cpp index ea09dc501bf5..94e90a7d8cb7 100644 --- a/packages/tpetra/core/test/ImportExport/ImportExport_ImportConstructExpert.cpp +++ b/packages/tpetra/core/test/ImportExport/ImportExport_ImportConstructExpert.cpp @@ -103,8 +103,7 @@ namespace { const GO gblNumCols = static_cast (rowMap->getGlobalNumElements ()); RCP G = - rcp (new graph_type (rowMap, numEntPerRow, - Tpetra::StaticProfile)); + rcp (new graph_type (rowMap, numEntPerRow)); Teuchos::Array gblColInds (numEntPerRow); for (LO lclRow = 0; lclRow < NumRows; ++lclRow) { diff --git a/packages/tpetra/core/test/ImportExport/UnpackLongRows.cpp b/packages/tpetra/core/test/ImportExport/UnpackLongRows.cpp index 423184a872f2..02fe30109aef 100644 --- a/packages/tpetra/core/test/ImportExport/UnpackLongRows.cpp +++ b/packages/tpetra/core/test/ImportExport/UnpackLongRows.cpp @@ -154,8 +154,8 @@ generate_graphs( shared_map = rcp(new map_type(invalid, indices(), 0, comm)); } - owned = rcp(new graph_type(owned_map, rows_per_rank + dense_rows, Tpetra::StaticProfile)); - shared = rcp(new graph_type(shared_map, rows_per_rank + dense_rows, Tpetra::StaticProfile)); + owned = rcp(new graph_type(owned_map, rows_per_rank + dense_rows)); + shared = rcp(new graph_type(shared_map, rows_per_rank + dense_rows)); { using Teuchos::tuple; diff --git a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp index 7e405fd2609f..4da14baaba68 100644 --- a/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp +++ b/packages/tpetra/core/test/ImportExport2/ImportExport2_UnitTests.cpp @@ -101,7 +101,6 @@ namespace { using Tpetra::INSERT; using Tpetra::Map; using Tpetra::REPLACE; - using Tpetra::StaticProfile; using std::cerr; using std::cout; @@ -255,10 +254,10 @@ namespace { out << "Creating source and target CrsGraphs" << endl; } RCP > src_graph = - rcp (new CrsGraph (src_map, 1, StaticProfile, + rcp (new CrsGraph (src_map, 1, getCrsGraphParameterList ())); RCP > tgt_graph = - rcp (new CrsGraph (tgt_map, 1, StaticProfile, + rcp (new CrsGraph (tgt_map, 1, getCrsGraphParameterList ())); // Create a simple diagonal source graph. @@ -327,10 +326,10 @@ namespace { createContigMap (INVALID, tgt_num_local, comm); RCP > src_graph = - rcp (new CrsGraph (src_map, 24, StaticProfile, + rcp (new CrsGraph (src_map, 24, getCrsGraphParameterList ())); RCP > tgt_graph = - rcp (new CrsGraph (tgt_map, 24, StaticProfile, + rcp (new CrsGraph (tgt_map, 24, getCrsGraphParameterList ())); // This time make src_graph be a full lower-triangular graph. @@ -447,10 +446,10 @@ namespace { // Create CrsMatrix objects. RCP > src_mat = - rcp (new CrsMatrix (src_map, 1, StaticProfile, + rcp (new CrsMatrix (src_map, 1, crsMatPlist)); RCP > tgt_mat = - rcp (new CrsMatrix (tgt_map, 1, StaticProfile, + rcp (new CrsMatrix (tgt_map, 1, crsMatPlist)); // Create a simple diagonal source graph. @@ -604,9 +603,9 @@ namespace { createContigMap (INVALID, tgt_num_local, comm); RCP > src_mat = - rcp (new CrsMatrix (src_map, 24, StaticProfile, crsMatPlist)); + rcp (new CrsMatrix (src_map, 24, crsMatPlist)); RCP > tgt_mat = - rcp (new CrsMatrix (tgt_map, 24, StaticProfile, crsMatPlist)); + rcp (new CrsMatrix (tgt_map, 24, crsMatPlist)); // This time make src_mat a full lower-triangular matrix. Each // row of column-indices will have length 'globalrow', and diff --git a/packages/tpetra/core/test/MatrixMatrix/FECrs_MatrixMatrix_UnitTests.cpp b/packages/tpetra/core/test/MatrixMatrix/FECrs_MatrixMatrix_UnitTests.cpp index f6a9ebf874d7..c1f1268c85c6 100644 --- a/packages/tpetra/core/test/MatrixMatrix/FECrs_MatrixMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/MatrixMatrix/FECrs_MatrixMatrix_UnitTests.cpp @@ -166,7 +166,7 @@ generate_crs_graph (const MeshInfo<4,LO,GO,NT>& mesh) { using CG = Tpetra::CrsGraph; - Teuchos::RCP g(new CG(mesh.uniqueMap,9,Tpetra::StaticProfile)); + Teuchos::RCP g(new CG(mesh.uniqueMap,9)); for (const auto& elem_dofs : mesh.element2node) { for (const GO gid_i : elem_dofs) { for (const GO gid_j : elem_dofs) { @@ -366,8 +366,8 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL (Tpetra_MatMat, FECrsMatrix, SC, LO, GO, NT) auto C_row_map = transA ? feA.getDomainMap() : feA.getRangeMap(); // For the test, use a ridicolously large upper bound for the nnz per row - MAT feC(C_row_map,feA.getGraph()->getGlobalNumEntries(),Tpetra::StaticProfile); - MAT C(C_row_map, A.getGraph()->getGlobalNumEntries(),Tpetra::StaticProfile); + MAT feC(C_row_map,feA.getGraph()->getGlobalNumEntries()); + MAT C(C_row_map, A.getGraph()->getGlobalNumEntries()); Tpetra::MatrixMatrix::Multiply(feA, transA, feB, transB, feC, true, "", params); Tpetra::MatrixMatrix::Multiply( A, transA, B, transB, C, true, "", params); diff --git a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp index 63b13fd6a208..810ca4e1fda2 100644 --- a/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp +++ b/packages/tpetra/core/test/MatrixMatrix/MatrixMatrix_UnitTests.cpp @@ -1137,7 +1137,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_MatMat, operations_test,SC,LO, GO, NT) n += A->getNodeMaxNumRowEntries(); RCP rm = B->getRowMap(); - RCP E = rcp (new Matrix_t(rm, n, Tpetra::StaticProfile)); + RCP E = rcp (new Matrix_t(rm, n)); auto one = Teuchos::ScalarTraits::one(); Tpetra::MatrixMatrix::Add(*B, BT, one, *E, one); diff --git a/packages/tpetra/core/test/RowMatrixTransposer/main.cpp b/packages/tpetra/core/test/RowMatrixTransposer/main.cpp index 63c2cfa6830c..98fab5cf549b 100644 --- a/packages/tpetra/core/test/RowMatrixTransposer/main.cpp +++ b/packages/tpetra/core/test/RowMatrixTransposer/main.cpp @@ -132,8 +132,8 @@ main (int argc, char* argv[]) } // Create a Tpetra::CrsMatrix using the Map, with a static allocation dictated by NumNz - crs_matrix_type A (map, NumNz (), Tpetra::StaticProfile); - crs_matrix_type AT(map, NumNz (), Tpetra::StaticProfile); + crs_matrix_type A (map, NumNz ()); + crs_matrix_type AT(map, NumNz ()); RCP< crs_matrix_type > TestMatrix = Teuchos::null; // We are done with NumNZ diff --git a/packages/tpetra/core/test/TpetraUtils_MatrixGenerator.hpp b/packages/tpetra/core/test/TpetraUtils_MatrixGenerator.hpp index d7117f946d71..df95f274688c 100644 --- a/packages/tpetra/core/test/TpetraUtils_MatrixGenerator.hpp +++ b/packages/tpetra/core/test/TpetraUtils_MatrixGenerator.hpp @@ -265,9 +265,8 @@ namespace Tpetra { // Construct the CrsMatrix, using the row map, with the // constructor specifying the number of nonzeros for each row. - Tpetra::ProfileType pftype = TPETRA_DEFAULT_PROFILE_TYPE; RCP A = - rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow (), pftype)); + rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow ())); // List of the global indices of my rows. // They may or may not be contiguous. @@ -357,7 +356,7 @@ namespace Tpetra { // constructor specifying the number of nonzeros for each row. RCP A = rcp (new sparse_matrix_type (pRowMap, myNumEntriesPerRow, - StaticProfile, constructorParams)); + constructorParams)); // List of the global indices of my rows. // They may or may not be contiguous. @@ -419,9 +418,9 @@ namespace Tpetra { // RCP A; // the matrix to return. if (colMap.is_null ()) { // the user didn't provide a column Map - A = rcp (new sparse_matrix_type (rowMap, myNumEntriesPerRow, StaticProfile)); + A = rcp (new sparse_matrix_type (rowMap, myNumEntriesPerRow)); } else { // the user provided a column Map - A = rcp (new sparse_matrix_type (rowMap, colMap, myNumEntriesPerRow, StaticProfile)); + A = rcp (new sparse_matrix_type (rowMap, colMap, myNumEntriesPerRow)); } // List of the global indices of my rows. diff --git a/packages/xpetra/src/CrsGraph/Xpetra_TpetraCrsGraph_def.hpp b/packages/xpetra/src/CrsGraph/Xpetra_TpetraCrsGraph_def.hpp index 6ca14f192d1d..daaede863359 100644 --- a/packages/xpetra/src/CrsGraph/Xpetra_TpetraCrsGraph_def.hpp +++ b/packages/xpetra/src/CrsGraph/Xpetra_TpetraCrsGraph_def.hpp @@ -63,19 +63,19 @@ namespace Xpetra { template TpetraCrsGraph::TpetraCrsGraph(const RCP< const map_type > &rowMap, size_t maxNumEntriesPerRow, const RCP< ParameterList > ¶ms) -: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), maxNumEntriesPerRow, Tpetra::StaticProfile, params))) { } +: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), maxNumEntriesPerRow, params))) { } template TpetraCrsGraph::TpetraCrsGraph(const RCP< const Map > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const RCP< ParameterList > ¶ms) -: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), NumEntriesPerRowToAlloc(), Tpetra::StaticProfile, params))) { } +: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), NumEntriesPerRowToAlloc(), params))) { } template TpetraCrsGraph::TpetraCrsGraph(const RCP< const Map>&rowMap, const RCP< const Map > &colMap, size_t maxNumEntriesPerRow, const RCP< ParameterList > ¶ms) -: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), maxNumEntriesPerRow, Tpetra::StaticProfile, params))) { } +: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), maxNumEntriesPerRow, params))) { } template TpetraCrsGraph::TpetraCrsGraph(const RCP< const Map > &rowMap, const RCP< const Map > &colMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const RCP< ParameterList > ¶ms) -: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), NumEntriesPerRowToAlloc(), Tpetra::StaticProfile, params))) { } +: graph_(Teuchos::rcp(new Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), NumEntriesPerRowToAlloc(), params))) { } template diff --git a/packages/xpetra/src/CrsMatrix/Xpetra_TpetraCrsMatrix_def.hpp b/packages/xpetra/src/CrsMatrix/Xpetra_TpetraCrsMatrix_def.hpp index 7f47477ca38b..d6353d4f8a57 100644 --- a/packages/xpetra/src/CrsMatrix/Xpetra_TpetraCrsMatrix_def.hpp +++ b/packages/xpetra/src/CrsMatrix/Xpetra_TpetraCrsMatrix_def.hpp @@ -54,19 +54,19 @@ namespace Xpetra { template TpetraCrsMatrix::TpetraCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) - : mtx_ (Teuchos::rcp (new Tpetra::CrsMatrix (toTpetra(rowMap), maxNumEntriesPerRow, Tpetra::StaticProfile, params))) { } + : mtx_ (Teuchos::rcp (new Tpetra::CrsMatrix (toTpetra(rowMap), maxNumEntriesPerRow, params))) { } template TpetraCrsMatrix::TpetraCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) - : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix (toTpetra(rowMap), NumEntriesPerRowToAlloc(), Tpetra::StaticProfile, params))) { } + : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix (toTpetra(rowMap), NumEntriesPerRowToAlloc(), params))) { } template TpetraCrsMatrix::TpetraCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, size_t maxNumEntriesPerRow, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) - : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix(toTpetra(rowMap), toTpetra(colMap), maxNumEntriesPerRow, Tpetra::StaticProfile, params))) { } + : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix(toTpetra(rowMap), toTpetra(colMap), maxNumEntriesPerRow, params))) { } template TpetraCrsMatrix::TpetraCrsMatrix(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &colMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) - : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), NumEntriesPerRowToAlloc(), Tpetra::StaticProfile, params))) { } + : mtx_(Teuchos::rcp(new Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >(toTpetra(rowMap), toTpetra(colMap), NumEntriesPerRowToAlloc(), params))) { } template TpetraCrsMatrix::TpetraCrsMatrix(const Teuchos::RCP< const CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &graph, const Teuchos::RCP< Teuchos::ParameterList > ¶ms) diff --git a/packages/xpetra/sup/Utils/Xpetra_MatrixMatrix.hpp b/packages/xpetra/sup/Utils/Xpetra_MatrixMatrix.hpp index 355c34d6138e..f17cad4ecd70 100644 --- a/packages/xpetra/sup/Utils/Xpetra_MatrixMatrix.hpp +++ b/packages/xpetra/sup/Utils/Xpetra_MatrixMatrix.hpp @@ -266,7 +266,7 @@ Note: this class is not in the Xpetra_UseShortNames.hpp allocPerRow[i] = Aprime->getNumEntriesInLocalRow(i) + Bprime->getNumEntriesInLocalRow(i); } //Construct C - RCP C = rcp(new tcrs_matrix_type(Aprime->getRowMap(), allocPerRow(), Tpetra::StaticProfile)); + RCP C = rcp(new tcrs_matrix_type(Aprime->getRowMap(), allocPerRow())); //Compute the sum in C (already took care of transposes) Tpetra::MatrixMatrix::Add( *Aprime, false, alpha, diff --git a/packages/zoltan2/core/src/input/Zoltan2_TpetraRowGraphAdapter.hpp b/packages/zoltan2/core/src/input/Zoltan2_TpetraRowGraphAdapter.hpp index 041fea92b6f6..65f5701bd88a 100644 --- a/packages/zoltan2/core/src/input/Zoltan2_TpetraRowGraphAdapter.hpp +++ b/packages/zoltan2/core/src/input/Zoltan2_TpetraRowGraphAdapter.hpp @@ -545,7 +545,7 @@ RCP TpetraRowGraphAdapter::doMigration( // target graph RCP G = - rcp(new tcrsgraph_t(tmap, nnz_size_t(), Tpetra::StaticProfile)); + rcp(new tcrsgraph_t(tmap, nnz_size_t())); G->doImport(*pCrsGraphSrc, importer, Tpetra::INSERT); G->fillComplete(); diff --git a/packages/zoltan2/core/src/input/Zoltan2_TpetraRowMatrixAdapter.hpp b/packages/zoltan2/core/src/input/Zoltan2_TpetraRowMatrixAdapter.hpp index 177a0f7a02f3..181f3b4e5c8f 100644 --- a/packages/zoltan2/core/src/input/Zoltan2_TpetraRowMatrixAdapter.hpp +++ b/packages/zoltan2/core/src/input/Zoltan2_TpetraRowMatrixAdapter.hpp @@ -480,7 +480,7 @@ RCP TpetraRowMatrixAdapter::doMigration( } RCP M = - rcp(new tcrsmatrix_t(tmap, nnz(), Tpetra::StaticProfile)); + rcp(new tcrsmatrix_t(tmap, nnz())); M->doImport(from, importer, Tpetra::INSERT); M->fillComplete(); diff --git a/packages/zoltan2/core/src/input/Zoltan2_XpetraTraits.hpp b/packages/zoltan2/core/src/input/Zoltan2_XpetraTraits.hpp index d907444990ac..cfb4be490aa6 100644 --- a/packages/zoltan2/core/src/input/Zoltan2_XpetraTraits.hpp +++ b/packages/zoltan2/core/src/input/Zoltan2_XpetraTraits.hpp @@ -463,7 +463,7 @@ struct XpetraTraits > } // target graph - RCP G = rcp(new tgraph_t(tmap, nnz_size_t(), Tpetra::StaticProfile)); + RCP G = rcp(new tgraph_t(tmap, nnz_size_t())); G->doImport(from, importer, Tpetra::INSERT); G->fillComplete(); diff --git a/packages/zoltan2/sphynx/src/Zoltan2_Sphynx.hpp b/packages/zoltan2/sphynx/src/Zoltan2_Sphynx.hpp index fb116672e0f9..df93757aa5fb 100644 --- a/packages/zoltan2/sphynx/src/Zoltan2_Sphynx.hpp +++ b/packages/zoltan2/sphynx/src/Zoltan2_Sphynx.hpp @@ -373,7 +373,7 @@ namespace Zoltan2 { // Create the degree matrix with max row size set to 1 Teuchos::RCP degMat(new matrix_t (graph_->getRowMap(), graph_->getRowMap(), - 1, Tpetra::StaticProfile)); + 1)); scalar_t *val = new scalar_t[1]; lno_t *ind = new lno_t[1]; diff --git a/packages/zoltan2/test/core/helpers/UserInputForTests.hpp b/packages/zoltan2/test/core/helpers/UserInputForTests.hpp index c45165a9eb9f..0b52bd5f5805 100644 --- a/packages/zoltan2/test/core/helpers/UserInputForTests.hpp +++ b/packages/zoltan2/test/core/helpers/UserInputForTests.hpp @@ -1688,7 +1688,7 @@ void UserInputForTests::getUIChacoGraph(FILE *fptr, bool haveAssign, fromMap = rcp(new map_t(nvtxs, nvtxs, base, tcomm_)); fromMatrix = - rcp(new tcrsMatrix_t(fromMap, rowSizes(), Tpetra::StaticProfile)); + rcp(new tcrsMatrix_t(fromMap, rowSizes())); if (haveEdges){ @@ -1736,7 +1736,7 @@ void UserInputForTests::getUIChacoGraph(FILE *fptr, bool haveAssign, fromMap = rcp(new map_t(nvtxs, 0, base, tcomm_)); fromMatrix = - rcp(new tcrsMatrix_t(fromMap, rowSizes(), Tpetra::StaticProfile)); + rcp(new tcrsMatrix_t(fromMap, rowSizes())); fromMatrix->fillComplete(); } From 2ac5617d676a7afb4330fd7a01e2c65b147c1af9 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Fri, 22 Oct 2021 16:11:03 -0600 Subject: [PATCH 87/98] stokhos: resolve -Werror error: calling a __device__ from a __host__ __device__ function Co-author credit @masterleinad --- .../src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp index e01a3d15320e..5e1a5773c1f5 100644 --- a/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp +++ b/packages/stokhos/src/kokkos/Cuda/Stokhos_Cuda_WarpShuffle.hpp @@ -72,19 +72,35 @@ template KOKKOS_INLINE_FUNCTION Scalar shfl_down(const Scalar &val, const int& delta, const int& width, const int& mask){ +#ifdef __CUDA_ARCH__ return __shfl_down_sync(mask, val, delta, width); +#else + (void) delta; + (void) width; + (void) mask; + return val; +#endif } template KOKKOS_INLINE_FUNCTION Scalar shfl_up(const Scalar &val, const int& delta, const int& width, const int& mask){ +#ifdef __CUDA_ARCH__ return __shfl_up_sync(mask, val, delta, width); +#else + (void) delta; + (void) width; + (void) mask; + return val; +#endif } KOKKOS_INLINE_FUNCTION void sync_warp(const int& mask) { +#ifdef __CUDA_ARCH__ __syncwarp(mask); +#endif } } // namespace Stokhos From 8bf37eef5695ed69f74bc3243e4d89ab4b0abf33 Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 27 Oct 2021 16:06:50 -0600 Subject: [PATCH 88/98] MueLu: Adding support for driving Galeri options via ParameterList in Driver --- packages/muelu/test/scaling/CMakeLists.txt | 12 +++++++++++- packages/muelu/test/scaling/Driver.cpp | 13 ++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/muelu/test/scaling/CMakeLists.txt b/packages/muelu/test/scaling/CMakeLists.txt index 1e089dc43537..5794d7e76b10 100644 --- a/packages/muelu/test/scaling/CMakeLists.txt +++ b/packages/muelu/test/scaling/CMakeLists.txt @@ -63,7 +63,7 @@ IF (${PACKAGE_NAME}_HAVE_TPETRA_SOLVER_STACK OR ${PACKAGE_NAME}_HAVE_EPETRA_SOLV ) TRIBITS_COPY_FILES_TO_BINARY_DIR(Driver_cp - SOURCE_FILES scaling.xml scaling.yaml scaling-complex.xml scaling-withglobalconstants.xml scaling-complex-withglobalconstants.xml circ_nsp_dependency.xml isorropia.xml iso_poisson.xml conchas_milestone_zoltan.xml conchas_milestone_zoltan2.xml conchas_milestone_zoltan2_complex.xml sa_with_ilu.xml sa_with_Ifpack2_line_detection.xml rap.xml smoother.xml smoother_complex.xml tripleMatrixProduct.xml scaling-ml.xml elasticity3D.xml amgx.json amgx.xml scaling-with-rerun.xml scaling_distance2_agg.xml smooVec.mm smooVecCoalesce.xml pairwise.xml sa_enforce_constraints.xml recurMG.xml + SOURCE_FILES scaling.xml scaling.yaml scaling-complex.xml scaling-withglobalconstants.xml scaling-complex-withglobalconstants.xml circ_nsp_dependency.xml isorropia.xml iso_poisson.xml conchas_milestone_zoltan.xml conchas_milestone_zoltan2.xml conchas_milestone_zoltan2_complex.xml sa_with_ilu.xml sa_with_Ifpack2_line_detection.xml rap.xml smoother.xml smoother_complex.xml tripleMatrixProduct.xml scaling-ml.xml elasticity3D.xml amgx.json amgx.xml scaling-with-rerun.xml scaling_distance2_agg.xml smooVec.mm smooVecCoalesce.xml pairwise.xml sa_enforce_constraints.xml recurMG.xml anisotropic.xml CATEGORIES BASIC PERFORMANCE ) @@ -114,6 +114,15 @@ TRIBITS_ADD_TEST( CATEGORIES PERFORMANCE ) + +TRIBITS_ADD_TEST( + Driver + NAME Driver_anisotropic + ARGS "xml=anisotropic.xml --tol=1e-8" + NUM_MPI_PROCS 4 + COMM mpi # HAVE_MPI required + ) + # not very elegant. The best would probably to make Reuse.cpp work for both Epetra and Tpetra IF (${PACKAGE_NAME}_HAVE_TPETRA_SOLVER_STACK) TRIBITS_ADD_EXECUTABLE( @@ -188,6 +197,7 @@ IF (${PACKAGE_NAME}_HAVE_EPETRA_SOLVER_STACK AND (NOT Xpetra_INT_LONG_LONG)) NUM_MPI_PROCS 4 COMM mpi # HAVE_MPI required ) + TRIBITS_ADD_TEST( Driver diff --git a/packages/muelu/test/scaling/Driver.cpp b/packages/muelu/test/scaling/Driver.cpp index 678c414148c6..4bf53b7019fc 100644 --- a/packages/muelu/test/scaling/Driver.cpp +++ b/packages/muelu/test/scaling/Driver.cpp @@ -307,8 +307,19 @@ MueLu::MueLu_AMGX_initialize_plugins(); if (paramList.isParameter(name)) realParams.setEntry(name, paramList.getEntry(name)); } - } + // Galeri updates (only works with Run1) + if(paramList.sublist("Run1").isSublist("Galeri")) { + ParameterList& moreParams = paramList.sublist("Run1").sublist("Galeri"); + std::cout<<"*** moreParams ***"< > nodeComm; From c47b1dcfb72c628b5ccd4b966031ad1ca9fb727b Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 27 Oct 2021 16:17:05 -0600 Subject: [PATCH 89/98] MueLu: Adding support for driving Galeri options via ParameterList in Driver --- packages/muelu/test/scaling/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/muelu/test/scaling/CMakeLists.txt b/packages/muelu/test/scaling/CMakeLists.txt index 5794d7e76b10..eb82d3baff79 100644 --- a/packages/muelu/test/scaling/CMakeLists.txt +++ b/packages/muelu/test/scaling/CMakeLists.txt @@ -118,7 +118,7 @@ TRIBITS_ADD_TEST( TRIBITS_ADD_TEST( Driver NAME Driver_anisotropic - ARGS "xml=anisotropic.xml --tol=1e-8" + ARGS "--xml=anisotropic.xml --tol=1e-6" NUM_MPI_PROCS 4 COMM mpi # HAVE_MPI required ) From e442df732449fa4baad5ec6eebb3b75e2345244f Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 27 Oct 2021 16:21:23 -0600 Subject: [PATCH 90/98] MueLu: Adding support for driving Galeri options via ParameterList in Driver --- packages/muelu/test/scaling/anisotropic.xml | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 packages/muelu/test/scaling/anisotropic.xml diff --git a/packages/muelu/test/scaling/anisotropic.xml b/packages/muelu/test/scaling/anisotropic.xml new file mode 100644 index 000000000000..780315391b9e --- /dev/null +++ b/packages/muelu/test/scaling/anisotropic.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3ea77b0a259a0475f223096dc908090a085b637e Mon Sep 17 00:00:00 2001 From: Chris Siefert Date: Wed, 27 Oct 2021 21:19:35 -0600 Subject: [PATCH 91/98] MueLu: Removing superfluous cout --- packages/muelu/test/scaling/Driver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/muelu/test/scaling/Driver.cpp b/packages/muelu/test/scaling/Driver.cpp index c7fd5f8c06b4..b2b4751eb6e5 100644 --- a/packages/muelu/test/scaling/Driver.cpp +++ b/packages/muelu/test/scaling/Driver.cpp @@ -312,7 +312,6 @@ MueLu::MueLu_AMGX_initialize_plugins(); // Galeri updates (only works with Run1) if(paramList.sublist("Run1").isSublist("Galeri")) { ParameterList& moreParams = paramList.sublist("Run1").sublist("Galeri"); - std::cout<<"*** moreParams ***"< Date: Thu, 28 Oct 2021 09:03:27 -0600 Subject: [PATCH 92/98] STK: Snapshot 10-28-21 09:02 --- packages/stk/CMakeLists.txt | 2 +- .../stk_expreval/stk_expreval/Evaluator.hpp | 2 +- .../cmake_install_test/build_stk_using_cmake | 2 +- .../stk/stk_mesh/stk_mesh/base/Bucket.cpp | 532 ++++++-- .../stk/stk_mesh/stk_mesh/base/Bucket.hpp | 315 ++++- .../stk_mesh/base/BucketConnectivity.hpp | 1170 +++++++++++++++++ .../stk/stk_mesh/stk_mesh/base/BulkData.cpp | 62 +- .../stk/stk_mesh/stk_mesh/base/BulkData.hpp | 219 +-- .../stk_mesh/base/ConnectedSparseNodes.hpp | 115 -- .../stk_mesh/base/ConnectedTopologyNodes.hpp | 101 -- .../stk_mesh/stk_mesh/base/Connectivity.cpp | 250 ---- .../stk_mesh/stk_mesh/base/Connectivity.hpp | 249 ---- .../stk_mesh/stk_mesh/base/DeviceField.hpp | 95 +- .../stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp | 28 +- .../stk/stk_mesh/stk_mesh/base/DeviceMesh.hpp | 2 +- .../stk/stk_mesh/stk_mesh/base/FieldBase.hpp | 20 +- .../stk_mesh/base/FieldDataManager.hpp | 1 + .../stk_mesh/stk_mesh/base/GetNgpField.hpp | 24 +- .../stk/stk_mesh/stk_mesh/base/HostField.hpp | 51 +- .../stk_mesh/stk_mesh/base/NgpFieldBase.hpp | 12 +- .../stk_mesh/base/SparseConnectivity.cpp | 193 --- .../stk_mesh/base/SparseConnectivity.hpp | 151 --- packages/stk/stk_mesh/stk_mesh/base/Types.hpp | 3 - .../stk_mesh/baseImpl/BucketRepository.cpp | 47 + .../stk_mesh/baseImpl/BucketRepository.hpp | 3 + .../stk_mesh/baseImpl/MeshImplUtils.cpp | 53 +- .../stk_mesh/baseImpl/MeshImplUtils.hpp | 15 +- .../stk_mesh/baseImpl/MeshModification.cpp | 1 - .../stk_mesh/baseImpl/MeshPrintUtils.cpp | 14 - .../stk_mesh/baseImpl/MeshPrintUtils.hpp | 3 - .../stk_mesh/baseImpl/NgpFieldAux.hpp | 35 - .../stk_unit_test_utils/BucketTester.hpp | 2 +- .../stk_unit_test_utils/CMakeLists.txt | 5 + .../stk_unit_test_utils/TextMesh.cpp | 512 +------- .../stk_unit_test_utils/TextMeshFixture.cpp | 168 +++ .../stk_unit_test_utils/TextMeshFixture.hpp | 81 ++ .../stk_unit_test_utils/TextMeshUtils.cpp | 557 ++++++++ .../stk_unit_test_utils/TextMeshUtils.hpp | 228 ++++ .../stk_mesh/UnitTestBucket.cpp | 91 +- .../stk_mesh/UnitTestBucketConnectivity.cpp | 345 +++++ .../stk_mesh/UnitTestConnectivity.cpp | 385 ------ .../stk_mesh/UnitTestSparseConnectivity.cpp | 256 ---- .../stk_mesh/UnitTestTextMesh.cpp | 202 +-- .../stk_util/environment/Scheduler.cpp | 15 +- .../stk_util/registry/ProductRegistry.cpp | 2 +- 45 files changed, 3723 insertions(+), 2896 deletions(-) create mode 100644 packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/ConnectedTopologyNodes.hpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/Connectivity.hpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp delete mode 100644 packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp create mode 100644 packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.cpp create mode 100644 packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.hpp create mode 100644 packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.cpp create mode 100644 packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.hpp create mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp delete mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp delete mode 100644 packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp diff --git a/packages/stk/CMakeLists.txt b/packages/stk/CMakeLists.txt index 22e87d5cb36f..9df9f3455c2a 100644 --- a/packages/stk/CMakeLists.txt +++ b/packages/stk/CMakeLists.txt @@ -72,7 +72,7 @@ IF ( ${PACKAGE_NAME}_DISABLE_MPI_NEIGHBOR_COMM ) SET(STK_DISABLE_MPI_NEIGHBOR_COMM TRUE) ENDIF() -IF (NOT ${PACAKGE_NAME}_ENABLE_SEACASAprepro_lib) +IF (NOT ${PACKAGE_NAME}_ENABLE_SEACASAprepro_lib) SET(NOT_HAVE_STK_SEACASAPREPRO_LIB TRUE) ENDIF() diff --git a/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp b/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp index 420e0cef16c9..0e78f9e1347f 100644 --- a/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp +++ b/packages/stk/stk_expreval/stk_expreval/Evaluator.hpp @@ -487,6 +487,7 @@ class ParsedEval using NodeView = Kokkos::View; public: + ParsedEval() = default; ParsedEval(Eval& eval); KOKKOS_DEFAULTED_FUNCTION ParsedEval(const ParsedEval&) = default; @@ -529,7 +530,6 @@ class DeviceVariableMap using VariableMapView = Kokkos::View; public: - KOKKOS_DEFAULTED_FUNCTION ~DeviceVariableMap() = default; KOKKOS_INLINE_FUNCTION diff --git a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake index 67a4e05d8a41..bf41a0226134 100755 --- a/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake +++ b/packages/stk/stk_integration_tests/cmake_install_test/build_stk_using_cmake @@ -77,7 +77,7 @@ exe "TRILINOS_DIR=${trilinos_dir} \ TRILINOS_INSTALL_DIR=${trilinos_install_dir} \ CMAKE_BUILD_TYPE=${build_type} \ CUDA=${cuda_on_or_off} \ - ./run_cmake_stk ${stk_build_dir}/tpl_paths >& ${stk_config_log}" + ./run_cmake_stk >& ${stk_config_log}" printf "Now building trilinos/stk using make...\n"; exe "make VERBOSE=1 -j8 >& ${stk_make_log}"; diff --git a/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp b/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp index 18696c21f07f..e18d12a7653f 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Bucket.cpp @@ -38,9 +38,8 @@ #include // for operator<<, basic_ostream, etc #include // for BulkData, field_data, etc #include // for Entity -#include -#include #include // for MetaData, get_cell_topology, etc +#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity #include "stk_mesh/base/FieldBase.hpp" // for FieldBase #include #include "stk_mesh/base/Part.hpp" // for Part @@ -51,20 +50,127 @@ namespace stk { namespace mesh { namespace impl { template class BucketConnectivity; } } } + //---------------------------------------------------------------------- namespace stk { namespace mesh { namespace { +#ifndef NDEBUG +struct CheckSizeFunctor +{ + template + void operator()(const Bucket& bucket, const Connectivity& connectivity, const Bucket*) const + { ThrowAssert(bucket.size() == static_cast(connectivity.size())); } + + bool is_modifying() const { return false; } +}; +#endif + +struct AddEntityFunctor +{ + template + void operator()(Bucket&, Connectivity& connectivity, Bucket*) + { connectivity.add_entity(); } + + bool is_modifying() const { return true; } +}; + +struct RemoveEntityFunctor +{ + template + void operator()(Bucket&, Connectivity& connectivity, Bucket*) + { connectivity.remove_entity(); } + + bool is_modifying() const { return true; } +}; + +struct DeclareRelationFunctor +{ + DeclareRelationFunctor(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, + Permutation permutation) + : m_bucket_ordinal(bucket_ordinal), + m_to(to), + m_ordinal(ordinal), + m_permutation(permutation), + m_modified(false) + {} + + template + void operator()(Bucket& bucket, Connectivity& connectivity) + { + ThrowAssert( (Connectivity::target_rank == static_cast(stk::topology::INVALID_RANK) && + bucket.mesh().entity_rank(m_to) > static_cast(stk::topology::ELEMENT_RANK)) || + bucket.mesh().entity_rank(m_to) == Connectivity::target_rank ); + ThrowAssert(!m_modified); + m_modified = connectivity.add_connectivity(m_bucket_ordinal, m_to, m_ordinal, m_permutation); + } + + unsigned m_bucket_ordinal; + Entity m_to; + ConnectivityOrdinal m_ordinal; + Permutation m_permutation; + bool m_modified; +}; + +struct DestroyRelationFunctor +{ + DestroyRelationFunctor(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) + : m_bucket_ordinal(bucket_ordinal), + m_to(to), + m_ordinal(ordinal), + m_modified(false) + {} + + template + void operator()(Bucket& bucket, Connectivity& connectivity) + { + ThrowAssert( (Connectivity::target_rank == static_cast(stk::topology::INVALID_RANK) && + bucket.mesh().entity_rank(m_to) > static_cast(stk::topology::ELEMENT_RANK)) || + bucket.mesh().entity_rank(m_to) == Connectivity::target_rank); + ThrowAssert(!m_modified); + m_modified = connectivity.remove_connectivity(m_bucket_ordinal, m_to, m_ordinal); + } + + unsigned m_bucket_ordinal; + Entity m_to; + ConnectivityOrdinal m_ordinal; + bool m_modified; +}; + +struct DebugPrintFunctor +{ + DebugPrintFunctor(std::ostream& out, unsigned ordinal = -1u) : m_out(out), m_ordinal(ordinal) {} + + template + void operator()(const Bucket&, const Connectivity& connectivity, const Bucket*) const + { + if (m_ordinal == -1u) { + connectivity.debug_dump(m_out); + } + else { + connectivity.debug_dump(m_out, m_ordinal); + } + } + + bool is_modifying() const { return false; } + + std::ostream& m_out; + unsigned m_ordinal; +}; + +template void setup_connectivity(stk::topology bucket_topology, EntityRank from_rank, EntityRank to_rank, - ConnectivityType& conn_type) + ConnectivityType& conn_type, + FixedConnectivity& fixed_conn) { if (bucket_topology != stk::topology::END_TOPOLOGY && bucket_topology.num_sub_topology(to_rank) > 0 && to_rank == stk::topology::NODE_RANK) { + fixed_conn.set_num_connectivity(bucket_topology.num_sub_topology(to_rank)); conn_type = FIXED_CONNECTIVITY; } else if (from_rank > stk::topology::ELEMENT_RANK || @@ -76,6 +182,31 @@ void setup_connectivity(stk::topology bucket_topology, } //namespace anonymous +namespace impl { + +struct OverwriteEntityFunctor +{ + OverwriteEntityFunctor(unsigned old_ordinal, unsigned new_ordinal) : m_old_ordinal(old_ordinal), m_new_ordinal(new_ordinal) {} + + template + void operator()(Bucket& bucket, Connectivity& connectivity, Bucket* otherBucket) + { + impl::BucketConnectivity & otherConnectivity = get_other_connectivity(otherBucket); + otherConnectivity.copy_entity(m_old_ordinal, connectivity, m_new_ordinal); + } + + bool is_modifying() const { return true; } + + template + static + impl::BucketConnectivity& get_other_connectivity(Bucket* other_bucket); + + unsigned m_old_ordinal; + unsigned m_new_ordinal; +}; + +} + //---------------------------------------------------------------------- bool raw_part_equal( const unsigned * lhs , const unsigned * rhs ) @@ -108,17 +239,18 @@ bool BucketLess::operator()( const unsigned * lhs , const Bucket * rhs_bucket ) const { return bucket_key_less( lhs , rhs_bucket->key() ); } +//---------------------------------------------------------------------- + Bucket::Bucket(BulkData & arg_mesh, EntityRank arg_entity_rank, const std::vector & arg_key, size_t arg_capacity, unsigned bucket_id) : m_mesh(arg_mesh), - m_sparse_connectivity(arg_mesh.get_sparse_connectivity()), m_entity_rank(arg_entity_rank), + m_topology(), m_key(arg_key), m_partOrdsBeginEnd(m_key.data()+1,m_key.data()+m_key[0]), - m_topology(get_topology(m_mesh.mesh_meta_data(), arg_entity_rank, superset_part_ordinals())), m_capacity(arg_capacity), m_size(0), m_bucket_id(bucket_id), @@ -129,16 +261,28 @@ Bucket::Bucket(BulkData & arg_mesh, m_node_kind(INVALID_CONNECTIVITY_TYPE), m_edge_kind(INVALID_CONNECTIVITY_TYPE), m_face_kind(INVALID_CONNECTIVITY_TYPE), - m_topoNodes(m_topology, m_entities), - m_sparseNodes(m_sparse_connectivity, m_entity_rank, m_entities), + m_element_kind(INVALID_CONNECTIVITY_TYPE), + m_fixed_node_connectivity(), + m_fixed_edge_connectivity(), + m_fixed_face_connectivity(), + m_fixed_element_connectivity(), + m_dynamic_node_connectivity(arg_entity_rank, &m_mesh), + m_dynamic_edge_connectivity(arg_entity_rank, &m_mesh), + m_dynamic_face_connectivity(arg_entity_rank, &m_mesh), + m_dynamic_element_connectivity(arg_entity_rank, &m_mesh), + m_dynamic_other_connectivity(arg_entity_rank, &m_mesh), m_owned(has_superset(*this, m_mesh.mesh_meta_data().locally_owned_part())), m_shared(has_superset(*this, m_mesh.mesh_meta_data().globally_shared_part())), m_aura(has_superset(*this, m_mesh.mesh_meta_data().aura_part())) { ThrowAssertMsg(arg_capacity != 0, "Buckets should never have zero capacity"); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::NODE_RANK, m_node_kind); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::EDGE_RANK, m_edge_kind); - setup_connectivity(m_topology, arg_entity_rank, stk::topology::FACE_RANK, m_face_kind); + + m_topology = get_topology(m_mesh.mesh_meta_data(), arg_entity_rank, superset_part_ordinals()); + + setup_connectivity(m_topology, arg_entity_rank, stk::topology::NODE_RANK, m_node_kind, m_fixed_node_connectivity); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::EDGE_RANK, m_edge_kind, m_fixed_edge_connectivity); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::FACE_RANK, m_face_kind, m_fixed_face_connectivity); + setup_connectivity(m_topology, arg_entity_rank, stk::topology::ELEMENT_RANK, m_element_kind, m_fixed_element_connectivity); m_parts.reserve(m_key.size()); supersets(m_parts); @@ -152,36 +296,93 @@ Bucket::~Bucket() m_mesh.destroy_bucket_callback(m_entity_rank, *this, m_capacity); } -void Bucket::change_connected_nodes(unsigned bucket_ordinal, stk::mesh::Entity* new_nodes) +size_t Bucket::memory_size_in_bytes() const { - const unsigned numNodes = m_topology.num_nodes(); - for (unsigned i=0; inum_nodes(bucket_ordinal); + Entity *nodes=0; + if (m_node_kind == FIXED_CONNECTIVITY) + { + nodes = m_fixed_node_connectivity.begin(bucket_ordinal); + } + else + { + nodes = m_dynamic_node_connectivity.begin(bucket_ordinal); + } + + for (unsigned i=0;i stk::topology::NODE_RANK && - entity_rank() <= stk::topology::ELEM_RANK) { - const unsigned numNodes = m_topology.num_nodes(); - ThrowRequireMsg(m_node_kind == FIXED_CONNECTIVITY, "Bucket topo="< 0 && fromNumNodes == numNodes) { - const Entity* entityNodes = from_bucket.begin_nodes(from_ordinal); - if (m_topology == stk::topology::INVALID_TOPOLOGY || from_bucket.topology() == stk::topology::INVALID_TOPOLOGY) { - const ConnectivityOrdinal* ords = from_bucket.begin_node_ordinals(from_ordinal); - for(unsigned i=0; imesh().add_entity_callback(entity_rank(), bucket_id(), m_size); ++m_size; + + AddEntityFunctor functor; + process_all_connectivity(functor); } bool Bucket::destroy_relation(Entity e_from, Entity e_to, const RelationIdentifier local_id ) { - EntityRank toRank = mesh().entity_rank(e_to); - if (toRank != stk::topology::NODE_RANK) { - EntityRank fromRank = mesh().entity_rank(e_from); - return m_sparse_connectivity.remove_connectivity(fromRank, e_from, toRank, e_to, local_id); - } - - Bucket& fromBucket = mesh().bucket(e_from); - if (fromBucket.bucket_id() != bucket_id()) { - return fromBucket.destroy_relation(e_from, e_to, local_id); - } - const unsigned from_bucket_ordinal = mesh().bucket_ordinal(e_from); - - CONN_TYPE(m_node_kind, m_topoNodes.set_connected_node(from_bucket_ordinal, Entity(), local_id), m_sparseNodes.set_connected_node(from_bucket_ordinal, Entity(), local_id)); - return true; + DestroyRelationFunctor functor(from_bucket_ordinal, e_to, static_cast(local_id)); + modify_connectivity(functor, m_mesh.entity_rank(e_to)); + + return functor.m_modified; } bool Bucket::declare_relation(unsigned bucket_ordinal, Entity e_to, const ConnectivityOrdinal ordinal, Permutation permutation ) { - EntityRank toRank = mesh().entity_rank(e_to); - if (toRank == stk::topology::NODE_RANK) { - return (m_node_kind==FIXED_CONNECTIVITY ? m_topoNodes.set_connected_node(bucket_ordinal, e_to, ordinal) : m_sparseNodes.reset_connected_node(bucket_ordinal, e_to, ordinal)); - } + DeclareRelationFunctor functor(bucket_ordinal, e_to, ordinal, permutation); + modify_connectivity(functor, m_mesh.entity_rank(e_to)); - return m_sparse_connectivity.add_connectivity(entity_rank(), m_entities[bucket_ordinal], - toRank, e_to, ordinal, permutation); + return functor.m_modified; } void Bucket::remove_entity() @@ -522,6 +722,9 @@ void Bucket::remove_entity() --m_size; initialize_slot(m_size, Entity()); + + RemoveEntityFunctor functor; + process_all_connectivity(functor); } void Bucket::copy_entity(Entity entity) @@ -534,11 +737,73 @@ void Bucket::copy_entity(Entity entity) ThrowAssert(mesh().entity_rank(entity) == m_entity_rank); mark_for_modification(); + Bucket* old_bucket = mesh().bucket_ptr(entity); + const unsigned old_ordinal = mesh().bucket_ordinal(entity); this->mesh().add_entity_callback(this->entity_rank(), this->bucket_id(), m_size); reset_entity_location(entity, m_size); ++m_size; + + // Unfortunately, we had to copy/paste modify_connectivity to allow dynamic->fixed moves. The + // modify_connectivity framework couldn't elegantly handle this case. + switch(m_node_kind) { + case FIXED_CONNECTIVITY: + if (old_bucket->m_node_kind == FIXED_CONNECTIVITY) { + old_bucket->m_fixed_node_connectivity.copy_entity(old_ordinal, m_fixed_node_connectivity); + } + else { + ThrowAssert(old_bucket->m_node_kind != INVALID_CONNECTIVITY_TYPE); + old_bucket->m_dynamic_node_connectivity.copy_to_fixed(old_ordinal, m_fixed_node_connectivity); + } + break; + case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_node_connectivity.copy_entity(old_ordinal, m_dynamic_node_connectivity); break; + default: break; + } + + switch(m_edge_kind) { + case FIXED_CONNECTIVITY: + if (old_bucket->m_edge_kind == FIXED_CONNECTIVITY) { + old_bucket->m_fixed_edge_connectivity.copy_entity(old_ordinal, m_fixed_edge_connectivity); + } + else { + ThrowAssert(old_bucket->m_edge_kind != INVALID_CONNECTIVITY_TYPE); + old_bucket->m_dynamic_edge_connectivity.copy_to_fixed(old_ordinal, m_fixed_edge_connectivity); + } + break; + case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_edge_connectivity.copy_entity(old_ordinal, m_dynamic_edge_connectivity); break; + default: break; + } + + switch(m_face_kind) { + case FIXED_CONNECTIVITY: + if (old_bucket->m_face_kind == FIXED_CONNECTIVITY) { + old_bucket->m_fixed_face_connectivity.copy_entity(old_ordinal, m_fixed_face_connectivity); + } + else { + ThrowAssert(old_bucket->m_face_kind != INVALID_CONNECTIVITY_TYPE); + old_bucket->m_dynamic_face_connectivity.copy_to_fixed(old_ordinal, m_fixed_face_connectivity); + } + break; + case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_face_connectivity.copy_entity(old_ordinal, m_dynamic_face_connectivity); break; + default: break; + } + + switch(m_element_kind) { + case FIXED_CONNECTIVITY: + if (old_bucket->m_element_kind == FIXED_CONNECTIVITY) { + old_bucket->m_fixed_element_connectivity.copy_entity(old_ordinal, m_fixed_element_connectivity); + } + else { + ThrowAssert(old_bucket->m_element_kind != INVALID_CONNECTIVITY_TYPE); + old_bucket->m_dynamic_element_connectivity.copy_to_fixed(old_ordinal, m_fixed_element_connectivity); + } + break; + case DYNAMIC_CONNECTIVITY: old_bucket->m_dynamic_element_connectivity.copy_entity(old_ordinal, m_dynamic_element_connectivity); break; + default: break; + } + + old_bucket->m_dynamic_other_connectivity.copy_entity(old_ordinal, m_dynamic_other_connectivity); } void Bucket::overwrite_entity(unsigned to_ordinal, Entity entity, const FieldVector* fields) @@ -548,7 +813,11 @@ void Bucket::overwrite_entity(unsigned to_ordinal, Entity entity, const FieldVec ThrowAssert(mesh().bucket_ptr(entity) != nullptr); ThrowAssert(mesh().entity_rank(entity) == m_entity_rank); + const MeshIndex from_index = m_mesh.mesh_index(entity); reset_entity_location(entity, to_ordinal, fields); + + impl::OverwriteEntityFunctor functor(from_index.bucket_ordinal, to_ordinal); + process_all_connectivity(functor, from_index.bucket); } @@ -569,5 +838,96 @@ void Bucket::parent_topology( EntityRank parent_rank, std::vector stk::util::sort_and_unique(parent_topologies); } +void Bucket::check_size_invariant() const +{ +#ifndef NDEBUG +// for (size_t i = 0; i < m_entities.size(); ++i) { +// if (i < m_size) { +// ThrowAssert(mesh().is_valid(m_entities[i])); +// } +// else { +// ThrowAssert(!mesh().is_valid(m_entities[i])); +// } +// } + + CheckSizeFunctor functor; + const_cast(this)->process_all_connectivity(functor); +#endif +} + +void Bucket::debug_dump(std::ostream& out, unsigned ordinal) const +{ + DebugPrintFunctor functor(out, ordinal); + const_cast(this)->process_all_connectivity(functor); +} + +void Bucket::debug_check_for_invalid_connectivity_request(ConnectivityType const* type) const +{ +#ifndef NDEBUG + EntityRank rank = stk::topology::END_RANK; + if (type == &m_node_kind) { + rank = stk::topology::NODE_RANK; + } + else if (type == &m_edge_kind) { + rank = stk::topology::EDGE_RANK; + } + else if (type == &m_face_kind) { + rank = stk::topology::FACE_RANK; + } + else if (type == &m_element_kind) { + rank = stk::topology::ELEMENT_RANK; + } + else { + ThrowAssert(false); + } + // Asking for connectivity between entities of equal rank is always invalid and ok to ask for + // Asking for connectivity between for FACE_RANK in 2d is always invalid and ok to ask for + bool isThisEntityAskingForConnectivityToItsOwnRank = entity_rank() == rank; + bool isThisEntityAskingForFaceConnectivityOnTwoDimensionalMesh = rank == stk::topology::FACE_RANK && mesh().mesh_meta_data().spatial_dimension() == 2; + ThrowAssert( isThisEntityAskingForConnectivityToItsOwnRank || isThisEntityAskingForFaceConnectivityOnTwoDimensionalMesh); +#endif +} + +namespace impl { + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_fixed_node_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_fixed_edge_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_fixed_face_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_fixed_element_connectivity; } + + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_dynamic_node_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_dynamic_edge_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_dynamic_face_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_dynamic_element_connectivity; } + +template <> +impl::BucketConnectivity& OverwriteEntityFunctor::get_other_connectivity(Bucket* other_bucket) +{ return other_bucket->m_dynamic_other_connectivity; } + +} + } // namespace mesh } // namespace stk diff --git a/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp b/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp index 5a4b3966bd6f..f1b6ac4da84a 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Bucket.hpp @@ -38,12 +38,10 @@ #include // for size_t, NULL #include // for lower_bound #include // for ostream +#include // for BucketConnectivity #include // for Entity #include // for contains_ordinal, Part #include -#include -#include -#include #include // for topology, etc #include // for ThrowAssert, etc #include @@ -56,6 +54,7 @@ namespace stk { namespace mesh { class FieldBase; } } namespace stk { namespace mesh { class DeviceMesh; } } namespace stk { namespace mesh { namespace impl { class BucketRepository; } } } namespace stk { namespace mesh { namespace impl { class Partition; } } } +namespace stk { namespace mesh { namespace impl { struct OverwriteEntityFunctor; } } } namespace stk { namespace mesh { @@ -76,28 +75,36 @@ print( std::ostream & , const std::string & indent , const Bucket & ); // The part count and parts are equal bool raw_part_equal( const unsigned * lhs , const unsigned * rhs ); -#define CONN_TYPE(conn_type, fixed_conn, sparse_conn) \ - ((conn_type == FIXED_CONNECTIVITY) ? fixed_conn : sparse_conn) +#define CONNECTIVITY_TYPE_SWITCH(entity_kind, fixed_func_sig, dynamic_func_sig, check_invalid) \ + switch(entity_kind) { \ + case FIXED_CONNECTIVITY: \ + return fixed_func_sig; \ + case DYNAMIC_CONNECTIVITY: \ + return dynamic_func_sig; \ + default: \ + if (check_invalid) { \ + check_for_invalid_connectivity_request(&entity_kind); \ + } \ + return 0; \ + } -#define RANK_SWITCH(rank, begin_or_end, item_type, bucket_ordinal) \ +#define RANK_SWITCH(rank, begin_or_end, postfix, bucket_ordinal) \ \ - switch(rank) { \ - case stk::topology::NODE_RANK: \ - switch(m_node_kind) { \ - case FIXED_CONNECTIVITY: return m_topoNodes.begin_or_end##item_type(bucket_ordinal); \ - case DYNAMIC_CONNECTIVITY: return m_sparseNodes.begin_or_end##item_type(bucket_ordinal); \ - default: return nullptr; \ - } \ - default: \ - return m_sparse_connectivity.begin_or_end##item_type(m_entities[bucket_ordinal], rank); \ + switch(rank) { \ + case stk::topology::NODE_RANK: return begin_or_end##_node##postfix(bucket_ordinal); \ + case stk::topology::EDGE_RANK: return begin_or_end##_edge##postfix(bucket_ordinal); \ + case stk::topology::FACE_RANK: return begin_or_end##_face##postfix(bucket_ordinal); \ + case stk::topology::ELEMENT_RANK: return begin_or_end##_element##postfix(bucket_ordinal); \ + default: \ + return begin_other##postfix(bucket_ordinal) + get_others_##begin_or_end##_index(bucket_ordinal, rank); \ } //---------------------------------------------------------------------- -/** \brief A container for a homogeneous collection of +/** \brief A container for the connectivity for a homogeneous collection of * \ref stk::mesh::Entity "entities". * - * The entities are homogeneous in that they are of the same rank and topology - * and are members of the same parts. + * The entities are homogeneous in that they are of the same entity type + * and are members of the same of parts. */ class Bucket { @@ -127,6 +134,8 @@ class Bucket /** \brief Number of entities associated with this bucket */ size_type size() const { return m_size ; } + size_t memory_size_in_bytes() const; + /** \brief Capacity of this bucket */ size_t capacity() const { return m_capacity ; } @@ -203,83 +212,87 @@ class Bucket int parallel_owner_rank(unsigned ordinal) const; + void check_size_invariant() const; + //generic rank connectivity calls Entity const* begin(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, begin, _connectivity, bucket_ordinal) } + { RANK_SWITCH(rank, begin, s, bucket_ordinal) } ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal, EntityRank rank) const { RANK_SWITCH(rank, begin, _ordinals, bucket_ordinal) } Permutation const* begin_permutations(unsigned bucket_ordinal, EntityRank rank) const - { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], rank); } + { RANK_SWITCH(rank, begin, _permutations, bucket_ordinal) } Entity const* end(unsigned bucket_ordinal, EntityRank rank) const - { RANK_SWITCH(rank, end, _connectivity, bucket_ordinal) } + { RANK_SWITCH(rank, end, s, bucket_ordinal) } ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal, EntityRank rank) const { RANK_SWITCH(rank, end, _ordinals, bucket_ordinal) } Permutation const* end_permutations(unsigned bucket_ordinal, EntityRank rank) const - { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], rank); } + { RANK_SWITCH(rank, end, _permutations, bucket_ordinal) } unsigned num_connectivity(unsigned bucket_ordinal, EntityRank rank) const; Entity const* begin_nodes(unsigned bucket_ordinal) const - { return CONN_TYPE(m_node_kind, m_topoNodes.begin_connectivity(bucket_ordinal), m_sparseNodes.begin_connectivity(bucket_ordinal)); } + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin(bucket_ordinal), m_dynamic_node_connectivity.begin(bucket_ordinal), true) } Entity const* begin_edges(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin(bucket_ordinal), m_dynamic_edge_connectivity.begin(bucket_ordinal), true) } Entity const* begin_faces(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin(bucket_ordinal), m_dynamic_face_connectivity.begin(bucket_ordinal), true) } Entity const* begin_elements(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin(bucket_ordinal), m_dynamic_element_connectivity.begin(bucket_ordinal), true) } ConnectivityOrdinal const* begin_node_ordinals(unsigned bucket_ordinal) const - { return CONN_TYPE(m_node_kind, m_topoNodes.begin_ordinals(bucket_ordinal), m_sparseNodes.begin_ordinals(bucket_ordinal)); } + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_node_connectivity.begin_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* begin_edge_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_edge_connectivity.begin_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* begin_face_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_face_connectivity.begin_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* begin_element_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_ordinals(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin_ordinals(bucket_ordinal), m_dynamic_element_connectivity.begin_ordinals(bucket_ordinal), true) } - Permutation const* begin_node_permutations(unsigned bucket_ordinal) const { return nullptr; } + Permutation const* begin_node_permutations(unsigned bucket_ordinal) const + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.begin_permutations(bucket_ordinal), m_dynamic_node_connectivity.begin_permutations(bucket_ordinal), true) } Permutation const* begin_edge_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.begin_permutations(bucket_ordinal), m_dynamic_edge_connectivity.begin_permutations(bucket_ordinal), true) } Permutation const* begin_face_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.begin_permutations(bucket_ordinal), m_dynamic_face_connectivity.begin_permutations(bucket_ordinal), true) } Permutation const* begin_element_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.begin_permutations(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.begin_permutations(bucket_ordinal), m_dynamic_element_connectivity.begin_permutations(bucket_ordinal), true) } unsigned num_nodes(unsigned bucket_ordinal) const - { return CONN_TYPE(m_node_kind, m_topoNodes.num_nodes_per_entity(bucket_ordinal), m_sparseNodes.num_nodes_per_entity(bucket_ordinal)); } + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.num_connectivity(bucket_ordinal), m_dynamic_node_connectivity.num_connectivity(bucket_ordinal), false) } unsigned num_edges(unsigned bucket_ordinal) const - { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.num_connectivity(bucket_ordinal), m_dynamic_edge_connectivity.num_connectivity(bucket_ordinal), false) } unsigned num_faces(unsigned bucket_ordinal) const - { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.num_connectivity(bucket_ordinal), m_dynamic_face_connectivity.num_connectivity(bucket_ordinal), false) } unsigned num_elements(unsigned bucket_ordinal) const - { return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.num_connectivity(bucket_ordinal), m_dynamic_element_connectivity.num_connectivity(bucket_ordinal), false) } Entity const* end_nodes(unsigned bucket_ordinal) const - { return CONN_TYPE(m_node_kind, m_topoNodes.end_connectivity(bucket_ordinal), m_sparseNodes.end_connectivity(bucket_ordinal)); } + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end(bucket_ordinal), m_dynamic_node_connectivity.end(bucket_ordinal), true) } Entity const* end_edges(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end(bucket_ordinal), m_dynamic_edge_connectivity.end(bucket_ordinal), true) } Entity const* end_faces(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end(bucket_ordinal), m_dynamic_face_connectivity.end(bucket_ordinal), true) } Entity const* end_elements(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_connectivity(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end(bucket_ordinal), m_dynamic_element_connectivity.end(bucket_ordinal), true) } ConnectivityOrdinal const* end_node_ordinals(unsigned bucket_ordinal) const - { return CONN_TYPE(m_node_kind, m_topoNodes.end_ordinals(bucket_ordinal), m_sparseNodes.end_ordinals(bucket_ordinal)); } + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end_ordinals(bucket_ordinal), m_dynamic_node_connectivity.end_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* end_edge_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end_ordinals(bucket_ordinal), m_dynamic_edge_connectivity.end_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* end_face_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end_ordinals(bucket_ordinal), m_dynamic_face_connectivity.end_ordinals(bucket_ordinal), true) } ConnectivityOrdinal const* end_element_ordinals(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_ordinals(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end_ordinals(bucket_ordinal), m_dynamic_element_connectivity.end_ordinals(bucket_ordinal), true) } - Permutation const* end_node_permutations(unsigned bucket_ordinal) const { return nullptr; } + Permutation const* end_node_permutations(unsigned bucket_ordinal) const + { CONNECTIVITY_TYPE_SWITCH(m_node_kind, m_fixed_node_connectivity.end_permutations(bucket_ordinal), m_dynamic_node_connectivity.end_permutations(bucket_ordinal), true) } Permutation const* end_edge_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::EDGE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_edge_kind, m_fixed_edge_connectivity.end_permutations(bucket_ordinal), m_dynamic_edge_connectivity.end_permutations(bucket_ordinal), true) } Permutation const* end_face_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::FACE_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_face_kind, m_fixed_face_connectivity.end_permutations(bucket_ordinal), m_dynamic_face_connectivity.end_permutations(bucket_ordinal), true) } Permutation const* end_element_permutations(unsigned bucket_ordinal) const - { return m_sparse_connectivity.end_permutations(m_entities[bucket_ordinal], stk::topology::ELEM_RANK); } + { CONNECTIVITY_TYPE_SWITCH(m_element_kind, m_fixed_element_connectivity.end_permutations(bucket_ordinal), m_dynamic_element_connectivity.end_permutations(bucket_ordinal), true) } bool has_permutation(EntityRank rank) const; @@ -291,7 +304,7 @@ class Bucket using ConnectedOrdinals = util::StridedArray; using Permutations = util::StridedArray; -#ifndef STK_HIDE_DEPRECATED_CODE // Delete after November 2021 +#ifndef STK_HIDE_DEPRECATED_CODE // Delete after September 2021 STK_DEPRECATED unsigned get_num_nodes_per_entity() const { return topology().num_nodes(); } #endif @@ -336,17 +349,44 @@ class Bucket void reset_bucket_parts(const OrdinalVector& newPartOrdinals); protected: - void change_connected_nodes(unsigned bucket_ordinal, Entity* new_nodes); - void change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, ConnectivityOrdinal elem_connectivity_ordinal, Permutation permut); - void change_existing_permutation_for_connected_edge(unsigned bucket_ordinal_of_higher_ranked_entity, ConnectivityOrdinal edge_connectivity_ordinal, Permutation permut); - void change_existing_permutation_for_connected_face(unsigned bucket_ordinal_of_higher_ranked_entity, ConnectivityOrdinal face_connectivity_ordinal, Permutation permut); + void change_existing_connectivity(unsigned bucket_ordinal, stk::mesh::Entity* new_nodes); + void change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, unsigned elem_connectivity_ordinal, stk::mesh::Permutation permut); + void change_existing_permutation_for_connected_edge(unsigned bucket_ordinal_of_higher_ranked_entity, unsigned edge_connectivity_ordinal, stk::mesh::Permutation permut); + void change_existing_permutation_for_connected_face(unsigned bucket_ordinal_of_higher_ranked_entity, unsigned face_connectivity_ordinal, stk::mesh::Permutation permut); virtual ~Bucket(); -protected: +private: + bool destroy_relation(Entity e_from, Entity e_to, const RelationIdentifier local_id ); bool declare_relation(unsigned bucket_ordinal, Entity e_to, const ConnectivityOrdinal ordinal, Permutation permutation); + // The following *_other* functions should not be made available externally, in + // order to avoid external confusion with "constraint" and "other" connectivities. + // They are currently used within this class to provide connectivities + // externally through another interface. + Entity const* begin_others(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.begin(bucket_ordinal); + } + ConnectivityOrdinal const* begin_other_ordinals(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.begin_ordinals(bucket_ordinal); + } + Permutation const* begin_other_permutations(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.begin_permutations(bucket_ordinal); + } + unsigned num_other(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.num_connectivity(bucket_ordinal); + } + Entity const* end_others(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.end(bucket_ordinal); + } + ConnectivityOrdinal const* end_other_ordinals(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.end_ordinals(bucket_ordinal); + } + Permutation const* end_other_permutations(unsigned bucket_ordinal) const { + return m_dynamic_other_connectivity.end_permutations(bucket_ordinal); + } + void supersets( PartVector & ) const ; /** \brief The \ref stk::mesh::BulkData "bulk data manager" @@ -403,34 +443,65 @@ class Bucket // Optional fields argument, only copy listed fields void reset_entity_location(Entity entity, unsigned to_ordinal, const std::vector* fields = nullptr); - friend class BulkData; - friend class impl::Partition; + unsigned get_others_begin_index(unsigned bucket_ordinal, EntityRank rank) const; + unsigned get_others_end_index(unsigned bucket_ordinal, EntityRank rank) const; + unsigned get_others_index_count(unsigned bucket_ordinal, EntityRank rank) const; + + template + void modify_connectivity(T& callable, EntityRank rank); + + template + void process_all_connectivity(T& callable, Bucket* other_bucket = nullptr); + + void check_for_invalid_connectivity_request(ConnectivityType const* type) const + { +#ifndef NDEBUG + debug_check_for_invalid_connectivity_request(type); +#endif + } + + void debug_check_for_invalid_connectivity_request(ConnectivityType const* type) const; + friend class impl::BucketRepository; + friend class impl::Partition; + friend struct impl::OverwriteEntityFunctor; + friend class BulkData; // Replacement friend. + friend struct Entity; friend class DeviceMesh; BulkData & m_mesh ; // Where this bucket resides - SparseConnectivity & m_sparse_connectivity; const EntityRank m_entity_rank ; // Type of entities for this bucket + stk::topology m_topology ; // The topology of this bucket std::vector m_key ; // REFACTOR std::pair m_partOrdsBeginEnd; - stk::topology m_topology ; // The topology of this bucket const size_t m_capacity ; // Capacity for entities size_type m_size ; // Number of entities - unsigned m_bucket_id; + unsigned m_bucket_id; // Index into its BucketRepository's m_bucket[entity_rank()], these are NOT unique unsigned m_ngp_bucket_id; bool m_is_modified; PartVector m_parts; // Entity data - std::vector m_entities; + std::vector m_entities; // Array of entity handles; will be removed soon impl::Partition *m_partition; ConnectivityType m_node_kind; ConnectivityType m_edge_kind; ConnectivityType m_face_kind; - ConnectedTopologyNodes m_topoNodes; - ConnectedSparseNodes m_sparseNodes; + ConnectivityType m_element_kind; + + impl::BucketConnectivity m_fixed_node_connectivity; // fixed connectivity to nodes + impl::BucketConnectivity m_fixed_edge_connectivity; // fixed connectivity to edges + impl::BucketConnectivity m_fixed_face_connectivity; // fixed connectivity to faces + impl::BucketConnectivity m_fixed_element_connectivity; // fixed connectivity to elements + + impl::BucketConnectivity m_dynamic_node_connectivity; // dynamic connectivity to nodes + impl::BucketConnectivity m_dynamic_edge_connectivity; // dynamic connectivity to edges + impl::BucketConnectivity m_dynamic_face_connectivity; // dynamic connectivity to faces + impl::BucketConnectivity m_dynamic_element_connectivity; // dynamic connectivity to elements + + impl::BucketConnectivity m_dynamic_other_connectivity; // dynamic connectivity to everything else bool m_owned; bool m_shared; @@ -439,6 +510,8 @@ class Bucket std::vector m_ngp_field_bucket_id; std::vector m_ngp_field_is_modified; }; +#undef CONNECTIVITY_TYPE_SWITCH +#undef RANK_SWITCH /** \brief Is this bucket a subset of the given * \ref stk::mesh::Part "part" by partID @@ -519,16 +592,31 @@ inline unsigned Bucket::num_connectivity(unsigned bucket_ordinal, EntityRank rank) const { switch(rank) { - case stk::topology::NODE_RANK: return num_nodes(bucket_ordinal); + case stk::topology::NODE_RANK: return num_nodes(bucket_ordinal); + case stk::topology::EDGE_RANK: return num_edges(bucket_ordinal); + case stk::topology::FACE_RANK: return num_faces(bucket_ordinal); + case stk::topology::ELEMENT_RANK: return num_elements(bucket_ordinal); default: - return m_sparse_connectivity.num_connectivity(m_entities[bucket_ordinal], rank); + return get_others_index_count(bucket_ordinal, rank); } } inline bool Bucket::has_permutation(EntityRank rank) const { - return SparseConnectivity::has_permutation(entity_rank(), rank); + switch(rank) { + case stk::topology::NODE_RANK: + return m_node_kind == FIXED_CONNECTIVITY ? m_fixed_node_connectivity.has_permutation() : m_dynamic_node_connectivity.has_permutation(); + case stk::topology::EDGE_RANK: + return m_edge_kind == FIXED_CONNECTIVITY ? m_fixed_edge_connectivity.has_permutation() : m_dynamic_edge_connectivity.has_permutation(); + case stk::topology::FACE_RANK: + return m_face_kind == FIXED_CONNECTIVITY ? m_fixed_face_connectivity.has_permutation() : m_dynamic_face_connectivity.has_permutation(); + case stk::topology::ELEMENT_RANK: + return m_element_kind == FIXED_CONNECTIVITY ? m_fixed_element_connectivity.has_permutation() : m_dynamic_element_connectivity.has_permutation(); + case stk::topology::CONSTRAINT_RANK: + default: + return false; + } } inline @@ -541,15 +629,106 @@ ConnectivityType Bucket::connectivity_type(EntityRank rank) const return m_edge_kind; case stk::topology::FACE_RANK: return m_face_kind; + case stk::topology::ELEMENT_RANK: + return m_element_kind; default: return DYNAMIC_CONNECTIVITY; } } +template +inline +void Bucket::process_all_connectivity(T& callable, Bucket* other_bucket) +{ + if (callable.is_modifying()) { + mark_for_modification(); + } + + switch(m_node_kind) { + case FIXED_CONNECTIVITY: + callable.template operator()(*this, m_fixed_node_connectivity, other_bucket); break; + case DYNAMIC_CONNECTIVITY: + callable.template operator()(*this, m_dynamic_node_connectivity, other_bucket); break; + default: break; + } + + switch(m_edge_kind) { + case FIXED_CONNECTIVITY: + callable.template operator()(*this, m_fixed_edge_connectivity, other_bucket); break; + case DYNAMIC_CONNECTIVITY: + callable.template operator()(*this, m_dynamic_edge_connectivity, other_bucket); break; + default: break; + } + + switch(m_face_kind) { + case FIXED_CONNECTIVITY: + callable.template operator()(*this, m_fixed_face_connectivity, other_bucket); break; + case DYNAMIC_CONNECTIVITY: + callable.template operator()(*this, m_dynamic_face_connectivity, other_bucket); break; + default: break; + } + + switch(m_element_kind) { + case FIXED_CONNECTIVITY: + callable.template operator()(*this, m_fixed_element_connectivity, other_bucket); break; + case DYNAMIC_CONNECTIVITY: + callable.template operator()(*this, m_dynamic_element_connectivity, other_bucket); break; + default: break; + } + + callable.template operator()(*this, m_dynamic_other_connectivity, other_bucket); +} + +template +inline +void Bucket::modify_connectivity(T& callable, EntityRank rank) +{ + switch(rank) { + case stk::topology::NODE_RANK: + ThrowAssert(m_node_kind != INVALID_CONNECTIVITY_TYPE); + mark_for_modification(); + + switch(m_node_kind) { + case FIXED_CONNECTIVITY: callable(*this, m_fixed_node_connectivity); break; + case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_node_connectivity); break; + default: break; + } + break; + case stk::topology::EDGE_RANK: + ThrowAssert(m_edge_kind != INVALID_CONNECTIVITY_TYPE); + switch(m_edge_kind) { + case FIXED_CONNECTIVITY: callable(*this, m_fixed_edge_connectivity); break; + case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_edge_connectivity); break; + default: break; + } + break; + case stk::topology::FACE_RANK: + ThrowAssert(m_face_kind != INVALID_CONNECTIVITY_TYPE); + switch(m_face_kind) { + case FIXED_CONNECTIVITY: callable(*this, m_fixed_face_connectivity); break; + case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_face_connectivity); break; + default: break; + } + break; + case stk::topology::ELEMENT_RANK: + ThrowAssert(m_element_kind != INVALID_CONNECTIVITY_TYPE); + switch(m_element_kind) { + case FIXED_CONNECTIVITY: callable(*this, m_fixed_element_connectivity); break; + case DYNAMIC_CONNECTIVITY: callable(*this, m_dynamic_element_connectivity); break; + default: break; + } + break; + default: + callable(*this, m_dynamic_other_connectivity); + break; + } +} + typedef Bucket::iterator BucketIterator; } // namespace mesh } // namespace stk -#endif + +#endif diff --git a/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp b/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp new file mode 100644 index 000000000000..c5d6391af751 --- /dev/null +++ b/packages/stk/stk_mesh/stk_mesh/base/BucketConnectivity.hpp @@ -0,0 +1,1170 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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. +// + +#ifndef STK_MESH_BUCKET_CONNECTIVITY_HPP +#define STK_MESH_BUCKET_CONNECTIVITY_HPP + +#include "stk_mesh/base/Types.hpp" // for ConnectivityOrdinal, etc +#include // for Entity +#include "stk_util/util/ReportHandler.hpp" + +namespace stk { +namespace mesh { + +class BulkData; + +namespace impl { + +struct LowerConnectivityCompare +{ + bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const + { + // only compare ordinals + return first_ordinal < second_ordinal; + } +}; + +template +struct LowerConnectivitityRankSensitiveCompare +{ + LowerConnectivitityRankSensitiveCompare(const BULKDATA &bulk_data) : m_mesh(bulk_data) { } + + const BULKDATA &m_mesh; + + bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, + Entity second_entity, ConnectivityOrdinal second_ordinal) const; +}; + +struct HigherConnectivityCompare +{ + bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const + { + // Needs to match LessRelation in BulkData.hpp + return std::make_pair(first_ordinal, first_entity.is_local_offset_valid() ? first_entity.local_offset() : Entity::MaxEntity) < + std::make_pair(second_ordinal, second_entity.is_local_offset_valid() ? second_entity.local_offset() : Entity::MaxEntity); + } +}; + +template +struct HigherConnectivityRankSensitiveCompare +{ + HigherConnectivityRankSensitiveCompare(const BULKDATA &bulk_data) : m_mesh(bulk_data) { } + + const BULKDATA &m_mesh; + + bool operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, + ConnectivityOrdinal second_ordinal) const; +}; + +template +inline void check_bucket_ordinal(unsigned bucket_ordinal, Connectivity const* connectivity) +{ + ThrowAssertMsg(bucket_ordinal < connectivity->size(), + "bucket_ordinal " << bucket_ordinal << " is out of range, bucket size is " << connectivity->size()); +} + +template +class BucketConnectivity; + +template +size_t capacity_in_bytes(const VecType& v) +{ + return sizeof(typename VecType::value_type)*v.capacity(); +} + +template +class BucketConnectivity +{ + public: + typedef BucketConnectivity SelfType; + typedef BucketConnectivity OtherType; + + static const EntityRank target_rank = TargetRank; + static const ConnectivityType connectivity_type = FIXED_CONNECTIVITY; + + typedef std::vector EntityVector; + typedef std::vector ConnectivityOrdinalVector; + typedef std::vector PermutationVector; + + BucketConnectivity() //default constructed BucketConnectivity implies connectivity is not used + : m_num_connectivity(0u) + , m_targets() + , m_ordinals() + , m_permutations() + {} + + BucketConnectivity(unsigned arg_num_connectivity) + : m_num_connectivity(0) + , m_targets() + , m_ordinals() + , m_permutations() + { + set_num_connectivity(arg_num_connectivity); + } + + void set_num_connectivity(unsigned arg_num_connectivity) + { + ThrowAssertMsg(m_num_connectivity == 0, "Cannot reset num_connectivity"); + ThrowAssertMsg(arg_num_connectivity != 0, "Cannot set num connectivity to 0 for fixed connectivity"); + + m_num_connectivity = arg_num_connectivity; + + // Ordinal is the same for all fixed, just counts up + m_ordinals.resize(m_num_connectivity); + for (ConnectivityOrdinal ord=static_cast(0); ord < static_cast(m_num_connectivity); ++ord) { + m_ordinals[ord] = ord; + } + } + + // Entity iterator + + Entity const* begin(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[bucket_ordinal * m_num_connectivity]; } + + Entity * begin(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[bucket_ordinal * m_num_connectivity]; } + + Entity const* end(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[(bucket_ordinal + 1) * m_num_connectivity]; } + + Entity * end(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[(bucket_ordinal + 1) * m_num_connectivity]; } + + // Ordinal iterator + + ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return m_ordinals.data(); } + + ConnectivityOrdinal * begin_ordinals(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return m_ordinals.data(); } + + ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return m_ordinals.data() + m_num_connectivity; } + + ConnectivityOrdinal * end_ordinals(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return m_ordinals.data() + m_num_connectivity; } + + // Permutation iterator + + Permutation const* begin_permutations(unsigned bucket_ordinal) const + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[bucket_ordinal * m_num_connectivity]; + } + + Permutation * begin_permutations(unsigned bucket_ordinal) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[bucket_ordinal * m_num_connectivity]; + } + + Permutation const* end_permutations(unsigned bucket_ordinal) const + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[(bucket_ordinal + 1) * m_num_connectivity]; + } + + Permutation * end_permutations(unsigned bucket_ordinal) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[(bucket_ordinal + 1) * m_num_connectivity]; + } + + // Queries + + unsigned num_connectivity(unsigned /*bucket_ordinal*/) const + { return m_num_connectivity; } + + // return number of entities + unsigned size() const + { return m_targets.size() / m_num_connectivity; } + + // Modification API + + bool add_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation = INVALID_PERMUTATION) + { + ThrowAssertMsg(ordinal < m_num_connectivity, + "Ordinal " << (uint32_t)ordinal << " exceeds topological limit: " << m_num_connectivity); + impl::check_bucket_ordinal(bucket_ordinal, this); +#ifndef NDEBUG + // TODO - Add topology invariant; target entity should match a sub topology +#endif + + unsigned index = m_num_connectivity*bucket_ordinal + ordinal; + + if (m_targets[index] == to) { + ThrowAssert(!has_permutation() || m_permutations[index] == permutation); + // Already exists + return false; + } + + m_targets[index] = to; + + if (has_permutation()) { + m_permutations[index] = permutation; + } + + return true; + } + + bool remove_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) + { + ThrowAssertMsg(ordinal < m_num_connectivity, + "Ordinal " << (uint32_t)ordinal << " exceeds topological limit: " << m_num_connectivity); + impl::check_bucket_ordinal(bucket_ordinal, this); + + unsigned index = m_num_connectivity*bucket_ordinal + ordinal; + if (m_targets[index] != to) { + return false; + } + + // Clear + m_targets[index] = Entity(); + if (has_permutation()) { + m_permutations[index] = INVALID_PERMUTATION; + } + + return true; + } + + void begin_modification() + {} + + template // hack to get around dependency + void end_modification(BULKDATA* mesh = NULL); + + void add_entity() + { + const unsigned new_conn_size = m_targets.size() + m_num_connectivity; + Entity invalid; + m_targets.resize(new_conn_size, invalid); // Not a perf issue: vectors are smart when resizing + if (has_permutation()) { + m_permutations.resize(new_conn_size, INVALID_PERMUTATION); + } + } + + // Always removes last entity + void remove_entity() + { + ThrowAssertMsg(size() > 0, "Cannot remove, connectivity is already empty"); + + const unsigned new_conn_size = m_targets.size() - m_num_connectivity; + m_targets.resize(new_conn_size); + if (has_permutation()) { + m_permutations.resize(new_conn_size); + } + } + + void copy_entity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal=-1u) + { + ThrowAssertMsg(size() > 0, "Cannot move, connectivity is empty"); + + if (to_ordinal == -1u) { // check if we should just append + to_ordinal = to.size(); + to.add_entity(); // make room for new entity + } + + // Copy connectivity to other BucketConnectivity + copy_connectivity(from_ordinal, to, to_ordinal); + } + + void copy_to_fixed(unsigned from_ordinal, SelfType& to) + { ThrowAssert(false); } + + void copy_to_fixed(unsigned from_ordinal, OtherType& to) + { ThrowAssert(false); } + + bool has_permutation() const + { + const static bool rv = TargetRank != stk::topology::NODE_RANK; + return rv; + } + + size_t heap_memory_in_bytes() const + { + return capacity_in_bytes(m_targets) + + capacity_in_bytes(m_ordinals) + + capacity_in_bytes(m_permutations); + } + + void debug_dump(std::ostream& out) const + { + out << "For fixed connectivity to rank: " << TargetRank << "\n"; + out << " size is: " << size() << "\n"; + for (int i = 0, ie = size(); i < ie; ++i) { + out << " At ordinal " << i << "\n"; + debug_dump(out, i); + } + out << std::endl; + } + + void debug_dump(std::ostream& out, unsigned ordinal) const + { + for (int j = m_num_connectivity * ordinal, je = m_num_connectivity*(ordinal+1); j < je; ++j) { + out << " target:" << m_targets[j].local_offset() << "\n"; + } + } + +private: + + void copy_connectivity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal) + { + unsigned to_offset = to_ordinal * m_num_connectivity; + unsigned from_offset = from_ordinal * m_num_connectivity; + + std::copy(m_targets.begin() + from_offset, + m_targets.begin() + from_offset + m_num_connectivity, + to.m_targets.begin() + to_offset); + + if (has_permutation()) { + std::copy(m_permutations.begin() + from_offset, + m_permutations.begin() + from_offset + m_num_connectivity, + to.m_permutations.begin() + to_offset); + } + } + + // Illegal + BucketConnectivity(const SelfType&); + SelfType& operator=(const SelfType&); + + // MEMBERS + + unsigned m_num_connectivity; + + // connectivity data + EntityVector m_targets; + ConnectivityOrdinalVector m_ordinals; // shared for all entities + PermutationVector m_permutations; + + // friend OtherType; // 1337! Will have to wait for c++11 + friend class BucketConnectivity; +}; + +// Want a way for all dynamic connectivity instantiations to share the same id space +struct Counter +{ + static int counter; +}; + +// Profiling data for an individual dynamic connectivity object +struct DynConnData +{ + // from-rank for the associated dynamic connectivity + EntityRank m_from_rank; + + // to-rank for the associated dynamic connectivity + EntityRank m_to_rank; + + // the maximum capacity ever achieved by connectivity vectors + size_t m_max_capacity; + + // at the point at which maximum capacity (member above) was achieved, how much memory + // was lost due to "abandoned space". + // "abandoned space" - When an entity overflows its current chunks, it gets additional + // chunks but must be copied to the end. The space left behind is abandoned and will + // not be reused until the next compress (resize_and_order_by_index). + size_t m_abandoned_space; + + // at the point at which maximum capacity (member above) was achieved, how much memory + // was lost due to unused chunk capacity. If chunk size is > 1, it's possible that an + // entity is not using all the space available in it's chunk. For example, if chunk size + // is 8 and an entity has 5 connectivities, then unused chunk capacity is 3 for that + // entity. This member stores the sum over all entities. + size_t m_unused_chunk_capacity; + + // The number of times this dynamic connectivity had to be grown + size_t m_num_growths; + + // The number of times any entity overflowed it's chunk allocation and had to be + // copied to the end + size_t m_num_entity_relocations; + + // at the point at which maximum capacity (member above) was achieved, what is the + // total amount of wasted memory + size_t m_total_unused_memory; + + // at the point at which maximum capacity (member above) was achieved, what is the + // amount of memory that is wasted due to vector capacity growth over-provisioning. + size_t m_unused_capacity; + + // at the point at which maximum capacity (member above) was achieved, what is the + // number of connectivity being stored. + size_t m_total_num_conn; + + DynConnData(EntityRank from_rank, EntityRank to_rank) : + m_from_rank(from_rank), + m_to_rank(to_rank), + m_max_capacity(0), + m_abandoned_space(0), + m_unused_chunk_capacity(0), + m_num_growths(0), + m_num_entity_relocations(0), + m_total_unused_memory(0), + m_unused_capacity(0), + m_total_num_conn(0) + {} +}; + +template +class BucketConnectivity +{ + enum connectivity_direction { Lower=0,Higher=1,Adjacent=2 }; + +public: + typedef BucketConnectivity SelfType; + typedef BucketConnectivity OtherType; + + static const EntityRank target_rank = TargetRank; + static const ConnectivityType connectivity_type = DYNAMIC_CONNECTIVITY; + + typedef std::vector EntityVector; + typedef std::vector ConnectivityOrdinalVector; + typedef std::vector PermutationVector; + typedef std::vector UInt32Vector; + typedef std::vector UInt16Vector; + + static const unsigned chunk_size = 1u; + + BucketConnectivity(EntityRank from_rank, BulkData *bulk_data) + : m_from_rank(from_rank) + , m_direction( (m_from_rank > TargetRank) ? Lower : ((m_from_rank == TargetRank) ? Adjacent : Higher)) + , m_active(false) + , m_needs_shrink_to_fit(false) + , m_num_inactive(0) + , m_indices() + , m_num_connectivities() + , m_total_connectivities(0) + , m_targets() + , m_ordinals() + , m_permutations() + , m_bulk_data(bulk_data) + , m_id(Counter::counter++) + , m_rank_sensitive_higher_connectivity_cmp(*m_bulk_data) + , m_rank_sensitive_lower_connectivity_cmp(*m_bulk_data) + , m_last_capacity(0) + { + } + + // Entity iterator + + Entity const* begin(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[m_active ? m_indices[bucket_ordinal] : 0]; } + + Entity * begin(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_targets[m_active ? m_indices[bucket_ordinal] : 0]; } + + Entity const* end(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return begin(bucket_ordinal) + num_connectivity(bucket_ordinal); } + + Entity * end(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return begin(bucket_ordinal) + num_connectivity(bucket_ordinal); } + + // Ordinal iterator + + ConnectivityOrdinal const* begin_ordinals(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_ordinals[m_active ? m_indices[bucket_ordinal] : 0]; } + + ConnectivityOrdinal * begin_ordinals(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return &m_ordinals[m_active ? m_indices[bucket_ordinal] : 0]; } + + ConnectivityOrdinal const* end_ordinals(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return begin_ordinals(bucket_ordinal) + num_connectivity(bucket_ordinal); } + + ConnectivityOrdinal * end_ordinals(unsigned bucket_ordinal) + { impl::check_bucket_ordinal(bucket_ordinal, this); + return begin_ordinals(bucket_ordinal) + num_connectivity(bucket_ordinal); } + + // Permutation iterator + + Permutation const* begin_permutations(unsigned bucket_ordinal) const + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[m_active ? m_indices[bucket_ordinal] : 0]; + } + + Permutation * begin_permutations(unsigned bucket_ordinal) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return &m_permutations[m_active ? m_indices[bucket_ordinal] : 0]; + } + + Permutation const* end_permutations(unsigned bucket_ordinal) const + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return begin_permutations(bucket_ordinal) + num_connectivity(bucket_ordinal); + } + + Permutation * end_permutations(unsigned bucket_ordinal) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + if (!has_permutation()) return NULL; + return begin_permutations(bucket_ordinal) + num_connectivity(bucket_ordinal); + } + + // Queries + + unsigned num_connectivity(unsigned bucket_ordinal) const + { impl::check_bucket_ordinal(bucket_ordinal, this); + return m_active ? m_num_connectivities[bucket_ordinal] : 0; } + + // return number of entities + unsigned size() const + { return m_active ? m_indices.size() : m_num_inactive; } + + // Modification API + + bool add_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation = INVALID_PERMUTATION) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + + m_needs_shrink_to_fit = true; + + if (!m_active) { + activate(); + } + + if (target_rank <= stk::topology::ELEMENT_RANK) { + switch(m_direction) + { + case Lower: return add_helper(bucket_ordinal, to, ordinal, permutation, LowerConnectivityCompare()); + case Higher: return add_helper(bucket_ordinal, to, ordinal, permutation, HigherConnectivityCompare()); + case Adjacent: return add_helper(bucket_ordinal, to, ordinal, permutation, LowerConnectivityCompare()); // same comparing as lower + default: + ThrowAssertMsg(false, "What type of connectivity are you trying to add? " << m_direction); + return false; + } + } + else { + switch(m_direction) + { + case Lower: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_lower_connectivity_cmp); + case Higher: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_higher_connectivity_cmp); + case Adjacent: return add_helper(bucket_ordinal, to, ordinal, permutation, m_rank_sensitive_lower_connectivity_cmp); + default: + ThrowAssertMsg(false, "What type of connectivity are you trying to add? " << m_direction); + return false; + } + } + } + + bool remove_connectivity(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal) + { + impl::check_bucket_ordinal(bucket_ordinal, this); + + if (!m_active) return false; + + uint32_t found_idx = ~0u; + const uint32_t end_i = m_indices[bucket_ordinal]+m_num_connectivities[bucket_ordinal]; + for (uint32_t i = m_indices[bucket_ordinal]; i < end_i; ++i) + { + //remove connectivity + if ( m_targets[i] == to && m_ordinals[i] == ordinal ) { + found_idx = i; + --m_num_connectivities[bucket_ordinal]; + --m_total_connectivities; + break; + } + } + + //slide memory down + if (found_idx != ~0u) { + m_needs_shrink_to_fit = true; + for (uint32_t i = found_idx; i < end_i - 1; ++i) { + m_targets[i] = m_targets[i+1]; + m_ordinals[i] = m_ordinals[i+1]; + if (has_permutation()) { + m_permutations[i] = m_permutations[i+1]; + } + } + } + + return found_idx != ~0u; + } + + void begin_modification() + {} + + template + void end_modification(BULKDATA* mesh = NULL); + + void add_entity() + { + if (m_active) { + m_indices.push_back(m_targets.size()); + m_num_connectivities.push_back(0); + m_needs_shrink_to_fit = true; + } + else { + ++m_num_inactive; + } + } + + void remove_entity() + { + ThrowAssertMsg(size() > 0, "Cannot remove, connectivity is already empty"); + + if (m_active) { + m_indices.pop_back(); + m_total_connectivities -= m_num_connectivities.back(); + m_num_connectivities.pop_back(); + m_needs_shrink_to_fit = true; + } + else { + --m_num_inactive; + } + } + + void copy_entity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal=-1u) + { + ThrowAssert(m_from_rank == to.m_from_rank); + impl::check_bucket_ordinal(from_ordinal, this); + + if (to_ordinal == -1u) { + to_ordinal = to.size(); + to.add_entity(); + } + impl::check_bucket_ordinal(to_ordinal, &to); + + // Manage activation state + if (!m_active) { + if (to.m_active) { + to.m_total_connectivities -= to.m_num_connectivities[to_ordinal]; + to.m_num_connectivities[to_ordinal] = 0; + to.m_needs_shrink_to_fit = true; + } + return; + } + if (m_active && !to.m_active) { + to.activate(); + } + + // Copy data + if (&to == this) { + // easy + // note this implements swap semantics instead of copy, but this is necessary + // to avoid aliasing in certain situations when sorting Partitions + std::swap(m_indices[to_ordinal], m_indices[from_ordinal]); + std::swap(m_num_connectivities[to_ordinal], m_num_connectivities[from_ordinal]); + + m_needs_shrink_to_fit = true; + to.m_needs_shrink_to_fit = true; + } + else { + // much harder + const unsigned from_num = m_num_connectivities[from_ordinal]; + const unsigned to_num = to.m_num_connectivities[to_ordinal]; + const int delta_num = from_num - to_num; + if (delta_num > 0) { + // If adding additional connectivity, need to reserve space + to.add_connectivity_helper(to_ordinal, delta_num); + } + else { + to.m_num_connectivities[to_ordinal] = from_num; + to.m_total_connectivities += delta_num; + } + if (delta_num != 0) { + to.m_needs_shrink_to_fit = true; + } + copy_connectivity(from_ordinal, to, to_ordinal); + } + } + + void copy_to_fixed(unsigned from_ordinal, OtherType& to) + { + const unsigned num_conn_to_move = m_active ? m_num_connectivities[from_ordinal] : 0; + + ThrowAssert(OtherType::connectivity_type == FIXED_CONNECTIVITY); + ThrowAssertMsg(size() > 0, "Cannot move, connectivity is empty"); + ThrowAssertMsg(num_conn_to_move <= to.num_connectivity(666 /*any unsigned, doesn't matter*/), "Incompatible"); + + const unsigned to_offset = to.m_targets.size(); + to.add_entity(); // make room for new entity + + const unsigned from_offset = m_active ? m_indices[from_ordinal] : 0; + +#ifndef NDEBUG + // Check the ordinals are compatible with fixed connectivity + ConnectivityOrdinal const* ordinals = m_ordinals.data() + from_offset; + for (unsigned i = 0; i < num_conn_to_move; ++i) { + ThrowAssert(ordinals[i] == i); + } +#endif + + std::copy(m_targets.begin() + from_offset, + m_targets.begin() + from_offset + num_conn_to_move, + to.m_targets.begin() + to_offset); + + if (has_permutation()) { + std::copy(m_permutations.begin() + from_offset, + m_permutations.begin() + from_offset + num_conn_to_move, + to.m_permutations.begin() + to_offset); + } + } + + void copy_to_fixed(unsigned from_ordinal, SelfType& to) + { ThrowAssert(false); } + + bool has_permutation() const + { return does_rank_have_valid_permutations(TargetRank) && does_rank_have_valid_permutations(m_from_rank); } + + size_t heap_memory_in_bytes() const + { + return capacity_in_bytes(m_targets) + + capacity_in_bytes(m_ordinals) + + capacity_in_bytes(m_permutations); + } + + void debug_dump(std::ostream& out) const + { + out << "For dynamic connectivity to rank: " << TargetRank << ", with id: " << m_id << "\n"; + if (m_active) { + out << " size is: " << m_indices.size() << "\n"; + for (int i = 0, ie = m_indices.size(); i < ie; ++i) { + out << " At ordinal " << i << "\n"; + debug_dump(out, i, false); + } + out << std::endl; + } + else { + out << " size is: " << m_num_inactive << ", but inactive" << std::endl; + } + } + + void debug_dump(std::ostream& out, unsigned ordinal, bool add_context=true) const + { + if (m_active) { + int idx = m_indices[ordinal]; + int num = m_num_connectivities[ordinal]; + if (add_context) { + out << "For dynamic connectivity to rank: " << TargetRank << ", with id: " << m_id << "\n"; + } + out << " Index is: " << idx << ", Num is: " << num << "\n"; + for (int j = idx, je = idx + num; j < je; ++j) { + out << " (target:" << m_targets[j].local_offset() << ", ordinal:" << (uint32_t)m_ordinals[j] << ")\n"; + } + } + else { + out << " Index is: 0, Num is: 0\n"; + } + } + +private: + + bool does_rank_have_valid_permutations(stk::mesh::EntityRank rank) const + { + return rank > stk::topology::NODE_RANK && rank < stk::topology::CONSTRAINT_RANK; + } + + void copy_connectivity(unsigned from_ordinal, SelfType& to, unsigned to_ordinal) + { + unsigned num_conn = m_num_connectivities[from_ordinal]; + unsigned to_offset = to.m_indices[to_ordinal]; + unsigned from_offset = m_indices[from_ordinal]; + ThrowAssert(to.m_num_connectivities[to_ordinal] == num_conn); + + std::copy(m_targets.begin() + from_offset, + m_targets.begin() + from_offset + num_conn, + to.m_targets.begin() + to_offset); + + std::copy(m_ordinals.begin() + from_offset, + m_ordinals.begin() + from_offset + num_conn, + to.m_ordinals.begin() + to_offset); + + if (has_permutation()) { + std::copy(m_permutations.begin() + from_offset, + m_permutations.begin() + from_offset + num_conn, + to.m_permutations.begin() + to_offset); + } + } + + static unsigned num_chunks(unsigned num) + { return (num + chunk_size -1)/chunk_size; } + + void activate() + { + ThrowAssert(!m_active); + + m_indices.resize(m_num_inactive, 0); + m_num_connectivities.resize(m_num_inactive, 0); + + m_active = true; + m_num_inactive = 0; + } + + template + void resize_and_order_by_index_helper(Vector & data, unsigned capacity, bool update_index = false) + { + Vector temp; + temp.reserve(capacity); + + uint32_t current_index=0; + for(size_t i=0, e=m_indices.size(); i 0 ? 2 * old_capacity : 8*chunk_size; + while (new_capacity < minimum_size) { + new_capacity *= 2; + } + return new_capacity; + } + + // The old capacity is at or above the threshold for being careful about growing + // the connectivity representation(and memory footprint). Only grow the capacity + // if compressing the representation will not yield sufficient unused capacity. + if (capacity_ratio * m_total_connectivities > old_capacity) + { + return 2 * old_capacity; + } + else + { + return old_capacity; + } + } + + void add_connectivity_helper(unsigned bucket_ordinal, unsigned num_to_add=1) + { + const unsigned chunks_needed_by_entity = num_chunks(m_num_connectivities[bucket_ordinal]+num_to_add); + const unsigned chunks_used_by_entity = num_chunks(m_num_connectivities[bucket_ordinal]); + + if (chunks_needed_by_entity == chunks_used_by_entity) + { + m_total_connectivities += num_to_add; + m_num_connectivities[bucket_ordinal] += num_to_add; + return; + } + + const unsigned chunks_available = num_chunks(m_targets.capacity() - m_targets.size()); + + if (chunks_available < chunks_needed_by_entity) + { + const unsigned new_capacity = compute_new_connectivity_capacity(m_targets.size() + chunks_needed_by_entity * chunk_size); + resize_and_order_by_index(new_capacity); + } + + const bool last_entity_by_index = (chunks_used_by_entity > 0) && + (m_indices[bucket_ordinal] + chunks_used_by_entity*chunk_size == m_targets.size()); + Entity invalid; + + //copy to end + if (!last_entity_by_index) + { + uint32_t new_index = static_cast(m_targets.size()); + + m_targets.insert(m_targets.end(), chunks_needed_by_entity*chunk_size, invalid); + std::copy(begin(bucket_ordinal), end(bucket_ordinal), m_targets.begin() + new_index); + + m_ordinals.insert(m_ordinals.end(), chunks_needed_by_entity*chunk_size, INVALID_CONNECTIVITY_ORDINAL); + std::copy(begin_ordinals(bucket_ordinal), end_ordinals(bucket_ordinal), m_ordinals.begin() + new_index); + + if (has_permutation()) { + m_permutations.insert(m_permutations.end(), chunks_needed_by_entity*chunk_size, INVALID_PERMUTATION); + std::copy(begin_permutations(bucket_ordinal), end_permutations(bucket_ordinal), m_permutations.begin() + new_index); + } + + m_indices[bucket_ordinal] = new_index; + } + //add new chunk to end + else { + const unsigned extra_chunks_needed = chunks_needed_by_entity - chunks_used_by_entity; + m_targets.insert(m_targets.end(), extra_chunks_needed*chunk_size, invalid); + m_ordinals.insert(m_ordinals.end(), extra_chunks_needed*chunk_size, INVALID_CONNECTIVITY_ORDINAL); + if (has_permutation()) { + m_permutations.insert(m_permutations.end(), extra_chunks_needed*chunk_size, INVALID_PERMUTATION); + } + } + + m_total_connectivities += num_to_add; + m_num_connectivities[bucket_ordinal] += num_to_add; + } + + template + bool add_helper(unsigned bucket_ordinal, Entity to, ConnectivityOrdinal ordinal, Permutation permutation, + const ConnectivityComparator &compare) + { +#ifndef NDEBUG + // TODO - If downward conn, check to's rank and topology +#endif + bool rv = true; + + add_connectivity_helper(bucket_ordinal); + + const uint32_t begin_index = m_indices[bucket_ordinal] + m_num_connectivities[bucket_ordinal] - 1; + + if (m_num_connectivities[bucket_ordinal] == 1) { + m_targets[begin_index] = to; + m_ordinals[begin_index] = ordinal; + if (has_permutation()) { + m_permutations[begin_index] = permutation; + } + return true; + } + + for (uint32_t i = begin_index, e = m_indices[bucket_ordinal]; i > e; --i) + { + //slide up + if ( compare(to, ordinal, m_targets[i-1], m_ordinals[i-1u]) ) { + m_targets[i] = m_targets[i-1u]; + m_ordinals[i] = m_ordinals[i-1u]; + if (has_permutation()) { + m_permutations[i] = m_permutations[i-1u]; + } + //insert if on last iteration + if ((i-1)==e) { + m_targets[i-1u] = to; + m_ordinals[i-1u] = ordinal; + if (has_permutation()) { + m_permutations[i-1u] = permutation; + } + } + } + //insert + else if ( compare(m_targets[i-1], m_ordinals[i-1u], to, ordinal) ) { + m_targets[i] = to; + m_ordinals[i] = ordinal; + if (has_permutation()) { + m_permutations[i] = permutation; + } + break; + } + //duplicate -- insert new and remove the original + else + { + m_targets[i] = to; + m_ordinals[i] = ordinal; + if (has_permutation()) { + m_permutations[i] = permutation; + } + remove_connectivity(bucket_ordinal, to, ordinal); + rv = false; + break; + } + } + + return rv; + } + + // Illegal + BucketConnectivity(const SelfType&); + SelfType& operator=(const SelfType&); + + // MEMBERS + + EntityRank m_from_rank; + connectivity_direction m_direction; + + bool m_active; // In many cases, uses will not make use of dynamic connectivity, so don't even waste the memory unless it looks like they want it + bool m_needs_shrink_to_fit; // True if this object potentially has partially full vectors or out-of-order entities + unsigned m_num_inactive; + + // meta data + UInt32Vector m_indices; // Common index into vectors below that stores where connectivity starts for a partition_offset (entity). + UInt32Vector m_num_connectivities; + unsigned m_total_connectivities; + + // connectivity data + EntityVector m_targets; + ConnectivityOrdinalVector m_ordinals; + PermutationVector m_permutations; + + BulkData * m_bulk_data; + int m_id; + + impl::HigherConnectivityRankSensitiveCompare m_rank_sensitive_higher_connectivity_cmp; + impl::LowerConnectivitityRankSensitiveCompare m_rank_sensitive_lower_connectivity_cmp; + + size_t m_last_capacity; + + size_t m_data_idx; +}; + +} + +// +// BucketConnectivity +// + +template +template // hack to get around dependency +inline +void impl::BucketConnectivity::end_modification(BULKDATA* mesh) +{ + //TODO: If bucket is blocked, no longer need to shrink to fit! + + if (m_targets.size() < m_targets.capacity()) { + + { + EntityVector temp(m_targets.begin(), m_targets.end()); + m_targets.swap(temp); + } + + { + PermutationVector temp(m_permutations.begin(), m_permutations.end()); + m_permutations.swap(temp); + } + } + +} + +template +template +inline +void impl::BucketConnectivity::end_modification(BULKDATA* mesh) +{ + if (m_active && m_needs_shrink_to_fit) { + resize_and_order_by_index(); + + { + UInt32Vector temp(m_indices.begin(), m_indices.end()); + m_indices.swap(temp); + } + + { + UInt32Vector temp(m_num_connectivities.begin(), m_num_connectivities.end()); + m_num_connectivities.swap(temp); + } + + m_needs_shrink_to_fit = false; + } +} + +template +inline +bool impl::LowerConnectivitityRankSensitiveCompare::operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, + Entity second_entity, ConnectivityOrdinal second_ordinal) const +{ + const EntityRank first_rank = m_mesh.entity_rank(first_entity); + const EntityRank second_rank = m_mesh.entity_rank(second_entity); + + return (first_rank < second_rank) + || ((first_rank == second_rank) && (first_ordinal < second_ordinal)); +} + +template +inline +bool impl::HigherConnectivityRankSensitiveCompare::operator()(Entity first_entity, ConnectivityOrdinal first_ordinal, Entity second_entity, ConnectivityOrdinal second_ordinal) const +{ + const EntityRank first_rank = m_mesh.entity_rank(first_entity); + const EntityRank second_rank = m_mesh.entity_rank(second_entity); + + if (first_rank < second_rank) { + return true; + } + if (first_rank > second_rank) { + return false; + } + // Needs to match LessRelation in BulkData.hpp + return std::make_pair(first_ordinal, first_entity.is_local_offset_valid() ? first_entity.local_offset() : Entity::MaxEntity) < + std::make_pair(second_ordinal, second_entity.is_local_offset_valid() ? second_entity.local_offset() : Entity::MaxEntity); +} + + + + + +}} //namespace stk::mesh::impl + +#endif diff --git a/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp b/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp index 94a407d97780..fe61ee565acc 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/BulkData.cpp @@ -100,6 +100,10 @@ namespace stk { namespace mesh { +namespace impl { +int Counter::counter = 0; +} + // Static constant on BulkData: const uint16_t BulkData::orphaned_node_marking = 25000; @@ -372,7 +376,6 @@ BulkData::BulkData(MetaData & mesh_meta_data, *this, mesh_meta_data.entity_rank_count(), bucket_capacity), - m_sparse_connectivity(mesh_meta_data.entity_rank_count()), m_use_identifiers_for_resolving_sharing(false), m_modSummary(*this), m_meshDiagnosticObserver(std::make_shared(*this)), @@ -549,11 +552,13 @@ void BulkData::mark_entity_and_upward_related_entities_as_modified(Entity entity size_t BulkData::count_relations(Entity entity) const { + const MeshIndex &mesh_idx = mesh_index(entity); + const EntityRank end_rank = static_cast(m_mesh_meta_data.entity_rank_count()); size_t count = 0; for (EntityRank irank = stk::topology::BEGIN_RANK; irank < end_rank; ++irank) { - count += num_connectivity(entity, irank); + count += mesh_idx.bucket->num_connectivity(mesh_idx.bucket_ordinal, irank); } return count; } @@ -606,7 +611,6 @@ Entity BulkData::generate_new_entity(unsigned preferred_offset) } else if (!m_deleted_entities.empty()) { new_local_offset = m_deleted_entities.front(); - m_sparse_connectivity.get_connectivity(Entity(new_local_offset)).clear(); m_deleted_entities.pop_front(); } @@ -622,7 +626,6 @@ Entity BulkData::generate_new_entity(unsigned preferred_offset) m_mark_entity.push_back(NOT_MARKED); m_closure_count.push_back(static_cast(0)); m_local_ids.push_back(stk::mesh::GetInvalidLocalId()); - m_sparse_connectivity.update_size_of_entity_index_space(m_mesh_indexes.size()); #ifdef SIERRA_MIGRATION if (m_add_fmwk_data) { @@ -796,7 +799,6 @@ PARTVECTOR add_root_topology_part(const PARTVECTOR &parts, stk::mesh::Part &root PARTVECTOR initialParts(parts.size() + 1); initialParts = parts; initialParts.push_back(&rootTopoPart); - stk::util::sort_and_unique(initialParts, PartLess()); return initialParts; } @@ -1632,12 +1634,10 @@ void BulkData::comm_procs( EntityKey key, std::vector & procs ) const void BulkData::comm_procs(Entity entity, std::vector & procs ) const { - procs.clear(); ThrowAssertMsg(is_valid(entity), "BulkData::comm_procs ERROR, input entity "<comm_map), procs); - } + + impl::fill_sorted_procs(internal_entity_comm_map(entity), procs); } void BulkData::comm_shared_procs(EntityKey key, std::vector & procs ) const @@ -2299,7 +2299,7 @@ void BulkData::internal_declare_relation( Entity entity , { require_ok_to_modify(); - stk::mesh::EntityRank entityRank = entity_rank(entity); + stk::mesh::EntityRank erank = entity_rank(entity); OrdinalVector scratch2, scratch3; @@ -2308,15 +2308,14 @@ void BulkData::internal_declare_relation( Entity entity , Entity e = i->entity(); const unsigned n = i->relation_ordinal(); const Permutation permut = i->getPermutation(); - const EntityRank eRank = entity_rank(e); - if ( eRank < entityRank ) { + if ( entity_rank(e) < erank ) { internal_declare_relation( entity , e , n, permut, ordinal_scratch, scratch2, scratch3); } - else if ( entityRank < eRank ) { + else if ( erank < entity_rank(e) ) { internal_declare_relation( e , entity , n, permut, ordinal_scratch, scratch2, scratch3); } else { - ThrowErrorMsg("declare_relation given entities of the same entity rank ("< " < ghostStatus(get_size_of_entity_index_space(), false); - m_entity_repo->clear_all_cache(); - stk::mesh::impl::comm_sync_aura_send_recv(*this, add_send, entityProcMapping, ghostStatus ); @@ -3667,22 +3664,25 @@ void BulkData::fill_list_of_entities_to_send_for_aura_ghosting(EntityProcMapping // Iterate over all shared entities, ensure that upwardly related // entities to each shared entity will be ghosted to the sharing proc. Selector shared = mesh_meta_data().globally_shared_part(); - const SparseConnectivity& sparseConnectivity = m_sparse_connectivity; std::vector sharingProcs; impl::for_each_selected_entity_run_no_threads(*this, stk::topology::NODE_RANK, shared, - [&sendAuraEntityProcs, &sparseConnectivity, &entitySharing, &sharingProcs, &end_rank] + [&sendAuraEntityProcs, &entitySharing, &sharingProcs, &end_rank] (const BulkData& bulk, const MeshIndex& meshIndex) { const Bucket& bucket = *meshIndex.bucket; const unsigned bucketOrd = meshIndex.bucket_ordinal; - const Connectivity& connObject = sparseConnectivity.get_connectivity(bucket[bucketOrd]); + const EntityRank nextHigherRank = stk::topology::EDGE_RANK; bulk.comm_shared_procs(bucket[bucketOrd], sharingProcs); - PairIterEntity conn = connObject.get_connectivity(stk::topology::EDGE_RANK, end_rank); - for (Entity relEntity : conn) { - const Connectivity& relConnectivity = sparseConnectivity.get_connectivity(relEntity); - for (const int sharingProc : sharingProcs) { - stk::mesh::impl::insert_upward_relations(bulk, relConnectivity, entitySharing, relEntity, sharingProc, sendAuraEntityProcs); + for (const int sharingProc : sharingProcs) { + + for (EntityRank higherRank = nextHigherRank; higherRank < end_rank; ++higherRank) { + const unsigned num_rels = bucket.num_connectivity(bucketOrd, higherRank); + const Entity* rels = bucket.begin(bucketOrd, higherRank); + + for (unsigned r = 0; r < num_rels; ++r) { + stk::mesh::impl::insert_upward_relations(bulk, entitySharing, rels[r], stk::topology::NODE_RANK, sharingProc, sendAuraEntityProcs); + } } } } @@ -3881,7 +3881,7 @@ void BulkData::change_connectivity_for_edge_or_face(stk::mesh::Entity side, cons if(bucket(elements[i]).owned()) { stk::mesh::Bucket& bucket_edge = bucket(side); - bucket_edge.change_connected_nodes(bucket_ordinal(side), nodes.data()); + bucket_edge.change_existing_connectivity(bucket_ordinal(side), nodes.data()); stk::mesh::Permutation new_permutation = get_permutation(*this, elements[i], nodes); ThrowRequireWithSierraHelpMsg(new_permutation!=stk::mesh::INVALID_PERMUTATION); @@ -4685,7 +4685,7 @@ void BulkData::internal_finish_modification_end(ModEndOptimizationFlag opt) m_bucket_repository.internal_default_sort_bucket_entities(should_sort_faces_by_node_ids()); } - m_bucket_repository.sync_from_partitions(); + m_bucket_repository.internal_modification_end(); m_meshModification.set_sync_state_synchronized(); m_add_node_sharing_called = false; @@ -5083,8 +5083,12 @@ void BulkData::internal_update_all_sharing_procs() const EntityCommListInfoVector& all_comm = m_entity_comm_list; for (const EntityCommListInfo& info : all_comm) { - if (info.entity_comm != nullptr && info.entity_comm->isShared) { - const EntityRank rank = info.key.rank(); + const Entity entity = info.entity; + const Bucket& bkt = bucket(entity); + + if (bkt.shared() && info.entity_comm != nullptr) { + const EntityRank rank = bkt.entity_rank(); + const EntityCommInfoVector& commInfo = info.entity_comm->comm_map; const unsigned len = commInfo.size(); unsigned i = 0; @@ -6355,7 +6359,7 @@ void BulkData::sort_entities(const stk::mesh::EntitySorterBase& sorter) ThrowRequireMsg(in_synchronized_state(), "Error, sort_entities cannot be called from inside a modification cycle."); m_bucket_repository.internal_custom_sort_bucket_entities(sorter); - m_bucket_repository.sync_from_partitions(); + m_bucket_repository.internal_modification_end(); if(parallel_size() > 1) check_mesh_consistency(); diff --git a/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp b/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp index bd73f2e42267..4976764cea06 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/BulkData.hpp @@ -62,7 +62,6 @@ #include "stk_mesh/base/Bucket.hpp" // for Bucket #include "stk_mesh/base/EntityKey.hpp" // for EntityKey, hash_value #include "stk_mesh/base/FieldDataManager.hpp" -#include "stk_mesh/base/SparseConnectivity.hpp" #include "stk_mesh/base/Relation.hpp" // for Relation, etc #include "stk_topology/topology.hpp" // for topology, etc #include "stk_util/util/ReportHandler.hpp" // for ThrowAssert, etc @@ -870,9 +869,6 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu void set_large_ids_flag(bool largeIds) { m_supportsLargeIds = largeIds; } protected: //functions - SparseConnectivity& get_sparse_connectivity() { return m_sparse_connectivity; } - const SparseConnectivity& get_sparse_connectivity() const { return m_sparse_connectivity; } - Entity declare_entity( EntityRank ent_rank , EntityId ent_id);// Mod Mark @@ -1585,7 +1581,6 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu FieldDataManager *m_field_data_manager; mutable std::vector m_selector_to_buckets_maps; impl::BucketRepository m_bucket_repository; // needs to be destructed first! - SparseConnectivity m_sparse_connectivity; bool m_use_identifiers_for_resolving_sharing; std::string m_lastModificationDescription; stk::EmptyModificationSummary m_modSummary; @@ -1609,11 +1604,9 @@ void get_entities(EntityRank rank, Selector const& selector, EntityVector& outpu inline unsigned BulkData::num_connectivity(Entity entity, EntityRank rank) const { - if (rank == stk::topology::NODE_RANK) { - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket==nullptr ? 0 : mesh_idx.bucket->num_nodes(mesh_idx.bucket_ordinal); - } - return m_sparse_connectivity.num_connectivity(entity, rank); + ThrowAssert(bucket_ptr(entity)); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->num_connectivity(mesh_idx.bucket_ordinal, rank); } inline unsigned @@ -1638,11 +1631,8 @@ inline Entity const* BulkData::begin(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - if (rank == stk::topology::NODE_RANK) { - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->begin_nodes(mesh_idx.bucket_ordinal); - } - return m_sparse_connectivity.begin_connectivity(entity, rank); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin(mesh_idx.bucket_ordinal, rank); } inline Entity const* @@ -1653,25 +1643,28 @@ BulkData::begin_nodes(Entity entity) const return mesh_idx.bucket->begin_nodes(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::begin_edges(Entity entity) const +inline Entity const* +BulkData::begin_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.begin_connectivity(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_edges(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::begin_faces(Entity entity) const +inline Entity const* +BulkData::begin_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.begin_connectivity(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_faces(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::begin_elements(Entity entity) const +inline Entity const* +BulkData::begin_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.begin_connectivity(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_elements(mesh_idx.bucket_ordinal); } inline ConnectivityOrdinal const* @@ -1690,60 +1683,68 @@ BulkData::begin_node_ordinals(Entity entity) const return mesh_idx.bucket->begin_node_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::begin_edge_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::begin_edge_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.begin_ordinals(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_edge_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::begin_face_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::begin_face_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.begin_ordinals(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_face_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::begin_element_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::begin_element_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.begin_ordinals(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_element_ordinals(mesh_idx.bucket_ordinal); } inline Permutation const* BulkData::begin_permutations(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - return m_sparse_connectivity.begin_permutations(entity, rank); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_permutations(mesh_idx.bucket_ordinal, rank); } -inline -Permutation const* BulkData::begin_node_permutations(Entity entity) const +inline Permutation const* +BulkData::begin_node_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::NODE_RANK)); - return m_sparse_connectivity.begin_permutations(entity, stk::topology::NODE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_node_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::begin_edge_permutations(Entity entity) const +inline Permutation const* +BulkData::begin_edge_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.begin_permutations(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_edge_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::begin_face_permutations(Entity entity) const +inline Permutation const* +BulkData::begin_face_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.begin_permutations(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_face_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::begin_element_permutations(Entity entity) const +inline Permutation const* +BulkData::begin_element_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.begin_permutations(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->begin_element_permutations(mesh_idx.bucket_ordinal); } inline unsigned @@ -1754,36 +1755,36 @@ BulkData::num_nodes(Entity entity) const return mesh_idx.bucket->num_nodes(mesh_idx.bucket_ordinal); } -inline -unsigned BulkData::num_edges(Entity entity) const +inline unsigned +BulkData::num_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.num_connectivity(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->num_edges(mesh_idx.bucket_ordinal); } -inline -unsigned BulkData::num_faces(Entity entity) const +inline unsigned +BulkData::num_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.num_connectivity(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->num_faces(mesh_idx.bucket_ordinal); } -inline -unsigned BulkData::num_elements(Entity entity) const +inline unsigned +BulkData::num_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.num_connectivity(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->num_elements(mesh_idx.bucket_ordinal); } inline Entity const* BulkData::end(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - if (rank == stk::topology::NODE_RANK) { - const MeshIndex &mesh_idx = mesh_index(entity); - return mesh_idx.bucket->end_nodes(mesh_idx.bucket_ordinal); - } - return m_sparse_connectivity.end_connectivity(entity, rank); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end(mesh_idx.bucket_ordinal, rank); } inline Entity const* @@ -1794,25 +1795,28 @@ BulkData::end_nodes(Entity entity) const return mesh_idx.bucket->end_nodes(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::end_edges(Entity entity) const +inline Entity const* +BulkData::end_edges(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.end_connectivity(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_edges(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::end_faces(Entity entity) const +inline Entity const* +BulkData::end_faces(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.end_connectivity(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_faces(mesh_idx.bucket_ordinal); } -inline -Entity const* BulkData::end_elements(Entity entity) const +inline Entity const* +BulkData::end_elements(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.end_connectivity(entity, stk::topology::ELEMENT_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_elements(mesh_idx.bucket_ordinal); } inline ConnectivityOrdinal const* @@ -1831,67 +1835,75 @@ BulkData::end_node_ordinals(Entity entity) const return mesh_idx.bucket->end_node_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::end_edge_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::end_edge_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.end_ordinals(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_edge_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::end_face_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::end_face_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.end_ordinals(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_face_ordinals(mesh_idx.bucket_ordinal); } -inline -ConnectivityOrdinal const* BulkData::end_element_ordinals(Entity entity) const +inline ConnectivityOrdinal const* +BulkData::end_element_ordinals(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.end_ordinals(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_element_ordinals(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::end_permutations(Entity entity, EntityRank rank) const +inline Permutation const* +BulkData::end_permutations(Entity entity, EntityRank rank) const { ThrowAssert(is_valid_connectivity(entity, rank)); - return m_sparse_connectivity.end_permutations(entity, rank); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_permutations(mesh_idx.bucket_ordinal, rank); } -inline -Permutation const* BulkData::end_node_permutations(Entity entity) const +inline Permutation const* +BulkData::end_node_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::NODE_RANK)); - return m_sparse_connectivity.end_permutations(entity, stk::topology::NODE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_node_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::end_edge_permutations(Entity entity) const +inline Permutation const* +BulkData::end_edge_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::EDGE_RANK)); - return m_sparse_connectivity.end_permutations(entity, stk::topology::EDGE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_edge_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::end_face_permutations(Entity entity) const +inline Permutation const* +BulkData::end_face_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::FACE_RANK)); - return m_sparse_connectivity.end_permutations(entity, stk::topology::FACE_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_face_permutations(mesh_idx.bucket_ordinal); } -inline -Permutation const* BulkData::end_element_permutations(Entity entity) const +inline Permutation const* +BulkData::end_element_permutations(Entity entity) const { ThrowAssert(is_valid_connectivity(entity, stk::topology::ELEMENT_RANK)); - return m_sparse_connectivity.end_permutations(entity, stk::topology::ELEM_RANK); + const MeshIndex &mesh_idx = mesh_index(entity); + return mesh_idx.bucket->end_element_permutations(mesh_idx.bucket_ordinal); } -inline -bool BulkData::has_permutation(Entity entity, EntityRank rank) const +inline bool +BulkData::has_permutation(Entity entity, EntityRank rank) const { ThrowAssert(bucket_ptr(entity)); - return m_sparse_connectivity.has_permutation(entity_rank(entity), rank); + return bucket(entity).has_permutation(rank); } inline bool @@ -1918,16 +1930,13 @@ BulkData::in_receive_ghost( EntityKey key ) const inline bool BulkData::in_receive_ghost( Entity entity ) const { - if (m_entitycomm[entity.local_offset()] == nullptr) { - return false; - } - - const int owner_rank = parallel_owner_rank(entity); - if (owner_rank == parallel_rank()) { - return false; + const std::vector & ghosts= ghostings(); + for (size_t i=ghosts.size()-1;i>=AURA;--i) + { + if ( in_receive_ghost(*ghosts[i], entity) ) + return true; } - - return m_entitycomm[entity.local_offset()]->isGhost; + return false; } inline bool diff --git a/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp b/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp deleted file mode 100644 index 2f7fb3dd4c58..000000000000 --- a/packages/stk/stk_mesh/stk_mesh/base/ConnectedSparseNodes.hpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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. -// - -#ifndef STK_MESH_CONNECTED_SPARSE_NODES_HPP -#define STK_MESH_CONNECTED_SPARSE_NODES_HPP - -#include -#include -#include -#include -#include - -namespace stk { -namespace mesh { - -class ConnectedSparseNodes { -public: - ConnectedSparseNodes(SparseConnectivity& sparseConnectivity, - EntityRank fromRank, - const EntityVector& fromEntities) - : m_sparseConnectivity(sparseConnectivity), - m_fromEntities(fromEntities), - m_fromRank(fromRank) - {} - - ~ConnectedSparseNodes(){} - - unsigned num_nodes_per_entity(unsigned fromEntity) const - { return m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } - - const Entity* begin_connectivity(unsigned fromEntity) const - { return m_sparseConnectivity.begin_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } - - const Entity* end_connectivity(unsigned fromEntity) const - { return m_sparseConnectivity.end_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } - - const ConnectivityOrdinal* begin_ordinals(unsigned fromEntity) const - { return m_sparseConnectivity.begin_ordinals(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } - - const ConnectivityOrdinal* end_ordinals(unsigned fromEntity) const - { return m_sparseConnectivity.end_ordinals(m_fromEntities[fromEntity], stk::topology::NODE_RANK); } - - bool set_connected_node(unsigned fromEntity, Entity connectedNode, ConnectivityOrdinal ordinal) - { - if (connectedNode.local_offset() > 0) { - return m_sparseConnectivity.add_connectivity(m_fromRank, m_fromEntities[fromEntity], - stk::topology::NODE_RANK, connectedNode, ordinal, - INVALID_PERMUTATION); - } - else { - const unsigned numBefore = m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); - bool returnVal = m_sparseConnectivity.remove_connectivity(m_fromRank, m_fromEntities[fromEntity], - stk::topology::NODE_RANK, connectedNode, ordinal); - const unsigned numAfter = m_sparseConnectivity.num_connectivity(m_fromEntities[fromEntity], stk::topology::NODE_RANK); - ThrowRequireMsg((numBefore==0 && numAfter==0) || (numBefore>0 && numAfter==numBefore-1),"remove didn't work"); - return returnVal; - } - } - - bool reset_connected_node(unsigned fromEntity, Entity connectedNode, ConnectivityOrdinal ordinal) - { - return m_sparseConnectivity.replace_or_add_connectivity(m_fromRank, m_fromEntities[fromEntity], - stk::topology::NODE_RANK, connectedNode, ordinal); - } - - void reset_connected_nodes(unsigned fromEntity, unsigned numNodes, const Entity* connectedNodes) - { - for(unsigned i=0; i -#include // for EntityRank, ConnectivityOrdinal, EntityVector -#include -#include - -namespace stk { -namespace mesh { - -class ConnectedTopologyNodes { -public: - ConnectedTopologyNodes(stk::topology fromTopology, const EntityVector& fromEntities) - : m_connectedNodes(fromTopology.num_nodes()*fromEntities.size(), Entity()), - m_ordinals(fromTopology.num_nodes()), - m_numNodesPerEntity(fromTopology.num_nodes()) - { - for (unsigned n=0; n m_ordinals; - unsigned m_numNodesPerEntity; -}; - -} // namespace mesh -} // namespace stk - -#endif //STK_MESH_CONNECTED_TOPOLOGY_NODES_HPP - diff --git a/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp b/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp deleted file mode 100644 index 790ebf1bcb12..000000000000 --- a/packages/stk/stk_mesh/stk_mesh/base/Connectivity.cpp +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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 - -namespace stk { -namespace mesh { - -Connectivity::Connectivity() - : m_connectivity(nullptr), - m_offsetsAndOrdinals(nullptr) -{ - m_offsetsAndOrdinals = new ConnectivityOrdinal[m_capacityIndex + 1]; - for(unsigned i=0; i -#include // for EntityRank -#include -#include -#include - -namespace stk { -namespace mesh { - -class Connectivity { -public: - Connectivity(); - - static constexpr uint16_t MAX_NUM_RANKS = stk::topology::NUM_RANKS+1; - - Connectivity(const Connectivity& rhs) - : m_connectivity(nullptr), - m_offsetsAndOrdinals(nullptr) - { - *this = rhs; - } - - Connectivity(Connectivity && rhs) noexcept - : m_connectivity(nullptr), - m_offsetsAndOrdinals(nullptr) - { - *this = std::move(rhs); - } - - Connectivity& operator=(const Connectivity& rhs) - { - delete [] m_connectivity; - delete [] m_offsetsAndOrdinals; - - unsigned capacity = rhs.get_capacity(); - if (capacity > 0) { - m_connectivity = new Entity[capacity]; - } - - m_offsetsAndOrdinals = new ConnectivityOrdinal[m_firstOrdinalIndex + capacity]; - for(unsigned i=0; itemplate make_field_sync_debugger(); @@ -146,11 +122,6 @@ class DeviceField : public NgpFieldBase } } - void set_execution_space(const stk::ngp::ExecSpace& execSpace) override - { - asyncCopyState.set_execution_space(execSpace); - } - void update_field() override { ThrowRequireMsg(hostBulk->synchronized_count() >= synchronizedCount, "Invalid sync state detected for NgpField: " << hostField->name()); @@ -201,8 +172,8 @@ class DeviceField : public NgpFieldBase size_t num_syncs_to_device() const override { return hostField->num_syncs_to_device(); } void fence() override { - asyncCopyState.execSpace.fence(); - asyncCopyState.reset_state(); + get_execution_space().fence(); + reset_execution_space(); } void modify_on_host() override @@ -257,29 +228,41 @@ class DeviceField : public NgpFieldBase void sync_to_host() override { - asyncCopyState.set_state(Kokkos::DefaultExecutionSpace(), impl::DEVICE_TO_HOST); + reset_execution_space(); internal_sync_to_host(); Kokkos::fence(); - asyncCopyState.reset_state(); + reset_execution_space(); } void sync_to_host(const stk::ngp::ExecSpace& newExecSpace) override { - asyncCopyState.set_state(newExecSpace, impl::DEVICE_TO_HOST_ASYNC); + set_execution_space(newExecSpace); + internal_sync_to_host(); + } + + void sync_to_host(stk::ngp::ExecSpace&& newExecSpace) override + { + set_execution_space(std::forward(newExecSpace)); internal_sync_to_host(); } void sync_to_device() override { - asyncCopyState.set_state(Kokkos::DefaultExecutionSpace(), impl::HOST_TO_DEVICE); + reset_execution_space(); internal_sync_to_device(); Kokkos::fence(); - asyncCopyState.reset_state(); + reset_execution_space(); } void sync_to_device(const stk::ngp::ExecSpace& newExecSpace) override { - asyncCopyState.set_state(newExecSpace, impl::HOST_TO_DEVICE_ASYNC); + set_execution_space(newExecSpace); + internal_sync_to_device(); + } + + void sync_to_device(stk::ngp::ExecSpace&& newExecSpace) override + { + set_execution_space(std::forward(newExecSpace)); internal_sync_to_device(); } @@ -407,6 +390,22 @@ class DeviceField : public NgpFieldBase return hostField->need_sync_to_device(); } + stk::ngp::ExecSpace& get_execution_space() const override { + return hostField->get_execution_space(); + } + + void set_execution_space(const stk::ngp::ExecSpace& executionSpace) override { + hostField->set_execution_space(executionSpace); + } + + void set_execution_space(stk::ngp::ExecSpace&& executionSpace) override { + hostField->set_execution_space(std::forward(executionSpace)); + } + + void reset_execution_space() override { + hostField->reset_execution_space(); + } + protected: void debug_modification_begin() override @@ -473,7 +472,7 @@ class DeviceField : public NgpFieldBase } } - Kokkos::deep_copy(asyncCopyState.execSpace, newDeviceSelectedBucketOffset, newHostSelectedBucketOffset); + Kokkos::deep_copy(get_execution_space(), newDeviceSelectedBucketOffset, newHostSelectedBucketOffset); } void construct_bool_bucket_views(const BucketVector & buckets, const std::string& suffix, @@ -502,7 +501,7 @@ class DeviceField : public NgpFieldBase hostAllFieldsBucketsNumComponentsPerEntity[bucket->bucket_id()] = field_scalars_per_entity(*hostField, *bucket); } - Kokkos::deep_copy(asyncCopyState.execSpace, deviceAllFieldsBucketsNumComponentsPerEntity, hostAllFieldsBucketsNumComponentsPerEntity); + Kokkos::deep_copy(get_execution_space(), deviceAllFieldsBucketsNumComponentsPerEntity, hostAllFieldsBucketsNumComponentsPerEntity); } void construct_field_buckets_num_components_per_entity_view(const BucketVector & buckets) @@ -513,7 +512,7 @@ class DeviceField : public NgpFieldBase hostFieldBucketsNumComponentsPerEntity[i] = field_scalars_per_entity(*hostField, *buckets[i]); } - Kokkos::deep_copy(asyncCopyState.execSpace, deviceFieldBucketsNumComponentsPerEntity, hostFieldBucketsNumComponentsPerEntity); + Kokkos::deep_copy(get_execution_space(), deviceFieldBucketsNumComponentsPerEntity, hostFieldBucketsNumComponentsPerEntity); } void construct_field_buckets_pointer_view(const BucketVector& buckets) @@ -532,7 +531,7 @@ class DeviceField : public NgpFieldBase hostBucketSizes[i] = buckets[i]->size(); } - Kokkos::deep_copy(asyncCopyState.execSpace, deviceBucketSizes, hostBucketSizes); + Kokkos::deep_copy(get_execution_space(), deviceBucketSizes, hostBucketSizes); } void set_field_buckets_pointer_view(const BucketVector& buckets) @@ -551,7 +550,7 @@ class DeviceField : public NgpFieldBase hostBucketPtrData(i) = reinterpret_cast(deviceBucketPtr); } - Kokkos::deep_copy(asyncCopyState.execSpace, deviceBucketPtrData, hostBucketPtrData); + Kokkos::deep_copy(get_execution_space(), deviceBucketPtrData, hostBucketPtrData); } void copy_unmodified_buckets(const BucketVector& buckets, FieldDataDeviceViewType destDevView, unsigned numPerEntity) @@ -578,7 +577,7 @@ class DeviceField : public NgpFieldBase UnmanagedView unInnerSrcView(srcPtr, ORDER_INDICES(bucketCapacity, numPerEntity)); UnmanagedView unInnerDestView(destPtr, ORDER_INDICES(bucketCapacity, numPerEntity)); - Kokkos::deep_copy(asyncCopyState.execSpace, unInnerDestView, unInnerSrcView); + Kokkos::deep_copy(get_execution_space(), unInnerDestView, unInnerSrcView); } void move_unmodified_buckets(const BucketVector& buckets, unsigned numPerEntity) @@ -648,16 +647,16 @@ class DeviceField : public NgpFieldBase hostFieldBucketsMarkedModified(bucketIdx) = isModified; } - Kokkos::deep_copy(asyncCopyState.execSpace, deviceFieldBucketsMarkedModified, hostFieldBucketsMarkedModified); + Kokkos::deep_copy(get_execution_space(), deviceFieldBucketsMarkedModified, hostFieldBucketsMarkedModified); - impl::transpose_new_and_modified_buckets_to_device(asyncCopyState.execSpace, *hostField, deviceBucketPtrData, deviceData, + impl::transpose_new_and_modified_buckets_to_device(get_execution_space(), *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity, deviceFieldBucketsMarkedModified); } void copy_device_to_host() { if (hostField) { - impl::transpose_to_pinned_and_mapped_memory(asyncCopyState.execSpace, *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); + impl::transpose_to_pinned_and_mapped_memory(get_execution_space(), *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); clear_device_sync_state(); hostField->increment_num_syncs_to_host(); } @@ -675,7 +674,7 @@ class DeviceField : public NgpFieldBase void copy_host_to_device() { if (hostField) { - impl::transpose_from_pinned_and_mapped_memory(asyncCopyState.execSpace, *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); + impl::transpose_from_pinned_and_mapped_memory(get_execution_space(), *hostField, deviceBucketPtrData, deviceData, deviceBucketSizes, deviceFieldBucketsNumComponentsPerEntity); clear_host_sync_state(); hostField->increment_num_syncs_to_device(); } @@ -744,8 +743,6 @@ class DeviceField : public NgpFieldBase typename BoolViewType::HostMirror hostFieldBucketsMarkedModified; BoolViewType deviceFieldBucketsMarkedModified; - impl::AsyncCopyState asyncCopyState; - NgpDebugger fieldSyncDebugger; }; diff --git a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp index 55fe6152a797..6481f55e257c 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp +++ b/packages/stk/stk_mesh/stk_mesh/base/DeviceMesh.cpp @@ -330,31 +330,25 @@ void DeviceMesh::fill_sparse_connectivities(const stk::mesh::BulkData& bulk_in) for(stk::mesh::EntityRank connectedRank=stk::topology::EDGE_RANK; connectedRank 0; for(unsigned iEntity=0; iEntity 0) { - const stk::mesh::Entity* connectedEntities = stkBucket.begin(iEntity, connectedRank); - const stk::mesh::ConnectivityOrdinal* connectedOrdinals = stkBucket.begin_ordinals(iEntity, connectedRank); - const stk::mesh::Permutation* permutations = hasPermutation ? stkBucket.begin_permutations(iEntity, connectedRank) : nullptr; - for(unsigned i=0; i const A * declare_attribute_no_delete(const A * a) { @@ -348,7 +364,8 @@ class FieldBase m_numSyncsToHost(0), m_numSyncsToDevice(0), m_modifiedOnHost(false), - m_modifiedOnDevice(false) + m_modifiedOnDevice(false), + m_execSpace(Kokkos::DefaultExecutionSpace()) { FieldBase * const pzero = nullptr ; const shards::ArrayDimTag * const dzero = nullptr ; @@ -383,6 +400,7 @@ class FieldBase mutable size_t m_numSyncsToDevice; mutable bool m_modifiedOnHost; mutable bool m_modifiedOnDevice; + mutable stk::ngp::ExecSpace m_execSpace; mutable Teuchos::any m_stkFieldSyncDebugger; }; diff --git a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp index 0a02b25b0c84..c117cd39be7c 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/FieldDataManager.hpp @@ -70,6 +70,7 @@ class AllocatorAdaptor : public AllocatorAdaptorInterface { } }; + class FieldDataManager { public: diff --git a/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp b/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp index 358d24d4b571..aeac5705a84a 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/GetNgpField.hpp @@ -47,7 +47,8 @@ NgpField & get_updated_ngp_field_async(const FieldBase & stkFiel NgpFieldBase * ngpField = impl::get_ngp_field(stkField); if (ngpField == nullptr) { - ngpField = new NgpField(stkField.get_mesh(), stkField, execSpace, true); + ngpField = new NgpField(stkField.get_mesh(), stkField, true); + ngpField->set_execution_space(execSpace); impl::set_ngp_field(stkField, ngpField); ngpField->clear_host_sync_state(); } @@ -61,6 +62,27 @@ NgpField & get_updated_ngp_field_async(const FieldBase & stkFiel return dynamic_cast< NgpField& >(*ngpField); } +template class NgpDebugger = DefaultNgpFieldSyncDebugger> +NgpField & get_updated_ngp_field_async(const FieldBase & stkField, stk::ngp::ExecSpace&& execSpace) +{ + NgpFieldBase * ngpField = impl::get_ngp_field(stkField); + + if (ngpField == nullptr) { + ngpField = new NgpField(stkField.get_mesh(), stkField, true); + ngpField->set_execution_space(std::forward(execSpace)); + impl::set_ngp_field(stkField, ngpField); + ngpField->clear_host_sync_state(); + } + else { + if (stkField.get_mesh().synchronized_count() != ngpField->synchronized_count()) { + ngpField->set_execution_space(std::forward(execSpace)); + ngpField->update_field(); + } + } + + return dynamic_cast< NgpField& >(*ngpField); +} + template class NgpDebugger = DefaultNgpFieldSyncDebugger> NgpField & get_updated_ngp_field(const FieldBase & stkField) { diff --git a/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp b/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp index 5cfc1794dcc7..d900b8ba46b8 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/HostField.hpp @@ -65,8 +65,7 @@ class HostField : public NgpFieldBase : NgpFieldBase(), hostBulk(nullptr), field(nullptr), - synchronizedCount(0), - asyncCopyState(impl::AsyncCopyState()) + synchronizedCount(0) { } @@ -74,18 +73,11 @@ class HostField : public NgpFieldBase : NgpFieldBase(), hostBulk(&b), field(&f), - synchronizedCount(0), - asyncCopyState(impl::AsyncCopyState()) + synchronizedCount(0) { field->template make_field_sync_debugger(); update_field(); - } - - HostField(const stk::mesh::BulkData& b, const stk::mesh::FieldBase& f, - const stk::ngp::ExecSpace& execSpace, bool isFromGetUpdatedNgpField = false) - : HostField(b, f, isFromGetUpdatedNgpField) - { - asyncCopyState.set_state(execSpace, impl::INVALID); + reset_execution_space(); } HostField(const HostField&) = default; @@ -101,8 +93,6 @@ class HostField : public NgpFieldBase void set_field_states(HostField* fields[]) {} - void set_execution_space(const stk::ngp::ExecSpace& execSpace) override { asyncCopyState.set_execution_space(execSpace); } - size_t num_syncs_to_host() const override { return field->num_syncs_to_host(); } size_t num_syncs_to_device() const override { return field->num_syncs_to_device(); } void fence() override {} @@ -214,6 +204,14 @@ class HostField : public NgpFieldBase } } + void sync_to_host(stk::ngp::ExecSpace&& execSpace) override + { + if (need_sync_to_host()) { + copy_device_to_host(); + clear_device_sync_state(); + } + } + void sync_to_device() override { sync_to_device(Kokkos::DefaultExecutionSpace()); @@ -231,6 +229,17 @@ class HostField : public NgpFieldBase } } + void sync_to_device(stk::ngp::ExecSpace&& execSpace) override + { + if (need_sync_to_device()) { + if (hostBulk->synchronized_count() != synchronizedCount) { + update_field(); + } + copy_host_to_device(); + clear_host_sync_state(); + } + } + size_t synchronized_count() const override { return field->mesh_meta_data().mesh_bulk_data().synchronized_count(); } FieldState state() const { return field->state(); } @@ -257,6 +266,21 @@ class HostField : public NgpFieldBase void notify_sync_debugger_clear_host_sync_state() override {} void notify_sync_debugger_clear_device_sync_state() override {} + stk::ngp::ExecSpace& get_execution_space() const override { + return field->get_execution_space(); + } + + void set_execution_space(const stk::ngp::ExecSpace& executionSpace) override { + field->set_execution_space(executionSpace); + } + + void set_execution_space(stk::ngp::ExecSpace&& executionSpace) override { + field->set_execution_space(std::forward(executionSpace)); + } + + void reset_execution_space() override { + field->reset_execution_space(); + } private: void set_modify_on_device() { @@ -277,7 +301,6 @@ class HostField : public NgpFieldBase const stk::mesh::FieldBase * field; size_t synchronizedCount; - impl::AsyncCopyState asyncCopyState; }; } diff --git a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp index 3cdbcc52481a..492e62d79832 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/NgpFieldBase.hpp @@ -32,13 +32,19 @@ class NgpFieldBase virtual void clear_host_sync_state() = 0; virtual void clear_device_sync_state() = 0; virtual void sync_to_host() = 0; - virtual void sync_to_host(const stk::ngp::ExecSpace& execSpace) = 0; + virtual void sync_to_host(const stk::ngp::ExecSpace& newExecSpace) = 0; + virtual void sync_to_host(stk::ngp::ExecSpace&& newExecSpace) = 0; virtual void sync_to_device() = 0; - virtual void sync_to_device(const stk::ngp::ExecSpace& execSpace) = 0; + virtual void sync_to_device(const stk::ngp::ExecSpace& newExecSpace) = 0; + virtual void sync_to_device(stk::ngp::ExecSpace&& newExecSpace) = 0; virtual size_t synchronized_count() const = 0; virtual size_t num_syncs_to_host() const = 0; virtual size_t num_syncs_to_device() const = 0; - virtual void set_execution_space(const stk::ngp::ExecSpace& execSpace) = 0; + virtual stk::ngp::ExecSpace& get_execution_space() const = 0; + virtual void set_execution_space(const stk::ngp::ExecSpace& executionSpace) = 0; + virtual void set_execution_space(stk::ngp::ExecSpace&& executionSpace) = 0; + virtual void reset_execution_space() = 0; + virtual void fence() = 0; virtual void debug_modification_begin() = 0; diff --git a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp deleted file mode 100644 index b0b351e3d407..000000000000 --- a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.cpp +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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 - -namespace stk { -namespace mesh { - -SparseConnectivity::SparseConnectivity(unsigned numRanks) - : m_numRanks(numRanks) -{ - update_num_ranks(numRanks); -} - -void SparseConnectivity::update_num_ranks(unsigned numRanks) -{ - const unsigned minNumRanks = stk::topology::NUM_RANKS; - m_numRanks = std::max(numRanks, minNumRanks); - - m_entityPermutationOffset.resize(m_numRanks); - m_permutations.resize(m_numRanks); - for(unsigned rank=0; rank()); - } -} - -void SparseConnectivity::update_size_of_entity_index_space(unsigned numEntities) -{ - m_meshConnectivity.resize(numEntities); -} - -bool SparseConnectivity::has_permutation(EntityRank fromRank, EntityRank toRank) -{ - return (fromRank > stk::topology::NODE_RANK && fromRank < stk::topology::CONSTRAINT_RANK) - && (toRank > stk::topology::NODE_RANK && toRank < stk::topology::CONSTRAINT_RANK); -} - -const Permutation* SparseConnectivity::begin_permutations(Entity fromEntity, - EntityRank connectedRank) const -{ - if (static_cast(connectedRank) < m_entityPermutationOffset.size() && - fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { - const int entityOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; - return m_permutations[connectedRank][entityOffset].data(); - } - return nullptr; -} - -const Permutation* SparseConnectivity::end_permutations(Entity fromEntity, - EntityRank connectedRank) const -{ - if (static_cast(connectedRank) < m_entityPermutationOffset.size() && - fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { - const int entityOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; - const std::vector& perms = m_permutations[connectedRank][entityOffset]; - return (perms.data()+perms.size()); - } - return nullptr; -} - -bool SparseConnectivity::add_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal, - Permutation permutation) -{ - Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; - int insertLocation = conn.add_connectivity(connectedRank, - connectedEntity, ordinal, (connectedRank > fromRank)); - - if (insertLocation >= 0 && has_permutation(fromRank, connectedRank)) { - if (fromEntity.local_offset() >= m_entityPermutationOffset[connectedRank].size()) { - m_entityPermutationOffset[connectedRank].resize(fromEntity.local_offset()+1); - m_entityPermutationOffset[connectedRank][fromEntity.local_offset()] = 0; - } - unsigned& permOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; - if (permOffset == 0) { - permOffset = m_permutations[connectedRank].size(); - m_permutations[connectedRank].push_back(std::vector(1, permutation)); - return true; - } - std::vector& permutations = m_permutations[connectedRank][permOffset]; - permutations.insert(permutations.begin()+insertLocation, permutation); - } - - return insertLocation >= 0; -} - -bool SparseConnectivity::replace_or_add_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal) -{ - Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; - int insertLocation = conn.replace_or_add_connectivity(connectedRank, - connectedEntity, ordinal); - - return insertLocation >= 0; -} - -bool SparseConnectivity::remove_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal) -{ - Connectivity& conn = m_meshConnectivity[fromEntity.local_offset()]; - int location = conn.remove_connectivity(connectedRank, connectedEntity, ordinal); - - if (location >= 0) { - if (has_permutation(fromRank, connectedRank)) { - const unsigned permOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; - std::vector& permutations = m_permutations[connectedRank][permOffset]; - permutations.erase(permutations.begin()+location); - } - return true; - } - return false; -} - -bool SparseConnectivity::replace_permutation(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - ConnectivityOrdinal ordinal, - Permutation newPermutation) -{ - if (fromEntity.local_offset() < m_entityPermutationOffset[connectedRank].size()) { - const ConnectivityOrdinal* ordsBegin = begin_ordinals(fromEntity, connectedRank); - const ConnectivityOrdinal* ordsEnd = end_ordinals(fromEntity, connectedRank); - - bool foundIt = false; - const bool downward = fromRank > connectedRank; - unsigned idx = ordsEnd - ordsBegin; - if (downward) { - const ConnectivityOrdinal* iter = std::lower_bound(ordsBegin, ordsEnd, ordinal); - idx = iter - ordsBegin; - foundIt = (iter != ordsEnd && *iter == ordinal); - } - else { - const ConnectivityOrdinal* iter = std::find(ordsBegin, ordsEnd, ordinal); - idx = iter - ordsBegin; - foundIt = (iter != ordsEnd); - } - if (foundIt) { - const int entityPermOffset = m_entityPermutationOffset[connectedRank][fromEntity.local_offset()]; - std::vector& perms = m_permutations[connectedRank][entityPermOffset]; - perms[idx] = newPermutation; - return true; - } - } - return false; -} - -} // namespace mesh -} // namespace stk - diff --git a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp b/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp deleted file mode 100644 index a05f87d84a73..000000000000 --- a/packages/stk/stk_mesh/stk_mesh/base/SparseConnectivity.hpp +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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. -// - -#ifndef STK_MESH_SPARSECONNECTIVITY_HPP -#define STK_MESH_SPARSECONNECTIVITY_HPP - -#include -#include // for EntityRank -#include -#include -#include - -namespace stk { -namespace mesh { - -class SparseConnectivity { -public: - SparseConnectivity(unsigned numRanks = stk::topology::NUM_RANKS); - virtual ~SparseConnectivity(){} - - void update_num_ranks(unsigned numRanks); - void update_size_of_entity_index_space(unsigned numEntities); - - static bool has_permutation(EntityRank fromRank, EntityRank toRank); - - unsigned num_connectivity(Entity fromEntity, EntityRank connectedRank) const; - - const Entity* begin_connectivity(Entity fromEntity, EntityRank connectedRank) const; - const Entity* end_connectivity(Entity fromEntity, EntityRank connectedRank) const; - - const ConnectivityOrdinal* begin_ordinals(Entity fromEntity, EntityRank connectedRank) const; - const ConnectivityOrdinal* end_ordinals(Entity fromEntity, EntityRank connectedRank) const; - - const Permutation* begin_permutations(Entity fromEntity, EntityRank connectedRank) const; - const Permutation* end_permutations(Entity fromEntity, EntityRank connectedRank) const; - - bool add_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal, - Permutation permutation); - - bool replace_or_add_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal); - - bool remove_connectivity(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - Entity connectedEntity, - ConnectivityOrdinal ordinal); - - bool replace_permutation(EntityRank fromRank, - Entity fromEntity, - EntityRank connectedRank, - ConnectivityOrdinal ordinal, - Permutation newPermutation); - - PairIterEntity get_connectivity(Entity fromEntity, EntityRank connectedRank) const; - - const Connectivity& get_connectivity(Entity entity) const { return m_meshConnectivity[entity.local_offset()]; } - Connectivity& get_connectivity(Entity entity) { return m_meshConnectivity[entity.local_offset()]; } - -private: - - std::vector m_meshConnectivity; - std::vector> m_entityPermutationOffset; - std::vector>> m_permutations; - unsigned m_numRanks; -}; - -inline -unsigned SparseConnectivity::num_connectivity(Entity fromEntity, - EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].num_connectivity(connectedRank); -} - -inline -const Entity* SparseConnectivity::begin_connectivity(Entity fromEntity, - EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].begin_connectivity(connectedRank); -} - -inline -const Entity* SparseConnectivity::end_connectivity(Entity fromEntity, - EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].end_connectivity(connectedRank); -} - -inline -PairIterEntity SparseConnectivity::get_connectivity(Entity fromEntity, EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].get_connectivity(connectedRank); -} - -inline -const ConnectivityOrdinal* SparseConnectivity::begin_ordinals(Entity fromEntity, - EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].begin_ordinals(connectedRank); -} - -inline -const ConnectivityOrdinal* SparseConnectivity::end_ordinals(Entity fromEntity, - EntityRank connectedRank) const -{ - return m_meshConnectivity[fromEntity.local_offset()].end_ordinals(connectedRank); -} - -} // namespace mesh -} // namespace stk - -#endif //STK_MESH_SPARSECONNECTIVITY_HPP - diff --git a/packages/stk/stk_mesh/stk_mesh/base/Types.hpp b/packages/stk/stk_mesh/stk_mesh/base/Types.hpp index 13729f625b3c..083a6e1018ba 100644 --- a/packages/stk/stk_mesh/stk_mesh/base/Types.hpp +++ b/packages/stk/stk_mesh/stk_mesh/base/Types.hpp @@ -236,9 +236,6 @@ typedef std::vector EntityCommInfoVector; typedef PairIter< EntityCommInfoVector::const_iterator > PairIterEntityComm ; #endif - -using PairIterEntity = PairIter; - /** \} */ //---------------------------------------------------------------------- diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp index 575e12b98169..2143cdaf75f2 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.cpp @@ -42,6 +42,7 @@ #include // for Partition, lower_bound #include #include +#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity #include "stk_mesh/base/FieldBase.hpp" // for FieldBase #include "stk_mesh/base/MetaData.hpp" // for MetaData #include "stk_mesh/base/Types.hpp" // for BucketVector, EntityRank, etc @@ -277,6 +278,52 @@ Partition* BucketRepository::create_partition( return partition; } +void BucketRepository::internal_modification_end() +{ + sync_from_partitions(); + + for(EntityRank from_rank = stk::topology::NODE_RANK; from_rank < stk::topology::NUM_RANKS; ++from_rank) + { + const BucketVector &buckets = this->buckets(from_rank); + unsigned num_buckets = buckets.size(); + for(unsigned j = 0; j < num_buckets; ++j) + { + ThrowAssert(buckets[j] != NULL); + Bucket &bucket = *buckets[j]; + + // Update the hop-saving connectivity data on this bucket. + // + for(EntityRank to_rank = stk::topology::NODE_RANK; to_rank < stk::topology::NUM_RANKS; ++to_rank) + { + if (from_rank == to_rank) { + continue; + } + + switch(to_rank) + { + case stk::topology::NODE_RANK: + bucket.m_fixed_node_connectivity.end_modification(&bucket.m_mesh); + break; + case stk::topology::EDGE_RANK: + bucket.m_dynamic_edge_connectivity.end_modification(&bucket.m_mesh); + break; + case stk::topology::FACE_RANK: + bucket.m_dynamic_face_connectivity.end_modification(&bucket.m_mesh); + break; + case stk::topology::ELEMENT_RANK: + bucket.m_dynamic_element_connectivity.end_modification(&bucket.m_mesh); + break; + case stk::topology::INVALID_RANK: + break; + default: + bucket.m_dynamic_other_connectivity.end_modification(&bucket.m_mesh); + break; + } + } + } + } +} + void BucketRepository::sync_from_partitions() { for (EntityRank rank = stk::topology::NODE_RANK; rank < static_cast(m_partitions.size()); ++rank) diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp index db99005a0d88..11398d136ee8 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/BucketRepository.hpp @@ -132,6 +132,9 @@ class BucketRepository PartOrdinal* keyPtr, PartOrdinal* keyEnd); + // For use by BulkData::internal_modification_end(). + void internal_modification_end(); + // Update m_buckets from the partitions. void sync_from_partitions(); void sync_from_partitions(EntityRank rank); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp index 7d66af99bfbd..3b5dc54a2c99 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.cpp @@ -1264,10 +1264,52 @@ void comm_sync_aura_send_recv( } } +void insert_upward_relations(const BulkData& bulk_data, Entity rel_entity, + const EntityRank rank_of_orig_entity, + const int share_proc, + std::vector& send) +{ + EntityRank rel_entity_rank = bulk_data.entity_rank(rel_entity); + ThrowAssert(rel_entity_rank > rank_of_orig_entity); + + // If related entity is higher rank, I own it, and it is not + // already shared by proc, ghost it to the sharing processor. + if ( bulk_data.bucket(rel_entity).owned() && ! bulk_data.in_shared(rel_entity, share_proc) ) { + + send.emplace_back(rel_entity,share_proc); + + // There may be even higher-ranking entities that need to be ghosted, so we must recurse + const EntityRank end_rank = static_cast(bulk_data.mesh_meta_data().entity_rank_count()); + for (EntityRank irank = static_cast(rel_entity_rank + 1); irank < end_rank; ++irank) + { + const int num_rels = bulk_data.num_connectivity(rel_entity, irank); + Entity const* rels = bulk_data.begin(rel_entity, irank); + + for (int r = 0; r < num_rels; ++r) + { + Entity const rel_of_rel_entity = rels[r]; + if (bulk_data.is_valid(rel_of_rel_entity)) { + insert_upward_relations(bulk_data, rel_of_rel_entity, rel_entity_rank, share_proc, send); + } + } + } + } +} + +EntityRank get_highest_upward_connected_rank(const BulkData& mesh, Entity entity) +{ + const EntityRank entityRank = mesh.entity_rank(entity); + EntityRank highestRank = static_cast(mesh.mesh_meta_data().entity_rank_count()-1); + while(highestRank > entityRank && mesh.num_connectivity(entity, highestRank) == 0) { + highestRank = static_cast(highestRank-1); + } + return highestRank; +} + void insert_upward_relations(const BulkData& bulk_data, - const Connectivity& entityConnectivity, const EntityProcMapping& entitySharing, Entity rel_entity, + const EntityRank rank_of_orig_entity, const int share_proc, EntityProcMapping& send) { @@ -1279,8 +1321,13 @@ void insert_upward_relations(const BulkData& bulk_data, send.addEntityProc(rel_entity,share_proc); - PairIterEntity conn = entityConnectivity.get_highest_rank_connectivity(bulk_data.entity_rank(rel_entity)); - for( Entity upwardEntity : conn) { + const unsigned bucketOrd = idx.bucket_ordinal; + const EntityRank upwardRank = get_highest_upward_connected_rank(bulk_data, rel_entity); + const int numRels = bucket.num_connectivity(bucketOrd, upwardRank); + Entity const* rels = bucket.begin(bucketOrd, upwardRank); + + for (int r = 0; r < numRels; ++r) { + Entity const upwardEntity = rels[r]; if (bulk_data.is_valid(upwardEntity) && bulk_data.bucket(upwardEntity).owned()) { if (!entitySharing.find(upwardEntity, share_proc)) { send.addEntityProc(upwardEntity, share_proc); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp index 8403ea4f2a17..e493ac58311a 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshImplUtils.hpp @@ -59,12 +59,14 @@ struct EntityGhostData; //stk-mesh capabilities. //---------------------------------------------------------------------- +void find_entities_these_nodes_have_in_common(const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); + +void find_entities_with_larger_ids_these_nodes_have_in_common_and_locally_owned(stk::mesh::EntityId id, const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); + void remove_entities_not_connected_to_other_nodes(const BulkData& mesh, EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& elementsInCommon); -void find_entities_these_nodes_have_in_common(const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); - template void find_entities_these_nodes_have_in_common_and(const BulkData& mesh, EntityRank rank, unsigned numNodes, const Entity* nodes, @@ -87,8 +89,6 @@ void find_entities_these_nodes_have_in_common_and(const BulkData& mesh, EntityRa } } -void find_entities_with_larger_ids_these_nodes_have_in_common_and_locally_owned(stk::mesh::EntityId id, const BulkData& mesh, stk::mesh::EntityRank rank, unsigned numNodes, const Entity* nodes, std::vector& entity_vector); - bool do_these_nodes_have_any_shell_elements_in_common(BulkData& mesh, unsigned numNodes, const Entity* nodes); void find_locally_owned_elements_these_nodes_have_in_common(const BulkData& mesh, unsigned numNodes, const Entity* nodes, std::vector& elems); @@ -244,10 +244,15 @@ void comm_sync_aura_send_recv( EntityProcMapping& entityProcMapping, std::vector& ghostStatus ); +void insert_upward_relations(const BulkData& bulk_data, Entity rel_entity, + const EntityRank rank_of_orig_entity, + const int share_proc, + std::vector& send); + void insert_upward_relations(const BulkData& bulk_data, - const Connectivity& entityConnectivity, const EntityProcMapping& entitySharing, Entity rel_entity, + const EntityRank rank_of_orig_entity, const int share_proc, EntityProcMapping& send); diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp index c301ada91b24..b7bb82c7bb7a 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshModification.cpp @@ -21,7 +21,6 @@ bool MeshModification::modification_begin(const std::string description) if (numRanks > m_bulkData.m_selector_to_buckets_maps.size()) { m_bulkData.m_selector_to_buckets_maps.resize(numRanks); } - m_bulkData.m_sparse_connectivity.update_num_ranks(m_bulkData.mesh_meta_data().entity_rank_count()); } if ( this->in_modifiable_state() ) return false ; diff --git a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp index 8945a5620fe3..c4c8fba02cdd 100644 --- a/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp +++ b/packages/stk/stk_mesh/stk_mesh/baseImpl/MeshPrintUtils.cpp @@ -187,20 +187,6 @@ void print_connectivity_of_rank(const BulkData& M, Entity entity, } } -void print_upward_connectivity(const BulkData& bulk, Entity entity, std::ostream& out) -{ - EntityRank nextRank = static_cast(bulk.entity_rank(entity)+1); - EntityRank endRank = static_cast(bulk.mesh_meta_data().entity_rank_count()); - - for(EntityRank rank = nextRank; rank < endRank; ++rank) { - const unsigned num = bulk.num_connectivity(entity, rank); - const Entity* conn = bulk.begin(entity, rank); - for(unsigned i=0; i void transpose_from_pinned_and_mapped_memory(ExecSpaceType & execSpace, const FieldBase & stkField, diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp index 58d544df65f0..3a7d0423dd7a 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/BucketTester.hpp @@ -49,7 +49,7 @@ class BucketTester : public stk::mesh::Bucket void my_change_connected_nodes(unsigned bucket_ordinal, Entity* new_nodes) { - this->change_connected_nodes(bucket_ordinal, new_nodes); + this->change_existing_connectivity(bucket_ordinal, new_nodes); } void my_change_existing_permutation_for_connected_element(unsigned bucket_ordinal_of_lower_ranked_entity, diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/CMakeLists.txt b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/CMakeLists.txt index 8d8e9959e3bd..e74727fc5431 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/CMakeLists.txt +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/CMakeLists.txt @@ -12,7 +12,10 @@ SET(HEADERS_NEED_IO GeneratedMeshToFile.hpp ReadWriteSidesetTester.hpp StkMeshFromGeneratedMesh.hpp + TextMeshFixture.hpp TextMeshToFile.hpp + TextMeshUtils.hpp + TextMesh.hpp ioUtils.hpp ) SET(SOURCES_NEED_IO @@ -22,7 +25,9 @@ SET(SOURCES_NEED_IO GenerateALefRAMesh.cpp GeneratedMeshToFile.cpp ReadWriteSidesetTester.cpp + TextMeshFixture.cpp TextMeshToFile.cpp + TextMeshUtils.cpp TextMesh.cpp ioUtils.cpp meshCreationHelpers.cpp diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp index 94884859a0d0..ff3ea1df74e0 100644 --- a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMesh.cpp @@ -1,6 +1,7 @@ // ####################### Start Clang Header Tool Managed Headers ######################## // clang-format off #include "TextMesh.hpp" +#include "TextMeshUtils.hpp" #include // for toupper #include // for size_t #include // for remove, etc @@ -34,480 +35,6 @@ namespace stk { namespace unit_test_util { - -using EntityIdSet = std::set; - -class TopologyMapping -{ -public: - stk::topology::topology_t topology(const std::string& name) - { - auto it = m_nameToTopology.find(name); - return (it != m_nameToTopology.end() ? it->second : stk::topology::INVALID_TOPOLOGY); - } - -private: - std::unordered_map m_nameToTopology = - { - { "NODE" , stk::topology::NODE }, - { "LINE_2" , stk::topology::LINE_2 }, - { "LINE_3" , stk::topology::LINE_3 }, - { "TRI_3" , stk::topology::TRI_3 }, - { "TRI_4" , stk::topology::TRI_4 }, - { "TRI_6" , stk::topology::TRI_6 }, - { "QUAD_4" , stk::topology::QUAD_4 }, - { "QUAD_6" , stk::topology::QUAD_6 }, - { "QUAD_8" , stk::topology::QUAD_8 }, - { "QUAD_9" , stk::topology::QUAD_9 }, - { "PARTICLE" , stk::topology::PARTICLE }, - { "LINE_2_1D" , stk::topology::LINE_2_1D }, - { "LINE_3_1D" , stk::topology::LINE_3_1D }, - { "BEAM_2" , stk::topology::BEAM_2 }, - { "BEAM_3" , stk::topology::BEAM_3 }, - { "SHELL_LINE_2" , stk::topology::SHELL_LINE_2 }, - { "SHELL_LINE_3" , stk::topology::SHELL_LINE_3 }, - { "SPRING_2" , stk::topology::SPRING_2 }, - { "SPRING_3" , stk::topology::SPRING_3 }, - { "TRI_3_2D" , stk::topology::TRI_3_2D }, - { "TRI_4_2D" , stk::topology::TRI_4_2D }, - { "TRI_6_2D" , stk::topology::TRI_6_2D }, - { "QUAD_4_2D" , stk::topology::QUAD_4_2D }, - { "QUAD_8_2D" , stk::topology::QUAD_8_2D }, - { "QUAD_9_2D" , stk::topology::QUAD_9_2D }, - { "SHELL_TRI_3" , stk::topology::SHELL_TRI_3 }, - { "SHELL_TRI_4" , stk::topology::SHELL_TRI_4 }, - { "SHELL_TRI_6" , stk::topology::SHELL_TRI_6 }, - { "SHELL_QUAD_4" , stk::topology::SHELL_QUAD_4 }, - { "SHELL_QUAD_8" , stk::topology::SHELL_QUAD_8 }, - { "SHELL_QUAD_9" , stk::topology::SHELL_QUAD_9 }, - { "TET_4" , stk::topology::TET_4 }, - { "TET_8" , stk::topology::TET_8 }, - { "TET_10" , stk::topology::TET_10 }, - { "TET_11" , stk::topology::TET_11 }, - { "PYRAMID_5" , stk::topology::PYRAMID_5 }, - { "PYRAMID_13" , stk::topology::PYRAMID_13 }, - { "PYRAMID_14" , stk::topology::PYRAMID_14 }, - { "WEDGE_6" , stk::topology::WEDGE_6 }, - { "WEDGE_12" , stk::topology::WEDGE_12 }, - { "WEDGE_15" , stk::topology::WEDGE_15 }, - { "WEDGE_18" , stk::topology::WEDGE_18 }, - { "HEX_8" , stk::topology::HEX_8 }, - { "HEX_20" , stk::topology::HEX_20 }, - { "HEX_27" , stk::topology::HEX_27 }, - }; -}; - -class PartIdMapping -{ -public: - PartIdMapping() - : m_idsAssigned(false) - { } - - void register_part_name(const std::string& name) - { - m_partNames.push_back(name); - handle_block_part(name); - } - - void register_part_name_with_id(const std::string& name, unsigned id) - { - register_part_name(name); - assign(name, id); - } - - unsigned get(const std::string& name) - { - if (!m_idsAssigned) assign_ids(); - - auto it = m_ids.find(name); - ThrowRequireMsg(it != m_ids.end(), "PartIdMapping has no ID for invalid part name " << name); - return it->second; - } - -private: - void handle_block_part(const std::string& name) - { - const std::string blockPrefix = "BLOCK_"; - const unsigned prefixLength = blockPrefix.length(); - - if (name.length() < prefixLength+1) return; - - const std::string namePrefix = name.substr(0, prefixLength); - const std::string nameSuffix = name.substr(prefixLength); - - if (namePrefix != blockPrefix) return; - - unsigned id; - std::istringstream nameSuffixStream(nameSuffix); - nameSuffixStream >> id; - if (nameSuffixStream.fail()) { - return; - } - assign(name, id); - } - - void assign_ids() - { - unsigned nextPartId = 1; - for (const std::string& name : m_partNames) { - if (m_ids.find(name) == m_ids.end()) { - while (is_assigned(nextPartId)) nextPartId++; - - assign(name, nextPartId); - } - } - - m_idsAssigned = true; - } - - void assign(const std::string& name, unsigned id) - { - validate_name_and_id(name, id); - m_ids[name] = id; - m_assignedIds.insert(id); - } - - void validate_name_and_id(const std::string& name, unsigned id) - { - if (is_registered(name)) { - ThrowRequireMsg(m_ids[name] == id, - "Cannot assign part '" << name << "' two different ids: " << m_ids[name] << " and " << id); - } - else { - ThrowRequireMsg(!is_assigned(id), - "Part id " << id << " has already been assigned, cannot assign it to part '" << name << "'"); - } - } - - bool is_registered(const std::string& name) - { - return m_ids.count(name) > 0; - } - - bool is_assigned(unsigned id) const - { - return m_assignedIds.count(id) > 0; - } - - std::vector m_partNames; - std::set m_assignedIds; - std::unordered_map m_ids; - bool m_idsAssigned; -}; - -struct ElementData -{ - int proc; - stk::mesh::EntityId identifier; - stk::topology topology; - stk::mesh::EntityIdVector nodeIds; - std::string partName = ""; - unsigned partId; -}; - -struct TextMeshData -{ - unsigned spatialDim; - std::vector elementDataVec; - EntityIdSet nodeIds; - - void add_element(const ElementData& elem) - { - elementDataVec.push_back(elem); - for (const stk::mesh::EntityId& nodeId : elem.nodeIds) { - nodeIds.insert(nodeId); - associate_node_with_proc(nodeId, elem.proc); - } - } - - const EntityIdSet nodes_on_proc(int proc) const - { - auto it = m_nodesOnProc.find(proc); - return it != m_nodesOnProc.end() ? it->second : EntityIdSet(); - } - - const std::set procs_for_node(const stk::mesh::EntityId& nodeId) const - { - auto it = m_procsForNode.find(nodeId); - return it != m_procsForNode.end() ? it->second : std::set(); - } - -private: - void associate_node_with_proc(const stk::mesh::EntityId& nodeId, int proc) - { - m_procsForNode[nodeId].insert(proc); - m_nodesOnProc[proc].insert(nodeId); - } - - std::unordered_map> m_procsForNode; - std::unordered_map m_nodesOnProc; -}; - -class Lexer -{ -public: - Lexer() - : m_token(""), - m_isNumber(false) - { } - - void set_input_string(const std::string& input) - { - m_input = input; - m_currentIndex = 0; - read_next_token(); - } - - int get_int() - { - read_next_token(); - return std::stoi(m_oldToken); - } - - unsigned get_unsigned() - { - read_next_token(); - return std::stoul(m_oldToken); - } - - std::string get_string() - { - read_next_token(); - return make_upper_case(m_oldToken); - } - - void get_newline() - { - read_next_token(); - } - - bool has_token() const { return m_token != ""; } - bool has_newline() const { return m_token == "\n"; } - bool has_number() const { return has_token() && m_isNumber; } - bool has_string() const { return has_token() && !has_number() && !has_newline(); } - -private: - void read_next_token() - { - m_oldToken = m_token; - - if (char_is_newline()) { - m_isNumber = false; - m_token = "\n"; - m_currentIndex++; - return; - } - - m_token = ""; - m_isNumber = true; - - while (has_more_input()) { - if (char_is_whitespace()) { - m_currentIndex++; - continue; - } - - if (char_is_comma()) { - m_currentIndex++; - break; - } - - if (char_is_newline()) { - break; - } - - m_isNumber &= char_is_digit(); - m_token += current_char(); - m_currentIndex++; - } - } - - bool has_more_input() - { - return m_currentIndex < m_input.size(); - } - - bool char_is_whitespace() { return current_char() == ' '; } - bool char_is_comma() { return current_char() == ','; } - bool char_is_newline() { return current_char() == '\n'; } - bool char_is_digit() { return std::isdigit(static_cast(current_char())); } - - char current_char() { return m_input[m_currentIndex]; } - - std::string make_upper_case(std::string str) - { - std::transform(str.begin(), str.end(), str.begin(), ::toupper); - return str; - } - - std::string m_input; - unsigned m_currentIndex; - - std::string m_oldToken; - std::string m_token; - - bool m_isNumber; -}; - -class TextMeshParser -{ -public: - TextMeshParser(unsigned dim) - { - m_data.spatialDim = dim; - } - - TextMeshData parse(const std::string& meshDescription) - { - initialize_parse(meshDescription); - parse_description(); - set_part_ids(); - return m_data; - } - -private: - void initialize_parse(const std::string& meshDescription) - { - m_lexer.set_input_string(meshDescription); - m_lineNumber = 1; - validate_required_field(m_lexer.has_token()); - } - - void parse_description() - { - while (m_lexer.has_token()) { - ElementData elemData = parse_element(); - m_data.add_element(elemData); - - validate_no_extra_fields(); - parse_newline(); - } - } - - ElementData parse_element() - { - ElementData elem; - elem.proc = parse_proc_id(); - elem.identifier = parse_elem_id(); - elem.topology = parse_topology(); - elem.nodeIds = parse_node_ids(elem.topology); - elem.partName = parse_part(elem.topology); - return elem; - } - - int parse_proc_id() - { - validate_required_field(m_lexer.has_number()); - return parse_int(); - } - - stk::mesh::EntityId parse_elem_id() - { - validate_required_field(m_lexer.has_number()); - return parse_unsigned(); - } - - stk::topology parse_topology() - { - validate_required_field(m_lexer.has_string()); - std::string topologyName = parse_string(); - - stk::topology topology = m_topologyMapping.topology(topologyName); - validate_topology(topology, topologyName); - - return topology; - } - - stk::mesh::EntityIdVector parse_node_ids(const stk::topology& topology) - { - stk::mesh::EntityIdVector nodeIds; - while (m_lexer.has_number()) { - nodeIds.push_back(parse_unsigned()); - } - validate_node_count(topology, nodeIds.size()); - return nodeIds; - } - - std::string parse_part(const stk::topology& topology) - { - std::string partName; - - if (m_lexer.has_string()) { - partName = parse_string(); - } - else { - partName = "block_" + topology.name(); - } - - if (m_lexer.has_number()) { - unsigned partId = parse_unsigned(); - m_partIds.register_part_name_with_id(partName, partId); - } - else { - m_partIds.register_part_name(partName); - } - - return partName; - } - - int parse_int() { return m_lexer.get_int(); } - unsigned parse_unsigned() { return m_lexer.get_unsigned(); } - std::string parse_string() { return m_lexer.get_string(); } - - void parse_newline() - { - m_lexer.get_newline(); - m_lineNumber++; - } - - void validate_required_field(bool hasNextRequiredField) - { - ThrowRequireMsg(hasNextRequiredField, - "Error! Each line must contain the following fields (with at least one node): " - "Processor, GlobalId, Element Topology, NodeIds. Error on line " << m_lineNumber << "."); - } - - void validate_no_extra_fields() - { - ThrowRequireMsg(!m_lexer.has_token() || m_lexer.has_newline(), - "Error! Each line should not contain more than the following fields (with at least one node): " - "Processor, GlobalId, Element Topology, NodeIds, Part Name, PartId. " - "Error on line " << m_lineNumber << "."); - } - - void validate_topology(const stk::topology& topology, const std::string& providedName) - { - ThrowRequireMsg(topology != stk::topology::INVALID_TOPOLOGY, - "Error! Topology = >>" << providedName << "<< is invalid from line " << m_lineNumber << "."); - ThrowRequireMsg(topology.defined_on_spatial_dimension(m_data.spatialDim), - "Error on input line " << m_lineNumber << ". Topology = " << topology - << " is not defined on spatial dimension = " << m_data.spatialDim - << " set in MetaData."); - } - - void validate_node_count(const stk::topology& topology, size_t numNodes) - { - size_t numTopologyNodes = topology.num_nodes(); - ThrowRequireMsg(numNodes == numTopologyNodes, - "Error! The input line appears to contain " << numNodes << " nodes, but the topology " - << topology << " needs " << numTopologyNodes << " nodes on line " << m_lineNumber << "."); - } - - void set_part_ids() - { - for (ElementData& elem : m_data.elementDataVec) { - elem.partId = m_partIds.get(elem.partName); - } - } - - unsigned m_lineNumber; - TextMeshData m_data; - Lexer m_lexer; - TopologyMapping m_topologyMapping; - PartIdMapping m_partIds; -}; - class MetaDataInitializer { public: @@ -529,7 +56,7 @@ class MetaDataInitializer stk::mesh::Part& part = m_meta.declare_part_with_topology(elementData.partName, elementData.topology); stk::io::put_io_part_attribute(part); - m_meta.set_part_id(part, elementData.partId); + m_meta.set_part_id(part, m_data.partIds.get(elementData.partName)); } } } @@ -608,41 +135,6 @@ class BulkDataInitializer stk::mesh::MetaData& m_meta; }; -class Coordinates -{ -public: - Coordinates(const TextMeshData& data, const std::vector coordinates) - { - validate_num_coordinates(data, coordinates); - fill_coordinate_map(data, coordinates); - } - - const std::vector& operator[](const stk::mesh::EntityId& nodeId) const - { - auto it(m_nodalCoords.find(nodeId)); - return it->second; - } - -private: - void validate_num_coordinates(const TextMeshData& data, const std::vector& coordinates) - { - ThrowRequireMsg(coordinates.size() == data.nodeIds.size()*data.spatialDim, - "Number of coordinates: " << coordinates.size() - << ", Number of nodes: " << data.nodeIds.size() - << ", Spatial dimension: " << data.spatialDim); - } - - void fill_coordinate_map(const TextMeshData& data, const std::vector& coordinates) - { - std::vector::const_iterator coordIter = coordinates.begin(); - for (const stk::mesh::EntityId& nodeId : data.nodeIds) { - m_nodalCoords[nodeId] = std::vector(coordIter, coordIter+data.spatialDim); - coordIter += data.spatialDim; - } - } - - std::unordered_map> m_nodalCoords; -}; class CoordinateInitializer { diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.cpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.cpp new file mode 100644 index 000000000000..a6b52ed16c90 --- /dev/null +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.cpp @@ -0,0 +1,168 @@ +#include +#include +#include // for Field +#include +#include // for MetaData, put_field, etc +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest.h" +#include "mpi.h" + +namespace stk +{ +namespace unit_test_util +{ +TextMeshFixture::TextMeshFixture(unsigned spatialDim) : stk::unit_test_util::MeshFixture(spatialDim) {} + +void TextMeshFixture::verify_shared_nodes(const stk::mesh::EntityIdVector& nodeIds, int sharingProc) +{ + std::vector counts; + stk::mesh::count_entities(get_meta().globally_shared_part(), get_bulk(), counts); + EXPECT_EQ(nodeIds.size(), counts[stk::topology::NODE_RANK]); + + for (stk::mesh::EntityId nodeId : nodeIds) { + EXPECT_TRUE(get_bulk().in_shared(stk::mesh::EntityKey(stk::topology::NODE_RANK, nodeId), sharingProc)); + } +} + +void TextMeshFixture::verify_num_elements(size_t goldCount) +{ + std::vector counts; + stk::mesh::count_entities(get_meta().universal_part(), get_bulk(), counts); + EXPECT_EQ(goldCount, counts[stk::topology::ELEM_RANK]); +} + +void TextMeshFixture::verify_single_element( + stk::mesh::EntityId elemId, stk::topology topology, const stk::mesh::EntityIdVector& nodeIds) +{ + stk::mesh::Entity element = get_bulk().get_entity(stk::topology::ELEM_RANK, elemId); + EXPECT_TRUE(get_bulk().is_valid(element)); + EXPECT_EQ(topology, get_bulk().bucket(element).topology()); + verify_nodes_on_element(element, nodeIds); +} + +void TextMeshFixture::verify_part_membership(const std::vector golds) +{ + for (const PartInfo& gold : golds) { + stk::mesh::Part* blockPart = get_meta().get_part(gold.blockName); + + verify_part(blockPart); + verify_elements_on_part(blockPart, gold.ids); + } +} + +void TextMeshFixture::verify_part_ids(const std::vector& golds) +{ + for (const PartNameId& gold : golds) { + stk::mesh::Part* blockPart = get_meta().get_part(gold.first); + + verify_part(blockPart); + EXPECT_EQ(blockPart->id(), gold.second); + } +} + +void TextMeshFixture::verify_coordinates( + const stk::mesh::EntityIdVector& goldNodeIds, const std::vector& goldCoordinates) +{ + CoordinateVerifier cv(get_bulk(), goldNodeIds, goldCoordinates); + cv.verify(); +} + +void TextMeshFixture::verify_nodes_on_element(stk::mesh::Entity element, const stk::mesh::EntityIdVector& goldNodeIds) +{ + stk::mesh::EntityVector nodes(get_bulk().begin_nodes(element), get_bulk().end_nodes(element)); + EXPECT_EQ(goldNodeIds, get_node_ids(nodes)); +} + +stk::mesh::EntityIdVector TextMeshFixture::get_node_ids(const stk::mesh::EntityVector& nodes) +{ + stk::mesh::EntityIdVector nodeIds; + for (const stk::mesh::Entity& node : nodes) { + nodeIds.emplace_back(get_bulk().identifier(node)); + } + return nodeIds; +} + +void TextMeshFixture::verify_part(stk::mesh::Part* blockPart) +{ + ASSERT_TRUE(blockPart != nullptr); + EXPECT_TRUE(stk::io::is_part_io_part(*blockPart)); +} + +void TextMeshFixture::verify_elements_on_part(stk::mesh::Part* blockPart, const std::set& goldIds) +{ + stk::mesh::EntityVector elems; + stk::mesh::get_selected_entities(*blockPart, get_bulk().buckets(stk::topology::ELEM_RANK), elems); + + ASSERT_EQ(goldIds.size(), elems.size()); + for (const stk::mesh::Entity& elem : elems) { + stk::mesh::EntityId elemId = get_bulk().identifier(elem); + EXPECT_EQ(1u, goldIds.count(elemId)); + } +} + +TextMeshFixture::CoordinateVerifier::CoordinateVerifier( + const stk::mesh::BulkData& b, const stk::mesh::EntityIdVector& ids, const std::vector& coords) + : bulk(b), + meta(bulk.mesh_meta_data()), + spatialDim(meta.spatial_dimension()), + goldNodeIds(ids), + goldCoordinates(coords) +{ +} + +void TextMeshFixture::CoordinateVerifier::verify() +{ + verify_num_nodes(); + + for (size_t nodeIndex = 0; nodeIndex < goldNodeIds.size(); nodeIndex++) { + stk::mesh::EntityId nodeId = goldNodeIds[nodeIndex]; + EXPECT_TRUE(bulk.is_valid(get_node(nodeId))); + + const double* nodalCoords = get_nodal_coordinates(nodeId); + const double* goldCoords = &goldCoordinates[nodeIndex * spatialDim]; + + verify_nodal_coordinates(nodeId, goldCoords, nodalCoords); + } +} + +void TextMeshFixture::CoordinateVerifier::verify_num_nodes() +{ + stk::mesh::EntityVector nodes; + stk::mesh::get_entities(bulk, stk::topology::NODE_RANK, nodes); + EXPECT_EQ(goldNodeIds.size(), nodes.size()); +} + +const double* TextMeshFixture::CoordinateVerifier::get_nodal_coordinates(const stk::mesh::EntityId& nodeId) +{ + const stk::mesh::CoordinatesField& coordsField = + static_cast(*meta.coordinate_field()); + return stk::mesh::field_data(coordsField, get_node(nodeId)); +} + +const stk::mesh::Entity TextMeshFixture::CoordinateVerifier::get_node(const stk::mesh::EntityId& nodeId) +{ + return bulk.get_entity(stk::topology::NODE_RANK, nodeId); +} + +void TextMeshFixture::CoordinateVerifier::verify_nodal_coordinates( + const stk::mesh::EntityId& nodeId, const double* goldCoords, const double* nodalCoords) +{ + for (unsigned i = 0; i < spatialDim; i++) { + EXPECT_NEAR(goldCoords[i], nodalCoords[i], 1.0e-9) << error_message(nodeId, i); + } +} + +std::string TextMeshFixture::CoordinateVerifier::error_message(const stk::mesh::EntityId& nodeId, unsigned coordIndex) +{ + std::stringstream message; + message << "Proc " << bulk.parallel_rank() << ", Node ID " << nodeId << ", coord index " << coordIndex; + return message.str(); +} +} // namespace unit_test_util +} // namespace stk diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.hpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.hpp new file mode 100644 index 000000000000..98211091058b --- /dev/null +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshFixture.hpp @@ -0,0 +1,81 @@ +#ifndef STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_UNITTESTTEXTMESH_HPP_ +#define STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_UNITTESTTEXTMESH_HPP_ + +#include +#include // for MetaData, put_field, etc +#include +#include +#include + +namespace stk +{ +namespace unit_test_util +{ +class TextMeshFixture : public stk::unit_test_util::MeshFixture +{ + protected: + TextMeshFixture(unsigned spatialDim); + + void verify_shared_nodes(const stk::mesh::EntityIdVector& nodeIds, int sharingProc); + + void verify_num_elements(size_t goldCount); + + void verify_single_element( + stk::mesh::EntityId elemId, stk::topology topology, const stk::mesh::EntityIdVector& nodeIds); + + struct PartInfo { + std::string blockName; + std::set ids; + }; + + void verify_part_membership(const std::vector golds); + + using PartNameId = std::pair; + + void verify_part_ids(const std::vector& golds); + + void verify_coordinates(const stk::mesh::EntityIdVector& goldNodeIds, const std::vector& goldCoordinates); + + private: + void verify_nodes_on_element(stk::mesh::Entity element, const stk::mesh::EntityIdVector& goldNodeIds); + + stk::mesh::EntityIdVector get_node_ids(const stk::mesh::EntityVector& nodes); + + void verify_part(stk::mesh::Part* blockPart); + + void verify_elements_on_part(stk::mesh::Part* blockPart, const std::set& goldIds); + + class CoordinateVerifier + { + public: + CoordinateVerifier( + const stk::mesh::BulkData& b, const stk::mesh::EntityIdVector& ids, const std::vector& coords); + + void verify(); + + private: + void verify_num_nodes(); + + const double* get_nodal_coordinates(const stk::mesh::EntityId& nodeId); + + const stk::mesh::Entity get_node(const stk::mesh::EntityId& nodeId); + + void verify_nodal_coordinates( + const stk::mesh::EntityId& nodeId, const double* goldCoords, const double* nodalCoords); + + std::string error_message(const stk::mesh::EntityId& nodeId, unsigned coordIndex); + + const stk::mesh::BulkData& bulk; + const stk::mesh::MetaData& meta; + + const unsigned spatialDim; + + const stk::mesh::EntityIdVector& goldNodeIds; + const std::vector& goldCoordinates; + }; +}; + +} // namespace unit_test_util +} // namespace stk + +#endif /* STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_UNITTESTTEXTMESH_HPP_ */ diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.cpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.cpp new file mode 100644 index 000000000000..60534a17e282 --- /dev/null +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.cpp @@ -0,0 +1,557 @@ +// ####################### Start Clang Header Tool Managed Headers ######################## +// clang-format off +#include "TextMeshUtils.hpp" +#include // for toupper +#include // for size_t +#include // for remove, etc +#include // for insert_iterator +#include +#include // for set +#include // for operator<<, etc +#include // for is_part_io_part, etc +#include // for BulkData +#include // for declare_element +#include // for Field +#include // for get_entities +#include // for MetaData, etc +#include // for basic_string, etc +#include // for pair +#include // for vector + +#include "stk_mesh/base/FieldParallel.hpp" +#include "stk_mesh/base/CoordinateSystems.hpp" // for Cartesian +#include "stk_mesh/base/Entity.hpp" // for Entity +#include "stk_mesh/base/FieldBase.hpp" // for field_data +#include "stk_mesh/base/Types.hpp" // for EntityId, etc +#include "stk_topology/topology.hpp" // for topology, etc +#include "stk_util/util/ReportHandler.hpp" // for ThrowRequireMsg + +namespace stk { namespace mesh { class Part; } } +// clang-format on +// ####################### End Clang Header Tool Managed Headers ######################## + +namespace stk +{ +namespace unit_test_util +{ +TopologyMapping::TopologyMapping() +{ + initialize_topology_map(); +} + +void TopologyMapping::initialize_topology_map() +{ + m_nameToTopology = { + {"NODE", stk::topology::NODE}, + {"LINE_2", stk::topology::LINE_2}, + {"LINE_3", stk::topology::LINE_3}, + {"TRI_3", stk::topology::TRI_3}, + {"TRI_4", stk::topology::TRI_4}, + {"TRI_6", stk::topology::TRI_6}, + {"QUAD_4", stk::topology::QUAD_4}, + {"QUAD_6", stk::topology::QUAD_6}, + {"QUAD_8", stk::topology::QUAD_8}, + {"QUAD_9", stk::topology::QUAD_9}, + {"PARTICLE", stk::topology::PARTICLE}, + {"LINE_2_1D", stk::topology::LINE_2_1D}, + {"LINE_3_1D", stk::topology::LINE_3_1D}, + {"BEAM_2", stk::topology::BEAM_2}, + {"BEAM_3", stk::topology::BEAM_3}, + {"SHELL_LINE_2", stk::topology::SHELL_LINE_2}, + {"SHELL_LINE_3", stk::topology::SHELL_LINE_3}, + {"SPRING_2", stk::topology::SPRING_2}, + {"SPRING_3", stk::topology::SPRING_3}, + {"TRI_3_2D", stk::topology::TRI_3_2D}, + {"TRI_4_2D", stk::topology::TRI_4_2D}, + {"TRI_6_2D", stk::topology::TRI_6_2D}, + {"QUAD_4_2D", stk::topology::QUAD_4_2D}, + {"QUAD_8_2D", stk::topology::QUAD_8_2D}, + {"QUAD_9_2D", stk::topology::QUAD_9_2D}, + {"SHELL_TRI_3", stk::topology::SHELL_TRI_3}, + {"SHELL_TRI_4", stk::topology::SHELL_TRI_4}, + {"SHELL_TRI_6", stk::topology::SHELL_TRI_6}, + {"SHELL_QUAD_4", stk::topology::SHELL_QUAD_4}, + {"SHELL_QUAD_8", stk::topology::SHELL_QUAD_8}, + {"SHELL_QUAD_9", stk::topology::SHELL_QUAD_9}, + {"TET_4", stk::topology::TET_4}, + {"TET_8", stk::topology::TET_8}, + {"TET_10", stk::topology::TET_10}, + {"TET_11", stk::topology::TET_11}, + {"PYRAMID_5", stk::topology::PYRAMID_5}, + {"PYRAMID_13", stk::topology::PYRAMID_13}, + {"PYRAMID_14", stk::topology::PYRAMID_14}, + {"WEDGE_6", stk::topology::WEDGE_6}, + {"WEDGE_12", stk::topology::WEDGE_12}, + {"WEDGE_15", stk::topology::WEDGE_15}, + {"WEDGE_18", stk::topology::WEDGE_18}, + {"HEX_8", stk::topology::HEX_8}, + {"HEX_20", stk::topology::HEX_20}, + {"HEX_27", stk::topology::HEX_27}, + }; +} + +stk::topology::topology_t TopologyMapping::topology(const std::string& name) const +{ + auto it = m_nameToTopology.find(name); + return (it != m_nameToTopology.end() ? it->second : stk::topology::INVALID_TOPOLOGY); +} + +PartIdMapping::PartIdMapping() : m_idsAssigned(false) {} + +void PartIdMapping::register_part_name(const std::string& name) +{ + m_partNames.push_back(name); + handle_block_part(name); +} + +void PartIdMapping::register_part_name_with_id(const std::string& name, unsigned id) +{ + register_part_name(name); + assign(name, id); +} + +unsigned PartIdMapping::get_part_id(const std::string& name) const +{ + auto it = m_ids.find(name); + ThrowRequireMsg(it != m_ids.end(), "PartIdMapping has no ID for invalid part name " << name); + return it->second; +} + +unsigned PartIdMapping::get(const std::string& name) const +{ + if (!m_idsAssigned) assign_ids(); + return get_part_id(name); +} + +std::string PartIdMapping::get_part_name(unsigned id) const +{ + auto it = m_parts.find(id); + ThrowRequireMsg(it != m_parts.end(), "PartIdMapping has no part name for invalid id " << id); + return it->second; +} + +std::string PartIdMapping::get(unsigned id) const +{ + if (!m_idsAssigned) assign_ids(); + return get_part_name(id); +} + +unsigned PartIdMapping::size() const +{ + if (!m_idsAssigned) assign_ids(); + return m_ids.size(); +} + +std::vector PartIdMapping::get_part_names_sorted_by_id() const +{ + if (!m_idsAssigned) assign_ids(); + + std::vector names; + names.reserve(m_parts.size()); + + for (auto iter : m_parts) { + names.push_back(iter.second); + } + + return names; +} + +void PartIdMapping::handle_block_part(const std::string& name) +{ + const std::string blockPrefix = "BLOCK_"; + const unsigned prefixLength = blockPrefix.length(); + + if (name.length() < prefixLength + 1) return; + + const std::string namePrefix = name.substr(0, prefixLength); + const std::string nameSuffix = name.substr(prefixLength); + + if (namePrefix != blockPrefix) return; + + unsigned id; + std::istringstream nameSuffixStream(nameSuffix); + nameSuffixStream >> id; + if (nameSuffixStream.fail()) { + return; + } + assign(name, id); +} + +void PartIdMapping::assign_ids() const +{ + unsigned nextPartId = 1; + for (const std::string& name : m_partNames) { + if (m_ids.find(name) == m_ids.end()) { + while (is_assigned(nextPartId)) nextPartId++; + + assign(name, nextPartId); + } + } + + m_idsAssigned = true; +} + +void PartIdMapping::assign(const std::string& name, unsigned id) const +{ + validate_name_and_id(name, id); + m_ids[name] = id; + m_parts[id] = name; +} + +void PartIdMapping::validate_name_and_id(const std::string& name, unsigned id) const +{ + if (is_registered(name)) { + ThrowRequireMsg( + m_ids[name] == id, "Cannot assign part '" << name << "' two different ids: " << m_ids[name] << " and " << id); + } else { + ThrowRequireMsg( + !is_assigned(id), "Part id " << id << " has already been assigned, cannot assign it to part '" << name << "'"); + } +} + +bool PartIdMapping::is_registered(const std::string& name) const +{ + return m_ids.count(name) > 0; +} + +bool PartIdMapping::is_assigned(unsigned id) const +{ + return m_parts.count(id) > 0; +} + +void TextMeshData::add_element(const ElementData& elem) +{ + elementDataVec.push_back(elem); + for (const stk::mesh::EntityId& nodeId : elem.nodeIds) { + nodeIds.insert(nodeId); + associate_node_with_proc(nodeId, elem.proc); + } +} + +const EntityIdSet TextMeshData::nodes_on_proc(int proc) const +{ + auto it = m_nodesOnProc.find(proc); + return it != m_nodesOnProc.end() ? it->second : EntityIdSet(); +} + +unsigned TextMeshData::num_nodes_on_proc(int proc) const +{ + auto it = m_nodesOnProc.find(proc); + return it != m_nodesOnProc.end() ? it->second.size() : 0; +} + +const std::set TextMeshData::procs_for_node(const stk::mesh::EntityId& nodeId) const +{ + auto it = m_procsForNode.find(nodeId); + return it != m_procsForNode.end() ? it->second : std::set(); +} + +void TextMeshData::associate_node_with_proc(const stk::mesh::EntityId& nodeId, int proc) +{ + m_procsForNode[nodeId].insert(proc); + m_nodesOnProc[proc].insert(nodeId); +} + +TextMeshLexer::TextMeshLexer() : m_currentIndex(0), m_token(""), m_isNumber(false) {} + +void TextMeshLexer::set_input_string(const std::string& input) +{ + m_input = input; + m_currentIndex = 0; + read_next_token(); +} + +int TextMeshLexer::get_int() +{ + read_next_token(); + return std::stoi(m_oldToken); +} + +unsigned TextMeshLexer::get_unsigned() +{ + read_next_token(); + return std::stoul(m_oldToken); +} + +std::string TextMeshLexer::get_string() +{ + read_next_token(); + return make_upper_case(m_oldToken); +} + +void TextMeshLexer::get_newline() +{ + read_next_token(); +} + +bool TextMeshLexer::has_token() const +{ + return m_token != ""; +} +bool TextMeshLexer::has_newline() const +{ + return m_token == "\n"; +} +bool TextMeshLexer::has_number() const +{ + return has_token() && m_isNumber; +} +bool TextMeshLexer::has_string() const +{ + return has_token() && !has_number() && !has_newline(); +} + +void TextMeshLexer::read_next_token() +{ + m_oldToken = m_token; + + if (char_is_newline()) { + m_isNumber = false; + m_token = "\n"; + m_currentIndex++; + return; + } + + m_token = ""; + m_isNumber = true; + + while (has_more_input()) { + if (char_is_whitespace()) { + m_currentIndex++; + continue; + } + + if (char_is_comma()) { + m_currentIndex++; + break; + } + + if (char_is_newline()) { + break; + } + + m_isNumber &= char_is_digit(); + m_token += current_char(); + m_currentIndex++; + } +} + +bool TextMeshLexer::has_more_input() +{ + return m_currentIndex < m_input.size(); +} + +bool TextMeshLexer::char_is_whitespace() +{ + return current_char() == ' '; +} +bool TextMeshLexer::char_is_comma() +{ + return current_char() == ','; +} +bool TextMeshLexer::char_is_newline() +{ + return current_char() == '\n'; +} +bool TextMeshLexer::char_is_digit() +{ + return std::isdigit(static_cast(current_char())); +} + +char TextMeshLexer::current_char() +{ + return m_input[m_currentIndex]; +} + +std::string TextMeshLexer::make_upper_case(std::string str) +{ + std::transform(str.begin(), str.end(), str.begin(), ::toupper); + return str; +} + +TextMeshParser::TextMeshParser(unsigned dim) : m_lineNumber(0) +{ + m_data.spatialDim = dim; +} + +TextMeshData TextMeshParser::parse(const std::string& meshDescription) +{ + initialize_parse(meshDescription); + parse_description(); + return m_data; +} + +void TextMeshParser::initialize_parse(const std::string& meshDescription) +{ + m_lexer.set_input_string(meshDescription); + m_lineNumber = 1; + validate_required_field(m_lexer.has_token()); +} + +void TextMeshParser::parse_description() +{ + while (m_lexer.has_token()) { + ElementData elemData = parse_element(); + m_data.add_element(elemData); + + validate_no_extra_fields(); + parse_newline(); + } +} + +ElementData TextMeshParser::parse_element() +{ + ElementData elem; + elem.proc = parse_proc_id(); + elem.identifier = parse_elem_id(); + elem.topology = parse_topology(); + elem.nodeIds = parse_node_ids(elem.topology); + elem.partName = parse_part(elem.topology); + return elem; +} + +int TextMeshParser::parse_proc_id() +{ + validate_required_field(m_lexer.has_number()); + return parse_int(); +} + +stk::mesh::EntityId TextMeshParser::parse_elem_id() +{ + validate_required_field(m_lexer.has_number()); + return parse_unsigned(); +} + +stk::topology TextMeshParser::parse_topology() +{ + validate_required_field(m_lexer.has_string()); + std::string topologyName = parse_string(); + + stk::topology topology = m_topologyMapping.topology(topologyName); + validate_topology(topology, topologyName); + + return topology; +} + +stk::mesh::EntityIdVector TextMeshParser::parse_node_ids(const stk::topology& topology) +{ + stk::mesh::EntityIdVector nodeIds; + while (m_lexer.has_number()) { + nodeIds.push_back(parse_unsigned()); + } + validate_node_count(topology, nodeIds.size()); + return nodeIds; +} + +std::string TextMeshParser::parse_part(const stk::topology& topology) +{ + std::string partName; + + if (m_lexer.has_string()) { + partName = parse_string(); + } else { + partName = "block_" + topology.name(); + } + + if (m_lexer.has_number()) { + unsigned partId = parse_unsigned(); + m_data.partIds.register_part_name_with_id(partName, partId); + } else { + m_data.partIds.register_part_name(partName); + } + + return partName; +} + +int TextMeshParser::parse_int() +{ + return m_lexer.get_int(); +} +unsigned TextMeshParser::parse_unsigned() +{ + return m_lexer.get_unsigned(); +} +std::string TextMeshParser::parse_string() +{ + return m_lexer.get_string(); +} + +void TextMeshParser::parse_newline() +{ + m_lexer.get_newline(); + m_lineNumber++; +} + +void TextMeshParser::validate_required_field(bool hasNextRequiredField) +{ + ThrowRequireMsg(hasNextRequiredField, + "Error! Each line must contain the following fields (with at least one node): " + "Processor, GlobalId, Element Topology, NodeIds. Error on line " + << m_lineNumber << "."); +} + +void TextMeshParser::validate_no_extra_fields() +{ + ThrowRequireMsg(!m_lexer.has_token() || m_lexer.has_newline(), + "Error! Each line should not contain more than the following fields (with at least one node): " + "Processor, GlobalId, Element Topology, NodeIds, Part Name, PartId. " + "Error on line " + << m_lineNumber << "."); +} + +void TextMeshParser::validate_topology(const stk::topology& topology, const std::string& providedName) +{ + ThrowRequireMsg(topology != stk::topology::INVALID_TOPOLOGY, + "Error! Topology = >>" << providedName << "<< is invalid from line " << m_lineNumber << "."); + ThrowRequireMsg(topology.defined_on_spatial_dimension(m_data.spatialDim), + "Error on input line " << m_lineNumber << ". Topology = " << topology + << " is not defined on spatial dimension = " << m_data.spatialDim << " set in MetaData."); +} + +void TextMeshParser::validate_node_count(const stk::topology& topology, size_t numNodes) +{ + size_t numTopologyNodes = topology.num_nodes(); + ThrowRequireMsg(numNodes == numTopologyNodes, "Error! The input line appears to contain " + << numNodes << " nodes, but the topology " << topology << " needs " + << numTopologyNodes << " nodes on line " << m_lineNumber << "."); +} + +Coordinates::Coordinates() {} + +Coordinates::Coordinates(const TextMeshData& data, const std::vector& coordinates) +{ + set_coordinate_data(data, coordinates); +} + +void Coordinates::set_coordinate_data(const TextMeshData& data, const std::vector& coordinates) +{ + if (!coordinates.empty()) { + validate_num_coordinates(data, coordinates); + fill_coordinate_map(data, coordinates); + } +} + +const std::vector& Coordinates::operator[](const stk::mesh::EntityId& nodeId) const +{ + auto it(m_nodalCoords.find(nodeId)); + return it->second; +} + +void Coordinates::validate_num_coordinates(const TextMeshData& data, const std::vector& coordinates) +{ + ThrowRequireMsg(coordinates.size() == data.nodeIds.size() * data.spatialDim, + "Number of coordinates: " << coordinates.size() << ", Number of nodes: " << data.nodeIds.size() + << ", Spatial dimension: " << data.spatialDim); +} + +void Coordinates::fill_coordinate_map(const TextMeshData& data, const std::vector& coordinates) +{ + std::vector::const_iterator coordIter = coordinates.begin(); + for (const stk::mesh::EntityId& nodeId : data.nodeIds) { + m_nodalCoords[nodeId] = std::vector(coordIter, coordIter + data.spatialDim); + coordIter += data.spatialDim; + } +} + +} // namespace unit_test_util +} // namespace stk diff --git a/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.hpp b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.hpp new file mode 100644 index 000000000000..92566803d61a --- /dev/null +++ b/packages/stk/stk_unit_test_utils/stk_unit_test_utils/TextMeshUtils.hpp @@ -0,0 +1,228 @@ +#ifndef STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_TEXTMESHUTILS_HPP_ +#define STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_TEXTMESHUTILS_HPP_ + +// ####################### Start Clang Header Tool Managed Headers ######################## +// clang-format off +#include "TextMesh.hpp" +#include // for toupper +#include // for size_t +#include // for remove, etc +#include // for insert_iterator +#include +#include // for set +#include // for operator<<, etc +#include // for is_part_io_part, etc +#include // for BulkData +#include // for declare_element +#include // for Field +#include // for get_entities +#include // for MetaData, etc +#include // for basic_string, etc +#include // for pair +#include // for vector + +#include "stk_mesh/base/FieldParallel.hpp" +#include "stk_mesh/base/CoordinateSystems.hpp" // for Cartesian +#include "stk_mesh/base/Entity.hpp" // for Entity +#include "stk_mesh/base/FieldBase.hpp" // for field_data +#include "stk_mesh/base/Types.hpp" // for EntityId, etc +#include "stk_topology/topology.hpp" // for topology, etc +#include "stk_util/util/ReportHandler.hpp" // for ThrowRequireMsg + +namespace stk { namespace mesh { class Part; } } +// clang-format on +// ####################### End Clang Header Tool Managed Headers ######################## + +namespace stk +{ +namespace unit_test_util +{ +using EntityIdSet = std::set; + +class TopologyMapping +{ + public: + TopologyMapping(); + stk::topology::topology_t topology(const std::string& name) const; + + private: + void initialize_topology_map(); + std::unordered_map m_nameToTopology; +}; + +class PartIdMapping +{ + public: + PartIdMapping(); + + void register_part_name(const std::string& name); + + void register_part_name_with_id(const std::string& name, unsigned id); + + unsigned get(const std::string& name) const; + + std::string get(unsigned id) const; + + unsigned size() const; + + std::vector get_part_names_sorted_by_id() const; + + private: + void handle_block_part(const std::string& name); + + void assign_ids() const; + + void assign(const std::string& name, unsigned id) const; + + void validate_name_and_id(const std::string& name, unsigned id) const; + + bool is_registered(const std::string& name) const; + + bool is_assigned(unsigned id) const; + + unsigned get_part_id(const std::string& name) const; + std::string get_part_name(unsigned id) const; + + std::vector m_partNames; + mutable std::unordered_map m_ids; + mutable std::map m_parts; + mutable bool m_idsAssigned; +}; + +struct ElementData { + int proc; + stk::mesh::EntityId identifier; + stk::topology topology; + stk::mesh::EntityIdVector nodeIds; + std::string partName = ""; +}; + +struct TextMeshData { + unsigned spatialDim; + std::vector elementDataVec; + PartIdMapping partIds; + EntityIdSet nodeIds; + + void add_element(const ElementData& elem); + + const EntityIdSet nodes_on_proc(int proc) const; + + unsigned num_nodes_on_proc(int proc) const; + + const std::set procs_for_node(const stk::mesh::EntityId& nodeId) const; + + private: + void associate_node_with_proc(const stk::mesh::EntityId& nodeId, int proc); + + std::unordered_map> m_procsForNode; + std::unordered_map m_nodesOnProc; +}; + +class TextMeshLexer +{ + public: + TextMeshLexer(); + + void set_input_string(const std::string& input); + + int get_int(); + + unsigned get_unsigned(); + + std::string get_string(); + + void get_newline(); + + bool has_token() const; + bool has_newline() const; + bool has_number() const; + bool has_string() const; + + private: + void read_next_token(); + + bool has_more_input(); + bool char_is_whitespace(); + bool char_is_comma(); + bool char_is_newline(); + bool char_is_digit(); + + char current_char(); + + std::string make_upper_case(std::string str); + + std::string m_input; + unsigned m_currentIndex; + + std::string m_oldToken; + std::string m_token; + + bool m_isNumber; +}; + +class TextMeshParser +{ + public: + TextMeshParser(unsigned dim); + + TextMeshData parse(const std::string& meshDescription); + + private: + void initialize_parse(const std::string& meshDescription); + + void parse_description(); + + ElementData parse_element(); + + int parse_proc_id(); + + stk::mesh::EntityId parse_elem_id(); + + stk::topology parse_topology(); + + stk::mesh::EntityIdVector parse_node_ids(const stk::topology& topology); + + std::string parse_part(const stk::topology& topology); + + int parse_int(); + unsigned parse_unsigned(); + std::string parse_string(); + + void parse_newline(); + + void validate_required_field(bool hasNextRequiredField); + + void validate_no_extra_fields(); + + void validate_topology(const stk::topology& topology, const std::string& providedName); + + void validate_node_count(const stk::topology& topology, size_t numNodes); + + unsigned m_lineNumber; + TextMeshData m_data; + TextMeshLexer m_lexer; + TopologyMapping m_topologyMapping; +}; + +class Coordinates +{ + public: + Coordinates(); + Coordinates(const TextMeshData& data, const std::vector& coordinates); + + const std::vector& operator[](const stk::mesh::EntityId& nodeId) const; + + void set_coordinate_data(const TextMeshData& data, const std::vector& coordinates); + + private: + void validate_num_coordinates(const TextMeshData& data, const std::vector& coordinates); + + void fill_coordinate_map(const TextMeshData& data, const std::vector& coordinates); + + std::unordered_map> m_nodalCoords; +}; + +} // namespace unit_test_util +} // namespace stk + +#endif /* STK_STK_UNIT_TEST_UTILS_STK_UNIT_TEST_UTILS_TEXTMESHUTILS_HPP_ */ diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp index 232600e5ed98..59838cf9313d 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucket.cpp @@ -194,7 +194,7 @@ TEST(UnitTestingOfBucket, bucketSortChangeEntityId) void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity elem, stk::mesh::Entity side, stk::mesh::EntityVector& nodes) { - stk::mesh::EntityRank sideRank = bulk.entity_rank(side); + stk::mesh::EntityRank rank = bulk.entity_rank(side); Entity const *rels_itr = bulk.begin_nodes(side); unsigned num_nodes = bulk.num_nodes(side); @@ -205,7 +205,7 @@ void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity ele stk::mesh::Permutation const *perms = bulk.begin_permutations(side, stk::topology::ELEM_RANK); std::pair ordinalAndPermutation = - stk::mesh::get_ordinal_and_permutation(bulk, elem, sideRank, nodes); + stk::mesh::get_ordinal_and_permutation(bulk, elem, rank, nodes); stk::mesh::Permutation gold_permutation = ordinalAndPermutation.second; ASSERT_TRUE(gold_permutation!=stk::mesh::INVALID_PERMUTATION); @@ -226,8 +226,8 @@ void test_nodes_and_permutation(stk::mesh::BulkData& bulk, stk::mesh::Entity ele stk::mesh::ConnectivityOrdinal elements_side_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; - unsigned num_sides = bulk.num_connectivity(elem, sideRank); - const stk::mesh::Entity *sides = bulk.begin(elem, sideRank); + unsigned num_sides = bulk.num_connectivity(elem, rank); + const stk::mesh::Entity *sides = bulk.begin(elem, rank); for (unsigned i=0;i 1) { GTEST_SKIP(); } - - setup_mesh(1, 1, 1); - - stk::mesh::Entity elem1 = get_bulk().get_entity(stk::topology::ELEM_RANK, 1); - stk::mesh::Bucket& bucket = get_bulk().bucket(elem1); - unsigned bucket_ordinal = get_bulk().bucket_ordinal(elem1); - EXPECT_EQ(0u, bucket_ordinal); - - const stk::mesh::Entity* nodes = bucket.begin_nodes(bucket_ordinal); - stk::mesh::ConnectivityOrdinal ord = 0; - stk::mesh::Permutation perm = stk::mesh::INVALID_PERMUTATION; - - BucketTester& bktTester = static_cast(bucket); - EXPECT_FALSE(bktTester.my_declare_relation(bucket_ordinal, nodes[0], ord, perm)); -} - TEST_F(BucketHex, changing_conn_on_bucket_for_face_to_element) { if (stk::parallel_machine_size(MPI_COMM_WORLD) == 1) @@ -386,31 +356,41 @@ TEST_F(BucketHex, changing_conn_on_bucket_for_face_to_element) std::pair ordinalAndPermutation = stk::mesh::get_ordinal_and_permutation(bulk, elem, stk::topology::FACE_RANK, new_nodes); - stk::mesh::ConnectivityOrdinal faceElemOrdinal = ordinalAndPermutation.first; stk::mesh::Permutation new_permutation = ordinalAndPermutation.second; - stk::mesh::ConnectivityOrdinal elemFaceOrdinal = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + unsigned faces_element_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + unsigned num_elems = bulk.num_elements(side); + const stk::mesh::Entity *elements = bulk.begin_elements(side); + for (unsigned i=0;i(i); + break; + } + } + + unsigned elements_face_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; unsigned num_faces = bulk.num_faces(elem); const stk::mesh::Entity *faces = bulk.begin_faces(elem); - const stk::mesh::ConnectivityOrdinal *faceOrds = bulk.begin_ordinals(elem, stk::topology::FACE_RANK); for (unsigned i=0;i(i); break; } } - ASSERT_TRUE(elemFaceOrdinal!=stk::mesh::INVALID_CONNECTIVITY_ORDINAL); + ASSERT_TRUE(elements_face_offset!=stk::mesh::INVALID_CONNECTIVITY_ORDINAL); stk::mesh::unit_test::BucketTester& bucket_side = static_cast(bulk.bucket(side)); bucket_side.my_change_connected_nodes(bulk.bucket_ordinal(side), &new_nodes[0]); - bucket_side.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(side), faceElemOrdinal, new_permutation); + bucket_side.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(side), faces_element_offset, new_permutation); stk::mesh::unit_test::BucketTester& bucket_elem = static_cast(bulk.bucket(elem)); - bucket_elem.my_change_existing_permutation_for_connected_face(bulk.bucket_ordinal(elem), elemFaceOrdinal, new_permutation); + bucket_elem.my_change_existing_permutation_for_connected_face(bulk.bucket_ordinal(elem), elements_face_offset, new_permutation); test_nodes_and_permutation(bulk, elem, side, new_nodes); } @@ -444,33 +424,42 @@ TEST_F(BucketHex, changing_conn_on_bucket_for_edge_to_element) std::pair ordinalAndPermutation = stk::mesh::get_ordinal_and_permutation(bulk, elem, stk::topology::EDGE_RANK, new_nodes); - stk::mesh::ConnectivityOrdinal edgeElemOrdinal = ordinalAndPermutation.first; stk::mesh::Permutation new_permutation = ordinalAndPermutation.second; - stk::mesh::ConnectivityOrdinal elemEdgeOrdinal = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + unsigned edges_element_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; + unsigned num_elems = bulk.num_elements(edge); + const stk::mesh::Entity *elements = bulk.begin_elements(edge); + for (unsigned i=0;i(i); + break; + } + } + + unsigned elements_edge_offset = stk::mesh::INVALID_CONNECTIVITY_ORDINAL; unsigned num_edges = bulk.num_edges(elem); const stk::mesh::Entity *edges = bulk.begin_edges(elem); - const stk::mesh::ConnectivityOrdinal *edgeOrds = bulk.begin_ordinals(elem, stk::topology::EDGE_RANK); for (unsigned i=0;i(i); break; } } - ASSERT_TRUE(elemEdgeOrdinal != stk::mesh::INVALID_CONNECTIVITY_ORDINAL); + ASSERT_TRUE(elements_edge_offset != stk::mesh::INVALID_CONNECTIVITY_ORDINAL); stk::mesh::unit_test::BucketTester& bucket_edge = static_cast(bulk.bucket(edge)); bucket_edge.my_change_connected_nodes(bulk.bucket_ordinal(edge), &new_nodes[0]); - - bucket_edge.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(edge), edgeElemOrdinal, new_permutation); + bucket_edge.my_change_existing_permutation_for_connected_element(bulk.bucket_ordinal(edge), edges_element_offset, new_permutation); stk::mesh::unit_test::BucketTester& bucket_elem = static_cast(bulk.bucket(elem)); - bucket_elem.my_change_existing_permutation_for_connected_edge(bulk.bucket_ordinal(elem), elemEdgeOrdinal, new_permutation); + bucket_elem.my_change_existing_permutation_for_connected_edge(bulk.bucket_ordinal(elem), elements_edge_offset, new_permutation); test_nodes_and_permutation(bulk, elem, edge, new_nodes); } @@ -482,6 +471,8 @@ void do_nonmodifying_debug_check(const stk::mesh::BulkData & bulk, const stk::me const stk::mesh::BucketVector & buckets = bulk.buckets(stk::topology::NODE_RANK); ASSERT_EQ(buckets.size(), 1u); + buckets[0]->check_size_invariant(); + EXPECT_FALSE(buckets[0]->get_ngp_field_bucket_is_modified(coordsField.mesh_meta_data_ordinal())); } diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp new file mode 100644 index 000000000000..81e4d791a248 --- /dev/null +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestBucketConnectivity.cpp @@ -0,0 +1,345 @@ +// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering +// Solutions of Sandia, LLC (NTESS). Under the terms of Contract +// DE-NA0003525 with NTESS, the U.S. Government retains certain rights +// in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * 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. +// +// * Neither the name of NTESS nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT +// OWNER 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 // for NULL +#include // for uint64_t +#include // for copy +#include +#include // for vector +#include "gtest/gtest.h" // for AssertHelper, TEST + +// CRW: this should be in BucketConnectivity.hpp, but circular dependency for now +#include "stk_mesh/base/BulkData.hpp" + +#include "stk_mesh/base/BucketConnectivity.hpp" // for BucketConnectivity +#include "stk_mesh/base/Entity.hpp" // for Entity, operator<< +#include "stk_mesh/base/Types.hpp" // for ConnectivityOrdinal, etc +#include "stk_topology/topology.hpp" // for topology, etc +namespace stk { namespace mesh { class BulkData; } } + +using namespace stk::mesh; + +namespace { + +typedef impl::BucketConnectivity fixed_conn; +typedef impl::BucketConnectivity dynamic_conn; + +void check_uninit_conn_size(fixed_conn& conn, unsigned num_conn, unsigned ordinal) +{ + EXPECT_EQ(conn.num_connectivity(ordinal), num_conn); +} + +void check_uninit_conn_size(dynamic_conn& conn, unsigned num_conn, unsigned ordinal) +{ + EXPECT_EQ(conn.num_connectivity(ordinal), 0u); +} + +void check_even_conn_removed(fixed_conn& conn, unsigned num_conn, unsigned ordinal) +{ + EXPECT_EQ(conn.num_connectivity(ordinal), num_conn); + + Entity const* targets = conn.begin(ordinal); + for (unsigned i = 0; i < num_conn; ++i) { + Entity e_to(ordinal * num_conn + i + 1); + if ( (i % 2) == 0 ) { + EXPECT_EQ(targets[i], Entity()); + } + else { + EXPECT_EQ(targets[i], e_to); + } + } +} + +void check_even_conn_removed(dynamic_conn& conn, unsigned num_conn, unsigned ordinal) +{ + EXPECT_EQ(conn.num_connectivity(ordinal), num_conn / 2); + + Entity const* targets = conn.begin(ordinal); + ConnectivityOrdinal const* ordinals = conn.begin_ordinals(ordinal); + for (unsigned i = 0; i < num_conn / 2; ++i) { + Entity e_to(ordinal * num_conn + ((2*i) + 1) + 1); + EXPECT_EQ(targets[i], e_to); + EXPECT_EQ(ordinals[i], static_cast((2*i) + 1)); + } +} + +template +void test_simple_add(Connectivity& connectivity, unsigned num_entities_to_add, unsigned num_to_add) +{ + // Populate connectivity all at once for each entity + + EXPECT_EQ(connectivity.size(), 0u); + + for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { + connectivity.add_entity(); + + EXPECT_EQ(connectivity.size(), ord + 1); + check_uninit_conn_size(connectivity, num_to_add, ord); + + for (uint64_t i = 0; i < num_to_add; ++i) { + Entity e_to(ord * num_to_add + i + 1); + connectivity.add_connectivity(ord, e_to, static_cast(i)); + } + + EXPECT_EQ(connectivity.num_connectivity(ord), num_to_add); + + Entity const* begin = connectivity.begin(ord); + Entity const* end = connectivity.end(ord); + ConnectivityOrdinal const* begin_ord = connectivity.begin_ordinals(ord); + ConnectivityOrdinal const* end_ord = connectivity.end_ordinals(ord); + + EXPECT_EQ(end - begin, num_to_add); + EXPECT_EQ(end_ord - begin_ord, num_to_add); + + for (uint64_t i = 0; i < num_to_add; ++i) { + Entity expected_to(ord * num_to_add + i + 1); + EXPECT_EQ(expected_to, begin[i]); + EXPECT_EQ(static_cast(i), begin_ord[i]); + } + } +} + +template +void test_complex_add(Connectivity& connectivity, unsigned num_entities_to_add, unsigned num_to_add) +{ + // Populate connectivity one at a time for each entity + + EXPECT_EQ(connectivity.size(), 0u); + + for (uint64_t i = 0; i < num_to_add; ++i) { + for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { + if (i == 0) { + connectivity.add_entity(); + } + + if (i == 0) { + EXPECT_EQ(connectivity.size(), ord + 1); + } + else { + EXPECT_EQ(connectivity.size(), num_entities_to_add); + } + + Entity e_to(ord * num_to_add + i + 1); + connectivity.add_connectivity(ord, e_to, static_cast(i)); + } + } + + for (unsigned ord = 0; ord < num_entities_to_add; ++ord) { + EXPECT_EQ(connectivity.num_connectivity(ord), num_to_add); + + Entity const* begin = connectivity.begin(ord); + Entity const* end = connectivity.end(ord); + ConnectivityOrdinal const* begin_ord = connectivity.begin_ordinals(ord); + ConnectivityOrdinal const* end_ord = connectivity.end_ordinals(ord); + + EXPECT_EQ(end - begin, num_to_add); + EXPECT_EQ(end_ord - begin_ord, num_to_add); + + for (uint64_t i = 0; i < num_to_add; ++i) { + Entity expected_to(ord * num_to_add + i + 1); + EXPECT_EQ(expected_to, begin[i]); + EXPECT_EQ(static_cast(i), begin_ord[i]); + } + } +} + +template +void test_remove(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) +{ + test_simple_add(connectivity, num_entities, num_to_add); + + unsigned ord_to_remove_from = num_entities / 2; + + for (uint64_t i = 0; i < num_to_add; ++i) { + Entity e_to(ord_to_remove_from * num_to_add + i + 1); + if ( (i % 2) == 0 ) { + bool rv = connectivity.remove_connectivity(ord_to_remove_from, e_to, static_cast(i)); + EXPECT_TRUE(rv); + } + } + + check_even_conn_removed(connectivity, num_to_add, ord_to_remove_from); +} + +template +void test_inter_conn_copy(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) +{ + // TODO +} + +template +void test_intra_conn_copy(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) +{ + // TODO +} + +template +void test_mod_end(Connectivity& connectivity, unsigned num_entities, unsigned num_to_add) +{ + // TODO +} + +} + +TEST(BucketConnectivity, fixed_simple_add) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_simple_add(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_simple_add) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_simple_add(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, fixed_complex_add) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_complex_add(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_complex_add) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_complex_add(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, fixed_remove) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_remove(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_remove) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_remove(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, fixed_intra_conn_copy) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_intra_conn_copy(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_intra_conn_copy) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_intra_conn_copy(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, fixed_inter_conn_copy) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_inter_conn_copy(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_inter_conn_copy) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_inter_conn_copy(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, fixed_mod_end) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + fixed_conn conn(num_to_add); + + test_mod_end(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} + +TEST(BucketConnectivity, dynamic_mod_end) +{ + const unsigned num_to_add = 8; + const unsigned num_entities = 100; + BulkData * bulk = NULL; + dynamic_conn conn(stk::topology::ELEMENT_RANK, bulk); + + test_mod_end(conn, num_entities, num_to_add); + conn.end_modification(bulk); +} diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp deleted file mode 100644 index 30bc3a86673d..000000000000 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestConnectivity.cpp +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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 - -namespace { - -const stk::mesh::EntityRank nodeRank = stk::topology::NODE_RANK; -const stk::mesh::EntityRank faceRank = stk::topology::FACE_RANK; -const stk::mesh::EntityRank elemRank = stk::topology::ELEM_RANK; -const stk::mesh::EntityRank constraintRank = stk::topology::CONSTRAINT_RANK; - -class ConnectivityTester : public stk::mesh::Connectivity { -public: - void expect_null_ptrs() - { - EXPECT_EQ(nullptr, m_connectivity); - EXPECT_EQ(nullptr, m_offsetsAndOrdinals); - } - - void expect_zeros_and_empty() - { - const unsigned numOffsets = stk::mesh::Connectivity::MAX_NUM_RANKS+1; - for(unsigned r=0; r& numPerRank) - { - EXPECT_TRUE(stk::mesh::Connectivity::MAX_NUM_RANKS == numPerRank.size()); - for(unsigned r=0; r(r))); - } - } - - void expect_connectivity(const std::vector& conn) - { - EXPECT_EQ(conn.size(), m_offsetsAndOrdinals[stk::mesh::Connectivity::MAX_NUM_RANKS]); - for(unsigned i=0; i& ords) - { - EXPECT_EQ(ords.size(), m_offsetsAndOrdinals[stk::mesh::Connectivity::MAX_NUM_RANKS]); - for(unsigned i=0; i& numPerRank) - { - ConnectivityTester& connTester = static_cast(connObject); - connTester.expect_num_per_rank(numPerRank); - } - - void expect_num_per_rank(const std::vector& numPerRank) - { - expect_num_per_rank(connectivity, numPerRank); - } - - void expect_connectivity(stk::mesh::Connectivity& connObject, const std::vector& conn) - { - ConnectivityTester& connTester = static_cast(connObject); - connTester.expect_connectivity(conn); - } - - void expect_connectivity(const std::vector& conn) - { - expect_connectivity(connectivity, conn); - } - - void expect_ordinals(const std::vector& ords) - { - ConnectivityTester& connTester = static_cast(connectivity); - connTester.expect_ordinals(ords); - } - - void add_2nodes_2elems() - { - const bool allowDuplicateOrdinals = true; - - EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - } - -protected: - stk::mesh::Connectivity connectivity; - stk::mesh::Entity node1, node2, node3; - stk::mesh::Entity face1, face2, face3; - stk::mesh::Entity elem1, elem2, elem3; - stk::mesh::Entity constraint1; - stk::mesh::Entity highest1; - stk::mesh::ConnectivityOrdinal ordinal1, ordinal2, ordinal3; -}; - -TEST_F(TestConnectivity, defaultConstruct_zerosAndEmpty) -{ - ConnectivityTester& connTester = static_cast(connectivity); - connTester.expect_zeros_and_empty(); -} - -TEST_F(TestConnectivity, addConnectivity) -{ - add_2nodes_2elems(); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - expect_connectivity({node1, node2, elem1, elem2}); - expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); -} - -TEST_F(TestConnectivity, addConnectivity_then_clear) -{ - add_2nodes_2elems(); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - connectivity.clear(); - expect_num_per_rank({0, 0, 0, 0, 0, 0}); -} - -TEST_F(TestConnectivity, assignment) -{ - add_2nodes_2elems(); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - - stk::mesh::Connectivity connCopy = connectivity; - expect_num_per_rank(connCopy, {2, 0, 0, 2, 0, 0}); - expect_num_per_rank(connectivity, {2, 0, 0, 2, 0, 0}); - - connCopy = std::move(connectivity); - expect_num_per_rank(connCopy, {2, 0, 0, 2, 0, 0}); - ConnectivityTester& connTester = static_cast(connectivity); - connTester.expect_null_ptrs(); -} - -TEST_F(TestConnectivity, replaceOrAddConnectivity_not_pre_existing) -{ - EXPECT_EQ(0, connectivity.replace_or_add_connectivity(nodeRank, node1, ordinal1)); - EXPECT_EQ(1, connectivity.replace_or_add_connectivity(nodeRank, node2, ordinal2)); - EXPECT_EQ(0, connectivity.replace_or_add_connectivity(elemRank, elem1, ordinal1)); - EXPECT_EQ(1, connectivity.replace_or_add_connectivity(elemRank, elem2, ordinal2)); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - expect_connectivity({node1, node2, elem1, elem2}); - expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); -} - -TEST_F(TestConnectivity, replaceOrAddConnectivity_pre_existing) -{ - const bool allowDuplicateOrdinals = true; - EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(nodeRank, node1, ordinal1)); - EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(nodeRank, node2, ordinal2)); - EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(elemRank, elem1, ordinal1)); - EXPECT_EQ(-1, connectivity.replace_or_add_connectivity(elemRank, elem2, ordinal2)); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - expect_connectivity({node1, node2, elem1, elem2}); - expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); -} - -TEST_F(TestConnectivity, addAndRemoveConnectivity) -{ - const bool allowDuplicateOrdinals = true; - - EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(nodeRank, node2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - expect_num_per_rank({2, 0, 0, 2, 0, 0}); - expect_connectivity({node1, node2, elem1, elem2}); - expect_ordinals({ordinal1, ordinal2, ordinal1, ordinal2}); - - EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); - expect_num_per_rank({2, 0, 0, 1, 0, 0}); - expect_connectivity({node1, node2, elem2}); - expect_ordinals({ordinal1, ordinal2, ordinal2}); - - stk::mesh::PairIterEntity conn = connectivity.get_connectivity(elemRank); - const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); - const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); - EXPECT_EQ(elem2, elems[0]); - EXPECT_EQ(1u, conn.size()); - EXPECT_EQ(conn.begin(), elems); - EXPECT_EQ(conn.end(), elems+1); - EXPECT_EQ(ordinal2, ords[0]); - - EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); - expect_num_per_rank({2, 0, 0, 0, 0, 0}); - expect_connectivity({node1, node2}); - expect_ordinals({ordinal1, ordinal2}); - conn = connectivity.get_connectivity(elemRank); - EXPECT_EQ(connectivity.begin_connectivity(elemRank), connectivity.end_connectivity(elemRank)); - EXPECT_TRUE(conn.empty()); - EXPECT_EQ(conn.begin(), conn.end()); - EXPECT_EQ(connectivity.begin_ordinals(elemRank), connectivity.end_ordinals(elemRank)); -} - -TEST_F(TestConnectivity, addAndRemoveMultipleRanks) -{ - const bool allowDuplicateOrdinals = true; - - EXPECT_EQ(0, connectivity.add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(faceRank, face1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(0, connectivity.add_connectivity(constraintRank, constraint1, ordinal1, allowDuplicateOrdinals)); - expect_num_per_rank({1, 0, 1, 2, 1, 0}); - - EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); - expect_num_per_rank({1, 0, 1, 1, 1, 0}); - - const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); - const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); - EXPECT_EQ(elem2, elems[0]); - EXPECT_EQ(ordinal2, ords[0]); - - EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); - expect_num_per_rank({1, 0, 1, 0, 1, 0}); - - EXPECT_EQ(connectivity.begin_connectivity(elemRank), connectivity.end_connectivity(elemRank)); - EXPECT_EQ(connectivity.begin_ordinals(elemRank), connectivity.end_ordinals(elemRank)); - EXPECT_NE(connectivity.begin_connectivity(faceRank), connectivity.end_connectivity(faceRank)); - EXPECT_NE(connectivity.begin_ordinals(faceRank), connectivity.end_ordinals(faceRank)); -} - -TEST_F(TestConnectivity, addRemoveAddAddRemoveAdd) -{ - const bool allowDuplicateOrdinals = true; - - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - expect_num_per_rank({0, 0, 0, 1, 0, 0}); - - EXPECT_EQ(0, connectivity.remove_connectivity(elemRank, elem1, ordinal1)); - expect_num_per_rank({0, 0, 0, 0, 0, 0}); - - EXPECT_EQ(0, connectivity.add_connectivity(elemRank, elem1, ordinal1, allowDuplicateOrdinals)); - expect_num_per_rank({0, 0, 0, 1, 0, 0}); - - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - expect_num_per_rank({0, 0, 0, 2, 0, 0}); - - EXPECT_EQ(1, connectivity.remove_connectivity(elemRank, elem2, ordinal2)); - expect_num_per_rank({0, 0, 0, 1, 0, 0}); - - EXPECT_EQ(1, connectivity.add_connectivity(elemRank, elem2, ordinal2, allowDuplicateOrdinals)); - expect_num_per_rank({0, 0, 0, 2, 0, 0}); - - const stk::mesh::Entity* elems = connectivity.begin_connectivity(elemRank); - const stk::mesh::ConnectivityOrdinal* ords = connectivity.begin_ordinals(elemRank); - EXPECT_EQ(elem1, elems[0]); - EXPECT_EQ(elem2, elems[1]); - EXPECT_EQ(ordinal1, ords[0]); - EXPECT_EQ(ordinal2, ords[1]); -} - -TEST_F(TestConnectivity, addAndRemoveMultipleConnectivity) -{ - const bool allowDuplicateOrdinals = true; - - EXPECT_EQ(0, connectivity.add_connectivity(faceRank, face1, ordinal1, allowDuplicateOrdinals)); - EXPECT_EQ(1, connectivity.add_connectivity(faceRank, face2, ordinal2, allowDuplicateOrdinals)); - EXPECT_EQ(2, connectivity.add_connectivity(faceRank, face3, ordinal3, allowDuplicateOrdinals)); - expect_num_per_rank({0, 0, 3, 0, 0, 0}); - - { - const stk::mesh::Entity* faces = connectivity.begin_connectivity(faceRank); - const stk::mesh::ConnectivityOrdinal* ordinals = connectivity.begin_ordinals(faceRank); - - EXPECT_EQ(face1, faces[0]); - EXPECT_EQ(face2, faces[1]); - EXPECT_EQ(face3, faces[2]); - EXPECT_EQ(ordinal1, ordinals[0]); - EXPECT_EQ(ordinal2, ordinals[1]); - EXPECT_EQ(ordinal3, ordinals[2]); - } - - EXPECT_EQ(1, connectivity.remove_connectivity(faceRank, face2, ordinal2)); - expect_num_per_rank({0, 0, 2, 0, 0, 0}); - - int indexOfRemovedEntity = connectivity.remove_connectivity(faceRank, face2, ordinal2); - bool duplicateRemoveCausedNoChange = (indexOfRemovedEntity == -1); - EXPECT_TRUE(duplicateRemoveCausedNoChange); - - expect_num_per_rank({0, 0, 2, 0, 0, 0}); - expect_connectivity({face1, face3}); - expect_ordinals({ordinal1, ordinal3}); - - EXPECT_EQ(1, connectivity.remove_connectivity(faceRank, face3, ordinal3)); - expect_num_per_rank({0, 0, 1, 0, 0, 0}); - expect_connectivity({face1}); - expect_ordinals({ordinal1}); - - EXPECT_EQ(0, connectivity.remove_connectivity(faceRank, face1, ordinal1)); - expect_num_per_rank({0, 0, 0, 0, 0, 0}); - - EXPECT_EQ(connectivity.begin_connectivity(faceRank), connectivity.end_connectivity(faceRank)); - EXPECT_EQ(connectivity.begin_ordinals(faceRank), connectivity.end_ordinals(faceRank)); -} - -TEST_F(TestConnectivity, moveInVector) -{ - const bool allowDuplicateOrdinals = true; - std::vector connectivities(1); - connectivities[0].add_connectivity(nodeRank, node1, ordinal1, allowDuplicateOrdinals); - { - ConnectivityTester& connTester = static_cast(connectivities[0]); - connTester.expect_num_per_rank({1, 0, 0, 0, 0, 0}); - connTester.expect_connectivity({node1}); - connTester.expect_ordinals({ordinal1}); - } - - connectivities.resize(2); - { - ConnectivityTester& connTester = static_cast(connectivities[0]); - connTester.expect_num_per_rank({1, 0, 0, 0, 0, 0}); - connTester.expect_connectivity({node1}); - connTester.expect_ordinals({ordinal1}); - } -} - -class MyClass { -public: - stk::mesh::Entity* entityPtr; - stk::mesh::ConnectivityOrdinal* ordPtr; -}; - -TEST_F(TestConnectivity, simpleStructSize) -{ - EXPECT_EQ(16u, sizeof(MyClass)); - EXPECT_EQ(sizeof(MyClass), sizeof(stk::mesh::Connectivity)); -} - -} - diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp deleted file mode 100644 index 6692f677c238..000000000000 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestSparseConnectivity.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2002 - 2008, 2010, 2011 National Technology Engineering -// Solutions of Sandia, LLC (NTESS). Under the terms of Contract -// DE-NA0003525 with NTESS, the U.S. Government retains certain rights -// in this software. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * 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. -// -// * Neither the name of NTESS nor the names of its contributors -// may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 THE COPYRIGHT -// OWNER 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 - -namespace { - -const stk::mesh::EntityRank nodeRank = stk::topology::NODE_RANK; -const stk::mesh::EntityRank edgeRank = stk::topology::EDGE_RANK; -const stk::mesh::EntityRank faceRank = stk::topology::FACE_RANK; -const stk::mesh::EntityRank elemRank = stk::topology::ELEM_RANK; -const stk::mesh::EntityRank constraintRank = stk::topology::CONSTRAINT_RANK; - -TEST(SparseConnectivity, hasPermutation) -{ - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, elemRank)); - EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(edgeRank, elemRank)); - EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(faceRank, elemRank)); - EXPECT_TRUE (stk::mesh::SparseConnectivity::has_permutation(edgeRank, faceRank)); - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, edgeRank)); - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, faceRank)); - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(nodeRank, constraintRank)); - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(faceRank, constraintRank)); - EXPECT_FALSE(stk::mesh::SparseConnectivity::has_permutation(elemRank, constraintRank)); -} - -TEST(SparseConnectivity, addAndRemoveConnectivity) -{ - stk::mesh::SparseConnectivity sparseConnectivity; - - unsigned nodeEntityOffset = 1; - unsigned elemEntityOffset = 9; - sparseConnectivity.update_size_of_entity_index_space(10); - - stk::mesh::Entity node(nodeEntityOffset); - stk::mesh::Entity elem(elemEntityOffset); - stk::mesh::ConnectivityOrdinal ordinal = 0; - stk::mesh::Permutation perm = stk::mesh::Permutation::INVALID_PERMUTATION; - - EXPECT_TRUE(sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm)); - bool addAlreadyExistingShouldBeFalse = sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm); - EXPECT_FALSE(addAlreadyExistingShouldBeFalse); - - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); - - stk::mesh::Entity elem2(elemEntityOffset+1); - sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1, perm); - - EXPECT_EQ(2u, sparseConnectivity.num_connectivity(node, elemRank)); - - sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, ordinal); - - stk::mesh::PairIterEntity conn = sparseConnectivity.get_connectivity(node, elemRank); - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); - EXPECT_EQ(1u, conn.size()); - - const stk::mesh::Entity* elems = sparseConnectivity.begin_connectivity(node, elemRank); - EXPECT_EQ(elem2, elems[0]); - EXPECT_EQ(elems, conn.begin()); - - sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); - - EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); - conn = sparseConnectivity.get_connectivity(node, elemRank); - EXPECT_TRUE(conn.empty()); -} - -TEST(SparseConnectivity, replaceOrAddAndRemoveConnectivity) -{ - stk::mesh::SparseConnectivity sparseConnectivity; - - unsigned nodeEntityOffset = 1; - unsigned elemEntityOffset = 9; - sparseConnectivity.update_size_of_entity_index_space(10); - - stk::mesh::Entity node(nodeEntityOffset); - stk::mesh::Entity elem(elemEntityOffset); - stk::mesh::Entity elem2(elemEntityOffset+1); - stk::mesh::ConnectivityOrdinal ordinal = 0; - - EXPECT_TRUE(sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal)); - bool replaceAlreadyExistingShouldBeFalse = sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal); - EXPECT_FALSE(replaceAlreadyExistingShouldBeFalse); - - bool replaceWithDifferentElemShouldBeTrue = sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem, ordinal); - EXPECT_TRUE(replaceWithDifferentElemShouldBeTrue); - - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); - - sparseConnectivity.replace_or_add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); - - EXPECT_EQ(2u, sparseConnectivity.num_connectivity(node, elemRank)); - - sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, ordinal); - - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); - - const stk::mesh::Entity* elems = sparseConnectivity.begin_connectivity(node, elemRank); - EXPECT_EQ(elem2, elems[0]); - - sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem2, ordinal+1); - - EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); -} - -TEST(SparseConnectivity, beginEnd) -{ - stk::mesh::SparseConnectivity sparseConnectivity; - - unsigned nodeEntityOffset = 1; - unsigned elemEntityOffset = 9; - sparseConnectivity.update_size_of_entity_index_space(10); - stk::mesh::Entity node(nodeEntityOffset); - stk::mesh::Entity elem(elemEntityOffset); - stk::mesh::ConnectivityOrdinal ordinal = 0; - stk::mesh::Permutation perm = stk::mesh::Permutation::INVALID_PERMUTATION; - - sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, ordinal, perm); - - stk::mesh::Entity elem2(elemEntityOffset+1); - sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem2, ordinal+1, perm); - - const stk::mesh::Entity* beginElems = sparseConnectivity.begin_connectivity(node, elemRank); - const stk::mesh::Entity* endElems = sparseConnectivity.end_connectivity(node, elemRank); - - EXPECT_EQ(2u, std::distance(beginElems, endElems)); - - EXPECT_EQ(elem, beginElems[0]); - EXPECT_EQ(elem2, beginElems[1]); - - const stk::mesh::ConnectivityOrdinal* beginElemOrds = sparseConnectivity.begin_ordinals(node, elemRank); - const stk::mesh::ConnectivityOrdinal* endElemOrds = sparseConnectivity.end_ordinals(node, elemRank); - - EXPECT_EQ(2u, std::distance(beginElemOrds, endElemOrds)); - - EXPECT_EQ(ordinal, beginElemOrds[0]); - EXPECT_EQ(ordinal+1, beginElemOrds[1]); - - EXPECT_EQ(nullptr, sparseConnectivity.begin_permutations(node, elemRank)); - EXPECT_EQ(nullptr, sparseConnectivity.end_permutations(node, elemRank)); -} - -TEST(SparseConnectivity, permutations) -{ - stk::mesh::SparseConnectivity sparseConnectivity; - - unsigned faceEntityOffset = 1; - unsigned elemEntityOffset = 9; - sparseConnectivity.update_size_of_entity_index_space(10); - stk::mesh::Entity face(faceEntityOffset); - stk::mesh::Entity elem(elemEntityOffset); - stk::mesh::ConnectivityOrdinal ordinal = 0; - stk::mesh::Permutation perm = static_cast(1); - stk::mesh::Permutation perm2 = static_cast(-1); - - sparseConnectivity.add_connectivity(faceRank, face, elemRank, elem, ordinal, perm); - - stk::mesh::Entity elem2(elemEntityOffset+1); - sparseConnectivity.add_connectivity(faceRank, face, elemRank, elem2, ordinal+1, perm2); - - const stk::mesh::Permutation* beginElemPerms = sparseConnectivity.begin_permutations(face, elemRank); - const stk::mesh::Permutation* endElemPerms = sparseConnectivity.end_permutations(face, elemRank); - - EXPECT_EQ(2u, std::distance(beginElemPerms, endElemPerms)); - - EXPECT_EQ(perm, beginElemPerms[0]); - EXPECT_EQ(perm2, beginElemPerms[1]); -} - -TEST(SparseConnectivity, addConnMultiple) -{ - stk::mesh::SparseConnectivity sparseConnectivity; - - unsigned nodeEntityOffset = 1; - unsigned node2EntityOffset = 2; - unsigned elemEntityOffset = 3; - unsigned faceEntityOffset = 10; - sparseConnectivity.update_size_of_entity_index_space(4); - - stk::mesh::Entity node(nodeEntityOffset); - stk::mesh::Entity node2(node2EntityOffset); - stk::mesh::Entity face(faceEntityOffset); - stk::mesh::Entity elem(elemEntityOffset); - stk::mesh::ConnectivityOrdinal nodeElemOrd = 5; - stk::mesh::ConnectivityOrdinal node2ElemOrd = 6; - stk::mesh::ConnectivityOrdinal nodeFaceOrd = 2; - stk::mesh::ConnectivityOrdinal elemFaceOrd = 3; - stk::mesh::Permutation invalidPerm = stk::mesh::Permutation::INVALID_PERMUTATION; - stk::mesh::Permutation perm = static_cast(0); - - sparseConnectivity.add_connectivity(nodeRank, node, elemRank, elem, nodeElemOrd, invalidPerm); - const stk::mesh::Connectivity& nodeConn = sparseConnectivity.get_connectivity(node); - (void)nodeConn; - - sparseConnectivity.add_connectivity(nodeRank, node, faceRank, face, nodeFaceOrd, invalidPerm); - sparseConnectivity.add_connectivity(elemRank, elem, faceRank, face, elemFaceOrd, perm); - - sparseConnectivity.update_size_of_entity_index_space(11); - - sparseConnectivity.add_connectivity(nodeRank, node2, elemRank, elem, node2ElemOrd, invalidPerm); - - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, elemRank)); - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node, faceRank)); - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(elem, faceRank)); - EXPECT_EQ(1u, sparseConnectivity.num_connectivity(node2, elemRank)); - - const stk::mesh::Permutation* perms = sparseConnectivity.begin_permutations(elem, faceRank); - const stk::mesh::Permutation* endPerms = sparseConnectivity.end_permutations(elem, faceRank); - EXPECT_TRUE(perms != nullptr); - EXPECT_TRUE(endPerms != nullptr); - EXPECT_EQ(1u, std::distance(perms, endPerms)); - EXPECT_EQ(perm, perms[0]); - - EXPECT_TRUE(sparseConnectivity.remove_connectivity(nodeRank, node, elemRank, elem, nodeElemOrd)); - EXPECT_TRUE(sparseConnectivity.remove_connectivity(nodeRank, node2, elemRank, elem, node2ElemOrd)); - - EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node, elemRank)); - EXPECT_EQ(0u, sparseConnectivity.num_connectivity(node2, elemRank)); -} - -} - diff --git a/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp b/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp index 87bb2ea7f49a..4916f05f327f 100644 --- a/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp +++ b/packages/stk/stk_unit_tests/stk_mesh/UnitTestTextMesh.cpp @@ -1,193 +1,21 @@ -#include "gtest/gtest.h" -#include "mpi.h" -#include -#include -#include // for Field -#include // for MetaData, put_field, etc +#include #include +#include // for Field #include -#include +#include // for MetaData, put_field, etc +#include #include #include -#include +#include +#include +#include -namespace { +#include "gtest/gtest.h" +#include "mpi.h" -class TextMeshFixture : public stk::unit_test_util::MeshFixture +namespace { -protected: - TextMeshFixture(unsigned spatialDim) : stk::unit_test_util::MeshFixture(spatialDim) - { } - - void verify_shared_nodes(const stk::mesh::EntityIdVector& nodeIds, int sharingProc) - { - std::vector counts; - stk::mesh::count_entities(get_meta().globally_shared_part(), get_bulk(), counts); - EXPECT_EQ(nodeIds.size(), counts[stk::topology::NODE_RANK]); - - for (stk::mesh::EntityId nodeId : nodeIds) { - EXPECT_TRUE(get_bulk().in_shared(stk::mesh::EntityKey(stk::topology::NODE_RANK, nodeId), sharingProc)); - } - } - - void verify_num_elements(size_t goldCount) - { - std::vector counts; - stk::mesh::count_entities(get_meta().universal_part(), get_bulk(), counts); - EXPECT_EQ(goldCount, counts[stk::topology::ELEM_RANK]); - } - - void verify_single_element(stk::mesh::EntityId elemId, - stk::topology topology, - const stk::mesh::EntityIdVector& nodeIds) - { - stk::mesh::Entity element = get_bulk().get_entity(stk::topology::ELEM_RANK, elemId); - EXPECT_TRUE(get_bulk().is_valid(element)); - EXPECT_EQ(topology, get_bulk().bucket(element).topology()); - verify_nodes_on_element(element, nodeIds); - } - - struct PartInfo - { - std::string blockName; - std::set ids; - }; - - void verify_part_membership(const std::vector golds) - { - for (const PartInfo& gold : golds) { - stk::mesh::Part* blockPart = get_meta().get_part(gold.blockName); - - verify_part(blockPart); - verify_elements_on_part(blockPart, gold.ids); - } - } - - using PartNameId = std::pair; - - void verify_part_ids(const std::vector& golds) - { - for (const PartNameId& gold : golds) { - stk::mesh::Part* blockPart = get_meta().get_part(gold.first); - - verify_part(blockPart); - EXPECT_EQ(blockPart->id(), gold.second); - } - } - - void verify_coordinates(const stk::mesh::EntityIdVector& goldNodeIds, const std::vector& goldCoordinates) - { - CoordinateVerifier cv(get_bulk(), goldNodeIds, goldCoordinates); - cv.verify(); - } - -private: - void verify_nodes_on_element(stk::mesh::Entity element, const stk::mesh::EntityIdVector& goldNodeIds) - { - stk::mesh::EntityVector nodes(get_bulk().begin_nodes(element), get_bulk().end_nodes(element)); - EXPECT_EQ(goldNodeIds, get_node_ids(nodes)); - } - - stk::mesh::EntityIdVector get_node_ids(const stk::mesh::EntityVector& nodes) - { - stk::mesh::EntityIdVector nodeIds; - for(const stk::mesh::Entity& node : nodes) { - nodeIds.emplace_back(get_bulk().identifier(node)); - } - return nodeIds; - } - - void verify_part(stk::mesh::Part* blockPart) - { - ASSERT_TRUE(blockPart != nullptr); - EXPECT_TRUE(stk::io::is_part_io_part(*blockPart)); - } - - void verify_elements_on_part(stk::mesh::Part* blockPart, const std::set& goldIds) - { - stk::mesh::EntityVector elems; - stk::mesh::get_selected_entities(*blockPart, get_bulk().buckets(stk::topology::ELEM_RANK), elems); - - ASSERT_EQ(goldIds.size(), elems.size()); - for (const stk::mesh::Entity& elem : elems) { - stk::mesh::EntityId elemId = get_bulk().identifier(elem); - EXPECT_EQ(1u, goldIds.count(elemId)); - } - } - - class CoordinateVerifier - { - public: - CoordinateVerifier(const stk::mesh::BulkData& b, - const stk::mesh::EntityIdVector& ids, - const std::vector& coords) - : bulk(b), meta(bulk.mesh_meta_data()), - spatialDim(meta.spatial_dimension()), - goldNodeIds(ids), goldCoordinates(coords) - { } - - void verify() - { - verify_num_nodes(); - - for(size_t nodeIndex=0; nodeIndex(*meta.coordinate_field()); - return stk::mesh::field_data(coordsField, get_node(nodeId)); - } - - const stk::mesh::Entity get_node(const stk::mesh::EntityId& nodeId) - { - return bulk.get_entity(stk::topology::NODE_RANK, nodeId); - } - - void verify_nodal_coordinates(const stk::mesh::EntityId& nodeId, - const double* goldCoords, - const double* nodalCoords) - { - for (unsigned i=0; i& goldCoordinates; - }; -}; - -class TestTextMesh : public TextMeshFixture +class TestTextMesh : public stk::unit_test_util::TextMeshFixture { protected: TestTextMesh() : TextMeshFixture(3) @@ -891,7 +719,7 @@ TEST_F(TestTextMesh, particleHexWithCoordinates) verify_coordinates(stk::mesh::EntityIdVector{1,2,3,4,5,6,7,8,9}, coordinates); } -class TestTextMeshAura : public TextMeshFixture +class TestTextMeshAura : public stk::unit_test_util::TextMeshFixture { protected: TestTextMeshAura() : TextMeshFixture(3) @@ -929,7 +757,7 @@ TEST_F(TestTextMeshAura, twoQuadShellWithCoordinates) if (rank == 1) verify_shared_nodes(stk::mesh::EntityIdVector{2,5}, 0); } -class TestTextMesh2d : public TextMeshFixture +class TestTextMesh2d : public stk::unit_test_util::TextMeshFixture { protected: TestTextMesh2d() : TextMeshFixture(2) @@ -1044,7 +872,7 @@ TEST_F(TestTextMesh2d, twoQuadOneShellParallel) } } -class TestTextMesh1d : public TextMeshFixture +class TestTextMesh1d : public stk::unit_test_util::TextMeshFixture { protected: TestTextMesh1d() : TextMeshFixture(1) @@ -1089,4 +917,4 @@ TEST(GetMeshSpecTest, TestGetMeshSpecWithMultiProc) test_get_mesh_spec(blockCountToDist, numProcs, expectedDist); } -} // namespace +} // namespace diff --git a/packages/stk/stk_util/stk_util/environment/Scheduler.cpp b/packages/stk/stk_util/stk_util/environment/Scheduler.cpp index 0b44907f8891..0b41401a1b75 100644 --- a/packages/stk/stk_util/stk_util/environment/Scheduler.cpp +++ b/packages/stk/stk_util/stk_util/environment/Scheduler.cpp @@ -377,19 +377,22 @@ bool Scheduler::is_it_time(double t, Step step) // it is called again, it will compare time with lastTime_ and if // they match, return true again. - // If called multiple times, return same response... - if (time == lastTime_) - { - return true; - } - // force_write always causes a write even if the time is outside // the bounds set by startTime and terminationTime... + // Needs to happen before the "time == lastime" check to make + // sure force flag is unset if (force_schedule()) { lastTime_ = time; return true; } + // If called multiple times, return same response... + if (time == lastTime_) + { + return true; + } + + // If user specified a start time; that overrides // everything except for the force_write setting. // If user did not specify the start time, then startTime_ = -TIME_MAX diff --git a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp index ff1fe46cbdfb..0a3d948c7fd6 100644 --- a/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp +++ b/packages/stk/stk_util/stk_util/registry/ProductRegistry.cpp @@ -42,7 +42,7 @@ //In Sierra, STK_VERSION_STRING is provided on the compile line by bake. //For Trilinos stk snapshots, the following macro definition gets populated with //the real version string by the trilinos_snapshot.sh script. -#define STK_VERSION_STRING "stk_version_not_set" +#define STK_VERSION_STRING "5.3.1-215-gc8a71448" #endif namespace stk { From 44fdc4594106f2633d7c09d5d3e7736b4929a972 Mon Sep 17 00:00:00 2001 From: K Devine Date: Thu, 28 Oct 2021 09:31:58 -0600 Subject: [PATCH 93/98] tpetra: fixed indexing error in describe() #9870 (#9874) --- packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp b/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp index 8e5df80becf9..4d0910a3fc77 100644 --- a/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp +++ b/packages/tpetra/core/src/Tpetra_CrsGraph_def.hpp @@ -5125,14 +5125,14 @@ namespace Tpetra { if (isGloballyIndexed()) { auto rowview = gblInds_wdv.getHostView(Access::ReadOnly); for (size_t j=0; j < rowinfo.numEntries; ++j){ - GlobalOrdinal colgid = rowview[j] + rowinfo.offset1D; + GlobalOrdinal colgid = rowview[j + rowinfo.offset1D]; out << colgid << " "; } } else if (isLocallyIndexed()) { auto rowview = lclIndsUnpacked_wdv.getHostView(Access::ReadOnly); for (size_t j=0; j < rowinfo.numEntries; ++j) { - LocalOrdinal collid = rowview[j] + rowinfo.offset1D; + LocalOrdinal collid = rowview[j + rowinfo.offset1D]; out << colMap_->getGlobalElement(collid) << " "; } } From 4275f6b0e0994d1c9fdfe39d90654e9bfae11624 Mon Sep 17 00:00:00 2001 From: Nathan Ellingwood Date: Thu, 28 Oct 2021 10:39:30 -0600 Subject: [PATCH 94/98] Snapshot of kokkos.git from commit 8dc4a906d43ae8eacc951cc5d7e95ad2dfa617dc From repository at git@github.com:kokkos/kokkos.git At commit: commit 8dc4a906d43ae8eacc951cc5d7e95ad2dfa617dc Author: Nathan Ellingwood Date: Thu Oct 28 09:53:19 2021 -0600 Update master_history for Kokkos 3.5.0 --- packages/kokkos/.clang-format-ignore | 1 + packages/kokkos/.clang-tidy | 2 +- packages/kokkos/.jenkins | 133 +- packages/kokkos/.travis.yml | 15 +- packages/kokkos/CHANGELOG.md | 160 ++ packages/kokkos/CMakeLists.txt | 4 +- packages/kokkos/Makefile.kokkos | 241 ++- packages/kokkos/Makefile.targets | 11 + packages/kokkos/README.md | 154 +- packages/kokkos/algorithms/CMakeLists.txt | 4 +- .../kokkos/algorithms/src/Kokkos_Random.hpp | 114 +- .../kokkos/algorithms/src/Kokkos_Sort.hpp | 5 +- .../algorithms/unit_tests/TestRandom.hpp | 114 +- packages/kokkos/appveyor.yml | 6 +- packages/kokkos/benchmarks/atomic/main.cpp | 6 +- .../benchmarks/bytes_and_flops/bench.hpp | 2 +- .../benchmarks/bytes_and_flops/main.cpp | 2 +- packages/kokkos/benchmarks/gather/main.cpp | 2 +- .../benchmarks/stream/stream-kokkos.cpp | 77 +- packages/kokkos/bin/hpcbind | 8 +- packages/kokkos/bin/nvcc_wrapper | 16 +- packages/kokkos/cmake/CTestConfig.cmake.in | 91 - packages/kokkos/cmake/KokkosCI.cmake | 350 --- packages/kokkos/cmake/KokkosCTest.cmake.in | 261 --- packages/kokkos/cmake/KokkosCore_config.h.in | 16 +- .../kokkos/cmake/Modules/FindTPLCUDA.cmake | 7 +- .../cmake/Modules/FindTPLLIBQUADMATH.cmake | 1 + packages/kokkos/cmake/deps/quadmath.cmake | 46 + packages/kokkos/cmake/kokkos_arch.cmake | 151 +- .../kokkos/cmake/kokkos_compiler_id.cmake | 14 +- .../kokkos/cmake/kokkos_enable_devices.cmake | 6 +- .../kokkos/cmake/kokkos_enable_options.cmake | 10 + packages/kokkos/cmake/kokkos_functions.cmake | 2 +- .../kokkos/cmake/kokkos_test_cxx_std.cmake | 2 +- packages/kokkos/cmake/kokkos_tpls.cmake | 7 + .../kokkos/cmake/tpls/FindTPLquadmath.cmake | 46 + .../performance_tests/TestDynRankView.hpp | 2 +- .../performance_tests/TestGlobal2LocalIds.hpp | 2 +- .../performance_tests/TestScatterView.hpp | 2 +- .../TestUnorderedMapPerformance.hpp | 2 +- .../kokkos/containers/src/Kokkos_Bitset.hpp | 34 +- .../kokkos/containers/src/Kokkos_DualView.hpp | 91 +- .../containers/src/Kokkos_DynRankView.hpp | 75 +- .../containers/src/Kokkos_DynamicView.hpp | 393 ++-- .../containers/src/Kokkos_ErrorReporter.hpp | 3 +- .../containers/src/Kokkos_OffsetView.hpp | 9 +- .../containers/src/Kokkos_ScatterView.hpp | 6 +- .../containers/src/Kokkos_StaticCrsGraph.hpp | 4 +- .../containers/src/Kokkos_UnorderedMap.hpp | 21 +- .../kokkos/containers/src/Kokkos_Vector.hpp | 6 +- .../src/impl/Kokkos_Bitset_impl.hpp | 12 - .../src/impl/Kokkos_Functional_impl.hpp | 2 +- .../containers/unit_tests/TestDualView.hpp | 2 +- .../containers/unit_tests/TestDynViewAPI.hpp | 105 +- .../containers/unit_tests/TestDynamicView.hpp | 2 +- .../containers/unit_tests/TestOffsetView.hpp | 2 +- .../containers/unit_tests/TestScatterView.hpp | 40 + .../unit_tests/TestStaticCrsGraph.hpp | 6 - .../unit_tests/TestUnorderedMap.hpp | 21 +- .../kokkos/core/cmake/KokkosCore_config.h.in | 104 - packages/kokkos/core/perf_test/CMakeLists.txt | 4 +- .../core/perf_test/PerfTestGramSchmidt.cpp | 2 +- .../kokkos/core/perf_test/PerfTestHexGrad.cpp | 2 +- .../PerfTest_ExecSpacePartitioning.cpp | 18 +- .../core/perf_test/PerfTest_ViewAllocate.cpp | 3 +- .../core/perf_test/PerfTest_ViewResize_8.cpp | 8 + .../kokkos/core/perf_test/test_atomic.cpp | 4 +- .../perf_test/test_atomic_minmax_simple.cpp | 4 +- .../kokkos/core/perf_test/test_mempool.cpp | 12 +- .../kokkos/core/perf_test/test_taskdag.cpp | 4 +- packages/kokkos/core/src/CMakeLists.txt | 23 + .../kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp | 99 +- .../Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp | 7 +- .../core/src/Cuda/Kokkos_Cuda_Error.hpp | 27 +- .../core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp | 33 +- .../kokkos/core/src/Cuda/Kokkos_Cuda_Half.hpp | 211 +- .../core/src/Cuda/Kokkos_Cuda_Instance.cpp | 243 ++- .../core/src/Cuda/Kokkos_Cuda_Instance.hpp | 73 +- .../src/Cuda/Kokkos_Cuda_KernelLaunch.hpp | 35 +- .../core/src/Cuda/Kokkos_Cuda_Locks.cpp | 24 +- .../core/src/Cuda/Kokkos_Cuda_Locks.hpp | 22 +- .../core/src/Cuda/Kokkos_Cuda_Parallel.hpp | 207 +- .../core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp | 176 +- .../kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp | 107 +- .../kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp | 223 +- .../src/Cuda/Kokkos_Cuda_Vectorization.hpp | 17 +- .../Kokkos_Cuda_Version_9_8_Compatibility.hpp | 49 - .../HIP/Kokkos_HIP_BlockSize_Deduction.hpp | 324 ++- .../kokkos/core/src/HIP/Kokkos_HIP_Error.hpp | 20 +- .../core/src/HIP/Kokkos_HIP_Instance.cpp | 87 +- .../core/src/HIP/Kokkos_HIP_Instance.hpp | 66 +- .../core/src/HIP/Kokkos_HIP_KernelLaunch.hpp | 350 ++- .../kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp | 18 +- .../kokkos/core/src/HIP/Kokkos_HIP_Locks.hpp | 21 +- .../core/src/HIP/Kokkos_HIP_MDRangePolicy.hpp | 3 +- .../src/HIP/Kokkos_HIP_Parallel_MDRange.hpp | 125 +- .../src/HIP/Kokkos_HIP_Parallel_Range.hpp | 162 +- .../core/src/HIP/Kokkos_HIP_Parallel_Team.hpp | 230 +- .../kokkos/core/src/HIP/Kokkos_HIP_Space.cpp | 134 +- .../kokkos/core/src/HIP/Kokkos_HIP_Team.hpp | 192 -- packages/kokkos/core/src/HPX/Kokkos_HPX.cpp | 3 + .../kokkos/core/src/HPX/Kokkos_HPX_Task.hpp | 6 +- .../src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp | 4 +- .../kokkos/core/src/KokkosExp_InterOp.hpp | 147 ++ .../core/src/KokkosExp_MDRangePolicy.hpp | 28 +- packages/kokkos/core/src/Kokkos_Atomic.hpp | 92 + .../Kokkos_Atomics_Desul_Volatile_Wrapper.hpp | 189 ++ .../core/src/Kokkos_Atomics_Desul_Wrapper.hpp | 271 +++ packages/kokkos/core/src/Kokkos_Complex.hpp | 80 +- packages/kokkos/core/src/Kokkos_Concepts.hpp | 91 +- packages/kokkos/core/src/Kokkos_CopyViews.hpp | 464 ++-- packages/kokkos/core/src/Kokkos_Core.hpp | 42 + packages/kokkos/core/src/Kokkos_Core_fwd.hpp | 11 +- packages/kokkos/core/src/Kokkos_Crs.hpp | 8 +- packages/kokkos/core/src/Kokkos_Cuda.hpp | 27 +- packages/kokkos/core/src/Kokkos_CudaSpace.hpp | 365 +--- .../kokkos/core/src/Kokkos_DetectionIdiom.hpp | 116 + .../kokkos/core/src/Kokkos_ExecPolicy.hpp | 1 - packages/kokkos/core/src/Kokkos_HBWSpace.hpp | 13 +- packages/kokkos/core/src/Kokkos_HIP.hpp | 1 - packages/kokkos/core/src/Kokkos_HIP_Space.hpp | 243 +-- packages/kokkos/core/src/Kokkos_HPX.hpp | 49 +- packages/kokkos/core/src/Kokkos_HostSpace.hpp | 22 +- packages/kokkos/core/src/Kokkos_Layout.hpp | 55 +- packages/kokkos/core/src/Kokkos_Macros.hpp | 63 +- .../kokkos/core/src/Kokkos_MasterLock.hpp | 4 + .../core/src/Kokkos_MathematicalFunctions.hpp | 308 ++- .../Kokkos_MathematicalSpecialFunctions.hpp | 1280 +++++++++++ .../kokkos/core/src/Kokkos_MemoryPool.hpp | 37 +- .../kokkos/core/src/Kokkos_MemoryTraits.hpp | 10 +- .../kokkos/core/src/Kokkos_NumericTraits.hpp | 62 +- packages/kokkos/core/src/Kokkos_OpenMP.hpp | 8 +- .../kokkos/core/src/Kokkos_OpenMPTarget.hpp | 9 +- .../core/src/Kokkos_OpenMPTargetSpace.hpp | 48 +- packages/kokkos/core/src/Kokkos_Parallel.hpp | 114 +- .../core/src/Kokkos_Parallel_Reduce.hpp | 71 +- .../Kokkos_Rank.hpp} | 29 +- packages/kokkos/core/src/Kokkos_SYCL.hpp | 42 +- .../kokkos/core/src/Kokkos_SYCL_Space.hpp | 151 +- .../kokkos/core/src/Kokkos_ScratchSpace.hpp | 8 +- packages/kokkos/core/src/Kokkos_Serial.hpp | 188 +- .../kokkos/core/src/Kokkos_TaskPolicy.hpp | 4 + .../kokkos/core/src/Kokkos_TaskScheduler.hpp | 11 +- packages/kokkos/core/src/Kokkos_Threads.hpp | 7 +- packages/kokkos/core/src/Kokkos_Tuners.hpp | 114 +- packages/kokkos/core/src/Kokkos_View.hpp | 21 +- .../core/src/Kokkos_WorkGraphPolicy.hpp | 12 +- .../core/src/OpenMP/Kokkos_OpenMP_Exec.cpp | 11 +- .../core/src/OpenMP/Kokkos_OpenMP_Exec.hpp | 13 +- .../core/src/OpenMP/Kokkos_OpenMP_Task.hpp | 5 - .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp | 5 +- .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp | 230 +- .../Kokkos_OpenMPTarget_Instance.cpp | 66 +- .../Kokkos_OpenMPTarget_Instance.hpp | 12 +- .../Kokkos_OpenMPTarget_Parallel.hpp | 919 +++++--- .../Kokkos_OpenMPTarget_Parallel_MDRange.hpp | 784 ++++--- .../OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp | 35 - packages/kokkos/core/src/SYCL/Kokkos_SYCL.cpp | 39 +- .../core/src/SYCL/Kokkos_SYCL_DeepCopy.hpp | 255 +-- .../core/src/SYCL/Kokkos_SYCL_Instance.cpp | 96 +- .../core/src/SYCL/Kokkos_SYCL_Instance.hpp | 209 +- .../src/SYCL/Kokkos_SYCL_Parallel_Range.hpp | 86 +- .../src/SYCL/Kokkos_SYCL_Parallel_Reduce.hpp | 304 ++- .../src/SYCL/Kokkos_SYCL_Parallel_Scan.hpp | 184 +- .../src/SYCL/Kokkos_SYCL_Parallel_Team.hpp | 238 ++- .../core/src/SYCL/Kokkos_SYCL_Space.cpp | 134 +- .../kokkos/core/src/SYCL/Kokkos_SYCL_Team.hpp | 211 +- .../core/src/SYCL/Kokkos_SYCL_UniqueToken.hpp | 2 +- .../core/src/Threads/Kokkos_ThreadsExec.cpp | 57 +- .../core/src/Threads/Kokkos_ThreadsExec.hpp | 14 +- .../src/Threads/Kokkos_ThreadsExec_base.cpp | 4 +- packages/kokkos/core/src/desul/.clang-format | 2 + packages/kokkos/core/src/desul/atomics.hpp | 19 + .../core/src/desul/atomics/Atomic_Ref.hpp | 541 +++++ .../kokkos/core/src/desul/atomics/CUDA.hpp | 453 ++++ .../kokkos/core/src/desul/atomics/Common.hpp | 199 ++ .../src/desul/atomics/Compare_Exchange.hpp | 35 + .../desul/atomics/Compare_Exchange_CUDA.hpp | 267 +++ .../desul/atomics/Compare_Exchange_GCC.hpp | 91 + .../desul/atomics/Compare_Exchange_HIP.hpp | 253 +++ .../desul/atomics/Compare_Exchange_MSVC.hpp | 201 ++ .../desul/atomics/Compare_Exchange_OpenMP.hpp | 145 ++ .../desul/atomics/Compare_Exchange_SYCL.hpp | 102 + .../desul/atomics/Compare_Exchange_Serial.hpp | 45 + .../kokkos/core/src/desul/atomics/GCC.hpp | 131 ++ .../kokkos/core/src/desul/atomics/Generic.hpp | 690 ++++++ .../kokkos/core/src/desul/atomics/HIP.hpp | 338 +++ .../core/src/desul/atomics/Lock_Array.hpp | 75 + .../src/desul/atomics/Lock_Array_Cuda.hpp | 172 ++ .../core/src/desul/atomics/Lock_Array_HIP.hpp | 170 ++ .../kokkos/core/src/desul/atomics/Macros.hpp | 62 + .../kokkos/core/src/desul/atomics/OpenMP.hpp | 15 + .../kokkos/core/src/desul/atomics/SYCL.hpp | 143 ++ .../src/desul/atomics/SYCLConversions.hpp | 58 + .../core/src/desul/atomics/cuda/CUDA_asm.hpp | 18 + .../desul/atomics/cuda/CUDA_asm_exchange.hpp | 8 + .../src/desul/atomics/cuda/cuda_cc7_asm.inc | 20 + .../cuda/cuda_cc7_asm_atomic_fetch_op.inc | 18 + ...da_cc7_asm_atomic_fetch_op.inc_forceglobal | 143 ++ .../cuda_cc7_asm_atomic_fetch_op.inc_generic | 142 ++ .../cuda_cc7_asm_atomic_fetch_op.inc_isglobal | 190 ++ ...cuda_cc7_asm_atomic_fetch_op.inc_predicate | 226 ++ .../atomics/cuda/cuda_cc7_asm_atomic_op.inc | 18 + .../cuda_cc7_asm_atomic_op.inc_forceglobal | 64 + .../cuda/cuda_cc7_asm_atomic_op.inc_generic | 64 + .../cuda/cuda_cc7_asm_atomic_op.inc_isglobal | 88 + .../cuda/cuda_cc7_asm_atomic_op.inc_predicate | 106 + .../atomics/cuda/cuda_cc7_asm_exchange.inc | 20 + .../cuda/cuda_cc7_asm_exchange_memorder.inc | 27 + .../atomics/cuda/cuda_cc7_asm_exchange_op.inc | 40 + .../atomics/cuda/cuda_cc7_asm_memorder.inc | 29 + .../src/desul/atomics/openmp/OpenMP_40.hpp | 97 + .../src/desul/atomics/openmp/OpenMP_40_op.inc | 101 + .../core/src/desul/src/Lock_Array_CUDA.cpp | 98 + .../core/src/desul/src/Lock_Array_HIP.cpp | 101 + .../kokkos/core/src/fwd/Kokkos_Fwd_SYCL.hpp | 2 + .../src/impl/KokkosExp_Host_IterateTile.hpp | 38 +- .../core/src/impl/Kokkos_AnalyzePolicy.hpp | 106 +- .../Kokkos_Atomic_Compare_Exchange_Strong.hpp | 20 +- .../Kokkos_Atomic_Compare_Exchange_Weak.hpp | 4 - .../core/src/impl/Kokkos_Atomic_Exchange.hpp | 20 +- .../core/src/impl/Kokkos_Atomic_Fetch_Add.hpp | 20 +- .../core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp | 20 +- .../core/src/impl/Kokkos_Atomic_Generic.hpp | 32 +- .../core/src/impl/Kokkos_Atomic_View.hpp | 5 +- .../kokkos/core/src/impl/Kokkos_ClockTic.hpp | 4 +- .../core/src/impl/Kokkos_Combined_Reducer.hpp | 58 +- .../core/src/impl/Kokkos_ConcurrentBitset.hpp | 18 +- packages/kokkos/core/src/impl/Kokkos_Core.cpp | 17 +- packages/kokkos/core/src/impl/Kokkos_EBO.hpp | 51 +- .../kokkos/core/src/impl/Kokkos_Error.cpp | 3 + .../kokkos/core/src/impl/Kokkos_Error.hpp | 57 +- .../src/impl/Kokkos_ExecSpaceInitializer.hpp | 1 + .../core/src/impl/Kokkos_FunctorAdapter.hpp | 135 +- .../core/src/impl/Kokkos_FunctorAnalysis.hpp | 7 +- .../core/src/impl/Kokkos_HostSharedPtr.hpp | 8 + .../core/src/impl/Kokkos_HostThreadTeam.cpp | 20 +- .../core/src/impl/Kokkos_HostThreadTeam.hpp | 53 +- .../core/src/impl/Kokkos_LinkedListNode.hpp | 4 +- .../core/src/impl/Kokkos_Memory_Fence.hpp | 3 +- .../src/impl/Kokkos_MultipleTaskQueue.hpp | 5 +- .../kokkos/core/src/impl/Kokkos_Profiling.cpp | 65 +- .../kokkos/core/src/impl/Kokkos_Profiling.hpp | 68 + .../src/impl/Kokkos_Profiling_C_Interface.h | 2 +- .../src/impl/Kokkos_Profiling_Interface.hpp | 46 +- .../src/impl/Kokkos_QuadPrecisionMath.hpp | 187 ++ .../kokkos/core/src/impl/Kokkos_Serial.cpp | 129 +- .../core/src/impl/Kokkos_Serial_Task.hpp | 50 +- .../core/src/impl/Kokkos_SharedAlloc.cpp | 3 + .../src/impl/Kokkos_SimpleTaskScheduler.hpp | 1 - .../core/src/impl/Kokkos_SingleTaskQueue.hpp | 3 +- packages/kokkos/core/src/impl/Kokkos_Tags.hpp | 95 - .../kokkos/core/src/impl/Kokkos_TaskBase.hpp | 9 +- .../kokkos/core/src/impl/Kokkos_TaskNode.hpp | 7 +- .../kokkos/core/src/impl/Kokkos_TaskQueue.hpp | 31 +- .../core/src/impl/Kokkos_TaskQueueCommon.hpp | 15 +- .../impl/Kokkos_TaskQueueMemoryManager.hpp | 12 +- .../src/impl/Kokkos_TaskQueueMultiple.hpp | 14 +- .../core/src/impl/Kokkos_TaskQueue_impl.hpp | 39 +- .../core/src/impl/Kokkos_TaskTeamMember.hpp | 1 - .../kokkos/core/src/impl/Kokkos_Timer.hpp | 10 +- .../kokkos/core/src/impl/Kokkos_Utilities.hpp | 113 +- .../core/src/impl/Kokkos_VLAEmulation.hpp | 10 +- .../kokkos/core/src/impl/Kokkos_ViewCtor.hpp | 14 +- .../core/src/impl/Kokkos_ViewMapping.hpp | 191 +- .../core/src/setup/Kokkos_Setup_SYCL.hpp | 8 +- .../src/traits/Kokkos_ExecutionSpaceTrait.hpp | 43 +- .../src/traits/Kokkos_GraphKernelTrait.hpp | 19 +- .../core/src/traits/Kokkos_IndexTypeTrait.hpp | 69 +- .../traits/Kokkos_IterationPatternTrait.hpp | 45 +- .../src/traits/Kokkos_LaunchBoundsTrait.hpp | 32 +- .../traits/Kokkos_OccupancyControlTrait.hpp | 42 +- .../src/traits/Kokkos_PolicyTraitAdaptor.hpp | 2 +- .../src/traits/Kokkos_PolicyTraitMatcher.hpp | 77 + .../core/src/traits/Kokkos_ScheduleTrait.hpp | 39 +- .../core/src/traits/Kokkos_Traits_fwd.hpp | 40 + .../traits/Kokkos_WorkItemPropertyTrait.hpp | 26 +- .../core/src/traits/Kokkos_WorkTagTrait.hpp | 104 +- packages/kokkos/core/unit_test/CMakeLists.txt | 160 +- packages/kokkos/core/unit_test/Makefile | 22 + .../core/unit_test/TestAtomicOperations.hpp | 62 +- .../unit_test/TestAtomicOperations_double.hpp | 2 + .../unit_test/TestAtomicOperations_float.hpp | 2 + .../unit_test/TestAtomicOperations_int.hpp | 2 + .../TestAtomicOperations_longint.hpp | 2 + .../TestAtomicOperations_longlongint.hpp | 2 + .../TestAtomicOperations_unsignedint.hpp | 2 + .../TestAtomicOperations_unsignedlongint.hpp | 2 + .../kokkos/core/unit_test/TestAtomicViews.hpp | 16 +- .../kokkos/core/unit_test/TestAtomics.hpp | 5 +- .../kokkos/core/unit_test/TestComplex.hpp | 40 + .../core/unit_test/TestDeepCopyAlignment.hpp | 6 +- .../unit_test/TestDefaultDeviceTypeInit.hpp | 2 +- .../core/unit_test/TestDetectionIdiom.cpp | 96 + .../unit_test/TestExecSpacePartitioning.hpp | 129 ++ ...d_ViewAPI_c.cpp => TestExecutionSpace.hpp} | 38 +- .../core/unit_test/TestHalfConversion.hpp | 4 +- .../core/unit_test/TestHalfOperators.hpp | 115 +- .../TestHostSharedPtrAccessOnDevice.hpp | 145 +- .../kokkos/core/unit_test/TestInterOp.cpp | 162 ++ .../kokkos/core/unit_test/TestMDRange.hpp | 159 ++ .../unit_test/TestMathematicalFunctions.hpp | 75 +- .../TestMathematicalSpecialFunctions.hpp | 1895 +++++++++++++++++ .../kokkos/core/unit_test/TestMemoryPool.hpp | 2 +- .../unit_test/TestNonTrivialScalarTypes.hpp | 58 +- .../core/unit_test/TestNumericTraits.hpp | 182 ++ .../core/unit_test/TestPolicyConstruction.hpp | 36 +- .../core/unit_test/TestQuadPrecisionMath.hpp | 109 + packages/kokkos/core/unit_test/TestRange.hpp | 8 +- .../core/unit_test/TestRangePolicyRequire.hpp | 8 +- packages/kokkos/core/unit_test/TestReduce.hpp | 8 + .../unit_test/TestReduceCombinatorical.hpp | 8 +- .../kokkos/core/unit_test/TestReducers.hpp | 3 +- .../kokkos/core/unit_test/TestReducers_d.hpp | 45 + .../kokkos/core/unit_test/TestReductions.hpp | 2 - .../unit_test/TestReductions_DeviceView.hpp | 17 +- .../kokkos/core/unit_test/TestStackTrace.hpp | 10 +- packages/kokkos/core/unit_test/TestTeam.hpp | 18 +- .../kokkos/core/unit_test/TestTeamBasic.hpp | 69 + .../core/unit_test/TestTeamReductionScan.hpp | 10 +- .../kokkos/core/unit_test/TestTeamScratch.hpp | 26 +- .../core/unit_test/TestTeamTeamSize.hpp | 13 +- .../kokkos/core/unit_test/TestTeamVector.hpp | 54 +- .../core/unit_test/TestTeamVectorRange.hpp | 9 +- .../unit_test/TestTemplateMetaFunctions.hpp | 94 +- .../kokkos/core/unit_test/TestTypeList.cpp | 73 + .../kokkos/core/unit_test/TestViewAPI.hpp | 94 +- .../kokkos/core/unit_test/TestViewAPI_e.hpp | 15 +- .../kokkos/core/unit_test/TestViewCopy_a.hpp | 6 +- .../core/unit_test/TestViewMapping_a.hpp | 8 +- .../unit_test/TestViewMapping_subview.hpp | 4 +- .../kokkos/core/unit_test/TestViewSubview.hpp | 244 ++- .../kokkos/core/unit_test/TestView_64bit.hpp | 13 +- .../TestSYCLHostUSM_Category.hpp} | 11 +- ...ory.hpp => TestSYCLSharedUSM_Category.hpp} | 0 .../cuda/TestCudaHostPinned_ViewAPI_d.cpp | 46 - .../cuda/TestCudaHostPinned_ViewAPI_e.cpp | 46 - .../cuda/TestCudaHostPinned_ViewCopy_a.cpp | 46 - .../cuda/TestCudaHostPinned_ViewCopy_b.cpp | 46 - .../cuda/TestCudaHostPinned_ViewMapping_a.cpp | 46 - .../cuda/TestCudaHostPinned_ViewMapping_b.cpp | 46 - ...TestCudaHostPinned_ViewMapping_subview.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewAPI_a.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewAPI_b.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewAPI_c.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewAPI_d.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewAPI_e.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewCopy_a.cpp | 46 - .../unit_test/cuda/TestCudaUVM_ViewCopy_b.cpp | 46 - .../cuda/TestCudaUVM_ViewMapping_a.cpp | 46 - .../cuda/TestCudaUVM_ViewMapping_b.cpp | 46 - .../cuda/TestCudaUVM_ViewMapping_subview.cpp | 46 - .../unit_test/cuda/TestCuda_InterOp_Init.cpp | 8 +- .../cuda/TestCuda_InterOp_Streams.cpp | 4 +- .../core/unit_test/cuda/TestCuda_Spaces.cpp | 54 +- .../default/TestDefaultDeviceType.cpp | 16 +- .../default/TestDefaultDeviceType_d.cpp | 9 +- .../hip/TestHIPHostPinned_ViewAPI_a.cpp | 46 - .../hip/TestHIPHostPinned_ViewAPI_b.cpp | 46 - .../hip/TestHIPHostPinned_ViewAPI_c.cpp | 46 - .../hip/TestHIPHostPinned_ViewAPI_d.cpp | 46 - .../hip/TestHIPHostPinned_ViewAPI_e.cpp | 46 - .../hip/TestHIPHostPinned_ViewCopy_a.cpp | 46 - .../hip/TestHIPHostPinned_ViewCopy_b.cpp | 46 - .../hip/TestHIPHostPinned_ViewMapping_a.cpp | 46 - .../hip/TestHIPHostPinned_ViewMapping_b.cpp | 46 - .../TestHIPHostPinned_ViewMapping_subview.cpp | 46 - .../unit_test/hip/TestHIP_AsyncLauncher.cpp | 8 +- .../hip/TestHIP_BlocksizeDeduction.cpp | 99 + .../unit_test/hip/TestHIP_InterOp_Init.cpp | 11 +- .../unit_test/hip/TestHIP_InterOp_Streams.cpp | 13 +- .../core/unit_test/hip/TestHIP_Spaces.cpp | 27 +- .../hip/TestHIP_TeamScratchStreams.cpp | 4 +- .../incremental/Test01_execspace.hpp | 4 +- .../incremental/Test02_atomic_host.hpp | 2 +- .../Test06_ParallelFor_MDRangePolicy.hpp | 12 +- .../incremental/Test08_deep_copy.hpp | 18 +- .../incremental/Test12a_ThreadScratch.hpp | 8 +- .../incremental/Test12b_TeamScratch.hpp | 11 +- .../incremental/Test14_MDRangeReduce.hpp | 14 +- .../unit_test/sycl/TestSYCL_InterOp_Init.cpp | 11 +- .../core/unit_test/sycl/TestSYCL_Spaces.cpp | 356 ++++ .../TestSYCL_Task.cpp} | 5 +- .../sycl/TestSYCL_TeamScratchStreams.cpp | 154 ++ .../unit_test/tools/TestBuiltinTuners.cpp | 123 ++ .../unit_test/tools/TestCategoricalTuner.cpp | 86 + .../TestEventCorrectness.cpp} | 7 +- .../unit_test/tools/TestEventCorrectness.hpp | 284 +++ .../example/query_device/query_device.cpp | 15 +- .../simple_mdrangepolicy.cpp | 12 +- .../01_data_layouts/data_layouts.cpp | 2 +- .../02_memory_traits/memory_traits.cpp | 2 +- .../Advanced_Views/03_subviews/subviews.cpp | 2 +- .../Advanced_Views/04_dualviews/dual_view.cpp | 2 +- .../05_NVIDIA_UVM/uvm_example.cpp | 2 +- .../overlapping_deepcopy.cpp | 2 +- .../01_random_numbers/random_numbers.cpp | 16 +- .../04_team_scan/team_scan.cpp | 2 +- packages/kokkos/generate_makefile.bash | 5 +- packages/kokkos/master_history.txt | 1 + .../kokkos/scripts/docker/Dockerfile.clang | 14 +- packages/kokkos/scripts/docker/Dockerfile.gcc | 12 +- .../kokkos/scripts/docker/Dockerfile.hipcc | 15 +- .../docker/Dockerfile.kokkosllvmproject | 12 +- .../kokkos/scripts/docker/Dockerfile.nvcc | 13 +- .../scripts/docker/Dockerfile.openmptarget | 12 +- .../kokkos/scripts/docker/Dockerfile.sycl | 16 +- .../scripts/testing_scripts/test_all_sandia | 34 +- .../scripts/testing_scripts/update_lib.sh | 2 +- 409 files changed, 22061 insertions(+), 8565 deletions(-) delete mode 100644 packages/kokkos/cmake/CTestConfig.cmake.in delete mode 100644 packages/kokkos/cmake/KokkosCI.cmake delete mode 100644 packages/kokkos/cmake/KokkosCTest.cmake.in create mode 100644 packages/kokkos/cmake/Modules/FindTPLLIBQUADMATH.cmake create mode 100644 packages/kokkos/cmake/deps/quadmath.cmake create mode 100644 packages/kokkos/cmake/tpls/FindTPLquadmath.cmake delete mode 100644 packages/kokkos/core/cmake/KokkosCore_config.h.in delete mode 100644 packages/kokkos/core/src/Cuda/Kokkos_Cuda_Version_9_8_Compatibility.hpp create mode 100644 packages/kokkos/core/src/KokkosExp_InterOp.hpp create mode 100644 packages/kokkos/core/src/Kokkos_Atomics_Desul_Volatile_Wrapper.hpp create mode 100644 packages/kokkos/core/src/Kokkos_Atomics_Desul_Wrapper.hpp create mode 100644 packages/kokkos/core/src/Kokkos_DetectionIdiom.hpp create mode 100644 packages/kokkos/core/src/Kokkos_MathematicalSpecialFunctions.hpp rename packages/kokkos/core/{unit_test/cuda/TestCudaHostPinned_ViewAPI_b.cpp => src/Kokkos_Rank.hpp} (71%) create mode 100644 packages/kokkos/core/src/desul/.clang-format create mode 100644 packages/kokkos/core/src/desul/atomics.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Atomic_Ref.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/CUDA.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Common.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_CUDA.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_GCC.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_HIP.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_MSVC.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_OpenMP.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_SYCL.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Compare_Exchange_Serial.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/GCC.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Generic.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/HIP.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Lock_Array.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Lock_Array_Cuda.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Lock_Array_HIP.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/Macros.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/OpenMP.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/SYCL.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/SYCLConversions.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/CUDA_asm.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/CUDA_asm_exchange.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_forceglobal create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_generic create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_isglobal create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_fetch_op.inc_predicate create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_forceglobal create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_generic create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_isglobal create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_atomic_op.inc_predicate create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange_memorder.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_exchange_op.inc create mode 100644 packages/kokkos/core/src/desul/atomics/cuda/cuda_cc7_asm_memorder.inc create mode 100644 packages/kokkos/core/src/desul/atomics/openmp/OpenMP_40.hpp create mode 100644 packages/kokkos/core/src/desul/atomics/openmp/OpenMP_40_op.inc create mode 100644 packages/kokkos/core/src/desul/src/Lock_Array_CUDA.cpp create mode 100644 packages/kokkos/core/src/desul/src/Lock_Array_HIP.cpp create mode 100644 packages/kokkos/core/src/impl/Kokkos_QuadPrecisionMath.hpp delete mode 100644 packages/kokkos/core/src/impl/Kokkos_Tags.hpp create mode 100644 packages/kokkos/core/src/traits/Kokkos_PolicyTraitMatcher.hpp create mode 100644 packages/kokkos/core/unit_test/TestDetectionIdiom.cpp create mode 100644 packages/kokkos/core/unit_test/TestExecSpacePartitioning.hpp rename packages/kokkos/core/unit_test/{cuda/TestCudaHostPinned_ViewAPI_c.cpp => TestExecutionSpace.hpp} (68%) create mode 100644 packages/kokkos/core/unit_test/TestInterOp.cpp create mode 100644 packages/kokkos/core/unit_test/TestMathematicalSpecialFunctions.hpp create mode 100644 packages/kokkos/core/unit_test/TestQuadPrecisionMath.hpp create mode 100644 packages/kokkos/core/unit_test/TestTypeList.cpp rename packages/kokkos/core/unit_test/{cuda/TestCudaHostPinned_ViewAPI_a.cpp => category_files/TestSYCLHostUSM_Category.hpp} (89%) rename packages/kokkos/core/unit_test/category_files/{TestSYCLSharedUSMSpace_Category.hpp => TestSYCLSharedUSM_Category.hpp} (100%) delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewAPI_d.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewAPI_e.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewCopy_a.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewCopy_b.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_a.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_b.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_subview.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI_a.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI_b.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI_c.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI_d.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI_e.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewCopy_a.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewCopy_b.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_a.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_b.cpp delete mode 100644 packages/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_subview.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewAPI_a.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewAPI_b.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewAPI_c.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewAPI_d.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewAPI_e.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewCopy_a.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewCopy_b.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewMapping_a.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewMapping_b.cpp delete mode 100644 packages/kokkos/core/unit_test/hip/TestHIPHostPinned_ViewMapping_subview.cpp create mode 100644 packages/kokkos/core/unit_test/hip/TestHIP_BlocksizeDeduction.cpp create mode 100644 packages/kokkos/core/unit_test/sycl/TestSYCL_Spaces.cpp rename packages/kokkos/core/unit_test/{cuda/TestCudaUVM_SharedAlloc.cpp => sycl/TestSYCL_Task.cpp} (96%) create mode 100644 packages/kokkos/core/unit_test/sycl/TestSYCL_TeamScratchStreams.cpp create mode 100644 packages/kokkos/core/unit_test/tools/TestBuiltinTuners.cpp create mode 100644 packages/kokkos/core/unit_test/tools/TestCategoricalTuner.cpp rename packages/kokkos/core/unit_test/{cuda/TestCudaHostPinned_SharedAlloc.cpp => tools/TestEventCorrectness.cpp} (94%) create mode 100644 packages/kokkos/core/unit_test/tools/TestEventCorrectness.hpp diff --git a/packages/kokkos/.clang-format-ignore b/packages/kokkos/.clang-format-ignore index b163a2bfeaf4..43d242c3106a 100644 --- a/packages/kokkos/.clang-format-ignore +++ b/packages/kokkos/.clang-format-ignore @@ -1,2 +1,3 @@ core/unit_test/config/results/* tpls/gtest/gtest/* +core/src/desul/* diff --git a/packages/kokkos/.clang-tidy b/packages/kokkos/.clang-tidy index 207a105c5bdf..2b0d6e51d438 100644 --- a/packages/kokkos/.clang-tidy +++ b/packages/kokkos/.clang-tidy @@ -1,3 +1,3 @@ -Checks: '-*,kokkos-*,modernize-use-using,modernize-use-nullptr' +Checks: '-*,kokkos-*,modernize-use-using,modernize-use-nullptr,cppcoreguidelines-pro-type-cstyle-cast' FormatStyle: file HeaderFilterRegex: '.*/*.hpp' diff --git a/packages/kokkos/.jenkins b/packages/kokkos/.jenkins index 001171d648e7..09e8515e96f2 100644 --- a/packages/kokkos/.jenkins +++ b/packages/kokkos/.jenkins @@ -5,9 +5,12 @@ pipeline { CCACHE_DIR = '/tmp/ccache' CCACHE_MAXSIZE = '10G' CCACHE_CPP2 = 'true' - BUILD_JOBS = 8 - SITE = 'Jenkins' } + + options { + timeout(time: 6, unit: 'HOURS') + } + stages { stage('Clang-Format') { agent { @@ -36,7 +39,7 @@ pipeline { } steps { sh 'ccache --zero-stats' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ @@ -44,13 +47,15 @@ pipeline { -DCMAKE_CXX_FLAGS="-Werror -Wno-unknown-cuda-version -Wno-gnu-zero-variadic-macro-arguments" \ -DKokkos_ARCH_VOLTA70=ON \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ -DKokkos_ENABLE_EXAMPLES=ON \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_SYCL=ON \ -DKokkos_ENABLE_UNSUPPORTED_ARCHS=ON \ -DCMAKE_CXX_STANDARD=17 \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake''' + .. && \ + make -j8 && ctest --verbose''' } post { always { @@ -58,12 +63,12 @@ pipeline { } } } - stage('HIP-ROCm-3.8-C++14') { + stage('HIP-ROCm-4.2-C++14') { agent { dockerfile { filename 'Dockerfile.hipcc' dir 'scripts/docker' - additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-20.04:3.8' + additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-20.04:4.2' label 'rocm-docker && vega' args '-v /tmp/ccache.kokkos:/tmp/ccache --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --group-add video --env HIP_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES' } @@ -72,24 +77,23 @@ pipeline { OMP_NUM_THREADS = 8 OMP_PLACES = 'threads' OMP_PROC_BIND = 'spread' - LC_ALL = 'C' } steps { sh 'ccache --zero-stats' sh 'echo "/opt/rocm/llvm/lib" > /etc/ld.so.conf.d/llvm.conf && ldconfig' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CXX_COMPILER=hipcc \ -DCMAKE_CXX_FLAGS="-Werror -Wno-unused-command-line-argument -DNDEBUG" \ -DCMAKE_CXX_STANDARD=14 \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_HIP=ON \ - -DKokkos_ARCH_VEGA906=ON \ -DKokkos_ENABLE_OPENMP=ON \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake''' + .. && \ + make -j8 && ctest --verbose''' } post { always { @@ -97,33 +101,73 @@ pipeline { } } } - stage('HIP-ROCm-3.8-C++17') { + stage('HIP-ROCm-4.2-C++17') { agent { dockerfile { filename 'Dockerfile.hipcc' dir 'scripts/docker' - additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-20.04:3.8' + additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-20.04:4.2' label 'rocm-docker && vega' args '-v /tmp/ccache.kokkos:/tmp/ccache --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --group-add video --env HIP_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES' } } - environment { - LC_ALL = 'C' - } steps { sh 'ccache --zero-stats' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_CXX_COMPILER=hipcc \ -DCMAKE_CXX_FLAGS="-Werror -Wno-unused-command-line-argument" \ -DCMAKE_CXX_STANDARD=17 \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_HIP=ON \ + .. && \ + make -j8 && ctest --verbose''' + } + post { + always { + sh 'ccache --show-stats' + } + } + } + stage('OPENMPTARGET-ROCm-4.2') { + agent { + dockerfile { + filename 'Dockerfile.hipcc' + dir 'scripts/docker' + additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-20.04:4.2' + label 'rocm-docker && vega && AMD_Radeon_Instinct_MI60' + args '-v /tmp/ccache.kokkos:/tmp/ccache --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --group-add video --env HIP_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES' + } + } + environment { + OMP_NUM_THREADS = 8 + OMP_PLACES = 'threads' + OMP_PROC_BIND = 'spread' + LC_ALL = 'C' + } + steps { + sh 'ccache --zero-stats' + sh 'echo "/opt/rocm/llvm/lib" > /etc/ld.so.conf.d/llvm.conf && ldconfig' + sh '''rm -rf build && \ + cmake \ + -Bbuild \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_COMPILER=/opt/rocm/llvm/bin/clang++ \ + -DCMAKE_CXX_STANDARD=17 \ + -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=OFF \ + -DKokkos_ENABLE_TESTS=ON \ + -DKokkos_ENABLE_OPENMPTARGET=ON \ + -DKokkos_ENABLE_OPENMP=ON \ -DKokkos_ARCH_VEGA906=ON \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake''' + && \ + cmake --build build --parallel ${BUILD_JOBS} && \ + cd build && ctest --output-on-failure + ''' } post { always { @@ -142,19 +186,21 @@ pipeline { } steps { sh 'ccache --zero-stats' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_CXX_FLAGS="-Wno-unknown-cuda-version -Werror -Wno-undefined-internal -Wno-pass-failed" \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_TUNING=ON \ -DKokkos_ENABLE_OPENMPTARGET=ON \ -DKokkos_ARCH_VOLTA70=ON \ -DCMAKE_CXX_STANDARD=17 \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake''' + .. && \ + make -j8 && ctest --verbose''' } post { always { @@ -173,7 +219,7 @@ pipeline { } steps { sh 'ccache --zero-stats' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_CLANG_TIDY="clang-tidy;-warnings-as-errors=*" \ @@ -182,13 +228,15 @@ pipeline { -DCMAKE_CXX_FLAGS=-Werror \ -DCMAKE_CXX_STANDARD=14 \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_CUDA=ON \ -DKokkos_ENABLE_CUDA_LAMBDA=ON \ -DKokkos_ENABLE_TUNING=ON \ -DKokkos_ARCH_VOLTA70=ON \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake''' + .. && \ + make -j8 && ctest --verbose''' } post { always { @@ -244,7 +292,7 @@ pipeline { steps { sh 'ccache --zero-stats' sh '''rm -rf install && mkdir -p install && \ - rm -rf build && \ + rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_COMPILER=g++-8 \ @@ -256,10 +304,12 @@ pipeline { -DKokkos_ENABLE_CUDA_LAMBDA=OFF \ -DKokkos_ENABLE_CUDA_UVM=ON \ -DKokkos_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE=ON \ - -DCMAKE_INSTALL_PREFIX=${PWD}/install \ - -DBUILD_NAME=${STAGE_NAME} \ - -DTARGET=install \ - -P cmake/KokkosCI.cmake && \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ + -DCMAKE_INSTALL_PREFIX=${PWD}/../install \ + .. && \ + make -j8 install && \ + cd .. && \ rm -rf build-tests && mkdir -p build-tests && cd build-tests && \ export CMAKE_PREFIX_PATH=${PWD}/../install && \ cmake \ @@ -302,7 +352,7 @@ pipeline { } steps { sh 'ccache --zero-stats' - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ @@ -312,14 +362,14 @@ pipeline { -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ -DKokkos_ENABLE_DEBUG=ON \ -DKokkos_ENABLE_DEBUG_BOUNDS_CHECK=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_CUDA=ON \ -DKokkos_ENABLE_CUDA_LAMBDA=ON \ -DKokkos_ENABLE_LIBDL=OFF \ - -DBUILD_NAME=${STAGE_NAME} \ - -DTARGET=install \ - -P cmake/KokkosCI.cmake && \ - cd example/build_cmake_in_tree && \ + .. && \ + make -j8 && ctest --verbose && \ + cd ../example/build_cmake_in_tree && \ rm -rf build && mkdir -p build && cd build && \ cmake -DCMAKE_CXX_STANDARD=14 .. && make -j8 && ctest --verbose''' } @@ -342,18 +392,21 @@ pipeline { OMP_PROC_BIND = 'true' } steps { - sh '''rm -rf build && \ + sh '''rm -rf build && mkdir -p build && cd build && \ cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_STANDARD=14 \ -DCMAKE_CXX_FLAGS=-Werror \ -DKokkos_ENABLE_COMPILER_WARNINGS=ON \ + -DKokkos_ENABLE_DEPRECATED_CODE_3=ON \ + -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF \ -DKokkos_ENABLE_TESTS=ON \ -DKokkos_ENABLE_OPENMP=ON \ -DKokkos_ENABLE_LIBDL=OFF \ - -DBUILD_NAME=${STAGE_NAME} \ - -P cmake/KokkosCI.cmake && \ - gcc -I$PWD/core/src core/unit_test/tools/TestCInterface.c''' + -DKokkos_ENABLE_LIBQUADMATH=ON \ + -DCMAKE_PREFIX_PATH=/usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.3.0 \ + .. && \ + make -j8 && ctest --verbose && gcc -I$PWD/../core/src/ ../core/unit_test/tools/TestCInterface.c''' } } } diff --git a/packages/kokkos/.travis.yml b/packages/kokkos/.travis.yml index 04ef01c1602c..87d0fd5cf6ed 100644 --- a/packages/kokkos/.travis.yml +++ b/packages/kokkos/.travis.yml @@ -67,14 +67,13 @@ install: before_script: - ccache -z - - if [[ ${COVERAGE} ]]; then export CXX="${CXX} --coverage"; export BUILD_NAME_SUFFIX="-Coverage"; fi + - if [[ ${COVERAGE} ]]; then export CXX="${CXX} --coverage"; fi - if [[ ! ${CMAKE_BUILD_TYPE} ]]; then export CXXFLAGS="${CXXFLAGS} -O2"; fi script: - export OMP_NUM_THREADS=2 - export OMP_PLACES=threads - export OMP_PROC_BIND=spread - - export BUILD_JOBS=2 # LD_LIBRARY_PATH workaround to find clang's libomp: https://github.com/travis-ci/travis-ci/issues/8613 - if [[ ${CC} = clang ]]; then export LD_LIBRARY_PATH=/usr/local/clang/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH; fi # enable ccache for clang on linux and add CCACHE_CPP2 to avoid 'Argument unused during compilation -I...' warning @@ -82,17 +81,17 @@ script: ln -s /usr/bin/ccache $HOME/bin/clang++; export CCACHE_CPP2=yes; fi - - cmake + - mkdir build && + pushd build && + cmake .. ${BACKEND:+-DKokkos_ENABLE_${BACKEND}=On} -DCMAKE_CXX_FLAGS="${CXXFLAGS} -Werror" -DCMAKE_CXX_STANDARD=14 -DKokkos_ENABLE_COMPILER_WARNINGS=ON -DKokkos_ENABLE_TESTS=On - ${CMAKE_BUILD_TYPE:+-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}} - -DBUILD_NAME="${CC}-${BACKEND}${BUILD_NAME_SUFFIX}" - -DSITE=Travis - -P cmake/KokkosCI.cmake && - pushd build && + ${CMAKE_BUILD_TYPE:+-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}} && + make VERBOSE=1 -j2 && + travis_wait 60 make test CTEST_OUTPUT_ON_FAILURE=1 && make install DESTDIR=${PWD}/install && rm -rf ${PWD}/install/usr/local && rmdir ${PWD}/install/usr && popd diff --git a/packages/kokkos/CHANGELOG.md b/packages/kokkos/CHANGELOG.md index 7bb6de4cd924..2e779791dde2 100644 --- a/packages/kokkos/CHANGELOG.md +++ b/packages/kokkos/CHANGELOG.md @@ -1,5 +1,165 @@ # Change Log +## [3.5.00](https://github.com/kokkos/kokkos/tree/3.5.00) (2021-10-19) +[Full Changelog](https://github.com/kokkos/kokkos/compare/3.4.01...3.5.00) + +### Features: + +- Add support for quad-precision math functions/traits [\#4098](https://github.com/kokkos/kokkos/pull/4098) +- Adding ExecutionSpace partitioning function [\#4096](https://github.com/kokkos/kokkos/pull/4096) +- Improve Python Interop Capabilities [\#4065](https://github.com/kokkos/kokkos/pull/4065) +- Add half_t Kokkos::rand specialization [\#3922](https://github.com/kokkos/kokkos/pull/3922) +- Add math special functions: erf, erfcx, expint1, Bessel functions, Hankel functions [\#3920](https://github.com/kokkos/kokkos/pull/3920) +- Add missing common mathematical functions [\#4043](https://github.com/kokkos/kokkos/pull/4043) [\#4036](https://github.com/kokkos/kokkos/pull/4036) [\#4034](https://github.com/kokkos/kokkos/pull/4034) +- Let the numeric traits be SFINAE-friendly [\#4038](https://github.com/kokkos/kokkos/pull/4038) +- Add Desul atomics - enabling memory-order and memory-scope parameters [\#3247](https://github.com/kokkos/kokkos/pull/3247) +- Add detection idiom from the C++ standard library extension version 2 [\#3980](https://github.com/kokkos/kokkos/pull/3980) +- Fence Profiling Support in all backends [\#3966](https://github.com/kokkos/kokkos/pull/3966) [\#4304](https://github.com/kokkos/kokkos/pull/4304) [\#4258](https://github.com/kokkos/kokkos/pull/4258) [\#4232](https://github.com/kokkos/kokkos/pull/4232) +- Significant SYCL enhancements (see below) + +### Deprecations: + +- Deprecate CUDA_SAFE_CALL and HIP_SAFE_CALL [\#4249](https://github.com/kokkos/kokkos/pull/4249) +- Deprecate Kokkos::Impl::Timer (Kokkos::Timer has been available for a long time) [\#4201](https://github.com/kokkos/kokkos/pull/4201) +- Deprecate Experimental::MasterLock [\#4094](https://github.com/kokkos/kokkos/pull/4094) +- Deprecate Kokkos_TaskPolicy.hpp (headers got reorganized, doesn't remove functionality) [\#4011](https://github.com/kokkos/kokkos/pull/4011) +- Deprecate backward compatibility features [\#3978](https://github.com/kokkos/kokkos/pull/3978) +- Update and deprecate is_space::host_memory/execution/mirror_space [\#3973](https://github.com/kokkos/kokkos/pull/3973) + + +### Backends and Archs Enhancements: + +- Enabling constbitset constructors in kernels [\#4296](https://github.com/kokkos/kokkos/pull/4296) +- Use ZeroMemset in View constructor to improve performance [\#4226](https://github.com/kokkos/kokkos/pull/4226) +- Use memset in deep_copy [\#3944](https://github.com/kokkos/kokkos/pull/3944) +- Add missing fence() calls in resize(View) that effectively do deep_copy(resized, orig) [\#4212](https://github.com/kokkos/kokkos/pull/4212) +- Avoid allocations in resize and realloc [\#4207](https://github.com/kokkos/kokkos/pull/4207) +- StaticCsrGraph: use device type instead of execution space to construct views [\#3991](https://github.com/kokkos/kokkos/pull/3991) +- Consider std::sort when view is accessible from host [\#3929](https://github.com/kokkos/kokkos/pull/3929) +- Fix CPP20 warnings except for volatile [\#4312](https://github.com/kokkos/kokkos/pull/4312) + +#### SYCL: +- Introduce SYCLHostUSMSpace [\#4268](https://github.com/kokkos/kokkos/pull/4268) +- Implement SYCL TeamPolicy for vector_size > 1 [\#4183](https://github.com/kokkos/kokkos/pull/4183) +- Enable 64bit ranges for SYCL [\#4211](https://github.com/kokkos/kokkos/pull/4211) +- Don't print SYCL device info in execution space intialization [\#4168](https://github.com/kokkos/kokkos/pull/4168) +- Improve SYCL MDRangePolicy performance [\#4161](https://github.com/kokkos/kokkos/pull/4161) +- Use sub_groups in SYCL parallel_scan [\#4147](https://github.com/kokkos/kokkos/pull/4147) +- Implement subgroup reduction for SYCL RangePolicy parallel_reduce [\#3940](https://github.com/kokkos/kokkos/pull/3940) +- Use DPC++ broadcast extension in SYCL team_broadcast [\#4103](https://github.com/kokkos/kokkos/pull/4103) +- Only fence in SYCL parallel_reduce for non-device-accessible result_ptr [\#4089](https://github.com/kokkos/kokkos/pull/4089) +- Improve fencing behavior in SYCL backend [\#4088](https://github.com/kokkos/kokkos/pull/4088) +- Fence all registered SYCL queues before deallocating memory [\#4086](https://github.com/kokkos/kokkos/pull/4086) +- Implement SYCL::print_configuration [\#3992](https://github.com/kokkos/kokkos/pull/3992) +- Reuse scratch memory in parallel_scan and TeamPolicy (decreases memory footprint) [\#3899](https://github.com/kokkos/kokkos/pull/3899) [\#3889](https://github.com/kokkos/kokkos/pull/3889) + +#### CUDA: +- Cuda improve heuristic for blocksize [\#4271](https://github.com/kokkos/kokkos/pull/4271) +- Don't use [[deprecated]] for nvcc [\#4229](https://github.com/kokkos/kokkos/pull/4229) +- Improve error message for NVHPC as host compiler [\#4227](https://github.com/kokkos/kokkos/pull/4227) +- Update support for cuda reductions to work with types < 4bytes [\#4156](https://github.com/kokkos/kokkos/pull/4156) +- Fix incompatible team size deduction in rare cases parallel_reduce [\#4142](https://github.com/kokkos/kokkos/pull/4142) +- Remove UVM usage in DynamicView [\#4129](https://github.com/kokkos/kokkos/pull/4129) +- Remove dependency between core and containers [\#4114](https://github.com/kokkos/kokkos/pull/4114) +- Adding opt-in CudaMallocSync support when using CUDA version >= 11.2 [\#4026](https://github.com/kokkos/kokkos/pull/4026) [\#4233](https://github.com/kokkos/kokkos/pull/4233) +- Fix a potential race condition in the CUDA backend [\#3999](https://github.com/kokkos/kokkos/pull/3999) + +#### HIP: +- Implement new blocksize deduction method for HIP Backend [\#3953](https://github.com/kokkos/kokkos/pull/3953) +- Add multiple LaunchMechanism [\#3820](https://github.com/kokkos/kokkos/pull/3820) +- Make HIP backend thread-safe [\#4170](https://github.com/kokkos/kokkos/pull/4170) + +#### Serial: +- Refactor Serial backend and fix thread-safety issue [\#4053](https://github.com/kokkos/kokkos/pull/4053) + +#### OpenMPTarget: +- OpenMPTarget: support array reductions in RangePolicy [\#4040](https://github.com/kokkos/kokkos/pull/4040) +- OpenMPTarget: add MDRange parallel_reduce [\#4032](https://github.com/kokkos/kokkos/pull/4032) +- OpenMPTarget: Fix bug in for the case of a reducer. [\#4044](https://github.com/kokkos/kokkos/pull/4044) +- OpenMPTarget: verify process fix [\#4041](https://github.com/kokkos/kokkos/pull/4041) + +### Implemented enhancements BuildSystem + +#### Important BuildSystem Updates: +- Use hipcc architecture autodetection when Kokkos_ARCH is not set [\#3941](https://github.com/kokkos/kokkos/pull/3941) +- Introduce Kokkos_ENABLE_DEPRECATION_WARNINGS and remove deprecated code with Kokkos_ENABLE_DEPRECATED_CODE_3 [\#4106](https://github.com/kokkos/kokkos/pull/4106) [\#3855](https://github.com/kokkos/kokkos/pull/3855) + +#### Other Improvements: +- Add allow-unsupported-compiler flag to nvcc-wrapper [\#4298](https://github.com/kokkos/kokkos/pull/4298) +- nvcc_wrapper: fix errors in argument handling [\#3993](https://github.com/kokkos/kokkos/pull/3993) +- Adds support for -time= and -time in nvcc_wrapper [\#4015](https://github.com/kokkos/kokkos/pull/4015) +- nvcc_wrapper: suppress duplicates of GPU architecture and RDC flags [\#3968](https://github.com/kokkos/kokkos/pull/3968) +- Fix TMPDIR support in nvcc_wrapper [\#3792](https://github.com/kokkos/kokkos/pull/3792) +- NVHPC: update PGI compiler arch flags [\#4133](https://github.com/kokkos/kokkos/pull/4133) +- Replace PGI with NVHPC (works for both) [\#4196](https://github.com/kokkos/kokkos/pull/4196) +- Make sure that KOKKOS_CXX_HOST_COMPILER_ID is defined [\#4235](https://github.com/kokkos/kokkos/pull/4235) +- Add options to Makefile builds for deprecated code and warnings [\#4215](https://github.com/kokkos/kokkos/pull/4215) +- Use KOKKOS_CXX_HOST_COMPILER_ID for identifying CPU arch flags [\#4199](https://github.com/kokkos/kokkos/pull/4199) +- Added support for Cray Clang to Makefile.kokkos [\#4176](https://github.com/kokkos/kokkos/pull/4176) +- Add XLClang as compiler [\#4120](https://github.com/kokkos/kokkos/pull/4120) +- Keep quoted compiler flags when passing to Trilinos [\#3987](https://github.com/kokkos/kokkos/pull/3987) +- Add support for AMD Zen3 CPU architecture [\#3972](https://github.com/kokkos/kokkos/pull/3972) +- Rename IntelClang to IntelLLVM [\#3945](https://github.com/kokkos/kokkos/pull/3945) +- Add cppcoreguidelines-pro-type-cstyle-cast to clang-tidy [\#3522](https://github.com/kokkos/kokkos/pull/3522) +- Add sve bit size definition for A64FX [\#3947](https://github.com/kokkos/kokkos/pull/3947) [\#3946](https://github.com/kokkos/kokkos/pull/3946) +- Remove KOKKOS_ENABLE_DEBUG_PRINT_KERNEL_NAMES [\#4150](https://github.com/kokkos/kokkos/pull/4150) + +### Other Changes: + +#### Tool Enhancements: + +- Retrieve original value from a point in a MultidimensionalSparseTuningProblem [\#3977](https://github.com/kokkos/kokkos/pull/3977) +- Allow extension of built-in tuners with additional tuning axes [\#3961](https://github.com/kokkos/kokkos/pull/3961) +- Added a categorical tuner [\#3955](https://github.com/kokkos/kokkos/pull/3955) + + +#### Miscellaneous: + +- hpcbind: Use double quotes around $@ when invoking user command [\#4284](https://github.com/kokkos/kokkos/pull/4284) +- Add file and line to error message [\#3985](https://github.com/kokkos/kokkos/pull/3985) +- Fix compiler warnings when compiling with nvc++ [\#4198](https://github.com/kokkos/kokkos/pull/4198) +- Add OpenMPTarget CI build on AMD GPUs [\#4055](https://github.com/kokkos/kokkos/pull/4055) +- CI: icpx is now part of intel container [\#4002](https://github.com/kokkos/kokkos/pull/4002) + +### Incompatibilities: + +- Remove pre CUDA 9 KOKKOS_IMPL_CUDA_* macros [\#4138](https://github.com/kokkos/kokkos/pull/4138) + +### Bug Fixes: +- UnorderedMap::clear() should zero the size() [\#4130](https://github.com/kokkos/kokkos/pull/4130) +- Add memory fence for HostSharedPtr::cleanup() [\#4144](https://github.com/kokkos/kokkos/pull/4144) +- SYCL: Fix race conditions in TeamPolicy::parallel_reduce [\#4418](https://github.com/kokkos/kokkos/pull/4418) +- Adding missing memory fence to serial exec space fence. [\#4292](https://github.com/kokkos/kokkos/pull/4292) +- Fix using external SYCL queues in tests [\#4291](https://github.com/kokkos/kokkos/pull/4291) +- Fix digits10 bug [\#4281](https://github.com/kokkos/kokkos/pull/4281) +- Fixes constexpr errors with frounding-math on gcc < 10. [\#4278](https://github.com/kokkos/kokkos/pull/4278) +- Fix compiler flags for PGI/NVHPC [\#4264](https://github.com/kokkos/kokkos/pull/4264) +- Fix Zen2/3 also implying Zen Arch with Makefiles [\#4260](https://github.com/kokkos/kokkos/pull/4260) +- Kokkos_Cuda.hpp: Fix shadow warning with cuda/11.0 [\#4252](https://github.com/kokkos/kokkos/pull/4252) +- Fix issue w/ static initialization of function attributes [\#4242](https://github.com/kokkos/kokkos/pull/4242) +- Disable long double hypot test on Power systems [\#4221](https://github.com/kokkos/kokkos/pull/4221) +- Fix false sharing in random pool [\#4218](https://github.com/kokkos/kokkos/pull/4218) +- Fix a missing memory_fence for debug shared alloc code [\#4216](https://github.com/kokkos/kokkos/pull/4216) +- Fix two xl issues [\#4179](https://github.com/kokkos/kokkos/pull/4179) +- Makefile.kokkos: fix (standard_in) 1: syntax error [\#4173](https://github.com/kokkos/kokkos/pull/4173) +- Fixes for query_device example [\#4172](https://github.com/kokkos/kokkos/pull/4172) +- Fix a bug when using HIP atomic with Kokkos::Complex [\#4159](https://github.com/kokkos/kokkos/pull/4159) +- Fix mistaken logic in pthread creation [\#4157](https://github.com/kokkos/kokkos/pull/4157) +- Define KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION when requesting Kokkos_ENABLE_AGGRESSIVE_VECTORIZATION=ON [\#4107](https://github.com/kokkos/kokkos/pull/4107) +- Fix compilation with latest MSVC version [\#4102](https://github.com/kokkos/kokkos/pull/4102) +- Fix incorrect macro definitions when compiling with Intel compiler on Windows [\#4087](https://github.com/kokkos/kokkos/pull/4087) +- Fixup global buffer overflow in hand rolled string manipulation [\#4070](https://github.com/kokkos/kokkos/pull/4070) +- Fixup heap buffer overflow in cmd line args parsing unit tests [\#4069](https://github.com/kokkos/kokkos/pull/4069) +- Only add quotes in compiler flags for Trilinos if necessary [\#4067](https://github.com/kokkos/kokkos/pull/4067) +- Fixed invocation of tools init callbacks [\#4061](https://github.com/kokkos/kokkos/pull/4061) +- Work around SYCL JIT compiler issues with static variables [\#4013](https://github.com/kokkos/kokkos/pull/4013) +- Fix TestDetectionIdiom.cpp test inclusion for Trilinos/TriBITS [\#4010](https://github.com/kokkos/kokkos/pull/4010) +- Fixup allocation headers with OpenMPTarget backend [\#4003](https://github.com/kokkos/kokkos/pull/4003) +- Add missing specialization for OMPT to Kokkos Random [\#3967](https://github.com/kokkos/kokkos/pull/3967) +- Disable hypot long double test on power arches [\#3962](https://github.com/kokkos/kokkos/pull/3962) +- Use different EBO workaround for MSVC (rebased) [\#3924](https://github.com/kokkos/kokkos/pull/3924) +- Fix SYCL Kokkos::Profiling::(de)allocateData calls [\#3928](https://github.com/kokkos/kokkos/pull/3928) + ## [3.4.01](https://github.com/kokkos/kokkos/tree/3.4.01) (2021-05-19) [Full Changelog](https://github.com/kokkos/kokkos/compare/3.4.00...3.4.01) diff --git a/packages/kokkos/CMakeLists.txt b/packages/kokkos/CMakeLists.txt index 600b7bff9506..1b6753f983db 100644 --- a/packages/kokkos/CMakeLists.txt +++ b/packages/kokkos/CMakeLists.txt @@ -111,8 +111,8 @@ ENDIF() set(Kokkos_VERSION_MAJOR 3) -set(Kokkos_VERSION_MINOR 4) -set(Kokkos_VERSION_PATCH 01) +set(Kokkos_VERSION_MINOR 5) +set(Kokkos_VERSION_PATCH 00) set(Kokkos_VERSION "${Kokkos_VERSION_MAJOR}.${Kokkos_VERSION_MINOR}.${Kokkos_VERSION_PATCH}") math(EXPR KOKKOS_VERSION "${Kokkos_VERSION_MAJOR} * 10000 + ${Kokkos_VERSION_MINOR} * 100 + ${Kokkos_VERSION_PATCH}") diff --git a/packages/kokkos/Makefile.kokkos b/packages/kokkos/Makefile.kokkos index bda8572073a3..7ab18f5894e8 100644 --- a/packages/kokkos/Makefile.kokkos +++ b/packages/kokkos/Makefile.kokkos @@ -1,19 +1,19 @@ # Default settings common options. KOKKOS_VERSION_MAJOR = 3 -KOKKOS_VERSION_MINOR = 4 -KOKKOS_VERSION_PATCH = 01 +KOKKOS_VERSION_MINOR = 5 +KOKKOS_VERSION_PATCH = 00 KOKKOS_VERSION = $(shell echo $(KOKKOS_VERSION_MAJOR)*10000+$(KOKKOS_VERSION_MINOR)*100+$(KOKKOS_VERSION_PATCH) | bc) -# Options: Cuda,HIP,OpenMP,Pthread,Serial +# Options: Cuda,HIP,SYCL,OpenMPTarget,OpenMP,Pthread,Serial #KOKKOS_DEVICES ?= "OpenMP" KOKKOS_DEVICES ?= "Pthread" -# Options: +# Options: # Intel: KNC,KNL,SNB,HSW,BDW,SKX # NVIDIA: Kepler,Kepler30,Kepler32,Kepler35,Kepler37,Maxwell,Maxwell50,Maxwell52,Maxwell53,Pascal60,Pascal61,Volta70,Volta72,Turing75,Ampere80,Ampere86 # ARM: ARMv80,ARMv81,ARMv8-ThunderX,ARMv8-TX2,A64FX # IBM: BGQ,Power7,Power8,Power9 -# AMD-GPUS: Vega900,Vega906,Vega908 +# AMD-GPUS: Vega900,Vega906,Vega908,Vega90A # AMD-CPUS: AMDAVX,Zen,Zen2,Zen3 KOKKOS_ARCH ?= "" # Options: yes,no @@ -22,7 +22,7 @@ KOKKOS_DEBUG ?= "no" KOKKOS_USE_TPLS ?= "" # Options: c++14,c++1y,c++17,c++1z,c++2a KOKKOS_CXX_STANDARD ?= "c++14" -# Options: aggressive_vectorization,disable_profiling,enable_large_mem_tests,disable_complex_align +# Options: aggressive_vectorization,disable_profiling,enable_large_mem_tests,disable_complex_align,disable_deprecated_code,enable_deprecation_warnings KOKKOS_OPTIONS ?= "" KOKKOS_CMAKE ?= "no" KOKKOS_TRIBITS ?= "no" @@ -70,7 +70,7 @@ KOKKOS_INTERNAL_USE_MEMKIND := $(call kokkos_has_string,$(KOKKOS_USE_TPLS),exper # Check for advanced settings. KOKKOS_INTERNAL_ENABLE_COMPILER_WARNINGS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),compiler_warnings) -KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION := $(call kokkos_has_string,$(KOKKOS_OPTIONS),aggressive_vectorization) +KOKKOS_INTERNAL_AGGRESSIVE_VECTORIZATION := $(call kokkos_has_string,$(KOKKOS_OPTIONS),aggressive_vectorization) KOKKOS_INTERNAL_ENABLE_TUNING := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_tuning) KOKKOS_INTERNAL_DISABLE_COMPLEX_ALIGN := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_complex_align) KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_dualview_modify_check) @@ -82,6 +82,9 @@ KOKKOS_INTERNAL_CUDA_USE_RELOC := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS KOKKOS_INTERNAL_CUDA_USE_LAMBDA := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),enable_lambda) KOKKOS_INTERNAL_CUDA_USE_CONSTEXPR := $(call kokkos_has_string,$(KOKKOS_CUDA_OPTIONS),enable_constexpr) KOKKOS_INTERNAL_HPX_ENABLE_ASYNC_DISPATCH := $(call kokkos_has_string,$(KOKKOS_HPX_OPTIONS),enable_async_dispatch) +KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_desul_atomics) +KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE := $(call kokkos_has_string,$(KOKKOS_OPTIONS),disable_deprecated_code) +KOKKOS_INTERNAL_ENABLE_DEPRECATION_WARNINGS := $(call kokkos_has_string,$(KOKKOS_OPTIONS),enable_deprecation_warnings) KOKKOS_INTERNAL_HIP_USE_RELOC := $(call kokkos_has_string,$(KOKKOS_HIP_OPTIONS),rdc) @@ -102,6 +105,7 @@ endif # Check for other Execution Spaces. KOKKOS_INTERNAL_USE_CUDA := $(call kokkos_has_string,$(KOKKOS_DEVICES),Cuda) KOKKOS_INTERNAL_USE_HIP := $(call kokkos_has_string,$(KOKKOS_DEVICES),HIP) +KOKKOS_INTERNAL_USE_SYCL := $(call kokkos_has_string,$(KOKKOS_DEVICES),SYCL) KOKKOS_INTERNAL_USE_OPENMPTARGET := $(call kokkos_has_string,$(KOKKOS_DEVICES),OpenMPTarget) KOKKOS_DEVICELIST = @@ -123,11 +127,18 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) KOKKOS_DEVICELIST += HIP endif +KOKKOS_INTERNAL_HAVE_CXX17_OR_NEWER := $(shell expr $(KOKKOS_INTERNAL_ENABLE_CXX17) \ + + $(KOKKOS_INTERNAL_ENABLE_CXX20) \ + + $(KOKKOS_INTERNAL_ENABLE_CXX2A)) +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) + KOKKOS_DEVICELIST += SYCL + ifneq ($(KOKKOS_INTERNAL_HAVE_CXX17_OR_NEWER), 1) + $(error SYCL backend requires C++17 or newer) + endif + +endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) KOKKOS_DEVICELIST += OPENMPTARGET - KOKKOS_INTERNAL_HAVE_CXX17_OR_NEWER := $(shell expr $(KOKKOS_INTERNAL_ENABLE_CXX17) \ - + $(KOKKOS_INTERNAL_ENABLE_CXX20) \ - + $(KOKKOS_INTERNAL_ENABLE_CXX2A)) ifneq ($(KOKKOS_INTERNAL_HAVE_CXX17_OR_NEWER), 1) $(error OpenMPTarget backend requires C++17 or newer) endif @@ -158,6 +169,8 @@ KOKKOS_INTERNAL_COMPILER_XL := $(strip $(shell $(CXX) -qversion 2 KOKKOS_INTERNAL_COMPILER_CRAY := $(strip $(shell $(CXX) -craype-verbose 2>&1 | grep -c "CC-")) KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell echo "$(shell export OMPI_CXX=$(OMPI_CXX); export MPICH_CXX=$(MPICH_CXX); $(CXX) --version 2>&1 | grep -c nvcc)>0" | bc)) KOKKOS_INTERNAL_COMPILER_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),clang) +KOKKOS_INTERNAL_COMPILER_CRAY_CLANG := $(strip $(shell $(CXX) -craype-verbose 2>&1 | grep -c "clang++")) +KOKKOS_INTERNAL_COMPILER_INTEL_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),oneAPI) KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),Apple clang) KOKKOS_INTERNAL_COMPILER_HCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),HCC) KOKKOS_INTERNAL_COMPILER_GCC := $(call kokkos_has_string,$(KOKKOS_CXX_VERSION),GCC) @@ -237,7 +250,11 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -mp else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY_CLANG), 1) + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + else KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp + endif else ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp @@ -249,7 +266,11 @@ else # OpenMP is turned on by default in Cray compiler environment. KOKKOS_INTERNAL_OPENMP_FLAG := else - KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL_CLANG), 1) + KOKKOS_INTERNAL_OPENMP_FLAG := -fiopenmp + else + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + endif endif endif endif @@ -307,6 +328,13 @@ KOKKOS_INTERNAL_USE_ARCH_BDW := $(call kokkos_has_string,$(KOKKOS_ARCH),BDW) KOKKOS_INTERNAL_USE_ARCH_SKX := $(call kokkos_has_string,$(KOKKOS_ARCH),SKX) KOKKOS_INTERNAL_USE_ARCH_KNL := $(call kokkos_has_string,$(KOKKOS_ARCH),KNL) +KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen) +KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen9) +KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen11) +KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelGen12LP) +KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1 := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelDG1) +KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP := $(call kokkos_has_string,$(KOKKOS_ARCH),IntelXeHP) + # NVIDIA based. NVCC_WRAPPER := $(KOKKOS_PATH)/bin/nvcc_wrapper KOKKOS_INTERNAL_USE_ARCH_KEPLER30 := $(call kokkos_has_string,$(KOKKOS_ARCH),Kepler30) @@ -374,20 +402,25 @@ KOKKOS_INTERNAL_USE_ARCH_IBM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_ KOKKOS_INTERNAL_USE_ARCH_AMDAVX := $(call kokkos_has_string,$(KOKKOS_ARCH),AMDAVX) KOKKOS_INTERNAL_USE_ARCH_ZEN3 := $(call kokkos_has_string,$(KOKKOS_ARCH),Zen3) KOKKOS_INTERNAL_USE_ARCH_ZEN2 := $(call kokkos_has_string,$(KOKKOS_ARCH),Zen2) -KOKKOS_INTERNAL_USE_ARCH_ZEN := $(call kokkos_has_string,$(KOKKOS_ARCH),Zen) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN3), 0) + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ZEN2), 0) + KOKKOS_INTERNAL_USE_ARCH_ZEN := $(call kokkos_has_string,$(KOKKOS_ARCH),Zen) + endif +endif KOKKOS_INTERNAL_USE_ARCH_VEGA900 := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega900) KOKKOS_INTERNAL_USE_ARCH_VEGA906 := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega906) KOKKOS_INTERNAL_USE_ARCH_VEGA908 := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega908) +KOKKOS_INTERNAL_USE_ARCH_VEGA90A := $(call kokkos_has_string,$(KOKKOS_ARCH),Vega90A) # Any AVX? KOKKOS_INTERNAL_USE_ARCH_SSE42 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM)) KOKKOS_INTERNAL_USE_ARCH_AVX := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_AMDAVX)) -KOKKOS_INTERNAL_USE_ARCH_AVX2 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2)) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) +KOKKOS_INTERNAL_USE_ARCH_AVX2 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) KOKKOS_INTERNAL_USE_ARCH_AVX512MIC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNL)) KOKKOS_INTERNAL_USE_ARCH_AVX512XEON := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_SKX)) # Decide what ISA level we are able to support. -KOKKOS_INTERNAL_USE_ISA_X86_64 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM) + $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_KNL) + $(KOKKOS_INTERNAL_USE_ARCH_SKX) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2)) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) +KOKKOS_INTERNAL_USE_ISA_X86_64 := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_WSM) + $(KOKKOS_INTERNAL_USE_ARCH_SNB) + $(KOKKOS_INTERNAL_USE_ARCH_HSW) + $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_KNL) + $(KOKKOS_INTERNAL_USE_ARCH_SKX) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN2) + $(KOKKOS_INTERNAL_USE_ARCH_ZEN3)) KOKKOS_INTERNAL_USE_ISA_KNC := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_KNC)) KOKKOS_INTERNAL_USE_ISA_POWERPCLE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER8) + $(KOKKOS_INTERNAL_USE_ARCH_POWER9)) KOKKOS_INTERNAL_USE_ISA_POWERPCBE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POWER7)) @@ -396,8 +429,8 @@ KOKKOS_INTERNAL_USE_ISA_POWERPCBE := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_POW KOKKOS_INTERNAL_USE_TM := $(shell expr $(KOKKOS_INTERNAL_USE_ARCH_BDW) + $(KOKKOS_INTERNAL_USE_ARCH_SKX)) # Incompatible flags? -KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1" | bc )) -KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1" | bc)) +KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_SSE42)+$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1") | bc) +KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1") | bc) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MULTIHOST), 1) $(error Defined Multiple Host architectures: KOKKOS_ARCH=$(KOKKOS_ARCH) ) @@ -432,6 +465,10 @@ KOKKOS_LINK_FLAGS = KOKKOS_SRC = KOKKOS_HEADERS = +#ifeq ($(KOKKOS_INTERNAL_COMPILER_GCC), 1) + KOKKOS_LIBS += -latomic +#endif + # Generating the KokkosCore_config.h file. KOKKOS_INTERNAL_CONFIG_TMP=KokkosCore_config.tmp @@ -468,6 +505,10 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) tmp := $(call kokkos_append_header,'$H''define KOKKOS_ENABLE_HIP') endif +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) + tmp := $(call kokkos_append_header,'$H''define KOKKOS_ENABLE_SYCL') +endif + ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) tmp := $(call kokkos_append_header,'$H''define KOKKOS_ENABLE_OPENMPTARGET') ifeq ($(KOKKOS_INTERNAL_COMPILER_GCC), 1) @@ -523,6 +564,12 @@ endif #only add the c++ standard flags if this is not CMake tmp := $(call kokkos_append_header,"/* General Settings */") +ifneq ($(KOKKOS_INTERNAL_DISABLE_DEPRECATED_CODE), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_DEPRECATED_CODE_3") +endif +ifeq ($(KOKKOS_INTERNAL_ENABLE_DEPRECATION_WARNINGS), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_DEPRECATION_WARNINGS") +endif ifeq ($(KOKKOS_INTERNAL_ENABLE_CXX14), 1) ifneq ($(KOKKOS_STANDALONE_CMAKE), yes) KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_CXX14_FLAG) @@ -625,8 +672,10 @@ endif tmp := $(call kokkos_append_header,"/* Optimization Settings */") -ifeq ($(KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION), 1) +ifeq ($(KOKKOS_INTERNAL_AGGRESSIVE_VECTORIZATION), 1) + # deprecated tmp := $(call kokkos_append_header,"$H""define KOKKOS_OPT_RANGE_AGGRESSIVE_VECTORIZATION") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION") endif tmp := $(call kokkos_append_header,"/* Cuda Settings */") @@ -1156,6 +1205,11 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA908") KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx908 endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_VEGA90A), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_HIP 90A") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_VEGA90A") + KOKKOS_INTERNAL_HIP_ARCH_FLAG := --amdgpu-target=gfx90a + endif KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/HIP/*.cpp) @@ -1174,6 +1228,52 @@ ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) endif endif +# Figure out the architecture flag for SYCL. +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) + # Lets start with adding architecture defines + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9-" + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN9), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN9") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9" + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN11), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN11") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen11" + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_GEN12LP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GEN12LP") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen12lp" + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_DG1), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_DG1") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device dg1" + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_INTEL_XEHP), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_GPU") + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ARCH_INTEL_XEHP") + KOKKOS_INTERNAL_SYCL_ARCH_FLAG := -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device xehp" + endif + + KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.cpp) + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/SYCL/*.hpp) + + KOKKOS_CXXFLAGS+=-fsycl -fno-sycl-id-queries-fit-in-int -fsycl-unnamed-lambda + KOKKOS_CXXFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) + KOKKOS_LDFLAGS+=-fsycl + KOKKOS_LDFLAGS+=$(KOKKOS_INTERNAL_SYCL_ARCH_FLAG) +endif + +ifeq ($(KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS), 1) + tmp := $(call kokkos_append_header,"$H""define KOKKOS_ENABLE_IMPL_DESUL_ATOMICS") +endif KOKKOS_INTERNAL_LS_CONFIG := $(shell ls KokkosCore_config.h 2>&1) @@ -1185,57 +1285,63 @@ endif ifneq ($(KOKKOS_INTERNAL_NEW_CONFIG), 0) tmp := $(shell cp KokkosCore_config.tmp KokkosCore_config.h) -endif -# Functions for generating config header file -kokkos_start_config_header = $(shell sed 's~@INCLUDE_NEXT_FILE@~~g' $(KOKKOS_PATH)/cmake/KokkosCore_Config_HeaderSet.in > $1) -kokkos_update_config_header = $(shell sed 's~@HEADER_GUARD_TAG@~$1~g' $2 > $3) -kokkos_append_config_header = $(shell echo $1 >> $2)) -tmp := $(call kokkos_start_config_header, "KokkosCore_Config_FwdBackend.tmp") -tmp := $(call kokkos_start_config_header, "KokkosCore_Config_SetupBackend.tmp") -tmp := $(call kokkos_start_config_header, "KokkosCore_Config_DeclareBackend.tmp") -tmp := $(call kokkos_start_config_header, "KokkosCore_Config_PostInclude.tmp") -tmp := $(call kokkos_update_config_header, KOKKOS_FWD_HPP_, "KokkosCore_Config_FwdBackend.tmp", "KokkosCore_Config_FwdBackend.hpp") -tmp := $(call kokkos_update_config_header, KOKKOS_SETUP_HPP_, "KokkosCore_Config_SetupBackend.tmp", "KokkosCore_Config_SetupBackend.hpp") -tmp := $(call kokkos_update_config_header, KOKKOS_DECLARE_HPP_, "KokkosCore_Config_DeclareBackend.tmp", "KokkosCore_Config_DeclareBackend.hpp") -tmp := $(call kokkos_update_config_header, KOKKOS_POST_INCLUDE_HPP_, "KokkosCore_Config_PostInclude.tmp", "KokkosCore_Config_PostInclude.hpp") -ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_SetupBackend.hpp") - ifeq ($(KOKKOS_INTERNAL_CUDA_USE_UVM), 1) - else - endif -endif -ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_SetupBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_HPX), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") -endif -ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") - tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + # Functions for generating config header file + kokkos_start_config_header = $(shell sed 's~@INCLUDE_NEXT_FILE@~~g' $(KOKKOS_PATH)/cmake/KokkosCore_Config_HeaderSet.in > $1) + kokkos_update_config_header = $(shell sed 's~@HEADER_GUARD_TAG@~$1~g' $2 > $3) + kokkos_append_config_header = $(shell echo $1 >> $2)) + tmp := $(call kokkos_start_config_header, "KokkosCore_Config_FwdBackend.tmp") + tmp := $(call kokkos_start_config_header, "KokkosCore_Config_SetupBackend.tmp") + tmp := $(call kokkos_start_config_header, "KokkosCore_Config_DeclareBackend.tmp") + tmp := $(call kokkos_start_config_header, "KokkosCore_Config_PostInclude.tmp") + tmp := $(call kokkos_update_config_header, KOKKOS_FWD_HPP_, "KokkosCore_Config_FwdBackend.tmp", "KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_update_config_header, KOKKOS_SETUP_HPP_, "KokkosCore_Config_SetupBackend.tmp", "KokkosCore_Config_SetupBackend.hpp") + tmp := $(call kokkos_update_config_header, KOKKOS_DECLARE_HPP_, "KokkosCore_Config_DeclareBackend.tmp", "KokkosCore_Config_DeclareBackend.hpp") + tmp := $(call kokkos_update_config_header, KOKKOS_POST_INCLUDE_HPP_, "KokkosCore_Config_PostInclude.tmp", "KokkosCore_Config_PostInclude.hpp") + ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_SetupBackend.hpp") + ifeq ($(KOKKOS_INTERNAL_CUDA_USE_UVM), 1) + else + endif + endif + ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_SetupBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_SetupBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_HPX), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif + ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_FwdBackend.hpp") + tmp := $(call kokkos_append_config_header,"$H""include ","KokkosCore_Config_DeclareBackend.hpp") + endif endif + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/*.hpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/impl/*.hpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/containers/src/*.hpp) @@ -1247,6 +1353,9 @@ KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.cpp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.cpp) + ifeq ($(KOKKOS_INTERNAL_ENABLE_DESUL_ATOMICS), 1) + KOKKOS_SRC += $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp + endif KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) ifneq ($(CUDA_PATH),) KOKKOS_CPPLAGS += -I$(CUDA_PATH)/include diff --git a/packages/kokkos/Makefile.targets b/packages/kokkos/Makefile.targets index cf9fc242420e..93854d0cf150 100644 --- a/packages/kokkos/Makefile.targets +++ b/packages/kokkos/Makefile.targets @@ -48,6 +48,17 @@ Kokkos_Cuda_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cu $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Task.cpp Kokkos_Cuda_Locks.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/Cuda/Kokkos_Cuda_Locks.cpp +Lock_Array_CUDA.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/desul/src/Lock_Array_CUDA.cpp +endif + +ifeq ($(KOKKOS_INTERNAL_USE_SYCL), 1) +Kokkos_SYCL.o : $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL.cpp +Kokkos_SYCL_Space.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL_Space.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL_Space.cpp +Kokkos_SYCL_Instance.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL_Instance.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/SYCL/Kokkos_SYCL_Instance.cpp endif ifeq ($(KOKKOS_INTERNAL_USE_HIP), 1) diff --git a/packages/kokkos/README.md b/packages/kokkos/README.md index d55ef2caac93..673f46271252 100644 --- a/packages/kokkos/README.md +++ b/packages/kokkos/README.md @@ -7,7 +7,7 @@ applications targeting all major HPC platforms. For that purpose it provides abstractions for both parallel execution of code and data management. Kokkos is designed to target complex node architectures with N-level memory hierarchies and multiple types of execution resources. It currently can use -CUDA, HPX, OpenMP and Pthreads as backend programming models with several other +CUDA, HIP, SYCL, HPX, OpenMP and C++ threads as backend programming models with several other backends in development. Kokkos Core is part of the Kokkos C++ Performance Portability Programming EcoSystem, @@ -16,29 +16,19 @@ profiling and debugging tools (https://github.com/kokkos/kokkos-tools). # Learning about Kokkos -A programming guide can be found on the Wiki, the API reference is under development. +The best way to start learning about Kokkos is going through the Kokkos Lectures. +They are online available at https://kokkos.link/the-lectures and contain a mix +of lecture videos and hands-on exercises covering all the important Kokkos Ecosystem +capabilities. + +A programming guide and API reference can be found on the Wiki +(https://github.com/kokkos/kokkos/wiki). For questions find us on Slack: https://kokkosteam.slack.com or open a github issue. For non-public questions send an email to crtrott(at)sandia.gov -A separate repository with extensive tutorial material can be found under -https://github.com/kokkos/kokkos-tutorials. - -Furthermore, the 'example/tutorial' directory provides step by step tutorial -examples which explain many of the features of Kokkos. They work with -simple Makefiles. To build with g++ and OpenMP simply type 'make' -in the 'example/tutorial' directory. This will build all examples in the -subfolders. To change the build options refer to the Programming Guide -in the compilation section. - -To learn more about Kokkos consider watching one of our presentations: -* GTC 2015: - - http://on-demand.gputechconf.com/gtc/2015/video/S5166.html - - http://on-demand.gputechconf.com/gtc/2015/presentation/S5166-H-Carter-Edwards.pdf - - # Contributing to Kokkos We are open and try to encourage contributions from external developers. @@ -53,57 +43,40 @@ For specifics see the LICENSE file contained in the repository or distribution. # Requirements -### Primary tested compilers on X86 are: -* GCC 5.3.0 -* GCC 5.4.0 -* GCC 5.5.0 -* GCC 6.1.0 -* GCC 7.2.0 -* GCC 7.3.0 -* GCC 8.1.0 -* Intel 17.0.1 -* Intel 17.4.196 -* Intel 18.2.128 -* Clang 4.0.0 -* Clang 6.0.0 for CUDA (CUDA Toolkit 9.0) -* Clang 7.0.0 for CUDA (CUDA Toolkit 9.1) -* Clang 8.0.0 for CUDA (CUDA Toolkit 9.2) -* PGI 18.7 -* NVCC 9.1 for CUDA (with gcc 6.1.0) -* NVCC 9.2 for CUDA (with gcc 7.2.0) -* NVCC 10.0 for CUDA (with gcc 7.4.0) -* NVCC 10.1 for CUDA (with gcc 7.4.0) -* NVCC 11.0 for CUDA (with gcc 8.4.0) - -### Primary tested compilers on Power 8 are: -* GCC 6.4.0 (OpenMP,Serial) -* GCC 7.2.0 (OpenMP,Serial) -* IBM XL 16.1.0 (OpenMP, Serial) -* NVCC 9.2.88 for CUDA (with gcc 7.2.0 and XL 16.1.0) - -### Primary tested compilers on Intel KNL are: -* Intel 17.2.174 (with gcc 6.2.0 and 6.4.0) -* Intel 18.2.199 (with gcc 6.2.0 and 6.4.0) - -### Primary tested compilers on ARM (Cavium ThunderX2) -* GCC 7.2.0 -* ARM/Clang 18.4.0 - -### Other compilers working: -* X86: - * Cygwin 2.1.0 64bit with gcc 4.9.3 - * GCC 8.1.0 (not warning free) - -### Known non-working combinations: -* Power8: - * Pthreads backend -* ARM - * Pthreads backend +### Minimum Compiler Versions + +Generally Kokkos should work with all compiler versions newer than the minimum. +However as in all sufficiently complex enough code, we have to work around compiler +bugs with almost all compilers. So compiler versions we don't test may have issues +we are unaware off. + +* GCC: 5.3.0 +* Clang: 4.0.0 +* Intel: 17.0.1 +* NVCC: 9.2.88 +* NVC++: 21.5 +* ROCM: 4.3 +* MSVC: 19.29 +* IBM XL: 16.1.1 +* Fujitsu: 4.5.0 +* ARM/Clang 20.1 + +### Primary Tested Compilers + +* GCC: 5.3.0, 6.1.0, 7.3.0, 8.3, 9.2, 10.0 +* NVCC: 9.2.88, 10.1, 11.0 +* Clang: 8.0.0, 9.0.0, 10.0.0, 12.0.0 +* Intel 17.4, 18.1, 19.5 +* MSVC: 19.29 +* ARM/Clang: 20.1 +* IBM XL: 16.1.1 +* ROCM: 4.3.0 ### Build system: -* CMake >= 3.10: required -* CMake >= 3.13: recommended + +* CMake >= 3.16: required * CMake >= 3.18: Fortran linkage. This does not affect most mixed Fortran/Kokkos builds. See [build issues](BUILD.md#KnownIssues). +* CMake >= 3.21.1 for NVC++ Primary tested compiler are passing in release mode with warnings as errors. They also are tested with a comprehensive set of @@ -153,7 +126,6 @@ cmake $srcdir \ -DCMAKE_INSTALL_PREFIX=$path_to_install \ -DKokkos_ENABLE_OPENMP=On \ -DKokkos_ARCH_HSW=On \ - -DKokkos_ENABLE_HWLOC=On \ -DKokkos_HWLOC_DIR=$path_to_hwloc ```` then simply type `make install`. The Kokkos CMake package will then be installed in `$path_to_install` to be used by downstream packages. @@ -212,23 +184,8 @@ where `...` is the unique spec identifying the particular Kokkos configuration a Some more details can found in the Kokkos spack [documentation](Spack.md) or the Spack [website](https://spack.readthedocs.io/en/latest). ## Raw Makefile -A bash script is provided to generate raw makefiles. -To install Kokkos as a library create a build directory and run the following -````bash -> $KOKKOS_PATH/generate_makefile.bash --prefix=$path_to_install -```` -Once the Makefile is generated, run: -````bash -> make kokkoslib -> make install -```` -To additionally run the unit tests: -````bash -> make build-test -> make test -```` -Run `generate_makefile.bash --help` for more detailed options such as -changing the device type for which to build. + +Raw Makefiles are only supported via inline builds. See below. ## Inline Builds vs. Installed Package For individual projects, it may be preferable to build Kokkos inline rather than link to an installed package. @@ -268,6 +225,35 @@ more than a single GPU is used by a single process. If you publish work which mentions Kokkos, please cite the following paper: +````BibTex +@ARTICLE{9485033, + author={Trott, Christian R. and Lebrun-Grandié, Damien and Arndt, Daniel and Ciesko, Jan and Dang, Vinh and Ellingwood, Nathan and Gayatri, Rahulkumar and Harvey, Evan and Hollman, Daisy S. and Ibanez, Dan and Liber, Nevin and Madsen, Jonathan and Miles, Jeff and Poliakoff, David and Powell, Amy and Rajamanickam, Sivasankaran and Simberg, Mikael and Sunderland, Dan and Turcksin, Bruno and Wilke, Jeremiah}, + journal={IEEE Transactions on Parallel and Distributed Systems}, + title={Kokkos 3: Programming Model Extensions for the Exascale Era}, + year={2022}, + volume={33}, + number={4}, + pages={805-817}, + doi={10.1109/TPDS.2021.3097283}} +```` + +If you use more than one Kokkos EcoSystem package, please also cite: + +````BibTex +@ARTICLE{9502936, + author={Trott, Christian and Berger-Vergiat, Luc and Poliakoff, David and Rajamanickam, Sivasankaran and Lebrun-Grandie, Damien and Madsen, Jonathan and Al Awar, Nader and Gligoric, Milos and Shipman, Galen and Womeldorff, Geoff}, + journal={Computing in Science Engineering}, + title={The Kokkos EcoSystem: Comprehensive Performance Portability for High Performance Computing}, + year={2021}, + volume={23}, + number={5}, + pages={10-18}, + doi={10.1109/MCSE.2021.3098509}} +```` + + +And if you feel generous: feel free to cite the original Kokkos paper which describes most of the basic Kokkos concepts: + ````BibTeX @article{CarterEdwards20143202, title = "Kokkos: Enabling manycore performance portability through polymorphic memory access patterns ", diff --git a/packages/kokkos/algorithms/CMakeLists.txt b/packages/kokkos/algorithms/CMakeLists.txt index 4df76a1dbbd1..eb54db8a5564 100644 --- a/packages/kokkos/algorithms/CMakeLists.txt +++ b/packages/kokkos/algorithms/CMakeLists.txt @@ -5,9 +5,7 @@ KOKKOS_SUBPACKAGE(Algorithms) IF (NOT Kokkos_INSTALL_TESTING) ADD_SUBDIRECTORY(src) ENDIF() -IF(NOT (KOKKOS_ENABLE_OPENMPTARGET - AND (KOKKOS_CXX_COMPILER_ID STREQUAL PGI OR - KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC))) +IF(NOT (KOKKOS_ENABLE_OPENMPTARGET AND KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC)) KOKKOS_ADD_TEST_DIRECTORIES(unit_tests) ENDIF() diff --git a/packages/kokkos/algorithms/src/Kokkos_Random.hpp b/packages/kokkos/algorithms/src/Kokkos_Random.hpp index 55ce19971faf..46b8ab87fabf 100644 --- a/packages/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/packages/kokkos/algorithms/src/Kokkos_Random.hpp @@ -447,6 +447,25 @@ struct rand { } }; +#if defined(KOKKOS_HALF_T_IS_FLOAT) && !KOKKOS_HALF_T_IS_FLOAT +template +struct rand { + using half = Kokkos::Experimental::half_t; + KOKKOS_INLINE_FUNCTION + static half max() { return half(1.0); } + KOKKOS_INLINE_FUNCTION + static half draw(Generator& gen) { return half(gen.frand()); } + KOKKOS_INLINE_FUNCTION + static half draw(Generator& gen, const half& range) { + return half(gen.frand(float(range))); + } + KOKKOS_INLINE_FUNCTION + static half draw(Generator& gen, const half& start, const half& end) { + return half(gen.frand(float(start), float(end))); + } +}; +#endif // defined(KOKKOS_HALF_T_IS_FLOAT) && !KOKKOS_HALF_T_IS_FLOAT + template struct rand { KOKKOS_INLINE_FUNCTION @@ -600,7 +619,7 @@ struct Random_XorShift1024_UseCArrayState template struct Random_UniqueIndex { - using locks_view_type = View; + using locks_view_type = View; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type) { #ifdef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST @@ -615,7 +634,7 @@ struct Random_UniqueIndex { #ifdef KOKKOS_ENABLE_CUDA template <> struct Random_UniqueIndex { - using locks_view_type = View; + using locks_view_type = View; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks_) { #ifdef __CUDA_ARCH__ @@ -625,7 +644,7 @@ struct Random_UniqueIndex { blockDim.x * blockDim.y * blockDim.z + i_offset) % locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i), 0, 1)) { + while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { i += blockDim.x * blockDim.y * blockDim.z; if (i >= static_cast(locks_.extent(0))) { i = i_offset; @@ -643,7 +662,7 @@ struct Random_UniqueIndex { #ifdef KOKKOS_ENABLE_HIP template <> struct Random_UniqueIndex { - using locks_view_type = View; + using locks_view_type = View; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks_) { #ifdef __HIP_DEVICE_COMPILE__ @@ -653,7 +672,7 @@ struct Random_UniqueIndex { blockDim.x * blockDim.y * blockDim.z + i_offset) % locks_.extent(0); - while (Kokkos::atomic_compare_exchange(&locks_(i), 0, 1)) { + while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { i += blockDim.x * blockDim.y * blockDim.z; if (i >= static_cast(locks_.extent(0))) { i = i_offset; @@ -671,15 +690,15 @@ struct Random_UniqueIndex { #ifdef KOKKOS_ENABLE_SYCL template <> struct Random_UniqueIndex { - using locks_view_type = View; + using locks_view_type = View; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks_) { -#ifdef KOKKOS_ARCH_INTEL_GEN +#ifdef KOKKOS_ARCH_INTEL_GPU int i = Kokkos::Impl::clock_tic() % locks_.extent(0); #else int i = 0; #endif - while (Kokkos::atomic_compare_exchange(&locks_(i), 0, 1)) { + while (Kokkos::atomic_compare_exchange(&locks_(i, 0), 0, 1)) { i = (i + 1) % static_cast(locks_.extent(0)); } return i; @@ -690,14 +709,14 @@ struct Random_UniqueIndex { #ifdef KOKKOS_ENABLE_OPENMPTARGET template <> struct Random_UniqueIndex { - using locks_view_type = View; + using locks_view_type = View; KOKKOS_FUNCTION static int get_state_idx(const locks_view_type& locks) { const int team_size = omp_get_num_threads(); int i = omp_get_team_num() * team_size + omp_get_thread_num(); const int lock_size = locks.extent_int(0); - while (Kokkos::atomic_compare_exchange(&locks(i), 0, 1)) { + while (Kokkos::atomic_compare_exchange(&locks(i, 0), 0, 1)) { i = (i + 1) % lock_size; } return i; @@ -856,18 +875,22 @@ template class Random_XorShift64_Pool { private: using execution_space = typename DeviceType::execution_space; - using locks_type = View; - using state_data_type = View; + using locks_type = View; + using state_data_type = View; locks_type locks_; state_data_type state_; int num_states_; + int padding_; public: using generator_type = Random_XorShift64; using device_type = DeviceType; KOKKOS_INLINE_FUNCTION - Random_XorShift64_Pool() { num_states_ = 0; } + Random_XorShift64_Pool() { + num_states_ = 0; + padding_ = 0; + } Random_XorShift64_Pool(uint64_t seed) { num_states_ = 0; @@ -883,16 +906,22 @@ class Random_XorShift64_Pool { locks_ = src.locks_; state_ = src.state_; num_states_ = src.num_states_; + padding_ = src.padding_; return *this; } void init(uint64_t seed, int num_states) { if (seed == 0) seed = uint64_t(1318319); - + // I only want to pad on CPU like archs (less than 1000 threads). 64 is a + // magic number, or random number I just wanted something not too large and + // not too small. 64 sounded fine. + padding_ = num_states < 1000 ? 64 : 1; num_states_ = num_states; - locks_ = locks_type("Kokkos::Random_XorShift64::locks", num_states_); - state_ = state_data_type("Kokkos::Random_XorShift64::state", num_states_); + locks_ = + locks_type("Kokkos::Random_XorShift64::locks", num_states, padding_); + state_ = state_data_type("Kokkos::Random_XorShift64::state", num_states_, + padding_); typename state_data_type::HostMirror h_state = create_mirror_view(state_); typename locks_type::HostMirror h_lock = create_mirror_view(locks_); @@ -902,15 +931,15 @@ class Random_XorShift64_Pool { gen(seed, 0); for (int i = 0; i < 17; i++) gen.rand(); for (int i = 0; i < num_states_; i++) { - int n1 = gen.rand(); - int n2 = gen.rand(); - int n3 = gen.rand(); - int n4 = gen.rand(); - h_state(i) = (((static_cast(n1)) & 0xffff) << 00) | - (((static_cast(n2)) & 0xffff) << 16) | - (((static_cast(n3)) & 0xffff) << 32) | - (((static_cast(n4)) & 0xffff) << 48); - h_lock(i) = 0; + int n1 = gen.rand(); + int n2 = gen.rand(); + int n3 = gen.rand(); + int n4 = gen.rand(); + h_state(i, 0) = (((static_cast(n1)) & 0xffff) << 00) | + (((static_cast(n2)) & 0xffff) << 16) | + (((static_cast(n3)) & 0xffff) << 32) | + (((static_cast(n4)) & 0xffff) << 48); + h_lock(i, 0) = 0; } deep_copy(state_, h_state); deep_copy(locks_, h_lock); @@ -920,19 +949,19 @@ class Random_XorShift64_Pool { Random_XorShift64 get_state() const { const int i = Impl::Random_UniqueIndex::get_state_idx(locks_); - return Random_XorShift64(state_(i), i); + return Random_XorShift64(state_(i, 0), i); } // NOTE: state_idx MUST be unique and less than num_states KOKKOS_INLINE_FUNCTION Random_XorShift64 get_state(const int state_idx) const { - return Random_XorShift64(state_(state_idx), state_idx); + return Random_XorShift64(state_(state_idx, 0), state_idx); } KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift64& state) const { - state_(state.state_idx_) = state.state_; - locks_(state.state_idx_) = 0; + state_(state.state_idx_, 0) = state.state_; + locks_(state.state_idx_, 0) = 0; } }; @@ -1092,14 +1121,15 @@ template class Random_XorShift1024_Pool { private: using execution_space = typename DeviceType::execution_space; - using locks_type = View; - using int_view_type = View; + using locks_type = View; + using int_view_type = View; using state_data_type = View; locks_type locks_; state_data_type state_; int_view_type p_; int num_states_; + int padding_; friend class Random_XorShift1024; public: @@ -1129,15 +1159,21 @@ class Random_XorShift1024_Pool { state_ = src.state_; p_ = src.p_; num_states_ = src.num_states_; + padding_ = src.padding_; return *this; } inline void init(uint64_t seed, int num_states) { if (seed == 0) seed = uint64_t(1318319); + // I only want to pad on CPU like archs (less than 1000 threads). 64 is a + // magic number, or random number I just wanted something not too large and + // not too small. 64 sounded fine. + padding_ = num_states < 1000 ? 64 : 1; num_states_ = num_states; - locks_ = locks_type("Kokkos::Random_XorShift1024::locks", num_states_); + locks_ = + locks_type("Kokkos::Random_XorShift1024::locks", num_states_, padding_); state_ = state_data_type("Kokkos::Random_XorShift1024::state", num_states_); - p_ = int_view_type("Kokkos::Random_XorShift1024::p", num_states_); + p_ = int_view_type("Kokkos::Random_XorShift1024::p", num_states_, padding_); typename state_data_type::HostMirror h_state = create_mirror_view(state_); typename locks_type::HostMirror h_lock = create_mirror_view(locks_); @@ -1158,8 +1194,8 @@ class Random_XorShift1024_Pool { (((static_cast(n3)) & 0xffff) << 32) | (((static_cast(n4)) & 0xffff) << 48); } - h_p(i) = 0; - h_lock(i) = 0; + h_p(i, 0) = 0; + h_lock(i, 0) = 0; } deep_copy(state_, h_state); deep_copy(locks_, h_lock); @@ -1169,20 +1205,20 @@ class Random_XorShift1024_Pool { Random_XorShift1024 get_state() const { const int i = Impl::Random_UniqueIndex::get_state_idx(locks_); - return Random_XorShift1024(state_, p_(i), i); + return Random_XorShift1024(state_, p_(i, 0), i); }; // NOTE: state_idx MUST be unique and less than num_states KOKKOS_INLINE_FUNCTION Random_XorShift1024 get_state(const int state_idx) const { - return Random_XorShift1024(state_, p_(state_idx), state_idx); + return Random_XorShift1024(state_, p_(state_idx, 0), state_idx); } KOKKOS_INLINE_FUNCTION void free_state(const Random_XorShift1024& state) const { for (int i = 0; i < 16; i++) state_(state.state_idx_, i) = state.state_[i]; - p_(state.state_idx_) = state.p_; - locks_(state.state_idx_) = 0; + p_(state.state_idx_, 0) = state.p_; + locks_(state.state_idx_, 0) = 0; } }; diff --git a/packages/kokkos/algorithms/src/Kokkos_Sort.hpp b/packages/kokkos/algorithms/src/Kokkos_Sort.hpp index d17c02776ff5..7c1ce4c4cd8e 100644 --- a/packages/kokkos/algorithms/src/Kokkos_Sort.hpp +++ b/packages/kokkos/algorithms/src/Kokkos_Sort.hpp @@ -319,7 +319,7 @@ class BinSort { Kokkos::RangePolicy(0, len), functor); } - execution_space().fence(); + execution_space().fence("Kokkos::Sort: fence after sorting"); } template @@ -492,7 +492,8 @@ bool try_std_sort(ViewType view) { view.stride_3(), view.stride_4(), view.stride_5(), view.stride_6(), view.stride_7()}; possible = possible && - std::is_same::value; + SpaceAccessibility::accessible; possible = possible && (ViewType::Rank == 1); possible = possible && (stride[0] == 1); if (possible) { diff --git a/packages/kokkos/algorithms/unit_tests/TestRandom.hpp b/packages/kokkos/algorithms/unit_tests/TestRandom.hpp index c37e779c9927..3dffce7df4f8 100644 --- a/packages/kokkos/algorithms/unit_tests/TestRandom.hpp +++ b/packages/kokkos/algorithms/unit_tests/TestRandom.hpp @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include @@ -198,11 +198,50 @@ struct test_random_functor { static_cast(1.0 * HIST_DIM3D * tmp2 / theMax); const uint64_t ind3_3d = static_cast(1.0 * HIST_DIM3D * tmp3 / theMax); - +// Workaround Intel 17 compiler bug which sometimes add random +// instruction alignment which makes the lock instruction +// illegal. Seems to be mostly just for unsigned int atomics. +// Looking at the assembly the compiler +// appears to insert cache line alignment for the instruction. +// Isn't restricted to specific archs. Seen it on SNB and SKX, but for +// different code. Another occurrence was with Desul atomics in +// a different unit test. This one here happens without desul atomics. +// Inserting an assembly nop instruction changes the alignment and +// works round this. +// +// 17.0.4 for 64bit Random works with 1/1/1/2/1 +// 17.0.4 for 1024bit Random works with 1/1/1/1/1 +#ifdef KOKKOS_COMPILER_INTEL +#if (KOKKOS_COMPILER_INTEL < 1800) + asm volatile("nop\n"); +#endif +#endif atomic_fetch_add(&density_1d(ind1_1d), 1); +#ifdef KOKKOS_COMPILER_INTEL +#if (KOKKOS_COMPILER_INTEL < 1800) + asm volatile("nop\n"); +#endif +#endif atomic_fetch_add(&density_1d(ind2_1d), 1); +#ifdef KOKKOS_COMPILER_INTEL +#if (KOKKOS_COMPILER_INTEL < 1800) + asm volatile("nop\n"); +#endif +#endif atomic_fetch_add(&density_1d(ind3_1d), 1); +#ifdef KOKKOS_COMPILER_INTEL +#if (KOKKOS_COMPILER_INTEL < 1800) + if (std::is_same>::value) + asm volatile("nop\n"); + asm volatile("nop\n"); +#endif +#endif atomic_fetch_add(&density_3d(ind1_3d, ind2_3d, ind3_3d), 1); +#ifdef KOKKOS_COMPILER_INTEL +#if (KOKKOS_COMPILER_INTEL < 1800) + asm volatile("nop\n"); +#endif +#endif } rand_pool.free_state(rand_gen); } @@ -338,9 +377,11 @@ struct test_random_scalar { using functor_type = test_histogram1d_functor; parallel_reduce(HIST_DIM1D, functor_type(density_1d, num_draws), result); - - double tolerance = 6 * std::sqrt(1.0 / HIST_DIM1D); - double mean_expect = 1.0 * num_draws * 3 / HIST_DIM1D; + double mean_eps_expect = 0.0001; + double variance_eps_expect = 0.07; + double covariance_eps_expect = 0.06; + double tolerance = 6 * std::sqrt(1.0 / HIST_DIM1D); + double mean_expect = 1.0 * num_draws * 3 / HIST_DIM1D; double variance_expect = 1.0 * num_draws * 3 / HIST_DIM1D * (1.0 - 1.0 / HIST_DIM1D); double covariance_expect = -1.0 * num_draws * 3 / HIST_DIM1D / HIST_DIM1D; @@ -349,11 +390,26 @@ struct test_random_scalar { variance_expect / (result.variance / HIST_DIM1D) - 1.0; double covariance_eps = (result.covariance / HIST_DIM1D - covariance_expect) / mean_expect; - pass_hist1d_mean = ((-0.0001 < mean_eps) && (0.0001 > mean_eps)) ? 1 : 0; - pass_hist1d_var = - ((-0.07 < variance_eps) && (0.07 > variance_eps)) ? 1 : 0; - pass_hist1d_covar = - ((-0.06 < covariance_eps) && (0.06 > covariance_eps)) ? 1 : 0; + +#if defined(KOKKOS_HALF_T_IS_FLOAT) && !KOKKOS_HALF_T_IS_FLOAT + if (std::is_same::value) { + mean_eps_expect = 0.0003; + variance_eps_expect = 1.0; + covariance_eps_expect = 5.0e4; + } +#endif + + pass_hist1d_mean = + ((-mean_eps_expect < mean_eps) && (mean_eps_expect > mean_eps)) ? 1 + : 0; + pass_hist1d_var = ((-variance_eps_expect < variance_eps) && + (variance_eps_expect > variance_eps)) + ? 1 + : 0; + pass_hist1d_covar = ((-covariance_eps_expect < covariance_eps) && + (covariance_eps_expect > covariance_eps)) + ? 1 + : 0; cout << "Density 1D: " << mean_eps << " " << variance_eps << " " << (result.covariance / HIST_DIM1D / HIST_DIM1D) << " || " @@ -371,8 +427,9 @@ struct test_random_scalar { test_histogram3d_functor; parallel_reduce(HIST_DIM1D, functor_type(density_3d, num_draws), result); - double tolerance = 6 * std::sqrt(1.0 / HIST_DIM1D); - double mean_expect = 1.0 * num_draws / HIST_DIM1D; + double variance_factor = 1.2; + double tolerance = 6 * std::sqrt(1.0 / HIST_DIM1D); + double mean_expect = 1.0 * num_draws / HIST_DIM1D; double variance_expect = 1.0 * num_draws / HIST_DIM1D * (1.0 - 1.0 / HIST_DIM1D); double covariance_expect = -1.0 * num_draws / HIST_DIM1D / HIST_DIM1D; @@ -381,15 +438,23 @@ struct test_random_scalar { variance_expect / (result.variance / HIST_DIM1D) - 1.0; double covariance_eps = (result.covariance / HIST_DIM1D - covariance_expect) / mean_expect; + +#if defined(KOKKOS_HALF_T_IS_FLOAT) && !KOKKOS_HALF_T_IS_FLOAT + if (std::is_same::value) { + variance_factor = 7; + } +#endif + pass_hist3d_mean = ((-tolerance < mean_eps) && (tolerance > mean_eps)) ? 1 : 0; - pass_hist3d_var = ((-1.2 * tolerance < variance_eps) && - (1.2 * tolerance > variance_eps)) + pass_hist3d_var = ((-variance_factor * tolerance < variance_eps) && + (variance_factor * tolerance > variance_eps)) ? 1 : 0; - pass_hist3d_covar = - ((-tolerance < covariance_eps) && (tolerance > covariance_eps)) ? 1 - : 0; + pass_hist3d_covar = ((-variance_factor * tolerance < covariance_eps) && + (variance_factor * tolerance > covariance_eps)) + ? 1 + : 0; cout << "Density 3D: " << mean_eps << " " << variance_eps << " " << result.covariance / HIST_DIM1D / HIST_DIM1D << " || " << tolerance @@ -471,6 +536,21 @@ void test_random(unsigned int num_draws) { deep_copy(density_1d, 0); deep_copy(density_3d, 0); + cout << "Test Scalar=half" << endl; + test_random_scalar test_half( + density_1d, density_3d, pool, num_draws); + ASSERT_EQ(test_half.pass_mean, 1); + ASSERT_EQ(test_half.pass_var, 1); + ASSERT_EQ(test_half.pass_covar, 1); + ASSERT_EQ(test_half.pass_hist1d_mean, 1); + ASSERT_EQ(test_half.pass_hist1d_var, 1); + ASSERT_EQ(test_half.pass_hist1d_covar, 1); + ASSERT_EQ(test_half.pass_hist3d_mean, 1); + ASSERT_EQ(test_half.pass_hist3d_var, 1); + ASSERT_EQ(test_half.pass_hist3d_covar, 1); + deep_copy(density_1d, 0); + deep_copy(density_3d, 0); + cout << "Test Scalar=float" << endl; test_random_scalar test_float(density_1d, density_3d, pool, num_draws); diff --git a/packages/kokkos/appveyor.yml b/packages/kokkos/appveyor.yml index e8763c0b665c..73a0d3187596 100644 --- a/packages/kokkos/appveyor.yml +++ b/packages/kokkos/appveyor.yml @@ -3,4 +3,8 @@ image: clone_folder: c:\projects\source build_script: - cmd: >- - cmake c:\projects\source -DKokkos_ENABLE_TESTS=ON -DCMAKE_CXX_FLAGS="/W0 /EHsc /d1reportClassLayoutChanges" -DCTEST_ARGS="-C Debug -V --output-on-failure" -DBUILD_NAME=MSVC-2019 -DBUILD_TYPE=Debug -DSITE=AppVeyor -DTARGET=install -P cmake/KokkosCI.cmake + mkdir build && + cd build && + cmake c:\projects\source -DKokkos_ENABLE_TESTS=ON -DCMAKE_CXX_FLAGS="/W0 /EHsc" -DKokkos_ENABLE_DEPRECATED_CODE_3=ON -DKokkos_ENABLE_DEPRECATION_WARNINGS=OFF && + cmake --build . --target install && + ctest -C Debug --output-on-failure diff --git a/packages/kokkos/benchmarks/atomic/main.cpp b/packages/kokkos/benchmarks/atomic/main.cpp index 7b5caa1aee16..cc0d3e41e85a 100644 --- a/packages/kokkos/benchmarks/atomic/main.cpp +++ b/packages/kokkos/benchmarks/atomic/main.cpp @@ -1,12 +1,12 @@ #include -#include +#include #include template double test_atomic(int L, int N, int M, int K, int R, Kokkos::View offsets) { Kokkos::View output("Output", N); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int r = 0; r < R; r++) Kokkos::parallel_for( @@ -28,7 +28,7 @@ template double test_no_atomic(int L, int N, int M, int K, int R, Kokkos::View offsets) { Kokkos::View output("Output", N); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; for (int r = 0; r < R; r++) Kokkos::parallel_for( L, KOKKOS_LAMBDA(const int& i) { diff --git a/packages/kokkos/benchmarks/bytes_and_flops/bench.hpp b/packages/kokkos/benchmarks/bytes_and_flops/bench.hpp index 62d7ef4a4cf3..4fc6ca2c68b3 100644 --- a/packages/kokkos/benchmarks/bytes_and_flops/bench.hpp +++ b/packages/kokkos/benchmarks/bytes_and_flops/bench.hpp @@ -43,7 +43,7 @@ */ #include -#include +#include template struct Run { diff --git a/packages/kokkos/benchmarks/bytes_and_flops/main.cpp b/packages/kokkos/benchmarks/bytes_and_flops/main.cpp index 6da2407a08b7..75f30a340938 100644 --- a/packages/kokkos/benchmarks/bytes_and_flops/main.cpp +++ b/packages/kokkos/benchmarks/bytes_and_flops/main.cpp @@ -43,7 +43,7 @@ */ #include -#include +#include #include #include diff --git a/packages/kokkos/benchmarks/gather/main.cpp b/packages/kokkos/benchmarks/gather/main.cpp index 5f10e4dcc1aa..dd502faaa480 100644 --- a/packages/kokkos/benchmarks/gather/main.cpp +++ b/packages/kokkos/benchmarks/gather/main.cpp @@ -43,7 +43,7 @@ */ #include -#include +#include #include #include diff --git a/packages/kokkos/benchmarks/stream/stream-kokkos.cpp b/packages/kokkos/benchmarks/stream/stream-kokkos.cpp index e7ef67e0805c..311947c197cb 100644 --- a/packages/kokkos/benchmarks/stream/stream-kokkos.cpp +++ b/packages/kokkos/benchmarks/stream/stream-kokkos.cpp @@ -52,35 +52,33 @@ #define HLINE "-------------------------------------------------------------\n" -#if defined(KOKKOS_ENABLE_CUDA) -using StreamHostArray = Kokkos::View::HostMirror; -using StreamDeviceArray = Kokkos::View; -#else -using StreamHostArray = Kokkos::View::HostMirror; -using StreamDeviceArray = Kokkos::View; -#endif +using StreamDeviceArray = + Kokkos::View>; +using StreamHostArray = typename StreamDeviceArray::HostMirror; using StreamIndex = int; +using Policy = Kokkos::RangePolicy>; -double now() { - struct timeval now; - gettimeofday(&now, nullptr); +void perform_set(StreamDeviceArray& a, const double scalar) { + Kokkos::parallel_for( + "set", Policy(0, a.extent(0)), + KOKKOS_LAMBDA(const StreamIndex i) { a[i] = scalar; }); - return (double)now.tv_sec + ((double)now.tv_usec * 1.0e-6); + Kokkos::fence(); } -void perform_copy(StreamDeviceArray& a, StreamDeviceArray& b, - StreamDeviceArray& c) { +void perform_copy(StreamDeviceArray& a, StreamDeviceArray& b) { Kokkos::parallel_for( - "copy", a.extent(0), KOKKOS_LAMBDA(const StreamIndex i) { c[i] = a[i]; }); + "copy", Policy(0, a.extent(0)), + KOKKOS_LAMBDA(const StreamIndex i) { b[i] = a[i]; }); Kokkos::fence(); } -void perform_scale(StreamDeviceArray& a, StreamDeviceArray& b, - StreamDeviceArray& c, const double scalar) { +void perform_scale(StreamDeviceArray& b, StreamDeviceArray& c, + const double scalar) { Kokkos::parallel_for( - "copy", a.extent(0), + "scale", Policy(0, b.extent(0)), KOKKOS_LAMBDA(const StreamIndex i) { b[i] = scalar * c[i]; }); Kokkos::fence(); @@ -89,7 +87,7 @@ void perform_scale(StreamDeviceArray& a, StreamDeviceArray& b, void perform_add(StreamDeviceArray& a, StreamDeviceArray& b, StreamDeviceArray& c) { Kokkos::parallel_for( - "add", a.extent(0), + "add", Policy(0, a.extent(0)), KOKKOS_LAMBDA(const StreamIndex i) { c[i] = a[i] + b[i]; }); Kokkos::fence(); @@ -98,7 +96,7 @@ void perform_add(StreamDeviceArray& a, StreamDeviceArray& b, void perform_triad(StreamDeviceArray& a, StreamDeviceArray& b, StreamDeviceArray& c, const double scalar) { Kokkos::parallel_for( - "triad", a.extent(0), + "triad", Policy(0, a.extent(0)), KOKKOS_LAMBDA(const StreamIndex i) { a[i] = b[i] + scalar * c[i]; }); Kokkos::fence(); @@ -184,6 +182,7 @@ int run_benchmark() { const double scalar = 3.0; + double setTime = std::numeric_limits::max(); double copyTime = std::numeric_limits::max(); double scaleTime = std::numeric_limits::max(); double addTime = std::numeric_limits::max(); @@ -191,13 +190,10 @@ int run_benchmark() { printf("Initializing Views...\n"); -#if defined(KOKKOS_HAVE_OPENMP) - Kokkos::parallel_for( - "init", Kokkos::RangePolicy(0, STREAM_ARRAY_SIZE), -#else Kokkos::parallel_for( - "init", Kokkos::RangePolicy(0, STREAM_ARRAY_SIZE), -#endif + "init", + Kokkos::RangePolicy(0, + STREAM_ARRAY_SIZE), KOKKOS_LAMBDA(const int i) { a[i] = 1.0; b[i] = 2.0; @@ -209,26 +205,30 @@ int run_benchmark() { Kokkos::deep_copy(dev_b, b); Kokkos::deep_copy(dev_c, c); - double start; - printf("Starting benchmarking...\n"); + Kokkos::Timer timer; + for (StreamIndex k = 0; k < STREAM_NTIMES; ++k) { - start = now(); - perform_copy(dev_a, dev_b, dev_c); - copyTime = std::min(copyTime, (now() - start)); + timer.reset(); + perform_set(dev_c, 1.5); + setTime = std::min(setTime, timer.seconds()); + + timer.reset(); + perform_copy(dev_a, dev_c); + copyTime = std::min(copyTime, timer.seconds()); - start = now(); - perform_scale(dev_a, dev_b, dev_c, scalar); - scaleTime = std::min(scaleTime, (now() - start)); + timer.reset(); + perform_scale(dev_b, dev_c, scalar); + scaleTime = std::min(scaleTime, timer.seconds()); - start = now(); + timer.reset(); perform_add(dev_a, dev_b, dev_c); - addTime = std::min(addTime, (now() - start)); + addTime = std::min(addTime, timer.seconds()); - start = now(); + timer.reset(); perform_triad(dev_a, dev_b, dev_c, scalar); - triadTime = std::min(triadTime, (now() - start)); + triadTime = std::min(triadTime, timer.seconds()); } Kokkos::deep_copy(a, dev_a); @@ -240,6 +240,9 @@ int run_benchmark() { printf(HLINE); + printf("Set %11.2f MB/s\n", + (1.0e-06 * 1.0 * (double)sizeof(double) * (double)STREAM_ARRAY_SIZE) / + setTime); printf("Copy %11.2f MB/s\n", (1.0e-06 * 2.0 * (double)sizeof(double) * (double)STREAM_ARRAY_SIZE) / copyTime); diff --git a/packages/kokkos/bin/hpcbind b/packages/kokkos/bin/hpcbind index 6af091a7d8b6..43f8a745da27 100755 --- a/packages/kokkos/bin/hpcbind +++ b/packages/kokkos/bin/hpcbind @@ -634,15 +634,15 @@ elif [[ ${HPCBIND_HAS_COMMAND} -eq 1 ]]; then > ${HPCBIND_OUT} if [[ ${HPCBIND_TEE} -eq 0 ]]; then if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then - hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- $@ > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} + hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- "$@" > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} else - eval $@ > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} + eval "$@" > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} fi else if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then - hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- $@ > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) + hwloc-bind "${HPCBIND_HWLOC_CPUSET}" -- "$@" > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) else - eval $@ > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) + eval "$@" > >(tee ${HPCBIND_OUT}) 2> >(tee ${HPCBIND_ERR} >&2) fi fi fi diff --git a/packages/kokkos/bin/nvcc_wrapper b/packages/kokkos/bin/nvcc_wrapper index 4e52e4d09f4f..ba2c55508aca 100755 --- a/packages/kokkos/bin/nvcc_wrapper +++ b/packages/kokkos/bin/nvcc_wrapper @@ -96,7 +96,7 @@ replace_pragma_ident=0 first_xcompiler_arg=1 # Allow for setting temp dir without setting TMPDIR in parent (see https://docs.olcf.ornl.gov/systems/summit_user_guide.html#setting-tmpdir-causes-jsm-jsrun-errors-job-state-flip-flop) -if [[ ! -z ${NVCC_WRAPPER_TMPDIR+x} ]]; then +if [[ -z ${NVCC_WRAPPER_TMPDIR+x} ]]; then temp_dir=${TMPDIR:-/tmp} else temp_dir=${NVCC_WRAPPER_TMPDIR+x} @@ -226,14 +226,14 @@ do cuda_args="$cuda_args $1" ;; #Handle more known nvcc args - --expt-extended-lambda|--expt-relaxed-constexpr|--Wno-deprecated-gpu-targets|-Wno-deprecated-gpu-targets) + --expt-extended-lambda|--expt-relaxed-constexpr|--Wno-deprecated-gpu-targets|-Wno-deprecated-gpu-targets|-allow-unsupported-compiler|--allow-unsupported-compiler) cuda_args="$cuda_args $1" ;; #Handle known nvcc args that have an argument - -maxrregcount=*|--maxrregcount=*) + -maxrregcount=*|--maxrregcount=*|-time=*) cuda_args="$cuda_args $1" ;; - -maxrregcount|--default-stream|-Xnvlink|--fmad|-cudart|--cudart|-include) + -maxrregcount|--default-stream|-Xnvlink|--fmad|-cudart|--cudart|-include|-time) cuda_args="$cuda_args $1 $2" shift ;; @@ -552,14 +552,14 @@ if [ $host_only -eq 1 ]; then $host_command elif [ -n "$nvcc_depfile_command" ]; then if [ "$NVCC_WRAPPER_SHOW_COMMANDS_BEING_RUN" == "1" ] ; then - echo "$nvcc_command && $nvcc_depfile_command" + echo "TMPDIR=${temp_dir} $nvcc_command && TMPDIR=${temp_dir} $nvcc_depfile_command" fi - $nvcc_command && $nvcc_depfile_command + TMPDIR=${temp_dir} $nvcc_command && TMPDIR=${temp_dir} $nvcc_depfile_command else if [ "$NVCC_WRAPPER_SHOW_COMMANDS_BEING_RUN" == "1" ] ; then - echo "$nvcc_command" + echo "TMPDIR=${temp_dir} $nvcc_command" fi - $nvcc_command + TMPDIR=${temp_dir} $nvcc_command fi error_code=$? diff --git a/packages/kokkos/cmake/CTestConfig.cmake.in b/packages/kokkos/cmake/CTestConfig.cmake.in deleted file mode 100644 index 1f82c0d64d15..000000000000 --- a/packages/kokkos/cmake/CTestConfig.cmake.in +++ /dev/null @@ -1,91 +0,0 @@ -#----------------------------------------------------------------------------------------# -# -# CTestConfig.cmake template for Kokkos -# -#----------------------------------------------------------------------------------------# - -# -# dash-board related -# -set(CTEST_PROJECT_NAME "Kokkos") -set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC") -set(CTEST_DROP_METHOD "https") -set(CTEST_DROP_SITE "cdash.nersc.gov") -set(CTEST_DROP_LOCATION "/submit.php?project=${CTEST_PROJECT_NAME}") -set(CTEST_CDASH_VERSION "1.6") -set(CTEST_CDASH_QUERY_VERSION TRUE) -set(CTEST_SUBMIT_RETRY_COUNT "1") -set(CTEST_SUBMIT_RETRY_DELAY "30") - -# -# configure/build related -# -set(CTEST_BUILD_NAME "@BUILD_NAME@") -set(CTEST_MODEL "@MODEL@") -set(CTEST_SITE "@SITE@") -set(CTEST_CONFIGURATION_TYPE "@BUILD_TYPE@") -set(CTEST_SOURCE_DIRECTORY "@SOURCE_REALDIR@") -set(CTEST_BINARY_DIRECTORY "@BINARY_REALDIR@") - -# -# configure/build related -# -set(CTEST_UPDATE_TYPE "git") -set(CTEST_UPDATE_VERSION_ONLY ON) -# set(CTEST_GENERATOR "") -# set(CTEST_GENERATOR_PLATFORM "") - -# -# testing related -# -set(CTEST_TIMEOUT "7200") -set(CTEST_TEST_TIMEOUT "7200") -set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS "100") -set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS "100") -set(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE "1048576") - -# -# coverage related -# -set(CTEST_CUSTOM_COVERAGE_EXCLUDE ".*tpls/.*;/usr/.*;.*unit_test/.*;.*unit_tests/.*;.*perf_test/.*") - -# -# commands -# -if(NOT "@CHECKOUT_COMMAND@" STREQUAL "") - set(CTEST_CHECKOUT_COMMAND "@CHECKOUT_COMMAND@") -endif() -set(CTEST_UPDATE_COMMAND "@GIT_EXECUTABLE@") -set(CTEST_CONFIGURE_COMMAND "@CMAKE_COMMAND@ -DCMAKE_BUILD_TYPE=@BUILD_TYPE@ -DKokkos_ENABLE_TESTS=ON @CONFIG_ARGS@ @SOURCE_REALDIR@") -set(CTEST_BUILD_COMMAND "@CMAKE_COMMAND@ --build @BINARY_REALDIR@ --target @TARGET@") -if(NOT WIN32) - set(CTEST_BUILD_COMMAND "${CTEST_BUILD_COMMAND} -- -j@BUILD_JOBS@") -endif() -set(CTEST_COVERAGE_COMMAND "gcov") -set(CTEST_MEMORYCHECK_COMMAND "valgrind") -set(CTEST_GIT_COMMAND "@GIT_EXECUTABLE@") - -# -# various configs -# -set(APPEND_VALUE @APPEND@) -if(APPEND_VALUE) - set(APPEND_CTEST APPEND) -endif() - -macro(SET_TEST_PROP VAR) - if(NOT "${ARGS}" STREQUAL "") - set(${VAR}_CTEST ${VAR} ${ARGN}) - endif() -endmacro() - -set_test_prop(START @START@) -set_test_prop(END @END@) -set_test_prop(STRIDE @STRIDE@) -set_test_prop(INCLUDE @INCLUDE@) -set_test_prop(EXCLUDE @EXCLUDE@) -set_test_prop(INCLUDE_LABEL @INCLUDE_LABEL@) -set_test_prop(EXCLUDE_LABEL @EXCLUDE_LABEL@) -set_test_prop(PARALLEL_LEVEL @PARALLEL_LEVEL@) -set_test_prop(STOP_TIME @STOP_TIME@) -set_test_prop(COVERAGE_LABELS @LABELS@) diff --git a/packages/kokkos/cmake/KokkosCI.cmake b/packages/kokkos/cmake/KokkosCI.cmake deleted file mode 100644 index e8c9af37ad54..000000000000 --- a/packages/kokkos/cmake/KokkosCI.cmake +++ /dev/null @@ -1,350 +0,0 @@ -cmake_minimum_required(VERSION 3.16 FATAL_ERROR) - -message(STATUS "") - -get_cmake_property(_cached_vars CACHE_VARIABLES) -set(KOKKOS_CMAKE_ARGS) -set(EXCLUDED_VARIABLES "CMAKE_COMMAND" "CMAKE_CPACK_COMMAND" "CMAKE_CTEST_COMMAND" "CMAKE_ROOT" - "CTEST_ARGS" "BUILD_NAME" "CMAKE_CXX_FLAGS" "CMAKE_BUILD_TYPE") -list(SORT _cached_vars) -foreach(_var ${_cached_vars}) - if(NOT "${_var}" IN_LIST EXCLUDED_VARIABLES) - list(APPEND KOKKOS_CMAKE_ARGS ${_var}) - if("${_var}" STREQUAL "CMAKE_BUILD_TYPE") - set(BUILD_TYPE "${CMAKE_BUILD_TYPE}") - endif() - endif() -endforeach() - - -#----------------------------------------------------------------------------------------# -# -# Macros and variables -# -#----------------------------------------------------------------------------------------# - -macro(CHECK_REQUIRED VAR) - if(NOT DEFINED ${VAR}) - message(FATAL_ERROR "Error! Variable '${VAR}' must be defined") - endif() -endmacro() - -# require the build name variable -CHECK_REQUIRED(BUILD_NAME) - -# uses all args -macro(SET_DEFAULT VAR) - if(NOT DEFINED ${VAR}) - set(${VAR} ${ARGN}) - endif() - # remove these ctest configuration variables from the defines - # passed to the Kokkos configuration - if("${VAR}" IN_LIST KOKKOS_CMAKE_ARGS) - list(REMOVE_ITEM KOKKOS_CMAKE_ARGS "${VAR}") - endif() -endmacro() - -# uses first arg -- useful for selecting via priority from multiple -# potentially defined variables, e.g.: -# -# set_default_arg1(BUILD_NAME ${TRAVIS_BUILD_NAME} ${BUILD_NAME}) -# -macro(SET_DEFAULT_ARG1 VAR) - if(NOT DEFINED ${VAR}) - foreach(_ARG ${ARGN}) - if(NOT "${_ARG}" STREQUAL "") - set(${VAR} ${_ARG}) - break() - endif() - endforeach() - endif() - # remove these ctest configuration variables from the defines - # passed to the Kokkos configuration - if("${VAR}" IN_LIST KOKKOS_CMAKE_ARGS) - list(REMOVE_ITEM KOKKOS_CMAKE_ARGS "${VAR}") - endif() -endmacro() - -# determine the default working directory -if(NOT "$ENV{WORKSPACE}" STREQUAL "") - set(WORKING_DIR "$ENV{WORKSPACE}") -else() - get_filename_component(WORKING_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) -endif() - -# determine the hostname -execute_process(COMMAND hostname - OUTPUT_VARIABLE HOSTNAME - OUTPUT_STRIP_TRAILING_WHITESPACE) - -SET_DEFAULT(HOSTNAME "$ENV{HOSTNAME}") - -# get the number of processors -include(ProcessorCount) -ProcessorCount(NUM_PROCESSORS) - -# find git -find_package(Git QUIET) -if(NOT GIT_EXECUTABLE) - unset(GIT_EXECUTABLE CACHE) - unset(GIT_EXECUTABLE) -endif() - -function(EXECUTE_GIT_COMMAND VAR) - set(${VAR} "" PARENT_SCOPE) - execute_process(COMMAND ${GIT_EXECUTABLE} ${ARGN} - OUTPUT_VARIABLE VAL - RESULT_VARIABLE RET - OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - ERROR_QUIET) - string(REPLACE ";" " " _CMD "${GIT_EXECUTABLE} ${ARGN}") - set(LAST_GIT_COMMAND "${_CMD}" PARENT_SCOPE) - if(RET EQUAL 0) - set(${VAR} "${VAL}" PARENT_SCOPE) - endif() -endfunction() - -# just gets the git branch name if available -function(GET_GIT_BRANCH_NAME VAR) - execute_git_command(GIT_BRANCH branch --show-current) - set(_INVALID "%D" "HEAD") - if(NOT GIT_BRANCH OR "${GIT_BRANCH}" IN_LIST _INVALID) - execute_git_command(GIT_BRANCH show -s --format=%D) - if(NOT GIT_BRANCH OR "${GIT_BRANCH}" IN_LIST _INVALID) - execute_git_command(GIT_BRANCH --describe all) - endif() - endif() - # - if(GIT_BRANCH) - string(REPLACE " " ";" _DESC "${GIT_BRANCH}") - # just set it to last one via loop instead of wonky cmake index manip - foreach(_ITR ${_DESC}) - set(GIT_BRANCH "${_ITR}") - endforeach() - set(${VAR} "${GIT_BRANCH}" PARENT_SCOPE) - message(STATUS "GIT BRANCH via '${LAST_GIT_COMMAND}': ${GIT_BRANCH}") - endif() -endfunction() - -# just gets the git branch name if available -function(GET_GIT_AUTHOR_NAME VAR) - execute_git_command(GIT_AUTHOR show -s --format=%an) - if(GIT_AUTHOR) - string(LENGTH "${GIT_AUTHOR}" STRLEN) - # if the build name gets too long, this can cause submission errors - if(STRLEN GREATER 24) - # remove middle initial - string(REGEX REPLACE " [A-Z]\. " " " GIT_AUTHOR "${GIT_AUTHOR}") - # get first and sur name - string(REGEX REPLACE "([A-Za-z]+) ([A-Za-z]+)" "\\1" F_NAME "${GIT_AUTHOR}") - string(REGEX REPLACE "([A-Za-z]+) ([A-Za-z]+)" "\\2" S_NAME "${GIT_AUTHOR}") - if(S_NAME) - set(GIT_AUTHOR "${S_NAME}") - elseif(F_NAME) - set(GIT_AUTHOR "${F_NAME}") - endif() - endif() - # remove any spaces, quotes, periods, etc. - string(REGEX REPLACE "[ ',;_\.\"]+" "" GIT_AUTHOR "${GIT_AUTHOR}") - set(${VAR} "${GIT_AUTHOR}" PARENT_SCOPE) - message(STATUS "GIT AUTHOR via '${LAST_GIT_COMMAND}': ${GIT_AUTHOR}") - endif() -endfunction() - -# get the name of the branch -GET_GIT_BRANCH_NAME(GIT_BRANCH) -# get the name of the author -GET_GIT_AUTHOR_NAME(GIT_AUTHOR) -# author, prefer git method for consistency -SET_DEFAULT_ARG1(AUTHOR ${GIT_AUTHOR} $ENV{GIT_AUTHOR} $ENV{AUTHOR}) -# SLUG == owner_name/repo_name -SET_DEFAULT_ARG1(SLUG $ENV{TRAVIS_PULL_REQUEST_SLUG} $ENV{TRAVIS_REPO_SLUG} $ENV{APPVEYOR_REPO_NAME} $ENV{PULL_REQUEST_SLUG} $ENV{REPO_SLUG}) -# branch name -SET_DEFAULT_ARG1(BRANCH $ENV{TRAVIS_PULL_REQUEST_BRANCH} $ENV{TRAVIS_BRANCH} $ENV{APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH} $ENV{APPVEYOR_REPO_BRANCH} $ENV{GIT_BRANCH} $ENV{BRANCH_NAME} $ENV{BRANCH} ${GIT_BRANCH}) -# pull request number -SET_DEFAULT_ARG1(PULL_REQUEST_NUM $ENV{TRAVIS_PULL_REQUEST} $ENV{CHANGE_ID} $ENV{APPVEYOR_PULL_REQUEST_NUMBER} $ENV{PULL_REQUEST_NUM}) -# get the event type, e.g. push, pull_request, api, cron, etc. -SET_DEFAULT_ARG1(EVENT_TYPE $ENV{TRAVIS_EVENT_TYPE} ${EVENT_TYPE}) - -if("${BRANCH}" STREQUAL "") - message(STATUS "Checked: environment variables for Travis, Appveyor, Jenkins (git plugin), BRANCH_NAME, BRANCH and 'git branch --show-current'") - message(FATAL_ERROR "Error! Git branch could not be determined. Please provide -DBRANCH=") -endif() - -#----------------------------------------------------------------------------------------# -# -# Set default values if not provided on command-line -# -#----------------------------------------------------------------------------------------# - -SET_DEFAULT(SOURCE_DIR "${WORKING_DIR}") # source directory -SET_DEFAULT(BINARY_DIR "${WORKING_DIR}/build") # build directory -SET_DEFAULT(BUILD_TYPE "${CMAKE_BUILD_TYPE}") # Release, Debug, etc. -SET_DEFAULT(MODEL "Continuous") # Continuous, Nightly, or Experimental -SET_DEFAULT(JOBS 1) # number of parallel ctests -SET_DEFAULT(CTEST_COMMAND "${CMAKE_CTEST_COMMAND}") # just in case -SET_DEFAULT(CTEST_ARGS "-V --output-on-failure") # extra arguments when ctest is called -SET_DEFAULT(GIT_EXECUTABLE "git") # ctest_update -SET_DEFAULT(TARGET "all") # build target -SET_DEFAULT_ARG1(SITE "$ENV{SITE}" - "${HOSTNAME}") # update site -SET_DEFAULT_ARG1(BUILD_JOBS "$ENV{BUILD_JOBS}" - "${NUM_PROCESSORS}") # number of parallel compile jobs -# -# The variable below correspond to ctest arguments, i.e. START,END,STRIDE are -# '-I START,END,STRIDE' -# -SET_DEFAULT(START "") -SET_DEFAULT(END "") -SET_DEFAULT(STRIDE "") -SET_DEFAULT(INCLUDE "") -SET_DEFAULT(EXCLUDE "") -SET_DEFAULT(INCLUDE_LABEL "") -SET_DEFAULT(EXCLUDE_LABEL "") -SET_DEFAULT(PARALLEL_LEVEL "") -SET_DEFAULT(STOP_TIME "") -SET_DEFAULT(LABELS "") -SET_DEFAULT(NOTES "") - -# default static build tag for Nightly -set(BUILD_TAG "${BRANCH}") - -if(NOT BUILD_TYPE) - # default for kokkos if not specified - set(BUILD_TYPE "RelWithDebInfo") -endif() - -# generate dynamic name if continuous or experimental model -if(NOT "${MODEL}" STREQUAL "Nightly") - if(EVENT_TYPE AND PULL_REQUEST_NUM) - # e.g. pull_request/123 - if(AUTHOR) - set(BUILD_TAG "${AUTHOR}/${EVENT_TYPE}/${PULL_REQUEST_NUM}") - else() - set(BUILD_TAG "${EVENT_TYPE}/${PULL_REQUEST_NUM}") - endif() - elseif(SLUG) - # e.g. owner_name/repo_name - set(BUILD_TAG "${SLUG}") - elseif(AUTHOR) - set(BUILD_TAG "${AUTHOR}/${BRANCH}") - endif() - if(EVENT_TYPE AND NOT PULL_REQUEST_NUM) - set(BUILD_TAG "${BUILD_TAG}-${EVENT_TYPE}") - endif() -endif() - -# unnecessary -string(REPLACE "/remotes/" "/" BUILD_TAG "${BUILD_TAG}") -string(REPLACE "/origin/" "/" BUILD_TAG "${BUILD_TAG}") - -message(STATUS "BUILD_TAG: ${BUILD_TAG}") - -set(BUILD_NAME "[${BUILD_TAG}] [${BUILD_NAME}-${BUILD_TYPE}]") - -# colons in build name create extra (empty) entries in CDash -string(REPLACE ":" "-" BUILD_NAME "${BUILD_NAME}") -# unnecessary info -string(REPLACE "/merge]" "]" BUILD_NAME "${BUILD_NAME}") -# consistency -string(REPLACE "/pr/" "/pull/" BUILD_NAME "${BUILD_NAME}") -string(REPLACE "pull_request/" "pull/" BUILD_NAME "${BUILD_NAME}") -# miscellaneous from missing fields -string(REPLACE "--" "-" BUILD_NAME "${BUILD_NAME}") -string(REPLACE "-]" "]" BUILD_NAME "${BUILD_NAME}") - -# check binary directory -if(EXISTS ${BINARY_DIR}) - if(NOT IS_DIRECTORY "${BINARY_DIR}") - message(FATAL_ERROR "Error! '${BINARY_DIR}' already exists and is not a directory!") - endif() - file(GLOB BINARY_DIR_FILES "${BINARY_DIR}/*") - if(NOT "${BINARY_DIR_FILES}" STREQUAL "") - message(FATAL_ERROR "Error! '${BINARY_DIR}' already exists and is not empty!") - endif() -endif() - -get_filename_component(SOURCE_REALDIR ${SOURCE_DIR} REALPATH) -get_filename_component(BINARY_REALDIR ${BINARY_DIR} REALPATH) - -#----------------------------------------------------------------------------------------# -# -# Generate the CTestConfig.cmake -# -#----------------------------------------------------------------------------------------# - -set(CONFIG_ARGS) -foreach(_ARG ${KOKKOS_CMAKE_ARGS}) - if(NOT "${${_ARG}}" STREQUAL "") - get_property(_ARG_TYPE CACHE ${_ARG} PROPERTY TYPE) - if("${_ARG_TYPE}" STREQUAL "UNINITIALIZED") - if("${${_ARG}}" STREQUAL "ON" OR "${${_ARG}}" STREQUAL "OFF") - set(_ARG_TYPE "BOOL") - elseif(EXISTS "${${_ARG}}" AND NOT IS_DIRECTORY "${${_ARG}}") - set(_ARG_TYPE "FILEPATH") - elseif(EXISTS "${${_ARG}}" AND IS_DIRECTORY "${${_ARG}}") - set(_ARG_TYPE "PATH") - elseif(NOT "${${_ARG}}" STREQUAL "") - set(_ARG_TYPE "STRING") - endif() - endif() - set(CONFIG_ARGS "${CONFIG_ARGS}set(${_ARG} \"${${_ARG}}\" CACHE ${_ARG_TYPE} \"\")\n") - endif() -endforeach() - -file(WRITE ${BINARY_REALDIR}/initial-cache.cmake -" -set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS}\" CACHE STRING \"\") -${CONFIG_ARGS} -") - -file(READ ${BINARY_REALDIR}/initial-cache.cmake _CACHE_INFO) -message(STATUS "Initial cache:\n${_CACHE_INFO}") - -# initialize the cache -set(CONFIG_ARGS "-C ${BINARY_REALDIR}/initial-cache.cmake") - - -# generate the CTestConfig.cmake -configure_file( - ${CMAKE_CURRENT_LIST_DIR}/CTestConfig.cmake.in - ${BINARY_REALDIR}/CTestConfig.cmake - @ONLY) - -# copy/generate the dashboard script -configure_file( - ${CMAKE_CURRENT_LIST_DIR}/KokkosCTest.cmake.in - ${BINARY_REALDIR}/KokkosCTest.cmake - @ONLY) - -# custom CTest settings go in ${BINARY_DIR}/CTestCustom.cmake -execute_process( - COMMAND ${CMAKE_COMMAND} -E touch CTestCustom.cmake - WORKING_DIRECTORY ${BINARY_REALDIR} - ) - -#----------------------------------------------------------------------------------------# -# -# Execute CTest -# -#----------------------------------------------------------------------------------------# - -message(STATUS "") -message(STATUS "BUILD_NAME: ${BUILD_NAME}") -message(STATUS "Executing '${CTEST_COMMAND} -S KokkosCTest.cmake ${CTEST_ARGS}'...") -message(STATUS "") - -# e.g. -DCTEST_ARGS="--output-on-failure -VV" should really be -DCTEST_ARGS="--output-on-failure;-VV" -string(REPLACE " " ";" CTEST_ARGS "${CTEST_ARGS}") - -execute_process( - COMMAND ${CTEST_COMMAND} -S KokkosCTest.cmake ${CTEST_ARGS} - RESULT_VARIABLE RET - WORKING_DIRECTORY ${BINARY_REALDIR} - ) - -# ensure that any non-zero result variable gets propagated -if(NOT RET EQUAL 0) - message(FATAL_ERROR "CTest return non-zero exit code: ${RET}") -endif() diff --git a/packages/kokkos/cmake/KokkosCTest.cmake.in b/packages/kokkos/cmake/KokkosCTest.cmake.in deleted file mode 100644 index b6917f3cc189..000000000000 --- a/packages/kokkos/cmake/KokkosCTest.cmake.in +++ /dev/null @@ -1,261 +0,0 @@ -cmake_minimum_required(VERSION 3.16 FATAL_ERROR) - -if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/CTestConfig.cmake") - include("${CMAKE_CURRENT_LIST_DIR}/CTestConfig.cmake") -endif() - -include(ProcessorCount) -ProcessorCount(CTEST_PROCESSOR_COUNT) - -cmake_policy(SET CMP0009 NEW) -cmake_policy(SET CMP0011 NEW) - -# ---------------------------------------------------------------------------- # -# -- Commands -# ---------------------------------------------------------------------------- # -find_program(CTEST_CMAKE_COMMAND NAMES cmake) -find_program(CTEST_UNAME_COMMAND NAMES uname) - -find_program(CTEST_BZR_COMMAND NAMES bzr) -find_program(CTEST_CVS_COMMAND NAMES cvs) -find_program(CTEST_GIT_COMMAND NAMES git) -find_program(CTEST_HG_COMMAND NAMES hg) -find_program(CTEST_P4_COMMAND NAMES p4) -find_program(CTEST_SVN_COMMAND NAMES svn) - -find_program(VALGRIND_COMMAND NAMES valgrind) -find_program(GCOV_COMMAND NAMES gcov) -find_program(LCOV_COMMAND NAMES llvm-cov) -find_program(MEMORYCHECK_COMMAND NAMES valgrind ) - -set(MEMORYCHECK_TYPE Valgrind) -# set(MEMORYCHECK_TYPE Purify) -# set(MEMORYCHECK_TYPE BoundsChecker) -# set(MEMORYCHECK_TYPE ThreadSanitizer) -# set(MEMORYCHECK_TYPE AddressSanitizer) -# set(MEMORYCHECK_TYPE LeakSanitizer) -# set(MEMORYCHECK_TYPE MemorySanitizer) -# set(MEMORYCHECK_TYPE UndefinedBehaviorSanitizer) -set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full") - -# ---------------------------------------------------------------------------- # -# -- Settings -# ---------------------------------------------------------------------------- # -## -- Process timeout in seconds -set(CTEST_TIMEOUT "7200") -## -- Set output to English -set(ENV{LC_MESSAGES} "en_EN" ) - - -# ---------------------------------------------------------------------------- # -# -- Copy ctest configuration file -# ---------------------------------------------------------------------------- # -macro(COPY_CTEST_CONFIG_FILES) - - foreach(_FILE CTestConfig.cmake CTestCustom.cmake) - - # if current directory is not binary or source directory - if(NOT "${CMAKE_CURRENT_LIST_DIR}" STREQUAL "${CTEST_BINARY_DIRECTORY}" AND - NOT "${CTEST_SOURCE_DIRECTORY}" STREQUAL "${CTEST_BINARY_DIRECTORY}") - - # if file exists in current directory - if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/${_FILE}) - configure_file(${CMAKE_CURRENT_LIST_DIR}/${_FILE} - ${CTEST_BINARY_DIRECTORY}/${_FILE} COPYONLY) - endif() - - # if source and binary differ - elseif(NOT "${CTEST_SOURCE_DIRECTORY}" STREQUAL "${CTEST_BINARY_DIRECTORY}") - - # if file exists in source directory but not in binary directory - if(EXISTS ${CTEST_SOURCE_DIRECTORY}/${_FILE} AND - NOT EXISTS ${CTEST_BINARY_DIRECTORY}/${_FILE}) - configure_file(${CTEST_SOURCE_DIRECTORY}/${_FILE} - ${CTEST_BINARY_DIRECTORY}/${_FILE} COPYONLY) - endif() - - endif() - endforeach() - -endmacro() - -ctest_read_custom_files("${CMAKE_CURRENT_LIST_DIR}") - -message(STATUS "CTEST_MODEL: ${CTEST_MODEL}") - -#-------------------------------------------------------------------------# -# Start -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running START_CTEST stage...") -message(STATUS "") - -ctest_start(${CTEST_MODEL} TRACK ${CTEST_MODEL} ${APPEND_CTEST} - ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY}) - - -#-------------------------------------------------------------------------# -# Config -# -copy_ctest_config_files() -ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}") - - -#-------------------------------------------------------------------------# -# Update -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_UPDATE stage...") -message(STATUS "") - -ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}" - RETURN_VALUE up_ret) - - -#-------------------------------------------------------------------------# -# Configure -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_CONFIGURE stage...") -message(STATUS "") - -ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" - SOURCE ${CTEST_SOURCE_DIRECTORY} - ${APPEND_CTEST} - OPTIONS "${CTEST_CONFIGURE_OPTIONS}" - RETURN_VALUE config_ret) - - -#-------------------------------------------------------------------------# -# Echo configure log bc Damien wants to delay merging this PR for eternity -# -file(GLOB _configure_log "${CTEST_BINARY_DIRECTORY}/Testing/Temporary/LastConfigure*.log") -# should only have one but loop just for safety -foreach(_LOG ${_configure_log}) - file(READ ${_LOG} _LOG_MESSAGE) - message(STATUS "Configure Log: ${_LOG}") - message(STATUS "\n${_LOG_MESSAGE}\n") -endforeach() - - -#-------------------------------------------------------------------------# -# Build -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_BUILD stage...") -message(STATUS "") - -ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" - ${APPEND_CTEST} - RETURN_VALUE build_ret) - - -#-------------------------------------------------------------------------# -# Echo build log bc Damien wants to delay merging this PR for eternity -# -file(GLOB _build_log "${CTEST_BINARY_DIRECTORY}/Testing/Temporary/LastBuild*.log") -# should only have one but loop just for safety -foreach(_LOG ${_build_log}) - file(READ ${_LOG} _LOG_MESSAGE) - message(STATUS "Build Log: ${_LOG}") - message(STATUS "\n${_LOG_MESSAGE}\n") -endforeach() - - -#-------------------------------------------------------------------------# -# Test -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_TEST stage...") -message(STATUS "") - -ctest_test(RETURN_VALUE test_ret - ${APPEND_CTEST} - ${START_CTEST} - ${END_CTEST} - ${STRIDE_CTEST} - ${INCLUDE_CTEST} - ${EXCLUDE_CTEST} - ${INCLUDE_LABEL_CTEST} - ${EXCLUDE_LABEL_CTEST} - ${PARALLEL_LEVEL_CTEST} - ${STOP_TIME_CTEST} - SCHEDULE_RANDOM OFF) - - -#-------------------------------------------------------------------------# -# Coverage -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_COVERAGE stage...") -message(STATUS "") - -execute_process(COMMAND ${CTEST_COVERAGE_COMMAND} ${CTEST_COVERAGE_EXTRA_FLAGS} - WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY} - ERROR_QUIET) - -ctest_coverage(${APPEND_CTEST} - ${CTEST_COVERAGE_LABELS} - RETURN_VALUE cov_ret) - - -#-------------------------------------------------------------------------# -# MemCheck -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_MEMCHECK stage...") -message(STATUS "") - -ctest_memcheck(RETURN_VALUE mem_ret - ${APPEND_CTEST} - ${START_CTEST} - ${END_CTEST} - ${STRIDE_CTEST} - ${INCLUDE_CTEST} - ${EXCLUDE_CTEST} - ${INCLUDE_LABEL_CTEST} - ${EXCLUDE_LABEL_CTEST} - ${PARALLEL_LEVEL_CTEST}) - - -#-------------------------------------------------------------------------# -# Submit -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Running CTEST_SUBMIT stage...") -message(STATUS "") - -file(GLOB_RECURSE NOTE_FILES "${CTEST_BINARY_DIRECTORY}/*CTestNotes.cmake") -foreach(_FILE ${NOTE_FILES}) - message(STATUS "Including CTest notes files: \"${_FILE}\"...") - include("${_FILE}") -endforeach() - -# capture submit error so it doesn't fail because of a submission error -ctest_submit(RETURN_VALUE submit_ret - RETRY_COUNT 2 - RETRY_DELAY 10 - CAPTURE_CMAKE_ERROR submit_err) - -#-------------------------------------------------------------------------# -# Submit -# -message(STATUS "") -message(STATUS "[${CTEST_BUILD_NAME}] Finished ${CTEST_MODEL} Stages (${STAGES})") -message(STATUS "") - - -#-------------------------------------------------------------------------# -# Non-zero exit codes for important errors -# -if(NOT config_ret EQUAL 0) - message(FATAL_ERROR "Error during configuration! Exit code: ${config_ret}") -endif() - -if(NOT build_ret EQUAL 0) - message(FATAL_ERROR "Error during build! Exit code: ${build_ret}") -endif() - -if(NOT test_ret EQUAL 0) - message(FATAL_ERROR "Error during testing! Exit code: ${test_ret}") -endif() diff --git a/packages/kokkos/cmake/KokkosCore_config.h.in b/packages/kokkos/cmake/KokkosCore_config.h.in index 3455b0cb42e7..07baa0a5f09a 100644 --- a/packages/kokkos/cmake/KokkosCore_config.h.in +++ b/packages/kokkos/cmake/KokkosCore_config.h.in @@ -41,6 +41,7 @@ #cmakedefine KOKKOS_ENABLE_CUDA_LAMBDA #cmakedefine KOKKOS_ENABLE_CUDA_CONSTEXPR #cmakedefine KOKKOS_ENABLE_CUDA_LDG_INTRINSIC +#cmakedefine KOKKOS_ENABLE_IMPL_CUDA_MALLOC_ASYNC #cmakedefine KOKKOS_ENABLE_HIP_RELOCATABLE_DEVICE_CODE #cmakedefine KOKKOS_ENABLE_HPX_ASYNC_DISPATCH #cmakedefine KOKKOS_ENABLE_DEBUG @@ -49,17 +50,21 @@ #cmakedefine KOKKOS_ENABLE_COMPILER_WARNINGS #cmakedefine KOKKOS_ENABLE_PROFILING_LOAD_PRINT #cmakedefine KOKKOS_ENABLE_TUNING -#cmakedefine KOKKOS_ENABLE_DEPRECATED_CODE +#cmakedefine KOKKOS_ENABLE_DEPRECATED_CODE_3 +#cmakedefine KOKKOS_ENABLE_DEPRECATION_WARNINGS #cmakedefine KOKKOS_ENABLE_LARGE_MEM_TESTS #cmakedefine KOKKOS_ENABLE_DUALVIEW_MODIFY_CHECK #cmakedefine KOKKOS_ENABLE_COMPLEX_ALIGN -#cmakedefine KOKKOS_OPT_RANGE_AGGRESSIVE_VECTORIZATION +#cmakedefine KOKKOS_ENABLE_IMPL_DESUL_ATOMICS +#cmakedefine KOKKOS_OPT_RANGE_AGGRESSIVE_VECTORIZATION // deprecated +#cmakedefine KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION /* TPL Settings */ #cmakedefine KOKKOS_ENABLE_HWLOC #cmakedefine KOKKOS_USE_LIBRT #cmakedefine KOKKOS_ENABLE_HBWSPACE #cmakedefine KOKKOS_ENABLE_LIBDL +#cmakedefine KOKKOS_ENABLE_LIBQUADMATH #cmakedefine KOKKOS_IMPL_CUDA_CLANG_WORKAROUND #cmakedefine KOKKOS_COMPILER_CUDA_VERSION @KOKKOS_COMPILER_CUDA_VERSION@ @@ -79,6 +84,12 @@ #cmakedefine KOKKOS_ARCH_POWER8 #cmakedefine KOKKOS_ARCH_POWER9 #cmakedefine KOKKOS_ARCH_INTEL_GEN +#cmakedefine KOKKOS_ARCH_INTEL_DG1 +#cmakedefine KOKKOS_ARCH_INTEL_GEN9 +#cmakedefine KOKKOS_ARCH_INTEL_GEN11 +#cmakedefine KOKKOS_ARCH_INTEL_GEN12LP +#cmakedefine KOKKOS_ARCH_INTEL_XEHP +#cmakedefine KOKKOS_ARCH_INTEL_GPU #cmakedefine KOKKOS_ARCH_KEPLER #cmakedefine KOKKOS_ARCH_KEPLER30 #cmakedefine KOKKOS_ARCH_KEPLER32 @@ -95,6 +106,7 @@ #cmakedefine KOKKOS_ARCH_VOLTA70 #cmakedefine KOKKOS_ARCH_VOLTA72 #cmakedefine KOKKOS_ARCH_TURING75 +#cmakedefine KOKKOS_ARCH_AMPERE #cmakedefine KOKKOS_ARCH_AMPERE80 #cmakedefine KOKKOS_ARCH_AMPERE86 #cmakedefine KOKKOS_ARCH_AMD_ZEN diff --git a/packages/kokkos/cmake/Modules/FindTPLCUDA.cmake b/packages/kokkos/cmake/Modules/FindTPLCUDA.cmake index 8d58d9641580..0c825c59e042 100644 --- a/packages/kokkos/cmake/Modules/FindTPLCUDA.cmake +++ b/packages/kokkos/cmake/Modules/FindTPLCUDA.cmake @@ -29,7 +29,12 @@ ELSE() ENDIF() include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(TPLCUDA DEFAULT_MSG FOUND_CUDART FOUND_CUDA_DRIVER) +IF(KOKKOS_CXX_HOST_COMPILER_ID STREQUAL PGI) + SET(KOKKOS_CUDA_ERROR "Using NVHPC as host compiler requires at least CMake 3.20.1") +ELSE() + SET(KOKKOS_CUDA_ERROR DEFAULT_MSG) +ENDIF() +FIND_PACKAGE_HANDLE_STANDARD_ARGS(TPLCUDA ${KOKKOS_CUDA_ERROR} FOUND_CUDART FOUND_CUDA_DRIVER) IF (FOUND_CUDA_DRIVER AND FOUND_CUDART) KOKKOS_CREATE_IMPORTED_TPL(CUDA INTERFACE LINK_LIBRARIES CUDA::cuda_driver CUDA::cudart diff --git a/packages/kokkos/cmake/Modules/FindTPLLIBQUADMATH.cmake b/packages/kokkos/cmake/Modules/FindTPLLIBQUADMATH.cmake new file mode 100644 index 000000000000..be70b711e0f9 --- /dev/null +++ b/packages/kokkos/cmake/Modules/FindTPLLIBQUADMATH.cmake @@ -0,0 +1 @@ +KOKKOS_FIND_IMPORTED(LIBQUADMATH HEADER quadmath.h LIBRARY quadmath) diff --git a/packages/kokkos/cmake/deps/quadmath.cmake b/packages/kokkos/cmake/deps/quadmath.cmake new file mode 100644 index 000000000000..826f5021d359 --- /dev/null +++ b/packages/kokkos/cmake/deps/quadmath.cmake @@ -0,0 +1,46 @@ +# @HEADER +# ************************************************************************ +# +# Kokkos v. 3.0 +# Copyright (2020) National Technology & Engineering +# Solutions of Sandia, LLC (NTESS). +# +# Under the terms of Contract DE-NA0003525 with NTESS, +# the U.S. Government retains certain rights in this software. +# +# 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. +# +# 3. Neither the name of the Corporation nor the names of the +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY NTESS "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 NTESS OR THE +# 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. +# +# Questions? Contact Christian R. Trott (crtrott@sandia.gov) +# +# ************************************************************************ +# @HEADER + +KOKKOS_TPL_FIND_INCLUDE_DIRS_AND_LIBRARIES( quadmath + REQUIRED_HEADERS quadmath.h + REQUIRED_LIBS_NAMES quadmath +) diff --git a/packages/kokkos/cmake/kokkos_arch.cmake b/packages/kokkos/cmake/kokkos_arch.cmake index e8b85542c633..c4637339f31f 100644 --- a/packages/kokkos/cmake/kokkos_arch.cmake +++ b/packages/kokkos/cmake/kokkos_arch.cmake @@ -67,8 +67,13 @@ KOKKOS_ARCH_OPTION(ZEN3 HOST "AMD Zen3 architecture") KOKKOS_ARCH_OPTION(VEGA900 GPU "AMD GPU MI25 GFX900") KOKKOS_ARCH_OPTION(VEGA906 GPU "AMD GPU MI50/MI60 GFX906") KOKKOS_ARCH_OPTION(VEGA908 GPU "AMD GPU MI100 GFX908") +KOKKOS_ARCH_OPTION(VEGA90A GPU "" ) KOKKOS_ARCH_OPTION(INTEL_GEN GPU "Intel GPUs Gen9+") - +KOKKOS_ARCH_OPTION(INTEL_DG1 GPU "Intel Iris XeMAX GPU") +KOKKOS_ARCH_OPTION(INTEL_GEN9 GPU "Intel GPU Gen9") +KOKKOS_ARCH_OPTION(INTEL_GEN11 GPU "Intel GPU Gen11") +KOKKOS_ARCH_OPTION(INTEL_GEN12LP GPU "Intel GPU Gen12LP") +KOKKOS_ARCH_OPTION(INTEL_XEHP GPU "Intel GPU Xe-HP") IF(KOKKOS_ENABLE_COMPILER_WARNINGS) @@ -76,6 +81,12 @@ IF(KOKKOS_ENABLE_COMPILER_WARNINGS) "-Wall" "-Wunused-parameter" "-Wshadow" "-pedantic" "-Wsign-compare" "-Wtype-limits" "-Wuninitialized") + # NOTE KOKKOS_ prefixed variable (all uppercase) is not set yet because TPLs are processed after ARCH + IF(Kokkos_ENABLE_LIBQUADMATH) + # warning: non-standard suffix on floating constant [-Wpedantic] + LIST(REMOVE_ITEM COMMON_WARNINGS "-pedantic") + ENDIF() + # OpenMPTarget compilers give erroneous warnings about sign comparison in loops IF(KOKKOS_ENABLE_OPENMPTARGET) LIST(REMOVE_ITEM COMMON_WARNINGS "-Wsign-compare") @@ -86,7 +97,7 @@ IF(KOKKOS_ENABLE_COMPILER_WARNINGS) COMPILER_SPECIFIC_FLAGS( COMPILER_ID CMAKE_CXX_COMPILER_ID - PGI NO-VALUE-SPECIFIED + NVHPC NO-VALUE-SPECIFIED GNU ${GNU_WARNINGS} DEFAULT ${COMMON_WARNINGS} ) @@ -158,16 +169,18 @@ ENDIF() IF (KOKKOS_ARCH_ARMV80) COMPILER_SPECIFIC_FLAGS( - Cray NO-VALUE-SPECIFIED - PGI NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + Cray NO-VALUE-SPECIFIED + NVHPC NO-VALUE-SPECIFIED DEFAULT -march=armv8-a ) ENDIF() IF (KOKKOS_ARCH_ARMV81) COMPILER_SPECIFIC_FLAGS( - Cray NO-VALUE-SPECIFIED - PGI NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + Cray NO-VALUE-SPECIFIED + NVHPC NO-VALUE-SPECIFIED DEFAULT -march=armv8.1-a ) ENDIF() @@ -175,8 +188,9 @@ ENDIF() IF (KOKKOS_ARCH_ARMV8_THUNDERX) SET(KOKKOS_ARCH_ARMV80 ON) #Not a cache variable COMPILER_SPECIFIC_FLAGS( - Cray NO-VALUE-SPECIFIED - PGI NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + Cray NO-VALUE-SPECIFIED + NVHPC NO-VALUE-SPECIFIED DEFAULT -march=armv8-a -mtune=thunderx ) ENDIF() @@ -184,23 +198,28 @@ ENDIF() IF (KOKKOS_ARCH_ARMV8_THUNDERX2) SET(KOKKOS_ARCH_ARMV81 ON) #Not a cache variable COMPILER_SPECIFIC_FLAGS( - Cray NO-VALUE-SPECIFIED - PGI NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + Cray NO-VALUE-SPECIFIED + NVHPC NO-VALUE-SPECIFIED DEFAULT -mcpu=thunderx2t99 -mtune=thunderx2t99 ) ENDIF() IF (KOKKOS_ARCH_A64FX) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + NVHPC NO-VALUE-SPECIFIED DEFAULT -march=armv8.2-a+sve - Clang -march=armv8.2-a+sve -msve-vector-bits=512 - GCC -march=armv8.2-a+sve -msve-vector-bits=512 + Clang -march=armv8.2-a+sve -msve-vector-bits=512 + GCC -march=armv8.2-a+sve -msve-vector-bits=512 ) ENDIF() IF (KOKKOS_ARCH_ZEN) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -mavx2 + NVHPC -tp=zen DEFAULT -march=znver1 -mtune=znver1 ) SET(KOKKOS_ARCH_AMD_ZEN ON) @@ -209,7 +228,9 @@ ENDIF() IF (KOKKOS_ARCH_ZEN2) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -mavx2 + NVHPC -tp=zen2 DEFAULT -march=znver2 -mtune=znver2 ) SET(KOKKOS_ARCH_AMD_ZEN2 ON) @@ -218,7 +239,9 @@ ENDIF() IF (KOKKOS_ARCH_ZEN3) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -mavx2 + NVHPC -tp=zen2 DEFAULT -march=znver3 -mtune=znver3 ) SET(KOKKOS_ARCH_AMD_ZEN3 ON) @@ -227,8 +250,9 @@ ENDIF() IF (KOKKOS_ARCH_WSM) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -xSSE4.2 - PGI -tp=nehalem + NVHPC -tp=px Cray NO-VALUE-SPECIFIED DEFAULT -msse4.2 ) @@ -238,8 +262,9 @@ ENDIF() IF (KOKKOS_ARCH_SNB OR KOKKOS_ARCH_AMDAVX) SET(KOKKOS_ARCH_AVX ON) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -mavx - PGI -tp=sandybridge + NVHPC -tp=sandybridge Cray NO-VALUE-SPECIFIED DEFAULT -mavx ) @@ -248,8 +273,9 @@ ENDIF() IF (KOKKOS_ARCH_HSW) SET(KOKKOS_ARCH_AVX2 ON) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -xCORE-AVX2 - PGI -tp=haswell + NVHPC -tp=haswell Cray NO-VALUE-SPECIFIED DEFAULT -march=core-avx2 -mtune=core-avx2 ) @@ -258,8 +284,9 @@ ENDIF() IF (KOKKOS_ARCH_BDW) SET(KOKKOS_ARCH_AVX2 ON) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -xCORE-AVX2 - PGI -tp=haswell + NVHPC -tp=haswell Cray NO-VALUE-SPECIFIED DEFAULT -march=core-avx2 -mtune=core-avx2 -mrtm ) @@ -269,8 +296,9 @@ IF (KOKKOS_ARCH_KNL) #avx512-mic SET(KOKKOS_ARCH_AVX512MIC ON) #not a cache variable COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -xMIC-AVX512 - PGI NO-VALUE-SPECIFIED + NVHPC -tp=knl Cray NO-VALUE-SPECIFIED DEFAULT -march=knl -mtune=knl ) @@ -279,6 +307,7 @@ ENDIF() IF (KOKKOS_ARCH_KNC) SET(KOKKOS_USE_ISA_KNC ON) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID DEFAULT -mmic ) ENDIF() @@ -287,8 +316,9 @@ IF (KOKKOS_ARCH_SKX) #avx512-xeon SET(KOKKOS_ARCH_AVX512XEON ON) COMPILER_SPECIFIC_FLAGS( + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Intel -xCORE-AVX512 - PGI NO-VALUE-SPECIFIED + NVHPC -tp=skylake Cray NO-VALUE-SPECIFIED DEFAULT -march=skylake-avx512 -mtune=skylake-avx512 -mrtm ) @@ -304,7 +334,8 @@ ENDIF() IF (KOKKOS_ARCH_POWER7) COMPILER_SPECIFIC_FLAGS( - PGI NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + NVHPC NO-VALUE-SPECIFIED DEFAULT -mcpu=power7 -mtune=power7 ) SET(KOKKOS_USE_ISA_POWERPCBE ON) @@ -312,16 +343,16 @@ ENDIF() IF (KOKKOS_ARCH_POWER8) COMPILER_SPECIFIC_FLAGS( - PGI NO-VALUE-SPECIFIED - NVIDIA NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + NVHPC -tp=pwr8 DEFAULT -mcpu=power8 -mtune=power8 ) ENDIF() IF (KOKKOS_ARCH_POWER9) COMPILER_SPECIFIC_FLAGS( - PGI NO-VALUE-SPECIFIED - NVIDIA NO-VALUE-SPECIFIED + COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID + NVHPC -tp=pwr9 DEFAULT -mcpu=power9 -mtune=power9 ) ENDIF() @@ -368,7 +399,7 @@ ENDIF() IF (KOKKOS_ENABLE_SYCL) COMPILER_SPECIFIC_FLAGS( - DEFAULT -fsycl + DEFAULT -fsycl -fno-sycl-id-queries-fit-in-int ) COMPILER_SPECIFIC_OPTIONS( DEFAULT -fsycl-unnamed-lambda @@ -443,20 +474,58 @@ ENDFUNCTION() CHECK_AMDGPU_ARCH(VEGA900 gfx900) # Radeon Instinct MI25 CHECK_AMDGPU_ARCH(VEGA906 gfx906) # Radeon Instinct MI50 and MI60 CHECK_AMDGPU_ARCH(VEGA908 gfx908) +CHECK_AMDGPU_ARCH(VEGA90A gfx90a) IF(KOKKOS_ENABLE_HIP AND NOT AMDGPU_ARCH_ALREADY_SPECIFIED) - MESSAGE(SEND_ERROR "HIP enabled but no AMD GPU architecture currently enabled. " - "Please enable one AMD GPU architecture via -DKokkos_ARCH_{..}=ON'.") + IF(KOKKOS_CXX_COMPILER_ID STREQUAL HIPCC) + FIND_PROGRAM(ROCM_ENUMERATOR rocm_agent_enumerator) + EXECUTE_PROCESS(COMMAND ${ROCM_ENUMERATOR} OUTPUT_VARIABLE GPU_ARCHS) + STRING(LENGTH "${GPU_ARCHS}" len_str) + # enumerator always output gfx000 as the first line + IF(${len_str} LESS 8) + MESSAGE(SEND_ERROR "HIP enabled but no AMD GPU architecture currently enabled. " + "Please enable one AMD GPU architecture via -DKokkos_ARCH_{..}=ON'.") + ENDIF() + ELSE() + MESSAGE(SEND_ERROR "HIP enabled but no AMD GPU architecture currently enabled. " + "Please enable one AMD GPU architecture via -DKokkos_ARCH_{..}=ON'.") + ENDIF() +ENDIF() + +MACRO(CHECK_MULTIPLE_INTEL_ARCH) + IF(KOKKOS_ARCH_INTEL_GPU) + MESSAGE(FATAL_ERROR "Specifying multiple Intel GPU architectures is not allowed!") + ENDIF() + SET(KOKKOS_ARCH_INTEL_GPU ON) +ENDMACRO() + +IF(KOKKOS_ARCH_INTEL_GEN) + CHECK_MULTIPLE_INTEL_ARCH() +ENDIF() +IF(KOKKOS_ARCH_INTEL_DG1) + CHECK_MULTIPLE_INTEL_ARCH() +ENDIF() +IF(KOKKOS_ARCH_INTEL_GEN9) + CHECK_MULTIPLE_INTEL_ARCH() +ENDIF() +IF(KOKKOS_ARCH_INTEL_GEN11) + CHECK_MULTIPLE_INTEL_ARCH() +ENDIF() +IF(KOKKOS_ARCH_INTEL_GEN12LP) + CHECK_MULTIPLE_INTEL_ARCH() +ENDIF() +IF(KOKKOS_ARCH_INTEL_XEHP) + CHECK_MULTIPLE_INTEL_ARCH() ENDIF() IF (KOKKOS_ENABLE_OPENMPTARGET) SET(CLANG_CUDA_ARCH ${KOKKOS_CUDA_ARCH_FLAG}) IF (CLANG_CUDA_ARCH) - STRING(REPLACE "sm_" "cc" PGI_CUDA_ARCH ${CLANG_CUDA_ARCH}) + STRING(REPLACE "sm_" "cc" NVHPC_CUDA_ARCH ${CLANG_CUDA_ARCH}) COMPILER_SPECIFIC_FLAGS( Clang -Xopenmp-target -march=${CLANG_CUDA_ARCH} -fopenmp-targets=nvptx64-nvidia-cuda - XL -qtgtarch=${KOKKOS_CUDA_ARCH_FLAG} - PGI -gpu=${PGI_CUDA_ARCH} + XL -qtgtarch=${KOKKOS_CUDA_ARCH_FLAG} + NVHPC -gpu=${NVHPC_CUDA_ARCH} ) ENDIF() SET(CLANG_AMDGPU_ARCH ${KOKKOS_AMDGPU_ARCH_FLAG}) @@ -465,7 +534,7 @@ IF (KOKKOS_ENABLE_OPENMPTARGET) Clang -Xopenmp-target=amdgcn-amd-amdhsa -march=${CLANG_AMDGPU_ARCH} -fopenmp-targets=amdgcn-amd-amdhsa ) ENDIF() - IF (KOKKOS_ARCH_INTEL_GEN) + IF (KOKKOS_ARCH_INTEL_GPU) COMPILER_SPECIFIC_FLAGS( IntelLLVM -fopenmp-targets=spir64 -D__STRICT_ANSI__ ) @@ -485,7 +554,27 @@ IF (KOKKOS_ENABLE_SYCL) ENDIF() ELSEIF(KOKKOS_ARCH_INTEL_GEN) COMPILER_SPECIFIC_FLAGS( - DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device skl" + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9-" + ) + ELSEIF(KOKKOS_ARCH_INTEL_GEN9) + COMPILER_SPECIFIC_FLAGS( + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen9" + ) + ELSEIF(KOKKOS_ARCH_INTEL_GEN11) + COMPILER_SPECIFIC_FLAGS( + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen11" + ) + ELSEIF(KOKKOS_ARCH_INTEL_GEN12LP) + COMPILER_SPECIFIC_FLAGS( + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device gen12lp" + ) + ELSEIF(KOKKOS_ARCH_INTEL_DG1) + COMPILER_SPECIFIC_FLAGS( + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device dg1" + ) + ELSEIF(KOKKOS_ARCH_INTEL_XEHP) + COMPILER_SPECIFIC_FLAGS( + DEFAULT -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-device xehp" ) ENDIF() ENDIF() diff --git a/packages/kokkos/cmake/kokkos_compiler_id.cmake b/packages/kokkos/cmake/kokkos_compiler_id.cmake index 23847263a952..5afed4fb0e7b 100644 --- a/packages/kokkos/cmake/kokkos_compiler_id.cmake +++ b/packages/kokkos/cmake/kokkos_compiler_id.cmake @@ -137,7 +137,7 @@ SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Clang 4.0.0 or higher" SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n GCC 5.3.0 or higher") SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Intel 17.0.0 or higher") SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n NVCC 9.2.88 or higher") -SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n HIPCC 3.8.0 or higher") +SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n HIPCC 4.2.0 or higher") SET(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n PGI 17.4 or higher\n") IF(KOKKOS_CXX_COMPILER_ID STREQUAL Clang) @@ -158,13 +158,23 @@ ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) ENDIF() SET(CMAKE_CXX_EXTENSIONS OFF CACHE BOOL "Kokkos turns off CXX extensions" FORCE) ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL HIPCC) - IF(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 3.8.0) + IF(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 4.2.0) MESSAGE(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") ENDIF() ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) IF(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 17.4) MESSAGE(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") ENDIF() + # Treat PGI internally as NVHPC to simplify handling both compilers. + # Before CMake 3.20 NVHPC was identified as PGI, nvc++ is + # backward-compatible to pgc++. + SET(KOKKOS_CXX_COMPILER_ID NVHPC CACHE STRING INTERNAL FORCE) +ENDIF() + +IF(NOT DEFINED KOKKOS_CXX_HOST_COMPILER_ID) + SET(KOKKOS_CXX_HOST_COMPILER_ID ${KOKKOS_CXX_COMPILER_ID}) +ELSEIF(KOKKOS_CXX_HOST_COMPILER_ID STREQUAL PGI) + SET(KOKKOS_CXX_HOST_COMPILER_ID NVHPC CACHE STRING INTERNAL FORCE) ENDIF() STRING(REPLACE "." ";" VERSION_LIST ${KOKKOS_CXX_COMPILER_VERSION}) diff --git a/packages/kokkos/cmake/kokkos_enable_devices.cmake b/packages/kokkos/cmake/kokkos_enable_devices.cmake index d7f83ddbdf87..7fd079403645 100644 --- a/packages/kokkos/cmake/kokkos_enable_devices.cmake +++ b/packages/kokkos/cmake/kokkos_enable_devices.cmake @@ -62,7 +62,7 @@ IF(KOKKOS_ENABLE_OPENMP) COMPILER_ID KOKKOS_CXX_HOST_COMPILER_ID Clang -Xcompiler ${ClangOpenMPFlag} IntelLLVM -Xcompiler -fiopenmp - PGI -Xcompiler -mp + NVHPC -Xcompiler -mp Cray NO-VALUE-SPECIFIED XL -Xcompiler -qsmp=omp DEFAULT -Xcompiler -fopenmp @@ -72,7 +72,7 @@ IF(KOKKOS_ENABLE_OPENMP) Clang ${ClangOpenMPFlag} IntelLLVM -fiopenmp AppleClang -Xpreprocessor -fopenmp - PGI -mp + NVHPC -mp Cray NO-VALUE-SPECIFIED XL -qsmp=omp DEFAULT -fopenmp @@ -94,7 +94,7 @@ IF (KOKKOS_ENABLE_OPENMPTARGET) Clang ${ClangOpenMPFlag} -Wno-openmp-mapping IntelLLVM -fiopenmp -Wno-openmp-mapping XL -qsmp=omp -qoffload -qnoeh - PGI -mp=gpu + NVHPC -mp=gpu DEFAULT -fopenmp ) COMPILER_SPECIFIC_DEFS( diff --git a/packages/kokkos/cmake/kokkos_enable_options.cmake b/packages/kokkos/cmake/kokkos_enable_options.cmake index 95bce66c7bee..4cb8bd20f5ec 100644 --- a/packages/kokkos/cmake/kokkos_enable_options.cmake +++ b/packages/kokkos/cmake/kokkos_enable_options.cmake @@ -26,9 +26,16 @@ KOKKOS_CFG_DEPENDS(OPTIONS COMPILER_ID) # Put a check in just in case people are using this option KOKKOS_DEPRECATED_LIST(OPTIONS ENABLE) +# Set the Default for Desul Atomics usage. +set(_DESUL_ATOMICS_DEFAULT ON) + KOKKOS_ENABLE_OPTION(CUDA_RELOCATABLE_DEVICE_CODE OFF "Whether to enable relocatable device code (RDC) for CUDA") KOKKOS_ENABLE_OPTION(CUDA_UVM OFF "Whether to use unified memory (UM) for CUDA by default") KOKKOS_ENABLE_OPTION(CUDA_LDG_INTRINSIC OFF "Whether to use CUDA LDG intrinsics") +# As of 08/12/2021 CudaMallocAsync causes issues if UCX is used as MPI communication layer. +KOKKOS_ENABLE_OPTION(IMPL_CUDA_MALLOC_ASYNC OFF "Whether to enable CudaMallocAsync (requires CUDA Toolkit 11.2)") +KOKKOS_ENABLE_OPTION(DEPRECATED_CODE_3 ON "Whether code deprecated in major release 3 is available" ) +KOKKOS_ENABLE_OPTION(DEPRECATION_WARNINGS ON "Whether to emit deprecation warnings" ) KOKKOS_ENABLE_OPTION(HIP_RELOCATABLE_DEVICE_CODE OFF "Whether to enable relocatable device code (RDC) for HIP") KOKKOS_ENABLE_OPTION(HPX_ASYNC_DISPATCH OFF "Whether HPX supports asynchronous dispatch") KOKKOS_ENABLE_OPTION(TESTS OFF "Whether to build the unit tests") @@ -50,6 +57,9 @@ KOKKOS_ENABLE_OPTION(TUNING OFF "Whether to create bindings for tu KOKKOS_ENABLE_OPTION(AGGRESSIVE_VECTORIZATION OFF "Whether to aggressively vectorize loops") KOKKOS_ENABLE_OPTION(LAUNCH_COMPILER ON "Whether to potentially use the launch compiler") +# This option will go away eventually, but allows fallback to old implementation when needed. +KOKKOS_ENABLE_OPTION(IMPL_DESUL_ATOMICS ON "Whether to use desul based atomics - option only during beta") + IF (KOKKOS_ENABLE_CUDA) SET(KOKKOS_COMPILER_CUDA_VERSION "${KOKKOS_COMPILER_VERSION_MAJOR}${KOKKOS_COMPILER_VERSION_MINOR}") ENDIF() diff --git a/packages/kokkos/cmake/kokkos_functions.cmake b/packages/kokkos/cmake/kokkos_functions.cmake index e1a3e5f8bd00..02c9a911b1b8 100644 --- a/packages/kokkos/cmake/kokkos_functions.cmake +++ b/packages/kokkos/cmake/kokkos_functions.cmake @@ -773,7 +773,7 @@ FUNCTION(kokkos_link_tpl TARGET) ENDFUNCTION() FUNCTION(COMPILER_SPECIFIC_OPTIONS_HELPER) - SET(COMPILERS NVIDIA PGI XL DEFAULT Cray Intel Clang AppleClang IntelLLVM GNU HIPCC Fujitsu) + SET(COMPILERS NVIDIA NVHPC XL XLClang DEFAULT Cray Intel Clang AppleClang IntelLLVM GNU HIPCC Fujitsu) CMAKE_PARSE_ARGUMENTS( PARSE "LINK_OPTIONS;COMPILE_OPTIONS;COMPILE_DEFINITIONS;LINK_LIBRARIES" diff --git a/packages/kokkos/cmake/kokkos_test_cxx_std.cmake b/packages/kokkos/cmake/kokkos_test_cxx_std.cmake index 707fb000af52..1eb0592c7f05 100644 --- a/packages/kokkos/cmake/kokkos_test_cxx_std.cmake +++ b/packages/kokkos/cmake/kokkos_test_cxx_std.cmake @@ -140,7 +140,7 @@ IF (NOT KOKKOS_CXX_STANDARD_FEATURE) IF(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) INCLUDE(${KOKKOS_SRC_PATH}/cmake/cray.cmake) kokkos_set_cray_flags(${KOKKOS_CXX_STANDARD} ${KOKKOS_CXX_INTERMEDIATE_STANDARD}) - ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC) INCLUDE(${KOKKOS_SRC_PATH}/cmake/pgi.cmake) kokkos_set_pgi_flags(${KOKKOS_CXX_STANDARD} ${KOKKOS_CXX_INTERMEDIATE_STANDARD}) ELSEIF(KOKKOS_CXX_COMPILER_ID STREQUAL Intel) diff --git a/packages/kokkos/cmake/kokkos_tpls.cmake b/packages/kokkos/cmake/kokkos_tpls.cmake index d8d044c9d753..51bad521c487 100644 --- a/packages/kokkos/cmake/kokkos_tpls.cmake +++ b/packages/kokkos/cmake/kokkos_tpls.cmake @@ -67,6 +67,12 @@ SET(PTHREAD_DEFAULT OFF) ENDIF() KOKKOS_TPL_OPTION(PTHREAD ${PTHREAD_DEFAULT} TRIBITS Pthread) +IF(Trilinos_ENABLE_Kokkos AND TPL_ENABLE_quadmath) + SET(LIBQUADMATH_DEFAULT ON) +ELSE() + SET(LIBQUADMATH_DEFAULT OFF) +ENDIF() +KOKKOS_TPL_OPTION(LIBQUADMATH ${LIBQUADMATH_DEFAULT} TRIBITS quadmath) #Make sure we use our local FindKokkosCuda.cmake KOKKOS_IMPORT_TPL(HPX INTERFACE) @@ -78,6 +84,7 @@ KOKKOS_IMPORT_TPL(LIBDL) KOKKOS_IMPORT_TPL(MEMKIND) KOKKOS_IMPORT_TPL(PTHREAD INTERFACE) KOKKOS_IMPORT_TPL(ROCM INTERFACE) +KOKKOS_IMPORT_TPL(LIBQUADMATH) #Convert list to newlines (which CMake doesn't always like in cache variables) STRING(REPLACE ";" "\n" KOKKOS_TPL_EXPORT_TEMP "${KOKKOS_TPL_EXPORTS}") diff --git a/packages/kokkos/cmake/tpls/FindTPLquadmath.cmake b/packages/kokkos/cmake/tpls/FindTPLquadmath.cmake new file mode 100644 index 000000000000..1f7587da808f --- /dev/null +++ b/packages/kokkos/cmake/tpls/FindTPLquadmath.cmake @@ -0,0 +1,46 @@ +# @HEADER +# ************************************************************************ +# +# Kokkos v. 3.0 +# Copyright (2020) National Technology & Engineering +# Solutions of Sandia, LLC (NTESS). +# +# Under the terms of Contract DE-NA0003525 with NTESS, +# the U.S. Government retains certain rights in this software. +# +# 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. +# +# 3. Neither the name of the Corporation nor the names of the +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY NTESS "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 NTESS OR THE +# 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. +# +# Questions? Contact Christian R. Trott (crtrott@sandia.gov) +# +# ************************************************************************ +# @HEADER + +TRIBITS_TPL_FIND_INCLUDE_DIRS_AND_LIBRARIES( quadmath + REQUIRED_HEADERS quadmath.h + REQUIRED_LIBS_NAMES quadmath +) diff --git a/packages/kokkos/containers/performance_tests/TestDynRankView.hpp b/packages/kokkos/containers/performance_tests/TestDynRankView.hpp index 8c507c76621d..7ed9a0271a51 100644 --- a/packages/kokkos/containers/performance_tests/TestDynRankView.hpp +++ b/packages/kokkos/containers/performance_tests/TestDynRankView.hpp @@ -48,7 +48,7 @@ #include #include -#include +#include // Compare performance of DynRankView to View, specific focus on the parenthesis // operators diff --git a/packages/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp b/packages/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp index 65de551b2715..16b74a4997e5 100644 --- a/packages/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp +++ b/packages/kokkos/containers/performance_tests/TestGlobal2LocalIds.hpp @@ -48,7 +48,7 @@ #include #include -#include +#include // This test will simulate global ids diff --git a/packages/kokkos/containers/performance_tests/TestScatterView.hpp b/packages/kokkos/containers/performance_tests/TestScatterView.hpp index 0f3ba103efc5..8a23f59d32cd 100644 --- a/packages/kokkos/containers/performance_tests/TestScatterView.hpp +++ b/packages/kokkos/containers/performance_tests/TestScatterView.hpp @@ -46,7 +46,7 @@ #define KOKKOS_TEST_SCATTER_VIEW_HPP #include -#include +#include namespace Perf { diff --git a/packages/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp b/packages/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp index c31412552ad6..4547d5c35758 100644 --- a/packages/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp +++ b/packages/kokkos/containers/performance_tests/TestUnorderedMapPerformance.hpp @@ -43,7 +43,7 @@ #ifndef KOKKOS_TEST_UNORDERED_MAP_PERFORMANCE_HPP #define KOKKOS_TEST_UNORDERED_MAP_PERFORMANCE_HPP -#include +#include #include #include diff --git a/packages/kokkos/containers/src/Kokkos_Bitset.hpp b/packages/kokkos/containers/src/Kokkos_Bitset.hpp index ea1d6dde5d26..c5b66f05a3ce 100644 --- a/packages/kokkos/containers/src/Kokkos_Bitset.hpp +++ b/packages/kokkos/containers/src/Kokkos_Bitset.hpp @@ -76,20 +76,25 @@ class Bitset { using execution_space = Device; using size_type = unsigned int; - enum { BIT_SCAN_REVERSE = 1u }; - enum { MOVE_HINT_BACKWARD = 2u }; - - enum { - BIT_SCAN_FORWARD_MOVE_HINT_FORWARD = 0u, - BIT_SCAN_REVERSE_MOVE_HINT_FORWARD = BIT_SCAN_REVERSE, - BIT_SCAN_FORWARD_MOVE_HINT_BACKWARD = MOVE_HINT_BACKWARD, - BIT_SCAN_REVERSE_MOVE_HINT_BACKWARD = BIT_SCAN_REVERSE | MOVE_HINT_BACKWARD - }; + static constexpr unsigned BIT_SCAN_REVERSE = 1u; + static constexpr unsigned MOVE_HINT_BACKWARD = 2u; + + static constexpr unsigned BIT_SCAN_FORWARD_MOVE_HINT_FORWARD = 0u; + static constexpr unsigned BIT_SCAN_REVERSE_MOVE_HINT_FORWARD = + BIT_SCAN_REVERSE; + static constexpr unsigned BIT_SCAN_FORWARD_MOVE_HINT_BACKWARD = + MOVE_HINT_BACKWARD; + static constexpr unsigned BIT_SCAN_REVERSE_MOVE_HINT_BACKWARD = + BIT_SCAN_REVERSE | MOVE_HINT_BACKWARD; private: - enum { block_size = static_cast(sizeof(unsigned) * CHAR_BIT) }; - enum { block_mask = block_size - 1u }; - enum { block_shift = Kokkos::Impl::integral_power_of_two(block_size) }; + enum : unsigned { + block_size = static_cast(sizeof(unsigned) * CHAR_BIT) + }; + enum : unsigned { block_mask = block_size - 1u }; + enum : unsigned { + block_shift = Kokkos::Impl::integral_power_of_two(block_size) + }; public: /// constructor @@ -317,14 +322,18 @@ class ConstBitset { enum { block_shift = Kokkos::Impl::integral_power_of_two(block_size) }; public: + KOKKOS_FUNCTION ConstBitset() : m_size(0) {} + KOKKOS_FUNCTION ConstBitset(Bitset const& rhs) : m_size(rhs.m_size), m_blocks(rhs.m_blocks) {} + KOKKOS_FUNCTION ConstBitset(ConstBitset const& rhs) : m_size(rhs.m_size), m_blocks(rhs.m_blocks) {} + KOKKOS_FUNCTION ConstBitset& operator=(Bitset const& rhs) { this->m_size = rhs.m_size; this->m_blocks = rhs.m_blocks; @@ -332,6 +341,7 @@ class ConstBitset { return *this; } + KOKKOS_FUNCTION ConstBitset& operator=(ConstBitset const& rhs) { this->m_size = rhs.m_size; this->m_blocks = rhs.m_blocks; diff --git a/packages/kokkos/containers/src/Kokkos_DualView.hpp b/packages/kokkos/containers/src/Kokkos_DualView.hpp index 45710d1f737c..f55d0f2b7f3f 100644 --- a/packages/kokkos/containers/src/Kokkos_DualView.hpp +++ b/packages/kokkos/containers/src/Kokkos_DualView.hpp @@ -597,8 +597,10 @@ class DualView : public ViewTraits { } if (std::is_same::value) { - typename t_dev::execution_space().fence(); - typename t_host::execution_space().fence(); + typename t_dev::execution_space().fence( + "Kokkos::DualView<>::sync: fence after syncing DualView"); + typename t_host::execution_space().fence( + "Kokkos::DualView<>::sync: fence after syncing DualView"); } } @@ -776,10 +778,11 @@ class DualView : public ViewTraits { /// If \c Device is the same as this DualView's device type, then /// mark the device's data as modified. Otherwise, mark the host's /// data as modified. - template + template * = + nullptr> void modify() { if (modified_flags.data() == nullptr) return; - if (impl_dualview_is_single_device::value) return; int dev = get_device_side(); if (dev == 1) { // if Device is the same as DualView's device type @@ -811,8 +814,17 @@ class DualView : public ViewTraits { #endif } + template < + class Device, class Dummy = DualView, + std::enable_if_t* = nullptr> + void modify() { + return; + } + + template * = + nullptr> inline void modify_host() { - if (impl_dualview_is_single_device::value) return; if (modified_flags.data() != nullptr) { modified_flags(0) = (modified_flags(1) > modified_flags(0) ? modified_flags(1) @@ -832,8 +844,17 @@ class DualView : public ViewTraits { } } + template < + class Dummy = DualView, + std::enable_if_t* = nullptr> + inline void modify_host() { + return; + } + + template * = + nullptr> inline void modify_device() { - if (impl_dualview_is_single_device::value) return; if (modified_flags.data() != nullptr) { modified_flags(1) = (modified_flags(1) > modified_flags(0) ? modified_flags(1) @@ -853,6 +874,13 @@ class DualView : public ViewTraits { } } + template < + class Dummy = DualView, + std::enable_if_t* = nullptr> + inline void modify_device() { + return; + } + inline void clear_sync_state() { if (modified_flags.data() != nullptr) modified_flags(1) = modified_flags(0) = 0; @@ -875,8 +903,15 @@ class DualView : public ViewTraits { const size_t n5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, const size_t n6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, const size_t n7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG) { - ::Kokkos::realloc(d_view, n0, n1, n2, n3, n4, n5, n6, n7); - h_view = create_mirror_view(d_view); + const size_t new_extents[8] = {n0, n1, n2, n3, n4, n5, n6, n7}; + const bool sizeMismatch = + Impl::size_mismatch(h_view, h_view.rank_dynamic, new_extents); + + if (sizeMismatch) { + ::Kokkos::realloc(d_view, n0, n1, n2, n3, n4, n5, n6, n7); + h_view = create_mirror_view(d_view); + } else + ::Kokkos::deep_copy(d_view, typename t_dev::value_type{}); /* Reset dirty flags */ if (modified_flags.data() == nullptr) { @@ -897,41 +932,31 @@ class DualView : public ViewTraits { const size_t n5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, const size_t n6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG, const size_t n7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG) { + const size_t new_extents[8] = {n0, n1, n2, n3, n4, n5, n6, n7}; + const bool sizeMismatch = + Impl::size_mismatch(h_view, h_view.rank_dynamic, new_extents); + if (modified_flags.data() == nullptr) { modified_flags = t_modified_flags("DualView::modified_flags"); } if (modified_flags(1) >= modified_flags(0)) { /* Resize on Device */ - ::Kokkos::resize(d_view, n0, n1, n2, n3, n4, n5, n6, n7); - h_view = create_mirror_view(d_view); - - /* Mark Device copy as modified */ - modified_flags(1) = modified_flags(1) + 1; + if (sizeMismatch) { + ::Kokkos::resize(d_view, n0, n1, n2, n3, n4, n5, n6, n7); + h_view = create_mirror_view(d_view); + /* Mark Device copy as modified */ + modified_flags(1) = modified_flags(1) + 1; + } } else { /* Realloc on Device */ - - ::Kokkos::realloc(d_view, n0, n1, n2, n3, n4, n5, n6, n7); - - const bool sizeMismatch = - (h_view.extent(0) != n0) || (h_view.extent(1) != n1) || - (h_view.extent(2) != n2) || (h_view.extent(3) != n3) || - (h_view.extent(4) != n4) || (h_view.extent(5) != n5) || - (h_view.extent(6) != n6) || (h_view.extent(7) != n7); - if (sizeMismatch) + if (sizeMismatch) { ::Kokkos::resize(h_view, n0, n1, n2, n3, n4, n5, n6, n7); + d_view = create_mirror_view(typename t_dev::execution_space(), h_view); - t_host temp_view = create_mirror_view(d_view); - - /* Remap on Host */ - Kokkos::deep_copy(temp_view, h_view); - - h_view = temp_view; - - d_view = create_mirror_view(typename t_dev::execution_space(), h_view); - - /* Mark Host copy as modified */ - modified_flags(0) = modified_flags(0) + 1; + /* Mark Host copy as modified */ + modified_flags(0) = modified_flags(0) + 1; + } } } diff --git a/packages/kokkos/containers/src/Kokkos_DynRankView.hpp b/packages/kokkos/containers/src/Kokkos_DynRankView.hpp index c6323fef9369..b673c53a4ef8 100644 --- a/packages/kokkos/containers/src/Kokkos_DynRankView.hpp +++ b/packages/kokkos/containers/src/Kokkos_DynRankView.hpp @@ -1140,7 +1140,8 @@ class DynRankView : public ViewTraits { // to avoid incomplete type errors from usng Kokkos::Cuda directly. if (std::is_same::value) { - typename traits::device_type::memory_space::execution_space().fence(); + typename traits::device_type::memory_space::execution_space().fence( + "Kokkos::DynRankView<>::DynRankView: fence before UVM allocation"); } #endif //------------------------------------------------------------ @@ -1154,7 +1155,8 @@ class DynRankView : public ViewTraits { #if defined(KOKKOS_ENABLE_CUDA) if (std::is_same::value) { - typename traits::device_type::memory_space::execution_space().fence(); + typename traits::device_type::memory_space::execution_space().fence( + "Kokkos::DynRankView<>::DynRankView: fence after UVM allocation"); } #endif //------------------------------------------------------------ @@ -1404,7 +1406,7 @@ class ViewMapping< template struct apply { - static_assert(Kokkos::Impl::is_memory_traits::value, ""); + static_assert(Kokkos::is_memory_traits::value, ""); using traits_type = Kokkos::ViewTraits& lhs, namespace Kokkos { namespace Impl { -template +template struct DynRankViewFill { using const_value_type = typename OutputView::traits::const_value_type; @@ -1693,9 +1695,11 @@ inline void deep_copy( typename ViewTraits::value_type>::value, "deep_copy requires non-const type"); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::deep_copy(DynRankView, value_type): fence before filling view"); Kokkos::Impl::DynRankViewFill >(dst, value); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::deep_copy(DynRankView, value_type): fence after filling view"); } /** \brief Deep copy into a value in Host memory from a view. */ @@ -1711,10 +1715,13 @@ inline void deep_copy( using src_traits = ViewTraits; using src_memory_space = typename src_traits::memory_space; - Kokkos::fence(); + Kokkos::fence( + "Kokkos::deep_copy(value_type, DynRankView): fence before copying " + "value"); Kokkos::Impl::DeepCopy(&dst, src.data(), sizeof(ST)); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::deep_copy(value_type, DynRankView): fence after copying value"); } //---------------------------------------------------------------------------- @@ -1744,14 +1751,14 @@ inline void deep_copy( enum { DstExecCanAccessSrc = - Kokkos::Impl::SpaceAccessibility::accessible + Kokkos::SpaceAccessibility::accessible }; enum { SrcExecCanAccessDst = - Kokkos::Impl::SpaceAccessibility::accessible + Kokkos::SpaceAccessibility::accessible }; if ((void*)dst.data() != (void*)src.data()) { @@ -1762,10 +1769,14 @@ inline void deep_copy( // memory then can byte-wise copy if (rank(src) == 0 && rank(dst) == 0) { using value_type = typename dst_type::value_type; - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence before " + "copying rank-0 views"); Kokkos::Impl::DeepCopy( dst.data(), src.data(), sizeof(value_type)); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence after " + "copying rank-0 views"); } else if (std::is_same< typename DstType::traits::value_type, typename SrcType::traits::non_const_value_type>::value && @@ -1787,10 +1798,14 @@ inline void deep_copy( dst.extent(6) == src.extent(6) && dst.extent(7) == src.extent(7)) { const size_t nbytes = sizeof(typename dst_type::value_type) * dst.span(); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence before " + "copying rank-1 views"); Kokkos::Impl::DeepCopy( dst.data(), src.data(), nbytes); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence after " + "copying rank-1 views"); } else if (std::is_same< typename DstType::traits::value_type, typename SrcType::traits::non_const_value_type>::value && @@ -1817,29 +1832,43 @@ inline void deep_copy( dst.stride_6() == src.stride_6() && dst.stride_7() == src.stride_7()) { const size_t nbytes = sizeof(typename dst_type::value_type) * dst.span(); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence before " + "copying rank-1 views"); Kokkos::Impl::DeepCopy( dst.data(), src.data(), nbytes); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence after " + "copying rank-1 views"); } else if (DstExecCanAccessSrc) { // Copying data between views in accessible memory spaces and either // non-contiguous or incompatible shape. - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence before " + "remapping views of incompatible shape"); Kokkos::Impl::DynRankViewRemap(dst, src); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence after " + "remapping views of incompatible shape"); } else if (SrcExecCanAccessDst) { // Copying data between views in accessible memory spaces and either // non-contiguous or incompatible shape. - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence before " + "remapping views of incompatible shape"); Kokkos::Impl::DynRankViewRemap( dst, src); - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence after " + "remapping views of incompatible shape"); } else { Kokkos::Impl::throw_runtime_exception( "deep_copy given views that would require a temporary allocation"); } } else { - Kokkos::fence(); + Kokkos::fence( + "Kokkos::Impl::DeepCopy(DynRankView, DynRankView): fence due to same " + "src and dst"); } } diff --git a/packages/kokkos/containers/src/Kokkos_DynamicView.hpp b/packages/kokkos/containers/src/Kokkos_DynamicView.hpp index cc949d4c556a..2c764f535c58 100644 --- a/packages/kokkos/containers/src/Kokkos_DynamicView.hpp +++ b/packages/kokkos/containers/src/Kokkos_DynamicView.hpp @@ -53,36 +53,201 @@ namespace Kokkos { namespace Experimental { -// Simple metafunction for choosing memory space -// In the current implementation, if memory_space == CudaSpace, -// use CudaUVMSpace for the chunk 'array' allocation, which -// contains will contain pointers to chunks of memory allocated -// in CudaSpace namespace Impl { -template -struct ChunkArraySpace { - using memory_space = MemSpace; -}; -#ifdef KOKKOS_ENABLE_CUDA -template <> -struct ChunkArraySpace { - using memory_space = typename Kokkos::CudaUVMSpace; -}; -#endif -#ifdef KOKKOS_ENABLE_HIP -template <> -struct ChunkArraySpace { - using memory_space = typename Kokkos::Experimental::HIPHostPinnedSpace; -}; -#endif -#ifdef KOKKOS_ENABLE_SYCL -template <> -struct ChunkArraySpace { - using memory_space = typename Kokkos::Experimental::SYCLSharedUSMSpace; +/// Utility class to manage memory for chunked arrays on the host and +/// device. Allocates/deallocates memory on both the host and device along with +/// providing utilities for creating mirrors and deep copying between them. +template +struct ChunkedArrayManager { + using value_type = ValueType; + using pointer_type = ValueType*; + using track_type = Kokkos::Impl::SharedAllocationTracker; + + ChunkedArrayManager() = default; + ChunkedArrayManager(ChunkedArrayManager const&) = default; + ChunkedArrayManager(ChunkedArrayManager&&) = default; + ChunkedArrayManager& operator=(ChunkedArrayManager&&) = default; + ChunkedArrayManager& operator=(const ChunkedArrayManager&) = default; + + template + friend struct ChunkedArrayManager; + + template + inline ChunkedArrayManager(const ChunkedArrayManager& rhs) + : m_valid(rhs.m_valid), + m_chunk_max(rhs.m_chunk_max), + m_chunks((ValueType**)(rhs.m_chunks)), + m_track(rhs.m_track), + m_chunk_size(rhs.m_chunk_size) { + static_assert( + Kokkos::Impl::MemorySpaceAccess::assignable, + "Incompatible ChunkedArrayManager copy construction"); + } + + ChunkedArrayManager(const unsigned arg_chunk_max, + const unsigned arg_chunk_size) + : m_chunk_max(arg_chunk_max), m_chunk_size(arg_chunk_size) {} + + private: + struct ACCESSIBLE_TAG {}; + struct INACCESSIBLE_TAG {}; + + ChunkedArrayManager(ACCESSIBLE_TAG, pointer_type* arg_chunks, + const unsigned arg_chunk_max) + : m_valid(true), m_chunk_max(arg_chunk_max), m_chunks(arg_chunks) {} + + ChunkedArrayManager(INACCESSIBLE_TAG, const unsigned arg_chunk_max, + const unsigned arg_chunk_size) + : m_chunk_max(arg_chunk_max), m_chunk_size(arg_chunk_size) {} + + public: + template + struct IsAccessibleFrom; + + template + struct IsAccessibleFrom< + Space, typename std::enable_if_t::accessible>> : std::true_type {}; + + template + struct IsAccessibleFrom< + Space, typename std::enable_if_t::accessible>> : std::false_type {}; + + template + static ChunkedArrayManager create_mirror( + ChunkedArrayManager const& other, + typename std::enable_if::value>::type* = + nullptr) { + return ChunkedArrayManager{ + ACCESSIBLE_TAG{}, other.m_chunks, other.m_chunk_max}; + } + + template + static ChunkedArrayManager create_mirror( + ChunkedArrayManager const& other, + typename std::enable_if::value>::type* = + nullptr) { + using tag_type = + typename ChunkedArrayManager::INACCESSIBLE_TAG; + return ChunkedArrayManager{tag_type{}, other.m_chunk_max, + other.m_chunk_size}; + } + + public: + void allocate_device(const std::string& label) { + if (m_chunks == nullptr) { + m_chunks = reinterpret_cast(MemorySpace().allocate( + label.c_str(), (sizeof(pointer_type) * (m_chunk_max + 2)))); + } + } + + void initialize() { + for (unsigned i = 0; i < m_chunk_max + 2; i++) { + m_chunks[i] = nullptr; + } + m_valid = true; + } + + private: + /// Custom destroy functor for deallocating array chunks along with a linked + /// allocation + template + struct Destroy { + Destroy() = default; + Destroy(Destroy&&) = default; + Destroy(const Destroy&) = default; + Destroy& operator=(Destroy&&) = default; + Destroy& operator=(const Destroy&) = default; + + Destroy(std::string label, value_type** arg_chunk, + const unsigned arg_chunk_max, const unsigned arg_chunk_size, + value_type** arg_linked) + : m_label(label), + m_chunks(arg_chunk), + m_linked(arg_linked), + m_chunk_max(arg_chunk_max), + m_chunk_size(arg_chunk_size) {} + + void execute() { + // Destroy the array of chunk pointers. + // Two entries beyond the max chunks are allocation counters. + for (unsigned i = 0; i < m_chunk_max; i++) { + Space().deallocate(m_label.c_str(), m_chunks[i], + sizeof(value_type) * m_chunk_size); + } + // Destroy the linked allocation if we have one. + if (m_linked != nullptr) { + Space().deallocate(m_label.c_str(), m_linked, + (sizeof(value_type*) * (m_chunk_max + 2))); + } + } + + void destroy_shared_allocation() { execute(); } + + std::string m_label; + value_type** m_chunks = nullptr; + value_type** m_linked = nullptr; + unsigned m_chunk_max; + unsigned m_chunk_size; + }; + + public: + template + void allocate_with_destroy(const std::string& label, + pointer_type* linked_allocation = nullptr) { + using destroy_type = Destroy; + using record_type = + Kokkos::Impl::SharedAllocationRecord; + + // Allocate + 2 extra slots so that *m_chunk[m_chunk_max] == + // num_chunks_alloc and *m_chunk[m_chunk_max+1] == extent This must match in + // Destroy's execute(...) method + record_type* const record = record_type::allocate( + MemorySpace(), label, (sizeof(pointer_type) * (m_chunk_max + 2))); + m_chunks = static_cast(record->data()); + m_track.assign_allocated_record_to_uninitialized(record); + + record->m_destroy = destroy_type(label, m_chunks, m_chunk_max, m_chunk_size, + linked_allocation); + } + + pointer_type* get_ptr() const { return m_chunks; } + + template + typename std::enable_if::value>::type deep_copy_to( + ChunkedArrayManager const& other) { + Kokkos::Impl::DeepCopy( + other.m_chunks, m_chunks, sizeof(pointer_type) * (m_chunk_max + 2)); + } + + template + typename std::enable_if::value>::type deep_copy_to( + ChunkedArrayManager const&) { + // no-op + } + + KOKKOS_INLINE_FUNCTION + pointer_type* operator+(int i) const { return m_chunks + i; } + + KOKKOS_INLINE_FUNCTION + pointer_type& operator[](int i) const { return m_chunks[i]; } + + track_type const& track() const { return m_track; } + + KOKKOS_INLINE_FUNCTION + bool valid() const { return m_valid; } + + private: + bool m_valid = false; + unsigned m_chunk_max = 0; + pointer_type* m_chunks = nullptr; + track_type m_track; + unsigned m_chunk_size = 0; }; -#endif -} // end namespace Impl + +} /* end namespace Impl */ /** \brief Dynamic views are restricted to rank-one and no layout. * Resize only occurs on host outside of parallel_regions. @@ -93,6 +258,13 @@ class DynamicView : public Kokkos::ViewTraits { public: using traits = Kokkos::ViewTraits; + using value_type = typename traits::value_type; + using device_space = typename traits::memory_space; + using host_space = + typename Kokkos::Impl::HostMirror::Space::memory_space; + using device_accessor = Impl::ChunkedArrayManager; + using host_accessor = Impl::ChunkedArrayManager; + private: template friend class DynamicView; @@ -108,7 +280,7 @@ class DynamicView : public Kokkos::ViewTraits { "DynamicView only implemented for non-specialized View type"); template ::accessible> + Space, device_space>::accessible> struct verify_space { KOKKOS_FORCEINLINE_FUNCTION static void check() {} }; @@ -123,9 +295,8 @@ class DynamicView : public Kokkos::ViewTraits { }; private: - track_type m_track; - typename traits::value_type** m_chunks = - nullptr; // array of pointers to 'chunks' of memory + device_accessor m_chunks; + host_accessor m_chunks_host; unsigned m_chunk_shift; // ceil(log2(m_chunk_size)) unsigned m_chunk_mask; // m_chunk_size - 1 unsigned m_chunk_max; // number of entries in the chunk array - each pointing @@ -173,7 +344,8 @@ class DynamicView : public Kokkos::ViewTraits { KOKKOS_INLINE_FUNCTION size_t allocation_extent() const noexcept { - uintptr_t n = *reinterpret_cast(m_chunks + m_chunk_max); + uintptr_t n = + *reinterpret_cast(m_chunks_host + m_chunk_max); return (n << m_chunk_shift); } @@ -183,7 +355,7 @@ class DynamicView : public Kokkos::ViewTraits { KOKKOS_INLINE_FUNCTION size_t size() const noexcept { size_t extent_0 = - *reinterpret_cast(m_chunks + m_chunk_max + 1); + *reinterpret_cast(m_chunks_host + m_chunk_max + 1); return extent_0; } @@ -215,10 +387,10 @@ class DynamicView : public Kokkos::ViewTraits { // Allocation tracking properties KOKKOS_INLINE_FUNCTION - int use_count() const { return m_track.use_count(); } + int use_count() const { return m_chunks_host.track().use_count(); } inline const std::string label() const { - return m_track.template get_label(); + return m_chunks_host.track().template get_label(); } //---------------------------------------------------------------------- @@ -285,13 +457,7 @@ class DynamicView : public Kokkos::ViewTraits { * up to the maximum number of chunks * */ template - inline typename std::enable_if< - std::is_integral::value && - Kokkos::Impl::MemorySpaceAccess< - Kokkos::HostSpace, - typename Impl::ChunkArraySpace< - typename traits::memory_space>::memory_space>::accessible>::type - resize_serial(IntType const& n) { + inline void resize_serial(IntType const& n) { using local_value_type = typename traits::value_type; using value_pointer_type = local_value_type*; @@ -304,37 +470,40 @@ class DynamicView : public Kokkos::ViewTraits { } // *m_chunks[m_chunk_max] stores the current number of chunks being used - uintptr_t* const pc = reinterpret_cast(m_chunks + m_chunk_max); - std::string _label = - m_track.template get_label(); + uintptr_t* const pc = + reinterpret_cast(m_chunks_host + m_chunk_max); + std::string _label = m_chunks_host.track().template get_label(); + if (*pc < NC) { while (*pc < NC) { - m_chunks[*pc] = reinterpret_cast( - typename traits::memory_space().allocate( + m_chunks_host[*pc] = + reinterpret_cast(device_space().allocate( _label.c_str(), sizeof(local_value_type) << m_chunk_shift)); ++*pc; } } else { while (NC + 1 <= *pc) { --*pc; - typename traits::memory_space().deallocate( - _label.c_str(), m_chunks[*pc], - sizeof(local_value_type) << m_chunk_shift); - m_chunks[*pc] = nullptr; + device_space().deallocate(_label.c_str(), m_chunks_host[*pc], + sizeof(local_value_type) << m_chunk_shift); + m_chunks_host[*pc] = nullptr; } } - // *m_chunks[m_chunk_max+1] stores the 'extent' requested by resize + // *m_chunks_host[m_chunk_max+1] stores the 'extent' requested by resize *(pc + 1) = n; + + m_chunks_host.deep_copy_to(m_chunks); } KOKKOS_INLINE_FUNCTION bool is_allocated() const { - if (m_chunks == nullptr) { - return false; - } else { - // *m_chunks[m_chunk_max] stores the current number of chunks being used + if (m_chunks_host.valid()) { + // *m_chunks_host[m_chunk_max] stores the current number of chunks being + // used uintptr_t* const pc = - reinterpret_cast(m_chunks + m_chunk_max); + reinterpret_cast(m_chunks_host + m_chunk_max); return (*(pc + 1) > 0); + } else { + return false; } } @@ -349,8 +518,8 @@ class DynamicView : public Kokkos::ViewTraits { template DynamicView(const DynamicView& rhs) - : m_track(rhs.m_track), - m_chunks((typename traits::value_type**)rhs.m_chunks), + : m_chunks(rhs.m_chunks), + m_chunks_host(rhs.m_chunks_host), m_chunk_shift(rhs.m_chunk_shift), m_chunk_mask(rhs.m_chunk_mask), m_chunk_max(rhs.m_chunk_max), @@ -361,63 +530,6 @@ class DynamicView : public Kokkos::ViewTraits { "Incompatible DynamicView copy construction"); } - //---------------------------------------------------------------------- - - struct Destroy { - using local_value_type = typename traits::value_type; - std::string m_label; - local_value_type** m_chunks; - unsigned m_chunk_max; - bool m_destroy; - unsigned m_chunk_size; - - // Initialize or destroy array of chunk pointers. - // Two entries beyond the max chunks are allocation counters. - inline void operator()(unsigned i) const { - if (m_destroy && i < m_chunk_max && nullptr != m_chunks[i]) { - typename traits::memory_space().deallocate( - m_label.c_str(), m_chunks[i], - sizeof(local_value_type) * m_chunk_size); - } - m_chunks[i] = nullptr; - } - - void execute(bool arg_destroy) { - using Range = Kokkos::RangePolicy; - - m_destroy = arg_destroy; - - Kokkos::Impl::ParallelFor closure( - *this, - Range(0, m_chunk_max + 2)); // Add 2 to 'destroy' extra slots storing - // num_chunks and extent; previously + 1 - - closure.execute(); - - typename traits::execution_space().fence(); - // Impl::ChunkArraySpace< typename traits::memory_space - // >::memory_space::execution_space().fence(); - } - - void construct_shared_allocation() { execute(false); } - - void destroy_shared_allocation() { execute(true); } - - Destroy() = default; - Destroy(Destroy&&) = default; - Destroy(const Destroy&) = default; - Destroy& operator=(Destroy&&) = default; - Destroy& operator=(const Destroy&) = default; - - Destroy(std::string label, typename traits::value_type** arg_chunk, - const unsigned arg_chunk_max, const unsigned arg_chunk_size) - : m_label(label), - m_chunks(arg_chunk), - m_chunk_max(arg_chunk_max), - m_destroy(false), - m_chunk_size(arg_chunk_size) {} - }; - /**\brief Allocation constructor * * Memory is allocated in chunks @@ -427,10 +539,7 @@ class DynamicView : public Kokkos::ViewTraits { explicit inline DynamicView(const std::string& arg_label, const unsigned min_chunk_size, const unsigned max_extent) - : m_track(), - m_chunks(nullptr) - // The chunk size is guaranteed to be a power of two - , + : // The chunk size is guaranteed to be a power of two m_chunk_shift(Kokkos::Impl::integral_power_of_two_that_contains( min_chunk_size)) // div ceil(log2(min_chunk_size)) , @@ -440,28 +549,22 @@ class DynamicView : public Kokkos::ViewTraits { m_chunk_shift) // max num pointers-to-chunks in array , m_chunk_size(2 << (m_chunk_shift - 1)) { - using chunk_array_memory_space = typename Impl::ChunkArraySpace< - typename traits::memory_space>::memory_space; - // A functor to deallocate all of the chunks upon final destruction - using record_type = - Kokkos::Impl::SharedAllocationRecord; - - // Allocate chunk pointers and allocation counter - record_type* const record = - record_type::allocate(chunk_array_memory_space(), arg_label, - (sizeof(pointer_type) * (m_chunk_max + 2))); - // Allocate + 2 extra slots so that *m_chunk[m_chunk_max] == - // num_chunks_alloc and *m_chunk[m_chunk_max+1] == extent This must match in - // Destroy's execute(...) method - - m_chunks = reinterpret_cast(record->data()); - - record->m_destroy = Destroy(arg_label, m_chunks, m_chunk_max, m_chunk_size); + m_chunks = device_accessor(m_chunk_max, m_chunk_size); - // Initialize to zero - record->m_destroy.construct_shared_allocation(); - - m_track.assign_allocated_record_to_uninitialized(record); + if (device_accessor::template IsAccessibleFrom::value) { + m_chunks.template allocate_with_destroy(arg_label); + m_chunks.initialize(); + m_chunks_host = + device_accessor::template create_mirror(m_chunks); + } else { + m_chunks.allocate_device(arg_label); + m_chunks_host = + device_accessor::template create_mirror(m_chunks); + m_chunks_host.template allocate_with_destroy( + arg_label, m_chunks.get_ptr()); + m_chunks_host.initialize(); + m_chunks_host.deep_copy_to(m_chunks); + } } }; @@ -487,8 +590,8 @@ inline void deep_copy(const View& dst, enum { DstExecCanAccessSrc = - Kokkos::Impl::SpaceAccessibility::accessible + Kokkos::SpaceAccessibility::accessible }; if (DstExecCanAccessSrc) { @@ -512,8 +615,8 @@ inline void deep_copy(const Kokkos::Experimental::DynamicView& dst, enum { DstExecCanAccessSrc = - Kokkos::Impl::SpaceAccessibility::accessible + Kokkos::SpaceAccessibility::accessible }; if (DstExecCanAccessSrc) { diff --git a/packages/kokkos/containers/src/Kokkos_ErrorReporter.hpp b/packages/kokkos/containers/src/Kokkos_ErrorReporter.hpp index fbfaed9b1bcd..18f026dc6ffc 100644 --- a/packages/kokkos/containers/src/Kokkos_ErrorReporter.hpp +++ b/packages/kokkos/containers/src/Kokkos_ErrorReporter.hpp @@ -187,7 +187,8 @@ template void ErrorReporter::resize(const size_t new_size) { m_reports.resize(new_size); m_reporters.resize(new_size); - typename DeviceType::execution_space().fence(); + typename DeviceType::execution_space().fence( + "Kokkos::Experimental::ErrorReporter::resize: fence after resizing"); } } // namespace Experimental diff --git a/packages/kokkos/containers/src/Kokkos_OffsetView.hpp b/packages/kokkos/containers/src/Kokkos_OffsetView.hpp index 0f21a08ba3ba..57bf745d4038 100644 --- a/packages/kokkos/containers/src/Kokkos_OffsetView.hpp +++ b/packages/kokkos/containers/src/Kokkos_OffsetView.hpp @@ -116,8 +116,7 @@ KOKKOS_INLINE_FUNCTION void offsetview_verify_operator_bounds( This check should cover the case of Views that don't have the Unmanaged trait but were initialized by pointer. */ if (tracker.has_record()) { - Kokkos::Impl::operator_bounds_error_on_device( - map, Kokkos::Impl::has_printable_label_typedef()); + Kokkos::Impl::operator_bounds_error_on_device(map); } else { Kokkos::abort("OffsetView bounds error"); } @@ -1244,7 +1243,8 @@ class OffsetView : public ViewTraits { // to avoid incomplete type errors from usng Kokkos::Cuda directly. if (std::is_same::value) { - typename traits::device_type::memory_space::execution_space().fence(); + typename traits::device_type::memory_space::execution_space().fence( + "Kokkos::OffsetView::OffsetView(): fence before UVM allocation"); } #endif //------------------------------------------------------------ @@ -1256,7 +1256,8 @@ class OffsetView : public ViewTraits { #if defined(KOKKOS_ENABLE_CUDA) if (std::is_same::value) { - typename traits::device_type::memory_space::execution_space().fence(); + typename traits::device_type::memory_space::execution_space().fence( + "Kokkos::OffsetView::OffsetView(): fence after UVM allocation"); } #endif //------------------------------------------------------------ diff --git a/packages/kokkos/containers/src/Kokkos_ScatterView.hpp b/packages/kokkos/containers/src/Kokkos_ScatterView.hpp index dcd4cf73e5d7..79bc43b7393d 100644 --- a/packages/kokkos/containers/src/Kokkos_ScatterView.hpp +++ b/packages/kokkos/containers/src/Kokkos_ScatterView.hpp @@ -834,7 +834,7 @@ class ScatterView::value, "ScatterView contribute destination has different layout"); static_assert( - Kokkos::Impl::SpaceAccessibility< + Kokkos::SpaceAccessibility< execution_space, typename dest_type::memory_space>::accessible, "ScatterView contribute destination memory space not accessible"); if (dest.data() == internal_view.data()) return; @@ -1061,7 +1061,7 @@ class ScatterView::value, "ScatterView deep_copy destination has different layout"); static_assert( - Kokkos::Impl::SpaceAccessibility< + Kokkos::SpaceAccessibility< execution_space, typename dest_type::memory_space>::accessible, "ScatterView deep_copy destination memory space not accessible"); bool is_equal = (dest.data() == internal_view.data()); @@ -1290,7 +1290,7 @@ class ScatterView::value, "ScatterView deep_copy destination has different layout"); static_assert( - Kokkos::Impl::SpaceAccessibility< + Kokkos::SpaceAccessibility< execution_space, typename dest_type::memory_space>::accessible, "ScatterView deep_copy destination memory space not accessible"); auto extent = internal_view.extent(internal_view_type::rank - 1); diff --git a/packages/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp b/packages/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp index 81be3ee2d3e8..cd633e403101 100644 --- a/packages/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp +++ b/packages/kokkos/containers/src/Kokkos_StaticCrsGraph.hpp @@ -405,7 +405,9 @@ class StaticCrsGraph { Kokkos::parallel_for("Kokkos::StaticCrsGraph::create_block_partitioning", Kokkos::RangePolicy(0, numRows()), partitioner); - typename device_type::execution_space().fence(); + typename device_type::execution_space().fence( + "Kokkos::StaticCrsGraph::create_block_partitioning:: fence after " + "partition"); row_block_offsets = block_offsets; } diff --git a/packages/kokkos/containers/src/Kokkos_UnorderedMap.hpp b/packages/kokkos/containers/src/Kokkos_UnorderedMap.hpp index edb0e7261da9..a1601eee3586 100644 --- a/packages/kokkos/containers/src/Kokkos_UnorderedMap.hpp +++ b/packages/kokkos/containers/src/Kokkos_UnorderedMap.hpp @@ -345,7 +345,8 @@ class UnorderedMap { const impl_value_type tmp = impl_value_type(); Kokkos::deep_copy(m_values, tmp); } - { Kokkos::deep_copy(m_scalars, 0); } + Kokkos::deep_copy(m_scalars, 0); + m_size = 0; } KOKKOS_INLINE_FUNCTION constexpr bool is_allocated() const { @@ -393,9 +394,9 @@ class UnorderedMap { /// /// This method has undefined behavior when erasable() is true. /// - /// Note that this is not a device function; it cannot be called in + /// Note that this is not a device function; it cannot be called in /// a parallel kernel. The value is not stored as a variable; it - /// must be computed. + /// must be computed. m_size is a mutable cache of that value. size_type size() const { if (capacity() == 0u) return 0u; if (modified()) { @@ -419,9 +420,13 @@ class UnorderedMap { bool begin_erase() { bool result = !erasable(); if (is_insertable_map && result) { - execution_space().fence(); + execution_space().fence( + "Kokkos::UnorderedMap::begin_erase: fence before setting erasable " + "flag"); set_flag(erasable_idx); - execution_space().fence(); + execution_space().fence( + "Kokkos::UnorderedMap::begin_erase: fence after setting erasable " + "flag"); } return result; } @@ -429,10 +434,12 @@ class UnorderedMap { bool end_erase() { bool result = erasable(); if (is_insertable_map && result) { - execution_space().fence(); + execution_space().fence( + "Kokkos::UnorderedMap::end_erase: fence before erasing"); Impl::UnorderedMapErase f(*this); f.apply(); - execution_space().fence(); + execution_space().fence( + "Kokkos::UnorderedMap::end_erase: fence after erasing"); reset_flag(erasable_idx); } return result; diff --git a/packages/kokkos/containers/src/Kokkos_Vector.hpp b/packages/kokkos/containers/src/Kokkos_Vector.hpp index a1fbba6b21c7..88721bd89eb2 100644 --- a/packages/kokkos/containers/src/Kokkos_Vector.hpp +++ b/packages/kokkos/containers/src/Kokkos_Vector.hpp @@ -119,12 +119,14 @@ class vector : public DualView { if (DV::template need_sync()) { set_functor_host f(DV::h_view, val); parallel_for("Kokkos::vector::assign", n, f); - typename DV::t_host::execution_space().fence(); + typename DV::t_host::execution_space().fence( + "Kokkos::vector::assign: fence after assigning values"); DV::template modify(); } else { set_functor f(DV::d_view, val); parallel_for("Kokkos::vector::assign", n, f); - typename DV::t_dev::execution_space().fence(); + typename DV::t_dev::execution_space().fence( + "Kokkos::vector::assign: fence after assigning values"); DV::template modify(); } } diff --git a/packages/kokkos/containers/src/impl/Kokkos_Bitset_impl.hpp b/packages/kokkos/containers/src/impl/Kokkos_Bitset_impl.hpp index 6047e60f3dd0..9512f2d4a20e 100644 --- a/packages/kokkos/containers/src/impl/Kokkos_Bitset_impl.hpp +++ b/packages/kokkos/containers/src/impl/Kokkos_Bitset_impl.hpp @@ -57,22 +57,10 @@ namespace Kokkos { namespace Impl { -KOKKOS_FORCEINLINE_FUNCTION -unsigned rotate_left(unsigned i, int r) { - constexpr int size = static_cast(sizeof(unsigned) * CHAR_BIT); - return r ? ((i << r) | (i >> (size - r))) : i; -} - KOKKOS_FORCEINLINE_FUNCTION unsigned rotate_right(unsigned i, int r) { constexpr int size = static_cast(sizeof(unsigned) * CHAR_BIT); - // FIXME_SYCL llvm.fshr.i32 missing - // (https://github.com/intel/llvm/issues/3308) -#ifdef __SYCL_DEVICE_ONLY__ - return rotate_left(i, size - r); -#else return r ? ((i >> r) | (i << (size - r))) : i; -#endif } template diff --git a/packages/kokkos/containers/src/impl/Kokkos_Functional_impl.hpp b/packages/kokkos/containers/src/impl/Kokkos_Functional_impl.hpp index 367ab3385720..fdd78e4e5f99 100644 --- a/packages/kokkos/containers/src/impl/Kokkos_Functional_impl.hpp +++ b/packages/kokkos/containers/src/impl/Kokkos_Functional_impl.hpp @@ -75,7 +75,7 @@ uint32_t fmix32(uint32_t h) { KOKKOS_INLINE_FUNCTION uint32_t MurmurHash3_x86_32(const void* key, int len, uint32_t seed) { - const uint8_t* data = (const uint8_t*)key; + const uint8_t* data = static_cast(key); const int nblocks = len / 4; uint32_t h1 = seed; diff --git a/packages/kokkos/containers/unit_tests/TestDualView.hpp b/packages/kokkos/containers/unit_tests/TestDualView.hpp index 3eee85ed10bd..e22564aa5c24 100644 --- a/packages/kokkos/containers/unit_tests/TestDualView.hpp +++ b/packages/kokkos/containers/unit_tests/TestDualView.hpp @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include namespace Test { diff --git a/packages/kokkos/containers/unit_tests/TestDynViewAPI.hpp b/packages/kokkos/containers/unit_tests/TestDynViewAPI.hpp index dd0199ed81c7..a8d62bd24cad 100644 --- a/packages/kokkos/containers/unit_tests/TestDynViewAPI.hpp +++ b/packages/kokkos/containers/unit_tests/TestDynViewAPI.hpp @@ -702,6 +702,11 @@ class TestDynViewAPI { using View0 = Kokkos::View; using View1 = Kokkos::View; + using View2 = Kokkos::View; + using View3 = Kokkos::View; + using View4 = Kokkos::View; + using View5 = Kokkos::View; + using View6 = Kokkos::View; using View7 = Kokkos::View; using host_view_space = typename View0::host_mirror_space; @@ -1065,7 +1070,7 @@ class TestDynViewAPI { dView0 d_uninitialized( Kokkos::view_alloc(Kokkos::WithoutInitializing, "uninit"), 10, 20); - ASSERT_TRUE(d_uninitialized.data() != nullptr); + ASSERT_NE(d_uninitialized.data(), nullptr); ASSERT_EQ(d_uninitialized.rank(), 2); ASSERT_EQ(d_uninitialized.extent(0), 10); ASSERT_EQ(d_uninitialized.extent(1), 20); @@ -1075,14 +1080,14 @@ class TestDynViewAPI { hView0 hx, hy, hz; ASSERT_TRUE(Kokkos::is_dyn_rank_view::value); - ASSERT_FALSE(Kokkos::is_dyn_rank_view >::value); - - ASSERT_TRUE(dx.data() == nullptr); // Okay with UVM - ASSERT_TRUE(dy.data() == nullptr); // Okay with UVM - ASSERT_TRUE(dz.data() == nullptr); // Okay with UVM - ASSERT_TRUE(hx.data() == nullptr); - ASSERT_TRUE(hy.data() == nullptr); - ASSERT_TRUE(hz.data() == nullptr); + ASSERT_FALSE(Kokkos::is_dyn_rank_view>::value); + + ASSERT_EQ(dx.data(), nullptr); // Okay with UVM + ASSERT_EQ(dy.data(), nullptr); // Okay with UVM + ASSERT_EQ(dz.data(), nullptr); // Okay with UVM + ASSERT_EQ(hx.data(), nullptr); + ASSERT_EQ(hy.data(), nullptr); + ASSERT_EQ(hz.data(), nullptr); ASSERT_EQ(dx.extent(0), 0u); // Okay with UVM ASSERT_EQ(dy.extent(0), 0u); // Okay with UVM ASSERT_EQ(dz.extent(0), 0u); // Okay with UVM @@ -1153,11 +1158,11 @@ class TestDynViewAPI { ASSERT_EQ(dx.use_count(), size_t(2)); - ASSERT_FALSE(dx.data() == nullptr); - ASSERT_FALSE(const_dx.data() == nullptr); - ASSERT_FALSE(unmanaged_dx.data() == nullptr); - ASSERT_FALSE(unmanaged_from_ptr_dx.data() == nullptr); - ASSERT_FALSE(dy.data() == nullptr); + ASSERT_NE(dx.data(), nullptr); + ASSERT_NE(const_dx.data(), nullptr); + ASSERT_NE(unmanaged_dx.data(), nullptr); + ASSERT_NE(unmanaged_from_ptr_dx.data(), nullptr); + ASSERT_NE(dy.data(), nullptr); ASSERT_NE(dx, dy); ASSERT_EQ(dx.extent(0), unsigned(N0)); @@ -1317,17 +1322,17 @@ class TestDynViewAPI { ASSERT_NE(dx, dz); dx = dView0(); - ASSERT_TRUE(dx.data() == nullptr); - ASSERT_FALSE(dy.data() == nullptr); - ASSERT_FALSE(dz.data() == nullptr); + ASSERT_EQ(dx.data(), nullptr); + ASSERT_NE(dy.data(), nullptr); + ASSERT_NE(dz.data(), nullptr); dy = dView0(); - ASSERT_TRUE(dx.data() == nullptr); - ASSERT_TRUE(dy.data() == nullptr); - ASSERT_FALSE(dz.data() == nullptr); + ASSERT_EQ(dx.data(), nullptr); + ASSERT_EQ(dy.data(), nullptr); + ASSERT_NE(dz.data(), nullptr); dz = dView0(); - ASSERT_TRUE(dx.data() == nullptr); - ASSERT_TRUE(dy.data() == nullptr); - ASSERT_TRUE(dz.data() == nullptr); + ASSERT_EQ(dx.data(), nullptr); + ASSERT_EQ(dy.data(), nullptr); + ASSERT_EQ(dz.data(), nullptr); // View - DynRankView Interoperability tests // deep_copy from view to dynrankview @@ -1367,7 +1372,7 @@ class TestDynViewAPI { static void check_auto_conversion_to_const( const Kokkos::DynRankView& arg_const, const Kokkos::DynRankView& arg) { - ASSERT_TRUE(arg_const == arg); + ASSERT_EQ(arg_const, arg); } static void run_test_allocated() { @@ -1396,8 +1401,8 @@ class TestDynViewAPI { const_typeX xc = x; const_typeR xr = x; - ASSERT_TRUE(xc == x); - ASSERT_TRUE(x == xc); + ASSERT_EQ(xc, x); + ASSERT_EQ(x, xc); // For CUDA the constant random access View does not return // an lvalue reference due to retrieving through texture cache @@ -1406,7 +1411,7 @@ class TestDynViewAPI { if (!std::is_same::value) #endif { - ASSERT_TRUE(x.data() == xr.data()); + ASSERT_EQ(x.data(), xr.data()); } // typeX xf = xc ; // setting non-const from const must not compile @@ -1659,29 +1664,29 @@ class TestDynViewAPI { const_svector_right_type cvr3 = Kokkos::subdynrankview(mv, Kokkos::ALL(), 2); - ASSERT_TRUE(&v1[0] == &v1(0)); - ASSERT_TRUE(&v1[0] == &mv(0, 0)); - ASSERT_TRUE(&v2[0] == &mv(0, 1)); - ASSERT_TRUE(&v3[0] == &mv(0, 2)); - - ASSERT_TRUE(&cv1[0] == &mv(0, 0)); - ASSERT_TRUE(&cv2[0] == &mv(0, 1)); - ASSERT_TRUE(&cv3[0] == &mv(0, 2)); - - ASSERT_TRUE(&vr1[0] == &mv(0, 0)); - ASSERT_TRUE(&vr2[0] == &mv(0, 1)); - ASSERT_TRUE(&vr3[0] == &mv(0, 2)); - - ASSERT_TRUE(&cvr1[0] == &mv(0, 0)); - ASSERT_TRUE(&cvr2[0] == &mv(0, 1)); - ASSERT_TRUE(&cvr3[0] == &mv(0, 2)); - - ASSERT_TRUE(&mv1(0, 0) == &mv(1, 2)); - ASSERT_TRUE(&mv1(1, 1) == &mv(2, 3)); - ASSERT_TRUE(&mv1(3, 2) == &mv(4, 4)); - ASSERT_TRUE(&mvr1(0, 0) == &mv_right(1, 2)); - ASSERT_TRUE(&mvr1(1, 1) == &mv_right(2, 3)); - ASSERT_TRUE(&mvr1(3, 2) == &mv_right(4, 4)); + ASSERT_EQ(&v1[0], &v1(0)); + ASSERT_EQ(&v1[0], &mv(0, 0)); + ASSERT_EQ(&v2[0], &mv(0, 1)); + ASSERT_EQ(&v3[0], &mv(0, 2)); + + ASSERT_EQ(&cv1[0], &mv(0, 0)); + ASSERT_EQ(&cv2[0], &mv(0, 1)); + ASSERT_EQ(&cv3[0], &mv(0, 2)); + + ASSERT_EQ(&vr1[0], &mv(0, 0)); + ASSERT_EQ(&vr2[0], &mv(0, 1)); + ASSERT_EQ(&vr3[0], &mv(0, 2)); + + ASSERT_EQ(&cvr1[0], &mv(0, 0)); + ASSERT_EQ(&cvr2[0], &mv(0, 1)); + ASSERT_EQ(&cvr3[0], &mv(0, 2)); + + ASSERT_EQ(&mv1(0, 0), &mv(1, 2)); + ASSERT_EQ(&mv1(1, 1), &mv(2, 3)); + ASSERT_EQ(&mv1(3, 2), &mv(4, 4)); + ASSERT_EQ(&mvr1(0, 0), &mv_right(1, 2)); + ASSERT_EQ(&mvr1(1, 1), &mv_right(2, 3)); + ASSERT_EQ(&mvr1(3, 2), &mv_right(4, 4)); const_svector_type c_cv1(v1); typename svector_type::const_type c_cv2(v2); diff --git a/packages/kokkos/containers/unit_tests/TestDynamicView.hpp b/packages/kokkos/containers/unit_tests/TestDynamicView.hpp index f018793dd6f3..023bf92f62b4 100644 --- a/packages/kokkos/containers/unit_tests/TestDynamicView.hpp +++ b/packages/kokkos/containers/unit_tests/TestDynamicView.hpp @@ -52,7 +52,7 @@ #include #include -#include +#include namespace Test { diff --git a/packages/kokkos/containers/unit_tests/TestOffsetView.hpp b/packages/kokkos/containers/unit_tests/TestOffsetView.hpp index 9ddc226e291f..24a43e1ebc72 100644 --- a/packages/kokkos/containers/unit_tests/TestOffsetView.hpp +++ b/packages/kokkos/containers/unit_tests/TestOffsetView.hpp @@ -50,7 +50,7 @@ #include #include #include -#include +#include #include #include diff --git a/packages/kokkos/containers/unit_tests/TestScatterView.hpp b/packages/kokkos/containers/unit_tests/TestScatterView.hpp index fdbce2d49200..342ce2af48af 100644 --- a/packages/kokkos/containers/unit_tests/TestScatterView.hpp +++ b/packages/kokkos/containers/unit_tests/TestScatterView.hpp @@ -118,11 +118,51 @@ struct test_scatter_view_impl_cls sizes(LENGTH); - size_t total_length = 0; - for (size_t i = 0; i < LENGTH; ++i) { sizes[i] = rand() % 1000; } @@ -189,10 +187,6 @@ void run_test_graph3(size_t B, size_t N) { sizes[1] = N; sizes[1998] = N; - for (size_t i = 0; i < LENGTH; ++i) { - total_length += sizes[i]; - } - int C = 0; dView dx = Kokkos::create_staticcrsgraph("test", sizes); dx.create_block_partitioning(B, C); diff --git a/packages/kokkos/containers/unit_tests/TestUnorderedMap.hpp b/packages/kokkos/containers/unit_tests/TestUnorderedMap.hpp index 4413cfbc80e3..8009b9965663 100644 --- a/packages/kokkos/containers/unit_tests/TestUnorderedMap.hpp +++ b/packages/kokkos/containers/unit_tests/TestUnorderedMap.hpp @@ -295,10 +295,8 @@ void test_deep_copy(uint32_t num_nodes) { } // FIXME_SYCL wrong results on Nvidia GPUs but correct on Host and Intel GPUs -// FIXME_HIP // WORKAROUND MSVC -#if !(defined(KOKKOS_ENABLE_HIP) && (HIP_VERSION < 401)) && \ - !defined(_WIN32) && !defined(KOKKOS_ENABLE_SYCL) +#if !defined(_WIN32) && !defined(KOKKOS_ENABLE_SYCL) TEST(TEST_CATEGORY, UnorderedMap_insert) { for (int i = 0; i < 500; ++i) { test_insert(100000, 90000, 100, true); @@ -329,6 +327,23 @@ TEST(TEST_CATEGORY, UnorderedMap_valid_empty) { ASSERT_TRUE(n.is_allocated()); } +TEST(TEST_CATEGORY, UnorderedMap_clear_zero_size) { + using Map = + Kokkos::UnorderedMap; + + Map m(11); + ASSERT_EQ(0u, m.size()); + + m.insert(2); + m.insert(3); + m.insert(5); + m.insert(7); + ASSERT_EQ(4u, m.size()); + + m.clear(); + ASSERT_EQ(0u, m.size()); +} + } // namespace Test #endif // KOKKOS_TEST_UNORDERED_MAP_HPP diff --git a/packages/kokkos/core/cmake/KokkosCore_config.h.in b/packages/kokkos/core/cmake/KokkosCore_config.h.in deleted file mode 100644 index f0835772b864..000000000000 --- a/packages/kokkos/core/cmake/KokkosCore_config.h.in +++ /dev/null @@ -1,104 +0,0 @@ -/* The trivial 'src/build_common.sh' creates a config - * that must stay in sync with this file. - */ -#cmakedefine KOKKOS_FOR_SIERRA - -#if !defined(KOKKOS_FOR_SIERRA) - -#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H) -#error \ - "Don't include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead." -#else -#define KOKKOS_CORE_CONFIG_H -#endif - -#cmakedefine KOKKOS_ENABLE_CUDA -#cmakedefine KOKKOS_ENABLE_HIP -#cmakedefine KOKKOS_ENABLE_OPENMP -#cmakedefine KOKKOS_ENABLE_THREADS -#cmakedefine KOKKOS_ENABLE_SERIAL -#cmakedefine KOKKOS_ENABLE_Winthread - -#cmakedefine KOKKOS_ENABLE_HWLOC -#cmakedefine KOKKOS_ENABLE_HBWSPACE -#cmakedefine KOKKOS_ENABLE_LIBRT - -#cmakedefine KOKKOS_ENABLE_DEBUG -#cmakedefine KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK -#cmakedefine KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK -#cmakedefine KOKKOS_ENABLE_PROFILING_LOAD_PRINT -#cmakedefine KOKKOS_ENABLE_TUNING - -#cmakedefine KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION - -#ifdef KOKKOS_ENABLE_CUDA - -#cmakedefine KOKKOS_ENABLE_CUDA_LDG_INTRINSIC - -// mfh 16 Sep 2014: If passed in on the command line, that overrides -// any value of KOKKOS_USE_CUDA_UVM here. Doing this should prevent build -// warnings like this one: -// -// packages/kokkos/core/src/KokkosCore_config.h:13:1: warning: -// "KOKKOS_USE_CUDA_UVM" redefined -// -// At some point, we should edit the test-build scripts in -// Trilinos/cmake/ctest/drivers/perseus/, and take -// -DKOKKOS_USE_CUDA_UVM from the command-line arguments there. I -// hesitate to do that now, because I'm not sure if all the files are -// including KokkosCore_config.h (or a header file that includes it) like -// they should. -#ifndef KOKKOS_USE_CUDA_UVM -#cmakedefine KOKKOS_USE_CUDA_UVM -#endif - -#cmakedefine KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE - -#cmakedefine KOKKOS_ENABLE_CUDA_LAMBDA - -#endif - -#cmakedefine KOKKOS_IMPL_CUDA_CLANG_WORKAROUND - -#ifndef __CUDA_ARCH__ -#cmakedefine KOKKOS_ENABLE_ISA_X86_64 -#cmakedefine KOKKOS_ENABLE_ISA_KNC -#cmakedefine KOKKOS_ENABLE_ISA_POWERPCLE -#endif - -#ifdef KOKKOS_ENABLE_HIP -#cmakedefine KOKKOS_ENABLE_HIP_RELOCATABLE_DEVICE_CODE -#endif - -#cmakedefine KOKKOS_ARCH_ARMV80 1 -#cmakedefine KOKKOS_ARCH_ARMV81 1 -#cmakedefine KOKKOS_ARCH_ARMV8_THUNDERX 1 -#cmakedefine KOKKOS_ARCH_AVX 1 -#cmakedefine KOKKOS_ARCH_AVX2 1 -#cmakedefine KOKKOS_ARCH_AVX512MIC 1 -#cmakedefine KOKKOS_ARCH_AVX512XEON 1 -#cmakedefine KOKKOS_ARCH_KNC 1 -#cmakedefine KOKKOS_ARCH_POWER8 1 -#cmakedefine KOKKOS_ARCH_POWER9 1 -#cmakedefine KOKKOS_ARCH_KEPLER 1 -#cmakedefine KOKKOS_ARCH_KEPLER30 1 -#cmakedefine KOKKOS_ARCH_KEPLER32 1 -#cmakedefine KOKKOS_ARCH_KEPLER35 1 -#cmakedefine KOKKOS_ARCH_KEPLER37 1 -#cmakedefine KOKKOS_ARCH_MAXWELL 1 -#cmakedefine KOKKOS_ARCH_MAXWELL50 1 -#cmakedefine KOKKOS_ARCH_MAXWELL52 1 -#cmakedefine KOKKOS_ARCH_MAXWELL53 1 -#cmakedefine KOKKOS_ARCH_PASCAL 1 -#cmakedefine KOKKOS_ARCH_PASCAL60 1 -#cmakedefine KOKKOS_ARCH_PASCAL61 1 -#cmakedefine KOKKOS_ARCH_VOLTA70 1 - -// TODO: These are currently not used in Kokkos. Should they be removed? -#cmakedefine KOKKOS_ENABLE_MPI -#cmakedefine KOKKOS_ENABLE_CUSPARSE - -// TODO: No longer options in Kokkos. Need to be removed. -#cmakedefine KOKKOS_USING_DEPRECATED_VIEW - -#endif // !defined(KOKKOS_FOR_SIERRA) diff --git a/packages/kokkos/core/perf_test/CMakeLists.txt b/packages/kokkos/core/perf_test/CMakeLists.txt index 9ff4b6006da8..a7c57a94346d 100644 --- a/packages/kokkos/core/perf_test/CMakeLists.txt +++ b/packages/kokkos/core/perf_test/CMakeLists.txt @@ -10,9 +10,7 @@ #INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/../../algorithms/src") # FIXME_OPENMPTARGET - the NVIDIA HPC compiler nvc++ in the OpenMPTarget backend does not pass the perf_tests. -IF (KOKKOS_ENABLE_OPENMPTARGET - AND (KOKKOS_CXX_COMPILER_ID STREQUAL PGI - OR KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC)) +IF (KOKKOS_ENABLE_OPENMPTARGET AND KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC) RETURN() ENDIF() diff --git a/packages/kokkos/core/perf_test/PerfTestGramSchmidt.cpp b/packages/kokkos/core/perf_test/PerfTestGramSchmidt.cpp index dee21fd7a575..b534c32c52c6 100644 --- a/packages/kokkos/core/perf_test/PerfTestGramSchmidt.cpp +++ b/packages/kokkos/core/perf_test/PerfTestGramSchmidt.cpp @@ -231,7 +231,7 @@ void run_test_gramschmidt(int exp_beg, int exp_end, int num_trials, std::cout << label_gramschmidt << " , " << parallel_work_length << " , " << min_seconds << " , " << (min_seconds / parallel_work_length) - << std::endl; + << ", " << avg_seconds << std::endl; } } diff --git a/packages/kokkos/core/perf_test/PerfTestHexGrad.cpp b/packages/kokkos/core/perf_test/PerfTestHexGrad.cpp index c431c2b0c86d..24c1898e0a16 100644 --- a/packages/kokkos/core/perf_test/PerfTestHexGrad.cpp +++ b/packages/kokkos/core/perf_test/PerfTestHexGrad.cpp @@ -280,7 +280,7 @@ void run_test_hexgrad(int exp_beg, int exp_end, int num_trials, std::cout << label_hexgrad << " , " << parallel_work_length << " , " << min_seconds << " , " << (min_seconds / parallel_work_length) - << std::endl; + << avg_seconds << std::endl; } } diff --git a/packages/kokkos/core/perf_test/PerfTest_ExecSpacePartitioning.cpp b/packages/kokkos/core/perf_test/PerfTest_ExecSpacePartitioning.cpp index 50bbc78a6b75..5b7c2a7a0390 100644 --- a/packages/kokkos/core/perf_test/PerfTest_ExecSpacePartitioning.cpp +++ b/packages/kokkos/core/perf_test/PerfTest_ExecSpacePartitioning.cpp @@ -205,7 +205,7 @@ TEST(default_exec, overlap_range_policy) { double time_end = timer.seconds(); if (SpaceInstance::overlap()) { - ASSERT_TRUE((time_end > 1.5 * time_overlap)); + ASSERT_GT(time_end, 1.5 * time_overlap); } printf("Time RangePolicy: NonOverlap: %lf Time Overlap: %lf\n", time_end, time_overlap); @@ -238,7 +238,7 @@ TEST(default_exec, overlap_range_policy) { double time_not_fenced = timer.seconds(); Kokkos::fence(); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_fenced > 2.0 * time_not_fenced); + ASSERT_GT(time_fenced, 2.0 * time_not_fenced); } timer.reset(); @@ -280,7 +280,7 @@ TEST(default_exec, overlap_range_policy) { ASSERT_EQ(h_result2(), h_result()); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_overlapped_reduce < 1.5 * time_no_overlapped_reduce); + ASSERT_LT(time_overlapped_reduce, 1.5 * time_no_overlapped_reduce); } printf("Time RangePolicy Reduce: NonOverlap: %lf Time Overlap: %lf\n", time_no_overlapped_reduce, time_overlapped_reduce); @@ -378,7 +378,7 @@ TEST(default_exec, overlap_mdrange_policy) { double time_end = timer.seconds(); if (SpaceInstance::overlap()) { - ASSERT_TRUE((time_end > 1.5 * time_overlap)); + ASSERT_GT(time_end, 1.5 * time_overlap); } printf("Time MDRangePolicy: NonOverlap: %lf Time Overlap: %lf\n", time_end, time_overlap); @@ -413,7 +413,7 @@ TEST(default_exec, overlap_mdrange_policy) { double time_not_fenced = timer.seconds(); Kokkos::fence(); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_fenced > 2.0 * time_not_fenced); + ASSERT_GT(time_fenced, 2.0 * time_not_fenced); } timer.reset(); @@ -459,7 +459,7 @@ TEST(default_exec, overlap_mdrange_policy) { ASSERT_EQ(h_result2(), h_result()); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_overlapped_reduce < 1.5 * time_no_overlapped_reduce); + ASSERT_LT(time_overlapped_reduce, 1.5 * time_no_overlapped_reduce); } printf("Time MDRangePolicy Reduce: NonOverlap: %lf Time Overlap: %lf\n", time_no_overlapped_reduce, time_overlapped_reduce); @@ -548,7 +548,7 @@ TEST(default_exec, overlap_team_policy) { double time_end = timer.seconds(); if (SpaceInstance::overlap()) { - ASSERT_TRUE((time_end > 1.5 * time_overlap)); + ASSERT_GT(time_end, 1.5 * time_overlap); } printf("Time TeamPolicy: NonOverlap: %lf Time Overlap: %lf\n", time_end, time_overlap); @@ -581,7 +581,7 @@ TEST(default_exec, overlap_team_policy) { double time_not_fenced = timer.seconds(); Kokkos::fence(); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_fenced > 2.0 * time_not_fenced); + ASSERT_GT(time_fenced, 2.0 * time_not_fenced); } timer.reset(); Kokkos::parallel_reduce( @@ -622,7 +622,7 @@ TEST(default_exec, overlap_team_policy) { ASSERT_EQ(h_result2(), h_result()); if (SpaceInstance::overlap()) { - ASSERT_TRUE(time_overlapped_reduce < 1.5 * time_no_overlapped_reduce); + ASSERT_LT(time_overlapped_reduce, 1.5 * time_no_overlapped_reduce); } printf("Time TeamPolicy Reduce: NonOverlap: %lf Time Overlap: %lf\n", time_no_overlapped_reduce, time_overlapped_reduce); diff --git a/packages/kokkos/core/perf_test/PerfTest_ViewAllocate.cpp b/packages/kokkos/core/perf_test/PerfTest_ViewAllocate.cpp index 550316bec997..555a05ea279c 100644 --- a/packages/kokkos/core/perf_test/PerfTest_ViewAllocate.cpp +++ b/packages/kokkos/core/perf_test/PerfTest_ViewAllocate.cpp @@ -120,7 +120,8 @@ void run_allocateview_tests(int N, int R) { { Kokkos::Timer timer; for (int r = 0; r < R; r++) { - double* a_ptr = (double*)Kokkos::kokkos_malloc("A", sizeof(double) * N8); + double* a_ptr = + static_cast(Kokkos::kokkos_malloc("A", sizeof(double) * N8)); Kokkos::parallel_for( N8, KOKKOS_LAMBDA(const int& i) { a_ptr[i] = 0.0; }); Kokkos::fence(); diff --git a/packages/kokkos/core/perf_test/PerfTest_ViewResize_8.cpp b/packages/kokkos/core/perf_test/PerfTest_ViewResize_8.cpp index afeeb643569e..b0562f2fd122 100644 --- a/packages/kokkos/core/perf_test/PerfTest_ViewResize_8.cpp +++ b/packages/kokkos/core/perf_test/PerfTest_ViewResize_8.cpp @@ -47,10 +47,18 @@ namespace Test { TEST(default_exec, ViewResize_Rank8) { +// FIXME_SYCL Avoid running out of resources on the CUDA GPU used in the CI +#ifdef KOKKOS_ENABLE_SYCL + printf("Resize View Performance for LayoutLeft:\n"); + run_resizeview_tests8(9, 1); + printf("Resize View Performance for LayoutRight:\n"); + run_resizeview_tests8(9, 1); +#else printf("Resize View Performance for LayoutLeft:\n"); run_resizeview_tests8(10, 1); printf("Resize View Performance for LayoutRight:\n"); run_resizeview_tests8(10, 1); +#endif } } // namespace Test diff --git a/packages/kokkos/core/perf_test/test_atomic.cpp b/packages/kokkos/core/perf_test/test_atomic.cpp index 59820f3bdd2e..54824e5b39b9 100644 --- a/packages/kokkos/core/perf_test/test_atomic.cpp +++ b/packages/kokkos/core/perf_test/test_atomic.cpp @@ -47,7 +47,7 @@ #include #include -#include +#include using exec_space = Kokkos::DefaultExecutionSpace; @@ -401,7 +401,7 @@ template void Loop(int loop, int test, const char* type_name) { LoopVariant(loop, test); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; T res = LoopVariant(loop, test); double time = timer.seconds(); diff --git a/packages/kokkos/core/perf_test/test_atomic_minmax_simple.cpp b/packages/kokkos/core/perf_test/test_atomic_minmax_simple.cpp index eec1c8eacc77..4086ef58163f 100644 --- a/packages/kokkos/core/perf_test/test_atomic_minmax_simple.cpp +++ b/packages/kokkos/core/perf_test/test_atomic_minmax_simple.cpp @@ -12,13 +12,13 @@ #include #include -#include +#include using exec_space = Kokkos::DefaultExecutionSpace; template void test(const int length) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; using vector = Kokkos::View; diff --git a/packages/kokkos/core/perf_test/test_mempool.cpp b/packages/kokkos/core/perf_test/test_mempool.cpp index 9aab119774c4..7887d4ba5519 100644 --- a/packages/kokkos/core/perf_test/test_mempool.cpp +++ b/packages/kokkos/core/perf_test/test_mempool.cpp @@ -48,7 +48,7 @@ #include #include -#include +#include using ExecSpace = Kokkos::DefaultExecutionSpace; using MemorySpace = Kokkos::DefaultExecutionSpace::memory_space; @@ -100,7 +100,7 @@ struct TestFunctor { const unsigned size_alloc = chunk * (1 + (j % chunk_span)); - ptrs(j) = (uintptr_t)pool.allocate(size_alloc); + ptrs(j) = reinterpret_cast(pool.allocate(size_alloc)); if (ptrs(j)) ++update; } @@ -129,7 +129,7 @@ struct TestFunctor { const unsigned size_alloc = chunk * (1 + (j % chunk_span)); - pool.deallocate((void*)ptrs(j), size_alloc); + pool.deallocate(reinterpret_cast(ptrs(j)), size_alloc); } } @@ -153,9 +153,9 @@ struct TestFunctor { for (unsigned k = 0; k < repeat_inner; ++k) { const unsigned size_alloc = chunk * (1 + (j % chunk_span)); - pool.deallocate((void*)ptrs(j), size_alloc); + pool.deallocate(reinterpret_cast(ptrs(j)), size_alloc); - ptrs(j) = (uintptr_t)pool.allocate(size_alloc); + ptrs(j) = reinterpret_cast(pool.allocate(size_alloc)); if (0 == ptrs(j)) update++; } @@ -266,7 +266,7 @@ int main(int argc, char* argv[]) { TestFunctor functor(total_alloc_size, min_superblock_size, number_alloc, fill_stride, chunk_span, repeat_inner); - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; if (!functor.test_fill()) { Kokkos::abort("fill "); diff --git a/packages/kokkos/core/perf_test/test_taskdag.cpp b/packages/kokkos/core/perf_test/test_taskdag.cpp index b2f936a955ec..49957ae9323d 100644 --- a/packages/kokkos/core/perf_test/test_taskdag.cpp +++ b/packages/kokkos/core/perf_test/test_taskdag.cpp @@ -56,7 +56,7 @@ int main() { return 0; } #include #include -#include +#include using ExecSpace = Kokkos::DefaultExecutionSpace; @@ -220,7 +220,7 @@ int main(int argc, char* argv[]) { double time_sum = 0; for (int i = 0; i < test_repeat_outer; ++i) { - Kokkos::Impl::Timer timer; + Kokkos::Timer timer; Functor::FutureType ftmp = Kokkos::host_spawn(Kokkos::TaskSingle(sched), Functor(fib_input)); diff --git a/packages/kokkos/core/src/CMakeLists.txt b/packages/kokkos/core/src/CMakeLists.txt index 2ab098980572..499736c60d55 100644 --- a/packages/kokkos/core/src/CMakeLists.txt +++ b/packages/kokkos/core/src/CMakeLists.txt @@ -9,6 +9,8 @@ INSTALL (DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${KOKKOS_HEADER_DIR} FILES_MATCHING + PATTERN "*.inc" + PATTERN "*.inc_*" PATTERN "*.hpp" PATTERN "*.h" ) @@ -65,6 +67,15 @@ IF (KOKKOS_ENABLE_SYCL) APPEND_GLOB(KOKKOS_CORE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/SYCL/*.hpp) ENDIF() +IF (KOKKOS_ENABLE_IMPL_DESUL_ATOMICS) + APPEND_GLOB(KOKKOS_CORE_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/desul/src/*.cpp) + APPEND_GLOB(KOKKOS_CORE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/desul/*.hpp) + APPEND_GLOB(KOKKOS_CORE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/desul/*/*.hpp) + APPEND_GLOB(KOKKOS_CORE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/desul/*/*/*.hpp) + APPEND_GLOB(KOKKOS_CORE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/desul/*/*/*.inc) +ENDIF() + + KOKKOS_ADD_LIBRARY( kokkoscore SOURCES ${KOKKOS_CORE_SRCS} @@ -86,3 +97,15 @@ KOKKOS_LINK_TPL(kokkoscore PUBLIC LIBDL) KOKKOS_LINK_TPL(kokkoscore PUBLIC LIBRT) KOKKOS_LINK_TPL(kokkoscore PUBLIC PTHREAD) KOKKOS_LINK_TPL(kokkoscore PUBLIC ROCM) + +# FIXME: We need a proper solution to figure out whether to enable +# libatomic +# XL requires libatomic even for 64 bit CAS, most others only for 128 +# I (CT) had removed 128bit CAS from desul to not need libatomic. +IF (KOKKOS_ENABLE_IMPL_DESUL_ATOMICS AND + (KOKKOS_ENABLE_OPENMPTARGET OR (CMAKE_CXX_COMPILER_ID STREQUAL XLClang))) + target_link_libraries(kokkoscore PUBLIC atomic) +ENDIF() + + +KOKKOS_LINK_TPL(kokkoscore PUBLIC LIBQUADMATH) diff --git a/packages/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp b/packages/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp index 916f109758de..f6b276240316 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp @@ -90,43 +90,25 @@ static std::atomic num_uvm_allocations(0); } // namespace -DeepCopy::DeepCopy(void *dst, const void *src, - size_t n) { - CUDA_SAFE_CALL(cudaMemcpy(dst, src, n, cudaMemcpyDefault)); +void DeepCopyCuda(void *dst, const void *src, size_t n) { + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaMemcpy(dst, src, n, cudaMemcpyDefault)); } -DeepCopy::DeepCopy(void *dst, const void *src, - size_t n) { - CUDA_SAFE_CALL(cudaMemcpy(dst, src, n, cudaMemcpyDefault)); -} - -DeepCopy::DeepCopy(void *dst, const void *src, - size_t n) { - CUDA_SAFE_CALL(cudaMemcpy(dst, src, n, cudaMemcpyDefault)); -} - -DeepCopy::DeepCopy(const Cuda &instance, void *dst, - const void *src, size_t n) { - CUDA_SAFE_CALL( - cudaMemcpyAsync(dst, src, n, cudaMemcpyDefault, instance.cuda_stream())); -} - -DeepCopy::DeepCopy(const Cuda &instance, void *dst, - const void *src, size_t n) { - CUDA_SAFE_CALL( - cudaMemcpyAsync(dst, src, n, cudaMemcpyDefault, instance.cuda_stream())); -} - -DeepCopy::DeepCopy(const Cuda &instance, void *dst, - const void *src, size_t n) { - CUDA_SAFE_CALL( +void DeepCopyAsyncCuda(const Cuda &instance, void *dst, const void *src, + size_t n) { + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaMemcpyAsync(dst, src, n, cudaMemcpyDefault, instance.cuda_stream())); } void DeepCopyAsyncCuda(void *dst, const void *src, size_t n) { cudaStream_t s = cuda_get_deep_copy_stream(); - CUDA_SAFE_CALL(cudaMemcpyAsync(dst, src, n, cudaMemcpyDefault, s)); - cudaStreamSynchronize(s); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaMemcpyAsync(dst, src, n, cudaMemcpyDefault, s)); + Impl::cuda_stream_synchronize( + s, + Kokkos::Tools::Experimental::SpecialSynchronizationCases:: + DeepCopyResourceSynchronization, + "Kokkos::Impl::DeepCopyAsyncCuda: Deep Copy Stream Sync"); } } // namespace Impl @@ -137,6 +119,7 @@ void DeepCopyAsyncCuda(void *dst, const void *src, size_t n) { namespace Kokkos { +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 KOKKOS_DEPRECATED void CudaSpace::access_error() { const std::string msg( "Kokkos::CudaSpace::access_error attempt to execute Cuda function from " @@ -150,6 +133,7 @@ KOKKOS_DEPRECATED void CudaSpace::access_error(const void *const) { "non-Cuda space"); Kokkos::Impl::throw_runtime_exception(msg); } +#endif /*--------------------------------------------------------------------------*/ @@ -164,9 +148,11 @@ bool CudaUVMSpace::available() { /*--------------------------------------------------------------------------*/ +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 int CudaUVMSpace::number_of_allocations() { return Kokkos::Impl::num_uvm_allocations.load(); } +#endif #ifdef KOKKOS_IMPL_DEBUG_CUDA_PIN_UVM_TO_HOST // The purpose of the following variable is to allow a state-based choice // for pinning UVM allocations to the CPU. For now this is considered @@ -204,6 +190,8 @@ CudaUVMSpace::CudaUVMSpace() : m_device(Kokkos::Cuda().cuda_device()) {} CudaHostPinnedSpace::CudaHostPinnedSpace() {} +int memory_threshold_g = 40000; // 40 kB + //============================================================================== // {{{1 @@ -221,7 +209,19 @@ void *CudaSpace::impl_allocate( const Kokkos::Tools::SpaceHandle arg_handle) const { void *ptr = nullptr; +#ifndef CUDART_VERSION +#error CUDART_VERSION undefined! +#elif (defined(KOKKOS_ENABLE_IMPL_CUDA_MALLOC_ASYNC) && CUDART_VERSION >= 11020) + cudaError_t error_code; + if (arg_alloc_size >= memory_threshold_g) { + error_code = cudaMallocAsync(&ptr, arg_alloc_size, 0); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaDeviceSynchronize()); + } else { + error_code = cudaMalloc(&ptr, arg_alloc_size); + } +#else auto error_code = cudaMalloc(&ptr, arg_alloc_size); +#endif if (error_code != cudaSuccess) { // TODO tag as unlikely branch cudaGetLastError(); // This is the only way to clear the last error, which // we should do here since we're turning it into an @@ -253,7 +253,8 @@ void *CudaUVMSpace::impl_allocate( const Kokkos::Tools::SpaceHandle arg_handle) const { void *ptr = nullptr; - Cuda::impl_static_fence(); + Cuda::impl_static_fence( + "Kokkos::CudaUVMSpace::impl_allocate: Pre UVM Allocation"); if (arg_alloc_size > 0) { Kokkos::Impl::num_uvm_allocations++; @@ -276,7 +277,8 @@ void *CudaUVMSpace::impl_allocate( CudaMallocManaged); } } - Cuda::impl_static_fence(); + Cuda::impl_static_fence( + "Kokkos::CudaUVMSpace::impl_allocate: Post UVM Allocation"); if (Kokkos::Profiling::profileLibraryLoaded()) { const size_t reported_size = (arg_logical_size > 0) ? arg_logical_size : arg_alloc_size; @@ -337,9 +339,20 @@ void CudaSpace::impl_deallocate( Kokkos::Profiling::deallocateData(arg_handle, arg_label, arg_alloc_ptr, reported_size); } - try { - CUDA_SAFE_CALL(cudaFree(arg_alloc_ptr)); +#ifndef CUDART_VERSION +#error CUDART_VERSION undefined! +#elif (defined(KOKKOS_ENABLE_IMPL_CUDA_MALLOC_ASYNC) && CUDART_VERSION >= 11020) + if (arg_alloc_size >= memory_threshold_g) { + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaDeviceSynchronize()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFreeAsync(arg_alloc_ptr, 0)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaDeviceSynchronize()); + } else { + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFree(arg_alloc_ptr)); + } +#else + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFree(arg_alloc_ptr)); +#endif } catch (...) { } } @@ -362,7 +375,8 @@ void CudaUVMSpace::impl_deallocate( , const size_t arg_logical_size, const Kokkos::Tools::SpaceHandle arg_handle) const { - Cuda::impl_static_fence(); + Cuda::impl_static_fence( + "Kokkos::CudaUVMSpace::impl_deallocate: Pre UVM Deallocation"); if (Kokkos::Profiling::profileLibraryLoaded()) { const size_t reported_size = (arg_logical_size > 0) ? arg_logical_size : arg_alloc_size; @@ -372,11 +386,12 @@ void CudaUVMSpace::impl_deallocate( try { if (arg_alloc_ptr != nullptr) { Kokkos::Impl::num_uvm_allocations--; - CUDA_SAFE_CALL(cudaFree(arg_alloc_ptr)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFree(arg_alloc_ptr)); } } catch (...) { } - Cuda::impl_static_fence(); + Cuda::impl_static_fence( + "Kokkos::CudaUVMSpace::impl_deallocate: Post UVM Deallocation"); } void CudaHostPinnedSpace::deallocate(void *const arg_alloc_ptr, @@ -401,7 +416,7 @@ void CudaHostPinnedSpace::impl_deallocate( reported_size); } try { - CUDA_SAFE_CALL(cudaFreeHost(arg_alloc_ptr)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFreeHost(arg_alloc_ptr)); } catch (...) { } } @@ -462,7 +477,7 @@ SharedAllocationRecord::attach_texture_object( resDesc.res.linear.sizeInBytes = alloc_size; resDesc.res.linear.devPtr = alloc_ptr; - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaCreateTextureObject(&tex_obj, &resDesc, &texDesc, nullptr)); return tex_obj; @@ -581,7 +596,7 @@ void cuda_prefetch_pointer(const Cuda &space, const void *ptr, size_t bytes, bool to_device) { if ((ptr == nullptr) || (bytes == 0)) return; cudaPointerAttributes attr; - CUDA_SAFE_CALL(cudaPointerGetAttributes(&attr, ptr)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaPointerGetAttributes(&attr, ptr)); // I measured this and it turns out prefetching towards the host slows // DualView syncs down. Probably because the latency is not too bad in the // first place for the pull down. If we want to change that provde @@ -593,8 +608,8 @@ void cuda_prefetch_pointer(const Cuda &space, const void *ptr, size_t bytes, #endif if (to_device && is_managed && space.cuda_device_prop().concurrentManagedAccess) { - CUDA_SAFE_CALL(cudaMemPrefetchAsync(ptr, bytes, space.cuda_device(), - space.cuda_stream())); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaMemPrefetchAsync( + ptr, bytes, space.cuda_device(), space.cuda_stream())); } } diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp index 0f4259072d97..993c8d1bbadc 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_BlockSize_Deduction.hpp @@ -134,7 +134,12 @@ inline int cuda_deduce_block_size(bool early_termination, } if (blocks_per_sm >= min_blocks_per_sm) { - if (threads_per_sm >= opt_threads_per_sm) { + // The logic prefers smaller block sizes over larger ones to + // give more flexibility to the scheduler. + // But don't go below 128 where performance suffers significantly + // for simple copy/set kernels. + if ((threads_per_sm > opt_threads_per_sm) || + ((block_size >= 128) && (threads_per_sm == opt_threads_per_sm))) { opt_block_size = block_size; opt_threads_per_sm = threads_per_sm; } diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Error.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Error.hpp index 4759001d81f9..36df0d2564ae 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Error.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Error.hpp @@ -49,13 +49,19 @@ #ifdef KOKKOS_ENABLE_CUDA #include - +#include #include namespace Kokkos { namespace Impl { -void cuda_device_synchronize(); +void cuda_stream_synchronize( + const cudaStream_t stream, + Kokkos::Tools::Experimental::SpecialSynchronizationCases reason, + const std::string& name); +void cuda_device_synchronize(const std::string& name); +void cuda_stream_synchronize(const cudaStream_t stream, + const std::string& name); void cuda_internal_error_throw(cudaError e, const char* name, const char* file = nullptr, const int line = 0); @@ -68,9 +74,24 @@ inline void cuda_internal_safe_call(cudaError e, const char* name, } } -#define CUDA_SAFE_CALL(call) \ +#define KOKKOS_IMPL_CUDA_SAFE_CALL(call) \ Kokkos::Impl::cuda_internal_safe_call(call, #call, __FILE__, __LINE__) +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 + +KOKKOS_DEPRECATED +inline void cuda_internal_safe_call_deprecated(cudaError e, const char* name, + const char* file = nullptr, + const int line = 0) { + cuda_internal_safe_call(e, name, file, line); +} + +#define CUDA_SAFE_CALL(call) \ + Kokkos::Impl::cuda_internal_safe_call_deprecated(call, #call, __FILE__, \ + __LINE__) + +#endif + } // namespace Impl namespace Experimental { diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp index 3de7a6991613..bd514f5e88d9 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Graph_Impl.hpp @@ -60,6 +60,7 @@ #include #include +#include namespace Kokkos { namespace Impl { @@ -82,8 +83,8 @@ struct GraphImpl { constexpr size_t error_log_size = 256; cudaGraphNode_t error_node = nullptr; char error_log[error_log_size]; - CUDA_SAFE_CALL(cudaGraphInstantiate(&m_graph_exec, m_graph, &error_node, - error_log, error_log_size)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGraphInstantiate( + &m_graph_exec, m_graph, &error_node, error_log, error_log_size)); // TODO @graphs print out errors } @@ -107,26 +108,27 @@ struct GraphImpl { // TODO @graphs we need to somehow indicate the need for a fence in the // destructor of the GraphImpl object (so that we don't have to // just always do it) - m_execution_space.fence(); + m_execution_space.fence("Kokkos::GraphImpl::~GraphImpl: Graph Destruction"); KOKKOS_EXPECTS(bool(m_graph)) if (bool(m_graph_exec)) { - CUDA_SAFE_CALL(cudaGraphExecDestroy(m_graph_exec)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGraphExecDestroy(m_graph_exec)); } - CUDA_SAFE_CALL(cudaGraphDestroy(m_graph)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGraphDestroy(m_graph)); }; explicit GraphImpl(Kokkos::Cuda arg_instance) : m_execution_space(std::move(arg_instance)) { - CUDA_SAFE_CALL(cudaGraphCreate(&m_graph, cuda_graph_flags_t{0})); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaGraphCreate(&m_graph, cuda_graph_flags_t{0})); } void add_node(std::shared_ptr const& arg_node_ptr) { // All of the predecessors are just added as normal, so all we need to // do here is add an empty node - CUDA_SAFE_CALL(cudaGraphAddEmptyNode(&(arg_node_ptr->node_details_t::node), - m_graph, - /* dependencies = */ nullptr, - /* numDependencies = */ 0)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaGraphAddEmptyNode(&(arg_node_ptr->node_details_t::node), m_graph, + /* dependencies = */ nullptr, + /* numDependencies = */ 0)); } template @@ -171,7 +173,7 @@ struct GraphImpl { auto /*const*/& cuda_node = arg_node_ptr->node_details_t::node; KOKKOS_EXPECTS(bool(cuda_node)) - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaGraphAddDependencies(m_graph, &pred_cuda_node, &cuda_node, 1)); } @@ -179,7 +181,7 @@ struct GraphImpl { if (!bool(m_graph_exec)) { _instantiate_graph(); } - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaGraphLaunch(m_graph_exec, m_execution_space.cuda_stream())); } @@ -192,9 +194,10 @@ struct GraphImpl { KOKKOS_EXPECTS(!bool(m_graph_exec)) auto rv = std::make_shared( get_execution_space(), _graph_node_is_root_ctor_tag{}); - CUDA_SAFE_CALL(cudaGraphAddEmptyNode(&(rv->node_details_t::node), m_graph, - /* dependencies = */ nullptr, - /* numDependencies = */ 0)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaGraphAddEmptyNode(&(rv->node_details_t::node), m_graph, + /* dependencies = */ nullptr, + /* numDependencies = */ 0)); KOKKOS_ENSURES(bool(rv->node_details_t::node)) return rv; } diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Half.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Half.hpp index ec9c434fe663..c81286eb1004 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Half.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Half.hpp @@ -51,6 +51,9 @@ !(defined(KOKKOS_ARCH_KEPLER) || defined(KOKKOS_ARCH_MAXWELL50) || \ defined(KOKKOS_ARCH_MAXWELL52)) #include +#include // istream & ostream for extraction and insertion ops +#include +#include // reduction_identity #ifndef KOKKOS_IMPL_HALF_TYPE_DEFINED // Make sure no one else tries to define half_t @@ -127,7 +130,7 @@ KOKKOS_INLINE_FUNCTION std::enable_if_t::value, T> cast_from_half(half_t); -class half_t { +class alignas(2) half_t { public: using impl_type = Kokkos::Impl::half_impl_t::type; @@ -138,6 +141,22 @@ class half_t { KOKKOS_FUNCTION half_t() : val(0.0F) {} + // Copy constructors + KOKKOS_DEFAULTED_FUNCTION + half_t(const half_t&) noexcept = default; + + KOKKOS_INLINE_FUNCTION + half_t(const volatile half_t& rhs) { +#ifdef __CUDA_ARCH__ + val = rhs.val; +#else + const volatile uint16_t* rv_ptr = + reinterpret_cast(&rhs.val); + const uint16_t rv_val = *rv_ptr; + val = reinterpret_cast(rv_val); +#endif // __CUDA_ARCH__ + } + // Don't support implicit conversion back to impl_type. // impl_type is a storage only type on host. KOKKOS_FUNCTION @@ -219,7 +238,7 @@ class half_t { #ifdef __CUDA_ARCH__ tmp.val = +tmp.val; #else - tmp.val = __float2half(+__half2float(tmp.val)); + tmp.val = __float2half(+__half2float(tmp.val)); #endif return tmp; } @@ -230,7 +249,7 @@ class half_t { #ifdef __CUDA_ARCH__ tmp.val = -tmp.val; #else - tmp.val = __float2half(-__half2float(tmp.val)); + tmp.val = __float2half(-__half2float(tmp.val)); #endif return tmp; } @@ -241,7 +260,7 @@ class half_t { #ifdef __CUDA_ARCH__ ++val; #else - float tmp = __half2float(val); + float tmp = __half2float(val); ++tmp; val = __float2half(tmp); #endif @@ -255,7 +274,7 @@ class half_t { #else float tmp = __half2float(val); --tmp; - val = __float2half(tmp); + val = __float2half(tmp); #endif return *this; } @@ -290,7 +309,10 @@ class half_t { template KOKKOS_FUNCTION void operator=(T rhs) volatile { - val = cast_to_half(rhs).val; + impl_type new_val = cast_to_half(rhs).val; + volatile uint16_t* val_ptr = + reinterpret_cast(const_cast(&val)); + *val_ptr = reinterpret_cast(new_val); } // Compound operators @@ -299,30 +321,21 @@ class half_t { #ifdef __CUDA_ARCH__ val += rhs.val; #else - val = __float2half(__half2float(val) + __half2float(rhs.val)); + val = __float2half(__half2float(val) + __half2float(rhs.val)); #endif return *this; } KOKKOS_FUNCTION - volatile half_t& operator+=(half_t rhs) volatile { -#ifdef __CUDA_ARCH__ - // Cuda 10 supports __half volatile stores but not volatile arithmetic - // operands. Cast away volatile-ness of val for arithmetic but not for store - // location. - val = const_cast(val) + rhs.val; -#else - // Use non-volatile val_ref to suppress: - // "warning: implicit dereference will not access object of type ‘volatile - // __half’ in statement" - auto val_ref = const_cast(val); - val_ref = __float2half(__half2float(const_cast(val)) + - __half2float(rhs.val)); -#endif - return *this; + void operator+=(const volatile half_t& rhs) volatile { + half_t tmp_rhs = rhs; + half_t tmp_lhs = *this; + + tmp_lhs += tmp_rhs; + *this = tmp_lhs; } - // Compund operators: upcast overloads for += + // Compound operators: upcast overloads for += template KOKKOS_FUNCTION std::enable_if_t< std::is_same::value || std::is_same::value, T> friend @@ -350,27 +363,18 @@ class half_t { #ifdef __CUDA_ARCH__ val -= rhs.val; #else - val = __float2half(__half2float(val) - __half2float(rhs.val)); + val = __float2half(__half2float(val) - __half2float(rhs.val)); #endif return *this; } KOKKOS_FUNCTION - volatile half_t& operator-=(half_t rhs) volatile { -#ifdef __CUDA_ARCH__ - // Cuda 10 supports __half volatile stores but not volatile arithmetic - // operands. Cast away volatile-ness of val for arithmetic but not for store - // location. - val = const_cast(val) - rhs.val; -#else - // Use non-volatile val_ref to suppress: - // "warning: implicit dereference will not access object of type ‘volatile - // __half’ in statement" - auto val_ref = const_cast(val); - val_ref = __float2half(__half2float(const_cast(val)) - - __half2float(rhs.val)); -#endif - return *this; + void operator-=(const volatile half_t& rhs) volatile { + half_t tmp_rhs = rhs; + half_t tmp_lhs = *this; + + tmp_lhs -= tmp_rhs; + *this = tmp_lhs; } // Compund operators: upcast overloads for -= @@ -401,27 +405,18 @@ class half_t { #ifdef __CUDA_ARCH__ val *= rhs.val; #else - val = __float2half(__half2float(val) * __half2float(rhs.val)); + val = __float2half(__half2float(val) * __half2float(rhs.val)); #endif return *this; } KOKKOS_FUNCTION - volatile half_t& operator*=(half_t rhs) volatile { -#ifdef __CUDA_ARCH__ - // Cuda 10 supports __half volatile stores but not volatile arithmetic - // operands. Cast away volatile-ness of val for arithmetic but not for store - // location. - val = const_cast(val) * rhs.val; -#else - // Use non-volatile val_ref to suppress: - // "warning: implicit dereference will not access object of type ‘volatile - // __half’ in statement" - auto val_ref = const_cast(val); - val_ref = __float2half(__half2float(const_cast(val)) * - __half2float(rhs.val)); -#endif - return *this; + void operator*=(const volatile half_t& rhs) volatile { + half_t tmp_rhs = rhs; + half_t tmp_lhs = *this; + + tmp_lhs *= tmp_rhs; + *this = tmp_lhs; } // Compund operators: upcast overloads for *= @@ -452,27 +447,18 @@ class half_t { #ifdef __CUDA_ARCH__ val /= rhs.val; #else - val = __float2half(__half2float(val) / __half2float(rhs.val)); + val = __float2half(__half2float(val) / __half2float(rhs.val)); #endif return *this; } KOKKOS_FUNCTION - volatile half_t& operator/=(half_t rhs) volatile { -#ifdef __CUDA_ARCH__ - // Cuda 10 supports __half volatile stores but not volatile arithmetic - // operands. Cast away volatile-ness of val for arithmetic but not for store - // location. - val = const_cast(val) / rhs.val; -#else - // Use non-volatile val_ref to suppress: - // "warning: implicit dereference will not access object of type ‘volatile - // __half’ in statement" - auto val_ref = const_cast(val); - val_ref = __float2half(__half2float(const_cast(val)) / - __half2float(rhs.val)); -#endif - return *this; + void operator/=(const volatile half_t& rhs) volatile { + half_t tmp_rhs = rhs; + half_t tmp_lhs = *this; + + tmp_lhs /= tmp_rhs; + *this = tmp_lhs; } // Compund operators: upcast overloads for /= @@ -504,7 +490,7 @@ class half_t { #ifdef __CUDA_ARCH__ lhs.val += rhs.val; #else - lhs.val = __float2half(__half2float(lhs.val) + __half2float(rhs.val)); + lhs.val = __float2half(__half2float(lhs.val) + __half2float(rhs.val)); #endif return lhs; } @@ -529,7 +515,7 @@ class half_t { #ifdef __CUDA_ARCH__ lhs.val -= rhs.val; #else - lhs.val = __float2half(__half2float(lhs.val) - __half2float(rhs.val)); + lhs.val = __float2half(__half2float(lhs.val) - __half2float(rhs.val)); #endif return lhs; } @@ -554,7 +540,7 @@ class half_t { #ifdef __CUDA_ARCH__ lhs.val *= rhs.val; #else - lhs.val = __float2half(__half2float(lhs.val) * __half2float(rhs.val)); + lhs.val = __float2half(__half2float(lhs.val) * __half2float(rhs.val)); #endif return lhs; } @@ -579,7 +565,7 @@ class half_t { #ifdef __CUDA_ARCH__ lhs.val /= rhs.val; #else - lhs.val = __float2half(__half2float(lhs.val) / __half2float(rhs.val)); + lhs.val = __float2half(__half2float(lhs.val) / __half2float(rhs.val)); #endif return lhs; } @@ -683,6 +669,62 @@ class half_t { return __half2float(val) >= __half2float(rhs.val); #endif } + + KOKKOS_FUNCTION + friend bool operator==(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs == tmp_rhs; + } + + KOKKOS_FUNCTION + friend bool operator!=(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs != tmp_rhs; + } + + KOKKOS_FUNCTION + friend bool operator<(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs < tmp_rhs; + } + + KOKKOS_FUNCTION + friend bool operator>(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs > tmp_rhs; + } + + KOKKOS_FUNCTION + friend bool operator<=(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs <= tmp_rhs; + } + + KOKKOS_FUNCTION + friend bool operator>=(const volatile half_t& lhs, + const volatile half_t& rhs) { + half_t tmp_lhs = lhs, tmp_rhs = rhs; + return tmp_lhs >= tmp_rhs; + } + + // Insertion and extraction operators + friend std::ostream& operator<<(std::ostream& os, const half_t& x) { + const std::string out = std::to_string(static_cast(x)); + os << out; + return os; + } + + friend std::istream& operator>>(std::istream& is, half_t& x) { + std::string in; + is >> in; + x = std::stod(in); + return is; + } }; // CUDA before 11.1 only has the half <-> float conversions marked host device @@ -943,6 +985,25 @@ KOKKOS_INLINE_FUNCTION } #endif } // namespace Experimental + +// use float as the return type for sum and prod since cuda_fp16.h +// has no constexpr functions for casting to __half +template <> +struct reduction_identity { + KOKKOS_FORCEINLINE_FUNCTION constexpr static float sum() noexcept { + return 0.0F; + } + KOKKOS_FORCEINLINE_FUNCTION constexpr static float prod() noexcept { + return 1.0F; + } + KOKKOS_FORCEINLINE_FUNCTION constexpr static float max() noexcept { + return -65504.0F; + } + KOKKOS_FORCEINLINE_FUNCTION constexpr static float min() noexcept { + return 65504.0F; + } +}; + } // namespace Kokkos #endif // KOKKOS_IMPL_HALF_TYPE_DEFINED #endif // KOKKOS_ENABLE_CUDA diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.cpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.cpp index 016cb6cdcbdd..6964d5b41b72 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.cpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.cpp @@ -119,7 +119,7 @@ int cuda_kernel_arch() { int arch = 0; int *d_arch = nullptr; - cudaMalloc((void **)&d_arch, sizeof(int)); + cudaMalloc(reinterpret_cast(&d_arch), sizeof(int)); cudaMemcpy(d_arch, &arch, sizeof(int), cudaMemcpyDefault); query_cuda_kernel_arch<<<1, 1>>>(d_arch); @@ -141,7 +141,36 @@ bool cuda_launch_blocking() { } // namespace -void cuda_device_synchronize() { CUDA_SAFE_CALL(cudaDeviceSynchronize()); } +void cuda_device_synchronize(const std::string &name) { + Kokkos::Tools::Experimental::Impl::profile_fence_event( + name, + Kokkos::Tools::Experimental::SpecialSynchronizationCases:: + GlobalDeviceSynchronization, + []() { // TODO: correct device ID + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaDeviceSynchronize()); + }); +} + +void cuda_stream_synchronize(const cudaStream_t stream, const CudaInternal *ptr, + const std::string &name) { + Kokkos::Tools::Experimental::Impl::profile_fence_event( + name, + Kokkos::Tools::Experimental::Impl::DirectFenceIDHandle{ + ptr->impl_get_instance_id()}, + [&]() { // TODO: correct device ID + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaStreamSynchronize(stream)); + }); +} + +void cuda_stream_synchronize( + const cudaStream_t stream, + Kokkos::Tools::Experimental::SpecialSynchronizationCases reason, + const std::string &name) { + Kokkos::Tools::Experimental::Impl::profile_fence_event( + name, reason, [&]() { // TODO: correct device ID + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaStreamSynchronize(stream)); + }); +} void cuda_internal_error_throw(cudaError e, const char *name, const char *file, const int line) { @@ -221,7 +250,7 @@ CudaInternalDevices::CudaInternalDevices() { // See 'cudaSetDeviceFlags' for host-device thread interaction // Section 4.4.2.6 of the CUDA Toolkit Reference Manual - CUDA_SAFE_CALL(cudaGetDeviceCount(&m_cudaDevCount)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetDeviceCount(&m_cudaDevCount)); if (m_cudaDevCount > MAXIMUM_DEVICE_COUNT) { Kokkos::abort( @@ -229,7 +258,7 @@ CudaInternalDevices::CudaInternalDevices() { "have. Please report this to github.com/kokkos/kokkos."); } for (int i = 0; i < m_cudaDevCount; ++i) { - CUDA_SAFE_CALL(cudaGetDeviceProperties(m_cudaProp + i, i)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetDeviceProperties(m_cudaProp + i, i)); } } @@ -277,25 +306,27 @@ CudaInternal::~CudaInternal() { << std::endl; } - m_cudaDev = -1; - m_cudaArch = -1; - m_multiProcCount = 0; - m_maxWarpCount = 0; - m_maxBlock = 0; - m_maxSharedWords = 0; - m_maxConcurrency = 0; - m_scratchSpaceCount = 0; - m_scratchFlagsCount = 0; - m_scratchUnifiedCount = 0; - m_scratchUnifiedSupported = 0; - m_streamCount = 0; - m_scratchSpace = nullptr; - m_scratchFlags = nullptr; - m_scratchUnified = nullptr; - m_scratchConcurrentBitset = nullptr; - m_stream = nullptr; - m_team_scratch_current_size = 0; - m_team_scratch_ptr = nullptr; + m_cudaDev = -1; + m_cudaArch = -1; + m_multiProcCount = 0; + m_maxWarpCount = 0; + m_maxBlock = 0; + m_maxSharedWords = 0; + m_maxConcurrency = 0; + m_scratchSpaceCount = 0; + m_scratchFlagsCount = 0; + m_scratchUnifiedCount = 0; + m_scratchUnifiedSupported = 0; + m_streamCount = 0; + m_scratchSpace = nullptr; + m_scratchFlags = nullptr; + m_scratchUnified = nullptr; + m_scratchConcurrentBitset = nullptr; + m_stream = nullptr; + for (int i = 0; i < m_n_team_scratch; ++i) { + m_team_scratch_current_size[i] = 0; + m_team_scratch_ptr[i] = nullptr; + } } int CudaInternal::verify_is_initialized(const char *const label) const { @@ -305,16 +336,20 @@ int CudaInternal::verify_is_initialized(const char *const label) const { } return 0 <= m_cudaDev; } - +uint32_t CudaInternal::impl_get_instance_id() const { return m_instance_id; } CudaInternal &CudaInternal::singleton() { static CudaInternal self; return self; } +void CudaInternal::fence(const std::string &name) const { + Impl::cuda_stream_synchronize(m_stream, this, name); +} void CudaInternal::fence() const { - CUDA_SAFE_CALL(cudaStreamSynchronize(m_stream)); + fence("Kokkos::CudaInternal::fence(): Unnamed Instance Fence"); } -void CudaInternal::initialize(int cuda_device_id, cudaStream_t stream) { +void CudaInternal::initialize(int cuda_device_id, cudaStream_t stream, + bool manage_stream) { if (was_finalized) Kokkos::abort("Calling Cuda::initialize after Cuda::finalize is illegal\n"); was_initialized = true; @@ -350,8 +385,9 @@ void CudaInternal::initialize(int cuda_device_id, cudaStream_t stream) { m_cudaDev = cuda_device_id; m_deviceProp = cudaProp; - CUDA_SAFE_CALL(cudaSetDevice(m_cudaDev)); - Kokkos::Impl::cuda_device_synchronize(); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaSetDevice(m_cudaDev)); + Kokkos::Impl::cuda_device_synchronize( + "Kokkos::CudaInternal::initialize: Fence on space initialization"); // Query what compute capability architecture a kernel executes: m_cudaArch = cuda_kernel_arch(); @@ -464,8 +500,8 @@ void CudaInternal::initialize(int cuda_device_id, cudaStream_t stream) { m_scratchConcurrentBitset = reinterpret_cast(r->data()); - CUDA_SAFE_CALL(cudaMemset(m_scratchConcurrentBitset, 0, - sizeof(uint32_t) * buffer_bound)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaMemset(m_scratchConcurrentBitset, 0, + sizeof(uint32_t) * buffer_bound)); } //---------------------------------- @@ -535,15 +571,19 @@ Kokkos::Cuda::initialize WARNING: Cuda is allocating into UVMSpace by default // Allocate a staging buffer for constant mem in pinned host memory // and an event to avoid overwriting driver for previous kernel launches if (stream == nullptr) { - CUDA_SAFE_CALL(cudaMallocHost((void **)&constantMemHostStaging, - CudaTraits::ConstantMemoryUsage)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaMallocHost(reinterpret_cast(&constantMemHostStaging), + CudaTraits::ConstantMemoryUsage)); - CUDA_SAFE_CALL(cudaEventCreate(&constantMemReusable)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaEventCreate(&constantMemReusable)); } - m_stream = stream; - m_team_scratch_current_size = 0; - m_team_scratch_ptr = nullptr; + m_stream = stream; + m_manage_stream = manage_stream; + for (int i = 0; i < m_n_team_scratch; ++i) { + m_team_scratch_current_size[i] = 0; + m_team_scratch_ptr[i] = nullptr; + } } //---------------------------------------------------------------------------- @@ -569,7 +609,7 @@ Cuda::size_type *CudaInternal::scratch_flags(const Cuda::size_type size) const { m_scratchFlags = reinterpret_cast(r->data()); - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaMemset(m_scratchFlags, 0, m_scratchFlagsCount * sizeScratchGrain)); } @@ -645,20 +685,37 @@ Cuda::size_type *CudaInternal::scratch_functor( return m_scratchFunctor; } -void *CudaInternal::resize_team_scratch_space(std::int64_t bytes, - bool force_shrink) { - if (m_team_scratch_current_size == 0) { - m_team_scratch_current_size = bytes; - m_team_scratch_ptr = Kokkos::kokkos_malloc( - "Kokkos::CudaSpace::TeamScratchMemory", m_team_scratch_current_size); +std::pair CudaInternal::resize_team_scratch_space( + std::int64_t bytes, bool force_shrink) { + // Multiple ParallelFor/Reduce Teams can call this function at the same time + // and invalidate the m_team_scratch_ptr. We use a pool to avoid any race + // condition. + + int current_team_scratch = 0; + int zero = 0; + int one = 1; + while (m_team_scratch_pool[current_team_scratch].compare_exchange_weak( + zero, one, std::memory_order_release, std::memory_order_relaxed)) { + current_team_scratch = (current_team_scratch + 1) % m_n_team_scratch; } - if ((bytes > m_team_scratch_current_size) || - ((bytes < m_team_scratch_current_size) && (force_shrink))) { - m_team_scratch_current_size = bytes; - m_team_scratch_ptr = Kokkos::kokkos_realloc( - m_team_scratch_ptr, m_team_scratch_current_size); + if (m_team_scratch_current_size[current_team_scratch] == 0) { + m_team_scratch_current_size[current_team_scratch] = bytes; + m_team_scratch_ptr[current_team_scratch] = + Kokkos::kokkos_malloc( + "Kokkos::CudaSpace::TeamScratchMemory", + m_team_scratch_current_size[current_team_scratch]); } - return m_team_scratch_ptr; + if ((bytes > m_team_scratch_current_size[current_team_scratch]) || + ((bytes < m_team_scratch_current_size[current_team_scratch]) && + (force_shrink))) { + m_team_scratch_current_size[current_team_scratch] = bytes; + m_team_scratch_ptr[current_team_scratch] = + Kokkos::kokkos_realloc( + m_team_scratch_ptr[current_team_scratch], + m_team_scratch_current_size[current_team_scratch]); + } + return std::make_pair(m_team_scratch_ptr[current_team_scratch], + current_team_scratch); } //---------------------------------------------------------------------------- @@ -685,36 +742,43 @@ void CudaInternal::finalize() { if (m_scratchFunctorSize > 0) RecordCuda::decrement(RecordCuda::get_record(m_scratchFunctor)); - if (m_team_scratch_current_size > 0) - Kokkos::kokkos_free(m_team_scratch_ptr); - - m_cudaDev = -1; - m_multiProcCount = 0; - m_maxWarpCount = 0; - m_maxBlock = 0; - m_maxSharedWords = 0; - m_scratchSpaceCount = 0; - m_scratchFlagsCount = 0; - m_scratchUnifiedCount = 0; - m_streamCount = 0; - m_scratchSpace = nullptr; - m_scratchFlags = nullptr; - m_scratchUnified = nullptr; - m_scratchConcurrentBitset = nullptr; - m_stream = nullptr; - m_team_scratch_current_size = 0; - m_team_scratch_ptr = nullptr; + for (int i = 0; i < m_n_team_scratch; ++i) { + if (m_team_scratch_current_size[i] > 0) + Kokkos::kokkos_free(m_team_scratch_ptr[i]); + } + + if (m_manage_stream && m_stream != nullptr) + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaStreamDestroy(m_stream)); + + m_cudaDev = -1; + m_multiProcCount = 0; + m_maxWarpCount = 0; + m_maxBlock = 0; + m_maxSharedWords = 0; + m_scratchSpaceCount = 0; + m_scratchFlagsCount = 0; + m_scratchUnifiedCount = 0; + m_streamCount = 0; + m_scratchSpace = nullptr; + m_scratchFlags = nullptr; + m_scratchUnified = nullptr; + m_scratchConcurrentBitset = nullptr; + m_stream = nullptr; + for (int i = 0; i < m_n_team_scratch; ++i) { + m_team_scratch_current_size[i] = 0; + m_team_scratch_ptr[i] = nullptr; + } } // only destroy these if we're finalizing the singleton if (this == &singleton()) { - cudaFreeHost(constantMemHostStaging); - cudaEventDestroy(constantMemReusable); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFreeHost(constantMemHostStaging)); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaEventDestroy(constantMemReusable)); auto &deep_copy_space = Kokkos::Impl::cuda_get_deep_copy_space(/*initialize*/ false); if (deep_copy_space) deep_copy_space->impl_internal_space_instance()->finalize(); - cudaStreamDestroy(cuda_get_deep_copy_stream()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaStreamDestroy(cuda_get_deep_copy_stream())); } } @@ -823,7 +887,7 @@ Cuda::Cuda() "Cuda instance constructor"); } -Cuda::Cuda(cudaStream_t stream) +Cuda::Cuda(cudaStream_t stream, bool manage_stream) : m_space_instance(new Impl::CudaInternal, [](Impl::CudaInternal *ptr) { ptr->finalize(); delete ptr; @@ -831,18 +895,31 @@ Cuda::Cuda(cudaStream_t stream) Impl::CudaInternal::singleton().verify_is_initialized( "Cuda instance constructor"); m_space_instance->initialize(Impl::CudaInternal::singleton().m_cudaDev, - stream); + stream, manage_stream); } void Cuda::print_configuration(std::ostream &s, const bool) { Impl::CudaInternal::singleton().print_configuration(s); } -void Cuda::impl_static_fence() { Kokkos::Impl::cuda_device_synchronize(); } +void Cuda::impl_static_fence(const std::string &name) { + Kokkos::Impl::cuda_device_synchronize(name); +} +void Cuda::impl_static_fence() { + impl_static_fence("Kokkos::Cuda::impl_static_fence(): Unnamed Static Fence"); +} -void Cuda::fence() const { m_space_instance->fence(); } +void Cuda::fence() const { + fence("Kokkos::Cuda::fence(): Unnamed Instance Fence"); +} +void Cuda::fence(const std::string &name) const { + m_space_instance->fence(name); +} const char *Cuda::name() { return "Cuda"; } +uint32_t Cuda::impl_instance_id() const noexcept { + return m_space_instance->impl_get_instance_id(); +} cudaStream_t Cuda::cuda_stream() const { return m_space_instance->m_stream; } int Cuda::cuda_device() const { return m_space_instance->m_cudaDev; } @@ -877,7 +954,15 @@ void CudaSpaceInitializer::finalize(bool all_spaces) { } } -void CudaSpaceInitializer::fence() { Kokkos::Cuda::impl_static_fence(); } +void CudaSpaceInitializer::fence() { + Kokkos::Cuda::impl_static_fence( + "Kokkos::CudaSpaceInitializer::fence: Initializer Fence"); +} +void CudaSpaceInitializer::fence(const std::string &name) { + // Kokkos::Cuda::impl_static_fence("Kokkos::CudaSpaceInitializer::fence: + // "+name); //TODO: or this + Kokkos::Cuda::impl_static_fence(name); +} void CudaSpaceInitializer::print_configuration(std::ostream &msg, const bool detail) { @@ -916,12 +1001,6 @@ void CudaSpaceInitializer::print_configuration(std::ostream &msg, msg << "yes\n"; #else msg << "no\n"; -#endif - msg << " KOKKOS_ENABLE_CUSPARSE: "; -#ifdef KOKKOS_ENABLE_CUSPARSE - msg << "yes\n"; -#else - msg << "no\n"; #endif msg << " KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA: "; #ifdef KOKKOS_ENABLE_CXX11_DISPATCH_LAMBDA diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.hpp index aaec2c29260a..7eb169838c05 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Instance.hpp @@ -3,6 +3,9 @@ #include #include +#include +#include + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // These functions fulfill the purpose of allowing to work around @@ -114,10 +117,14 @@ class CudaInternal { mutable size_type* m_scratchFunctor; uint32_t* m_scratchConcurrentBitset; cudaStream_t m_stream; + uint32_t m_instance_id; + bool m_manage_stream; // Team Scratch Level 1 Space - mutable int64_t m_team_scratch_current_size; - mutable void* m_team_scratch_ptr; + int m_n_team_scratch = 10; + mutable int64_t m_team_scratch_current_size[10]; + mutable void* m_team_scratch_ptr[10]; + mutable std::atomic_int m_team_scratch_pool[10]; bool was_initialized = false; bool was_finalized = false; @@ -135,7 +142,8 @@ class CudaInternal { return nullptr != m_scratchSpace && nullptr != m_scratchFlags; } - void initialize(int cuda_device_id, cudaStream_t stream = nullptr); + void initialize(int cuda_device_id, cudaStream_t stream = nullptr, + bool manage_stream = false); void finalize(); void print_configuration(std::ostream&) const; @@ -145,6 +153,7 @@ class CudaInternal { static void cuda_set_serial_execution(bool); #endif + void fence(const std::string&) const; void fence() const; ~CudaInternal(); @@ -175,20 +184,68 @@ class CudaInternal { m_scratchFunctor(nullptr), m_scratchConcurrentBitset(nullptr), m_stream(nullptr), - m_team_scratch_current_size(0), - m_team_scratch_ptr(nullptr) {} + m_instance_id( + Kokkos::Tools::Experimental::Impl::idForInstance( + reinterpret_cast(this))) { + for (int i = 0; i < m_n_team_scratch; ++i) { + m_team_scratch_current_size[i] = 0; + m_team_scratch_ptr[i] = nullptr; + m_team_scratch_pool[i] = 0; + } + } // Resizing of reduction related scratch spaces size_type* scratch_space(const size_type size) const; size_type* scratch_flags(const size_type size) const; size_type* scratch_unified(const size_type size) const; size_type* scratch_functor(const size_type size) const; - + uint32_t impl_get_instance_id() const; // Resizing of team level 1 scratch - void* resize_team_scratch_space(std::int64_t bytes, - bool force_shrink = false); + std::pair resize_team_scratch_space(std::int64_t bytes, + bool force_shrink = false); }; } // Namespace Impl + +namespace Experimental { +// Partitioning an Execution Space: expects space and integer arguments for +// relative weight +// Customization point for backends +// Default behavior is to return the passed in instance + +namespace Impl { +inline void create_Cuda_instances(std::vector& instances) { + for (int s = 0; s < int(instances.size()); s++) { + cudaStream_t stream; + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaStreamCreate(&stream)); + instances[s] = Cuda(stream, true); + } +} +} // namespace Impl + +template +std::vector partition_space(const Cuda&, Args...) { +#ifdef __cpp_fold_expressions + static_assert( + (... && std::is_arithmetic_v), + "Kokkos Error: partitioning arguments must be integers or floats"); +#endif + std::vector instances(sizeof...(Args)); + Impl::create_Cuda_instances(instances); + return instances; +} + +template +std::vector partition_space(const Cuda&, std::vector& weights) { + static_assert( + std::is_arithmetic::value, + "Kokkos Error: partitioning arguments must be integers or floats"); + + std::vector instances(weights.size()); + Impl::create_Cuda_instances(instances); + return instances; +} +} // namespace Experimental + } // Namespace Kokkos #endif diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_KernelLaunch.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_KernelLaunch.hpp index d892a893b330..4b01798f5e2c 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_KernelLaunch.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_KernelLaunch.hpp @@ -167,7 +167,7 @@ inline void configure_shmem_preference(KernelFuncPtr const& func, #ifndef KOKKOS_ARCH_KEPLER // On Kepler the L1 has no benefit since it doesn't cache reads auto set_cache_config = [&] { - CUDA_SAFE_CALL(cudaFuncSetCacheConfig( + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaFuncSetCacheConfig( func, (prefer_shmem ? cudaFuncCachePreferShared : cudaFuncCachePreferL1))); return prefer_shmem; @@ -372,14 +372,15 @@ struct CudaParallelLaunchKernelInvoker< params.kernelParams = (void**)args; params.extra = nullptr; - CUDA_SAFE_CALL(cudaGraphAddKernelNode( + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGraphAddKernelNode( &graph_node, graph, /* dependencies = */ nullptr, /* numDependencies = */ 0, ¶ms)); } else { // We still need an empty node for the dependency structure - CUDA_SAFE_CALL(cudaGraphAddEmptyNode(&graph_node, graph, - /* dependencies = */ nullptr, - /* numDependencies = */ 0)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaGraphAddEmptyNode(&graph_node, graph, + /* dependencies = */ nullptr, + /* numDependencies = */ 0)); } KOKKOS_ENSURES(bool(graph_node)) } @@ -475,14 +476,15 @@ struct CudaParallelLaunchKernelInvoker< params.kernelParams = (void**)args; params.extra = nullptr; - CUDA_SAFE_CALL(cudaGraphAddKernelNode( + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGraphAddKernelNode( &graph_node, graph, /* dependencies = */ nullptr, /* numDependencies = */ 0, ¶ms)); } else { // We still need an empty node for the dependency structure - CUDA_SAFE_CALL(cudaGraphAddEmptyNode(&graph_node, graph, - /* dependencies = */ nullptr, - /* numDependencies = */ 0)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaGraphAddEmptyNode(&graph_node, graph, + /* dependencies = */ nullptr, + /* numDependencies = */ 0)); } KOKKOS_ENSURES(bool(graph_node)) } @@ -538,7 +540,8 @@ struct CudaParallelLaunchKernelInvoker< dim3 const& block, int shmem, CudaInternal const* cuda_instance) { // Wait until the previous kernel that uses the constant buffer is done - CUDA_SAFE_CALL(cudaEventSynchronize(cuda_instance->constantMemReusable)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaEventSynchronize(cuda_instance->constantMemReusable)); // Copy functor (synchronously) to staging buffer in pinned host memory unsigned long* staging = cuda_instance->constantMemHostStaging; @@ -554,8 +557,9 @@ struct CudaParallelLaunchKernelInvoker< get_kernel_func())<<m_stream>>>(); // Record an event that says when the constant buffer can be reused - CUDA_SAFE_CALL(cudaEventRecord(cuda_instance->constantMemReusable, - cudaStream_t(cuda_instance->m_stream))); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaEventRecord(cuda_instance->constantMemReusable, + cudaStream_t(cuda_instance->m_stream))); } #ifdef KOKKOS_CUDA_ENABLE_GRAPHS @@ -637,8 +641,9 @@ struct CudaParallelLaunchImpl< base_t::invoke_kernel(driver, grid, block, shmem, cuda_instance); #if defined(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK) - CUDA_SAFE_CALL(cudaGetLastError()); - cuda_instance->fence(); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetLastError()); + cuda_instance->fence( + "Kokkos::Impl::launch_kernel: Debug Only Check for Execution Error"); #endif } } @@ -650,7 +655,7 @@ struct CudaParallelLaunchImpl< // the code and the result is visible. auto wrap_get_attributes = []() -> cudaFuncAttributes { cudaFuncAttributes attr_tmp; - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaFuncGetAttributes(&attr_tmp, base_t::get_kernel_func())); return attr_tmp; }; diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp index ff3164954403..1f3024f3186a 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.cpp @@ -81,22 +81,34 @@ namespace Impl { CudaLockArrays g_host_cuda_lock_arrays = {nullptr, nullptr, 0}; void initialize_host_cuda_lock_arrays() { +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + desul::Impl::init_lock_arrays(); + + DESUL_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE(); +#endif if (g_host_cuda_lock_arrays.atomic != nullptr) return; - CUDA_SAFE_CALL(cudaMalloc(&g_host_cuda_lock_arrays.atomic, - sizeof(int) * (CUDA_SPACE_ATOMIC_MASK + 1))); - CUDA_SAFE_CALL(cudaMalloc(&g_host_cuda_lock_arrays.scratch, - sizeof(int) * (Cuda::concurrency()))); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaMalloc(&g_host_cuda_lock_arrays.atomic, + sizeof(int) * (CUDA_SPACE_ATOMIC_MASK + 1))); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaMalloc(&g_host_cuda_lock_arrays.scratch, + sizeof(int) * (Cuda::concurrency()))); + Impl::cuda_device_synchronize( + "Kokkos::Impl::initialize_host_cuda_lock_arrays: Pre Init Lock Arrays"); g_host_cuda_lock_arrays.n = Cuda::concurrency(); KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE(); init_lock_array_kernel_atomic<<<(CUDA_SPACE_ATOMIC_MASK + 1 + 255) / 256, 256>>>(); init_lock_array_kernel_threadid<<<(Kokkos::Cuda::concurrency() + 255) / 256, 256>>>(Kokkos::Cuda::concurrency()); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::initialize_host_cuda_lock_arrays: Post Init Lock Arrays"); } void finalize_host_cuda_lock_arrays() { +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + desul::Impl::finalize_lock_arrays(); +#endif + if (g_host_cuda_lock_arrays.atomic == nullptr) return; cudaFree(g_host_cuda_lock_arrays.atomic); g_host_cuda_lock_arrays.atomic = nullptr; diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp index 7640b8084d16..04fb7cb345a2 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Locks.hpp @@ -53,6 +53,10 @@ #include +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS +#include +#endif + namespace Kokkos { namespace Impl { @@ -150,13 +154,14 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } } // namespace } // namespace Impl } // namespace Kokkos + /* Dan Ibanez: it is critical that this code be a macro, so that it will capture the right address for Kokkos::Impl::g_device_cuda_lock_arrays! putting this in an inline function will NOT do the right thing! */ #define KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE() \ { \ if (::Kokkos::Impl::lock_array_copied == 0) { \ - CUDA_SAFE_CALL( \ + KOKKOS_IMPL_CUDA_SAFE_CALL( \ cudaMemcpyToSymbol(Kokkos::Impl::g_device_cuda_lock_arrays, \ &Kokkos::Impl::g_host_cuda_lock_arrays, \ sizeof(Kokkos::Impl::CudaLockArrays))); \ @@ -164,6 +169,8 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } lock_array_copied = 1; \ } +#ifndef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + #ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE #define KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() #else @@ -171,6 +178,19 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE() #endif +#else + +#ifdef KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE +#define KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() +#else +// Still Need COPY_CUDA_LOCK_ARRAYS for team scratch etc. +#define KOKKOS_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() \ + KOKKOS_COPY_CUDA_LOCK_ARRAYS_TO_DEVICE() \ + DESUL_ENSURE_CUDA_LOCK_ARRAYS_ON_DEVICE() +#endif + +#endif /* defined( KOKKOS_ENABLE_IMPL_DESUL_ATOMICS ) */ + #endif /* defined( KOKKOS_ENABLE_CUDA ) */ #endif /* #ifndef KOKKOS_CUDA_LOCKS_HPP */ diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp index 2834e6f3de01..f83b43e60885 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Parallel.hpp @@ -62,7 +62,6 @@ #include #include #include -#include #include #include @@ -240,9 +239,11 @@ class TeamPolicyInternal //---------------------------------------- +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 KOKKOS_DEPRECATED inline int vector_length() const { return impl_vector_length(); } +#endif inline int impl_vector_length() const { return m_vector_length; } inline int team_size() const { return m_team_size; } inline int league_size() const { return m_league_size; } @@ -687,6 +688,7 @@ class ParallelFor, int m_shmem_size; void* m_scratch_ptr[2]; int m_scratch_size[2]; + int m_scratch_pool_id = -1; template __device__ inline @@ -797,15 +799,19 @@ class ParallelFor, // Functor's reduce memory, team scan memory, and team shared memory depend // upon team size. m_scratch_ptr[0] = nullptr; - m_scratch_ptr[1] = - m_team_size <= 0 - ? nullptr - : m_policy.space() - .impl_internal_space_instance() - ->resize_team_scratch_space( - static_cast(m_scratch_size[1]) * - static_cast(Cuda::concurrency() / - (m_team_size * m_vector_size))); + if (m_team_size <= 0) { + m_scratch_ptr[1] = nullptr; + } else { + auto scratch_ptr_id = + m_policy.space() + .impl_internal_space_instance() + ->resize_team_scratch_space( + static_cast(m_scratch_size[1]) * + (static_cast(Cuda::concurrency() / + (m_team_size * m_vector_size)))); + m_scratch_ptr[1] = scratch_ptr_id.first; + m_scratch_pool_id = scratch_ptr_id.second; + } const int shmem_size_total = m_shmem_begin + m_shmem_size; if (m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock < @@ -829,6 +835,14 @@ class ParallelFor, "Kokkos::Impl::ParallelFor< Cuda > requested too large team size.")); } } + + ~ParallelFor() { + if (m_scratch_pool_id >= 0) { + m_policy.space() + .impl_internal_space_instance() + ->m_team_scratch_pool[m_scratch_pool_id] = 0; + } + } }; } // namespace Impl @@ -870,9 +884,24 @@ class ParallelReduce, ReducerType, using value_type = typename ValueTraits::value_type; using reference_type = typename ValueTraits::reference_type; using functor_type = FunctorType; - using size_type = Kokkos::Cuda::size_type; - using index_type = typename Policy::index_type; - using reducer_type = ReducerType; + // Conditionally set word_size_type to int16_t or int8_t if value_type is + // smaller than int32_t (Kokkos::Cuda::size_type) + // word_size_type is used to determine the word count, shared memory buffer + // size, and global memory buffer size before the reduction is performed. + // Within the reduction, the word count is recomputed based on word_size_type + // and when calculating indexes into the shared/global memory buffers for + // performing the reduction, word_size_type is used again. + // For scalars > 4 bytes in size, indexing into shared/global memory relies + // on the block and grid dimensions to ensure that we index at the correct + // offset rather than at every 4 byte word; such that, when the join is + // performed, we have the correct data that was copied over in chunks of 4 + // bytes. + using word_size_type = typename std::conditional< + sizeof(value_type) < sizeof(Kokkos::Cuda::size_type), + typename std::conditional::type, + Kokkos::Cuda::size_type>::type; + using index_type = typename Policy::index_type; + using reducer_type = ReducerType; // Algorithmic constraints: blockSize is a power of two AND blockDim.y == // blockDim.z == 1 @@ -883,9 +912,11 @@ class ParallelReduce, ReducerType, const pointer_type m_result_ptr; const bool m_result_ptr_device_accessible; const bool m_result_ptr_host_accessible; - size_type* m_scratch_space; - size_type* m_scratch_flags; - size_type* m_unified_space; + word_size_type* m_scratch_space; + // m_scratch_flags must be of type Cuda::size_type due to use of atomics + // for tracking metadata in Kokkos_Cuda_ReduceScan.hpp + Cuda::size_type* m_scratch_flags; + word_size_type* m_unified_space; // Shall we use the shfl based reduction or not (only use it for static sized // types of more than 128bit) @@ -924,16 +955,16 @@ class ParallelReduce, ReducerType, __device__ inline void run(const DummySHMEMReductionType& ) const {*/ - const integral_nonzero_constant + const integral_nonzero_constant< + word_size_type, ValueTraits::StaticValueSize / sizeof(word_size_type)> word_count(ValueTraits::value_size( ReducerConditional::select(m_functor, m_reducer)) / - sizeof(size_type)); + sizeof(word_size_type)); { reference_type value = ValueInit::init(ReducerConditional::select(m_functor, m_reducer), - kokkos_impl_cuda_shared_memory() + + kokkos_impl_cuda_shared_memory() + threadIdx.y * word_count.value); // Number of blocks is bounded so that the reduction can be limited to two @@ -958,11 +989,12 @@ class ParallelReduce, ReducerType, // This is the final block with the final result at the final threads' // location - size_type* const shared = kokkos_impl_cuda_shared_memory() + - (blockDim.y - 1) * word_count.value; - size_type* const global = + word_size_type* const shared = + kokkos_impl_cuda_shared_memory() + + (blockDim.y - 1) * word_count.value; + word_size_type* const global = m_result_ptr_device_accessible - ? reinterpret_cast(m_result_ptr) + ? reinterpret_cast(m_result_ptr) : (m_unified_space ? m_unified_space : m_scratch_space); if (threadIdx.y == 0) { @@ -985,17 +1017,17 @@ class ParallelReduce, ReducerType, if (cuda_single_inter_block_reduce_scan( ReducerConditional::select(m_functor, m_reducer), blockIdx.x, - gridDim.x, kokkos_impl_cuda_shared_memory(), + gridDim.x, kokkos_impl_cuda_shared_memory(), m_scratch_space, m_scratch_flags)) { // This is the final block with the final result at the final threads' // location - size_type* const shared = - kokkos_impl_cuda_shared_memory() + + word_size_type* const shared = + kokkos_impl_cuda_shared_memory() + (blockDim.y - 1) * word_count.value; - size_type* const global = + word_size_type* const global = m_result_ptr_device_accessible - ? reinterpret_cast(m_result_ptr) + ? reinterpret_cast(m_result_ptr) : (m_unified_space ? m_unified_space : m_scratch_space); if (threadIdx.y == 0) { @@ -1100,15 +1132,21 @@ class ParallelReduce, ReducerType, KOKKOS_ASSERT(block_size > 0); - m_scratch_space = cuda_internal_scratch_space( + // TODO: down casting these uses more space than required? + m_scratch_space = (word_size_type*)cuda_internal_scratch_space( m_policy.space(), ValueTraits::value_size(ReducerConditional::select( m_functor, m_reducer)) * block_size /* block_size == max block_count */); - m_scratch_flags = - cuda_internal_scratch_flags(m_policy.space(), sizeof(size_type)); - m_unified_space = cuda_internal_scratch_unified( - m_policy.space(), ValueTraits::value_size(ReducerConditional::select( - m_functor, m_reducer))); + + // Intentionally do not downcast to word_size_type since we use Cuda + // atomics in Kokkos_Cuda_ReduceScan.hpp + m_scratch_flags = cuda_internal_scratch_flags(m_policy.space(), + sizeof(Cuda::size_type)); + m_unified_space = + reinterpret_cast(cuda_internal_scratch_unified( + m_policy.space(), + ValueTraits::value_size( + ReducerConditional::select(m_functor, m_reducer)))); // REQUIRED ( 1 , N , 1 ) dim3 block(1, block_size, 1); @@ -1139,7 +1177,9 @@ class ParallelReduce, ReducerType, false); // copy to device and execute if (!m_result_ptr_device_accessible) { - m_policy.space().fence(); + m_policy.space().fence( + "Kokkos::Impl::ParallelReduce::execute: Result " + "Not Device Accessible"); if (m_result_ptr) { if (m_unified_space) { @@ -1459,7 +1499,9 @@ class ParallelReduce, ReducerType, false); // copy to device and execute if (!m_result_ptr_device_accessible) { - m_policy.space().fence(); + m_policy.space().fence( + "Kokkos::Impl::ParallelReduce::execute: " + "Result Not Device Accessible"); if (m_result_ptr) { if (m_unified_space) { @@ -1580,6 +1622,7 @@ class ParallelReduce, size_type m_shmem_size; void* m_scratch_ptr[2]; int m_scratch_size[2]; + int m_scratch_pool_id = -1; const size_type m_league_size; int m_team_size; const size_type m_vector_size; @@ -1821,7 +1864,9 @@ class ParallelReduce, true); // copy to device and execute if (!m_result_ptr_device_accessible) { - m_policy.space().fence(); + m_policy.space().fence( + "Kokkos::Impl::ParallelReduce::execute: Result " + "Not Device Accessible"); if (m_result_ptr) { if (m_unified_space) { @@ -1895,16 +1940,19 @@ class ParallelReduce, FunctorTeamShmemSize::value(arg_functor, m_team_size); m_scratch_size[0] = m_shmem_size; m_scratch_size[1] = m_policy.scratch_size(1, m_team_size); - m_scratch_ptr[1] = - m_team_size <= 0 - ? nullptr - : m_policy.space() - .impl_internal_space_instance() - ->resize_team_scratch_space( - static_cast(m_scratch_size[1]) * - (static_cast( - Cuda::concurrency() / - (m_team_size * m_vector_size)))); + if (m_team_size <= 0) { + m_scratch_ptr[1] = nullptr; + } else { + auto scratch_ptr_id = + m_policy.space() + .impl_internal_space_instance() + ->resize_team_scratch_space( + static_cast(m_scratch_size[1]) * + (static_cast(Cuda::concurrency() / + (m_team_size * m_vector_size)))); + m_scratch_ptr[1] = scratch_ptr_id.first; + m_scratch_pool_id = scratch_ptr_id.second; + } // The global parallel_reduce does not support vector_length other than 1 at // the moment @@ -1973,6 +2021,8 @@ class ParallelReduce, cudaFuncAttributes attr = CudaParallelLaunch::get_cuda_func_attributes(); + + // Valid team size not provided, deduce team size m_team_size = m_team_size >= 0 ? m_team_size @@ -1994,15 +2044,19 @@ class ParallelReduce, FunctorTeamShmemSize::value(arg_functor, m_team_size); m_scratch_size[0] = m_shmem_size; m_scratch_size[1] = m_policy.scratch_size(1, m_team_size); - m_scratch_ptr[1] = - m_team_size <= 0 - ? nullptr - : m_policy.space() - .impl_internal_space_instance() - ->resize_team_scratch_space( - static_cast(m_scratch_size[1]) * - static_cast(Cuda::concurrency() / - (m_team_size * m_vector_size))); + if (m_team_size <= 0) { + m_scratch_ptr[1] = nullptr; + } else { + auto scratch_ptr_id = + m_policy.space() + .impl_internal_space_instance() + ->resize_team_scratch_space( + static_cast(m_scratch_size[1]) * + (static_cast(Cuda::concurrency() / + (m_team_size * m_vector_size)))); + m_scratch_ptr[1] = scratch_ptr_id.first; + m_scratch_pool_id = scratch_ptr_id.second; + } // The global parallel_reduce does not support vector_length other than 1 at // the moment @@ -2030,13 +2084,28 @@ class ParallelReduce, Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::ParallelReduce< Cuda > bad team size")); } - if (int(m_team_size) > - arg_policy.team_size_max(m_functor, m_reducer, ParallelReduceTag())) { + + size_type team_size_max = + Kokkos::Impl::cuda_get_max_block_size( + m_policy.space().impl_internal_space_instance(), attr, m_functor, + m_vector_size, m_policy.team_scratch_size(0), + m_policy.thread_scratch_size(0)) / + m_vector_size; + + if ((int)m_team_size > (int)team_size_max) { Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::ParallelReduce< Cuda > requested too " "large team size.")); } } + + ~ParallelReduce() { + if (m_scratch_pool_id >= 0) { + m_policy.space() + .impl_internal_space_instance() + ->m_team_scratch_pool[m_scratch_pool_id] = 0; + } + } }; } // namespace Impl @@ -2167,9 +2236,7 @@ class ParallelScan, Kokkos::Cuda> { for (typename Policy::member_type iwork_base = range.begin(); iwork_base < range.end(); iwork_base += blockDim.y) { -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned MASK = KOKKOS_IMPL_CUDA_ACTIVEMASK; -#endif + unsigned MASK = __activemask(); const typename Policy::member_type iwork = iwork_base + threadIdx.y; __syncthreads(); // Don't overwrite previous iteration values until they @@ -2182,11 +2249,7 @@ class ParallelScan, Kokkos::Cuda> { for (unsigned i = threadIdx.y; i < word_count.value; ++i) { shared_data[i + word_count.value] = shared_data[i] = shared_accum[i]; } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(MASK); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(MASK); if (CudaTraits::WarpSize < word_count.value) { __syncthreads(); } // Protect against large scan values. @@ -2457,9 +2520,7 @@ class ParallelScanWithTotal, for (typename Policy::member_type iwork_base = range.begin(); iwork_base < range.end(); iwork_base += blockDim.y) { -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned MASK = KOKKOS_IMPL_CUDA_ACTIVEMASK; -#endif + unsigned MASK = __activemask(); const typename Policy::member_type iwork = iwork_base + threadIdx.y; @@ -2474,11 +2535,7 @@ class ParallelScanWithTotal, shared_data[i + word_count.value] = shared_data[i] = shared_accum[i]; } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(MASK); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(MASK); if (CudaTraits::WarpSize < word_count.value) { __syncthreads(); } // Protect against large scan values. diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp index fc9fc3770bea..e5b05bcc64f1 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp @@ -191,48 +191,28 @@ __device__ bool cuda_inter_block_reduction( value_type tmp = Kokkos::shfl_down(value, 1, 32); if (id + 1 < int(gridDim.x)) join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask(); + int active = __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 2) { value_type tmp = Kokkos::shfl_down(value, 2, 32); if (id + 2 < int(gridDim.x)) join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 4) { value_type tmp = Kokkos::shfl_down(value, 4, 32); if (id + 4 < int(gridDim.x)) join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 8) { value_type tmp = Kokkos::shfl_down(value, 8, 32); if (id + 8 < int(gridDim.x)) join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 16) { value_type tmp = Kokkos::shfl_down(value, 16, 32); if (id + 16 < int(gridDim.x)) join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); } } // The last block has in its thread=0 the global reduction value through @@ -388,48 +368,28 @@ __device__ inline value_type tmp = Kokkos::shfl_down(value, 1, 32); if (id + 1 < int(gridDim.x)) reducer.join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned int mask = KOKKOS_IMPL_CUDA_ACTIVEMASK; - int active = KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - int active = KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + unsigned int mask = __activemask(); + int active = __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 2) { value_type tmp = Kokkos::shfl_down(value, 2, 32); if (id + 2 < int(gridDim.x)) reducer.join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 4) { value_type tmp = Kokkos::shfl_down(value, 4, 32); if (id + 4 < int(gridDim.x)) reducer.join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 8) { value_type tmp = Kokkos::shfl_down(value, 8, 32); if (id + 8 < int(gridDim.x)) reducer.join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); if (int(blockDim.x * blockDim.y) > 16) { value_type tmp = Kokkos::shfl_down(value, 16, 32); if (id + 16 < int(gridDim.x)) reducer.join(value, tmp); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - active += KOKKOS_IMPL_CUDA_BALLOT_MASK(mask, 1); -#else - active += KOKKOS_IMPL_CUDA_BALLOT(1); -#endif + active += __ballot_sync(mask, 1); } } @@ -573,23 +533,17 @@ struct CudaReductionsFunctor { // part of the reduction const int width) // How much of the warp participates { -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK unsigned mask = width == 32 ? 0xffffffff : ((1 << width) - 1) << ((threadIdx.y * blockDim.x + threadIdx.x) / width) * width; -#endif const int lane_id = (threadIdx.y * blockDim.x + threadIdx.x) % 32; for (int delta = skip_vector ? blockDim.x : 1; delta < width; delta *= 2) { if (lane_id + delta < 32) { ValueJoin::join(functor, value, value + delta); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(mask); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(mask); } *value = *(value - lane_id); } @@ -612,17 +566,18 @@ struct CudaReductionsFunctor { const unsigned int delta = (threadIdx.y * blockDim.x + threadIdx.x) * 32; if (delta < blockDim.x * blockDim.y) *my_shared_team_buffer_element = shared_team_buffer_element[delta]; - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); scalar_intra_warp_reduction(functor, my_shared_team_buffer_element, false, blockDim.x * blockDim.y / 32); if (threadIdx.x + threadIdx.y == 0) *result = *shared_team_buffer_element; } } + template __device__ static inline bool scalar_inter_block_reduction( const FunctorType& functor, const Cuda::size_type /*block_id*/, - const Cuda::size_type block_count, Cuda::size_type* const shared_data, - Cuda::size_type* const global_data, Cuda::size_type* const global_flags) { + const Cuda::size_type block_count, SizeType* const shared_data, + SizeType* const global_data, Cuda::size_type* const global_flags) { Scalar* const global_team_buffer_element = ((Scalar*)global_data); Scalar* const my_global_team_buffer_element = global_team_buffer_element + blockIdx.x; @@ -713,17 +668,17 @@ __device__ void cuda_intra_block_reduce_scan( const pointer_type tdata_intra = base_data + value_count * threadIdx.y; { // Intra-warp reduction: - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_REDUCE_STEP(rtid_intra, tdata_intra, 0) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_REDUCE_STEP(rtid_intra, tdata_intra, 1) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_REDUCE_STEP(rtid_intra, tdata_intra, 2) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_REDUCE_STEP(rtid_intra, tdata_intra, 3) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_REDUCE_STEP(rtid_intra, tdata_intra, 4) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); } __syncthreads(); // Wait for all warps to reduce @@ -732,57 +687,31 @@ __device__ void cuda_intra_block_reduce_scan( const unsigned rtid_inter = (threadIdx.y ^ BlockSizeMask) << CudaTraits::WarpIndexShift; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - unsigned inner_mask = - KOKKOS_IMPL_CUDA_BALLOT_MASK(0xffffffff, (rtid_inter < blockDim.y)); -#endif + unsigned inner_mask = __ballot_sync(0xffffffff, (rtid_inter < blockDim.y)); if (rtid_inter < blockDim.y) { const pointer_type tdata_inter = base_data + value_count * (rtid_inter ^ BlockSizeMask); -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK if ((1 << 5) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); + __syncwarp(inner_mask); BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 5) } if ((1 << 6) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); + __syncwarp(inner_mask); BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 6) } if ((1 << 7) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); + __syncwarp(inner_mask); BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 7) } if ((1 << 8) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); + __syncwarp(inner_mask); BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 8) } if ((1 << 9) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); + __syncwarp(inner_mask); BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 9) } -#else - if ((1 << 5) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP; - BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 5) - } - if ((1 << 6) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP; - BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 6) - } - if ((1 << 7) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP; - BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 7) - } - if ((1 << 8) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP; - BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 8) - } - if ((1 << 9) < BlockSizeMask) { - KOKKOS_IMPL_CUDA_SYNCWARP; - BLOCK_REDUCE_STEP(rtid_inter, tdata_inter, 9) - } -#endif if (DoScan) { int n = @@ -795,25 +724,14 @@ __device__ void cuda_intra_block_reduce_scan( if (!(rtid_inter + n < blockDim.y)) n = 0; -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); - BLOCK_SCAN_STEP(tdata_inter, n, 8) - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); - BLOCK_SCAN_STEP(tdata_inter, n, 7) - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); - BLOCK_SCAN_STEP(tdata_inter, n, 6) - KOKKOS_IMPL_CUDA_SYNCWARP_MASK(inner_mask); - BLOCK_SCAN_STEP(tdata_inter, n, 5) -#else - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(inner_mask); BLOCK_SCAN_STEP(tdata_inter, n, 8) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(inner_mask); BLOCK_SCAN_STEP(tdata_inter, n, 7) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(inner_mask); BLOCK_SCAN_STEP(tdata_inter, n, 6) - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(inner_mask); BLOCK_SCAN_STEP(tdata_inter, n, 5) -#endif } } } @@ -832,17 +750,17 @@ __device__ void cuda_intra_block_reduce_scan( : ((rtid_intra & 16) ? 16 : 0)))); if (!(rtid_intra + n < blockDim.y)) n = 0; - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_SCAN_STEP(tdata_intra, n, 4) __threadfence_block(); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_SCAN_STEP(tdata_intra, n, 3) __threadfence_block(); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_SCAN_STEP(tdata_intra, n, 2) __threadfence_block(); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_SCAN_STEP(tdata_intra, n, 1) __threadfence_block(); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); BLOCK_SCAN_STEP(tdata_intra, n, 0) __threadfence_block(); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); } #undef BLOCK_SCAN_STEP @@ -858,12 +776,13 @@ __device__ void cuda_intra_block_reduce_scan( * Global reduce result is in the last threads' 'shared_data' location. */ -template +template __device__ bool cuda_single_inter_block_reduce_scan2( const FunctorType& functor, const Cuda::size_type block_id, - const Cuda::size_type block_count, Cuda::size_type* const shared_data, - Cuda::size_type* const global_data, Cuda::size_type* const global_flags) { - using size_type = Cuda::size_type; + const Cuda::size_type block_count, SizeType* const shared_data, + SizeType* const global_data, Cuda::size_type* const global_flags) { + using size_type = SizeType; using ValueTraits = FunctorValueTraits; using ValueJoin = FunctorValueJoin; using ValueInit = FunctorValueInit; @@ -953,11 +872,12 @@ __device__ bool cuda_single_inter_block_reduce_scan2( return is_last_block; } -template +template __device__ bool cuda_single_inter_block_reduce_scan( const FunctorType& functor, const Cuda::size_type block_id, - const Cuda::size_type block_count, Cuda::size_type* const shared_data, - Cuda::size_type* const global_data, Cuda::size_type* const global_flags) { + const Cuda::size_type block_count, SizeType* const shared_data, + SizeType* const global_data, Cuda::size_type* const global_flags) { using ValueTraits = FunctorValueTraits; if (!DoScan && ValueTraits::StaticValueSize > 0) return Kokkos::Impl::CudaReductionsFunctor< diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp index 2004edbeacdb..88ac0d1878a9 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp @@ -54,11 +54,27 @@ #include #include -#include // CUDA_SAFE_CALL +#include // KOKKOS_IMPL_CUDA_SAFE_CALL #include //---------------------------------------------------------------------------- +#if defined(__CUDA_ARCH__) +#define KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN(MSG) \ + { \ + __syncwarp(); \ + const unsigned b = __activemask(); \ + if (b != 0xffffffff) { \ + printf(" SYNCWARP AT %s (%d,%d,%d) (%d,%d,%d) failed %x\n", MSG, \ + blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, \ + threadIdx.z, b); \ + return; \ + } \ + } +#else +#define KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN(MSG) +#endif + namespace Kokkos { namespace Impl { namespace { @@ -138,13 +154,13 @@ class TaskQueueSpecialization> { // Broadcast task pointer: // Sync before the broadcast - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); // pretend it's an int* for shuffle purposes ((int*)¤t_task)[0] = - KOKKOS_IMPL_CUDA_SHFL(((int*)¤t_task)[0], 0, 32); + __shfl_sync(0xffffffff, ((int*)¤t_task)[0], 0, 32); ((int*)¤t_task)[1] = - KOKKOS_IMPL_CUDA_SHFL(((int*)¤t_task)[1], 0, 32); + __shfl_sync(0xffffffff, ((int*)¤t_task)[1], 0, 32); if (current_task) { KOKKOS_ASSERT(!current_task->as_runnable_task().get_respawn_flag()); @@ -168,7 +184,7 @@ class TaskQueueSpecialization> { // Synchronize threads of the warp and insure memory // writes are visible to all threads in the warp. - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); if (shared_memory_task_copy->is_team_runnable()) { // Thread Team Task @@ -182,7 +198,7 @@ class TaskQueueSpecialization> { // Synchronize threads of the warp and insure memory // writes are visible to all threads in the warp. - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); // if(warp_lane < b % CudaTraits::WarpSize) b += CudaTraits::WarpSize; // b -= b % CudaTraits::WarpSize; @@ -196,7 +212,7 @@ class TaskQueueSpecialization> { // writes are visible to root thread of the warp for // respawn or completion. - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); if (warp_lane == 0) { // If respawn requested copy respawn data back to main memory @@ -249,12 +265,14 @@ class TaskQueueSpecialization> { auto& queue = scheduler.queue(); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecialization::execute: Pre Task Execution"); // Query the stack size, in bytes: size_t previous_stack_size = 0; - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaDeviceGetLimit(&previous_stack_size, cudaLimitStackSize)); // If not large enough then set the stack size, in bytes: @@ -262,18 +280,21 @@ class TaskQueueSpecialization> { const size_t larger_stack_size = 1 << 11; if (previous_stack_size < larger_stack_size) { - CUDA_SAFE_CALL(cudaDeviceSetLimit(cudaLimitStackSize, larger_stack_size)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaDeviceSetLimit(cudaLimitStackSize, larger_stack_size)); } cuda_task_queue_execute<<>>( scheduler, shared_per_warp); - CUDA_SAFE_CALL(cudaGetLastError()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetLastError()); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecialization::execute: Post Task Execution"); if (previous_stack_size < larger_stack_size) { - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaDeviceSetLimit(cudaLimitStackSize, previous_stack_size)); } } @@ -295,13 +316,17 @@ class TaskQueueSpecialization> { destroy_type* dtor_ptr = (destroy_type*)((char*)storage + sizeof(function_type)); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecialization::execute: Pre Get Function Pointer for Tasks"); set_cuda_task_base_apply_function_pointer <<<1, 1>>>(ptr_ptr, dtor_ptr); - CUDA_SAFE_CALL(cudaGetLastError()); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetLastError()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecialization::execute: Post Get Function Pointer for Tasks"); ptr = *ptr_ptr; dtor = *dtor_ptr; @@ -372,23 +397,20 @@ class TaskQueueSpecializationConstrained< // count of 0 also. Otherwise, returns a task from another queue // or `end` if one couldn't be popped task_ptr = team_queue.attempt_to_steal_task(); -#if 0 - if(task != no_more_tasks_sentinel && task != end) { - std::printf("task stolen on rank %d\n", team_exec.league_rank()); - } -#endif } } // Synchronize warp with memory fence before broadcasting task pointer: // KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN( "A" ); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); // Broadcast task pointer: - ((int*)&task_ptr)[0] = KOKKOS_IMPL_CUDA_SHFL(((int*)&task_ptr)[0], 0, 32); - ((int*)&task_ptr)[1] = KOKKOS_IMPL_CUDA_SHFL(((int*)&task_ptr)[1], 0, 32); + ((int*)&task_ptr)[0] = + __shfl_sync(0xffffffff, ((int*)&task_ptr)[0], 0, 32); + ((int*)&task_ptr)[1] = + __shfl_sync(0xffffffff, ((int*)&task_ptr)[1], 0, 32); #if defined(KOKKOS_ENABLE_DEBUG) KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN("TaskQueue CUDA task_ptr"); @@ -418,7 +440,7 @@ class TaskQueueSpecializationConstrained< // writes are visible to all threads in the warp. // KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN( "B" ); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); if (task_root_type::TaskTeam == task_shmem->m_task_type) { // Thread Team Task @@ -432,7 +454,7 @@ class TaskQueueSpecializationConstrained< // writes are visible to all threads in the warp. // KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN( "C" ); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); // copy task closure from shared to global memory: @@ -445,7 +467,7 @@ class TaskQueueSpecializationConstrained< // respawn or completion. // KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN( "D" ); - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); // If respawn requested copy respawn data back to main memory @@ -475,12 +497,14 @@ class TaskQueueSpecializationConstrained< auto& queue = scheduler.queue(); queue.initialize_team_queues(warps_per_block * grid.x); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecializationConstrained::execute: Pre Execute Task"); // Query the stack size, in bytes: size_t previous_stack_size = 0; - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaDeviceGetLimit(&previous_stack_size, cudaLimitStackSize)); // If not large enough then set the stack size, in bytes: @@ -488,18 +512,21 @@ class TaskQueueSpecializationConstrained< const size_t larger_stack_size = 2048; if (previous_stack_size < larger_stack_size) { - CUDA_SAFE_CALL(cudaDeviceSetLimit(cudaLimitStackSize, larger_stack_size)); + KOKKOS_IMPL_CUDA_SAFE_CALL( + cudaDeviceSetLimit(cudaLimitStackSize, larger_stack_size)); } cuda_task_queue_execute<<>>( scheduler, shared_per_warp); - CUDA_SAFE_CALL(cudaGetLastError()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetLastError()); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecializationConstrained::execute: Post Execute Task"); if (previous_stack_size < larger_stack_size) { - CUDA_SAFE_CALL( + KOKKOS_IMPL_CUDA_SAFE_CALL( cudaDeviceSetLimit(cudaLimitStackSize, previous_stack_size)); } } @@ -516,13 +543,17 @@ class TaskQueueSpecializationConstrained< destroy_type* dtor_ptr = (destroy_type*)((char*)storage + sizeof(function_type)); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecializationConstrained::get_function_pointer: Pre Get Function Pointer"); set_cuda_task_base_apply_function_pointer <<<1, 1>>>(ptr_ptr, dtor_ptr); - CUDA_SAFE_CALL(cudaGetLastError()); - CUDA_SAFE_CALL(cudaDeviceSynchronize()); + KOKKOS_IMPL_CUDA_SAFE_CALL(cudaGetLastError()); + Impl::cuda_device_synchronize( + "Kokkos::Impl::TaskQueueSpecializationConstrained::get_function_pointer: Post Get Function Pointer"); ptr = *ptr_ptr; dtor = *dtor_ptr; @@ -609,7 +640,7 @@ class TaskExec { __device__ void team_barrier() const { if (1 < m_team_size) { - KOKKOS_IMPL_CUDA_SYNCWARP; + __syncwarp(0xffffffff); } } @@ -1205,5 +1236,7 @@ KOKKOS_INLINE_FUNCTION void single( //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- +#undef KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN + #endif /* #if defined( KOKKOS_ENABLE_TASKDAG ) */ #endif /* #ifndef KOKKOS_IMPL_CUDA_TASK_HPP */ diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp index e7806390155d..922b980a2545 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp @@ -340,191 +340,6 @@ class CudaTeamMember { #endif } - //-------------------------------------------------------------------------- - /**\brief Global reduction across all blocks - * - * Return !0 if reducer contains the final value - */ - template - KOKKOS_INLINE_FUNCTION static - typename std::enable_if::value, int>::type - global_reduce(ReducerType const& reducer, int* const global_scratch_flags, - void* const global_scratch_space, void* const shmem, - int const shmem_size) { -#ifdef __CUDA_ARCH__ - - using value_type = typename ReducerType::value_type; - using pointer_type = value_type volatile*; - - // Number of shared memory entries for the reduction: - const int nsh = shmem_size / sizeof(value_type); - - // Number of CUDA threads in the block, rank within the block - const int nid = blockDim.x * blockDim.y * blockDim.z; - const int tid = - threadIdx.x + blockDim.x * (threadIdx.y + blockDim.y * threadIdx.z); - - // Reduces within block using all available shared memory - // Contributes if it is the root "vector lane" - - // wn == number of warps in the block - // wx == which lane within the warp - // wy == which warp within the block - - const int wn = - (nid + CudaTraits::WarpIndexMask) >> CudaTraits::WarpIndexShift; - const int wx = tid & CudaTraits::WarpIndexMask; - const int wy = tid >> CudaTraits::WarpIndexShift; - - //------------------------ - { // Intra warp shuffle reduction from contributing CUDA threads - - value_type tmp(reducer.reference()); - - for (int i = CudaTraits::WarpSize; (int)blockDim.x <= (i >>= 1);) { - Impl::in_place_shfl_down(reducer.reference(), tmp, i, - CudaTraits::WarpSize); - - // Root of each vector lane reduces "thread" contribution - if (0 == threadIdx.x && wx < i) { - reducer.join(&tmp, reducer.data()); - } - } - - // Reduce across warps using shared memory. - // Number of warps may not be power of two. - - __syncthreads(); // Wait before shared data write - - // Number of shared memory entries for the reduction - // is at most one per warp - const int nentry = wn < nsh ? wn : nsh; - - if (0 == wx && wy < nentry) { - // Root thread of warp 'wy' has warp's value to contribute - ((value_type*)shmem)[wy] = tmp; - } - - __syncthreads(); // Wait for write to be visible to block - - // When more warps than shared entries - // then warps must take turns joining their contribution - // to the designated shared memory entry. - for (int i = nentry; i < wn; i += nentry) { - const int k = wy - i; - - if (0 == wx && i <= wy && k < nentry) { - // Root thread of warp 'wy' has warp's value to contribute - reducer.join(((value_type*)shmem) + k, &tmp); - } - - __syncthreads(); // Wait for write to be visible to block - } - - // One warp performs the inter-warp reduction: - - if (0 == wy) { - // Start fan-in at power of two covering nentry - - for (int i = (1 << (32 - __clz(nentry - 1))); (i >>= 1);) { - const int k = wx + i; - if (wx < i && k < nentry) { - reducer.join(((pointer_type)shmem) + wx, ((pointer_type)shmem) + k); - __threadfence_block(); // Wait for write to be visible to warp - } - } - } - } - //------------------------ - { // Write block's value to global_scratch_memory - - int last_block = 0; - - if (0 == wx) { - reducer.copy(((pointer_type)global_scratch_space) + - blockIdx.x * reducer.length(), - reducer.data()); - - __threadfence(); // Wait until global write is visible. - - last_block = (int)gridDim.x == - 1 + Kokkos::atomic_fetch_add(global_scratch_flags, 1); - - // If last block then reset count - if (last_block) *global_scratch_flags = 0; - } - - last_block = __syncthreads_or(last_block); - - if (!last_block) return 0; - } - //------------------------ - // Last block reads global_scratch_memory into shared memory. - - const int nentry = nid < gridDim.x ? (nid < nsh ? nid : nsh) - : (gridDim.x < nsh ? gridDim.x : nsh); - - // nentry = min( nid , nsh , gridDim.x ) - - // whole block reads global memory into shared memory: - - if (tid < nentry) { - const int offset = tid * reducer.length(); - - reducer.copy(((pointer_type)shmem) + offset, - ((pointer_type)global_scratch_space) + offset); - - for (int i = nentry + tid; i < (int)gridDim.x; i += nentry) { - reducer.join( - ((pointer_type)shmem) + offset, - ((pointer_type)global_scratch_space) + i * reducer.length()); - } - } - - __syncthreads(); // Wait for writes to be visible to block - - if (0 == wy) { - // Iterate to reduce shared memory to single warp fan-in size - - const int nreduce = - CudaTraits::WarpSize < nentry ? CudaTraits::WarpSize : nentry; - - // nreduce = min( CudaTraits::WarpSize , nsh , gridDim.x ) - - if (wx < nreduce && nreduce < nentry) { - for (int i = nreduce + wx; i < nentry; i += nreduce) { - reducer.join(((pointer_type)shmem) + wx, ((pointer_type)shmem) + i); - } - __threadfence_block(); // Wait for writes to be visible to warp - } - - // Start fan-in at power of two covering nentry - - for (int i = (1 << (32 - __clz(nreduce - 1))); (i >>= 1);) { - const int k = wx + i; - if (wx < i && k < nreduce) { - reducer.join(((pointer_type)shmem) + wx, ((pointer_type)shmem) + k); - __threadfence_block(); // Wait for writes to be visible to warp - } - } - - if (0 == wx) { - reducer.copy(reducer.data(), (pointer_type)shmem); - return 1; - } - } - return 0; - -#else - (void)reducer; - (void)global_scratch_flags; - (void)global_scratch_space; - (void)shmem; - (void)shmem_size; - return 0; -#endif - } - //---------------------------------------- // Private for the driver @@ -533,7 +348,7 @@ class CudaTeamMember { void* scratch_level_1_ptr, const int scratch_level_1_size, const int arg_league_rank, const int arg_league_size) : m_team_reduce(shared), - m_team_shared(((char*)shared) + shared_begin, shared_size, + m_team_shared(static_cast(shared) + shared_begin, shared_size, scratch_level_1_ptr, scratch_level_1_size), m_team_reduce_size(shared_begin), m_league_rank(arg_league_rank), @@ -854,14 +669,10 @@ KOKKOS_INLINE_FUNCTION void parallel_for( i += blockDim.x) { closure(i); } -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK( - blockDim.x == 32 ? 0xffffffff - : ((1 << blockDim.x) - 1) - << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(blockDim.x == 32 + ? 0xffffffff + : ((1 << blockDim.x) - 1) + << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); #endif } @@ -1100,14 +911,10 @@ KOKKOS_INLINE_FUNCTION void single( (void)lambda; #ifdef __CUDA_ARCH__ if (threadIdx.x == 0) lambda(); -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK( - blockDim.x == 32 ? 0xffffffff - : ((1 << blockDim.x) - 1) - << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(blockDim.x == 32 + ? 0xffffffff + : ((1 << blockDim.x) - 1) + << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); #endif } @@ -1118,14 +925,10 @@ KOKKOS_INLINE_FUNCTION void single( (void)lambda; #ifdef __CUDA_ARCH__ if (threadIdx.x == 0 && threadIdx.y == 0) lambda(); -#ifdef KOKKOS_IMPL_CUDA_SYNCWARP_NEEDS_MASK - KOKKOS_IMPL_CUDA_SYNCWARP_MASK( - blockDim.x == 32 ? 0xffffffff - : ((1 << blockDim.x) - 1) - << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); -#else - KOKKOS_IMPL_CUDA_SYNCWARP; -#endif + __syncwarp(blockDim.x == 32 + ? 0xffffffff + : ((1 << blockDim.x) - 1) + << (threadIdx.y % (32 / blockDim.x)) * blockDim.x); #endif } diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp index 7f7b7b6e78ad..31d3c47e1c9c 100644 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp +++ b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Vectorization.hpp @@ -48,7 +48,12 @@ #ifdef KOKKOS_ENABLE_CUDA #include -#include + +#if !defined(KOKKOS_COMPILER_CLANG) +#define KOKKOS_IMPL_CUDA_MAX_SHFL_SIZEOF sizeof(long long) +#else +#define KOKKOS_IMPL_CUDA_MAX_SHFL_SIZEOF sizeof(int) +#endif namespace Kokkos { @@ -61,7 +66,7 @@ constexpr unsigned shfl_all_mask = 0xffffffffu; // Shuffle operations require input to be a register (stack) variable // Derived implements do_shfl_op(unsigned mask, T& in, int lane, int width), -// which turns in to one of KOKKOS_IMPL_CUDA_SHFL(_UP_|_DOWN_|_)MASK +// which turns in to one of __shfl_sync(_up|_down) // Since the logic with respect to value sizes, etc., is the same everywhere, // put it all in one place. template @@ -157,7 +162,7 @@ struct in_place_shfl_fn : in_place_shfl_op { (void)val; (void)lane; (void)width; - return KOKKOS_IMPL_CUDA_SHFL_MASK(mask, val, lane, width); + return __shfl_sync(mask, val, lane, width); } }; template @@ -170,7 +175,7 @@ struct in_place_shfl_up_fn : in_place_shfl_op { __device__ KOKKOS_IMPL_FORCEINLINE T do_shfl_op(unsigned mask, T& val, int lane, int width) const noexcept { - return KOKKOS_IMPL_CUDA_SHFL_UP_MASK(mask, val, lane, width); + return __shfl_up_sync(mask, val, lane, width); } }; template @@ -188,7 +193,7 @@ struct in_place_shfl_down_fn : in_place_shfl_op { (void)val; (void)lane; (void)width; - return KOKKOS_IMPL_CUDA_SHFL_DOWN_MASK(mask, val, lane, width); + return __shfl_down_sync(mask, val, lane, width); } }; template @@ -228,5 +233,7 @@ __device__ inline T shfl_up(const T& val, int delta, int width, } // end namespace Kokkos +#undef KOKKOS_IMPL_CUDA_MAX_SHFL_SIZEOF + #endif // defined( KOKKOS_ENABLE_CUDA ) #endif // !defined( KOKKOS_CUDA_VECTORIZATION_HPP ) diff --git a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Version_9_8_Compatibility.hpp b/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Version_9_8_Compatibility.hpp deleted file mode 100644 index 0cdd84ce2715..000000000000 --- a/packages/kokkos/core/src/Cuda/Kokkos_Cuda_Version_9_8_Compatibility.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -#if defined(__CUDA_ARCH__) -#define KOKKOS_IMPL_CUDA_ACTIVEMASK __activemask() -#define KOKKOS_IMPL_CUDA_SYNCWARP __syncwarp(0xffffffff) -#define KOKKOS_IMPL_CUDA_SYNCWARP_MASK(m) __syncwarp(m) -#define KOKKOS_IMPL_CUDA_BALLOT(x) __ballot_sync(__activemask(), x) -#define KOKKOS_IMPL_CUDA_BALLOT_MASK(m, x) __ballot_sync(m, x) -#define KOKKOS_IMPL_CUDA_SHFL(x, y, z) __shfl_sync(0xffffffff, x, y, z) -#define KOKKOS_IMPL_CUDA_SHFL_MASK(m, x, y, z) __shfl_sync(m, x, y, z) -#define KOKKOS_IMPL_CUDA_SHFL_UP(x, y, z) __shfl_up_sync(0xffffffff, x, y, z) -#define KOKKOS_IMPL_CUDA_SHFL_UP_MASK(m, x, y, z) __shfl_up_sync(m, x, y, z) -#define KOKKOS_IMPL_CUDA_SHFL_DOWN(x, y, z) \ - __shfl_down_sync(0xffffffff, x, y, z) -#define KOKKOS_IMPL_CUDA_SHFL_DOWN_MASK(m, x, y, z) __shfl_down_sync(m, x, y, z) -#else -#define KOKKOS_IMPL_CUDA_ACTIVEMASK 0 -#define KOKKOS_IMPL_CUDA_SYNCWARP -#define KOKKOS_IMPL_CUDA_SYNCWARP_MASK(m) (void)m -#define KOKKOS_IMPL_CUDA_BALLOT(x) 0 -#define KOKKOS_IMPL_CUDA_BALLOT_MASK(m, x) 0 -#define KOKKOS_IMPL_CUDA_SHFL(x, y, z) 0 -#define KOKKOS_IMPL_CUDA_SHFL_MASK(m, x, y, z) 0 -#define KOKKOS_IMPL_CUDA_SHFL_UP(x, y, z) 0 -#define KOKKOS_IMPL_CUDA_SHFL_DOWN(x, y, z) 0 -#define KOKKOS_IMPL_CUDA_SHFL_DOWN_MASK(m, x, y, z) 0 -#endif - -#if !defined(KOKKOS_COMPILER_CLANG) -#define KOKKOS_IMPL_CUDA_MAX_SHFL_SIZEOF sizeof(long long) -#else -#define KOKKOS_IMPL_CUDA_MAX_SHFL_SIZEOF sizeof(int) -#endif - -#if defined(__CUDA_ARCH__) -#define KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN(MSG) \ - { \ - __syncwarp(); \ - const unsigned b = __activemask(); \ - if (b != 0xffffffff) { \ - printf(" SYNCWARP AT %s (%d,%d,%d) (%d,%d,%d) failed %x\n", MSG, \ - blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, \ - threadIdx.z, b); \ - return; \ - } \ - } -#else -#define KOKKOS_IMPL_CUDA_SYNCWARP_OR_RETURN(MSG) -#endif diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_BlockSize_Deduction.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_BlockSize_Deduction.hpp index 9278d1bdc9ef..7eb3e1e9f70f 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_BlockSize_Deduction.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_BlockSize_Deduction.hpp @@ -45,6 +45,7 @@ #ifndef KOKKOS_HIP_BLOCKSIZE_DEDUCTION_HPP #define KOKKOS_HIP_BLOCKSIZE_DEDUCTION_HPP +#include #include #if defined(__HIPCC__) @@ -56,118 +57,239 @@ namespace Kokkos { namespace Experimental { namespace Impl { -template -void hipOccupancy(int *numBlocks, int blockSize, int sharedmem) { - // FIXME_HIP - currently the "constant" path is unimplemented. - // we should look at whether it's functional, and - // perform some simple scaling studies to see when / - // if the constant launcher outperforms the current - // pass by pointer shared launcher - HIP_SAFE_CALL(hipOccupancyMaxActiveBlocksPerMultiprocessor( - numBlocks, - hip_parallel_launch_local_memory, - blockSize, sharedmem)); -} +enum class BlockType { Max, Preferred }; -template -void hipOccupancy(int *numBlocks, int blockSize, int sharedmem) { - hipOccupancy( - numBlocks, blockSize, sharedmem); +template , + HIPLaunchMechanism LaunchMechanism = + DeduceHIPLaunchMechanism::launch_mechanism> +unsigned get_preferred_blocksize_impl() { + // FIXME_HIP - could be if constexpr for c++17 + if (!HIPParallelLaunch::default_launchbounds()) { + // use the user specified value + return LaunchBounds::maxTperB; + } else { + if (HIPParallelLaunch::get_scratch_size() > 0) { + return HIPTraits::ConservativeThreadsPerBlock; + } + return HIPTraits::MaxThreadsPerBlock; + } } -template -int hip_internal_get_block_size(const F &condition_check, - const HIPInternal *hip_instance, - const hipFuncAttributes &attr, - const FunctorType &f, - const size_t vector_length, - const size_t shmem_block, - const size_t shmem_thread) { - const int min_blocks_per_sm = - LaunchBounds::minBperSM == 0 ? 1 : LaunchBounds::minBperSM; - const int max_threads_per_block = LaunchBounds::maxTperB == 0 - ? HIPTraits::MaxThreadsPerBlock - : LaunchBounds::maxTperB; - - const int regs_per_wavefront = std::max(attr.numRegs, 1); - const int regs_per_sm = hip_instance->m_regsPerSM; - const int shmem_per_sm = hip_instance->m_shmemPerSM; - const int max_shmem_per_block = hip_instance->m_maxShmemPerBlock; - const int max_blocks_per_sm = hip_instance->m_maxBlocksPerSM; - const int max_threads_per_sm = hip_instance->m_maxThreadsPerSM; - - int block_size = max_threads_per_block; - KOKKOS_ASSERT(block_size > 0); - const int blocks_per_warp = - (block_size + HIPTraits::WarpSize - 1) / HIPTraits::WarpSize; - - int functor_shmem = ::Kokkos::Impl::FunctorTeamShmemSize::value( - f, block_size / vector_length); - int total_shmem = shmem_block + shmem_thread * (block_size / vector_length) + - functor_shmem + attr.sharedSizeBytes; - int max_blocks_regs = regs_per_sm / (regs_per_wavefront * blocks_per_warp); - int max_blocks_shmem = - (total_shmem < max_shmem_per_block) - ? (total_shmem > 0 ? shmem_per_sm / total_shmem : max_blocks_regs) - : 0; - int blocks_per_sm = std::min(max_blocks_regs, max_blocks_shmem); - int threads_per_sm = blocks_per_sm * block_size; - if (threads_per_sm > max_threads_per_sm) { - blocks_per_sm = max_threads_per_sm / block_size; - threads_per_sm = blocks_per_sm * block_size; +// FIXME_HIP - entire function could be constexpr for c++17 +template , + HIPLaunchMechanism LaunchMechanism = + DeduceHIPLaunchMechanism::launch_mechanism> +unsigned get_max_blocksize_impl() { + // FIXME_HIP - could be if constexpr for c++17 + if (!HIPParallelLaunch::default_launchbounds()) { + // use the user specified value + return LaunchBounds::maxTperB; + } else { + // we can always fit 1024 threads blocks if we only care about registers + // ... and don't mind spilling + return HIPTraits::MaxThreadsPerBlock; } - int opt_block_size = - (blocks_per_sm >= min_blocks_per_sm) ? block_size : min_blocks_per_sm; - int opt_threads_per_sm = threads_per_sm; - block_size -= HIPTraits::WarpSize; - while (condition_check(blocks_per_sm) && - (block_size >= HIPTraits::WarpSize)) { - functor_shmem = ::Kokkos::Impl::FunctorTeamShmemSize::value( - f, block_size / vector_length); - total_shmem = shmem_block + shmem_thread * (block_size / vector_length) + - functor_shmem + attr.sharedSizeBytes; - max_blocks_regs = regs_per_sm / (regs_per_wavefront * blocks_per_warp); - max_blocks_shmem = - (total_shmem < max_shmem_per_block) - ? (total_shmem > 0 ? shmem_per_sm / total_shmem : max_blocks_regs) - : 0; - blocks_per_sm = std::min(max_blocks_regs, max_blocks_shmem); - threads_per_sm = blocks_per_sm * block_size; - if (threads_per_sm > max_threads_per_sm) { - blocks_per_sm = max_threads_per_sm / block_size; - threads_per_sm = blocks_per_sm * block_size; - } - if ((blocks_per_sm >= min_blocks_per_sm) && - (blocks_per_sm <= max_blocks_per_sm)) { - if (threads_per_sm >= opt_threads_per_sm) { - opt_block_size = block_size; - opt_threads_per_sm = threads_per_sm; +} + +// convenience method to select and return the proper function attributes +// for a kernel, given the launch bounds et al. +template , + BlockType BlockSize = BlockType::Max, + HIPLaunchMechanism LaunchMechanism = + DeduceHIPLaunchMechanism::launch_mechanism> +hipFuncAttributes get_hip_func_attributes_impl() { + // FIXME_HIP - could be if constexpr for c++17 + if (!HIPParallelLaunch::default_launchbounds()) { + // for user defined, we *always* honor the request + return HIPParallelLaunch::get_hip_func_attributes(); + } else { + // FIXME_HIP - could be if constexpr for c++17 + if (BlockSize == BlockType::Max) { + return HIPParallelLaunch< + DriverType, Kokkos::LaunchBounds, + LaunchMechanism>::get_hip_func_attributes(); + } else { + const int blocksize = + get_preferred_blocksize_impl(); + if (blocksize == HIPTraits::MaxThreadsPerBlock) { + return HIPParallelLaunch< + DriverType, Kokkos::LaunchBounds, + LaunchMechanism>::get_hip_func_attributes(); + } else { + return HIPParallelLaunch< + DriverType, + Kokkos::LaunchBounds, + LaunchMechanism>::get_hip_func_attributes(); } } - block_size -= HIPTraits::WarpSize; } - return opt_block_size; } -template -int hip_get_max_block_size(const HIPInternal *hip_instance, - const hipFuncAttributes &attr, const FunctorType &f, - const size_t vector_length, const size_t shmem_block, - const size_t shmem_thread) { - return hip_internal_get_block_size( - [](int x) { return x == 0; }, hip_instance, attr, f, vector_length, - shmem_block, shmem_thread); +// Given an initial block-size limitation based on register usage +// determine the block size to select based on LDS limitation +template +unsigned hip_internal_get_block_size(const HIPInternal *hip_instance, + const ShmemFunctor &f, + const unsigned tperb_reg) { + // translate LB from CUDA to HIP + const unsigned min_waves_per_eu = + LaunchBounds::minBperSM ? LaunchBounds::minBperSM : 1; + const unsigned min_threads_per_sm = min_waves_per_eu * HIPTraits::WarpSize; + const unsigned shmem_per_sm = hip_instance->m_shmemPerSM; + unsigned block_size = tperb_reg; + do { + unsigned total_shmem = f(block_size); + // find how many threads we can fit with this blocksize based on LDS usage + unsigned tperb_shmem = total_shmem > shmem_per_sm ? 0 : block_size; + + // FIXME_HIP - could be if constexpr for c++17 + if (BlockSize == BlockType::Max) { + // we want the maximum blocksize possible + // just wait until we get a case where we can fit the LDS per SM + if (tperb_shmem) return block_size; + } else { + if (block_size == tperb_reg && tperb_shmem >= tperb_reg) { + // fast path for exit on first iteration if registers are more limiting + // than LDS usage, just use the register limited size + return tperb_reg; + } + // otherwise we need to apply a heuristic to choose the blocksize + // the current launchbound selection scheme is: + // 1. If no spills, choose 1024 [MaxThreadsPerBlock] + // 2. Otherwise, choose 256 [ConservativeThreadsPerBlock] + // + // For blocksizes between 256 and 1024, we'll be forced to use the 1024 LB + // and we'll already have pretty decent occupancy, thus dropping to 256 + // *probably* isn't a concern + const unsigned blocks_per_cu_shmem = shmem_per_sm / total_shmem; + const unsigned tperb = tperb_shmem < tperb_reg ? tperb_shmem : tperb_reg; + + // for anything with > 4 WF's & can fit multiple blocks + // we're probably not occupancy limited so just return that + if (blocks_per_cu_shmem > 1 && + tperb > HIPTraits::ConservativeThreadsPerBlock) { + return block_size; + } + + // otherwise, it's probably better to drop to the first valid size that + // fits in the ConservativeThreadsPerBlock + if (tperb >= min_threads_per_sm) return block_size; + } + block_size >>= 1; + } while (block_size >= HIPTraits::WarpSize); + // TODO: return a negative, add an error to kernel launch + return 0; +} + +// Standardized blocksize deduction for parallel constructs with no LDS usage +// Returns the preferred blocksize as dictated by register usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_preferred_blocksize() { + return get_preferred_blocksize_impl(); +} + +// Standardized blocksize deduction for parallel constructs with no LDS usage +// Returns the max blocksize as dictated by register usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_max_blocksize() { + return get_max_blocksize_impl(); +} + +// Standardized blocksize deduction for non-teams parallel constructs with LDS +// usage Returns the 'preferred' blocksize, as determined by the heuristics in +// hip_internal_get_block_size +// +// The ShmemFunctor takes a single argument of the current blocksize under +// consideration, and returns the LDS usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_preferred_blocksize(HIPInternal const *hip_instance, + ShmemFunctor const &f) { + // get preferred blocksize limited by register usage + const unsigned tperb_reg = + hip_get_preferred_blocksize(); + return hip_internal_get_block_size(hip_instance, f, tperb_reg); +} + +// Standardized blocksize deduction for teams-based parallel constructs with LDS +// usage Returns the 'preferred' blocksize, as determined by the heuristics in +// hip_internal_get_block_size +// +// The ShmemTeamsFunctor takes two arguments: the hipFunctionAttributes and +// the current blocksize under consideration, and returns the LDS usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_preferred_team_blocksize(HIPInternal const *hip_instance, + ShmemTeamsFunctor const &f) { + hipFuncAttributes attr = + get_hip_func_attributes_impl(); + // get preferred blocksize limited by register usage + using namespace std::placeholders; + const unsigned tperb_reg = + hip_get_preferred_blocksize(); + return hip_internal_get_block_size( + hip_instance, std::bind(f, attr, _1), tperb_reg); +} + +// Standardized blocksize deduction for non-teams parallel constructs with LDS +// usage Returns the maximum possible blocksize, as determined by the heuristics +// in hip_internal_get_block_size +// +// The ShmemFunctor takes a single argument of the current blocksize under +// consideration, and returns the LDS usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_max_blocksize(HIPInternal const *hip_instance, + ShmemFunctor const &f) { + // get max blocksize limited by register usage + const unsigned tperb_reg = hip_get_max_blocksize(); + return hip_internal_get_block_size( + hip_instance, f, tperb_reg); } -template -int hip_get_opt_block_size(HIPInternal const *hip_instance, - hipFuncAttributes const &attr, FunctorType const &f, - size_t const vector_length, size_t const shmem_block, - size_t const shmem_thread) { - return hip_internal_get_block_size( - [](int) { return true; }, hip_instance, attr, f, vector_length, - shmem_block, shmem_thread); +// Standardized blocksize deduction for teams-based parallel constructs with LDS +// usage Returns the maximum possible blocksize, as determined by the heuristics +// in hip_internal_get_block_size +// +// The ShmemTeamsFunctor takes two arguments: the hipFunctionAttributes and +// the current blocksize under consideration, and returns the LDS usage +// +// Note: a returned block_size of zero indicates that the algorithm could not +// find a valid block size. The caller is responsible for error handling. +template +unsigned hip_get_max_team_blocksize(HIPInternal const *hip_instance, + ShmemTeamsFunctor const &f) { + hipFuncAttributes attr = + get_hip_func_attributes_impl(); + // get max blocksize + using namespace std::placeholders; + const unsigned tperb_reg = hip_get_max_blocksize(); + return hip_internal_get_block_size( + hip_instance, std::bind(f, attr, _1), tperb_reg); } } // namespace Impl diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Error.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Error.hpp index b3480bcad00c..a75e7a4a6c93 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Error.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Error.hpp @@ -66,12 +66,30 @@ inline void hip_internal_safe_call(hipError_t e, const char* name, } } +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 + +KOKKOS_DEPRECATED +inline void hip_internal_safe_call_deprecated(hipError_t e, const char* name, + const char* file = nullptr, + const int line = 0) { + hip_internal_safe_call(e, name, file, line); +} + +#endif + } // namespace Impl } // namespace Kokkos -#define HIP_SAFE_CALL(call) \ +#define KOKKOS_IMPL_HIP_SAFE_CALL(call) \ Kokkos::Impl::hip_internal_safe_call(call, #call, __FILE__, __LINE__) +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 +#define HIP_SAFE_CALL(call) \ + Kokkos::Impl::hip_internal_safe_call_deprecated(call, #call, __FILE__, \ + __LINE__) + +#endif + namespace Kokkos { namespace Experimental { diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.cpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.cpp index 18ef10e22cd3..336ac8c6987c 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.cpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.cpp @@ -77,7 +77,7 @@ class HIPInternalDevices { }; HIPInternalDevices::HIPInternalDevices() { - HIP_SAFE_CALL(hipGetDeviceCount(&m_hipDevCount)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipGetDeviceCount(&m_hipDevCount)); if (m_hipDevCount > MAXIMUM_DEVICE_COUNT) { Kokkos::abort( @@ -85,7 +85,7 @@ HIPInternalDevices::HIPInternalDevices() { "have. Please report this to github.com/kokkos/kokkos."); } for (int i = 0; i < m_hipDevCount; ++i) { - HIP_SAFE_CALL(hipGetDeviceProperties(m_hipProp + i, i)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipGetDeviceProperties(m_hipProp + i, i)); } } @@ -95,6 +95,9 @@ const HIPInternalDevices &HIPInternalDevices::singleton() { } } // namespace +unsigned long *Impl::HIPInternal::constantMemHostStaging = nullptr; +hipEvent_t Impl::HIPInternal::constantMemReusable = nullptr; + namespace Impl { //---------------------------------------------------------------------------- @@ -154,6 +157,9 @@ int HIPInternal::verify_is_initialized(const char *const label) const { return 0 <= m_hipDev; } +uint32_t HIPInternal::impl_get_instance_id() const noexcept { + return m_instance_id; +} HIPInternal &HIPInternal::singleton() { static HIPInternal *self = nullptr; if (!self) { @@ -163,12 +169,23 @@ HIPInternal &HIPInternal::singleton() { } void HIPInternal::fence() const { - HIP_SAFE_CALL(hipStreamSynchronize(m_stream)); - // can reset our cycle id now as well - m_cycleId = 0; + fence("Kokkos::HIPInternal::fence: Unnamed Internal Fence"); +} +void HIPInternal::fence(const std::string &name) const { + Kokkos::Tools::Experimental::Impl::profile_fence_event< + Kokkos::Experimental::HIP>( + name, + Kokkos::Tools::Experimental::Impl::DirectFenceIDHandle{ + impl_get_instance_id()}, + [&]() { + KOKKOS_IMPL_HIP_SAFE_CALL(hipStreamSynchronize(m_stream)); + // can reset our cycle id now as well + m_cycleId = 0; + }); } -void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { +void HIPInternal::initialize(int hip_device_id, hipStream_t stream, + bool manage_stream) { if (was_finalized) Kokkos::abort("Calling HIP::initialize after HIP::finalize is illegal\n"); @@ -197,9 +214,10 @@ void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { m_hipDev = hip_device_id; m_deviceProp = hipProp; - HIP_SAFE_CALL(hipSetDevice(m_hipDev)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipSetDevice(m_hipDev)); m_stream = stream; + m_manage_stream = manage_stream; m_team_scratch_current_size = 0; m_team_scratch_ptr = nullptr; @@ -222,7 +240,7 @@ void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { // theoretically, we can get 40 WF's / CU, but only can sustain 32 // see // https://github.com/ROCm-Developer-Tools/HIP/blob/a0b5dfd625d99af7e288629747b40dd057183173/vdi/hip_platform.cpp#L742 - m_maxBlocksPerSM = 32; + m_maxWavesPerCU = 32; // FIXME_HIP - Nick to implement this upstream // Register count comes from Sec. 2.2. "Data Sharing" of the // Vega 7nm ISA document (see the diagram) @@ -232,7 +250,7 @@ void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { m_regsPerSM = 65536; m_shmemPerSM = hipProp.maxSharedMemoryPerMultiProcessor; m_maxShmemPerBlock = hipProp.sharedMemPerBlock; - m_maxThreadsPerSM = m_maxBlocksPerSM * HIPTraits::WarpSize; + m_maxThreadsPerSM = m_maxWavesPerCU * HIPTraits::WarpSize; //---------------------------------- // Multiblock reduction uses scratch flags for counters // and scratch space for partial reduction values. @@ -265,8 +283,8 @@ void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { m_scratchConcurrentBitset = reinterpret_cast(r->data()); - HIP_SAFE_CALL(hipMemset(m_scratchConcurrentBitset, 0, - sizeof(uint32_t) * buffer_bound)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipMemset(m_scratchConcurrentBitset, 0, + sizeof(uint32_t) * buffer_bound)); } //---------------------------------- @@ -287,6 +305,15 @@ void HIPInternal::initialize(int hip_device_id, hipStream_t stream) { // Init the array for used for arbitrarily sized atomics if (m_stream == nullptr) ::Kokkos::Impl::initialize_host_hip_lock_arrays(); + + // Allocate a staging buffer for constant mem in pinned host memory + // and an event to avoid overwriting driver for previous kernel launches + if (m_stream == nullptr) { + KOKKOS_IMPL_HIP_SAFE_CALL(hipHostMalloc((void **)&constantMemHostStaging, + HIPTraits::ConstantMemoryUsage)); + + KOKKOS_IMPL_HIP_SAFE_CALL(hipEventCreate(&constantMemReusable)); + } } //---------------------------------------------------------------------------- @@ -339,7 +366,7 @@ Kokkos::Experimental::HIP::size_type *HIPInternal::scratch_flags( m_scratchFlags = reinterpret_cast(r->data()); - HIP_SAFE_CALL( + KOKKOS_IMPL_HIP_SAFE_CALL( hipMemset(m_scratchFlags, 0, m_scratchFlagsCount * sizeScratchGrain)); } @@ -365,7 +392,7 @@ void *HIPInternal::resize_team_scratch_space(std::int64_t bytes, //---------------------------------------------------------------------------- void HIPInternal::finalize() { - this->fence(); + this->fence("Kokkos::HIPInternal::finalize: fence on finalization"); was_finalized = true; if (nullptr != m_scratchSpace || nullptr != m_scratchFlags) { using RecordHIP = @@ -378,6 +405,9 @@ void HIPInternal::finalize() { if (m_team_scratch_current_size > 0) Kokkos::kokkos_free(m_team_scratch_ptr); + if (m_manage_stream && m_stream != nullptr) + KOKKOS_IMPL_HIP_SAFE_CALL(hipStreamDestroy(m_stream)); + m_hipDev = -1; m_hipArch = -1; m_multiProcCount = 0; @@ -395,28 +425,36 @@ void HIPInternal::finalize() { m_team_scratch_ptr = nullptr; } if (nullptr != d_driverWorkArray) { - HIP_SAFE_CALL(hipHostFree(d_driverWorkArray)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipHostFree(d_driverWorkArray)); d_driverWorkArray = nullptr; } + + // only destroy these if we're finalizing the singleton + if (this == &singleton()) { + KOKKOS_IMPL_HIP_SAFE_CALL(hipHostFree(constantMemHostStaging)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipEventDestroy(constantMemReusable)); + } } char *HIPInternal::get_next_driver(size_t driverTypeSize) const { std::lock_guard const lock(m_mutexWorkArray); if (d_driverWorkArray == nullptr) { - HIP_SAFE_CALL( + KOKKOS_IMPL_HIP_SAFE_CALL( hipHostMalloc(&d_driverWorkArray, m_maxDriverCycles * m_maxDriverTypeSize * sizeof(char), hipHostMallocNonCoherent)); } if (driverTypeSize > m_maxDriverTypeSize) { // fence handles the cycle id reset for us - fence(); - HIP_SAFE_CALL(hipHostFree(d_driverWorkArray)); + fence( + "Kokkos::HIPInternal::get_next_driver: fence before reallocating " + "resources"); + KOKKOS_IMPL_HIP_SAFE_CALL(hipHostFree(d_driverWorkArray)); m_maxDriverTypeSize = driverTypeSize; if (m_maxDriverTypeSize % 128 != 0) m_maxDriverTypeSize = m_maxDriverTypeSize + 128 - m_maxDriverTypeSize % 128; - HIP_SAFE_CALL( + KOKKOS_IMPL_HIP_SAFE_CALL( hipHostMalloc(&d_driverWorkArray, m_maxDriverCycles * m_maxDriverTypeSize * sizeof(char), hipHostMallocNonCoherent)); @@ -424,7 +462,9 @@ char *HIPInternal::get_next_driver(size_t driverTypeSize) const { m_cycleId = (m_cycleId + 1) % m_maxDriverCycles; if (m_cycleId == 0) { // ensure any outstanding kernels are completed before we wrap around - fence(); + fence( + "Kokkos::HIPInternal::get_next_driver: fence before reusing first " + "driver"); } } return &d_driverWorkArray[m_maxDriverTypeSize * m_cycleId]; @@ -462,7 +502,14 @@ Kokkos::Experimental::HIP::size_type *hip_internal_scratch_flags( namespace Kokkos { namespace Impl { -void hip_device_synchronize() { HIP_SAFE_CALL(hipDeviceSynchronize()); } +void hip_device_synchronize(const std::string &name) { + Kokkos::Tools::Experimental::Impl::profile_fence_event< + Kokkos::Experimental::HIP>( + name, + Kokkos::Tools::Experimental::SpecialSynchronizationCases:: + GlobalDeviceSynchronization, + [&]() { KOKKOS_IMPL_HIP_SAFE_CALL(hipDeviceSynchronize()); }); +} void hip_internal_error_throw(hipError_t e, const char *name, const char *file, const int line) { diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.hpp index f4f88628e313..967c6fdd4be6 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Instance.hpp @@ -48,6 +48,7 @@ #define KOKKOS_HIP_INSTANCE_HPP #include +#include #include @@ -59,10 +60,12 @@ struct HIPTraits { static int constexpr WarpSize = 64; static int constexpr WarpIndexMask = 0x003f; /* hexadecimal for 63 */ static int constexpr WarpIndexShift = 6; /* WarpSize == 1 << WarpShift*/ + static int constexpr ConservativeThreadsPerBlock = + 256; // conservative fallback blocksize in case of spills static int constexpr MaxThreadsPerBlock = - 1024; // FIXME_HIP -- assumed constant for now - + 1024; // the maximum we can fit in a block static int constexpr ConstantMemoryUsage = 0x008000; /* 32k bytes */ + static int constexpr KernelArgumentLimit = 0x001000; /* 4k bytes */ static int constexpr ConstantMemoryUseThreshold = 0x000200; /* 512 bytes */ }; @@ -90,7 +93,7 @@ class HIPInternal { unsigned m_multiProcCount = 0; unsigned m_maxWarpCount = 0; unsigned m_maxBlock = 0; - unsigned m_maxBlocksPerSM = 0; + unsigned m_maxWavesPerCU = 0; unsigned m_maxSharedWords = 0; int m_regsPerSM; int m_shmemPerSM = 0; @@ -108,6 +111,8 @@ class HIPInternal { mutable int m_cycleId = 0; // mutex to access d_driverWorkArray mutable std::mutex m_mutexWorkArray; + // mutex to access shared memory + mutable std::mutex m_mutexSharedMemory; // Scratch Spaces for Reductions size_type m_scratchSpaceCount = 0; @@ -119,7 +124,10 @@ class HIPInternal { hipDeviceProp_t m_deviceProp; - hipStream_t m_stream = nullptr; + hipStream_t m_stream = nullptr; + uint32_t m_instance_id = Kokkos::Tools::Experimental::Impl::idForInstance< + Kokkos::Experimental::HIP>(reinterpret_cast(this)); + bool m_manage_stream = false; // Team Scratch Level 1 Space mutable int64_t m_team_scratch_current_size = 0; @@ -128,18 +136,25 @@ class HIPInternal { bool was_finalized = false; + // FIXME_HIP: these want to be per-device, not per-stream... use of 'static' + // here will break once there are multiple devices though + static unsigned long *constantMemHostStaging; + static hipEvent_t constantMemReusable; + static HIPInternal &singleton(); int verify_is_initialized(const char *const label) const; int is_initialized() const { return m_hipDev >= 0; } - void initialize(int hip_device_id, hipStream_t stream = nullptr); + void initialize(int hip_device_id, hipStream_t stream = nullptr, + bool manage_stream = false); void finalize(); void print_configuration(std::ostream &) const; void fence() const; + void fence(const std::string &) const; // returns the next driver type pointer in our work array char *get_next_driver(size_t driverTypeSize) const; @@ -151,13 +166,52 @@ class HIPInternal { // Resizing of reduction related scratch spaces size_type *scratch_space(const size_type size); size_type *scratch_flags(const size_type size); - + uint32_t impl_get_instance_id() const noexcept; // Resizing of team level 1 scratch void *resize_team_scratch_space(std::int64_t bytes, bool force_shrink = false); }; } // namespace Impl + +// Partitioning an Execution Space: expects space and integer arguments for +// relative weight +// Customization point for backends +// Default behavior is to return the passed in instance + +namespace Impl { +inline void create_HIP_instances(std::vector &instances) { + for (int s = 0; s < int(instances.size()); s++) { + hipStream_t stream; + KOKKOS_IMPL_HIP_SAFE_CALL(hipStreamCreate(&stream)); + instances[s] = HIP(stream, true); + } +} +} // namespace Impl + +template +std::vector partition_space(const HIP &, Args...) { +#ifdef __cpp_fold_expressions + static_assert( + (... && std::is_arithmetic_v), + "Kokkos Error: partitioning arguments must be integers or floats"); +#endif + + std::vector instances(sizeof...(Args)); + Impl::create_HIP_instances(instances); + return instances; +} + +template +std::vector partition_space(const HIP &, std::vector &weights) { + static_assert( + std::is_arithmetic::value, + "Kokkos Error: partitioning arguments must be integers or floats"); + + std::vector instances(weights.size()); + Impl::create_HIP_instances(instances); + return instances; +} } // namespace Experimental } // namespace Kokkos diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_KernelLaunch.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_KernelLaunch.hpp index f774423b378b..f209edf7c04e 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_KernelLaunch.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_KernelLaunch.hpp @@ -52,6 +52,7 @@ #include #include #include +#include // Must use global variable on the device with HIP-Clang #ifdef __HIP__ @@ -64,7 +65,7 @@ namespace Kokkos { namespace Experimental { template inline __device__ T *kokkos_impl_hip_shared_memory() { - HIP_DYNAMIC_SHARED(HIPSpace::size_type, sh); + extern __shared__ Kokkos::Experimental::HIPSpace::size_type sh[]; return (T *)sh; } } // namespace Experimental @@ -74,10 +75,12 @@ namespace Kokkos { namespace Experimental { namespace Impl { +// The hip_parallel_launch_*_memory code is identical to the cuda code template __global__ static void hip_parallel_launch_constant_memory() { const DriverType &driver = *(reinterpret_cast( kokkos_impl_hip_constant_memory_buffer)); + driver(); } @@ -87,12 +90,13 @@ __global__ __launch_bounds__( const DriverType &driver = *(reinterpret_cast( kokkos_impl_hip_constant_memory_buffer)); - driver->operator()(); + driver(); } template __global__ static void hip_parallel_launch_local_memory( const DriverType *driver) { + // FIXME_HIP driver() pass by copy driver->operator()(); } @@ -101,6 +105,21 @@ __global__ __launch_bounds__( maxTperB, minBperSM) static void hip_parallel_launch_local_memory(const DriverType *driver) { + // FIXME_HIP driver() pass by copy + driver->operator()(); +} + +template +__global__ static void hip_parallel_launch_global_memory( + const DriverType *driver) { + driver->operator()(); +} + +template +__global__ __launch_bounds__( + maxTperB, + minBperSM) static void hip_parallel_launch_global_memory(const DriverType + *driver) { driver->operator()(); } @@ -127,33 +146,238 @@ struct HIPDispatchProperties { HIPLaunchMechanism launch_mechanism = l; }; +// Use local memory up to ConstantMemoryUseThreshold +// Use global memory above ConstantMemoryUsage +// In between use ConstantMemory +// The following code is identical to the cuda code +template +struct DeduceHIPLaunchMechanism { + static constexpr Kokkos::Experimental::WorkItemProperty::HintLightWeight_t + light_weight = Kokkos::Experimental::WorkItemProperty::HintLightWeight; + static constexpr Kokkos::Experimental::WorkItemProperty::HintHeavyWeight_t + heavy_weight = Kokkos::Experimental::WorkItemProperty::HintHeavyWeight; + static constexpr typename DriverType::Policy::work_item_property property = + typename DriverType::Policy::work_item_property(); + + static constexpr HIPLaunchMechanism valid_launch_mechanism = + // BuildValidMask + (sizeof(DriverType) < HIPTraits::KernelArgumentLimit + ? HIPLaunchMechanism::LocalMemory + : HIPLaunchMechanism::Default) | + (sizeof(DriverType) < HIPTraits::ConstantMemoryUsage + ? HIPLaunchMechanism::ConstantMemory + : HIPLaunchMechanism::Default) | + HIPLaunchMechanism::GlobalMemory; + + static constexpr HIPLaunchMechanism requested_launch_mechanism = + (((property & light_weight) == light_weight) + ? HIPLaunchMechanism::LocalMemory + : HIPLaunchMechanism::ConstantMemory) | + HIPLaunchMechanism::GlobalMemory; + + static constexpr HIPLaunchMechanism default_launch_mechanism = + // BuildValidMask + (sizeof(DriverType) < HIPTraits::ConstantMemoryUseThreshold) + ? HIPLaunchMechanism::LocalMemory + : ((sizeof(DriverType) < HIPTraits::ConstantMemoryUsage) + ? HIPLaunchMechanism::ConstantMemory + : HIPLaunchMechanism::GlobalMemory); + + // None LightWeight HeavyWeight + // F +struct HIPParallelLaunchKernelFuncData { + static unsigned int get_scratch_size( + hipFuncAttributes const &hip_func_attributes) { + return hip_func_attributes.localSizeBytes; + } + + static hipFuncAttributes get_hip_func_attributes(void const *kernel_func) { + static hipFuncAttributes attr = [=]() { + hipFuncAttributes attr; + KOKKOS_IMPL_HIP_SAFE_CALL(hipFuncGetAttributes(&attr, kernel_func)); + return attr; + }(); + return attr; + } +}; + +//---------------------------------------------------------------// +// HIPParallelLaunchKernelFunc structure and its specializations // +//---------------------------------------------------------------// template struct HIPParallelLaunchKernelFunc; +// HIPLaunchMechanism::LocalMemory specializations template struct HIPParallelLaunchKernelFunc< DriverType, Kokkos::LaunchBounds, HIPLaunchMechanism::LocalMemory> { + using funcdata_t = HIPParallelLaunchKernelFuncData< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::LocalMemory>; static auto get_kernel_func() { return hip_parallel_launch_local_memory; } + + static constexpr auto default_launchbounds() { return false; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); + } }; template struct HIPParallelLaunchKernelFunc, HIPLaunchMechanism::LocalMemory> { + using funcdata_t = + HIPParallelLaunchKernelFuncData, + HIPLaunchMechanism::LocalMemory>; + static auto get_kernel_func() { + return HIPParallelLaunchKernelFunc< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::LocalMemory>::get_kernel_func(); + } + + static constexpr auto default_launchbounds() { return true; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); + } +}; + +// HIPLaunchMechanism::GlobalMemory specializations +template +struct HIPParallelLaunchKernelFunc< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::GlobalMemory> { + using funcdata_t = HIPParallelLaunchKernelFuncData< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::GlobalMemory>; + static auto get_kernel_func() { + return hip_parallel_launch_global_memory; + } + + static constexpr auto default_launchbounds() { return false; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); + } +}; + +template +struct HIPParallelLaunchKernelFunc, + HIPLaunchMechanism::GlobalMemory> { + using funcdata_t = + HIPParallelLaunchKernelFuncData, + HIPLaunchMechanism::GlobalMemory>; + static auto get_kernel_func() { + return hip_parallel_launch_global_memory; + } + + static constexpr auto default_launchbounds() { return true; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); + } +}; + +// HIPLaunchMechanism::ConstantMemory specializations +template +struct HIPParallelLaunchKernelFunc< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::ConstantMemory> { + using funcdata_t = HIPParallelLaunchKernelFuncData< + DriverType, Kokkos::LaunchBounds, + HIPLaunchMechanism::ConstantMemory>; static auto get_kernel_func() { - return hip_parallel_launch_local_memory; + return hip_parallel_launch_constant_memory; + } + + static constexpr auto default_launchbounds() { return false; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); } }; +template +struct HIPParallelLaunchKernelFunc, + HIPLaunchMechanism::ConstantMemory> { + using funcdata_t = + HIPParallelLaunchKernelFuncData, + HIPLaunchMechanism::ConstantMemory>; + static auto get_kernel_func() { + return hip_parallel_launch_constant_memory; + } + static constexpr auto default_launchbounds() { return true; } + + static auto get_scratch_size() { + return funcdata_t::get_scratch_size(get_hip_func_attributes()); + } + + static hipFuncAttributes get_hip_func_attributes() { + return funcdata_t::get_hip_func_attributes( + reinterpret_cast(get_kernel_func())); + } +}; + +//------------------------------------------------------------------// +// HIPParallelLaunchKernelInvoker structure and its specializations // +//------------------------------------------------------------------// template struct HIPParallelLaunchKernelInvoker; +// HIPLaunchMechanism::LocalMemory specialization template struct HIPParallelLaunchKernelInvoker @@ -170,21 +394,83 @@ struct HIPParallelLaunchKernelInvoker +struct HIPParallelLaunchKernelInvoker + : HIPParallelLaunchKernelFunc { + using base_t = HIPParallelLaunchKernelFunc; + + // FIXME_HIP the code is different than cuda because driver cannot be passed + // by copy + static void invoke_kernel(DriverType const *driver, dim3 const &grid, + dim3 const &block, int shmem, + HIPInternal const *hip_instance) { + (base_t::get_kernel_func())<<m_stream>>>( + driver); + } +}; + +// HIPLaunchMechanism::ConstantMemory specializations +template +struct HIPParallelLaunchKernelInvoker + : HIPParallelLaunchKernelFunc { + using base_t = + HIPParallelLaunchKernelFunc; + static_assert(sizeof(DriverType) < HIPTraits::ConstantMemoryUsage, + "Kokkos Error: Requested HIPLaunchConstantMemory with a " + "Functor larger than 32kB."); + + static void invoke_kernel(DriverType const *driver, dim3 const &grid, + dim3 const &block, int shmem, + HIPInternal const *hip_instance) { + // Wait until the previous kernel that uses the constant buffer is done + KOKKOS_IMPL_HIP_SAFE_CALL( + hipEventSynchronize(hip_instance->constantMemReusable)); + + // Copy functor (synchronously) to staging buffer in pinned host memory + unsigned long *staging = hip_instance->constantMemHostStaging; + std::memcpy((void *)staging, (void *)driver, sizeof(DriverType)); + + // Copy functor asynchronously from there to constant memory on the device + KOKKOS_IMPL_HIP_SAFE_CALL(hipMemcpyToSymbolAsync( + HIP_SYMBOL(kokkos_impl_hip_constant_memory_buffer), staging, + sizeof(DriverType), 0, hipMemcpyHostToDevice, hip_instance->m_stream)); + + // Invoke the driver function on the device + (base_t:: + get_kernel_func())<<m_stream>>>(); + + // Record an event that says when the constant buffer can be reused + KOKKOS_IMPL_HIP_SAFE_CALL(hipEventRecord(hip_instance->constantMemReusable, + hip_instance->m_stream)); + } +}; + +//-----------------------------// +// HIPParallelLaunch structure // +//-----------------------------// template , - HIPLaunchMechanism LaunchMechanism = HIPLaunchMechanism::LocalMemory> + HIPLaunchMechanism LaunchMechanism = + DeduceHIPLaunchMechanism::launch_mechanism> struct HIPParallelLaunch; template + unsigned int MinBlocksPerSM, HIPLaunchMechanism LaunchMechanism> struct HIPParallelLaunch< DriverType, Kokkos::LaunchBounds, - HIPLaunchMechanism::LocalMemory> + LaunchMechanism> : HIPParallelLaunchKernelInvoker< DriverType, Kokkos::LaunchBounds, - HIPLaunchMechanism::LocalMemory> { + LaunchMechanism> { using base_t = HIPParallelLaunchKernelInvoker< DriverType, Kokkos::LaunchBounds, - HIPLaunchMechanism::LocalMemory>; + LaunchMechanism>; HIPParallelLaunch(const DriverType &driver, const dim3 &grid, const dim3 &block, const int shmem, @@ -205,22 +491,48 @@ struct HIPParallelLaunch< base_t::invoke_kernel(d_driver, grid, block, shmem, hip_instance); #if defined(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK) - HIP_SAFE_CALL(hipGetLastError()); - hip_instance->fence(); + KOKKOS_IMPL_HIP_SAFE_CALL(hipGetLastError()); + hip_instance->fence( + "Kokkos::Experimental::Impl::HIParallelLaunch: Debug Only Check for " + "Execution Error"); #endif } } +}; - static hipFuncAttributes get_hip_func_attributes() { - static hipFuncAttributes attr = []() { - hipFuncAttributes attr; - HIP_SAFE_CALL(hipFuncGetAttributes( - &attr, reinterpret_cast(base_t::get_kernel_func()))); - return attr; - }(); - return attr; +// convenience method to launch the correct kernel given the launch bounds et +// al. +template , + HIPLaunchMechanism LaunchMechanism = + DeduceHIPLaunchMechanism::launch_mechanism> +void hip_parallel_launch(const DriverType &driver, const dim3 &grid, + const dim3 &block, const int shmem, + const HIPInternal *hip_instance, + const bool prefer_shmem) { + // FIXME_HIP - could be if constexpr for c++17 + if (!HIPParallelLaunch::default_launchbounds()) { + // for user defined, we *always* honor the request + HIPParallelLaunch( + driver, grid, block, shmem, hip_instance, prefer_shmem); + } else { + // we can do what we like + const unsigned flat_block_size = block.x * block.y * block.z; + if (flat_block_size <= HIPTraits::ConservativeThreadsPerBlock) { + // we have to use the large blocksize + HIPParallelLaunch< + DriverType, + Kokkos::LaunchBounds, + LaunchMechanism>(driver, grid, block, shmem, hip_instance, + prefer_shmem); + } else { + HIPParallelLaunch, + LaunchMechanism>(driver, grid, block, shmem, + hip_instance, prefer_shmem); + } } -}; +} } // namespace Impl } // namespace Experimental } // namespace Kokkos diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp index 4f5271b6f644..c4292d35eca7 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.cpp @@ -84,11 +84,17 @@ namespace Impl { HIPLockArrays g_host_hip_lock_arrays = {nullptr, nullptr, 0}; void initialize_host_hip_lock_arrays() { +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + desul::Impl::init_lock_arrays(); + + DESUL_ENSURE_HIP_LOCK_ARRAYS_ON_DEVICE(); +#endif + if (g_host_hip_lock_arrays.atomic != nullptr) return; - HIP_SAFE_CALL(hipMalloc( + KOKKOS_IMPL_HIP_SAFE_CALL(hipMalloc( &g_host_hip_lock_arrays.atomic, sizeof(std::int32_t) * (KOKKOS_IMPL_HIP_SPACE_ATOMIC_MASK + 1))); - HIP_SAFE_CALL(hipMalloc( + KOKKOS_IMPL_HIP_SAFE_CALL(hipMalloc( &g_host_hip_lock_arrays.scratch, sizeof(std::int32_t) * (::Kokkos::Experimental::HIP::concurrency()))); @@ -103,10 +109,14 @@ void initialize_host_hip_lock_arrays() { } void finalize_host_hip_lock_arrays() { +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + desul::Impl::finalize_lock_arrays(); +#endif + if (g_host_hip_lock_arrays.atomic == nullptr) return; - HIP_SAFE_CALL(hipFree(g_host_hip_lock_arrays.atomic)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipFree(g_host_hip_lock_arrays.atomic)); g_host_hip_lock_arrays.atomic = nullptr; - HIP_SAFE_CALL(hipFree(g_host_hip_lock_arrays.scratch)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipFree(g_host_hip_lock_arrays.scratch)); g_host_hip_lock_arrays.scratch = nullptr; g_host_hip_lock_arrays.n = 0; #ifdef KOKKOS_ENABLE_HIP_RELOCATABLE_DEVICE_CODE diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.hpp index f34f85f43b0b..71b104c2e4b6 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Locks.hpp @@ -51,6 +51,10 @@ #include +#ifdef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS +#include +#endif + namespace Kokkos { namespace Impl { @@ -147,7 +151,7 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } #define KOKKOS_COPY_HIP_LOCK_ARRAYS_TO_DEVICE() \ { \ if (::Kokkos::Impl::lock_array_copied == 0) { \ - HIP_SAFE_CALL(hipMemcpyToSymbol( \ + KOKKOS_IMPL_HIP_SAFE_CALL(hipMemcpyToSymbol( \ HIP_SYMBOL(::Kokkos::Impl::g_device_hip_lock_arrays), \ &::Kokkos::Impl::g_host_hip_lock_arrays, \ sizeof(::Kokkos::Impl::HIPLockArrays))); \ @@ -155,6 +159,8 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } ::Kokkos::Impl::lock_array_copied = 1; \ } +#ifndef KOKKOS_ENABLE_IMPL_DESUL_ATOMICS + #ifdef KOKKOS_ENABLE_HIP_RELOCATABLE_DEVICE_CODE #define KOKKOS_ENSURE_HIP_LOCK_ARRAYS_ON_DEVICE() #else @@ -162,6 +168,19 @@ inline int eliminate_warning_for_lock_array() { return lock_array_copied; } KOKKOS_COPY_HIP_LOCK_ARRAYS_TO_DEVICE() #endif +#else + +#ifdef KOKKOS_ENABLE_HIP_RELOCATABLE_DEVICE_CODE +#define KOKKOS_ENSURE_HIP_LOCK_ARRAYS_ON_DEVICE() +#else +// Still Need COPY_CUDA_LOCK_ARRAYS for team scratch etc. +#define KOKKOS_ENSURE_HIP_LOCK_ARRAYS_ON_DEVICE() \ + KOKKOS_COPY_HIP_LOCK_ARRAYS_TO_DEVICE() \ + DESUL_ENSURE_HIP_LOCK_ARRAYS_ON_DEVICE() +#endif + +#endif /* defined( KOKKOS_ENABLE_IMPL_DESUL_ATOMICS ) */ + #endif /* defined( __HIPCC__ ) */ #endif /* #ifndef KOKKOS_HIP_LOCKS_HPP */ diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_MDRangePolicy.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_MDRangePolicy.hpp index ce1aff9586d2..acb538e1cb39 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_MDRangePolicy.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_MDRangePolicy.hpp @@ -28,7 +28,8 @@ inline TileSizeProperties get_tile_size_properties( space.impl_internal_space_instance()->m_maxThreadsPerSM; properties.default_largest_tile_size = 16; properties.default_tile_size = 4; - properties.max_total_tile_size = 1024; + properties.max_total_tile_size = + Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock; return properties; } diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_MDRange.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_MDRange.hpp index 35e7d6fb853a..eae323dd913d 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_MDRange.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_MDRange.hpp @@ -81,6 +81,8 @@ class ParallelFor, } inline void execute() const { + using ClosureType = + ParallelFor; if (m_policy.m_num_tiles == 0) return; array_index_type const maxblocks = static_cast( m_policy.space().impl_internal_space_instance()->m_maxBlock); @@ -94,7 +96,8 @@ class ParallelFor, block.y, maxblocks), 1); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } else if (Policy::rank == 3) { @@ -110,7 +113,8 @@ class ParallelFor, std::min((m_policy.m_upper[2] - m_policy.m_lower[2] + block.z - 1) / block.z, maxblocks)); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } else if (Policy::rank == 4) { @@ -128,7 +132,8 @@ class ParallelFor, std::min((m_policy.m_upper[3] - m_policy.m_lower[3] + block.z - 1) / block.z, maxblocks)); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } else if (Policy::rank == 5) { @@ -147,7 +152,8 @@ class ParallelFor, std::min((m_policy.m_upper[4] - m_policy.m_lower[4] + block.z - 1) / block.z, maxblocks)); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } else if (Policy::rank == 6) { @@ -165,7 +171,8 @@ class ParallelFor, std::min(static_cast(m_policy.m_tile_end[4] * m_policy.m_tile_end[5]), static_cast(maxblocks))); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } else { @@ -178,22 +185,18 @@ class ParallelFor, : m_functor(arg_functor), m_policy(arg_policy) {} template - static int max_tile_size_product(const Policy& pol, const Functor&) { + static int max_tile_size_product(const Policy&, const Functor&) { using closure_type = ParallelFor, Kokkos::Experimental::HIP>; - hipFuncAttributes attr = Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, LaunchBounds>::get_hip_func_attributes(); - auto const& prop = pol.space().hip_device_prop(); - // Limits due to registers/SM, MDRange doesn't have - // shared memory constraints - int const regs_per_sm = prop.regsPerMultiprocessor; - int const regs_per_thread = attr.numRegs; - int const max_threads_per_sm = regs_per_sm / regs_per_thread; - return std::min( - max_threads_per_sm, - static_cast( - Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock)); + unsigned block_size = + Kokkos::Experimental::Impl::hip_get_max_blocksize(); + if (block_size == 0) + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelFor< HIP > could not find a valid " + "tile size.")); + return block_size; } }; @@ -242,6 +245,9 @@ class ParallelReduce, ReducerType, const bool m_result_ptr_device_accessible; size_type* m_scratch_space; size_type* m_scratch_flags; + // Only let one Parallel/Scan modify the shared memory. The + // constructor acquires the mutex which is released in the destructor. + std::unique_lock m_shared_memory_lock; using DeviceIteratePattern = typename Kokkos::Impl::Reduce::DeviceIterateTile< Policy::rank, Policy, FunctorType, WorkTag, reference_type>; @@ -307,32 +313,30 @@ class ParallelReduce, ReducerType, // Determine block size constrained by shared memory: // This is copy/paste from Kokkos_HIP_Parallel_Range inline unsigned local_block_size(const FunctorType& f) { - unsigned int n = - ::Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock; - int shmem_size = ::Kokkos::Impl::hip_single_inter_block_reduce_scan_shmem< - false, FunctorType, WorkTag>(f, n); - using closure_type = Impl::ParallelReduce; - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, LaunchBounds>::get_hip_func_attributes(); - while ( - (n && - (m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock < - shmem_size)) || - (n > - static_cast( - ::Kokkos::Experimental::Impl::hip_get_max_block_size( - m_policy.space().impl_internal_space_instance(), attr, f, 1, - shmem_size, 0)))) { - n >>= 1; - shmem_size = ::Kokkos::Impl::hip_single_inter_block_reduce_scan_shmem< - false, FunctorType, WorkTag>(f, n); + const auto& instance = m_policy.space().impl_internal_space_instance(); + auto shmem_functor = [&f](unsigned n) { + return hip_single_inter_block_reduce_scan_shmem(f, n); + }; + using closure_type = ParallelReduce; + + unsigned block_size = + Kokkos::Experimental::Impl::hip_get_preferred_blocksize( + instance, shmem_functor); + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelReduce< HIP > could not find a " + "valid tile size.")); } - return n; + return block_size; } inline void execute() { - const int nwork = m_policy.m_num_tiles; + using ClosureType = ParallelReduce; + const int nwork = m_policy.m_num_tiles; if (nwork) { int block_size = m_policy.m_prod_tile_dims; // CONSTRAINT: Algorithm requires block_size >= product of tile dimensions @@ -366,14 +370,16 @@ class ParallelReduce, ReducerType, ::Kokkos::Impl::hip_single_inter_block_reduce_scan_shmem< false, FunctorType, WorkTag>(m_functor, block.y); - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem, m_policy.space().impl_internal_space_instance(), false); // copy to device and execute if (!m_result_ptr_device_accessible) { - m_policy.space().fence(); + m_policy.space().fence( + "Kokkos::Impl::ParallelReduce: fence because " + "reduction can't access result storage location"); if (m_result_ptr) { const int size = ValueTraits::value_size( @@ -403,7 +409,10 @@ class ParallelReduce, ReducerType, MemorySpaceAccess::accessible), m_scratch_space(nullptr), - m_scratch_flags(nullptr) {} + m_scratch_flags(nullptr), + m_shared_memory_lock(m_policy.space() + .impl_internal_space_instance() + ->m_mutexSharedMemory) {} ParallelReduce(const FunctorType& arg_functor, const Policy& arg_policy, const ReducerType& reducer) @@ -416,23 +425,25 @@ class ParallelReduce, ReducerType, typename ReducerType::result_view_type:: memory_space>::accessible), m_scratch_space(nullptr), - m_scratch_flags(nullptr) {} + m_scratch_flags(nullptr), + m_shared_memory_lock(m_policy.space() + .impl_internal_space_instance() + ->m_mutexSharedMemory) {} + template - static int max_tile_size_product(const Policy& pol, const Functor&) { + static int max_tile_size_product(const Policy&, const Functor&) { using closure_type = ParallelReduce, ReducerType, Kokkos::Experimental::HIP>; - hipFuncAttributes attr = Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, LaunchBounds>::get_hip_func_attributes(); - auto const& prop = pol.space().hip_device_prop(); - // Limits due do registers/SM - int const regs_per_sm = prop.regsPerMultiprocessor; - int const regs_per_thread = attr.numRegs; - int const max_threads_per_sm = regs_per_sm / regs_per_thread; - return std::min( - max_threads_per_sm, - static_cast( - Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock)); + unsigned block_size = + Kokkos::Experimental::Impl::hip_get_max_blocksize(); + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelReduce< HIP > could not find a " + "valid tile size.")); + } + return block_size; } }; } // namespace Impl diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Range.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Range.hpp index 7d2825eeb4c6..e02ead1e9901 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Range.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Range.hpp @@ -108,16 +108,21 @@ class ParallelFor, inline void execute() const { const typename Policy::index_type nwork = m_policy.end() - m_policy.begin(); + using DriverType = + ParallelFor; const int block_size = - LaunchBounds::maxTperB - ? LaunchBounds::maxTperB - : ::Kokkos::Experimental::Impl::HIPTraits:: - MaxThreadsPerBlock; // FIXME_HIP Choose block_size better + Kokkos::Experimental::Impl::hip_get_preferred_blocksize(); const dim3 block(1, block_size, 1); const dim3 grid( typename Policy::index_type((nwork + block.y - 1) / block.y), 1, 1); - Kokkos::Experimental::Impl::HIPParallelLaunch( + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelFor< HIP > could not find a " + "valid execution configuration.")); + } + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, 0, m_policy.space().impl_internal_space_instance(), false); } @@ -173,15 +178,12 @@ class ParallelReduce, ReducerType, const bool m_result_ptr_host_accessible; size_type* m_scratch_space = nullptr; size_type* m_scratch_flags = nullptr; + // Only let one ParallelReduce/Scan modify the shared memory. The + // constructor acquires the mutex which is released in the destructor. + std::unique_lock m_shared_memory_lock; -#if HIP_VERSION < 401 - static bool constexpr UseShflReduction = - ((sizeof(value_type) > 2 * sizeof(double)) && - static_cast(ValueTraits::StaticValueSize)); -#else static bool constexpr UseShflReduction = static_cast(ValueTraits::StaticValueSize); -#endif private: struct ShflReductionTag {}; @@ -328,30 +330,15 @@ class ParallelReduce, ReducerType, // Determine block size constrained by shared memory: inline unsigned local_block_size(const FunctorType& f) { - unsigned int n = - ::Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock; - int shmem_size = - hip_single_inter_block_reduce_scan_shmem( - f, n); - using closure_type = Impl::ParallelReduce; - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, LaunchBounds>::get_hip_func_attributes(); - while ( - (n && - (m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock < - shmem_size)) || - (n > - static_cast( - ::Kokkos::Experimental::Impl::hip_get_max_block_size( - m_policy.space().impl_internal_space_instance(), attr, f, 1, - shmem_size, 0)))) { - n >>= 1; - shmem_size = - hip_single_inter_block_reduce_scan_shmem( - f, n); - } - return n; + const auto& instance = m_policy.space().impl_internal_space_instance(); + auto shmem_functor = [&f](unsigned n) { + return hip_single_inter_block_reduce_scan_shmem(f, n); + }; + using DriverType = ParallelReduce; + return Kokkos::Experimental::Impl::hip_get_preferred_blocksize< + DriverType, LaunchBounds>(instance, shmem_functor); } inline void execute() { @@ -362,7 +349,11 @@ class ParallelReduce, ReducerType, !std::is_same::value; if ((nwork > 0) || need_device_set) { const int block_size = local_block_size(m_functor); - KOKKOS_ASSERT(block_size > 0); + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelReduce< HIP > could not find a " + "valid execution configuration.")); + } m_scratch_space = ::Kokkos::Experimental::Impl::hip_internal_scratch_space( @@ -391,14 +382,17 @@ class ParallelReduce, ReducerType, WorkTag>(m_functor, block.y); - Kokkos::Experimental::Impl::HIPParallelLaunch( + using DriverType = ParallelReduce; + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem, m_policy.space().impl_internal_space_instance(), false); // copy to device and execute if (!m_result_ptr_device_accessible) { - m_policy.space().impl_internal_space_instance()->fence(); + m_policy.space().impl_internal_space_instance()->fence( + "Kokkos::Impl::ParallelReduce: fence because " + "reduction can't access result storage location"); if (m_result_ptr) { const int size = ValueTraits::value_size( @@ -429,7 +423,10 @@ class ParallelReduce, ReducerType, typename ViewType::memory_space>::accessible), m_result_ptr_host_accessible( MemorySpaceAccess::accessible) {} + typename ViewType::memory_space>::accessible), + m_shared_memory_lock(m_policy.space() + .impl_internal_space_instance() + ->m_mutexSharedMemory) {} ParallelReduce(const FunctorType& arg_functor, const Policy& arg_policy, const ReducerType& reducer) @@ -444,7 +441,10 @@ class ParallelReduce, ReducerType, m_result_ptr_host_accessible( MemorySpaceAccess::accessible) {} + memory_space>::accessible), + m_shared_memory_lock(m_policy.space() + .impl_internal_space_instance() + ->m_mutexSharedMemory) {} }; template @@ -482,6 +482,9 @@ class ParallelScanHIPBase { size_type* m_scratch_flags = nullptr; size_type m_final = false; int m_grid_x = 0; + // Only let one ParallelReduce/Scan modify the shared memory. The + // constructor acquires the mutex which is released in the destructor. + std::unique_lock m_shared_memory_lock; private: template @@ -624,22 +627,7 @@ class ParallelScanHIPBase { } // Determine block size constrained by shared memory: - inline unsigned local_block_size(const FunctorType& f) { - // blockDim.y must be power of two = 128 (2 warps) or 256 (4 warps) or - // 512 (8 warps) gridDim.x <= blockDim.y * blockDim.y - // - // TODO check best option - - unsigned n = Experimental::Impl::HIPTraits::WarpSize * 4; - while (n && static_cast(m_policy.space() - .impl_internal_space_instance() - ->m_maxShmemPerBlock) < - hip_single_inter_block_reduce_scan_shmem(f, n)) { - n >>= 1; - } - return n; - } + virtual inline unsigned local_block_size(const FunctorType& f) = 0; inline void impl_execute() { const index_type nwork = m_policy.end() - m_policy.begin(); @@ -649,7 +637,11 @@ class ParallelScanHIPBase { const int gridMaxComputeCapability_2x = 0x01fff; const int block_size = static_cast(local_block_size(m_functor)); - KOKKOS_ASSERT(block_size > 0); + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelScan< HIP > could not find a " + "valid execution configuration.")); + } const int grid_max = std::min(block_size * block_size, gridMaxComputeCapability_2x); @@ -674,15 +666,16 @@ class ParallelScanHIPBase { const int shmem = ValueTraits::value_size(m_functor) * (block_size + 2); m_final = false; - Kokkos::Experimental::Impl::HIPParallelLaunch( + // these ones are OK to be just the base because the specializations + // do not modify the kernel at all + using DriverType = ParallelScanHIPBase; + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem, m_policy.space().impl_internal_space_instance(), false); // copy to device and execute m_final = true; - Kokkos::Experimental::Impl::HIPParallelLaunch( + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem, m_policy.space().impl_internal_space_instance(), false); // copy to device and execute @@ -690,13 +683,17 @@ class ParallelScanHIPBase { } ParallelScanHIPBase(const FunctorType& arg_functor, const Policy& arg_policy) - : m_functor(arg_functor), m_policy(arg_policy) {} + : m_functor(arg_functor), + m_policy(arg_policy), + m_shared_memory_lock(m_policy.space() + .impl_internal_space_instance() + ->m_mutexSharedMemory) {} }; template class ParallelScan, Kokkos::Experimental::HIP> - : private ParallelScanHIPBase { + : public ParallelScanHIPBase { public: using Base = ParallelScanHIPBase; using Base::operator(); @@ -706,6 +703,23 @@ class ParallelScan, ParallelScan(const FunctorType& arg_functor, const typename Base::Policy& arg_policy) : Base(arg_functor, arg_policy) {} + + inline unsigned local_block_size(const FunctorType& f) { + // blockDim.y must be power of two = 128 (2 warps) or 256 (4 warps) or + // 512 (8 warps) gridDim.x <= blockDim.y * blockDim.y + + const auto& instance = + Base::m_policy.space().impl_internal_space_instance(); + auto shmem_functor = [&f](unsigned n) { + return hip_single_inter_block_reduce_scan_shmem( + f, n); + }; + using DriverType = ParallelScan; + return Kokkos::Experimental::Impl::hip_get_preferred_blocksize< + DriverType, typename Base::LaunchBounds>(instance, shmem_functor); + } }; //---------------------------------------------------------------------------- @@ -713,7 +727,7 @@ class ParallelScan, template class ParallelScanWithTotal, ReturnType, Kokkos::Experimental::HIP> - : private ParallelScanHIPBase { + : public ParallelScanHIPBase { public: using Base = ParallelScanHIPBase; using Base::operator(); @@ -737,6 +751,24 @@ class ParallelScanWithTotal, const typename Base::Policy& arg_policy, ReturnType& arg_returnvalue) : Base(arg_functor, arg_policy), m_returnvalue(arg_returnvalue) {} + + inline unsigned local_block_size(const FunctorType& f) { + // blockDim.y must be power of two = 128 (2 warps) or 256 (4 warps) or + // 512 (8 warps) gridDim.x <= blockDim.y * blockDim.y + + const auto& instance = + Base::m_policy.space().impl_internal_space_instance(); + auto shmem_functor = [&f](unsigned n) { + return hip_single_inter_block_reduce_scan_shmem( + f, n); + }; + using DriverType = + ParallelScanWithTotal; + return Kokkos::Experimental::Impl::hip_get_preferred_blocksize< + DriverType, typename Base::LaunchBounds>(instance, shmem_functor); + } }; } // namespace Impl diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Team.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Team.hpp index 96c3ff2a7510..b794f5bc0371 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Team.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Parallel_Team.hpp @@ -56,20 +56,20 @@ namespace Kokkos { namespace Impl { + template class TeamPolicyInternal : public PolicyTraits { public: using execution_policy = TeamPolicyInternal; - using traits = PolicyTraits; + using traits = PolicyTraits; + using BlockType = Kokkos::Experimental::Impl::BlockType; template friend class TeamPolicyInternal; private: - static int constexpr MAX_WARP = 8; - typename traits::execution_space m_space; int m_league_size; int m_team_size; @@ -101,17 +101,9 @@ class TeamPolicyInternal template int team_size_max(FunctorType const& f, ParallelForTag const&) const { using closure_type = - Impl::ParallelFor >; - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, - typename traits::launch_bounds>::get_hip_func_attributes(); - int const block_size = ::Kokkos::Experimental::Impl::hip_get_max_block_size< - FunctorType, typename traits::launch_bounds>( - space().impl_internal_space_instance(), attr, f, - static_cast(impl_vector_length()), - static_cast(team_scratch_size(0)) + 2 * sizeof(double), - static_cast(thread_scratch_size(0)) + sizeof(double)); - return block_size / impl_vector_length(); + Impl::ParallelFor>; + + return internal_team_size_common(f); } template @@ -129,8 +121,8 @@ class TeamPolicyInternal return internal_team_size_max(f); } - template - inline int team_size_max(const FunctorType& f, const ReducerType& /*r*/, + template + inline int team_size_max(const FunctorType& f, const ReducerType&, const ParallelReduceTag&) const { using closure_type = Impl::ParallelReduce, @@ -141,17 +133,9 @@ class TeamPolicyInternal template int team_size_recommended(FunctorType const& f, ParallelForTag const&) const { using closure_type = - Impl::ParallelFor >; - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, - typename traits::launch_bounds>::get_hip_func_attributes(); - int const block_size = ::Kokkos::Experimental::Impl::hip_get_opt_block_size< - FunctorType, typename traits::launch_bounds>( - space().impl_internal_space_instance(), attr, f, - static_cast(impl_vector_length()), - static_cast(team_scratch_size(0)) + 2 * sizeof(double), - static_cast(thread_scratch_size(0)) + sizeof(double)); - return block_size / impl_vector_length(); + Impl::ParallelFor>; + + return internal_team_size_common(f); } template @@ -169,7 +153,7 @@ class TeamPolicyInternal return internal_team_size_recommended(f); } - template + template int team_size_recommended(FunctorType const& f, ReducerType const&, ParallelReduceTag const&) const { using closure_type = @@ -177,6 +161,7 @@ class TeamPolicyInternal ReducerType>; return internal_team_size_recommended(f); } + inline bool impl_auto_vector_length() const { return m_tune_vector_length; } inline bool impl_auto_team_size() const { return m_tune_team_size; } static int vector_length_max() { @@ -211,7 +196,10 @@ class TeamPolicyInternal inline void impl_set_vector_length(size_t size) { m_vector_length = size; } inline void impl_set_team_size(size_t size) { m_team_size = size; } int impl_vector_length() const { return m_vector_length; } + +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 KOKKOS_DEPRECATED int vector_length() const { return impl_vector_length(); } +#endif int team_size() const { return m_team_size; } @@ -266,7 +254,8 @@ class TeamPolicyInternal "space."); // Make sure total block size is permissible - if (m_team_size * m_vector_length > 1024) { + if (m_team_size * m_vector_length > + ::Kokkos::Experimental::Impl::HIPTraits::MaxThreadsPerBlock) { Impl::throw_runtime_exception( std::string("Kokkos::TeamPolicy< HIP > the team size is too large. " "Team size x vector length must be smaller than 1024.")); @@ -363,26 +352,84 @@ class TeamPolicyInternal using member_type = Kokkos::Impl::HIPTeamMember; protected: - template - int internal_team_size_common(const FunctorType& f, - BlockSizeCallable&& block_size_callable) const { - using closure_type = ClosureType; + template + int internal_team_size_common(const FunctorType& f) const { + // FIXME_HIP: this could be unified with the + // internal_team_size_common_reduce + // once we can turn c++17 constexpr on by default. + // The problem right now is that we can't turn off the evaluation + // of the functor_value_traits's valuesize / StaticValueSize + + const unsigned shmem_block = team_scratch_size(0) + 2 * sizeof(double); + const unsigned shmem_thread = thread_scratch_size(0) + sizeof(double); + const int vector_length = impl_vector_length(); + + const auto functor = [&f, shmem_block, shmem_thread, vector_length]( + const hipFuncAttributes& attr, int block_size) { + int functor_shmem = + ::Kokkos::Impl::FunctorTeamShmemSize::value( + f, block_size / vector_length); + return shmem_block + shmem_thread * (block_size / vector_length) + + functor_shmem + attr.sharedSizeBytes; + }; + int block_size; + // FIXME_HIP - could be if constexpr for c++17 + if (BlockSize == BlockType::Max) { + block_size = ::Kokkos::Experimental::Impl::hip_get_max_team_blocksize< + ClosureType, typename traits::launch_bounds>( + space().impl_internal_space_instance(), functor); + } else { + block_size = + ::Kokkos::Experimental::Impl::hip_get_preferred_team_blocksize< + ClosureType, typename traits::launch_bounds>( + space().impl_internal_space_instance(), functor); + } + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelFor< HIP > could not find a valid " + "team size.")); + } + return block_size / impl_vector_length(); + } + + template + int internal_team_size_common_reduce(const FunctorType& f) const { using functor_value_traits = Impl::FunctorValueTraits; - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - closure_type, - typename traits::launch_bounds>::get_hip_func_attributes(); - const int block_size = std::forward(block_size_callable)( - space().impl_internal_space_instance(), attr, f, - static_cast(impl_vector_length()), - static_cast(team_scratch_size(0)) + 2 * sizeof(double), - static_cast(thread_scratch_size(0)) + sizeof(double) + - ((functor_value_traits::StaticValueSize != 0) - ? 0 - : functor_value_traits::value_size(f))); - KOKKOS_ASSERT(block_size > 0); + const unsigned shmem_block = team_scratch_size(0) + 2 * sizeof(double); + const unsigned shmem_thread = thread_scratch_size(0) + sizeof(double) + + ((functor_value_traits::StaticValueSize != 0) + ? 0 + : functor_value_traits::value_size(f)); + const int vector_length = impl_vector_length(); + + const auto functor = [&f, shmem_block, shmem_thread, vector_length]( + const hipFuncAttributes& attr, int block_size) { + int functor_shmem = + ::Kokkos::Impl::FunctorTeamShmemSize::value( + f, block_size / vector_length); + return shmem_block + shmem_thread * (block_size / vector_length) + + functor_shmem + attr.sharedSizeBytes; + }; + int block_size; + // FIXME_HIP - could be if constexpr for c++17 + if (BlockSize == BlockType::Max) { + block_size = ::Kokkos::Experimental::Impl::hip_get_max_team_blocksize< + ClosureType, typename traits::launch_bounds>( + space().impl_internal_space_instance(), functor); + } else { + block_size = + ::Kokkos::Experimental::Impl::hip_get_preferred_team_blocksize< + ClosureType, typename traits::launch_bounds>( + space().impl_internal_space_instance(), functor); + } + if (block_size == 0) { + Kokkos::Impl::throw_runtime_exception( + std::string("Kokkos::Impl::ParallelReduce< HIP > could not find a " + "valid team size.")); + } // Currently we require Power-of-2 team size for reductions. int p2 = 1; while (p2 <= block_size) p2 *= 2; @@ -392,16 +439,13 @@ class TeamPolicyInternal template int internal_team_size_max(const FunctorType& f) const { - return internal_team_size_common( - f, ::Kokkos::Experimental::Impl::hip_get_max_block_size< - FunctorType, typename traits::launch_bounds>); + return internal_team_size_common_reduce(f); } template int internal_team_size_recommended(const FunctorType& f) const { - return internal_team_size_common( - f, ::Kokkos::Experimental::Impl::hip_get_opt_block_size< - FunctorType, typename traits::launch_bounds>); + return internal_team_size_common_reduce( + f); } }; @@ -505,7 +549,11 @@ class ParallelFor, dim3 const block(static_cast(m_vector_size), static_cast(m_team_size), 1); - ::Kokkos::Experimental::Impl::HIPParallelLaunch( + using closure_type = + ParallelFor, + Kokkos::Experimental::HIP>; + ::Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem_size_total, m_policy.space().impl_internal_space_instance(), true); // copy to device and execute @@ -520,17 +568,9 @@ class ParallelFor, m_scratch_lock(m_policy.space() .impl_internal_space_instance() ->m_team_scratch_mutex) { - hipFuncAttributes attr = ::Kokkos::Experimental::Impl::HIPParallelLaunch< - ParallelFor, launch_bounds>::get_hip_func_attributes(); - m_team_size = - m_team_size >= 0 - ? m_team_size - : ::Kokkos::Experimental::Impl::hip_get_opt_block_size< - FunctorType, launch_bounds>( - m_policy.space().impl_internal_space_instance(), attr, - m_functor, m_vector_size, m_policy.team_scratch_size(0), - m_policy.thread_scratch_size(0)) / - m_vector_size; + m_team_size = m_team_size >= 0 ? m_team_size + : arg_policy.team_size_recommended( + arg_functor, ParallelForTag()); m_shmem_begin = (sizeof(double) * (m_team_size + 2)); m_shmem_size = @@ -556,23 +596,12 @@ class ParallelFor, int const shmem_size_total = m_shmem_begin + m_shmem_size; if (m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock < shmem_size_total) { - printf( - "%i %i\n", - m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock, - shmem_size_total); Kokkos::Impl::throw_runtime_exception(std::string( "Kokkos::Impl::ParallelFor< HIP > insufficient shared memory")); } - if (static_cast(m_team_size) > - static_cast( - ::Kokkos::Experimental::Impl::hip_get_max_block_size( - m_policy.space().impl_internal_space_instance(), attr, - arg_functor, arg_policy.impl_vector_length(), - arg_policy.team_scratch_size(0), - arg_policy.thread_scratch_size(0)) / - arg_policy.impl_vector_length())) { + size_t max_size = arg_policy.team_size_max(arg_functor, ParallelForTag()); + if (static_cast(m_team_size) > static_cast(max_size)) { Kokkos::Impl::throw_runtime_exception(std::string( "Kokkos::Impl::ParallelFor< HIP > requested too large team size.")); } @@ -839,8 +868,11 @@ class ParallelReduce, } const int shmem_size_total = m_team_begin + m_shmem_begin + m_shmem_size; - Kokkos::Experimental::Impl::HIPParallelLaunch( + using closure_type = + ParallelReduce, + ReducerType, Kokkos::Experimental::HIP>; + Kokkos::Experimental::Impl::hip_parallel_launch( *this, grid, block, shmem_size_total, m_policy.space().impl_internal_space_instance(), true); // copy to device and execute @@ -890,17 +922,9 @@ class ParallelReduce, m_scratch_lock(m_policy.space() .impl_internal_space_instance() ->m_team_scratch_mutex) { - hipFuncAttributes attr = Kokkos::Experimental::Impl::HIPParallelLaunch< - ParallelReduce, launch_bounds>::get_hip_func_attributes(); - m_team_size = - m_team_size >= 0 - ? m_team_size - : Kokkos::Experimental::Impl::hip_get_opt_block_size( - m_policy.space().impl_internal_space_instance(), attr, - m_functor, m_vector_size, m_policy.team_scratch_size(0), - m_policy.thread_scratch_size(0)) / - m_vector_size; + m_team_size = m_team_size >= 0 ? m_team_size + : arg_policy.team_size_recommended( + arg_functor, ParallelReduceTag()); m_team_begin = UseShflReduction @@ -958,8 +982,9 @@ class ParallelReduce, "L0 scratch memory")); } - if (static_cast(m_team_size) > - arg_policy.team_size_max(m_functor, m_reducer, ParallelReduceTag())) { + size_t max_size = + arg_policy.team_size_max(arg_functor, ParallelReduceTag()); + if (static_cast(m_team_size) > static_cast(max_size)) { Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::ParallelReduce< HIP > requested too " "large team size.")); @@ -992,18 +1017,10 @@ class ParallelReduce, m_scratch_lock(m_policy.space() .impl_internal_space_instance() ->m_team_scratch_mutex) { - hipFuncAttributes attr = Kokkos::Experimental::Impl::HIPParallelLaunch< - ParallelReduce, launch_bounds>::get_hip_func_attributes(); - m_team_size = - m_team_size >= 0 - ? m_team_size - : Kokkos::Experimental::Impl::hip_get_opt_block_size( - m_policy.space().impl_internal_space_instance(), attr, - m_functor, m_vector_size, m_policy.team_scratch_size(0), - m_policy.thread_scratch_size(0)) / - m_vector_size; - + m_team_size = m_team_size >= 0 + ? m_team_size + : arg_policy.team_size_recommended(arg_functor, reducer, + ParallelReduceTag()); m_team_begin = UseShflReduction ? 0 @@ -1046,7 +1063,6 @@ class ParallelReduce, // upon team size. const int shmem_size_total = m_team_begin + m_shmem_begin + m_shmem_size; - if ((!Kokkos::Impl::is_integral_power_of_two(m_team_size) && !UseShflReduction) || m_policy.space().impl_internal_space_instance()->m_maxShmemPerBlock < @@ -1054,8 +1070,10 @@ class ParallelReduce, Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::ParallelReduce< HIP > bad team size")); } - if (static_cast(m_team_size) > - arg_policy.team_size_max(m_functor, m_reducer, ParallelReduceTag())) { + + size_t max_size = + arg_policy.team_size_max(arg_functor, reducer, ParallelReduceTag()); + if (static_cast(m_team_size) > static_cast(max_size)) { Kokkos::Impl::throw_runtime_exception( std::string("Kokkos::Impl::ParallelReduce< HIP > requested too " "large team size.")); diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp index 15ca089d1474..e25ebe2ab355 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Space.cpp @@ -67,102 +67,32 @@ namespace { hipStream_t get_deep_copy_stream() { static hipStream_t s = nullptr; if (s == nullptr) { - HIP_SAFE_CALL(hipStreamCreate(&s)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipStreamCreate(&s)); } return s; } } // namespace -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); +void DeepCopyHIP(void* dst, void const* src, size_t n) { + KOKKOS_IMPL_HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); } -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); -} - -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); -} - -DeepCopy::DeepCopy(const Kokkos::Experimental::HIP& - instance, - void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL( - hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); -} - -DeepCopy:: - DeepCopy(const Kokkos::Experimental::HIP& instance, void* dst, - const void* src, size_t n) { - HIP_SAFE_CALL( - hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); -} - -DeepCopy:: - DeepCopy(const Kokkos::Experimental::HIP& instance, void* dst, - const void* src, size_t n) { - HIP_SAFE_CALL( - hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); -} - -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); -} - -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); -} - -DeepCopy::DeepCopy(void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL(hipMemcpy(dst, src, n, hipMemcpyDefault)); -} - -DeepCopy:: - DeepCopy(const Kokkos::Experimental::HIP& instance, void* dst, - const void* src, size_t n) { - HIP_SAFE_CALL( - hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); -} - -DeepCopy::DeepCopy(const Kokkos::Experimental::HIP& - instance, - void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL( - hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); -} - -DeepCopy::DeepCopy(const Kokkos::Experimental::HIP& - instance, - void* dst, const void* src, - size_t n) { - HIP_SAFE_CALL( +void DeepCopyAsyncHIP(const Kokkos::Experimental::HIP& instance, void* dst, + void const* src, size_t n) { + KOKKOS_IMPL_HIP_SAFE_CALL( hipMemcpyAsync(dst, src, n, hipMemcpyDefault, instance.hip_stream())); } void DeepCopyAsyncHIP(void* dst, void const* src, size_t n) { hipStream_t s = get_deep_copy_stream(); - HIP_SAFE_CALL(hipMemcpyAsync(dst, src, n, hipMemcpyDefault, s)); - HIP_SAFE_CALL(hipStreamSynchronize(s)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipMemcpyAsync(dst, src, n, hipMemcpyDefault, s)); + Kokkos::Tools::Experimental::Impl::profile_fence_event< + Kokkos::Experimental::HIP>( + "Kokkos::Impl::DeepCopyAsyncHIP: Post Deep Copy Fence on Deep-Copy " + "stream", + Kokkos::Tools::Experimental::SpecialSynchronizationCases:: + DeepCopyResourceSynchronization, + [&]() { KOKKOS_IMPL_HIP_SAFE_CALL(hipStreamSynchronize(s)); }); } } // namespace Impl @@ -171,6 +101,7 @@ void DeepCopyAsyncHIP(void* dst, void const* src, size_t n) { /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ +#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_3 namespace Kokkos { KOKKOS_DEPRECATED void Experimental::HIPSpace::access_error() { @@ -188,6 +119,7 @@ KOKKOS_DEPRECATED void Experimental::HIPSpace::access_error(const void* const) { } } // namespace Kokkos +#endif /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ @@ -283,7 +215,7 @@ void HIPSpace::impl_deallocate( Kokkos::Profiling::deallocateData(arg_handle, arg_label, arg_alloc_ptr, reported_size); } - HIP_SAFE_CALL(hipFree(arg_alloc_ptr)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipFree(arg_alloc_ptr)); } void HIPHostPinnedSpace::deallocate(void* const arg_alloc_ptr, @@ -307,7 +239,7 @@ void HIPHostPinnedSpace::impl_deallocate( Kokkos::Profiling::deallocateData(arg_handle, arg_label, arg_alloc_ptr, reported_size); } - HIP_SAFE_CALL(hipHostFree(arg_alloc_ptr)); + KOKKOS_IMPL_HIP_SAFE_CALL(hipHostFree(arg_alloc_ptr)); } } // namespace Experimental @@ -427,23 +359,42 @@ HIP::HIP() "HIP instance constructor"); } -HIP::HIP(hipStream_t const stream) +HIP::HIP(hipStream_t const stream, bool manage_stream) : m_space_instance(new Impl::HIPInternal, [](Impl::HIPInternal* ptr) { ptr->finalize(); delete ptr; }) { Impl::HIPInternal::singleton().verify_is_initialized( "HIP instance constructor"); - m_space_instance->initialize(Impl::HIPInternal::singleton().m_hipDev, stream); + m_space_instance->initialize(Impl::HIPInternal::singleton().m_hipDev, stream, + manage_stream); } void HIP::print_configuration(std::ostream& s, const bool) { Impl::HIPInternal::singleton().print_configuration(s); } -void HIP::impl_static_fence() { HIP_SAFE_CALL(hipDeviceSynchronize()); } +uint32_t HIP::impl_instance_id() const noexcept { + return m_space_instance->impl_get_instance_id(); +} +void HIP::impl_static_fence(const std::string& name) { + Kokkos::Tools::Experimental::Impl::profile_fence_event< + Kokkos::Experimental::HIP>( + name, + Kokkos::Tools::Experimental::SpecialSynchronizationCases:: + GlobalDeviceSynchronization, + [&]() { KOKKOS_IMPL_HIP_SAFE_CALL(hipDeviceSynchronize()); }); +} +void HIP::impl_static_fence() { + impl_static_fence("Kokkos::HIP::impl_static_fence: Unnamed Static Fence"); +} -void HIP::fence() const { m_space_instance->fence(); } +void HIP::fence(const std::string& name) const { + m_space_instance->fence(name); +} +void HIP::fence() const { + fence("Kokkos::HIP::fence(): Unnamed Instance Fence"); +} hipStream_t HIP::hip_stream() const { return m_space_instance->m_stream; } @@ -489,6 +440,9 @@ void HIPSpaceInitializer::finalize(const bool all_spaces) { void HIPSpaceInitializer::fence() { Kokkos::Experimental::HIP::impl_static_fence(); } +void HIPSpaceInitializer::fence(const std::string& name) { + Kokkos::Experimental::HIP::impl_static_fence(name); +} void HIPSpaceInitializer::print_configuration(std::ostream& msg, const bool detail) { diff --git a/packages/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp b/packages/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp index fe52886ced7c..fb67a25c5e7f 100644 --- a/packages/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp +++ b/packages/kokkos/core/src/HIP/Kokkos_HIP_Team.hpp @@ -316,198 +316,6 @@ class HIPTeamMember { #endif } - //-------------------------------------------------------------------------- - /**\brief Global reduction across all blocks - * - * Return !0 if reducer contains the final value - */ - template - KOKKOS_INLINE_FUNCTION static - typename std::enable_if::value, int>::type - global_reduce(ReducerType const& reducer, int* const global_scratch_flags, - void* const global_scratch_space, void* const shmem, - int const shmem_size) { -#ifdef __HIP_DEVICE_COMPILE__ - using value_type = typename ReducerType::value_type; - using pointer_type = value_type volatile*; - - // Number of shared memory entries for the reduction: - const int nsh = shmem_size / sizeof(value_type); - - // Number of HIP threads in the block, rank within the block - const int nid = blockDim.x * blockDim.y * blockDim.z; - const int tid = - threadIdx.x + blockDim.x * (threadIdx.y + blockDim.y * threadIdx.z); - - // Reduces within block using all available shared memory - // Contributes if it is the root "vector lane" - - // wn == number of warps in the block - // wx == which lane within the warp - // wy == which warp within the block - - const int wn = (nid + Experimental::Impl::HIPTraits::WarpIndexMask) >> - Experimental::Impl::HIPTraits::WarpIndexShift; - const int wx = tid & Experimental::Impl::HIPTraits::WarpIndexMask; - const int wy = tid >> Experimental::Impl::HIPTraits::WarpIndexShift; - - //------------------------ - { // Intra warp shuffle reduction from contributing HIP threads - - value_type tmp(reducer.reference()); - - int constexpr warp_size = - ::Kokkos::Experimental::Impl::HIPTraits::WarpSize; - for (int i = warp_size; static_cast(blockDim.x) <= (i >>= 1);) { - Experimental::Impl::in_place_shfl_down(reducer.reference(), tmp, i, - warp_size); - - // Root of each vector lane reduces "thread" contribution - if (0 == threadIdx.x && wx < i) { - reducer.join(&tmp, reducer.data()); - } - } - - // Reduce across warps using shared memory. - // Number of warps may not be power of two. - - __syncthreads(); // Wait before shared data write - - // Number of shared memory entries for the reduction - // is at most one per warp - const int nentry = wn < nsh ? wn : nsh; - - if (0 == wx && wy < nentry) { - // Root thread of warp 'wy' has warp's value to contribute - (reinterpret_cast(shmem))[wy] = tmp; - } - - __syncthreads(); // Wait for write to be visible to block - - // When more warps than shared entries - // then warps must take turns joining their contribution - // to the designated shared memory entry. - for (int i = nentry; i < wn; i += nentry) { - const int k = wy - i; - - if (0 == wx && i <= wy && k < nentry) { - // Root thread of warp 'wy' has warp's value to contribute - reducer.join((reinterpret_cast(shmem)) + k, &tmp); - } - - __syncthreads(); // Wait for write to be visible to block - } - - // One warp performs the inter-warp reduction: - - if (0 == wy) { - // Start fan-in at power of two covering nentry - - for (int i = (1 << (warp_size - __clz(nentry - 1))); (i >>= 1);) { - const int k = wx + i; - if (wx < i && k < nentry) { - reducer.join((reinterpret_cast(shmem)) + wx, - (reinterpret_cast(shmem)) + k); - __threadfence_block(); // Wait for write to be visible to warp - } - } - } - } - //------------------------ - { // Write block's value to global_scratch_memory - - int last_block = 0; - - if (0 == wx) { - reducer.copy((reinterpret_cast(global_scratch_space)) + - blockIdx.x * reducer.length(), - reducer.data()); - - __threadfence(); // Wait until global write is visible. - - last_block = static_cast(gridDim.x) == - 1 + Kokkos::atomic_fetch_add(global_scratch_flags, 1); - - // If last block then reset count - if (last_block) *global_scratch_flags = 0; - } - - // FIXME hip does not support __syncthreads_or so we need to do it by hand - // last_block = __syncthreads_or(last_block); - - __shared__ int last_block_shared; - if (last_block) last_block_shared = last_block; - __threadfence_block(); - - if (!last_block_shared) return 0; - } - //------------------------ - // Last block reads global_scratch_memory into shared memory. - - const int nentry = nid < gridDim.x ? (nid < nsh ? nid : nsh) - : (gridDim.x < nsh ? gridDim.x : nsh); - - // nentry = min( nid , nsh , gridDim.x ) - - // whole block reads global memory into shared memory: - - if (tid < nentry) { - const int offset = tid * reducer.length(); - - reducer.copy( - (reinterpret_cast(shmem)) + offset, - (reinterpret_cast(global_scratch_space)) + offset); - - for (int i = nentry + tid; i < static_cast(gridDim.x); i += nentry) { - reducer.join((reinterpret_cast(shmem)) + offset, - (reinterpret_cast(global_scratch_space)) + - i * reducer.length()); - } - } - - __syncthreads(); // Wait for writes to be visible to block - - if (0 == wy) { - // Iterate to reduce shared memory to single warp fan-in size - - int constexpr warp_size = - ::Kokkos::Experimental::Impl::HIPTraits::WarpSize; - const int nreduce = warp_size < nentry ? warp_size : nentry; - - if (wx < nreduce && nreduce < nentry) { - for (int i = nreduce + wx; i < nentry; i += nreduce) { - reducer.join(((pointer_type)shmem) + wx, ((pointer_type)shmem) + i); - } - __threadfence_block(); // Wait for writes to be visible to warp - } - - // Start fan-in at power of two covering nentry - - for (int i = (1 << (warp_size - __clz(nreduce - 1))); (i >>= 1);) { - const int k = wx + i; - if (wx < i && k < nreduce) { - reducer.join((reinterpret_cast(shmem)) + wx, - (reinterpret_cast(shmem)) + k); - __threadfence_block(); // Wait for writes to be visible to warp - } - } - - if (0 == wx) { - reducer.copy(reducer.data(), reinterpret_cast(shmem)); - return 1; - } - } - return 0; -#else - (void)reducer; - (void)global_scratch_flags; - (void)global_scratch_space; - (void)shmem; - (void)shmem_size; - return 0; -#endif - } - //---------------------------------------- // Private for the driver diff --git a/packages/kokkos/core/src/HPX/Kokkos_HPX.cpp b/packages/kokkos/core/src/HPX/Kokkos_HPX.cpp index 910d5e52e6ac..d9cb66e11f46 100644 --- a/packages/kokkos/core/src/HPX/Kokkos_HPX.cpp +++ b/packages/kokkos/core/src/HPX/Kokkos_HPX.cpp @@ -191,6 +191,9 @@ void HPXSpaceInitializer::finalize(const bool all_spaces) { } void HPXSpaceInitializer::fence() { Kokkos::Experimental::HPX().fence(); } +void HPXSpaceInitializer::fence(const std::string &name) { + Kokkos::Experimental::HPX().fence(name); +} void HPXSpaceInitializer::print_configuration(std::ostream &msg, const bool detail) { diff --git a/packages/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp b/packages/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp index df09e026fd9b..7bb3ca5d0070 100644 --- a/packages/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp +++ b/packages/kokkos/core/src/HPX/Kokkos_HPX_Task.hpp @@ -82,7 +82,9 @@ class TaskQueueSpecialization< task_queue.scheduler = &scheduler; Kokkos::Impl::dispatch_execute_task(&task_queue, Kokkos::Experimental::HPX()); - Kokkos::Experimental::HPX().fence(); + Kokkos::Experimental::HPX().fence( + "Kokkos::Impl::TaskQueueSpecialization::execute: fence " + "after task execution"); } // Must provide task queue execution function @@ -214,7 +216,7 @@ class TaskQueueSpecializationConstrained< task_queue.scheduler = &scheduler; Kokkos::Impl::dispatch_execute_task(&task_queue, Kokkos::Experimental::HPX()); - Kokkos::Experimental::HPX().fence(); + Kokkos::Experimental::HPX().fence()"Kokkos::Impl::TaskQueueSpecializationConstrained::execute: fence after task execution"; } // Must provide task queue execution function diff --git a/packages/kokkos/core/src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp b/packages/kokkos/core/src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp index 527fe12ad937..d7e13e28f054 100644 --- a/packages/kokkos/core/src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp +++ b/packages/kokkos/core/src/HPX/Kokkos_HPX_WorkGraphPolicy.hpp @@ -79,7 +79,9 @@ class ParallelFor, public: void execute() const { dispatch_execute_task(this, m_policy.space()); - m_policy.space().fence(); + m_policy.space().fence( + "Kokkos::Experimental::Impl::HPX::ParallelFor: fence " + "after kernel execution"); } void execute_task() const { diff --git a/packages/kokkos/core/src/KokkosExp_InterOp.hpp b/packages/kokkos/core/src/KokkosExp_InterOp.hpp new file mode 100644 index 000000000000..37c2088f88f0 --- /dev/null +++ b/packages/kokkos/core/src/KokkosExp_InterOp.hpp @@ -0,0 +1,147 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) National Technology & Engineering +// Solutions of Sandia, LLC (NTESS). +// +// Under the terms of Contract DE-NA0003525 with NTESS, +// the U.S. Government retains certain rights in this software. +// +// 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. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "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 NTESS OR THE +// 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. +// +// Questions? Contact Christian R. Trott (crtrott@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOS_CORE_EXP_INTEROP_HPP +#define KOKKOS_CORE_EXP_INTEROP_HPP + +#include +#include +#include +#include +#include +#include + +namespace Kokkos { +namespace Impl { + +// ------------------------------------------------------------------ // +// this is used to convert +// Kokkos::Device to MemSpace +// +template +struct device_memory_space { + using type = Tp; +}; + +template +struct device_memory_space> { + using type = MemT; +}; + +template +using device_memory_space_t = typename device_memory_space::type; + +// ------------------------------------------------------------------ // +// this is the impl version which takes a view and converts to python +// view type +// +template +struct python_view_type_impl; + +template