From f0ef4f2d3c4ebdc1fd4d260bcc4beccba4355b12 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 14 Oct 2024 20:39:13 +0000 Subject: [PATCH 01/25] Add SUNDIALS dependency and build MFEM with SUNDIALS --- CMakeLists.txt | 2 + cmake/ExternalGitTags.cmake | 14 +++++++ cmake/ExternalMFEM.cmake | 31 +++++++++++++++ cmake/ExternalSUNDIALS.cmake | 73 ++++++++++++++++++++++++++++++++++++ extern/CMakeLists.txt | 6 +++ 5 files changed, 126 insertions(+) create mode 100644 cmake/ExternalSUNDIALS.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index cf0e6802c..1bef4b1c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,8 @@ set(PALACE_WITH_GSLIB ON CACHE BOOL "Build with GSLIB library for high-order fie set(PALACE_WITH_STRUMPACK_BUTTERFLYPACK OFF CACHE BOOL "Build with ButterflyPACK support for STRUMPACK solver") set(PALACE_WITH_STRUMPACK_ZFP OFF CACHE BOOL "Build with ZFP support for STRUMPACK solver") +set(PALACE_WITH_SUNDIALS ON CACHE BOOL "Build with SUNDIALS differential/algebraic equations solver") + set(ANALYZE_SOURCES_CLANG_TIDY OFF CACHE BOOL "Run static analysis checks using clang-tidy") set(ANALYZE_SOURCES_CPPCHECK OFF CACHE BOOL "Run static analysis checks using cppcheck") diff --git a/cmake/ExternalGitTags.cmake b/cmake/ExternalGitTags.cmake index f536c0de7..32d4a5b72 100644 --- a/cmake/ExternalGitTags.cmake +++ b/cmake/ExternalGitTags.cmake @@ -265,3 +265,17 @@ set(EXTERN_EIGEN_URL "https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz" CACHE STRING "URL for external Eigen build" ) + +# SUNDIALS +set(EXTERN_SUNDIALS_URL + "https://github.com/LLNL/sundials.git" CACHE STRING + "URL for external SUNDIALS build" +) +set(EXTERN_SUNDIALS_GIT_BRANCH + "main" CACHE STRING + "Git branch for external SUNDIALS build" +) +set(EXTERN_SUNDIALS_GIT_TAG + "aaeab8d907c6b7dfca86041401fdc1448f35f826" CACHE STRING + "Git tag for external SUNDIALS build" +) \ No newline at end of file diff --git a/cmake/ExternalMFEM.cmake b/cmake/ExternalMFEM.cmake index 296d8770f..2593e5345 100644 --- a/cmake/ExternalMFEM.cmake +++ b/cmake/ExternalMFEM.cmake @@ -17,6 +17,9 @@ if(PALACE_BUILD_EXTERNAL_DEPS) if(PALACE_WITH_SUPERLU) list(APPEND MFEM_DEPENDENCIES superlu_dist) endif() + if(PALACE_WITH_SUNDIALS) + list(APPEND MFEM_DEPENDENCIES sundials) + endif() else() set(MFEM_DEPENDENCIES) endif() @@ -87,6 +90,7 @@ list(APPEND MFEM_OPTIONS "-DMFEM_USE_LIBUNWIND=${PALACE_MFEM_WITH_LIBUNWIND}" "-DMFEM_USE_METIS_5=YES" "-DMFEM_USE_CEED=NO" + "-DMFEM_USE_SUNDIALS=${PALACE_WITH_SUNDIALS}" ) if(PALACE_WITH_STRUMPACK OR PALACE_WITH_MUMPS) list(APPEND MFEM_OPTIONS @@ -297,6 +301,32 @@ Intel C++ compiler for MUMPS and STRUMPACK dependencies") "-DMUMPS_REQUIRED_LIBRARIES=${SCALAPACK_LIBRARIES}$${STRUMPACK_MUMPS_GFORTRAN_LIBRARY}" ) endif() + + # Configure SUNDIALS + if(PALACE_WITH_SUNDIALS) + set(SUNDIALS_REQUIRED_PACKAGES "LAPACK" "BLAS" "MPI") + if(PALACE_WITH_OPENMP) + list(APPEND SUNDIALS_REQUIRED_PACKAGES "OpenMP") + endif() + if(PALACE_WITH_CUDA) + list(APPEND SUNDIALS_REQUIRED_PACKAGES "CUDAToolkit") + list(APPEND SUNDIALS_REQUIRED_LIBRARIES ${SUPERLU_STRUMPACK_CUDA_LIBRARIES}) + endif() + string(REPLACE ";" "$" SUNDIALS_REQUIRED_PACKAGES "${SUNDIALS_REQUIRED_PACKAGES}") + string(REPLACE ";" "$" SUNDIALS_REQUIRED_LIBRARIES "${SUNDIALS_REQUIRED_LIBRARIES}") + list(APPEND MFEM_OPTIONS + "-DSUNDIALS_DIR=${CMAKE_INSTALL_PREFIX}" + "-DSUNDIALS_OPT=-I${CMAKE_INSTALL_PREFIX}/include" + "-DSUNDIALS_LIB=-Wl,-rpath,${CMAKE_INSTALL_PREFIX}/lib64 -L${CMAKE_INSTALL_PREFIX}/lib64 -lsundials_arkode, -lsundials_cvode -lsundials_nvecserial -lsundials_kinsol -lsundials_nvecparhyp -lsundials_nvecparallel" + "-DSUNDIALS_REQUIRED_PACKAGES=${SUNDIALS_REQUIRED_PACKAGES}" + ) + if(NOT "${SUNDIALS_REQUIRED_LIBRARIES}" STREQUAL "") + list(APPEND MFEM_OPTIONS + "-DSUNDIALS_REQUIRED_LIBRARIES=${SUNDIALS_REQUIRED_LIBRARIES}" + ) + endif() + endif() + else() # Help find dependencies for the internal MFEM build # If we trust MFEM's Find.cmake module, we can just set _DIR and, if @@ -309,6 +339,7 @@ else() "SuperLUDist" "STRUMPACK" "MUMPS" + "SUNDIALS" ) foreach(DEP IN LISTS PALACE_MFEM_DEPS) set(${DEP}_DIR "" CACHE STRING "Path to ${DEP} build or installation directory") diff --git a/cmake/ExternalSUNDIALS.cmake b/cmake/ExternalSUNDIALS.cmake new file mode 100644 index 000000000..5ddcb224c --- /dev/null +++ b/cmake/ExternalSUNDIALS.cmake @@ -0,0 +1,73 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# +# Build SUNDIALS +# + +# Force build order +set(SUNDIALS_DEPENDENCIES ) + +set(SUNDIALS_OPTIONS ${PALACE_SUPERBUILD_DEFAULT_ARGS}) +list(APPEND SUNDIALS_OPTIONS + "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}" + "-DEXAMPLES_ENABLE_C=OFF" + "-DEXAMPLES_ENABLE_CXX=OFF" + "-DEXAMPLES_ENABLE_CUDA=OFF" + "-DEXAMPLES_INSTALL=OFF" + "-DENABLE_MPI=ON" +) + +if(PALACE_WITH_OPENMP) + list(APPEND SUNDIALS_OPTIONS + "-DENABLE_OPENMP=ON" + ) +else() + list(APPEND SUNDIALS_OPTIONS + "-DENABLE_OPENMP=OFF" + ) +endif() + +# Configure LAPACK dependency +if(NOT "${BLAS_LAPACK_LIBRARIES}" STREQUAL "") + list(APPEND SUNDIALS_OPTIONS + "-DENABLE_LAPACK=ON" + "-DLAPACK_LIBRARIES=${BLAS_LAPACK_LIBRARIES}" + "-DLAPACK_WORKS:BOOL=TRUE" + ) +endif() + +if(PALACE_WITH_CUDA) + list(APPEND SUNDIALS_OPTIONS + "-DENABLE_CUDA=ON" + ) +endif() + +if(PALACE_WITH_MAGMA) + list(APPEND SUNDIALS_OPTIONS + "-DENABLE_MAGMA=ON" + "-DMAGMA_DIR=${MAGMA_DIR}" + ) +endif() + + +string(REPLACE ";" "; " SUNDIALS_OPTIONS_PRINT "${SUNDIALS_OPTIONS}") +message(STATUS "SUNDIALS_OPTIONS: ${SUNDIALS_OPTIONS_PRINT}") + + +include(ExternalProject) +ExternalProject_Add(sundials + DEPENDS ${SUNDIALS_DEPENDENCIES} + GIT_REPOSITORY ${EXTERN_SUNDIALS_URL} + GIT_TAG ${EXTERN_SUNDIALS_GIT_TAG} + SOURCE_DIR ${CMAKE_BINARY_DIR}/extern/sundials + BINARY_DIR ${CMAKE_BINARY_DIR}/extern/sundials-build + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + PREFIX ${CMAKE_BINARY_DIR}/extern/sundials-Cmake + UPDATE_COMMAND "" + CONFIGURE_COMMAND ${CMAKE_COMMAND} "${SUNDIALS_OPTIONS}" + TEST_COMMAND "" +) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index a791a62a0..451b3c459 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -72,3 +72,9 @@ include(ExternalFmt) # Add Eigen message(STATUS "===================== Configuring Eigen dependency =====================") include(ExternalEigen) + +# Add SUNDIALS +if(PALACE_WITH_SUNDIALS) + message(STATUS "===================== Configuring SUNDIALS dependency =====================") + include(ExternalSUNDIALS) +endif() From e2edda84a42c78aba4d1b21797921dcd3344c59e Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 14 Oct 2024 20:46:02 +0000 Subject: [PATCH 02/25] Add weak curl operator for first-order transient formulation --- palace/models/spaceoperator.cpp | 37 +++++++++++++++++++++++++++++++++ palace/models/spaceoperator.hpp | 4 ++++ 2 files changed, 41 insertions(+) diff --git a/palace/models/spaceoperator.cpp b/palace/models/spaceoperator.cpp index b15c5c70d..a5d7d9a0c 100644 --- a/palace/models/spaceoperator.cpp +++ b/palace/models/spaceoperator.cpp @@ -442,6 +442,39 @@ SpaceOperator::GetExtraSystemMatrix(double omega, Operator::DiagonalPolicy diag_ } } +template +std::unique_ptr +SpaceOperator::GetWeakCurlMatrix() +{ + PrintHeader(GetH1Space(), GetNDSpace(), GetRTSpace(), print_hdr); + MaterialPropertyCoefficient df(mat_op.MaxCeedAttribute()), f(mat_op.MaxCeedAttribute()); + AddStiffnessCoefficients(1.0, df, f); + int empty = (df.empty() && f.empty()); + Mpi::GlobalMin(1, &empty, GetComm()); + if (empty) + { + return {}; + } + constexpr bool skip_zeros = false, assemble_q_data = false; + BilinearForm a(GetRTSpace(), GetNDSpace()); + a.AddDomainIntegrator(df); + if (assemble_q_data) + { + a.AssembleQuadratureData(); + } + auto weakCurl = a.Assemble(skip_zeros); + if constexpr (std::is_same::value) + { + auto WeakCurl = std::make_unique(std::move(weakCurl),nullptr, GetRTSpace(), GetNDSpace(),false); + return WeakCurl; + } + else + { + auto WeakCurl = std::make_unique(std::move(weakCurl),GetRTSpace(), GetNDSpace(), false); + return WeakCurl; + } +} + namespace { @@ -1049,4 +1082,8 @@ SpaceOperator::GetPreconditionerMatrix(double, double, double, double) template std::unique_ptr SpaceOperator::GetPreconditionerMatrix(double, double, double, double); +template std::unique_ptr + SpaceOperator::GetWeakCurlMatrix(); +template std::unique_ptr + SpaceOperator::GetWeakCurlMatrix(); } // namespace palace diff --git a/palace/models/spaceoperator.hpp b/palace/models/spaceoperator.hpp index 0c9873ec6..f1cd7936f 100644 --- a/palace/models/spaceoperator.hpp +++ b/palace/models/spaceoperator.hpp @@ -177,6 +177,10 @@ class SpaceOperator std::unique_ptr GetPreconditionerMatrix(double a0, double a1, double a2, double a3); + // Construct the weak curl operator: curl 1/mu + template + std::unique_ptr GetWeakCurlMatrix(); + // Construct and return the discrete curl or gradient matrices. const Operator &GetGradMatrix() const { From 0c4d8e11e7620070e54a29361eb680ecbaa17d20 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 14 Oct 2024 20:47:21 +0000 Subject: [PATCH 03/25] Add new transient solver config options for adaptive time-stepping --- docs/src/config/solver.md | 26 ++++++++++++++++++++++++-- palace/utils/configfile.cpp | 16 +++++++++++++++- palace/utils/configfile.hpp | 14 +++++++++++++- scripts/schema/config/solver.json | 6 +++++- 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/docs/src/config/solver.md b/docs/src/config/solver.md index 1d4889eab..bf670a59c 100644 --- a/docs/src/config/solver.md +++ b/docs/src/config/solver.md @@ -208,7 +208,11 @@ error tolerance. "ExcitationWidth": , "MaxTime": , "TimeStep": , - "SaveStep": + "SaveStep": , + "AdaptiveTimeStep": , + "Order": , + "RelTol": , + "AbsTol": } ``` @@ -218,7 +222,7 @@ with the second-order system of differential equations. The available options are: - `"GeneralizedAlpha"` : The second-order implicit generalized-``\alpha`` method with - ``\rho_\inf = 1.0``. This scheme is unconditionally stable. + ``\rho_{\inf} = 1.0``. This scheme is unconditionally stable. - `"NewmarkBeta"` : The second-order implicit Newmark-``\beta`` method with ``\beta = 1/4`` and ``\gamma = 1/2``. This scheme is unconditionally stable. - `"CentralDifference"` : The second-order explicit central difference method, obtained @@ -226,6 +230,12 @@ the second-order system of differential equations. The available options are: case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step. + - `"ImplicitRK"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order + ODE system for the electric and magnetic flux fields. + - `"ExplicitRK"` : SUNDIALS ARKode explicit Runge-Kutta scheme applied to the first-order + ODE system for the electric and magnetic flux fields. In this case, the maximum + eigenvalue of the system operator is estimated at the start of the simulation and used to + restrict the simulation time step to below the maximum stability time step. - `"Default"` : Use the default `"GeneralizedAlpha"` time integration scheme. `"Excitation" [None]` : Controls the time dependence of the source excitation. The @@ -260,6 +270,18 @@ disk for [visualization with ParaView](../guide/postprocessing.md#Visualization) saved in the `paraview/` directory under the directory specified by [`config["Problem"]["Output"]`](problem.md#config%5B%22Problem%22%5D). +`"AdaptiveTimeStep" [true]` : Enable adaptive time-stepping in the Runge-Kutta integrators. +Only relevant when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"`. + +`"Order" [3]` : Order of the Runge-Kutta integrators. Only relevant when `"Type"` is +`"ExplicitRK"` or `"ImplicitRK"`. + +`"RelTol" [1e-3]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant + when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"` and `"AdaptiveTimeStep"` is enabled. + +`"AbsTol" [1e-6]` : Absolute tolerance used in adaptive time-stepping schemes. Only relevant + when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"` and `"AdaptiveTimeStep"` is enabled. + ## `solver["Electrostatic"]` ```json diff --git a/palace/utils/configfile.cpp b/palace/utils/configfile.cpp index 05a634efb..e0a6c901e 100644 --- a/palace/utils/configfile.cpp +++ b/palace/utils/configfile.cpp @@ -1596,7 +1596,9 @@ PALACE_JSON_SERIALIZE_ENUM(TransientSolverData::Type, {{TransientSolverData::Type::DEFAULT, "Default"}, {TransientSolverData::Type::GEN_ALPHA, "GeneralizedAlpha"}, {TransientSolverData::Type::NEWMARK, "NewmarkBeta"}, - {TransientSolverData::Type::CENTRAL_DIFF, "CentralDifference"}}) + {TransientSolverData::Type::CENTRAL_DIFF, "CentralDifference"}, + {TransientSolverData::Type::EXPLICIT_RK, "ExplicitRK"}, + {TransientSolverData::Type::IMPLICIT_RK, "ImplicitRK"}}) PALACE_JSON_SERIALIZE_ENUM( TransientSolverData::ExcitationType, {{TransientSolverData::ExcitationType::SINUSOIDAL, "Sinusoidal"}, @@ -1627,6 +1629,10 @@ void TransientSolverData::SetUp(json &solver) max_t = transient->at("MaxTime"); // Required delta_t = transient->at("TimeStep"); // Required delta_post = transient->value("SaveStep", delta_post); + rk_order = transient->value("Order", rk_order); + adaptive_dt = transient->value("AdaptiveTimeStep", adaptive_dt); + rel_tol = transient->value("RelTol", rel_tol); + abs_tol = transient->value("AbsTol", abs_tol); // Cleanup transient->erase("Type"); @@ -1636,6 +1642,10 @@ void TransientSolverData::SetUp(json &solver) transient->erase("MaxTime"); transient->erase("TimeStep"); transient->erase("SaveStep"); + transient->erase("Order"); + transient->erase("AdaptiveTimeStep"); + transient->erase("RelTol"); + transient->erase("AbsTol"); MFEM_VERIFY(transient->empty(), "Found an unsupported configuration file keyword under \"Transient\"!\n" << transient->dump(2)); @@ -1650,6 +1660,10 @@ void TransientSolverData::SetUp(json &solver) std::cout << "MaxTime: " << max_t << '\n'; std::cout << "TimeStep: " << delta_t << '\n'; std::cout << "SaveStep: " << delta_post << '\n'; + std::cout << "Order: " << rk_order << '\n'; + std::cout << "AdaptiveTimeStep: " << adaptive_dt << '\n'; + std::cout << "RelTol: " << rel_tol << '\n'; + std::cout << "AbsTol: " << abs_tol << '\n'; } } diff --git a/palace/utils/configfile.hpp b/palace/utils/configfile.hpp index b1e26eeb4..63928458e 100644 --- a/palace/utils/configfile.hpp +++ b/palace/utils/configfile.hpp @@ -732,7 +732,9 @@ struct TransientSolverData DEFAULT, GEN_ALPHA, NEWMARK, - CENTRAL_DIFF + CENTRAL_DIFF, + EXPLICIT_RK, + IMPLICIT_RK }; Type type = Type::DEFAULT; @@ -761,6 +763,16 @@ struct TransientSolverData // Step increment for saving fields to disk. int delta_post = 0; + // RK scheme order for SUNDIALS ARKode integrators; + int rk_order = 3; + + // Adaptive time-stepping for SUNDIALS integrators + bool adaptive_dt = true; + + // Adaptive time-stepping tolerances + double rel_tol = 1e-3; + double abs_tol = 1e-6; + void SetUp(json &solver); }; diff --git a/scripts/schema/config/solver.json b/scripts/schema/config/solver.json index 379d420cd..55dba0753 100644 --- a/scripts/schema/config/solver.json +++ b/scripts/schema/config/solver.json @@ -67,7 +67,11 @@ "ExcitationWidth": { "type": "number" }, "MaxTime": { "type": "number" }, "TimeStep": { "type": "number" }, - "SaveStep": { "type": "integer" } + "SaveStep": { "type": "integer" }, + "AdaptiveTimeStep": {"type": "boolean"}, + "Order": {"type": "integer"}, + "RelTol": {"type": "number"}, + "AbsTol": {"type": "number"} } }, "Electrostatic": From d43715675c5e123984d26b9e66f6bf738841aece Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 14 Oct 2024 21:28:30 +0000 Subject: [PATCH 04/25] Add first-order transient formulation with SUNDIALS ARKode schemes --- palace/drivers/transientsolver.cpp | 40 ++- palace/models/timeoperator.cpp | 454 ++++++++++++++++++++++++++++- palace/models/timeoperator.hpp | 101 ++++++- 3 files changed, 571 insertions(+), 24 deletions(-) diff --git a/palace/drivers/transientsolver.cpp b/palace/drivers/transientsolver.cpp index 77093c467..b27cbd121 100644 --- a/palace/drivers/transientsolver.cpp +++ b/palace/drivers/transientsolver.cpp @@ -29,12 +29,35 @@ TransientSolver::Solve(const std::vector> &mesh) const std::function J_coef = GetTimeExcitation(false); std::function dJdt_coef = GetTimeExcitation(true); SpaceOperator space_op(iodata, mesh); - TimeOperator time_op(iodata, space_op, dJdt_coef); + + std::unique_ptr time_op; + switch (iodata.solver.transient.type) + { + case config::TransientSolverData::Type::GEN_ALPHA: + case config::TransientSolverData::Type::NEWMARK: + case config::TransientSolverData::Type::CENTRAL_DIFF: + case config::TransientSolverData::Type::DEFAULT: + { + time_op = std::make_unique(iodata, space_op, dJdt_coef); + } + break; + case config::TransientSolverData::Type::EXPLICIT_RK: + case config::TransientSolverData::Type::IMPLICIT_RK: + { +#if !defined(MFEM_USE_SUNDIALS) + MFEM_ABORT("Solver was not built with SUNDIALS support, please choose a " + "different transient solver type!"); +#endif + time_op = std::make_unique(iodata, space_op, J_coef); + } + break; + } + double delta_t = iodata.solver.transient.delta_t; - if (time_op.isExplicit()) + if (time_op->isExplicit()) { // Stability limited time step. - const double dt_max = time_op.GetMaxTimeStep(); + const double dt_max = time_op-> GetMaxTimeStep(); const double dts_max = iodata.DimensionalizeValue(IoData::ValueType::TIME, dt_max); Mpi::Print(" Maximum stable time step: {:.6e} ns\n", dts_max); delta_t = std::min(delta_t, 0.95 * dt_max); @@ -101,17 +124,17 @@ TransientSolver::Solve(const std::vector> &mesh) const { Mpi::Print("\n"); t += delta_t; - time_op.Init(); // Initial conditions + time_op-> Init(delta_t); // Initial conditions } else { - time_op.Step(t, delta_t); // Advances t internally + time_op-> Step(t, delta_t); // Advances t internally } // Postprocess for the time step. BlockTimer bt2(Timer::POSTPRO); - const Vector &E = time_op.GetE(); - const Vector &B = time_op.GetB(); + const Vector &E = time_op->GetE(); + const Vector &B = time_op->GetB(); post_op.SetEGridFunction(E); post_op.SetBGridFunction(B); post_op.UpdatePorts(space_op.GetLumpedPortOp()); @@ -138,7 +161,8 @@ TransientSolver::Solve(const std::vector> &mesh) const step++; } BlockTimer bt1(Timer::POSTPRO); - SaveMetadata(time_op.GetLinearSolver()); + time_op->PrintStats(); + SaveMetadata(time_op->GetLinearSolver()); return {indicator, space_op.GlobalTrueVSize()}; } diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index b5f90da2b..08f5e8ce2 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -18,6 +18,264 @@ namespace palace namespace { +class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator +{ +public: + // MPI communicator. + MPI_Comm comm; + + // System matrices and excitation RHS. + std::unique_ptr K, M, C; + Vector NegJ; + + // Time dependence of current pulse for excitation: -J(t) = -g(t) J. This function + // returns g(t). + std::function &J_coef; + + // Internal objects for solution of linear systems during time stepping. + double dt_; + std::unique_ptr kspM, kspA; + std::unique_ptr A, B; + mutable Vector RHS, rhsE; + int size_E, size_B; + double saved_gamma; + + // Weak curl operator. + std::unique_ptr weakCurl; + + // Discrete curl operator. + const Operator *Curl; + + // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and + // construct the linear solver. + std::function ConfigureLinearSolver; + +public: + TimeDependentEBSystemOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &J_coef, double t0, + mfem::TimeDependentOperator::Type type) + : mfem::TimeDependentOperator(space_op.GetNDSpace().GetTrueVSize()+space_op.GetRTSpace().GetTrueVSize(), + t0, type), + comm(space_op.GetComm()), J_coef(J_coef) + { + // Get dimensions of E and B vectors + size_E = space_op.GetNDSpace().GetTrueVSize(); + size_B = space_op.GetRTSpace().GetTrueVSize(); + + // Construct the system matrices defining the linear operator. PEC boundaries are + // handled simply by setting diagonal entries of the mass matrix for the corresponding + // dofs. Because the Dirichlet BC is always homogeneous, no special elimination is + // required on the RHS. Diagonal entries are set in M (so M is non-singular). + K = space_op.GetStiffnessMatrix(Operator::DIAG_ZERO); + C = space_op.GetDampingMatrix(Operator::DIAG_ZERO); + M = space_op.GetMassMatrix(Operator::DIAG_ONE); + + // Set up RHS vector for the current source term: -g(t) J, where g(t) handles the time + // dependence. + space_op.GetExcitationVector(NegJ); + RHS.SetSize(size_E+size_B); + RHS.UseDevice(true); + rhsE.SetSize(size_E); + rhsE.UseDevice(true); + + // Discrete curl and weak curl. + weakCurl = space_op.GetWeakCurlMatrix(); + Curl = &space_op.GetCurlMatrix(); + + // Set up linear solvers. + { + auto pcg = std::make_unique>(comm, 0); + pcg->SetInitialGuess(iodata.solver.linear.initial_guess); + pcg->SetRelTol(iodata.solver.linear.tol); + pcg->SetAbsTol(std::numeric_limits::epsilon()); + pcg->SetMaxIter(iodata.solver.linear.max_it); + auto jac = std::make_unique>(comm); + kspM = std::make_unique(std::move(pcg), std::move(jac)); + kspM->SetOperators(*M, *M); + } + { + // For explicit schemes, recommended to just use cheaper preconditioners. Otherwise, + // use AMS or a direct solver. The system matrix is formed as a sequence of matrix + // vector products, and is only assembled for preconditioning. + ConfigureLinearSolver = [this, &iodata, &space_op](double dt) + { + // Configure the system matrix and also the matrix (matrices) from which the + // preconditioner will be constructed. + A = space_op.GetSystemMatrix(dt*dt, dt, 1.0, K.get(), C.get(), M.get()); + B = space_op.GetPreconditionerMatrix(dt*dt, dt, 1.0, 0.0); + + // Configure the solver. + if (!kspA) + { + kspA = std::make_unique(iodata, space_op.GetNDSpaces(), + &space_op.GetH1Spaces()); + } + kspA->SetOperators(*A, *B); + }; + } + } + + // Form the RHS for the explicit formulation: + // rhsE = -C*E + 1/mu curl B - J(t) + // rhsB = -curl E + void FormRHS(const Vector &u, Vector &rhs) const + { + Vector uE(u.GetData() + 0, size_E); + Vector uB(u.GetData() + size_E, size_B); + Vector rhsE(rhs.GetData() + 0, size_E); + Vector rhsB(rhs.GetData() + size_E, size_B); + weakCurl->Mult(uB, rhsE); + if (C) + { + C->AddMult(uE, rhsE, -1.0); + } + linalg::AXPBYPCZ(1.0, rhsE, J_coef(t), NegJ, 0.0, rhsE); + Curl->Mult(uE, rhsB); + rhsB *= -1.0; + } + + // Form the RHS of the E-field for the implicit formulation + //(M + dt*C + dt^2*K)kE = -C*E - dt*K*E + 1/mu curl B - J(t) + // kB = -curl (E+dt*kE) + void FormRHSImplicit(const Vector &u, const double dt, Vector &rhs) const + { + Vector uE(u.GetData() + 0, size_E); + Vector uB(u.GetData() + size_E, size_B); + weakCurl->Mult(uB, rhs); + if (C) + { + C->AddMult(uE, rhs, -1.0); + } + K->AddMult(uE, rhs, -dt); + linalg::AXPBYPCZ(1.0, rhs, J_coef(t), NegJ, 0.0, rhs); + } + + // Solve M du = rhs + void Mult(const Vector &u, Vector &du) const override + { + FormRHS(u, RHS); + Vector duE(du.GetData() + 0, size_E); + Vector duB(du.GetData() + size_E, size_B); + Vector rhsE(RHS.GetData() + 0, size_E); + Vector rhsB(RHS.GetData() + size_E, size_B); + kspM->Mult(rhsE, duE); + duB = rhsB; + } + + void ImplicitSolve(double dt, const Vector &u, Vector &k) override + { + // Solve for k = [kE,kB] + // After substituting kB expression into kE equation, kE eqn is independent of kB + // and kE can be solved using the second-order curlcurl operator + // (M + dt*C + dt^2*K)kE = -C*E - dt*K*E + 1/mu curl B - J(t) + // kB = -curl (E+dt*kE) + if (!kspA || dt != dt_) + { + // Configure the linear solver, including the system matrix and also the matrix + // (matrices) from which the preconditioner will be constructed. + ConfigureLinearSolver(dt); + dt_ = dt; + k = 0.0; + } + Mpi::Print("\n"); + // Solve A kE = rhsE + FormRHSImplicit(u, dt, rhsE); + Vector kE(k.GetData() + 0, size_E); + Vector kB(k.GetData() + size_E, size_B); + Vector uE(u.GetData() + 0, size_E); + Vector uB(u.GetData() + size_E, size_B); + kspA->Mult(rhsE, kE); + + // kB = -curl (E+dt*kE) + linalg::AXPBYPCZ(1.0, uE, dt, kE, 0.0, rhsE); + Curl->Mult(rhsE, kB); + kB *= -1.0; + } + + void ExplicitMult(const Vector &u, Vector &v) const override + { + FormRHS(u, v); + } + + // Setup A = M - gamma J = M + gamma C + gamma^2 K + int SUNImplicitSetup(const Vector &y, const Vector &fy, + int jok, int *jcur, double gamma) + { + // Update Jacobian matrix + if (!kspA || gamma != saved_gamma) + { + ConfigureLinearSolver(gamma); + } + + // Indicate Jacobian was updated + *jcur = 1; + + // Save gamma for use in solve + saved_gamma = gamma; + + return 0; + } + + // Solve (Mass - dt Jacobian) x = b + // In the present ODE system: + // | M 0 | - dt | -C 1/mu curl | |xE| = |bE| + // | 0 I | | -curl 0 | |xB| |bB| + // (M + dt C)xE - dt/mu curl xB = bE + // -dt curl xE + xB = bB + // Substitute xB = bB - dt curl xE into xE equation + // -> (M + dt C + dt^2 K) xE = bE + dt/mu curl bB + int SUNImplicitSolve(const Vector &b, Vector &x, double tol) + { + Vector bE(b.GetData() + 0, size_E); + Vector bB(b.GetData() + size_E, size_B); + Vector xE(x.GetData() + 0, size_E); + Vector xB(x.GetData() + size_E, size_B); + + // Solve A xE = bE + dt/mu curl bB + weakCurl->Mult(bB, rhsE); + rhsE *= saved_gamma; + rhsE += bE; + kspA->Mult(rhsE, xE); + + // xB = bB - dt curl xE + Curl->Mult(xE, xB); + xB *= -saved_gamma; + xB += bB; + + return 0; + } + + int SUNMassSetup() + { + // Already set M in the constructor. + return 0; + } + + int SUNMassSolve(const Vector &b, Vector &x, double tol) + { + Vector bE(b.GetData() + 0, size_E); + Vector bB(b.GetData() + size_E, size_B); + Vector xE(x.GetData() + 0, size_E); + Vector xB(x.GetData() + size_E, size_B); + kspM->Mult(bE, xE); + xB = bB; + + return 0; + } + + int SUNMassMult(const Vector &x, Vector &v) + { + Vector vE(v.GetData() + 0, size_E); + Vector vB(v.GetData() + size_E, size_B); + Vector xE(x.GetData() + 0, size_E); + Vector xB(x.GetData() + size_E, size_B); + M->Mult(xE, vE); + vB = xB; + + return 0; + } +}; + class TimeDependentCurlCurlOperator : public mfem::SecondOrderTimeDependentOperator { public: @@ -143,8 +401,9 @@ class TimeDependentCurlCurlOperator : public mfem::SecondOrderTimeDependentOpera } // namespace -TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef) +SecondOrderTimeOperator::SecondOrderTimeOperator(const IoData &iodata, + SpaceOperator &space_op, + std::function &dJ_coef) { // Construct discrete curl matrix for B-field time integration. Curl = &space_op.GetCurlMatrix(); @@ -191,7 +450,7 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, std::make_unique(iodata, space_op, dJ_coef, 0.0, type); } -const KspSolver &TimeOperator::GetLinearSolver() const +const KspSolver &SecondOrderTimeOperator::GetLinearSolver() const { const auto &curlcurl = dynamic_cast(*op); MFEM_VERIFY(curlcurl.kspA, @@ -199,7 +458,7 @@ const KspSolver &TimeOperator::GetLinearSolver() const return *curlcurl.kspA; } -double TimeOperator::GetMaxTimeStep() const +double SecondOrderTimeOperator::GetMaxTimeStep() const { const auto &curlcurl = dynamic_cast(*op); MPI_Comm comm = curlcurl.comm; @@ -225,7 +484,7 @@ double TimeOperator::GetMaxTimeStep() const return 2.0 / std::sqrt(lam); } -void TimeOperator::Init() +void SecondOrderTimeOperator::Init(double &dt) { // Always use zero initial conditions. E = 0.0; @@ -234,7 +493,7 @@ void TimeOperator::Init() ode->Init(*op); } -void TimeOperator::Step(double &t, double &dt) +void SecondOrderTimeOperator::Step(double &t, double &dt) { // Single time step for E-field. En = E; @@ -245,4 +504,187 @@ void TimeOperator::Step(double &t, double &dt) Curl->AddMult(En, B, -0.5 * dt); } +FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &J_coef) +{ + // Get sizes. + int size_E = space_op.GetNDSpace().GetTrueVSize(); + int size_B = space_op.GetRTSpace().GetTrueVSize(); + + // Allocate space for solution vectors. + sol.SetSize(size_E+size_B); + E.SetSize(size_E); + B.SetSize(size_B); + sol.UseDevice(true); + E.UseDevice(true); + B.UseDevice(true); + + // Sol = [E, B] + E.MakeRef(sol, 0); + B.MakeRef(sol, size_E); + + // SUNDIALS adaptive time-stepping parameters. + adapt_dt = iodata.solver.transient.adaptive_dt; + rel_tol = iodata.solver.transient.rel_tol; + abs_tol = iodata.solver.transient.abs_tol; + rk_order = iodata.solver.transient.rk_order; + // Minimum RK order is 2. + rk_order = std::max(rk_order, 2); + + // Create ODE solver for 1st-order IVP. + mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::EXPLICIT; + switch (iodata.solver.transient.type) + { + case config::TransientSolverData::Type::IMPLICIT_RK: + case config::TransientSolverData::Type::DEFAULT: + { +#if defined(MFEM_USE_SUNDIALS) + // SUNDIALS ARKode solver. + std::unique_ptr arkode; + arkode = std::make_unique(space_op.GetComm(), + mfem::ARKStepSolver::IMPLICIT); + type = mfem::TimeDependentOperator::IMPLICIT; + // Operator for first-order ODE system. + op = std::make_unique(iodata, space_op, J_coef, 0.0, type); + // Initialize ARKode. + arkode->Init(*op); + // IRK settings + // Use implicit setup/solve defined in SUNImplicit* + arkode->UseMFEMLinearSolver(); + // Use mass matrix operations defined in SUNMass* + arkode->UseMFEMMassLinearSolver(0); + // Implicit solve is linear and J is not time-dependent. + ARKStepSetLinear(arkode->GetMem(), 0); + // Maximum IRK order is 5. + rk_order = std::min(rk_order, 5); + // Relative and absolute tolerances. + arkode->SetSStolerances(rel_tol, abs_tol); + // Set the order of the RK scheme. + ARKStepSetOrder(arkode->GetMem(), rk_order); + // Set the ODE solver to ARKode. + ode = std::move(arkode); +#endif + } + break; + case config::TransientSolverData::Type::EXPLICIT_RK: + { +#if defined(MFEM_USE_SUNDIALS) + // SUNDIALS ARKode solver. + std::unique_ptr arkode; + arkode = std::make_unique(space_op.GetComm(), + mfem::ARKStepSolver::EXPLICIT); + type = mfem::TimeDependentOperator::EXPLICIT; + // Operator for first-order ODE system. + op = std::make_unique(iodata, space_op, J_coef, 0.0, type); + // Initialize ARKode. + arkode->Init(*op); + // Maximum ERK order is 8. + rk_order = std::min(rk_order, 8); + // Relative and absolute tolerances. + arkode->SetSStolerances(rel_tol, abs_tol); + // Set the order of the RK scheme. + ARKStepSetOrder(arkode->GetMem(), rk_order); + // Set the ODE solver to ARKode. + ode = std::move(arkode); +#endif + } + break; + } +} + +const KspSolver &FirstOrderTimeOperator::GetLinearSolver() const +{ + const auto &ebsystem = dynamic_cast(*op); + if (isExplicit()) + { + MFEM_VERIFY(ebsystem.kspM, + "No linear solver for time-dependent operator has been constructed!\n"); + return *ebsystem.kspM; + } + else + { + MFEM_VERIFY(ebsystem.kspA, + "No linear solver for time-dependent operator has been constructed!\n"); + return *ebsystem.kspA; + } +} + +double FirstOrderTimeOperator::GetMaxTimeStep() const +{ + const auto &ebsystem = dynamic_cast(*op); + MPI_Comm comm = ebsystem.comm; + const Operator &M = *ebsystem.M; + const Operator &K = *ebsystem.K; + + // Solver for M⁻¹. + constexpr double lin_tol = 1.0e-9; + constexpr int max_lin_it = 10000; + CgSolver pcg(comm, 0); + pcg.SetRelTol(lin_tol); + pcg.SetMaxIter(max_lin_it); + pcg.SetOperator(M); + JacobiSmoother jac(comm); + jac.SetOperator(M); + pcg.SetPreconditioner(jac); + + // Power iteration to estimate largest eigenvalue of undamped system matrix M⁻¹ K (can use + // Hermitian eigenvalue solver as M, K are SPD). + ProductOperator op(pcg, K); + double lam = linalg::SpectralNorm(comm, op, true); + MFEM_VERIFY(lam > 0.0, "Error during power iteration, λ = " << lam << "!"); + return 2.0 / std::sqrt(lam); +} + +void FirstOrderTimeOperator::Init(double &dt) +{ + // Always use zero initial conditions. + sol = 0.0; + ode->Init(*op); +#if defined(MFEM_USE_SUNDIALS) + if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + { + // Setting a max internal time step can sometimes be beneficial. + // We could add this as an optional user input, but what should the default be? + //arkode->SetMaxStep(dt); + if(!adapt_dt) + { + // Disable adaptive time stepping. + arkode->SetFixedStep(dt); + } + } +#endif +} + +void FirstOrderTimeOperator::Step(double &t, double &dt) +{ + double dt_input = dt; + ode->Step(sol, t, dt); + // Ensure user-specified dt does not change. + dt = dt_input; +} + +void FirstOrderTimeOperator::PrintStats() +{ +#if defined(MFEM_USE_SUNDIALS) + if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + { + long int expsteps, accsteps, step_attempts, nfe_evals, nfi_evals, nlinsetups, netfails; + ARKStepGetTimestepperStats(arkode->GetMem(), &expsteps, &accsteps, + &step_attempts, &nfe_evals, &nfi_evals, + &nlinsetups, &netfails); + long int nniters; + ARKStepGetNumNonlinSolvIters(arkode->GetMem(), &nniters); + + Mpi::Print("\nARKode time-stepper statistics\n"); + Mpi::Print(" Stability-limited steps: {:d}\n", expsteps); + Mpi::Print(" Accuracy-limited steps: {:d}\n", accsteps); + Mpi::Print(" Calls to explicit RHS function: {:d}\n", nfe_evals); + Mpi::Print(" Calls to implicit RHS function: {:d}\n", nfi_evals); + Mpi::Print(" Calls to linear solver setup function: {:d}\n", nlinsetups); + Mpi::Print(" Calls to linear solver solve function: {:d}\n", nniters); + Mpi::Print(" Number of error test failures: {:d}\n", netfails); + } +#endif +} + } // namespace palace diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index 27b515d2e..03144aa38 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -18,13 +18,48 @@ class IoData; class SpaceOperator; // -// A class handling temporal discretization of the governing equations. +// Abstract class handling temporal discretization of the governing equations. // -class TimeOperator +class TimeOperator +{ + protected: + Vector E, B; + public: + TimeOperator() {}; + ~TimeOperator() {}; + + // Access solution vectors for E- and B-fields. + virtual const Vector &GetE() const { return E; } + virtual const Vector &GetB() const { return B; } + + // Return the linear solver associated with the implicit or explicit time integrator. + virtual const KspSolver &GetLinearSolver() const = 0; + + // Return if the time integration scheme explicit or implicit. + virtual bool isExplicit() const = 0; + + // Estimate the maximum stable time step based on the maximum eigenvalue of the + // undamped system matrix M⁻¹ K. + virtual double GetMaxTimeStep() const = 0; + + // Initialize time integrators and set 0 initial conditions. + virtual void Init(double &dt) = 0; + + // Perform time step from t -> t + dt. + virtual void Step(double &t, double &dt) = 0; + + // Print ODE integrator statistics. + virtual void PrintStats() {}; +}; + +// +// A class handling the second order ODE form of the governing equations. +// +class SecondOrderTimeOperator : public TimeOperator { private: - // Solution vector storage. - Vector E, dE, En, B; + // Additional vector storage. + Vector dE, En; // Time integrator for the curl-curl E-field formulation. std::unique_ptr ode; @@ -36,13 +71,11 @@ class TimeOperator const Operator *Curl; public: - TimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef); + SecondOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &dJ_coef); - // Access solution vectors for E- and B-fields. - const Vector &GetE() const { return E; } + // Access E-field time derivative const Vector &GetEdot() const { return dE; } - const Vector &GetB() const { return B; } // Return the linear solver associated with the implicit or explicit time integrator. const KspSolver &GetLinearSolver() const; @@ -55,10 +88,58 @@ class TimeOperator double GetMaxTimeStep() const; // Initialize time integrators and set 0 initial conditions. - void Init(); + void Init(double &dt); // Perform time step from t -> t + dt. void Step(double &t, double &dt); + +}; + +// +// A class handling the first order ODE system form of the governing equations. +// +class FirstOrderTimeOperator : public TimeOperator +{ +private: + // Solution vector storage. + Vector sol; + + // Time integrator for the first order E-B ODE system. + std::unique_ptr ode; + + // Time-dependent operator for the E-B system. + std::unique_ptr op; + + // Adaptive time-stepping parameters. + int rk_order; + bool adapt_dt; + double rel_tol, abs_tol; + + // Discrete curl for B-field time integration (not owned). + const Operator *Curl; + +public: + FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &J_coef); + + // Return the linear solver associated with the implicit or explicit time integrator. + const KspSolver &GetLinearSolver() const; + + // Return if the time integration scheme explicit or implicit. + bool isExplicit() const { return op->isExplicit(); } + + // Estimate the maximum stable time step based on the maximum eigenvalue of the + // undamped system matrix M⁻¹ K. + double GetMaxTimeStep() const; + + // Initialize time integrators and set 0 initial conditions. + void Init(double &dt); + + // Perform time step from t -> t + dt. + void Step(double &t, double &dt); + + // Print ODE integrator statistics. + void PrintStats(); }; } // namespace palace From 0c10b676b09cd77a1473610402aa944bc5fd3d19 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 21 Oct 2024 21:43:04 +0000 Subject: [PATCH 05/25] Change first order ODE system formulation, add CVODE integrator, remove explicit RK integrator --- docs/src/config/solver.md | 24 +- palace/drivers/transientsolver.cpp | 6 +- palace/models/timeoperator.cpp | 441 +++++++++++++++++------------ palace/models/timeoperator.hpp | 12 +- palace/utils/configfile.cpp | 8 +- palace/utils/configfile.hpp | 15 +- scripts/schema/config/solver.json | 6 +- 7 files changed, 292 insertions(+), 220 deletions(-) diff --git a/docs/src/config/solver.md b/docs/src/config/solver.md index bf670a59c..c10f079f4 100644 --- a/docs/src/config/solver.md +++ b/docs/src/config/solver.md @@ -230,12 +230,10 @@ the second-order system of differential equations. The available options are: case, the maximum eigenvalue of the system operator is estimated at the start of the simulation and used to restrict the simulation time step to below the maximum stability time step. - - `"ImplicitRK"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order - ODE system for the electric and magnetic flux fields. - - `"ExplicitRK"` : SUNDIALS ARKode explicit Runge-Kutta scheme applied to the first-order - ODE system for the electric and magnetic flux fields. In this case, the maximum - eigenvalue of the system operator is estimated at the start of the simulation and used to - restrict the simulation time step to below the maximum stability time step. + - `"ARKODE"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order + ODE system for the electric field. + - `"CVODE"` : SUNDIALS CVODE implicit multistep method scheme applied to the first-order + ODE system for the electric field. - `"Default"` : Use the default `"GeneralizedAlpha"` time integration scheme. `"Excitation" [None]` : Controls the time dependence of the source excitation. The @@ -271,16 +269,16 @@ saved in the `paraview/` directory under the directory specified by [`config["Problem"]["Output"]`](problem.md#config%5B%22Problem%22%5D). `"AdaptiveTimeStep" [true]` : Enable adaptive time-stepping in the Runge-Kutta integrators. -Only relevant when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"`. +Only relevant when `"Type"` is `"ARKODE"`. `"CVODE"` always uses adaptive time-stepping. -`"Order" [3]` : Order of the Runge-Kutta integrators. Only relevant when `"Type"` is -`"ExplicitRK"` or `"ImplicitRK"`. +`"Order" [2]` : Order of the Runge-Kutta integrators or maximum order of the multistep method. +Only relevant when `"Type"` is `"ARKODE"` or `"CVODE"`. -`"RelTol" [1e-3]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"` and `"AdaptiveTimeStep"` is enabled. +`"RelTol" [1e-4]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant + when `"Type"` is `"CVODE"` or `"ARKODE"` (when `"AdaptiveTimeStep"` is enabled). -`"AbsTol" [1e-6]` : Absolute tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"ExplicitRK"` or `"ImplicitRK"` and `"AdaptiveTimeStep"` is enabled. +`"AbsTol" [1e-9]` : Absolute tolerance used in adaptive time-stepping schemes. Only relevant + when `"Type"` is `"CVODE"` or `"ARKODE"` (when `"AdaptiveTimeStep"` is enabled). ## `solver["Electrostatic"]` diff --git a/palace/drivers/transientsolver.cpp b/palace/drivers/transientsolver.cpp index b27cbd121..17bc4da59 100644 --- a/palace/drivers/transientsolver.cpp +++ b/palace/drivers/transientsolver.cpp @@ -41,14 +41,14 @@ TransientSolver::Solve(const std::vector> &mesh) const time_op = std::make_unique(iodata, space_op, dJdt_coef); } break; - case config::TransientSolverData::Type::EXPLICIT_RK: - case config::TransientSolverData::Type::IMPLICIT_RK: + case config::TransientSolverData::Type::ARKODE: + case config::TransientSolverData::Type::CVODE: { #if !defined(MFEM_USE_SUNDIALS) MFEM_ABORT("Solver was not built with SUNDIALS support, please choose a " "different transient solver type!"); #endif - time_op = std::make_unique(iodata, space_op, J_coef); + time_op = std::make_unique(iodata, space_op, dJdt_coef); } break; } diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 08f5e8ce2..a82c4e028 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -18,7 +18,7 @@ namespace palace namespace { -class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator +class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator { public: // MPI communicator. @@ -28,39 +28,36 @@ class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator std::unique_ptr K, M, C; Vector NegJ; - // Time dependence of current pulse for excitation: -J(t) = -g(t) J. This function + // Time dependence of current pulse for excitation: -J'(t) = -g'(t) J. This function // returns g(t). - std::function &J_coef; + std::function &dJ_coef; // Internal objects for solution of linear systems during time stepping. - double dt_; + double dt_, saved_gamma; std::unique_ptr kspM, kspA; std::unique_ptr A, B; - mutable Vector RHS, rhsE; - int size_E, size_B; - double saved_gamma; - - // Weak curl operator. - std::unique_ptr weakCurl; + mutable Vector RHS; + int size_E; - // Discrete curl operator. - const Operator *Curl; + // ARKODE uses the ODE formulation M y' = f(y,t) (implicit RHS) + // CVODE uses the ODE formulation y' = M^-1 f(y,t) (explicit RHS) + bool explicit_RHS; // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and // construct the linear solver. std::function ConfigureLinearSolver; public: - TimeDependentEBSystemOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &J_coef, double t0, - mfem::TimeDependentOperator::Type type) - : mfem::TimeDependentOperator(space_op.GetNDSpace().GetTrueVSize()+space_op.GetRTSpace().GetTrueVSize(), + TimeDependentFirstOrderOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &dJ_coef, double t0, + mfem::TimeDependentOperator::Type type, + bool explicit_RHS) + : mfem::TimeDependentOperator(2*space_op.GetNDSpace().GetTrueVSize(), t0, type), - comm(space_op.GetComm()), J_coef(J_coef) + comm(space_op.GetComm()), dJ_coef(dJ_coef), explicit_RHS(explicit_RHS) { - // Get dimensions of E and B vectors + // Get dimensions of E and Edot vectors. size_E = space_op.GetNDSpace().GetTrueVSize(); - size_B = space_op.GetRTSpace().GetTrueVSize(); // Construct the system matrices defining the linear operator. PEC boundaries are // handled simply by setting diagonal entries of the mass matrix for the corresponding @@ -73,19 +70,14 @@ class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator // Set up RHS vector for the current source term: -g(t) J, where g(t) handles the time // dependence. space_op.GetExcitationVector(NegJ); - RHS.SetSize(size_E+size_B); + RHS.SetSize(2*size_E); RHS.UseDevice(true); - rhsE.SetSize(size_E); - rhsE.UseDevice(true); - // Discrete curl and weak curl. - weakCurl = space_op.GetWeakCurlMatrix(); - Curl = &space_op.GetCurlMatrix(); - // Set up linear solvers. { + const int print = iodata.problem.verbose; auto pcg = std::make_unique>(comm, 0); - pcg->SetInitialGuess(iodata.solver.linear.initial_guess); + pcg->SetInitialGuess(0); pcg->SetRelTol(iodata.solver.linear.tol); pcg->SetAbsTol(std::numeric_limits::epsilon()); pcg->SetMaxIter(iodata.solver.linear.max_it); @@ -115,60 +107,47 @@ class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator } } - // Form the RHS for the explicit formulation: - // rhsE = -C*E + 1/mu curl B - J(t) - // rhsB = -curl E + // Form the RHS for the first-order ODE system void FormRHS(const Vector &u, Vector &rhs) const { - Vector uE(u.GetData() + 0, size_E); - Vector uB(u.GetData() + size_E, size_B); - Vector rhsE(rhs.GetData() + 0, size_E); - Vector rhsB(rhs.GetData() + size_E, size_B); - weakCurl->Mult(uB, rhsE); - if (C) - { - C->AddMult(uE, rhsE, -1.0); - } - linalg::AXPBYPCZ(1.0, rhsE, J_coef(t), NegJ, 0.0, rhsE); - Curl->Mult(uE, rhsB); - rhsB *= -1.0; - } - - // Form the RHS of the E-field for the implicit formulation - //(M + dt*C + dt^2*K)kE = -C*E - dt*K*E + 1/mu curl B - J(t) - // kB = -curl (E+dt*kE) - void FormRHSImplicit(const Vector &u, const double dt, Vector &rhs) const - { - Vector uE(u.GetData() + 0, size_E); - Vector uB(u.GetData() + size_E, size_B); - weakCurl->Mult(uB, rhs); + Vector u1(u.GetData() + 0, size_E); + Vector u2(u.GetData() + size_E, size_E); + Vector rhs1(rhs.GetData() + 0, size_E); + Vector rhs2(rhs.GetData() + size_E, size_E); + // u1 = Edot, u2 = E + // rhs_u1 = -C*u1 - K*u2 - J(t) + // rhs_u2 = u1 + K->Mult(u2, rhs1); if (C) { - C->AddMult(uE, rhs, -1.0); + C->AddMult(u1, rhs1, 1.0); } - K->AddMult(uE, rhs, -dt); - linalg::AXPBYPCZ(1.0, rhs, J_coef(t), NegJ, 0.0, rhs); + linalg::AXPBYPCZ(-1.0, rhs1, dJ_coef(t), NegJ, 0.0, rhs1); + + rhs2 = u1; } // Solve M du = rhs void Mult(const Vector &u, Vector &du) const override { + if (kspM->NumTotalMult() == 0) + { + // Operators have already been set in constructor. + du = 0.0; + } FormRHS(u, RHS); - Vector duE(du.GetData() + 0, size_E); - Vector duB(du.GetData() + size_E, size_B); - Vector rhsE(RHS.GetData() + 0, size_E); - Vector rhsB(RHS.GetData() + size_E, size_B); - kspM->Mult(rhsE, duE); - duB = rhsB; + Vector du1(du.GetData() + 0, size_E); + Vector du2(du.GetData() + size_E, size_E); + Vector rhs1(RHS.GetData() + 0, size_E); + Vector rhs2(RHS.GetData() + size_E, size_E); + kspM->Mult(rhs1, du1); + du2 = rhs2; } - + void ImplicitSolve(double dt, const Vector &u, Vector &k) override { - // Solve for k = [kE,kB] - // After substituting kB expression into kE equation, kE eqn is independent of kB - // and kE can be solved using the second-order curlcurl operator - // (M + dt*C + dt^2*K)kE = -C*E - dt*K*E + 1/mu curl B - J(t) - // kB = -curl (E+dt*kE) + // Solve: M k = f(u + dt k, t) + // Use block elimination to avoid solving a 2n x 2n linear system if (!kspA || dt != dt_) { // Configure the linear solver, including the system matrix and also the matrix @@ -178,35 +157,41 @@ class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator k = 0.0; } Mpi::Print("\n"); - // Solve A kE = rhsE - FormRHSImplicit(u, dt, rhsE); - Vector kE(k.GetData() + 0, size_E); - Vector kB(k.GetData() + size_E, size_B); - Vector uE(u.GetData() + 0, size_E); - Vector uB(u.GetData() + size_E, size_B); - kspA->Mult(rhsE, kE); - - // kB = -curl (E+dt*kE) - linalg::AXPBYPCZ(1.0, uE, dt, kE, 0.0, rhsE); - Curl->Mult(rhsE, kB); - kB *= -1.0; + FormRHS(u, RHS); + Vector k1(k.GetData() + 0, size_E); + Vector k2(k.GetData() + size_E, size_E); + Vector rhs1(RHS.GetData() + 0, size_E); + Vector rhs2(RHS.GetData() + size_E, size_E); + // A k1 = rhs1 - dt K rhs2 + K->AddMult(rhs2, rhs1, -dt); + kspA->Mult(rhs1, k1); + + // k2 = rhs2 + dt k1 + linalg::AXPBYPCZ(1.0, rhs2, dt, k1, 0.0, k2); } void ExplicitMult(const Vector &u, Vector &v) const override { - FormRHS(u, v); + if(explicit_RHS) // y' = M^-1 f(y,t) + { + Mult(u, v); + } + else // M y' = f(y,t) + { + FormRHS(u, v); + } } - // Setup A = M - gamma J = M + gamma C + gamma^2 K + // Setup A = M - gamma J = M + gamma C + gamma^2 K int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, double gamma) { // Update Jacobian matrix - if (!kspA || gamma != saved_gamma) + if (!kspA || gamma != saved_gamma) { ConfigureLinearSolver(gamma); } - + // Indicate Jacobian was updated *jcur = 1; @@ -216,62 +201,60 @@ class TimeDependentEBSystemOperator: public mfem::TimeDependentOperator return 0; } - // Solve (Mass - dt Jacobian) x = b - // In the present ODE system: - // | M 0 | - dt | -C 1/mu curl | |xE| = |bE| - // | 0 I | | -curl 0 | |xB| |bB| - // (M + dt C)xE - dt/mu curl xB = bE - // -dt curl xE + xB = bB - // Substitute xB = bB - dt curl xE into xE equation - // -> (M + dt C + dt^2 K) xE = bE + dt/mu curl bB + // Solve (Mass - dt Jacobian) x = b int SUNImplicitSolve(const Vector &b, Vector &x, double tol) { - Vector bE(b.GetData() + 0, size_E); - Vector bB(b.GetData() + size_E, size_B); - Vector xE(x.GetData() + 0, size_E); - Vector xB(x.GetData() + size_E, size_B); - - // Solve A xE = bE + dt/mu curl bB - weakCurl->Mult(bB, rhsE); - rhsE *= saved_gamma; - rhsE += bE; - kspA->Mult(rhsE, xE); - - // xB = bB - dt curl xE - Curl->Mult(xE, xB); - xB *= -saved_gamma; - xB += bB; + Vector b1(b.GetData() + 0, size_E); + Vector b2(b.GetData() + size_E, size_E); + Vector x1(x.GetData() + 0, size_E); + Vector x2(x.GetData() + size_E, size_E); + Vector rhs(RHS.GetData() + 0, size_E); + + // A x1 = (M or I) b1 - dt K b2 + if (explicit_RHS) // y' = M^-1 f(y,t) for CVODE + { + M->Mult(b1, rhs); + } + else // M y' = f(y,t) for ARKODE + { + rhs = b1; + } + K->AddMult(b2, rhs, -saved_gamma); + kspA->Mult(rhs, x1); + + // x2 = b2 + dt x1 + linalg::AXPBYPCZ(1.0, b2, saved_gamma, x1, 0.0, x2); return 0; } - int SUNMassSetup() - { + int SUNMassSetup() + { // Already set M in the constructor. return 0; } int SUNMassSolve(const Vector &b, Vector &x, double tol) { - Vector bE(b.GetData() + 0, size_E); - Vector bB(b.GetData() + size_E, size_B); - Vector xE(x.GetData() + 0, size_E); - Vector xB(x.GetData() + size_E, size_B); - kspM->Mult(bE, xE); - xB = bB; - + Vector b1(b.GetData() + 0, size_E); + Vector b2(b.GetData() + size_E, size_E); + Vector x1(x.GetData() + 0, size_E); + Vector x2(x.GetData() + size_E, size_E); + kspM->Mult(b1, x1); + x2 = b2; + return 0; } int SUNMassMult(const Vector &x, Vector &v) { - Vector vE(v.GetData() + 0, size_E); - Vector vB(v.GetData() + size_E, size_B); - Vector xE(x.GetData() + 0, size_E); - Vector xB(x.GetData() + size_E, size_B); - M->Mult(xE, vE); - vB = xB; - + Vector v1(v.GetData() + 0, size_E); + Vector v2(v.GetData() + size_E, size_E); + Vector x1(x.GetData() + 0, size_E); + Vector x2(x.GetData() + size_E, size_E); + M->Mult(x1, v1); + v2 = x2; + return 0; } }; @@ -401,7 +384,7 @@ class TimeDependentCurlCurlOperator : public mfem::SecondOrderTimeDependentOpera } // namespace -SecondOrderTimeOperator::SecondOrderTimeOperator(const IoData &iodata, +SecondOrderTimeOperator::SecondOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, std::function &dJ_coef) { @@ -505,87 +488,95 @@ void SecondOrderTimeOperator::Step(double &t, double &dt) } FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &J_coef) + std::function &dJ_coef) { + // Construct discrete curl matrix for B-field time integration. + Curl = &space_op.GetCurlMatrix(); + // Get sizes. int size_E = space_op.GetNDSpace().GetTrueVSize(); int size_B = space_op.GetRTSpace().GetTrueVSize(); - + // Allocate space for solution vectors. - sol.SetSize(size_E+size_B); + sol.SetSize(2*size_E); E.SetSize(size_E); + En.SetSize(size_E); B.SetSize(size_B); sol.UseDevice(true); E.UseDevice(true); + En.UseDevice(true); B.UseDevice(true); - // Sol = [E, B] - E.MakeRef(sol, 0); - B.MakeRef(sol, size_E); + // Sol = [Edot, E] + E.MakeRef(sol, size_E); // SUNDIALS adaptive time-stepping parameters. adapt_dt = iodata.solver.transient.adaptive_dt; rel_tol = iodata.solver.transient.rel_tol; abs_tol = iodata.solver.transient.abs_tol; - rk_order = iodata.solver.transient.rk_order; + order = iodata.solver.transient.order; // Minimum RK order is 2. - rk_order = std::max(rk_order, 2); + order = std::max(order, 2); // Create ODE solver for 1st-order IVP. mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::EXPLICIT; switch (iodata.solver.transient.type) { - case config::TransientSolverData::Type::IMPLICIT_RK: - case config::TransientSolverData::Type::DEFAULT: + case config::TransientSolverData::Type::ARKODE: { #if defined(MFEM_USE_SUNDIALS) - // SUNDIALS ARKode solver. + // SUNDIALS ARKODE solver. std::unique_ptr arkode; - arkode = std::make_unique(space_op.GetComm(), + arkode = std::make_unique(space_op.GetComm(), mfem::ARKStepSolver::IMPLICIT); type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, J_coef, 0.0, type); - // Initialize ARKode. + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type, false); + // Initialize ARKODE. arkode->Init(*op); - // IRK settings - // Use implicit setup/solve defined in SUNImplicit* + // Use implicit setup/solve defined in SUNImplicit*. arkode->UseMFEMLinearSolver(); - // Use mass matrix operations defined in SUNMass* + // Use mass matrix operations defined in SUNMass*. + // if enabled, explicit_RHS must be false (M y' = f(y,t)) arkode->UseMFEMMassLinearSolver(0); // Implicit solve is linear and J is not time-dependent. ARKStepSetLinear(arkode->GetMem(), 0); // Maximum IRK order is 5. - rk_order = std::min(rk_order, 5); + order = std::min(order, 5); // Relative and absolute tolerances. - arkode->SetSStolerances(rel_tol, abs_tol); + arkode->SetSStolerances(rel_tol, abs_tol); // Set the order of the RK scheme. - ARKStepSetOrder(arkode->GetMem(), rk_order); - // Set the ODE solver to ARKode. + ARKStepSetOrder(arkode->GetMem(), order); + // Set the ODE solver to ARKODE. ode = std::move(arkode); #endif } break; - case config::TransientSolverData::Type::EXPLICIT_RK: + case config::TransientSolverData::Type::CVODE: + case config::TransientSolverData::Type::DEFAULT: { #if defined(MFEM_USE_SUNDIALS) - // SUNDIALS ARKode solver. - std::unique_ptr arkode; - arkode = std::make_unique(space_op.GetComm(), - mfem::ARKStepSolver::EXPLICIT); - type = mfem::TimeDependentOperator::EXPLICIT; + // SUNDIALS CVODE solver. + std::unique_ptr cvode; + cvode = std::make_unique(space_op.GetComm(), CV_BDF); + type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, J_coef, 0.0, type); - // Initialize ARKode. - arkode->Init(*op); - // Maximum ERK order is 8. - rk_order = std::min(rk_order, 8); - // Relative and absolute tolerances. - arkode->SetSStolerances(rel_tol, abs_tol); - // Set the order of the RK scheme. - ARKStepSetOrder(arkode->GetMem(), rk_order); - // Set the ODE solver to ARKode. - ode = std::move(arkode); + // CVODE uses explicit RHS ODE form: y' = M^-1 f(y,t) + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type, true); + // Initialize CVODE. + cvode->Init(*op); + // Relative and absolute tolerances for time step control. + cvode->SetSStolerances(rel_tol, abs_tol); + // Use implicit setup/solve defined in SUNImplicit*. + cvode->UseMFEMLinearSolver(); + // Set the max order of the multistep scheme. + // CV_BDF can go up to 5, but >= 3 is not unconditionally stable. + order = std::min(order, 5); + cvode->SetMaxOrder(order); + // Set the max number of steps allowed in one CVODE step() call. + cvode->SetMaxNSteps(10000); //default 500 + // Set the ODE solver to CVODE. + ode = std::move(cvode); #endif } break; @@ -594,27 +585,27 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat const KspSolver &FirstOrderTimeOperator::GetLinearSolver() const { - const auto &ebsystem = dynamic_cast(*op); - if (isExplicit()) + const auto &firstOrder = dynamic_cast(*op); + if (isExplicit()) { - MFEM_VERIFY(ebsystem.kspM, + MFEM_VERIFY(firstOrder.kspM, "No linear solver for time-dependent operator has been constructed!\n"); - return *ebsystem.kspM; + return *firstOrder.kspM; } - else + else { - MFEM_VERIFY(ebsystem.kspA, + MFEM_VERIFY(firstOrder.kspA, "No linear solver for time-dependent operator has been constructed!\n"); - return *ebsystem.kspA; + return *firstOrder.kspA; } } double FirstOrderTimeOperator::GetMaxTimeStep() const { - const auto &ebsystem = dynamic_cast(*op); - MPI_Comm comm = ebsystem.comm; - const Operator &M = *ebsystem.M; - const Operator &K = *ebsystem.K; + const auto &firstOrder = dynamic_cast(*op); + MPI_Comm comm = firstOrder.comm; + const Operator &M = *firstOrder.M; + const Operator &K = *firstOrder.K; // Solver for M⁻¹. constexpr double lin_tol = 1.0e-9; @@ -639,14 +630,11 @@ void FirstOrderTimeOperator::Init(double &dt) { // Always use zero initial conditions. sol = 0.0; - ode->Init(*op); + B = 0.0; #if defined(MFEM_USE_SUNDIALS) if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) { - // Setting a max internal time step can sometimes be beneficial. - // We could add this as an optional user input, but what should the default be? - //arkode->SetMaxStep(dt); - if(!adapt_dt) + if(!adapt_dt) { // Disable adaptive time stepping. arkode->SetFixedStep(dt); @@ -657,10 +645,63 @@ void FirstOrderTimeOperator::Init(double &dt) void FirstOrderTimeOperator::Step(double &t, double &dt) { + En = E; double dt_input = dt; ode->Step(sol, t, dt); // Ensure user-specified dt does not change. - dt = dt_input; + dt = dt_input; + + // Trapezoidal integration for B-field: dB/dt = -∇ x E. + En += E; + Curl->AddMult(En, B, -0.5 * dt); + +#if defined(MFEM_USE_SUNDIALS) +// REMOVE THIS LATER? +if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + { + // Print some timestepping stats + long int nsteps; + double hinused, hlast, hcur, tcur; + ARKStepGetStepStats(arkode->GetMem(), &nsteps, &hinused, + &hlast, &hcur, &tcur); + Mpi::Print("\nARKODE step statistics\n"); + Mpi::Print(" num steps: {:d}\n", nsteps); + Mpi::Print(" initial dt: {:.3e}\n", hinused); + Mpi::Print(" last dt: {:.3e}\n", hlast); + Mpi::Print(" current dt: {:.3e}\n", hcur); + Mpi::Print("\n"); + } + else if (mfem::CVODESolver* cvode = dynamic_cast(ode.get())) + { + long int nsteps, nfevals, nlinsetups, netfails; + int qlast, qcur; + double hinused, hlast, hcur, tcur; + + // Get integrator stats + CVodeGetIntegratorStats(cvode->GetMem(), + &nsteps, + &nfevals, + &nlinsetups, + &netfails, + &qlast, + &qcur, + &hinused, + &hlast, + &hcur, + &tcur); + Mpi::Print("\n CVODE step statistics\n"); + Mpi::Print(" num steps: {:d}\n", nsteps); + Mpi::Print(" num rhs evals: {:d}\n", nfevals); + Mpi::Print(" num lin setups: {:d}\n", nlinsetups); + Mpi::Print(" num error test fails: {:d}\n", netfails); + Mpi::Print(" last order: {:d}\n", qlast); + Mpi::Print(" current order: {:d}\n", qcur); + Mpi::Print(" initial dt: {:.3e}\n", hinused); + Mpi::Print(" last dt: {:.3e}\n", hlast); + Mpi::Print(" current dt: {:.3e}\n", hcur); + Mpi::Print("\n"); + } +#endif } void FirstOrderTimeOperator::PrintStats() @@ -669,13 +710,19 @@ void FirstOrderTimeOperator::PrintStats() if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) { long int expsteps, accsteps, step_attempts, nfe_evals, nfi_evals, nlinsetups, netfails; - ARKStepGetTimestepperStats(arkode->GetMem(), &expsteps, &accsteps, - &step_attempts, &nfe_evals, &nfi_evals, - &nlinsetups, &netfails); + ARKStepGetTimestepperStats(arkode->GetMem(), + &expsteps, + &accsteps, + &step_attempts, + &nfe_evals, + &nfi_evals, + &nlinsetups, + &netfails); + long int nniters; - ARKStepGetNumNonlinSolvIters(arkode->GetMem(), &nniters); + ARKStepGetNumNonlinSolvIters(arkode->GetMem(), &nniters); - Mpi::Print("\nARKode time-stepper statistics\n"); + Mpi::Print("\nARKODE time-stepper statistics\n"); Mpi::Print(" Stability-limited steps: {:d}\n", expsteps); Mpi::Print(" Accuracy-limited steps: {:d}\n", accsteps); Mpi::Print(" Calls to explicit RHS function: {:d}\n", nfe_evals); @@ -683,7 +730,33 @@ void FirstOrderTimeOperator::PrintStats() Mpi::Print(" Calls to linear solver setup function: {:d}\n", nlinsetups); Mpi::Print(" Calls to linear solver solve function: {:d}\n", nniters); Mpi::Print(" Number of error test failures: {:d}\n", netfails); - } + } + else if (mfem::CVODESolver* cvode = dynamic_cast(ode.get())) + { + long int nsteps, nfevals, nlinsetups, netfails; + int qlast, qcur; + double hinused, hlast, hcur, tcur; + + // Get integrator stats. + CVodeGetIntegratorStats(cvode->GetMem(), + &nsteps, + &nfevals, + &nlinsetups, + &netfails, + &qlast, + &qcur, + &hinused, + &hlast, + &hcur, + &tcur); + Mpi::Print("\n CVODE time-stepper statistics\n"); + Mpi::Print(" Number of steps: {:d}\n", nsteps); + Mpi::Print(" Calls to RHS function: {:d}\n", nfevals); + Mpi::Print(" Calls to linear solver setup function: {:d}\n", nlinsetups); + Mpi::Print(" Number of error test failures: {:d}\n", netfails); + Mpi::Print("\n"); + } + #endif } diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index 03144aa38..6e3929d33 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -20,7 +20,7 @@ class SpaceOperator; // // Abstract class handling temporal discretization of the governing equations. // -class TimeOperator +class TimeOperator { protected: Vector E, B; @@ -102,16 +102,16 @@ class FirstOrderTimeOperator : public TimeOperator { private: // Solution vector storage. - Vector sol; + Vector sol, En; - // Time integrator for the first order E-B ODE system. + // Time integrator for the first order ODE system. std::unique_ptr ode; - // Time-dependent operator for the E-B system. + // Time-dependent operator for the Edot-E ODE system. std::unique_ptr op; // Adaptive time-stepping parameters. - int rk_order; + int order; bool adapt_dt; double rel_tol, abs_tol; @@ -120,7 +120,7 @@ class FirstOrderTimeOperator : public TimeOperator public: FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &J_coef); + std::function &dJ_coef); // Return the linear solver associated with the implicit or explicit time integrator. const KspSolver &GetLinearSolver() const; diff --git a/palace/utils/configfile.cpp b/palace/utils/configfile.cpp index e0a6c901e..6472bd89a 100644 --- a/palace/utils/configfile.cpp +++ b/palace/utils/configfile.cpp @@ -1597,8 +1597,8 @@ PALACE_JSON_SERIALIZE_ENUM(TransientSolverData::Type, {TransientSolverData::Type::GEN_ALPHA, "GeneralizedAlpha"}, {TransientSolverData::Type::NEWMARK, "NewmarkBeta"}, {TransientSolverData::Type::CENTRAL_DIFF, "CentralDifference"}, - {TransientSolverData::Type::EXPLICIT_RK, "ExplicitRK"}, - {TransientSolverData::Type::IMPLICIT_RK, "ImplicitRK"}}) + {TransientSolverData::Type::CVODE, "CVODE"}, + {TransientSolverData::Type::ARKODE, "ARKODE"}}) PALACE_JSON_SERIALIZE_ENUM( TransientSolverData::ExcitationType, {{TransientSolverData::ExcitationType::SINUSOIDAL, "Sinusoidal"}, @@ -1629,7 +1629,7 @@ void TransientSolverData::SetUp(json &solver) max_t = transient->at("MaxTime"); // Required delta_t = transient->at("TimeStep"); // Required delta_post = transient->value("SaveStep", delta_post); - rk_order = transient->value("Order", rk_order); + order = transient->value("Order", order); adaptive_dt = transient->value("AdaptiveTimeStep", adaptive_dt); rel_tol = transient->value("RelTol", rel_tol); abs_tol = transient->value("AbsTol", abs_tol); @@ -1660,7 +1660,7 @@ void TransientSolverData::SetUp(json &solver) std::cout << "MaxTime: " << max_t << '\n'; std::cout << "TimeStep: " << delta_t << '\n'; std::cout << "SaveStep: " << delta_post << '\n'; - std::cout << "Order: " << rk_order << '\n'; + std::cout << "Order: " << order << '\n'; std::cout << "AdaptiveTimeStep: " << adaptive_dt << '\n'; std::cout << "RelTol: " << rel_tol << '\n'; std::cout << "AbsTol: " << abs_tol << '\n'; diff --git a/palace/utils/configfile.hpp b/palace/utils/configfile.hpp index 63928458e..b2dfc01f4 100644 --- a/palace/utils/configfile.hpp +++ b/palace/utils/configfile.hpp @@ -733,8 +733,8 @@ struct TransientSolverData GEN_ALPHA, NEWMARK, CENTRAL_DIFF, - EXPLICIT_RK, - IMPLICIT_RK + ARKODE, + CVODE }; Type type = Type::DEFAULT; @@ -763,15 +763,16 @@ struct TransientSolverData // Step increment for saving fields to disk. int delta_post = 0; - // RK scheme order for SUNDIALS ARKode integrators; - int rk_order = 3; + // RK scheme order for SUNDIALS ARKODE integrators. + // Max order for SUNDIALS CVODE integrator. + int order = 2; - // Adaptive time-stepping for SUNDIALS integrators + // Adaptive time-stepping for SUNDIALS ARKODE integrators bool adaptive_dt = true; // Adaptive time-stepping tolerances - double rel_tol = 1e-3; - double abs_tol = 1e-6; + double rel_tol = 1e-4; + double abs_tol = 1e-9; void SetUp(json &solver); }; diff --git a/scripts/schema/config/solver.json b/scripts/schema/config/solver.json index 55dba0753..7dadcf4c8 100644 --- a/scripts/schema/config/solver.json +++ b/scripts/schema/config/solver.json @@ -69,9 +69,9 @@ "TimeStep": { "type": "number" }, "SaveStep": { "type": "integer" }, "AdaptiveTimeStep": {"type": "boolean"}, - "Order": {"type": "integer"}, - "RelTol": {"type": "number"}, - "AbsTol": {"type": "number"} + "Order": {"type": "integer", "minimum": 1}, + "RelTol": {"type": "number", "minimum": 0.0}, + "AbsTol": {"type": "number", "minimum": 0.0} } }, "Electrostatic": From 983cc9c0329e19034bb66a1d4e951c31252125a7 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Fri, 25 Oct 2024 17:00:44 +0000 Subject: [PATCH 06/25] Use explicit RHS (y' = M^-1 f(y,t)) for both ARKODE and CVODE --- palace/models/timeoperator.cpp | 118 ++++++++++----------------------- 1 file changed, 34 insertions(+), 84 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index a82c4e028..2b23d33c4 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -39,9 +39,6 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator mutable Vector RHS; int size_E; - // ARKODE uses the ODE formulation M y' = f(y,t) (implicit RHS) - // CVODE uses the ODE formulation y' = M^-1 f(y,t) (explicit RHS) - bool explicit_RHS; // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and // construct the linear solver. @@ -50,11 +47,10 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator public: TimeDependentFirstOrderOperator(const IoData &iodata, SpaceOperator &space_op, std::function &dJ_coef, double t0, - mfem::TimeDependentOperator::Type type, - bool explicit_RHS) + mfem::TimeDependentOperator::Type type) : mfem::TimeDependentOperator(2*space_op.GetNDSpace().GetTrueVSize(), t0, type), - comm(space_op.GetComm()), dJ_coef(dJ_coef), explicit_RHS(explicit_RHS) + comm(space_op.GetComm()), dJ_coef(dJ_coef) { // Get dimensions of E and Edot vectors. size_E = space_op.GetNDSpace().GetTrueVSize(); @@ -172,14 +168,7 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator void ExplicitMult(const Vector &u, Vector &v) const override { - if(explicit_RHS) // y' = M^-1 f(y,t) - { - Mult(u, v); - } - else // M y' = f(y,t) - { - FormRHS(u, v); - } + Mult(u, v); } // Setup A = M - gamma J = M + gamma C + gamma^2 K @@ -201,7 +190,7 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator return 0; } - // Solve (Mass - dt Jacobian) x = b + // Solve (Mass - dt Jacobian) x = Mass b int SUNImplicitSolve(const Vector &b, Vector &x, double tol) { Vector b1(b.GetData() + 0, size_E); @@ -210,15 +199,8 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator Vector x2(x.GetData() + size_E, size_E); Vector rhs(RHS.GetData() + 0, size_E); - // A x1 = (M or I) b1 - dt K b2 - if (explicit_RHS) // y' = M^-1 f(y,t) for CVODE - { - M->Mult(b1, rhs); - } - else // M y' = f(y,t) for ARKODE - { - rhs = b1; - } + // A x1 = M b1 - dt K b2 + M->Mult(b1, rhs); K->AddMult(b2, rhs, -saved_gamma); kspA->Mult(rhs, x1); @@ -227,36 +209,6 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator return 0; } - - int SUNMassSetup() - { - // Already set M in the constructor. - return 0; - } - - int SUNMassSolve(const Vector &b, Vector &x, double tol) - { - Vector b1(b.GetData() + 0, size_E); - Vector b2(b.GetData() + size_E, size_E); - Vector x1(x.GetData() + 0, size_E); - Vector x2(x.GetData() + size_E, size_E); - kspM->Mult(b1, x1); - x2 = b2; - - return 0; - } - - int SUNMassMult(const Vector &x, Vector &v) - { - Vector v1(v.GetData() + 0, size_E); - Vector v2(v.GetData() + size_E, size_E); - Vector x1(x.GetData() + 0, size_E); - Vector x2(x.GetData() + size_E, size_E); - M->Mult(x1, v1); - v2 = x2; - - return 0; - } }; class TimeDependentCurlCurlOperator : public mfem::SecondOrderTimeDependentOperator @@ -531,14 +483,11 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat mfem::ARKStepSolver::IMPLICIT); type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type, false); + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); // Initialize ARKODE. arkode->Init(*op); // Use implicit setup/solve defined in SUNImplicit*. arkode->UseMFEMLinearSolver(); - // Use mass matrix operations defined in SUNMass*. - // if enabled, explicit_RHS must be false (M y' = f(y,t)) - arkode->UseMFEMMassLinearSolver(0); // Implicit solve is linear and J is not time-dependent. ARKStepSetLinear(arkode->GetMem(), 0); // Maximum IRK order is 5. @@ -561,8 +510,7 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat cvode = std::make_unique(space_op.GetComm(), CV_BDF); type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. - // CVODE uses explicit RHS ODE form: y' = M^-1 f(y,t) - op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type, true); + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); // Initialize CVODE. cvode->Init(*op); // Relative and absolute tolerances for time step control. @@ -655,53 +603,55 @@ void FirstOrderTimeOperator::Step(double &t, double &dt) En += E; Curl->AddMult(En, B, -0.5 * dt); +/* #if defined(MFEM_USE_SUNDIALS) -// REMOVE THIS LATER? -if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) { // Print some timestepping stats long int nsteps; double hinused, hlast, hcur, tcur; ARKStepGetStepStats(arkode->GetMem(), &nsteps, &hinused, &hlast, &hcur, &tcur); + + double hlasts = iodata.DimensionalizeValue(IoData::ValueType::TIME, hlast); + Mpi::Print("\nARKODE step statistics\n"); Mpi::Print(" num steps: {:d}\n", nsteps); - Mpi::Print(" initial dt: {:.3e}\n", hinused); - Mpi::Print(" last dt: {:.3e}\n", hlast); - Mpi::Print(" current dt: {:.3e}\n", hcur); + Mpi::Print(" last dt: {:.3e}\n", hlasts); Mpi::Print("\n"); } else if (mfem::CVODESolver* cvode = dynamic_cast(ode.get())) { - long int nsteps, nfevals, nlinsetups, netfails; - int qlast, qcur; - double hinused, hlast, hcur, tcur; + long int nsteps, nfevals, nlinsetups, netfails; + int qlast, qcur; + double hinused, hlast, hcur, tcur; + + // Get integrator stats + CVodeGetIntegratorStats(cvode->GetMem(), + &nsteps, + &nfevals, + &nlinsetups, + &netfails, + &qlast, + &qcur, + &hinused, + &hlast, + &hcur, + &tcur); + + double hlasts = iodata.DimensionalizeValue(IoData::ValueType::TIME, hlast); - // Get integrator stats - CVodeGetIntegratorStats(cvode->GetMem(), - &nsteps, - &nfevals, - &nlinsetups, - &netfails, - &qlast, - &qcur, - &hinused, - &hlast, - &hcur, - &tcur); Mpi::Print("\n CVODE step statistics\n"); Mpi::Print(" num steps: {:d}\n", nsteps); Mpi::Print(" num rhs evals: {:d}\n", nfevals); Mpi::Print(" num lin setups: {:d}\n", nlinsetups); Mpi::Print(" num error test fails: {:d}\n", netfails); Mpi::Print(" last order: {:d}\n", qlast); - Mpi::Print(" current order: {:d}\n", qcur); - Mpi::Print(" initial dt: {:.3e}\n", hinused); - Mpi::Print(" last dt: {:.3e}\n", hlast); - Mpi::Print(" current dt: {:.3e}\n", hcur); + Mpi::Print(" last dt: {:.3e}\n", hlasts); Mpi::Print("\n"); } #endif +*/ } void FirstOrderTimeOperator::PrintStats() From cff74b901169d13447810da79354408d37386fd3 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 30 Oct 2024 19:24:04 +0000 Subject: [PATCH 07/25] Remove weakCurl operator, no longer needed --- palace/models/spaceoperator.cpp | 37 --------------------------------- palace/models/spaceoperator.hpp | 4 ---- 2 files changed, 41 deletions(-) diff --git a/palace/models/spaceoperator.cpp b/palace/models/spaceoperator.cpp index a5d7d9a0c..b15c5c70d 100644 --- a/palace/models/spaceoperator.cpp +++ b/palace/models/spaceoperator.cpp @@ -442,39 +442,6 @@ SpaceOperator::GetExtraSystemMatrix(double omega, Operator::DiagonalPolicy diag_ } } -template -std::unique_ptr -SpaceOperator::GetWeakCurlMatrix() -{ - PrintHeader(GetH1Space(), GetNDSpace(), GetRTSpace(), print_hdr); - MaterialPropertyCoefficient df(mat_op.MaxCeedAttribute()), f(mat_op.MaxCeedAttribute()); - AddStiffnessCoefficients(1.0, df, f); - int empty = (df.empty() && f.empty()); - Mpi::GlobalMin(1, &empty, GetComm()); - if (empty) - { - return {}; - } - constexpr bool skip_zeros = false, assemble_q_data = false; - BilinearForm a(GetRTSpace(), GetNDSpace()); - a.AddDomainIntegrator(df); - if (assemble_q_data) - { - a.AssembleQuadratureData(); - } - auto weakCurl = a.Assemble(skip_zeros); - if constexpr (std::is_same::value) - { - auto WeakCurl = std::make_unique(std::move(weakCurl),nullptr, GetRTSpace(), GetNDSpace(),false); - return WeakCurl; - } - else - { - auto WeakCurl = std::make_unique(std::move(weakCurl),GetRTSpace(), GetNDSpace(), false); - return WeakCurl; - } -} - namespace { @@ -1082,8 +1049,4 @@ SpaceOperator::GetPreconditionerMatrix(double, double, double, double) template std::unique_ptr SpaceOperator::GetPreconditionerMatrix(double, double, double, double); -template std::unique_ptr - SpaceOperator::GetWeakCurlMatrix(); -template std::unique_ptr - SpaceOperator::GetWeakCurlMatrix(); } // namespace palace diff --git a/palace/models/spaceoperator.hpp b/palace/models/spaceoperator.hpp index f1cd7936f..0c9873ec6 100644 --- a/palace/models/spaceoperator.hpp +++ b/palace/models/spaceoperator.hpp @@ -177,10 +177,6 @@ class SpaceOperator std::unique_ptr GetPreconditionerMatrix(double a0, double a1, double a2, double a3); - // Construct the weak curl operator: curl 1/mu - template - std::unique_ptr GetWeakCurlMatrix(); - // Construct and return the discrete curl or gradient matrices. const Operator &GetGradMatrix() const { From e5b1e1d64f1cdef5919ddb3e4ba866adc42aace6 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 30 Oct 2024 19:25:41 +0000 Subject: [PATCH 08/25] Remove unnecessary ODE integrator prints --- palace/models/timeoperator.cpp | 50 ---------------------------------- 1 file changed, 50 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 2b23d33c4..344b4118f 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -602,56 +602,6 @@ void FirstOrderTimeOperator::Step(double &t, double &dt) // Trapezoidal integration for B-field: dB/dt = -∇ x E. En += E; Curl->AddMult(En, B, -0.5 * dt); - -/* -#if defined(MFEM_USE_SUNDIALS) - if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) - { - // Print some timestepping stats - long int nsteps; - double hinused, hlast, hcur, tcur; - ARKStepGetStepStats(arkode->GetMem(), &nsteps, &hinused, - &hlast, &hcur, &tcur); - - double hlasts = iodata.DimensionalizeValue(IoData::ValueType::TIME, hlast); - - Mpi::Print("\nARKODE step statistics\n"); - Mpi::Print(" num steps: {:d}\n", nsteps); - Mpi::Print(" last dt: {:.3e}\n", hlasts); - Mpi::Print("\n"); - } - else if (mfem::CVODESolver* cvode = dynamic_cast(ode.get())) - { - long int nsteps, nfevals, nlinsetups, netfails; - int qlast, qcur; - double hinused, hlast, hcur, tcur; - - // Get integrator stats - CVodeGetIntegratorStats(cvode->GetMem(), - &nsteps, - &nfevals, - &nlinsetups, - &netfails, - &qlast, - &qcur, - &hinused, - &hlast, - &hcur, - &tcur); - - double hlasts = iodata.DimensionalizeValue(IoData::ValueType::TIME, hlast); - - Mpi::Print("\n CVODE step statistics\n"); - Mpi::Print(" num steps: {:d}\n", nsteps); - Mpi::Print(" num rhs evals: {:d}\n", nfevals); - Mpi::Print(" num lin setups: {:d}\n", nlinsetups); - Mpi::Print(" num error test fails: {:d}\n", netfails); - Mpi::Print(" last order: {:d}\n", qlast); - Mpi::Print(" last dt: {:.3e}\n", hlasts); - Mpi::Print("\n"); - } -#endif -*/ } void FirstOrderTimeOperator::PrintStats() From c4b4a01e3ea4594c7f014049be32545df7b4599d Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 00:03:12 +0000 Subject: [PATCH 09/25] Remove 2nd order ODE formulation --- CHANGELOG.md | 3 + docs/src/config/solver.md | 23 +-- docs/src/install.md | 5 +- palace/drivers/transientsolver.cpp | 40 +---- palace/models/timeoperator.cpp | 276 ++++------------------------- palace/models/timeoperator.hpp | 91 +--------- palace/utils/configfile.cpp | 6 +- palace/utils/configfile.hpp | 12 +- palace/utils/iodata.cpp | 70 +++++++- scripts/schema/config/solver.json | 7 +- 10 files changed, 139 insertions(+), 394 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1bee333f..a258bef64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ The format of this changelog is based on - Exposed configuration linear solver and eigen solver options for the wave port subproblem. These can now be specified as part of the `config["Boundaries"]["WavePort"]` configuration. The defaults align with the previously hardcoded values. + - Added adaptive time-stepping capability for transient simulations. The new ODE integrators + rely on the SUNDIALS library and can be specified by setting the + `config["Solver"]["Transient"]["Type"]` option to `"CVODE"` or `"ARKODE"`. ## [0.13.0] - 2024-05-20 diff --git a/docs/src/config/solver.md b/docs/src/config/solver.md index c10f079f4..37cf02304 100644 --- a/docs/src/config/solver.md +++ b/docs/src/config/solver.md @@ -209,7 +209,6 @@ error tolerance. "MaxTime": , "TimeStep": , "SaveStep": , - "AdaptiveTimeStep": , "Order": , "RelTol": , "AbsTol": @@ -223,17 +222,12 @@ the second-order system of differential equations. The available options are: - `"GeneralizedAlpha"` : The second-order implicit generalized-``\alpha`` method with ``\rho_{\inf} = 1.0``. This scheme is unconditionally stable. - - `"NewmarkBeta"` : The second-order implicit Newmark-``\beta`` method with - ``\beta = 1/4`` and ``\gamma = 1/2``. This scheme is unconditionally stable. - - `"CentralDifference"` : The second-order explicit central difference method, obtained - by setting ``\beta = 0`` and ``\gamma = 1/2`` in the Newmark-``\beta`` method. In this - case, the maximum eigenvalue of the system operator is estimated at the start of the - simulation and used to restrict the simulation time step to below the maximum stability - time step. - `"ARKODE"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order - ODE system for the electric field. + ODE system for the electric field with adaptive time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). - `"CVODE"` : SUNDIALS CVODE implicit multistep method scheme applied to the first-order - ODE system for the electric field. + ODE system for the electric field with adaptive time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). + - `"RungeKutta"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order + ODE system for the electric field with fixed time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). - `"Default"` : Use the default `"GeneralizedAlpha"` time integration scheme. `"Excitation" [None]` : Controls the time dependence of the source excitation. The @@ -268,17 +262,14 @@ disk for [visualization with ParaView](../guide/postprocessing.md#Visualization) saved in the `paraview/` directory under the directory specified by [`config["Problem"]["Output"]`](problem.md#config%5B%22Problem%22%5D). -`"AdaptiveTimeStep" [true]` : Enable adaptive time-stepping in the Runge-Kutta integrators. -Only relevant when `"Type"` is `"ARKODE"`. `"CVODE"` always uses adaptive time-stepping. - `"Order" [2]` : Order of the Runge-Kutta integrators or maximum order of the multistep method. -Only relevant when `"Type"` is `"ARKODE"` or `"CVODE"`. +Only relevant when `"Type"` is `"ARKODE"`, `"Runge-Kutta"` or `"CVODE"`. `"RelTol" [1e-4]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"CVODE"` or `"ARKODE"` (when `"AdaptiveTimeStep"` is enabled). + when `"Type"` is `"CVODE"` or `"ARKODE"` . `"AbsTol" [1e-9]` : Absolute tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"CVODE"` or `"ARKODE"` (when `"AdaptiveTimeStep"` is enabled). + when `"Type"` is `"CVODE"` or `"ARKODE"`. ## `solver["Electrostatic"]` diff --git a/docs/src/install.md b/docs/src/install.md index fc5258bce..cea342c06 100644 --- a/docs/src/install.md +++ b/docs/src/install.md @@ -133,6 +133,7 @@ Additional build options are (with default values in brackets): - `PALACE_WITH_LIBXSMM [ON]` : Build with LIBXSMM backend for libCEED - `PALACE_WITH_MAGMA [ON]` : Build with MAGMA backend for libCEED - `PALACE_WITH_GSLIB [ON]` : Build with GSLIB library for high-order field interpolation + - `PALACE_WITH_SUNDIALS [ON]` : Build with SUNDIALS ODE solver library The build step is invoked by running (for example with 4 `make` threads) @@ -155,7 +156,7 @@ and LAPACK libraries depending on the system architecture according to the follo procedure: - For `x86_64` systems: - + + If the `MKLROOT` environment variable is set, looks for an [Intel MKL](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html) installation. @@ -166,7 +167,7 @@ procedure: which is permissively licensed and available from most package managers. - For `aarch64`/`arm64` systems: - + + If the `ARMPL_DIR` environment variable is set, looks for an [Arm Performance Libraries (PL)](https://www.arm.com/products/development-tools/server-and-hpc/allinea-studio/performance-libraries) installation. diff --git a/palace/drivers/transientsolver.cpp b/palace/drivers/transientsolver.cpp index 17bc4da59..873fb5cea 100644 --- a/palace/drivers/transientsolver.cpp +++ b/palace/drivers/transientsolver.cpp @@ -29,35 +29,13 @@ TransientSolver::Solve(const std::vector> &mesh) const std::function J_coef = GetTimeExcitation(false); std::function dJdt_coef = GetTimeExcitation(true); SpaceOperator space_op(iodata, mesh); - - std::unique_ptr time_op; - switch (iodata.solver.transient.type) - { - case config::TransientSolverData::Type::GEN_ALPHA: - case config::TransientSolverData::Type::NEWMARK: - case config::TransientSolverData::Type::CENTRAL_DIFF: - case config::TransientSolverData::Type::DEFAULT: - { - time_op = std::make_unique(iodata, space_op, dJdt_coef); - } - break; - case config::TransientSolverData::Type::ARKODE: - case config::TransientSolverData::Type::CVODE: - { -#if !defined(MFEM_USE_SUNDIALS) - MFEM_ABORT("Solver was not built with SUNDIALS support, please choose a " - "different transient solver type!"); -#endif - time_op = std::make_unique(iodata, space_op, dJdt_coef); - } - break; - } + TimeOperator time_op(iodata, space_op, dJdt_coef); double delta_t = iodata.solver.transient.delta_t; - if (time_op->isExplicit()) + if (time_op.isExplicit()) { // Stability limited time step. - const double dt_max = time_op-> GetMaxTimeStep(); + const double dt_max = time_op.GetMaxTimeStep(); const double dts_max = iodata.DimensionalizeValue(IoData::ValueType::TIME, dt_max); Mpi::Print(" Maximum stable time step: {:.6e} ns\n", dts_max); delta_t = std::min(delta_t, 0.95 * dt_max); @@ -124,17 +102,17 @@ TransientSolver::Solve(const std::vector> &mesh) const { Mpi::Print("\n"); t += delta_t; - time_op-> Init(delta_t); // Initial conditions + time_op.Init(delta_t); // Initial conditions } else { - time_op-> Step(t, delta_t); // Advances t internally + time_op.Step(t, delta_t); // Advances t internally } // Postprocess for the time step. BlockTimer bt2(Timer::POSTPRO); - const Vector &E = time_op->GetE(); - const Vector &B = time_op->GetB(); + const Vector &E = time_op.GetE(); + const Vector &B = time_op.GetB(); post_op.SetEGridFunction(E); post_op.SetBGridFunction(B); post_op.UpdatePorts(space_op.GetLumpedPortOp()); @@ -161,8 +139,8 @@ TransientSolver::Solve(const std::vector> &mesh) const step++; } BlockTimer bt1(Timer::POSTPRO); - time_op->PrintStats(); - SaveMetadata(time_op->GetLinearSolver()); + time_op.PrintStats(); + SaveMetadata(time_op.GetLinearSolver()); return {indicator, space_op.GlobalTrueVSize()}; } diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 344b4118f..f415666a2 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -211,236 +211,10 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator } }; -class TimeDependentCurlCurlOperator : public mfem::SecondOrderTimeDependentOperator -{ -public: - // MPI communicator. - MPI_Comm comm; - - // System matrices and excitation RHS. - std::unique_ptr K, M, C; - Vector NegJ; - - // Time dependence of current pulse for excitation: -J'(t) = -g'(t) J. This function - // returns g'(t). - std::function &dJ_coef; - - // Internal objects for solution of linear systems during time stepping. - double a0_, a1_; - std::unique_ptr kspM, kspA; - std::unique_ptr A, B; - mutable Vector RHS; - - // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and - // construct the linear solver. - std::function ConfigureLinearSolver; - -public: - TimeDependentCurlCurlOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef, double t0, - mfem::TimeDependentOperator::Type type) - : mfem::SecondOrderTimeDependentOperator(space_op.GetNDSpace().GetTrueVSize(), t0, - type), - comm(space_op.GetComm()), dJ_coef(dJ_coef) - { - // Construct the system matrices defining the linear operator. PEC boundaries are - // handled simply by setting diagonal entries of the mass matrix for the corresponding - // dofs. Because the Dirichlet BC is always homogeneous, no special elimination is - // required on the RHS. Diagonal entries are set in M (so M is non-singular). - K = space_op.GetStiffnessMatrix(Operator::DIAG_ZERO); - C = space_op.GetDampingMatrix(Operator::DIAG_ZERO); - M = space_op.GetMassMatrix(Operator::DIAG_ONE); - - // Set up RHS vector for the current source term: -g'(t) J, where g(t) handles the time - // dependence. - space_op.GetExcitationVector(NegJ); - RHS.SetSize(NegJ.Size()); - RHS.UseDevice(true); - - // Set up linear solvers. - { - auto pcg = std::make_unique>(comm, 0); - pcg->SetInitialGuess(iodata.solver.linear.initial_guess); - pcg->SetRelTol(iodata.solver.linear.tol); - pcg->SetAbsTol(std::numeric_limits::epsilon()); - pcg->SetMaxIter(iodata.solver.linear.max_it); - auto jac = std::make_unique>(comm); - kspM = std::make_unique(std::move(pcg), std::move(jac)); - kspM->SetOperators(*M, *M); - } - { - // For explicit schemes, recommended to just use cheaper preconditioners. Otherwise, - // use AMS or a direct solver. The system matrix is formed as a sequence of matrix - // vector products, and is only assembled for preconditioning. - ConfigureLinearSolver = [this, &iodata, &space_op](double a0, double a1) - { - // Configure the system matrix and also the matrix (matrices) from which the - // preconditioner will be constructed. - A = space_op.GetSystemMatrix(a0, a1, 1.0, K.get(), C.get(), M.get()); - B = space_op.GetPreconditionerMatrix(a0, a1, 1.0, 0.0); - - // Configure the solver. - if (!kspA) - { - kspA = std::make_unique(iodata, space_op.GetNDSpaces(), - &space_op.GetH1Spaces()); - } - kspA->SetOperators(*A, *B); - }; - } - } - - void FormRHS(const Vector &u, const Vector &du, Vector &rhs) const - { - // Multiply: rhs = -(K u + C du) - g'(t) J. - K->Mult(u, rhs); - if (C) - { - C->AddMult(du, rhs, 1.0); - } - linalg::AXPBYPCZ(-1.0, rhs, dJ_coef(t), NegJ, 0.0, rhs); - } - - void Mult(const Vector &u, const Vector &du, Vector &ddu) const override - { - // Solve: M ddu = -(K u + C du) - g'(t) J. - if (kspM->NumTotalMult() == 0) - { - // Operators have already been set in constructor. - ddu = 0.0; - } - FormRHS(u, du, RHS); - kspM->Mult(RHS, ddu); - } - - void ImplicitSolve(const double a0, const double a1, const Vector &u, const Vector &du, - Vector &k) override - { - // Solve: (a0 K + a1 C + M) k = -(K u + C du) - g'(t) J, where a0 may be 0 in the - // explicit case. At first iteration, construct the solver. Also don't print a newline - // if already done by the mass matrix solve at the first iteration. - if (!kspA || a0 != a0_ || a1 != a1_) - { - // Configure the linear solver, including the system matrix and also the matrix - // (matrices) from which the preconditioner will be constructed. - ConfigureLinearSolver(a0, a1); - a0_ = a0; - a1_ = a1; - k = 0.0; - } - Mpi::Print("\n"); - FormRHS(u, du, RHS); - kspA->Mult(RHS, k); - } -}; - } // namespace -SecondOrderTimeOperator::SecondOrderTimeOperator(const IoData &iodata, - SpaceOperator &space_op, - std::function &dJ_coef) -{ - // Construct discrete curl matrix for B-field time integration. - Curl = &space_op.GetCurlMatrix(); - - // Allocate space for solution vectors. - E.SetSize(Curl->Width()); - dE.SetSize(Curl->Width()); - En.SetSize(Curl->Width()); - B.SetSize(Curl->Height()); - E.UseDevice(true); - dE.UseDevice(true); - En.UseDevice(true); - B.UseDevice(true); - - // Create ODE solver for 2nd-order IVP. - mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::EXPLICIT; - switch (iodata.solver.transient.type) - { - case config::TransientSolverData::Type::GEN_ALPHA: - case config::TransientSolverData::Type::DEFAULT: - { - constexpr double rho_inf = 1.0; - ode = std::make_unique(rho_inf); - type = mfem::TimeDependentOperator::IMPLICIT; - } - break; - case config::TransientSolverData::Type::NEWMARK: - { - constexpr double beta = 0.25, gamma = 0.5; - ode = std::make_unique(beta, gamma); - type = mfem::TimeDependentOperator::IMPLICIT; - } - break; - case config::TransientSolverData::Type::CENTRAL_DIFF: - { - ode = std::make_unique(); - type = mfem::TimeDependentOperator::EXPLICIT; - } - break; - } - - // Set up time-dependent operator for 2nd-order curl-curl equation for E. - op = - std::make_unique(iodata, space_op, dJ_coef, 0.0, type); -} - -const KspSolver &SecondOrderTimeOperator::GetLinearSolver() const -{ - const auto &curlcurl = dynamic_cast(*op); - MFEM_VERIFY(curlcurl.kspA, - "No linear solver for time-depdendent operator has been constructed!\n"); - return *curlcurl.kspA; -} - -double SecondOrderTimeOperator::GetMaxTimeStep() const -{ - const auto &curlcurl = dynamic_cast(*op); - MPI_Comm comm = curlcurl.comm; - const Operator &M = *curlcurl.M; - const Operator &K = *curlcurl.K; - - // Solver for M⁻¹. - constexpr double lin_tol = 1.0e-9; - constexpr int max_lin_it = 10000; - CgSolver pcg(comm, 0); - pcg.SetRelTol(lin_tol); - pcg.SetMaxIter(max_lin_it); - pcg.SetOperator(M); - JacobiSmoother jac(comm); - jac.SetOperator(M); - pcg.SetPreconditioner(jac); - - // Power iteration to estimate largest eigenvalue of undamped system matrix M⁻¹ K (can use - // Hermitian eigenvalue solver as M, K are SPD). - ProductOperator op(pcg, K); - double lam = linalg::SpectralNorm(comm, op, true); - MFEM_VERIFY(lam > 0.0, "Error during power iteration, λ = " << lam << "!"); - return 2.0 / std::sqrt(lam); -} - -void SecondOrderTimeOperator::Init(double &dt) -{ - // Always use zero initial conditions. - E = 0.0; - dE = 0.0; - B = 0.0; - ode->Init(*op); -} - -void SecondOrderTimeOperator::Step(double &t, double &dt) -{ - // Single time step for E-field. - En = E; - ode->Step(E, dE, t, dt); - - // Trapezoidal integration for B-field: dB/dt = -∇ x E. - En += E; - Curl->AddMult(En, B, -0.5 * dt); -} - -FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef) +TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &dJ_coef) { // Construct discrete curl matrix for B-field time integration. Curl = &space_op.GetCurlMatrix(); @@ -463,25 +237,32 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat E.MakeRef(sol, size_E); // SUNDIALS adaptive time-stepping parameters. - adapt_dt = iodata.solver.transient.adaptive_dt; + adapt_dt = true; rel_tol = iodata.solver.transient.rel_tol; abs_tol = iodata.solver.transient.abs_tol; order = iodata.solver.transient.order; - // Minimum RK order is 2. - order = std::max(order, 2); // Create ODE solver for 1st-order IVP. - mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::EXPLICIT; + mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::IMPLICIT; switch (iodata.solver.transient.type) { + case config::TransientSolverData::Type::GEN_ALPHA: + case config::TransientSolverData::Type::DEFAULT: + { + constexpr double rho_inf = 1.0; + use_mfem_integrator = true; + ode = std::make_unique(rho_inf); + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); + } + break; case config::TransientSolverData::Type::ARKODE: + case config::TransientSolverData::Type::RUNGE_KUTTA: { #if defined(MFEM_USE_SUNDIALS) // SUNDIALS ARKODE solver. std::unique_ptr arkode; arkode = std::make_unique(space_op.GetComm(), mfem::ARKStepSolver::IMPLICIT); - type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); // Initialize ARKODE. @@ -490,19 +271,23 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat arkode->UseMFEMLinearSolver(); // Implicit solve is linear and J is not time-dependent. ARKStepSetLinear(arkode->GetMem(), 0); - // Maximum IRK order is 5. - order = std::min(order, 5); // Relative and absolute tolerances. arkode->SetSStolerances(rel_tol, abs_tol); // Set the order of the RK scheme. ARKStepSetOrder(arkode->GetMem(), order); + if (iodata.solver.transient.type == config::TransientSolverData::Type::RUNGE_KUTTA) + { + adapt_dt = false; + } // Set the ODE solver to ARKODE. ode = std::move(arkode); +#else + MFEM_ABORT("Solver was not built with SUNDIALS support, please choose a " + "different transient solver type!"); #endif } break; case config::TransientSolverData::Type::CVODE: - case config::TransientSolverData::Type::DEFAULT: { #if defined(MFEM_USE_SUNDIALS) // SUNDIALS CVODE solver. @@ -519,19 +304,21 @@ FirstOrderTimeOperator::FirstOrderTimeOperator(const IoData &iodata, SpaceOperat cvode->UseMFEMLinearSolver(); // Set the max order of the multistep scheme. // CV_BDF can go up to 5, but >= 3 is not unconditionally stable. - order = std::min(order, 5); cvode->SetMaxOrder(order); // Set the max number of steps allowed in one CVODE step() call. cvode->SetMaxNSteps(10000); //default 500 // Set the ODE solver to CVODE. ode = std::move(cvode); +#else + MFEM_ABORT("Solver was not built with SUNDIALS support, please choose a " + "different transient solver type!"); #endif } break; } } -const KspSolver &FirstOrderTimeOperator::GetLinearSolver() const +const KspSolver &TimeOperator::GetLinearSolver() const { const auto &firstOrder = dynamic_cast(*op); if (isExplicit()) @@ -548,7 +335,7 @@ const KspSolver &FirstOrderTimeOperator::GetLinearSolver() const } } -double FirstOrderTimeOperator::GetMaxTimeStep() const +double TimeOperator::GetMaxTimeStep() const { const auto &firstOrder = dynamic_cast(*op); MPI_Comm comm = firstOrder.comm; @@ -574,11 +361,15 @@ double FirstOrderTimeOperator::GetMaxTimeStep() const return 2.0 / std::sqrt(lam); } -void FirstOrderTimeOperator::Init(double &dt) +void TimeOperator::Init(double &dt) { // Always use zero initial conditions. sol = 0.0; B = 0.0; + if (use_mfem_integrator) + { + ode->Init(*op); + } #if defined(MFEM_USE_SUNDIALS) if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) { @@ -591,7 +382,7 @@ void FirstOrderTimeOperator::Init(double &dt) #endif } -void FirstOrderTimeOperator::Step(double &t, double &dt) +void TimeOperator::Step(double &t, double &dt) { En = E; double dt_input = dt; @@ -604,7 +395,7 @@ void FirstOrderTimeOperator::Step(double &t, double &dt) Curl->AddMult(En, B, -0.5 * dt); } -void FirstOrderTimeOperator::PrintStats() +void TimeOperator::PrintStats() { #if defined(MFEM_USE_SUNDIALS) if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) @@ -656,7 +447,6 @@ void FirstOrderTimeOperator::PrintStats() Mpi::Print(" Number of error test failures: {:d}\n", netfails); Mpi::Print("\n"); } - #endif } diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index 6e3929d33..c32e72f52 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -18,91 +18,13 @@ class IoData; class SpaceOperator; // -// Abstract class handling temporal discretization of the governing equations. +// A class handling temporal discretization of the governing equations. // class TimeOperator -{ - protected: - Vector E, B; - public: - TimeOperator() {}; - ~TimeOperator() {}; - - // Access solution vectors for E- and B-fields. - virtual const Vector &GetE() const { return E; } - virtual const Vector &GetB() const { return B; } - - // Return the linear solver associated with the implicit or explicit time integrator. - virtual const KspSolver &GetLinearSolver() const = 0; - - // Return if the time integration scheme explicit or implicit. - virtual bool isExplicit() const = 0; - - // Estimate the maximum stable time step based on the maximum eigenvalue of the - // undamped system matrix M⁻¹ K. - virtual double GetMaxTimeStep() const = 0; - - // Initialize time integrators and set 0 initial conditions. - virtual void Init(double &dt) = 0; - - // Perform time step from t -> t + dt. - virtual void Step(double &t, double &dt) = 0; - - // Print ODE integrator statistics. - virtual void PrintStats() {}; -}; - -// -// A class handling the second order ODE form of the governing equations. -// -class SecondOrderTimeOperator : public TimeOperator -{ -private: - // Additional vector storage. - Vector dE, En; - - // Time integrator for the curl-curl E-field formulation. - std::unique_ptr ode; - - // Time-dependent operator for the E-field. - std::unique_ptr op; - - // Discrete curl for B-field time integration (not owned). - const Operator *Curl; - -public: - SecondOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef); - - // Access E-field time derivative - const Vector &GetEdot() const { return dE; } - - // Return the linear solver associated with the implicit or explicit time integrator. - const KspSolver &GetLinearSolver() const; - - // Return if the time integration scheme explicit or implicit. - bool isExplicit() const { return op->isExplicit(); } - - // Estimate the maximum stable time step based on the maximum eigenvalue of the - // undamped system matrix M⁻¹ K. - double GetMaxTimeStep() const; - - // Initialize time integrators and set 0 initial conditions. - void Init(double &dt); - - // Perform time step from t -> t + dt. - void Step(double &t, double &dt); - -}; - -// -// A class handling the first order ODE system form of the governing equations. -// -class FirstOrderTimeOperator : public TimeOperator { private: // Solution vector storage. - Vector sol, En; + Vector E, B, sol, En; // Time integrator for the first order ODE system. std::unique_ptr ode; @@ -114,13 +36,18 @@ class FirstOrderTimeOperator : public TimeOperator int order; bool adapt_dt; double rel_tol, abs_tol; + bool use_mfem_integrator = false; // Discrete curl for B-field time integration (not owned). const Operator *Curl; public: - FirstOrderTimeOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef); + TimeOperator(const IoData &iodata, SpaceOperator &space_op, + std::function &dJ_coef); + + // Access solution vectors for E- and B-fields. + virtual const Vector &GetE() const { return E; } + virtual const Vector &GetB() const { return B; } // Return the linear solver associated with the implicit or explicit time integrator. const KspSolver &GetLinearSolver() const; diff --git a/palace/utils/configfile.cpp b/palace/utils/configfile.cpp index 6f5f95d84..5acca9c65 100644 --- a/palace/utils/configfile.cpp +++ b/palace/utils/configfile.cpp @@ -1607,8 +1607,7 @@ void MagnetostaticSolverData::SetUp(json &solver) PALACE_JSON_SERIALIZE_ENUM(TransientSolverData::Type, {{TransientSolverData::Type::DEFAULT, "Default"}, {TransientSolverData::Type::GEN_ALPHA, "GeneralizedAlpha"}, - {TransientSolverData::Type::NEWMARK, "NewmarkBeta"}, - {TransientSolverData::Type::CENTRAL_DIFF, "CentralDifference"}, + {TransientSolverData::Type::RUNGE_KUTTA, "RungeKutta"}, {TransientSolverData::Type::CVODE, "CVODE"}, {TransientSolverData::Type::ARKODE, "ARKODE"}}) PALACE_JSON_SERIALIZE_ENUM( @@ -1642,7 +1641,6 @@ void TransientSolverData::SetUp(json &solver) delta_t = transient->at("TimeStep"); // Required delta_post = transient->value("SaveStep", delta_post); order = transient->value("Order", order); - adaptive_dt = transient->value("AdaptiveTimeStep", adaptive_dt); rel_tol = transient->value("RelTol", rel_tol); abs_tol = transient->value("AbsTol", abs_tol); @@ -1655,7 +1653,6 @@ void TransientSolverData::SetUp(json &solver) transient->erase("TimeStep"); transient->erase("SaveStep"); transient->erase("Order"); - transient->erase("AdaptiveTimeStep"); transient->erase("RelTol"); transient->erase("AbsTol"); MFEM_VERIFY(transient->empty(), @@ -1673,7 +1670,6 @@ void TransientSolverData::SetUp(json &solver) std::cout << "TimeStep: " << delta_t << '\n'; std::cout << "SaveStep: " << delta_post << '\n'; std::cout << "Order: " << order << '\n'; - std::cout << "AdaptiveTimeStep: " << adaptive_dt << '\n'; std::cout << "RelTol: " << rel_tol << '\n'; std::cout << "AbsTol: " << abs_tol << '\n'; } diff --git a/palace/utils/configfile.hpp b/palace/utils/configfile.hpp index 7bd017f58..1ce6940a7 100644 --- a/palace/utils/configfile.hpp +++ b/palace/utils/configfile.hpp @@ -743,8 +743,7 @@ struct TransientSolverData { DEFAULT, GEN_ALPHA, - NEWMARK, - CENTRAL_DIFF, + RUNGE_KUTTA, ARKODE, CVODE }; @@ -777,14 +776,11 @@ struct TransientSolverData // RK scheme order for SUNDIALS ARKODE integrators. // Max order for SUNDIALS CVODE integrator. - int order = 2; - - // Adaptive time-stepping for SUNDIALS ARKODE integrators - bool adaptive_dt = true; + int order = -1;//2 // Adaptive time-stepping tolerances - double rel_tol = 1e-4; - double abs_tol = 1e-9; + double rel_tol = -1;//1e-4; + double abs_tol = -1;//1e-9; void SetUp(json &solver); }; diff --git a/palace/utils/iodata.cpp b/palace/utils/iodata.cpp index f2c5b6818..f43d3b52e 100644 --- a/palace/utils/iodata.cpp +++ b/palace/utils/iodata.cpp @@ -324,9 +324,7 @@ void IoData::CheckConfiguration() // Resolve default values in configuration file. if (solver.linear.type == config::LinearSolverData::Type::DEFAULT) { - if (problem.type == config::ProblemData::Type::ELECTROSTATIC || - (problem.type == config::ProblemData::Type::TRANSIENT && - solver.transient.type == config::TransientSolverData::Type::CENTRAL_DIFF)) + if (problem.type == config::ProblemData::Type::ELECTROSTATIC) { solver.linear.type = config::LinearSolverData::Type::BOOMER_AMG; } @@ -427,6 +425,72 @@ void IoData::CheckConfiguration() problem.type == config::ProblemData::Type::MAGNETOSTATIC || problem.type == config::ProblemData::Type::TRANSIENT); } + if (problem.type == config::ProblemData::Type::TRANSIENT) + { + if (solver.transient.type == config::TransientSolverData::Type::GEN_ALPHA || + solver.transient.type == config::TransientSolverData::Type::DEFAULT) + { + if (solver.transient.rel_tol > 0 || solver.transient.abs_tol > 0) + { + Mpi::Warning("Generalized alpha transient solver does not use relative " + "and absolute tolerance parameters!\n"); + } + if (solver.transient.order > 0) + { + Mpi::Warning("Generalized alpha transient solver does not use order parameter!\n"); + } + } + else if (solver.transient.type == config::TransientSolverData::Type::CVODE) + { + if (solver.transient.rel_tol < 0) + { + solver.transient.rel_tol = 1e-4; + } + if (solver.transient.abs_tol < 0) + { + solver.transient.abs_tol = 1e-9; + } + if (solver.transient.order < 0) + { + solver.transient.order = 2; + } + else if (solver.transient.order < 2) + { + Mpi::Warning("CVODE transient solver order cannot be less than 2!\n"); + solver.transient.order = 2; + } + else if (solver.transient.order > 5) + { + Mpi::Warning("CVODE transient solver order cannot be greater than 5!\n"); + solver.transient.order = 5; + } + } + else // ARKODE and RUNGE_KUTTA + { + if (solver.transient.rel_tol < 0) + { + solver.transient.rel_tol = 1e-4; + } + if (solver.transient.abs_tol < 0) + { + solver.transient.abs_tol = 1e-9; + } + if (solver.transient.order < 0) + { + solver.transient.order = 3; + } + else if (solver.transient.order < 2) + { + Mpi::Warning("Runge-Kutta/ARKODE transient solver order cannot be less than 2!\n"); + solver.transient.order = 2; + } + else if (solver.transient.order > 5) + { + Mpi::Warning("Runge-Kutta/ARKODE transient solver order cannot be greater than 5!\n"); + solver.transient.order = 5; + } + } + } // Configure settings for quadrature rules and partial assembly. BilinearForm::pa_order_threshold = solver.pa_order_threshold; diff --git a/scripts/schema/config/solver.json b/scripts/schema/config/solver.json index 7dadcf4c8..5d19339ec 100644 --- a/scripts/schema/config/solver.json +++ b/scripts/schema/config/solver.json @@ -68,10 +68,9 @@ "MaxTime": { "type": "number" }, "TimeStep": { "type": "number" }, "SaveStep": { "type": "integer" }, - "AdaptiveTimeStep": {"type": "boolean"}, - "Order": {"type": "integer", "minimum": 1}, - "RelTol": {"type": "number", "minimum": 0.0}, - "AbsTol": {"type": "number", "minimum": 0.0} + "Order": {"type": "integer", "minimum": 2}, + "RelTol": {"type": "number", "exclusiveMinimum": 0.0}, + "AbsTol": {"type": "number", "exclusiveMinimum": 0.0} } }, "Electrostatic": From 937fb471ca359264e6e2a2d5674fc4d85f0cc9ff Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 19:51:49 +0000 Subject: [PATCH 10/25] Update reference for transient solver tests --- .../examples/ref/coaxial/matched/domain-E.csv | 400 +++++++++--------- .../ref/coaxial/matched/error-indicators.csv | 2 +- test/examples/ref/coaxial/matched/port-I.csv | 400 +++++++++--------- test/examples/ref/coaxial/matched/port-V.csv | 400 +++++++++--------- test/examples/ref/coaxial/open/domain-E.csv | 400 +++++++++--------- .../ref/coaxial/open/error-indicators.csv | 2 +- test/examples/ref/coaxial/open/port-I.csv | 400 +++++++++--------- test/examples/ref/coaxial/open/port-V.csv | 400 +++++++++--------- 8 files changed, 1202 insertions(+), 1202 deletions(-) diff --git a/test/examples/ref/coaxial/matched/domain-E.csv b/test/examples/ref/coaxial/matched/domain-E.csv index 21a9fe67d..192f14fed 100644 --- a/test/examples/ref/coaxial/matched/domain-E.csv +++ b/test/examples/ref/coaxial/matched/domain-E.csv @@ -1,202 +1,202 @@ t (ns), E_elec (J), E_mag (J), E_cap (J), E_ind (J) 0.000000000e+00, +0.000000000e+00, +0.000000000e+00, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-03, +2.620423449e-13, +2.405186616e-13, +0.000000000e+00, +0.000000000e+00 - 1.000000000e-02, +2.130484507e-12, +2.258001913e-12, +0.000000000e+00, +0.000000000e+00 - 1.500000000e-02, +5.280441196e-12, +5.252502459e-12, +0.000000000e+00, +0.000000000e+00 - 2.000000000e-02, +5.723485707e-12, +5.889336112e-12, +0.000000000e+00, +0.000000000e+00 - 2.500000000e-02, +1.384423851e-11, +1.351752176e-11, +0.000000000e+00, +0.000000000e+00 - 3.000000000e-02, +1.264406630e-10, +1.273520868e-10, +0.000000000e+00, +0.000000000e+00 - 3.500000000e-02, +7.248276845e-10, +7.322638095e-10, +0.000000000e+00, +0.000000000e+00 - 4.000000000e-02, +2.826288063e-09, +2.865189180e-09, +0.000000000e+00, +0.000000000e+00 - 4.500000000e-02, +8.472578774e-09, +8.624044305e-09, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-02, +2.067791389e-08, +2.112506274e-08, +0.000000000e+00, +0.000000000e+00 - 5.500000000e-02, +4.204801356e-08, +4.310959893e-08, +0.000000000e+00, +0.000000000e+00 - 6.000000000e-02, +7.139216297e-08, +7.352519985e-08, +0.000000000e+00, +0.000000000e+00 - 6.500000000e-02, +9.984652933e-08, +1.034135993e-07, +0.000000000e+00, +0.000000000e+00 - 7.000000000e-02, +1.129356653e-07, +1.176883153e-07, +0.000000000e+00, +0.000000000e+00 - 7.500000000e-02, +1.116885029e-07, +1.163252374e-07, +0.000000000e+00, +0.000000000e+00 - 8.000000000e-02, +1.680676068e-07, +1.704654187e-07, +0.000000000e+00, +0.000000000e+00 - 8.500000000e-02, +5.145121071e-07, +5.145849915e-07, +0.000000000e+00, +0.000000000e+00 - 9.000000000e-02, +1.625634693e-06, +1.632515993e-06, +0.000000000e+00, +0.000000000e+00 - 9.500000000e-02, +4.189260303e-06, +4.233144612e-06, +0.000000000e+00, +0.000000000e+00 - 1.000000000e-01, +8.834283227e-06, +8.979142522e-06, +0.000000000e+00, +0.000000000e+00 - 1.050000000e-01, +1.557257842e-05, +1.591718869e-05, +0.000000000e+00, +0.000000000e+00 - 1.100000000e-01, +2.318792918e-05, +2.383893340e-05, +0.000000000e+00, +0.000000000e+00 - 1.150000000e-01, +2.921180439e-05, +3.021934654e-05, +0.000000000e+00, +0.000000000e+00 - 1.200000000e-01, +3.137262067e-05, +3.264253087e-05, +0.000000000e+00, +0.000000000e+00 - 1.250000000e-01, +3.101355047e-05, +3.225591444e-05, +0.000000000e+00, +0.000000000e+00 - 1.300000000e-01, +3.761730158e-05, +3.843217751e-05, +0.000000000e+00, +0.000000000e+00 - 1.350000000e-01, +7.158794951e-05, +7.177794011e-05, +0.000000000e+00, +0.000000000e+00 - 1.400000000e-01, +1.611519268e-04, +1.612562358e-04, +0.000000000e+00, +0.000000000e+00 - 1.450000000e-01, +3.305914672e-04, +3.324397053e-04, +0.000000000e+00, +0.000000000e+00 - 1.500000000e-01, +5.820784545e-04, +5.889630356e-04, +0.000000000e+00, +0.000000000e+00 - 1.550000000e-01, +8.805796322e-04, +8.966101221e-04, +0.000000000e+00, +0.000000000e+00 - 1.600000000e-01, +1.155885869e-03, +1.184347393e-03, +0.000000000e+00, +0.000000000e+00 - 1.650000000e-01, +1.331885944e-03, +1.373024871e-03, +0.000000000e+00, +0.000000000e+00 - 1.700000000e-01, +1.378531485e-03, +1.427869636e-03, +0.000000000e+00, +0.000000000e+00 - 1.750000000e-01, +1.362174796e-03, +1.410730868e-03, +0.000000000e+00, +0.000000000e+00 - 1.800000000e-01, +1.458232463e-03, +1.495509375e-03, +0.000000000e+00, +0.000000000e+00 - 1.850000000e-01, +1.899735491e-03, +1.918963559e-03, +0.000000000e+00, +0.000000000e+00 - 1.900000000e-01, +2.868535496e-03, +2.872019129e-03, +0.000000000e+00, +0.000000000e+00 - 1.950000000e-01, +4.377346611e-03, +4.378882948e-03, +0.000000000e+00, +0.000000000e+00 - 2.000000000e-01, +6.212942793e-03, +6.234992736e-03, +0.000000000e+00, +0.000000000e+00 - 2.050000000e-01, +7.991627679e-03, +8.057270020e-03, +0.000000000e+00, +0.000000000e+00 - 2.100000000e-01, +9.319711662e-03, +9.442368650e-03, +0.000000000e+00, +0.000000000e+00 - 2.150000000e-01, +9.985360221e-03, +1.016109933e-02, +0.000000000e+00, +0.000000000e+00 - 2.200000000e-01, +1.007719028e-02, +1.028379892e-02, +0.000000000e+00, +0.000000000e+00 - 2.250000000e-01, +9.955563928e-03, +1.015955967e-02, +0.000000000e+00, +0.000000000e+00 - 2.300000000e-01, +1.008210801e-02, +1.025088038e-02, +0.000000000e+00, +0.000000000e+00 - 2.350000000e-01, +1.079466875e-02, +1.090827693e-02, +0.000000000e+00, +0.000000000e+00 - 2.400000000e-01, +1.214730678e-02, +1.220461958e-02, +0.000000000e+00, +0.000000000e+00 - 2.450000000e-01, +1.389708682e-02, +1.391385667e-02, +0.000000000e+00, +0.000000000e+00 - 2.500000000e-01, +1.563542931e-02, +1.563587733e-02, +0.000000000e+00, +0.000000000e+00 - 2.550000000e-01, +1.698422715e-02, +1.699059057e-02, +0.000000000e+00, +0.000000000e+00 - 2.600000000e-01, +1.775122294e-02, +1.777605233e-02, +0.000000000e+00, +0.000000000e+00 - 2.650000000e-01, +1.797483227e-02, +1.801878136e-02, +0.000000000e+00, +0.000000000e+00 - 2.700000000e-01, +1.785699356e-02, +1.791183841e-02, +0.000000000e+00, +0.000000000e+00 - 2.750000000e-01, +1.763968267e-02, +1.769402598e-02, +0.000000000e+00, +0.000000000e+00 - 2.800000000e-01, +1.749662873e-02, +1.754119018e-02, +0.000000000e+00, +0.000000000e+00 - 2.850000000e-01, +1.748652229e-02, +1.751695185e-02, +0.000000000e+00, +0.000000000e+00 - 2.900000000e-01, +1.757123608e-02, +1.758809129e-02, +0.000000000e+00, +0.000000000e+00 - 2.950000000e-01, +1.766998564e-02, +1.767687536e-02, +0.000000000e+00, +0.000000000e+00 - 3.000000000e-01, +1.771240811e-02, +1.771376634e-02, +0.000000000e+00, +0.000000000e+00 - 3.050000000e-01, +1.766674396e-02, +1.766631048e-02, +0.000000000e+00, +0.000000000e+00 - 3.100000000e-01, +1.753966658e-02, +1.753998010e-02, +0.000000000e+00, +0.000000000e+00 - 3.150000000e-01, +1.735875735e-02, +1.736129709e-02, +0.000000000e+00, +0.000000000e+00 - 3.200000000e-01, +1.715212543e-02, +1.715746687e-02, +0.000000000e+00, +0.000000000e+00 - 3.250000000e-01, +1.693505899e-02, +1.694260284e-02, +0.000000000e+00, +0.000000000e+00 - 3.300000000e-01, +1.670682209e-02, +1.671416897e-02, +0.000000000e+00, +0.000000000e+00 - 3.350000000e-01, +1.645600890e-02, +1.645862685e-02, +0.000000000e+00, +0.000000000e+00 - 3.400000000e-01, +1.617093781e-02, +1.616305853e-02, +0.000000000e+00, +0.000000000e+00 - 3.450000000e-01, +1.585083787e-02, +1.582818204e-02, +0.000000000e+00, +0.000000000e+00 - 3.500000000e-01, +1.551276534e-02, +1.547662163e-02, +0.000000000e+00, +0.000000000e+00 - 3.550000000e-01, +1.518894800e-02, +1.514966559e-02, +0.000000000e+00, +0.000000000e+00 - 3.600000000e-01, +1.491162097e-02, +1.488860703e-02, +0.000000000e+00, +0.000000000e+00 - 3.650000000e-01, +1.468858970e-02, +1.470450501e-02, +0.000000000e+00, +0.000000000e+00 - 3.700000000e-01, +1.448088588e-02, +1.455040131e-02, +0.000000000e+00, +0.000000000e+00 - 3.750000000e-01, +1.419868132e-02, +1.431606456e-02, +0.000000000e+00, +0.000000000e+00 - 3.800000000e-01, +1.372725161e-02, +1.385996705e-02, +0.000000000e+00, +0.000000000e+00 - 3.850000000e-01, +1.297981371e-02, +1.307465994e-02, +0.000000000e+00, +0.000000000e+00 - 3.900000000e-01, +1.195479585e-02, +1.195779817e-02, +0.000000000e+00, +0.000000000e+00 - 3.950000000e-01, +1.076386339e-02, +1.064706019e-02, +0.000000000e+00, +0.000000000e+00 - 4.000000000e-01, +9.604827899e-03, +9.386781121e-03, +0.000000000e+00, +0.000000000e+00 - 4.050000000e-01, +8.681040561e-03, +8.428101978e-03, +0.000000000e+00, +0.000000000e+00 - 4.100000000e-01, +8.102380427e-03, +7.906022539e-03, +0.000000000e+00, +0.000000000e+00 - 4.150000000e-01, +7.821118040e-03, +7.759444086e-03, +0.000000000e+00, +0.000000000e+00 - 4.200000000e-01, +7.643644601e-03, +7.745251608e-03, +0.000000000e+00, +0.000000000e+00 - 4.250000000e-01, +7.319370683e-03, +7.548395591e-03, +0.000000000e+00, +0.000000000e+00 - 4.300000000e-01, +6.663377862e-03, +6.934390576e-03, +0.000000000e+00, +0.000000000e+00 - 4.350000000e-01, +5.647819379e-03, +5.863578948e-03, +0.000000000e+00, +0.000000000e+00 - 4.400000000e-01, +4.413412247e-03, +4.506459532e-03, +0.000000000e+00, +0.000000000e+00 - 4.450000000e-01, +3.197467589e-03, +3.155166078e-03, +0.000000000e+00, +0.000000000e+00 - 4.500000000e-01, +2.220822838e-03, +2.083282042e-03, +0.000000000e+00, +0.000000000e+00 - 4.550000000e-01, +1.595004577e-03, +1.430075930e-03, +0.000000000e+00, +0.000000000e+00 - 4.600000000e-01, +1.293580221e-03, +1.164053344e-03, +0.000000000e+00, +0.000000000e+00 - 4.650000000e-01, +1.191755846e-03, +1.131361584e-03, +0.000000000e+00, +0.000000000e+00 - 4.700000000e-01, +1.142055894e-03, +1.149472829e-03, +0.000000000e+00, +0.000000000e+00 - 4.750000000e-01, +1.041605543e-03, +1.090954819e-03, +0.000000000e+00, +0.000000000e+00 - 4.800000000e-01, +8.607669459e-04, +9.195083148e-04, +0.000000000e+00, +0.000000000e+00 - 4.850000000e-01, +6.300406801e-04, +6.740804234e-04, +0.000000000e+00, +0.000000000e+00 - 4.900000000e-01, +4.039823507e-04, +4.241154918e-04, +0.000000000e+00, +0.000000000e+00 - 4.950000000e-01, +2.267441692e-04, +2.265089812e-04, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-01, +1.150301038e-04, +1.040527202e-04, +0.000000000e+00, +0.000000000e+00 - 5.050000000e-01, +6.014028919e-05, +4.766034878e-05, +0.000000000e+00, +0.000000000e+00 - 5.100000000e-01, +4.075827462e-05, +3.211978191e-05, +0.000000000e+00, +0.000000000e+00 - 5.150000000e-01, +3.611321127e-05, +3.248737681e-05, +0.000000000e+00, +0.000000000e+00 - 5.200000000e-01, +3.323312925e-05, +3.323042725e-05, +0.000000000e+00, +0.000000000e+00 - 5.250000000e-01, +2.758242080e-05, +2.914715414e-05, +0.000000000e+00, +0.000000000e+00 - 5.300000000e-01, +1.988593674e-05, +2.149642738e-05, +0.000000000e+00, +0.000000000e+00 - 5.350000000e-01, +1.245018988e-05, +1.344926557e-05, +0.000000000e+00, +0.000000000e+00 - 5.400000000e-01, +6.900760903e-06, +7.272314035e-06, +0.000000000e+00, +0.000000000e+00 - 5.450000000e-01, +3.594268756e-06, +3.590286797e-06, +0.000000000e+00, +0.000000000e+00 - 5.500000000e-01, +2.025594492e-06, +1.895747044e-06, +0.000000000e+00, +0.000000000e+00 - 5.550000000e-01, +1.450803424e-06, +1.336584058e-06, +0.000000000e+00, +0.000000000e+00 - 5.600000000e-01, +1.288414898e-06, +1.231080102e-06, +0.000000000e+00, +0.000000000e+00 - 5.650000000e-01, +1.228533368e-06, +1.217146138e-06, +0.000000000e+00, +0.000000000e+00 - 5.700000000e-01, +1.167110946e-06, +1.179240209e-06, +0.000000000e+00, +0.000000000e+00 - 5.750000000e-01, +1.098603154e-06, +1.119336256e-06, +0.000000000e+00, +0.000000000e+00 - 5.800000000e-01, +1.039442157e-06, +1.063710682e-06, +0.000000000e+00, +0.000000000e+00 - 5.850000000e-01, +9.953501530e-07, +1.023204798e-06, +0.000000000e+00, +0.000000000e+00 - 5.900000000e-01, +9.576087800e-07, +9.891895873e-07, +0.000000000e+00, +0.000000000e+00 - 5.950000000e-01, +9.108291166e-07, +9.437325543e-07, +0.000000000e+00, +0.000000000e+00 - 6.000000000e-01, +8.419307523e-07, +8.711457321e-07, +0.000000000e+00, +0.000000000e+00 - 6.050000000e-01, +7.462891533e-07, +7.658692689e-07, +0.000000000e+00, +0.000000000e+00 - 6.100000000e-01, +6.298805187e-07, +6.352690594e-07, +0.000000000e+00, +0.000000000e+00 - 6.150000000e-01, +5.072924620e-07, +4.972431559e-07, +0.000000000e+00, +0.000000000e+00 - 6.200000000e-01, +3.963851955e-07, +3.736634915e-07, +0.000000000e+00, +0.000000000e+00 - 6.250000000e-01, +3.116168757e-07, +2.821676552e-07, +0.000000000e+00, +0.000000000e+00 - 6.300000000e-01, +2.587810075e-07, +2.296994612e-07, +0.000000000e+00, +0.000000000e+00 - 6.350000000e-01, +2.334253504e-07, +2.105917078e-07, +0.000000000e+00, +0.000000000e+00 - 6.400000000e-01, +2.235523498e-07, +2.099176296e-07, +0.000000000e+00, +0.000000000e+00 - 6.450000000e-01, +2.151598927e-07, +2.103254141e-07, +0.000000000e+00, +0.000000000e+00 - 6.500000000e-01, +1.979173154e-07, +1.990209563e-07, +0.000000000e+00, +0.000000000e+00 - 6.550000000e-01, +1.684518527e-07, +1.717956936e-07, +0.000000000e+00, +0.000000000e+00 - 6.600000000e-01, +1.301558602e-07, +1.327698347e-07, +0.000000000e+00, +0.000000000e+00 - 6.650000000e-01, +9.022613703e-08, +9.073825585e-08, +0.000000000e+00, +0.000000000e+00 - 6.700000000e-01, +5.580791946e-08, +5.443082913e-08, +0.000000000e+00, +0.000000000e+00 - 6.750000000e-01, +3.114173498e-08, +2.902107329e-08, +0.000000000e+00, +0.000000000e+00 - 6.800000000e-01, +1.670115327e-08, +1.508875648e-08, +0.000000000e+00, +0.000000000e+00 - 6.850000000e-01, +1.012992827e-08, +9.789408171e-09, +0.000000000e+00, +0.000000000e+00 - 6.900000000e-01, +8.010663433e-09, +9.033568608e-09, +0.000000000e+00, +0.000000000e+00 - 6.950000000e-01, +7.426390430e-09, +9.395925590e-09, +0.000000000e+00, +0.000000000e+00 - 7.000000000e-01, +6.723532653e-09, +9.030559642e-09, +0.000000000e+00, +0.000000000e+00 - 7.050000000e-01, +5.459132804e-09, +7.580046383e-09, +0.000000000e+00, +0.000000000e+00 - 7.100000000e-01, +3.896191770e-09, +5.532868917e-09, +0.000000000e+00, +0.000000000e+00 - 7.150000000e-01, +2.464513895e-09, +3.546597362e-09, +0.000000000e+00, +0.000000000e+00 - 7.200000000e-01, +1.435258683e-09, +2.043365678e-09, +0.000000000e+00, +0.000000000e+00 - 7.250000000e-01, +8.471508171e-10, +1.122248789e-09, +0.000000000e+00, +0.000000000e+00 - 7.300000000e-01, +5.871061358e-10, +6.659230988e-10, +0.000000000e+00, +0.000000000e+00 - 7.350000000e-01, +5.036009873e-10, +4.893147898e-10, +0.000000000e+00, +0.000000000e+00 - 7.400000000e-01, +4.810396266e-10, +4.396520723e-10, +0.000000000e+00, +0.000000000e+00 - 7.450000000e-01, +4.606307784e-10, +4.290309491e-10, +0.000000000e+00, +0.000000000e+00 - 7.500000000e-01, +4.264934027e-10, +4.222169341e-10, +0.000000000e+00, +0.000000000e+00 - 7.550000000e-01, +3.828961208e-10, +4.114937040e-10, +0.000000000e+00, +0.000000000e+00 - 7.600000000e-01, +3.378369987e-10, +3.976253227e-10, +0.000000000e+00, +0.000000000e+00 - 7.650000000e-01, +2.961656171e-10, +3.813862413e-10, +0.000000000e+00, +0.000000000e+00 - 7.700000000e-01, +2.591308442e-10, +3.623875065e-10, +0.000000000e+00, +0.000000000e+00 - 7.750000000e-01, +2.262196844e-10, +3.403004719e-10, +0.000000000e+00, +0.000000000e+00 - 7.800000000e-01, +1.970239321e-10, +3.160047274e-10, +0.000000000e+00, +0.000000000e+00 - 7.850000000e-01, +1.717837308e-10, +2.915916542e-10, +0.000000000e+00, +0.000000000e+00 - 7.900000000e-01, +1.510681198e-10, +2.694953545e-10, +0.000000000e+00, +0.000000000e+00 - 7.950000000e-01, +1.356478877e-10, +2.518757643e-10, +0.000000000e+00, +0.000000000e+00 - 8.000000000e-01, +1.258952795e-10, +2.399608535e-10, +0.000000000e+00, +0.000000000e+00 - 8.050000000e-01, +1.214046802e-10, +2.337376954e-10, +0.000000000e+00, +0.000000000e+00 - 8.100000000e-01, +1.212354059e-10, +2.322153435e-10, +0.000000000e+00, +0.000000000e+00 - 8.150000000e-01, +1.240372927e-10, +2.337927247e-10, +0.000000000e+00, +0.000000000e+00 - 8.200000000e-01, +1.284014259e-10, +2.368117178e-10, +0.000000000e+00, +0.000000000e+00 - 8.250000000e-01, +1.332584316e-10, +2.400198423e-10, +0.000000000e+00, +0.000000000e+00 - 8.300000000e-01, +1.380187249e-10, +2.428423501e-10, +0.000000000e+00, +0.000000000e+00 - 8.350000000e-01, +1.425648355e-10, +2.452914810e-10, +0.000000000e+00, +0.000000000e+00 - 8.400000000e-01, +1.470618610e-10, +2.476857898e-10, +0.000000000e+00, +0.000000000e+00 - 8.450000000e-01, +1.516240653e-10, +2.503835718e-10, +0.000000000e+00, +0.000000000e+00 - 8.500000000e-01, +1.561796040e-10, +2.534131089e-10, +0.000000000e+00, +0.000000000e+00 - 8.550000000e-01, +1.604335331e-10, +2.564048606e-10, +0.000000000e+00, +0.000000000e+00 - 8.600000000e-01, +1.638723482e-10, +2.588566178e-10, +0.000000000e+00, +0.000000000e+00 - 8.650000000e-01, +1.660574334e-10, +2.602235503e-10, +0.000000000e+00, +0.000000000e+00 - 8.700000000e-01, +1.667775945e-10, +2.601022299e-10, +0.000000000e+00, +0.000000000e+00 - 8.750000000e-01, +1.660570572e-10, +2.585515557e-10, +0.000000000e+00, +0.000000000e+00 - 8.800000000e-01, +1.642081508e-10, +2.558716071e-10, +0.000000000e+00, +0.000000000e+00 - 8.850000000e-01, +1.617248535e-10, +2.524909743e-10, +0.000000000e+00, +0.000000000e+00 - 8.900000000e-01, +1.590711023e-10, +2.489862021e-10, +0.000000000e+00, +0.000000000e+00 - 8.950000000e-01, +1.566283055e-10, +2.457430751e-10, +0.000000000e+00, +0.000000000e+00 - 9.000000000e-01, +1.546717379e-10, +2.430048277e-10, +0.000000000e+00, +0.000000000e+00 - 9.050000000e-01, +1.532790265e-10, +2.409225082e-10, +0.000000000e+00, +0.000000000e+00 - 9.100000000e-01, +1.524360172e-10, +2.394200899e-10, +0.000000000e+00, +0.000000000e+00 - 9.150000000e-01, +1.520668717e-10, +2.384190533e-10, +0.000000000e+00, +0.000000000e+00 - 9.200000000e-01, +1.520278905e-10, +2.378366201e-10, +0.000000000e+00, +0.000000000e+00 - 9.250000000e-01, +1.522262819e-10, +2.374850556e-10, +0.000000000e+00, +0.000000000e+00 - 9.300000000e-01, +1.525436744e-10, +2.372870155e-10, +0.000000000e+00, +0.000000000e+00 - 9.350000000e-01, +1.528725902e-10, +2.372010088e-10, +0.000000000e+00, +0.000000000e+00 - 9.400000000e-01, +1.532029587e-10, +2.371100225e-10, +0.000000000e+00, +0.000000000e+00 - 9.450000000e-01, +1.534701064e-10, +2.370059916e-10, +0.000000000e+00, +0.000000000e+00 - 9.500000000e-01, +1.536405663e-10, +2.369194570e-10, +0.000000000e+00, +0.000000000e+00 - 9.550000000e-01, +1.537635936e-10, +2.368058763e-10, +0.000000000e+00, +0.000000000e+00 - 9.600000000e-01, +1.538096186e-10, +2.366825012e-10, +0.000000000e+00, +0.000000000e+00 - 9.650000000e-01, +1.537808834e-10, +2.366014166e-10, +0.000000000e+00, +0.000000000e+00 - 9.700000000e-01, +1.537241609e-10, +2.365490235e-10, +0.000000000e+00, +0.000000000e+00 - 9.750000000e-01, +1.536220032e-10, +2.365269110e-10, +0.000000000e+00, +0.000000000e+00 - 9.800000000e-01, +1.534829149e-10, +2.365631927e-10, +0.000000000e+00, +0.000000000e+00 - 9.850000000e-01, +1.533247813e-10, +2.366531632e-10, +0.000000000e+00, +0.000000000e+00 - 9.900000000e-01, +1.531467327e-10, +2.367804907e-10, +0.000000000e+00, +0.000000000e+00 - 9.950000000e-01, +1.529585792e-10, +2.369392209e-10, +0.000000000e+00, +0.000000000e+00 - 1.000000000e+00, +1.527571997e-10, +2.371327811e-10, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-03, +2.483779150e-13, +2.279766032e-13, +0.000000000e+00, +0.000000000e+00 + 1.000000000e-02, +2.276378059e-12, +2.403226901e-12, +0.000000000e+00, +0.000000000e+00 + 1.500000000e-02, +6.974949774e-12, +6.967633381e-12, +0.000000000e+00, +0.000000000e+00 + 2.000000000e-02, +1.068852323e-11, +1.090294512e-11, +0.000000000e+00, +0.000000000e+00 + 2.500000000e-02, +1.063816272e-11, +1.075641631e-11, +0.000000000e+00, +0.000000000e+00 + 3.000000000e-02, +4.202730563e-11, +4.218693243e-11, +0.000000000e+00, +0.000000000e+00 + 3.500000000e-02, +3.050624355e-10, +3.068827427e-10, +0.000000000e+00, +0.000000000e+00 + 4.000000000e-02, +1.439976958e-09, +1.454945004e-09, +0.000000000e+00, +0.000000000e+00 + 4.500000000e-02, +4.931171162e-09, +5.006388444e-09, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-02, +1.336749762e-08, +1.362500393e-08, +0.000000000e+00, +0.000000000e+00 + 5.500000000e-02, +2.985127508e-08, +3.053107528e-08, +0.000000000e+00, +0.000000000e+00 + 6.000000000e-02, +5.562062711e-08, +5.712646741e-08, +0.000000000e+00, +0.000000000e+00 + 6.500000000e-02, +8.601393272e-08, +8.879943839e-08, +0.000000000e+00, +0.000000000e+00 + 7.000000000e-02, +1.083337530e-07, +1.125125483e-07, +0.000000000e+00, +0.000000000e+00 + 7.500000000e-02, +1.114096581e-07, +1.162695644e-07, +0.000000000e+00, +0.000000000e+00 + 8.000000000e-02, +1.224159817e-07, +1.261101601e-07, +0.000000000e+00, +0.000000000e+00 + 8.500000000e-02, +2.812645825e-07, +2.821379312e-07, +0.000000000e+00, +0.000000000e+00 + 9.000000000e-02, +9.352103649e-07, +9.366000197e-07, +0.000000000e+00, +0.000000000e+00 + 9.500000000e-02, +2.681510288e-06, +2.701397407e-06, +0.000000000e+00, +0.000000000e+00 + 1.000000000e-01, +6.231637746e-06, +6.316047208e-06, +0.000000000e+00, +0.000000000e+00 + 1.050000000e-01, +1.198909448e-05, +1.222067965e-05, +0.000000000e+00, +0.000000000e+00 + 1.100000000e-01, +1.941101090e-05, +1.989808976e-05, +0.000000000e+00, +0.000000000e+00 + 1.150000000e-01, +2.658602817e-05, +2.741744431e-05, +0.000000000e+00, +0.000000000e+00 + 1.200000000e-01, +3.084006910e-05, +3.200448516e-05, +0.000000000e+00, +0.000000000e+00 + 1.250000000e-01, +3.116938025e-05, +3.247495182e-05, +0.000000000e+00, +0.000000000e+00 + 1.300000000e-01, +3.243953094e-05, +3.351770194e-05, +0.000000000e+00, +0.000000000e+00 + 1.350000000e-01, +4.951460936e-05, +5.001117139e-05, +0.000000000e+00, +0.000000000e+00 + 1.400000000e-01, +1.076142984e-04, +1.076244444e-04, +0.000000000e+00, +0.000000000e+00 + 1.450000000e-01, +2.349993729e-04, +2.356504713e-04, +0.000000000e+00, +0.000000000e+00 + 1.500000000e-01, +4.472801363e-04, +4.511525966e-04, +0.000000000e+00, +0.000000000e+00 + 1.550000000e-01, +7.291799861e-04, +7.401192526e-04, +0.000000000e+00, +0.000000000e+00 + 1.600000000e-01, +1.026236746e-03, +1.048199560e-03, +0.000000000e+00, +0.000000000e+00 + 1.650000000e-01, +1.259875309e-03, +1.294903116e-03, +0.000000000e+00, +0.000000000e+00 + 1.700000000e-01, +1.369839073e-03, +1.415939252e-03, +0.000000000e+00, +0.000000000e+00 + 1.750000000e-01, +1.369485226e-03, +1.419736213e-03, +0.000000000e+00, +0.000000000e+00 + 1.800000000e-01, +1.381796571e-03, +1.425914301e-03, +0.000000000e+00, +0.000000000e+00 + 1.850000000e-01, +1.621678186e-03, +1.650302782e-03, +0.000000000e+00, +0.000000000e+00 + 1.900000000e-01, +2.312297688e-03, +2.322641202e-03, +0.000000000e+00, +0.000000000e+00 + 1.950000000e-01, +3.563511953e-03, +3.563619498e-03, +0.000000000e+00, +0.000000000e+00 + 2.000000000e-01, +5.275801516e-03, +5.284520530e-03, +0.000000000e+00, +0.000000000e+00 + 2.050000000e-01, +7.136188815e-03, +7.177535472e-03, +0.000000000e+00, +0.000000000e+00 + 2.100000000e-01, +8.731595837e-03, +8.825062883e-03, +0.000000000e+00, +0.000000000e+00 + 2.150000000e-01, +9.737443481e-03, +9.888385971e-03, +0.000000000e+00, +0.000000000e+00 + 2.200000000e-01, +1.008554876e-02, +1.028049098e-02, +0.000000000e+00, +0.000000000e+00 + 2.250000000e-01, +1.001406588e-02, +1.022385183e-02, +0.000000000e+00, +0.000000000e+00 + 2.300000000e-01, +9.961472465e-03, +1.015141384e-02, +0.000000000e+00, +0.000000000e+00 + 2.350000000e-01, +1.035426228e-02, +1.049685735e-02, +0.000000000e+00, +0.000000000e+00 + 2.400000000e-01, +1.140025893e-02, +1.148469589e-02, +0.000000000e+00, +0.000000000e+00 + 2.450000000e-01, +1.299651326e-02, +1.303082829e-02, +0.000000000e+00, +0.000000000e+00 + 2.500000000e-01, +1.479431046e-02, +1.479979019e-02, +0.000000000e+00, +0.000000000e+00 + 2.550000000e-01, +1.637602527e-02, +1.637713105e-02, +0.000000000e+00, +0.000000000e+00 + 2.600000000e-01, +1.744307985e-02, +1.745785598e-02, +0.000000000e+00, +0.000000000e+00 + 2.650000000e-01, +1.792074346e-02, +1.795570362e-02, +0.000000000e+00, +0.000000000e+00 + 2.700000000e-01, +1.794283349e-02, +1.799357493e-02, +0.000000000e+00, +0.000000000e+00 + 2.750000000e-01, +1.774733262e-02, +1.780329410e-02, +0.000000000e+00, +0.000000000e+00 + 2.800000000e-01, +1.755237877e-02, +1.760268880e-02, +0.000000000e+00, +0.000000000e+00 + 2.850000000e-01, +1.747556071e-02, +1.751324323e-02, +0.000000000e+00, +0.000000000e+00 + 2.900000000e-01, +1.752173044e-02, +1.754504170e-02, +0.000000000e+00, +0.000000000e+00 + 2.950000000e-01, +1.762394081e-02, +1.763525216e-02, +0.000000000e+00, +0.000000000e+00 + 3.000000000e-01, +1.770122125e-02, +1.770480451e-02, +0.000000000e+00, +0.000000000e+00 + 3.050000000e-01, +1.770089823e-02, +1.770096364e-02, +0.000000000e+00, +0.000000000e+00 + 3.100000000e-01, +1.761188585e-02, +1.761158019e-02, +0.000000000e+00, +0.000000000e+00 + 3.150000000e-01, +1.745399156e-02, +1.745528975e-02, +0.000000000e+00, +0.000000000e+00 + 3.200000000e-01, +1.725731796e-02, +1.726124863e-02, +0.000000000e+00, +0.000000000e+00 + 3.250000000e-01, +1.704460148e-02, +1.705121735e-02, +0.000000000e+00, +0.000000000e+00 + 3.300000000e-01, +1.682291440e-02, +1.683079675e-02, +0.000000000e+00, +0.000000000e+00 + 3.350000000e-01, +1.658511017e-02, +1.659077954e-02, +0.000000000e+00, +0.000000000e+00 + 3.400000000e-01, +1.631818885e-02, +1.631627326e-02, +0.000000000e+00, +0.000000000e+00 + 3.450000000e-01, +1.601466527e-02, +1.599968728e-02, +0.000000000e+00, +0.000000000e+00 + 3.500000000e-01, +1.568230094e-02, +1.565222981e-02, +0.000000000e+00, +0.000000000e+00 + 3.550000000e-01, +1.534683473e-02, +1.530720018e-02, +0.000000000e+00, +0.000000000e+00 + 3.600000000e-01, +1.504314380e-02, +1.500915455e-02, +0.000000000e+00, +0.000000000e+00 + 3.650000000e-01, +1.479452662e-02, +1.478833479e-02, +0.000000000e+00, +0.000000000e+00 + 3.700000000e-01, +1.458743481e-02, +1.462933087e-02, +0.000000000e+00, +0.000000000e+00 + 3.750000000e-01, +1.435624781e-02, +1.445206038e-02, +0.000000000e+00, +0.000000000e+00 + 3.800000000e-01, +1.399345809e-02, +1.412418211e-02, +0.000000000e+00, +0.000000000e+00 + 3.850000000e-01, +1.339069910e-02, +1.351177751e-02, +0.000000000e+00, +0.000000000e+00 + 3.900000000e-01, +1.249765601e-02, +1.255232674e-02, +0.000000000e+00, +0.000000000e+00 + 3.950000000e-01, +1.136895888e-02, +1.131295073e-02, +0.000000000e+00, +0.000000000e+00 + 4.000000000e-01, +1.016652921e-02, +9.993537937e-03, +0.000000000e+00, +0.000000000e+00 + 4.050000000e-01, +9.103338645e-03, +8.857192374e-03, +0.000000000e+00, +0.000000000e+00 + 4.100000000e-01, +8.347474127e-03, +8.111248662e-03, +0.000000000e+00, +0.000000000e+00 + 4.150000000e-01, +7.933878608e-03, +7.797516506e-03, +0.000000000e+00, +0.000000000e+00 + 4.200000000e-01, +7.735052201e-03, +7.755465431e-03, +0.000000000e+00, +0.000000000e+00 + 4.250000000e-01, +7.514232171e-03, +7.687816944e-03, +0.000000000e+00, +0.000000000e+00 + 4.300000000e-01, +7.038763284e-03, +7.301237374e-03, +0.000000000e+00, +0.000000000e+00 + 4.350000000e-01, +6.195135448e-03, +6.449680361e-03, +0.000000000e+00, +0.000000000e+00 + 4.400000000e-01, +5.044090859e-03, +5.203784102e-03, +0.000000000e+00, +0.000000000e+00 + 4.450000000e-01, +3.787601466e-03, +3.810883023e-03, +0.000000000e+00, +0.000000000e+00 + 4.500000000e-01, +2.669008201e-03, +2.571571881e-03, +0.000000000e+00, +0.000000000e+00 + 4.550000000e-01, +1.862694615e-03, +1.702557593e-03, +0.000000000e+00, +0.000000000e+00 + 4.600000000e-01, +1.410110199e-03, +1.256478692e-03, +0.000000000e+00, +0.000000000e+00 + 4.650000000e-01, +1.227392768e-03, +1.130490171e-03, +0.000000000e+00, +0.000000000e+00 + 4.700000000e-01, +1.168487677e-03, +1.144084842e-03, +0.000000000e+00, +0.000000000e+00 + 4.750000000e-01, +1.101819587e-03, +1.134282676e-03, +0.000000000e+00, +0.000000000e+00 + 4.800000000e-01, +9.604108815e-04, +1.018260716e-03, +0.000000000e+00, +0.000000000e+00 + 4.850000000e-01, +7.483644053e-04, +8.018715896e-04, +0.000000000e+00, +0.000000000e+00 + 4.900000000e-01, +5.131445519e-04, +5.454557890e-04, +0.000000000e+00, +0.000000000e+00 + 4.950000000e-01, +3.075299032e-04, +3.164810621e-04, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-01, +1.627725294e-04, +1.558619115e-04, +0.000000000e+00, +0.000000000e+00 + 5.050000000e-01, +8.168847560e-05, +6.900694242e-05, +0.000000000e+00, +0.000000000e+00 + 5.100000000e-01, +4.743409806e-05, +3.649077878e-05, +0.000000000e+00, +0.000000000e+00 + 5.150000000e-01, +3.761161687e-05, +3.154000831e-05, +0.000000000e+00, +0.000000000e+00 + 5.200000000e-01, +3.489565379e-05, +3.333461162e-05, +0.000000000e+00, +0.000000000e+00 + 5.250000000e-01, +3.077554696e-05, +3.179628803e-05, +0.000000000e+00, +0.000000000e+00 + 5.300000000e-01, +2.384003016e-05, +2.556195110e-05, +0.000000000e+00, +0.000000000e+00 + 5.350000000e-01, +1.599901730e-05, +1.733612988e-05, +0.000000000e+00, +0.000000000e+00 + 5.400000000e-01, +9.386789789e-06, +1.004800583e-05, +0.000000000e+00, +0.000000000e+00 + 5.450000000e-01, +4.985084610e-06, +5.131964741e-06, +0.000000000e+00, +0.000000000e+00 + 5.500000000e-01, +2.639920155e-06, +2.546392437e-06, +0.000000000e+00, +0.000000000e+00 + 5.550000000e-01, +1.657497437e-06, +1.523394600e-06, +0.000000000e+00, +0.000000000e+00 + 5.600000000e-01, +1.344855715e-06, +1.256480261e-06, +0.000000000e+00, +0.000000000e+00 + 5.650000000e-01, +1.257239189e-06, +1.223507411e-06, +0.000000000e+00, +0.000000000e+00 + 5.700000000e-01, +1.201136724e-06, +1.201618442e-06, +0.000000000e+00, +0.000000000e+00 + 5.750000000e-01, +1.134182964e-06, +1.149143599e-06, +0.000000000e+00, +0.000000000e+00 + 5.800000000e-01, +1.068513204e-06, +1.088398357e-06, +0.000000000e+00, +0.000000000e+00 + 5.850000000e-01, +1.017040986e-06, +1.040165981e-06, +0.000000000e+00, +0.000000000e+00 + 5.900000000e-01, +9.776891928e-07, +1.004786274e-06, +0.000000000e+00, +0.000000000e+00 + 5.950000000e-01, +9.372039968e-07, +9.674435859e-07, +0.000000000e+00, +0.000000000e+00 + 6.000000000e-01, +8.803555674e-07, +9.100510427e-07, +0.000000000e+00, +0.000000000e+00 + 6.050000000e-01, +7.977625463e-07, +8.212873955e-07, +0.000000000e+00, +0.000000000e+00 + 6.100000000e-01, +6.901011525e-07, +7.020100656e-07, +0.000000000e+00, +0.000000000e+00 + 6.150000000e-01, +5.681561852e-07, +5.654181817e-07, +0.000000000e+00, +0.000000000e+00 + 6.200000000e-01, +4.489787508e-07, +4.323570292e-07, +0.000000000e+00, +0.000000000e+00 + 6.250000000e-01, +3.495583773e-07, +3.235430600e-07, +0.000000000e+00, +0.000000000e+00 + 6.300000000e-01, +2.805050374e-07, +2.518066606e-07, +0.000000000e+00, +0.000000000e+00 + 6.350000000e-01, +2.424218568e-07, +2.176591426e-07, +0.000000000e+00, +0.000000000e+00 + 6.400000000e-01, +2.265213520e-07, +2.100860092e-07, +0.000000000e+00, +0.000000000e+00 + 6.450000000e-01, +2.190339843e-07, +2.119979195e-07, +0.000000000e+00, +0.000000000e+00 + 6.500000000e-01, +2.071794947e-07, +2.075855214e-07, +0.000000000e+00, +0.000000000e+00 + 6.550000000e-01, +1.838963746e-07, +1.881257781e-07, +0.000000000e+00, +0.000000000e+00 + 6.600000000e-01, +1.494100385e-07, +1.538866088e-07, +0.000000000e+00, +0.000000000e+00 + 6.650000000e-01, +1.094733799e-07, +1.119384927e-07, +0.000000000e+00, +0.000000000e+00 + 6.700000000e-01, +7.169698865e-08, +7.162904512e-08, +0.000000000e+00, +0.000000000e+00 + 6.750000000e-01, +4.200032239e-08, +4.022396365e-08, +0.000000000e+00, +0.000000000e+00 + 6.800000000e-01, +2.270925950e-08, +2.058519898e-08, +0.000000000e+00, +0.000000000e+00 + 6.850000000e-01, +1.268263703e-08, +1.134615358e-08, +0.000000000e+00, +0.000000000e+00 + 6.900000000e-01, +8.804829176e-09, +8.759520206e-09, +0.000000000e+00, +0.000000000e+00 + 6.950000000e-01, +7.760056195e-09, +8.877975660e-09, +0.000000000e+00, +0.000000000e+00 + 7.000000000e-01, +7.230838112e-09, +9.013056708e-09, +0.000000000e+00, +0.000000000e+00 + 7.050000000e-01, +6.221780936e-09, +8.111699795e-09, +0.000000000e+00, +0.000000000e+00 + 7.100000000e-01, +4.723812851e-09, +6.321996402e-09, +0.000000000e+00, +0.000000000e+00 + 7.150000000e-01, +3.146831608e-09, +4.279701923e-09, +0.000000000e+00, +0.000000000e+00 + 7.200000000e-01, +1.869303073e-09, +2.546990836e-09, +0.000000000e+00, +0.000000000e+00 + 7.250000000e-01, +1.045271535e-09, +1.375317564e-09, +0.000000000e+00, +0.000000000e+00 + 7.300000000e-01, +6.242024841e-10, +7.350724499e-10, +0.000000000e+00, +0.000000000e+00 + 7.350000000e-01, +4.608359833e-10, +4.584828093e-10, +0.000000000e+00, +0.000000000e+00 + 7.400000000e-01, +4.147564926e-10, +3.699503491e-10, +0.000000000e+00, +0.000000000e+00 + 7.450000000e-01, +3.976204891e-10, +3.507775115e-10, +0.000000000e+00, +0.000000000e+00 + 7.500000000e-01, +3.734389243e-10, +3.444913516e-10, +0.000000000e+00, +0.000000000e+00 + 7.550000000e-01, +3.378112795e-10, +3.344735873e-10, +0.000000000e+00, +0.000000000e+00 + 7.600000000e-01, +2.974002065e-10, +3.203296639e-10, +0.000000000e+00, +0.000000000e+00 + 7.650000000e-01, +2.584031728e-10, +3.041760017e-10, +0.000000000e+00, +0.000000000e+00 + 7.700000000e-01, +2.233682299e-10, +2.865084203e-10, +0.000000000e+00, +0.000000000e+00 + 7.750000000e-01, +1.922530748e-10, +2.667946148e-10, +0.000000000e+00, +0.000000000e+00 + 7.800000000e-01, +1.644924158e-10, +2.450913440e-10, +0.000000000e+00, +0.000000000e+00 + 7.850000000e-01, +1.400042541e-10, +2.226584149e-10, +0.000000000e+00, +0.000000000e+00 + 7.900000000e-01, +1.191861217e-10, +2.014692103e-10, +0.000000000e+00, +0.000000000e+00 + 7.950000000e-01, +1.028306559e-10, +1.836424872e-10, +0.000000000e+00, +0.000000000e+00 + 8.000000000e-01, +9.151822050e-11, +1.706787347e-10, +0.000000000e+00, +0.000000000e+00 + 8.050000000e-01, +8.515004388e-11, +1.629753601e-10, +0.000000000e+00, +0.000000000e+00 + 8.100000000e-01, +8.304806463e-11, +1.599135097e-10, +0.000000000e+00, +0.000000000e+00 + 8.150000000e-01, +8.401201009e-11, +1.601016306e-10, +0.000000000e+00, +0.000000000e+00 + 8.200000000e-01, +8.663906551e-11, +1.618813608e-10, +0.000000000e+00, +0.000000000e+00 + 8.250000000e-01, +8.974905056e-11, +1.638472006e-10, +0.000000000e+00, +0.000000000e+00 + 8.300000000e-01, +9.262071538e-11, +1.652237190e-10, +0.000000000e+00, +0.000000000e+00 + 8.350000000e-01, +9.507262812e-11, +1.659118601e-10, +0.000000000e+00, +0.000000000e+00 + 8.400000000e-01, +9.733511897e-11, +1.662931348e-10, +0.000000000e+00, +0.000000000e+00 + 8.450000000e-01, +9.972601337e-11, +1.669365455e-10, +0.000000000e+00, +0.000000000e+00 + 8.500000000e-01, +1.024254718e-10, +1.681727216e-10, +0.000000000e+00, +0.000000000e+00 + 8.550000000e-01, +1.053586680e-10, +1.699228102e-10, +0.000000000e+00, +0.000000000e+00 + 8.600000000e-01, +1.081324998e-10, +1.718158279e-10, +0.000000000e+00, +0.000000000e+00 + 8.650000000e-01, +1.102712462e-10, +1.732815923e-10, +0.000000000e+00, +0.000000000e+00 + 8.700000000e-01, +1.114070674e-10, +1.737735667e-10, +0.000000000e+00, +0.000000000e+00 + 8.750000000e-01, +1.113598806e-10, +1.730987412e-10, +0.000000000e+00, +0.000000000e+00 + 8.800000000e-01, +1.102385745e-10, +1.713341260e-10, +0.000000000e+00, +0.000000000e+00 + 8.850000000e-01, +1.083815282e-10, +1.687611818e-10, +0.000000000e+00, +0.000000000e+00 + 8.900000000e-01, +1.061833532e-10, +1.658612481e-10, +0.000000000e+00, +0.000000000e+00 + 8.950000000e-01, +1.040141398e-10, +1.630193689e-10, +0.000000000e+00, +0.000000000e+00 + 9.000000000e-01, +1.021685320e-10, +1.605157165e-10, +0.000000000e+00, +0.000000000e+00 + 9.050000000e-01, +1.007733357e-10, +1.585370111e-10, +0.000000000e+00, +0.000000000e+00 + 9.100000000e-01, +9.985508173e-11, +1.570662303e-10, +0.000000000e+00, +0.000000000e+00 + 9.150000000e-01, +9.937096642e-11, +1.560560474e-10, +0.000000000e+00, +0.000000000e+00 + 9.200000000e-01, +9.921011024e-11, +1.554391335e-10, +0.000000000e+00, +0.000000000e+00 + 9.250000000e-01, +9.928999095e-11, +1.550615057e-10, +0.000000000e+00, +0.000000000e+00 + 9.300000000e-01, +9.950758583e-11, +1.548476563e-10, +0.000000000e+00, +0.000000000e+00 + 9.350000000e-01, +9.976706655e-11, +1.547514164e-10, +0.000000000e+00, +0.000000000e+00 + 9.400000000e-01, +1.000464778e-10, +1.546724997e-10, +0.000000000e+00, +0.000000000e+00 + 9.450000000e-01, +1.002876173e-10, +1.545926001e-10, +0.000000000e+00, +0.000000000e+00 + 9.500000000e-01, +1.004568286e-10, +1.545267974e-10, +0.000000000e+00, +0.000000000e+00 + 9.550000000e-01, +1.005850557e-10, +1.544379512e-10, +0.000000000e+00, +0.000000000e+00 + 9.600000000e-01, +1.006490064e-10, +1.543361629e-10, +0.000000000e+00, +0.000000000e+00 + 9.650000000e-01, +1.006492846e-10, +1.542604229e-10, +0.000000000e+00, +0.000000000e+00 + 9.700000000e-01, +1.006211143e-10, +1.542031409e-10, +0.000000000e+00, +0.000000000e+00 + 9.750000000e-01, +1.005533510e-10, +1.541675346e-10, +0.000000000e+00, +0.000000000e+00 + 9.800000000e-01, +1.004531208e-10, +1.541765804e-10, +0.000000000e+00, +0.000000000e+00 + 9.850000000e-01, +1.003344785e-10, +1.542292179e-10, +0.000000000e+00, +0.000000000e+00 + 9.900000000e-01, +1.001973924e-10, +1.543149262e-10, +0.000000000e+00, +0.000000000e+00 + 9.950000000e-01, +1.000494982e-10, +1.544297511e-10, +0.000000000e+00, +0.000000000e+00 + 1.000000000e+00, +9.988860265e-11, +1.545764220e-10, +0.000000000e+00, +0.000000000e+00 diff --git a/test/examples/ref/coaxial/matched/error-indicators.csv b/test/examples/ref/coaxial/matched/error-indicators.csv index 0594521e4..7a2f512c9 100644 --- a/test/examples/ref/coaxial/matched/error-indicators.csv +++ b/test/examples/ref/coaxial/matched/error-indicators.csv @@ -1,2 +1,2 @@ Norm, Minimum, Maximum, Mean - +9.905542702e-03, +2.592621049e-04, +3.100869596e-03, +5.438866154e-04 + +9.653022681e-03, +2.591030325e-04, +2.997508940e-03, +5.377920408e-04 diff --git a/test/examples/ref/coaxial/matched/port-I.csv b/test/examples/ref/coaxial/matched/port-I.csv index 4a450c3c9..536c89b3f 100644 --- a/test/examples/ref/coaxial/matched/port-I.csv +++ b/test/examples/ref/coaxial/matched/port-I.csv @@ -1,202 +1,202 @@ t (ns), I_inc[1] (A), I[1] (A), I[2] (A) 0.000000000e+00, -5.666088695e-06, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-03, -8.409123651e-06, -2.341328245e-06, -6.124159098e-23 - 1.000000000e-02, -1.105147275e-05, -5.826382857e-06, +2.762676845e-22 - 1.500000000e-02, -1.228163970e-05, -5.222852797e-06, +3.058381041e-23 - 2.000000000e-02, -9.778049726e-06, +3.479732768e-07, -9.251752516e-23 - 2.500000000e-02, -6.103350322e-20, +1.465152567e-05, -3.846182912e-22 - 3.000000000e-02, +2.176144987e-05, +4.434348953e-05, +4.411911557e-21 - 3.500000000e-02, +6.083135968e-05, +9.403287533e-05, +1.989414254e-20 - 4.000000000e-02, +1.218223334e-04, +1.675061721e-04, +7.771401467e-21 - 4.500000000e-02, +2.062970799e-04, +2.640783375e-04, -1.580045427e-19 - 5.000000000e-02, +3.093579607e-04, +3.746481283e-04, -2.456139412e-19 - 5.500000000e-02, +4.154313032e-04, +4.765161274e-04, -3.357590003e-19 - 6.000000000e-02, +4.940139224e-04, +5.303124776e-04, -4.417929514e-19 - 6.500000000e-02, +4.967592192e-04, +4.785254386e-04, -6.391530779e-19 - 7.000000000e-02, +3.578593563e-04, +2.464419516e-04, -8.785517176e-19 - 7.500000000e-02, -5.771941699e-19, -2.468286914e-04, -1.001652861e-18 - 8.000000000e-02, -6.520622610e-04, -1.070220787e-03, -1.048022059e-18 - 8.500000000e-02, -1.649298690e-03, -2.255609928e-03, +4.185066048e-20 - 9.000000000e-02, -2.988610073e-03, -3.763509598e-03, +8.601984925e-18 - 9.500000000e-02, -4.579372529e-03, -5.449045749e-03, +6.844589572e-17 - 1.000000000e-01, -6.213620742e-03, -7.037466294e-03, +4.537340129e-16 - 1.050000000e-01, -7.550108895e-03, -8.117962218e-03, +2.694650818e-15 - 1.100000000e-01, -8.123884454e-03, -8.168835362e-03, +1.458381477e-14 - 1.150000000e-01, -7.391643913e-03, -6.623897830e-03, +7.238842792e-14 - 1.200000000e-01, -4.818124626e-03, -2.980500538e-03, +3.311740294e-13 - 1.250000000e-01, +4.687776326e-18, +3.060907027e-03, +1.402393866e-12 - 1.300000000e-01, +7.187797314e-03, +1.144478412e-02, +5.515626339e-12 - 1.350000000e-01, +1.645040606e-02, +2.162946359e-02, +2.020122305e-11 - 1.400000000e-01, +2.697224625e-02, +3.251877276e-02, +6.903002905e-11 - 1.450000000e-01, +3.739593417e-02, +4.249139969e-02, +2.203177178e-10 - 1.500000000e-01, +4.591279224e-02, +4.955370760e-02, +6.568991020e-10 - 1.550000000e-01, +5.047923110e-02, +5.162043776e-02, +1.828084801e-09 - 1.600000000e-01, +4.914663699e-02, +4.689357277e-02, +4.737069214e-09 - 1.650000000e-01, +4.046146992e-02, +3.428028014e-02, +1.137744245e-08 - 1.700000000e-01, +2.386432750e-02, +1.376794562e-02, +2.511886135e-08 - 1.750000000e-01, -4.859694655e-17, -1.333615740e-02, +5.020089541e-08 - 1.800000000e-01, -2.914795543e-02, -4.438063934e-02, +8.801689469e-08 - 1.850000000e-01, -6.036142013e-02, -7.560597885e-02, +1.251140537e-07 - 1.900000000e-01, -8.955101123e-02, -1.026340643e-01, +1.037754427e-07 - 1.950000000e-01, -1.123435949e-01, -1.211478660e-01, -1.380011803e-07 - 2.000000000e-01, -1.248039088e-01, -1.276455366e-01, -9.704986665e-07 - 2.050000000e-01, -1.241588739e-01, -1.201223867e-01, -3.123031761e-06 - 2.100000000e-01, -1.093778521e-01, -9.853663600e-02, -7.854912659e-06 - 2.150000000e-01, -8.147939460e-02, -6.494807193e-02, -1.706925582e-05 - 2.200000000e-01, -4.348363979e-02, -2.328103409e-02, -3.323164095e-05 - 2.250000000e-01, +2.632536371e-16, +2.125857862e-02, -5.891719333e-05 - 2.300000000e-01, +4.348363979e-02, +6.300925395e-02, -9.583639123e-05 - 2.350000000e-01, +8.147939460e-02, +9.676630686e-02, -1.433067010e-04 - 2.400000000e-01, +1.093778521e-01, +1.186055850e-01, -1.963171018e-04 - 2.450000000e-01, +1.241588739e-01, +1.264630066e-01, -2.434989392e-04 - 2.500000000e-01, +1.248039088e-01, +1.203676579e-01, -2.654097790e-04 - 2.550000000e-01, +1.123435949e-01, +1.023011765e-01, -2.336094126e-04 - 2.600000000e-01, +8.955101123e-02, +7.573263818e-02, -1.112176449e-04 - 2.650000000e-01, +6.036142013e-02, +4.493958439e-02, +1.439413981e-04 - 2.700000000e-01, +2.914795543e-02, +1.425991010e-02, +5.721716690e-04 - 2.750000000e-01, +4.859694655e-17, -1.258094285e-02, +1.199643684e-03 - 2.800000000e-01, -2.386432750e-02, -3.295370088e-02, +2.021422860e-03 - 2.850000000e-01, -4.046146992e-02, -4.555719857e-02, +2.982270925e-03 - 2.900000000e-01, -4.914663699e-02, -5.039306818e-02, +3.959412326e-03 - 2.950000000e-01, -5.047923110e-02, -4.852842192e-02, +4.752243549e-03 - 3.000000000e-01, -4.591279224e-02, -4.172610814e-02, +5.084461711e-03 - 3.050000000e-01, -3.739593417e-02, -3.203277302e-02, +4.624831224e-03 - 3.100000000e-01, -2.697224625e-02, -2.140621242e-02, +3.032167115e-03 - 3.150000000e-01, -1.645040606e-02, -1.144050434e-02, +2.556763062e-05 - 3.200000000e-01, -7.187797314e-03, -3.215484371e-03, -4.527097466e-03 - 3.250000000e-01, -3.446700285e-16, +2.732339899e-03, -1.051715100e-02 - 3.300000000e-01, +4.818124626e-03, +6.342030114e-03, -1.751855865e-02 - 3.350000000e-01, +7.391643913e-03, +7.900798283e-03, -2.474855561e-02 - 3.400000000e-01, +8.123884454e-03, +7.895841329e-03, -3.108984764e-02 - 3.450000000e-01, +7.550108895e-03, +6.877347802e-03, -3.519367098e-02 - 3.500000000e-01, +6.213620742e-03, +5.353268211e-03, -3.566472650e-02 - 3.550000000e-01, +4.579372529e-03, +3.724883076e-03, -3.130958854e-02 - 3.600000000e-01, +2.988610073e-03, +2.261631827e-03, -2.141538783e-02 - 3.650000000e-01, +1.649298690e-03, +1.106284519e-03, -6.007486694e-03 - 3.700000000e-01, +6.520622610e-04, +2.994551059e-04, +1.397728694e-02 - 3.750000000e-01, +5.639207957e-17, -1.875691362e-04, +3.665822416e-02 - 3.800000000e-01, -3.578593563e-04, -4.208898024e-04, +5.935454428e-02 - 3.850000000e-01, -4.967592192e-04, -4.781398865e-04, +7.890920055e-02 - 3.900000000e-01, -4.940139224e-04, -4.309302473e-04, +9.215801551e-02 - 3.950000000e-01, -4.154313032e-04, -3.356024647e-04, +9.647262477e-02 - 4.000000000e-01, -3.093579607e-04, -2.305409730e-04, +9.027486238e-02 - 4.050000000e-01, -2.062970799e-04, -1.377736121e-04, +7.341388647e-02 - 4.100000000e-01, -1.218223334e-04, -6.669165032e-05, +4.732017881e-02 - 4.150000000e-01, -6.083135968e-05, -1.838467084e-05, +1.488373642e-02 - 4.200000000e-01, -2.176144987e-05, +1.051265052e-05, -1.994288466e-02 - 4.250000000e-01, -2.551434914e-18, +2.506586830e-05, -5.274961782e-02 - 4.300000000e-01, +9.778049726e-06, +3.026906953e-05, -7.937390849e-02 - 4.350000000e-01, +1.228163970e-05, +3.016906237e-05, -9.657472557e-02 - 4.400000000e-01, +1.105147275e-05, +2.763279206e-05, -1.025413020e-01 - 4.450000000e-01, +8.409123651e-06, +2.445310846e-05, -9.714168154e-02 - 4.500000000e-01, +5.666088695e-06, +2.165129470e-05, -8.187066681e-02 - 4.550000000e-01, +3.418894541e-06, +1.972672669e-05, -5.951500305e-02 - 4.600000000e-01, +1.826796159e-06, +1.893238777e-05, -3.361642887e-02 - 4.650000000e-01, +8.253938937e-07, +1.950449784e-05, -7.846191691e-03 - 4.700000000e-01, +2.671727168e-07, +2.164365176e-05, +1.458664185e-02 - 4.750000000e-01, +3.777032805e-20, +2.552761071e-05, +3.138158576e-02 - 4.800000000e-01, -9.828734975e-08, +3.130668335e-05, +4.138327329e-02 - 4.850000000e-01, -1.117049164e-07, +3.892488496e-05, +4.459151981e-02 - 4.900000000e-01, -9.095082526e-08, +4.797526148e-05, +4.196964913e-02 - 4.950000000e-01, -6.261923782e-08, +5.760114116e-05, +3.512062716e-02 - 5.000000000e-01, -3.817780532e-08, +6.635904627e-05, +2.591330086e-02 - 5.050000000e-01, -2.084413355e-08, +7.211226724e-05, +1.613286930e-02 - 5.100000000e-01, -1.007763869e-08, +7.215394959e-05, +7.218573533e-03 - 5.150000000e-01, -4.120031130e-09, +6.349423358e-05, +1.188374727e-04 - 5.200000000e-01, -1.206707201e-09, +4.317070919e-05, -4.737139632e-03 - 5.250000000e-01, -1.928824299e-22, +8.851449769e-06, -7.371031550e-03 - 5.300000000e-01, +3.634532244e-10, -4.041526601e-05, -8.127363862e-03 - 5.350000000e-01, +3.737607916e-10, -1.036012174e-04, -7.524929004e-03 - 5.400000000e-01, +2.753586026e-10, -1.770938822e-04, -6.120075875e-03 - 5.450000000e-01, +1.715419466e-10, -2.543400484e-04, -4.404808511e-03 - 5.500000000e-01, +9.463331804e-11, -3.260569881e-04, -2.747207131e-03 - 5.550000000e-01, +4.675063429e-11, -3.809411866e-04, -1.372868105e-03 - 5.600000000e-01, +2.045186871e-11, -4.068907043e-04, -3.782247322e-04 - 5.650000000e-01, +7.565632846e-12, -3.927385824e-04, +2.386309138e-04 - 5.700000000e-01, +2.005013126e-12, -3.302952711e-04, +5.402842958e-04 - 5.750000000e-01, +2.328620401e-25, -2.162825210e-04, +6.153810012e-04 - 5.800000000e-01, -4.944301496e-13, -5.382459801e-05, +5.530157266e-04 - 5.850000000e-01, -4.600666072e-13, +1.467828587e-04, +4.266252372e-04 - 5.900000000e-01, -3.066875683e-13, +3.684758194e-04, +2.878659059e-04 - 5.950000000e-01, -1.728774743e-13, +5.890330501e-04, +1.669480466e-04 - 6.000000000e-01, -8.629441606e-14, +7.836834222e-04, +7.637746802e-05 - 6.050000000e-01, -3.857417852e-14, +9.285095143e-04, +1.731608788e-05 - 6.100000000e-01, -1.526907493e-14, +1.004064566e-03, -1.540310229e-05 - 6.150000000e-01, -5.110878347e-15, +9.985663975e-04, -2.958948736e-05 - 6.200000000e-01, -1.225569810e-15, +9.100642839e-04, -3.235959459e-05 - 6.250000000e-01, -9.083457823e-29, +7.470825893e-04, -2.930760372e-05 - 6.300000000e-01, +2.474382771e-16, +5.276491017e-04, -2.436248817e-05 - 6.350000000e-01, +2.083306657e-16, +2.767665662e-04, -1.956197097e-05 - 6.400000000e-01, +1.256606244e-16, +2.272758440e-05, -1.579441306e-05 - 6.450000000e-01, +6.409320687e-17, -2.070174772e-04, -1.324760278e-05 - 6.500000000e-01, +2.894855159e-17, -3.897685125e-04, -1.176078493e-05 - 6.550000000e-01, +1.170877290e-17, -5.105448830e-04, -1.102707379e-05 - 6.600000000e-01, +4.193705940e-18, -5.636199015e-04, -1.066468992e-05 - 6.650000000e-01, +1.270139270e-18, -5.524779988e-04, -1.057749995e-05 - 6.700000000e-01, +2.755906037e-19, -4.883439768e-04, -1.060408508e-05 - 6.750000000e-01, +1.075875659e-32, -3.876365251e-04, -1.055299149e-05 - 6.800000000e-01, -4.555482039e-20, -2.688096824e-04, -1.053859892e-05 - 6.850000000e-01, -3.470493289e-20, -1.493655950e-04, -1.048981357e-05 - 6.900000000e-01, -1.894121233e-20, -4.356380125e-05, -1.035389420e-05 - 6.950000000e-01, -8.741603680e-21, +3.911659346e-05, -1.023858782e-05 - 7.000000000e-01, -3.572535080e-21, +9.447258570e-05, -1.007565102e-05 - 7.050000000e-01, -1.307469592e-21, +1.229852738e-04, -9.917609434e-06 - 7.100000000e-01, -4.237295397e-22, +1.286478941e-04, -9.793335113e-06 - 7.150000000e-01, -1.161215067e-22, +1.175736039e-04, -9.663907507e-06 - 7.200000000e-01, -2.279797517e-23, +9.652004529e-05, -9.652548438e-06 - 7.250000000e-01, -3.241225490e-37, +7.161242871e-05, -9.727310860e-06 - 7.300000000e-01, +3.085370426e-24, +4.759959608e-05, -9.896316819e-06 - 7.350000000e-01, +2.126839583e-24, +2.756894501e-05, -1.026813625e-05 - 7.400000000e-01, +1.050320519e-24, +1.294607422e-05, -1.078418434e-05 - 7.450000000e-01, +4.386071853e-25, +3.814593416e-06, -1.145045983e-05 - 7.500000000e-01, +1.621928417e-25, -6.366613206e-07, -1.225967977e-05 - 7.550000000e-01, +5.371026932e-26, -1.653339755e-06, -1.314691110e-05 - 7.600000000e-01, +1.575016203e-26, -5.057467791e-07, -1.404521426e-05 - 7.650000000e-01, +3.905525687e-27, +1.663885702e-06, -1.480472274e-05 - 7.700000000e-01, +6.937989919e-28, +3.995184295e-06, -1.538482867e-05 - 7.750000000e-01, -6.993531703e-42, +6.048340572e-06, -1.565327263e-05 - 7.800000000e-01, -7.687511957e-29, +7.601180441e-06, -1.542963553e-05 - 7.850000000e-01, -4.794946636e-29, +8.567934495e-06, -1.477022199e-05 - 7.900000000e-01, -2.142601701e-29, +9.085527396e-06, -1.359843657e-05 - 7.950000000e-01, -8.095914059e-30, +9.299913331e-06, -1.187990969e-05 - 8.000000000e-01, -2.708896312e-30, +9.287294417e-06, -9.812994598e-06 - 8.050000000e-01, -8.116869824e-31, +9.184782265e-06, -7.479809281e-06 - 8.100000000e-01, -2.153708036e-31, +9.065839871e-06, -5.037331180e-06 - 8.150000000e-01, -4.832277353e-32, +8.940279716e-06, -2.728250807e-06 - 8.200000000e-01, -7.767416097e-33, +8.861585371e-06, -7.236640320e-07 - 8.250000000e-01, +2.050715652e-46, +8.796977588e-06, +8.028801679e-07 - 8.300000000e-01, +7.046440907e-34, +8.735416062e-06, +1.765191699e-06 - 8.350000000e-01, +3.976842028e-34, +8.738992323e-06, +2.081763215e-06 - 8.400000000e-01, +1.607927855e-34, +8.716531477e-06, +1.765505809e-06 - 8.450000000e-01, +5.497453374e-35, +8.667262093e-06, +9.620447578e-07 - 8.500000000e-01, +1.664403419e-35, +8.697612654e-06, -2.600829698e-07 - 8.550000000e-01, +4.512584527e-36, +8.681441510e-06, -1.715999160e-06 - 8.600000000e-01, +1.083413267e-36, +8.625250372e-06, -3.195324323e-06 - 8.650000000e-01, +2.199529168e-37, +8.658068824e-06, -4.600848996e-06 - 8.700000000e-01, +3.199079223e-38, +8.639442435e-06, -5.768606667e-06 - 8.750000000e-01, -1.264445967e-51, +8.588901994e-06, -6.637511321e-06 - 8.800000000e-01, -2.376070608e-39, +8.616915013e-06, -7.194067575e-06 - 8.850000000e-01, -1.213384435e-39, +8.589922285e-06, -7.414289973e-06 - 8.900000000e-01, -4.439123120e-40, +8.559008117e-06, -7.405000913e-06 - 8.950000000e-01, -1.373291519e-40, +8.580708575e-06, -7.203174160e-06 - 9.000000000e-01, -3.762099992e-41, +8.539498668e-06, -6.868381428e-06 - 9.050000000e-01, -9.229276070e-42, +8.532695871e-06, -6.528660551e-06 - 9.100000000e-01, -2.004965889e-42, +8.549981318e-06, -6.192772169e-06 - 9.150000000e-01, -3.683096656e-43, +8.493918796e-06, -5.904106555e-06 - 9.200000000e-01, -4.847066048e-44, +8.504901186e-06, -5.702306916e-06 - 9.250000000e-01, +2.695492675e-57, +8.519270481e-06, -5.572301828e-06 - 9.300000000e-01, +2.947503899e-45, +8.454357662e-06, -5.512355374e-06 - 9.350000000e-01, +1.361958949e-45, +8.469380876e-06, -5.485674088e-06 - 9.400000000e-01, +4.508513145e-46, +8.478211044e-06, -5.509732002e-06 - 9.450000000e-01, +1.262029305e-46, +8.414469282e-06, -5.554355657e-06 - 9.500000000e-01, +3.128294188e-47, +8.419374189e-06, -5.567367149e-06 - 9.550000000e-01, +6.944091618e-48, +8.417202524e-06, -5.612859872e-06 - 9.600000000e-01, +1.364977037e-48, +8.365207168e-06, -5.647096142e-06 - 9.650000000e-01, +2.268830361e-49, +8.353084066e-06, -5.639876317e-06 - 9.700000000e-01, +2.701707935e-50, +8.338075346e-06, -5.660136038e-06 - 9.750000000e-01, -1.705334349e-63, +8.306886626e-06, -5.666153746e-06 - 9.800000000e-01, -1.345101176e-51, +8.282612918e-06, -5.654559387e-06 - 9.850000000e-01, -5.623868195e-52, +8.262469001e-06, -5.655456939e-06 - 9.900000000e-01, -1.684515487e-52, +8.257161059e-06, -5.651787254e-06 - 9.950000000e-01, -4.266597350e-53, +8.234243055e-06, -5.652286924e-06 - 1.000000000e+00, -9.569524512e-54, +8.224075445e-06, -5.642207273e-06 + 5.000000000e-03, -8.409123651e-06, -2.279465662e-06, -7.839719442e-23 + 1.000000000e-02, -1.105147275e-05, -6.104854862e-06, +1.170088451e-22 + 1.500000000e-02, -1.228163970e-05, -7.036201019e-06, -2.707694032e-23 + 2.000000000e-02, -9.778049726e-06, -4.567147137e-06, +1.093697887e-23 + 2.500000000e-02, -6.103350322e-20, +4.433594715e-06, -1.011814796e-21 + 3.000000000e-02, +2.176144987e-05, +2.603404286e-05, +4.424584279e-21 + 3.500000000e-02, +6.083135968e-05, +6.501699663e-05, -7.691698220e-22 + 4.000000000e-02, +1.218223334e-04, +1.262776913e-04, -1.629885848e-20 + 4.500000000e-02, +2.062970799e-04, +2.118296913e-04, -1.876864239e-20 + 5.000000000e-02, +3.093579607e-04, +3.173618809e-04, -4.552537484e-20 + 5.500000000e-02, +4.154313032e-04, +4.272823161e-04, -6.347097858e-20 + 6.000000000e-02, +4.940139224e-04, +5.111171470e-04, -4.730523003e-20 + 6.500000000e-02, +4.967592192e-04, +5.206886081e-04, -5.525655577e-20 + 7.000000000e-02, +3.578593563e-04, +3.886785355e-04, -9.362705250e-20 + 7.500000000e-02, -5.771941699e-19, +3.582147265e-05, -7.427286899e-20 + 8.000000000e-02, -6.520622610e-04, -6.153389310e-04, -9.790627284e-20 + 8.500000000e-02, -1.649298690e-03, -1.619463514e-03, +2.027901756e-18 + 9.000000000e-02, -2.988610073e-03, -2.976954811e-03, +9.362346005e-18 + 9.500000000e-02, -4.579372529e-03, -4.599372030e-03, +6.903841697e-17 + 1.000000000e-01, -6.213620742e-03, -6.279384829e-03, +4.580730489e-16 + 1.050000000e-01, -7.550108895e-03, -7.673257929e-03, +2.739333014e-15 + 1.100000000e-01, -8.123884454e-03, -8.308949454e-03, +1.493028072e-14 + 1.150000000e-01, -7.391643913e-03, -7.631639645e-03, +7.464979292e-14 + 1.200000000e-01, -4.818124626e-03, -5.091253532e-03, +3.442332544e-13 + 1.250000000e-01, +4.687776326e-18, -2.676010971e-04, +1.470590246e-12 + 1.300000000e-01, +7.187797314e-03, +6.979916447e-03, +5.841622865e-12 + 1.350000000e-01, +1.645040606e-02, +1.636584859e-02, +2.163951405e-11 + 1.400000000e-01, +2.697224625e-02, +2.707472498e-02, +7.492256935e-11 + 1.450000000e-01, +3.739593417e-02, +3.773684453e-02, +2.428410296e-10 + 1.500000000e-01, +4.591279224e-02, +4.651714030e-02, +7.375232547e-10 + 1.550000000e-01, +5.047923110e-02, +5.133402751e-02, +2.099169990e-09 + 1.600000000e-01, +4.914663699e-02, +5.019442015e-02, +5.595281428e-09 + 1.650000000e-01, +4.046146992e-02, +4.160106921e-02, +1.394044470e-08 + 1.700000000e-01, +2.386432750e-02, +2.496072306e-02, +3.234971896e-08 + 1.750000000e-01, -4.859694655e-17, +9.027416975e-04, +6.949217072e-08 + 1.800000000e-01, -2.914795543e-02, -2.858089172e-02, +1.367183148e-07 + 1.850000000e-01, -6.036142013e-02, -6.023860350e-02, +2.414876124e-07 + 1.900000000e-01, -8.955101123e-02, -8.992623717e-02, +3.669644295e-07 + 1.950000000e-01, -1.123435949e-01, -1.132034053e-01, +4.251097635e-07 + 2.000000000e-01, -1.248039088e-01, -1.260674341e-01, +1.683790015e-07 + 2.050000000e-01, -1.241588739e-01, -1.256901005e-01, -9.484948802e-07 + 2.100000000e-01, -1.093778521e-01, -1.110084115e-01, -3.942300074e-06 + 2.150000000e-01, -8.147939460e-02, -8.303731511e-02, -1.045263549e-05 + 2.200000000e-01, -4.348363979e-02, -4.482170606e-02, -2.275556912e-05 + 2.250000000e-01, +2.632536371e-16, -1.017952044e-03, -4.348024829e-05 + 2.300000000e-01, +4.348363979e-02, +4.282753850e-02, -7.487578040e-05 + 2.350000000e-01, +8.147939460e-02, +8.116905378e-02, -1.175591281e-04 + 2.400000000e-01, +1.093778521e-01, +1.093513159e-01, -1.688169295e-04 + 2.450000000e-01, +1.241588739e-01, +1.243278841e-01, -2.206716002e-04 + 2.500000000e-01, +1.248039088e-01, +1.250757389e-01, -2.580032167e-04 + 2.550000000e-01, +1.123435949e-01, +1.126400748e-01, -2.570919151e-04 + 2.600000000e-01, +8.955101123e-02, +8.982093901e-02, -1.851633285e-04 + 2.650000000e-01, +6.036142013e-02, +6.058437068e-02, -1.964802777e-06 + 2.700000000e-01, +2.914795543e-02, +2.933003651e-02, +3.351637337e-04 + 2.750000000e-01, +4.859694655e-17, +1.640427998e-04, +8.613977632e-04 + 2.800000000e-01, -2.386432750e-02, -2.369071496e-02, +1.589515815e-03 + 2.850000000e-01, -4.046146992e-02, -4.025665607e-02, +2.491580354e-03 + 2.900000000e-01, -4.914663699e-02, -4.890201756e-02, +3.480456981e-03 + 2.950000000e-01, -5.047923110e-02, -5.020114773e-02, +4.395397497e-03 + 3.000000000e-01, -4.591279224e-02, -4.562002034e-02, +4.996810327e-03 + 3.050000000e-01, -3.739593417e-02, -3.711414519e-02, +4.976662349e-03 + 3.100000000e-01, -2.697224625e-02, -2.672715670e-02, +3.991203041e-03 + 3.150000000e-01, -1.645040606e-02, -1.626186385e-02, +1.719372564e-03 + 3.200000000e-01, -7.187797314e-03, -7.066117973e-03, -2.056655061e-03 + 3.250000000e-01, -3.446700285e-16, +5.515284079e-05, -7.359718567e-03 + 3.300000000e-01, +4.818124626e-03, +4.816373419e-03, -1.393072938e-02 + 3.350000000e-01, +7.391643913e-03, +7.348724034e-03, -2.116683910e-02 + 3.400000000e-01, +8.123884454e-03, +8.057868855e-03, -2.810995880e-02 + 3.450000000e-01, +7.550108895e-03, +7.478016722e-03, -3.350900948e-02 + 3.500000000e-01, +6.213620742e-03, +6.148880085e-03, -3.596472910e-02 + 3.550000000e-01, +4.579372529e-03, +4.530523902e-03, -3.414856600e-02 + 3.600000000e-01, +2.988610073e-03, +2.959359024e-03, -2.707212456e-02 + 3.650000000e-01, +1.649298690e-03, +1.639328932e-03, -1.436348176e-02 + 3.700000000e-01, +6.520622610e-04, +6.582728629e-04, +3.510075664e-03 + 3.750000000e-01, +5.639207957e-17, +1.796645354e-05, +2.513348171e-02 + 3.800000000e-01, -3.578593563e-04, -3.327071839e-04, +4.819660675e-02 + 3.850000000e-01, -4.967592192e-04, -4.683632875e-04, +6.972958070e-02 + 3.900000000e-01, -4.940139224e-04, -4.652574359e-04, +8.650614931e-02 + 3.950000000e-01, -4.154313032e-04, -3.880626459e-04, +9.556165602e-02 + 4.000000000e-01, -3.093579607e-04, -2.841655685e-04, +9.473491778e-02 + 4.050000000e-01, -2.062970799e-04, -1.833980203e-04, +8.312602269e-02 + 4.100000000e-01, -1.218223334e-04, -1.009159268e-04, +6.137225831e-02 + 4.150000000e-01, -6.083135968e-05, -4.143379152e-05, +3.166750253e-02 + 4.200000000e-01, -2.176144987e-05, -3.413327503e-06, -2.502664187e-03 + 4.250000000e-01, -2.551434914e-18, +1.765295201e-05, -3.687209560e-02 + 4.300000000e-01, +9.778049726e-06, +2.695409360e-05, -6.706467438e-02 + 4.350000000e-01, +1.228163970e-05, +2.907159974e-05, -8.930220077e-02 + 4.400000000e-01, +1.105147275e-05, +2.746797228e-05, -1.010097188e-01 + 4.450000000e-01, +8.409123651e-06, +2.444125815e-05, -1.012031705e-01 + 4.500000000e-01, +5.666088695e-06, +2.136804349e-05, -9.058961021e-02 + 4.550000000e-01, +3.418894541e-06, +1.895897465e-05, -7.136646204e-02 + 4.600000000e-01, +1.826796159e-06, +1.756237934e-05, -4.677362695e-02 + 4.650000000e-01, +8.253938937e-07, +1.743332128e-05, -2.049672395e-02 + 4.700000000e-01, +2.671727168e-07, +1.876789954e-05, +3.957473555e-03 + 4.750000000e-01, +3.777032805e-20, +2.175086078e-05, +2.379025635e-02 + 4.800000000e-01, -9.828734975e-08, +2.657695713e-05, +3.725825407e-02 + 4.850000000e-01, -1.117049164e-07, +3.330104452e-05, +4.379671298e-02 + 4.900000000e-01, -9.095082526e-08, +4.170350643e-05, +4.392096744e-02 + 4.950000000e-01, -6.261923782e-08, +5.118467434e-05, +3.895956705e-02 + 5.000000000e-01, -3.817780532e-08, +6.061063807e-05, +3.069570799e-02 + 5.050000000e-01, -2.084413355e-08, +6.816903568e-05, +2.099548354e-02 + 5.100000000e-01, -1.007763869e-08, +7.142099286e-05, +1.149684149e-02 + 5.150000000e-01, -4.120031130e-09, +6.750284534e-05, +3.404389962e-03 + 5.200000000e-01, -1.206707201e-09, +5.335700038e-05, -2.596439422e-03 + 5.250000000e-01, -1.928824299e-22, +2.625146628e-05, -6.315069825e-03 + 5.300000000e-01, +3.634532244e-10, -1.552134088e-05, -7.952742048e-03 + 5.350000000e-01, +3.737607916e-10, -7.202719971e-05, -7.959639543e-03 + 5.400000000e-01, +2.753586026e-10, -1.410093202e-04, -6.888529679e-03 + 5.450000000e-01, +1.715419466e-10, -2.173742296e-04, -5.273858845e-03 + 5.500000000e-01, +9.463331804e-11, -2.931597192e-04, -3.550333615e-03 + 5.550000000e-01, +4.675063429e-11, -3.579618849e-04, -2.014773065e-03 + 5.600000000e-01, +2.045186871e-11, -3.998812035e-04, -8.252634844e-04 + 5.650000000e-01, +7.565632846e-12, -4.070350711e-04, -2.442607166e-05 + 5.700000000e-01, +2.005013126e-12, -3.694979154e-04, +4.246687144e-04 + 5.750000000e-01, +2.328620401e-25, -2.813096150e-04, +6.014263940e-04 + 5.800000000e-01, -4.944301496e-13, -1.422343696e-04, +5.974101003e-04 + 5.850000000e-01, -4.600666072e-13, +4.102954713e-05, +4.951301922e-04 + 5.900000000e-01, -3.066875683e-13, +2.546795560e-04, +3.575043451e-04 + 5.950000000e-01, -1.728774743e-13, +4.788184074e-04, +2.251682012e-04 + 6.000000000e-01, -8.629441606e-14, +6.895532949e-04, +1.186460332e-04 + 6.050000000e-01, -3.857417852e-14, +8.620838886e-04, +4.420791914e-05 + 6.100000000e-01, -1.526907493e-14, +9.742885967e-04, -7.459663553e-07 + 6.150000000e-01, -5.110878347e-15, +1.010208865e-03, -2.328504679e-05 + 6.200000000e-01, -1.225569810e-15, +9.627989535e-04, -3.093322175e-05 + 6.250000000e-01, -9.083457823e-29, +8.353546600e-04, -3.016656516e-05 + 6.300000000e-01, +2.474382771e-16, +6.413796771e-04, -2.584275785e-05 + 6.350000000e-01, +2.083306657e-16, +4.027956922e-04, -2.078981253e-05 + 6.400000000e-01, +1.256606244e-16, +1.467524989e-04, -1.643811493e-05 + 6.450000000e-01, +6.409320687e-17, -9.835475273e-05, -1.328671369e-05 + 6.500000000e-01, +2.894855159e-17, -3.070111476e-04, -1.131502933e-05 + 6.550000000e-01, +1.170877290e-17, -4.600908525e-04, -1.025317804e-05 + 6.600000000e-01, +4.193705940e-18, -5.471396387e-04, -9.706105426e-06 + 6.650000000e-01, +1.270139270e-18, -5.671313952e-04, -9.526876864e-06 + 6.700000000e-01, +2.755906037e-19, -5.276925104e-04, -9.521317211e-06 + 6.750000000e-01, +1.075875659e-32, -4.430280566e-04, -9.477545467e-06 + 6.800000000e-01, -4.555482039e-20, -3.309499348e-04, -9.477102683e-06 + 6.850000000e-01, -3.470493289e-20, -2.097697246e-04, -9.446533141e-06 + 6.900000000e-01, -1.894121233e-20, -9.564568528e-05, -9.331259232e-06 + 6.950000000e-01, -8.741603680e-21, -5.625602380e-07, -9.227514481e-06 + 7.000000000e-01, -3.572535080e-21, +6.867626495e-05, -9.073042578e-06 + 7.050000000e-01, -1.307469592e-21, +1.103054361e-04, -8.914323226e-06 + 7.100000000e-01, -4.237295397e-22, +1.267155478e-04, -8.778201838e-06 + 7.150000000e-01, -1.161215067e-22, +1.231694394e-04, -8.627829141e-06 + 7.200000000e-01, -2.279797517e-23, +1.062866531e-04, -8.576006165e-06 + 7.250000000e-01, -3.241225490e-37, +8.261317002e-05, -8.597059341e-06 + 7.300000000e-01, +3.085370426e-24, +5.765268061e-05, -8.700306293e-06 + 7.350000000e-01, +2.126839583e-24, +3.535644802e-05, -8.990756857e-06 + 7.400000000e-01, +1.050320519e-24, +1.794830440e-05, -9.423853067e-06 + 7.450000000e-01, +4.386071853e-25, +6.128138190e-06, -1.001308981e-05 + 7.500000000e-01, +1.621928417e-25, -5.286416331e-07, -1.076106793e-05 + 7.550000000e-01, +5.371026932e-26, -3.101809758e-06, -1.161713053e-05 + 7.600000000e-01, +1.575016203e-26, -2.870251878e-06, -1.252639149e-05 + 7.650000000e-01, +3.905525687e-27, -1.086961146e-06, -1.335220364e-05 + 7.700000000e-01, +6.937989919e-28, +1.230051725e-06, -1.405215379e-05 + 7.750000000e-01, -6.993531703e-42, +3.475909312e-06, -1.449622845e-05 + 7.800000000e-01, -7.687511957e-29, +5.301100405e-06, -1.450015792e-05 + 7.850000000e-01, -4.794946636e-29, +6.537642734e-06, -1.409140181e-05 + 7.900000000e-01, -2.142601701e-29, +7.270243667e-06, -1.317687982e-05 + 7.950000000e-01, -8.095914059e-30, +7.629935703e-06, -1.169832613e-05 + 8.000000000e-01, -2.708896312e-30, +7.703087171e-06, -9.815300571e-06 + 8.050000000e-01, -8.116869824e-31, +7.638070444e-06, -7.591879578e-06 + 8.100000000e-01, -2.153708036e-31, +7.525634749e-06, -5.168555502e-06 + 8.150000000e-01, -4.832277353e-32, +7.392393462e-06, -2.776790037e-06 + 8.200000000e-01, -7.767416097e-33, +7.298856628e-06, -5.955027059e-07 + 8.250000000e-01, +2.050715652e-46, +7.221644401e-06, +1.184811727e-06 + 8.300000000e-01, +7.046440907e-34, +7.151386568e-06, +2.448602212e-06 + 8.350000000e-01, +3.976842028e-34, +7.145569631e-06, +3.084239890e-06 + 8.400000000e-01, +1.607927855e-34, +7.120905564e-06, +3.069195571e-06 + 8.450000000e-01, +5.497453374e-35, +7.072669373e-06, +2.513282400e-06 + 8.500000000e-01, +1.664403419e-35, +7.098255334e-06, +1.468614583e-06 + 8.550000000e-01, +4.512584527e-36, +7.083647648e-06, +1.049390248e-07 + 8.600000000e-01, +1.083413267e-36, +7.031003144e-06, -1.370162520e-06 + 8.650000000e-01, +2.199529168e-37, +7.059239847e-06, -2.843337345e-06 + 8.700000000e-01, +3.199079223e-38, +7.042162596e-06, -4.135744192e-06 + 8.750000000e-01, -1.264445967e-51, +6.994434700e-06, -5.160739942e-06 + 8.800000000e-01, -2.376070608e-39, +7.018235462e-06, -5.879989487e-06 + 8.850000000e-01, -1.213384435e-39, +6.992994840e-06, -6.251503897e-06 + 8.900000000e-01, -4.439123120e-40, +6.963005224e-06, -6.361764416e-06 + 8.950000000e-01, -1.373291519e-40, +6.981556219e-06, -6.243466006e-06 + 9.000000000e-01, -3.762099992e-41, +6.943067937e-06, -5.955312166e-06 + 9.050000000e-01, -9.229276070e-42, +6.934956605e-06, -5.624901710e-06 + 9.100000000e-01, -2.004965889e-42, +6.950190011e-06, -5.274163619e-06 + 9.150000000e-01, -3.683096656e-43, +6.898186604e-06, -4.954940491e-06 + 9.200000000e-01, -4.847066048e-44, +6.906297954e-06, -4.714449048e-06 + 9.250000000e-01, +2.695492675e-57, +6.919489159e-06, -4.547087289e-06 + 9.300000000e-01, +2.947503899e-45, +6.859734325e-06, -4.455716460e-06 + 9.350000000e-01, +1.361958949e-45, +6.871729450e-06, -4.407401579e-06 + 9.400000000e-01, +4.508513145e-46, +6.880083711e-06, -4.416745311e-06 + 9.450000000e-01, +1.262029305e-46, +6.821626996e-06, -4.454645761e-06 + 9.500000000e-01, +3.128294188e-47, +6.824531932e-06, -4.469286482e-06 + 9.550000000e-01, +6.944091618e-48, +6.822281822e-06, -4.516015523e-06 + 9.600000000e-01, +1.364977037e-48, +6.774092686e-06, -4.554107840e-06 + 9.650000000e-01, +2.268830361e-49, +6.761097990e-06, -4.553323344e-06 + 9.700000000e-01, +2.701707935e-50, +6.745674152e-06, -4.575690441e-06 + 9.750000000e-01, -1.705334349e-63, +6.715192958e-06, -4.584090223e-06 + 9.800000000e-01, -1.345101176e-51, +6.690264706e-06, -4.574936988e-06 + 9.850000000e-01, -5.623868195e-52, +6.668524663e-06, -4.575957586e-06 + 9.900000000e-01, -1.684515487e-52, +6.660450423e-06, -4.572317693e-06 + 9.950000000e-01, -4.266597350e-53, +6.636345082e-06, -4.572399297e-06 + 1.000000000e+00, -9.569524512e-54, +6.623360227e-06, -4.562702280e-06 diff --git a/test/examples/ref/coaxial/matched/port-V.csv b/test/examples/ref/coaxial/matched/port-V.csv index 10dcd57bd..4bafdcb71 100644 --- a/test/examples/ref/coaxial/matched/port-V.csv +++ b/test/examples/ref/coaxial/matched/port-V.csv @@ -1,202 +1,202 @@ t (ns), V_inc[1] (V), V[1] (V), V[2] (V) 0.000000000e+00, -2.833044348e-04, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-03, -4.204561825e-04, -1.409600057e-04, -7.065025010e-22 - 1.000000000e-02, -5.525736376e-04, -2.576208519e-04, +7.355219580e-22 - 1.500000000e-02, -6.140819852e-04, -2.326884943e-04, -2.563099469e-21 - 2.000000000e-02, -4.889024863e-04, +1.474786102e-05, +1.518754000e-21 - 2.500000000e-02, -3.051675161e-18, +7.795612050e-04, +3.585259403e-21 - 3.000000000e-02, +1.088072493e-03, +2.242751383e-03, +3.324873970e-20 - 3.500000000e-02, +3.041567984e-03, +4.700349857e-03, -4.357614796e-20 - 4.000000000e-02, +6.091116670e-03, +8.325047125e-03, -1.453078174e-19 - 4.500000000e-02, +1.031485399e-02, +1.305720735e-02, +5.218929725e-19 - 5.000000000e-02, +1.546789803e-02, +1.841840504e-02, +2.094813507e-18 - 5.500000000e-02, +2.077156516e-02, +2.329007028e-02, +6.211609663e-18 - 6.000000000e-02, +2.470069612e-02, +2.573350592e-02, +1.258410575e-17 - 6.500000000e-02, +2.483796096e-02, +2.286439221e-02, +1.996232885e-17 - 7.000000000e-02, +1.789296781e-02, +1.105721800e-02, +3.191952100e-17 - 7.500000000e-02, -2.885970849e-17, -1.359924149e-02, +4.296762487e-17 - 8.000000000e-02, -3.260311305e-02, -5.445708636e-02, +5.202357082e-17 - 8.500000000e-02, -8.246493451e-02, -1.129251561e-01, +5.018595388e-17 - 9.000000000e-02, -1.494305036e-01, -1.868767856e-01, -5.072140379e-17 - 9.500000000e-02, -2.289686265e-01, -2.690380943e-01, -8.271882542e-16 - 1.000000000e-01, -3.106810371e-01, -3.457241810e-01, -6.464935015e-15 - 1.050000000e-01, -3.775054448e-01, -3.966135813e-01, -4.360696273e-14 - 1.100000000e-01, -4.061942227e-01, -3.960888280e-01, -2.657942380e-13 - 1.150000000e-01, -3.695821957e-01, -3.165165359e-01, -1.477441795e-12 - 1.200000000e-01, -2.409062313e-01, -1.335577495e-01, -7.523446889e-12 - 1.250000000e-01, +2.343888163e-16, +1.669052709e-01, -3.524511866e-11 - 1.300000000e-01, +3.593898657e-01, +5.813329112e-01, -1.524346445e-10 - 1.350000000e-01, +8.225203029e-01, +1.082240954e+00, -6.103302356e-10 - 1.400000000e-01, +1.348612313e+00, +1.614902943e+00, -2.266738995e-09 - 1.450000000e-01, +1.869796708e+00, +2.098941344e+00, -7.818317347e-09 - 1.500000000e-01, +2.295639612e+00, +2.436078661e+00, -2.505256901e-08 - 1.550000000e-01, +2.523961555e+00, +2.524037283e+00, -7.453130113e-08 - 1.600000000e-01, +2.457331849e+00, +2.275240314e+00, -2.054617401e-07 - 1.650000000e-01, +2.023073496e+00, +1.637412542e+00, -5.228484809e-07 - 1.700000000e-01, +1.193216375e+00, +6.119189859e-01, -1.219855759e-06 - 1.750000000e-01, -2.429847328e-15, -7.346571262e-01, -2.577283135e-06 - 1.800000000e-01, -1.457397771e+00, -2.269579629e+00, -4.813196755e-06 - 1.850000000e-01, -3.018071006e+00, -3.805872481e+00, -7.513694327e-06 - 1.900000000e-01, -4.477550561e+00, -5.126751444e+00, -8.149015105e-06 - 1.950000000e-01, -5.617179743e+00, -6.019342246e+00, +1.044727103e-06 - 2.000000000e-01, -6.240195442e+00, -6.311939346e+00, +3.853765840e-05 - 2.050000000e-01, -6.207943693e+00, -5.907639100e+00, +1.414483142e-04 - 2.100000000e-01, -5.468892605e+00, -4.807164232e+00, +3.744681409e-04 - 2.150000000e-01, -4.073969730e+00, -3.115417780e+00, +8.356160256e-04 - 2.200000000e-01, -2.174181990e+00, -1.029451119e+00, +1.651681686e-03 - 2.250000000e-01, +1.316268185e-14, +1.190700710e+00, +2.954594235e-03 - 2.300000000e-01, +2.174181990e+00, +3.263171034e+00, +4.831689891e-03 - 2.350000000e-01, +4.073969730e+00, +4.929624194e+00, +7.248747652e-03 - 2.400000000e-01, +5.468892605e+00, +5.996135954e+00, +9.953016866e-03 - 2.450000000e-01, +6.207943693e+00, +6.361863081e+00, +1.237084403e-02 - 2.500000000e-01, +6.240195442e+00, +6.030465394e+00, +1.351923938e-02 - 2.550000000e-01, +5.617179743e+00, +5.102911694e+00, +1.195634414e-02 - 2.600000000e-01, +4.477550561e+00, +3.754115651e+00, +5.808943939e-03 - 2.650000000e-01, +3.018071006e+00, +2.198951398e+00, -7.064134345e-03 - 2.700000000e-01, +1.457397771e+00, +6.548446195e-01, -2.870189023e-02 - 2.750000000e-01, +2.429847328e-15, -6.918569599e-01, -6.041671749e-02 - 2.800000000e-01, -1.193216375e+00, -1.710040781e+00, -1.019395026e-01 - 2.850000000e-01, -2.023073496e+00, -2.335368116e+00, -1.504557955e-01 - 2.900000000e-01, -2.457331849e+00, -2.568925943e+00, -1.997374431e-01 - 2.950000000e-01, -2.523961555e+00, -2.465273997e+00, -2.396244008e-01 - 3.000000000e-01, -2.295639612e+00, -2.113823015e+00, -2.561476460e-01 - 3.050000000e-01, -1.869796708e+00, -1.618090956e+00, -2.326094424e-01 - 3.100000000e-01, -1.348612313e+00, -1.076964915e+00, -1.518810973e-01 - 3.150000000e-01, -8.225203029e-01, -5.708552879e-01, +5.185395437e-05 - 3.200000000e-01, -3.593898657e-01, -1.541107217e-01, +2.296443952e-01 - 3.250000000e-01, -1.723350142e-14, +1.464156590e-01, +5.311674272e-01 - 3.300000000e-01, +2.409062313e-01, +3.279265045e-01, +8.828837089e-01 - 3.350000000e-01, +3.695821957e-01, +4.052334072e-01, +1.245160107e+00 - 3.400000000e-01, +4.061942227e-01, +4.032439626e-01, +1.561699206e+00 - 3.450000000e-01, +3.775054448e-01, +3.500077406e-01, +1.764787787e+00 - 3.500000000e-01, +3.106810371e-01, +2.713870161e-01, +1.784645945e+00 - 3.550000000e-01, +2.289686265e-01, +1.877927792e-01, +1.561951650e+00 - 3.600000000e-01, +1.494305036e-01, +1.128968877e-01, +1.061780726e+00 - 3.650000000e-01, +8.246493451e-02, +5.391049559e-02, +2.863914189e-01 - 3.700000000e-01, +3.260311305e-02, +1.284591036e-02, -7.162781124e-01 - 3.750000000e-01, +2.819603979e-15, -1.182022239e-02, -1.851213803e+00 - 3.800000000e-01, -1.789296781e-02, -2.351019402e-02, -2.983752401e+00 - 3.850000000e-01, -2.483796096e-02, -2.621899367e-02, -3.955981754e+00 - 3.900000000e-01, -2.470069612e-02, -2.362449606e-02, -4.610308897e+00 - 3.950000000e-01, -2.077156516e-02, -1.861444469e-02, -4.816526959e+00 - 4.000000000e-01, -1.546789803e-02, -1.314920402e-02, -4.497345847e+00 - 4.050000000e-01, -1.031485399e-02, -8.346306034e-03, -3.646974757e+00 - 4.100000000e-01, -6.091116670e-03, -4.677032350e-03, -2.338414572e+00 - 4.150000000e-01, -3.041567984e-03, -2.189017142e-03, -7.170344774e-01 - 4.200000000e-01, -1.088072493e-03, -6.991559093e-04, +1.019447008e+00 - 4.250000000e-01, -1.275717457e-16, +5.983943068e-05, +2.651299771e+00 - 4.300000000e-01, +4.889024863e-04, +3.482667180e-04, +3.971885932e+00 - 4.350000000e-01, +6.140819852e-04, +3.759000372e-04, +4.821023188e+00 - 4.400000000e-01, +5.525736376e-04, +2.873616975e-04, +5.110069251e+00 - 4.450000000e-01, +4.204561825e-04, +1.683533549e-04, +4.833945014e+00 - 4.500000000e-01, +2.833044348e-04, +5.840276447e-05, +4.068229638e+00 - 4.550000000e-01, +1.709447271e-04, -3.460452761e-05, +2.952323921e+00 - 4.600000000e-01, +9.133980795e-05, -1.213167970e-04, +1.662611239e+00 - 4.650000000e-01, +4.126969468e-05, -2.247850949e-04, +3.814002002e-01 - 4.700000000e-01, +1.335863584e-05, -3.714260878e-04, -7.323240470e-01 - 4.750000000e-01, +1.888516403e-18, -5.840881991e-04, -1.564952185e+00 - 4.800000000e-01, -4.914367487e-06, -8.800311375e-04, -2.059783005e+00 - 4.850000000e-01, -5.585245819e-06, -1.263204165e-03, -2.217344593e+00 - 4.900000000e-01, -4.547541263e-06, -1.717016487e-03, -2.085836435e+00 - 4.950000000e-01, -3.130961891e-06, -2.199608208e-03, -1.744988904e+00 - 5.000000000e-01, -1.908890266e-06, -2.638129587e-03, -1.287530485e+00 - 5.050000000e-01, -1.042206678e-06, -2.925654745e-03, -8.019420813e-01 - 5.100000000e-01, -5.038819347e-07, -2.925710702e-03, -3.594825000e-01 - 5.150000000e-01, -2.060015565e-07, -2.486898422e-03, -7.068037757e-03 - 5.200000000e-01, -6.033536005e-08, -1.461462181e-03, +2.340857894e-01 - 5.250000000e-01, -9.644121496e-21, +2.670676290e-04, +3.650797909e-01 - 5.300000000e-01, +1.817266122e-08, +2.745963771e-03, +4.029752127e-01 - 5.350000000e-01, +1.868803958e-08, +5.920952895e-03, +3.734543298e-01 - 5.400000000e-01, +1.376793013e-08, +9.608417595e-03, +3.040643732e-01 - 5.450000000e-01, +8.577097330e-09, +1.347787791e-02, +2.191669372e-01 - 5.500000000e-01, +4.731665902e-09, +1.706208865e-02, +1.370115961e-01 - 5.550000000e-01, +2.337531714e-09, +1.979353858e-02, +6.880241134e-02 - 5.600000000e-01, +1.022593435e-09, +2.106673855e-02, +1.934780782e-02 - 5.650000000e-01, +3.782816423e-10, +2.032542986e-02, -1.140498191e-02 - 5.700000000e-01, +1.002506563e-10, +1.716371901e-02, -2.652872335e-02 - 5.750000000e-01, +1.164310201e-23, +1.142372253e-02, -3.039457739e-02 - 5.800000000e-01, -2.472150748e-11, +3.269211519e-03, -2.740402965e-02 - 5.850000000e-01, -2.300333036e-11, -6.778765468e-03, -2.120230059e-02 - 5.900000000e-01, -1.533437842e-11, -1.786172846e-02, -1.435075564e-02 - 5.950000000e-01, -8.643873713e-12, -2.886598462e-02, -8.356385772e-03 - 6.000000000e-01, -4.314720803e-12, -3.855455488e-02, -3.856058884e-03 - 6.050000000e-01, -1.928708926e-12, -4.573671061e-02, -9.082145266e-04 - 6.100000000e-01, -7.634537466e-13, -4.944887481e-02, +7.345543029e-04 - 6.150000000e-01, -2.555439173e-13, -4.911210254e-02, +1.451637753e-03 - 6.200000000e-01, -6.127849048e-14, -4.463876552e-02, +1.601088435e-03 - 6.250000000e-01, -4.541728911e-27, -3.646351194e-02, +1.457035628e-03 - 6.300000000e-01, +1.237191386e-14, -2.549198509e-02, +1.214468570e-03 - 6.350000000e-01, +1.041653328e-14, -1.297418192e-02, +9.777603934e-04 - 6.400000000e-01, +6.283031218e-15, -3.201355725e-04, +7.903500373e-04 - 6.450000000e-01, +3.204660344e-15, +1.110618470e-02, +6.640241528e-04 - 6.500000000e-01, +1.447427579e-15, +2.017987189e-02, +5.887787166e-04 - 6.550000000e-01, +5.854386450e-16, +2.616180763e-02, +5.512134172e-04 - 6.600000000e-01, +2.096852970e-16, +2.877361679e-02, +5.342434883e-04 - 6.650000000e-01, +6.350696352e-17, +2.819468642e-02, +5.282493485e-04 - 6.700000000e-01, +1.377953018e-17, +2.498716492e-02, +5.294303063e-04 - 6.750000000e-01, +5.379378296e-31, +1.996830069e-02, +5.280144797e-04 - 6.800000000e-01, -2.277741020e-18, +1.405591714e-02, +5.258506449e-04 - 6.850000000e-01, -1.735246645e-18, +8.119046347e-03, +5.240596636e-04 - 6.900000000e-01, -9.470606165e-19, +2.863116087e-03, +5.174405378e-04 - 6.950000000e-01, -4.370801840e-19, -1.243144561e-03, +5.109035105e-04 - 7.000000000e-01, -1.786267540e-19, -3.991882372e-03, +5.037114564e-04 - 7.050000000e-01, -6.537347961e-20, -5.408196638e-03, +4.949700531e-04 - 7.100000000e-01, -2.118647699e-20, -5.691326856e-03, +4.888830568e-04 - 7.150000000e-01, -5.806075333e-21, -5.144242785e-03, +4.831363177e-04 - 7.200000000e-01, -1.139898758e-21, -4.101378065e-03, +4.814481570e-04 - 7.250000000e-01, -1.620612745e-35, -2.866853276e-03, +4.859252288e-04 - 7.300000000e-01, +1.542685213e-22, -1.676051854e-03, +4.946064917e-04 - 7.350000000e-01, +1.063419792e-22, -6.817245666e-04, +5.126814873e-04 - 7.400000000e-01, +5.251602594e-23, +4.504131415e-05, +5.391309966e-04 - 7.450000000e-01, +2.193035927e-23, +5.001051580e-04, +5.722673601e-04 - 7.500000000e-01, +8.109642085e-24, +7.228963385e-04, +6.131672878e-04 - 7.550000000e-01, +2.685513466e-24, +7.748034491e-04, +6.573816257e-04 - 7.600000000e-01, +7.875081013e-25, +7.197485006e-04, +7.019729730e-04 - 7.650000000e-01, +1.952762843e-25, +6.131998820e-04, +7.409232450e-04 - 7.700000000e-01, +3.468994959e-26, +4.974511884e-04, +7.687674363e-04 - 7.750000000e-01, -3.496765852e-40, +3.961202656e-04, +7.819734488e-04 - 7.800000000e-01, -3.843755978e-27, +3.192304693e-04, +7.716090100e-04 - 7.850000000e-01, -2.397473318e-27, +2.704230224e-04, +7.370532023e-04 - 7.900000000e-01, -1.071300850e-27, +2.447243075e-04, +6.785655444e-04 - 7.950000000e-01, -4.047957029e-28, +2.340727089e-04, +5.930049452e-04 - 8.000000000e-01, -1.354448156e-28, +2.340860218e-04, +4.887276360e-04 - 8.050000000e-01, -4.058434912e-29, +2.393559068e-04, +3.725386066e-04 - 8.100000000e-01, -1.076854018e-29, +2.451595087e-04, +2.505379173e-04 - 8.150000000e-01, -2.416138676e-30, +2.510675527e-04, +1.354236798e-04 - 8.200000000e-01, -3.883708049e-31, +2.555979492e-04, +3.567358407e-05 - 8.250000000e-01, +1.025357826e-44, +2.583698402e-04, -4.055743801e-05 - 8.300000000e-01, +3.523220453e-32, +2.611145307e-04, -8.754999295e-05 - 8.350000000e-01, +1.988421014e-32, +2.620413397e-04, -1.034770143e-04 - 8.400000000e-01, +8.039639276e-33, +2.623297718e-04, -8.760789565e-05 - 8.450000000e-01, +2.748726687e-33, +2.643788438e-04, -4.661869457e-05 - 8.500000000e-01, +8.322017093e-34, +2.643182022e-04, +1.368860737e-05 - 8.550000000e-01, +2.256292263e-34, +2.640282981e-04, +8.654552627e-05 - 8.600000000e-01, +5.417066333e-35, +2.664805994e-04, +1.604377192e-04 - 8.650000000e-01, +1.099764584e-35, +2.663099299e-04, +2.298583029e-04 - 8.700000000e-01, +1.599539611e-36, +2.660179833e-04, +2.884951850e-04 - 8.750000000e-01, -6.322229835e-50, +2.685199977e-04, +3.312510073e-04 - 8.800000000e-01, -1.188035304e-37, +2.682320543e-04, +3.588965710e-04 - 8.850000000e-01, -6.066922176e-38, +2.683112577e-04, +3.703232739e-04 - 8.900000000e-01, -2.219561560e-38, +2.703935497e-04, +3.691403729e-04 - 8.950000000e-01, -6.866457597e-39, +2.698472648e-04, +3.595329065e-04 - 9.000000000e-01, -1.881049996e-39, +2.706207341e-04, +3.430582636e-04 - 9.050000000e-01, -4.614638035e-40, +2.720917241e-04, +3.257219082e-04 - 9.100000000e-01, -1.002482944e-40, +2.712077240e-04, +3.094350820e-04 - 9.150000000e-01, -1.841548328e-41, +2.727529161e-04, +2.949318868e-04 - 9.200000000e-01, -2.423533024e-42, +2.737196170e-04, +2.849869738e-04 - 9.250000000e-01, +1.347746337e-55, +2.726148010e-04, +2.784579250e-04 - 9.300000000e-01, +1.473751950e-43, +2.747448133e-04, +2.752833428e-04 - 9.350000000e-01, +6.809794745e-44, +2.755175735e-04, +2.744736032e-04 - 9.400000000e-01, +2.254256572e-44, +2.745679107e-04, +2.750627722e-04 - 9.450000000e-01, +6.310146526e-45, +2.769515396e-04, +2.773500805e-04 - 9.500000000e-01, +1.564147094e-45, +2.778453197e-04, +2.785762868e-04 - 9.550000000e-01, +3.472045809e-46, +2.775231024e-04, +2.800349953e-04 - 9.600000000e-01, +6.824885183e-47, +2.797715846e-04, +2.820823759e-04 - 9.650000000e-01, +1.134415180e-47, +2.808776348e-04, +2.820074542e-04 - 9.700000000e-01, +1.350853967e-48, +2.813963412e-04, +2.824884529e-04 - 9.750000000e-01, -8.526671746e-62, +2.830541451e-04, +2.831324775e-04 - 9.800000000e-01, -6.725505882e-50, +2.841141505e-04, +2.824722431e-04 - 9.850000000e-01, -2.811934097e-50, +2.851491801e-04, +2.825206898e-04 - 9.900000000e-01, -8.422577434e-51, +2.857589547e-04, +2.823771225e-04 - 9.950000000e-01, -2.133298675e-51, +2.863310142e-04, +2.821945750e-04 - 1.000000000e+00, -4.784762256e-52, +2.871423693e-04, +2.820923983e-04 + 5.000000000e-03, -4.204561825e-04, -1.372355600e-04, -5.065452825e-22 + 1.000000000e-02, -5.525736376e-04, -2.768477037e-04, +1.575763957e-21 + 1.500000000e-02, -6.140819852e-04, -3.268163859e-04, -1.032798000e-21 + 2.000000000e-02, -4.889024863e-04, -2.310789623e-04, +1.869605058e-21 + 2.500000000e-02, -3.051675161e-18, +2.666703698e-04, +3.212734954e-22 + 3.000000000e-02, +1.088072493e-03, +1.333462552e-03, +6.574010005e-20 + 3.500000000e-02, +3.041567984e-03, +3.267358426e-03, +1.233270725e-19 + 4.000000000e-02, +6.091116670e-03, +6.298866841e-03, +2.340011443e-19 + 4.500000000e-02, +1.031485399e-02, +1.050499965e-02, +6.656483082e-19 + 5.000000000e-02, +1.546789803e-02, +1.564546720e-02, +7.413611837e-19 + 5.500000000e-02, +2.077156516e-02, +2.094951513e-02, +1.386310330e-18 + 6.000000000e-02, +2.470069612e-02, +2.491313898e-02, +2.037543604e-18 + 6.500000000e-02, +2.483796096e-02, +2.510856003e-02, +1.649354595e-18 + 7.000000000e-02, +1.789296781e-02, +1.825786070e-02, +3.745301664e-18 + 7.500000000e-02, -2.885970849e-17, +5.116704638e-04, +4.395650905e-18 + 8.000000000e-02, -3.260311305e-02, -3.191785195e-02, +4.834348342e-18 + 8.500000000e-02, -8.246493451e-02, -8.158501484e-02, -9.619797623e-19 + 9.000000000e-02, -1.494305036e-01, -1.483421678e-01, -9.697820057e-17 + 9.500000000e-02, -2.289686265e-01, -2.276918608e-01, -8.539523958e-16 + 1.000000000e-01, -3.106810371e-01, -3.092516108e-01, -6.477780006e-15 + 1.050000000e-01, -3.775054448e-01, -3.759601744e-01, -4.395648630e-14 + 1.100000000e-01, -4.061942227e-01, -4.045725400e-01, -2.698275123e-13 + 1.150000000e-01, -3.695821957e-01, -3.679216876e-01, -1.509875053e-12 + 1.200000000e-01, -2.409062313e-01, -2.392327277e-01, -7.742134141e-12 + 1.250000000e-01, +2.343888163e-16, +1.648793989e-03, -3.654747037e-11 + 1.300000000e-01, +3.593898657e-01, +3.609079016e-01, -1.594313124e-10 + 1.350000000e-01, +8.225203029e-01, +8.236876014e-01, -6.446384098e-10 + 1.400000000e-01, +1.348612313e+00, +1.349024689e+00, -2.421496590e-09 + 1.450000000e-01, +1.869796708e+00, +1.868794378e+00, -8.464185863e-09 + 1.500000000e-01, +2.295639612e+00, +2.292310507e+00, -2.755740009e-08 + 1.550000000e-01, +2.523961555e+00, +2.517204835e+00, -8.358950510e-08 + 1.600000000e-01, +2.457331849e+00, +2.446003413e+00, -2.360889142e-07 + 1.650000000e-01, +2.023073496e+00, +2.006245268e+00, -6.198760827e-07 + 1.700000000e-01, +1.193216375e+00, +1.170501686e+00, -1.508341849e-06 + 1.750000000e-01, -2.429847328e-15, -2.811424978e-02, -3.383291458e-06 + 1.800000000e-01, -1.457397771e+00, -1.489281056e+00, -6.931218033e-06 + 1.850000000e-01, -3.018071006e+00, -3.050826731e+00, -1.275149362e-05 + 1.900000000e-01, -4.477550561e+00, -4.507130087e+00, -2.034209320e-05 + 1.950000000e-01, -5.617179743e+00, -5.638770098e+00, -2.567346106e-05 + 2.000000000e-01, -6.240195442e+00, -6.248845777e+00, -1.655146561e-05 + 2.050000000e-01, -6.207943693e+00, -6.199369191e+00, +3.465328750e-05 + 2.100000000e-01, -5.468892605e+00, -5.440318963e+00, +1.800690952e-04 + 2.150000000e-01, -4.073969730e+00, -4.024835976e+00, +5.040310132e-04 + 2.200000000e-01, -2.174181990e+00, -2.106553983e+00, +1.123447369e-03 + 2.250000000e-01, +1.316268185e-14, +8.143006830e-02, +2.172872637e-03 + 2.300000000e-01, +2.174181990e+00, +2.262556595e+00, +3.767029670e-03 + 2.350000000e-01, +4.073969730e+00, +4.161132300e+00, +5.937769792e-03 + 2.400000000e-01, +5.468892605e+00, +5.546524634e+00, +8.549006978e-03 + 2.450000000e-01, +6.207943693e+00, +6.268764628e+00, +1.119915241e-02 + 2.500000000e-01, +6.240195442e+00, +6.279010884e+00, +1.312459642e-02 + 2.550000000e-01, +5.617179743e+00, +5.631588195e+00, +1.312318719e-02 + 2.600000000e-01, +4.477550561e+00, +4.468177987e+00, +9.530076029e-03 + 2.650000000e-01, +3.018071006e+00, +2.988313662e+00, +3.008352239e-04 + 2.700000000e-01, +1.457397771e+00, +1.412743251e+00, -1.672529553e-02 + 2.750000000e-01, +2.429847328e-15, -5.292842286e-02, -4.332059946e-02 + 2.800000000e-01, -1.193216375e+00, -1.247700830e+00, -8.011657114e-02 + 2.850000000e-01, -2.023073496e+00, -2.073237824e+00, -1.256824086e-01 + 2.900000000e-01, -2.457331849e+00, -2.498821394e+00, -1.755916449e-01 + 2.950000000e-01, -2.523961555e+00, -2.554292475e+00, -2.216932819e-01 + 3.000000000e-01, -2.295639612e+00, -2.314203094e+00, -2.518599038e-01 + 3.050000000e-01, -1.869796708e+00, -1.877568047e+00, -2.505419293e-01 + 3.100000000e-01, -1.348612313e+00, -1.347678916e+00, -2.004478135e-01 + 3.150000000e-01, -8.225203029e-01, -8.155374439e-01, -8.549956606e-02 + 3.200000000e-01, -3.593898657e-01, -3.490662015e-01, +1.051120149e-01 + 3.250000000e-01, -1.723350142e-14, +1.129722163e-02, +3.723054651e-01 + 3.300000000e-01, +2.409062313e-01, +2.513918903e-01, +7.027478871e-01 + 3.350000000e-01, +3.695821957e-01, +3.781420860e-01, +1.065821388e+00 + 3.400000000e-01, +4.061942227e-01, +4.123439321e-01, +1.413152230e+00 + 3.450000000e-01, +3.775054448e-01, +3.812601920e-01, +1.681814306e+00 + 3.500000000e-01, +3.106810371e-01, +3.123876070e-01, +1.801679241e+00 + 3.550000000e-01, +2.289686265e-01, +2.291415210e-01, +1.706485823e+00 + 3.600000000e-01, +1.494305036e-01, +1.486122433e-01, +1.347356833e+00 + 3.650000000e-01, +8.246493451e-02, +8.113092744e-02, +7.065627933e-01 + 3.700000000e-01, +3.260311305e-02, +3.111600277e-02, -1.914642769e-01 + 3.750000000e-01, +2.819603979e-15, -1.404292802e-03, -1.274901740e+00 + 3.800000000e-01, -1.789296781e-02, -1.909277392e-02, -2.427408588e+00 + 3.850000000e-01, -2.483796096e-02, -2.579664270e-02, -3.500130657e+00 + 3.900000000e-01, -2.470069612e-02, -2.543679340e-02, -4.332037087e+00 + 3.950000000e-01, -2.077156516e-02, -2.133157149e-02, -4.775816538e+00 + 4.000000000e-01, -1.546789803e-02, -1.590526908e-02, -4.724853592e+00 + 4.050000000e-01, -1.031485399e-02, -1.067686760e-02, -4.135894301e+00 + 4.100000000e-01, -6.091116670e-03, -6.413338880e-03, -3.042455647e+00 + 4.150000000e-01, -3.041567984e-03, -3.347590794e-03, -1.555433731e+00 + 4.200000000e-01, -1.088072493e-03, -1.389554268e-03, +1.503822423e-01 + 4.250000000e-01, -1.275717457e-16, -2.995064781e-04, +1.862039013e+00 + 4.300000000e-01, +4.889024863e-04, +1.941689465e-04, +3.361896348e+00 + 4.350000000e-01, +6.140819852e-04, +3.301372063e-04, +4.462759288e+00 + 4.400000000e-01, +5.525736376e-04, +2.854895253e-04, +5.037821074e+00 + 4.450000000e-01, +4.204561825e-04, +1.741971507e-04, +5.039629281e+00 + 4.500000000e-01, +2.833044348e-04, +5.700503910e-05, +4.504737032e+00 + 4.550000000e-01, +1.709447271e-04, -4.405130144e-05, +3.543482320e+00 + 4.600000000e-01, +9.133980795e-05, -1.312500586e-04, +2.317515506e+00 + 4.650000000e-01, +4.126969468e-05, -2.232931046e-04, +1.010103265e+00 + 4.700000000e-01, +1.335863584e-05, -3.454537785e-04, -2.048055017e-01 + 4.750000000e-01, +1.888516403e-18, -5.222323413e-04, -1.188767560e+00 + 4.800000000e-01, -4.914367487e-06, -7.750959949e-04, -1.855881786e+00 + 4.850000000e-01, -5.585245819e-06, -1.115324597e-03, -2.178713151e+00 + 4.900000000e-01, -4.547541263e-06, -1.537090408e-03, -2.183322259e+00 + 4.950000000e-01, -3.130961891e-06, -2.012400350e-03, -1.935923923e+00 + 5.000000000e-01, -1.908890266e-06, -2.484516257e-03, -1.525081205e+00 + 5.050000000e-01, -1.042206678e-06, -2.862955168e-03, -1.043338312e+00 + 5.100000000e-01, -5.038819347e-07, -3.024743600e-03, -5.718283326e-01 + 5.150000000e-01, -2.060015565e-07, -2.824752434e-03, -1.701654561e-01 + 5.200000000e-01, -6.033536005e-08, -2.110099227e-03, +1.277509450e-01 + 5.250000000e-01, -9.644121496e-21, -7.439345335e-04, +3.125215118e-01 + 5.300000000e-01, +1.817266122e-08, +1.359225887e-03, +3.941219649e-01 + 5.350000000e-01, +1.868803958e-08, +4.200368924e-03, +3.948411394e-01 + 5.400000000e-01, +1.376793013e-08, +7.664016878e-03, +3.420465633e-01 + 5.450000000e-01, +8.577097330e-09, +1.149275531e-02, +2.621957853e-01 + 5.500000000e-01, +4.731665902e-09, +1.528517740e-02, +1.768297798e-01 + 5.550000000e-01, +2.337531714e-09, +1.851820152e-02, +1.006737511e-01 + 5.600000000e-01, +1.022593435e-09, +2.059553585e-02, +4.158723758e-02 + 5.650000000e-01, +3.782816423e-10, +2.092398946e-02, +1.723512177e-03 + 5.700000000e-01, +1.002506563e-10, +1.900977907e-02, -2.071508641e-02 + 5.750000000e-01, +1.164310201e-23, +1.456001981e-02, -2.963650520e-02 + 5.800000000e-01, -2.472150748e-11, +7.570042193e-03, -2.955907908e-02 + 5.850000000e-01, -2.300333036e-11, -1.618644852e-03, -2.457243978e-02 + 5.900000000e-01, -1.533437842e-11, -1.230966525e-02, -1.779353174e-02 + 5.950000000e-01, -8.643873713e-12, -2.350396242e-02, -1.124458956e-02 + 6.000000000e-01, -4.314720803e-12, -3.400651992e-02, -5.959505506e-03 + 6.050000000e-01, -1.928708926e-12, -4.258056666e-02, -2.251682108e-03 + 6.100000000e-01, -7.634537466e-13, -4.812729344e-02, -1.944808006e-06 + 6.150000000e-01, -2.555439173e-13, -4.985827499e-02, +1.131387319e-03 + 6.200000000e-01, -6.127849048e-14, -4.743145269e-02, +1.524927693e-03 + 6.250000000e-01, -4.541728911e-27, -4.102128372e-02, +1.496277681e-03 + 6.300000000e-01, +1.237191386e-14, -3.130923222e-02, +1.286185270e-03 + 6.350000000e-01, +1.041653328e-14, -1.939358539e-02, +1.037950100e-03 + 6.400000000e-01, +6.283031218e-15, -6.629435720e-03, +8.221271834e-04 + 6.450000000e-01, +3.204660344e-15, +5.570372277e-03, +6.659544173e-04 + 6.500000000e-01, +1.447427579e-15, +1.593950186e-02, +5.667365603e-04 + 6.550000000e-01, +5.854386450e-16, +2.353190035e-02, +5.128190666e-04 + 6.600000000e-01, +2.096852970e-16, +2.783401897e-02, +4.864553060e-04 + 6.650000000e-01, +6.350696352e-17, +2.880146865e-02, +4.759463957e-04 + 6.700000000e-01, +1.377953018e-17, +2.681846160e-02, +4.754357529e-04 + 6.750000000e-01, +5.379378296e-31, +2.259337024e-02, +4.742540093e-04 + 6.800000000e-01, -2.277741020e-18, +1.701300599e-02, +4.729023782e-04 + 6.850000000e-01, -1.735246645e-18, +1.098728471e-02, +4.719367941e-04 + 6.900000000e-01, -9.470606165e-19, +5.316416417e-03, +4.663455368e-04 + 6.950000000e-01, -4.370801840e-19, +5.935849627e-04, +4.604477808e-04 + 7.000000000e-01, -1.786267540e-19, -2.844509692e-03, +4.535957736e-04 + 7.050000000e-01, -6.537347961e-20, -4.911714935e-03, +4.449016721e-04 + 7.100000000e-01, -2.118647699e-20, -5.727982852e-03, +4.381864840e-04 + 7.150000000e-01, -5.806075333e-21, -5.554370684e-03, +4.313345980e-04 + 7.200000000e-01, -1.139898758e-21, -4.718619831e-03, +4.277145132e-04 + 7.250000000e-01, -1.620612745e-35, -3.545671653e-03, +4.294122165e-04 + 7.300000000e-01, +1.542685213e-22, -2.308296837e-03, +4.347899752e-04 + 7.350000000e-01, +1.063419792e-22, -1.202033282e-03, +4.488369599e-04 + 7.400000000e-01, +5.251602594e-23, -3.374508168e-04, +4.710786766e-04 + 7.450000000e-01, +2.193035927e-23, +2.507797380e-04, +5.003900821e-04 + 7.500000000e-01, +8.109642085e-24, +5.829705686e-04, +5.382118411e-04 + 7.550000000e-01, +2.685513466e-24, +7.122384518e-04, +5.809186893e-04 + 7.600000000e-01, +7.875081013e-25, +7.027927889e-04, +6.261043687e-04 + 7.650000000e-01, +1.952762843e-25, +6.156591070e-04, +6.683280007e-04 + 7.700000000e-01, +3.468994959e-26, +5.008972786e-04, +7.023127429e-04 + 7.750000000e-01, -3.496765852e-40, +3.901331387e-04, +7.243104846e-04 + 7.800000000e-01, -3.843755978e-27, +2.998311572e-04, +7.252655938e-04 + 7.850000000e-01, -2.397473318e-27, +2.377462921e-04, +7.033746682e-04 + 7.900000000e-01, -1.071300850e-27, +2.013511921e-04, +6.576749312e-04 + 7.950000000e-01, -4.047957029e-28, +1.834534227e-04, +5.840307464e-04 + 8.000000000e-01, -1.354448156e-28, +1.792152633e-04, +4.889649393e-04 + 8.050000000e-01, -4.058434912e-29, +1.825593405e-04, +3.781421839e-04 + 8.100000000e-01, -1.076854018e-29, +1.880221047e-04, +2.570309958e-04 + 8.150000000e-01, -2.416138676e-30, +1.943111059e-04, +1.377167927e-04 + 8.200000000e-01, -3.883708049e-31, +1.995158443e-04, +2.908880599e-05 + 8.250000000e-01, +1.025357826e-44, +2.029625271e-04, -5.982094585e-05 + 8.300000000e-01, +3.523220453e-32, +2.061475429e-04, -1.219278619e-04 + 8.350000000e-01, +1.988421014e-32, +2.074515962e-04, -1.537070015e-04 + 8.400000000e-01, +8.039639276e-33, +2.079480326e-04, -1.528269615e-04 + 8.450000000e-01, +2.748726687e-33, +2.099544896e-04, -1.241951316e-04 + 8.500000000e-01, +8.322017093e-34, +2.100094651e-04, -7.261180819e-05 + 8.550000000e-01, +2.256292263e-34, +2.097662303e-04, -4.338343337e-06 + 8.600000000e-01, +5.417066333e-35, +2.120419428e-04, +6.937026123e-05 + 8.650000000e-01, +1.099764584e-35, +2.119761891e-04, +1.422288650e-04 + 8.700000000e-01, +1.599539611e-36, +2.117370524e-04, +2.070336700e-04 + 8.750000000e-01, -6.322229835e-50, +2.140731914e-04, +2.576040934e-04 + 8.800000000e-01, -1.188035304e-37, +2.139085089e-04, +2.933273966e-04 + 8.850000000e-01, -6.066922176e-38, +2.140217876e-04, +3.122341182e-04 + 8.900000000e-01, -2.219561560e-38, +2.159888483e-04, +3.170515957e-04 + 8.950000000e-01, -6.866457597e-39, +2.155729282e-04, +3.115406361e-04 + 9.000000000e-01, -1.881049996e-39, +2.163182952e-04, +2.973765395e-04 + 9.050000000e-01, -4.614638035e-40, +2.177376590e-04, +2.805435086e-04 + 9.100000000e-01, -1.002482944e-40, +2.169880189e-04, +2.634820011e-04 + 9.150000000e-01, -1.841548328e-41, +2.184243469e-04, +2.474819008e-04 + 9.200000000e-01, -2.423533024e-42, +2.193856926e-04, +2.356124651e-04 + 9.250000000e-01, +1.347746337e-55, +2.184083467e-04, +2.272392912e-04 + 9.300000000e-01, +1.473751950e-43, +2.203584750e-04, +2.225130608e-04 + 9.350000000e-01, +6.809794745e-44, +2.211345935e-04, +2.205871215e-04 + 9.400000000e-01, +2.254256572e-44, +2.202842119e-04, +2.205025438e-04 + 9.450000000e-01, +6.310146526e-45, +2.224583123e-04, +2.224305155e-04 + 9.500000000e-01, +1.564147094e-45, +2.233412630e-04, +2.236925644e-04 + 9.550000000e-01, +3.472045809e-46, +2.230802484e-04, +2.252859374e-04 + 9.600000000e-01, +6.824885183e-47, +2.251621531e-04, +2.274781788e-04 + 9.650000000e-01, +1.134415180e-47, +2.262626847e-04, +2.277056237e-04 + 9.700000000e-01, +1.350853967e-48, +2.268272547e-04, +2.283394661e-04 + 9.750000000e-01, -8.526671746e-62, +2.284429790e-04, +2.290658008e-04 + 9.800000000e-01, -6.725505882e-50, +2.295494122e-04, +2.285373151e-04 + 9.850000000e-01, -2.811934097e-50, +2.306545763e-04, +2.285922624e-04 + 9.900000000e-01, -8.422577434e-51, +2.313803724e-04, +2.284499207e-04 + 9.950000000e-01, -2.133298675e-51, +2.320640712e-04, +2.282600142e-04 + 1.000000000e+00, -4.784762256e-52, +2.329781244e-04, +2.281435227e-04 diff --git a/test/examples/ref/coaxial/open/domain-E.csv b/test/examples/ref/coaxial/open/domain-E.csv index 226afdca0..6ee72c4e2 100644 --- a/test/examples/ref/coaxial/open/domain-E.csv +++ b/test/examples/ref/coaxial/open/domain-E.csv @@ -1,202 +1,202 @@ t (ns), E_elec (J), E_mag (J), E_cap (J), E_ind (J) 0.000000000e+00, +0.000000000e+00, +0.000000000e+00, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-03, +2.620423449e-13, +2.405186616e-13, +0.000000000e+00, +0.000000000e+00 - 1.000000000e-02, +2.130484507e-12, +2.258001913e-12, +0.000000000e+00, +0.000000000e+00 - 1.500000000e-02, +5.280441196e-12, +5.252502459e-12, +0.000000000e+00, +0.000000000e+00 - 2.000000000e-02, +5.723485707e-12, +5.889336112e-12, +0.000000000e+00, +0.000000000e+00 - 2.500000000e-02, +1.384423851e-11, +1.351752176e-11, +0.000000000e+00, +0.000000000e+00 - 3.000000000e-02, +1.264406630e-10, +1.273520868e-10, +0.000000000e+00, +0.000000000e+00 - 3.500000000e-02, +7.248276845e-10, +7.322638095e-10, +0.000000000e+00, +0.000000000e+00 - 4.000000000e-02, +2.826288063e-09, +2.865189180e-09, +0.000000000e+00, +0.000000000e+00 - 4.500000000e-02, +8.472578774e-09, +8.624044305e-09, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-02, +2.067791389e-08, +2.112506274e-08, +0.000000000e+00, +0.000000000e+00 - 5.500000000e-02, +4.204801356e-08, +4.310959893e-08, +0.000000000e+00, +0.000000000e+00 - 6.000000000e-02, +7.139216297e-08, +7.352519985e-08, +0.000000000e+00, +0.000000000e+00 - 6.500000000e-02, +9.984652933e-08, +1.034135993e-07, +0.000000000e+00, +0.000000000e+00 - 7.000000000e-02, +1.129356653e-07, +1.176883153e-07, +0.000000000e+00, +0.000000000e+00 - 7.500000000e-02, +1.116885029e-07, +1.163252374e-07, +0.000000000e+00, +0.000000000e+00 - 8.000000000e-02, +1.680676068e-07, +1.704654187e-07, +0.000000000e+00, +0.000000000e+00 - 8.500000000e-02, +5.145121071e-07, +5.145849915e-07, +0.000000000e+00, +0.000000000e+00 - 9.000000000e-02, +1.625634693e-06, +1.632515993e-06, +0.000000000e+00, +0.000000000e+00 - 9.500000000e-02, +4.189260303e-06, +4.233144612e-06, +0.000000000e+00, +0.000000000e+00 - 1.000000000e-01, +8.834283227e-06, +8.979142522e-06, +0.000000000e+00, +0.000000000e+00 - 1.050000000e-01, +1.557257842e-05, +1.591718869e-05, +0.000000000e+00, +0.000000000e+00 - 1.100000000e-01, +2.318792918e-05, +2.383893340e-05, +0.000000000e+00, +0.000000000e+00 - 1.150000000e-01, +2.921180439e-05, +3.021934654e-05, +0.000000000e+00, +0.000000000e+00 - 1.200000000e-01, +3.137262067e-05, +3.264253087e-05, +0.000000000e+00, +0.000000000e+00 - 1.250000000e-01, +3.101355047e-05, +3.225591444e-05, +0.000000000e+00, +0.000000000e+00 - 1.300000000e-01, +3.761730158e-05, +3.843217751e-05, +0.000000000e+00, +0.000000000e+00 - 1.350000000e-01, +7.158794951e-05, +7.177794011e-05, +0.000000000e+00, +0.000000000e+00 - 1.400000000e-01, +1.611519268e-04, +1.612562358e-04, +0.000000000e+00, +0.000000000e+00 - 1.450000000e-01, +3.305914672e-04, +3.324397053e-04, +0.000000000e+00, +0.000000000e+00 - 1.500000000e-01, +5.820784545e-04, +5.889630356e-04, +0.000000000e+00, +0.000000000e+00 - 1.550000000e-01, +8.805796322e-04, +8.966101221e-04, +0.000000000e+00, +0.000000000e+00 - 1.600000000e-01, +1.155885869e-03, +1.184347393e-03, +0.000000000e+00, +0.000000000e+00 - 1.650000000e-01, +1.331885944e-03, +1.373024871e-03, +0.000000000e+00, +0.000000000e+00 - 1.700000000e-01, +1.378531485e-03, +1.427869636e-03, +0.000000000e+00, +0.000000000e+00 - 1.750000000e-01, +1.362174796e-03, +1.410730868e-03, +0.000000000e+00, +0.000000000e+00 - 1.800000000e-01, +1.458232463e-03, +1.495509375e-03, +0.000000000e+00, +0.000000000e+00 - 1.850000000e-01, +1.899735491e-03, +1.918963559e-03, +0.000000000e+00, +0.000000000e+00 - 1.900000000e-01, +2.868535496e-03, +2.872019129e-03, +0.000000000e+00, +0.000000000e+00 - 1.950000000e-01, +4.377346610e-03, +4.378882949e-03, +0.000000000e+00, +0.000000000e+00 - 2.000000000e-01, +6.212942789e-03, +6.234992740e-03, +0.000000000e+00, +0.000000000e+00 - 2.050000000e-01, +7.991627673e-03, +8.057270027e-03, +0.000000000e+00, +0.000000000e+00 - 2.100000000e-01, +9.319711678e-03, +9.442368641e-03, +0.000000000e+00, +0.000000000e+00 - 2.150000000e-01, +9.985360399e-03, +1.016109920e-02, +0.000000000e+00, +0.000000000e+00 - 2.200000000e-01, +1.007719115e-02, +1.028379825e-02, +0.000000000e+00, +0.000000000e+00 - 2.250000000e-01, +9.955566915e-03, +1.015955736e-02, +0.000000000e+00, +0.000000000e+00 - 2.300000000e-01, +1.008211612e-02, +1.025087432e-02, +0.000000000e+00, +0.000000000e+00 - 2.350000000e-01, +1.079468613e-02, +1.090826494e-02, +0.000000000e+00, +0.000000000e+00 - 2.400000000e-01, +1.214733434e-02, +1.220460425e-02, +0.000000000e+00, +0.000000000e+00 - 2.450000000e-01, +1.389710952e-02, +1.391385800e-02, +0.000000000e+00, +0.000000000e+00 - 2.500000000e-01, +1.563539338e-02, +1.563595409e-02, +0.000000000e+00, +0.000000000e+00 - 2.550000000e-01, +1.698401897e-02, +1.699085868e-02, +0.000000000e+00, +0.000000000e+00 - 2.600000000e-01, +1.775068986e-02, +1.777666235e-02, +0.000000000e+00, +0.000000000e+00 - 2.650000000e-01, +1.797391969e-02, +1.801978924e-02, +0.000000000e+00, +0.000000000e+00 - 2.700000000e-01, +1.785607205e-02, +1.791291151e-02, +0.000000000e+00, +0.000000000e+00 - 2.750000000e-01, +1.764003211e-02, +1.769403714e-02, +0.000000000e+00, +0.000000000e+00 - 2.800000000e-01, +1.750077317e-02, +1.753801458e-02, +0.000000000e+00, +0.000000000e+00 - 2.850000000e-01, +1.749772466e-02, +1.750812485e-02, +0.000000000e+00, +0.000000000e+00 - 2.900000000e-01, +1.759126728e-02, +1.757311212e-02, +0.000000000e+00, +0.000000000e+00 - 2.950000000e-01, +1.769483180e-02, +1.766133549e-02, +0.000000000e+00, +0.000000000e+00 - 3.000000000e-01, +1.772737985e-02, +1.771371997e-02, +0.000000000e+00, +0.000000000e+00 - 3.050000000e-01, +1.764527916e-02, +1.770871489e-02, +0.000000000e+00, +0.000000000e+00 - 3.100000000e-01, +1.745227074e-02, +1.765334982e-02, +0.000000000e+00, +0.000000000e+00 - 3.150000000e-01, +1.719682390e-02, +1.755294397e-02, +0.000000000e+00, +0.000000000e+00 - 3.200000000e-01, +1.696285177e-02, +1.738233820e-02, +0.000000000e+00, +0.000000000e+00 - 3.250000000e-01, +1.684902076e-02, +1.708247966e-02, +0.000000000e+00, +0.000000000e+00 - 3.300000000e-01, +1.692666529e-02, +1.659689894e-02, +0.000000000e+00, +0.000000000e+00 - 3.350000000e-01, +1.717720331e-02, +1.594178507e-02, +0.000000000e+00, +0.000000000e+00 - 3.400000000e-01, +1.743616896e-02, +1.527429745e-02, +0.000000000e+00, +0.000000000e+00 - 3.450000000e-01, +1.739589928e-02, +1.490056708e-02, +0.000000000e+00, +0.000000000e+00 - 3.500000000e-01, +1.671561400e-02, +1.517088035e-02, +0.000000000e+00, +0.000000000e+00 - 3.550000000e-01, +1.523678145e-02, +1.626244257e-02, +0.000000000e+00, +0.000000000e+00 - 3.600000000e-01, +1.321433911e-02, +1.793930670e-02, +0.000000000e+00, +0.000000000e+00 - 3.650000000e-01, +1.140199517e-02, +1.945410268e-02, +0.000000000e+00, +0.000000000e+00 - 3.700000000e-01, +1.084342011e-02, +1.974586338e-02, +0.000000000e+00, +0.000000000e+00 - 3.750000000e-01, +1.235947263e-02, +1.795152629e-02, +0.000000000e+00, +0.000000000e+00 - 3.800000000e-01, +1.593938884e-02, +1.402828329e-02, +0.000000000e+00, +0.000000000e+00 - 3.850000000e-01, +2.040730358e-02, +9.113080665e-03, +0.000000000e+00, +0.000000000e+00 - 3.900000000e-01, +2.369372753e-02, +5.278223037e-03, +0.000000000e+00, +0.000000000e+00 - 3.950000000e-01, +2.374496442e-02, +4.633849391e-03, +0.000000000e+00, +0.000000000e+00 - 4.000000000e-01, +1.968327954e-02, +8.152699658e-03, +0.000000000e+00, +0.000000000e+00 - 4.050000000e-01, +1.255671460e-02, +1.488013424e-02, +0.000000000e+00, +0.000000000e+00 - 4.100000000e-01, +5.127343541e-03, +2.209839097e-02, +0.000000000e+00, +0.000000000e+00 - 4.150000000e-01, +6.523555669e-04, +2.651644362e-02, +0.000000000e+00, +0.000000000e+00 - 4.200000000e-01, +1.238438121e-03, +2.592388058e-02, +0.000000000e+00, +0.000000000e+00 - 4.250000000e-01, +6.685639620e-03, +2.039195750e-02, +0.000000000e+00, +0.000000000e+00 - 4.300000000e-01, +1.451905157e-02, +1.230161512e-02, +0.000000000e+00, +0.000000000e+00 - 4.350000000e-01, +2.123084235e-02, +5.144546444e-03, +0.000000000e+00, +0.000000000e+00 - 4.400000000e-01, +2.403970108e-02, +1.767638306e-03, +0.000000000e+00, +0.000000000e+00 - 4.450000000e-01, +2.218221182e-02, +3.045670626e-03, +0.000000000e+00, +0.000000000e+00 - 4.500000000e-01, +1.706461906e-02, +7.674930224e-03, +0.000000000e+00, +0.000000000e+00 - 4.550000000e-01, +1.130220285e-02, +1.309000194e-02, +0.000000000e+00, +0.000000000e+00 - 4.600000000e-01, +7.295242529e-03, +1.687525060e-02, +0.000000000e+00, +0.000000000e+00 - 4.650000000e-01, +6.160165116e-03, +1.785358836e-02, +0.000000000e+00, +0.000000000e+00 - 4.700000000e-01, +7.505820415e-03, +1.634669870e-02, +0.000000000e+00, +0.000000000e+00 - 4.750000000e-01, +9.992185350e-03, +1.364812220e-02, +0.000000000e+00, +0.000000000e+00 - 4.800000000e-01, +1.220146715e-02, +1.116511775e-02, +0.000000000e+00, +0.000000000e+00 - 4.850000000e-01, +1.329944961e-02, +9.750402848e-03, +0.000000000e+00, +0.000000000e+00 - 4.900000000e-01, +1.321604714e-02, +9.504025267e-03, +0.000000000e+00, +0.000000000e+00 - 4.950000000e-01, +1.240551987e-02, +9.996634752e-03, +0.000000000e+00, +0.000000000e+00 - 5.000000000e-01, +1.144629542e-02, +1.066147867e-02, +0.000000000e+00, +0.000000000e+00 - 5.050000000e-01, +1.073468395e-02, +1.110125246e-02, +0.000000000e+00, +0.000000000e+00 - 5.100000000e-01, +1.038619049e-02, +1.119183695e-02, +0.000000000e+00, +0.000000000e+00 - 5.150000000e-01, +1.030834964e-02, +1.101416451e-02, +0.000000000e+00, +0.000000000e+00 - 5.200000000e-01, +1.033669793e-02, +1.072034711e-02, +0.000000000e+00, +0.000000000e+00 - 5.250000000e-01, +1.034029573e-02, +1.042868578e-02, +0.000000000e+00, +0.000000000e+00 - 5.300000000e-01, +1.026104623e-02, +1.018608453e-02, +0.000000000e+00, +0.000000000e+00 - 5.350000000e-01, +1.010147724e-02, +9.985116594e-03, +0.000000000e+00, +0.000000000e+00 - 5.400000000e-01, +9.894097575e-03, +9.801477664e-03, +0.000000000e+00, +0.000000000e+00 - 5.450000000e-01, +9.676531514e-03, +9.622873946e-03, +0.000000000e+00, +0.000000000e+00 - 5.500000000e-01, +9.478660775e-03, +9.456755070e-03, +0.000000000e+00, +0.000000000e+00 - 5.550000000e-01, +9.316276790e-03, +9.318719552e-03, +0.000000000e+00, +0.000000000e+00 - 5.600000000e-01, +9.185099949e-03, +9.211499791e-03, +0.000000000e+00, +0.000000000e+00 - 5.650000000e-01, +9.055420121e-03, +9.107285232e-03, +0.000000000e+00, +0.000000000e+00 - 5.700000000e-01, +8.873688473e-03, +8.945090838e-03, +0.000000000e+00, +0.000000000e+00 - 5.750000000e-01, +8.577475113e-03, +8.649431089e-03, +0.000000000e+00, +0.000000000e+00 - 5.800000000e-01, +8.123153810e-03, +8.166438827e-03, +0.000000000e+00, +0.000000000e+00 - 5.850000000e-01, +7.515364847e-03, +7.501808123e-03, +0.000000000e+00, +0.000000000e+00 - 5.900000000e-01, +6.820793610e-03, +6.738305081e-03, +0.000000000e+00, +0.000000000e+00 - 5.950000000e-01, +6.152300664e-03, +6.015807995e-03, +0.000000000e+00, +0.000000000e+00 - 6.000000000e-01, +5.623743088e-03, +5.474814473e-03, +0.000000000e+00, +0.000000000e+00 - 6.050000000e-01, +5.294181443e-03, +5.186989500e-03, +0.000000000e+00, +0.000000000e+00 - 6.100000000e-01, +5.131104862e-03, +5.109655202e-03, +0.000000000e+00, +0.000000000e+00 - 6.150000000e-01, +5.016756792e-03, +5.094020559e-03, +0.000000000e+00, +0.000000000e+00 - 6.200000000e-01, +4.799978675e-03, +4.949949105e-03, +0.000000000e+00, +0.000000000e+00 - 6.250000000e-01, +4.369676989e-03, +4.537422770e-03, +0.000000000e+00, +0.000000000e+00 - 6.300000000e-01, +3.711415783e-03, +3.836844442e-03, +0.000000000e+00, +0.000000000e+00 - 6.350000000e-01, +2.916160013e-03, +2.959784058e-03, +0.000000000e+00, +0.000000000e+00 - 6.400000000e-01, +2.136464826e-03, +2.094451962e-03, +0.000000000e+00, +0.000000000e+00 - 6.450000000e-01, +1.514659623e-03, +1.416484694e-03, +0.000000000e+00, +0.000000000e+00 - 6.500000000e-01, +1.121889592e-03, +1.013320023e-03, +0.000000000e+00, +0.000000000e+00 - 6.550000000e-01, +9.380653783e-04, +8.594184132e-04, +0.000000000e+00, +0.000000000e+00 - 6.600000000e-01, +8.775750083e-04, +8.482817326e-04, +0.000000000e+00, +0.000000000e+00 - 6.650000000e-01, +8.405600725e-04, +8.561455951e-04, +0.000000000e+00, +0.000000000e+00 - 6.700000000e-01, +7.594153014e-04, +7.996706349e-04, +0.000000000e+00, +0.000000000e+00 - 6.750000000e-01, +6.185901446e-04, +6.604399884e-04, +0.000000000e+00, +0.000000000e+00 - 6.800000000e-01, +4.445602470e-04, +4.724047831e-04, +0.000000000e+00, +0.000000000e+00 - 6.850000000e-01, +2.790959772e-04, +2.885933233e-04, +0.000000000e+00, +0.000000000e+00 - 6.900000000e-01, +1.539815617e-04, +1.496285278e-04, +0.000000000e+00, +0.000000000e+00 - 6.950000000e-01, +7.914368563e-05, +6.890896763e-05, +0.000000000e+00, +0.000000000e+00 - 7.000000000e-01, +4.539571239e-05, +3.596138566e-05, +0.000000000e+00, +0.000000000e+00 - 7.050000000e-01, +3.511387233e-05, +2.967212329e-05, +0.000000000e+00, +0.000000000e+00 - 7.100000000e-01, +3.257808557e-05, +3.113128393e-05, +0.000000000e+00, +0.000000000e+00 - 7.150000000e-01, +2.910677633e-05, +3.003230306e-05, +0.000000000e+00, +0.000000000e+00 - 7.200000000e-01, +2.276148960e-05, +2.433401660e-05, +0.000000000e+00, +0.000000000e+00 - 7.250000000e-01, +1.523198356e-05, +1.641684532e-05, +0.000000000e+00, +0.000000000e+00 - 7.300000000e-01, +8.737143253e-06, +9.252038913e-06, +0.000000000e+00, +0.000000000e+00 - 7.350000000e-01, +4.413782122e-06, +4.415061578e-06, +0.000000000e+00, +0.000000000e+00 - 7.400000000e-01, +2.180405350e-06, +1.930631642e-06, +0.000000000e+00, +0.000000000e+00 - 7.450000000e-01, +1.324210860e-06, +1.015959188e-06, +0.000000000e+00, +0.000000000e+00 - 7.500000000e-01, +1.101032650e-06, +8.354959347e-07, +0.000000000e+00, +0.000000000e+00 - 7.550000000e-01, +1.031396012e-06, +8.682042889e-07, +0.000000000e+00, +0.000000000e+00 - 7.600000000e-01, +9.174750227e-07, +9.166799070e-07, +0.000000000e+00, +0.000000000e+00 - 7.650000000e-01, +7.377533896e-07, +9.584086614e-07, +0.000000000e+00, +0.000000000e+00 - 7.700000000e-01, +5.437857778e-07, +1.005813747e-06, +0.000000000e+00, +0.000000000e+00 - 7.750000000e-01, +4.012579653e-07, +1.041100835e-06, +0.000000000e+00, +0.000000000e+00 - 7.800000000e-01, +3.635897781e-07, +1.017905817e-06, +0.000000000e+00, +0.000000000e+00 - 7.850000000e-01, +4.560125386e-07, +8.949123288e-07, +0.000000000e+00, +0.000000000e+00 - 7.900000000e-01, +6.621902033e-07, +6.694432175e-07, +0.000000000e+00, +0.000000000e+00 - 7.950000000e-01, +9.201638388e-07, +3.911820241e-07, +0.000000000e+00, +0.000000000e+00 - 8.000000000e-01, +1.136957218e-06, +1.487291701e-07, +0.000000000e+00, +0.000000000e+00 - 8.050000000e-01, +1.222023797e-06, +3.387635460e-08, +0.000000000e+00, +0.000000000e+00 - 8.100000000e-01, +1.126887294e-06, +9.921092625e-08, +0.000000000e+00, +0.000000000e+00 - 8.150000000e-01, +8.711918904e-07, +3.296633999e-07, +0.000000000e+00, +0.000000000e+00 - 8.200000000e-01, +5.395257836e-07, +6.437471273e-07, +0.000000000e+00, +0.000000000e+00 - 8.250000000e-01, +2.475829571e-07, +9.262029874e-07, +0.000000000e+00, +0.000000000e+00 - 8.300000000e-01, +9.274803561e-08, +1.077317559e-06, +0.000000000e+00, +0.000000000e+00 - 8.350000000e-01, +1.132636343e-07, +1.054784346e-06, +0.000000000e+00, +0.000000000e+00 - 8.400000000e-01, +2.759882477e-07, +8.876386581e-07, +0.000000000e+00, +0.000000000e+00 - 8.450000000e-01, +4.974585551e-07, +6.567654980e-07, +0.000000000e+00, +0.000000000e+00 - 8.500000000e-01, +6.854930588e-07, +4.540488372e-07, +0.000000000e+00, +0.000000000e+00 - 8.550000000e-01, +7.790742866e-07, +3.421848959e-07, +0.000000000e+00, +0.000000000e+00 - 8.600000000e-01, +7.676369712e-07, +3.343257700e-07, +0.000000000e+00, +0.000000000e+00 - 8.650000000e-01, +6.840322560e-07, +3.998963258e-07, +0.000000000e+00, +0.000000000e+00 - 8.700000000e-01, +5.797195698e-07, +4.886058498e-07, +0.000000000e+00, +0.000000000e+00 - 8.750000000e-01, +4.979698021e-07, +5.571227851e-07, +0.000000000e+00, +0.000000000e+00 - 8.800000000e-01, +4.582712910e-07, +5.850966919e-07, +0.000000000e+00, +0.000000000e+00 - 8.850000000e-01, +4.561715477e-07, +5.759428011e-07, +0.000000000e+00, +0.000000000e+00 - 8.900000000e-01, +4.738927107e-07, +5.467107145e-07, +0.000000000e+00, +0.000000000e+00 - 8.950000000e-01, +4.931135511e-07, +5.154815525e-07, +0.000000000e+00, +0.000000000e+00 - 9.000000000e-01, +5.030764453e-07, +4.931587592e-07, +0.000000000e+00, +0.000000000e+00 - 9.050000000e-01, +5.019416198e-07, +4.818770846e-07, +0.000000000e+00, +0.000000000e+00 - 9.100000000e-01, +4.934673098e-07, +4.780929985e-07, +0.000000000e+00, +0.000000000e+00 - 9.150000000e-01, +4.825915701e-07, +4.768447382e-07, +0.000000000e+00, +0.000000000e+00 - 9.200000000e-01, +4.725305227e-07, +4.745879655e-07, +0.000000000e+00, +0.000000000e+00 - 9.250000000e-01, +4.640817810e-07, +4.699015799e-07, +0.000000000e+00, +0.000000000e+00 - 9.300000000e-01, +4.564166506e-07, +4.628036425e-07, +0.000000000e+00, +0.000000000e+00 - 9.350000000e-01, +4.482668274e-07, +4.538008123e-07, +0.000000000e+00, +0.000000000e+00 - 9.400000000e-01, +4.387790263e-07, +4.433749957e-07, +0.000000000e+00, +0.000000000e+00 - 9.450000000e-01, +4.278747852e-07, +4.320174605e-07, +0.000000000e+00, +0.000000000e+00 - 9.500000000e-01, +4.162198624e-07, +4.204850731e-07, +0.000000000e+00, +0.000000000e+00 - 9.550000000e-01, +4.049498447e-07, +4.098925801e-07, +0.000000000e+00, +0.000000000e+00 - 9.600000000e-01, +3.952255346e-07, +4.014229648e-07, +0.000000000e+00, +0.000000000e+00 - 9.650000000e-01, +3.876444903e-07, +3.956658325e-07, +0.000000000e+00, +0.000000000e+00 - 9.700000000e-01, +3.816695783e-07, +3.918761343e-07, +0.000000000e+00, +0.000000000e+00 - 9.750000000e-01, +3.753226261e-07, +3.875569547e-07, +0.000000000e+00, +0.000000000e+00 - 9.800000000e-01, +3.654257780e-07, +3.787523412e-07, +0.000000000e+00, +0.000000000e+00 - 9.850000000e-01, +3.485123981e-07, +3.611884697e-07, +0.000000000e+00, +0.000000000e+00 - 9.900000000e-01, +3.221960735e-07, +3.319800184e-07, +0.000000000e+00, +0.000000000e+00 - 9.950000000e-01, +2.864959994e-07, +2.912581772e-07, +0.000000000e+00, +0.000000000e+00 - 1.000000000e+00, +2.444351113e-07, +2.428779988e-07, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-03, +2.483779150e-13, +2.279766032e-13, +0.000000000e+00, +0.000000000e+00 + 1.000000000e-02, +2.276378059e-12, +2.403226901e-12, +0.000000000e+00, +0.000000000e+00 + 1.500000000e-02, +6.974949774e-12, +6.967633381e-12, +0.000000000e+00, +0.000000000e+00 + 2.000000000e-02, +1.068852323e-11, +1.090294512e-11, +0.000000000e+00, +0.000000000e+00 + 2.500000000e-02, +1.063816272e-11, +1.075641631e-11, +0.000000000e+00, +0.000000000e+00 + 3.000000000e-02, +4.202730563e-11, +4.218693243e-11, +0.000000000e+00, +0.000000000e+00 + 3.500000000e-02, +3.050624355e-10, +3.068827427e-10, +0.000000000e+00, +0.000000000e+00 + 4.000000000e-02, +1.439976958e-09, +1.454945004e-09, +0.000000000e+00, +0.000000000e+00 + 4.500000000e-02, +4.931171162e-09, +5.006388444e-09, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-02, +1.336749762e-08, +1.362500393e-08, +0.000000000e+00, +0.000000000e+00 + 5.500000000e-02, +2.985127508e-08, +3.053107528e-08, +0.000000000e+00, +0.000000000e+00 + 6.000000000e-02, +5.562062711e-08, +5.712646741e-08, +0.000000000e+00, +0.000000000e+00 + 6.500000000e-02, +8.601393272e-08, +8.879943839e-08, +0.000000000e+00, +0.000000000e+00 + 7.000000000e-02, +1.083337530e-07, +1.125125483e-07, +0.000000000e+00, +0.000000000e+00 + 7.500000000e-02, +1.114096581e-07, +1.162695644e-07, +0.000000000e+00, +0.000000000e+00 + 8.000000000e-02, +1.224159817e-07, +1.261101601e-07, +0.000000000e+00, +0.000000000e+00 + 8.500000000e-02, +2.812645825e-07, +2.821379312e-07, +0.000000000e+00, +0.000000000e+00 + 9.000000000e-02, +9.352103649e-07, +9.366000197e-07, +0.000000000e+00, +0.000000000e+00 + 9.500000000e-02, +2.681510288e-06, +2.701397407e-06, +0.000000000e+00, +0.000000000e+00 + 1.000000000e-01, +6.231637746e-06, +6.316047208e-06, +0.000000000e+00, +0.000000000e+00 + 1.050000000e-01, +1.198909448e-05, +1.222067965e-05, +0.000000000e+00, +0.000000000e+00 + 1.100000000e-01, +1.941101090e-05, +1.989808976e-05, +0.000000000e+00, +0.000000000e+00 + 1.150000000e-01, +2.658602817e-05, +2.741744431e-05, +0.000000000e+00, +0.000000000e+00 + 1.200000000e-01, +3.084006910e-05, +3.200448516e-05, +0.000000000e+00, +0.000000000e+00 + 1.250000000e-01, +3.116938025e-05, +3.247495182e-05, +0.000000000e+00, +0.000000000e+00 + 1.300000000e-01, +3.243953094e-05, +3.351770194e-05, +0.000000000e+00, +0.000000000e+00 + 1.350000000e-01, +4.951460936e-05, +5.001117139e-05, +0.000000000e+00, +0.000000000e+00 + 1.400000000e-01, +1.076142984e-04, +1.076244444e-04, +0.000000000e+00, +0.000000000e+00 + 1.450000000e-01, +2.349993729e-04, +2.356504713e-04, +0.000000000e+00, +0.000000000e+00 + 1.500000000e-01, +4.472801363e-04, +4.511525966e-04, +0.000000000e+00, +0.000000000e+00 + 1.550000000e-01, +7.291799861e-04, +7.401192526e-04, +0.000000000e+00, +0.000000000e+00 + 1.600000000e-01, +1.026236746e-03, +1.048199560e-03, +0.000000000e+00, +0.000000000e+00 + 1.650000000e-01, +1.259875309e-03, +1.294903116e-03, +0.000000000e+00, +0.000000000e+00 + 1.700000000e-01, +1.369839073e-03, +1.415939252e-03, +0.000000000e+00, +0.000000000e+00 + 1.750000000e-01, +1.369485226e-03, +1.419736213e-03, +0.000000000e+00, +0.000000000e+00 + 1.800000000e-01, +1.381796571e-03, +1.425914301e-03, +0.000000000e+00, +0.000000000e+00 + 1.850000000e-01, +1.621678186e-03, +1.650302782e-03, +0.000000000e+00, +0.000000000e+00 + 1.900000000e-01, +2.312297688e-03, +2.322641202e-03, +0.000000000e+00, +0.000000000e+00 + 1.950000000e-01, +3.563511952e-03, +3.563619498e-03, +0.000000000e+00, +0.000000000e+00 + 2.000000000e-01, +5.275801512e-03, +5.284520535e-03, +0.000000000e+00, +0.000000000e+00 + 2.050000000e-01, +7.136188801e-03, +7.177535486e-03, +0.000000000e+00, +0.000000000e+00 + 2.100000000e-01, +8.731595807e-03, +8.825062915e-03, +0.000000000e+00, +0.000000000e+00 + 2.150000000e-01, +9.737443473e-03, +9.888385994e-03, +0.000000000e+00, +0.000000000e+00 + 2.200000000e-01, +1.008554902e-02, +1.028049080e-02, +0.000000000e+00, +0.000000000e+00 + 2.250000000e-01, +1.001406729e-02, +1.022385075e-02, +0.000000000e+00, +0.000000000e+00 + 2.300000000e-01, +9.961477273e-03, +1.015141018e-02, +0.000000000e+00, +0.000000000e+00 + 2.350000000e-01, +1.035427455e-02, +1.049684837e-02, +0.000000000e+00, +0.000000000e+00 + 2.400000000e-01, +1.140028272e-02, +1.148468019e-02, +0.000000000e+00, +0.000000000e+00 + 2.450000000e-01, +1.299654449e-02, +1.303081420e-02, +0.000000000e+00, +0.000000000e+00 + 2.500000000e-01, +1.479431837e-02, +1.479981366e-02, +0.000000000e+00, +0.000000000e+00 + 2.550000000e-01, +1.637592669e-02, +1.637727921e-02, +0.000000000e+00, +0.000000000e+00 + 2.600000000e-01, +1.744273082e-02, +1.745827281e-02, +0.000000000e+00, +0.000000000e+00 + 2.650000000e-01, +1.792000725e-02, +1.795652360e-02, +0.000000000e+00, +0.000000000e+00 + 2.700000000e-01, +1.794180838e-02, +1.799471325e-02, +0.000000000e+00, +0.000000000e+00 + 2.750000000e-01, +1.774677843e-02, +1.780407365e-02, +0.000000000e+00, +0.000000000e+00 + 2.800000000e-01, +1.755419256e-02, +1.760147000e-02, +0.000000000e+00, +0.000000000e+00 + 2.850000000e-01, +1.748280210e-02, +1.750754851e-02, +0.000000000e+00, +0.000000000e+00 + 2.900000000e-01, +1.753735136e-02, +1.753295516e-02, +0.000000000e+00, +0.000000000e+00 + 2.950000000e-01, +1.764747642e-02, +1.761870358e-02, +0.000000000e+00, +0.000000000e+00 + 3.000000000e-01, +1.772384036e-02, +1.769418265e-02, +0.000000000e+00, +0.000000000e+00 + 3.050000000e-01, +1.770163455e-02, +1.771820738e-02, +0.000000000e+00, +0.000000000e+00 + 3.100000000e-01, +1.756068127e-02, +1.768644462e-02, +0.000000000e+00, +0.000000000e+00 + 3.150000000e-01, +1.732785065e-02, +1.760935591e-02, +0.000000000e+00, +0.000000000e+00 + 3.200000000e-01, +1.707098826e-02, +1.747952341e-02, +0.000000000e+00, +0.000000000e+00 + 3.250000000e-01, +1.688513061e-02, +1.725290711e-02, +0.000000000e+00, +0.000000000e+00 + 3.300000000e-01, +1.686211596e-02, +1.686459986e-02, +0.000000000e+00, +0.000000000e+00 + 3.350000000e-01, +1.703673143e-02, +1.628462627e-02, +0.000000000e+00, +0.000000000e+00 + 3.400000000e-01, +1.732216215e-02, +1.559339428e-02, +0.000000000e+00, +0.000000000e+00 + 3.450000000e-01, +1.747607693e-02, +1.502775939e-02, +0.000000000e+00, +0.000000000e+00 + 3.500000000e-01, +1.715292311e-02, +1.493702957e-02, +0.000000000e+00, +0.000000000e+00 + 3.550000000e-01, +1.607193770e-02, +1.561675816e-02, +0.000000000e+00, +0.000000000e+00 + 3.600000000e-01, +1.425732934e-02, +1.706303868e-02, +0.000000000e+00, +0.000000000e+00 + 3.650000000e-01, +1.221868516e-02, +1.878062245e-02, +0.000000000e+00, +0.000000000e+00 + 3.700000000e-01, +1.090198222e-02, +1.981899481e-02, +0.000000000e+00, +0.000000000e+00 + 3.750000000e-01, +1.131704946e-02, +1.913786218e-02, +0.000000000e+00, +0.000000000e+00 + 3.800000000e-01, +1.393733717e-02, +1.621324758e-02, +0.000000000e+00, +0.000000000e+00 + 3.850000000e-01, +1.817878510e-02, +1.157928584e-02, +0.000000000e+00, +0.000000000e+00 + 3.900000000e-01, +2.234078358e-02, +6.915718021e-03, +0.000000000e+00, +0.000000000e+00 + 3.950000000e-01, +2.421866038e-02, +4.456892791e-03, +0.000000000e+00, +0.000000000e+00 + 4.000000000e-01, +2.221089322e-02, +5.883751791e-03, +0.000000000e+00, +0.000000000e+00 + 4.050000000e-01, +1.636047511e-02, +1.125355726e-02, +0.000000000e+00, +0.000000000e+00 + 4.100000000e-01, +8.668558606e-03, +1.863939940e-02, +0.000000000e+00, +0.000000000e+00 + 4.150000000e-01, +2.343723605e-03, +2.483949142e-02, +0.000000000e+00, +0.000000000e+00 + 4.200000000e-01, +2.648431248e-04, +2.690256493e-02, +0.000000000e+00, +0.000000000e+00 + 4.250000000e-01, +3.465464951e-03, +2.367161489e-02, +0.000000000e+00, +0.000000000e+00 + 4.300000000e-01, +1.051961265e-02, +1.645413827e-02, +0.000000000e+00, +0.000000000e+00 + 4.350000000e-01, +1.822570483e-02, +8.393417891e-03, +0.000000000e+00, +0.000000000e+00 + 4.400000000e-01, +2.322624516e-02, +2.873951328e-03, +0.000000000e+00, +0.000000000e+00 + 4.450000000e-01, +2.365027947e-02, +1.861502579e-03, +0.000000000e+00, +0.000000000e+00 + 4.500000000e-01, +1.987926378e-02, +5.088380196e-03, +0.000000000e+00, +0.000000000e+00 + 4.550000000e-01, +1.409293518e-02, +1.045484449e-02, +0.000000000e+00, +0.000000000e+00 + 4.600000000e-01, +8.972232607e-03, +1.529653717e-02, +0.000000000e+00, +0.000000000e+00 + 4.650000000e-01, +6.361439578e-03, +1.772713533e-02, +0.000000000e+00, +0.000000000e+00 + 4.700000000e-01, +6.594517180e-03, +1.734288020e-02, +0.000000000e+00, +0.000000000e+00 + 4.750000000e-01, +8.703009867e-03, +1.505127177e-02, +0.000000000e+00, +0.000000000e+00 + 4.800000000e-01, +1.120191118e-02, +1.230855781e-02, +0.000000000e+00, +0.000000000e+00 + 4.850000000e-01, +1.291036359e-02, +1.030139719e-02, +0.000000000e+00, +0.000000000e+00 + 4.900000000e-01, +1.338467804e-02, +9.500088523e-03, +0.000000000e+00, +0.000000000e+00 + 4.950000000e-01, +1.286391478e-02, +9.694639813e-03, +0.000000000e+00, +0.000000000e+00 + 5.000000000e-01, +1.191323588e-02, +1.033859374e-02, +0.000000000e+00, +0.000000000e+00 + 5.050000000e-01, +1.104598480e-02, +1.092346956e-02, +0.000000000e+00, +0.000000000e+00 + 5.100000000e-01, +1.051750922e-02, +1.118841306e-02, +0.000000000e+00, +0.000000000e+00 + 5.150000000e-01, +1.032356197e-02, +1.112716155e-02, +0.000000000e+00, +0.000000000e+00 + 5.200000000e-01, +1.031900044e-02, +1.087280744e-02, +0.000000000e+00, +0.000000000e+00 + 5.250000000e-01, +1.034695624e-02, +1.056965116e-02, +0.000000000e+00, +0.000000000e+00 + 5.300000000e-01, +1.031194749e-02, +1.030086439e-02, +0.000000000e+00, +0.000000000e+00 + 5.350000000e-01, +1.018963297e-02, +1.008194095e-02, +0.000000000e+00, +0.000000000e+00 + 5.400000000e-01, +1.000135339e-02, +9.892368707e-03, +0.000000000e+00, +0.000000000e+00 + 5.450000000e-01, +9.784486883e-03, +9.711463637e-03, +0.000000000e+00, +0.000000000e+00 + 5.500000000e-01, +9.573798507e-03, +9.537214510e-03, +0.000000000e+00, +0.000000000e+00 + 5.550000000e-01, +9.392807642e-03, +9.383469907e-03, +0.000000000e+00, +0.000000000e+00 + 5.600000000e-01, +9.248073165e-03, +9.262119271e-03, +0.000000000e+00, +0.000000000e+00 + 5.650000000e-01, +9.123021210e-03, +9.162128636e-03, +0.000000000e+00, +0.000000000e+00 + 5.700000000e-01, +8.975084957e-03, +9.038146854e-03, +0.000000000e+00, +0.000000000e+00 + 5.750000000e-01, +8.743473340e-03, +8.818280187e-03, +0.000000000e+00, +0.000000000e+00 + 5.800000000e-01, +8.371216258e-03, +8.432734674e-03, +0.000000000e+00, +0.000000000e+00 + 5.850000000e-01, +7.835693272e-03, +7.853428679e-03, +0.000000000e+00, +0.000000000e+00 + 5.900000000e-01, +7.172497219e-03, +7.124504406e-03, +0.000000000e+00, +0.000000000e+00 + 5.950000000e-01, +6.475447979e-03, +6.362356009e-03, +0.000000000e+00, +0.000000000e+00 + 6.000000000e-01, +5.864849137e-03, +5.715830010e-03, +0.000000000e+00, +0.000000000e+00 + 6.050000000e-01, +5.433671357e-03, +5.299087978e-03, +0.000000000e+00, +0.000000000e+00 + 6.100000000e-01, +5.197468252e-03, +5.129410162e-03, +0.000000000e+00, +0.000000000e+00 + 6.150000000e-01, +5.077202785e-03, +5.106158823e-03, +0.000000000e+00, +0.000000000e+00 + 6.200000000e-01, +4.929759807e-03, +5.049076337e-03, +0.000000000e+00, +0.000000000e+00 + 6.250000000e-01, +4.614953879e-03, +4.781820798e-03, +0.000000000e+00, +0.000000000e+00 + 6.300000000e-01, +4.065453400e-03, +4.218925385e-03, +0.000000000e+00, +0.000000000e+00 + 6.350000000e-01, +3.321976548e-03, +3.409447114e-03, +0.000000000e+00, +0.000000000e+00 + 6.400000000e-01, +2.514358764e-03, +2.513321969e-03, +0.000000000e+00, +0.000000000e+00 + 6.450000000e-01, +1.799257573e-03, +1.723920340e-03, +0.000000000e+00, +0.000000000e+00 + 6.500000000e-01, +1.288922182e-03, +1.179616437e-03, +0.000000000e+00, +0.000000000e+00 + 6.550000000e-01, +1.008298071e-03, +9.106261224e-04, +0.000000000e+00, +0.000000000e+00 + 6.600000000e-01, +8.990338949e-04, +8.440947075e-04, +0.000000000e+00, +0.000000000e+00 + 6.650000000e-01, +8.615907150e-04, +8.564444980e-04, +0.000000000e+00, +0.000000000e+00 + 6.700000000e-01, +8.077812289e-04, +8.385986082e-04, +0.000000000e+00, +0.000000000e+00 + 6.750000000e-01, +6.955786241e-04, +7.391303591e-04, +0.000000000e+00, +0.000000000e+00 + 6.800000000e-01, +5.331767100e-04, +5.692065191e-04, +0.000000000e+00, +0.000000000e+00 + 6.850000000e-01, +3.583467518e-04, +3.768544914e-04, +0.000000000e+00, +0.000000000e+00 + 6.900000000e-01, +2.103464980e-04, +2.119867829e-04, +0.000000000e+00, +0.000000000e+00 + 6.950000000e-01, +1.105118481e-04, +1.022163451e-04, +0.000000000e+00, +0.000000000e+00 + 7.000000000e-01, +5.816734218e-05, +4.771136942e-05, +0.000000000e+00, +0.000000000e+00 + 7.050000000e-01, +3.842410848e-05, +3.083713846e-05, +0.000000000e+00, +0.000000000e+00 + 7.100000000e-01, +3.358657835e-05, +3.030941478e-05, +0.000000000e+00, +0.000000000e+00 + 7.150000000e-01, +3.119196881e-05, +3.119244240e-05, +0.000000000e+00, +0.000000000e+00 + 7.200000000e-01, +2.621771686e-05, +2.766748660e-05, +0.000000000e+00, +0.000000000e+00 + 7.250000000e-01, +1.898139954e-05, +2.045192231e-05, +0.000000000e+00, +0.000000000e+00 + 7.300000000e-01, +1.174547974e-05, +1.260366338e-05, +0.000000000e+00, +0.000000000e+00 + 7.350000000e-01, +6.282975258e-06, +6.513443002e-06, +0.000000000e+00, +0.000000000e+00 + 7.400000000e-01, +3.073129614e-06, +2.919838482e-06, +0.000000000e+00, +0.000000000e+00 + 7.450000000e-01, +1.631996061e-06, +1.334507558e-06, +0.000000000e+00, +0.000000000e+00 + 7.500000000e-01, +1.172609455e-06, +8.748577621e-07, +0.000000000e+00, +0.000000000e+00 + 7.550000000e-01, +1.066966607e-06, +8.430311813e-07, +0.000000000e+00, +0.000000000e+00 + 7.600000000e-01, +9.859570273e-07, +8.934205808e-07, +0.000000000e+00, +0.000000000e+00 + 7.650000000e-01, +8.350443405e-07, +9.367642561e-07, +0.000000000e+00, +0.000000000e+00 + 7.700000000e-01, +6.396481236e-07, +9.812152759e-07, +0.000000000e+00, +0.000000000e+00 + 7.750000000e-01, +4.632216136e-07, +1.027302605e-06, +0.000000000e+00, +0.000000000e+00 + 7.800000000e-01, +3.675987312e-07, +1.039850236e-06, +0.000000000e+00, +0.000000000e+00 + 7.850000000e-01, +3.939834184e-07, +9.701974674e-07, +0.000000000e+00, +0.000000000e+00 + 7.900000000e-01, +5.481632918e-07, +7.930783186e-07, +0.000000000e+00, +0.000000000e+00 + 7.950000000e-01, +7.904656681e-07, +5.319564764e-07, +0.000000000e+00, +0.000000000e+00 + 8.000000000e-01, +1.040248176e-06, +2.593108907e-07, +0.000000000e+00, +0.000000000e+00 + 8.050000000e-01, +1.200737810e-06, +7.069377338e-08, +0.000000000e+00, +0.000000000e+00 + 8.100000000e-01, +1.197830340e-06, +4.320731437e-08, +0.000000000e+00, +0.000000000e+00 + 8.150000000e-01, +1.015438191e-06, +1.975535841e-07, +0.000000000e+00, +0.000000000e+00 + 8.200000000e-01, +7.081609881e-07, +4.831739519e-07, +0.000000000e+00, +0.000000000e+00 + 8.250000000e-01, +3.818597930e-07, +7.960616117e-07, +0.000000000e+00, +0.000000000e+00 + 8.300000000e-01, +1.493017616e-07, +1.022440273e-06, +0.000000000e+00, +0.000000000e+00 + 8.350000000e-01, +8.194578772e-08, +1.087468561e-06, +0.000000000e+00, +0.000000000e+00 + 8.400000000e-01, +1.816808942e-07, +9.849492297e-07, +0.000000000e+00, +0.000000000e+00 + 8.450000000e-01, +3.858190834e-07, +7.740711893e-07, +0.000000000e+00, +0.000000000e+00 + 8.500000000e-01, +6.008995669e-07, +5.468304661e-07, +0.000000000e+00, +0.000000000e+00 + 8.550000000e-01, +7.463068032e-07, +3.846313009e-07, +0.000000000e+00, +0.000000000e+00 + 8.600000000e-01, +7.855349422e-07, +3.262709138e-07, +0.000000000e+00, +0.000000000e+00 + 8.650000000e-01, +7.320506670e-07, +3.608504532e-07, +0.000000000e+00, +0.000000000e+00 + 8.700000000e-01, +6.316190027e-07, +4.443856847e-07, +0.000000000e+00, +0.000000000e+00 + 8.750000000e-01, +5.344744333e-07, +5.271701423e-07, +0.000000000e+00, +0.000000000e+00 + 8.800000000e-01, +4.729598600e-07, +5.763245229e-07, +0.000000000e+00, +0.000000000e+00 + 8.850000000e-01, +4.537532756e-07, +5.841452615e-07, +0.000000000e+00, +0.000000000e+00 + 8.900000000e-01, +4.640725116e-07, +5.624888440e-07, +0.000000000e+00, +0.000000000e+00 + 8.950000000e-01, +4.844537042e-07, +5.303337663e-07, +0.000000000e+00, +0.000000000e+00 + 9.000000000e-01, +4.997776646e-07, +5.027773595e-07, +0.000000000e+00, +0.000000000e+00 + 9.050000000e-01, +5.039510729e-07, +4.861654432e-07, +0.000000000e+00, +0.000000000e+00 + 9.100000000e-01, +4.985008492e-07, +4.792528373e-07, +0.000000000e+00, +0.000000000e+00 + 9.150000000e-01, +4.882744128e-07, +4.773024922e-07, +0.000000000e+00, +0.000000000e+00 + 9.200000000e-01, +4.775716044e-07, +4.758436490e-07, +0.000000000e+00, +0.000000000e+00 + 9.250000000e-01, +4.683694073e-07, +4.724173788e-07, +0.000000000e+00, +0.000000000e+00 + 9.300000000e-01, +4.605076723e-07, +4.664470965e-07, +0.000000000e+00, +0.000000000e+00 + 9.350000000e-01, +4.528021517e-07, +4.582956136e-07, +0.000000000e+00, +0.000000000e+00 + 9.400000000e-01, +4.441150571e-07, +4.484818353e-07, +0.000000000e+00, +0.000000000e+00 + 9.450000000e-01, +4.339619655e-07, +4.374663580e-07, +0.000000000e+00, +0.000000000e+00 + 9.500000000e-01, +4.226525684e-07, +4.258459162e-07, +0.000000000e+00, +0.000000000e+00 + 9.550000000e-01, +4.111243670e-07, +4.145692085e-07, +0.000000000e+00, +0.000000000e+00 + 9.600000000e-01, +4.005832275e-07, +4.048549016e-07, +0.000000000e+00, +0.000000000e+00 + 9.650000000e-01, +3.919726493e-07, +3.976902679e-07, +0.000000000e+00, +0.000000000e+00 + 9.700000000e-01, +3.853733004e-07, +3.930868265e-07, +0.000000000e+00, +0.000000000e+00 + 9.750000000e-01, +3.795274377e-07, +3.894449373e-07, +0.000000000e+00, +0.000000000e+00 + 9.800000000e-01, +3.717765668e-07, +3.834516366e-07, +0.000000000e+00, +0.000000000e+00 + 9.850000000e-01, +3.586440635e-07, +3.708050801e-07, +0.000000000e+00, +0.000000000e+00 + 9.900000000e-01, +3.370207764e-07, +3.476966070e-07, +0.000000000e+00, +0.000000000e+00 + 9.950000000e-01, +3.055983668e-07, +3.125838034e-07, +0.000000000e+00, +0.000000000e+00 + 1.000000000e+00, +2.659047270e-07, +2.674496632e-07, +0.000000000e+00, +0.000000000e+00 diff --git a/test/examples/ref/coaxial/open/error-indicators.csv b/test/examples/ref/coaxial/open/error-indicators.csv index b96ddf84f..a25dc337e 100644 --- a/test/examples/ref/coaxial/open/error-indicators.csv +++ b/test/examples/ref/coaxial/open/error-indicators.csv @@ -1,2 +1,2 @@ Norm, Minimum, Maximum, Mean - +9.925002992e-03, +3.073075278e-04, +3.104669897e-03, +5.504384847e-04 + +9.669705923e-03, +3.071587403e-04, +3.000808140e-03, +5.440953971e-04 diff --git a/test/examples/ref/coaxial/open/port-I.csv b/test/examples/ref/coaxial/open/port-I.csv index 91ac9b2d4..3db214067 100644 --- a/test/examples/ref/coaxial/open/port-I.csv +++ b/test/examples/ref/coaxial/open/port-I.csv @@ -1,202 +1,202 @@ t (ns), I_inc[1] (A), I[1] (A) 0.000000000e+00, -5.666088695e-06, +0.000000000e+00 - 5.000000000e-03, -8.409123651e-06, -2.341328245e-06 - 1.000000000e-02, -1.105147275e-05, -5.826382857e-06 - 1.500000000e-02, -1.228163970e-05, -5.222852797e-06 - 2.000000000e-02, -9.778049726e-06, +3.479732768e-07 - 2.500000000e-02, -6.103350322e-20, +1.465152567e-05 - 3.000000000e-02, +2.176144987e-05, +4.434348953e-05 - 3.500000000e-02, +6.083135968e-05, +9.403287533e-05 - 4.000000000e-02, +1.218223334e-04, +1.675061721e-04 - 4.500000000e-02, +2.062970799e-04, +2.640783375e-04 - 5.000000000e-02, +3.093579607e-04, +3.746481283e-04 - 5.500000000e-02, +4.154313032e-04, +4.765161274e-04 - 6.000000000e-02, +4.940139224e-04, +5.303124776e-04 - 6.500000000e-02, +4.967592192e-04, +4.785254386e-04 - 7.000000000e-02, +3.578593563e-04, +2.464419516e-04 - 7.500000000e-02, -5.771941699e-19, -2.468286914e-04 - 8.000000000e-02, -6.520622610e-04, -1.070220787e-03 - 8.500000000e-02, -1.649298690e-03, -2.255609928e-03 - 9.000000000e-02, -2.988610073e-03, -3.763509598e-03 - 9.500000000e-02, -4.579372529e-03, -5.449045749e-03 - 1.000000000e-01, -6.213620742e-03, -7.037466294e-03 - 1.050000000e-01, -7.550108895e-03, -8.117962218e-03 - 1.100000000e-01, -8.123884454e-03, -8.168835362e-03 - 1.150000000e-01, -7.391643913e-03, -6.623897830e-03 - 1.200000000e-01, -4.818124626e-03, -2.980500538e-03 - 1.250000000e-01, +4.687776326e-18, +3.060907027e-03 - 1.300000000e-01, +7.187797314e-03, +1.144478412e-02 - 1.350000000e-01, +1.645040606e-02, +2.162946359e-02 - 1.400000000e-01, +2.697224625e-02, +3.251877276e-02 - 1.450000000e-01, +3.739593417e-02, +4.249139969e-02 - 1.500000000e-01, +4.591279224e-02, +4.955370760e-02 - 1.550000000e-01, +5.047923110e-02, +5.162043776e-02 - 1.600000000e-01, +4.914663699e-02, +4.689357277e-02 - 1.650000000e-01, +4.046146992e-02, +3.428028014e-02 - 1.700000000e-01, +2.386432750e-02, +1.376794562e-02 - 1.750000000e-01, -4.859694655e-17, -1.333615740e-02 - 1.800000000e-01, -2.914795543e-02, -4.438063934e-02 - 1.850000000e-01, -6.036142013e-02, -7.560597885e-02 - 1.900000000e-01, -8.955101123e-02, -1.026340643e-01 - 1.950000000e-01, -1.123435949e-01, -1.211478660e-01 - 2.000000000e-01, -1.248039088e-01, -1.276455366e-01 - 2.050000000e-01, -1.241588739e-01, -1.201223867e-01 - 2.100000000e-01, -1.093778521e-01, -9.853663600e-02 - 2.150000000e-01, -8.147939460e-02, -6.494807193e-02 - 2.200000000e-01, -4.348363979e-02, -2.328103409e-02 - 2.250000000e-01, +2.632536371e-16, +2.125857862e-02 - 2.300000000e-01, +4.348363979e-02, +6.300925395e-02 - 2.350000000e-01, +8.147939460e-02, +9.676630686e-02 - 2.400000000e-01, +1.093778521e-01, +1.186055850e-01 - 2.450000000e-01, +1.241588739e-01, +1.264630066e-01 - 2.500000000e-01, +1.248039088e-01, +1.203676579e-01 - 2.550000000e-01, +1.123435949e-01, +1.023011765e-01 - 2.600000000e-01, +8.955101123e-02, +7.573263818e-02 - 2.650000000e-01, +6.036142013e-02, +4.493958439e-02 - 2.700000000e-01, +2.914795543e-02, +1.425991010e-02 - 2.750000000e-01, +4.859694655e-17, -1.258094285e-02 - 2.800000000e-01, -2.386432750e-02, -3.295370088e-02 - 2.850000000e-01, -4.046146992e-02, -4.555719857e-02 - 2.900000000e-01, -4.914663699e-02, -5.039306818e-02 - 2.950000000e-01, -5.047923110e-02, -4.852842192e-02 - 3.000000000e-01, -4.591279224e-02, -4.172610814e-02 - 3.050000000e-01, -3.739593417e-02, -3.203277302e-02 - 3.100000000e-01, -2.697224625e-02, -2.140621241e-02 - 3.150000000e-01, -1.645040606e-02, -1.144050431e-02 - 3.200000000e-01, -7.187797314e-03, -3.215484308e-03 - 3.250000000e-01, -3.446700285e-16, +2.732340049e-03 - 3.300000000e-01, +4.818124626e-03, +6.342030451e-03 - 3.350000000e-01, +7.391643913e-03, +7.900799002e-03 - 3.400000000e-01, +8.123884454e-03, +7.895842767e-03 - 3.450000000e-01, +7.550108895e-03, +6.877350462e-03 - 3.500000000e-01, +6.213620742e-03, +5.353272622e-03 - 3.550000000e-01, +4.579372529e-03, +3.724889150e-03 - 3.600000000e-01, +2.988610073e-03, +2.261636930e-03 - 3.650000000e-01, +1.649298690e-03, +1.106278632e-03 - 3.700000000e-01, +6.520622610e-04, +2.994100523e-04 - 3.750000000e-01, +5.639207957e-17, -1.877215768e-04 - 3.800000000e-01, -3.578593563e-04, -4.212988284e-04 - 3.850000000e-01, -4.967592192e-04, -4.791063955e-04 - 3.900000000e-01, -4.940139224e-04, -4.330192664e-04 - 3.950000000e-01, -4.154313032e-04, -3.398058531e-04 - 4.000000000e-01, -3.093579607e-04, -2.384866096e-04 - 4.050000000e-01, -2.062970799e-04, -1.519507981e-04 - 4.100000000e-01, -1.218223334e-04, -9.061788621e-05 - 4.150000000e-01, -6.083135968e-05, -5.657699314e-05 - 4.200000000e-01, -2.176144987e-05, -4.703147657e-05 - 4.250000000e-01, -2.551434914e-18, -5.638876144e-05 - 4.300000000e-01, +9.778049726e-06, -7.709635928e-05 - 4.350000000e-01, +1.228163970e-05, -9.939274851e-05 - 4.400000000e-01, +1.105147275e-05, -1.104337822e-04 - 4.450000000e-01, +8.409123651e-06, -9.345181856e-05 - 4.500000000e-01, +5.666088695e-06, -2.757160012e-05 - 4.550000000e-01, +3.418894541e-06, +1.109098639e-04 - 4.600000000e-01, +1.826796159e-06, +3.453203865e-04 - 4.650000000e-01, +8.253938937e-07, +6.930334221e-04 - 4.700000000e-01, +2.671727168e-07, +1.157264898e-03 - 4.750000000e-01, +3.777032805e-20, +1.717043890e-03 - 4.800000000e-01, -9.828734975e-08, +2.316637421e-03 - 4.850000000e-01, -1.117049164e-07, +2.856602373e-03 - 4.900000000e-01, -9.095082526e-08, +3.189983553e-03 - 4.950000000e-01, -6.261923782e-08, +3.127563524e-03 - 5.000000000e-01, -3.817780532e-08, +2.455691203e-03 - 5.050000000e-01, -2.084413355e-08, +9.688499997e-04 - 5.100000000e-01, -1.007763869e-08, -1.483575424e-03 - 5.150000000e-01, -4.120031130e-09, -4.940966327e-03 - 5.200000000e-01, -1.206707201e-09, -9.274453358e-03 - 5.250000000e-01, -1.928824299e-22, -1.414136523e-02 - 5.300000000e-01, +3.634532244e-10, -1.896591061e-02 - 5.350000000e-01, +3.737607916e-10, -2.296063413e-02 - 5.400000000e-01, +2.753586026e-10, -2.519867816e-02 - 5.450000000e-01, +1.715419466e-10, -2.473896970e-02 - 5.500000000e-01, +9.463331804e-11, -2.079459638e-02 - 5.550000000e-01, +4.675063429e-11, -1.292100401e-02 - 5.600000000e-01, +2.045186871e-11, -1.189592827e-03 - 5.650000000e-01, +7.565632846e-12, +1.369336068e-02 - 5.700000000e-01, +2.005013126e-12, +3.036044781e-02 - 5.750000000e-01, +2.328620401e-25, +4.687646341e-02 - 5.800000000e-01, -4.944301496e-13, +6.095820497e-02 - 5.850000000e-01, -4.600666072e-13, +7.030121795e-02 - 5.900000000e-01, -3.066875683e-13, +7.296660116e-02 - 5.950000000e-01, -1.728774743e-13, +6.775924242e-02 - 6.000000000e-01, -8.629441606e-14, +5.452046086e-02 - 6.050000000e-01, -3.857417852e-14, +3.426660203e-02 - 6.100000000e-01, -1.526907493e-14, +9.129237333e-03 - 6.150000000e-01, -5.110878347e-15, -1.791083129e-02 - 6.200000000e-01, -1.225569810e-15, -4.346096665e-02 - 6.250000000e-01, -9.083457823e-29, -6.425120728e-02 - 6.300000000e-01, +2.474382771e-16, -7.766602564e-02 - 6.350000000e-01, +2.083306657e-16, -8.217045555e-02 - 6.400000000e-01, +1.256606244e-16, -7.754756590e-02 - 6.450000000e-01, +6.409320687e-17, -6.490156537e-02 - 6.500000000e-01, +2.894855159e-17, -4.642818273e-02 - 6.550000000e-01, +1.170877290e-17, -2.500208263e-02 - 6.600000000e-01, +4.193705940e-18, -3.668629077e-03 - 6.650000000e-01, +1.270139270e-18, +1.485697180e-02 - 6.700000000e-01, +2.755906037e-19, +2.858932324e-02 - 6.750000000e-01, +1.075875659e-32, +3.650516194e-02 - 6.800000000e-01, -4.555482039e-20, +3.858045844e-02 - 6.850000000e-01, -3.470493289e-20, +3.564669110e-02 - 6.900000000e-01, -1.894121233e-20, +2.911792423e-02 - 6.950000000e-01, -8.741603680e-21, +2.066017053e-02 - 7.000000000e-01, -3.572535080e-21, +1.187373405e-02 - 7.050000000e-01, -1.307469592e-21, +4.045795954e-03 - 7.100000000e-01, -4.237295397e-22, -1.991475163e-03 - 7.150000000e-01, -1.161215067e-22, -5.890643897e-03 - 7.200000000e-01, -2.279797517e-23, -7.725859078e-03 - 7.250000000e-01, -3.241225490e-37, -7.870427638e-03 - 7.300000000e-01, +3.085370426e-24, -6.851670009e-03 - 7.350000000e-01, +2.126839583e-24, -5.216425636e-03 - 7.400000000e-01, +1.050320519e-24, -3.431769700e-03 - 7.450000000e-01, +4.386071853e-25, -1.830455598e-03 - 7.500000000e-01, +1.621928417e-25, -5.972682855e-04 - 7.550000000e-01, +5.371026932e-26, +2.130226558e-04 - 7.600000000e-01, +1.575016203e-26, +6.385535506e-04 - 7.650000000e-01, +3.905525687e-27, +7.687813031e-04 - 7.700000000e-01, +6.937989919e-28, +7.088488339e-04 - 7.750000000e-01, -6.993531703e-42, +5.539640292e-04 - 7.800000000e-01, -7.687511957e-29, +3.753644806e-04 - 7.850000000e-01, -4.794946636e-29, +2.168652772e-04 - 7.900000000e-01, -2.142601701e-29, +9.846232662e-05 - 7.950000000e-01, -8.095914059e-30, +2.321542722e-05 - 8.000000000e-01, -2.708896312e-30, -1.588527022e-05 - 8.050000000e-01, -8.116869824e-31, -2.988227298e-05 - 8.100000000e-01, -2.153708036e-31, -2.906187038e-05 - 8.150000000e-01, -4.832277353e-32, -2.143948000e-05 - 8.200000000e-01, -7.767416097e-33, -1.264875586e-05 - 8.250000000e-01, +2.050715652e-46, -5.242870100e-06 - 8.300000000e-01, +7.046440907e-34, +1.332816899e-07 - 8.350000000e-01, +3.976842028e-34, +3.303535737e-06 - 8.400000000e-01, +1.607927855e-34, +4.973393460e-06 - 8.450000000e-01, +5.497453374e-35, +6.046476359e-06 - 8.500000000e-01, +1.664403419e-35, +6.919883166e-06 - 8.550000000e-01, +4.512584527e-36, +8.151899452e-06 - 8.600000000e-01, +1.083413267e-36, +1.002430154e-05 - 8.650000000e-01, +2.199529168e-37, +1.252806677e-05 - 8.700000000e-01, +3.199079223e-38, +1.587450447e-05 - 8.750000000e-01, -1.264445967e-51, +1.967572389e-05 - 8.800000000e-01, -2.376070608e-39, +2.342158691e-05 - 8.850000000e-01, -1.213384435e-39, +2.685271559e-05 - 8.900000000e-01, -4.439123120e-40, +2.874090899e-05 - 8.950000000e-01, -1.373291519e-40, +2.783103301e-05 - 9.000000000e-01, -3.762099992e-41, +2.330892613e-05 - 9.050000000e-01, -9.229276070e-42, +1.352782569e-05 - 9.100000000e-01, -2.004965889e-42, -2.719074094e-06 - 9.150000000e-01, -3.683096656e-43, -2.562726907e-05 - 9.200000000e-01, -4.847066048e-44, -5.534552869e-05 - 9.250000000e-01, +2.695492675e-57, -9.068875523e-05 - 9.300000000e-01, +2.947503899e-45, -1.288820097e-04 - 9.350000000e-01, +1.361958949e-45, -1.663232170e-04 - 9.400000000e-01, +4.508513145e-46, -1.979251650e-04 - 9.450000000e-01, +1.262029305e-46, -2.178116062e-04 - 9.500000000e-01, +3.128294188e-47, -2.201943249e-04 - 9.550000000e-01, +6.944091618e-48, -1.996586286e-04 - 9.600000000e-01, +1.364977037e-48, -1.527530818e-04 - 9.650000000e-01, +2.268830361e-49, -7.868418770e-05 - 9.700000000e-01, +2.701707935e-50, +2.030635422e-05 - 9.750000000e-01, -1.705334349e-63, +1.379091339e-04 - 9.800000000e-01, -1.345101176e-51, +2.643975828e-04 - 9.850000000e-01, -5.623868195e-52, +3.875697235e-04 - 9.900000000e-01, -1.684515487e-52, +4.936088326e-04 - 9.950000000e-01, -4.266597350e-53, +5.692109850e-04 - 1.000000000e+00, -9.569524512e-54, +6.035387639e-04 + 5.000000000e-03, -8.409123651e-06, -2.279465662e-06 + 1.000000000e-02, -1.105147275e-05, -6.104854862e-06 + 1.500000000e-02, -1.228163970e-05, -7.036201019e-06 + 2.000000000e-02, -9.778049726e-06, -4.567147137e-06 + 2.500000000e-02, -6.103350322e-20, +4.433594715e-06 + 3.000000000e-02, +2.176144987e-05, +2.603404286e-05 + 3.500000000e-02, +6.083135968e-05, +6.501699663e-05 + 4.000000000e-02, +1.218223334e-04, +1.262776913e-04 + 4.500000000e-02, +2.062970799e-04, +2.118296913e-04 + 5.000000000e-02, +3.093579607e-04, +3.173618809e-04 + 5.500000000e-02, +4.154313032e-04, +4.272823161e-04 + 6.000000000e-02, +4.940139224e-04, +5.111171470e-04 + 6.500000000e-02, +4.967592192e-04, +5.206886081e-04 + 7.000000000e-02, +3.578593563e-04, +3.886785355e-04 + 7.500000000e-02, -5.771941699e-19, +3.582147265e-05 + 8.000000000e-02, -6.520622610e-04, -6.153389310e-04 + 8.500000000e-02, -1.649298690e-03, -1.619463514e-03 + 9.000000000e-02, -2.988610073e-03, -2.976954811e-03 + 9.500000000e-02, -4.579372529e-03, -4.599372030e-03 + 1.000000000e-01, -6.213620742e-03, -6.279384829e-03 + 1.050000000e-01, -7.550108895e-03, -7.673257929e-03 + 1.100000000e-01, -8.123884454e-03, -8.308949454e-03 + 1.150000000e-01, -7.391643913e-03, -7.631639645e-03 + 1.200000000e-01, -4.818124626e-03, -5.091253532e-03 + 1.250000000e-01, +4.687776326e-18, -2.676010971e-04 + 1.300000000e-01, +7.187797314e-03, +6.979916447e-03 + 1.350000000e-01, +1.645040606e-02, +1.636584859e-02 + 1.400000000e-01, +2.697224625e-02, +2.707472498e-02 + 1.450000000e-01, +3.739593417e-02, +3.773684453e-02 + 1.500000000e-01, +4.591279224e-02, +4.651714030e-02 + 1.550000000e-01, +5.047923110e-02, +5.133402751e-02 + 1.600000000e-01, +4.914663699e-02, +5.019442015e-02 + 1.650000000e-01, +4.046146992e-02, +4.160106921e-02 + 1.700000000e-01, +2.386432750e-02, +2.496072306e-02 + 1.750000000e-01, -4.859694655e-17, +9.027416975e-04 + 1.800000000e-01, -2.914795543e-02, -2.858089172e-02 + 1.850000000e-01, -6.036142013e-02, -6.023860350e-02 + 1.900000000e-01, -8.955101123e-02, -8.992623717e-02 + 1.950000000e-01, -1.123435949e-01, -1.132034053e-01 + 2.000000000e-01, -1.248039088e-01, -1.260674341e-01 + 2.050000000e-01, -1.241588739e-01, -1.256901005e-01 + 2.100000000e-01, -1.093778521e-01, -1.110084115e-01 + 2.150000000e-01, -8.147939460e-02, -8.303731511e-02 + 2.200000000e-01, -4.348363979e-02, -4.482170606e-02 + 2.250000000e-01, +2.632536371e-16, -1.017952044e-03 + 2.300000000e-01, +4.348363979e-02, +4.282753850e-02 + 2.350000000e-01, +8.147939460e-02, +8.116905378e-02 + 2.400000000e-01, +1.093778521e-01, +1.093513159e-01 + 2.450000000e-01, +1.241588739e-01, +1.243278841e-01 + 2.500000000e-01, +1.248039088e-01, +1.250757389e-01 + 2.550000000e-01, +1.123435949e-01, +1.126400748e-01 + 2.600000000e-01, +8.955101123e-02, +8.982093901e-02 + 2.650000000e-01, +6.036142013e-02, +6.058437068e-02 + 2.700000000e-01, +2.914795543e-02, +2.933003651e-02 + 2.750000000e-01, +4.859694655e-17, +1.640427998e-04 + 2.800000000e-01, -2.386432750e-02, -2.369071496e-02 + 2.850000000e-01, -4.046146992e-02, -4.025665607e-02 + 2.900000000e-01, -4.914663699e-02, -4.890201756e-02 + 2.950000000e-01, -5.047923110e-02, -5.020114773e-02 + 3.000000000e-01, -4.591279224e-02, -4.562002034e-02 + 3.050000000e-01, -3.739593417e-02, -3.711414519e-02 + 3.100000000e-01, -2.697224625e-02, -2.672715668e-02 + 3.150000000e-01, -1.645040606e-02, -1.626186381e-02 + 3.200000000e-01, -7.187797314e-03, -7.066117894e-03 + 3.250000000e-01, -3.446700285e-16, +5.515303396e-05 + 3.300000000e-01, +4.818124626e-03, +4.816373871e-03 + 3.350000000e-01, +7.391643913e-03, +7.348725045e-03 + 3.400000000e-01, +8.123884454e-03, +8.057871019e-03 + 3.450000000e-01, +7.550108895e-03, +7.478021128e-03 + 3.500000000e-01, +6.213620742e-03, +6.148888559e-03 + 3.550000000e-01, +4.579372529e-03, +4.530539126e-03 + 3.600000000e-01, +2.988610073e-03, +2.959384056e-03 + 3.650000000e-01, +1.649298690e-03, +1.639365017e-03 + 3.700000000e-01, +6.520622610e-04, +6.583132266e-04 + 3.750000000e-01, +5.639207957e-17, +1.798187589e-05 + 3.800000000e-01, -3.578593563e-04, -3.327979443e-04 + 3.850000000e-01, -4.967592192e-04, -4.687482842e-04 + 3.900000000e-01, -4.940139224e-04, -4.663240107e-04 + 3.950000000e-01, -4.154313032e-04, -3.905392884e-04 + 4.000000000e-01, -3.093579607e-04, -2.893169810e-04 + 4.050000000e-01, -2.062970799e-04, -1.932572031e-04 + 4.100000000e-01, -1.218223334e-04, -1.185003095e-04 + 4.150000000e-01, -6.083135968e-05, -7.083741475e-05 + 4.200000000e-01, -2.176144987e-05, -4.959943871e-05 + 4.250000000e-01, -2.551434914e-18, -5.040158223e-05 + 4.300000000e-01, +9.778049726e-06, -6.662034254e-05 + 4.350000000e-01, +1.228163970e-05, -8.963785103e-05 + 4.400000000e-01, +1.105147275e-05, -1.082181466e-04 + 4.450000000e-01, +8.409123651e-06, -1.076032578e-04 + 4.500000000e-01, +5.666088695e-06, -6.891683625e-05 + 4.550000000e-01, +3.418894541e-06, +3.033423391e-05 + 4.600000000e-01, +1.826796159e-06, +2.141425316e-04 + 4.650000000e-01, +8.253938937e-07, +5.036982409e-04 + 4.700000000e-01, +2.671727168e-07, +9.104394389e-04 + 4.750000000e-01, +3.777032805e-20, +1.426879333e-03 + 4.800000000e-01, -9.828734975e-08, +2.016053765e-03 + 4.850000000e-01, -1.117049164e-07, +2.601282529e-03 + 4.900000000e-01, -9.095082526e-08, +3.059322132e-03 + 4.950000000e-01, -6.261923782e-08, +3.220640886e-03 + 5.000000000e-01, -3.817780532e-08, +2.880612905e-03 + 5.050000000e-01, -2.084413355e-08, +1.824643358e-03 + 5.100000000e-01, -1.007763869e-08, -1.318240696e-04 + 5.150000000e-01, -4.120031130e-09, -3.091022609e-03 + 5.200000000e-01, -1.206707201e-09, -7.014995127e-03 + 5.250000000e-01, -1.928824299e-22, -1.167249172e-02 + 5.300000000e-01, +3.634532244e-10, -1.660451755e-02 + 5.350000000e-01, +3.737607916e-10, -2.112373949e-02 + 5.400000000e-01, +2.753586026e-10, -2.436045456e-02 + 5.450000000e-01, +1.715419466e-10, -2.536187353e-02 + 5.500000000e-01, +9.463331804e-11, -2.324111735e-02 + 5.550000000e-01, +4.675063429e-11, -1.735907798e-02 + 5.600000000e-01, +2.045186871e-11, -7.509945122e-03 + 5.650000000e-01, +7.565632846e-12, +5.927458562e-03 + 5.700000000e-01, +2.005013126e-12, +2.191263319e-02 + 5.750000000e-01, +2.328620401e-25, +3.877451310e-02 + 5.800000000e-01, -4.944301496e-13, +5.436879699e-02 + 5.850000000e-01, -4.600666072e-13, +6.635561375e-02 + 5.900000000e-01, -3.066875683e-13, +7.256384413e-02 + 5.950000000e-01, -1.728774743e-13, +7.138288589e-02 + 6.000000000e-01, -8.629441606e-14, +6.210737871e-02 + 6.050000000e-01, -3.857417852e-14, +4.516040387e-02 + 6.100000000e-01, -1.526907493e-14, +2.213662937e-02 + 6.150000000e-01, -5.110878347e-15, -4.362280688e-03 + 6.200000000e-01, -1.225569810e-15, -3.108669484e-02 + 6.250000000e-01, -9.083457823e-29, -5.463638011e-02 + 6.300000000e-01, +2.474382771e-16, -7.200652759e-02 + 6.350000000e-01, +2.083306657e-16, -8.107865508e-02 + 6.400000000e-01, +1.256606244e-16, -8.096109780e-02 + 6.450000000e-01, +6.409320687e-17, -7.211243226e-02 + 6.500000000e-01, +2.894855159e-17, -5.622463705e-02 + 6.550000000e-01, +1.170877290e-17, -3.589267574e-02 + 6.600000000e-01, +4.193705940e-18, -1.414183746e-02 + 6.650000000e-01, +1.270139270e-18, +6.089239024e-03 + 6.700000000e-01, +2.755906037e-19, +2.240938153e-02 + 6.750000000e-01, +1.075875659e-32, +3.329738422e-02 + 6.800000000e-01, -4.555482039e-20, +3.823734807e-02 + 6.850000000e-01, -3.470493289e-20, +3.766044194e-02 + 6.900000000e-01, -1.894121233e-20, +3.272866847e-02 + 6.950000000e-01, -8.741603680e-21, +2.502430912e-02 + 7.000000000e-01, -3.572535080e-21, +1.621716482e-02 + 7.050000000e-01, -1.307469592e-21, +7.775620077e-03 + 7.100000000e-01, -4.237295397e-22, +7.697310683e-04 + 7.150000000e-01, -1.161215067e-22, -4.213272189e-03 + 7.200000000e-01, -2.279797517e-23, -7.049086115e-03 + 7.250000000e-01, -3.241225490e-37, -7.979227496e-03 + 7.300000000e-01, +3.085370426e-24, -7.472284010e-03 + 7.350000000e-01, +2.126839583e-24, -6.080112542e-03 + 7.400000000e-01, +1.050320519e-24, -4.319305044e-03 + 7.450000000e-01, +4.386071853e-25, -2.594106652e-03 + 7.500000000e-01, +1.621928417e-25, -1.162687821e-03 + 7.550000000e-01, +5.371026932e-26, -1.408438988e-04 + 7.600000000e-01, +1.575016203e-26, +4.682027305e-04 + 7.650000000e-01, +3.905525687e-27, +7.331267312e-04 + 7.700000000e-01, +6.937989919e-28, +7.552669739e-04 + 7.750000000e-01, -6.993531703e-42, +6.373124650e-04 + 7.800000000e-01, -7.687511957e-29, +4.634122058e-04 + 7.850000000e-01, -4.794946636e-29, +2.909699949e-04 + 7.900000000e-01, -2.142601701e-29, +1.512283973e-04 + 7.950000000e-01, -8.095914059e-30, +5.487228030e-05 + 8.000000000e-01, -2.708896312e-30, -1.038804897e-06 + 8.050000000e-01, -8.116869824e-31, -2.627034692e-05 + 8.100000000e-01, -2.153708036e-31, -3.164381107e-05 + 8.150000000e-01, -4.832277353e-32, -2.650277563e-05 + 8.200000000e-01, -7.767416097e-33, -1.789861163e-05 + 8.250000000e-01, +2.050715652e-46, -9.605564661e-06 + 8.300000000e-01, +7.046440907e-34, -3.093234898e-06 + 8.350000000e-01, +3.976842028e-34, +1.055734890e-06 + 8.400000000e-01, +1.607927855e-34, +3.362944132e-06 + 8.450000000e-01, +5.497453374e-35, +4.708299429e-06 + 8.500000000e-01, +1.664403419e-35, +5.575026565e-06 + 8.550000000e-01, +4.512584527e-36, +6.595329493e-06 + 8.600000000e-01, +1.083413267e-36, +8.135592089e-06 + 8.650000000e-01, +2.199529168e-37, +1.027185492e-05 + 8.700000000e-01, +3.199079223e-38, +1.327329946e-05 + 8.750000000e-01, -1.264445967e-51, +1.686284935e-05 + 8.800000000e-01, -2.376070608e-39, +2.063901018e-05 + 8.850000000e-01, -1.213384435e-39, +2.443350519e-05 + 8.900000000e-01, -4.439123120e-40, +2.718187408e-05 + 8.950000000e-01, -1.373291519e-40, +2.773946072e-05 + 9.000000000e-01, -3.762099992e-41, +2.531476622e-05 + 9.050000000e-01, -9.229276070e-42, +1.828262610e-05 + 9.100000000e-01, -2.004965889e-42, +5.303549001e-06 + 9.150000000e-01, -3.683096656e-43, -1.413025411e-05 + 9.200000000e-01, -4.847066048e-44, -4.056119047e-05 + 9.250000000e-01, +2.695492675e-57, -7.337177084e-05 + 9.300000000e-01, +2.947503899e-45, -1.104648449e-04 + 9.350000000e-01, +1.361958949e-45, -1.488772042e-04 + 9.400000000e-01, +4.508513145e-46, -1.840901569e-04 + 9.450000000e-01, +1.262029305e-46, -2.105602997e-04 + 9.500000000e-01, +3.128294188e-47, -2.224604783e-04 + 9.550000000e-01, +6.944091618e-48, -2.139153398e-04 + 9.600000000e-01, +1.364977037e-48, -1.804917306e-04 + 9.650000000e-01, +2.268830361e-49, -1.199649268e-04 + 9.700000000e-01, +2.701707935e-50, -3.284443206e-05 + 9.750000000e-01, -1.705334349e-63, +7.643907554e-05 + 9.800000000e-01, -1.345101176e-51, +1.998517569e-04 + 9.850000000e-01, -5.623868195e-52, +3.263928552e-04 + 9.900000000e-01, -1.684515487e-52, +4.427266851e-04 + 9.950000000e-01, -4.266597350e-53, +5.350871054e-04 + 1.000000000e+00, -9.569524512e-54, +5.911873106e-04 diff --git a/test/examples/ref/coaxial/open/port-V.csv b/test/examples/ref/coaxial/open/port-V.csv index 0f7a5690f..84d0750c3 100644 --- a/test/examples/ref/coaxial/open/port-V.csv +++ b/test/examples/ref/coaxial/open/port-V.csv @@ -1,202 +1,202 @@ t (ns), V_inc[1] (V), V[1] (V) 0.000000000e+00, -2.833044348e-04, +0.000000000e+00 - 5.000000000e-03, -4.204561825e-04, -1.409600057e-04 - 1.000000000e-02, -5.525736376e-04, -2.576208519e-04 - 1.500000000e-02, -6.140819852e-04, -2.326884943e-04 - 2.000000000e-02, -4.889024863e-04, +1.474786102e-05 - 2.500000000e-02, -3.051675161e-18, +7.795612050e-04 - 3.000000000e-02, +1.088072493e-03, +2.242751383e-03 - 3.500000000e-02, +3.041567984e-03, +4.700349857e-03 - 4.000000000e-02, +6.091116670e-03, +8.325047125e-03 - 4.500000000e-02, +1.031485399e-02, +1.305720735e-02 - 5.000000000e-02, +1.546789803e-02, +1.841840504e-02 - 5.500000000e-02, +2.077156516e-02, +2.329007028e-02 - 6.000000000e-02, +2.470069612e-02, +2.573350592e-02 - 6.500000000e-02, +2.483796096e-02, +2.286439221e-02 - 7.000000000e-02, +1.789296781e-02, +1.105721800e-02 - 7.500000000e-02, -2.885970849e-17, -1.359924149e-02 - 8.000000000e-02, -3.260311305e-02, -5.445708636e-02 - 8.500000000e-02, -8.246493451e-02, -1.129251561e-01 - 9.000000000e-02, -1.494305036e-01, -1.868767856e-01 - 9.500000000e-02, -2.289686265e-01, -2.690380943e-01 - 1.000000000e-01, -3.106810371e-01, -3.457241810e-01 - 1.050000000e-01, -3.775054448e-01, -3.966135813e-01 - 1.100000000e-01, -4.061942227e-01, -3.960888280e-01 - 1.150000000e-01, -3.695821957e-01, -3.165165359e-01 - 1.200000000e-01, -2.409062313e-01, -1.335577495e-01 - 1.250000000e-01, +2.343888163e-16, +1.669052709e-01 - 1.300000000e-01, +3.593898657e-01, +5.813329112e-01 - 1.350000000e-01, +8.225203029e-01, +1.082240954e+00 - 1.400000000e-01, +1.348612313e+00, +1.614902943e+00 - 1.450000000e-01, +1.869796708e+00, +2.098941344e+00 - 1.500000000e-01, +2.295639612e+00, +2.436078661e+00 - 1.550000000e-01, +2.523961555e+00, +2.524037283e+00 - 1.600000000e-01, +2.457331849e+00, +2.275240314e+00 - 1.650000000e-01, +2.023073496e+00, +1.637412542e+00 - 1.700000000e-01, +1.193216375e+00, +6.119189859e-01 - 1.750000000e-01, -2.429847328e-15, -7.346571262e-01 - 1.800000000e-01, -1.457397771e+00, -2.269579629e+00 - 1.850000000e-01, -3.018071006e+00, -3.805872481e+00 - 1.900000000e-01, -4.477550561e+00, -5.126751444e+00 - 1.950000000e-01, -5.617179743e+00, -6.019342246e+00 - 2.000000000e-01, -6.240195442e+00, -6.311939346e+00 - 2.050000000e-01, -6.207943693e+00, -5.907639100e+00 - 2.100000000e-01, -5.468892605e+00, -4.807164232e+00 - 2.150000000e-01, -4.073969730e+00, -3.115417780e+00 - 2.200000000e-01, -2.174181990e+00, -1.029451119e+00 - 2.250000000e-01, +1.316268185e-14, +1.190700710e+00 - 2.300000000e-01, +2.174181990e+00, +3.263171034e+00 - 2.350000000e-01, +4.073969730e+00, +4.929624194e+00 - 2.400000000e-01, +5.468892605e+00, +5.996135954e+00 - 2.450000000e-01, +6.207943693e+00, +6.361863081e+00 - 2.500000000e-01, +6.240195442e+00, +6.030465394e+00 - 2.550000000e-01, +5.617179743e+00, +5.102911694e+00 - 2.600000000e-01, +4.477550561e+00, +3.754115651e+00 - 2.650000000e-01, +3.018071006e+00, +2.198951398e+00 - 2.700000000e-01, +1.457397771e+00, +6.548446195e-01 - 2.750000000e-01, +2.429847328e-15, -6.918569599e-01 - 2.800000000e-01, -1.193216375e+00, -1.710040781e+00 - 2.850000000e-01, -2.023073496e+00, -2.335368116e+00 - 2.900000000e-01, -2.457331849e+00, -2.568925943e+00 - 2.950000000e-01, -2.523961555e+00, -2.465273997e+00 - 3.000000000e-01, -2.295639612e+00, -2.113823015e+00 - 3.050000000e-01, -1.869796708e+00, -1.618090956e+00 - 3.100000000e-01, -1.348612313e+00, -1.076964915e+00 - 3.150000000e-01, -8.225203029e-01, -5.708552889e-01 - 3.200000000e-01, -3.593898657e-01, -1.541107244e-01 - 3.250000000e-01, -1.723350142e-14, +1.464156523e-01 - 3.300000000e-01, +2.409062313e-01, +3.279264889e-01 - 3.350000000e-01, +3.695821957e-01, +4.052333730e-01 - 3.400000000e-01, +4.061942227e-01, +4.032438919e-01 - 3.450000000e-01, +3.775054448e-01, +3.500076048e-01 - 3.500000000e-01, +3.106810371e-01, +2.713867794e-01 - 3.550000000e-01, +2.289686265e-01, +1.877924241e-01 - 3.600000000e-01, +1.494305036e-01, +1.128965002e-01 - 3.650000000e-01, +8.246493451e-02, +5.391049017e-02 - 3.700000000e-01, +3.260311305e-02, +1.284754723e-02 - 3.750000000e-01, +2.819603979e-15, -1.181376421e-02 - 3.800000000e-01, -1.789296781e-02, -2.349177650e-02 - 3.850000000e-01, -2.483796096e-02, -2.617395229e-02 - 3.900000000e-01, -2.470069612e-02, -2.352491519e-02 - 3.950000000e-01, -2.077156516e-02, -1.841081207e-02 - 4.000000000e-01, -1.546789803e-02, -1.275961299e-02 - 4.050000000e-01, -1.031485399e-02, -7.644740047e-03 - 4.100000000e-01, -6.091116670e-03, -3.484563624e-03 - 4.150000000e-01, -3.041567984e-03, -2.749348208e-04 - 4.200000000e-01, -1.088072493e-03, +2.197396963e-03 - 4.250000000e-01, -1.275717457e-16, +4.174323599e-03 - 4.300000000e-01, +4.889024863e-04, +5.787574427e-03 - 4.350000000e-01, +6.140819852e-04, +6.958058682e-03 - 4.400000000e-01, +5.525736376e-04, +7.325231202e-03 - 4.450000000e-01, +4.204561825e-04, +6.216282725e-03 - 4.500000000e-01, +2.833044348e-04, +2.665150570e-03 - 4.550000000e-01, +1.709447271e-04, -4.495236385e-03 - 4.600000000e-01, +9.133980795e-05, -1.644346541e-02 - 4.650000000e-01, +4.126969468e-05, -3.406903331e-02 - 4.700000000e-01, +1.335863584e-05, -5.754845571e-02 - 4.750000000e-01, +1.888516403e-18, -8.582974347e-02 - 4.800000000e-01, -4.914367487e-06, -1.160964098e-01 - 4.850000000e-01, -5.585245819e-06, -1.433196972e-01 - 4.900000000e-01, -4.547541263e-06, -1.600735153e-01 - 4.950000000e-01, -3.130961891e-06, -1.568101880e-01 - 5.000000000e-01, -1.908890266e-06, -1.227732265e-01 - 5.050000000e-01, -1.042206678e-06, -4.765233297e-02 - 5.100000000e-01, -5.038819347e-07, +7.605576968e-02 - 5.150000000e-01, -2.060015565e-07, +2.502118497e-01 - 5.200000000e-01, -6.033536005e-08, +4.681736657e-01 - 5.250000000e-01, -9.644121496e-21, +7.125336177e-01 - 5.300000000e-01, +1.817266122e-08, +9.541904299e-01 - 5.350000000e-01, +1.868803958e-08, +1.153482855e+00 - 5.400000000e-01, +1.376793013e-08, +1.263883808e+00 - 5.450000000e-01, +8.577097330e-09, +1.238335191e+00 - 5.500000000e-01, +4.731665902e-09, +1.037716448e+00 - 5.550000000e-01, +2.337531714e-09, +6.402634116e-01 - 5.600000000e-01, +1.022593435e-09, +5.020466059e-02 - 5.650000000e-01, +3.782816423e-10, -6.963917749e-01 - 5.700000000e-01, +1.002506563e-10, -1.530454085e+00 - 5.750000000e-01, +1.164310201e-23, -2.354742973e+00 - 5.800000000e-01, -2.472150748e-11, -3.054993739e+00 - 5.850000000e-01, -2.300333036e-11, -3.516341491e+00 - 5.900000000e-01, -1.533437842e-11, -3.642648861e+00 - 5.950000000e-01, -8.643873713e-12, -3.375304639e+00 - 6.000000000e-01, -4.314720803e-12, -2.707656239e+00 - 6.050000000e-01, -1.928708926e-12, -1.691682636e+00 - 6.100000000e-01, -7.634537466e-13, -4.347432898e-01 - 6.150000000e-01, -2.555439173e-13, +9.139218398e-01 - 6.200000000e-01, -6.127849048e-14, +2.185136591e+00 - 6.250000000e-01, -4.541728911e-27, +3.216440182e+00 - 6.300000000e-01, +1.237191386e-14, +3.878476998e+00 - 6.350000000e-01, +1.041653328e-14, +4.096020936e+00 - 6.400000000e-01, +6.283031218e-15, +3.859537364e+00 - 6.450000000e-01, +3.204660344e-15, +3.225065430e+00 - 6.500000000e-01, +1.447427579e-15, +2.302579285e+00 - 6.550000000e-01, +5.854386450e-16, +1.235359885e+00 - 6.600000000e-01, +2.096852970e-16, +1.747203518e-01 - 6.650000000e-01, +6.350696352e-17, -7.448127212e-01 - 6.700000000e-01, +1.377953018e-17, -1.425213505e+00 - 6.750000000e-01, +5.379378296e-31, -1.816312279e+00 - 6.800000000e-01, -2.277741020e-18, -1.917472974e+00 - 6.850000000e-01, -1.735246645e-18, -1.770362602e+00 - 6.900000000e-01, -9.470606165e-19, -1.445363419e+00 - 6.950000000e-01, -4.370801840e-19, -1.025161210e+00 - 7.000000000e-01, -1.786267540e-19, -5.890357879e-01 - 7.050000000e-01, -6.537347961e-20, -2.006727164e-01 - 7.100000000e-01, -2.118647699e-20, +9.880648125e-02 - 7.150000000e-01, -5.806075333e-21, +2.922831707e-01 - 7.200000000e-01, -1.139898758e-21, +3.834887377e-01 - 7.250000000e-01, -1.620612745e-35, +3.909238165e-01 - 7.300000000e-01, +1.542685213e-22, +3.406847107e-01 - 7.350000000e-01, +1.063419792e-22, +2.598346904e-01 - 7.400000000e-01, +5.251602594e-23, +1.714947528e-01 - 7.450000000e-01, +2.193035927e-23, +9.213970540e-02 - 7.500000000e-01, +8.109642085e-24, +3.093696304e-02 - 7.550000000e-01, +2.685513466e-24, -9.364835194e-03 - 7.600000000e-01, +7.875081013e-25, -3.062105112e-02 - 7.650000000e-01, +1.952762843e-25, -3.723643096e-02 - 7.700000000e-01, +3.468994959e-26, -3.439666911e-02 - 7.750000000e-01, -3.496765852e-40, -2.680757108e-02 - 7.800000000e-01, -3.843755978e-27, -1.800012032e-02 - 7.850000000e-01, -2.397473318e-27, -1.015585172e-02 - 7.900000000e-01, -1.071300850e-27, -4.277951386e-03 - 7.950000000e-01, -4.047957029e-28, -5.241873581e-04 - 8.000000000e-01, -1.354448156e-28, +1.440640037e-03 - 8.050000000e-01, -4.058434912e-29, +2.152717799e-03 - 8.100000000e-01, -1.076854018e-29, +2.128218624e-03 - 8.150000000e-01, -2.416138676e-30, +1.762576112e-03 - 8.200000000e-01, -3.883708049e-31, +1.327860172e-03 - 8.250000000e-01, +1.025357826e-44, +9.617140651e-04 - 8.300000000e-01, +3.523220453e-32, +6.971464430e-04 - 8.350000000e-01, +1.988421014e-32, +5.360841800e-04 - 8.400000000e-01, +8.039639276e-33, +4.521411530e-04 - 8.450000000e-01, +2.748726687e-33, +3.989156978e-04 - 8.500000000e-01, +8.322017093e-34, +3.524540512e-04 - 8.550000000e-01, +2.256292263e-34, +2.918355057e-04 - 8.600000000e-01, +5.417066333e-35, +1.970272109e-04 - 8.650000000e-01, +1.099764584e-35, +6.875606668e-05 - 8.700000000e-01, +1.599539611e-36, -9.633843248e-05 - 8.750000000e-01, -6.322229835e-50, -2.895527078e-04 - 8.800000000e-01, -1.188035304e-37, -4.808073444e-04 - 8.850000000e-01, -6.066922176e-38, -6.488546639e-04 - 8.900000000e-01, -2.219561560e-38, -7.462451552e-04 - 8.950000000e-01, -6.866457597e-39, -7.030784005e-04 - 9.000000000e-01, -1.881049996e-39, -4.705795117e-04 - 9.050000000e-01, -4.614638035e-40, +1.929950575e-05 - 9.100000000e-01, -1.002482944e-40, +8.347359131e-04 - 9.150000000e-01, -1.841548328e-41, +1.990201628e-03 - 9.200000000e-01, -2.423533024e-42, +3.480882465e-03 - 9.250000000e-01, +1.347746337e-55, +5.254459765e-03 - 9.300000000e-01, +1.473751950e-43, +7.171294058e-03 - 9.350000000e-01, +6.809794745e-44, +9.043435161e-03 - 9.400000000e-01, +2.254256572e-44, +1.062266199e-02 - 9.450000000e-01, +6.310146526e-45, +1.160981985e-02 - 9.500000000e-01, +1.564147094e-45, +1.171426548e-02 - 9.550000000e-01, +3.472045809e-46, +1.067238680e-02 - 9.600000000e-01, +6.824885183e-47, +8.306324984e-03 - 9.650000000e-01, +1.134415180e-47, +4.581837223e-03 - 9.700000000e-01, +1.350853967e-48, -3.815369989e-04 - 9.750000000e-01, -8.526671746e-62, -6.271583148e-03 - 9.800000000e-01, -6.725505882e-50, -1.259552819e-02 - 9.850000000e-01, -2.811934097e-50, -1.874054183e-02 - 9.900000000e-01, -8.422577434e-51, -2.401912511e-02 - 9.950000000e-01, -2.133298675e-51, -2.776639048e-02 - 1.000000000e+00, -4.784762256e-52, -2.944631145e-02 + 5.000000000e-03, -4.204561825e-04, -1.372355600e-04 + 1.000000000e-02, -5.525736376e-04, -2.768477037e-04 + 1.500000000e-02, -6.140819852e-04, -3.268163859e-04 + 2.000000000e-02, -4.889024863e-04, -2.310789623e-04 + 2.500000000e-02, -3.051675161e-18, +2.666703698e-04 + 3.000000000e-02, +1.088072493e-03, +1.333462552e-03 + 3.500000000e-02, +3.041567984e-03, +3.267358426e-03 + 4.000000000e-02, +6.091116670e-03, +6.298866841e-03 + 4.500000000e-02, +1.031485399e-02, +1.050499965e-02 + 5.000000000e-02, +1.546789803e-02, +1.564546720e-02 + 5.500000000e-02, +2.077156516e-02, +2.094951513e-02 + 6.000000000e-02, +2.470069612e-02, +2.491313898e-02 + 6.500000000e-02, +2.483796096e-02, +2.510856003e-02 + 7.000000000e-02, +1.789296781e-02, +1.825786070e-02 + 7.500000000e-02, -2.885970849e-17, +5.116704638e-04 + 8.000000000e-02, -3.260311305e-02, -3.191785195e-02 + 8.500000000e-02, -8.246493451e-02, -8.158501484e-02 + 9.000000000e-02, -1.494305036e-01, -1.483421678e-01 + 9.500000000e-02, -2.289686265e-01, -2.276918608e-01 + 1.000000000e-01, -3.106810371e-01, -3.092516108e-01 + 1.050000000e-01, -3.775054448e-01, -3.759601744e-01 + 1.100000000e-01, -4.061942227e-01, -4.045725400e-01 + 1.150000000e-01, -3.695821957e-01, -3.679216876e-01 + 1.200000000e-01, -2.409062313e-01, -2.392327277e-01 + 1.250000000e-01, +2.343888163e-16, +1.648793990e-03 + 1.300000000e-01, +3.593898657e-01, +3.609079016e-01 + 1.350000000e-01, +8.225203029e-01, +8.236876014e-01 + 1.400000000e-01, +1.348612313e+00, +1.349024689e+00 + 1.450000000e-01, +1.869796708e+00, +1.868794378e+00 + 1.500000000e-01, +2.295639612e+00, +2.292310507e+00 + 1.550000000e-01, +2.523961555e+00, +2.517204835e+00 + 1.600000000e-01, +2.457331849e+00, +2.446003413e+00 + 1.650000000e-01, +2.023073496e+00, +2.006245268e+00 + 1.700000000e-01, +1.193216375e+00, +1.170501686e+00 + 1.750000000e-01, -2.429847328e-15, -2.811424978e-02 + 1.800000000e-01, -1.457397771e+00, -1.489281056e+00 + 1.850000000e-01, -3.018071006e+00, -3.050826731e+00 + 1.900000000e-01, -4.477550561e+00, -4.507130087e+00 + 1.950000000e-01, -5.617179743e+00, -5.638770098e+00 + 2.000000000e-01, -6.240195442e+00, -6.248845777e+00 + 2.050000000e-01, -6.207943693e+00, -6.199369191e+00 + 2.100000000e-01, -5.468892605e+00, -5.440318963e+00 + 2.150000000e-01, -4.073969730e+00, -4.024835976e+00 + 2.200000000e-01, -2.174181990e+00, -2.106553983e+00 + 2.250000000e-01, +1.316268185e-14, +8.143006831e-02 + 2.300000000e-01, +2.174181990e+00, +2.262556595e+00 + 2.350000000e-01, +4.073969730e+00, +4.161132300e+00 + 2.400000000e-01, +5.468892605e+00, +5.546524634e+00 + 2.450000000e-01, +6.207943693e+00, +6.268764628e+00 + 2.500000000e-01, +6.240195442e+00, +6.279010884e+00 + 2.550000000e-01, +5.617179743e+00, +5.631588195e+00 + 2.600000000e-01, +4.477550561e+00, +4.468177987e+00 + 2.650000000e-01, +3.018071006e+00, +2.988313662e+00 + 2.700000000e-01, +1.457397771e+00, +1.412743251e+00 + 2.750000000e-01, +2.429847328e-15, -5.292842286e-02 + 2.800000000e-01, -1.193216375e+00, -1.247700830e+00 + 2.850000000e-01, -2.023073496e+00, -2.073237824e+00 + 2.900000000e-01, -2.457331849e+00, -2.498821394e+00 + 2.950000000e-01, -2.523961555e+00, -2.554292475e+00 + 3.000000000e-01, -2.295639612e+00, -2.314203094e+00 + 3.050000000e-01, -1.869796708e+00, -1.877568047e+00 + 3.100000000e-01, -1.348612313e+00, -1.347678916e+00 + 3.150000000e-01, -8.225203029e-01, -8.155374452e-01 + 3.200000000e-01, -3.593898657e-01, -3.490662049e-01 + 3.250000000e-01, -1.723350142e-14, +1.129721318e-02 + 3.300000000e-01, +2.409062313e-01, +2.513918701e-01 + 3.350000000e-01, +3.695821957e-01, +3.781420395e-01 + 3.400000000e-01, +4.061942227e-01, +4.123438302e-01 + 3.450000000e-01, +3.775054448e-01, +3.812599797e-01 + 3.500000000e-01, +3.106810371e-01, +3.123871889e-01 + 3.550000000e-01, +2.289686265e-01, +2.291407502e-01 + 3.600000000e-01, +1.494305036e-01, +1.486109362e-01 + 3.650000000e-01, +8.246493451e-02, +8.112895780e-02 + 3.700000000e-01, +3.260311305e-02, +3.111359086e-02 + 3.750000000e-01, +2.819603979e-15, -1.405882894e-03 + 3.800000000e-01, -1.789296781e-02, -1.908977192e-02 + 3.850000000e-01, -2.483796096e-02, -2.578002166e-02 + 3.900000000e-01, -2.470069612e-02, -2.538757709e-02 + 3.950000000e-01, -2.077156516e-02, -2.121357888e-02 + 4.000000000e-01, -1.546789803e-02, -1.565507699e-02 + 4.050000000e-01, -1.031485399e-02, -1.019180358e-02 + 4.100000000e-01, -6.091116670e-03, -5.540213304e-03 + 4.150000000e-01, -3.041567984e-03, -1.877704052e-03 + 4.200000000e-01, -1.088072493e-03, +9.310318786e-04 + 4.250000000e-01, -1.275717457e-16, +3.133201664e-03 + 4.300000000e-01, +4.889024863e-04, +4.928888368e-03 + 4.350000000e-01, +6.140819852e-04, +6.353132238e-03 + 4.400000000e-01, +5.525736376e-04, +7.189776845e-03 + 4.450000000e-01, +4.204561825e-04, +6.921923233e-03 + 4.500000000e-01, +2.833044348e-04, +4.724069233e-03 + 4.550000000e-01, +1.709447271e-04, -4.848891857e-04 + 4.600000000e-01, +9.133980795e-05, -9.904489803e-03 + 4.650000000e-01, +4.126969468e-05, -2.461298755e-02 + 4.700000000e-01, +1.335863584e-05, -4.520322375e-02 + 4.750000000e-01, +1.888516403e-18, -7.130782433e-02 + 4.800000000e-01, -4.914367487e-06, -1.010619559e-01 + 4.850000000e-01, -5.585245819e-06, -1.305881072e-01 + 4.900000000e-01, -4.547541263e-06, -1.536553540e-01 + 4.950000000e-01, -3.130961891e-06, -1.617024715e-01 + 5.000000000e-01, -1.908890266e-06, -1.444153155e-01 + 5.050000000e-01, -1.042206678e-06, -9.100747730e-02 + 5.100000000e-01, -5.038819347e-07, +7.756098770e-03 + 5.150000000e-01, -2.060015565e-07, +1.569221066e-01 + 5.200000000e-01, -6.033536005e-08, +3.544383403e-01 + 5.250000000e-01, -9.644121496e-21, +5.885025908e-01 + 5.300000000e-01, +1.817266122e-08, +8.358652474e-01 + 5.350000000e-01, +1.868803958e-08, +1.061849656e+00 + 5.400000000e-01, +1.376793013e-08, +1.222725541e+00 + 5.450000000e-01, +8.577097330e-09, +1.270751817e+00 + 5.500000000e-01, +4.731665902e-09, +1.161690040e+00 + 5.550000000e-01, +2.337531714e-09, +8.639297117e-01 + 5.600000000e-01, +1.022593435e-09, +3.677500397e-01 + 5.650000000e-01, +3.782816423e-10, -3.071843138e-01 + 5.700000000e-01, +1.002506563e-10, -1.108098882e+00 + 5.750000000e-01, +1.164310201e-23, -1.950829150e+00 + 5.800000000e-01, -2.472150748e-11, -2.727853974e+00 + 5.850000000e-01, -2.300333036e-11, -3.322302211e+00 + 5.900000000e-01, -1.533437842e-11, -3.626206502e+00 + 5.950000000e-01, -8.643873713e-12, -3.560031427e+00 + 6.000000000e-01, -4.314720803e-12, -3.089752893e+00 + 6.050000000e-01, -1.928708926e-12, -2.237782366e+00 + 6.100000000e-01, -7.634537466e-13, -1.084854662e+00 + 6.150000000e-01, -2.555439173e-13, +2.384411874e-01 + 6.200000000e-01, -6.127849048e-14, +1.569751787e+00 + 6.250000000e-01, -4.541728911e-27, +2.739826799e+00 + 6.300000000e-01, +1.237191386e-14, +3.599685112e+00 + 6.350000000e-01, +1.041653328e-14, +4.044915339e+00 + 6.400000000e-01, +6.283031218e-15, +4.032391521e+00 + 6.450000000e-01, +3.204660344e-15, +3.586138654e+00 + 6.500000000e-01, +1.447427579e-15, +2.791271269e+00 + 6.550000000e-01, +5.854386450e-16, +1.777398404e+00 + 6.600000000e-01, +2.096852970e-16, +6.950601359e-01 + 6.650000000e-01, +6.350696352e-17, -3.099405221e-01 + 6.700000000e-01, +1.377953018e-17, -1.119322012e+00 + 6.750000000e-01, +5.379378296e-31, -1.658168885e+00 + 6.800000000e-01, -2.277741020e-18, -1.901475793e+00 + 6.850000000e-01, -1.735246645e-18, -1.871132388e+00 + 6.900000000e-01, -9.470606165e-19, -1.625116376e+00 + 6.950000000e-01, -4.370801840e-19, -1.242050597e+00 + 7.000000000e-01, -1.786267540e-19, -8.047242253e-01 + 7.050000000e-01, -6.537347961e-20, -3.858359231e-01 + 7.100000000e-01, -2.118647699e-20, -3.829917962e-02 + 7.150000000e-01, -5.806075333e-21, +2.089007254e-01 + 7.200000000e-01, -1.139898758e-21, +3.496853967e-01 + 7.250000000e-01, -1.620612745e-35, +3.960476321e-01 + 7.300000000e-01, +1.542685213e-22, +3.711871413e-01 + 7.350000000e-01, +1.063419792e-22, +3.024175883e-01 + 7.400000000e-01, +5.251602594e-23, +2.153068470e-01 + 7.450000000e-01, +2.193035927e-23, +1.298621516e-01 + 7.500000000e-01, +8.109642085e-24, +5.887692498e-02 + 7.550000000e-01, +2.685513466e-24, +8.116357603e-03 + 7.600000000e-01, +7.875081013e-25, -2.222714262e-02 + 7.650000000e-01, +1.952762843e-25, -3.552555383e-02 + 7.700000000e-01, +3.468994959e-26, -3.677097815e-02 + 7.750000000e-01, -3.496765852e-40, -3.103396062e-02 + 7.800000000e-01, -3.843755978e-27, -2.247998633e-02 + 7.850000000e-01, -2.397473318e-27, -1.396045159e-02 + 7.900000000e-01, -1.071300850e-27, -7.034699268e-03 + 7.950000000e-01, -4.047957029e-28, -2.239238312e-03 + 8.000000000e-01, -1.354448156e-28, +5.584923809e-04 + 8.050000000e-01, -4.058434912e-29, +1.829978718e-03 + 8.100000000e-01, -1.076854018e-29, +2.115510606e-03 + 8.150000000e-01, -2.416138676e-30, +1.875664971e-03 + 8.200000000e-01, -3.883708049e-31, +1.452843891e-03 + 8.250000000e-01, +1.025357826e-44, +1.044094950e-03 + 8.300000000e-01, +3.523220453e-32, +7.236911579e-04 + 8.350000000e-01, +1.988421014e-32, +5.145846560e-04 + 8.400000000e-01, +8.039639276e-33, +3.989443381e-04 + 8.450000000e-01, +2.748726687e-33, +3.320318754e-04 + 8.500000000e-01, +8.322017093e-34, +2.860329405e-04 + 8.550000000e-01, +2.256292263e-34, +2.358153054e-04 + 8.600000000e-01, +5.417066333e-35, +1.577389454e-04 + 8.650000000e-01, +1.099764584e-35, +4.807422246e-05 + 8.700000000e-01, +1.599539611e-36, -9.996805373e-05 + 8.750000000e-01, -6.322229835e-50, -2.822796779e-04 + 8.800000000e-01, -1.188035304e-37, -4.749162584e-04 + 8.850000000e-01, -6.066922176e-38, -6.617188045e-04 + 8.900000000e-01, -2.219561560e-38, -8.021461627e-04 + 8.950000000e-01, -6.866457597e-39, -8.327379329e-04 + 9.000000000e-01, -1.881049996e-39, -7.062688593e-04 + 9.050000000e-01, -4.614638035e-40, -3.543666083e-04 + 9.100000000e-01, -1.002482944e-40, +2.969492618e-04 + 9.150000000e-01, -1.841548328e-41, +1.277706471e-03 + 9.200000000e-01, -2.423533024e-42, +2.604001633e-03 + 9.250000000e-01, +1.347746337e-55, +4.251217322e-03 + 9.300000000e-01, +1.473751950e-43, +6.113852167e-03 + 9.350000000e-01, +6.809794745e-44, +8.036442749e-03 + 9.400000000e-01, +2.254256572e-44, +9.798404902e-03 + 9.450000000e-01, +6.310146526e-45, +1.111745730e-02 + 9.500000000e-01, +1.564147094e-45, +1.170057041e-02 + 9.550000000e-01, +3.472045809e-46, +1.126009915e-02 + 9.600000000e-01, +6.824885183e-47, +9.569259409e-03 + 9.650000000e-01, +1.134415180e-47, +6.521434264e-03 + 9.700000000e-01, +1.350853967e-48, +2.149067214e-03 + 9.750000000e-01, -8.526671746e-62, -3.328876334e-03 + 9.800000000e-01, -6.725505882e-50, -9.504275809e-03 + 9.850000000e-01, -2.811934097e-50, -1.582366796e-02 + 9.900000000e-01, -8.422577434e-51, -2.162236117e-02 + 9.950000000e-01, -2.133298675e-51, -2.621152993e-02 + 1.000000000e+00, -4.784762256e-52, -2.898166807e-02 From b9ce371891b79b05f194e87781b6eb4bc46efcc7 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 21:41:10 +0000 Subject: [PATCH 11/25] Clean up --- palace/models/timeoperator.cpp | 3 +-- palace/models/timeoperator.hpp | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index f415666a2..5968a8424 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -29,7 +29,7 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator Vector NegJ; // Time dependence of current pulse for excitation: -J'(t) = -g'(t) J. This function - // returns g(t). + // returns g'(t). std::function &dJ_coef; // Internal objects for solution of linear systems during time stepping. @@ -39,7 +39,6 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator mutable Vector RHS; int size_E; - // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and // construct the linear solver. std::function ConfigureLinearSolver; diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index c32e72f52..b9640280b 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -46,8 +46,8 @@ class TimeOperator std::function &dJ_coef); // Access solution vectors for E- and B-fields. - virtual const Vector &GetE() const { return E; } - virtual const Vector &GetB() const { return B; } + const Vector &GetE() const { return E; } + const Vector &GetB() const { return B; } // Return the linear solver associated with the implicit or explicit time integrator. const KspSolver &GetLinearSolver() const; From 11092e9686243434cdbfebc980380e920cbfd067 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 21:41:29 +0000 Subject: [PATCH 12/25] Add SUNDIALS to spack install instructions --- spack/local/packages/palace/package.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spack/local/packages/palace/package.py b/spack/local/packages/palace/package.py index 4eceb470a..392eee9b2 100644 --- a/spack/local/packages/palace/package.py +++ b/spack/local/packages/palace/package.py @@ -27,6 +27,7 @@ class Palace(CMakePackage, CudaPackage, ROCmPackage): "superlu-dist", default=True, description="Build with SuperLU_DIST sparse direct solver" ) variant("strumpack", default=False, description="Build with STRUMPACK sparse direct solver") + variant("sundials", default=True, description="Build with SUNDIALS differential/algebraic equations solver") variant("mumps", default=False, description="Build with MUMPS sparse direct solver") variant("slepc", default=True, description="Build with SLEPc eigenvalue solver") variant("arpack", default=False, description="Build with ARPACK eigenvalue solver") @@ -76,6 +77,13 @@ class Palace(CMakePackage, CudaPackage, ROCmPackage): depends_on("strumpack+openmp", when="+openmp") depends_on("strumpack~openmp", when="~openmp") + with when("+sundials"): + depends_on("sundials") + depends_on("sundials+shared", when="+shared") + depends_on("sundials~shared", when="~shared") + depends_on("sundials+openmp", when="+openmp") + depends_on("sundials~openmp", when="~openmp") + with when("+mumps"): depends_on("mumps+metis+parmetis") depends_on("mumps+shared", when="+shared") @@ -116,6 +124,7 @@ class Palace(CMakePackage, CudaPackage, ROCmPackage): depends_on(f"hypre{cuda_variant}", when=f"{cuda_variant}") depends_on(f"superlu-dist{cuda_variant}", when=f"+superlu-dist{cuda_variant}") depends_on(f"strumpack{cuda_variant}", when=f"+strumpack{cuda_variant}") + depends_on(f"sundials{cuda_variant}", when=f"+sundials{cuda_variant}") depends_on(f"slepc{cuda_variant} ^petsc{cuda_variant}", when=f"+slepc{cuda_variant}") depends_on(f"magma{cuda_variant}", when=f"+magma{cuda_variant}") with when("+rocm"): @@ -124,6 +133,7 @@ class Palace(CMakePackage, CudaPackage, ROCmPackage): depends_on(f"hypre{rocm_variant}", when=f"{rocm_variant}") depends_on(f"superlu-dist{rocm_variant}", when=f"+superlu-dist{rocm_variant}") depends_on(f"strumpack{rocm_variant}", when=f"+strumpack{rocm_variant}") + depends_on(f"sundials{rocm_variant}", when=f"+sundials{rocm_variant}") depends_on(f"slepc{rocm_variant} ^petsc{rocm_variant}", when=f"+slepc{rocm_variant}") depends_on(f"magma{rocm_variant}", when=f"+magma{rocm_variant}") @@ -145,6 +155,7 @@ def cmake_args(self): self.define_from_variant("PALACE_WITH_OPENMP", "openmp"), self.define_from_variant("PALACE_WITH_SUPERLU", "superlu-dist"), self.define_from_variant("PALACE_WITH_STRUMPACK", "strumpack"), + self.define_from_variant("PALACE_WITH_SUNDIALS", "sundials"), self.define_from_variant("PALACE_WITH_MUMPS", "mumps"), self.define_from_variant("PALACE_WITH_SLEPC", "slepc"), self.define_from_variant("PALACE_WITH_ARPACK", "arpack"), @@ -183,6 +194,8 @@ def cmake_args(self): # against MPI libraries if "+superlu-dist" in self.spec: args += [self.define("SuperLUDist_REQUIRED_PACKAGES", "LAPACK;BLAS;MPI")] + if "+sundials" in self.spec: + args += [self.define("SUNDIALS_REQUIRED_PACKAGES", "LAPACK;BLAS;MPI")] if "+strumpack" in self.spec: args += [self.define("STRUMPACK_REQUIRED_PACKAGES", "LAPACK;BLAS;MPI;MPI_Fortran")] if "+mumps" in self.spec: From 11ad777211a52299cbb98d3a41a91df5f2bf3585 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 22:15:43 +0000 Subject: [PATCH 13/25] Change SUNDIALS version for spack installer --- spack/local/packages/palace/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spack/local/packages/palace/package.py b/spack/local/packages/palace/package.py index 392eee9b2..e3dd6a4a9 100644 --- a/spack/local/packages/palace/package.py +++ b/spack/local/packages/palace/package.py @@ -78,7 +78,7 @@ class Palace(CMakePackage, CudaPackage, ROCmPackage): depends_on("strumpack~openmp", when="~openmp") with when("+sundials"): - depends_on("sundials") + depends_on("sundials@6.7.0") depends_on("sundials+shared", when="+shared") depends_on("sundials~shared", when="~shared") depends_on("sundials+openmp", when="+openmp") From aea8d7f89bb42b6d4efa5dbf7dff7e7cc3cec6f9 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Tue, 5 Nov 2024 23:10:29 +0000 Subject: [PATCH 14/25] Fix formatting issues --- docs/src/config/solver.md | 4 +- docs/src/install.md | 4 +- palace/models/timeoperator.cpp | 97 ++++++++++++++-------------------- palace/utils/configfile.hpp | 6 +-- palace/utils/iodata.cpp | 7 +-- 5 files changed, 51 insertions(+), 67 deletions(-) diff --git a/docs/src/config/solver.md b/docs/src/config/solver.md index 37cf02304..cbc3f6da2 100644 --- a/docs/src/config/solver.md +++ b/docs/src/config/solver.md @@ -266,10 +266,10 @@ saved in the `paraview/` directory under the directory specified by Only relevant when `"Type"` is `"ARKODE"`, `"Runge-Kutta"` or `"CVODE"`. `"RelTol" [1e-4]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"CVODE"` or `"ARKODE"` . +when `"Type"` is `"CVODE"` or `"ARKODE"` . `"AbsTol" [1e-9]` : Absolute tolerance used in adaptive time-stepping schemes. Only relevant - when `"Type"` is `"CVODE"` or `"ARKODE"`. +when `"Type"` is `"CVODE"` or `"ARKODE"`. ## `solver["Electrostatic"]` diff --git a/docs/src/install.md b/docs/src/install.md index cea342c06..2c6f74619 100644 --- a/docs/src/install.md +++ b/docs/src/install.md @@ -156,7 +156,7 @@ and LAPACK libraries depending on the system architecture according to the follo procedure: - For `x86_64` systems: - + + If the `MKLROOT` environment variable is set, looks for an [Intel MKL](https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl.html) installation. @@ -167,7 +167,7 @@ procedure: which is permissively licensed and available from most package managers. - For `aarch64`/`arm64` systems: - + + If the `ARMPL_DIR` environment variable is set, looks for an [Arm Performance Libraries (PL)](https://www.arm.com/products/development-tools/server-and-hpc/allinea-studio/performance-libraries) installation. diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 5968a8424..8af900e28 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -18,7 +18,7 @@ namespace palace namespace { -class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator +class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator { public: // MPI communicator. @@ -45,10 +45,9 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator public: TimeDependentFirstOrderOperator(const IoData &iodata, SpaceOperator &space_op, - std::function &dJ_coef, double t0, - mfem::TimeDependentOperator::Type type) - : mfem::TimeDependentOperator(2*space_op.GetNDSpace().GetTrueVSize(), - t0, type), + std::function &dJ_coef, double t0, + mfem::TimeDependentOperator::Type type) + : mfem::TimeDependentOperator(2 * space_op.GetNDSpace().GetTrueVSize(), t0, type), comm(space_op.GetComm()), dJ_coef(dJ_coef) { // Get dimensions of E and Edot vectors. @@ -65,7 +64,7 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator // Set up RHS vector for the current source term: -g(t) J, where g(t) handles the time // dependence. space_op.GetExcitationVector(NegJ); - RHS.SetSize(2*size_E); + RHS.SetSize(2 * size_E); RHS.UseDevice(true); // Set up linear solvers. @@ -88,8 +87,8 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator { // Configure the system matrix and also the matrix (matrices) from which the // preconditioner will be constructed. - A = space_op.GetSystemMatrix(dt*dt, dt, 1.0, K.get(), C.get(), M.get()); - B = space_op.GetPreconditionerMatrix(dt*dt, dt, 1.0, 0.0); + A = space_op.GetSystemMatrix(dt * dt, dt, 1.0, K.get(), C.get(), M.get()); + B = space_op.GetPreconditionerMatrix(dt * dt, dt, 1.0, 0.0); // Configure the solver. if (!kspA) @@ -105,9 +104,9 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator // Form the RHS for the first-order ODE system void FormRHS(const Vector &u, Vector &rhs) const { - Vector u1(u.GetData() + 0, size_E); - Vector u2(u.GetData() + size_E, size_E); - Vector rhs1(rhs.GetData() + 0, size_E); + Vector u1(u.GetData() + 0, size_E); + Vector u2(u.GetData() + size_E, size_E); + Vector rhs1(rhs.GetData() + 0, size_E); Vector rhs2(rhs.GetData() + size_E, size_E); // u1 = Edot, u2 = E // rhs_u1 = -C*u1 - K*u2 - J(t) @@ -131,9 +130,9 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator du = 0.0; } FormRHS(u, RHS); - Vector du1(du.GetData() + 0, size_E); - Vector du2(du.GetData() + size_E, size_E); - Vector rhs1(RHS.GetData() + 0, size_E); + Vector du1(du.GetData() + 0, size_E); + Vector du2(du.GetData() + size_E, size_E); + Vector rhs1(RHS.GetData() + 0, size_E); Vector rhs2(RHS.GetData() + size_E, size_E); kspM->Mult(rhs1, du1); du2 = rhs2; @@ -153,9 +152,9 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator } Mpi::Print("\n"); FormRHS(u, RHS); - Vector k1(k.GetData() + 0, size_E); - Vector k2(k.GetData() + size_E, size_E); - Vector rhs1(RHS.GetData() + 0, size_E); + Vector k1(k.GetData() + 0, size_E); + Vector k2(k.GetData() + size_E, size_E); + Vector rhs1(RHS.GetData() + 0, size_E); Vector rhs2(RHS.GetData() + size_E, size_E); // A k1 = rhs1 - dt K rhs2 K->AddMult(rhs2, rhs1, -dt); @@ -165,14 +164,10 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator linalg::AXPBYPCZ(1.0, rhs2, dt, k1, 0.0, k2); } - void ExplicitMult(const Vector &u, Vector &v) const override - { - Mult(u, v); - } + void ExplicitMult(const Vector &u, Vector &v) const override { Mult(u, v); } // Setup A = M - gamma J = M + gamma C + gamma^2 K - int SUNImplicitSetup(const Vector &y, const Vector &fy, - int jok, int *jcur, double gamma) + int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, double gamma) { // Update Jacobian matrix if (!kspA || gamma != saved_gamma) @@ -192,9 +187,9 @@ class TimeDependentFirstOrderOperator: public mfem::TimeDependentOperator // Solve (Mass - dt Jacobian) x = Mass b int SUNImplicitSolve(const Vector &b, Vector &x, double tol) { - Vector b1(b.GetData() + 0, size_E); + Vector b1(b.GetData() + 0, size_E); Vector b2(b.GetData() + size_E, size_E); - Vector x1(x.GetData() + 0, size_E); + Vector x1(x.GetData() + 0, size_E); Vector x2(x.GetData() + size_E, size_E); Vector rhs(RHS.GetData() + 0, size_E); @@ -223,7 +218,7 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, int size_B = space_op.GetRTSpace().GetTrueVSize(); // Allocate space for solution vectors. - sol.SetSize(2*size_E); + sol.SetSize(2 * size_E); E.SetSize(size_E); En.SetSize(size_E); B.SetSize(size_B); @@ -251,7 +246,8 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, constexpr double rho_inf = 1.0; use_mfem_integrator = true; ode = std::make_unique(rho_inf); - op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); + op = std::make_unique(iodata, space_op, dJ_coef, + 0.0, type); } break; case config::TransientSolverData::Type::ARKODE: @@ -263,7 +259,8 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, arkode = std::make_unique(space_op.GetComm(), mfem::ARKStepSolver::IMPLICIT); // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); + op = std::make_unique(iodata, space_op, dJ_coef, + 0.0, type); // Initialize ARKODE. arkode->Init(*op); // Use implicit setup/solve defined in SUNImplicit*. @@ -294,7 +291,8 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, cvode = std::make_unique(space_op.GetComm(), CV_BDF); type = mfem::TimeDependentOperator::IMPLICIT; // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, dJ_coef, 0.0, type); + op = std::make_unique(iodata, space_op, dJ_coef, + 0.0, type); // Initialize CVODE. cvode->Init(*op); // Relative and absolute tolerances for time step control. @@ -305,7 +303,7 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, // CV_BDF can go up to 5, but >= 3 is not unconditionally stable. cvode->SetMaxOrder(order); // Set the max number of steps allowed in one CVODE step() call. - cvode->SetMaxNSteps(10000); //default 500 + cvode->SetMaxNSteps(10000); // default 500 // Set the ODE solver to CVODE. ode = std::move(cvode); #else @@ -370,9 +368,9 @@ void TimeOperator::Init(double &dt) ode->Init(*op); } #if defined(MFEM_USE_SUNDIALS) - if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + if (mfem::ARKStepSolver *arkode = dynamic_cast(ode.get())) { - if(!adapt_dt) + if (!adapt_dt) { // Disable adaptive time stepping. arkode->SetFixedStep(dt); @@ -397,17 +395,11 @@ void TimeOperator::Step(double &t, double &dt) void TimeOperator::PrintStats() { #if defined(MFEM_USE_SUNDIALS) - if (mfem::ARKStepSolver* arkode = dynamic_cast(ode.get())) + if (mfem::ARKStepSolver *arkode = dynamic_cast(ode.get())) { long int expsteps, accsteps, step_attempts, nfe_evals, nfi_evals, nlinsetups, netfails; - ARKStepGetTimestepperStats(arkode->GetMem(), - &expsteps, - &accsteps, - &step_attempts, - &nfe_evals, - &nfi_evals, - &nlinsetups, - &netfails); + ARKStepGetTimestepperStats(arkode->GetMem(), &expsteps, &accsteps, &step_attempts, + &nfe_evals, &nfi_evals, &nlinsetups, &netfails); long int nniters; ARKStepGetNumNonlinSolvIters(arkode->GetMem(), &nniters); @@ -421,24 +413,15 @@ void TimeOperator::PrintStats() Mpi::Print(" Calls to linear solver solve function: {:d}\n", nniters); Mpi::Print(" Number of error test failures: {:d}\n", netfails); } - else if (mfem::CVODESolver* cvode = dynamic_cast(ode.get())) + else if (mfem::CVODESolver *cvode = dynamic_cast(ode.get())) { long int nsteps, nfevals, nlinsetups, netfails; - int qlast, qcur; - double hinused, hlast, hcur, tcur; - - // Get integrator stats. - CVodeGetIntegratorStats(cvode->GetMem(), - &nsteps, - &nfevals, - &nlinsetups, - &netfails, - &qlast, - &qcur, - &hinused, - &hlast, - &hcur, - &tcur); + int qlast, qcur; + double hinused, hlast, hcur, tcur; + + // Get integrator stats. + CVodeGetIntegratorStats(cvode->GetMem(), &nsteps, &nfevals, &nlinsetups, &netfails, + &qlast, &qcur, &hinused, &hlast, &hcur, &tcur); Mpi::Print("\n CVODE time-stepper statistics\n"); Mpi::Print(" Number of steps: {:d}\n", nsteps); Mpi::Print(" Calls to RHS function: {:d}\n", nfevals); diff --git a/palace/utils/configfile.hpp b/palace/utils/configfile.hpp index 1ce6940a7..7000701e2 100644 --- a/palace/utils/configfile.hpp +++ b/palace/utils/configfile.hpp @@ -776,11 +776,11 @@ struct TransientSolverData // RK scheme order for SUNDIALS ARKODE integrators. // Max order for SUNDIALS CVODE integrator. - int order = -1;//2 + int order = -1; // Adaptive time-stepping tolerances - double rel_tol = -1;//1e-4; - double abs_tol = -1;//1e-9; + double rel_tol = -1; + double abs_tol = -1; void SetUp(json &solver); }; diff --git a/palace/utils/iodata.cpp b/palace/utils/iodata.cpp index f43d3b52e..ac13a9373 100644 --- a/palace/utils/iodata.cpp +++ b/palace/utils/iodata.cpp @@ -433,7 +433,7 @@ void IoData::CheckConfiguration() if (solver.transient.rel_tol > 0 || solver.transient.abs_tol > 0) { Mpi::Warning("Generalized alpha transient solver does not use relative " - "and absolute tolerance parameters!\n"); + "and absolute tolerance parameters!\n"); } if (solver.transient.order > 0) { @@ -465,7 +465,7 @@ void IoData::CheckConfiguration() solver.transient.order = 5; } } - else // ARKODE and RUNGE_KUTTA + else // ARKODE and RUNGE_KUTTA { if (solver.transient.rel_tol < 0) { @@ -486,7 +486,8 @@ void IoData::CheckConfiguration() } else if (solver.transient.order > 5) { - Mpi::Warning("Runge-Kutta/ARKODE transient solver order cannot be greater than 5!\n"); + Mpi::Warning( + "Runge-Kutta/ARKODE transient solver order cannot be greater than 5!\n"); solver.transient.order = 5; } } From cd7cfc4cb9ec8c52560cdc2798d5a7bbd2f37ccd Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Thu, 7 Nov 2024 23:52:28 +0000 Subject: [PATCH 15/25] Use MFEM's SDIRK23 solver as the fixed step Runge-Kutta option, along with small fixes --- cmake/ExternalMFEM.cmake | 2 +- cmake/ExternalSUNDIALS.cmake | 2 +- docs/src/config/solver.md | 8 ++-- palace/drivers/transientsolver.cpp | 2 +- palace/models/timeoperator.cpp | 72 ++++++++++-------------------- palace/models/timeoperator.hpp | 3 +- palace/utils/iodata.cpp | 13 +++--- scripts/schema/config/solver.json | 2 +- 8 files changed, 39 insertions(+), 65 deletions(-) diff --git a/cmake/ExternalMFEM.cmake b/cmake/ExternalMFEM.cmake index 2593e5345..e9fc16019 100644 --- a/cmake/ExternalMFEM.cmake +++ b/cmake/ExternalMFEM.cmake @@ -317,7 +317,7 @@ Intel C++ compiler for MUMPS and STRUMPACK dependencies") list(APPEND MFEM_OPTIONS "-DSUNDIALS_DIR=${CMAKE_INSTALL_PREFIX}" "-DSUNDIALS_OPT=-I${CMAKE_INSTALL_PREFIX}/include" - "-DSUNDIALS_LIB=-Wl,-rpath,${CMAKE_INSTALL_PREFIX}/lib64 -L${CMAKE_INSTALL_PREFIX}/lib64 -lsundials_arkode, -lsundials_cvode -lsundials_nvecserial -lsundials_kinsol -lsundials_nvecparhyp -lsundials_nvecparallel" + "-DSUNDIALS_LIB=-Wl,-rpath,${CMAKE_INSTALL_PREFIX}/lib64 -L${CMAKE_INSTALL_PREFIX}/lib64 -lsundials_arkode, -lsundials_cvode -lsundials_kinsol -lsundials_nvecparhyp -lsundials_nvecparallel" "-DSUNDIALS_REQUIRED_PACKAGES=${SUNDIALS_REQUIRED_PACKAGES}" ) if(NOT "${SUNDIALS_REQUIRED_LIBRARIES}" STREQUAL "") diff --git a/cmake/ExternalSUNDIALS.cmake b/cmake/ExternalSUNDIALS.cmake index 5ddcb224c..b08e7256b 100644 --- a/cmake/ExternalSUNDIALS.cmake +++ b/cmake/ExternalSUNDIALS.cmake @@ -6,7 +6,7 @@ # # Force build order -set(SUNDIALS_DEPENDENCIES ) +set(SUNDIALS_DEPENDENCIES) set(SUNDIALS_OPTIONS ${PALACE_SUPERBUILD_DEFAULT_ARGS}) list(APPEND SUNDIALS_OPTIONS diff --git a/docs/src/config/solver.md b/docs/src/config/solver.md index cbc3f6da2..3f4494685 100644 --- a/docs/src/config/solver.md +++ b/docs/src/config/solver.md @@ -226,8 +226,7 @@ the second-order system of differential equations. The available options are: ODE system for the electric field with adaptive time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). - `"CVODE"` : SUNDIALS CVODE implicit multistep method scheme applied to the first-order ODE system for the electric field with adaptive time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). - - `"RungeKutta"` : SUNDIALS ARKode implicit Runge-Kutta scheme applied to the first-order - ODE system for the electric field with fixed time-stepping. This option is only available when *Palace* has been [built with SUNDIALS support](../install.md#Configuration-options). + - `"RungeKutta"` : Two stage, singly diagonal implicit Runge-Kutta (SDIRK) method. Second order and L-stable. - `"Default"` : Use the default `"GeneralizedAlpha"` time integration scheme. `"Excitation" [None]` : Controls the time dependence of the source excitation. The @@ -262,8 +261,9 @@ disk for [visualization with ParaView](../guide/postprocessing.md#Visualization) saved in the `paraview/` directory under the directory specified by [`config["Problem"]["Output"]`](problem.md#config%5B%22Problem%22%5D). -`"Order" [2]` : Order of the Runge-Kutta integrators or maximum order of the multistep method. -Only relevant when `"Type"` is `"ARKODE"`, `"Runge-Kutta"` or `"CVODE"`. +`"Order" [0]` : Order of the adaptive Runge-Kutta integrators or maximum order of the multistep method. +Only relevant when `"Type"` is `"ARKODE"` or `"CVODE"`. A value less than 1 defaults to 3 for `"ARKODE"` +and 2 for `"CVODE"`. `"RelTol" [1e-4]` : Relative tolerance used in adaptive time-stepping schemes. Only relevant when `"Type"` is `"CVODE"` or `"ARKODE"` . diff --git a/palace/drivers/transientsolver.cpp b/palace/drivers/transientsolver.cpp index 873fb5cea..32e2c58c4 100644 --- a/palace/drivers/transientsolver.cpp +++ b/palace/drivers/transientsolver.cpp @@ -102,7 +102,7 @@ TransientSolver::Solve(const std::vector> &mesh) const { Mpi::Print("\n"); t += delta_t; - time_op.Init(delta_t); // Initial conditions + time_op.Init(); // Initial conditions } else { diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 8af900e28..777f2c642 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -61,7 +61,7 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator C = space_op.GetDampingMatrix(Operator::DIAG_ZERO); M = space_op.GetMassMatrix(Operator::DIAG_ONE); - // Set up RHS vector for the current source term: -g(t) J, where g(t) handles the time + // Set up RHS vector for the current source term: -g'(t) J, where g(t) handles the time // dependence. space_op.GetExcitationVector(NegJ); RHS.SetSize(2 * size_E); @@ -109,8 +109,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator Vector rhs1(rhs.GetData() + 0, size_E); Vector rhs2(rhs.GetData() + size_E, size_E); // u1 = Edot, u2 = E - // rhs_u1 = -C*u1 - K*u2 - J(t) - // rhs_u2 = u1 + // rhs1 = -(K * u2 + C * u1) - J(t) + // rhs2 = u1 K->Mult(u2, rhs1); if (C) { @@ -122,6 +122,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator } // Solve M du = rhs + // |M 0| |du1| = |-(K * u2 + C * u1) - J(t) | + // |0 I| |du2| | u1 | void Mult(const Vector &u, Vector &du) const override { if (kspM->NumTotalMult() == 0) @@ -167,7 +169,7 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator void ExplicitMult(const Vector &u, Vector &v) const override { Mult(u, v); } // Setup A = M - gamma J = M + gamma C + gamma^2 K - int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, double gamma) + int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, double gamma) override { // Update Jacobian matrix if (!kspA || gamma != saved_gamma) @@ -185,7 +187,7 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator } // Solve (Mass - dt Jacobian) x = Mass b - int SUNImplicitSolve(const Vector &b, Vector &x, double tol) + int SUNImplicitSolve(const Vector &b, Vector &x, double tol) override { Vector b1(b.GetData() + 0, size_E); Vector b2(b.GetData() + size_E, size_E); @@ -209,6 +211,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, std::function &dJ_coef) + : rel_tol(iodata.solver.transient.rel_tol), abs_tol(iodata.solver.transient.abs_tol), + order(iodata.solver.transient.order) { // Construct discrete curl matrix for B-field time integration. Curl = &space_op.GetCurlMatrix(); @@ -230,14 +234,10 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, // Sol = [Edot, E] E.MakeRef(sol, size_E); - // SUNDIALS adaptive time-stepping parameters. - adapt_dt = true; - rel_tol = iodata.solver.transient.rel_tol; - abs_tol = iodata.solver.transient.abs_tol; - order = iodata.solver.transient.order; - // Create ODE solver for 1st-order IVP. mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::IMPLICIT; + op = std::make_unique(iodata, space_op, dJ_coef, + 0.0, type); switch (iodata.solver.transient.type) { case config::TransientSolverData::Type::GEN_ALPHA: @@ -246,21 +246,22 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, constexpr double rho_inf = 1.0; use_mfem_integrator = true; ode = std::make_unique(rho_inf); - op = std::make_unique(iodata, space_op, dJ_coef, - 0.0, type); } break; - case config::TransientSolverData::Type::ARKODE: case config::TransientSolverData::Type::RUNGE_KUTTA: { + constexpr int gamma_opt = 2; + use_mfem_integrator = true; + ode = std::make_unique(gamma_opt); + } + break; + case config::TransientSolverData::Type::ARKODE: + { #if defined(MFEM_USE_SUNDIALS) // SUNDIALS ARKODE solver. std::unique_ptr arkode; arkode = std::make_unique(space_op.GetComm(), mfem::ARKStepSolver::IMPLICIT); - // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, dJ_coef, - 0.0, type); // Initialize ARKODE. arkode->Init(*op); // Use implicit setup/solve defined in SUNImplicit*. @@ -271,10 +272,6 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, arkode->SetSStolerances(rel_tol, abs_tol); // Set the order of the RK scheme. ARKStepSetOrder(arkode->GetMem(), order); - if (iodata.solver.transient.type == config::TransientSolverData::Type::RUNGE_KUTTA) - { - adapt_dt = false; - } // Set the ODE solver to ARKODE. ode = std::move(arkode); #else @@ -289,10 +286,6 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, // SUNDIALS CVODE solver. std::unique_ptr cvode; cvode = std::make_unique(space_op.GetComm(), CV_BDF); - type = mfem::TimeDependentOperator::IMPLICIT; - // Operator for first-order ODE system. - op = std::make_unique(iodata, space_op, dJ_coef, - 0.0, type); // Initialize CVODE. cvode->Init(*op); // Relative and absolute tolerances for time step control. @@ -303,7 +296,7 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, // CV_BDF can go up to 5, but >= 3 is not unconditionally stable. cvode->SetMaxOrder(order); // Set the max number of steps allowed in one CVODE step() call. - cvode->SetMaxNSteps(10000); // default 500 + cvode->SetMaxNSteps(10000); // Set the ODE solver to CVODE. ode = std::move(cvode); #else @@ -318,18 +311,9 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, const KspSolver &TimeOperator::GetLinearSolver() const { const auto &firstOrder = dynamic_cast(*op); - if (isExplicit()) - { - MFEM_VERIFY(firstOrder.kspM, - "No linear solver for time-dependent operator has been constructed!\n"); - return *firstOrder.kspM; - } - else - { - MFEM_VERIFY(firstOrder.kspA, - "No linear solver for time-dependent operator has been constructed!\n"); - return *firstOrder.kspA; - } + MFEM_VERIFY(firstOrder.kspA, + "No linear solver for time-dependent operator has been constructed!\n"); + return *firstOrder.kspA; } double TimeOperator::GetMaxTimeStep() const @@ -358,7 +342,7 @@ double TimeOperator::GetMaxTimeStep() const return 2.0 / std::sqrt(lam); } -void TimeOperator::Init(double &dt) +void TimeOperator::Init() { // Always use zero initial conditions. sol = 0.0; @@ -367,16 +351,6 @@ void TimeOperator::Init(double &dt) { ode->Init(*op); } -#if defined(MFEM_USE_SUNDIALS) - if (mfem::ARKStepSolver *arkode = dynamic_cast(ode.get())) - { - if (!adapt_dt) - { - // Disable adaptive time stepping. - arkode->SetFixedStep(dt); - } - } -#endif } void TimeOperator::Step(double &t, double &dt) diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index b9640280b..eb1458bc3 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -34,7 +34,6 @@ class TimeOperator // Adaptive time-stepping parameters. int order; - bool adapt_dt; double rel_tol, abs_tol; bool use_mfem_integrator = false; @@ -60,7 +59,7 @@ class TimeOperator double GetMaxTimeStep() const; // Initialize time integrators and set 0 initial conditions. - void Init(double &dt); + void Init(); // Perform time step from t -> t + dt. void Step(double &t, double &dt); diff --git a/palace/utils/iodata.cpp b/palace/utils/iodata.cpp index ac13a9373..ce7e4fdcd 100644 --- a/palace/utils/iodata.cpp +++ b/palace/utils/iodata.cpp @@ -428,16 +428,17 @@ void IoData::CheckConfiguration() if (problem.type == config::ProblemData::Type::TRANSIENT) { if (solver.transient.type == config::TransientSolverData::Type::GEN_ALPHA || - solver.transient.type == config::TransientSolverData::Type::DEFAULT) + solver.transient.type == config::TransientSolverData::Type::DEFAULT || + solver.transient.type == config::TransientSolverData::Type::RUNGE_KUTTA) { if (solver.transient.rel_tol > 0 || solver.transient.abs_tol > 0) { - Mpi::Warning("Generalized alpha transient solver does not use relative " + Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use relative " "and absolute tolerance parameters!\n"); } if (solver.transient.order > 0) { - Mpi::Warning("Generalized alpha transient solver does not use order parameter!\n"); + Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use order parameter!\n"); } } else if (solver.transient.type == config::TransientSolverData::Type::CVODE) @@ -450,7 +451,7 @@ void IoData::CheckConfiguration() { solver.transient.abs_tol = 1e-9; } - if (solver.transient.order < 0) + if (solver.transient.order <= 0) { solver.transient.order = 2; } @@ -481,13 +482,13 @@ void IoData::CheckConfiguration() } else if (solver.transient.order < 2) { - Mpi::Warning("Runge-Kutta/ARKODE transient solver order cannot be less than 2!\n"); + Mpi::Warning("ARKODE transient solver order cannot be less than 2!\n"); solver.transient.order = 2; } else if (solver.transient.order > 5) { Mpi::Warning( - "Runge-Kutta/ARKODE transient solver order cannot be greater than 5!\n"); + "ARKODE transient solver order cannot be greater than 5!\n"); solver.transient.order = 5; } } diff --git a/scripts/schema/config/solver.json b/scripts/schema/config/solver.json index 5d19339ec..4c4131315 100644 --- a/scripts/schema/config/solver.json +++ b/scripts/schema/config/solver.json @@ -68,7 +68,7 @@ "MaxTime": { "type": "number" }, "TimeStep": { "type": "number" }, "SaveStep": { "type": "integer" }, - "Order": {"type": "integer", "minimum": 2}, + "Order": {"type": "integer"}, "RelTol": {"type": "number", "exclusiveMinimum": 0.0}, "AbsTol": {"type": "number", "exclusiveMinimum": 0.0} } From c86a4c6035a972bda4f99f3784691424f0b79e5f Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Fri, 8 Nov 2024 02:04:45 +0000 Subject: [PATCH 16/25] Remove SUNDIALS MAGMA dependency --- cmake/ExternalSUNDIALS.cmake | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cmake/ExternalSUNDIALS.cmake b/cmake/ExternalSUNDIALS.cmake index b08e7256b..917f41927 100644 --- a/cmake/ExternalSUNDIALS.cmake +++ b/cmake/ExternalSUNDIALS.cmake @@ -46,14 +46,6 @@ if(PALACE_WITH_CUDA) ) endif() -if(PALACE_WITH_MAGMA) - list(APPEND SUNDIALS_OPTIONS - "-DENABLE_MAGMA=ON" - "-DMAGMA_DIR=${MAGMA_DIR}" - ) -endif() - - string(REPLACE ";" "; " SUNDIALS_OPTIONS_PRINT "${SUNDIALS_OPTIONS}") message(STATUS "SUNDIALS_OPTIONS: ${SUNDIALS_OPTIONS_PRINT}") From 100d2f411e5f9258b5c8fe5bdd5044c22c03ad49 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Thu, 7 Nov 2024 18:08:31 -0800 Subject: [PATCH 17/25] Fix formatting issues --- palace/models/timeoperator.cpp | 7 ++++--- palace/utils/iodata.cpp | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 777f2c642..e76be042d 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -169,7 +169,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator void ExplicitMult(const Vector &u, Vector &v) const override { Mult(u, v); } // Setup A = M - gamma J = M + gamma C + gamma^2 K - int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, double gamma) override + int SUNImplicitSetup(const Vector &y, const Vector &fy, int jok, int *jcur, + double gamma) override { // Update Jacobian matrix if (!kspA || gamma != saved_gamma) @@ -236,8 +237,8 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, // Create ODE solver for 1st-order IVP. mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::IMPLICIT; - op = std::make_unique(iodata, space_op, dJ_coef, - 0.0, type); + op = std::make_unique(iodata, space_op, dJ_coef, 0.0, + type); switch (iodata.solver.transient.type) { case config::TransientSolverData::Type::GEN_ALPHA: diff --git a/palace/utils/iodata.cpp b/palace/utils/iodata.cpp index ce7e4fdcd..a3aa770c1 100644 --- a/palace/utils/iodata.cpp +++ b/palace/utils/iodata.cpp @@ -433,12 +433,14 @@ void IoData::CheckConfiguration() { if (solver.transient.rel_tol > 0 || solver.transient.abs_tol > 0) { - Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use relative " - "and absolute tolerance parameters!\n"); + Mpi::Warning( + "Generalized alpha and Runge-Kutta transient solvers do not use relative " + "and absolute tolerance parameters!\n"); } if (solver.transient.order > 0) { - Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use order parameter!\n"); + Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use order " + "parameter!\n"); } } else if (solver.transient.type == config::TransientSolverData::Type::CVODE) @@ -487,8 +489,7 @@ void IoData::CheckConfiguration() } else if (solver.transient.order > 5) { - Mpi::Warning( - "ARKODE transient solver order cannot be greater than 5!\n"); + Mpi::Warning("ARKODE transient solver order cannot be greater than 5!\n"); solver.transient.order = 5; } } From 8ed5f1e278b9c8e606b1c6487b38ff2c44daff43 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 11 Nov 2024 21:05:52 +0000 Subject: [PATCH 18/25] Change Vector management to avoid GPU memory issue --- cmake/ExternalSUNDIALS.cmake | 1 + palace/models/timeoperator.cpp | 92 ++++++++++++++++++++++++++-------- palace/models/timeoperator.hpp | 3 ++ 3 files changed, 74 insertions(+), 22 deletions(-) diff --git a/cmake/ExternalSUNDIALS.cmake b/cmake/ExternalSUNDIALS.cmake index 917f41927..648ef347c 100644 --- a/cmake/ExternalSUNDIALS.cmake +++ b/cmake/ExternalSUNDIALS.cmake @@ -42,6 +42,7 @@ endif() if(PALACE_WITH_CUDA) list(APPEND SUNDIALS_OPTIONS + "-DCMAKE_CUDA_ARCHITECTURES=${CMAKE_CUDA_ARCHITECTURES}" "-DENABLE_CUDA=ON" ) endif() diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index e76be042d..3ea9cf4b8 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -39,6 +39,9 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator mutable Vector RHS; int size_E; + // Indices of the first and second halves of the solution vector, sol = [Edot, E] + mfem::Array idx1, idx2; + // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and // construct the linear solver. std::function ConfigureLinearSolver; @@ -53,6 +56,15 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Get dimensions of E and Edot vectors. size_E = space_op.GetNDSpace().GetTrueVSize(); + // Set array indices + idx1.SetSize(size_E); + idx2.SetSize(size_E); + for (int i = 0; i < size_E; i++) + { + idx1[i] = i; + idx2[i] = i + size_E; + } + // Construct the system matrices defining the linear operator. PEC boundaries are // handled simply by setting diagonal entries of the mass matrix for the corresponding // dofs. Because the Dirichlet BC is always homogeneous, no special elimination is @@ -69,7 +81,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Set up linear solvers. { - const int print = iodata.problem.verbose; auto pcg = std::make_unique>(comm, 0); pcg->SetInitialGuess(0); pcg->SetRelTol(iodata.solver.linear.tol); @@ -104,10 +115,14 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Form the RHS for the first-order ODE system void FormRHS(const Vector &u, Vector &rhs) const { - Vector u1(u.GetData() + 0, size_E); - Vector u2(u.GetData() + size_E, size_E); - Vector rhs1(rhs.GetData() + 0, size_E); - Vector rhs2(rhs.GetData() + size_E, size_E); + Vector u1, u2, rhs1, rhs2; + u1.UseDevice(true); u2.UseDevice(true); + rhs1.UseDevice(true); rhs2.UseDevice(true); + u.GetSubVector(idx1, u1); + u.GetSubVector(idx2, u2); + rhs.GetSubVector(idx1, rhs1); + rhs.GetSubVector(idx2, rhs2); + // u1 = Edot, u2 = E // rhs1 = -(K * u2 + C * u1) - J(t) // rhs2 = u1 @@ -119,6 +134,9 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator linalg::AXPBYPCZ(-1.0, rhs1, dJ_coef(t), NegJ, 0.0, rhs1); rhs2 = u1; + + rhs.SetSubVector(idx1, rhs1); + rhs.SetSubVector(idx2, rhs2); } // Solve M du = rhs @@ -132,12 +150,20 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator du = 0.0; } FormRHS(u, RHS); - Vector du1(du.GetData() + 0, size_E); - Vector du2(du.GetData() + size_E, size_E); - Vector rhs1(RHS.GetData() + 0, size_E); - Vector rhs2(RHS.GetData() + size_E, size_E); + + Vector du1, du2, rhs1, rhs2; + du1.UseDevice(true); du2.UseDevice(true); + rhs1.UseDevice(true); rhs2.UseDevice(true); + du.GetSubVector(idx1, du1); + du.GetSubVector(idx2, du2); + RHS.GetSubVector(idx1, rhs1); + RHS.GetSubVector(idx2, rhs2); + kspM->Mult(rhs1, du1); du2 = rhs2; + + du.SetSubVector(idx1, du1); + du.SetSubVector(idx2, du); } void ImplicitSolve(double dt, const Vector &u, Vector &k) override @@ -154,16 +180,24 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator } Mpi::Print("\n"); FormRHS(u, RHS); - Vector k1(k.GetData() + 0, size_E); - Vector k2(k.GetData() + size_E, size_E); - Vector rhs1(RHS.GetData() + 0, size_E); - Vector rhs2(RHS.GetData() + size_E, size_E); + + Vector k1, k2, rhs1, rhs2; + k1.UseDevice(true); k2.UseDevice(true); + rhs1.UseDevice(true); rhs2.UseDevice(true); + k.GetSubVector(idx1, k1); + k.GetSubVector(idx2, k2); + RHS.GetSubVector(idx1, rhs1); + RHS.GetSubVector(idx2, rhs2); + // A k1 = rhs1 - dt K rhs2 K->AddMult(rhs2, rhs1, -dt); kspA->Mult(rhs1, k1); // k2 = rhs2 + dt k1 linalg::AXPBYPCZ(1.0, rhs2, dt, k1, 0.0, k2); + + k.SetSubVector(idx1, k1); + k.SetSubVector(idx2, k2); } void ExplicitMult(const Vector &u, Vector &v) const override { Mult(u, v); } @@ -190,11 +224,15 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Solve (Mass - dt Jacobian) x = Mass b int SUNImplicitSolve(const Vector &b, Vector &x, double tol) override { - Vector b1(b.GetData() + 0, size_E); - Vector b2(b.GetData() + size_E, size_E); - Vector x1(x.GetData() + 0, size_E); - Vector x2(x.GetData() + size_E, size_E); - Vector rhs(RHS.GetData() + 0, size_E); + Vector b1, b2, x1, x2, rhs; + b1.UseDevice(true); b2.UseDevice(true); + x1.UseDevice(true); x2.UseDevice(true); + rhs.UseDevice(true); + b.GetSubVector(idx1, b1); + b.GetSubVector(idx2, b2); + x.GetSubVector(idx1, x1); + x.GetSubVector(idx2, x2); + RHS.GetSubVector(idx1, rhs); // A x1 = M b1 - dt K b2 M->Mult(b1, rhs); @@ -204,6 +242,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // x2 = b2 + dt x1 linalg::AXPBYPCZ(1.0, b2, saved_gamma, x1, 0.0, x2); + x.SetSubVector(idx1, x1); + x.SetSubVector(idx2, x2); return 0; } }; @@ -222,6 +262,15 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, int size_E = space_op.GetNDSpace().GetTrueVSize(); int size_B = space_op.GetRTSpace().GetTrueVSize(); + // Set indices of Edot and E in the solution vector, sol = [Edot, E] + idx1.SetSize(size_E); + idx2.SetSize(size_E); + for (int i = 0; i < size_E; i++) + { + idx1[i] = i; + idx2[i] = i + size_E; + } + // Allocate space for solution vectors. sol.SetSize(2 * size_E); E.SetSize(size_E); @@ -232,9 +281,6 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, En.UseDevice(true); B.UseDevice(true); - // Sol = [Edot, E] - E.MakeRef(sol, size_E); - // Create ODE solver for 1st-order IVP. mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::IMPLICIT; op = std::make_unique(iodata, space_op, dJ_coef, 0.0, @@ -347,6 +393,7 @@ void TimeOperator::Init() { // Always use zero initial conditions. sol = 0.0; + sol.GetSubVector(idx2, E); B = 0.0; if (use_mfem_integrator) { @@ -356,9 +403,10 @@ void TimeOperator::Init() void TimeOperator::Step(double &t, double &dt) { - En = E; + sol.GetSubVector(idx2, En); double dt_input = dt; ode->Step(sol, t, dt); + sol.GetSubVector(idx2, E); // Ensure user-specified dt does not change. dt = dt_input; diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index eb1458bc3..d314042ef 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -37,6 +37,9 @@ class TimeOperator double rel_tol, abs_tol; bool use_mfem_integrator = false; + // Indices of the first and second halves of the solution vector, sol = [Edot, E] + mfem::Array idx1, idx2; + // Discrete curl for B-field time integration (not owned). const Operator *Curl; From f1ebc2990a0b46fe8ebadd53449f58d497c9cb12 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 11 Nov 2024 13:06:46 -0800 Subject: [PATCH 19/25] Fix formatting issues --- palace/models/timeoperator.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 3ea9cf4b8..d59c95bc3 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -116,8 +116,10 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator void FormRHS(const Vector &u, Vector &rhs) const { Vector u1, u2, rhs1, rhs2; - u1.UseDevice(true); u2.UseDevice(true); - rhs1.UseDevice(true); rhs2.UseDevice(true); + u1.UseDevice(true); + u2.UseDevice(true); + rhs1.UseDevice(true); + rhs2.UseDevice(true); u.GetSubVector(idx1, u1); u.GetSubVector(idx2, u2); rhs.GetSubVector(idx1, rhs1); @@ -152,8 +154,10 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator FormRHS(u, RHS); Vector du1, du2, rhs1, rhs2; - du1.UseDevice(true); du2.UseDevice(true); - rhs1.UseDevice(true); rhs2.UseDevice(true); + du1.UseDevice(true); + du2.UseDevice(true); + rhs1.UseDevice(true); + rhs2.UseDevice(true); du.GetSubVector(idx1, du1); du.GetSubVector(idx2, du2); RHS.GetSubVector(idx1, rhs1); @@ -182,8 +186,10 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator FormRHS(u, RHS); Vector k1, k2, rhs1, rhs2; - k1.UseDevice(true); k2.UseDevice(true); - rhs1.UseDevice(true); rhs2.UseDevice(true); + k1.UseDevice(true); + k2.UseDevice(true); + rhs1.UseDevice(true); + rhs2.UseDevice(true); k.GetSubVector(idx1, k1); k.GetSubVector(idx2, k2); RHS.GetSubVector(idx1, rhs1); @@ -225,8 +231,10 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator int SUNImplicitSolve(const Vector &b, Vector &x, double tol) override { Vector b1, b2, x1, x2, rhs; - b1.UseDevice(true); b2.UseDevice(true); - x1.UseDevice(true); x2.UseDevice(true); + b1.UseDevice(true); + b2.UseDevice(true); + x1.UseDevice(true); + x2.UseDevice(true); rhs.UseDevice(true); b.GetSubVector(idx1, b1); b.GetSubVector(idx2, b2); From cc65463d2bf895ba7a471152f9fc71e261a5e493 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Mon, 11 Nov 2024 21:26:37 +0000 Subject: [PATCH 20/25] Fix typo --- palace/models/timeoperator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index d59c95bc3..fd8540fa6 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -167,7 +167,7 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator du2 = rhs2; du.SetSubVector(idx1, du1); - du.SetSubVector(idx2, du); + du.SetSubVector(idx2, du2); } void ImplicitSolve(double dt, const Vector &u, Vector &k) override From 2c59a02ccf2e2fc98d19ed5708b3bac600289dd1 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 13 Nov 2024 02:40:33 +0000 Subject: [PATCH 21/25] Make rhs/RHS lower/upper case consistent --- palace/models/timeoperator.cpp | 44 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index fd8540fa6..4b1f52c66 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -153,18 +153,18 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator } FormRHS(u, RHS); - Vector du1, du2, rhs1, rhs2; + Vector du1, du2, RHS1, RHS2; du1.UseDevice(true); du2.UseDevice(true); - rhs1.UseDevice(true); - rhs2.UseDevice(true); + RHS1.UseDevice(true); + RHS2.UseDevice(true); du.GetSubVector(idx1, du1); du.GetSubVector(idx2, du2); - RHS.GetSubVector(idx1, rhs1); - RHS.GetSubVector(idx2, rhs2); + RHS.GetSubVector(idx1, RHS1); + RHS.GetSubVector(idx2, RHS2); - kspM->Mult(rhs1, du1); - du2 = rhs2; + kspM->Mult(RHS1, du1); + du2 = RHS2; du.SetSubVector(idx1, du1); du.SetSubVector(idx2, du2); @@ -185,22 +185,22 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator Mpi::Print("\n"); FormRHS(u, RHS); - Vector k1, k2, rhs1, rhs2; + Vector k1, k2, RHS1, RHS2; k1.UseDevice(true); k2.UseDevice(true); - rhs1.UseDevice(true); - rhs2.UseDevice(true); + RHS1.UseDevice(true); + RHS2.UseDevice(true); k.GetSubVector(idx1, k1); k.GetSubVector(idx2, k2); - RHS.GetSubVector(idx1, rhs1); - RHS.GetSubVector(idx2, rhs2); + RHS.GetSubVector(idx1, RHS1); + RHS.GetSubVector(idx2, RHS2); - // A k1 = rhs1 - dt K rhs2 - K->AddMult(rhs2, rhs1, -dt); - kspA->Mult(rhs1, k1); + // A k1 = RHS1 - dt K RHS2 + K->AddMult(RHS2, RHS1, -dt); + kspA->Mult(RHS1, k1); // k2 = rhs2 + dt k1 - linalg::AXPBYPCZ(1.0, rhs2, dt, k1, 0.0, k2); + linalg::AXPBYPCZ(1.0, RHS2, dt, k1, 0.0, k2); k.SetSubVector(idx1, k1); k.SetSubVector(idx2, k2); @@ -230,22 +230,22 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Solve (Mass - dt Jacobian) x = Mass b int SUNImplicitSolve(const Vector &b, Vector &x, double tol) override { - Vector b1, b2, x1, x2, rhs; + Vector b1, b2, x1, x2, RHS1; b1.UseDevice(true); b2.UseDevice(true); x1.UseDevice(true); x2.UseDevice(true); - rhs.UseDevice(true); + RHS1.UseDevice(true); b.GetSubVector(idx1, b1); b.GetSubVector(idx2, b2); x.GetSubVector(idx1, x1); x.GetSubVector(idx2, x2); - RHS.GetSubVector(idx1, rhs); + RHS.GetSubVector(idx1, RHS1); // A x1 = M b1 - dt K b2 - M->Mult(b1, rhs); - K->AddMult(b2, rhs, -saved_gamma); - kspA->Mult(rhs, x1); + M->Mult(b1, RHS1); + K->AddMult(b2, RHS1, -saved_gamma); + kspA->Mult(RHS1, x1); // x2 = b2 + dt x1 linalg::AXPBYPCZ(1.0, b2, saved_gamma, x1, 0.0, x2); From 47a04e9176aed2c7e4d4fa6786801a64ffec2897 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 13 Nov 2024 18:03:23 +0000 Subject: [PATCH 22/25] Use MakeRef instead of Get/SetSubVector to split ODE system vectors --- palace/models/timeoperator.cpp | 82 ++++++++++++---------------------- palace/models/timeoperator.hpp | 3 -- 2 files changed, 29 insertions(+), 56 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index 4b1f52c66..d950cd708 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -39,9 +39,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator mutable Vector RHS; int size_E; - // Indices of the first and second halves of the solution vector, sol = [Edot, E] - mfem::Array idx1, idx2; - // Bindings to SpaceOperator functions to get the system matrix and preconditioner, and // construct the linear solver. std::function ConfigureLinearSolver; @@ -56,15 +53,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // Get dimensions of E and Edot vectors. size_E = space_op.GetNDSpace().GetTrueVSize(); - // Set array indices - idx1.SetSize(size_E); - idx2.SetSize(size_E); - for (int i = 0; i < size_E; i++) - { - idx1[i] = i; - idx2[i] = i + size_E; - } - // Construct the system matrices defining the linear operator. PEC boundaries are // handled simply by setting diagonal entries of the mass matrix for the corresponding // dofs. Because the Dirichlet BC is always homogeneous, no special elimination is @@ -120,10 +108,12 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator u2.UseDevice(true); rhs1.UseDevice(true); rhs2.UseDevice(true); - u.GetSubVector(idx1, u1); - u.GetSubVector(idx2, u2); - rhs.GetSubVector(idx1, rhs1); - rhs.GetSubVector(idx2, rhs2); + u.Read(); + u1.MakeRef(const_cast(u), 0, size_E); + u2.MakeRef(const_cast(u), size_E, size_E); + rhs.ReadWrite(); + rhs1.MakeRef(rhs, 0, size_E); + rhs2.MakeRef(rhs, size_E, size_E); // u1 = Edot, u2 = E // rhs1 = -(K * u2 + C * u1) - J(t) @@ -136,9 +126,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator linalg::AXPBYPCZ(-1.0, rhs1, dJ_coef(t), NegJ, 0.0, rhs1); rhs2 = u1; - - rhs.SetSubVector(idx1, rhs1); - rhs.SetSubVector(idx2, rhs2); } // Solve M du = rhs @@ -158,16 +145,15 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator du2.UseDevice(true); RHS1.UseDevice(true); RHS2.UseDevice(true); - du.GetSubVector(idx1, du1); - du.GetSubVector(idx2, du2); - RHS.GetSubVector(idx1, RHS1); - RHS.GetSubVector(idx2, RHS2); + du.ReadWrite(); + du1.MakeRef(du, 0, size_E); + du2.MakeRef(du, size_E, size_E); + RHS.ReadWrite(); + RHS1.MakeRef(RHS, 0, size_E); + RHS2.MakeRef(RHS, size_E, size_E); kspM->Mult(RHS1, du1); du2 = RHS2; - - du.SetSubVector(idx1, du1); - du.SetSubVector(idx2, du2); } void ImplicitSolve(double dt, const Vector &u, Vector &k) override @@ -190,10 +176,12 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator k2.UseDevice(true); RHS1.UseDevice(true); RHS2.UseDevice(true); - k.GetSubVector(idx1, k1); - k.GetSubVector(idx2, k2); - RHS.GetSubVector(idx1, RHS1); - RHS.GetSubVector(idx2, RHS2); + k.ReadWrite(); + k1.MakeRef(k, 0, size_E); + k2.MakeRef(k, size_E, size_E); + RHS.ReadWrite(); + RHS1.MakeRef(RHS, 0, size_E); + RHS2.MakeRef(RHS, size_E, size_E); // A k1 = RHS1 - dt K RHS2 K->AddMult(RHS2, RHS1, -dt); @@ -201,9 +189,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // k2 = rhs2 + dt k1 linalg::AXPBYPCZ(1.0, RHS2, dt, k1, 0.0, k2); - - k.SetSubVector(idx1, k1); - k.SetSubVector(idx2, k2); } void ExplicitMult(const Vector &u, Vector &v) const override { Mult(u, v); } @@ -236,11 +221,14 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator x1.UseDevice(true); x2.UseDevice(true); RHS1.UseDevice(true); - b.GetSubVector(idx1, b1); - b.GetSubVector(idx2, b2); - x.GetSubVector(idx1, x1); - x.GetSubVector(idx2, x2); - RHS.GetSubVector(idx1, RHS1); + b.Read(); + b1.MakeRef(const_cast(b), 0, size_E); + b2.MakeRef(const_cast(b), size_E, size_E); + x.ReadWrite(); + x1.MakeRef(x, 0, size_E); + x2.MakeRef(x, size_E, size_E); + RHS.ReadWrite(); + RHS1.MakeRef(RHS, 0, size_E); // A x1 = M b1 - dt K b2 M->Mult(b1, RHS1); @@ -250,8 +238,6 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator // x2 = b2 + dt x1 linalg::AXPBYPCZ(1.0, b2, saved_gamma, x1, 0.0, x2); - x.SetSubVector(idx1, x1); - x.SetSubVector(idx2, x2); return 0; } }; @@ -270,24 +256,16 @@ TimeOperator::TimeOperator(const IoData &iodata, SpaceOperator &space_op, int size_E = space_op.GetNDSpace().GetTrueVSize(); int size_B = space_op.GetRTSpace().GetTrueVSize(); - // Set indices of Edot and E in the solution vector, sol = [Edot, E] - idx1.SetSize(size_E); - idx2.SetSize(size_E); - for (int i = 0; i < size_E; i++) - { - idx1[i] = i; - idx2[i] = i + size_E; - } - // Allocate space for solution vectors. sol.SetSize(2 * size_E); - E.SetSize(size_E); En.SetSize(size_E); B.SetSize(size_B); sol.UseDevice(true); E.UseDevice(true); En.UseDevice(true); B.UseDevice(true); + sol.ReadWrite(); + E.MakeRef(sol, size_E, size_E); // Create ODE solver for 1st-order IVP. mfem::TimeDependentOperator::Type type = mfem::TimeDependentOperator::IMPLICIT; @@ -401,7 +379,6 @@ void TimeOperator::Init() { // Always use zero initial conditions. sol = 0.0; - sol.GetSubVector(idx2, E); B = 0.0; if (use_mfem_integrator) { @@ -411,10 +388,9 @@ void TimeOperator::Init() void TimeOperator::Step(double &t, double &dt) { - sol.GetSubVector(idx2, En); + En = E; double dt_input = dt; ode->Step(sol, t, dt); - sol.GetSubVector(idx2, E); // Ensure user-specified dt does not change. dt = dt_input; diff --git a/palace/models/timeoperator.hpp b/palace/models/timeoperator.hpp index d314042ef..eb1458bc3 100644 --- a/palace/models/timeoperator.hpp +++ b/palace/models/timeoperator.hpp @@ -37,9 +37,6 @@ class TimeOperator double rel_tol, abs_tol; bool use_mfem_integrator = false; - // Indices of the first and second halves of the solution vector, sol = [Edot, E] - mfem::Array idx1, idx2; - // Discrete curl for B-field time integration (not owned). const Operator *Curl; From 137ec8b61948cc372cc39455e02a60864365e5f7 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 13 Nov 2024 10:09:15 -0800 Subject: [PATCH 23/25] Fix formatting issues --- palace/models/timeoperator.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/palace/models/timeoperator.cpp b/palace/models/timeoperator.cpp index d950cd708..ba5eb184d 100644 --- a/palace/models/timeoperator.cpp +++ b/palace/models/timeoperator.cpp @@ -109,8 +109,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator rhs1.UseDevice(true); rhs2.UseDevice(true); u.Read(); - u1.MakeRef(const_cast(u), 0, size_E); - u2.MakeRef(const_cast(u), size_E, size_E); + u1.MakeRef(const_cast(u), 0, size_E); + u2.MakeRef(const_cast(u), size_E, size_E); rhs.ReadWrite(); rhs1.MakeRef(rhs, 0, size_E); rhs2.MakeRef(rhs, size_E, size_E); @@ -222,8 +222,8 @@ class TimeDependentFirstOrderOperator : public mfem::TimeDependentOperator x2.UseDevice(true); RHS1.UseDevice(true); b.Read(); - b1.MakeRef(const_cast(b), 0, size_E); - b2.MakeRef(const_cast(b), size_E, size_E); + b1.MakeRef(const_cast(b), 0, size_E); + b2.MakeRef(const_cast(b), size_E, size_E); x.ReadWrite(); x1.MakeRef(x, 0, size_E); x2.MakeRef(x, size_E, size_E); From df38dbb0021bd805b6c71ebdcc08c53d6ff73d66 Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 13 Nov 2024 23:45:33 +0000 Subject: [PATCH 24/25] Simplify transient solver config file verification --- palace/utils/configfile.cpp | 18 ++++++++ palace/utils/configfile.hpp | 9 ++-- palace/utils/iodata.cpp | 69 ------------------------------- scripts/schema/config/solver.json | 2 +- 4 files changed, 24 insertions(+), 74 deletions(-) diff --git a/palace/utils/configfile.cpp b/palace/utils/configfile.cpp index 5acca9c65..1a17d2ae1 100644 --- a/palace/utils/configfile.cpp +++ b/palace/utils/configfile.cpp @@ -1644,6 +1644,24 @@ void TransientSolverData::SetUp(json &solver) rel_tol = transient->value("RelTol", rel_tol); abs_tol = transient->value("AbsTol", abs_tol); + if (type == Type::GEN_ALPHA || type == Type::RUNGE_KUTTA || type == Type::DEFAULT) + { + if (transient->contains("Order")) + { + MFEM_WARNING("GeneralizedAlpha and RungeKutta transient solvers do not use config[\"Transient\"][\"Order\"]!"); + } + if (transient->contains("RelTol") || transient->contains("AbsTol")) + { + MFEM_WARNING( + "GeneralizedAlpha and RungeKutta transient solvers do not use\n" + "config[\"Transient\"][\"RelTol\"] and config[\"Transient\"][\"AbsTol\"]!"); + } + } else { + MFEM_VERIFY(rel_tol > 0, "config[\"Transient\"][\"RelTol\"] must be strictly positive!"); + MFEM_VERIFY(abs_tol > 0, "config[\"Transient\"][\"AbsTol\"] must be strictly positive!"); + MFEM_VERIFY(order >=2 && order <= 5, "config[\"Transient\"][\"Order\"] must be between 2 and 5!"); + } + // Cleanup transient->erase("Type"); transient->erase("Excitation"); diff --git a/palace/utils/configfile.hpp b/palace/utils/configfile.hpp index 7000701e2..dacb243f6 100644 --- a/palace/utils/configfile.hpp +++ b/palace/utils/configfile.hpp @@ -776,11 +776,12 @@ struct TransientSolverData // RK scheme order for SUNDIALS ARKODE integrators. // Max order for SUNDIALS CVODE integrator. - int order = -1; + // Not used for generalized α and Runge-Kutta integrators. + int order = 2; - // Adaptive time-stepping tolerances - double rel_tol = -1; - double abs_tol = -1; + // Adaptive time-stepping tolerances for CVODE and ARKODE. + double rel_tol = 1e-4; + double abs_tol = 1e-9; void SetUp(json &solver); }; diff --git a/palace/utils/iodata.cpp b/palace/utils/iodata.cpp index a3aa770c1..52db5b243 100644 --- a/palace/utils/iodata.cpp +++ b/palace/utils/iodata.cpp @@ -425,75 +425,6 @@ void IoData::CheckConfiguration() problem.type == config::ProblemData::Type::MAGNETOSTATIC || problem.type == config::ProblemData::Type::TRANSIENT); } - if (problem.type == config::ProblemData::Type::TRANSIENT) - { - if (solver.transient.type == config::TransientSolverData::Type::GEN_ALPHA || - solver.transient.type == config::TransientSolverData::Type::DEFAULT || - solver.transient.type == config::TransientSolverData::Type::RUNGE_KUTTA) - { - if (solver.transient.rel_tol > 0 || solver.transient.abs_tol > 0) - { - Mpi::Warning( - "Generalized alpha and Runge-Kutta transient solvers do not use relative " - "and absolute tolerance parameters!\n"); - } - if (solver.transient.order > 0) - { - Mpi::Warning("Generalized alpha and Runge-Kutta transient solvers do not use order " - "parameter!\n"); - } - } - else if (solver.transient.type == config::TransientSolverData::Type::CVODE) - { - if (solver.transient.rel_tol < 0) - { - solver.transient.rel_tol = 1e-4; - } - if (solver.transient.abs_tol < 0) - { - solver.transient.abs_tol = 1e-9; - } - if (solver.transient.order <= 0) - { - solver.transient.order = 2; - } - else if (solver.transient.order < 2) - { - Mpi::Warning("CVODE transient solver order cannot be less than 2!\n"); - solver.transient.order = 2; - } - else if (solver.transient.order > 5) - { - Mpi::Warning("CVODE transient solver order cannot be greater than 5!\n"); - solver.transient.order = 5; - } - } - else // ARKODE and RUNGE_KUTTA - { - if (solver.transient.rel_tol < 0) - { - solver.transient.rel_tol = 1e-4; - } - if (solver.transient.abs_tol < 0) - { - solver.transient.abs_tol = 1e-9; - } - if (solver.transient.order < 0) - { - solver.transient.order = 3; - } - else if (solver.transient.order < 2) - { - Mpi::Warning("ARKODE transient solver order cannot be less than 2!\n"); - solver.transient.order = 2; - } - else if (solver.transient.order > 5) - { - Mpi::Warning("ARKODE transient solver order cannot be greater than 5!\n"); - solver.transient.order = 5; - } - } - } // Configure settings for quadrature rules and partial assembly. BilinearForm::pa_order_threshold = solver.pa_order_threshold; diff --git a/scripts/schema/config/solver.json b/scripts/schema/config/solver.json index 4c4131315..c94d23a0c 100644 --- a/scripts/schema/config/solver.json +++ b/scripts/schema/config/solver.json @@ -68,7 +68,7 @@ "MaxTime": { "type": "number" }, "TimeStep": { "type": "number" }, "SaveStep": { "type": "integer" }, - "Order": {"type": "integer"}, + "Order": {"type": "integer", "minimum": 2, "maximum": 5}, "RelTol": {"type": "number", "exclusiveMinimum": 0.0}, "AbsTol": {"type": "number", "exclusiveMinimum": 0.0} } From 9ecd6d15fb503467d0588bcca3b592fc15847b6c Mon Sep 17 00:00:00 2001 From: Simon Lapointe Date: Wed, 13 Nov 2024 15:48:06 -0800 Subject: [PATCH 25/25] fix formatting issues --- palace/utils/configfile.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/palace/utils/configfile.cpp b/palace/utils/configfile.cpp index 1a17d2ae1..127de4a95 100644 --- a/palace/utils/configfile.cpp +++ b/palace/utils/configfile.cpp @@ -1648,18 +1648,24 @@ void TransientSolverData::SetUp(json &solver) { if (transient->contains("Order")) { - MFEM_WARNING("GeneralizedAlpha and RungeKutta transient solvers do not use config[\"Transient\"][\"Order\"]!"); + MFEM_WARNING("GeneralizedAlpha and RungeKutta transient solvers do not use " + "config[\"Transient\"][\"Order\"]!"); } if (transient->contains("RelTol") || transient->contains("AbsTol")) { - MFEM_WARNING( - "GeneralizedAlpha and RungeKutta transient solvers do not use\n" - "config[\"Transient\"][\"RelTol\"] and config[\"Transient\"][\"AbsTol\"]!"); + MFEM_WARNING( + "GeneralizedAlpha and RungeKutta transient solvers do not use\n" + "config[\"Transient\"][\"RelTol\"] and config[\"Transient\"][\"AbsTol\"]!"); } - } else { - MFEM_VERIFY(rel_tol > 0, "config[\"Transient\"][\"RelTol\"] must be strictly positive!"); - MFEM_VERIFY(abs_tol > 0, "config[\"Transient\"][\"AbsTol\"] must be strictly positive!"); - MFEM_VERIFY(order >=2 && order <= 5, "config[\"Transient\"][\"Order\"] must be between 2 and 5!"); + } + else + { + MFEM_VERIFY(rel_tol > 0, + "config[\"Transient\"][\"RelTol\"] must be strictly positive!"); + MFEM_VERIFY(abs_tol > 0, + "config[\"Transient\"][\"AbsTol\"] must be strictly positive!"); + MFEM_VERIFY(order >= 2 && order <= 5, + "config[\"Transient\"][\"Order\"] must be between 2 and 5!"); } // Cleanup