From e0b006d3e01d8c76e611714d51fc629c27ebc0b5 Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Wed, 22 Mar 2023 18:00:14 +0100 Subject: [PATCH 01/17] changes for Schwarz --- include/pressiodemoapps/adapter_cpp.hpp | 4 + ...2d_ghost_filler_double_mach_reflection.hpp | 183 +- .../impl/euler_2d_prob_class.hpp | 45 +- tests_cpp/CMakeLists.txt | 2 + .../CMakeLists.txt | 2 + .../compare.py | 22 + .../firstorder/CMakeLists.txt | 18 + .../firstorder/rho_gold.txt | 10000 ++++++++++++++++ .../main.cc | 63 + .../plot.py | 66 + .../test.cmake | 24 + 11 files changed, 10419 insertions(+), 10 deletions(-) create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/compare.py create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/rho_gold.txt create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/plot.py create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake diff --git a/include/pressiodemoapps/adapter_cpp.hpp b/include/pressiodemoapps/adapter_cpp.hpp index 100f1f75..490a0f71 100644 --- a/include/pressiodemoapps/adapter_cpp.hpp +++ b/include/pressiodemoapps/adapter_cpp.hpp @@ -148,6 +148,10 @@ class PublicProblemEigenMixinCpp : public T return createApplyJacobianResult(operand); } + void setStateBc(state_type * stateBc){ + T::setStateBc(stateBc); + } + // // evaluation // diff --git a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp index 5749ca08..13889d96 100644 --- a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp +++ b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp @@ -51,6 +51,188 @@ namespace pressiodemoapps{ namespace impleuler2d{ + +template +class DoubleMachReflection2dGhostFillerWithCustomBc +{ + using scalar_type = typename mesh_t::scalar_t; + +public: + DoubleMachReflection2dGhostFillerWithCustomBc() = delete; + DoubleMachReflection2dGhostFillerWithCustomBc(const int stencilSize, + const state_t & stateIn, + const scalar_type evaluationTime, + const scalar_type gamma, + const mesh_t & meshIn, + ghost_t & ghostLeft, + ghost_t & ghostFront, + ghost_t & ghostRight, + ghost_t & ghostBack, + const state_t & stateBcs) + : m_stencilSize(stencilSize), + m_state(stateIn), + m_evaluationTime(evaluationTime), + m_gamma(gamma), + m_meshObj(meshIn), + m_ghostLeft(ghostLeft), + m_ghostFront(ghostFront), + m_ghostRight(ghostRight), + m_ghostBack(ghostBack), + m_stateBcs(stateBcs) + { + computeShockConditions(); + } + + template + void operator()(index_t smPt, int gRow) + { + /* use m_stateBcs here */ + + constexpr int numDofPerCell = 4; + constexpr scalar_type zero{0}; + constexpr scalar_type two{2}; + constexpr scalar_type three{3}; + + const auto & graph = m_meshObj.graph(); + assert(::pressiodemoapps::extent(graph, 0) >= 5); + const auto cellGID = graph(smPt, 0); + const auto uIndex = cellGID*numDofPerCell; + + const auto & x = m_meshObj.viewX(); + const auto & y = m_meshObj.viewY(); + const auto myX = x(cellGID); + const auto myY = y(cellGID); + const auto dy = m_meshObj.dy(); + + const auto left0 = graph(smPt, 1); + const auto front0 = graph(smPt, 2); + const auto right0 = graph(smPt, 3); + const auto back0 = graph(smPt, 4); + + if (left0 == -1) + { + m_ghostLeft(gRow, 0) = m_state(uIndex+0); + m_ghostLeft(gRow, 1) = m_state(uIndex+1); + m_ghostLeft(gRow, 2) = m_state(uIndex+2); + m_ghostLeft(gRow, 3) = m_state(uIndex+3); + } + + if (front0 == -1){ + if (distanceFromShock(myX, myY+dy) < zero){ + m_ghostFront(gRow, 0) = m_postShockState[0]; + m_ghostFront(gRow, 1) = m_postShockState[1]; + m_ghostFront(gRow, 2) = m_postShockState[2]; + m_ghostFront(gRow, 3) = m_postShockState[3]; + } + else{ + m_ghostFront(gRow, 0) = m_preShockState[0]; + m_ghostFront(gRow, 1) = m_preShockState[1]; + m_ghostFront(gRow, 2) = m_preShockState[2]; + m_ghostFront(gRow, 3) = m_preShockState[3]; + } + } + + if (right0 == -1) + { + m_ghostRight(gRow, 0) = m_state(uIndex); + m_ghostRight(gRow, 1) = m_state(uIndex+1); + m_ghostRight(gRow, 2) = m_state(uIndex+2); + m_ghostRight(gRow, 3) = m_state(uIndex+3); + } + + if (back0 == -1) + { + if (myX < m_wedgePosition){ + m_ghostBack(gRow, 0) = m_state(uIndex+0); + m_ghostBack(gRow, 1) = m_state(uIndex+1); + m_ghostBack(gRow, 2) = m_state(uIndex+2); + m_ghostBack(gRow, 3) = m_state(uIndex+3); + } + else{ + m_ghostBack(gRow, 0) = m_state(uIndex+0); + m_ghostBack(gRow, 1) = m_state(uIndex+1); + m_ghostBack(gRow, 2) = -m_state(uIndex+2); + m_ghostBack(gRow, 3) = m_state(uIndex+3); + } + } + + if (m_stencilSize >= 5){ + throw std::runtime_error("Invalid case"); + } + + if (m_stencilSize >= 7){ + throw std::runtime_error("Invalid case"); + } + } + +private: + void computeShockConditions() + { + constexpr scalar_type zero{0}; + constexpr scalar_type one{1}; + using namespace ::pressiodemoapps::ee; + + m_preShockPrim[0] = m_gamma; + m_preShockPrim[1] = zero; + m_preShockPrim[1] = zero; + m_preShockPrim[3] = one; + computePostShockConditionsFromPreshockAtRest(m_postShockPrim, + m_preShockPrim, + -m_angle, + m_machShock, + m_gamma); + + m_preShockState[0] = m_preShockPrim[0]; + m_preShockState[1] = m_preShockPrim[0]*m_preShockPrim[1]; + m_preShockState[2] = m_preShockPrim[0]*m_preShockPrim[2]; + m_preShockState[3] = eulerEquationsComputeEnergyFromPrimitive2(m_gammaMinusOneInv, + m_preShockPrim); + + m_postShockState[0] = m_postShockPrim[0]; + m_postShockState[1] = m_postShockPrim[0]*m_postShockPrim[1]; + m_postShockState[2] = m_postShockPrim[0]*m_postShockPrim[2]; + m_postShockState[3] = eulerEquationsComputeEnergyFromPrimitive2(m_gammaMinusOneInv, + m_postShockPrim); + } + + scalar_type distanceFromShock(scalar_type xIn, scalar_type yIn) + { + return (xIn - m_wedgePosition - m_shockSpeed*m_evaluationTime - m_shockSlope*yIn ); + }; + +private: + const int m_stencilSize; + const state_t & m_state; + const scalar_type m_evaluationTime; + const scalar_type m_gamma; + const mesh_t & m_meshObj; + ghost_t & m_ghostLeft; + ghost_t & m_ghostFront; + ghost_t & m_ghostRight; + ghost_t & m_ghostBack; + + std::array m_preShockPrim = {0,0,0,0}; + std::array m_preShockState = {0,0,0,0}; + std::array m_postShockPrim = {0,0,0,0}; + std::array m_postShockState = {0,0,0,0}; + + const scalar_type one = static_cast(1); + const scalar_type six = static_cast(6); + const scalar_type m_gammaMinusOneInv = one/(m_gamma-one); + const scalar_type m_machShock{10}; + const scalar_type m_angle = M_PI/6.; + const scalar_type m_wedgePosition = one/six; + const scalar_type m_shockSpeed = m_machShock/std::cos(m_angle); + const scalar_type m_shockSlope = std::tan(m_angle); + const scalar_type m_shockSlopeInv = one/m_shockSlope; + const scalar_type m_shockSlopeInv_sq = m_shockSlopeInv*m_shockSlopeInv; + const state_t & m_stateBcs; +}; + + + + + template class DoubleMachReflection2dGhostFiller { @@ -327,7 +509,6 @@ class DoubleMachReflection2dGhostFiller const scalar_type m_shockSlope = std::tan(m_angle); const scalar_type m_shockSlopeInv = one/m_shockSlope; const scalar_type m_shockSlopeInv_sq = m_shockSlopeInv*m_shockSlopeInv; - }; }} diff --git a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp index 3d47082e..cbee3a8b 100644 --- a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp @@ -146,6 +146,10 @@ class EigenApp } protected: + void setStateBc(state_type * stateBc){ + m_stateBc = stateBc; + } + void initializeJacobian(jacobian_type & J) { J.resize(m_numDofSampleMesh, m_numDofStencilMesh); @@ -431,20 +435,41 @@ class EigenApp else if (m_probEn == ::pressiodemoapps::Euler2d::DoubleMachReflection) { - using ghost_filler_t = DoubleMachReflection2dGhostFiller< - U_t, MeshType, ghost_container_type>; - ghost_filler_t ghF(stencilSize, U, - currentTime, m_gamma, m_meshObj, - m_ghostLeft, m_ghostFront, - m_ghostRight, m_ghostBack); + if (m_stateBc){ + using ghost_filler_t = DoubleMachReflection2dGhostFillerWithCustomBc< + U_t, MeshType, ghost_container_type>; + ghost_filler_t ghF(stencilSize, U, + currentTime, m_gamma, m_meshObj, + m_ghostLeft, m_ghostFront, + m_ghostRight, m_ghostBack, + *m_stateBc); + const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); +#ifdef PRESSIODEMOAPPS_ENABLE_OPENMP +#pragma omp for schedule(static) +#endif + for (decltype(rowsBd.size()) it=0; it; + ghost_filler_t ghF(stencilSize, U, + currentTime, m_gamma, m_meshObj, + m_ghostLeft, m_ghostFront, + m_ghostRight, m_ghostBack); + + const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); #ifdef PRESSIODEMOAPPS_ENABLE_OPENMP #pragma omp for schedule(static) #endif - for (decltype(rowsBd.size()) it=0; it m_crossshock_params; + + state_type * m_stateBc = nullptr; }; template constexpr int EigenApp::numDofPerCell; diff --git a/tests_cpp/CMakeLists.txt b/tests_cpp/CMakeLists.txt index d1e5e660..843b777c 100644 --- a/tests_cpp/CMakeLists.txt +++ b/tests_cpp/CMakeLists.txt @@ -81,6 +81,8 @@ add_subdirectory(eigen_2d_advdiffreac_probA_explicit) add_subdirectory(eigen_2d_advdiffreac_probA_sample_mesh_test) add_subdirectory(eigen_2d_advdiffreac_probA_implicit) +add_subdirectory(eigen_2d_euler_double_mach_reflection_schwarz) + # --------------------------------------------------------- # 3d problems # --------------------------------------------------------- diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/CMakeLists.txt new file mode 100644 index 00000000..0129c4d3 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_subdirectory(firstorder) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/compare.py b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/compare.py new file mode 100644 index 00000000..901ef578 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/compare.py @@ -0,0 +1,22 @@ + +import numpy as np +import sys, os + +if __name__== "__main__": + nx=50 + ny=200 + fomTotDofs = nx*ny*4 + + D = np.fromfile("doubleMach2d_solution.bin") + nt = int(np.size(D)/fomTotDofs) + D = np.reshape(D, (nt, fomTotDofs)) + D = D[-1, :] + D = np.reshape(D, (nx*ny, 4)) + rho = D[:,0] + np.savetxt("rho.txt", rho) + + goldD = np.loadtxt("rho_gold.txt") + assert(np.allclose(rho.shape, goldD.shape)) + assert(np.isnan(rho).all() == False) + assert(np.isnan(goldD).all() == False) + assert(np.allclose(rho, goldD,rtol=1e-10, atol=1e-12)) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt new file mode 100644 index 00000000..72fa6fe2 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt @@ -0,0 +1,18 @@ + +set(testname eigen_2d_double_mach_firstorder_implicit_schwarz) +set(exename ${testname}_exe) + +configure_file(../compare.py compare.py COPYONLY) +configure_file(rho_gold.txt rho_gold.txt COPYONLY) +configure_file(../plot.py plot.py COPYONLY) + +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) + +add_test(NAME ${testname} +COMMAND ${CMAKE_COMMAND} +-DMESHDRIVER=${MESHSRC}/create_full_mesh.py +-DOUTDIR=${CMAKE_CURRENT_BINARY_DIR} +-DEXENAME=$ +-DSTENCILVAL=3 +-P ${CMAKE_CURRENT_SOURCE_DIR}/../test.cmake +) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/rho_gold.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/rho_gold.txt new file mode 100644 index 00000000..0d1a10d5 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/rho_gold.txt @@ -0,0 +1,10000 @@ +8.898329215590543129e+00 +8.985192990534597968e+00 +9.204868202713351266e+00 +9.628660106166242016e+00 +1.034646592501153961e+01 +1.143947772735460156e+01 +1.293563993873191720e+01 +1.480062162866026654e+01 +1.757248291490499525e+01 +1.853824677577889091e+01 +1.878970182848188841e+01 +1.876140892357067358e+01 +1.862573342152253630e+01 +1.845340126772394740e+01 +1.827399608835427003e+01 +1.809971500210671991e+01 +1.793518001392998329e+01 +1.778167432395176206e+01 +1.763903524290107683e+01 +1.750651830908368112e+01 +1.738319361122523077e+01 +1.726812392383133599e+01 +1.716043962158479630e+01 +1.705936477127767859e+01 +1.696422062444038659e+01 +1.687441926540646975e+01 +1.678945359682218808e+01 +1.670888659321407843e+01 +1.663234113640883649e+01 +1.655949094719609960e+01 +1.649005274104344920e+01 +1.642377955810653134e+01 +1.636045514527344480e+01 +1.629988924714210086e+01 +1.624191366620805255e+01 +1.618637896615041072e+01 +1.613315170896847306e+01 +1.608211213351697921e+01 +1.603315219827085869e+01 +1.598617392443089180e+01 +1.594108798672963978e+01 +1.589781250868644591e+01 +1.585627202683884285e+01 +1.581639659490135585e+01 +1.577812100410708496e+01 +1.574138410037625491e+01 +1.570612818259856347e+01 +1.567229846935055804e+01 +1.563984262390464153e+01 +1.560871032950888448e+01 +1.557885290869274719e+01 +1.555022298183421015e+01 +1.552277416144738176e+01 +1.549646077964626478e+01 +1.547123764703331616e+01 +1.544705984186953529e+01 +1.542388252882258826e+01 +1.540166080687619932e+01 +1.538034958613268621e+01 +1.535990349326725024e+01 +1.534027680531426263e+01 +1.532142341130068885e+01 +1.530329680100922118e+01 +1.528585007987393318e+01 +1.526903600870465461e+01 +1.525280706662261210e+01 +1.523711553528825569e+01 +1.522191360222912415e+01 +1.520715348084584662e+01 +1.519278754449881674e+01 +1.517876847196469114e+01 +1.516504940150466574e+01 +1.515158409080551216e+01 +1.513832708013680417e+01 +1.512523385620665373e+01 +1.511226101438483482e+01 +1.509936641718518224e+01 +1.508650934714582093e+01 +1.507365065250361447e+01 +1.506075288431461878e+01 +1.504778042391391324e+01 +1.503469959982476212e+01 +1.502147879341023184e+01 +1.500808853270339505e+01 +1.499450157395079941e+01 +1.498069297045616111e+01 +1.496664012831703516e+01 +1.495232284860869854e+01 +1.493772335548956676e+01 +1.492282630958536238e+01 +1.490761880585928267e+01 +1.489209035499703582e+01 +1.487623284713292726e+01 +1.486004049652000525e+01 +1.484350976550709866e+01 +1.482663926593173542e+01 +1.480942963577463800e+01 +1.479188338865319885e+01 +1.477400473346458831e+01 +1.475579936123157054e+01 +1.473727419596561816e+01 +1.471843710615372380e+01 +1.469929657330954420e+01 +1.467986131391877258e+01 +1.466013985106357964e+01 +1.464014003204078840e+01 +1.461986848839765507e+01 +1.459933003499846116e+01 +1.457852700499980081e+01 +1.455745851794320345e+01 +1.453611967855765386e+01 +1.451450070428689720e+01 +1.449258598000310805e+01 +1.447035303882968549e+01 +1.444777146846874771e+01 +1.442480174292138351e+01 +1.440139398002338744e+01 +1.437748662583544323e+01 +1.435300506768430928e+01 +1.432786017863256411e+01 +1.430194679746570685e+01 +1.427514215006008591e+01 +1.424730422039482214e+01 +1.421827008268622627e+01 +1.418785421037381766e+01 +1.415584678321906686e+01 +1.412201202085784502e+01 +1.408608658005018377e+01 +1.404777806386028516e+01 +1.400676370429858686e+01 +1.396268929570720019e+01 +1.391516847437139504e+01 +1.386378246028627359e+01 +1.380808039919991614e+01 +1.374758046610419449e+01 +1.368177191387462521e+01 +1.361011827081304837e+01 +1.353206190580631585e+01 +1.344703018635500058e+01 +1.335444344883774015e+01 +1.325372497749434864e+01 +1.314431314381735127e+01 +1.302567578637583878e+01 +1.289732680814384480e+01 +1.275884483115680901e+01 +1.260989357589894055e+01 +1.245024342711943532e+01 +1.227979341493607279e+01 +1.209859259272854004e+01 +1.190685955089852754e+01 +1.170499859225341410e+01 +1.149361093673941880e+01 +1.127349925225590788e+01 +1.104566387494574187e+01 +1.081128932569946954e+01 +1.057172010212179636e+01 +1.032842504043611598e+01 +1.008294912855506453e+01 +9.836848986103371217e+00 +9.591600288791431339e+00 +9.348442256088590696e+00 +9.108063128688211663e+00 +8.869893103391522260e+00 +8.630499691187042188e+00 +8.380241749729442802e+00 +8.097511605680479008e+00 +7.741793818111577075e+00 +7.251629377718955993e+00 +6.559515444075676882e+00 +5.632266015354537636e+00 +4.522650400717346031e+00 +3.390237154550271637e+00 +2.444961109403115618e+00 +1.825603151977006178e+00 +1.523387349726246676e+00 +1.423174943811842841e+00 +1.402775050108562960e+00 +1.400229755911202467e+00 +1.400015729303520251e+00 +1.400001000022265352e+00 +1.400000061589458999e+00 +1.400000003737852161e+00 +1.400000000225260832e+00 +1.400000000013528867e+00 +1.400000000000811040e+00 +1.400000000000048539e+00 +1.400000000000002798e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.862809338968400397e+00 +8.939857687462955838e+00 +9.135134458362461629e+00 +9.513005775314276491e+00 +1.015656709774006750e+01 +1.114564732707730954e+01 +1.251695333149845979e+01 +1.423475897062993845e+01 +1.631966896566216008e+01 +1.758044555812631771e+01 +1.817103432494207738e+01 +1.837924622228514338e+01 +1.839218644486269483e+01 +1.831100111819627330e+01 +1.818756850427209670e+01 +1.804801406359459648e+01 +1.790530059435007715e+01 +1.776567660766479761e+01 +1.763195952452237236e+01 +1.750521840068327251e+01 +1.738564448412661179e+01 +1.727300486449806272e+01 +1.716687923851558395e+01 +1.706678248222768346e+01 +1.697222657566972615e+01 +1.688275020830818107e+01 +1.679793123614530614e+01 +1.671739018651099329e+01 +1.664078925689451438e+01 +1.656782921492560945e+01 +1.649824548820702219e+01 +1.643180411655498219e+01 +1.636829789995790563e+01 +1.630754289018612369e+01 +1.624937527450246222e+01 +1.619364864840892082e+01 +1.614023164950240030e+01 +1.608900591426898430e+01 +1.603986431722202255e+01 +1.599270945335714877e+01 +1.594745232832453041e+01 +1.590401122483930152e+01 +1.586231071805024051e+01 +1.582228081655924434e+01 +1.578385620939714151e+01 +1.574697560247490102e+01 +1.571158113084934982e+01 +1.567761783559756772e+01 +1.564503319621868194e+01 +1.561377671131128864e+01 +1.558379952184006534e+01 +1.555505407263338746e+01 +1.552749380886650421e+01 +1.550107290520009329e+01 +1.547574602597687843e+01 +1.545146811544224441e+01 +1.542819421736085062e+01 +1.540587932366227619e+01 +1.538447825187801854e+01 +1.536394555114376281e+01 +1.534423543645119636e+01 +1.532530175065972955e+01 +1.530709795353965141e+01 +1.528957713683394637e+01 +1.527269206401647494e+01 +1.525639523310918655e+01 +1.524063896061917589e+01 +1.522537548438433852e+01 +1.521055708288854724e+01 +1.519613620843460033e+01 +1.518206563145351495e+01 +1.516829859318568552e+01 +1.515478896399351250e+01 +1.514149140465259968e+01 +1.512836152811319046e+01 +1.511535605941574190e+01 +1.510243299167331976e+01 +1.508955173628601543e+01 +1.507667326581597678e+01 +1.506376024821264892e+01 +1.505077717132455639e+01 +1.503769045685550587e+01 +1.502446856311086520e+01 +1.501108207602661615e+01 +1.499750378807612172e+01 +1.498370876470464452e+01 +1.496967439794969046e+01 +1.495538044686773738e+01 +1.494080906430803779e+01 +1.492594480945541768e+01 +1.491077464541081277e+01 +1.489528792089463316e+01 +1.487947633494795419e+01 +1.486333388327367544e+01 +1.484685678460744285e+01 +1.483004338524013654e+01 +1.481289403953398143e+01 +1.479541096398815725e+01 +1.477759806212386273e+01 +1.475946071718162322e+01 +1.474100554936552321e+01 +1.472224013414204435e+01 +1.470317267791801719e+01 +1.468381164729575517e+01 +1.466416534804503691e+01 +1.464424144995043875e+01 +1.462404645379334944e+01 +1.460358509691148043e+01 +1.458285969404010451e+01 +1.456186941046922989e+01 +1.454060946493664908e+01 +1.451907026010348289e+01 +1.449723643891267599e+01 +1.447508586560184263e+01 +1.445258853062694371e+01 +1.442970537926008312e+01 +1.440638706417455595e+01 +1.438257262296109751e+01 +1.435818808228834165e+01 +1.433314499140738008e+01 +1.430733888900834749e+01 +1.428064770919654514e+01 +1.425293013472597714e+01 +1.422402390879890000e+01 +1.419374412093207205e+01 +1.416188148785450629e+01 +1.412820065741218656e+01 +1.409243857230068642e+01 +1.405430294140882275e+01 +1.401347087988217410e+01 +1.396958779487334823e+01 +1.392226661237207885e+01 +1.387108746133035631e+01 +1.381559795405074276e+01 +1.375531422563281581e+01 +1.368972291881688363e+01 +1.361828432186061910e+01 +1.354043688348015806e+01 +1.345560333698718303e+01 +1.336319866140573964e+01 +1.326264008575302178e+01 +1.315335929861481468e+01 +1.303481695337478818e+01 +1.290651945512569121e+01 +1.276803787487138564e+01 +1.261902865901290660e+01 +1.245925558937319799e+01 +1.228861220734712489e+01 +1.210714365755325694e+01 +1.191506665200274284e+01 +1.171278603251253969e+01 +1.150090624522927563e+01 +1.128023596576378473e+01 +1.105178417340541230e+01 +1.081674621366506095e+01 +1.057647878472758052e+01 +1.033246316632904360e+01 +1.008625567246328636e+01 +9.839421633664297673e+00 +9.593441038568661483e+00 +9.349550119186153196e+00 +9.108420783299399304e+00 +8.869440710246614401e+00 +8.629083652161892104e+00 +8.377524214680239112e+00 +8.092844627452004502e+00 +7.734124211309115537e+00 +7.239618934899329616e+00 +6.542129133507119221e+00 +5.609813135881951851e+00 +4.497661229498989499e+00 +3.367141959945986418e+00 +2.427944565202979632e+00 +1.816045204210166686e+00 +1.519596450198821946e+00 +1.422237343385522435e+00 +1.402638456724078830e+00 +1.400217142637646406e+00 +1.400014833274461079e+00 +1.400000942341291799e+00 +1.400000058024496896e+00 +1.400000003521558067e+00 +1.400000000212252349e+00 +1.400000000012749934e+00 +1.400000000000764411e+00 +1.400000000000045652e+00 +1.400000000000002576e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.810488372779346378e+00 +8.874343996739879614e+00 +9.036897487646506022e+00 +9.353095844327420139e+00 +9.896032244333197170e+00 +1.074077771911548673e+01 +1.192964095767470845e+01 +1.342991755523967612e+01 +1.512522791832751601e+01 +1.646991775661633284e+01 +1.732567370248266769e+01 +1.779005566515020220e+01 +1.799821850406992496e+01 +1.805342139737215490e+01 +1.802198486964044122e+01 +1.794367359522129135e+01 +1.784160725628292354e+01 +1.772900117265668030e+01 +1.761329724672502550e+01 +1.749859836073413533e+01 +1.738708307523241459e+01 +1.727982521204655697e+01 +1.717726932691680020e+01 +1.707950723054061726e+01 +1.698643901875930240e+01 +1.689786669090854687e+01 +1.681354820897478319e+01 +1.673322824842730938e+01 +1.665665519259623650e+01 +1.658359002296026929e+01 +1.651381046844711165e+01 +1.644711242184213518e+01 +1.638330982340279007e+01 +1.632223372694494046e+01 +1.626373097138469248e+01 +1.620766270404470433e+01 +1.615390289523489287e+01 +1.610233691928014110e+01 +1.605286023873411239e+01 +1.600537720592087609e+01 +1.595979998302765779e+01 +1.591604757495259825e+01 +1.587404496566183276e+01 +1.583372234749405294e+01 +1.579501443278195083e+01 +1.575785983779314670e+01 +1.572220052999378481e+01 +1.568798133080147217e+01 +1.565514946719689426e+01 +1.562365416673046070e+01 +1.559344629154696271e+01 +1.556447800803103831e+01 +1.553670248953403110e+01 +1.551007365036989682e+01 +1.548454590986082025e+01 +1.546007398567187607e+01 +1.543661271600089613e+01 +1.541411691039078136e+01 +1.539254122901455091e+01 +1.537184009025986242e+01 +1.535196760632273971e+01 +1.533287754632581290e+01 +1.531452332622199286e+01 +1.529685802444910081e+01 +1.527983442198399544e+01 +1.526340506512540607e+01 +1.524752234903133186e+01 +1.523213861976585015e+01 +1.521720629238539679e+01 +1.520267798242712409e+01 +1.518850664805884243e+01 +1.517464574011526857e+01 +1.516104935727850922e+01 +1.514767240375837609e+01 +1.513447074698341055e+01 +1.512140137301688725e+01 +1.510842253765208554e+01 +1.509549391140497043e+01 +1.508257671689681700e+01 +1.506963385739115147e+01 +1.505663003550627188e+01 +1.504353186135594633e+01 +1.503030794956750071e+01 +1.501692900478177428e+01 +1.500336789534858895e+01 +1.498959971499233745e+01 +1.497560183223450636e+01 +1.496135392732466585e+01 +1.494683801635147447e+01 +1.493203846208347052e+01 +1.491694197092987118e+01 +1.490153757521767375e+01 +1.488581659975686478e+01 +1.486977261141355910e+01 +1.485340135013508522e+01 +1.483670063957500673e+01 +1.481967027515441870e+01 +1.480231188707455381e+01 +1.478462877547248056e+01 +1.476662571459599427e+01 +1.474830872257751047e+01 +1.472968479312289247e+01 +1.471076158521379718e+01 +1.469154706676501121e+01 +1.467204910809359042e+01 +1.465227502105387991e+01 +1.463223103977684580e+01 +1.461192173912430192e+01 +1.459134938722372787e+01 +1.457051322877838828e+01 +1.454940869623736077e+01 +1.452802654634654189e+01 +1.450635192007095498e+01 +1.448436332437068863e+01 +1.446203153482437109e+01 +1.443931841863122401e+01 +1.441617567810503964e+01 +1.439254351543485733e+01 +1.436834922028066508e+01 +1.434350568277132254e+01 +1.431790983577329968e+01 +1.429144103202677485e+01 +1.426395936405419285e+01 +1.423530393782334436e+01 +1.420529111521518573e+01 +1.417371274566513684e+01 +1.414033441420587778e+01 +1.410489374185235434e+01 +1.406709878515317236e+01 +1.402662659507846854e+01 +1.398312201144713640e+01 +1.393619678791495176e+01 +1.388542916404940897e+01 +1.383036402481034877e+01 +1.377051381304222843e+01 +1.370536038605381890e+01 +1.363435803105548239e+01 +1.355693787342464240e+01 +1.347251392294367456e+01 +1.338049100190932350e+01 +1.328027478011546769e+01 +1.317128409936335132e+01 +1.305296569845575938e+01 +1.292481134299076118e+01 +1.278637721815532480e+01 +1.263730525528056603e+01 +1.247734583644128925e+01 +1.230638106255873865e+01 +1.212444749143777756e+01 +1.193175697427770032e+01 +1.172871397504036572e+01 +1.151592758104674452e+01 +1.129421633125395985e+01 +1.106460403751504984e+01 +1.082830500509015970e+01 +1.058669749037244401e+01 +1.034128474548330345e+01 +1.009364282870052776e+01 +9.845351694338610571e+00 +9.597897434083991541e+00 +9.352508270239152210e+00 +9.109822053252500496e+00 +8.869140581771283394e+00 +8.626749295183534727e+00 +8.372453184663591230e+00 +8.083714372479887444e+00 +7.718809486036008138e+00 +7.215453674553173435e+00 +6.507114186439151737e+00 +5.564709102701376864e+00 +4.447695128172583168e+00 +3.321253462331071660e+00 +2.394397665019448507e+00 +1.797383251342937527e+00 +1.512290812110963500e+00 +1.420461446239218661e+00 +1.402383932825899571e+00 +1.400193920609805964e+00 +1.400013191018913306e+00 +1.400000836785857627e+00 +1.400000051503869081e+00 +1.400000003125958292e+00 +1.400000000188456717e+00 +1.400000000011324408e+00 +1.400000000000679146e+00 +1.400000000000040545e+00 +1.400000000000002354e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.748396058071513437e+00 +8.798739248120853063e+00 +8.927568979918069303e+00 +9.179671439354800455e+00 +9.616518948826231039e+00 +1.030582759764815748e+01 +1.129471893122009440e+01 +1.256944147924644462e+01 +1.402079037213907320e+01 +1.535355923329489514e+01 +1.637629461813494913e+01 +1.706145999971559135e+01 +1.747099614574428372e+01 +1.768509228618703943e+01 +1.777081936705336318e+01 +1.777606684323027864e+01 +1.773262726613405604e+01 +1.766084707256347741e+01 +1.757348774174070272e+01 +1.747844824973222089e+01 +1.738055966519571527e+01 +1.728273229363092867e+01 +1.718667884283865277e+01 +1.709336782006032252e+01 +1.700330742878789891e+01 +1.691672342474480573e+01 +1.683367062966955174e+01 +1.675410284682360640e+01 +1.667791661169919948e+01 +1.660497843355305747e+01 +1.653514159401715489e+01 +1.646825633149916612e+01 +1.640417583861919937e+01 +1.634275961743327343e+01 +1.628387517844669574e+01 +1.622739871379238252e+01 +1.617321514752135059e+01 +1.612121781992598102e+01 +1.607130796877374124e+01 +1.602339410966458644e+01 +1.597739137859783654e+01 +1.593322087466372494e+01 +1.589080902468070278e+01 +1.585008698142316064e+01 +1.581099006077104185e+01 +1.577345721931986589e+01 +1.573743057183521188e+01 +1.570285494683772320e+01 +1.566967747817712642e+01 +1.563784723043925950e+01 +1.560731485625522552e+01 +1.557803228393009398e+01 +1.554995243420013473e+01 +1.552302896530867216e+01 +1.549721604592482116e+01 +1.547246815569315004e+01 +1.544873991338138275e+01 +1.542598593268142793e+01 +1.540416070571542662e+01 +1.538321851420807462e+01 +1.536311336811793637e+01 +1.534379897128652459e+01 +1.532522871337948445e+01 +1.530735568707678418e+01 +1.529013272913626054e+01 +1.527351248362558245e+01 +1.525744748530929584e+01 +1.524189026090557952e+01 +1.522679344570546078e+01 +1.521210991288564607e+01 +1.519779291275172461e+01 +1.518379621912462873e+01 +1.517007428012926340e+01 +1.515658237075603409e+01 +1.514327674473656593e+01 +1.513011478349413785e+01 +1.511705514018559882e+01 +1.510405787713160741e+01 +1.509108459522241397e+01 +1.507809855417372802e+01 +1.506506478277901806e+01 +1.505195017854986084e+01 +1.503872359634570088e+01 +1.502535592576123236e+01 +1.501182015715926354e+01 +1.499809143630613129e+01 +1.498414710758520307e+01 +1.496996674573207642e+01 +1.495553217595489670e+01 +1.494082748217728174e+01 +1.492583900297253408e+01 +1.491055531454928307e+01 +1.489496719990310147e+01 +1.487906760296948505e+01 +1.486285156630348503e+01 +1.484631615047504560e+01 +1.482946033301123023e+01 +1.481228488434462420e+01 +1.479479221784987963e+01 +1.477698621067923668e+01 +1.475887199175624964e+01 +1.474045569296983160e+01 +1.472174415934374814e+01 +1.470274461375525199e+01 +1.468346427165352175e+01 +1.466390990119455218e+01 +1.464408732426948490e+01 +1.462400085405921324e+01 +1.460365266499466408e+01 +1.458304209133070550e+01 +1.456216485093951896e+01 +1.454101219138259715e+01 +1.451956995581585907e+01 +1.449781756680982348e+01 +1.447572692672207140e+01 +1.445326123384676720e+01 +1.443037371420129489e+01 +1.440700626952164853e+01 +1.438308804287133924e+01 +1.435853390428709275e+01 +1.433324286017556481e+01 +1.430709639185249848e+01 +1.427995673082574157e+01 +1.425166508134966392e+01 +1.422203980464645667e+01 +1.419087458426908022e+01 +1.415793659868365317e+01 +1.412296473562292043e+01 +1.408566789347198345e+01 +1.404572342824810960e+01 +1.400277582093064943e+01 +1.395643565917364803e+01 +1.390627904979295160e+01 +1.385184760357399902e+01 +1.379264916119454831e+01 +1.372815945716137165e+01 +1.365782494570422223e+01 +1.358106703578564378e+01 +1.349728799804590551e+01 +1.340587880990551639e+01 +1.330622919044932573e+01 +1.319774003744941915e+01 +1.307983840798355679e+01 +1.295199507495903291e+01 +1.281374453865259788e+01 +1.266470717174365213e+01 +1.250461293015909270e+01 +1.233332577841458644e+01 +1.215086766988519074e+01 +1.195744061079868104e+01 +1.175344505966093855e+01 +1.153949271746065897e+01 +1.131641167661386760e+01 +1.108524193663758695e+01 +1.084721950364300547e+01 +1.060374774475320514e+01 +1.035635534876045583e+01 +1.010664035237988578e+01 +9.856197128161859666e+00 +9.606513936917478347e+00 +9.358801118469258995e+00 +9.113641205059689554e+00 +8.870204511096401845e+00 +8.624491852972138162e+00 +8.365751435902595290e+00 +8.070516697203316880e+00 +7.695882266745251776e+00 +7.178829250591800104e+00 +6.453980162637134477e+00 +5.496568853983332836e+00 +4.372803660012377414e+00 +3.253202039556042369e+00 +2.345298873314900945e+00 +1.770510389837349763e+00 +1.502000814851558230e+00 +1.418031606819576407e+00 +1.402044961514654409e+00 +1.400163591081349024e+00 +1.400011061423526160e+00 +1.400000700243245300e+00 +1.400000043075549705e+00 +1.400000002614654848e+00 +1.400000000157693325e+00 +1.400000000009480994e+00 +1.400000000000569012e+00 +1.400000000000034106e+00 +1.400000000000001910e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.680972346235936499e+00 +8.719127068040696926e+00 +8.817277648932682510e+00 +9.010477225065107731e+00 +9.348310273922894709e+00 +9.889253555634685000e+00 +1.068243959164733248e+01 +1.173584122657602613e+01 +1.298162632449427889e+01 +1.424455344579325278e+01 +1.534981900702199553e+01 +1.620539826579470954e+01 +1.680498399037231394e+01 +1.718980444725651324e+01 +1.741354482964764827e+01 +1.752426506027292774e+01 +1.755898385650147020e+01 +1.754415030146473597e+01 +1.749790730942342520e+01 +1.743241416126020482e+01 +1.735570447713146791e+01 +1.727303238451318279e+01 +1.718780243857849044e+01 +1.710219651961023501e+01 +1.701759124542081381e+01 +1.693483428646394273e+01 +1.685442687743733003e+01 +1.677664433344446948e+01 +1.670161566699505329e+01 +1.662937620932677518e+01 +1.655990238156679339e+01 +1.649313463566093674e+01 +1.642899253633666845e+01 +1.636738461178429560e+01 +1.630821471754974539e+01 +1.625138607565453341e+01 +1.619680376533176158e+01 +1.614437618543200159e+01 +1.609401583748276110e+01 +1.604563966379383544e+01 +1.599916909799399356e+01 +1.595452993350358284e+01 +1.591165208044038160e+01 +1.587046925782804507e+01 +1.583091865205221893e+01 +1.579294056181737815e+01 +1.575647804272687758e+01 +1.572147655990458226e+01 +1.568788365402249241e+01 +1.565564862416217728e+01 +1.562472222974897562e+01 +1.559505641310052404e+01 +1.556660404374517626e+01 +1.553931868546547257e+01 +1.551315438691835347e+01 +1.548806549661621546e+01 +1.546400650297958457e+01 +1.544093190006668159e+01 +1.541879607943237573e+01 +1.539755324836318273e+01 +1.537715737447697606e+01 +1.535756215637299427e+01 +1.533872101968039381e+01 +1.532058713749633405e+01 +1.530311347384286869e+01 +1.528625284842276777e+01 +1.526995802063355612e+01 +1.525418179052132928e+01 +1.523887711413402180e+01 +1.522399723057681875e+01 +1.520949579798700668e+01 +1.519532703563385390e+01 +1.518144586941016705e+01 +1.516780807811111842e+01 +1.515437043808513451e+01 +1.514109086408064009e+01 +1.512792854438886359e+01 +1.511484406868336272e+01 +1.510179954726751106e+01 +1.508875872074801627e+01 +1.507568705944321685e+01 +1.506255185209799841e+01 +1.504932228370331693e+01 +1.503596950240031127e+01 +1.502246667558160631e+01 +1.500878903538253972e+01 +1.499491391378133009e+01 +1.498082076749975400e+01 +1.496649119281561013e+01 +1.495190893026709489e+01 +1.493705985904889388e+01 +1.492193198067260873e+01 +1.490651539119230939e+01 +1.489080224098194982e+01 +1.487478668069852716e+01 +1.485846479167732070e+01 +1.484183449858966952e+01 +1.482489546175764694e+01 +1.480764894607456839e+01 +1.479009766303894757e+01 +1.477224558198801141e+01 +1.475409770623219252e+01 +1.473565980946232656e+01 +1.471693812754301156e+01 +1.469793900063394254e+01 +1.467866846050673679e+01 +1.465913175795462031e+01 +1.463933282532759783e+01 +1.461927366946239104e+01 +1.459895369060633641e+01 +1.457836892334579026e+01 +1.455751119602931887e+01 +1.453636720571131669e+01 +1.451491750622262877e+01 +1.449313540759596819e+01 +1.447098578573636019e+01 +1.444842380194078579e+01 +1.442539353265663493e+01 +1.440182651076002784e+01 +1.437764018068279626e+01 +1.435273627099386928e+01 +1.432699908964673163e+01 +1.430029374917471685e+01 +1.427246433182735430e+01 +1.424333200822119849e+01 +1.421269312780918881e+01 +1.418031730569104099e+01 +1.414594553838105107e+01 +1.410928839154109760e+01 +1.407002431580475132e+01 +1.402779816305967131e+01 +1.398221999522070647e+01 +1.393286430073747084e+01 +1.387926976068828466e+01 +1.382093973575934776e+01 +1.375734367656340851e+01 +1.368791969077378035e+01 +1.361207852868963819e+01 +1.352920927021285280e+01 +1.343868700570835273e+01 +1.333988279456474046e+01 +1.323217615088412735e+01 +1.311497023710903953e+01 +1.298770983539780310e+01 +1.284990200611560951e+01 +1.270113912751524587e+01 +1.254112374050914980e+01 +1.236969430690032645e+01 +1.218685064489941539e+01 +1.199277745320669553e+01 +1.178786401346000012e+01 +1.157271793200092525e+01 +1.134817069107997156e+01 +1.111527282607530864e+01 +1.087527672562275427e+01 +1.062960548284084439e+01 +1.037980706383872409e+01 +1.012749356928937772e+01 +9.874263119873218031e+00 +9.621591891144563036e+00 +9.370653120918129630e+00 +9.121945383986789224e+00 +8.874456965836767353e+00 +8.623804560449261913e+00 +8.358490749693421762e+00 +8.053817228128401950e+00 +7.665351434509830142e+00 +7.129251737301464331e+00 +6.381979622944474961e+00 +5.404846620527878898e+00 +4.273133464756616817e+00 +3.163998120017447846e+00 +2.282127603830747198e+00 +1.736727105503938606e+00 +1.489467564172863190e+00 +1.415190599002489558e+00 +1.401663125592445436e+00 +1.400130305721345447e+00 +1.400008746052672004e+00 +1.400000552266966958e+00 +1.400000033950533851e+00 +1.400000002061114523e+00 +1.400000000124376198e+00 +1.400000000007483258e+00 +1.400000000000449552e+00 +1.400000000000026779e+00 +1.400000000000001465e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.611679833494175540e+00 +8.639687556720655692e+00 +8.712079460789242447e+00 +8.855331157842702083e+00 +9.107916520118395809e+00 +9.518072982990782194e+00 +1.013294304624533559e+01 +1.097645444200452225e+01 +1.202089480309728486e+01 +1.316570474340801766e+01 +1.427515177567549642e+01 +1.523717765526085977e+01 +1.599628582760752771e+01 +1.654972646617424914e+01 +1.692557884067651131e+01 +1.716215521091107377e+01 +1.729593331818226432e+01 +1.735681101648980729e+01 +1.736744490082395131e+01 +1.734425555497948324e+01 +1.729883362218380682e+01 +1.723922864854639414e+01 +1.717097184687051836e+01 +1.709783415857776490e+01 +1.702236813994605313e+01 +1.694628766356865057e+01 +1.687073108865198634e+01 +1.679644264066595483e+01 +1.672389710933289209e+01 +1.665338552042629416e+01 +1.658507401148667526e+01 +1.651904431752010538e+01 +1.645532162427425504e+01 +1.639389372945786505e+01 +1.633472421090349869e+01 +1.627776145384684625e+01 +1.622294481148356127e+01 +1.617020877772473497e+01 +1.611948578011972799e+01 +1.607070801461558318e+01 +1.602380861532692435e+01 +1.597872236359090259e+01 +1.593538607890225300e+01 +1.589373879142484292e+01 +1.585372176588503024e+01 +1.581527842580156928e+01 +1.577835421246044589e+01 +1.574289640290370684e+01 +1.570885390414808924e+01 +1.567617703595668388e+01 +1.564481731110430829e+01 +1.561472721974368127e+01 +1.558586002286776662e+01 +1.555816955873993379e+01 +1.553161006536117128e+01 +1.550613602144394676e+01 +1.548170200788150552e+01 +1.545826259128251401e+01 +1.543577223074565374e+01 +1.541418520865467556e+01 +1.539345558587007012e+01 +1.537353718127666014e+01 +1.535438357522112796e+01 +1.533594813594900685e+01 +1.531818406773871999e+01 +1.530104447904468579e+01 +1.528448246861613313e+01 +1.526845122726578374e+01 +1.525290415273424394e+01 +1.523779497493973345e+01 +1.522307788882391222e+01 +1.520870769200438666e+01 +1.519463992452092782e+01 +1.518083100810985364e+01 +1.516723838265094493e+01 +1.515382063769248155e+01 +1.514053763725954838e+01 +1.512735063647469502e+01 +1.511422238885384495e+01 +1.510111724347009599e+01 +1.508800123149060468e+01 +1.507484214187560134e+01 +1.506160958627421032e+01 +1.504827505335121707e+01 +1.503481195292708250e+01 +1.502119565040634264e+01 +1.500740349200527746e+01 +1.499341482126747316e+01 +1.497921098727584166e+01 +1.496477534483238259e+01 +1.495009324668334472e+01 +1.493515202761867045e+01 +1.491994097997198843e+01 +1.490445131969297066e+01 +1.488867614176082377e+01 +1.487261036326070673e+01 +1.485625065196105687e+01 +1.483959533771916561e+01 +1.482264430351745865e+01 +1.480539885240989051e+01 +1.478786154615460724e+01 +1.477003601084561701e+01 +1.475192670445257725e+01 +1.473353864085299492e+01 +1.471487706471167733e+01 +1.469594707144047874e+01 +1.467675316646501926e+01 +1.465729875813652860e+01 +1.463758557885337908e+01 +1.461761302929143902e+01 +1.459737744107467350e+01 +1.457687125373594306e+01 +1.455608210241085487e+01 +1.453499181336468027e+01 +1.451357530516642136e+01 +1.449179939409174978e+01 +1.446962150315991558e+01 +1.444698827509795969e+01 +1.442383409049778820e+01 +1.440007949352159855e+01 +1.437562952877199152e+01 +1.435037199445754474e+01 +1.432417561887247004e+01 +1.429688816963925113e+01 +1.426833450836306483e+01 +1.423831460761064172e+01 +1.420660155281712811e+01 +1.417293955927202198e+01 +1.413704204422176858e+01 +1.409858980686042784e+01 +1.405722938505380526e+01 +1.401257167747966470e+01 +1.396419094373251824e+01 +1.391162432283572414e+01 +1.385437204214737150e+01 +1.379189852289010965e+01 +1.372363462374147325e+01 +1.364898129741815858e+01 +1.356731496307118867e+01 +1.347799491410141925e+01 +1.338037307976618884e+01 +1.327380643131814608e+01 +1.315767225931108086e+01 +1.303138643753355197e+01 +1.289442462205311202e+01 +1.274634610425604997e+01 +1.258681974110785262e+01 +1.241565103246106005e+01 +1.223280902700942363e+01 +1.203845134132882322e+01 +1.183294520444650466e+01 +1.161688216333684132e+01 +1.139108398530107635e+01 +1.115659737571337828e+01 +1.091467530268263531e+01 +1.066674306394187965e+01 +1.041434812401232435e+01 +1.015909373849891040e+01 +9.902554845015169249e+00 +9.646164217720281542e+00 +9.391022137259193769e+00 +9.137500323241155797e+00 +8.884344302837996921e+00 +8.626681394841737571e+00 +8.352079454836129457e+00 +8.034319654676062683e+00 +7.627156606826296148e+00 +7.065997515617947755e+00 +6.290101813962754917e+00 +5.288882823870326710e+00 +4.149013380831003239e+00 +3.055104790913674151e+00 +2.206868644733569695e+00 +1.697688591749999309e+00 +1.475579000261894480e+00 +1.412204405764989623e+00 +1.401280188523836179e+00 +1.400097954370709497e+00 +1.400006520244940544e+00 +1.400000410552970864e+00 +1.400000025221584066e+00 +1.400000001531601423e+00 +1.400000000092488817e+00 +1.400000000005569678e+00 +1.400000000000334754e+00 +1.400000000000020117e+00 +1.400000000000001021e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.543226507710881990e+00 +8.563253910926418300e+00 +8.615231889566704382e+00 +8.718547442516165091e+00 +8.902016411379033656e+00 +9.203676026147226352e+00 +9.665265604149835710e+00 +1.031853020300832213e+01 +1.116451419174473791e+01 +1.215480092642178889e+01 +1.319851760069941449e+01 +1.419366104045162302e+01 +1.506098429237006364e+01 +1.576069737745148913e+01 +1.628914127019256242e+01 +1.666528445627938027e+01 +1.691730167865667056e+01 +1.707377501131006881e+01 +1.715949456178481114e+01 +1.719423874531720031e+01 +1.719303441411424771e+01 +1.716696224431472828e+01 +1.712404136835472457e+01 +1.707000561896262880e+01 +1.700892136264420884e+01 +1.694365470628491011e+01 +1.687621469385198125e+01 +1.680800118861213122e+01 +1.673998217942141409e+01 +1.667281993138352902e+01 +1.660696050900499543e+01 +1.654269725103260669e+01 +1.648021578208274818e+01 +1.641962595205504982e+01 +1.636098451742526549e+01 +1.630431125778482127e+01 +1.624960042931931881e+01 +1.619682889929188363e+01 +1.614596191313335538e+01 +1.609695716935547338e+01 +1.604976768257437314e+01 +1.600434377717211731e+01 +1.596063445654112201e+01 +1.591858832356522946e+01 +1.587815417867410517e+01 +1.583928138663105045e+01 +1.580192007807685073e+01 +1.576602123386142473e+01 +1.573153668730226507e+01 +1.569841907025885597e+01 +1.566662172226620875e+01 +1.563609857718357432e+01 +1.560680403835031349e+01 +1.557869285071285859e+01 +1.555171997651454241e+01 +1.552584047972168513e+01 +1.550100942324916353e+01 +1.547718178214315188e+01 +1.545431237510610067e+01 +1.543235581606089646e+01 +1.541126648681720468e+01 +1.539099853130710827e+01 +1.537150587129227297e+01 +1.535274224291257461e+01 +1.533466125295201721e+01 +1.531721645325093739e+01 +1.530036143130412718e+01 +1.528404991476264385e+01 +1.526823588731120296e+01 +1.525287371322964702e+01 +1.523791826786903059e+01 +1.522332507128071022e+01 +1.520905042232664606e+01 +1.519505153076426573e+01 +1.518128664503013958e+01 +1.516771517373105738e+01 +1.515429779917521991e+01 +1.514099658162546547e+01 +1.512777505331549222e+01 +1.511459830162475626e+01 +1.510143304114419927e+01 +1.508824767467183214e+01 +1.507501234344401553e+01 +1.506169896712734690e+01 +1.504828127426123174e+01 +1.503473482394827521e+01 +1.502103701963586246e+01 +1.500716711581596741e+01 +1.499310621839038760e+01 +1.497883727930476816e+01 +1.496434508584648349e+01 +1.494961624472892581e+01 +1.493463916074814790e+01 +1.491940400939898836e+01 +1.490390270237943326e+01 +1.488812884439957074e+01 +1.487207767915316303e+01 +1.485574602171714531e+01 +1.483913217403221019e+01 +1.482223581950466951e+01 +1.480505789217658297e+01 +1.478760041536048320e+01 +1.476986630414966939e+01 +1.475185912581576630e+01 +1.473358281181114471e+01 +1.471504131491845335e+01 +1.469623820504254574e+01 +1.467717619722556854e+01 +1.465785660568301907e+01 +1.463827871800247493e+01 +1.461843908410959259e+01 +1.459833071517841852e+01 +1.457794218833458899e+01 +1.455725665376032474e+01 +1.453625074164896702e+01 +1.451489336736483793e+01 +1.449314443413299536e+01 +1.447095343360768638e+01 +1.444825794574856026e+01 +1.442498204058160383e+01 +1.440103458566845696e+01 +1.437630746451380936e+01 +1.435067371280823956e+01 +1.432398558149162149e+01 +1.429607253835622949e+01 +1.426673922359319135e+01 +1.423576337971005223e+01 +1.420289378307903760e+01 +1.416784821355269308e+01 +1.413031151068911839e+01 +1.408993378074899994e+01 +1.404632883829397016e+01 +1.399907299034364527e+01 +1.394770429980815685e+01 +1.389172249809900883e+01 +1.383058975372042987e+01 +1.376373254274504632e+01 +1.369054490579082639e+01 +1.361039341063347941e+01 +1.352262416437230286e+01 +1.342657222641279624e+01 +1.332157375408868205e+01 +1.320698115543025608e+01 +1.308218141505675902e+01 +1.294661758717048450e+01 +1.279981320650343868e+01 +1.264139904848793705e+01 +1.247114127637102321e+01 +1.228896957196259088e+01 +1.209500340025729059e+01 +1.188957413947300878e+01 +1.167324047244514595e+01 +1.144679430476016435e+01 +1.121125462036021148e+01 +1.096784692728596688e+01 +1.071796617327534307e+01 +1.046312173710256843e+01 +1.020486447369556515e+01 +9.944695501722490505e+00 +9.683946261798004329e+00 +9.423580170517663390e+00 +9.163773066270158196e+00 +8.902946912107735145e+00 +8.635623540051458491e+00 +8.348249595067988693e+00 +8.012827244955190054e+00 +7.581112471917083262e+00 +6.988068815856028237e+00 +6.177078123822140832e+00 +5.147981091779883833e+00 +4.001075720435033567e+00 +2.928523924042612858e+00 +2.122002590720071247e+00 +1.655326446509131522e+00 +1.461288174944466611e+00 +1.409324083555044904e+00 +1.400930917493733663e+00 +1.400069457823714503e+00 +1.400004583021784210e+00 +1.400000287722522385e+00 +1.400000017664742025e+00 +1.400000001073150591e+00 +1.400000000064862249e+00 +1.400000000003910339e+00 +1.400000000000235501e+00 +1.400000000000014122e+00 +1.400000000000000799e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.477612144961245377e+00 +8.491626234006325546e+00 +8.528121566139946097e+00 +8.600921443799524724e+00 +8.730941409222896965e+00 +8.946951953003765112e+00 +9.283397013942879639e+00 +9.772917568455721238e+00 +1.043287982072112996e+01 +1.124993373308850586e+01 +1.217429401158680236e+01 +1.313048629806755407e+01 +1.403970608498053529e+01 +1.484122480294793078e+01 +1.550274418698998424e+01 +1.601851896603422531e+01 +1.640073426897117415e+01 +1.667021388554524108e+01 +1.684965943967376134e+01 +1.695990016416765656e+01 +1.701837910630197115e+01 +1.703893262721794244e+01 +1.703217074347616489e+01 +1.700605489462865094e+01 +1.696647534886396613e+01 +1.691774934745721382e+01 +1.686302074303490883e+01 +1.680456777399904311e+01 +1.674403439836564544e+01 +1.668260162838919669e+01 +1.662111331052860663e+01 +1.656016799565646735e+01 +1.650018586579582802e+01 +1.644145743972062945e+01 +1.638417901766314344e+01 +1.632847849052636136e+01 +1.627443414903898145e+01 +1.622208840341307479e+01 +1.617145779727662358e+01 +1.612254031841787238e+01 +1.607532073351651647e+01 +1.602977447523528198e+01 +1.598587046643885756e+01 +1.594357316244580680e+01 +1.590284401698222183e+01 +1.586364252290376342e+01 +1.582592693904973302e+01 +1.578965478566547276e+01 +1.575478316971077497e+01 +1.572126898592010491e+01 +1.568906902814604543e+01 +1.565814003717540892e+01 +1.562843870503908228e+01 +1.559992165124389274e+01 +1.557254538290047208e+01 +1.554626624808510194e+01 +1.552104038972271205e+01 +1.549682370564292988e+01 +1.547357181912003909e+01 +1.545124006307538345e+01 +1.542978348013901702e+01 +1.540915683989856078e+01 +1.538931467388486141e+01 +1.537021132814513003e+01 +1.535180103263142470e+01 +1.533403798608753199e+01 +1.531687645465501468e+01 +1.530027088204528418e+01 +1.528417600884374572e+01 +1.526854699832789031e+01 +1.525333956609444996e+01 +1.523851011079901774e+01 +1.522401584340969016e+01 +1.520981491255576934e+01 +1.519586652380215774e+01 +1.518213105098651461e+01 +1.516857013810455612e+01 +1.515514679060343894e+01 +1.514182545532804269e+01 +1.512857208874522463e+01 +1.511535421343270080e+01 +1.510214096314966525e+01 +1.508890311709557075e+01 +1.507561312420281041e+01 +1.506224511849223724e+01 +1.504877492664233429e+01 +1.503518006898020509e+01 +1.502143975509232554e+01 +1.500753487517347295e+01 +1.499344798808133739e+01 +1.497916330684063801e+01 +1.496466668204277184e+01 +1.494994558321482891e+01 +1.493498907778601215e+01 +1.491978780676307714e+01 +1.490433395564529029e+01 +1.488862121847278353e+01 +1.487264475222349169e+01 +1.485640111807022734e+01 +1.483988820530191255e+01 +1.482310513302529564e+01 +1.480605212412062244e+01 +1.478873034535242326e+01 +1.477114170705798024e+01 +1.475328861547204085e+01 +1.473517367051329430e+01 +1.471679930176726536e+01 +1.469816733545876453e+01 +1.467927848541650881e+01 +1.466013176139200702e+01 +1.464072378859960288e+01 +1.462104803298846534e+01 +1.460109392753148505e+01 +1.458084589570978373e+01 +1.456028226937074166e+01 +1.453937409922462720e+01 +1.451808385739856178e+01 +1.449636403266355877e+01 +1.447415562016842649e+01 +1.445138650874057618e+01 +1.442796977005257908e+01 +1.440380185524176326e+01 +1.437876070599100231e+01 +1.435270378877888575e+01 +1.432546606321080951e+01 +1.429685789836305787e+01 +1.426666295531843076e+01 +1.423463606004671078e+01 +1.420050109906860847e+01 +1.416394898157611593e+01 +1.412463572652962185e+01 +1.408218075234064237e+01 +1.403616547060320485e+01 +1.398613231430385895e+01 +1.393158436501815700e+01 +1.387198578227458334e+01 +1.380676328035289124e+01 +1.373530894097004129e+01 +1.365698469078781940e+01 +1.357112880508236330e+01 +1.347706481536158485e+01 +1.337411318837156315e+01 +1.326160609450042038e+01 +1.313890548053046281e+01 +1.300542448781448002e+01 +1.286065200050878410e+01 +1.270417976617387268e+01 +1.253573110104094290e+01 +1.235518969194610683e+01 +1.216262649710153276e+01 +1.195832228928313334e+01 +1.174278300347302739e+01 +1.151674485623541244e+01 +1.128116639241334873e+01 +1.103720504299050553e+01 +1.078617599949870431e+01 +1.052949149783482241e+01 +1.026857990339660631e+01 +1.000478540731155164e+01 +9.739240943771298120e+00 +9.472664222116813804e+00 +9.204920505962112642e+00 +8.933989267391817535e+00 +8.653649352582350573e+00 +8.349046235936544491e+00 +7.990201533466878558e+00 +7.526849100694694705e+00 +6.894155011640184405e+00 +6.041412895374659975e+00 +4.981527511291344190e+00 +3.830412998045404471e+00 +2.786883035829100574e+00 +2.030470262942994708e+00 +1.611741018598656705e+00 +1.447518623747329647e+00 +1.406751676540485052e+00 +1.400638299778165230e+00 +1.400046434397281159e+00 +1.400003037081019919e+00 +1.400000190118086074e+00 +1.400000011666719058e+00 +1.400000000709189951e+00 +1.400000000042911363e+00 +1.400000000002590284e+00 +1.400000000000156009e+00 +1.400000000000009237e+00 +1.400000000000000577e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.416198786927258979e+00 +8.425830272662143017e+00 +8.450981266948545567e+00 +8.501287973229452177e+00 +8.591525666849777920e+00 +8.742672752394250679e+00 +8.981523181475614237e+00 +9.337222327890094320e+00 +9.833501937856292230e+00 +1.047764772370396358e+01 +1.125143583612844012e+01 +1.211018865827288593e+01 +1.299220366538711247e+01 +1.383460991359469539e+01 +1.458801632666527226e+01 +1.522399870730906812e+01 +1.573452983198750132e+01 +1.612645712156049882e+01 +1.641487371518262606e+01 +1.661777718446681362e+01 +1.675271063657952197e+01 +1.683509741770425094e+01 +1.687769276757033765e+01 +1.689064553695143900e+01 +1.688182998570455595e+01 +1.685725458743795357e+01 +1.682145332094531653e+01 +1.677782179300525556e+01 +1.672888970236999029e+01 +1.667653426456490351e+01 +1.662214389104920542e+01 +1.656674206451802078e+01 +1.651108032198806086e+01 +1.645570770777313641e+01 +1.640102251172847048e+01 +1.634731076540290928e+01 +1.629477487983637474e+01 +1.624355495890562295e+01 +1.619374467402256457e+01 +1.614540309878111657e+01 +1.609856353914580041e+01 +1.605324012576933157e+01 +1.600943273628120522e+01 +1.596713066876026765e+01 +1.592631537945737641e+01 +1.588696251803152393e+01 +1.584904343461583309e+01 +1.581252628942623062e+01 +1.577737686331589728e+01 +1.574355914368749687e+01 +1.571103574231650768e+01 +1.567976818830277885e+01 +1.564971712936750059e+01 +1.562084246717264691e+01 +1.559310344661138181e+01 +1.556645871462195707e+01 +1.554086636065965976e+01 +1.551628394826064472e+01 +1.549266854495747481e+01 +1.546997675602028899e+01 +1.544816476600214017e+01 +1.542718839079371129e+01 +1.540700314179590258e+01 +1.538756430286995425e+01 +1.536882701990670519e+01 +1.535074640216084063e+01 +1.533327763391872622e+01 +1.531637609460896599e+01 +1.529999748512274138e+01 +1.528409795788549097e+01 +1.526863424810955117e+01 +1.525356380365407105e+01 +1.523884491101540029e+01 +1.522443681515788505e+01 +1.521029983115827022e+01 +1.519639544596156178e+01 +1.518268640891602494e+01 +1.516913681015308235e+01 +1.515571214628726260e+01 +1.514237937331637518e+01 +1.512910694698795488e+01 +1.511586485125198998e+01 +1.510262461573117321e+01 +1.508935932339954000e+01 +1.507604360986117342e+01 +1.506265365575745285e+01 +1.504916717389934355e+01 +1.503556339271707820e+01 +1.502182303753993686e+01 +1.500792831106046776e+01 +1.499386287409786611e+01 +1.497961182745169673e+01 +1.496516169522850426e+01 +1.495050040953053028e+01 +1.493561729582054376e+01 +1.492050305762631801e+01 +1.490514975853279722e+01 +1.488955079864474840e+01 +1.487370088190697004e+01 +1.485759596986629383e+01 +1.484123321667630968e+01 +1.482461087940924216e+01 +1.480772819707810406e+01 +1.479058523121164370e+01 +1.477318266038813022e+01 +1.475552152084016022e+01 +1.473760288510639960e+01 +1.471942747073724256e+01 +1.470099517126646838e+01 +1.468230450204302961e+01 +1.466335195407659064e+01 +1.464413124978460878e+01 +1.462463249543129251e+01 +1.460484122610770008e+01 +1.458473734029885804e+01 +1.456429392238995213e+01 +1.454347595284248840e+01 +1.452223890717817589e+01 +1.450052724629588141e+01 +1.447827280197402899e+01 +1.445539306265472490e+01 +1.443178936577822746e+01 +1.440734500410217578e+01 +1.438192325473451305e+01 +1.435536534125523289e+01 +1.432748834162180174e+01 +1.429808305797110535e+01 +1.426691186947100221e+01 +1.423370659664872129e+01 +1.419816641580393224e+01 +1.415995587590304083e+01 +1.411870308844281929e+01 +1.407399818377688838e+01 +1.402539215577256115e+01 +1.397239625062087853e+01 +1.391448209489071175e+01 +1.385108280153617066e+01 +1.378159533868273101e+01 +1.370538449113404056e+01 +1.362178878309762098e+01 +1.353012875504643375e+01 +1.342971798660253668e+01 +1.331987721584286533e+01 +1.319995180793915246e+01 +1.306933265393911014e+01 +1.292748031313774426e+01 +1.277395184408438666e+01 +1.260842930619568492e+01 +1.243074836028546670e+01 +1.224092480301451857e+01 +1.203917635427049149e+01 +1.182593662416335611e+01 +1.160185793032789725e+01 +1.136779976968214001e+01 +1.112480040590426711e+01 +1.087402957227691047e+01 +1.061672007923476713e+01 +1.035407644443750641e+01 +1.008716156370227068e+01 +9.816758584360036011e+00 +9.543162744562135202e+00 +9.265738041290587645e+00 +8.981832765237216520e+00 +8.684302366209557533e+00 +8.356820299167180721e+00 +7.967324063893757469e+00 +7.463758759641790697e+00 +6.782615776093944504e+00 +5.881458736759986650e+00 +4.789166271717824941e+00 +3.638767707704230858e+00 +2.633503645353847844e+00 +1.935597519165415337e+00 +1.569064079104713905e+00 +1.435065407611320287e+00 +1.404617105816066802e+00 +1.400412030926410756e+00 +1.400029254816020474e+00 +1.400001897412342711e+00 +1.400000118461070864e+00 +1.400000007267588442e+00 +1.400000000442144676e+00 +1.400000000026788705e+00 +1.400000000001619727e+00 +1.400000000000097611e+00 +1.400000000000005684e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.359811851931940652e+00 +8.366332826915392928e+00 +8.383398001516669140e+00 +8.417598891398066385e+00 +8.479137312509955393e+00 +8.582842123643775523e+00 +8.748573106256984033e+00 +9.000023615490508888e+00 +9.360842745904403017e+00 +9.847817854409715466e+00 +1.046293347810361318e+01 +1.118791693766217143e+01 +1.198473748714193476e+01 +1.280293589223184370e+01 +1.359103488289173001e+01 +1.430718603592579363e+01 +1.492516304944313887e+01 +1.543479905572516664e+01 +1.583857532100760324e+01 +1.614686810471038925e+01 +1.637369065061151829e+01 +1.653369859371701267e+01 +1.664046427483476620e+01 +1.670569981633141055e+01 +1.673907084167755954e+01 +1.674832300003227914e+01 +1.673954194521828498e+01 +1.671744544749132544e+01 +1.668565758981433689e+01 +1.664694489817592071e+01 +1.660341000345788132e+01 +1.655664579259232738e+01 +1.650785579671241621e+01 +1.645794706519404826e+01 +1.640760125436786510e+01 +1.635732877768935722e+01 +1.630750993807653870e+01 +1.625842612884025584e+01 +1.621028349147470138e+01 +1.616323085814675764e+01 +1.611737336813546406e+01 +1.607278280972736084e+01 +1.602950548166968403e+01 +1.598756817340533054e+01 +1.594698271637500220e+01 +1.590774944813600378e+01 +1.586985984798336702e+01 +1.583329854034739803e+01 +1.579804481532009852e+01 +1.576407378034408246e+01 +1.573135723046515366e+01 +1.569986430441732495e+01 +1.566956197854078603e+01 +1.564041543890322572e+01 +1.561238836308564970e+01 +1.558544313621833766e+01 +1.555954102049702215e+01 +1.553464229319042822e+01 +1.551070636478320530e+01 +1.548769188617272263e+01 +1.546555685160083904e+01 +1.544425870214169194e+01 +1.542375443300597482e+01 +1.540400070660661136e+01 +1.538495397222401451e+01 +1.536657059218740606e+01 +1.534880697373631442e+01 +1.533161970513321926e+01 +1.531496569415646469e+01 +1.529880230680495323e+01 +1.528308750388486814e+01 +1.526777997311424251e+01 +1.525283925446182565e+01 +1.523822585661885398e+01 +1.522390136276984052e+01 +1.520982852416429765e+01 +1.519597134037700492e+01 +1.518229512556153615e+01 +1.516876656043223548e+01 +1.515535373013670828e+01 +1.514202614858874441e+01 +1.512875477020704373e+01 +1.511551199033652182e+01 +1.510227163590734278e+01 +1.508900894810401105e+01 +1.507570055896711025e+01 +1.506232446392811042e+01 +1.504885999227846760e+01 +1.503528777749369105e+01 +1.502158972916675594e+01 +1.500774900804919199e+01 +1.499375000534892699e+01 +1.497957832698925884e+01 +1.496522078299328129e+01 +1.495066538152539337e+01 +1.493590132640355606e+01 +1.492091901610392490e+01 +1.490571004143041911e+01 +1.489026717813670508e+01 +1.487458436989298782e+01 +1.485865669611319895e+01 +1.484248031833008064e+01 +1.482605239805604391e+01 +1.480937097842524963e+01 +1.479243482140235422e+01 +1.477524319198790792e+01 +1.475779558066772879e+01 +1.474009135535843384e+01 +1.472212933430541248e+01 +1.470390727180214974e+01 +1.468542124922686121e+01 +1.466666496473614245e+01 +1.464762891601139749e+01 +1.462829947170932421e+01 +1.460865782869677609e+01 +1.458867885371337714e+01 +1.456832980974641956e+01 +1.454756896905390384e+01 +1.452634411635828648e+01 +1.450459094718537756e+01 +1.448223136759033203e+01 +1.445917170258476148e+01 +1.443530082150508420e+01 +1.441048818947072085e+01 +1.438458185519601074e+01 +1.435740638707026307e+01 +1.432876077204293530e+01 +1.429841629597896357e+01 +1.426611443039943872e+01 +1.423156475957318357e+01 +1.419444299447836144e+01 +1.415438913690798195e+01 +1.411100587860808098e+01 +1.406385734733940929e+01 +1.401246834446495626e+01 +1.395632425709491464e+01 +1.389487187129282120e+01 +1.382752135972966911e+01 +1.375364976460072519e+01 +1.367260633925506852e+01 +1.358372014164557129e+01 +1.348631027871929433e+01 +1.337969916704248874e+01 +1.326322908103987608e+01 +1.313628208823451615e+01 +1.299830319785722743e+01 +1.284882615355280144e+01 +1.268750079493976912e+01 +1.251412031630218458e+01 +1.232864607693385217e+01 +1.213122698987596237e+01 +1.192221010386246327e+01 +1.170213876057974822e+01 +1.147173469577609062e+01 +1.123186112152166416e+01 +1.098346501552639509e+01 +1.072749668603321815e+01 +1.046480314044834081e+01 +1.019599441419741304e+01 +9.921284372087511017e+00 +9.640273716584694341e+00 +9.351515209065018652e+00 +9.051414922689113851e+00 +8.731639086609160216e+00 +8.374221949802604925e+00 +7.945069534896304297e+00 +7.390967100106124121e+00 +6.651511575088950856e+00 +5.695562668435179887e+00 +4.571046080385022137e+00 +3.428745831595402471e+00 +2.472426290887767664e+00 +1.840966405570983566e+00 +1.529297149866980954e+00 +1.424505484838538782e+00 +1.402970740340453215e+00 +1.400250147070750906e+00 +1.400017366717747125e+00 +1.400001117677728057e+00 +1.400000069620537468e+00 +1.400000004271378939e+00 +1.400000000260146482e+00 +1.400000000015786839e+00 +1.400000000000956035e+00 +1.400000000000057865e+00 +1.400000000000003464e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.308851773076288083e+00 +8.313211858266008392e+00 +8.324641129604847478e+00 +8.347578283459565540e+00 +8.388935569707085094e+00 +8.458930235781284779e+00 +8.571722507448304995e+00 +8.745318866339150787e+00 +9.000001019476140840e+00 +9.354705268188542533e+00 +9.821616664345684811e+00 +1.040048793260508653e+01 +1.107509065338827625e+01 +1.181392525053448850e+01 +1.257563635708833871e+01 +1.331733054837860841e+01 +1.400263278092533881e+01 +1.460676208595621262e+01 +1.511769483572477135e+01 +1.553426196359217037e+01 +1.586280831533043667e+01 +1.611382370963142563e+01 +1.629930713982624013e+01 +1.643104973704262761e+01 +1.651970262258523903e+01 +1.657439492050288266e+01 +1.660268482695158454e+01 +1.661068452656958172e+01 +1.660325751642827541e+01 +1.658423063072622128e+01 +1.655659174655570709e+01 +1.652266118175191423e+01 +1.648423404164407202e+01 +1.644269528204118913e+01 +1.639911109074613904e+01 +1.635430062077799462e+01 +1.630889187074633995e+01 +1.626336500300910259e+01 +1.621808582392512221e+01 +1.617333161866269720e+01 +1.612931107321454860e+01 +1.608617963671811424e+01 +1.604405137263469783e+01 +1.600300810739329904e+01 +1.596310649830811101e+01 +1.592438349830712241e+01 +1.588686058415411040e+01 +1.585054702993790876e+01 +1.581544244267967159e+01 +1.578153872729686746e+01 +1.574882161023777449e+01 +1.571727182207425955e+01 +1.568686601707942252e+01 +1.565757749069175375e+01 +1.562937674253947939e+01 +1.560223192242581192e+01 +1.557610918864434169e+01 +1.555097300166306695e+01 +1.552678637117923977e+01 +1.550351107049913324e+01 +1.548110782891027881e+01 +1.545953651001983609e+01 +1.543875628180915704e+01 +1.541872578231214952e+01 +1.539940328330030184e+01 +1.538074685310511924e+01 +1.536271451869698623e+01 +1.534526442634450660e+01 +1.532835499958191861e+01 +1.531194509279810312e+01 +1.529599413851450862e+01 +1.528046228632516801e+01 +1.526531053151347983e+01 +1.525050083151949742e+01 +1.523599620868869486e+01 +1.522176083806823144e+01 +1.520776011940879791e+01 +1.519396073295861527e+01 +1.518033067908124956e+01 +1.516683930217237553e+01 +1.515345729977594580e+01 +1.514015671819307762e+01 +1.512691093622530403e+01 +1.511369463898754439e+01 +1.510048378395709179e+01 +1.508725556158599979e+01 +1.507398835288966410e+01 +1.506066168642825076e+01 +1.504725619701471473e+01 +1.503375358830780151e+01 +1.502013660117566118e+01 +1.500638898934094101e+01 +1.499249550333864711e+01 +1.497844188323326797e+01 +1.496421485985468536e+01 +1.494980216353074098e+01 +1.493519253843091121e+01 +1.492037575970802799e+01 +1.490534264965678091e+01 +1.489008508812615084e+01 +1.487459601145852162e+01 +1.485886939331301981e+01 +1.484290019989658660e+01 +1.482668431140415066e+01 +1.481021840088712338e+01 +1.479349976135269884e+01 +1.477652607166813148e+01 +1.475929509182429555e+01 +1.474180427832030560e+01 +1.472405031088170091e+01 +1.470602852243195180e+01 +1.468773222520790434e+01 +1.466915192714253457e+01 +1.465027443411753083e+01 +1.463108183538029650e+01 +1.461155037127089606e+01 +1.459164918433819302e+01 +1.457133895684776270e+01 +1.455057043949429030e+01 +1.452928287773058713e+01 +1.450740234344022284e+01 +1.448483998068297929e+01 +1.446149017497211098e+01 +1.443722865612797257e+01 +1.441191054542421668e+01 +1.438536835883897247e+01 +1.435740998018421521e+01 +1.432781662124446953e+01 +1.429634079140982905e+01 +1.426270430727883110e+01 +1.422659638400148907e+01 +1.418767186538101122e+01 +1.414554966957319593e+01 +1.409981155218268078e+01 +1.405000131903787342e+01 +1.399562465705663250e+01 +1.393614979307604074e+01 +1.387100923597096624e+01 +1.379960290411422719e+01 +1.372130298366427859e+01 +1.363546089507478243e+01 +1.354141675365861630e+01 +1.343851167995409313e+01 +1.332610322446844009e+01 +1.320358399377801284e+01 +1.307040328233724935e+01 +1.292609110065096978e+01 +1.277028343128405830e+01 +1.260274688478741290e+01 +1.242340020245238819e+01 +1.223232929083509113e+01 +1.202979191135453796e+01 +1.181620798613216294e+01 +1.159213143067166740e+01 +1.135819968658704049e+01 +1.111505869461257490e+01 +1.086326200903267392e+01 +1.060313975104417850e+01 +1.033463212203473169e+01 +1.005708905557649935e+01 +9.769024438066510996e+00 +9.467696939934313605e+00 +9.148056627004100605e+00 +8.800149989790838845e+00 +8.404179441318740729e+00 +7.924301029360958815e+00 +7.307358640824961782e+00 +6.498721704975837454e+00 +5.482319188850283354e+00 +4.328148913706115763e+00 +3.204032966608415745e+00 +2.308366159628717273e+00 +1.750221687972271400e+00 +1.494136702467914857e+00 +1.416136291645969658e+00 +1.401792144316470035e+00 +1.400142793797026108e+00 +1.400009716605294718e+00 +1.400000621044604543e+00 +1.400000038614572118e+00 +1.400000002369970353e+00 +1.400000000144541179e+00 +1.400000000008787548e+00 +1.400000000000533262e+00 +1.400000000000032108e+00 +1.400000000000001910e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.263400340432552227e+00 +8.266285220803577971e+00 +8.273857169088724817e+00 +8.289066896615645774e+00 +8.316526449378224939e+00 +8.363132159502866259e+00 +8.438676363205756203e+00 +8.556177976452088885e+00 +8.731497528517914830e+00 +8.981746068045303844e+00 +9.322236089425791405e+00 +9.762318634503131420e+00 +1.030122270809705576e+01 +1.092552399861558321e+01 +1.160964599582859158e+01 +1.231971932375723000e+01 +1.301967400746610437e+01 +1.367747226735920663e+01 +1.426951019982244517e+01 +1.478226782772964754e+01 +1.521151187282274719e+01 +1.556006760924688592e+01 +1.583521861552184795e+01 +1.604643772119882783e+01 +1.620373841495572265e+01 +1.631664904803615457e+01 +1.639367907711373817e+01 +1.644211955225907218e+01 +1.646804390387858064e+01 +1.647641314217363728e+01 +1.647122428976188147e+01 +1.645566670181149149e+01 +1.643226802988957402e+01 +1.640302197262422723e+01 +1.636949578457023691e+01 +1.633291849142259267e+01 +1.629425206586555319e+01 +1.625424820705227447e+01 +1.621349329079003354e+01 +1.617244377555923407e+01 +1.613145400137672070e+01 +1.609079797462858963e+01 +1.605068642378370924e+01 +1.601128014894815976e+01 +1.597270047266973236e+01 +1.593503742569498094e+01 +1.589835616332782386e+01 +1.586270199934335245e+01 +1.582810435936279347e+01 +1.579457988931667956e+01 +1.576213490308993315e+01 +1.573076731341187262e+01 +1.570046815895075376e+01 +1.567122281637340819e+01 +1.564301196725737597e+01 +1.561581237497164132e+01 +1.558959751502750812e+01 +1.556433809321620032e+01 +1.554000247853763206e+01 +1.551655707206121804e+01 +1.549396662812215730e+01 +1.547219454040313025e+01 +1.545120310229987659e+01 +1.543095374838442524e+01 +1.541140728166204177e+01 +1.539252408959318785e+01 +1.537426435046478090e+01 +1.535658823060420808e+01 +1.533945607210159423e+01 +1.532282857011319521e+01 +1.530666693843685877e+01 +1.529093306185555434e+01 +1.527558963371396672e+01 +1.526060027730208191e+01 +1.524592964984466725e+01 +1.523154352821196689e+01 +1.521740887585077928e+01 +1.520349389086283232e+01 +1.518976803560716426e+01 +1.517620204865472999e+01 +1.516276794035899123e+01 +1.514943897371023596e+01 +1.513618963250082849e+01 +1.512299557913283898e+01 +1.510983360463937153e+01 +1.509668157365895347e+01 +1.508351836719154804e+01 +1.507032382596870690e+01 +1.505707869718254521e+01 +1.504376458713224984e+01 +1.503036392205646621e+01 +1.501685991902006734e+01 +1.500323656821087681e+01 +1.498947862737533399e+01 +1.497557162838513278e+01 +1.496150189508748340e+01 +1.494725657066362778e+01 +1.493282365172245107e+01 +1.491819202531329225e+01 +1.490335150398267139e+01 +1.488829285295596350e+01 +1.487300780253010046e+01 +1.485748903785099095e+01 +1.484173015745193247e+01 +1.482572559127807033e+01 +1.480947046844601367e+01 +1.479296042471528239e+01 +1.477619133960631892e+01 +1.475915899331460679e+01 +1.474185863406659891e+01 +1.472428444736114983e+01 +1.470642891965290211e+01 +1.468828209046164801e+01 +1.466983068861505757e+01 +1.465105715030902545e+01 +1.463193851882938823e+01 +1.461244522802403267e+01 +1.459253977382610401e+01 +1.457217528017831754e+01 +1.455129396747372894e+01 +1.452982553301802149e+01 +1.450768545399548870e+01 +1.448477322402611911e+01 +1.446097053477222438e+01 +1.443613941443352466e+01 +1.441012033570868667e+01 +1.438273030734223745e+01 +1.435376096622996300e+01 +1.432297669178272947e+01 +1.429011277142295455e+01 +1.425487365627600589e+01 +1.421693135988569523e+01 +1.417592407065264126e+01 +1.413145507115191002e+01 +1.408309208497688658e+01 +1.403036720444694296e+01 +1.397277759020514765e+01 +1.390978717551735322e+01 +1.384082965137730703e+01 +1.376531304877343054e+01 +1.368262626432582607e+01 +1.359214788218346115e+01 +1.349325761164431725e+01 +1.338535056616503738e+01 +1.326785442504444923e+01 +1.314024921569661686e+01 +1.300208901885209833e+01 +1.285302430284215092e+01 +1.269282284023254448e+01 +1.252138635515939313e+01 +1.233875921214804094e+01 +1.214512463442907553e+01 +1.194078359234948117e+01 +1.172611159762692523e+01 +1.150148847641034955e+01 +1.126719693059638239e+01 +1.102328782956768549e+01 +1.076940842973954915e+01 +1.050458298834670323e+01 +1.022693817963866181e+01 +9.933381414217214100e+00 +9.619172532401069731e+00 +9.276982790161358849e+00 +8.894508477525326029e+00 +8.449818522092790829e+00 +7.905897511181997572e+00 +7.211705465420124028e+00 +6.322213429446845723e+00 +5.240980260257797951e+00 +4.062706555786004259e+00 +2.969574161446218774e+00 +2.146578117124215535e+00 +1.666812725556771513e+00 +1.464801469755714347e+00 +1.409962589903882346e+00 +1.401010928057493832e+00 +1.400076669273988328e+00 +1.400005127264892124e+00 +1.400000325798587131e+00 +1.400000020231053188e+00 +1.400000001242591496e+00 +1.400000000075910300e+00 +1.400000000004624878e+00 +1.400000000000281242e+00 +1.400000000000017009e+00 +1.400000000000001021e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.223313282326241591e+00 +8.225205396574825301e+00 +8.230176490440527459e+00 +8.240167535167895352e+00 +8.258218081563963864e+00 +8.288907774030755959e+00 +8.338849620323749434e+00 +8.417112458710759526e+00 +8.535345265170059648e+00 +8.707285584108911181e+00 +8.947344217400761579e+00 +9.268155340072885551e+00 +9.677387675242265175e+00 +1.017461072190865856e+01 +1.074933351431104356e+01 +1.138119575366627068e+01 +1.204261052522561393e+01 +1.270320122655975759e+01 +1.333465518192363319e+01 +1.391454856803029472e+01 +1.442828084385105214e+01 +1.486908696256687534e+01 +1.523670508545886015e+01 +1.553546092859277650e+01 +1.577237935304918004e+01 +1.595565967172987598e+01 +1.609361326200570730e+01 +1.619401963176781578e+01 +1.626380037697886749e+01 +1.630890649571079010e+01 +1.633433385487944278e+01 +1.634420618944306369e+01 +1.634188653851938611e+01 +1.633009403247566382e+01 +1.631101371498212060e+01 +1.628639379850584135e+01 +1.625762865362829857e+01 +1.622582792242734584e+01 +1.619187313545574725e+01 +1.615646356960749941e+01 +1.612015310311115357e+01 +1.608337967843277738e+01 +1.604648877318258116e+01 +1.600975205648361666e+01 +1.597338219999369358e+01 +1.593754462994561294e+01 +1.590236685205271705e+01 +1.586794585367383981e+01 +1.583435398419677398e+01 +1.580164363157698304e+01 +1.576985094682384236e+01 +1.573899881578377880e+01 +1.570909923610821757e+01 +1.568015522455507593e+01 +1.565216235391670097e+01 +1.562510999841868298e+01 +1.559898235022100188e+01 +1.557375925675230377e+01 +1.554941691829753303e+01 +1.552592847697742329e+01 +1.550326452157149504e+01 +1.548139352721066864e+01 +1.546028224454689770e+01 +1.543989604940109750e+01 +1.542019926095047921e+01 +1.540115543413042154e+01 +1.538272763000910182e+01 +1.536487866637923361e+01 +1.534757134964768888e+01 +1.533076868824704775e+01 +1.531443408720530464e+01 +1.529853152315700981e+01 +1.528302569892833240e+01 +1.526788217684909199e+01 +1.525306749010580987e+01 +1.523854923172182296e+01 +1.522429612110472696e+01 +1.521027804851085286e+01 +1.519646609821602290e+01 +1.518283255162902989e+01 +1.516935087201920318e+01 +1.515599567293520522e+01 +1.514274267275458108e+01 +1.512956863811088049e+01 +1.511645131918741569e+01 +1.510336938003568896e+01 +1.509030232716423292e+01 +1.507723043964313447e+01 +1.506413470387305686e+01 +1.505099675596834885e+01 +1.503779883439443843e+01 +1.502452374507481636e+01 +1.501115484063816830e+01 +1.499767601481133816e+01 +1.498407171218193135e+01 +1.497032695266422486e+01 +1.495642736901798209e+01 +1.494235925471149962e+01 +1.492810961831336591e+01 +1.491366623947122960e+01 +1.489901772042313333e+01 +1.488415352592178920e+01 +1.486906400346943258e+01 +1.485374037489458665e+01 +1.483817468958640617e+01 +1.482235972917063371e+01 +1.480628885309737264e+01 +1.478995577454978516e+01 +1.477335425630907828e+01 +1.475647771675838094e+01 +1.473931873710499652e+01 +1.472186846216504641e+01 +1.470411588868811315e+01 +1.468604703717862847e+01 +1.466764400544191282e+01 +1.464888390455826084e+01 +1.462973768054925827e+01 +1.461016882750293888e+01 +1.459013200021710333e+01 +1.456957153636346725e+01 +1.454841989966941540e+01 +1.452659605662368847e+01 +1.450400379979154764e+01 +1.448053003113165893e+01 +1.445604301900710453e+01 +1.443039064323990317e+01 +1.440339864401051884e+01 +1.437486889313332838e+01 +1.434457771073566512e+01 +1.431227425710494039e+01 +1.427767903888752343e+01 +1.424048258132213363e+01 +1.420034433417139752e+01 +1.415689189885076971e+01 +1.410972068826637305e+01 +1.405839415934646297e+01 +1.400244479097888117e+01 +1.394137601615022781e+01 +1.387466535447451577e+01 +1.380176902514664050e+01 +1.372212834299169337e+01 +1.363517820013650628e+01 +1.354035789391744338e+01 +1.343712445538870526e+01 +1.332496843638549500e+01 +1.320343179003293521e+01 +1.307212700472933520e+01 +1.293075601980586065e+01 +1.277912663627194689e+01 +1.261716318081419885e+01 +1.244490723362499551e+01 +1.226250325751516002e+01 +1.207016308116545922e+01 +1.186810298307954348e+01 +1.165644707143249015e+01 +1.143508974554066704e+01 +1.120351058177852899e+01 +1.096053672925230771e+01 +1.070403921346695419e+01 +1.043053739418355796e+01 +1.013471975137757752e+01 +9.808913504845671483e+00 +9.442277808083272106e+00 +9.018930583884872121e+00 +8.514210169856255561e+00 +7.890812366530305155e+00 +7.102976292380608569e+00 +6.120562972935516655e+00 +4.972092640279218045e+00 +3.778703093242067101e+00 +2.731660002846079127e+00 +1.992614292475592297e+00 +1.593690464923510408e+00 +1.441884413696094658e+00 +1.405742445448916245e+00 +1.400532703632348941e+00 +1.400038752328320424e+00 +1.400002554286013501e+00 +1.400000161543772714e+00 +1.400000010024543329e+00 +1.400000000616403062e+00 +1.400000000037730619e+00 +1.400000000002304068e+00 +1.400000000000140465e+00 +1.400000000000008349e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.188296037456344934e+00 +8.189527910261016785e+00 +8.192766794651687334e+00 +8.199278525914046156e+00 +8.211046695278465535e+00 +8.231074113627906641e+00 +8.263746385232060732e+00 +8.315207927456400583e+00 +8.393642776754797197e+00 +8.509284356314962494e+00 +8.673931621574704209e+00 +8.899773129338354849e+00 +9.197465229480739524e+00 +9.573686015138960670e+00 +1.002871814940209028e+01 +1.055483666728180125e+01 +1.113621253497818131e+01 +1.175062325643236072e+01 +1.237262791876258916e+01 +1.297732086997052647e+01 +1.354361429337049216e+01 +1.405628505790066640e+01 +1.450655998403972724e+01 +1.489150369987931910e+01 +1.521271693702147765e+01 +1.547484116949016020e+01 +1.568420924171427977e+01 +1.584780199086034891e+01 +1.597253683502965593e+01 +1.606484137080866148e+01 +1.613043978747890961e+01 +1.617428220377225045e+01 +1.620056088557761953e+01 +1.621277326853985556e+01 +1.621380549062268628e+01 +1.620602048733460876e+01 +1.619134180978889859e+01 +1.617132888515347844e+01 +1.614724218634396635e+01 +1.612009832122756237e+01 +1.609071583719794418e+01 +1.605975286891808551e+01 +1.602773783220675341e+01 +1.599509430759392714e+01 +1.596216113571927409e+01 +1.592920860486496260e+01 +1.589645147063342989e+01 +1.586405941981997358e+01 +1.583216547908847183e+01 +1.580087277479194618e+01 +1.577025997206596486e+01 +1.574038565727132344e+01 +1.571129187587126808e+01 +1.568300699587107339e+01 +1.565554803320587496e+01 +1.562892254837232109e+01 +1.560313020185266275e+01 +1.557816403840322828e+01 +1.555401155620452514e+01 +1.553065560550358271e+01 +1.550807515217030996e+01 +1.548624593410618289e+01 +1.546514103234753179e+01 +1.544473137373450378e+01 +1.542498617796678850e+01 +1.540587335858068485e+01 +1.538735988473614391e+01 +1.536941210860018714e+01 +1.535199606147681983e+01 +1.533507772059905605e+01 +1.531862324761111793e+01 +1.530259919917994260e+01 +1.528697270984066847e+01 +1.527171164705962347e+01 +1.525678473855186823e+01 +1.524216167208154182e+01 +1.522781316826799269e+01 +1.521371102728671509e+01 +1.519982815076267890e+01 +1.518613854057858781e+01 +1.517261727674000049e+01 +1.515924047683353493e+01 +1.514598523996827417e+01 +1.513282957839049025e+01 +1.511975234019736369e+01 +1.510673312673689850e+01 +1.509375220836039588e+01 +1.508079044218237463e+01 +1.506782919539281629e+01 +1.505485027744999016e+01 +1.504183588415148520e+01 +1.502876855613022045e+01 +1.501563115374709589e+01 +1.500240684965186588e+01 +1.498907913946256443e+01 +1.497563187008036856e+01 +1.496204928412589830e+01 +1.494831607787510563e+01 +1.493441746891364375e+01 +1.492033926854768744e+01 +1.490606795283930452e+01 +1.489159072500998526e+01 +1.487689556091224574e+01 +1.486197122834204265e+01 +1.484680727019079072e+01 +1.483139394085304552e+01 +1.481572208495462561e+01 +1.479978294738898015e+01 +1.478356790389082498e+01 +1.476706810197854480e+01 +1.475027400309677184e+01 +1.473317481821121078e+01 +1.471575783095011403e+01 +1.469800760462175582e+01 +1.467990507199882444e+01 +1.466142650954362558e+01 +1.464254240061184476e+01 +1.462321619495285141e+01 +1.460340297435212342e+01 +1.458304803638834990e+01 +1.456208540990640721e+01 +1.454043631691830463e+01 +1.451800759631810855e+01 +1.449469010522431844e+01 +1.447035711423991344e+01 +1.444486271382538867e+01 +1.441804025074223716e+01 +1.438970081657665467e+01 +1.435963181509866970e+01 +1.432759564198866009e+01 +1.429332851954189820e+01 +1.425653954057175632e+01 +1.421690999006504263e+01 +1.417409303043235802e+01 +1.412771385668367152e+01 +1.407737045164304313e+01 +1.402263509833542798e+01 +1.396305683595947222e+01 +1.389816507502222009e+01 +1.382747461204499650e+01 +1.375049229618164581e+01 +1.366672558682216554e+01 +1.357569318593496455e+01 +1.347693780504662797e+01 +1.337004090775248955e+01 +1.325463892578088654e+01 +1.313043993804754450e+01 +1.299723911654968767e+01 +1.285493038812020572e+01 +1.270351069653745135e+01 +1.254307206522634033e+01 +1.237377553500047611e+01 +1.219579973583680044e+01 +1.200925553072242558e+01 +1.181405769935091143e+01 +1.160974292438868893e+01 +1.139521939230928460e+01 +1.116843395532712258e+01 +1.092593897209450837e+01 +1.066231555189959401e+01 +1.036942796374866305e+01 +1.003560371785489025e+01 +9.644839403551626944e+00 +9.175742462350699569e+00 +8.599696842417493770e+00 +7.880119127661098233e+00 +6.980939916498002162e+00 +5.893888810175281101e+00 +4.678462695077659106e+00 +3.482455424145610490e+00 +2.497860000132362313e+00 +1.851954350965315355e+00 +1.532999867861244203e+00 +1.425273036442370467e+00 +1.403081224083309486e+00 +1.400262751930258842e+00 +1.400018478679995404e+00 +1.400001203783523218e+00 +1.400000075863832905e+00 +1.400000004707443901e+00 +1.400000000289900903e+00 +1.400000000017785462e+00 +1.400000000001088818e+00 +1.400000000000066525e+00 +1.400000000000003908e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.157962893659115977e+00 +8.158759957201365154e+00 +8.160856835161657941e+00 +8.165073295756849703e+00 +8.172693740826613151e+00 +8.185667823803411736e+00 +8.206864336299503293e+00 +8.240361688944714658e+00 +8.291729091189578682e+00 +8.368211805834045336e+00 +8.478690515617332224e+00 +8.633259000086248136e+00 +8.842286671902092721e+00 +9.114933608977613844e+00 +9.457271558753038931e+00 +9.870389261821671312e+00 +1.034902310284177318e+01 +1.088123891927405928e+01 +1.144944259461274783e+01 +1.203258137140098505e+01 +1.260899225603234619e+01 +1.315915524269537151e+01 +1.366770871863668901e+01 +1.412440827513636954e+01 +1.452407756724286614e+01 +1.486584897757206924e+01 +1.515206493861829884e+01 +1.538714855816686899e+01 +1.557663333641906078e+01 +1.572642942699339841e+01 +1.584232704304366202e+01 +1.592969830612594428e+01 +1.599334678337336335e+01 +1.603745716942410482e+01 +1.606560705256092447e+01 +1.608081319851172353e+01 +1.608559386433391225e+01 +1.608203558620469309e+01 +1.607185776320271131e+01 +1.605647158460508095e+01 +1.603703186452602836e+01 +1.601448153475136849e+01 +1.598958919276405943e+01 +1.596298041085605846e+01 +1.593516362057101610e+01 +1.590655138264479440e+01 +1.587747779088237543e+01 +1.584821267180733706e+01 +1.581897314916842490e+01 +1.578993305350006082e+01 +1.576123057668628924e+01 +1.573297450161405031e+01 +1.570524927759646694e+01 +1.567811916252804672e+01 +1.565163161156588778e+01 +1.562582005828485876e+01 +1.560070620655246110e+01 +1.557630192875077135e+01 +1.555261084752307355e+01 +1.552962966317068272e+01 +1.550734927653493145e+01 +1.548575574715285263e+01 +1.546483111825604695e+01 +1.544455413345804473e+01 +1.542490086448216147e+01 +1.540584526480991556e+01 +1.538735966051323167e+01 +1.536941518663876316e+01 +1.535198217523148045e+01 +1.533503049932785345e+01 +1.531852987594050042e+01 +1.530245013013006705e+01 +1.528676142165725516e+01 +1.527143443537486611e+01 +1.525644053640677456e+01 +1.524175189122260043e+01 +1.522734155591106919e+01 +1.521318353324391914e+01 +1.519925280047085714e+01 +1.518552531016498364e+01 +1.517197796682097000e+01 +1.515858858227354844e+01 +1.514533581333352252e+01 +1.513219908531767466e+01 +1.511915850536543005e+01 +1.510619476957851148e+01 +1.509328906808055493e+01 +1.508042299206303660e+01 +1.506757844675300717e+01 +1.505473757399877499e+01 +1.504188268781393667e+01 +1.502899622574158833e+01 +1.501606071829538003e+01 +1.500305877800150611e+01 +1.498997310871014221e+01 +1.497678653487533929e+01 +1.496348204943408966e+01 +1.495004287776881391e+01 +1.493645255403797023e+01 +1.492269500493653389e+01 +1.490875463473349427e+01 +1.489461640426153366e+01 +1.488026589543999556e+01 +1.486568935193311702e+01 +1.485087368572072108e+01 +1.483580643873067295e+01 +1.482047568829838902e+01 +1.480486988512948976e+01 +1.478897761270098066e+01 +1.477278725769577861e+01 +1.475628658216899147e+01 +1.473946218971860311e+01 +1.472229887997814757e+01 +1.470477888822783719e+01 +1.468688100975460920e+01 +1.466857961165759860e+01 +1.464984353793436433e+01 +1.463063491671351102e+01 +1.461090788124284501e+01 +1.459060721855236586e+01 +1.456966696150673357e+01 +1.454800894125231459e+01 +1.452554131797096737e+01 +1.450215710860970653e+01 +1.447773273119374515e+01 +1.445212658684300067e+01 +1.442517770310640657e+01 +1.439670446607467902e+01 +1.436650347421526064e+01 +1.433434855417414866e+01 +1.429998998798673782e+01 +1.426315401223820167e+01 +1.422354266272890655e+01 +1.418083405316036227e+01 +1.413468319334897316e+01 +1.408472347157323767e+01 +1.403056894650289266e+01 +1.397181761582408654e+01 +1.390805584863893252e+01 +1.383886418182396483e+01 +1.376382467910405261e+01 +1.368253002206761693e+01 +1.359459442657211525e+01 +1.349966633459197674e+01 +1.339744258776316244e+01 +1.328768341736443226e+01 +1.317022706072435945e+01 +1.304500209131303912e+01 +1.291203463651312688e+01 +1.277144655720644728e+01 +1.262343929789108543e+01 +1.246825660738344155e+01 +1.230611768664575045e+01 +1.213710998348721759e+01 +1.196102825458826402e+01 +1.177714367626924385e+01 +1.158387976069584546e+01 +1.137836280117230103e+01 +1.115580989437582460e+01 +1.090869795131678721e+01 +1.062563671072579652e+01 +1.029000645698850036e+01 +9.878821969879245657e+00 +9.362533651198072349e+00 +8.706313254829158410e+00 +7.874886005853401372e+00 +6.847208014495728357e+00 +5.645450926211767140e+00 +4.366595606316091782e+00 +3.183257960410027287e+00 +2.276779972200269064e+00 +1.729504552362713055e+00 +1.485811207882196783e+00 +1.414201011657628237e+00 +1.401540077401292272e+00 +1.400122076813712146e+00 +1.400008357761482136e+00 +1.400000539405112043e+00 +1.400000033907897956e+00 +1.400000002104939467e+00 +1.400000000129863809e+00 +1.400000000007986634e+00 +1.400000000000490186e+00 +1.400000000000029887e+00 +1.400000000000001688e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.131881298241125933e+00 +8.132394340222496965e+00 +8.133744636837791475e+00 +8.136460048427315073e+00 +8.141367098016406345e+00 +8.149722113748703478e+00 +8.163382467987364777e+00 +8.185014703484693399e+00 +8.218322640102087462e+00 +8.268257103142975240e+00 +8.341141030210009077e+00 +8.444615482568886833e+00 +8.587296504568350031e+00 +8.778049416901644975e+00 +9.024855411884347589e+00 +9.333369822628382551e+00 +9.705425516722206325e+00 +1.013785691091305452e+01 +1.062203511911102005e+01 +1.114436737727288751e+01 +1.168774826891768548e+01 +1.223365525770657136e+01 +1.276438616783864965e+01 +1.326492837547921511e+01 +1.372411961728441909e+01 +1.413501335878664733e+01 +1.449458113686373473e+01 +1.480299903433692599e+01 +1.506277162668175329e+01 +1.527788476373520155e+01 +1.545309639021955661e+01 +1.559340455489321364e+01 +1.570368608810371569e+01 +1.578847682548085807e+01 +1.585185783715923691e+01 +1.589741472004827649e+01 +1.592824335674559499e+01 +1.594698252258605820e+01 +1.595585984603883922e+01 +1.595674240808670419e+01 +1.595118672330896459e+01 +1.594048520433352856e+01 +1.592570774124217436e+01 +1.590773796975704180e+01 +1.588730434716173967e+01 +1.586500644253008296e+01 +1.584133697514284833e+01 +1.581670016702744874e+01 +1.579142695446244993e+01 +1.576578755541891574e+01 +1.574000183118857166e+01 +1.571424782005518317e+01 +1.568866876373971841e+01 +1.566337889584220022e+01 +1.563846821643865148e+01 +1.561400643834071111e+01 +1.559004625781857456e+01 +1.556662607516184060e+01 +1.554377226759416963e+01 +1.552150109808096801e+01 +1.549982032785419861e+01 +1.547873058748595021e+01 +1.545822655061459550e+01 +1.543829794558361357e+01 +1.541893043297978849e+01 +1.540010637109808300e+01 +1.538180548650625923e+01 +1.536400546296220426e+01 +1.534668245880983051e+01 +1.532981156052775340e+01 +1.531336717822818372e+01 +1.529732338751491838e+01 +1.528165422113209004e+01 +1.526633391320068789e+01 +1.525133709848521057e+01 +1.523663896900165682e+01 +1.522221539031879622e+01 +1.520804298007119471e+01 +1.519409915145373446e+01 +1.518036212476794411e+01 +1.516681091040970664e+01 +1.515342526700055892e+01 +1.514018563864985900e+01 +1.512707307557548120e+01 +1.511406914249234568e+01 +1.510115581928919148e+01 +1.508831539854391757e+01 +1.507553038436717863e+01 +1.506278339690296875e+01 +1.505005708654544883e+01 +1.503733406154477059e+01 +1.502459683216526365e+01 +1.501182777392287271e+01 +1.499900911166546535e+01 +1.498612292537349688e+01 +1.497315117755951697e+01 +1.496007576104795156e+01 +1.494687856474175547e+01 +1.493354155375451953e+01 +1.492004685903393124e+01 +1.490637687035562031e+01 +1.489251432535895781e+01 +1.487844238616294490e+01 +1.486414469407908179e+01 +1.484960539207095209e+01 +1.483480910394419361e+01 +1.481974085883939196e+01 +1.480438594950334696e+01 +1.478872971309378492e+01 +1.477275722398920443e+01 +1.475645288927913690e+01 +1.473979993932973009e+01 +1.472277980805201381e+01 +1.470537140020067568e+01 +1.468755024610662119e+01 +1.466928754755831932e+01 +1.465054912191966885e+01 +1.463129425481436563e+01 +1.461147447464025717e+01 +1.459103226466877246e+01 +1.456989973048249531e+01 +1.454799724206165834e+01 +1.452523207112094639e+01 +1.450149704560597641e+01 +1.447666924495046281e+01 +1.445060876217033652e+01 +1.442315756250150471e+01 +1.439413847335386976e+01 +1.436335434700363223e+01 +1.433058744566875653e+01 +1.429559910827014058e+01 +1.425812976906556706e+01 +1.421789941023217629e+01 +1.417460854324318298e+01 +1.412793982745766463e+01 +1.407756044858150446e+01 +1.402312539420157655e+01 +1.396428177702288131e+01 +1.390067436597335870e+01 +1.383195248580870995e+01 +1.375777842795187844e+01 +1.367783746690996161e+01 +1.359184947926616260e+01 +1.349958199278127147e+01 +1.340086422954857959e+01 +1.329560131483618157e+01 +1.318378727912926074e+01 +1.306551476922899546e+01 +1.294097844982901258e+01 +1.281046793661715455e+01 +1.267434471167119092e+01 +1.253299561697906306e+01 +1.238675329728921604e+01 +1.223577095759404187e+01 +1.207983380667172568e+01 +1.191808316839235538e+01 +1.174861998064179858e+01 +1.156793535520388083e+01 +1.137009383464800827e+01 +1.114558132680809521e+01 +1.087969561123845885e+01 +1.055042546772324030e+01 +1.012645502943711229e+01 +9.567307987729117613e+00 +8.828584316205262184e+00 +7.875492393664585755e+00 +6.706829135640156814e+00 +5.384285091949613467e+00 +4.048842827578901016e+00 +2.894091410212618509e+00 +2.077682268870984839e+00 +1.629033740682465758e+00 +1.451922529319556565e+00 +1.407464012822018606e+00 +1.400723446439365860e+00 +1.400054095193801640e+00 +1.400003626568927739e+00 +1.400000232331092054e+00 +1.400000014577446050e+00 +1.400000000905500475e+00 +1.400000000055964700e+00 +1.400000000003450040e+00 +1.400000000000212408e+00 +1.400000000000013012e+00 +1.400000000000000799e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.109603773134999471e+00 +8.109932548283000031e+00 +8.110798177117121810e+00 +8.112538965736344920e+00 +8.115684167527449588e+00 +8.121038648236341473e+00 +8.129795748455684645e+00 +8.143679812471283697e+00 +8.165113839497347925e+00 +8.197397334001106373e+00 +8.244864161442313488e+00 +8.312971106218194350e+00 +8.408248934957427423e+00 +8.538037520813203329e+00 +8.709937525914339673e+00 +8.930955862643859433e+00 +9.206404647518374063e+00 +9.538719015297997927e+00 +9.926451221775208111e+00 +1.036372855829278627e+01 +1.084039496774821920e+01 +1.134289365189562027e+01 +1.185574137965157604e+01 +1.236327573728233631e+01 +1.285129480589155904e+01 +1.330827542732034985e+01 +1.372601173463617208e+01 +1.409968679143801573e+01 +1.442751319265787480e+01 +1.471012710069740059e+01 +1.494990544369763263e+01 +1.515032714808973857e+01 +1.531544423312000980e+01 +1.544948415958304722e+01 +1.555657644929230088e+01 +1.564058261702758656e+01 +1.570500450236551337e+01 +1.575294780117293136e+01 +1.578712176414722990e+01 +1.580986070328527227e+01 +1.582315714985900890e+01 +1.582869987885730190e+01 +1.582791252650351232e+01 +1.582199029801968493e+01 +1.581193345390333604e+01 +1.579857702883547965e+01 +1.578261670542297956e+01 +1.576463103248928554e+01 +1.574510031481865724e+01 +1.572442255694252289e+01 +1.570292685056640458e+01 +1.568088457501665900e+01 +1.565851874622995865e+01 +1.563601181063629753e+01 +1.561351214066900184e+01 +1.559113945123684353e+01 +1.556898932260739876e+01 +1.554713698524524546e+01 +1.552564049621998521e+01 +1.550454341459281338e+01 +1.548387706433644873e+01 +1.546366245743769774e+01 +1.544391193647971150e+01 +1.542463058484062799e+01 +1.540581744335704961e+01 +1.538746656460841855e+01 +1.536956792964654461e+01 +1.535210824682399178e+01 +1.533507164819619462e+01 +1.531844029564104659e+01 +1.530219490623151835e+01 +1.528631520440320024e+01 +1.527078030698317868e+01 +1.525556904610385267e+01 +1.524066023433752548e+01 +1.522603287598552235e+01 +1.521166632827639731e+01 +1.519754041621573215e+01 +1.518363550493596925e+01 +1.516993253357619231e+01 +1.515641301494254201e+01 +1.514305900542997563e+01 +1.512985304990056612e+01 +1.511677810639242203e+01 +1.510381745566011169e+01 +1.509095460060858862e+01 +1.507817316066623370e+01 +1.506545676603803940e+01 +1.505278895657745508e+01 +1.504015308970580911e+01 +1.502753226138359821e+01 +1.501490924359227463e+01 +1.500226644111486962e+01 +1.498958586960931605e+01 +1.497684915605438682e+01 +1.496403756162435705e+01 +1.495113202592986923e+01 +1.493811323036838346e+01 +1.492496167708155319e+01 +1.491165777874573273e+01 +1.489818195315463178e+01 +1.488451471532158621e+01 +1.487063675866742329e+01 +1.485652901580676399e+01 +1.484217268854531824e+01 +1.482754923600481867e+01 +1.481264030936051945e+01 +1.479742762157630054e+01 +1.478189274082468430e+01 +1.476601679705158254e+01 +1.474978009244290078e+01 +1.473316160840191102e+01 +1.471613840404501872e+01 +1.469868490411472095e+01 +1.468077207748628332e+01 +1.466236651095587362e+01 +1.464342938655677351e+01 +1.462391537406277742e+01 +1.460377145343549543e+01 +1.458293568464857337e+01 +1.456133594456679070e+01 +1.453888865248064022e+01 +1.451549750773007652e+01 +1.449105226493112220e+01 +1.446542757504211885e+01 +1.443848192426353449e+01 +1.441005670786778303e+01 +1.437997548266906733e+01 +1.434804344993961323e+01 +1.431404722993911882e+01 +1.427775499947076554e+01 +1.423891707456128053e+01 +1.419726703107280308e+01 +1.415252346645154091e+01 +1.410439251569587604e+01 +1.405257124370576882e+01 +1.399675204371489912e+01 +1.393662817601910398e+01 +1.387190057924022213e+01 +1.380228607208008285e+01 +1.372752702813857795e+01 +1.364740253603034503e+01 +1.356174093618760601e+01 +1.347043343408625837e+01 +1.337344820277751545e+01 +1.327084399024935557e+01 +1.316278171004772446e+01 +1.304953179826832432e+01 +1.293147425714738219e+01 +1.280908718045925632e+01 +1.268291815127606981e+01 +1.255353103820876903e+01 +1.242141786284925509e+01 +1.228686150400773336e+01 +1.214972877348467151e+01 +1.200916257678101395e+01 +1.186312724223091131e+01 +1.170773667255667938e+01 +1.153625195380808499e+01 +1.133759781756433505e+01 +1.109422173075183160e+01 +1.077914067166701528e+01 +1.035272317031983391e+01 +9.762203553649261067e+00 +8.950345569332412765e+00 +7.879780881946949478e+00 +6.570289933151434170e+00 +5.129221429051178838e+00 +3.746603256746268151e+00 +2.632527765616504922e+00 +1.910068271364385950e+00 +1.552694186400346954e+00 +1.429824512155442484e+00 +1.403742121557101541e+00 +1.400327914761290371e+00 +1.400023459099580370e+00 +1.400001546941540331e+00 +1.400000098490198353e+00 +1.400000006168629962e+00 +1.400000000383272880e+00 +1.400000000023718050e+00 +1.400000000001464739e+00 +1.400000000000090283e+00 +1.400000000000005462e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.090689929694697469e+00 +8.090899835778577298e+00 +8.091452658281490073e+00 +8.092564381812707097e+00 +8.094572569379280935e+00 +8.097990549629962231e+00 +8.103580656195598308e+00 +8.112449067189807295e+00 +8.126162342565336871e+00 +8.146881066245040159e+00 +8.177498414515662617e+00 +8.221760726875922742e+00 +8.284333994453099592e+00 +8.370767268965845886e+00 +8.487296748063535290e+00 +8.640440719676215409e+00 +8.836363913842788520e+00 +9.080043622599855979e+00 +9.374341852832738908e+00 +9.719156491609188819e+00 +1.011085934334042946e+01 +1.054220308519741778e+01 +1.100278593048637887e+01 +1.148002508713956793e+01 +1.196045541506729037e+01 +1.243108939331651541e+01 +1.288057808916900093e+01 +1.329999273989934139e+01 +1.368316424456025970e+01 +1.402662639586301552e+01 +1.432927602006724221e+01 +1.459188196351549571e+01 +1.481655702516651729e+01 +1.500627157845658211e+01 +1.516445093472548677e+01 +1.529466959099036139e+01 +1.540043702989697039e+01 +1.548506044615484711e+01 +1.555156693573874094e+01 +1.560266861125941418e+01 +1.564075677340200698e+01 +1.566791439772310390e+01 +1.568593910933699576e+01 +1.569637123178734406e+01 +1.570052335377233454e+01 +1.569950921155676937e+01 +1.569427062958333963e+01 +1.568560189466269783e+01 +1.567417134557397773e+01 +1.566054020803658275e+01 +1.564517884603994169e+01 +1.562848067140186181e+01 +1.561077397998772121e+01 +1.559233198280573340e+01 +1.557338128480965977e+01 +1.555410904116886783e+01 +1.553466899467323437e+01 +1.551518657162158377e+01 +1.549576318857250357e+01 +1.547647989951673964e+01 +1.545740049268556149e+01 +1.543857412838200105e+01 +1.542003759379796257e+01 +1.540181723756800380e+01 +1.538393063558767793e+01 +1.536638803016492361e+01 +1.534919357666253070e+01 +1.533234642523175850e+01 +1.531584165985436208e+01 +1.529967111254495649e+01 +1.528382406707675756e+01 +1.526828786385564385e+01 +1.525304841546690682e+01 +1.523809064085419607e+01 +1.522339882496870089e+01 +1.520895690996547067e+01 +1.519474872354791195e+01 +1.518075814980469396e+01 +1.516696924778666755e+01 +1.515336632308462761e+01 +1.513993395774864936e+01 +1.512665700400047797e+01 +1.511352054730247829e+01 +1.510050984443629041e+01 +1.508761024229173664e+01 +1.507480708305621064e+01 +1.506208560141282859e+01 +1.504943081919059011e+01 +1.503682744265098847e+01 +1.502425976723369061e+01 +1.501171159411116740e+01 +1.499916616231270794e+01 +1.498660609946928268e+01 +1.497401339340272308e+01 +1.496136938584112563e+01 +1.494865478849672691e+01 +1.493584972060725491e+01 +1.492293376583550213e+01 +1.490988604516638816e+01 +1.489668530116107981e+01 +1.488330998765058055e+01 +1.486973835770660912e+01 +1.485594854154880551e+01 +1.484191860497302606e+01 +1.482762657796229888e+01 +1.481305044242557400e+01 +1.479816806756553582e+01 +1.478295708128009878e+01 +1.476739466633051023e+01 +1.475145727083614133e+01 +1.473512022403967237e+01 +1.471835725025509944e+01 +1.470113987645160414e+01 +1.468343673197430554e+01 +1.466521274234073857e+01 +1.464642822271558487e+01 +1.462703788036514929e+01 +1.460698973893946828e+01 +1.458622400067563341e+01 +1.456467186549279980e+01 +1.454225432850026500e+01 +1.451888097983735904e+01 +1.449444883330239975e+01 +1.446884121329097539e+01 +1.444192673356203116e+01 +1.441355840664203747e+01 +1.438357292948230004e+01 +1.435179019931393718e+01 +1.431801312326520659e+01 +1.428202779574852244e+01 +1.424360412826033340e+01 +1.420249702637371136e+01 +1.415844821770911999e+01 +1.411118884206152657e+01 +1.406044292022942166e+01 +1.400593182098229761e+01 +1.394737984508059725e+01 +1.388452103921850167e+01 +1.381710733755391729e+01 +1.374491809760445804e+01 +1.366777104135490184e+01 +1.358553451964050041e+01 +1.349814087187777467e+01 +1.340560043918441657e+01 +1.330801549141147611e+01 +1.320559292977979560e+01 +1.309865412413226160e+01 +1.298763961137834499e+01 +1.287310559714176783e+01 +1.275570824161252226e+01 +1.263617036209818778e+01 +1.251522329941700207e+01 +1.239351384381382637e+01 +1.227146125145392119e+01 +1.214904195062532821e+01 +1.202546670728210820e+01 +1.189869362037590150e+01 +1.176469018029634483e+01 +1.161630430113569901e+01 +1.144153122548396873e+01 +1.122092506553896207e+01 +1.092394666216959465e+01 +1.050465424477631693e+01 +9.899992061905201979e+00 +9.039801428613701617e+00 +7.880027096397300923e+00 +6.455008156661422802e+00 +4.913765389697280384e+00 +3.494653434684690474e+00 +2.422255288476747648e+00 +1.783526353161873246e+00 +1.500819331777469845e+00 +1.417035443228828129e+00 +1.401891702317918487e+00 +1.400152822301411693e+00 +1.400010576642677584e+00 +1.400000687949141565e+00 +1.400000043536232308e+00 +1.400000002719753667e+00 +1.400000000168840630e+00 +1.400000000010448886e+00 +1.400000000000645395e+00 +1.400000000000039879e+00 +1.400000000000002354e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.074720854001213866e+00 +8.074854444371455386e+00 +8.075206363951668465e+00 +8.075914062893016165e+00 +8.077192156217305907e+00 +8.079366896411524834e+00 +8.082923201835594540e+00 +8.088566586222377452e+00 +8.097301442015538697e+00 +8.110525150026452579e+00 +8.130133979801744459e+00 +8.158631307850402692e+00 +8.199221165728941330e+00 +8.255861039504752696e+00 +8.333238891761340028e+00 +8.436633995152044818e+00 +8.571624429637402898e+00 +8.743621444976893642e+00 +8.957245285240517774e+00 +9.215605294832343475e+00 +9.519597357551825567e+00 +9.867365098281066338e+00 +1.025406864004339980e+01 +1.067205642806704269e+01 +1.111144938752465627e+01 +1.156104781682300775e+01 +1.200939383445632558e+01 +1.244579325336384557e+01 +1.286112821944359474e+01 +1.324836095615970066e+01 +1.360271089023611779e+01 +1.392155464971044587e+01 +1.420413553190785905e+01 +1.445117540243212417e+01 +1.466446686002675470e+01 +1.484649887022731107e+01 +1.500014447491170344e+01 +1.512841986030106334e+01 +1.523431149537083229e+01 +1.532066145384380818e+01 +1.539009873717054866e+01 +1.544500473932334472e+01 +1.548750262478023743e+01 +1.551946246303149479e+01 +1.554251598451557470e+01 +1.555807656333773004e+01 +1.556736141978670673e+01 +1.557141408349505340e+01 +1.557112591609715935e+01 +1.556725602044008205e+01 +1.556044921829087890e+01 +1.555125200755948178e+01 +1.554012655065482917e+01 +1.552746282575038883e+01 +1.551358911279997344e+01 +1.549878100047978613e+01 +1.548326909873593848e+01 +1.546724563095370364e+01 +1.545087006431667120e+01 +1.543427391949270877e+01 +1.541756488309912498e+01 +1.540083032947894637e+01 +1.538414034271634812e+01 +1.536755031578975661e+01 +1.535110319138139623e+01 +1.533483139809996310e+01 +1.531875852663611504e+01 +1.530290078253620756e+01 +1.528726824571270981e+01 +1.527186596137292796e+01 +1.525669488260756346e+01 +1.524175268130982275e+01 +1.522703444127494876e+01 +1.521253324514778882e+01 +1.519824066523944062e+01 +1.518414716702868539e+01 +1.517024243331421829e+01 +1.515651561641245770e+01 +1.514295552543506140e+01 +1.512955075547091965e+01 +1.511628976538871072e+01 +1.510316091092583690e+01 +1.509015243970254794e+01 +1.507725245476799181e+01 +1.506444885322467897e+01 +1.505172924637071041e+01 +1.503908086762937124e+01 +1.502649047429048679e+01 +1.501394424875554456e+01 +1.500142770454983676e+01 +1.498892560183153755e+01 +1.497642187648471257e+01 +1.496389958612807902e+01 +1.495134087550536250e+01 +1.493872696275163570e+01 +1.492603814696279763e+01 +1.491325383634627499e+01 +1.490035259501703635e+01 +1.488731220524467602e+01 +1.487410974067675262e+01 +1.486072164478557589e+01 +1.484712380753788885e+01 +1.483329163210143875e+01 +1.481920008231821839e+01 +1.480482370073942811e+01 +1.479013658629148154e+01 +1.477511232019690190e+01 +1.475972382868910238e+01 +1.474394317142019162e+01 +1.472774124534358364e+01 +1.471108739531774923e+01 +1.469394892474973702e+01 +1.467629050225729337e+01 +1.465807346350283957e+01 +1.463925501091334347e+01 +1.461978731777771401e+01 +1.459961654701863054e+01 +1.457868179859590363e+01 +1.455691400289657444e+01 +1.453423478058221363e+01 +1.451055529230044883e+01 +1.448577510466353147e+01 +1.445978110230413805e+01 +1.443244648005395625e+01 +1.440362985475526969e+01 +1.437317454320111310e+01 +1.434090806129327333e+01 +1.430664190952279746e+01 +1.427017172083107255e+01 +1.423127785805588452e+01 +1.418972655859286469e+01 +1.414527173267066829e+01 +1.409765752790591087e+01 +1.404662177590343042e+01 +1.399190043606150802e+01 +1.393323314672636215e+01 +1.387036998319003267e+01 +1.380307950330793432e+01 +1.373115813034285360e+01 +1.365444087258099515e+01 +1.357281330086251714e+01 +1.348622458708056016e+01 +1.339470123749573638e+01 +1.329836092159882455e+01 +1.319742549408437071e+01 +1.309223192953721338e+01 +1.298323942994915114e+01 +1.287103043475196529e+01 +1.275630262060605347e+01 +1.263984815583817145e+01 +1.252251536636073226e+01 +1.240514618046882944e+01 +1.228847987512494377e+01 +1.217300876187823810e+01 +1.205876276476082687e+01 +1.194498643415385075e+01 +1.182964855804488025e+01 +1.170868593763510468e+01 +1.157482954741970360e+01 +1.141577962140619285e+01 +1.121142058883492432e+01 +1.092985636530149129e+01 +1.052271105939073514e+01 +9.922730706137254941e+00 +9.052952972648650842e+00 +7.861751783726909082e+00 +6.383835224287976118e+00 +4.787494900988080282e+00 +3.344124430610113219e+00 +2.295273783216547070e+00 +1.708633066555708346e+00 +1.472404698412432378e+00 +1.410903511060565219e+00 +1.401104642015138291e+00 +1.400084579739231838e+00 +1.400005727204595818e+00 +1.400000368987804222e+00 +1.400000023254190928e+00 +1.400000001450696141e+00 +1.400000000090081187e+00 +1.400000000005582335e+00 +1.400000000000345635e+00 +1.400000000000021227e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.061307792717071763e+00 +8.061392584104771331e+00 +8.061615999542748767e+00 +8.062065277214747638e+00 +8.062876510122247709e+00 +8.064256485405461916e+00 +8.066512666669879650e+00 +8.070093130701614825e+00 +8.075638015583566087e+00 +8.084043273294417631e+00 +8.096535999038563247e+00 +8.114758051705566189e+00 +8.140850831510871188e+00 +8.177528854070535758e+00 +8.228123480925265909e+00 +8.296571913329273684e+00 +8.387322462842636384e+00 +8.505128364606861169e+00 +8.654712560334802518e+00 +8.840307313307965487e+00 +9.065104197497404925e+00 +9.330685732803473798e+00 +9.636538548294700135e+00 +9.979756483748934315e+00 +1.035502132607945214e+01 +1.075489909550206846e+01 +1.117042270479684163e+01 +1.159186765040198530e+01 +1.200958704122027854e+01 +1.241476824326962358e+01 +1.280000446638466904e+01 +1.315962708118642155e+01 +1.348979939792247862e+01 +1.378841434405149968e+01 +1.405485961734030376e+01 +1.428971566578317542e+01 +1.449444060518440480e+01 +1.467107936349136743e+01 +1.482201771411784996e+01 +1.494978862367979389e+01 +1.505692945968685414e+01 +1.514588366677145714e+01 +1.521893852699840011e+01 +1.527819051211673340e+01 +1.532553064921908614e+01 +1.536264365506056073e+01 +1.539101598272400651e+01 +1.541194917655128904e+01 +1.542657597014938275e+01 +1.543587737645224145e+01 +1.544069962988258382e+01 +1.544177028306508070e+01 +1.543971307046596486e+01 +1.543506136131213857e+01 +1.542827016110012650e+01 +1.541972670606259577e+01 +1.540975974406933702e+01 +1.539864762030271805e+01 +1.538662529504667376e+01 +1.537389041994143923e+01 +1.536060859212495622e+01 +1.534691789552686814e+01 +1.533293282699333737e+01 +1.531874769304539896e+01 +1.530443955161484482e+01 +1.529007076246782226e+01 +1.527569120042979200e+01 +1.526134017705158463e+01 +1.524704810900892404e+01 +1.523283796526165013e+01 +1.521872651973792756e+01 +1.520472543196120974e+01 +1.519084217450324203e+01 +1.517708082332257646e+01 +1.516344272483392253e+01 +1.514992705185228417e+01 +1.513653125927613274e+01 +1.512325144943257982e+01 +1.511008265632892567e+01 +1.509701905757285090e+01 +1.508405412238020382e+01 +1.507118070383614317e+01 +1.505839108337154819e+01 +1.504567697522906577e+01 +1.503302949849472014e+01 +1.502043912403974346e+01 +1.500789560343544338e+01 +1.499538788655655530e+01 +1.498290403416349825e+01 +1.497043113124111002e+01 +1.495795520626339759e+01 +1.494546116084511667e+01 +1.493293271343040196e+01 +1.492035235975740193e+01 +1.490770135183207756e+01 +1.489495969605333237e+01 +1.488210616996859947e+01 +1.486911835591967446e+01 +1.485597268858127151e+01 +1.484264451211947389e+01 +1.482910814142579348e+01 +1.481533692064107299e+01 +1.480130327100189191e+01 +1.478697871896024729e+01 +1.477233389459420998e+01 +1.475733848960631711e+01 +1.474196116377322419e+01 +1.472616938865011882e+01 +1.470992921773556361e+01 +1.469320497324683039e+01 +1.467595884120179939e+01 +1.465815036867291354e+01 +1.463973585984523673e+01 +1.462066767079193141e+01 +1.460089340654236878e+01 +1.458035502788951199e+01 +1.455898787928458837e+01 +1.453671965294875790e+01 +1.451346930791618739e+01 +1.448914596614460848e+01 +1.446364781125577359e+01 +1.443686101919938558e+01 +1.440865875456741030e+01 +1.437890027184731956e+01 +1.434743016795111004e+01 +1.431407784107365089e+01 +1.427865722122460390e+01 +1.424096684920887590e+01 +1.420079039262177467e+01 +1.415789769851626723e+01 +1.411204649157915014e+01 +1.406298483271723043e+01 +1.401045445486323082e+01 +1.395419508973340150e+01 +1.389394989050182438e+01 +1.382947204003752617e+01 +1.376053261092507007e+01 +1.368692970921325447e+01 +1.360849888411055630e+01 +1.352512471391306192e+01 +1.343675337603975883e+01 +1.334340586657813965e+01 +1.324519134414676635e+01 +1.314231982961904421e+01 +1.303511319548286451e+01 +1.292401303565418935e+01 +1.280958362548149232e+01 +1.269250775937398146e+01 +1.257357278362260899e+01 +1.245364352457244195e+01 +1.233361790885476417e+01 +1.221435959322093723e+01 +1.209659912768127299e+01 +1.198079049104891602e+01 +1.186690175388009294e+01 +1.175410445586656927e+01 +1.164030406441671417e+01 +1.152141690616838332e+01 +1.139024666375163797e+01 +1.123474981833818731e+01 +1.103540691691065767e+01 +1.076154242959227147e+01 +1.036723872768078536e+01 +9.789489036524889443e+00 +8.955478569536197142e+00 +7.811175166063138775e+00 +6.376811909949454460e+00 +4.801715721936095527e+00 +3.353395325296753438e+00 +2.290851499042954931e+00 +1.699408644936762247e+00 +1.467319219006890219e+00 +1.409709178353809378e+00 +1.400956213831277664e+00 +1.400072575153300525e+00 +1.400004929289705879e+00 +1.400000320250637476e+00 +1.400000020417119018e+00 +1.400000001291551444e+00 +1.400000000081488283e+00 +1.400000000005140910e+00 +1.400000000000324540e+00 +1.400000000000020339e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.050096705980504197e+00 +8.050150399523939626e+00 +8.050291902819980194e+00 +8.050576460544693447e+00 +8.051090187928732433e+00 +8.051963866628453204e+00 +8.053391966718205452e+00 +8.055658186055662640e+00 +8.059168781482616950e+00 +8.064494716856811962e+00 +8.072423042396550841e+00 +8.084016788181038748e+00 +8.100680821569792300e+00 +8.124228422567645325e+00 +8.156939718429692121e+00 +8.201598792223068202e+00 +8.261491901522031611e+00 +8.340346118227516925e+00 +8.442187801908172418e+00 +8.571105952687050333e+00 +8.730918446803588751e+00 +8.924759443598606623e+00 +9.154630877780702392e+00 +9.420983616690397966e+00 +9.722406274133520654e+00 +1.005549450180585325e+01 +1.041494802973076439e+01 +1.079390092979823024e+01 +1.118444325175189036e+01 +1.157825318418250760e+01 +1.196723989699055934e+01 +1.234410300071054323e+01 +1.270274129526536733e+01 +1.303848096453819494e+01 +1.334812973721942519e+01 +1.362988988217693453e+01 +1.388317565005958087e+01 +1.410838122174196840e+01 +1.430663748506526289e+01 +1.447958463996699585e+01 +1.462917632142302082e+01 +1.475752169133087044e+01 +1.486676549762808186e+01 +1.495900226823033208e+01 +1.503621902390588083e+01 +1.510026049760914368e+01 +1.515281126612534024e+01 +1.519539001103454012e+01 +1.522935205496136746e+01 +1.525589720780455316e+01 +1.527608072969579567e+01 +1.529082584746832474e+01 +1.530093675267057307e+01 +1.530711137858422433e+01 +1.530995352294709555e+01 +1.530998407358812230e+01 +1.530765122489063401e+01 +1.530333965954232411e+01 +1.529737872473855020e+01 +1.529004966429930157e+01 +1.528159198505070648e+01 +1.527220904242121513e+01 +1.526207293016822142e+01 +1.525132875505514640e+01 +1.524009837091856845e+01 +1.522848363910267011e+01 +1.521656927448814400e+01 +1.520442532881145326e+01 +1.519210935596433742e+01 +1.517966829765115655e+01 +1.516714012223755859e+01 +1.515455524485924066e+01 +1.514193775284447163e+01 +1.512930645718173217e+01 +1.511667578806294543e+01 +1.510405655037314432e+01 +1.509145655329769298e+01 +1.507888112689773408e+01 +1.506633353748822479e+01 +1.505381531287173580e+01 +1.504132648787376603e+01 +1.502886578013894692e+01 +1.501643070573693350e+01 +1.500401764375501834e+01 +1.499162185869070285e+01 +1.497923748907695440e+01 +1.496685751035540513e+01 +1.495447367954197837e+01 +1.494207646869223893e+01 +1.492965499355964631e+01 +1.491719694314160272e+01 +1.490468851502081904e+01 +1.489211436053227899e+01 +1.487945754282096011e+01 +1.486669950980875576e+01 +1.485382008296999778e+01 +1.484079746163590130e+01 +1.482760824132364519e+01 +1.481422744333184305e+01 +1.480062855157843771e+01 +1.478678355139927447e+01 +1.477266296379911736e+01 +1.475823586748133920e+01 +1.474346989991672707e+01 +1.472833122779709036e+01 +1.471278447652147925e+01 +1.469679260796119102e+01 +1.468031673573415397e+01 +1.466331586768141193e+01 +1.464574656626024129e+01 +1.462756251920702333e+01 +1.460871401509671763e+01 +1.458914732130118530e+01 +1.456880396523754939e+01 +1.454761992356290001e+01 +1.452552472794633331e+01 +1.450244050007009378e+01 +1.447828093245901115e+01 +1.445295023558026948e+01 +1.442634207548420378e+01 +1.439833853030013167e+01 +1.436880909850944832e+01 +1.433760979751213327e+01 +1.430458239798576514e+01 +1.426955384817953032e+01 +1.423233595261007167e+01 +1.419272538129882832e+01 +1.415050409797573927e+01 +1.410544030744937949e+01 +1.405729003219997075e+01 +1.400579943465955601e+01 +1.395070800314432979e+01 +1.389175271476875828e+01 +1.382867327695161386e+01 +1.376121852951641422e+01 +1.368915406091641884e+01 +1.361227105312233121e+01 +1.353039631729063075e+01 +1.344340341202439149e+01 +1.335122464175117329e+01 +1.325386360759048543e+01 +1.315140782107717676e+01 +1.304404068856145216e+01 +1.293205193357980676e+01 +1.281584525505370920e+01 +1.269594173425014105e+01 +1.257297722232237547e+01 +1.244769166268766369e+01 +1.232090800844562573e+01 +1.219349802153913664e+01 +1.206633156583922428e+01 +1.194020477080470855e+01 +1.181574014100808334e+01 +1.169324740700095511e+01 +1.157252683751998923e+01 +1.145258430858649312e+01 +1.133120788484986541e+01 +1.120432893625921977e+01 +1.106504860615375030e+01 +1.090216589510704814e+01 +1.069804307482759675e+01 +1.042581202403465745e+01 +1.004662804590869030e+01 +9.508949572917508419e+00 +8.753444058999662047e+00 +7.730445762647975450e+00 +6.438170922469063306e+00 +4.973917624313590302e+00 +3.554928008343220203e+00 +2.442015315782954499e+00 +1.775165622996954351e+00 +1.491129666773197693e+00 +1.414077729113623505e+00 +1.401476414438268092e+00 +1.400118198415118531e+00 +1.400008360579016342e+00 +1.400000563108163343e+00 +1.400000037167231204e+00 +1.400000002433754220e+00 +1.400000000159000502e+00 +1.400000000010391821e+00 +1.400000000000680256e+00 +1.400000000000044542e+00 +1.400000000000002798e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.040769915648063204e+00 +8.040803848767279050e+00 +8.040893291365117435e+00 +8.041073160950878318e+00 +8.041397850872819220e+00 +8.041949927631533157e+00 +8.042852159259187061e+00 +8.044283755918602452e+00 +8.046501759886758975e+00 +8.049868474189997514e+00 +8.054885603125715221e+00 +8.062235309757889823e+00 +8.072827571259663770e+00 +8.087851916788322271e+00 +8.108829762050257628e+00 +8.137661074866146649e+00 +8.176656138663460638e+00 +8.228540122750992225e+00 +8.296415803850905490e+00 +8.383669316550165007e+00 +8.493806707981210735e+00 +8.630216624378531876e+00 +8.795867064727506346e+00 +8.992960535813979916e+00 +9.222588792233283428e+00 +9.484440638747567931e+00 +9.776618772062333207e+00 +1.009561096723027873e+01 +1.043643743788719469e+01 +1.079296469973062500e+01 +1.115834480942328533e+01 +1.152551610623479128e+01 +1.188769364757176916e+01 +1.223878569066800992e+01 +1.257369308653514750e+01 +1.288847437626495029e+01 +1.318038344913748716e+01 +1.344780372177190486e+01 +1.369011104251459798e+01 +1.390749786870692262e+01 +1.410078626173437755e+01 +1.427124975069612134e+01 +1.442045641499927200e+01 +1.455013901767675932e+01 +1.466209324833894634e+01 +1.475810210015580282e+01 +1.483988280208031085e+01 +1.490905215388874971e+01 +1.496710619220878336e+01 +1.501541055463022012e+01 +1.505519849947483380e+01 +1.508757415126532386e+01 +1.511351910478166261e+01 +1.513390100144455097e+01 +1.514948308235246444e+01 +1.516093402763851472e+01 +1.516883762311825201e+01 +1.517370196559992124e+01 +1.517596804043757608e+01 +1.517601759011632367e+01 +1.517418025016307048e+01 +1.517073996589557439e+01 +1.516594072620841338e+01 +1.515999166310342972e+01 +1.515307157124169990e+01 +1.514533290278960109e+01 +1.513690529095292447e+01 +1.512789865204151596e+01 +1.511840591151406166e+01 +1.510850539477978138e+01 +1.509826291894608019e+01 +1.508773361742297858e+01 +1.507696352545075236e+01 +1.506599095126095911e+01 +1.505484765471920561e+01 +1.504355985290522391e+01 +1.503214907011693136e+01 +1.502063284818430944e+01 +1.500902533168556197e+01 +1.499733774161216360e+01 +1.498557875017429808e+01 +1.497375476872238131e+01 +1.496187016013876914e+01 +1.494992738648822694e+01 +1.493792710217377362e+01 +1.492586820230013167e+01 +1.491374783537856530e+01 +1.490156138889716964e+01 +1.488930245561617127e+01 +1.487696278771817404e+01 +1.486453224514136195e+01 +1.485199874354584537e+01 +1.483934820640889107e+01 +1.482656452471716335e+01 +1.481362952662940025e+01 +1.480052295833087328e+01 +1.478722247610280860e+01 +1.477370364839938510e+01 +1.475993996547582121e+01 +1.474590285285943736e+01 +1.473156168371849439e+01 +1.471688378398312125e+01 +1.470183442293693687e+01 +1.468637678096647647e+01 +1.467047188528056978e+01 +1.465407850376188392e+01 +1.463715298677046128e+01 +1.461964904677703814e+01 +1.460151746625601632e+01 +1.458270572539603016e+01 +1.456315754294546494e+01 +1.454281232591437423e+01 +1.452160452686493741e+01 +1.449946291104753016e+01 +1.447630973954243849e+01 +1.445205987869115383e+01 +1.442661985030392735e+01 +1.439988684132764263e+01 +1.437174769586546397e+01 +1.434207791680198696e+01 +1.431074070908204199e+01 +1.427758610229869518e+01 +1.424245019707804794e+01 +1.420515458814223742e+01 +1.416550602701928696e+01 +1.412329639894815436e+01 +1.407830310096848514e+01 +1.403028992039250689e+01 +1.397900852332372956e+01 +1.392420066983278915e+01 +1.386560127397929598e+01 +1.380294242139671290e+01 +1.373595844328638016e+01 +1.366439212242712031e+01 +1.358800207345888822e+01 +1.350657129537914258e+01 +1.341991683744768515e+01 +1.332790044803215679e+01 +1.323043998564897805e+01 +1.312752125812278159e+01 +1.301920981521114662e+01 +1.290566205044303771e+01 +1.278713477218177452e+01 +1.266399219126508235e+01 +1.253670906037942245e+01 +1.240586850882559133e+01 +1.227215296458791371e+01 +1.213632645231374774e+01 +1.199920646399885982e+01 +1.186162344362191590e+01 +1.172436554076270454e+01 +1.158810537088136172e+01 +1.145330376461854271e+01 +1.132008210870288067e+01 +1.118804905242799030e+01 +1.105605867439822809e+01 +1.092186350746922585e+01 +1.078160778617039206e+01 +1.062908441283454763e+01 +1.045466290730599290e+01 +1.024385145441333833e+01 +9.975624068262842314e+00 +9.620964011420248596e+00 +9.142584895800291989e+00 +8.497007137904970975e+00 +7.641475914404468384e+00 +6.553327731247727606e+00 +5.268879015475053329e+00 +3.926438470716661744e+00 +2.756035213296895048e+00 +1.958009643813554135e+00 +1.560376319817159185e+00 +1.429396705581029936e+00 +1.403537273728959311e+00 +1.400313854024026528e+00 +1.400023613042601811e+00 +1.400001660588873431e+00 +1.400000113505778687e+00 +1.400000007663994239e+00 +1.400000000514939558e+00 +1.400000000034547609e+00 +1.400000000002318279e+00 +1.400000000000155564e+00 +1.400000000000010347e+00 +1.400000000000000577e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.033045785284951279e+00 +8.033067192960327674e+00 +8.033123629674591371e+00 +8.033237128855516218e+00 +8.033441995047825301e+00 +8.033790279172906779e+00 +8.034359367321341594e+00 +8.035262268990210899e+00 +8.036661257033941297e+00 +8.038785532740302386e+00 +8.041953533639613738e+00 +8.046600326482183263e+00 +8.053310178388626284e+00 +8.062853808300662450e+00 +8.076228914598109654e+00 +8.094701288435929953e+00 +8.119842132811067259e+00 +8.153555185009826900e+00 +8.198085117677019085e+00 +8.255996934313271751e+00 +8.330115400885004462e+00 +8.423414881170533164e+00 +8.538854157141679835e+00 +8.679158392174201708e+00 +8.846560927698513765e+00 +9.042529454708466474e+00 +9.267511435457745250e+00 +9.520739043541437852e+00 +9.800131446773832522e+00 +1.010232086415360797e+01 +1.042280998495689026e+01 +1.075624608171687591e+01 +1.109677695500056949e+01 +1.143844085185014059e+01 +1.177553974302562700e+01 +1.210295279602674334e+01 +1.241636165385971857e+01 +1.271237673852555972e+01 +1.298856982660035619e+01 +1.324342956904223456e+01 +1.347626234948483415e+01 +1.368706146402761092e+01 +1.387636459743681883e+01 +1.404511472834344943e+01 +1.419453439151666174e+01 +1.432601861836234391e+01 +1.444104832338941868e+01 +1.454112348494677498e+01 +1.462771404299025413e+01 +1.470222577284464371e+01 +1.476597825190181545e+01 +1.482019221179771939e+01 +1.486598390847744078e+01 +1.490436454251147858e+01 +1.493624315806775904e+01 +1.496243180646140836e+01 +1.498365206425687468e+01 +1.500054224361016608e+01 +1.501366482770150945e+01 +1.502351381361604687e+01 +1.503052175671846058e+01 +1.503506639200436723e+01 +1.503747676581051351e+01 +1.503803885127341822e+01 +1.503700064761909161e+01 +1.503457678035359990e+01 +1.503095262948957611e+01 +1.502628801819509086e+01 +1.502072049625733996e+01 +1.501436825266230457e+01 +1.500733269022741467e+01 +1.499970069316581167e+01 +1.499154661610355355e+01 +1.498293402067316826e+01 +1.497391718352776024e+01 +1.496454239754664606e+01 +1.495484908617404507e+01 +1.494487074924988512e+01 +1.493463575733874116e+01 +1.492416801040836916e+01 +1.491348747571703370e+01 +1.490261061890078231e+01 +1.489155074147178581e+01 +1.488031823721402169e+01 +1.486892077926411382e+01 +1.485736344896896632e+01 +1.484564881689783000e+01 +1.483377698563864122e+01 +1.482174560321422874e+01 +1.480954985510436295e+01 +1.479718244194869037e+01 +1.478463354903110805e+01 +1.477189081260872605e+01 +1.475893928705295188e+01 +1.474576141562321219e+01 +1.473233700650544975e+01 +1.471864321452902757e+01 +1.470465452773952286e+01 +1.469034275676422219e+01 +1.467567702367570170e+01 +1.466062374585271222e+01 +1.464514660917732769e+01 +1.462920652382062592e+01 +1.461276155489605344e+01 +1.459576681945397247e+01 +1.457817434072317830e+01 +1.455993285026103834e+01 +1.454098752884784851e+01 +1.452127967764845096e+01 +1.450074631244590684e+01 +1.447931967568107048e+01 +1.445692666361761525e+01 +1.443348816915239219e+01 +1.440891834451235987e+01 +1.438312379218977100e+01 +1.435600269682285557e+01 +1.432744391521198146e+01 +1.429732604622174641e+01 +1.426551650701604324e+01 +1.423187064709194871e+01 +1.419623093722579377e+01 +1.415842627709892376e+01 +1.411827147339120891e+01 +1.407556694973325229e+01 +1.403009876102298215e+01 +1.398163899674994504e+01 +1.392994667013976517e+01 +1.387476920062797525e+01 +1.381584460447517770e+01 +1.375290451009363935e+01 +1.368567810875039825e+01 +1.361389713592666872e+01 +1.353730195243248424e+01 +1.345564875663489168e+01 +1.336871790949580152e+01 +1.327632329223583163e+01 +1.317832254169486461e+01 +1.307462791956067250e+01 +1.296521746670923747e+01 +1.285014597121981872e+01 +1.272955513805081651e+01 +1.260368219328153216e+01 +1.247286599547017794e+01 +1.233754957677679798e+01 +1.219827791872136480e+01 +1.205568970592288558e+01 +1.191050181131546637e+01 +1.176348534793365630e+01 +1.161543223882202369e+01 +1.146711131810303463e+01 +1.131921286248998726e+01 +1.117227991909635598e+01 +1.102662354704095016e+01 +1.088221685584577614e+01 +1.073855890841507055e+01 +1.059449424761195324e+01 +1.044796645919800149e+01 +1.029567416709553918e+01 +1.013259361282357318e+01 +9.951340295440326500e+00 +9.741381134009671428e+00 +9.488183452299043807e+00 +9.172381363269527910e+00 +8.769025368048673386e+00 +8.247030028162704696e+00 +7.569415530808311310e+00 +6.699488687407564314e+00 +5.625199712626685056e+00 +4.406064739222820492e+00 +3.210443696256235491e+00 +2.265197096280289646e+00 +1.702294047343053007e+00 +1.469614222385003055e+00 +1.410162193064325997e+00 +1.401037605521533447e+00 +1.400084440472983527e+00 +1.400006199095420678e+00 +1.400000435717642100e+00 +1.400000030034111997e+00 +1.400000002051914771e+00 +1.400000000139636436e+00 +1.400000000009487877e+00 +1.400000000000644285e+00 +1.400000000000043654e+00 +1.400000000000002798e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.026677128309732012e+00 +8.026690613298905319e+00 +8.026726169199445593e+00 +8.026797679539969366e+00 +8.026926751044690889e+00 +8.027146156967980062e+00 +8.027504617392539288e+00 +8.028073299827580556e+00 +8.028954479933327448e+00 +8.030292839782999792e+00 +8.032289884039723660e+00 +8.035221901583055271e+00 +8.039461763548050754e+00 +8.045504592782338094e+00 +8.053996921360354833e+00 +8.065768325345198164e+00 +8.081863648924016985e+00 +8.103572787844537828e+00 +8.132453634166799006e+00 +8.170342324525538658e+00 +8.219343651013645058e+00 +8.281793813374848767e+00 +8.360188171636943721e+00 +8.457068885328839158e+00 +8.574871711704217248e+00 +8.715737751590646454e+00 +8.881303858327331824e+00 +9.072493266987365246e+00 +9.289333691983401309e+00 +9.530831580143745541e+00 +9.794926992399197729e+00 +1.007854368234550790e+01 +1.037773495094156218e+01 +1.068791074502649430e+01 +1.100411872693580939e+01 +1.132134462155228860e+01 +1.163479652642697459e+01 +1.194014366221661838e+01 +1.223369025334574900e+01 +1.251247705212839989e+01 +1.277431376656249462e+01 +1.301775348016405687e+01 +1.324202434842203324e+01 +1.344693469969682909e+01 +1.363276604587762897e+01 +1.380016549462516018e+01 +1.395004560023748574e+01 +1.408349646315648585e+01 +1.420171225534941861e+01 +1.430593243137830228e+01 +1.439739664351391824e+01 +1.447731169241118465e+01 +1.454682856668935464e+01 +1.460702761900454050e+01 +1.465891008219009173e+01 +1.470339436547409129e+01 +1.474131583298610160e+01 +1.477342902125883661e+01 +1.480041148113563132e+01 +1.482286862467959310e+01 +1.484133911803542283e+01 +1.485630048902666189e+01 +1.486817471762617338e+01 +1.487733365293409271e+01 +1.488410415645026674e+01 +1.488877291230513400e+01 +1.489159087419277938e+01 +1.489277733890257061e+01 +1.489252364987411603e+01 +1.489099654291136510e+01 +1.488834115147590431e+01 +1.488468369188720963e+01 +1.488013385006761879e+01 +1.487478689174724167e+01 +1.486872551769015338e+01 +1.486202148479343954e+01 +1.485473701302753291e+01 +1.484692599724353990e+01 +1.483863504193619853e+01 +1.482990433615116466e+01 +1.482076838487193626e+01 +1.481125661241042657e+01 +1.480139385254434004e+01 +1.479120073937859559e+01 +1.478069401214125378e+01 +1.476988674634186083e+01 +1.475878852290851206e+01 +1.474740554606892040e+01 +1.473574071984170608e+01 +1.472379369205219568e+01 +1.471156087377915789e+01 +1.469903544107605597e+01 +1.468620732469582002e+01 +1.467306319238852197e+01 +1.465958642714541149e+01 +1.464575710354160165e+01 +1.463155196309506145e+01 +1.461694438832409304e+01 +1.460190437396143182e+01 +1.458639849258402243e+01 +1.457038985075841531e+01 +1.455383803070289694e+01 +1.453669901145715748e+01 +1.451892506266915461e+01 +1.450046460341269317e+01 +1.448126201801103363e+01 +1.446125742074880449e+01 +1.444038636170364143e+01 +1.441857946681509439e+01 +1.439576200681192653e+01 +1.437185339178930121e+01 +1.434676659107081598e+01 +1.432040748146151010e+01 +1.429267413100369666e+01 +1.426345602976113724e+01 +1.423263328384842019e+01 +1.420007579379480411e+01 +1.416564244336463041e+01 +1.412918033023634479e+01 +1.409052407567536136e+01 +1.404949525682352807e+01 +1.400590201280065195e+01 +1.395953888472218551e+01 +1.391018696001121313e+01 +1.385761440267923383e+01 +1.380157746272573505e+01 +1.374182206805323858e+01 +1.367808610936964975e+01 +1.361010253012308446e+01 +1.353760332712309378e+01 +1.346032455087780555e+01 +1.337801236607249145e+01 +1.329043019104934764e+01 +1.319736688048061701e+01 +1.309864584822724431e+01 +1.299413494862504237e+01 +1.288375684518288189e+01 +1.276749949684634444e+01 +1.264542628463790486e+01 +1.251768518764889571e+01 +1.238451630146636795e+01 +1.224625688262515055e+01 +1.210334301336142460e+01 +1.195630693089077923e+01 +1.180576907608057624e+01 +1.165242400694040015e+01 +1.149701950021148100e+01 +1.134032841481505649e+01 +1.118311317463119359e+01 +1.102608296128364174e+01 +1.086984377659294942e+01 +1.071484130414118141e+01 +1.056129576543019333e+01 +1.040912667842169625e+01 +1.025786341921330269e+01 +1.010653447073708122e+01 +9.953525054014640716e+00 +9.796389495633668787e+00 +9.631604571666091630e+00 +9.454255850080523160e+00 +9.257640877214187825e+00 +9.032742969454028881e+00 +8.767428091434437576e+00 +8.445047695137240851e+00 +8.042266443257009456e+00 +7.526422112645062334e+00 +6.855111241134791200e+00 +5.988166722264836928e+00 +4.925212569315580602e+00 +3.760755295961053513e+00 +2.698351141379730755e+00 +1.945746045844583660e+00 +1.559497644366691693e+00 +1.429583803967769073e+00 +1.403606869052235862e+00 +1.400327590033735303e+00 +1.400025344010342510e+00 +1.400001830761615329e+00 +1.400000128287945733e+00 +1.400000008862494871e+00 +1.400000000608093265e+00 +1.400000000041589310e+00 +1.400000000002840084e+00 +1.400000000000193756e+00 +1.400000000000013012e+00 +1.400000000000000799e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.021448850255890051e+00 +8.021457333076430274e+00 +8.021479703229339009e+00 +8.021524697869788056e+00 +8.021605910385579463e+00 +8.021743954211128624e+00 +8.021969470650660128e+00 +8.022327228900399732e+00 +8.022881609121709445e+00 +8.023723794742389614e+00 +8.024981020282570654e+00 +8.026828215275283895e+00 +8.029502339206182171e+00 +8.033319598577703502e+00 +8.038695552267510536e+00 +8.046167818074396294e+00 +8.056420662621865958e+00 +8.070310163486746902e+00 +8.088887866246132319e+00 +8.113419941576436756e+00 +8.145397854195582710e+00 +8.186535639683921062e+00 +8.238748293900576058e+00 +8.304105846045992223e+00 +8.384758782454939663e+00 +8.482832924660872465e+00 +8.600295744848729385e+00 +8.738801162346989670e+00 +8.899525380018740606e+00 +9.083011135848593653e+00 +9.289040504037490820e+00 +9.516555900652573285e+00 +9.763644660313934409e+00 +1.002759480501398492e+01 +1.030501974424019629e+01 +1.059203963097545298e+01 +1.088449909653596848e+01 +1.117819676819621577e+01 +1.146910205880273637e+01 +1.175353882455242527e+01 +1.202832233192461153e+01 +1.229084383327699470e+01 +1.253910428451584202e+01 +1.277170419486448516e+01 +1.298779977823016374e+01 +1.318703657086519598e+01 +1.336947097493541037e+01 +1.353548842170785349e+01 +1.368572462684330659e+01 +1.382099419646293903e+01 +1.394222892360432908e+01 +1.405042662122841257e+01 +1.414661028717505964e+01 +1.423179673759471697e+01 +1.430697349727516965e+01 +1.437308261197668990e+01 +1.443101007295578242e+01 +1.448157965644504941e+01 +1.452555013649512539e+01 +1.456361499824153505e+01 +1.459640394173228906e+01 +1.462448561369750344e+01 +1.464837113151728332e+01 +1.466851806922758072e+01 +1.468533466088292982e+01 +1.469918404423129665e+01 +1.471038842011807901e+01 +1.471923304299911628e+01 +1.472596998786885969e+01 +1.473082166094848056e+01 +1.473398403743460783e+01 +1.473562962095561701e+01 +1.473591012729288607e+01 +1.473495890031508537e+01 +1.473289307164530904e+01 +1.472981547785973611e+01 +1.472581635038940640e+01 +1.472097479404229503e+01 +1.471536007037709304e+01 +1.470903270217709569e+01 +1.470204541508155494e+01 +1.469444393209001021e+01 +1.468626763619780284e+01 +1.467755011586870850e+01 +1.466831960741524732e+01 +1.465859934764445072e+01 +1.464840784934004958e+01 +1.463775911129317997e+01 +1.462666277366457734e+01 +1.461512422846522341e+01 +1.460314469388335823e+01 +1.459072126007068526e+01 +1.457784691283738709e+01 +1.456451054050548777e+01 +1.455069692794481639e+01 +1.453638674057952862e+01 +1.452155649991912156e+01 +1.450617855095026520e+01 +1.449022102053773331e+01 +1.447364776483819782e+01 +1.445641830264540140e+01 +1.443848773058035739e+01 +1.441980661514511475e+01 +1.440032085591584199e+01 +1.437997151361849824e+01 +1.435869459658284342e+01 +1.433642079919797574e+01 +1.431307518659163058e+01 +1.428857682092148451e+01 +1.426283832647694538e+01 +1.423576539329061674e+01 +1.420725622215124773e+01 +1.417720091774554980e+01 +1.414548084104049863e+01 +1.411196793682670325e+01 +1.407652405745493418e+01 +1.403900030912715202e+01 +1.399923645264104266e+01 +1.395706039632393747e+01 +1.391228782521720575e+01 +1.386472201763452894e+01 +1.381415390824162159e+01 +1.376036246586456002e+01 +1.370311546410033898e+01 +1.364217073279229275e+01 +1.357727798729347590e+01 +1.350818133832347279e+01 +1.343462258576657220e+01 +1.335634539230640527e+01 +1.327310041473567814e+01 +1.318465143996942679e+01 +1.309078252793883657e+01 +1.299130610452558443e+01 +1.288607187566400292e+01 +1.277497635100417561e+01 +1.265797267528048309e+01 +1.253508037149096310e+01 +1.240639450624594176e+01 +1.227209369882384316e+01 +1.213244631739647694e+01 +1.198781414654470723e+01 +1.183865278063623272e+01 +1.168550801205400980e+01 +1.152900755765643659e+01 +1.136984761531168608e+01 +1.120877397146391985e+01 +1.104655768396475501e+01 +1.088396571435432669e+01 +1.072172723226292312e+01 +1.056049659352873427e+01 +1.040081411158461755e+01 +1.024306563219645483e+01 +1.008744150386902305e+01 +9.933894729226103948e+00 +9.782096944850835030e+00 +9.631389159867174143e+00 +9.480722204014664811e+00 +9.328579837615455617e+00 +9.172872218325558435e+00 +9.010776567033493833e+00 +8.838470022857055852e+00 +8.650631438084749547e+00 +8.439509614783952784e+00 +8.193246763655983145e+00 +7.893216369455729797e+00 +7.510661660760042935e+00 +7.003938161074168889e+00 +6.322166304379386759e+00 +5.428714427098138451e+00 +4.352087878811089716e+00 +3.236149118413250925e+00 +2.308605001295064518e+00 +1.730082863365649315e+00 +1.479396787316931805e+00 +1.412060247129372836e+00 +1.401272272046458101e+00 +1.400106256111905534e+00 +1.400007947496675120e+00 +1.400000566797438006e+00 +1.400000039544038621e+00 +1.400000002729726800e+00 +1.400000000187445970e+00 +1.400000000012837864e+00 +1.400000000000878098e+00 +1.400000000000060085e+00 +1.400000000000003908e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.017175184137801836e+00 +8.017180513757395488e+00 +8.017194570748980453e+00 +8.017222847356858750e+00 +8.017273886792580129e+00 +8.017360642163749773e+00 +8.017502367475323410e+00 +8.017727200280695854e+00 +8.018075625924351968e+00 +8.018605041282512502e+00 +8.019395657471715566e+00 +8.020557990734456411e+00 +8.022242181471098021e+00 +8.024649343884023622e+00 +8.028045071106488351e+00 +8.032775088414133791e+00 +8.039282843160664882e+00 +8.048128526541685090e+00 +8.060008623811917516e+00 +8.075774579508534501e+00 +8.096448554080756921e+00 +8.123233580241816298e+00 +8.157514787689343905e+00 +8.200847894347976563e+00 +8.254931055709585408e+00 +8.321556649555104102e+00 +8.402540865325381247e+00 +8.499631188984160701e+00 +8.614394966676352183e+00 +8.748095876788474001e+00 +8.901568745105040037e+00 +9.075105902105891076e+00 +9.268369376915849500e+00 +9.480342035121651634e+00 +9.709327131315816928e+00 +9.953000075142890424e+00 +1.020850945869337423e+01 +1.047261785084880970e+01 +1.074186781791092749e+01 +1.101275602440834511e+01 +1.128189846655886974e+01 +1.154617261568108333e+01 +1.180282671137471517e+01 +1.204955160574014172e+01 +1.228451542200234492e+01 +1.250636512087627317e+01 +1.271420150289400830e+01 +1.290753520398236276e+01 +1.308623110642407639e+01 +1.325044765330110863e+01 +1.340057619773024022e+01 +1.353718405143358972e+01 +1.366096353757771453e+01 +1.377268822181086350e+01 +1.387317663717603722e+01 +1.396326322467617587e+01 +1.404377584392310929e+01 +1.411551901811411014e+01 +1.417926201517115459e+01 +1.423573088923225249e+01 +1.428560367966245082e+01 +1.432950806322576298e+01 +1.436802086179370441e+01 +1.440166891202651556e+01 +1.443093089859626588e+01 +1.445623983574138549e+01 +1.447798595240644381e+01 +1.449651979438678850e+01 +1.451215540393230086e+01 +1.452517347464879727e+01 +1.453582440881476678e+01 +1.454433122686960367e+01 +1.455089229613408186e+01 +1.455568385891546512e+01 +1.455886234995841555e+01 +1.456056650048285483e+01 +1.456091923139872257e+01 +1.456002934217049649e+01 +1.455799300457753631e+01 +1.455489507254822001e+01 +1.455081022053670736e+01 +1.454580392370806052e+01 +1.453993329360837095e+01 +1.453324778310005527e+01 +1.452578977419618234e+01 +1.451759506207434747e+01 +1.450869324802238403e+01 +1.449910805339060360e+01 +1.448885756581909412e+01 +1.447795442809233712e+01 +1.446640597896403868e+01 +1.445421435420993816e+01 +1.444137655502246709e+01 +1.442788448967698400e+01 +1.441372499319310130e+01 +1.439887982850516934e+01 +1.438332567146116858e+01 +1.436703408080624556e+01 +1.434997145319194090e+01 +1.433209896220123447e+01 +1.431337247941065272e+01 +1.429374247464736847e+01 +1.427315389187327632e+01 +1.425154599658430676e+01 +1.422885219031214810e+01 +1.420499978783393225e+01 +1.417990975312347146e+01 +1.415349639101227730e+01 +1.412566699306185747e+01 +1.409632143835390750e+01 +1.406535175282126282e+01 +1.403264163436354472e+01 +1.399806595526036546e+01 +1.396149025820940004e+01 +1.392277026754666736e+01 +1.388175144272357286e+01 +1.383826860682598081e+01 +1.379214568879856451e+01 +1.374319562413819007e+01 +1.369122046526606162e+01 +1.363601175971618140e+01 +1.357735126173816909e+01 +1.351501205073354051e+01 +1.344876013757662570e+01 +1.337835664624706666e+01 +1.330356066165518136e+01 +1.322413283283409058e+01 +1.313983981115156929e+01 +1.305045958311139565e+01 +1.295578772426858372e+01 +1.285564455323743083e+01 +1.274988310253763046e+01 +1.263839774761161472e+01 +1.252113325008106948e+01 +1.239809388117479116e+01 +1.226935220249884573e+01 +1.213505700093810802e+01 +1.199543980980295288e+01 +1.185081940681388879e+01 +1.170160366879148839e+01 +1.154828819100774240e+01 +1.139145115442343936e+01 +1.123174405435549872e+01 +1.106987809491950436e+01 +1.090660630489476546e+01 +1.074270173305882281e+01 +1.057893241328261880e+01 +1.041603411724621786e+01 +1.025468218819445454e+01 +1.009546392364482870e+01 +9.938852995623335573e+00 +9.785187219221514354e+00 +9.634650584240942450e+00 +9.487259762319542489e+00 +9.342854274032374562e+00 +9.201088036637047551e+00 +9.061417452191307120e+00 +8.923077010432391987e+00 +8.785024087503888524e+00 +8.645815446547061356e+00 +8.503347534505513394e+00 +8.354339842200840138e+00 +8.193387178847835628e+00 +8.011372881767309551e+00 +7.793021593132889890e+00 +7.513689407488944205e+00 +7.136109728742139779e+00 +6.609666907799274682e+00 +5.881441055163235454e+00 +4.932733008643800154e+00 +3.837167226517830265e+00 +2.787853074041910517e+00 +2.008163145627089641e+00 +1.587178682712220290e+00 +1.436742306888908471e+00 +1.404686553169513630e+00 +1.400439575034746698e+00 +1.400034634232917297e+00 +1.400002528835105009e+00 +1.400000178483350455e+00 +1.400000012395317350e+00 +1.400000000853972137e+00 +1.400000000058595928e+00 +1.400000000004012257e+00 +1.400000000000274358e+00 +1.400000000000018785e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.013696767087546746e+00 +8.013700111829605177e+00 +8.013708935051901960e+00 +8.013726685672688532e+00 +8.013758727938343540e+00 +8.013813194426942843e+00 +8.013902174146268820e+00 +8.014043337844388049e+00 +8.014262123543780092e+00 +8.014594625797821337e+00 +8.015091350184331276e+00 +8.015822007276387495e+00 +8.016881524058888431e+00 +8.018397440712011104e+00 +8.020538830785035600e+00 +8.023526825455848055e+00 +8.027646728652696240e+00 +8.033261568841892242e+00 +8.040826734425182920e+00 +8.050905073730925565e+00 +8.064181503392186201e+00 +8.081475766645361603e+00 +8.103751539073488885e+00 +8.132119641648690944e+00 +8.167832768741547511e+00 +8.212268983678397305e+00 +8.266901412428547147e+00 +8.333252215332150215e+00 +8.412830139955078224e+00 +8.507052772169952704e+00 +8.617156889543727161e+00 +8.744102799383108859e+00 +8.888480781136886222e+00 +9.050429235642482695e+00 +9.229574396590624730e+00 +9.425000187152351216e+00 +9.635254009217257831e+00 +9.858390281591690396e+00 +1.009204903999446579e+01 +1.033356267424400521e+01 +1.058008066808615233e+01 +1.082870056353248245e+01 +1.107659348894963536e+01 +1.132111429550689330e+01 +1.155988917511621494e+01 +1.179087697045091865e+01 +1.201240362939822504e+01 +1.222317193483318931e+01 +1.242225049208893850e+01 +1.260904692310874431e+01 +1.278327040070104204e+01 +1.294488825460585701e+01 +1.309408061732213113e+01 +1.323119615558259099e+01 +1.335671100960086299e+01 +1.347119223852121905e+01 +1.357526639904650700e+01 +1.366959337926218510e+01 +1.375484526064612467e+01 +1.383168976421708507e+01 +1.390077772296390002e+01 +1.396273398403425503e+01 +1.401815115625167785e+01 +1.406758566184699966e+01 +1.411155561122430413e+01 +1.415054008586651868e+01 +1.418497948038563727e+01 +1.421527661618430827e+01 +1.424179839409473480e+01 +1.426487780088211821e+01 +1.428481612466244499e+01 +1.430188526759503098e+01 +1.431633007142302638e+01 +1.432837059339289176e+01 +1.433820428761985966e+01 +1.434600806084841551e+01 +1.435194018246031433e+01 +1.435614203708218284e+01 +1.435873971471700550e+01 +1.435984543835650484e+01 +1.435955883283508783e+01 +1.435796804150696637e+01 +1.435515069935977195e+01 +1.435117477257222873e+01 +1.434609927539936436e+01 +1.433997487572027474e+01 +1.433284440068512744e+01 +1.432474325371093826e+01 +1.431569975364918967e+01 +1.430573540632582485e+01 +1.429486511787253100e+01 +1.428309735836203131e+01 +1.427043428326067342e+01 +1.425687181914965507e+01 +1.424239971906997937e+01 +1.422700159174327439e+01 +1.421065490783604268e+01 +1.419333098539192406e+01 +1.417499495557668610e+01 +1.415560570898466786e+01 +1.413511582196564120e+01 +1.411347146177431178e+01 +1.409061226885670237e+01 +1.406647121431571890e+01 +1.404097443060490136e+01 +1.401404101386223289e+01 +1.398558279710371544e+01 +1.395550409484264698e+01 +1.392370142167051483e+01 +1.389006318999249601e+01 +1.385446939548127254e+01 +1.381679130287469803e+01 +1.377689114942044490e+01 +1.373462188844063192e+01 +1.368982700099702576e+01 +1.364234040932386627e+01 +1.359198653142706981e+01 +1.353858052194116368e+01 +1.348192874995997492e+01 +1.342182957011351796e+01 +1.335807444861549520e+01 +1.329044951117290196e+01 +1.321873758407001276e+01 +1.314272080252865038e+01 +1.306218386018803201e+01 +1.297691796826602761e+01 +1.288672558022869374e+01 +1.279142591498498582e+01 +1.269086127635598338e+01 +1.258490411725882829e+01 +1.247346473351594476e+01 +1.235649939621144000e+01 +1.223401864709775388e+01 +1.210609539500940635e+01 +1.197287237076819189e+01 +1.183456843304045414e+01 +1.169148317762738998e+01 +1.154399929655126833e+01 +1.139258216821578173e+01 +1.123777624076216064e+01 +1.108019789967703339e+01 +1.092052468674076948e+01 +1.075948095580721287e+01 +1.059782030232337213e+01 +1.043630537320344942e+01 +1.027568593105941375e+01 +1.011667628577742839e+01 +9.959933388268940035e+00 +9.806036975906209818e+00 +9.655473140224144046e+00 +9.508622535124326092e+00 +9.365754128308530824e+00 +9.227024897981319640e+00 +9.092485130452821807e+00 +8.962087818746196533e+00 +8.835698934060040699e+00 +8.713102283185030217e+00 +8.593987180706585960e+00 +8.477898098450479480e+00 +8.364109199665648475e+00 +8.251364512490148684e+00 +8.137395806233584494e+00 +8.018090712446504398e+00 +7.886165624215985659e+00 +7.729171781919240480e+00 +7.526731978866746609e+00 +7.247359008377332934e+00 +6.845962750959036391e+00 +6.266781020162883742e+00 +5.464263059796531152e+00 +4.451779376081693940e+00 +3.356723796393021875e+00 +2.405706892919428075e+00 +1.783500065558503156e+00 +1.498031442386969392e+00 +1.415779502039481885e+00 +1.401735087631726717e+00 +1.400148496232287654e+00 +1.400011234463627519e+00 +1.400000805823188976e+00 +1.400000056395810155e+00 +1.400000003899807499e+00 +1.400000000268045719e+00 +1.400000000018365665e+00 +1.400000000001256018e+00 +1.400000000000085842e+00 +1.400000000000005906e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.010877724555712120e+00 +8.010879821428282810e+00 +8.010885353742832393e+00 +8.010896485220635910e+00 +8.010916581120238078e+00 +8.010950743422245779e+00 +8.011006556898827569e+00 +8.011095111199507457e+00 +8.011232378161761147e+00 +8.011441037943326293e+00 +8.011752861191499875e+00 +8.012211765819403197e+00 +8.012877674084665003e+00 +8.013831296046721064e+00 +8.015179955946967638e+00 +8.017064554674536936e+00 +8.019667719448154486e+00 +8.023223125491099950e+00 +8.028025877463656812e+00 +8.034443704310602286e+00 +8.042928544587947925e+00 +8.054027877824269765e+00 +8.068394894423436270e+00 +8.086796304928324020e+00 +8.110116295753249105e+00 +8.139354886766735575e+00 +8.175618799281956228e+00 +8.220102979966931400e+00 +8.274061231949438877e+00 +8.338765051960551844e+00 +8.415450796986769788e+00 +8.505256674430757613e+00 +8.609152645803018089e+00 +8.727867940068547270e+00 +8.861822199827923185e+00 +9.011067020207029543e+00 +9.175244527172276676e+00 +9.353568548849237274e+00 +9.544831915566980740e+00 +9.747440735024495595e+00 +9.959473538953719896e+00 +1.017876046943989721e+01 +1.040297561292707762e+01 +1.062973450866003944e+01 +1.085668886851446935e+01 +1.108161155096810013e+01 +1.130246656984837905e+01 +1.151746103299344703e+01 +1.172507803545943261e+01 +1.192409138051387174e+01 +1.211356438165612381e+01 +1.229283583985611905e+01 +1.246149662103974975e+01 +1.261936017487192885e+01 +1.276642996281008280e+01 +1.290286622736669031e+01 +1.302895394237171622e+01 +1.314507321407005058e+01 +1.325167290393560471e+01 +1.334924783964096662e+01 +1.343831967536879368e+01 +1.351942124910319620e+01 +1.359308414871217963e+01 +1.365982912423720563e+01 +1.372015895498414118e+01 +1.377455338284769581e+01 +1.382346574647092652e+01 +1.386732098566103311e+01 +1.390651472566487712e+01 +1.394141319215351160e+01 +1.397235374733399205e+01 +1.399964587391373527e+01 +1.402357246591868289e+01 +1.404439131338922309e+01 +1.406233669186726587e+01 +1.407762098765937608e+01 +1.409043630652525891e+01 +1.410095602713580298e+01 +1.410933627179705852e+01 +1.411571727593706882e+01 +1.412022464504768848e+01 +1.412297049346235234e+01 +1.412405446378621221e+01 +1.412356462918923583e+01 +1.412157828330242282e+01 +1.411816262426859581e+01 +1.411337534071446065e+01 +1.410726510813174350e+01 +1.409987200446865963e+01 +1.409122785371278397e+01 +1.408135650595717081e+01 +1.407027406194081998e+01 +1.405798904939435268e+01 +1.404450255774916911e+01 +1.402980833692746820e+01 +1.401389286506092269e+01 +1.399673538912387372e+01 +1.397830794164522139e+01 +1.395857533591135002e+01 +1.393749514141814494e+01 +1.391501764080190817e+01 +1.389108576910846971e+01 +1.386563503608634740e+01 +1.383859343226329308e+01 +1.380988131994861767e+01 +1.377941131107137807e+01 +1.374708813500044613e+01 +1.371280850127988593e+01 +1.367646096462356198e+01 +1.363792580259042886e+01 +1.359707492010856278e+01 +1.355377179937923238e+01 +1.350787151856100010e+01 +1.345922086784195670e+01 +1.340765859685061834e+01 +1.335301583261181335e+01 +1.329511671221106539e+01 +1.323377927880575378e+01 +1.316881669345426786e+01 +1.310003881826090577e+01 +1.302725422831362145e+01 +1.295027271040547490e+01 +1.286890830486157888e+01 +1.278298294181619532e+01 +1.269233071341403019e+01 +1.259680280665176966e+01 +1.249627309573062206e+01 +1.239064435582794665e+01 +1.227985501079435515e+01 +1.216388626546723373e+01 +1.204276940106422877e+01 +1.191659293392544150e+01 +1.178550926073786975e+01 +1.164974034659038082e+01 +1.150958196648441145e+01 +1.136540599709101862e+01 +1.121766028293356854e+01 +1.106686567599459892e+01 +1.091360997170692571e+01 +1.075853863376669928e+01 +1.060234240607093703e+01 +1.044574213823181275e+01 +1.028947138366339331e+01 +1.013425754614631735e+01 +9.980802531888974372e+00 +9.829763991393651423e+00 +9.681738294637479925e+00 +9.537246365194484099e+00 +9.396723399989543424e+00 +9.260513317875282979e+00 +9.128868508343893851e+00 +9.001955072979390238e+00 +8.879863221415797980e+00 +8.762621739409393484e+00 +8.650214307993525864e+00 +8.542593670269173600e+00 +8.439686850282981823e+00 +8.341379911747615949e+00 +8.247463840265545798e+00 +8.157512966336428306e+00 +8.070652232147249805e+00 +7.985152866940995686e+00 +7.897768657800133596e+00 +7.802693848294811829e+00 +7.690004981271448159e+00 +7.543408918877773317e+00 +7.337325085749653475e+00 +7.033864556324237682e+00 +6.581703378821407213e+00 +5.924880458885743550e+00 +5.035580954260565179e+00 +3.971430469290126553e+00 +2.912654945765085657e+00 +2.091290908245503566e+00 +1.624865276854488672e+00 +1.447069638161333494e+00 +1.406323999965795046e+00 +1.400613835154337128e+00 +1.400049151133110792e+00 +1.400003612656570029e+00 +1.400000255653643277e+00 +1.400000017768563643e+00 +1.400000001223936197e+00 +1.400000000083919671e+00 +1.400000000005739986e+00 +1.400000000000392042e+00 +1.400000000000026557e+00 +1.400000000000001688e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.008602869008074165e+00 +8.008604182255531612e+00 +8.008607647662831397e+00 +8.008614621440816705e+00 +8.008627213037168957e+00 +8.008648620768019200e+00 +8.008683600087428189e+00 +8.008739105935704927e+00 +8.008825159961599383e+00 +8.008956003261873846e+00 +8.009151605054366740e+00 +8.009439606592799521e+00 +8.009857786577063266e+00 +8.010457137951807027e+00 +8.011305644623352151e+00 +8.012492838177280419e+00 +8.014135196621413826e+00 +8.016382416509094000e+00 +8.019424543058393695e+00 +8.023499876304414968e+00 +8.028903481166006273e+00 +8.035996012518038967e+00 +8.045212421615143938e+00 +8.057069939461332098e+00 +8.072174543168312510e+00 +8.091224917713757847e+00 +8.115012752105293714e+00 +8.144418090780611408e+00 +8.180398442894130540e+00 +8.223970484272999926e+00 +8.276183516710277743e+00 +8.338084408761488930e+00 +8.410674532169922557e+00 +8.494860183689533883e+00 +8.591399044493357451e+00 +8.700846228774969049e+00 +8.823504227760512464e+00 +8.959381385173907475e+00 +9.108163309775894945e+00 +9.269200789335553026e+00 +9.441516377799704429e+00 +9.623830053360347137e+00 +9.814602442179928943e+00 +1.001209235633879047e+01 +1.021442406473627251e+01 +1.041965898319262784e+01 +1.062586640449652187e+01 +1.083118844333653463e+01 +1.103389540147046333e+01 +1.123242906452641954e+01 +1.142543281123805698e+01 +1.161176866482096415e+01 +1.179052241546160040e+01 +1.196099862776342171e+01 +1.212270771198271113e+01 +1.227534732191331734e+01 +1.241878021007726396e+01 +1.255301039557070020e+01 +1.267815914982780434e+01 +1.279444193630126669e+01 +1.290214709137444871e+01 +1.300161673005111140e+01 +1.309323011254085856e+01 +1.317738951865527675e+01 +1.325450854162678738e+01 +1.332500262384429668e+01 +1.338928160506820042e+01 +1.344774403006471886e+01 +1.350077295934723232e+01 +1.354873303720665589e+01 +1.359196859022739545e+01 +1.363080255309551347e+01 +1.366553604390443866e+01 +1.369644843644860366e+01 +1.372379780096000523e+01 +1.374782160669358433e+01 +1.376873759937266684e+01 +1.378674478367658551e+01 +1.380202445575510595e+01 +1.381474124334391185e+01 +1.382504412163439689e+01 +1.383306738183819462e+01 +1.383893153659915320e+01 +1.384274415224896337e+01 +1.384460060256479430e+01 +1.384458474233783498e+01 +1.384276950185033606e+01 +1.383921740541828882e+01 +1.383398101860440477e+01 +1.382710332964478184e+01 +1.381861807115501684e+01 +1.380854998837011927e+01 +1.379691506010214219e+01 +1.378372067833798376e+01 +1.376896579200896831e+01 +1.375264101999941069e+01 +1.373472873797366844e+01 +1.371520314313480782e+01 +1.369403030062280813e+01 +1.367116817495290526e+01 +1.364656664972011590e+01 +1.362016753879140474e+01 +1.359190459241390769e+01 +1.356170350213603015e+01 +1.352948190922684546e+01 +1.349514942245519755e+01 +1.345860765272317572e+01 +1.341975027420375710e+01 +1.337846312435445384e+01 +1.333462435847886418e+01 +1.328810467834711950e+01 +1.323876765866322636e+01 +1.318647019971360201e+01 +1.313106313911410084e+01 +1.307239205991062647e+01 +1.301029833606974861e+01 +1.294462045930486305e+01 +1.287519569291367638e+01 +1.280186209855654766e+01 +1.272446098036364148e+01 +1.264283978702473554e+01 +1.255685550603188005e+01 +1.246637857421068851e+01 +1.237129731399119237e+01 +1.227152288415663861e+01 +1.216699470555268903e+01 +1.205768628508191220e+01 +1.194361131450375701e+01 +1.182482986455429597e+01 +1.170145443194042834e+01 +1.157365553139242564e+01 +1.144166646421474454e+01 +1.130578684792221900e+01 +1.116638446921891514e+01 +1.102389503531661319e+01 +1.087881945495292868e+01 +1.073171838496184982e+01 +1.058320392954653499e+01 +1.043392856929672874e+01 +1.028457161044797630e+01 +1.013582366141342916e+01 +9.988369839907523584e+00 +9.842872567357915159e+00 +9.699954899544277254e+00 +9.560185362918698360e+00 +9.424065213814653674e+00 +9.292018920948525107e+00 +9.164388504547643421e+00 +9.041432163772425312e+00 +8.923327396378434528e+00 +8.810178554820618402e+00 +8.702028467681873991e+00 +8.598873325475915763e+00 +8.500679405393915644e+00 +8.407399272900809351e+00 +8.318983628228926008e+00 +8.235382820696298012e+00 +8.156528849761500055e+00 +8.082283920309119907e+00 +8.012335456796879640e+00 +7.946007588313134029e+00 +7.881945415153629675e+00 +7.817609668507243370e+00 +7.748483732731286544e+00 +7.666866189578365187e+00 +7.560081996344580446e+00 +7.407950689984087234e+00 +7.179730258839561508e+00 +6.831426966585665284e+00 +6.307376015653067824e+00 +5.557793389202153378e+00 +4.584122922943816292e+00 +3.496945450164171909e+00 +2.516617334440700571e+00 +1.846170397984493894e+00 +1.521204987155184929e+00 +1.420738431673727931e+00 +1.402382037838209250e+00 +1.400209035618945386e+00 +1.400015972099421413e+00 +1.400001149598017802e+00 +1.400000080509872680e+00 +1.400000005563749372e+00 +1.400000000381904863e+00 +1.400000000026122127e+00 +1.400000000001783151e+00 +1.400000000000121370e+00 +1.400000000000008127e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.006775077787970929e+00 +8.006775899461011647e+00 +8.006778068079270838e+00 +8.006782432967741059e+00 +8.006790315330071905e+00 +8.006803718638801470e+00 +8.006825622406433141e+00 +8.006860385656562329e+00 +8.006914292570176173e+00 +8.006996279411142226e+00 +8.007118888634929377e+00 +8.007299502617735598e+00 +8.007561915119966400e+00 +8.007938302664875607e+00 +8.008471659535572940e+00 +8.009218757937512478e+00 +8.010253687681030854e+00 +8.011672015908374078e+00 +8.013595585070131477e+00 +8.016177934475196665e+00 +8.019610285101068214e+00 +8.024127966846085869e+00 +8.030017090372638222e+00 +8.037621171497885797e+00 +8.047347305949754670e+00 +8.059671370328057804e+00 +8.075141599485395005e+00 +8.094379774670233729e+00 +8.118079169962415520e+00 +8.146998371758517266e+00 +8.181950136218336667e+00 +8.223784611642527054e+00 +8.273366549722162233e+00 +8.331546570656881201e+00 +8.399127119310358935e+00 +8.476824411265130976e+00 +8.565228346795494829e+00 +8.664762970199378245e+00 +8.775650462847735866e+00 +8.897881780847752609e+00 +9.031196814693567276e+00 +9.175076343319883421e+00 +9.328747126219939290e+00 +9.491200332481186663e+00 +9.661222295481111999e+00 +9.837435472641290701e+00 +1.001834663087435651e+01 +1.020239877605926004e+01 +1.038802324372057662e+01 +1.057368864805876818e+01 +1.075794397279779702e+01 +1.093945386999414993e+01 +1.111702509037361075e+01 +1.128962378954868662e+01 +1.145638415328825488e+01 +1.161660931033040889e+01 +1.176976583530196940e+01 +1.191547329735587724e+01 +1.205349031145223826e+01 +1.218369843773536942e+01 +1.230608509074035162e+01 +1.242072640061144462e+01 +1.252777074219847009e+01 +1.262742343546527302e+01 +1.271993293478696252e+01 +1.280557867149905960e+01 +1.288466059462423807e+01 +1.295749036688692080e+01 +1.302438411289904252e+01 +1.308565657892341250e+01 +1.314161654399383217e+01 +1.319256331588742270e+01 +1.323878414862880604e+01 +1.328055242769298339e+01 +1.331812648239151287e+01 +1.335174890022107519e+01 +1.338164623389160113e+01 +1.340802900741722858e+01 +1.343109194245514360e+01 +1.345101433966230431e+01 +1.346796056202909853e+01 +1.348208057788332326e+01 +1.349351053055832494e+01 +1.350237330965779492e+01 +1.350877910552803485e+01 +1.351282593408313559e+01 +1.351460012364210606e+01 +1.351417675905169347e+01 +1.351162008120221714e+01 +1.350698384220887505e+01 +1.350031161813273428e+01 +1.349163708225278846e+01 +1.348098424266442130e+01 +1.346836764845530254e+01 +1.345379256897497733e+01 +1.343725515084009281e+01 +1.341874255736731136e+01 +1.339823309515701588e+01 +1.337569633261314017e+01 +1.335109321532250526e+01 +1.332437618347135633e+01 +1.329548929688746206e+01 +1.326436837390354562e+01 +1.323094115108674806e+01 +1.319512747201729397e+01 +1.315683951477793379e+01 +1.311598206968023383e+01 +1.307245288103661984e+01 +1.302614306949376655e+01 +1.297693765453509762e+01 +1.292471620014188716e+01 +1.286935361010678136e+01 +1.281072110287893473e+01 +1.274868739877394219e+01 +1.268312015453666852e+01 +1.261388768120073856e+01 +1.254086098053780596e+01 +1.246391613274051657e+01 +1.238293706296473218e+01 +1.229781870660757370e+01 +1.220847058233313298e+01 +1.211482076742316849e+01 +1.201682025146733857e+01 +1.191444762105879995e+01 +1.180771399935406407e+01 +1.169666812960158531e+01 +1.158140145106318641e+01 +1.146205297011702129e+01 +1.133881368114459143e+01 +1.121193024531422466e+01 +1.108170759684355389e+01 +1.094851012380084754e+01 +1.081276107303960110e+01 +1.067493986514131876e+01 +1.053557708175245544e+01 +1.039524700669416823e+01 +1.025455775993564522e+01 +1.011413924917805041e+01 +9.974629359854521482e+00 +9.836658988275575055e+00 +9.700836670146186336e+00 +9.567733645961363109e+00 +9.437870221016472883e+00 +9.311704216696794489e+00 +9.189622179380172895e+00 +9.071933832991504687e+00 +8.958870057600659464e+00 +8.850584476423087210e+00 +8.747158556364974302e+00 +8.648609976730080362e+00 +8.554903877843964111e+00 +8.465966426152181867e+00 +8.381699863488366375e+00 +8.301997761898306294e+00 +8.226758511068375412e+00 +8.155894008339029000e+00 +8.089328983799237704e+00 +8.026984319427562298e+00 +7.968734584545972055e+00 +7.914325611662556881e+00 +7.863231368712315650e+00 +7.814417531786795657e+00 +7.765963434163455581e+00 +7.714466046518217546e+00 +7.654108859548616195e+00 +7.575249436735675523e+00 +7.462325228330747073e+00 +7.291016646485544150e+00 +7.025119159364908938e+00 +6.614764318706349400e+00 +6.003012776169472708e+00 +5.154924451781218941e+00 +4.113242375698205500e+00 +3.043379244754204294e+00 +2.180716461160819186e+00 +1.667463799715152684e+00 +1.459613949611634265e+00 +1.408445670004734529e+00 +1.400848953253004181e+00 +1.400069086722873557e+00 +1.400005106338116034e+00 +1.400000361810606053e+00 +1.400000025129986225e+00 +1.400000001728215260e+00 +1.400000000118244881e+00 +1.400000000008067902e+00 +1.400000000000549694e+00 +1.400000000000037215e+00 +1.400000000000002354e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.005312885284830315e+00 +8.005313398895127719e+00 +8.005314754703841018e+00 +8.005317484141800222e+00 +8.005322414053951618e+00 +8.005330798519430857e+00 +8.005344503062232775e+00 +8.005366257943204999e+00 +8.005400001247270581e+00 +8.005451336889739977e+00 +8.005528137304184000e+00 +8.005641325201015235e+00 +8.005805873071315304e+00 +8.006042062627367173e+00 +8.006377048591710732e+00 +8.006846771532442730e+00 +8.007498262040869008e+00 +8.008392372582218144e+00 +8.009606962817267473e+00 +8.011240547968421666e+00 +8.013416396670187680e+00 +8.016287033456146460e+00 +8.020039060443368228e+00 +8.024898162035407623e+00 +8.031134095346708079e+00 +8.039065398372926552e+00 +8.049063470104673712e+00 +8.061555596426355663e+00 +8.077026420174219012e+00 +8.096017293759294020e+00 +8.119122922068305215e+00 +8.146984718145438009e+00 +8.180280371360026948e+00 +8.219709282204021861e+00 +8.265973758410886774e+00 +8.319756192284341267e+00 +8.381692833184958502e+00 +8.452345199603263026e+00 +8.532170593733109598e+00 +8.621493528214674740e+00 +8.720480087402487257e+00 +8.829117270793719996e+00 +8.947199171937517903e+00 +9.074321430814942246e+00 +9.209884794889987347e+00 +9.353107899411304160e+00 +9.503048618850817419e+00 +9.658632643545917773e+00 +9.818687384238840465e+00 +9.981978964065801208e+00 +1.014724995148150377e+01 +1.031325561222644005e+01 +1.047879677659659947e+01 +1.064274787152616852e+01 +1.080407918758145946e+01 +1.096187297343287348e+01 +1.111533342070451802e+01 +1.126379098312089688e+01 +1.140670174672901105e+01 +1.154364273040436117e+01 +1.167430405831999884e+01 +1.179847892708016310e+01 +1.191605221183423069e+01 +1.202698843980703280e+01 +1.213131972560197269e+01 +1.222913412568284919e+01 +1.232056474059245943e+01 +1.240577977961572209e+01 +1.248497370722404831e+01 +1.255835951463109801e+01 +1.262616210224669544e+01 +1.268861271774782651e+01 +1.274594436737248060e+01 +1.279838810222736178e+01 +1.284617007435246272e+01 +1.288950925674783932e+01 +1.292861572562697958e+01 +1.296368941025997934e+01 +1.299491922468594218e+01 +1.302248250538116814e+01 +1.304654468899021502e+01 +1.306725917398520131e+01 +1.308476731929879833e+01 +1.309919854138375150e+01 +1.311067047868363034e+01 +1.311928919911878388e+01 +1.312514943190879357e+01 +1.312833480991045931e+01 +1.312891811271245324e+01 +1.312696150407163920e+01 +1.312251675998618694e+01 +1.311562548586535293e+01 +1.310631932296353774e+01 +1.309462014558321741e+01 +1.308054025160068967e+01 +1.306408254970687643e+01 +1.304524074745402551e+01 +1.302399954482057431e+01 +1.300033483860642924e+01 +1.297421394359712288e+01 +1.294559583712920414e+01 +1.291443143448732833e+01 +1.288066390349920454e+01 +1.284422902779928144e+01 +1.280505562953444532e+01 +1.276306606380860131e+01 +1.271817679891896447e+01 +1.267029909841471813e+01 +1.261933982316255687e+01 +1.256520237383764105e+01 +1.250778779641312077e+01 +1.244699607506374939e+01 +1.238272763812184607e+01 +1.231488510295332794e+01 +1.224337528443911083e+01 +1.216811148871864390e+01 +1.208901610856379527e+01 +1.200602352884300750e+01 +1.191908333972732237e+01 +1.182816384139088051e+01 +1.173325580686546310e+01 +1.163437644939299531e+01 +1.153157351713107204e+01 +1.142492941156398167e+01 +1.131456519682569173e+01 +1.120064433610654930e+01 +1.108337595978705714e+01 +1.096301744024582270e+01 +1.083987602393395733e+01 +1.071430925708168580e+01 +1.058672394317121324e+01 +1.045757339441014011e+01 +1.032735279161515507e+01 +1.019659255086222949e+01 +1.006584971100990700e+01 +9.935697498710341691e+00 +9.806713385904869185e+00 +9.679466112656749388e+00 +9.554502285258706706e+00 +9.432333254767710784e+00 +9.313423016427885059e+00 +9.198177834981539291e+00 +9.086938194285179904e+00 +8.979973503689523184e+00 +8.877479791266528864e+00 +8.779580405565358348e+00 +8.686329564740653097e+00 +8.597718459568312710e+00 +8.513683545161228494e+00 +8.434116635091811531e+00 +8.358876408206638686e+00 +8.287800899472989258e+00 +8.220720410936328548e+00 +8.157469979569938801e+00 +8.097900022059778991e+00 +8.041883011986206142e+00 +7.989312939097369615e+00 +7.940092819345680120e+00 +7.894103415830922010e+00 +7.851142906782410336e+00 +7.810822273566871310e+00 +7.772392166578959483e+00 +7.734462300639654231e+00 +7.694554085498229945e+00 +7.648388852836945695e+00 +7.588776725225613973e+00 +7.503931266977111214e+00 +7.375011844210106027e+00 +7.173020361520308974e+00 +6.855814958261984948e+00 +6.368523729538237532e+00 +5.658191572677789161e+00 +4.715808908800633859e+00 +3.635671160668791480e+00 +2.629047752398777860e+00 +1.912412235618677459e+00 +1.547257923966133708e+00 +1.426740342547791363e+00 +1.403207994940518732e+00 +1.400288799417513053e+00 +1.400022278820780119e+00 +1.400001607649440594e+00 +1.400000112549700138e+00 +1.400000007764690357e+00 +1.400000000531708810e+00 +1.400000000036267567e+00 +1.400000000002468381e+00 +1.400000000000167555e+00 +1.400000000000011235e+00 +1.400000000000000577e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.004148304339668840e+00 +8.004148625075050205e+00 +8.004149471907123115e+00 +8.004151177069623202e+00 +8.004154257606453271e+00 +8.004159497921216726e+00 +8.004168065228906670e+00 +8.004181668481409773e+00 +8.004202773953666750e+00 +8.004234893586506416e+00 +8.004282965303040953e+00 +8.004353847716563664e+00 +8.004456954743124797e+00 +8.004605058376561999e+00 +8.004815289972153636e+00 +8.005110371448823869e+00 +8.005520107427392063e+00 +8.006083166977512988e+00 +8.006849178788923993e+00 +8.007881155593192801e+00 +8.009258251869644241e+00 +8.011078842575523495e+00 +8.013463889163082499e+00 +8.016560531892491070e+00 +8.020545814032425724e+00 +8.025630403947332070e+00 +8.032062135889052712e+00 +8.040129141007897218e+00 +8.050162289331495913e+00 +8.062536615374657600e+00 +8.077671360481744500e+00 +8.096028241514824586e+00 +8.118107557031704502e+00 +8.144441778221438000e+00 +8.175586351478742131e+00 +8.212107568990054673e+00 +8.254567544754934261e+00 +8.303506560855691276e+00 +8.359423308730624669e+00 +8.422753819873843639e+00 +8.493850129177850761e+00 +8.572959907001061808e+00 +8.660208398645533379e+00 +8.755583994902901068e+00 +8.858928610335979670e+00 +8.969933770115050109e+00 +9.088142923528350181e+00 +9.212960051509801573e+00 +9.343664166685012873e+00 +9.479428870923065631e+00 +9.619345785444858521e+00 +9.762450437873049225e+00 +9.907749097523673498e+00 +1.005424509419335521e+01 +1.020096331916385246e+01 +1.034697186009238834e+01 +1.049140002723072307e+01 +1.063345234978073961e+01 +1.077241842539674188e+01 +1.090767876803563396e+01 +1.103870700412634420e+01 +1.116506890823902154e+01 +1.128641884877873025e+01 +1.140249423910271709e+01 +1.151310857063816329e+01 +1.161814355410592725e+01 +1.171754082451108303e+01 +1.181129358534534823e+01 +1.189943848560711537e+01 +1.198204794571365994e+01 +1.205922307901048107e+01 +1.213108729646315354e+01 +1.219778063395846424e+01 +1.225945480416776867e+01 +1.231626894722209897e+01 +1.236838603524534008e+01 +1.241596987367789495e+01 +1.245918263589585528e+01 +1.249818286558905100e+01 +1.253312388256024157e+01 +1.256415253107769736e+01 +1.259140821486266226e+01 +1.261502216859489245e+01 +1.263511692199374536e+01 +1.265180591872461591e+01 +1.266519325833986009e+01 +1.267537353502338782e+01 +1.268243175196822747e+01 +1.268644329472776455e+01 +1.268747395083405749e+01 +1.268557996638924656e+01 +1.268080813324796630e+01 +1.267319590287262798e+01 +1.266277152502115122e+01 +1.264955421118304812e+01 +1.263355432418036806e+01 +1.261477359665670406e+01 +1.259320538234729803e+01 +1.256883494510533517e+01 +1.254163979169512899e+01 +1.251159005538472080e+01 +1.247864893840321265e+01 +1.244277322238926864e+01 +1.240391385705666671e+01 +1.236201663844215481e+01 +1.231702298926978223e+01 +1.226887085513605413e+01 +1.221749573133608635e+01 +1.216283183611842489e+01 +1.210481344683138083e+01 +1.204337641560224803e+01 +1.197845988060519673e+01 +1.191000818729726518e+01 +1.183797303086652164e+01 +1.176231582616174443e+01 +1.168301030420741249e+01 +1.160004532477641881e+01 +1.151342788224546965e+01 +1.142318626710950902e+01 +1.132937332828721466e+01 +1.123206976211712060e+01 +1.113138733332683472e+01 +1.102747191205278554e+01 +1.092050619018898949e+01 +1.081071192117892465e+01 +1.069835151136820706e+01 +1.058372878014026597e+01 +1.046718870268256296e+01 +1.034911595629342962e+01 +1.022993211191246132e+01 +1.011009135029772210e+01 +9.990074639576175031e+00 +9.870382388808300433e+00 +9.751525689229900706e+00 +9.634016366022992273e+00 +9.518356179971323883e+00 +9.405025627656808496e+00 +9.294472875938026846e+00 +9.187103415929625427e+00 +9.083271020641005222e+00 +8.983270531442650864e+00 +8.887332882419556768e+00 +8.795622608986976232e+00 +8.708237897926311533e+00 +8.625213047434405311e+00 +8.546523047687015762e+00 +8.472089890977432702e+00 +8.401790191351002690e+00 +8.335463735472558255e+00 +8.272922677088120125e+00 +8.213961185030555612e+00 +8.158365401881081169e+00 +8.105923507542202699e+00 +8.056435460150117578e+00 +8.009721567438067069e+00 +7.965628423237233413e+00 +7.924029900261306381e+00 +7.884819732315369478e+00 +7.847890668977143491e+00 +7.813092639277359197e+00 +7.780158248302368129e+00 +7.748577424505286082e+00 +7.717390784283562510e+00 +7.684854132284322681e+00 +7.647898612755183123e+00 +7.601266978929692719e+00 +7.536173504456506578e+00 +7.438279436402242872e+00 +7.284863831451231064e+00 +7.041554752338711864e+00 +6.660014204396062176e+00 +6.082741176368243075e+00 +5.268858053630027349e+00 +4.247796841084004349e+00 +3.169989810863195423e+00 +2.270495283372227391e+00 +1.712409347269327364e+00 +1.473795292608577556e+00 +1.411007517557850033e+00 +1.401145149721864103e+00 +1.400094715147096380e+00 +1.400007035293342028e+00 +1.400000498678351413e+00 +1.400000034580547004e+00 +1.400000002372010943e+00 +1.400000000161791824e+00 +1.400000000011001777e+00 +1.400000000000746647e+00 +1.400000000000050537e+00 +1.400000000000003242e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.003224878326017588e+00 +8.003225078416743798e+00 +8.003225606824413418e+00 +8.003226671067032783e+00 +8.003228594194021994e+00 +8.003231866452006571e+00 +8.003237217602798381e+00 +8.003245716582064517e+00 +8.003258906880015289e+00 +8.003278987932182176e+00 +8.003309054887102647e+00 +8.003353411297229769e+00 +8.003417971454329205e+00 +8.003510771119501044e+00 +8.003642607101573603e+00 +8.003827827298627184e+00 +8.004085293181203653e+00 +8.004439535972171171e+00 +8.004922125643441078e+00 +8.005573267950325089e+00 +8.006443638682890551e+00 +8.007596455738841712e+00 +8.009109778126628498e+00 +8.011079006234146149e+00 +8.013619539367335065e+00 +8.016869524533966285e+00 +8.020992604811377547e+00 +8.026180546830191886e+00 +8.032655595854398811e+00 +8.040672375207330802e+00 +8.050519116735062042e+00 +8.062517983851760661e+00 +8.077024232609076648e+00 +8.094423954060838255e+00 +8.115130158244053149e+00 +8.139577001454796346e+00 +8.168212028185369178e+00 +8.201486398999978888e+00 +8.239843204392846232e+00 +8.283704116694137198e+00 +8.333454796996347724e+00 +8.389429636923157574e+00 +8.451896557466909599e+00 +8.521042689359418887e+00 +8.596961803346937714e+00 +8.679644330915467165e+00 +8.768970710729657725e+00 +8.864708617159454462e+00 +8.966514388586787732e+00 +9.073938697097553074e+00 +9.186436215654751436e+00 +9.303378773453840012e+00 +9.424071271664081095e+00 +9.547769480439042056e+00 +9.673698765202711769e+00 +9.801072797143145721e+00 +9.929111381751376086e+00 +1.005705667517326951e+01 +1.018418723184190888e+01 +1.030982951781638945e+01 +1.043336671341126731e+01 +1.055424480046868574e+01 +1.067197607302395923e+01 +1.078614031907025428e+01 +1.089638399405982305e+01 +1.100241774573227538e+01 +1.110401265940570781e+01 +1.120099557899698262e+01 +1.129324382820066752e+01 +1.138067961461370636e+01 +1.146326435252713694e+01 +1.154099309195976097e+01 +1.161388919550951471e+01 +1.168199936292099750e+01 +1.174538906717327968e+01 +1.180413843591086298e+01 +1.185833858815549213e+01 +1.190808841805713492e+01 +1.195349180434828007e+01 +1.199465521542225410e+01 +1.203168567479811912e+01 +1.206468904942562581e+01 +1.209376862315068379e+01 +1.211902391911770671e+01 +1.214054973743353294e+01 +1.215843537765361759e+01 +1.217276401925539275e+01 +1.218361223699228368e+01 +1.219104963169770528e+01 +1.219513856060927992e+01 +1.219593395453346929e+01 +1.219348321212955533e+01 +1.218782616424767262e+01 +1.217899510361684001e+01 +1.216701487726826514e+01 +1.215190304092726059e+01 +1.213367007624797012e+01 +1.211231967323109515e+01 +1.208784908148465398e+01 +1.206024953518258513e+01 +1.202950675765873534e+01 +1.199560155254847338e+01 +1.195851048925081628e+01 +1.191820669121536369e+01 +1.187466073613313355e+01 +1.182784167748797444e+01 +1.177771819704587664e+01 +1.172425989763831211e+01 +1.166743874491545618e+01 +1.160723066544897364e+01 +1.154361730645327278e+01 +1.147658795923039321e+01 +1.140614164396417962e+01 +1.133228934743017113e+01 +1.125505639732358887e+01 +1.117448494709973339e+01 +1.109063653346947298e+01 +1.100359465518873137e+01 +1.091346730694466238e+01 +1.082038938663890448e+01 +1.072452487910422825e+01 +1.062606870536975201e+01 +1.052524811526164150e+01 +1.042232349371723110e+01 +1.031758844904171113e+01 +1.021136905575209575e+01 +1.010402213686625394e+01 +9.995932491628581218e+00 +9.887509005667334705e+00 +9.779179622090925506e+00 +9.671385204148243986e+00 +9.564572382013750484e+00 +9.459185545926652949e+00 +9.355658221534302044e+00 +9.254404135143776244e+00 +9.155808339083810310e+00 +9.060218811590335264e+00 +8.967938962331961861e+00 +8.879221455916329830e+00 +8.794263706592126084e+00 +8.713205297957097528e+00 +8.636127448254061534e+00 +8.563054488211953696e+00 +8.493957164088232759e+00 +8.428757447356041155e+00 +8.367334448278690218e+00 +8.309531012183954957e+00 +8.255160632234547435e+00 +8.204014432183559080e+00 +8.155868128842474363e+00 +8.110489031144753724e+00 +8.067643214391758022e+00 +8.027102968124324889e+00 +7.988654415909567597e+00 +7.952104827029248924e+00 +7.917288588056871745e+00 +7.884070101580776146e+00 +7.852340963033371146e+00 +7.822007543771828608e+00 +7.792963298813772255e+00 +7.765036893620027136e+00 +7.737902242833635924e+00 +7.710927669607548829e+00 +7.682926271958244513e+00 +7.651749080832552785e+00 +7.613624782708690475e+00 +7.562107226866499055e+00 +7.486452255934679556e+00 +7.369203594176350514e+00 +7.183036101321012445e+00 +6.887520269928423033e+00 +6.428621312784818187e+00 +5.750925434989027529e+00 +4.836560318140386450e+00 +3.764973949951308185e+00 +2.737081444659812401e+00 +1.978723168151238720e+00 +1.574840126581974253e+00 +1.433551954730843736e+00 +1.404196272526646139e+00 +1.400387307000283466e+00 +1.400030146617800453e+00 +1.400002178975430223e+00 +1.400000152341798643e+00 +1.400000010481279755e+00 +1.400000000715279302e+00 +1.400000000048603255e+00 +1.400000000003294609e+00 +1.400000000000222844e+00 +1.400000000000015010e+00 +1.400000000000000799e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.002495956625965690e+00 +8.002496081322593824e+00 +8.002496410701317231e+00 +8.002497074261288645e+00 +8.002498273667894679e+00 +8.002500315068976633e+00 +8.002503654366613262e+00 +8.002508959671720490e+00 +8.002517196260804155e+00 +8.002529740597358554e+00 +8.002548531354516825e+00 +8.002576266842234887e+00 +8.002616659742182392e+00 +8.002674761504742662e+00 +8.002757370059004671e+00 +8.002873535498387980e+00 +8.003035178978414876e+00 +8.003257840024454950e+00 +8.003561566602531485e+00 +8.003971960446396139e+00 +8.004521387038799674e+00 +8.005250355089046366e+00 +8.006209064110567653e+00 +8.007459110575551264e+00 +8.009075332936738789e+00 +8.011147763447413084e+00 +8.013783640163653743e+00 +8.017109415905274261e+00 +8.021272682613885152e+00 +8.026443910080107713e+00 +8.032817878363946562e+00 +8.040614664761900343e+00 +8.050080030696452837e+00 +8.061485043689540220e+00 +8.075124767288073713e+00 +8.091315860311565800e+00 +8.110392948898404342e+00 +8.132703672876036904e+00 +8.158602363329272578e+00 +8.188442380711713042e+00 +8.222567230207188160e+00 +8.261300668660584989e+00 +8.304936118148809499e+00 +8.353725795911110197e+00 +8.407870048341756331e+00 +8.467507427424703081e+00 +8.532706062169735262e+00 +8.603456849134142104e+00 +8.679668913179011014e+00 +8.761167675532062660e+00 +8.847695719444473639e+00 +8.938916476948929102e+00 +9.034420588864060520e+00 +9.133734630325088588e+00 +9.236331760356529585e+00 +9.341643757610629706e+00 +9.449073852038054611e+00 +9.558009755478504843e+00 +9.667836329645957960e+00 +9.777947400482796425e+00 +9.887756323510924261e+00 +9.996705014647167431e+00 +1.010427127429441363e+01 +1.020997434009794347e+01 +1.031337869843902588e+01 +1.041409626186319315e+01 +1.051178707697776815e+01 +1.060615876479298159e+01 +1.069696491456246079e+01 +1.078400265555283077e+01 +1.086710962208487530e+01 +1.094616050904188320e+01 +1.102106339105798760e+01 +1.109175595160240313e+01 +1.115820174046665159e+01 +1.122038655148590003e+01 +1.127831498789488229e+01 +1.133200726127653368e+01 +1.138149625196373549e+01 +1.142682484405962384e+01 +1.146804353679385713e+01 +1.150520832543446481e+01 +1.153837883905161377e+01 +1.156761671867159258e+01 +1.159298421735977058e+01 +1.161454300314805899e+01 +1.163235314613304716e+01 +1.164647227222019588e+01 +1.165695486763103084e+01 +1.166385172022647154e+01 +1.166720948577665951e+01 +1.166707036941195774e+01 +1.166347191454070042e+01 +1.165644689346325791e+01 +1.164602329571684791e+01 +1.163222441183351563e+01 +1.161506901167655492e+01 +1.159457161783400814e+01 +1.157074287568729609e+01 +1.154359002273064227e+01 +1.151311746047887397e+01 +1.147932743284682466e+01 +1.144222081518375944e+01 +1.140179801816470651e+01 +1.135806001043159874e+01 +1.131100946318579759e+01 +1.126065201879317534e+01 +1.120699768379243366e+01 +1.115006234439848676e+01 +1.108986939954982986e+01 +1.102645150263092155e+01 +1.095985239807208877e+01 +1.089012883296807210e+01 +1.081735251658226638e+01 +1.074161209211801093e+01 +1.066301507556734940e+01 +1.058168970608721793e+01 +1.049778664170319686e+01 +1.041148042392091355e+01 +1.032297062595953641e+01 +1.023248259288949491e+01 +1.014026767910718263e+01 +1.004660289041710719e+01 +9.951789845450713656e+00 +9.856152984871592082e+00 +9.760036977056861573e+00 +9.663803295527625181e+00 +9.567825975719205900e+00 +9.472486595732279469e+00 +9.378168566150840491e+00 +9.285250856220004678e+00 +9.194101325720207996e+00 +9.105069871481532573e+00 +9.018481631938103149e+00 +8.934630519187532371e+00 +8.853773361929563990e+00 +8.776124940307440170e+00 +8.701854171073092559e+00 +8.631081655529683871e+00 +8.563878732189031950e+00 +8.500268082973084560e+00 +8.440225832297581832e+00 +8.383684963625597675e+00 +8.330539773877054799e+00 +8.280651011357951674e+00 +8.233851316521297647e+00 +8.189950621055892555e+00 +8.148741263328853179e+00 +8.110002735462821022e+00 +8.073506159421516060e+00 +8.039018749949214282e+00 +8.006308606306280495e+00 +7.975150130691470274e+00 +7.945330166213800283e+00 +7.916654579882798970e+00 +7.888954504366068932e+00 +7.862090836945745842e+00 +7.835954875890899451e+00 +7.810462034807801324e+00 +7.785534281839654014e+00 +7.761064703318957037e+00 +7.736853650986891040e+00 +7.712499647720089335e+00 +7.687216334297430009e+00 +7.659529213522720426e+00 +7.626778697959034403e+00 +7.584309811013711489e+00 +7.524190365634098043e+00 +7.433242991994760018e+00 +7.290223017898642688e+00 +7.062425566376953512e+00 +6.702938181482583246e+00 +6.154002734948885056e+00 +5.369957383386246619e+00 +4.368776219632141355e+00 +3.286749710754289566e+00 +2.356179919852809501e+00 +1.757231300153542897e+00 +1.488823075975423071e+00 +1.413895114253625129e+00 +1.401492650105581328e+00 +1.400125359963347860e+00 +1.400009347306678809e+00 +1.400000662031586351e+00 +1.400000045780257496e+00 +1.400000003128475168e+00 +1.400000000212480611e+00 +1.400000000014383073e+00 +1.400000000000971578e+00 +1.400000000000065414e+00 +1.400000000000004352e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.001923180848924844e+00 +8.001923258474128886e+00 +8.001923463566882333e+00 +8.001923876860717044e+00 +8.001924624129543417e+00 +8.001925896386916648e+00 +8.001927978207323378e+00 +8.001931286838523505e+00 +8.001936425476275261e+00 +8.001944254879928664e+00 +8.001955988410104581e+00 +8.001973316547767112e+00 +8.001998567974533572e+00 +8.002034915309247154e+00 +8.002086634543296384e+00 +8.002159428018142506e+00 +8.002260821349841180e+00 +8.002400644919957173e+00 +8.002591610301159619e+00 +8.002849991141372854e+00 +8.003196416458976614e+00 +8.003656781868469849e+00 +8.004263280829976068e+00 +8.005055553476132957e+00 +8.006081944814733120e+00 +8.007400857063389665e+00 +8.009082172518207088e+00 +8.011208713731361897e+00 +8.013877697002438794e+00 +8.017202123524086232e+00 +8.021312040365311091e+00 +8.026355591412112744e+00 +8.032499767216169317e+00 +8.039930753459664459e+00 +8.048853771685090308e+00 +8.059492304506022720e+00 +8.072086602254529453e+00 +8.086891380443864463e+00 +8.104172638815532181e+00 +8.124203563913029669e+00 +8.147259518160344882e+00 +8.173612168407409229e+00 +8.203522863731285142e+00 +8.237235432572708405e+00 +8.274968628483778232e+00 +8.316908506424400827e+00 +8.363201051865399194e+00 +8.413945407446847824e+00 +8.469188042205892941e+00 +8.528918183866661451e+00 +8.593064785211684153e+00 +8.661495223633691509e+00 +8.734015843663677003e+00 +8.810374352717698088e+00 +8.890263978881762341e+00 +8.973329204877817489e+00 +9.059172812234567829e+00 +9.147363910225918104e+00 +9.237446589103733174e+00 +9.328948827698953394e+00 +9.421391300240181010e+00 +9.514295762776498577e+00 +9.607192750937016967e+00 +9.699628382189418474e+00 +9.791170121479396471e+00 +9.881411433873903860e+00 +9.969975307275113607e+00 +1.005651667929245541e+01 +1.014072384308030905e+01 +1.022231893665892422e+01 +1.030105763920388462e+01 +1.037672820701960497e+01 +1.044914998288998298e+01 +1.051817150695227454e+01 +1.058366834694019509e+01 +1.064554075225494323e+01 +1.070371122130784869e+01 +1.075812205613495287e+01 +1.080873296333364664e+01 +1.085551874656867710e+01 +1.089846712365438286e+01 +1.093757669075692895e+01 +1.097285504763050490e+01 +1.100431709094413080e+01 +1.103198347752947939e+01 +1.105587925559509621e+01 +1.107603265939486548e+01 +1.109247406129114211e+01 +1.110523507440695568e+01 +1.111434779892746150e+01 +1.111984420542146879e+01 +1.112175564916836734e+01 +1.112011251027787750e+01 +1.111494395528607271e+01 +1.110627781682777560e+01 +1.109414058886415866e+01 +1.107855753573891811e+01 +1.105955291400716689e+01 +1.103715030649241413e+01 +1.101137306834375806e+01 +1.098224488495078077e+01 +1.094979044138905877e+01 +1.091403620257297824e+01 +1.087501130244164571e+01 +1.083274853925402859e+01 +1.078728547237722779e+01 +1.073866561377390205e+01 +1.068693970469007226e+01 +1.063216706477383511e+01 +1.057441699698552817e+01 +1.051377022716818921e+01 +1.045032035203349707e+01 +1.038417526362150767e+01 +1.031545851211340548e+01 +1.024431056240693749e+01 +1.017088989341534599e+01 +1.009537388307520800e+01 +1.001795941715023552e+01 +9.938863156834836232e+00 +9.858321399719105926e+00 +9.776589471710119383e+00 +9.693940594743020611e+00 +9.610664187057633256e+00 +9.527063569600592530e+00 +9.443453073421512300e+00 +9.360154567945935256e+00 +9.277493457444775160e+00 +9.195794221246901046e+00 +9.115375600465103645e+00 +9.036545558495273411e+00 +8.959596162844999157e+00 +8.884798550896078950e+00 +8.812398151363774801e+00 +8.742610336114539749e+00 +8.675616673283146341e+00 +8.611561941628696815e+00 +8.550552046595516487e+00 +8.492652948882756903e+00 +8.437890674605881713e+00 +8.386252421135832691e+00 +8.337688705039397519e+00 +8.292116421980432861e+00 +8.249422610954518120e+00 +8.209468649289254571e+00 +8.172094566343565347e+00 +8.137123169270324752e+00 +8.104363736064334134e+00 +8.073615152204885348e+00 +8.044668535296668921e+00 +8.017309577152888167e+00 +7.991320988518235247e+00 +7.966485504277672547e+00 +7.942589848928272467e+00 +7.919429845700950210e+00 +7.896816485724778012e+00 +7.874582293870425076e+00 +7.852586783608464849e+00 +7.830719227804932459e+00 +7.808896310962799348e+00 +7.787051320438547641e+00 +7.765110099227693574e+00 +7.742946163358107370e+00 +7.720302674518839225e+00 +7.696660553452561615e+00 +7.671016923242935270e+00 +7.641517094247524788e+00 +7.604845358377835041e+00 +7.555231451504869078e+00 +7.482886889373703276e+00 +7.371631496839677666e+00 +7.195687930716252900e+00 +6.916222223048165141e+00 +6.480095872718498740e+00 +5.830078412622126116e+00 +4.940976555311184626e+00 +3.879239323813358453e+00 +2.835334754654017964e+00 +2.041199810075898124e+00 +1.602071833896104192e+00 +1.440697699206622717e+00 +1.405284416509191114e+00 +1.400498853265961241e+00 +1.400039117205122974e+00 +1.400002827817664830e+00 +1.400000197160785831e+00 +1.400000013509569152e+00 +1.400000000917562382e+00 +1.400000000062028738e+00 +1.400000000004182121e+00 +1.400000000000281464e+00 +1.400000000000018785e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.001475166083720225e+00 +8.001475214349012433e+00 +8.001475341904317418e+00 +8.001475599028566421e+00 +8.001476064085528250e+00 +8.001476856139488447e+00 +8.001478152659046827e+00 +8.001480213992426371e+00 +8.001483416748202515e+00 +8.001488298737449156e+00 +8.001495618723332370e+00 +8.001506434871821227e+00 +8.001522206484185773e+00 +8.001544924291096095e+00 +8.001577275262087952e+00 +8.001622848485778761e+00 +8.001686389148023437e+00 +8.001774107910955891e+00 +8.001894053001132434e+00 +8.002056551969884524e+00 +8.002274729309801771e+00 +8.002565104814303609e+00 +8.002948275671277756e+00 +8.003449682713364766e+00 +8.004100457944550939e+00 +8.004938346381610614e+00 +8.006008690370554959e+00 +8.007365458877151454e+00 +8.009072297865941437e+00 +8.011203570889055214e+00 +8.013845351590854094e+00 +8.017096322268404407e+00 +8.021068525281965123e+00 +8.025887907465227400e+00 +8.031694592337276006e+00 +8.038642811569095770e+00 +8.046900426592662470e+00 +8.056647974284832259e+00 +8.068077178107325054e+00 +8.081388878611342363e+00 +8.096790355257342142e+00 +8.114492035129767800e+00 +8.134703612927969729e+00 +8.157629639585550763e+00 +8.183464672369600734e+00 +8.212388115080445417e+00 +8.244558910250267658e+00 +8.280110272971080931e+00 +8.319144675124020338e+00 +8.361729296654242916e+00 +8.407892155200027418e+00 +8.457619105967030038e+00 +8.510851870651009676e+00 +8.567487209220432831e+00 +8.627377294483045134e+00 +8.690331290546032150e+00 +8.756118077044076742e+00 +8.824470005900991509e+00 +8.895087530498543060e+00 +8.967644511655819883e+00 +9.041793982798836282e+00 +9.117174148833781189e+00 +9.193414398961754941e+00 +9.270141131325845052e+00 +9.346983214492603054e+00 +9.423576944401876432e+00 +9.499570392509472327e+00 +9.574627078512223832e+00 +9.648428936810365286e+00 +9.720678577810799581e+00 +9.791100872010284561e+00 +9.859443905832170785e+00 +9.925479373279358697e+00 +9.989002476902621552e+00 +1.004983141598098229e+01 +1.010780653998099510e+01 +1.016278924220829616e+01 +1.021466066299362119e+01 +1.026332026460871027e+01 +1.030868433212048707e+01 +1.035068444616824301e+01 +1.038926596565477212e+01 +1.042438655091151922e+01 +1.045601475124452584e+01 +1.048412867500554313e+01 +1.050871475549443446e+01 +1.052976662205749037e+01 +1.054728408263182970e+01 +1.056127222160290025e+01 +1.057174061508036367e+01 +1.057870266444439267e+01 +1.058217504815940302e+01 +1.058217729129361473e+01 +1.057873145182835017e+01 +1.057186192260994417e+01 +1.056159534761845542e+01 +1.054796065103902869e+01 +1.053098917736871876e+01 +1.051071494042352406e+01 +1.048717497858095804e+01 +1.046040981285899996e+01 +1.043046400345215297e+01 +1.039738679908309749e+01 +1.036123287195360554e+01 +1.032206312916824231e+01 +1.027994558924737589e+01 +1.023495630974278825e+01 +1.018718034903515601e+01 +1.013671274216016194e+01 +1.008365946702984139e+01 +1.002813837376201356e+01 +9.970280046106495320e+00 +9.910228560304044976e+00 +9.848142103324656560e+00 +9.784193409561833477e+00 +9.718569973037720189e+00 +9.651473991405651986e+00 +9.583121998990808521e+00 +9.513744149286679885e+00 +9.443583113201192702e+00 +9.372892568293080373e+00 +9.301935266428065674e+00 +9.230980682588867836e+00 +9.160302265490560814e+00 +9.090174330269487513e+00 +9.020868653538252957e+00 +8.952650849974379099e+00 +8.885776625706267140e+00 +8.820488015623311640e+00 +8.757009718346303373e+00 +8.695545643566585881e+00 +8.636275782135005130e+00 +8.579353500616557326e+00 +8.524903350321054063e+00 +8.473019467253971371e+00 +8.423764624559058944e+00 +8.377169982359479405e+00 +8.333235559795706848e+00 +8.291931428010906657e+00 +8.253199588365850659e+00 +8.216956456131802256e+00 +8.183095818062158244e+00 +8.151492078566583643e+00 +8.122003564445391177e+00 +8.094475636901517390e+00 +8.068743377557922258e+00 +8.044633684657279460e+00 +8.021966739255359968e+00 +8.000556966836784412e+00 +7.980213797490480765e+00 +7.960742671901462231e+00 +7.941946797956089377e+00 +7.923630088921375325e+00 +7.905601487549002826e+00 +7.887680514619596295e+00 +7.869703426879274488e+00 +7.851528891445202163e+00 +7.833041637685618674e+00 +7.814152124928289034e+00 +7.794789707109412547e+00 +7.774885917454184003e+00 +7.754342790165045685e+00 +7.732977677057036203e+00 +7.710430070469285191e+00 +7.686004262244629182e+00 +7.658403287076551713e+00 +7.625281728218385346e+00 +7.582496155712577846e+00 +7.522886054497379682e+00 +7.434359696002696083e+00 +7.297074672838897769e+00 +7.079916674532963583e+00 +6.737358222741504754e+00 +6.211622329977775081e+00 +5.453227537829008043e+00 +4.470559176707212146e+00 +3.387409322997702699e+00 +2.432198026520475675e+00 +1.798419086868561889e+00 +1.503329152837500571e+00 +1.416834964409071418e+00 +1.401858763397378693e+00 +1.400158105629971672e+00 +1.400011810666673240e+00 +1.400000834385520809e+00 +1.400000057446392887e+00 +1.400000003905054191e+00 +1.400000000263703415e+00 +1.400000000017742829e+00 +1.400000000001190958e+00 +1.400000000000079625e+00 +1.400000000000005240e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.001126359995996751e+00 +8.001126389967259556e+00 +8.001126469198300839e+00 +8.001126628966030552e+00 +8.001126918041945757e+00 +8.001127410564469855e+00 +8.001128217096130868e+00 +8.001129499926189936e+00 +8.001131493967582387e+00 +8.001134534933640907e+00 +8.001139096864035238e+00 +8.001145841495540978e+00 +8.001155682431971172e+00 +8.001169867543120873e+00 +8.001190083493028737e+00 +8.001218586734843541e+00 +8.001258365677660578e+00 +8.001313338988595092e+00 +8.001388595094329759e+00 +8.001490677839145249e+00 +8.001627922888035371e+00 +8.001810848779623342e+00 +8.002052605482806058e+00 +8.002369481845862609e+00 +8.002781471408065173e+00 +8.003312893643235171e+00 +8.003993064809174385e+00 +8.004857009192503980e+00 +8.005946197695486433e+00 +8.007309296469973248e+00 +8.009002903759038006e+00 +8.011092248396920468e+00 +8.013651818727471010e+00 +8.016765886269036301e+00 +8.020528884572993178e+00 +8.025045600742624075e+00 +8.030431135394220377e+00 +8.036810586882216612e+00 +8.044318417811721744e+00 +8.053097466635588120e+00 +8.063297574816600033e+00 +8.075073810838343746e+00 +8.088584286293164283e+00 +8.103987576139015658e+00 +8.121439774483679486e+00 +8.141091238091187066e+00 +8.163083091065903574e+00 +8.187543584443846001e+00 +8.214584422122028329e+00 +8.244297178056411823e+00 +8.276749937448732553e+00 +8.311984295512900189e+00 +8.350012840618951770e+00 +8.390817234011628045e+00 +8.434346976416222219e+00 +8.480518923868235248e+00 +8.529217582807454789e+00 +8.580296180054215682e+00 +8.633578469133345479e+00 +8.688861202891985158e+00 +8.745917175563214130e+00 +8.804498716985039053e+00 +8.864341508621134125e+00 +8.925168585716557246e+00 +8.986694392089960459e+00 +9.048628762893690336e+00 +9.110680724925295237e+00 +9.172562022253128333e+00 +9.233990295436447227e+00 +9.294691863945629962e+00 +9.354404082165041601e+00 +9.412877258492239108e+00 +9.469876143734779816e+00 +9.525181008759117773e+00 +9.578588341959410002e+00 +9.629911204623585519e+00 +9.678979286904837664e+00 +9.725638709213976441e+00 +9.769751613863039807e+00 +9.811195590171644554e+00 +9.849862973442913727e+00 +9.885660054634252347e+00 +9.918506233542597528e+00 +9.948333144180399046e+00 +9.975083776956994441e+00 +9.998711618455093486e+00 +1.001917982610188851e+01 +1.003646045192892267e+01 +1.005053372690602664e+01 +1.006138741500575229e+01 +1.006901624416904895e+01 +1.007342141965147952e+01 +1.007461022377640347e+01 +1.007259570484978184e+01 +1.006739645684385920e+01 +1.005903649038039305e+01 +1.004754519448835914e+01 +1.003295738753051047e+01 +1.001531345454647592e+01 +9.994659567010742762e+00 +9.971047979620239587e+00 +9.944537397184102900e+00 +9.915193402971050674e+00 +9.883088937972610566e+00 +9.848304818471588007e+00 +9.810930277088731444e+00 +9.771063510158715104e+00 +9.728812211919841246e+00 +9.684294073670010050e+00 +9.637637223841954537e+00 +9.588980582999052871e+00 +9.538474106181597634e+00 +9.486278883993019662e+00 +9.432567073476571196e+00 +9.377521630386954854e+00 +9.321335816120187800e+00 +9.264212455554075021e+00 +9.206362926594540141e+00 +9.148005868511985383e+00 +9.089365604305601920e+00 +9.030670282341535682e+00 +8.972149754174212788e+00 +8.914033218337380049e+00 +8.856546673271191494e+00 +8.799910235463626051e+00 +8.744335390171370292e+00 +8.690022250535299975e+00 +8.637156905442765265e+00 +8.585908936390810098e+00 +8.536429178705548182e+00 +8.488847793291684596e+00 +8.443272702819538011e+00 +8.399788432595164167e+00 +8.358455383119025583e+00 +8.319309549953587180e+00 +8.282362697503883098e+00 +8.247602985852530821e+00 +8.214996041639365032e+00 +8.184486451841898713e+00 +8.155999639775695087e+00 +8.129444053546620808e+00 +8.104713559305631421e+00 +8.081689890055386627e+00 +8.060244965431857977e+00 +8.040242882894069965e+00 +8.021541401456525833e+00 +8.003992807538992338e+00 +7.987444171489337386e+00 +7.971737160729722937e+00 +7.956707741651765531e+00 +7.942186232640286114e+00 +7.927998213502959857e+00 +7.913966709031643454e+00 +7.899915830054743182e+00 +7.885675694285417592e+00 +7.871088018641738238e+00 +7.856011351801003961e+00 +7.840324564424985709e+00 +7.823926972015895487e+00 +7.806733234129660026e+00 +7.788660766416799497e+00 +7.769606578499769434e+00 +7.749408311337474764e+00 +7.727779875554174893e+00 +7.704203594458105542e+00 +7.677744830700419243e+00 +7.646732672352992033e+00 +7.608211617393364712e+00 +7.557015019006723122e+00 +7.484261818013163037e+00 +7.375013891204888594e+00 +7.205003853191322527e+00 +6.936927966508021903e+00 +6.518524439667648274e+00 +5.891134709795761815e+00 +5.023591924693659116e+00 +3.971642335899261411e+00 +2.916611644458336094e+00 +2.094261424054499887e+00 +1.626025941409148245e+00 +1.447294027531065508e+00 +1.406329693533362457e+00 +1.400608202859745521e+00 +1.400047905301856854e+00 +1.400003455950734166e+00 +1.400000239835347937e+00 +1.400000016338159403e+00 +1.400000001102568392e+00 +1.400000000074032025e+00 +1.400000000004956391e+00 +1.400000000000331202e+00 +1.400000000000022116e+00 +1.400000000000001465e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000856062162844395e+00 +8.000856080747487553e+00 +8.000856129893003654e+00 +8.000856229031386491e+00 +8.000856408480148119e+00 +8.000856714349851018e+00 +8.000857215443261339e+00 +8.000858012813578668e+00 +8.000859252833194546e+00 +8.000861144840801131e+00 +8.000863984683542540e+00 +8.000868185749901329e+00 +8.000874319393142642e+00 +8.000883166965360616e+00 +8.000895786005960630e+00 +8.000913593438360394e+00 +8.000938468903434853e+00 +8.000972881571705386e+00 +8.001020043899099932e+00 +8.001084095790330863e+00 +8.001170322475099184e+00 +8.001285409050352015e+00 +8.001437734062168516e+00 +8.001637703662755285e+00 +8.001898126754795726e+00 +8.002234630107910363e+00 +8.002666110690595858e+00 +8.003215220407529529e+00 +8.003908876083258406e+00 +8.004778784922478962e+00 +8.005861972857330144e+00 +8.007201300239318087e+00 +8.008845946347367573e+00 +8.010851841291248832e+00 +8.013282021245718312e+00 +8.016206880736637785e+00 +8.019704294122332655e+00 +8.023859577696548229e+00 +8.028765264217526010e+00 +8.034520663370862792e+00 +8.041231184908099294e+00 +8.049007406128293240e+00 +8.057963872073068856e+00 +8.068217625272675164e+00 +8.079886471969890849e+00 +8.093087003170889915e+00 +8.107932401179274606e+00 +8.124530074857894135e+00 +8.142979178996762712e+00 +8.163368084015278470e+00 +8.185771870933356453e+00 +8.210249932292306596e+00 +8.236843761803667618e+00 +8.265575013472560073e+00 +8.296443904580307560e+00 +8.329428026341764379e+00 +8.364481611737220490e+00 +8.401535292733402827e+00 +8.440496359886635602e+00 +8.481249517364817692e+00 +8.523658106994034256e+00 +8.567565757234646640e+00 +8.612798398061411120e+00 +8.659166571354225184e+00 +8.706467959085719244e+00 +8.754490048477666875e+00 +8.803012854234749440e+00 +8.851811622525032064e+00 +8.900659448929786777e+00 +8.949329752368162971e+00 +8.997598558201874042e+00 +9.045246555547118206e+00 +9.092060905551234029e+00 +9.137836788434402280e+00 +9.182378687001611084e+00 +9.225501412796210943e+00 +9.267030887937119488e+00 +9.306804700925901841e+00 +9.344672458398122217e+00 +9.380495957071067537e+00 +9.414149201200007866e+00 +9.445518290914604265e+00 +9.474501206085580662e+00 +9.501007509077144420e+00 +9.524957988057360936e+00 +9.546284260621705542e+00 +9.564928355457617215e+00 +9.580842287731446305e+00 +9.593987641876305261e+00 +9.604335173537618786e+00 +9.611864440609611648e+00 +9.616563471571907940e+00 +9.618428477701204571e+00 +9.617463614171052555e+00 +9.613680793542162206e+00 +9.607099553663172031e+00 +9.597746980525107219e+00 +9.585657685120850147e+00 +9.570873831836426149e+00 +9.553445214329959967e+00 +9.533429373229200365e+00 +9.510891748298858417e+00 +9.485905856003238767e+00 +9.458553481637840932e+00 +9.428924873458615963e+00 +9.397118924546994378e+00 +9.363243326574956171e+00 +9.327414678253342473e+00 +9.289758530145949322e+00 +9.250409346806989674e+00 +9.209510366949153592e+00 +9.167213342671260534e+00 +9.123678139760949435e+00 +9.079072182823363590e+00 +9.033569731545764370e+00 +8.987350977852022638e+00 +8.940600958075361149e+00 +8.893508279602448496e+00 +8.846263667697325417e+00 +8.799058345317082086e+00 +8.752082266509662034e+00 +8.705522232142994810e+00 +8.659559924814333343e+00 +8.614369907239483481e+00 +8.570117634508228832e+00 +8.526957534539745254e+00 +8.485031212155242031e+00 +8.444465829876497409e+00 +8.405372712687006143e+00 +8.367846214880842126e+00 +8.331962875658501133e+00 +8.297780877705076108e+00 +8.265339811306434470e+00 +8.234660737273291176e+00 +8.205746536179523432e+00 +8.178582529303323412e+00 +8.153137356958655602e+00 +8.129364099991219561e+00 +8.107201626454893173e+00 +8.086576134152402062e+00 +8.067402838372210283e+00 +8.049587723199801204e+00 +8.033029238857521293e+00 +8.017619796118934161e+00 +8.003246895447899689e+00 +7.989793747998116480e+00 +7.977139309516876331e+00 +7.965157759251802361e+00 +7.953717602527627939e+00 +7.942680728488578978e+00 +7.931901870144216105e+00 +7.921228943649154530e+00 +7.910504646638035098e+00 +7.899569456765217268e+00 +7.888265816203839265e+00 +7.876442878433589811e+00 +7.863960812235555764e+00 +7.850693375555871434e+00 +7.836527351841771960e+00 +7.821357484647571745e+00 +7.805075569048400830e+00 +7.787552158431926053e+00 +7.768608396562706631e+00 +7.747972504012444972e+00 +7.725209066009674608e+00 +7.699596402099007975e+00 +7.669907277894512987e+00 +7.634020112084969334e+00 +7.588237736560771829e+00 +7.526135470093076485e+00 +7.436692211243099315e+00 +7.301445778626865390e+00 +7.090792502119533047e+00 +6.760413942041815005e+00 +6.252429534410562262e+00 +5.514172768253193802e+00 +4.546521835457983940e+00 +3.463706411173228528e+00 +2.490828019056309017e+00 +1.830922667346252863e+00 +1.515184553295252590e+00 +1.419336549014426518e+00 +1.402177788415812643e+00 +1.400186714474036753e+00 +1.400013929891279707e+00 +1.400000979259277356e+00 +1.400000066986664127e+00 +1.400000004520892016e+00 +1.400000000302972003e+00 +1.400000000020224622e+00 +1.400000000001346834e+00 +1.400000000000089395e+00 +1.400000000000005906e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000647586310444481e+00 +8.000647597815985890e+00 +8.000647628252227861e+00 +8.000647689675171037e+00 +8.000647800905511531e+00 +8.000647990584450753e+00 +8.000648301473608726e+00 +8.000648796418547093e+00 +8.000649566512556987e+00 +8.000650742136119931e+00 +8.000652507708100103e+00 +8.000655121166561301e+00 +8.000658939397496283e+00 +8.000664451043624226e+00 +8.000672318345705136e+00 +8.000683429884830389e+00 +8.000698966293199987e+00 +8.000720481166439413e+00 +8.000749999524165545e+00 +8.000790136205951697e+00 +8.000844236534906173e+00 +8.000916541407120164e+00 +8.001012378649736689e+00 +8.001138382012074501e+00 +8.001302738494693756e+00 +8.001515463867116651e+00 +8.001788705167955484e+00 +8.002137067721594832e+00 +8.002577962751638907e+00 +8.003131970042609566e+00 +8.003823208328448402e+00 +8.004679704213424785e+00 +8.005733748515416082e+00 +8.007022227035804463e+00 +8.008586910990709740e+00 +8.010474690786173468e+00 +8.012737735598028266e+00 +8.015433560448775197e+00 +8.018624982287034797e+00 +8.022379947097634911e+00 +8.026771211421108276e+00 +8.031875863939754723e+00 +8.037774676062982238e+00 +8.044551274742262947e+00 +8.052291136035101715e+00 +8.061080404118310838e+00 +8.071004547348140434e+00 +8.082146870323008159e+00 +8.094586908391686819e+00 +8.108398738269823269e+00 +8.123649244939775471e+00 +8.140396390358155543e+00 +8.158687533247128698e+00 +8.178557851025805903e+00 +8.200028914471815256e+00 +8.223107462849705840e+00 +8.247784422019035944e+00 +8.274034200626639191e+00 +8.301814290243560990e+00 +8.331065184717767025e+00 +8.361710622672720916e+00 +8.393658145639147250e+00 +8.426799953413661726e+00 +8.461014028492483519e+00 +8.496165493330146035e+00 +8.532108158085851102e+00 +8.568686212650618472e+00 +8.605736015142152695e+00 +8.643087929605069775e+00 +8.680568168127459572e+00 +8.718000596649835288e+00 +8.755208469008744387e+00 +8.792016059811491147e+00 +8.828250173177641713e+00 +8.863741510842666926e+00 +8.898325889292054924e+00 +8.931845301242205437e+00 +8.964148821741982687e+00 +8.995093363340050274e+00 +9.024544288113885315e+00 +9.052375886903774926e+00 +9.078471737893917037e+00 +9.102724957813830287e+00 +9.125038359591012949e+00 +9.145324530369027372e+00 +9.163505843508811921e+00 +9.179514417600939780e+00 +9.193292034706423976e+00 +9.204790029073176783e+00 +9.213969156490419365e+00 +9.220799453277864544e+00 +9.225260092682939117e+00 +9.227339245192467843e+00 +9.227033947963182214e+00 +9.224349987242758786e+00 +9.219301796292178608e+00 +9.211912369933251910e+00 +9.202213195435190229e+00 +9.190244198026647382e+00 +9.176053697883244098e+00 +9.159698374008620192e+00 +9.141243229018206407e+00 +9.120761547475382258e+00 +9.098334839152858677e+00 +9.074052757441350536e+00 +9.048012982153659678e+00 +9.020321055234949981e+00 +8.991090157453426102e+00 +8.960440814076308769e+00 +8.928500517896615918e+00 +8.895403258821371395e+00 +8.861288950601229786e+00 +8.826302747197342313e+00 +8.790594243744154213e+00 +8.754316560056887297e+00 +8.717625308109429483e+00 +8.680677448814325459e+00 +8.643630047696198915e+00 +8.606638943567872957e+00 +8.569857348970780109e+00 +8.533434405763591357e+00 +8.497513723613062453e+00 +8.462231932966355785e+00 +8.427717286997252089e+00 +8.394088348594333837e+00 +8.361452798258378394e+00 +8.329906396421920434e+00 +8.299532128986127688e+00 +8.270399557859212436e+00 +8.242564389426819460e+00 +8.216068264057870607e+00 +8.190938760185407119e+00 +8.167189598623602720e+00 +8.144821027888012210e+00 +8.123820370146829006e+00 +8.104162709883963700e+00 +8.085811711997230589e+00 +8.068720560224516447e+00 +8.052833006938087124e+00 +8.038084517868039569e+00 +8.024403477819593178e+00 +8.011712396227435917e+00 +7.999929018752456322e+00 +7.988967221895722837e+00 +7.978737554392871800e+00 +7.969147306094915173e+00 +7.960100043046921314e+00 +7.951494648786918695e+00 +7.943224045741109407e+00 +7.935173909371098233e+00 +7.927221789313123601e+00 +7.919237069538051621e+00 +7.911082097320938367e+00 +7.902614574326400465e+00 +7.893690953523008424e+00 +7.884170191214950663e+00 +7.873916850810470436e+00 +7.862802327518616075e+00 +7.850702910789840949e+00 +7.837493632262852117e+00 +7.823037304096477129e+00 +7.807168468603673084e+00 +7.789671815583210090e+00 +7.770252924901816627e+00 +7.748494394942851748e+00 +7.723780324185256951e+00 +7.695154189459300298e+00 +7.661052470530023584e+00 +7.618819978713596619e+00 +7.563854546436139081e+00 +7.488161632255327049e+00 +7.378013262604628864e+00 +7.210540092810596491e+00 +6.949676392902239819e+00 +6.543583192594310205e+00 +5.932078723236354101e+00 +5.079394206673733869e+00 +4.034046833463967197e+00 +2.971625820254929717e+00 +2.130502003654608512e+00 +1.642696634233516750e+00 +1.452030219086942298e+00 +1.407099030017009422e+00 +1.400688917374864007e+00 +1.400054245207710268e+00 +1.400003892484860124e+00 +1.400000268169984574e+00 +1.400000018119711864e+00 +1.400000001212260647e+00 +1.400000000080671381e+00 +1.400000000005351630e+00 +1.400000000000354294e+00 +1.400000000000023226e+00 +1.400000000000001465e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000487548834859908e+00 +8.000487555944758356e+00 +8.000487574760445142e+00 +8.000487612749836330e+00 +8.000487681578672294e+00 +8.000487799010805645e+00 +8.000487991584659397e+00 +8.000488298329139880e+00 +8.000488775856762658e+00 +8.000489505260365064e+00 +8.000490601343235753e+00 +8.000492224830431098e+00 +8.000494598340358365e+00 +8.000498027037561855e+00 +8.000502925036023782e+00 +8.000509848770823496e+00 +8.000519538697050237e+00 +8.000532970798055032e+00 +8.000551419479061011e+00 +8.000576533472955276e+00 +8.000610426378418794e+00 +8.000655783370799412e+00 +8.000715985458111135e+00 +8.000795252383566591e+00 +8.000898804889384763e+00 +8.001033046544229421e+00 +8.001205764692095102e+00 +8.001426349302255048e+00 +8.001706027592266679e+00 +8.002058111269642282e+00 +8.002498252111045929e+00 +8.003044700396623412e+00 +8.003718559476272532e+00 +8.004544028506945352e+00 +8.005548624217066589e+00 +8.006763371484895586e+00 +8.008222951627846697e+00 +8.009965796660319270e+00 +8.012034117461974247e+00 +8.014473853879833243e+00 +8.017334535334732948e+00 +8.020669041575485991e+00 +8.024533254867476373e+00 +8.028985597140758657e+00 +8.034086448453740203e+00 +8.039897446516851787e+00 +8.046480670893965126e+00 +8.053897719744968597e+00 +8.062208691437714236e+00 +8.071471087851355364e+00 +8.081738660495437543e+00 +8.093060224440556283e+00 +8.105478468253339841e+00 +8.119028790420568242e+00 +8.133738193936506988e+00 +8.149624270667359838e+00 +8.166694305717491886e+00 +8.184944529303875171e+00 +8.204359539682492652e+00 +8.224911915631070158e+00 +8.246562031117917968e+00 +8.269258078375633758e+00 +8.292936298984784571e+00 +8.317521416100195353e+00 +8.342927254948445892e+00 +8.369057533476546240e+00 +8.395806800765072353e+00 +8.423061497687465149e+00 +8.450701112373794288e+00 +8.478599402316554290e+00 +8.506625655361315097e+00 +8.534645963221462850e+00 +8.562524483367420558e+00 +8.590124667965264749e+00 +8.617310441770001717e+00 +8.643947314314649688e+00 +8.669903415197962815e+00 +8.695050444610155083e+00 +8.719264534328878824e+00 +8.742427017183775462e+00 +8.764425105375767799e+00 +8.785152480024724042e+00 +8.804509795907160097e+00 +8.822405106553141252e+00 +8.838754215728867436e+00 +8.853480961875838773e+00 +8.866517442348509803e+00 +8.877804184328278225e+00 +8.887290269127797515e+00 +8.894933416266919579e+00 +8.900700033226035757e+00 +8.904565236186030575e+00 +8.906512846364751823e+00 +8.906535365773127211e+00 +8.904633935354377527e+00 +8.900818277550520463e+00 +8.895106624376127868e+00 +8.887525631085557265e+00 +8.878110274514211753e+00 +8.866903734176869278e+00 +8.853957253239896019e+00 +8.839329975575523690e+00 +8.823088754285949520e+00 +8.805307926386850781e+00 +8.786069047802371301e+00 +8.765460582487843766e+00 +8.743577539404936871e+00 +8.720521051268073975e+00 +8.696397889496855882e+00 +8.671319910674361253e+00 +8.645403431038710451e+00 +8.618768527120854728e+00 +8.591538262560845851e+00 +8.563837843342730238e+00 +8.535793706121866720e+00 +8.507532546901648729e+00 +8.479180299965419110e+00 +8.450861079599237158e+00 +8.422696099667387415e+00 +8.394802588441624636e+00 +8.367292718144183183e+00 +8.340272570331762836e+00 +8.313841159376679002e+00 +8.288089536703857618e+00 +8.263099997892005888e+00 +8.238945413004570284e+00 +8.215688697379864180e+00 +8.193382435491592730e+00 +8.172068664503976620e+00 +8.151778817181694947e+00 +8.132533816580311381e+00 +8.114344308423996566e+00 +8.097211012384839535e+00 +8.081125171608858793e+00 +8.066069081320669909e+00 +8.052016681893732652e+00 +8.038934208054376640e+00 +8.026780891439935672e+00 +8.015509715298406945e+00 +8.005068214436258600e+00 +7.995399298384588960e+00 +7.986442051338302761e+00 +7.978132432612442315e+00 +7.970403774099734662e+00 +7.963186958239657720e+00 +7.956410173764732363e+00 +7.949998197717217607e+00 +7.943871243210295141e+00 +7.937943531738521408e+00 +7.932121872663604023e+00 +7.926304622135450728e+00 +7.920381402255488368e+00 +7.914233856142993240e+00 +7.907737485361989727e+00 +7.900764282267418004e+00 +7.893185482585784563e+00 +7.884873415062215507e+00 +7.875701248568563351e+00 +7.865539442495217415e+00 +7.854248007784393693e+00 +7.841664467777627934e+00 +7.827588323957706429e+00 +7.811763144116999236e+00 +7.793856319002755662e+00 +7.773433252224564605e+00 +7.749915251720514320e+00 +7.722495227602524714e+00 +7.689963564313104349e+00 +7.650371443445844299e+00 +7.600415322053648559e+00 +7.534355907075759973e+00 +7.442179071624749120e+00 +7.306648462973953428e+00 +7.099276679702425596e+00 +6.776199128401160010e+00 +6.278644657044520017e+00 +5.551168388846407176e+00 +4.590277444316322786e+00 +3.505949888211125298e+00 +2.522581095886457181e+00 +1.848422477563522515e+00 +1.521635070917051191e+00 +1.420720466044768537e+00 +1.402353686969129987e+00 +1.400201813671156037e+00 +1.400014963797333589e+00 +1.400001043027972125e+00 +1.400000070674924046e+00 +1.400000004722381064e+00 +1.400000000313230242e+00 +1.400000000020690472e+00 +1.400000000001363043e+00 +1.400000000000089617e+00 +1.400000000000005906e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000365267963418958e+00 +8.000365272347558232e+00 +8.000365283955019891e+00 +8.000365307403175308e+00 +8.000365349910017798e+00 +8.000365422474050803e+00 +8.000365541537693304e+00 +8.000365731299208250e+00 +8.000366026885291859e+00 +8.000366478653038627e+00 +8.000367157956272735e+00 +8.000368164787484915e+00 +8.000369637792198674e+00 +8.000371767246079457e+00 +8.000374811684174858e+00 +8.000379118972679393e+00 +8.000385152711837478e+00 +8.000393524947694956e+00 +8.000405036243291690e+00 +8.000420724207558010e+00 +8.000441921593409944e+00 +8.000470325045114350e+00 +8.000508075488436788e+00 +8.000557851005627441e+00 +8.000622972811747502e+00 +8.000707524641800461e+00 +8.000816485464602223e+00 +8.000955874956988012e+00 +8.001132910602592574e+00 +8.001356174628728724e+00 +8.001635788273448568e+00 +8.001983590098522114e+00 +8.002413314253582044e+00 +8.002940763778854105e+00 +8.003583973239701166e+00 +8.004363354252244989e+00 +8.005301816825323158e+00 +8.006424858952920331e+00 +8.007760616587255242e+00 +8.009339866049716150e+00 +8.011195971136210403e+00 +8.013364767681467882e+00 +8.015884379191927422e+00 +8.018794958356572522e+00 +8.022138350803123430e+00 +8.025957679370160136e+00 +8.030296849381677760e+00 +8.035199977885834954e+00 +8.040710752479597545e+00 +8.046871728090472686e+00 +8.053723572812479858e+00 +8.061304276469680730e+00 +8.069648337873985611e+00 +8.078785948622064339e+00 +8.088742192617024429e+00 +8.099536281201054067e+00 +8.111180843771068183e+00 +8.123681292981684621e+00 +8.137035282121498625e+00 +8.151232270025506210e+00 +8.166253206047402458e+00 +8.182070344286428210e+00 +8.198647192600491351e+00 +8.215938598115142710e+00 +8.233890967138338013e+00 +8.252442613789252590e+00 +8.271524228403206891e+00 +8.291059454013472774e+00 +8.310965557028362483e+00 +8.331154176673241096e+00 +8.351532136866595124e+00 +8.372002303924803712e+00 +8.392464473787429213e+00 +8.412816273244930088e+00 +8.432954060839037425e+00 +8.452773814589470192e+00 +8.472171995376925224e+00 +8.491046376584703737e+00 +8.509296832385388143e+00 +8.526826078784210949e+00 +8.543540363142763994e+00 +8.559350099367073028e+00 +8.574170447228590675e+00 +8.587921835383994562e+00 +8.600530428567781271e+00 +8.611928540156272405e+00 +8.622054991852783346e+00 +8.630855422634354568e+00 +8.638282549344367567e+00 +8.644296381426634923e+00 +8.648864392288247771e+00 +8.651961649663471476e+00 +8.653570907141293844e+00 +8.653682658726964405e+00 +8.652295157945685489e+00 +8.649414402577747296e+00 +8.645054085653804066e+00 +8.639235512852895482e+00 +8.631987485952292261e+00 +8.623346151497198520e+00 +8.613354813411273625e+00 +8.602063707878974341e+00 +8.589529738522690749e+00 +8.575816169696924618e+00 +8.560992275655074479e+00 +8.545132943437204531e+00 +8.528318227603755020e+00 +8.510632855420050547e+00 +8.492165681793082399e+00 +8.473009094178239664e+00 +8.453258368800208089e+00 +8.433010980844281690e+00 +8.412365872731770722e+00 +8.391422686141256193e+00 +8.370280965010758578e+00 +8.349039338284631739e+00 +8.327794692585277048e+00 +8.306641346234997059e+00 +8.285670237082113587e+00 +8.264968137364979484e+00 +8.244616909351396572e+00 +8.224692815687598468e+00 +8.205265898228294219e+00 +8.186399438512578897e+00 +8.168149511878812774e+00 +8.150564645330792501e+00 +8.133685586545443158e+00 +8.117545187786532779e+00 +8.102168404037611182e+00 +8.087572399675549306e+00 +8.073766753009881114e+00 +8.060753743758288792e+00 +8.048528705894515412e+00 +8.037080428052757242e+00 +8.026391586208186268e+00 +8.016439198405995725e+00 +8.007195097687642260e+00 +7.998626424922637312e+00 +7.990696145203430412e+00 +7.983363586851251803e+00 +7.976584988882975402e+00 +7.970314021271687643e+00 +7.964502215517792472e+00 +7.959099218054991098e+00 +7.954052766332327273e+00 +7.949308298341531298e+00 +7.944808149763639804e+00 +7.940490372441669109e+00 +7.936287313486551476e+00 +7.932124202291902293e+00 +7.927918068842934041e+00 +7.923577324329892591e+00 +7.919002232191584945e+00 +7.914086271315908583e+00 +7.908718086393420776e+00 +7.902783349498490928e+00 +7.896165509236051427e+00 +7.888744192138508637e+00 +7.880390156793958489e+00 +7.870956072943736892e+00 +7.860263136664235262e+00 +7.848085050026542220e+00 +7.834131869567475093e+00 +7.818035194120849241e+00 +7.799333432080461037e+00 +7.777450887679528968e+00 +7.751654056703570994e+00 +7.720946225393499951e+00 +7.683837779549079983e+00 +7.637906826274972971e+00 +7.579018537392692600e+00 +7.499952297729745254e+00 +7.388003257972651561e+00 +7.221239187050743524e+00 +6.963825570709086143e+00 +6.562903077611197844e+00 +5.956055036554896098e+00 +5.105110155095507807e+00 +4.057467707473754182e+00 +2.989277477034710362e+00 +2.140959993128675354e+00 +1.647208789252533334e+00 +1.453274265355357198e+00 +1.407291911061412382e+00 +1.400706141006594629e+00 +1.400055149605273108e+00 +1.400003915857631398e+00 +1.400000266723786080e+00 +1.400000017810634212e+00 +1.400000001177316822e+00 +1.400000000077393780e+00 +1.400000000005071188e+00 +1.400000000000331646e+00 +1.400000000000021672e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000272259030493771e+00 +8.000272261726767198e+00 +8.000272268869197845e+00 +8.000272283306378185e+00 +8.000272309494837586e+00 +8.000272354230258287e+00 +8.000272427679387732e+00 +8.000272544815832276e+00 +8.000272727392728100e+00 +8.000273006621265282e+00 +8.000273426766360885e+00 +8.000274049919889663e+00 +8.000274962267367229e+00 +8.000276282225222246e+00 +8.000278170891505169e+00 +8.000280845320773437e+00 +8.000284595201456739e+00 +8.000289803576990266e+00 +8.000296972306285781e+00 +8.000306752998810111e+00 +8.000319984178778654e+00 +8.000337735424944086e+00 +8.000361359190305777e+00 +8.000392550922921231e+00 +8.000433417978539907e+00 +8.000486557632596529e+00 +8.000555144259060114e+00 +8.000643025444709622e+00 +8.000754826449574253e+00 +8.000896062010671272e+00 +8.001073254022506021e+00 +8.001294053123734429e+00 +8.001567361687548896e+00 +8.001903455170150892e+00 +8.002314098236860573e+00 +8.002812651581480807e+00 +8.003414164906773820e+00 +8.004135451169135607e+00 +8.004995136936489786e+00 +8.006013683592593466e+00 +8.007213374169248610e+00 +8.008618260823222812e+00 +8.010254068415468609e+00 +8.012148050308406155e+00 +8.014328793377142546e+00 +8.016825970327188244e+00 +8.019670038709055149e+00 +8.022891887491773844e+00 +8.026522433663878076e+00 +8.030592173021483759e+00 +8.035130691017856819e+00 +8.040166141218769269e+00 +8.045724700458547929e+00 +8.051830011147847799e+00 +8.058502622272930793e+00 +8.065759441382843065e+00 +8.073613210232730708e+00 +8.082072016702703365e+00 +8.091138855126537521e+00 +8.100811246249310926e+00 +8.111080926717660233e+00 +8.121933616341619810e+00 +8.133348869423624450e+00 +8.145300014313184178e+00 +8.157754183109258150e+00 +8.170672431193997554e+00 +8.184009944135040016e+00 +8.197716327523908220e+00 +8.211735973595528648e+00 +8.226008497051193302e+00 +8.240469231417035800e+00 +8.255049776524682414e+00 +8.269678587293535443e+00 +8.284281593901971164e+00 +8.298782843621465233e+00 +8.313105155008015501e+00 +8.327170775749316078e+00 +8.340902036202903602e+00 +8.354221991481303178e+00 +8.367055045801251367e+00 +8.379327553678345808e+00 +8.390968393385838553e+00 +8.401909508884866540e+00 +8.412086417157539131e+00 +8.421438678524769017e+00 +8.429910328103161987e+00 +8.437450267048655306e+00 +8.444012612650769967e+00 +8.449557006683342308e+00 +8.454048881689839590e+00 +8.457459685088227985e+00 +8.459767061127092092e+00 +8.460954990816803800e+00 +8.461013890002968552e+00 +8.459940665751394917e+00 +8.457738731182461223e+00 +8.454417978837422964e+00 +8.449994712590688906e+00 +8.444491538052416146e+00 +8.437937211347859900e+00 +8.430366446127882440e+00 +8.421819678673111653e+00 +8.412342791017264787e+00 +8.401986792147480898e+00 +8.390807457555009563e+00 +8.378864927720483635e+00 +8.366223266534237979e+00 +8.352949981179550676e+00 +8.339115505645690263e+00 +8.324792650780999281e+00 +8.310056024627684224e+00 +8.294981427672693641e+00 +8.279645228566568704e+00 +8.264123726759065036e+00 +8.248492509327302713e+00 +8.232825809979933851e+00 +8.217195878767439510e+00 +8.201672371384827187e+00 +8.186321767105498637e+00 +8.171206824336332275e+00 +8.156386082546077887e+00 +8.141913418902520405e+00 +8.127837667352734385e+00 +8.114202307060089936e+00 +8.101045225999429888e+00 +8.088398564006190838e+00 +8.076288637569957629e+00 +8.064735946091612817e+00 +8.053755256217295155e+00 +8.043355757418085616e+00 +8.033541278577905231e+00 +8.024310552575226296e+00 +8.015657514349003421e+00 +8.007571618372853806e+00 +8.000038164132261542e+00 +7.993038622904130364e+00 +7.986550964896570903e+00 +7.980549990868766486e+00 +7.975007674264604773e+00 +7.969893516169286762e+00 +7.965174904370219799e+00 +7.960817449087988606e+00 +7.956785244415740088e+00 +7.953040982863721631e+00 +7.949545836908927576e+00 +7.946259030199160911e+00 +7.943137057893386199e+00 +7.940132580244359417e+00 +7.937193106615871407e+00 +7.934259681882425141e+00 +7.931265849220106467e+00 +7.928137168231343956e+00 +7.924791476887145691e+00 +7.921139884929099040e+00 +7.917088171282882669e+00 +7.912537913816941604e+00 +7.907386424376805500e+00 +7.901524189978396784e+00 +7.894828692426891337e+00 +7.887154140621662535e+00 +7.878317261113157777e+00 +7.868080639438664647e+00 +7.856136764337336764e+00 +7.842096372118086300e+00 +7.825480709644172528e+00 +7.805712144867777980e+00 +7.782094010221791258e+00 +7.753753105025094072e+00 +7.719490768208313369e+00 +7.677460623350805591e+00 +7.624607269456972425e+00 +7.555701731957421785e+00 +7.461534417356798343e+00 +7.325638905071999218e+00 +7.119464572822876924e+00 +6.797537532861698040e+00 +6.298238821168481216e+00 +5.564154677208161814e+00 +4.593515786871050999e+00 +3.501106753979009945e+00 +2.515046799582232762e+00 +1.842883570615579281e+00 +1.519285442517222862e+00 +1.420165335211793334e+00 +1.402271040396569468e+00 +1.400192264406306952e+00 +1.400014055272302826e+00 +1.400000965841395439e+00 +1.400000064519109966e+00 +1.400000004249990271e+00 +1.400000000277890289e+00 +1.400000000018094104e+00 +1.400000000001174971e+00 +1.400000000000076072e+00 +1.400000000000004796e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000201812507061305e+00 +8.000201814159698444e+00 +8.000201818540340071e+00 +8.000201827401523857e+00 +8.000201843487497300e+00 +8.000201870986327179e+00 +8.000201916168588667e+00 +8.000201988277019893e+00 +8.000202100750348322e+00 +8.000202272887236177e+00 +8.000202532083310558e+00 +8.000202916805644549e+00 +8.000203480504952225e+00 +8.000204296705573981e+00 +8.000205465556629036e+00 +8.000207122172954044e+00 +8.000209447140319341e+00 +8.000212679603228239e+00 +8.000217133392814262e+00 +8.000223216683298944e+00 +8.000231455684346571e+00 +8.000242522879005946e+00 +8.000257270298186896e+00 +8.000276768278222761e+00 +8.000302350073438262e+00 +8.000335662587040986e+00 +8.000378723337778553e+00 +8.000433983594895437e+00 +8.000504397389237354e+00 +8.000593495845441439e+00 +8.000705465981891251e+00 +8.000845232797464845e+00 +8.001018543114373216e+00 +8.001232049285079029e+00 +8.001493390510582060e+00 +8.001811269171664520e+00 +8.002195519260217438e+00 +8.002657163731521806e+00 +8.003208457398663711e+00 +8.003862911874376707e+00 +8.004635299050887554e+00 +8.005541629709544083e+00 +8.006599104081386642e+00 +8.007826031546155576e+00 +8.009241717163961383e+00 +8.010866313379613857e+00 +8.012720636016233300e+00 +8.014825944567707694e+00 +8.017203687787338495e+00 +8.019875216624285486e+00 +8.022861467646119848e+00 +8.026182621165510511e+00 +8.029857739319197663e+00 +8.033904390283721497e+00 +8.038338265611349343e+00 +8.043172798291227110e+00 +8.048418789550497721e+00 +8.054084052581911735e+00 +8.060173081302258069e+00 +8.066686751905640662e+00 +8.073622064385334696e+00 +8.080971930378288093e+00 +8.088725012669170766e+00 +8.096865620517725404e+00 +8.105373663692564179e+00 +8.114224666759016102e+00 +8.123389843831457569e+00 +8.132836232712385538e+00 +8.142526886146697507e+00 +8.152421116857334837e+00 +8.162474792125438583e+00 +8.172640672951724028e+00 +8.182868792292406823e+00 +8.193106866499995533e+00 +8.203300733905054543e+00 +8.213394814431971724e+00 +8.223332584227533104e+00 +8.233057059471322603e+00 +8.242511283806937428e+00 +8.251638814158923196e+00 +8.260384200061851701e+00 +8.268693452006942834e+00 +8.276514494694575674e+00 +8.283797601457594695e+00 +8.290495806483519914e+00 +8.296565291809546494e+00 +8.301965746390543188e+00 +8.306660694846621951e+00 +8.310617793783730889e+00 +8.313809093849107157e+00 +8.316211265934636998e+00 +8.317805790176521441e+00 +8.318579106620875407e+00 +8.318522726633753805e+00 +8.317633304332998634e+00 +8.315912667511064171e+00 +8.313367807706166346e+00 +8.310010829267982402e+00 +8.305858857458314759e+00 +8.300933905832270199e+00 +8.295262703366642398e+00 +8.288876482045324678e+00 +8.281810725881856072e+00 +8.274104882661594829e+00 +8.265802040024928132e+00 +8.256948567891280177e+00 +8.247593729643147853e+00 +8.237789264948871093e+00 +8.227588947597984870e+00 +8.217048122244763775e+00 +8.206223224489543000e+00 +8.195171289252945357e+00 +8.183949452888997556e+00 +8.172614454908677217e+00 +8.161222145513834292e+00 +8.149827005343608377e+00 +8.138481683889766671e+00 +8.127236562934625042e+00 +8.116139351110041034e+00 +8.105234715287645386e+00 +8.094563954016171792e+00 +8.084164717648009812e+00 +8.074070779156407696e+00 +8.064311858923204568e+00 +8.054913505926171169e+00 +8.045897036695945914e+00 +8.037279532052158615e+00 +8.029073889894856819e+00 +8.021288930224175218e+00 +8.013929546197189779e+00 +8.006996892702625601e+00 +8.000488602042921116e+00 +7.994399015428947486e+00 +7.988719419574001890e+00 +7.983438280056510905e+00 +7.978541467116387231e+00 +7.974012474465847156e+00 +7.969832636040761642e+00 +7.965981347452585126e+00 +7.962436296160943172e+00 +7.959173695271305249e+00 +7.956168500267536636e+00 +7.953394568917034668e+00 +7.950824703028204432e+00 +7.948430502539545195e+00 +7.946181964132339459e+00 +7.944046785304015756e+00 +7.941989395013099085e+00 +7.939969801875620625e+00 +7.937942428377856352e+00 +7.935855173936409379e+00 +7.933648933294326078e+00 +7.931257708862702316e+00 +7.928609323249236063e+00 +7.925626413402579118e+00 +7.922227083266682790e+00 +7.918324228711010271e+00 +7.913822567924818863e+00 +7.908612068891524238e+00 +7.902556992230597821e+00 +7.895481662337881623e+00 +7.887154167408041872e+00 +7.877269876443030228e+00 +7.865440439273867490e+00 +7.851190602901904292e+00 +7.833957149082955596e+00 +7.813076971759746137e+00 +7.787752354056068249e+00 +7.756966122148013731e+00 +7.719251051705801281e+00 +7.672258408281172670e+00 +7.612079871268957909e+00 +7.532035547592498936e+00 +7.420042995013682585e+00 +7.253899734953028755e+00 +6.995441305547066335e+00 +6.587495951061719701e+00 +5.964353845711399593e+00 +5.091032683851535623e+00 +4.024670059082013474e+00 +2.951315607887726955e+00 +2.112271227433909715e+00 +1.632934383830210390e+00 +1.449031090124142107e+00 +1.406569236603819162e+00 +1.400622583324838022e+00 +1.400047617185030902e+00 +1.400003318413744813e+00 +1.400000222091751123e+00 +1.400000014579681373e+00 +1.400000000947705381e+00 +1.400000000061270455e+00 +1.400000000003948530e+00 +1.400000000000253708e+00 +1.400000000000016120e+00 +1.400000000000001021e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000148642572284530e+00 +8.000148643580564212e+00 +8.000148646255397011e+00 +8.000148651671068478e+00 +8.000148661511511605e+00 +8.000148678348979914e+00 +8.000148706038157087e+00 +8.000148750265768882e+00 +8.000148819307570491e+00 +8.000148925058983451e+00 +8.000149084422737644e+00 +8.000149321156925453e+00 +8.000149668309958884e+00 +8.000150171394661669e+00 +8.000150892482016829e+00 +8.000151915425080418e+00 +8.000153352454278277e+00 +8.000155352415374566e+00 +8.000158110949103119e+00 +8.000161882934520463e+00 +8.000166997534179814e+00 +8.000173876185302291e+00 +8.000183053874351913e+00 +8.000195204009431293e+00 +8.000211167163032044e+00 +8.000231983893646870e+00 +8.000258931766733639e+00 +8.000293566581428095e+00 +8.000337767668808553e+00 +8.000393786960644960e+00 +8.000464301336117856e+00 +8.000552467541130142e+00 +8.000661978745165825e+00 +8.000797121560497160e+00 +8.000962832105599887e+00 +8.001164749458181902e+00 +8.001409264623472239e+00 +8.001703562951830051e+00 +8.002055657787822796e+00 +8.002474413032599543e+00 +8.002969552263914821e+00 +8.003551652093564783e+00 +8.004232117558940374e+00 +8.005023137549830636e+00 +8.005937618566955294e+00 +8.006989095494612130e+00 +8.008191618542412016e+00 +8.009559616062185583e+00 +8.011107733563378019e+00 +8.012850649917229617e+00 +8.014802872436607828e+00 +8.016978513221081570e+00 +8.019391049840271180e+00 +8.022053074065835787e+00 +8.024976032926927516e+00 +8.028169966830537518e+00 +8.031643249834500509e+00 +8.035402337369127679e+00 +8.039451526761123290e+00 +8.043792735814509598e+00 +8.048425304448823425e+00 +8.053345823992907881e+00 +8.058547998198076101e+00 +8.064022539388062683e+00 +8.069757102430532569e+00 +8.075736258424708325e+00 +8.081941509182021477e+00 +8.088351342761333385e+00 +8.094941329534869112e+00 +8.101684257529681688e+00 +8.108550305131478453e+00 +8.115507248666922635e+00 +8.122520701905255436e+00 +8.129554384142828383e+00 +8.136570413252494305e+00 +8.143529619887464932e+00 +8.150391878916503074e+00 +8.157116454123011451e+00 +8.163662352212620377e+00 +8.169988682230444610e+00 +8.176055016579770296e+00 +8.181821749949454770e+00 +8.187250452590848937e+00 +8.192304214531663575e+00 +8.196947977470765423e+00 +8.201148851263168282e+00 +8.204876412077894088e+00 +8.208102979494006135e+00 +8.210803869992378878e+00 +8.212957624504152676e+00 +8.214546207891952889e+00 +8.215555178467459641e+00 +8.215973825889095750e+00 +8.215795276036343964e+00 +8.215016561722174870e+00 +8.213638658382025781e+00 +8.211666484166084246e+00 +8.209108864161031249e+00 +8.205978458777236639e+00 +8.202291656657520136e+00 +8.198068432792974036e+00 +8.193332172869716601e+00 +8.188109465216449223e+00 +8.182429862075485616e+00 +8.176325612277679511e+00 +8.169831367762750318e+00 +8.162983866748268369e+00 +8.155821596709452947e+00 +8.148384440683059893e+00 +8.140713310744526865e+00 +8.132849772818477874e+00 +8.124835667254981075e+00 +8.116712729821863093e+00 +8.108522217908099350e+00 +8.100304546787038262e+00 +8.092098940735239054e+00 +8.083943103634322114e+00 +8.075872913399845032e+00 +8.067922144195176060e+00 +8.060122219922524422e+00 +8.052502001967463130e+00 +8.045087613636582091e+00 +8.037902303187561159e+00 +8.030966346802589584e+00 +8.024296992265437467e+00 +8.017908443406755126e+00 +8.011811884501060632e+00 +8.006015542666466089e+00 +8.000524784904653686e+00 +7.995342244810942134e+00 +7.990467972345229875e+00 +7.985899598745797690e+00 +7.981632508049878894e+00 +7.977660007224490535e+00 +7.973973488792502451e+00 +7.970562583092432263e+00 +7.967415301278142792e+00 +7.964518173828199821e+00 +7.961856391126128862e+00 +7.959413950714981922e+00 +7.957173808711734075e+00 +7.955118021260508598e+00 +7.953227843402376429e+00 +7.951483740540740364e+00 +7.949865250696646513e+00 +7.948350644029460454e+00 +7.946916345909393442e+00 +7.945536129325748043e+00 +7.944180148988942314e+00 +7.942813965582247171e+00 +7.941397726092713327e+00 +7.939885701649512129e+00 +7.938226356836124431e+00 +7.936362823112895981e+00 +7.934233575553754747e+00 +7.931772921702139989e+00 +7.928910010741336833e+00 +7.925565714975058462e+00 +7.921646502260752953e+00 +7.917033905742798972e+00 +7.911570382988227124e+00 +7.905043696327273217e+00 +7.897172825178802924e+00 +7.887595521032900514e+00 +7.875863300218150620e+00 +7.861450211569485980e+00 +7.843746614128155770e+00 +7.822025549502520825e+00 +7.795378158619052478e+00 +7.762603126706100198e+00 +7.721866503090974554e+00 +7.670098867030471723e+00 +7.602233469352917439e+00 +7.509398200161208514e+00 +7.374850795233487410e+00 +7.167306655068712118e+00 +6.835231740067150952e+00 +6.310523209098105824e+00 +5.538459356771714859e+00 +4.530679350199536159e+00 +3.420455319812094164e+00 +2.445377733193992764e+00 +1.801696793167749222e+00 +1.503754514893880456e+00 +1.416814237586875969e+00 +1.401826432256685351e+00 +1.400149546766956021e+00 +1.400010651868791811e+00 +1.400000715912185667e+00 +1.400000046855391256e+00 +1.400000003026579343e+00 +1.400000000194147942e+00 +1.400000000012405099e+00 +1.400000000000790390e+00 +1.400000000000050093e+00 +1.400000000000003020e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000108595094456376e+00 +8.000108595705397008e+00 +8.000108597328004834e+00 +8.000108600617373611e+00 +8.000108606601640915e+00 +8.000108616852978471e+00 +8.000108633729711372e+00 +8.000108660714408515e+00 +8.000108702880144307e+00 +8.000108767526191045e+00 +8.000108865035199912e+00 +8.000109010016631217e+00 +8.000109222815924070e+00 +8.000109531485518843e+00 +8.000109974332092477e+00 +8.000110603174142909e+00 +8.000111487464341309e+00 +8.000112719451523802e+00 +8.000114420576270646e+00 +8.000116749310771880e+00 +8.000119910666256828e+00 +8.000124167597929770e+00 +8.000129854536211838e+00 +8.000137393261876895e+00 +8.000147311319503629e+00 +8.000160263126490534e+00 +8.000177053881923683e+00 +8.000198666309751516e+00 +8.000226290183027444e+00 +8.000261354470561415e+00 +8.000305561824758271e+00 +8.000360924991744227e+00 +8.000429804574439530e+00 +8.000514947420198197e+00 +8.000619524741704680e+00 +8.000747168918744379e+00 +8.000902007776181435e+00 +8.001088694997076090e+00 +8.001312435217316832e+00 +8.001579002267140694e+00 +8.001894748983225725e+00 +8.002266607019539180e+00 +8.002702075141771232e+00 +8.003209194603682519e+00 +8.003796510376341544e+00 +8.004473017234055021e+00 +8.005248089991432892e+00 +8.006131397530262817e+00 +8.007132800645356596e+00 +8.008262234165460569e+00 +8.009529574256424311e+00 +8.010944492274898465e+00 +8.012516296995885412e+00 +8.014253767469952550e+00 +8.016164979158826753e+00 +8.018257126335438301e+00 +8.020536344001525819e+00 +8.023007532760562555e+00 +8.025674190176948386e+00 +8.028538252148720744e+00 +8.031599947719250565e+00 +8.034857670556528220e+00 +8.038307870043736258e+00 +8.041944964562750542e+00 +8.045761279126907084e+00 +8.049747009047051094e+00 +8.053890210812873818e+00 +8.058176820857800848e+00 +8.062590702366870588e+00 +8.067113719798571836e+00 +8.071725840336178237e+00 +8.076405261071675667e+00 +8.081128560362285995e+00 +8.085870871489534650e+00 +8.090606076493910948e+00 +8.095307017852366727e+00 +8.099945725507147642e+00 +8.104493656637218990e+00 +8.108921945482093108e+00 +8.113201660476056176e+00 +8.117304065923626410e+00 +8.121200885439971984e+00 +8.124864564390144039e+00 +8.128268528586520603e+00 +8.131387436544279979e+00 +8.134197422650570886e+00 +8.136676328675797265e+00 +8.138803921146616105e+00 +8.140562092212050516e+00 +8.141935041768137538e+00 +8.142909438764226238e+00 +8.143474559796285206e+00 +8.143622403299445978e+00 +8.143347777883136018e+00 +8.142648363606317830e+00 +8.141524745265794394e+00 +8.139980417065114437e+00 +8.138021758342304679e+00 +8.135657980358711683e+00 +8.132901044484739828e+00 +8.129765552457691058e+00 +8.126268609728144909e+00 +8.122429663250015253e+00 +8.118270315401581172e+00 +8.113814116046052405e+00 +8.109086335046560734e+00 +8.104113717838124842e+00 +8.098924226923932324e+00 +8.093546772401312595e+00 +8.088010934828860243e+00 +8.082346683914529706e+00 +8.076584096627350107e+00 +8.070753078404029779e+00 +8.064883091125853554e+00 +8.059002891471562791e+00 +8.053140283100853836e+00 +8.047321885888251813e+00 +8.041572925112511427e+00 +8.035917043125676784e+00 +8.030376135599103904e+00 +8.024970213997788093e+00 +8.019717295494888987e+00 +8.014633321122868637e+00 +8.009732102566257339e+00 +8.005025297610078638e+00 +8.000522413818885070e+00 +7.996230839470923613e+00 +7.992155900042997807e+00 +7.988300937615267827e+00 +7.984667409454002218e+00 +7.981255000896327445e+00 +7.978061746691015976e+00 +7.975084154507825929e+00 +7.972317324673221961e+00 +7.969755061643323479e+00 +7.967389975150364734e+00 +7.965213572130698694e+00 +7.963216343559360588e+00 +7.961387851924635051e+00 +7.959716823896975768e+00 +7.958191248256643036e+00 +7.956798467914630635e+00 +7.955525245747240959e+00 +7.954357764019230892e+00 +7.953281515900630261e+00 +7.952281039404230256e+00 +7.951339464529939782e+00 +7.950437876069632814e+00 +7.949554547408328453e+00 +7.948664136013250392e+00 +7.947737009362971783e+00 +7.946738866142728064e+00 +7.945630678992332996e+00 +7.944369074493375038e+00 +7.942907012482425699e+00 +7.941193570442020011e+00 +7.939173773508081844e+00 +7.936785556621089199e+00 +7.933953338991201143e+00 +7.930580450011095905e+00 +7.926535941541668073e+00 +7.921637923099290823e+00 +7.915643349610716584e+00 +7.908238128655574961e+00 +7.899028957500372705e+00 +7.887543238041331506e+00 +7.873241000751645124e+00 +7.855506418077304431e+00 +7.833516884317774931e+00 +7.806248104887588468e+00 +7.772300306637966116e+00 +7.729282872418115069e+00 +7.672980024301979007e+00 +7.596292632340746032e+00 +7.486934000160598401e+00 +7.320437062540481321e+00 +7.051832470243300399e+00 +6.612452333984345287e+00 +5.935879711074496967e+00 +5.000575225629891207e+00 +3.891036298221385525e+00 +2.819386200287594679e+00 +2.021578731884901892e+00 +1.591245743513830968e+00 +1.437555868655963742e+00 +1.404740409908766585e+00 +1.400426027836293219e+00 +1.400031344845578340e+00 +1.400002122086188905e+00 +1.400000138551433126e+00 +1.400000008890669223e+00 +1.400000000565484015e+00 +1.400000000035794390e+00 +1.400000000002259215e+00 +1.400000000000142242e+00 +1.400000000000008793e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000078404853089964e+00 +8.000078405219211319e+00 +8.000078406193290803e+00 +8.000078408171576783e+00 +8.000078411776902598e+00 +8.000078417962845023e+00 +8.000078428161440769e+00 +8.000078444489744811e+00 +8.000078470035093758e+00 +8.000078509244616498e+00 +8.000078568451238326e+00 +8.000078656576519620e+00 +8.000078786059928504e+00 +8.000078974074774862e+00 +8.000079244102799692e+00 +8.000079627952169758e+00 +8.000080168317047935e+00 +8.000080921990432969e+00 +8.000081963855059541e+00 +8.000083391788837872e+00 +8.000085332630744617e+00 +8.000087949359009798e+00 +8.000091449634586738e+00 +8.000096095857974987e+00 +8.000102216874912742e+00 +8.000110221445183356e+00 +8.000120613557246685e+00 +8.000134009628931508e+00 +8.000151157580152272e+00 +8.000172957697367693e+00 +8.000200485131655270e+00 +8.000235013783580484e+00 +8.000278041230293624e+00 +8.000331314245556769e+00 +8.000396854354882237e+00 +8.000476982759220590e+00 +8.000574343856033721e+00 +8.000691926490912209e+00 +8.000833081991180151e+00 +8.001001537970680033e+00 +8.001201406856946363e+00 +8.001437188083489360e+00 +8.001713762914851813e+00 +8.002036380933880366e+00 +8.002410637321549558e+00 +8.002842440200257812e+00 +8.003337967491331639e+00 +8.003903612953756408e+00 +8.004545921319801138e+00 +8.005271512718381999e+00 +8.006086996870946493e+00 +8.006998877848539919e+00 +8.008013450482518891e+00 +8.009136689814400967e+00 +8.010374135241637106e+00 +8.011730771255225036e+00 +8.013210906862132887e+00 +8.014818055932339647e+00 +8.016554820800211090e+00 +8.018422781478795613e+00 +8.020422392811578760e+00 +8.022552891790153851e+00 +8.024812217111643164e+00 +8.027196942842225624e+00 +8.029702227800926906e+00 +8.032321781990104270e+00 +8.035047851086474680e+00 +8.037871219679885826e+00 +8.040781233616836943e+00 +8.043765841481926415e+00 +8.046811654941231851e+00 +8.049904027383993466e+00 +8.053027150037651793e+00 +8.056164164499183045e+00 +8.059297290423774740e+00 +8.062407966939735715e+00 +8.065477006214029743e+00 +8.068484757473488145e+00 +8.071411279689222340e+00 +8.074236521053013149e+00 +8.076940503311714536e+00 +8.079503508976717541e+00 +8.081906269389250497e+00 +8.084130151598174052e+00 +8.086157341995740211e+00 +8.087971024659697861e+00 +8.089555552369160907e+00 +8.090896608299152248e+00 +8.091981356456878771e+00 +8.092798579003922299e+00 +8.093338798714446725e+00 +8.093594384951231291e+00 +8.093559641699657803e+00 +8.093230876384142292e+00 +8.092606448400985641e+00 +8.091686796534238724e+00 +8.090474444674445209e+00 +8.088973985530540034e+00 +8.087192042309011342e+00 +8.085137208627168448e+00 +8.082819967224258662e+00 +8.080252588330045782e+00 +8.077449008840359213e+00 +8.074424693727587865e+00 +8.071196481376622600e+00 +8.067782414778552180e+00 +8.064201560731699914e+00 +8.060473819388853656e+00 +8.056619726647541668e+00 +8.052660252004008257e+00 +8.048616594577806538e+00 +8.044509980058840881e+00 +8.040361461327645287e+00 +8.036191725447888956e+00 +8.032020909622632487e+00 +8.027868428539781220e+00 +8.023752815307256370e+00 +8.019691577899703105e+00 +8.015701072716673536e+00 +8.011796396504180962e+00 +8.007991297538213260e+00 +8.004298106631331677e+00 +8.000727688217198263e+00 +7.997289411495724032e+00 +7.993991141368326225e+00 +7.990839248624113544e+00 +7.987838638501874478e+00 +7.984992796303303386e+00 +7.982303848123910583e+00 +7.979772634034192791e+00 +7.977398790231378101e+00 +7.975180835992548900e+00 +7.973116260872519234e+00 +7.971201607818295898e+00 +7.969432548818406126e+00 +7.967803951543896090e+00 +7.966309937792050988e+00 +7.964943936927045165e+00 +7.963698739038720831e+00 +7.962566552363842476e+00 +7.961539065044822117e+00 +7.960607507101782332e+00 +7.959762693865156891e+00 +7.958995028500338798e+00 +7.958294424156668434e+00 +7.957650113721241425e+00 +7.957050316171584647e+00 +7.956481762652160228e+00 +7.955929106230824388e+00 +7.955374305424162351e+00 +7.954796089722858454e+00 +7.954169602156337504e+00 +7.953466386744219463e+00 +7.952654723630926625e+00 +7.951699686052321248e+00 +7.950564182286989023e+00 +7.949207225539640653e+00 +7.947582332131329252e+00 +7.945634133310160330e+00 +7.943287958993317410e+00 +7.940440538421387195e+00 +7.936953333000676736e+00 +7.932628477644731113e+00 +7.927204130616326339e+00 +7.920371262686270342e+00 +7.911736518940830187e+00 +7.900834739965611142e+00 +7.887153822831509231e+00 +7.870075694636970098e+00 +7.848686570094487003e+00 +7.821785669760639159e+00 +7.787827239659758760e+00 +7.743248652246513153e+00 +7.681402396829383861e+00 +7.592557605208071436e+00 +7.459072295576301137e+00 +7.245668071424039347e+00 +6.884130839691552595e+00 +6.296657120077804315e+00 +5.433109220202929635e+00 +4.339273122897274071e+00 +3.204293987804599286e+00 +2.275485192063912088e+00 +1.710051466016569544e+00 +1.472515743409243738e+00 +1.410693205905008796e+00 +1.401071953177718932e+00 +1.400082536787407017e+00 +1.400005649797491980e+00 +1.400000368276688612e+00 +1.400000023470881150e+00 +1.400000001479273948e+00 +1.400000000092689767e+00 +1.400000000005788836e+00 +1.400000000000360734e+00 +1.400000000000022338e+00 +1.400000000000001243e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000055492641036992e+00 +8.000055492856255057e+00 +8.000055493430501485e+00 +8.000055494600108119e+00 +8.000055496737227045e+00 +8.000055500412441845e+00 +8.000055506483771950e+00 +8.000055516221314278e+00 +8.000055531479667081e+00 +8.000055554933700463e+00 +8.000055590397517236e+00 +8.000055643251309689e+00 +8.000055721006805953e+00 +8.000055834048540149e+00 +8.000055996595710539e+00 +8.000056227937557551e+00 +8.000056554003819542e+00 +8.000057009340737935e+00 +8.000057639571734214e+00 +8.000058504429992112e+00 +8.000059681456804128e+00 +8.000061270464383867e+00 +8.000063398863572317e+00 +8.000066227955219489e+00 +8.000069960277333081e+00 +8.000074848088233992e+00 +8.000081203047388456e+00 +8.000089407130120733e+00 +8.000099924779163985e+00 +8.000113316254916285e+00 +8.000130252097310546e+00 +8.000151528555853986e+00 +8.000178083781486649e+00 +8.000211014505927309e+00 +8.000251592862777983e+00 +8.000301282932232638e+00 +8.000361756520646850e+00 +8.000434907620190828e+00 +8.000522864936193912e+00 +8.000628001823589130e+00 +8.000752942942947143e+00 +8.000900566934049607e+00 +8.001074004413840868e+00 +8.001276630638288978e+00 +8.001512052225949745e+00 +8.001784087425626524e+00 +8.002096739521238788e+00 +8.002454163102802553e+00 +8.002860623090404246e+00 +8.003320446575157732e+00 +8.003837967732135183e+00 +8.004417466260106195e+00 +8.005063100004631949e+00 +8.005778832618215546e+00 +8.006568357296478311e+00 +8.007435017795645038e+00 +8.008381728077646144e+00 +8.009410892039021235e+00 +8.010524324853863121e+00 +8.011723177496163473e+00 +8.013007866001290225e+00 +8.014378006979985258e+00 +8.015832360812785495e+00 +8.017368783831519963e+00 +8.018984190641857523e+00 +8.020674527562750455e+00 +8.022434757961274698e+00 +8.024258860051798337e+00 +8.026139837513232678e+00 +8.028069743063900532e+00 +8.030039714925845118e+00 +8.032040025913785186e+00 +8.034060144702014128e+00 +8.036088808657488869e+00 +8.038114107480222259e+00 +8.040123576762770341e+00 +8.042104300468437827e+00 +8.044043021230898205e+00 +8.045926257294809147e+00 +8.047740424845564178e+00 +8.049471964414982139e+00 +8.051107469997416999e+00 +8.052633819466702647e+00 +8.054038304848639029e+00 +8.055308760977395011e+00 +8.056433691048065171e+00 +8.057402387574143177e+00 +8.058205047269478172e+00 +8.058832878401927857e+00 +8.059278199212366545e+00 +8.059534526059904280e+00 +8.059596650043321375e+00 +8.059460700960787705e+00 +8.059124197604639050e+00 +8.058586083544991396e+00 +8.057846747733357518e+00 +8.056908029453381914e+00 +8.055773207357024290e+00 +8.054446972547722794e+00 +8.052935385902994625e+00 +8.051245820063217096e+00 +8.049386886746146885e+00 +8.047368350273334414e+00 +8.045201028410142285e+00 +8.042896681821089189e+00 +8.040467893622793127e+00 +8.037927940674320482e+00 +8.035290658376442963e+00 +8.032570300855029544e+00 +8.029781398477583210e+00 +8.026938614694239860e+00 +8.024056604203535059e+00 +8.021149874417018211e+00 +8.018232652132988747e+00 +8.015318757226262747e+00 +8.012421485016663070e+00 +8.009553498794716120e+00 +8.006726733762638659e+00 +8.003952313400191088e+00 +8.001240479000717443e+00 +7.998600532857958356e+00 +7.996040795335579432e+00 +7.993568575831217160e+00 +7.991190157459855392e+00 +7.988910795119295472e+00 +7.986734726439266296e+00 +7.984665194921838349e+00 +7.982704484307489246e+00 +7.980853962829791648e+00 +7.979114135529606244e+00 +7.977484702259473259e+00 +7.975964618491437008e+00 +7.974552155742562043e+00 +7.973244958488340473e+00 +7.972040095087254308e+00 +7.970934101433869046e+00 +7.969923017797994724e+00 +7.969002421158567273e+00 +7.968167456745168131e+00 +7.967412872127132673e+00 +7.966733056500786780e+00 +7.966122080292199925e+00 +7.965573728035203693e+00 +7.965081502927154666e+00 +7.964638581683326279e+00 +7.964237687780823194e+00 +7.963870867302136780e+00 +7.963529150979833382e+00 +7.963202134351955230e+00 +7.962877522240564332e+00 +7.962540707376081883e+00 +7.962174511996437332e+00 +7.961759173340458240e+00 +7.961272351100444844e+00 +7.960690001795639681e+00 +7.959985590100380648e+00 +7.959131046483734373e+00 +7.958094619723174112e+00 +7.956836428504530545e+00 +7.955305358554967121e+00 +7.953430873375442189e+00 +7.951104512787958711e+00 +7.948186239913054507e+00 +7.944493899952318472e+00 +7.939755354722446867e+00 +7.933696114169739744e+00 +7.926014957103292069e+00 +7.916144291049710624e+00 +7.903808050116296613e+00 +7.888345312855187252e+00 +7.868506247246723539e+00 +7.843186501528355947e+00 +7.810049849411957901e+00 +7.763839846663480593e+00 +7.693732176058536432e+00 +7.586923460814390729e+00 +7.423276529174830607e+00 +7.144467311512860519e+00 +6.651063582083645009e+00 +5.852859407691416216e+00 +4.758598334296177512e+00 +3.572970237629640167e+00 +2.535688726427900885e+00 +1.847053557392092760e+00 +1.520678620962432337e+00 +1.420642083036885994e+00 +1.402316310271262356e+00 +1.400188898614574962e+00 +1.400013117830358977e+00 +1.400000853961696157e+00 +1.400000054022295881e+00 +1.400000003370881263e+00 +1.400000000208879047e+00 +1.400000000012895152e+00 +1.400000000000794387e+00 +1.400000000000048761e+00 +1.400000000000002798e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000037793490434979e+00 +8.000037793612360559e+00 +8.000037793939325681e+00 +8.000037794608417130e+00 +8.000037795835909904e+00 +8.000037797953927665e+00 +8.000037801462671183e+00 +8.000037807103701937e+00 +8.000037815961503540e+00 +8.000037829602586470e+00 +8.000037850263971961e+00 +8.000037881105942716e+00 +8.000037926547431510e+00 +8.000037992706591439e+00 +8.000038087973644352e+00 +8.000038223748202171e+00 +8.000038415378694978e+00 +8.000038683347161950e+00 +8.000039054748290468e+00 +8.000039565116844997e+00 +8.000040260662261815e+00 +8.000041200972566102e+00 +8.000042462251675701e+00 +8.000044141153649591e+00 +8.000046359274342933e+00 +8.000049268354299414e+00 +8.000053056236218652e+00 +8.000057953605363537e+00 +8.000064241521419817e+00 +8.000072259725484969e+00 +8.000082415675839442e+00 +8.000095194231180429e+00 +8.000111167860731953e+00 +8.000131007217520462e+00 +8.000155491865541535e+00 +8.000185520904732783e+00 +8.000222123191370827e+00 +8.000266466807639532e+00 +8.000319867394910744e+00 +8.000383794932822923e+00 +8.000459878522955037e+00 +8.000549908724037707e+00 +8.000655836987013103e+00 +8.000779771754784164e+00 +8.000923970824352693e+00 +8.001090829618842548e+00 +8.001282865084064611e+00 +8.001502695007637556e+00 +8.001753012657452757e+00 +8.002036556747906815e+00 +8.002356076864089118e+00 +8.002714294602682799e+00 +8.003113860819338399e+00 +8.003557309501731609e+00 +8.004047008910431416e+00 +8.004585110741810894e+00 +8.005173498164063872e+00 +8.005813733655028130e+00 +8.006507007625954131e+00 +8.007254088845952467e+00 +8.008055277686525031e+00 +8.008910363183673553e+00 +8.009818584867669955e+00 +8.010778600239099489e+00 +8.011788458677262525e+00 +8.012845582456611382e+00 +8.013946755422862722e+00 +8.015088119746886619e+00 +8.016265181035896248e+00 +8.017472821942035921e+00 +8.018705324271813595e+00 +8.019956399469368336e+00 +8.021219227224380077e+00 +8.022486501843578921e+00 +8.023750485923789810e+00 +8.025003070774664238e+00 +8.026235842960110389e+00 +8.027440156258116133e+00 +8.028607208277970031e+00 +8.029728120920646361e+00 +8.030794023821323790e+00 +8.031796139871644868e+00 +8.032725871883325652e+00 +8.033574889423901411e+00 +8.034335214830408134e+00 +8.034999307388783762e+00 +8.035560144657004855e+00 +8.036011299910160943e+00 +8.036347014697701852e+00 +8.036562265528615967e+00 +8.036652823740904950e+00 +8.036615307668744990e+00 +8.036447226294807678e+00 +8.036147013666685268e+00 +8.035714053464852569e+00 +8.035148693234077655e+00 +8.034452247929085189e+00 +8.033626992576305526e+00 +8.032676144014109454e+00 +8.031603831840637753e+00 +8.030415058867824030e+00 +8.029115651548622168e+00 +8.027712201007862092e+00 +8.026211995461901338e+00 +8.024622944954607817e+00 +8.022953499464085425e+00 +8.021212561543176633e+00 +8.019409394745146358e+00 +8.017553529152342762e+00 +8.015654665369147835e+00 +8.013722578360271243e+00 +8.011767022510824177e+00 +8.009797639254955470e+00 +8.007823868564111436e+00 +8.005854865503655660e+00 +8.003899422957124088e+00 +8.001965901481533194e+00 +8.000062167097738097e+00 +7.998195537641994868e+00 +7.996372738116960477e+00 +7.994599865293000818e+00 +7.992882361635521349e+00 +7.991224998481082586e+00 +7.989631868259175818e+00 +7.988106385454101677e+00 +7.986651295909069859e+00 +7.985268693966273368e+00 +7.983960046787940357e+00 +7.982726224978718754e+00 +7.981567538335230694e+00 +7.980483775185075679e+00 +7.979474243428613889e+00 +7.978537811140973268e+00 +7.977672944593290794e+00 +7.976877741878393380e+00 +7.976149961132582789e+00 +7.975487043496438666e+00 +7.974886132302001052e+00 +7.974344090995177936e+00 +7.973857523091530730e+00 +7.973422795167985022e+00 +7.973036063574526544e+00 +7.972693297121115741e+00 +7.972390286774937884e+00 +7.972122623152992027e+00 +7.971885625592617153e+00 +7.971674199024249674e+00 +7.971482621065142382e+00 +7.971304259038145545e+00 +7.971131248678442027e+00 +7.970954208182192247e+00 +7.970762044769122312e+00 +7.970541830873718148e+00 +7.970279185739570060e+00 +7.969958020215416994e+00 +7.969561658980158114e+00 +7.969071763107921313e+00 +7.968468035970402319e+00 +7.967726625627465253e+00 +7.966815211900430072e+00 +7.965685900091078686e+00 +7.964276062413414792e+00 +7.962489083415642099e+00 +7.960183291747185308e+00 +7.957221152180143697e+00 +7.953386983786004727e+00 +7.948335920335384941e+00 +7.942118986470827480e+00 +7.933910250141811282e+00 +7.923467121367844257e+00 +7.911050863194940774e+00 +7.893745888934679655e+00 +7.870192632037694480e+00 +7.840384157372435325e+00 +7.791700254160832451e+00 +7.711288409371092278e+00 +7.588781382277185017e+00 +7.412345465543486611e+00 +7.041191526038696580e+00 +6.318365777386699023e+00 +5.165870955400789555e+00 +3.917255569245296165e+00 +2.769160200071637767e+00 +1.976263377927505394e+00 +1.572503618171705142e+00 +1.433453909466708032e+00 +1.404166484359509859e+00 +1.400360897952104944e+00 +1.400025436240854626e+00 +1.400001651659859014e+00 +1.400000103557369258e+00 +1.400000006388043339e+00 +1.400000000390930088e+00 +1.400000000023827296e+00 +1.400000000001449196e+00 +1.400000000000087841e+00 +1.400000000000005240e+00 +1.400000000000000133e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000023607619295873e+00 +8.000023607682994253e+00 +8.000023607855355934e+00 +8.000023608210765858e+00 +8.000023608866751346e+00 +8.000023610004070918e+00 +8.000023611895420217e+00 +8.000023614945801498e+00 +8.000023619748544590e+00 +8.000023627162192952e+00 +8.000023638414848648e+00 +8.000023655244371312e+00 +8.000023680084757061e+00 +8.000023716311462252e+00 +8.000023768561032256e+00 +8.000023843143358349e+00 +8.000023948568092180e+00 +8.000024096210042401e+00 +8.000024301141746008e+00 +8.000024583164632830e+00 +8.000024968073041975e+00 +8.000025489187651218e+00 +8.000026189196175253e+00 +8.000027122339451680e+00 +8.000028356979454358e+00 +8.000029978582551493e+00 +8.000032093145614809e+00 +8.000034831084336773e+00 +8.000038351592095864e+00 +8.000042847463502582e+00 +8.000048550359615263e+00 +8.000055736471550105e+00 +8.000064732516225519e+00 +8.000075921972571891e+00 +8.000089751439427133e+00 +8.000106736968206178e+00 +8.000127470195325330e+00 +8.000152624072415009e+00 +8.000182957967769681e+00 +8.000219321891783864e+00 +8.000262659583450287e+00 +8.000314010186034608e+00 +8.000374508238710547e+00 +8.000445381718686022e+00 +8.000527947885691660e+00 +8.000623606708449742e+00 +8.000733831690817865e+00 +8.000860157963664676e+00 +8.001004167566192038e+00 +8.001167471906471818e+00 +8.001351691463552740e+00 +8.001558432870686133e+00 +8.001789263598615420e+00 +8.002045684536870596e+00 +8.002329100846679921e+00 +8.002640791528936148e+00 +8.002981878211675948e+00 +8.003353293711450434e+00 +8.003755750959804516e+00 +8.004189712908074128e+00 +8.004655364030094589e+00 +8.005152584032654062e+00 +8.005680924358072659e+00 +8.006239588022937781e+00 +8.006827413283428285e+00 +8.007442861552720004e+00 +8.008084009922072255e+00 +8.008748548557004909e+00 +8.009433783156058695e+00 +8.010136642574602561e+00 +8.010853691632402018e+00 +8.011581149043173866e+00 +8.012314910328651507e+00 +8.013050575510062501e+00 +8.013783481306719025e+00 +8.014508737515150472e+00 +8.015221267192274013e+00 +8.015915850222345540e+00 +8.016587169808815361e+00 +8.017229861398261548e+00 +8.017838563513400629e+00 +8.018407969945235081e+00 +8.018932882730574363e+00 +8.019408265320240758e+00 +8.019829295325708429e+00 +8.020191416218423797e+00 +8.020490387347388506e+00 +8.020722331637978542e+00 +8.020883780339662650e+00 +8.020971714203479763e+00 +8.020983600492920473e+00 +8.020917425265322365e+00 +8.020771720405479144e+00 +8.020545584949363871e+00 +8.020238700303355728e+00 +8.019851339042771698e+00 +8.019384367061565655e+00 +8.018839238941691150e+00 +8.018217986513629825e+00 +8.017523200687085350e+00 +8.016758006740319686e+00 +8.015926033365436965e+00 +8.015031375872601060e+00 +8.014078554055744874e+00 +8.013072465313848980e+00 +8.012018333702478401e+00 +8.010921655658767904e+00 +8.009788143197431154e+00 +8.008623665415138149e+00 +8.007434189164779781e+00 +8.006225719769657800e+00 +8.005004242640239909e+00 +8.003775666632645169e+00 +8.002545769948449461e+00 +8.001320149319198549e+00 +8.000104173146526776e+00 +7.998902939180185356e+00 +7.997721237213318624e+00 +7.996563517160055312e+00 +7.995433862759711907e+00 +7.994335971031415689e+00 +7.993273137490088054e+00 +7.992248247036584985e+00 +7.991263770355548246e+00 +7.990321765593693115e+00 +7.989423885041104789e+00 +7.988571386485809889e+00 +7.987765148835231699e+00 +7.987005691484617032e+00 +7.986293196742146883e+00 +7.985627534411390727e+00 +7.985008287403636551e+00 +7.984434777077705547e+00 +7.983906086946028324e+00 +7.983421083563169596e+00 +7.982978433834466259e+00 +7.982576618699791737e+00 +7.982213944013557771e+00 +7.981888550338340771e+00 +7.981598423439461243e+00 +7.981341407779106945e+00 +7.981115222154676836e+00 +7.980917476216418116e+00 +7.980745680396432284e+00 +7.980597240509445633e+00 +7.980469422352228115e+00 +7.980359278889453734e+00 +7.980263525544092573e+00 +7.980178372437890744e+00 +7.980099334566109093e+00 +7.980021040268040267e+00 +7.979937077964455838e+00 +7.979840038072115505e+00 +7.979721408296732932e+00 +7.979572141529679641e+00 +7.979382365763125762e+00 +7.979142028423010125e+00 +7.978840182008367421e+00 +7.978463901659010205e+00 +7.977995953974604149e+00 +7.977412905877783622e+00 +7.976676224674636551e+00 +7.975731691445469451e+00 +7.974512854631355729e+00 +7.972906016193664236e+00 +7.970778118590596151e+00 +7.968110403042776291e+00 +7.964408396647909782e+00 +7.959957916787106846e+00 +7.954389487802658643e+00 +7.946326494636260840e+00 +7.937311121852039797e+00 +7.925719882236001546e+00 +7.902594092699291473e+00 +7.876701340868034862e+00 +7.838324708899147453e+00 +7.744391342825024616e+00 +7.673653643698361115e+00 +7.466922058325795142e+00 +6.916526232200835622e+00 +5.604796744558372623e+00 +4.296415663003293695e+00 +2.937572576387992296e+00 +2.055344629157147551e+00 +1.607054968544423312e+00 +1.443799038175098914e+00 +1.405903079062973848e+00 +1.400534699767928215e+00 +1.400037985546409347e+00 +1.400002449711563957e+00 +1.400000151788410641e+00 +1.400000009236828546e+00 +1.400000000557353852e+00 +1.400000000033496228e+00 +1.400000000002009193e+00 +1.400000000000120259e+00 +1.400000000000007239e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 +8.000011465736664107e+00 +8.000011465762970175e+00 +8.000011465835239477e+00 +8.000011465985958026e+00 +8.000011466266446547e+00 +8.000011466755735157e+00 +8.000011467573253654e+00 +8.000011468896708777e+00 +8.000011470986930107e+00 +8.000011474222022301e+00 +8.000011479143788407e+00 +8.000011486520218540e+00 +8.000011497428705098e+00 +8.000011513365778981e+00 +8.000011536390339018e+00 +8.000011569308737691e+00 +8.000011615911564178e+00 +8.000011681273534236e+00 +8.000011772129449028e+00 +8.000011897340781886e+00 +8.000012068468814519e+00 +8.000012300471359694e+00 +8.000012612540929879e+00 +8.000013029102314377e+00 +8.000013580987086925e+00 +8.000014306801141117e+00 +8.000015254498906714e+00 +8.000016483174235304e+00 +8.000018065072982409e+00 +8.000020087825863158e+00 +8.000022656892282313e+00 +8.000025898196454932e+00 +8.000029960926470451e+00 +8.000035020455017687e+00 +8.000041281327714415e+00 +8.000048980251600383e+00 +8.000058389002933978e+00 +8.000069817160385455e+00 +8.000083614557755851e+00 +8.000100173340022991e+00 +8.000119929498582749e+00 +8.000143363756603065e+00 +8.000171001674145188e+00 +8.000203412845500850e+00 +8.000241209068827075e+00 +8.000285041380420736e+00 +8.000335595863509397e+00 +8.000393588163689174e+00 +8.000459756670135647e+00 +8.000534854352713054e+00 +8.000619639279463513e+00 +8.000714863875700189e+00 +8.000821263023901508e+00 +8.000939541141548261e+00 +8.001070358410785843e+00 +8.001214316367619261e+00 +8.001371943088507521e+00 +8.001543678236870960e+00 +8.001729858250724803e+00 +8.001930701964274917e+00 +8.002146296960365390e+00 +8.002376586947098858e+00 +8.002621360440711484e+00 +8.002880241018257124e+00 +8.003152679378736423e+00 +8.003437947420659171e+00 +8.003735134508970006e+00 +8.004043146066017300e+00 +8.004360704580916419e+00 +8.004686353090852080e+00 +8.005018461147265896e+00 +8.005355233241060020e+00 +8.005694719624086630e+00 +8.006034829430463517e+00 +8.006373345970500210e+00 +8.006707944042609881e+00 +8.007036209084382961e+00 +8.007355657962683892e+00 +8.007663761183898998e+00 +8.007957966288971718e+00 +8.008235722183140837e+00 +8.008494504137173564e+00 +8.008731839185053047e+00 +8.008945331632688180e+00 +8.009132688383239440e+00 +8.009291743777538386e+00 +8.009420483643188149e+00 +8.009517068243907190e+00 +8.009579853822113904e+00 +8.009607412433261686e+00 +8.009598549780729826e+00 +8.009552320775556566e+00 +8.009468042566439294e+00 +8.009345304812276467e+00 +8.009183977002255261e+00 +8.008984212666632629e+00 +8.008746450364586877e+00 +8.008471411383069949e+00 +8.008160094131465456e+00 +8.007813765270189066e+00 +8.007433947665605345e+00 +8.007022405317732350e+00 +8.006581125459632631e+00 +8.006112298076789813e+00 +8.005618293139994179e+00 +8.005101635884923184e+00 +8.004564980505056937e+00 +8.004011082650771769e+00 +8.003442771146159984e+00 +8.002862919345920645e+00 +8.002274416557556336e+00 +8.001680139949023385e+00 +8.001082927349052909e+00 +8.000485551326580236e+00 +7.999890694907058730e+00 +7.999300929246969893e+00 +7.998718693543790614e+00 +7.998146277407741422e+00 +7.997585805865099928e+00 +7.997039227103158510e+00 +7.996508303006932827e+00 +7.995994602481436786e+00 +7.995499497504268582e+00 +7.995024161814044739e+00 +7.994569572111296374e+00 +7.994136511627066177e+00 +7.993725575893694035e+00 +7.993337180524246577e+00 +7.992971570758959921e+00 +7.992628832465928923e+00 +7.992308904184545426e+00 +7.992011589690775963e+00 +7.991736570465239886e+00 +7.991483417404706024e+00 +7.991251601165056506e+00 +7.991040500718869843e+00 +7.990849410038236122e+00 +7.990677543255179316e+00 +7.990524039055155292e+00 +7.990387965517564695e+00 +7.990268326143591615e+00 +7.990164067950568771e+00 +7.990074090325081535e+00 +7.989997252501626512e+00 +7.989932374727129805e+00 +7.989878227980401704e+00 +7.989833503700335626e+00 +7.989796762535999797e+00 +7.989766359906885995e+00 +7.989740353054916255e+00 +7.989716411221229997e+00 +7.989691759370315616e+00 +7.989663116411880317e+00 +7.989626835453285558e+00 +7.989578868659556576e+00 +7.989515117383906961e+00 +7.989431340019219618e+00 +7.989323263497863259e+00 +7.989186010196750232e+00 +7.989013481572587061e+00 +7.988796058597297467e+00 +7.988519732958551778e+00 +7.988163097294206594e+00 +7.987691621539001474e+00 +7.987065995876858615e+00 +7.986246691769046002e+00 +7.985104198406253850e+00 +7.983733946741661036e+00 +7.981844189782621335e+00 +7.979383734962069319e+00 +7.976745221775854766e+00 +7.972686959390018480e+00 +7.966511237731689121e+00 +7.961589568027561903e+00 +7.947958604791099724e+00 +7.921806564633123493e+00 +7.926332556807295759e+00 +7.803135180495131884e+00 +7.739845220694663297e+00 +7.695948590204476858e+00 +6.215631715569777782e+00 +5.072431439720475055e+00 +2.931034902443561574e+00 +2.005710850650718857e+00 +1.591008288813729576e+00 +1.441122812220171800e+00 +1.405580376775717122e+00 +1.400502010383127161e+00 +1.400035173801665200e+00 +1.400002233981459066e+00 +1.400000136317844479e+00 +1.400000008172716415e+00 +1.400000000486133489e+00 +1.400000000028818858e+00 +1.400000000001706324e+00 +1.400000000000100941e+00 +1.400000000000005906e+00 +1.400000000000000355e+00 +1.399999999999999911e+00 +1.399999999999999911e+00 diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc new file mode 100644 index 00000000..bf6e5897 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -0,0 +1,63 @@ + +#include "pressio/ode_steppers_implicit.hpp" +#include "pressio/ode_advancers.hpp" +#include "pressiodemoapps/euler2d.hpp" +#include "../observer.hpp" + +int main() +{ + pressio::log::initialize(pressio::logto::terminal); + pressio::log::setVerbosity({pressio::log::level::debug}); + + namespace pda = pressiodemoapps; + const auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("."); + + constexpr auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto probId = pda::Euler2d::DoubleMachReflection; + + auto appObj = pda::create_problem_eigen(meshObj, probId, order); + using app_t = decltype(appObj); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + + state_t state = appObj.initialCondition(); + + int numDomains = 4; + int nx = 50; + int ny = 50; + state_t v((nx + ny ) * 2 * 4); + std::vector vecStateBcs( numDomains, v); + + appObj.setStateBc(&vecStateBcs[0]); + // for (int domIdx = 0; domIdx < numDomains; ++domIdx){ + // vecApp[domIdx].setStateBc(vecStateBcs[domIdx]); + // } + + auto stepperObj = pressio::ode::create_implicit_stepper( + pressio::ode::StepScheme::CrankNicolson, appObj); + using lin_solver_t = pressio::linearsolvers::Solver< + pressio::linearsolvers::iterative::Bicgstab, jacob_t>; + lin_solver_t linSolverObj; + auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); + NonLinSolver.setTolerance(1e-5); + + FomObserver Obs("doubleMach2d_solution.bin", 10); + + // for (int n = 0; n < numSteps; ++n){ + // double t = n * dt; + // while (conv > tol){ + // for (int domIdx = 0; domIdx < numDomains; ++domIdx){ + // advance_n_steps(stepperVec[domIdx], stateVec[domIdx], t, dt, + // 1, Obs, solverVec[domIdx]); + // // update stateBc using stateVec + // } + // conv = calcConvergence(stateVec); + // } + // } + + const auto dt = 0.0025; + const auto Nsteps = pressio::ode::StepCount(100); + pressio::ode::advance_n_steps(stepperObj, state, 0., dt, Nsteps, Obs, NonLinSolver); + + return 0; +} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/plot.py b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/plot.py new file mode 100644 index 00000000..b9336be9 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/plot.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +import matplotlib.pyplot as plt +from matplotlib import cm +import numpy as np +from numpy import linalg as LA +import re + +gamma_ = (5.+2.)/5. +gammaMinusOne_ = gamma_ - 1. +gammaMinusOneInv_ = 1./(gamma_ - 1.) +gammaMinusOneDiv16_ = gammaMinusOne_/(8. * gamma_ * np.pi * np.pi) + +def computePressure(rho, u, v, E): + vel = u**2 + v**2 + return (gamma_ - 1.) * (E - rho*vel*0.5) + +def computeMach(rho, u, v, p): + return np.sqrt((u**2+v**2))/np.sqrt(gamma_*p/rho) + +def extractN(ns): + reg = re.compile(r''+ns+'.+') + file1 = open('info.dat', 'r') + strings = re.search(reg, file1.read()) + file1.close() + assert(strings) + return int(strings.group().split()[1]) + +########################## +if __name__== "__main__": +########################## + nx = extractN('nx') + ny = extractN('ny') + print(nx, ny) + fomTotDofs = nx*ny*4 + + fomCoords = np.loadtxt('coordinates.dat', dtype=float) + x_fom, y_fom = fomCoords[:,1], fomCoords[:,2] + x_fom = np.reshape(x_fom, (ny,nx)) + y_fom = np.reshape(y_fom, (ny,nx)) + + fomTestD = np.fromfile("doubleMach2d_solution.bin") + nt = int(np.size(fomTestD)/fomTotDofs) + print("fomTest: nt = ", nt) + fomTestD = np.reshape(fomTestD, (nt, fomTotDofs)) + + fig = plt.figure(1) + for i in range(nt-1, nt):#nt-1, nt): + fomS = fomTestD[i,:] + fomS = np.reshape(fomS, (nx*ny, 4)) + rho = fomS[:,0] + u = fomS[:,1]/rho + v = fomS[:,2]/rho + p = computePressure(rho, u, v, fomS[:,3]) + + print(np.min(rho), np.max(rho)) + rho1 = np.reshape(rho, (ny,nx)) + p1 = np.reshape(p, (ny,nx)) + + plt.clf() + ax = plt.gca() + h = plt.contourf(x_fom, y_fom, rho1) + ax.set_aspect(aspect=1.) + plt.colorbar() + # plt.pause(0.001) + plt.show() diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake new file mode 100644 index 00000000..0737d6c5 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake @@ -0,0 +1,24 @@ +include(FindUnixCommands) + +set(CMD "python3 ${MESHDRIVER} -n 200 50 --outDir ${OUTDIR} -s ${STENCILVAL} --bounds 0.0 4.0 0.0 1.0") +execute_process(COMMAND ${BASH} -c ${CMD} RESULT_VARIABLE RES) +if(RES) + message(FATAL_ERROR "Mesh generation failed") +else() + message("Mesh generation succeeded!") +endif() + +execute_process(COMMAND ${EXENAME} RESULT_VARIABLE CMD_RESULT) +if(RES) + message(FATAL_ERROR "run failed") +else() + message("run succeeded!") +endif() + +set(CMD "python3 compare.py") +execute_process(COMMAND ${BASH} -c ${CMD} RESULT_VARIABLE RES) +if(RES) + message(FATAL_ERROR "comparison failed") +else() + message("comparison succeeded!") +endif() From 81cf11dcee75cb76c08c940d4830d81882b13199 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Wed, 3 May 2023 16:46:41 -0700 Subject: [PATCH 02/17] minimum working example for mesh object overwrite --- .../main_MWE.cc | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc new file mode 100644 index 00000000..2b2e23bb --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc @@ -0,0 +1,71 @@ + +#include "pressio/ode_steppers_implicit.hpp" +#include "pressio/ode_advancers.hpp" +#include "pressiodemoapps/euler2d.hpp" +#include "../observer.hpp" + +using namespace std; + +int main() +{ + pressio::log::initialize(pressio::logto::terminal); + pressio::log::setVerbosity({pressio::log::level::debug}); + + namespace pda = pressiodemoapps; + + constexpr auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto probId = pda::Euler2d::DoubleMachReflection; + + // ---- user inputs + + int ndomains = 2; + int checkIdx = 0; + + // ---- end user inputs + + // getting types + auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("."); + using mesh_t = decltype(meshObj); + + auto appObj = pda::create_problem_eigen(meshObj, probId, order); + using app_t = decltype(appObj); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + + auto stepperObj = pressio::ode::create_implicit_stepper( + pressio::ode::StepScheme::CrankNicolson, appObj); + using lin_solver_t = pressio::linearsolvers::Solver< + pressio::linearsolvers::iterative::Bicgstab, jacob_t>; + lin_solver_t linSolverObj; + auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); + NonLinSolver.setTolerance(1e-5); + + using nonlin_solver_t = decltype(NonLinSolver); + using stepper_t = decltype(stepperObj); + + // problem objects for each domain + vector meshVec; + vector appVec; + vector stateVec; + vector stepperVec; + vector linSolverVec(ndomains); + vector nonlinSolverVec; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + meshVec.push_back(pda::load_cellcentered_uniform_mesh_eigen(".")); + appVec.push_back(pda::create_problem_eigen(meshVec[domIdx], probId, order)); + stateVec.push_back(appVec[domIdx].initialCondition()); + stepperVec.push_back(pressio::ode::create_implicit_stepper(pressio::ode::StepScheme::CrankNicolson, appVec[domIdx])); + nonlinSolverVec.push_back(pressio::nonlinearsolvers::create_newton_raphson(stepperVec[domIdx], linSolverVec[domIdx])); + nonlinSolverVec[domIdx].setTolerance(1e-5); + + } + + const auto dtWrap = ::pressio::ode::StepSize(0.0025); + auto startTimeWrap = ::pressio::ode::StepStartAt(0.01); + const auto stepWrap = ::pressio::ode::StepCount(0); + + stepperVec[checkIdx](stateVec[checkIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[checkIdx]); + + return 0; +} From fdb5a9f343ad5f3578ba9f9c523f589bee4fab29 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Wed, 3 May 2023 17:01:18 -0700 Subject: [PATCH 03/17] change time scheme --- .../main_MWE.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc index 2b2e23bb..33791bd7 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc @@ -15,6 +15,7 @@ int main() constexpr auto order = pda::InviscidFluxReconstruction::FirstOrder; const auto probId = pda::Euler2d::DoubleMachReflection; + const auto scheme = pressio::ode::StepScheme::CrankNicolson; // ---- user inputs @@ -33,7 +34,7 @@ int main() using jacob_t = typename app_t::jacobian_type; auto stepperObj = pressio::ode::create_implicit_stepper( - pressio::ode::StepScheme::CrankNicolson, appObj); + scheme, appObj); using lin_solver_t = pressio::linearsolvers::Solver< pressio::linearsolvers::iterative::Bicgstab, jacob_t>; lin_solver_t linSolverObj; @@ -55,7 +56,7 @@ int main() meshVec.push_back(pda::load_cellcentered_uniform_mesh_eigen(".")); appVec.push_back(pda::create_problem_eigen(meshVec[domIdx], probId, order)); stateVec.push_back(appVec[domIdx].initialCondition()); - stepperVec.push_back(pressio::ode::create_implicit_stepper(pressio::ode::StepScheme::CrankNicolson, appVec[domIdx])); + stepperVec.push_back(pressio::ode::create_implicit_stepper(scheme, appVec[domIdx])); nonlinSolverVec.push_back(pressio::nonlinearsolvers::create_newton_raphson(stepperVec[domIdx], linSolverVec[domIdx])); nonlinSolverVec[domIdx].setTolerance(1e-5); From 3bb04ee644eeade2c00a14439853aafd08d5127f Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Thu, 4 May 2023 16:20:50 +0200 Subject: [PATCH 04/17] fix to work when storing multiple instances --- .../impl/euler_2d_prob_class.hpp | 12 ++- include/pressiodemoapps/impl/mesh_ccu.hpp | 2 +- .../firstorder/CMakeLists.txt | 2 +- .../main_FR.cc | 97 +++++++++++++++++++ .../test.cmake | 14 +-- 5 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc diff --git a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp index cbee3a8b..f96783d7 100644 --- a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp @@ -101,6 +101,8 @@ class EigenApp using reconstruction_gradient_t = Eigen::Matrix; public: + EigenApp() = default; + EigenApp(const MeshType & meshObj, ::pressiodemoapps::Euler2d probEnum, ::pressiodemoapps::InviscidFluxReconstruction recEnum, @@ -145,6 +147,10 @@ class EigenApp return initialConditionImpl(); } + const MeshType & getMesh() const{ + return m_meshObj; + } + protected: void setStateBc(state_type * stateBc){ m_stateBc = stateBc; @@ -1173,7 +1179,7 @@ class EigenApp protected: scalar_type m_gamma = static_cast(1.4); - const MeshType & m_meshObj; + MeshType m_meshObj; ::pressiodemoapps::Euler2d m_probEn; ::pressiodemoapps::InviscidFluxReconstruction m_recEn; ::pressiodemoapps::InviscidFluxScheme m_fluxEn; @@ -1192,8 +1198,8 @@ class EigenApp mutable ghost_container_type m_ghostRight; mutable ghost_container_type m_ghostBack; - const std::array normalX_{1, 0}; - const std::array normalY_{0, 1}; + std::array normalX_{1, 0}; + std::array normalY_{0, 1}; // for cross-shock problem: density, inletXVel, bottomYVel std::array m_crossshock_params; diff --git a/include/pressiodemoapps/impl/mesh_ccu.hpp b/include/pressiodemoapps/impl/mesh_ccu.hpp index 695a2945..98e34faf 100644 --- a/include/pressiodemoapps/impl/mesh_ccu.hpp +++ b/include/pressiodemoapps/impl/mesh_ccu.hpp @@ -83,7 +83,7 @@ class CellCenteredUniformMesh using indices_v_t = std::vector; public: - CellCenteredUniformMesh() = delete; + CellCenteredUniformMesh() = default; #if not defined PRESSIODEMOAPPS_ENABLE_BINDINGS template< diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt index 72fa6fe2..2b67228f 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt @@ -6,7 +6,7 @@ configure_file(../compare.py compare.py COPYONLY) configure_file(rho_gold.txt rho_gold.txt COPYONLY) configure_file(../plot.py plot.py COPYONLY) -add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main_FR.cc) add_test(NAME ${testname} COMMAND ${CMAKE_COMMAND} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc new file mode 100644 index 00000000..4f6f7e36 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc @@ -0,0 +1,97 @@ + +#include "pressio/ode_steppers_implicit.hpp" +#include "pressio/ode_advancers.hpp" +#include "pressiodemoapps/euler2d.hpp" +#include "../observer.hpp" + +using namespace std; + +int main() +{ + namespace pda = pressiodemoapps; + namespace plog = pressio::log; + namespace pode = pressio::ode; + namespace pls = pressio::linearsolvers; + namespace pnls = pressio::nonlinearsolvers; + + plog::initialize(pressio::logto::terminal); + plog::setVerbosity({pressio::log::level::debug}); + + // ---- user inputs + int ndomains = 2; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto probId = pda::Euler2d::DoubleMachReflection; + const auto scheme = pode::StepScheme::CrankNicolson; + // ---- end user inputs + + // aliases + using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(".") ); + using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + using lin_solver_t = pls::Solver; + using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); + using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); + + // + // create things + // + /* Note: + only need a single linear solver instance, all the nonlinear solvers will reference the same + but make sure it does not go out of scope */ + lin_solver_t linSolverObj; + std::string path = "."; + std::vector meshVec(ndomains); + std::vector appVec(ndomains); + std::vector stateVec(ndomains); + std::vector stepperVec; + vector nonlinSolverVec; + std::cout << "INIT \n"; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) + { + meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(path); + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); + stateVec[domIdx] = appVec[domIdx].initialCondition(); + + stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); + nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); + + std::cout << " LOOP: " + << "domIdx = " << domIdx << " " + << "&meshObj = " << &meshVec[domIdx] << " " + << "&appObj = " << &appVec[domIdx] + << std::endl; + } + + std::cout << "\nVERIFIY \n"; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { // + std::cout << " LOOP: " + << "domIdx = " << domIdx << " " + << "&meshObj = " << &meshVec[domIdx] << " " + << "&appObj = " << &appVec[domIdx] + << std::endl; + } + + // + // try solve + // + auto fixTol = [](nonlin_solver_t & s){ s.setTolerance(1e-5); }; + auto fixIters = [](nonlin_solver_t & s){ s.setMaxIterations(3); }; + std::for_each(nonlinSolverVec.begin(), nonlinSolverVec.end(), fixIters); + + int numSteps = 3; + const auto dtWrap = pode::StepSize(0.0025); + const auto startTimeWrap = pode::StepStartAt(0); + for (int stepId=1; stepId<=numSteps; ++stepId) + { + std::cout << " Doing step = " << stepId << "\n"; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + std::cout << " Doing domain = " << domIdx << "\n"; + stepperVec[domIdx](stateVec[domIdx], startTimeWrap, + pode::StepCount(stepId), dtWrap, + nonlinSolverVec[domIdx]); + } + } + + return 0; +} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake index 0737d6c5..51b91575 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/test.cmake @@ -15,10 +15,10 @@ else() message("run succeeded!") endif() -set(CMD "python3 compare.py") -execute_process(COMMAND ${BASH} -c ${CMD} RESULT_VARIABLE RES) -if(RES) - message(FATAL_ERROR "comparison failed") -else() - message("comparison succeeded!") -endif() +# set(CMD "python3 compare.py") +# execute_process(COMMAND ${BASH} -c ${CMD} RESULT_VARIABLE RES) +# if(RES) +# message(FATAL_ERROR "comparison failed") +# else() +# message("comparison succeeded!") +# endif() From 5926f30a35ad52c769eea6ac3d5b4bef066971b0 Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Thu, 4 May 2023 16:22:25 +0200 Subject: [PATCH 05/17] minor fix --- .../eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc index 4f6f7e36..558c8a30 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc @@ -63,7 +63,7 @@ int main() << std::endl; } - std::cout << "\nVERIFIY \n"; + std::cout << "\nVERIFY \n"; for (int domIdx = 0; domIdx < ndomains; ++domIdx) { // std::cout << " LOOP: " << "domIdx = " << domIdx << " " @@ -75,6 +75,7 @@ int main() // // try solve // + std::cout << "\n"; auto fixTol = [](nonlin_solver_t & s){ s.setTolerance(1e-5); }; auto fixIters = [](nonlin_solver_t & s){ s.setMaxIterations(3); }; std::for_each(nonlinSolverVec.begin(), nonlinSolverVec.end(), fixIters); From ac3f33ad91fdd6a1a14d5c142a6918149e6968b7 Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Thu, 4 May 2023 16:33:19 +0200 Subject: [PATCH 06/17] fix time --- .../eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc index 558c8a30..d4f902b0 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc @@ -83,6 +83,7 @@ int main() int numSteps = 3; const auto dtWrap = pode::StepSize(0.0025); const auto startTimeWrap = pode::StepStartAt(0); + double time = startTimeWrap.get(); for (int stepId=1; stepId<=numSteps; ++stepId) { std::cout << " Doing step = " << stepId << "\n"; @@ -92,6 +93,7 @@ int main() pode::StepCount(stepId), dtWrap, nonlinSolverVec[domIdx]); } + time += dtWrap.get(); } return 0; From e80020a3399251e36ae6038dd8efb4140c63fc1f Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Mon, 22 May 2023 09:51:42 -0700 Subject: [PATCH 07/17] first (sloppy) implementation of Schwarz within main, need to move to class --- include/pressiodemoapps/adapter_cpp.hpp | 5 + ...2d_ghost_filler_double_mach_reflection.hpp | 102 ++- .../impl/euler_2d_prob_class.hpp | 8 +- include/pressiodemoapps/impl/mesh_ccu.hpp | 8 +- .../pressiodemoapps/impl/mesh_read_info.hpp | 75 ++- meshing_scripts/gen_decomp_meshes.py | 172 +++++ .../firstorder/CMakeLists.txt | 2 +- .../main.cc | 601 ++++++++++++++++-- tests_cpp/observer.hpp | 4 + 9 files changed, 902 insertions(+), 75 deletions(-) create mode 100644 meshing_scripts/gen_decomp_meshes.py diff --git a/include/pressiodemoapps/adapter_cpp.hpp b/include/pressiodemoapps/adapter_cpp.hpp index 490a0f71..db2aa3db 100644 --- a/include/pressiodemoapps/adapter_cpp.hpp +++ b/include/pressiodemoapps/adapter_cpp.hpp @@ -68,6 +68,7 @@ class PublicProblemEigenMixinCpp : public T using rhs_type = typename T::velocity_type; using right_hand_side_type = typename T::velocity_type; using jacobian_type = typename T::jacobian_type; + using graph_type = typename T::graph_type; private: using typename T::index_t; @@ -152,6 +153,10 @@ class PublicProblemEigenMixinCpp : public T T::setStateBc(stateBc); } + void setGraphBc(graph_type * ghostGraph){ + T::setGraphBc(ghostGraph); + } + // // evaluation // diff --git a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp index 13889d96..a3fb3d5c 100644 --- a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp +++ b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp @@ -56,6 +56,7 @@ template class DoubleMachReflection2dGhostFillerWithCustomBc { using scalar_type = typename mesh_t::scalar_t; + using graph_t = typename mesh_t::graph_t; public: DoubleMachReflection2dGhostFillerWithCustomBc() = delete; @@ -68,7 +69,8 @@ class DoubleMachReflection2dGhostFillerWithCustomBc ghost_t & ghostFront, ghost_t & ghostRight, ghost_t & ghostBack, - const state_t & stateBcs) + const state_t & stateBcs, + const graph_t & graphBcs) : m_stencilSize(stencilSize), m_state(stateIn), m_evaluationTime(evaluationTime), @@ -78,7 +80,8 @@ class DoubleMachReflection2dGhostFillerWithCustomBc m_ghostFront(ghostFront), m_ghostRight(ghostRight), m_ghostBack(ghostBack), - m_stateBcs(stateBcs) + m_stateBcs(stateBcs), + m_graphBcs(graphBcs) { computeShockConditions(); } @@ -111,48 +114,84 @@ class DoubleMachReflection2dGhostFillerWithCustomBc if (left0 == -1) { - m_ghostLeft(gRow, 0) = m_state(uIndex+0); - m_ghostLeft(gRow, 1) = m_state(uIndex+1); - m_ghostLeft(gRow, 2) = m_state(uIndex+2); - m_ghostLeft(gRow, 3) = m_state(uIndex+3); + const auto bcIndex = m_graphBcs(gRow, 0); + if (bcIndex == -1) { + m_ghostLeft(gRow, 0) = m_state(uIndex+0); + m_ghostLeft(gRow, 1) = m_state(uIndex+1); + m_ghostLeft(gRow, 2) = m_state(uIndex+2); + m_ghostLeft(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostLeft(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostLeft(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostLeft(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostLeft(gRow, 3) = m_stateBcs(bcIndex+3); + } } if (front0 == -1){ - if (distanceFromShock(myX, myY+dy) < zero){ - m_ghostFront(gRow, 0) = m_postShockState[0]; - m_ghostFront(gRow, 1) = m_postShockState[1]; - m_ghostFront(gRow, 2) = m_postShockState[2]; - m_ghostFront(gRow, 3) = m_postShockState[3]; + const auto bcIndex = m_graphBcs(gRow, 1); + if (bcIndex == -1) { + if (distanceFromShock(myX, myY+dy) < zero){ + m_ghostFront(gRow, 0) = m_postShockState[0]; + m_ghostFront(gRow, 1) = m_postShockState[1]; + m_ghostFront(gRow, 2) = m_postShockState[2]; + m_ghostFront(gRow, 3) = m_postShockState[3]; + } + else{ + m_ghostFront(gRow, 0) = m_preShockState[0]; + m_ghostFront(gRow, 1) = m_preShockState[1]; + m_ghostFront(gRow, 2) = m_preShockState[2]; + m_ghostFront(gRow, 3) = m_preShockState[3]; + } } - else{ - m_ghostFront(gRow, 0) = m_preShockState[0]; - m_ghostFront(gRow, 1) = m_preShockState[1]; - m_ghostFront(gRow, 2) = m_preShockState[2]; - m_ghostFront(gRow, 3) = m_preShockState[3]; + else { + m_ghostFront(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostFront(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostFront(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostFront(gRow, 3) = m_stateBcs(bcIndex+3); } } if (right0 == -1) { - m_ghostRight(gRow, 0) = m_state(uIndex); - m_ghostRight(gRow, 1) = m_state(uIndex+1); - m_ghostRight(gRow, 2) = m_state(uIndex+2); - m_ghostRight(gRow, 3) = m_state(uIndex+3); + const auto bcIndex = m_graphBcs(gRow, 2); + if (bcIndex == -1) { + m_ghostRight(gRow, 0) = m_state(uIndex+0); + m_ghostRight(gRow, 1) = m_state(uIndex+1); + m_ghostRight(gRow, 2) = m_state(uIndex+2); + m_ghostRight(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostRight(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostRight(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostRight(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostRight(gRow, 3) = m_stateBcs(bcIndex+3); + } } if (back0 == -1) { - if (myX < m_wedgePosition){ - m_ghostBack(gRow, 0) = m_state(uIndex+0); - m_ghostBack(gRow, 1) = m_state(uIndex+1); - m_ghostBack(gRow, 2) = m_state(uIndex+2); - m_ghostBack(gRow, 3) = m_state(uIndex+3); + const auto bcIndex = m_graphBcs(gRow, 3); + if (bcIndex == -1) { + if (myX < m_wedgePosition){ + m_ghostBack(gRow, 0) = m_state(uIndex+0); + m_ghostBack(gRow, 1) = m_state(uIndex+1); + m_ghostBack(gRow, 2) = m_state(uIndex+2); + m_ghostBack(gRow, 3) = m_state(uIndex+3); + } + else{ + m_ghostBack(gRow, 0) = m_state(uIndex+0); + m_ghostBack(gRow, 1) = m_state(uIndex+1); + m_ghostBack(gRow, 2) = -m_state(uIndex+2); + m_ghostBack(gRow, 3) = m_state(uIndex+3); + } } - else{ - m_ghostBack(gRow, 0) = m_state(uIndex+0); - m_ghostBack(gRow, 1) = m_state(uIndex+1); - m_ghostBack(gRow, 2) = -m_state(uIndex+2); - m_ghostBack(gRow, 3) = m_state(uIndex+3); + else { + m_ghostBack(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostBack(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostBack(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostBack(gRow, 3) = m_stateBcs(bcIndex+3); } } @@ -226,7 +265,10 @@ class DoubleMachReflection2dGhostFillerWithCustomBc const scalar_type m_shockSlope = std::tan(m_angle); const scalar_type m_shockSlopeInv = one/m_shockSlope; const scalar_type m_shockSlopeInv_sq = m_shockSlopeInv*m_shockSlopeInv; + + // Schwarz coupling const state_t & m_stateBcs; + const graph_t & m_graphBcs; }; diff --git a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp index f96783d7..987494e6 100644 --- a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp @@ -88,6 +88,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; static constexpr int dimensionality{2}; static constexpr int numDofPerCell{4}; @@ -156,6 +157,10 @@ class EigenApp m_stateBc = stateBc; } + void setGraphBc(graph_type * ghostGraph){ + m_ghostGraph = ghostGraph; + } + void initializeJacobian(jacobian_type & J) { J.resize(m_numDofSampleMesh, m_numDofStencilMesh); @@ -448,7 +453,7 @@ class EigenApp currentTime, m_gamma, m_meshObj, m_ghostLeft, m_ghostFront, m_ghostRight, m_ghostBack, - *m_stateBc); + *m_stateBc, *m_ghostGraph); const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); #ifdef PRESSIODEMOAPPS_ENABLE_OPENMP #pragma omp for schedule(static) @@ -1205,6 +1210,7 @@ class EigenApp std::array m_crossshock_params; state_type * m_stateBc = nullptr; + graph_type * m_ghostGraph = nullptr; }; template constexpr int EigenApp::numDofPerCell; diff --git a/include/pressiodemoapps/impl/mesh_ccu.hpp b/include/pressiodemoapps/impl/mesh_ccu.hpp index 98e34faf..0c02ee88 100644 --- a/include/pressiodemoapps/impl/mesh_ccu.hpp +++ b/include/pressiodemoapps/impl/mesh_ccu.hpp @@ -130,6 +130,10 @@ class CellCenteredUniformMesh const y_coords_type & viewY() const{ return m_y; } const z_coords_type & viewZ() const{ return m_z; } + int nx() const{ return m_meshDims[0]; }; + int ny() const{ return m_meshDims[1]; }; + int nz() const{ return m_meshDims[2]; }; + // number of cells that do NOT get close to any boundary // i.e. those for which the farthest stencil cell is still within the BD auto numCellsInner() const{ return m_rowsForCellsInner.size(); } @@ -327,7 +331,8 @@ class CellCenteredUniformMesh m_cellDeltasInv, m_stencilSize, m_stencilMeshSize, - m_sampleMeshSize); + m_sampleMeshSize, + m_meshDims); if(m_dim==3 and m_stencilSize==7){ throw std::runtime_error("3D mesh with 7pt stencil not yet supported."); } @@ -410,6 +415,7 @@ class CellCenteredUniformMesh int m_stencilSize = {}; index_type m_stencilMeshSize = {}; index_type m_sampleMeshSize = {}; + std::array m_meshDims{}; x_coords_type m_x = {}; y_coords_type m_y = {}; z_coords_type m_z = {}; diff --git a/include/pressiodemoapps/impl/mesh_read_info.hpp b/include/pressiodemoapps/impl/mesh_read_info.hpp index fa90c5a5..9fb12cf5 100644 --- a/include/pressiodemoapps/impl/mesh_read_info.hpp +++ b/include/pressiodemoapps/impl/mesh_read_info.hpp @@ -58,7 +58,8 @@ void read_mesh_info(const std::string & meshDir, std::array & cellDeltasInv, int & stencilSize, int_t & numGptStencilMesh, - int_t & numGptSampleMesh) + int_t & numGptSampleMesh, + std::array & meshDims) { const auto inFile = meshDir+"/info.dat"; std::ifstream foundFile(inFile); @@ -114,7 +115,79 @@ void read_mesh_info(const std::string & meshDir, stencilSize = std::stoi(colVal); } + else if (colVal == "nx"){ + ss >> colVal; + meshDims[0] = std::stoi(colVal); + } + + else if (colVal == "ny"){ + ss >> colVal; + meshDims[1] = std::stoi(colVal); + } + + else if (colVal == "nz"){ + ss >> colVal; + meshDims[2] = std::stoi(colVal); + } + + } + source.close(); +} + +void read_domain_info(const std::string & meshRoot, int & dim, + int & ndomX, int & ndomY, int & ndomZ, + int & overlap) +{ + const auto inFile = meshRoot + "/info_domain.dat"; + std::ifstream foundFile(inFile); + if(!foundFile){ + std::cout << "file not found " << inFile << std::endl; + exit(EXIT_FAILURE); + } + + // defaults + ndomX = 1; + ndomY = 1; + ndomZ = 1; + + std::ifstream source( inFile, std::ios_base::in); + std::string line; + while (std::getline(source, line) ) + { + std::istringstream ss(line); + std::string colVal; + ss >> colVal; + + if (colVal == "dim"){ + ss >> colVal; + dim = std::stoi(colVal); + } + + else if (colVal == "ndomX"){ + ss >> colVal; + ndomX = std::stoi(colVal); + } + + else if (colVal == "ndomY"){ + ss >> colVal; + ndomY = std::stoi(colVal); + } + + else if (colVal == "ndomZ"){ + ss >> colVal; + ndomZ = std::stoi(colVal); } + + else if (colVal == "overlap"){ + ss >> colVal; + overlap = std::stoi(colVal); + // has to be an even number for simplicity, can change later + if (overlap % 2) { + std::cerr << "overlap must be an even number" << std::endl; + exit(-1); + } + } + } source.close(); } diff --git a/meshing_scripts/gen_decomp_meshes.py b/meshing_scripts/gen_decomp_meshes.py new file mode 100644 index 00000000..21acb8b7 --- /dev/null +++ b/meshing_scripts/gen_decomp_meshes.py @@ -0,0 +1,172 @@ +import os +import subprocess + +mesh_script = "./create_full_mesh.py" + +# ----- + +# double shock reflection +xbounds = [0.0, 4.0] +ybounds = [0.0, 1.0] +zbounds = [None, None] + +Nx = 200 +Ny = 50 +Nz = 0 + +ndom_x = 2 +ndom_y = 2 +ndom_z = 1 + +stencil = 3 + +overlap = 2 + +outdir_base = "/home/crwentl/research/code/pressio-demoapps/build-debug-noprint/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/meshes/mesh_2x2" + +# ----- + +ndim = 1 + +assert int(overlap/2) == (overlap/2), "Overlap must be even for now (FIX)" +assert Nx > 0 +assert Ny >= 0 +assert Nz >= 0 +assert ndom_x > 0 +assert all([bound is not None for bound in xbounds]) +assert xbounds[1] > xbounds[0] +if Ny > 0: + assert ndom_y > 0 + assert all([bound is not None for bound in ybounds]) + assert ybounds[1] > ybounds[0] + ndim += 1 + if Nz > 0: + assert ndom_z > 0 + assert all([bound is not None for bound in zbounds]) + assert zbounds[1] > zbounds[0] + ndim += 1 +else: + assert Nz == 0 + +def prep_dim(N, ndom, bounds): + d = (bounds[1] - bounds[0]) / N + N_dom = [int(N / ndom)] * ndom + fill = N - int(N / ndom) * ndom + for idx in range(fill): + N_dom[idx] += 1 + + return d, N_dom + +def prep_dom_dim(dom_idx, ndom, N_dom, offset, bounds, d): + + # cells + n = N_dom[dom_idx] + if ndom > 1: + if (dom_idx == 0) or (dom_idx == (ndom - 1)): + n += offset + else: + n += 2 * offset + + # bounds + bound = [None, None] + if dom_idx == 0: + bound[0] = bounds[0] + else: + bound[0] = (sum(N_dom[:dom_idx]) - offset) * d + if (dom_idx == ndom - 1): + bound[1] = bounds[1] + else: + bound[1] = (sum(N_dom[:dom_idx+1]) + offset) * d + + return n, bound + +def main(): + + offset = int(overlap / 2) + + dx, Nx_dom = prep_dim(Nx, ndom_x, xbounds) + if (Ny > 0): + dy, Ny_dom = prep_dim(Ny, ndom_y, ybounds) + if (Nz > 0): + dz, Nz_dom = prep_dim(Nz, ndom_z, zbounds) + + dom_count = 0 + xbound = [None, None] + ybound = [None, None] + zbound = [None, None] + for dom_z in range(ndom_z): + for dom_y in range(ndom_y): + for dom_x in range(ndom_x): + + print("Domain " + str(dom_count)) + print("Cells: ", end='') + + # subdomain dimensions + nx, xbound = prep_dom_dim( + dom_x, ndom_x, Nx_dom, offset, xbounds, dx + ) + print(str(nx), end='') + if Ny > 0: + ny, ybound = prep_dom_dim( + dom_y, ndom_y, Ny_dom, offset, ybounds, dy + ) + print(" x " + str(ny), end='') + if Nz > 0: + nz, zbound = prep_dom_dim( + dom_z, ndom_z, Nz_dom, offset, zbounds, dz + ) + print(" x " + str(nz), end='') + print("") + + print("x-bounds: (" + str(xbound[0]) + ", " + str(xbound[1]) + ")") + if Ny > 0: + print("y-bounds: (" + str(ybound[0]) + ", " + str(ybound[1]) + ")") + if Nz > 0: + print("z-bounds: (" + str(zbound[0]) + ", " + str(zbound[1]) + ")") + + # subdomain mesh subdirectory + outdir = os.path.join(outdir_base, "domain_" + str(dom_count)) + if not os.path.isdir(outdir): + os.makedirs(outdir) + print("Output directory: " + outdir) + + if Ny == 0: + args = ("python3", mesh_script, + "-n", str(nx), + "--outDir", outdir, + "--stencilSize", str(stencil), + "--bounds", str(xbound[0]), str(xbound[1])) + elif Nz == 0: + args = ("python3", mesh_script, + "-n", str(nx), str(ny), + "--outDir", outdir, + "--stencilSize", str(stencil), + "--bounds", str(xbound[0]), str(xbound[1]), + str(ybound[0]), str(ybound[1]), + ) + else: + args = ("python3", mesh_script, + "-n", str(nx), str(ny), str(nz), + "--outDir", outdir, + "--stencilSize", str(stencil), + "--bounds", str(xbound[0]), str(xbound[1]), + str(ybound[0]), str(ybound[1]), + str(zbound[0]), str(zbound[1]), + ) + + popen = subprocess.Popen(args, stdout=subprocess.PIPE); popen.wait() + + dom_count += 1 + + with open(os.path.join(outdir_base, "info_domain.dat"), "w") as f: + f.write("dim %8d\n" % ndim) + f.write("ndomX %8d\n" % ndom_x) + if Ny > 0: + f.write("ndomY %8d\n" % ndom_y) + if Nz > 0: + f.write("ndomZ %8d\n" % ndom_y) + + f.write("overlap %8d\n" % overlap) + +if __name__ == "__main__": + main() diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt index 2b67228f..72fa6fe2 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt @@ -6,7 +6,7 @@ configure_file(../compare.py compare.py COPYONLY) configure_file(rho_gold.txt rho_gold.txt COPYONLY) configure_file(../plot.py plot.py COPYONLY) -add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main_FR.cc) +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) add_test(NAME ${testname} COMMAND ${CMAKE_COMMAND} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc index bf6e5897..62c3f3bc 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -4,60 +4,579 @@ #include "pressiodemoapps/euler2d.hpp" #include "../observer.hpp" +using namespace std; +namespace pda = pressiodemoapps; +namespace plog = pressio::log; +namespace pode = pressio::ode; +namespace pls = pressio::linearsolvers; +namespace pnls = pressio::nonlinearsolvers; + +// TODO: Schwarz classes don't need access to appVec, should be fine with meshVec + +// forward declarations +void calc_neighbor_dims(int, int, int, int, vector> &); +template vector calc_exch_graph( + const int, const int, const int, const int, const int, const vector &, const vector> &); +template void broadcast_bcState( + const int, const int, const int, vector &, vector &, + const vector &, const vector> &, const vector &); +template vector calc_ghost_graph( + const int, const int, const vector &, const vector> &); + int main() { - pressio::log::initialize(pressio::logto::terminal); - pressio::log::setVerbosity({pressio::log::level::debug}); - namespace pda = pressiodemoapps; - const auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("."); + plog::initialize(pressio::logto::terminal); + plog::setVerbosity({pressio::log::level::debug}); + + // ---- user inputs - constexpr auto order = pda::InviscidFluxReconstruction::FirstOrder; - const auto probId = pda::Euler2d::DoubleMachReflection; + string meshRoot = "./meshes/mesh_2x2"; + // string meshRoot = "./meshes/mesh_2x2_small"; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto probId = pda::Euler2d::DoubleMachReflection; + const auto scheme = pode::StepScheme::CrankNicolson; + const int numSteps = 200; + const int convergeStepMax = 5; + vector dt = {0.001, 0.001, 0.001, 0.001}; + // vector dt = {0.0025, 0.0025, 0.0025, 0.0025}; + + // ---- end user inputs - auto appObj = pda::create_problem_eigen(meshObj, probId, order); - using app_t = decltype(appObj); + // load mesh info + // TODO: move this into a function that just initializes meshVec + int dim; + int ndomX, ndomY, ndomZ; + int overlap; + pda::impl::read_domain_info(meshRoot, dim, ndomX, ndomY, ndomZ, overlap); + const int ndomains = ndomX * ndomY; + + // dt setup + if (dt.size() == 1) { + dt.resize(ndomains, dt[0]); + } else { + if (dt.size() != ndomains) { + cerr << "dt.size() must be 1 or ndomains, exiting" << endl; + exit(-1); + } + } + + // controller step setup + double dtMax = *max_element(dt.begin(), dt.end()); + vector controlIters(ndomains); + double integral; + for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { + double niters = dtMax / dt[domIdx]; + if (round(niters) == niters) { + controlIters[domIdx] = int(round(niters)); + } else { + cerr << "dt of domain " << domIdx << " (" << dt[domIdx] << ") is not an integer divisor of maximum dt (" << dtMax << ")" << endl; + exit(-1); + } + } + + // aliases + using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_0") ); + using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); using state_t = typename app_t::state_type; using jacob_t = typename app_t::jacobian_type; + using lin_solver_t = pls::Solver; + using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); + using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); + using obs_t = FomObserver; + using graph_t = typename mesh_t::graph_t; + + // problem vectors initialization + lin_solver_t linSolverObj; + vector meshVec(ndomains); + vector appVec(ndomains); + vector stateVec(ndomains); + vector> stateVecHist(ndomains, vector(2)); // + vector stepperVec; + vector nonlinSolverVec; + vector obsVec(ndomains); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) + { + meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); + stateVec[domIdx] = appVec[domIdx].initialCondition(); + // for (int histIdx = 0; histIdx < stateVecHist[domIdx].size(); ++histIdx) { + // stateVecHist[domIdx][histIdx] = stateVec[domIdx]; + // } - state_t state = appObj.initialCondition(); + stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); + nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); + nonlinSolverVec[domIdx].setTolerance(1e-5); - int numDomains = 4; - int nx = 50; - int ny = 50; - state_t v((nx + ny ) * 2 * 4); - std::vector vecStateBcs( numDomains, v); + obsVec[domIdx] = obs_t("doubleMach2d_solution_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, stateVec[domIdx]); + } - appObj.setStateBc(&vecStateBcs[0]); - // for (int domIdx = 0; domIdx < numDomains; ++domIdx){ - // vecApp[domIdx].setStateBc(vecStateBcs[domIdx]); - // } + // ++++++++ BOUNDARY SETUP +++++++++++ - auto stepperObj = pressio::ode::create_implicit_stepper( - pressio::ode::StepScheme::CrankNicolson, appObj); - using lin_solver_t = pressio::linearsolvers::Solver< - pressio::linearsolvers::iterative::Bicgstab, jacob_t>; - lin_solver_t linSolverObj; - auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); - NonLinSolver.setTolerance(1e-5); - - FomObserver Obs("doubleMach2d_solution.bin", 10); - - // for (int n = 0; n < numSteps; ++n){ - // double t = n * dt; - // while (conv > tol){ - // for (int domIdx = 0; domIdx < numDomains; ++domIdx){ - // advance_n_steps(stepperVec[domIdx], stateVec[domIdx], t, dt, - // 1, Obs, solverVec[domIdx]); - // // update stateBc using stateVec - // } - // conv = calcConvergence(stateVec); - // } + // set up Schwarz boundary graphs + const auto stencilSize = pda::reconstructionTypeToStencilSize(order); + const int numDofPerCell = 4; + const int bcStencilSize = (stencilSize - 1) / 2; + const int bcStencilDof = bcStencilSize * numDofPerCell; + const int maxDomNeighbors = 4; // generalize to 2*ndim + + // determine neighboring domain IDs, + vector> exchDomIdVec(ndomains, vector(maxDomNeighbors, -1)); + calc_neighbor_dims(ndomX, ndomY, ndomZ, bcStencilDof, exchDomIdVec); + + // set up boundary broadcast patterns + const auto exchGraphVec = calc_exch_graph(ndomX, ndomY, ndomZ, overlap, bcStencilSize, appVec, exchDomIdVec); + + // create stateBcVec, sized accordingly + vector stateBcVec(ndomains); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // TODO: count numDofStencilBc AS NEEDED; lowers memory usage, but makes communication more difficult + const auto meshObj = meshVec[domIdx]; + int numDofStencilBc = 2 * bcStencilDof * (meshObj.nx() + meshObj.ny() + meshObj.nz()); + pda::resize(stateBcVec[domIdx], numDofStencilBc); + for (int dof = 0; dof < stateBcVec[domIdx].size(); ++dof) { + stateBcVec[domIdx](dof) = 0.0; + } + } + + // first communication, set internal pointer + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); + appVec[domIdx].setStateBc(&stateBcVec[domIdx]); + } + + // graph linking cell index to bcState start index + auto ghostGraphVec = calc_ghost_graph(ndomains, numDofPerCell, meshVec, exchDomIdVec); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); + } + + // TO REVERT TO NO EXCHANGE + // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // for (int row = 0; row < ghostGraphVec[domIdx].rows(); ++row) { + // for (int col = 0; col < ghostGraphVec[domIdx].cols(); ++col) { + // ghostGraphVec[domIdx](row, col) = -1; + // } // } + // } + + // +++++++++ SOLVE ++++++++++++ + + // controller outer loop + double time = 0.0; + // cerr << "NO SOLVE YET" << endl; + // exit(-1); + for (int outerStep = 1; outerStep <= numSteps; ++outerStep) + { + cout << "Step " << outerStep << endl; + + // convergence + bool converged = false; + int convergeStep = 0; + while ((!converged) && (convergeStep < convergeStepMax)) { + + // domain loop + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + cerr << "Domain " << domIdx << endl; + + // reset to beginning of controller time + auto timeDom = time; + auto stepDom = outerStep * controlIters[domIdx]; + + const auto dtDom = dt[domIdx]; + const auto dtWrap = pode::StepSize(dtDom); + + // controller inner loop + for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { + + const auto startTimeWrap = pode::StepStartAt(timeDom); + const auto stepWrap = pode::StepCount(stepDom); + + stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); + + // store inner step history + + // set (interpolated) boundary conditions + - const auto dt = 0.0025; - const auto Nsteps = pressio::ode::StepCount(100); - pressio::ode::advance_n_steps(stepperObj, state, 0., dt, Nsteps, Obs, NonLinSolver); + // update local step and time + stepDom++; + timeDom += dtDom; + + } + + // broadcast boundary conditions + broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); + + } + + // NOTE: REMOVE FOR TRUE IMPLEMENTATION + converged = true; + // convergeStep++; + + // reset interior state + + } + + // output and updates + const auto stepWrap = pode::StepCount(outerStep); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time + dtMax, stateVec[domIdx]); + + // update history + + // update boundary conditions + // broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); + + } + + time += dtMax; + + } return 0; } + +void calc_neighbor_dims( + int ndomX, + int ndomY, + int ndomZ, + int bcStencilDof, + vector> & exchDomIdVec) +{ + // TODO: extend to 3D + + const int ndomains = ndomX * ndomY * ndomZ; + vector numDofStencilBcVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + int i = domIdx % ndomX; + int j = domIdx / ndomX; + int neighborId; + + // left boundary + if (i != 0) { + neighborId = domIdx - 1; + exchDomIdVec[domIdx][0] = neighborId; + } + + // "front" boundary + if (j != (ndomY - 1)) { + neighborId = domIdx + ndomX; + exchDomIdVec[domIdx][1] = neighborId; + } + + // right boundary + if (i != (ndomX - 1)) { + neighborId = domIdx + 1; + exchDomIdVec[domIdx][2] = neighborId; + } + + // "back" boundary + if (j != 0) { + neighborId = domIdx - ndomX; + exchDomIdVec[domIdx][3] = neighborId; + } + + // TODO: for 3D, need "bottom" and "top" + + } +} + +template +vector calc_exch_graph( + const int ndomX, + const int ndomY, + const int ndomZ, + const int overlap, + const int bcStencilSize, + const vector & appVec, + const vector> & exchDomIdVec) +{ + // TODO: extend to 3D + + // BC cell indexing + // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ + // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ + // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| + // ¦_(2,1)_¦_(2,0)_|________|________|________|________|________|_(11,1)_¦_(11,0)_| + // ¦_(1,1)_¦_(1,0)_|________|________|________|________|________|_(10,1)_¦_(10,0)_| + // ¦_(0,1)_¦_(0,0)_|________|________|________|________|________|_(9, 1)_¦_(9, 0)_| + // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ + // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ + + const int ndomains = ndomX * ndomY * ndomZ; + vector exchGraphVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // this domain's mesh and dimensions + const auto domMesh = appVec[domIdx].getMesh(); + const auto domGraph = domMesh.graph(); + int nx = domMesh.nx(); + int ny = domMesh.ny(); + + const auto & x = domMesh.viewX(); + const auto & y = domMesh.viewY(); + + // TODO: generalize to 3D + pda::resize(exchGraphVec[domIdx], 2*nx + 2*ny, bcStencilSize); + + // loop through neighboring domains + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + // neighboring domain mesh and dimensions + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + + int exchCellIdx; + + // east-west neighbors will share a row index + // left + if (neighIdx == 0) { + if (ny != nyNeigh) { + cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; + exit(-1); + } + + int bcCellIdx = 0; // left boundary is the start + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // north-south neighbors will share a column index + // "front" + if (neighIdx == 1) { + if (nx != nxNeigh) { + cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; + exit(-1); + } + + int bcCellIdx = ny * bcStencilSize; // skip left boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = (overlap + stencilIdx) * nxNeigh + xIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // right + if (neighIdx == 2) { + if (ny != nyNeigh) { + cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; + exit(-1); + } + + int bcCellIdx = (ny + nx) * bcStencilSize; // skip left and "front" boundary indices + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // "back" + if (neighIdx == 3) { + if (nx != nxNeigh) { + cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; + exit(-1); + } + + int bcCellIdx = (2*ny + nx) * bcStencilSize; // skip left, "front", and right boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = (nyNeigh - 1 - overlap - stencilIdx) * nxNeigh + xIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // TODO: generalize to 3D + + } // neighbor loop + + } // domain loop + + return exchGraphVec; + +} + +template +void comm_stateBc( + const int startIdx, + const int endIdx, + const int bcStencilSize, + const int dofPerCell, + const graph_t & exchGraph, + state_t & bcState, + const state_t & intState) +{ + + int exchCellIdx; + for (int bcCellIdx = startIdx; bcCellIdx < endIdx; ++bcCellIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = exchGraph(bcCellIdx, stencilIdx); + for (int dof = 0; dof < dofPerCell; ++dof) { + bcState((bcCellIdx + stencilIdx) * dofPerCell + dof) = intState(exchCellIdx * dofPerCell + dof); + } + } + } + +} + +template +void broadcast_bcState( + const int domIdx, + const int dofPerCell, + const int bcStencilSize, + vector & stateVec, + vector & stateBcVec, + const vector & appVec, + const vector> & exchDomIdVec, + const vector & exchGraphVec) +{ + + const auto domState = stateVec[domIdx]; + + int exchCellIdx; + int startIdx; + int endIdx; + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + auto * neighStateBc = &stateBcVec[neighDomIdx]; + const auto neighExchGraph = exchGraphVec[neighDomIdx]; + + // this domain is the neighboring domain's left neighbor + if (neighIdx == 2) { + startIdx = 0; + endIdx = nyNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's front neighbor + if (neighIdx == 3) { + startIdx = nyNeigh; + endIdx = nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's right neighbor + if (neighIdx == 0) { + startIdx = nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's back neighbor + if (neighIdx == 1) { + startIdx = 2 * nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + 2 * nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + } + +} + +template +vector calc_ghost_graph( + const int ndomains, + const int dofPerCell, + const vector & meshVec, + const vector> & exchDomIdVec) +{ + + vector ghostGraphVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + const auto meshObj = meshVec[domIdx]; + const auto intGraph = meshObj.graph(); + int nx = meshObj.nx(); + int ny = meshObj.ny(); + + const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); + pda::resize(ghostGraphVec[domIdx], int(rowsBd.size()), 4); // TODO: generalize to 2 * ndim + ghostGraphVec[domIdx].setOnes(); + ghostGraphVec[domIdx] *= -1; + + for (decltype(rowsBd.size()) it = 0; it < rowsBd.size(); ++it) { + + // ASK FRANCESCO: is there an instance when rowsBd[it] != intGraph(rowsBd[it], 0)? + // The indices appear to be identical + // TODO: this is all totally wrong for higher order + + const auto smPt = rowsBd[it]; + const auto left0 = intGraph(smPt, 1); + const auto front0 = intGraph(smPt, 2); + const auto right0 = intGraph(smPt, 3); + const auto back0 = intGraph(smPt, 4); + + int stencilIdx = 0; // first order + int rowIdx = smPt / nx; + int colIdx = smPt % nx; + int bcCellIdx; + + if (left0 == -1) { + if (exchDomIdVec[domIdx][0] != -1) { + bcCellIdx = rowIdx; + ghostGraphVec[domIdx](it, 0) = bcCellIdx * dofPerCell; + } + } + + if (front0 == -1) { + if (exchDomIdVec[domIdx][1] != -1) { + bcCellIdx = ny + colIdx; + ghostGraphVec[domIdx](it, 1) = bcCellIdx * dofPerCell; + } + } + + if (right0 == -1) { + if (exchDomIdVec[domIdx][2] != -1) { + bcCellIdx = ny + nx + rowIdx; + ghostGraphVec[domIdx](it, 2) = bcCellIdx * dofPerCell; + } + } + + if (back0 == -1) { + if (exchDomIdVec[domIdx][3] != -1) { + bcCellIdx = 2 * ny + nx + colIdx; + ghostGraphVec[domIdx](it, 3) = bcCellIdx * dofPerCell; + } + } + // TODO: extend to higher order, 3D + + } + } + + return ghostGraphVec; + +} \ No newline at end of file diff --git a/tests_cpp/observer.hpp b/tests_cpp/observer.hpp index 24b187f1..0b5c34d9 100644 --- a/tests_cpp/observer.hpp +++ b/tests_cpp/observer.hpp @@ -14,6 +14,10 @@ class FomObserver myfile0_.close(); } + FomObserver() = default; + FomObserver & operator=(FomObserver &) = default; + FomObserver & operator=(FomObserver &&) = default; + template void operator()(const pressio::ode::StepCount stepIn, const TimeType /*timein*/, From aee2a5f211af58fac8f4769c7dad563dcc5a4c0f Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Fri, 2 Jun 2023 09:11:45 -0700 Subject: [PATCH 08/17] implement Schwarz convergence, fix graph_t unavailable in other problem classes --- .../impl/advection_1d_prob_class.hpp | 1 + .../advection_diffusion_2d_prob_class.hpp | 1 + .../impl/diffusion_reaction_1d_prob_class.hpp | 1 + .../impl/diffusion_reaction_2d_prob_class.hpp | 1 + .../impl/euler_1d_prob_class.hpp | 1 + .../impl/euler_3d_prob_class.hpp | 1 + .../impl/swe_2d_prob_class.hpp | 1 + .../main.cc | 184 ++++++++++++------ 8 files changed, 131 insertions(+), 60 deletions(-) diff --git a/include/pressiodemoapps/impl/advection_1d_prob_class.hpp b/include/pressiodemoapps/impl/advection_1d_prob_class.hpp index e4efeed1..d62f8dfa 100644 --- a/include/pressiodemoapps/impl/advection_1d_prob_class.hpp +++ b/include/pressiodemoapps/impl/advection_1d_prob_class.hpp @@ -78,6 +78,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{1}; diff --git a/include/pressiodemoapps/impl/advection_diffusion_2d_prob_class.hpp b/include/pressiodemoapps/impl/advection_diffusion_2d_prob_class.hpp index da25571e..d7a5da58 100644 --- a/include/pressiodemoapps/impl/advection_diffusion_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/advection_diffusion_2d_prob_class.hpp @@ -86,6 +86,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{2}; diff --git a/include/pressiodemoapps/impl/diffusion_reaction_1d_prob_class.hpp b/include/pressiodemoapps/impl/diffusion_reaction_1d_prob_class.hpp index 672afbc4..35b91ea9 100644 --- a/include/pressiodemoapps/impl/diffusion_reaction_1d_prob_class.hpp +++ b/include/pressiodemoapps/impl/diffusion_reaction_1d_prob_class.hpp @@ -71,6 +71,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{1}; diff --git a/include/pressiodemoapps/impl/diffusion_reaction_2d_prob_class.hpp b/include/pressiodemoapps/impl/diffusion_reaction_2d_prob_class.hpp index e90db2c5..13254844 100644 --- a/include/pressiodemoapps/impl/diffusion_reaction_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/diffusion_reaction_2d_prob_class.hpp @@ -76,6 +76,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{2}; diff --git a/include/pressiodemoapps/impl/euler_1d_prob_class.hpp b/include/pressiodemoapps/impl/euler_1d_prob_class.hpp index fc469713..69fbd72e 100644 --- a/include/pressiodemoapps/impl/euler_1d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_1d_prob_class.hpp @@ -78,6 +78,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{1}; diff --git a/include/pressiodemoapps/impl/euler_3d_prob_class.hpp b/include/pressiodemoapps/impl/euler_3d_prob_class.hpp index 61043c2c..e57a8097 100644 --- a/include/pressiodemoapps/impl/euler_3d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_3d_prob_class.hpp @@ -78,6 +78,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; static constexpr int dimensionality{3}; static constexpr int numDofPerCell{5}; diff --git a/include/pressiodemoapps/impl/swe_2d_prob_class.hpp b/include/pressiodemoapps/impl/swe_2d_prob_class.hpp index ac261afc..022cb206 100644 --- a/include/pressiodemoapps/impl/swe_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/swe_2d_prob_class.hpp @@ -85,6 +85,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{2}; diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc index 62c3f3bc..c827640e 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -16,12 +16,14 @@ namespace pnls = pressio::nonlinearsolvers; // forward declarations void calc_neighbor_dims(int, int, int, int, vector> &); template vector calc_exch_graph( - const int, const int, const int, const int, const int, const vector &, const vector> &); + const int, const int, const int, const vector &, const vector> &); template void broadcast_bcState( const int, const int, const int, vector &, vector &, const vector &, const vector> &, const vector &); template vector calc_ghost_graph( const int, const int, const vector &, const vector> &); +template array calcConvergence( + const state_t, const state_t, const int); int main() { @@ -31,16 +33,16 @@ int main() // ---- user inputs - string meshRoot = "./meshes/mesh_2x2"; - // string meshRoot = "./meshes/mesh_2x2_small"; + string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; const auto order = pda::InviscidFluxReconstruction::FirstOrder; const auto probId = pda::Euler2d::DoubleMachReflection; const auto scheme = pode::StepScheme::CrankNicolson; - const int numSteps = 200; - const int convergeStepMax = 5; - vector dt = {0.001, 0.001, 0.001, 0.001}; - // vector dt = {0.0025, 0.0025, 0.0025, 0.0025}; - + const int numSteps = 100; + const int convergeStepMax = 10; + vector dt(4, 0.002); + // vector dt(4, 0.0025); // TODO: solver just gives up on domIdx > 0 for this time step + double abs_err_tol = 1e-13; + double rel_err_tol = 1e-13; // ---- end user inputs // load mesh info @@ -60,7 +62,7 @@ int main() exit(-1); } } - + // controller step setup double dtMax = *max_element(dt.begin(), dt.end()); vector controlIters(ndomains); @@ -87,22 +89,25 @@ int main() using graph_t = typename mesh_t::graph_t; // problem vectors initialization - lin_solver_t linSolverObj; + lin_solver_t linSolverObj; vector meshVec(ndomains); + vector ncellsVec(ndomains); vector appVec(ndomains); vector stateVec(ndomains); - vector> stateVecHist(ndomains, vector(2)); // + vector> stateHistVec(ndomains); // intra-controller step history, for interpolation vector stepperVec; vector nonlinSolverVec; vector obsVec(ndomains); for (int domIdx = 0; domIdx < ndomains; ++domIdx) { meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); + ncellsVec[domIdx] = meshVec[domIdx].nx() * meshVec[domIdx].ny(); // TODO: generalize to 3D + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); stateVec[domIdx] = appVec[domIdx].initialCondition(); - // for (int histIdx = 0; histIdx < stateVecHist[domIdx].size(); ++histIdx) { - // stateVecHist[domIdx][histIdx] = stateVec[domIdx]; - // } + for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { // includes initial controller step solution + stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); + } stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); @@ -120,13 +125,13 @@ int main() const int bcStencilSize = (stencilSize - 1) / 2; const int bcStencilDof = bcStencilSize * numDofPerCell; const int maxDomNeighbors = 4; // generalize to 2*ndim - - // determine neighboring domain IDs, + + // determine neighboring domain IDs, vector> exchDomIdVec(ndomains, vector(maxDomNeighbors, -1)); calc_neighbor_dims(ndomX, ndomY, ndomZ, bcStencilDof, exchDomIdVec); // set up boundary broadcast patterns - const auto exchGraphVec = calc_exch_graph(ndomX, ndomY, ndomZ, overlap, bcStencilSize, appVec, exchDomIdVec); + const auto exchGraphVec = calc_exch_graph(ndomains, overlap, bcStencilSize, appVec, exchDomIdVec); // create stateBcVec, sized accordingly vector stateBcVec(ndomains); @@ -152,42 +157,37 @@ int main() appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); } - // TO REVERT TO NO EXCHANGE - // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - // for (int row = 0; row < ghostGraphVec[domIdx].rows(); ++row) { - // for (int col = 0; col < ghostGraphVec[domIdx].cols(); ++col) { - // ghostGraphVec[domIdx](row, col) = -1; - // } - // } - // } - // +++++++++ SOLVE ++++++++++++ // controller outer loop double time = 0.0; - // cerr << "NO SOLVE YET" << endl; - // exit(-1); + double abs_err, rel_err; + vector> convergeVals(ndomains); for (int outerStep = 1; outerStep <= numSteps; ++outerStep) { cout << "Step " << outerStep << endl; + // store initial step for resetting + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateHistVec[domIdx][0] = stateVec[domIdx]; + } + // convergence - bool converged = false; int convergeStep = 0; - while ((!converged) && (convergeStep < convergeStepMax)) { + while (convergeStep < convergeStepMax) { + + cerr << "Schwarz iteration " << convergeStep + 1 << endl; // domain loop for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - cerr << "Domain " << domIdx << endl; - // reset to beginning of controller time auto timeDom = time; auto stepDom = outerStep * controlIters[domIdx]; const auto dtDom = dt[domIdx]; const auto dtWrap = pode::StepSize(dtDom); - + // controller inner loop for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { @@ -196,11 +196,17 @@ int main() stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); - // store inner step history + // for last iteration, compute convergence criteria + // important to do this before saving history, as stateHistVec still has last convergence loop's state + if (innerStep == (controlIters[domIdx] - 1)) { + convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back(), ncellsVec[domIdx]); + } + + // store intra-step history + stateHistVec[domIdx][innerStep + 1] = stateVec[domIdx]; // set (interpolated) boundary conditions - // update local step and time stepDom++; timeDom += dtDom; @@ -212,11 +218,27 @@ int main() } - // NOTE: REMOVE FOR TRUE IMPLEMENTATION - converged = true; - // convergeStep++; + // check convergence for all domains, break if conditions met + abs_err = 0.0; + rel_err = 0.0; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + abs_err += convergeVals[domIdx][0]; + rel_err += convergeVals[domIdx][1]; + } + abs_err /= ndomains; + rel_err /= ndomains; + cerr << "Average abs err: " << abs_err << endl; + cerr << "Average rel err: " << rel_err << endl; + if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { + break; + } + + convergeStep++; - // reset interior state + // reset interior state if not converged + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateVec[domIdx] = stateHistVec[domIdx][0]; + } } @@ -224,18 +246,11 @@ int main() const auto stepWrap = pode::StepCount(outerStep); for (int domIdx = 0; domIdx < ndomains; ++domIdx) { obsVec[domIdx](stepWrap, time + dtMax, stateVec[domIdx]); - - // update history - - // update boundary conditions - // broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); - } time += dtMax; } - return 0; } @@ -256,7 +271,7 @@ void calc_neighbor_dims( int i = domIdx % ndomX; int j = domIdx / ndomX; int neighborId; - + // left boundary if (i != 0) { neighborId = domIdx - 1; @@ -288,18 +303,18 @@ void calc_neighbor_dims( template vector calc_exch_graph( - const int ndomX, - const int ndomY, - const int ndomZ, + const int ndomains, const int overlap, const int bcStencilSize, - const vector & appVec, - const vector> & exchDomIdVec) + const vector & appVec, + const vector> & exchDomIdVec) { // TODO: extend to 3D - - // BC cell indexing - // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + + // BC cell indexing example + // L/R is from bottom to top, F/B is from left to right + // Trying to mix cell ordering and face ordering + // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| @@ -309,7 +324,6 @@ vector calc_exch_graph( // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ - const int ndomains = ndomX * ndomY * ndomZ; vector exchGraphVec(ndomains); for (int domIdx = 0; domIdx < ndomains; ++domIdx) { @@ -325,6 +339,8 @@ vector calc_exch_graph( // TODO: generalize to 3D pda::resize(exchGraphVec[domIdx], 2*nx + 2*ny, bcStencilSize); + exchGraphVec[domIdx].setOnes(); + exchGraphVec[domIdx] *= -1; // loop through neighboring domains for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { @@ -352,7 +368,8 @@ vector calc_exch_graph( int bcCellIdx = 0; // left boundary is the start for (int yIdx = 0; yIdx < ny; ++yIdx) { for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; } bcCellIdx++; @@ -388,6 +405,9 @@ vector calc_exch_graph( for (int yIdx = 0; yIdx < ny; ++yIdx) { for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; + // TODO: check for a different problem + // exchCellIdx = nxNeigh * yIdx + overlap - 1 + stencilIdx; // toward boundary + // exchCellIdx = nxNeigh * yIdx + overlap + 1 + stencilIdx; // away from boundary exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; } bcCellIdx++; @@ -414,7 +434,6 @@ vector calc_exch_graph( // TODO: generalize to 3D } // neighbor loop - } // domain loop return exchGraphVec; @@ -453,7 +472,7 @@ void broadcast_bcState( vector & stateBcVec, const vector & appVec, const vector> & exchDomIdVec, - const vector & exchGraphVec) + const vector & exchGraphVec) { const auto domState = stateVec[domIdx]; @@ -574,9 +593,54 @@ vector calc_ghost_graph( } // TODO: extend to higher order, 3D + } // boundary cell loop + } // domain loop + + return ghostGraphVec; + +} + + +template +array calcConvergence( + const state_t state1, + const state_t state2, + const int numElems) +{ + // TODO: assumed to be an Eigen state, not sure how to generalize + // TODO: compute convergence for each variable separately + + int numDOF = state1.size(); + if (state2.size() != numDOF) { + cerr << "state1 size does not match state2 size, " << numDOF << " vs. " << state2.size() << endl; + exit(-1); + } + double numDOFPerCellD = double(numDOF) / numElems; + if (round(numDOFPerCellD) != numDOFPerCellD) { + cerr << "Computed a non-integer number of variables: " << numDOFPerCellD << endl; + exit(-1); + } + int numDOFPerCell = round(numDOFPerCellD); + + // absolute error + double abs_err = (state1 - state2).squaredNorm(); + + // handle edge cases for relative error + double rel_err; + double basenorm = state1.squaredNorm(); + if (basenorm > 0) { + rel_err = abs_err / basenorm; + } + else { + if (abs_err > 0) { + rel_err = 1.0; + } + else { + rel_err = 0.0; } } - return ghostGraphVec; + array errArr = {abs_err, rel_err}; + return errArr; } \ No newline at end of file From 97ce3fb0656395c7aad223b77d455055a7327a75 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Tue, 6 Jun 2023 14:19:11 -0700 Subject: [PATCH 09/17] broken oop implementation --- include/pressiodemoapps/impl/schwarz.hpp | 813 ++++++++++++++++++ .../firstorder/CMakeLists.txt | 4 +- .../main_oop.cc | 83 ++ .../main_working.cc | 662 ++++++++++++++ 4 files changed, 1561 insertions(+), 1 deletion(-) create mode 100644 include/pressiodemoapps/impl/schwarz.hpp create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc create mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp new file mode 100644 index 00000000..e0ccd782 --- /dev/null +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -0,0 +1,813 @@ + + +#ifndef PRESSIODEMOAPPS_SCHWARZ_HPP_ +#define PRESSIODEMOAPPS_SCHWARZ_HPP_ + +#include +#include +#include +#include +#include + +#include "pressio/ode_steppers_implicit.hpp" + +using namespace std; + +namespace pressiodemoapps{ namespace impl { + + namespace pda = pressiodemoapps; + namespace pode = pressio::ode; + namespace pls = pressio::linearsolvers; + namespace pnls = pressio::nonlinearsolvers; + + template< + class prob_t, + class order_t, + class scheme_t + // class linsolver_t + > + class SchwarzDecomp + { + + public: + + using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(declval()) ); + using graph_t = typename mesh_t::graph_t; + using app_t = decltype( pda::create_problem_eigen(declval(), declval(), declval()) ); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + using stepper_t = decltype( pode::create_implicit_stepper(declval(), declval()) ); + // TODO: generalize + using linsolver_t = pls::Solver; + using nonlinsolver_t = decltype( pnls::create_newton_raphson( declval(), declval()) ); + + public: + + SchwarzDecomp( + prob_t probId, + order_t order, + scheme_t scheme, + const std::string & meshRoot, + vector & dtVec) + { + + // get decomposition info + read_domain_info(meshRoot); + ndomains = ndomX * ndomY * ndomZ; + + // set up problem + setup_controller(dtVec); + init_problem(probId, order, scheme, meshRoot); + + // set up communication patterns + bcStencilSize = (pda::reconstructionTypeToStencilSize(order) - 1) / 2; + exchDomIdVec = calc_neighbor_dims(); + check_mesh_compat(); // a little error checking + exchGraphVec = calc_exch_graph(bcStencilSize, exchDomIdVec); + stateBcVec = init_schw_bc_state(); + + // first communication, set internal pointer + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + broadcast_bcState(domIdx); + appVec[domIdx].setStateBc(&stateBcVec[domIdx]); + } + + // set up ghost filling graph, set internal pointer + ghostGraphVec = calc_ghost_graph(); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // cerr << "Domain " << domIdx << endl; + // cerr << ghostGraphVec[domIdx] << endl; + appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); + } + + } + + private: + + void read_domain_info(const string & meshRoot) + { + const auto inFile = meshRoot + "/info_domain.dat"; + std::ifstream foundFile(inFile); + if(!foundFile){ + std::cout << "file not found " << inFile << std::endl; + exit(EXIT_FAILURE); + } + + // defaults + ndomX = 1; + ndomY = 1; + ndomZ = 1; + + std::ifstream source( inFile, std::ios_base::in); + std::string line; + while (std::getline(source, line) ) + { + std::istringstream ss(line); + std::string colVal; + ss >> colVal; + + if (colVal == "dim"){ + ss >> colVal; + dim = std::stoi(colVal); + } + + else if (colVal == "ndomX"){ + ss >> colVal; + ndomX = std::stoi(colVal); + } + + else if (colVal == "ndomY"){ + ss >> colVal; + ndomY = std::stoi(colVal); + } + + else if (colVal == "ndomZ"){ + ss >> colVal; + ndomZ = std::stoi(colVal); + } + + else if (colVal == "overlap"){ + ss >> colVal; + overlap = std::stoi(colVal); + // has to be an even number for simplicity, can change later + if (overlap % 2) { + std::cerr << "overlap must be an even number" << std::endl; + exit(-1); + } + } + } + source.close(); + } + + void setup_controller(vector & dtVec) { + + // physical time step checks + dt = dtVec; + if (dt.size() == 1) { + dt.resize(ndomains, dt[0]); + } else { + if (dt.size() != ndomains) { + cerr << "dt.size() must be 1 or ndomains, exiting" << endl; + exit(-1); + } + } + dtMax = *max_element(dt.begin(), dt.end()); + + // controller time step checks + controlIters.resize(ndomains); + for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { + double niters = dtMax / dt[domIdx]; + if (round(niters) == niters) { + controlIters[domIdx] = int(round(niters)); + } else { + cerr << "dt of domain " << domIdx << " (" << dt[domIdx] << ") is not an integer divisor of maximum dt (" << dtMax << ")" << endl; + exit(-1); + } + } + + } + + void init_problem( + prob_t probId, + order_t order, + scheme_t scheme, + const string & meshRoot) + { + // problem vectors initialization for each subdomain + + linsolver_t linSolverObj; + meshVec.resize(ndomains); + appVec.resize(ndomains); + stateVec.resize(ndomains); + stateHistVec.resize(ndomains); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) + { + + // mesh + meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); + + // problem and state + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); + stateVec[domIdx] = appVec[domIdx].initialCondition(); + for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { + stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); + } + + // time stepping + stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); + nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); + nonlinSolverVec[domIdx].setTolerance(1e-5); + + } + } + + vector> calc_neighbor_dims() + { + // determine neighboring domain IDs + + int maxDomNeighbors = 2 * dim; + vector> exchDomIds(ndomains, vector(maxDomNeighbors, -1)); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // subdomain indices + int i, j, k; + i = domIdx % ndomX; + if (dim > 1) { + j = domIdx / ndomX; + } + if (dim > 2) { + k = domIdx / (ndomX * ndomY); + } + + + // 1D, 2D, and 3D + // left boundary + if (i != 0) { + exchDomIds[domIdx][0] = domIdx - 1; + } + + // right boundary + if (i != (ndomX - 1)) { + // ordering change for 1D vs. 2D/3D faces + if (dim == 1) { + exchDomIds[domIdx][1] = domIdx + 1; + } + else { + exchDomIds[domIdx][2] = domIdx + 1; + } + } + + // 2D and 3D + if (dim > 1) { + // front boundary + if (j != (ndomY - 1)) { + exchDomIds[domIdx][1] = domIdx + ndomX; + } + + // back boundary + if (j != 0) { + exchDomIds[domIdx][3] = domIdx - ndomX; + } + } + + // 3D + if (dim > 2) { + // bottom boundary + if (k != 0) { + exchDomIds[domIdx][4] = domIdx - (ndomX * ndomY); + } + + // top boundary + if (k != (ndomZ - 1)) { + exchDomIds[domIdx][5] = domIdx + (ndomX * ndomY); + } + } + + } + + return exchDomIds; + + } + + void check_mesh_compat() { + + // TODO: extend this for differing (but aligned) mesh resolutions + if (dim == 1) return; // TODO: still need to check for differing 1D resolutions + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + const auto domMesh = appVec[domIdx].getMesh(); + int nx = domMesh.nx(); + int ny = domMesh.ny(); + int nz = domMesh.nz(); + + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + int nzNeigh = neighMesh.nz(); + + string xerr = "Mesh x-dimension mismatch for domains " + to_string(domIdx) + " v " + to_string(neighDomIdx) + ": " + to_string(nx) + " != " + to_string(nxNeigh); + string yerr = "Mesh y-dimension mismatch for domains " + to_string(domIdx) + " v " + to_string(neighDomIdx) + ": " + to_string(ny) + " != " + to_string(nyNeigh); + string zerr = "Mesh z-dimension mismatch for domains " + to_string(domIdx) + " v " + to_string(neighDomIdx) + ": " + to_string(nz) + " != " + to_string(nzNeigh); + + // left and right + if ((neighIdx == 0) || (neighIdx == 2)) { + if (ny != nyNeigh) { + cerr << yerr << endl; + exit(-1); + } + if (nz != nzNeigh) { + cerr << zerr << endl; + exit(-1); + } + } + + // front and back + if ((neighIdx == 1) || (neighIdx == 3)) { + if (nx != nxNeigh) { + cerr << xerr << endl; + exit(-1); + } + if (nz != nzNeigh) { + cerr << zerr << endl; + exit(-1); + } + } + + // bottom and top + if ((neighIdx == 4) || (neighIdx == 5)) { + if (nx != nxNeigh) { + cerr << xerr << endl; + exit(-1); + } + if (ny != nyNeigh) { + cerr << yerr << endl; + exit(-1); + } + } + + } // domain loop + } // neightbor loop + + } + + vector calc_exch_graph( + const int bcStencil, + const vector> & exchDomIds) + { + // TODO: extend to 3D + + // BC cell indexing example + // L/R is from bottom to top, F/B is from left to right + // Trying to mix cell ordering and face ordering + // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ + // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ + // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| + // ¦_(2,1)_¦_(2,0)_|________|________|________|________|________|_(11,1)_¦_(11,0)_| + // ¦_(1,1)_¦_(1,0)_|________|________|________|________|________|_(10,1)_¦_(10,0)_| + // ¦_(0,1)_¦_(0,0)_|________|________|________|________|________|_(9, 1)_¦_(9, 0)_| + // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ + // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ + + vector exchGraphs(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // this domain's mesh and dimensions + const auto domMesh = appVec[domIdx].getMesh(); + const auto domGraph = domMesh.graph(); + int nx = domMesh.nx(); + int ny = domMesh.ny(); + + const auto & x = domMesh.viewX(); + const auto & y = domMesh.viewY(); + + // TODO: generalize to 3D + pda::resize(exchGraphs[domIdx], 2*nx + 2*ny, bcStencil); + exchGraphs[domIdx].fill(-1); + + // loop through neighboring domains + for (int neighIdx = 0; neighIdx < exchDomIds[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIds[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + // neighboring domain mesh and dimensions + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + + int exchCellIdx; + + // east-west neighbors will share a row index + // left + if (neighIdx == 0) { + int bcCellIdx = 0; // left boundary is the start + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencil; ++stencilIdx) { + // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary + exchGraphs[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // north-south neighbors will share a column index + // "front" + if (neighIdx == 1) { + int bcCellIdx = ny * bcStencil; // skip left boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencil; ++stencilIdx) { + exchCellIdx = (overlap + stencilIdx) * nxNeigh + xIdx; + exchGraphs[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // right + if (neighIdx == 2) { + int bcCellIdx = (ny + nx) * bcStencil; // skip left and "front" boundary indices + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencil; ++stencilIdx) { + exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; + // TODO: check for a different problem + // exchCellIdx = nxNeigh * yIdx + overlap - 1 + stencilIdx; // toward boundary + // exchCellIdx = nxNeigh * yIdx + overlap + 1 + stencilIdx; // away from boundary + exchGraphs[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // "back" + if (neighIdx == 3) { + int bcCellIdx = (2*ny + nx) * bcStencil; // skip left, "front", and right boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencil; ++stencilIdx) { + exchCellIdx = (nyNeigh - 1 - overlap - stencilIdx) * nxNeigh + xIdx; + exchGraphs[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // TODO: generalize to 3D + + } // neighbor loop + } // domain loop + + return exchGraphs; + + } + + vector init_schw_bc_state() { + + int bcStencilDof = bcStencilSize * app_t::numDofPerCell; + vector stateBcs(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + const auto meshObj = meshVec[domIdx]; + int numDofStencilBc = 2 * bcStencilDof * (meshObj.nx() + meshObj.ny() + meshObj.nz()); + pda::resize(stateBcs[domIdx], numDofStencilBc); + stateBcs[domIdx].fill(0.0); + } + + return stateBcs; + + } + + void comm_stateBc( + const int startIdx, + const int endIdx, + const graph_t & exchGraph, + state_t & bcState, + const state_t & intState) + { + + int dofPerCell = app_t::numDofPerCell; + int exchCellIdx; + + for (int bcCellIdx = startIdx; bcCellIdx < endIdx; ++bcCellIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = exchGraph(bcCellIdx, stencilIdx); + for (int dof = 0; dof < dofPerCell; ++dof) { + bcState((bcCellIdx + stencilIdx) * dofPerCell + dof) = intState(exchCellIdx * dofPerCell + dof); + } + } + } + + } + + void broadcast_bcState(const int domIdx) + { + + const auto domState = stateVec[domIdx]; + + int exchCellIdx; + int startIdx; + int endIdx; + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + int nzNeigh = neighMesh.nz(); + auto * neighStateBc = &stateBcVec[neighDomIdx]; + const auto neighExchGraph = exchGraphVec[neighDomIdx]; + + // TODO: extend to 3D, need to change L/R and F/B indices to account for nzNeigh + + // this domain is the neighboring domain's left neighbor + if (neighIdx == 2) { + startIdx = 0; + endIdx = nyNeigh; + comm_stateBc(startIdx, endIdx, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's front neighbor + if (neighIdx == 3) { + startIdx = nyNeigh; + endIdx = nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's right neighbor + if (neighIdx == 0) { + startIdx = nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's back neighbor + if (neighIdx == 1) { + startIdx = 2 * nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + 2 * nxNeigh; + comm_stateBc(startIdx, endIdx, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's bottom neighbor + // if (neighIdx == 5) { + // startIdx = ; + // endIdx = ; + // } + + // this domain is the neighboring domain's top neighbor + // if (neighIdx == 4) { + // startIdx = ; + // endIdx = ; + // } + + // comm_stateBc(startIdx, endIdx, neighExchGraph, *neighStateBc, domState); + + } + + } + + vector calc_ghost_graph() + { + + int dofPerCell = app_t::numDofPerCell; + vector ghostGraphs(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + const auto meshObj = meshVec[domIdx]; + const auto intGraph = meshObj.graph(); + int nx = meshObj.nx(); + int ny = meshObj.ny(); + int nz = meshObj.nz(); + + const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); + pda::resize(ghostGraphs[domIdx], int(rowsBd.size()), 2 * dim); + ghostGraphs[domIdx].fill(-1); + + for (decltype(rowsBd.size()) it = 0; it < rowsBd.size(); ++it) { + + // ASK FR: is there an instance when rowsBd[it] != intGraph(rowsBd[it], 0)? + // The indices appear to be identical + // TODO: this is all totally wrong for higher order + + const auto smPt = rowsBd[it]; + const auto left0 = intGraph(smPt, 1); + const auto front0 = intGraph(smPt, 2); + const auto right0 = intGraph(smPt, 3); + const auto back0 = intGraph(smPt, 4); + + int stencilIdx = 0; // first order + int rowIdx = smPt / nx; + int colIdx = smPt % nx; + int bcCellIdx; + + if (left0 == -1) { + if (exchDomIdVec[domIdx][0] != -1) { + bcCellIdx = rowIdx; + ghostGraphs[domIdx](it, 0) = bcCellIdx * dofPerCell; + } + } + + if (front0 == -1) { + if (exchDomIdVec[domIdx][1] != -1) { + bcCellIdx = ny + colIdx; + ghostGraphs[domIdx](it, 1) = bcCellIdx * dofPerCell; + } + } + + if (right0 == -1) { + if (exchDomIdVec[domIdx][2] != -1) { + bcCellIdx = ny + nx + rowIdx; + ghostGraphs[domIdx](it, 2) = bcCellIdx * dofPerCell; + } + } + + if (back0 == -1) { + if (exchDomIdVec[domIdx][3] != -1) { + bcCellIdx = 2 * ny + nx + colIdx; + ghostGraphs[domIdx](it, 3) = bcCellIdx * dofPerCell; + } + } + // TODO: extend to higher order, 3D + + } // boundary cell loop + } // domain loop + + return ghostGraphs; + + } + + array calcConvergence(const state_t & state1, const state_t & state2) + { + // TODO: assumed to be an Eigen state, not sure how to generalize + // TODO: compute convergence for each variable separately + + int numDOF = state1.size(); + if (state2.size() != numDOF) { + cerr << "state1 size does not match state2 size, " << numDOF << " vs. " << state2.size() << endl; + exit(-1); + } + + // absolute error + double abs_err = (state1 - state2).squaredNorm(); + + // handle edge cases for relative error + double rel_err; + double basenorm = state1.squaredNorm(); + if (basenorm > 0) { + rel_err = abs_err / basenorm; + } + else { + if (abs_err > 0) { + rel_err = 1.0; + } + else { + rel_err = 0.0; + } + } + + array errArr = {abs_err, rel_err}; + return errArr; + + } + + public: + + void calc_controller_step( + int outerStep, + double time, + const double rel_err_tol, + const double abs_err_tol, + const int convergeStepMax) + { + + // store initial step for resetting if Schwarz iter does not converge + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateHistVec[domIdx][0] = stateVec[domIdx]; + } + + // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // cerr << "Domain " << domIdx << endl; + // for (int cell = 0; cell < ghostGraphVec[domIdx].rows(); ++cell) { + // cerr << "Cell " << cell << ":"; + // for (int neigh = 0; neigh < 4; ++neigh) { + // cerr << " " << ghostGraphVec[domIdx](cell, neigh); + // } + // cerr << endl; + // } + + // } + // exit(-1); + + // convergence + int convergeStep = 0; + vector> convergeVals(ndomains); + while (convergeStep < convergeStepMax) { + + cerr << "Schwarz iteration " << convergeStep + 1 << endl; + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // reset to beginning of controller time + auto timeDom = time; + auto stepDom = outerStep * controlIters[domIdx]; + + const auto dtDom = dt[domIdx]; + const auto dtWrap = pode::StepSize(dtDom); + + // controller inner loop + for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { + + const auto startTimeWrap = pode::StepStartAt(timeDom); + const auto stepWrap = pode::StepCount(stepDom); + + cerr << "stepperVec call" << endl; + stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); + + // for last iteration, compute convergence criteria + // important to do this before saving history, as stateHistVec still has last convergence loop's state + cerr << "calc convergence" << endl; + if (innerStep == (controlIters[domIdx] - 1)) { + convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back()); + } + + // store intra-step history + stateHistVec[domIdx][innerStep + 1] = stateVec[domIdx]; + + // set (interpolated) boundary conditions + + // update local step and time + stepDom++; + timeDom += dtDom; + + } // domain loop + + exit(-1); + + // broadcast boundary conditions + cerr << "Broadcast" << endl; + broadcast_bcState(domIdx); + + } + + // check convergence for all domains, break if conditions met + cerr << "Check convergence" << endl; + double abs_err = 0.0; + double rel_err = 0.0; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + abs_err += convergeVals[domIdx][0]; + rel_err += convergeVals[domIdx][1]; + } + abs_err /= ndomains; + rel_err /= ndomains; + cerr << "Average abs err: " << abs_err << endl; + cerr << "Average rel err: " << rel_err << endl; + if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { + break; + } + + convergeStep++; + + // reset interior state if not converged + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateVec[domIdx] = stateHistVec[domIdx][0]; + } + + } // convergence loop + + } + + + public: + + int ndomains; + double dtMax; + vector stateVec; + + private: + + // mesh decomposition + int dim; + int ndomX = 1; + int ndomY = 1; + int ndomZ = 1; + int overlap; + + // subdomain communication + int bcStencilSize; + int bcStencilDof; + vector> exchDomIdVec; + vector exchGraphVec; + vector stateBcVec; + vector ghostGraphVec; + + // time-stepping + vector dt; + vector controlIters; + + // problem vectors + vector meshVec; + vector appVec; + vector> stateHistVec; + vector stepperVec; + vector nonlinSolverVec; + + }; +}} + +#endif \ No newline at end of file diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt index 72fa6fe2..f708fcae 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt @@ -1,12 +1,14 @@ set(testname eigen_2d_double_mach_firstorder_implicit_schwarz) set(exename ${testname}_exe) +set(exenameoop ${testname}_oop_exe) configure_file(../compare.py compare.py COPYONLY) configure_file(rho_gold.txt rho_gold.txt COPYONLY) configure_file(../plot.py plot.py COPYONLY) -add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main_working.cc) +add_executable(${exenameoop} ${CMAKE_CURRENT_SOURCE_DIR}/../main_oop.cc) add_test(NAME ${testname} COMMAND ${CMAKE_COMMAND} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc new file mode 100644 index 00000000..08f3e923 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc @@ -0,0 +1,83 @@ + +#include "pressiodemoapps/euler2d.hpp" +#include "pressiodemoapps/impl/schwarz.hpp" +#include "../observer.hpp" + +using namespace std; + +int main() +{ + namespace pda = pressiodemoapps; + namespace plog = pressio::log; + namespace pode = pressio::ode; + namespace pls = pressio::linearsolvers; + namespace pnls = pressio::nonlinearsolvers; + + plog::initialize(pressio::logto::terminal); + plog::setVerbosity({pressio::log::level::debug}); + + // +++++ USER INPUTS +++++ + string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; + string obsRoot = "doubleMach2d_solution"; + const int obsFreq = 1; + + // problem definition + const auto probId = pda::Euler2d::DoubleMachReflection; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto scheme = pode::StepScheme::CrankNicolson; + // using itsolv_t = pls::iterative::Bicgstab; + // using linsolver_t = pls::Solver; + + // time stepping + const int numSteps = 2; + vector dt(4, 0.002); + const int convergeStepMax = 10; + const double abs_err_tol = 1e-11; + const double rel_err_tol = 1e-11; + + // +++++ END USER INPUTS +++++ + + // decomposition + auto decomp = pda::impl::SchwarzDecomp< + decltype(probId), + decltype(order), + decltype(scheme) + // itsolv_t + >(probId, order, scheme, meshRoot, dt); + + // observer + // using state_t = decltype(decomp)::state_t; + // using obs_t = FomObserver; + // vector obsVec(decomp.ndomains); + // for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + // obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); + // obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); + // } + + // solve + double time = 0.0; + for (int outerStep = 1; outerStep <= numSteps; ++outerStep) + { + cout << "Step " << outerStep << endl; + + // compute contoller step until convergence + decomp.calc_controller_step( + outerStep, + time, + rel_err_tol, + abs_err_tol, + convergeStepMax + ); + + time += decomp.dtMax; + + // output observer + // const auto stepWrap = pode::StepCount(outerStep); + // for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + // obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); + // } + + } + + return 0; +} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc new file mode 100644 index 00000000..55ec8d23 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc @@ -0,0 +1,662 @@ + +#include "pressio/ode_steppers_implicit.hpp" +#include "pressio/ode_advancers.hpp" +#include "pressiodemoapps/euler2d.hpp" +#include "../observer.hpp" + +using namespace std; +namespace pda = pressiodemoapps; +namespace plog = pressio::log; +namespace pode = pressio::ode; +namespace pls = pressio::linearsolvers; +namespace pnls = pressio::nonlinearsolvers; + +// TODO: Schwarz classes don't need access to appVec, should be fine with meshVec + +// forward declarations +void calc_neighbor_dims(int, int, int, int, vector> &); +template vector calc_exch_graph( + const int, const int, const int, const vector &, const vector> &); +template void broadcast_bcState( + const int, const int, const int, vector &, vector &, + const vector &, const vector> &, const vector &); +template vector calc_ghost_graph( + const int, const int, const vector &, const vector> &); +template array calcConvergence( + const state_t, const state_t, const int); + +int main() +{ + + plog::initialize(pressio::logto::terminal); + plog::setVerbosity({pressio::log::level::debug}); + + // ---- user inputs + + string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto probId = pda::Euler2d::DoubleMachReflection; + const auto scheme = pode::StepScheme::CrankNicolson; + const int numSteps = 100; + const int convergeStepMax = 10; + vector dt(4, 0.002); + // vector dt(4, 0.0025); // TODO: solver just gives up on domIdx > 0 for this time step + double abs_err_tol = 1e-13; + double rel_err_tol = 1e-13; + // ---- end user inputs + + // load mesh info + // TODO: move this into a function that just initializes meshVec + int dim; + int ndomX, ndomY, ndomZ; + int overlap; + pda::impl::read_domain_info(meshRoot, dim, ndomX, ndomY, ndomZ, overlap); + const int ndomains = ndomX * ndomY; + + // dt setup + if (dt.size() == 1) { + dt.resize(ndomains, dt[0]); + } else { + if (dt.size() != ndomains) { + cerr << "dt.size() must be 1 or ndomains, exiting" << endl; + exit(-1); + } + } + + // controller step setup + double dtMax = *max_element(dt.begin(), dt.end()); + vector controlIters(ndomains); + double integral; + for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { + double niters = dtMax / dt[domIdx]; + if (round(niters) == niters) { + controlIters[domIdx] = int(round(niters)); + } else { + cerr << "dt of domain " << domIdx << " (" << dt[domIdx] << ") is not an integer divisor of maximum dt (" << dtMax << ")" << endl; + exit(-1); + } + } + + // aliases + using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_0") ); + using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + using lin_solver_t = pls::Solver; + using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); + using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); + using obs_t = FomObserver; + using graph_t = typename mesh_t::graph_t; + + // problem vectors initialization + lin_solver_t linSolverObj; + vector meshVec(ndomains); + vector ncellsVec(ndomains); + vector appVec(ndomains); + vector stateVec(ndomains); + vector> stateHistVec(ndomains); // intra-controller step history, for interpolation + vector stepperVec; + vector nonlinSolverVec; + vector obsVec(ndomains); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) + { + meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); + ncellsVec[domIdx] = meshVec[domIdx].nx() * meshVec[domIdx].ny(); // TODO: generalize to 3D + + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); + stateVec[domIdx] = appVec[domIdx].initialCondition(); + for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { // includes initial controller step solution + stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); + } + + stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); + nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); + nonlinSolverVec[domIdx].setTolerance(1e-5); + + obsVec[domIdx] = obs_t("doubleMach2d_solution_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, stateVec[domIdx]); + } + + // ++++++++ BOUNDARY SETUP +++++++++++ + + // set up Schwarz boundary graphs + const auto stencilSize = pda::reconstructionTypeToStencilSize(order); + const int numDofPerCell = 4; + const int bcStencilSize = (stencilSize - 1) / 2; + const int bcStencilDof = bcStencilSize * numDofPerCell; + const int maxDomNeighbors = 4; // generalize to 2*ndim + + // determine neighboring domain IDs, + vector> exchDomIdVec(ndomains, vector(maxDomNeighbors, -1)); + calc_neighbor_dims(ndomX, ndomY, ndomZ, bcStencilDof, exchDomIdVec); + + // set up boundary broadcast patterns + const auto exchGraphVec = calc_exch_graph(ndomains, overlap, bcStencilSize, appVec, exchDomIdVec); + + // create stateBcVec, sized accordingly + vector stateBcVec(ndomains); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // TODO: count numDofStencilBc AS NEEDED; lowers memory usage, but makes communication more difficult + const auto meshObj = meshVec[domIdx]; + int numDofStencilBc = 2 * bcStencilDof * (meshObj.nx() + meshObj.ny() + meshObj.nz()); + pda::resize(stateBcVec[domIdx], numDofStencilBc); + for (int dof = 0; dof < stateBcVec[domIdx].size(); ++dof) { + stateBcVec[domIdx](dof) = 0.0; + } + } + + // first communication, set internal pointer + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); + appVec[domIdx].setStateBc(&stateBcVec[domIdx]); + } + + // graph linking cell index to bcState start index + auto ghostGraphVec = calc_ghost_graph(ndomains, numDofPerCell, meshVec, exchDomIdVec); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); + } + + // +++++++++ SOLVE ++++++++++++ + + // controller outer loop + double time = 0.0; + double abs_err, rel_err; + vector> convergeVals(ndomains); + for (int outerStep = 1; outerStep <= numSteps; ++outerStep) + { + cout << "Step " << outerStep << endl; + + // store initial step for resetting + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateHistVec[domIdx][0] = stateVec[domIdx]; + } + + // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + // cerr << "Domain " << domIdx << endl; + // for (int cell = 0; cell < ghostGraphVec[domIdx].rows(); ++cell) { + // cerr << "Cell " << cell << ":"; + // for (int neigh = 0; neigh < 4; ++neigh) { + // cerr << " " << ghostGraphVec[domIdx](cell, neigh); + // } + // cerr << endl; + // } + + // } + // exit(-1); + + // convergence + int convergeStep = 0; + while (convergeStep < convergeStepMax) { + + cerr << "Schwarz iteration " << convergeStep + 1 << endl; + + // domain loop + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // reset to beginning of controller time + auto timeDom = time; + auto stepDom = outerStep * controlIters[domIdx]; + + const auto dtDom = dt[domIdx]; + const auto dtWrap = pode::StepSize(dtDom); + + // controller inner loop + for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { + + const auto startTimeWrap = pode::StepStartAt(timeDom); + const auto stepWrap = pode::StepCount(stepDom); + + cerr << "stepperVec call" << endl; + stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); + + // for last iteration, compute convergence criteria + // important to do this before saving history, as stateHistVec still has last convergence loop's state + if (innerStep == (controlIters[domIdx] - 1)) { + convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back(), ncellsVec[domIdx]); + } + + // store intra-step history + stateHistVec[domIdx][innerStep + 1] = stateVec[domIdx]; + + // set (interpolated) boundary conditions + + // update local step and time + stepDom++; + timeDom += dtDom; + + } // domain loop + + exit(-1); + + // broadcast boundary conditions + broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); + + } + + // check convergence for all domains, break if conditions met + abs_err = 0.0; + rel_err = 0.0; + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + abs_err += convergeVals[domIdx][0]; + rel_err += convergeVals[domIdx][1]; + } + abs_err /= ndomains; + rel_err /= ndomains; + cerr << "Average abs err: " << abs_err << endl; + cerr << "Average rel err: " << rel_err << endl; + if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { + break; + } + + convergeStep++; + + // reset interior state if not converged + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + stateVec[domIdx] = stateHistVec[domIdx][0]; + } + + } // convergence loop + + // output and updates + const auto stepWrap = pode::StepCount(outerStep); + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time + dtMax, stateVec[domIdx]); + } + + time += dtMax; + + } // outer time loop + return 0; +} + +void calc_neighbor_dims( + int ndomX, + int ndomY, + int ndomZ, + int bcStencilDof, + vector> & exchDomIdVec) +{ + // TODO: extend to 3D + + const int ndomains = ndomX * ndomY * ndomZ; + vector numDofStencilBcVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + int i = domIdx % ndomX; + int j = domIdx / ndomX; + int neighborId; + + // left boundary + if (i != 0) { + neighborId = domIdx - 1; + exchDomIdVec[domIdx][0] = neighborId; + } + + // "front" boundary + if (j != (ndomY - 1)) { + neighborId = domIdx + ndomX; + exchDomIdVec[domIdx][1] = neighborId; + } + + // right boundary + if (i != (ndomX - 1)) { + neighborId = domIdx + 1; + exchDomIdVec[domIdx][2] = neighborId; + } + + // "back" boundary + if (j != 0) { + neighborId = domIdx - ndomX; + exchDomIdVec[domIdx][3] = neighborId; + } + + // TODO: for 3D, need "bottom" and "top" + + } +} + +template +vector calc_exch_graph( + const int ndomains, + const int overlap, + const int bcStencilSize, + const vector & appVec, + const vector> & exchDomIdVec) +{ + // TODO: extend to 3D + + // BC cell indexing example + // L/R is from bottom to top, F/B is from left to right + // Trying to mix cell ordering and face ordering + // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ + // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ + // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| + // ¦_(2,1)_¦_(2,0)_|________|________|________|________|________|_(11,1)_¦_(11,0)_| + // ¦_(1,1)_¦_(1,0)_|________|________|________|________|________|_(10,1)_¦_(10,0)_| + // ¦_(0,1)_¦_(0,0)_|________|________|________|________|________|_(9, 1)_¦_(9, 0)_| + // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ + // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ + + vector exchGraphVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + // this domain's mesh and dimensions + const auto domMesh = appVec[domIdx].getMesh(); + const auto domGraph = domMesh.graph(); + int nx = domMesh.nx(); + int ny = domMesh.ny(); + + const auto & x = domMesh.viewX(); + const auto & y = domMesh.viewY(); + + // TODO: generalize to 3D + pda::resize(exchGraphVec[domIdx], 2*nx + 2*ny, bcStencilSize); + exchGraphVec[domIdx].setOnes(); + exchGraphVec[domIdx] *= -1; + + // loop through neighboring domains + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + // neighboring domain mesh and dimensions + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + + int exchCellIdx; + + // east-west neighbors will share a row index + // left + if (neighIdx == 0) { + if (ny != nyNeigh) { + cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; + exit(-1); + } + + int bcCellIdx = 0; // left boundary is the start + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // north-south neighbors will share a column index + // "front" + if (neighIdx == 1) { + if (nx != nxNeigh) { + cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; + exit(-1); + } + + int bcCellIdx = ny * bcStencilSize; // skip left boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = (overlap + stencilIdx) * nxNeigh + xIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // right + if (neighIdx == 2) { + if (ny != nyNeigh) { + cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; + exit(-1); + } + + int bcCellIdx = (ny + nx) * bcStencilSize; // skip left and "front" boundary indices + for (int yIdx = 0; yIdx < ny; ++yIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; + // TODO: check for a different problem + // exchCellIdx = nxNeigh * yIdx + overlap - 1 + stencilIdx; // toward boundary + // exchCellIdx = nxNeigh * yIdx + overlap + 1 + stencilIdx; // away from boundary + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // "back" + if (neighIdx == 3) { + if (nx != nxNeigh) { + cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; + exit(-1); + } + + int bcCellIdx = (2*ny + nx) * bcStencilSize; // skip left, "front", and right boundary indices + for (int xIdx = 0; xIdx < nx; ++xIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = (nyNeigh - 1 - overlap - stencilIdx) * nxNeigh + xIdx; + exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; + } + bcCellIdx++; + } + } + + // TODO: generalize to 3D + + } // neighbor loop + } // domain loop + + return exchGraphVec; + +} + +template +void comm_stateBc( + const int startIdx, + const int endIdx, + const int bcStencilSize, + const int dofPerCell, + const graph_t & exchGraph, + state_t & bcState, + const state_t & intState) +{ + + int exchCellIdx; + for (int bcCellIdx = startIdx; bcCellIdx < endIdx; ++bcCellIdx) { + for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { + exchCellIdx = exchGraph(bcCellIdx, stencilIdx); + for (int dof = 0; dof < dofPerCell; ++dof) { + bcState((bcCellIdx + stencilIdx) * dofPerCell + dof) = intState(exchCellIdx * dofPerCell + dof); + } + } + } + +} + +template +void broadcast_bcState( + const int domIdx, + const int dofPerCell, + const int bcStencilSize, + vector & stateVec, + vector & stateBcVec, + const vector & appVec, + const vector> & exchDomIdVec, + const vector & exchGraphVec) +{ + + const auto domState = stateVec[domIdx]; + + int exchCellIdx; + int startIdx; + int endIdx; + for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + + int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; + if (neighDomIdx == -1) { + continue; // not a Schwarz BC + } + + const auto neighMesh = appVec[neighDomIdx].getMesh(); + int nxNeigh = neighMesh.nx(); + int nyNeigh = neighMesh.ny(); + auto * neighStateBc = &stateBcVec[neighDomIdx]; + const auto neighExchGraph = exchGraphVec[neighDomIdx]; + + // this domain is the neighboring domain's left neighbor + if (neighIdx == 2) { + startIdx = 0; + endIdx = nyNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's front neighbor + if (neighIdx == 3) { + startIdx = nyNeigh; + endIdx = nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's right neighbor + if (neighIdx == 0) { + startIdx = nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + // this domain is the neighboring domain's back neighbor + if (neighIdx == 1) { + startIdx = 2 * nyNeigh + nxNeigh; + endIdx = 2 * nyNeigh + 2 * nxNeigh; + comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + } + + } + +} + +template +vector calc_ghost_graph( + const int ndomains, + const int dofPerCell, + const vector & meshVec, + const vector> & exchDomIdVec) +{ + + vector ghostGraphVec(ndomains); + + for (int domIdx = 0; domIdx < ndomains; ++domIdx) { + + const auto meshObj = meshVec[domIdx]; + const auto intGraph = meshObj.graph(); + int nx = meshObj.nx(); + int ny = meshObj.ny(); + + const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); + pda::resize(ghostGraphVec[domIdx], int(rowsBd.size()), 4); // TODO: generalize to 2 * ndim + ghostGraphVec[domIdx].setOnes(); + ghostGraphVec[domIdx] *= -1; + + for (decltype(rowsBd.size()) it = 0; it < rowsBd.size(); ++it) { + + // ASK FRANCESCO: is there an instance when rowsBd[it] != intGraph(rowsBd[it], 0)? + // The indices appear to be identical + // TODO: this is all totally wrong for higher order + + const auto smPt = rowsBd[it]; + const auto left0 = intGraph(smPt, 1); + const auto front0 = intGraph(smPt, 2); + const auto right0 = intGraph(smPt, 3); + const auto back0 = intGraph(smPt, 4); + + int stencilIdx = 0; // first order + int rowIdx = smPt / nx; + int colIdx = smPt % nx; + int bcCellIdx; + + if (left0 == -1) { + if (exchDomIdVec[domIdx][0] != -1) { + bcCellIdx = rowIdx; + ghostGraphVec[domIdx](it, 0) = bcCellIdx * dofPerCell; + } + } + + if (front0 == -1) { + if (exchDomIdVec[domIdx][1] != -1) { + bcCellIdx = ny + colIdx; + ghostGraphVec[domIdx](it, 1) = bcCellIdx * dofPerCell; + } + } + + if (right0 == -1) { + if (exchDomIdVec[domIdx][2] != -1) { + bcCellIdx = ny + nx + rowIdx; + ghostGraphVec[domIdx](it, 2) = bcCellIdx * dofPerCell; + } + } + + if (back0 == -1) { + if (exchDomIdVec[domIdx][3] != -1) { + bcCellIdx = 2 * ny + nx + colIdx; + ghostGraphVec[domIdx](it, 3) = bcCellIdx * dofPerCell; + } + } + // TODO: extend to higher order, 3D + + } // boundary cell loop + } // domain loop + + return ghostGraphVec; + +} + + +template +array calcConvergence( + const state_t state1, + const state_t state2, + const int numElems) +{ + // TODO: assumed to be an Eigen state, not sure how to generalize + // TODO: compute convergence for each variable separately + + int numDOF = state1.size(); + if (state2.size() != numDOF) { + cerr << "state1 size does not match state2 size, " << numDOF << " vs. " << state2.size() << endl; + exit(-1); + } + double numDOFPerCellD = double(numDOF) / numElems; + if (round(numDOFPerCellD) != numDOFPerCellD) { + cerr << "Computed a non-integer number of variables: " << numDOFPerCellD << endl; + exit(-1); + } + int numDOFPerCell = round(numDOFPerCellD); + + // absolute error + double abs_err = (state1 - state2).squaredNorm(); + + // handle edge cases for relative error + double rel_err; + double basenorm = state1.squaredNorm(); + if (basenorm > 0) { + rel_err = abs_err / basenorm; + } + else { + if (abs_err > 0) { + rel_err = 1.0; + } + else { + rel_err = 0.0; + } + } + + array errArr = {abs_err, rel_err}; + return errArr; + +} \ No newline at end of file From 83d29f5da43eb0d556b48b3436c03e56fdc0adfb Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Tue, 6 Jun 2023 14:51:02 -0700 Subject: [PATCH 10/17] working OOP, saving non-OOP for comparison sake --- include/pressiodemoapps/impl/schwarz.hpp | 30 ++++--------------- .../main_oop.cc | 26 ++++++++-------- .../main_working.cc | 26 ++++------------ 3 files changed, 23 insertions(+), 59 deletions(-) diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp index e0ccd782..c0860d87 100644 --- a/include/pressiodemoapps/impl/schwarz.hpp +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -175,7 +175,7 @@ namespace pressiodemoapps{ namespace impl { { // problem vectors initialization for each subdomain - linsolver_t linSolverObj; + linSolverObj = new linsolver_t; meshVec.resize(ndomains); appVec.resize(ndomains); stateVec.resize(ndomains); @@ -195,7 +195,7 @@ namespace pressiodemoapps{ namespace impl { // time stepping stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); - nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); + nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), *linSolverObj) ); nonlinSolverVec[domIdx].setTolerance(1e-5); } @@ -681,25 +681,12 @@ namespace pressiodemoapps{ namespace impl { stateHistVec[domIdx][0] = stateVec[domIdx]; } - // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - // cerr << "Domain " << domIdx << endl; - // for (int cell = 0; cell < ghostGraphVec[domIdx].rows(); ++cell) { - // cerr << "Cell " << cell << ":"; - // for (int neigh = 0; neigh < 4; ++neigh) { - // cerr << " " << ghostGraphVec[domIdx](cell, neigh); - // } - // cerr << endl; - // } - - // } - // exit(-1); - // convergence int convergeStep = 0; vector> convergeVals(ndomains); while (convergeStep < convergeStepMax) { - cerr << "Schwarz iteration " << convergeStep + 1 << endl; + cout << "Schwarz iteration " << convergeStep + 1 << endl; for (int domIdx = 0; domIdx < ndomains; ++domIdx) { @@ -716,12 +703,10 @@ namespace pressiodemoapps{ namespace impl { const auto startTimeWrap = pode::StepStartAt(timeDom); const auto stepWrap = pode::StepCount(stepDom); - cerr << "stepperVec call" << endl; stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); // for last iteration, compute convergence criteria // important to do this before saving history, as stateHistVec still has last convergence loop's state - cerr << "calc convergence" << endl; if (innerStep == (controlIters[domIdx] - 1)) { convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back()); } @@ -737,16 +722,12 @@ namespace pressiodemoapps{ namespace impl { } // domain loop - exit(-1); - // broadcast boundary conditions - cerr << "Broadcast" << endl; broadcast_bcState(domIdx); } // check convergence for all domains, break if conditions met - cerr << "Check convergence" << endl; double abs_err = 0.0; double rel_err = 0.0; for (int domIdx = 0; domIdx < ndomains; ++domIdx) { @@ -755,8 +736,8 @@ namespace pressiodemoapps{ namespace impl { } abs_err /= ndomains; rel_err /= ndomains; - cerr << "Average abs err: " << abs_err << endl; - cerr << "Average rel err: " << rel_err << endl; + cout << "Average abs err: " << abs_err << endl; + cout << "Average rel err: " << rel_err << endl; if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { break; } @@ -801,6 +782,7 @@ namespace pressiodemoapps{ namespace impl { vector controlIters; // problem vectors + linsolver_t* linSolverObj; vector meshVec; vector appVec; vector> stateHistVec; diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc index 08f3e923..aaa40abd 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc @@ -25,11 +25,9 @@ int main() const auto probId = pda::Euler2d::DoubleMachReflection; const auto order = pda::InviscidFluxReconstruction::FirstOrder; const auto scheme = pode::StepScheme::CrankNicolson; - // using itsolv_t = pls::iterative::Bicgstab; - // using linsolver_t = pls::Solver; // time stepping - const int numSteps = 2; + const int numSteps = 100; vector dt(4, 0.002); const int convergeStepMax = 10; const double abs_err_tol = 1e-11; @@ -46,13 +44,13 @@ int main() >(probId, order, scheme, meshRoot, dt); // observer - // using state_t = decltype(decomp)::state_t; - // using obs_t = FomObserver; - // vector obsVec(decomp.ndomains); - // for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - // obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); - // obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); - // } + using state_t = decltype(decomp)::state_t; + using obs_t = FomObserver; + vector obsVec(decomp.ndomains); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); + } // solve double time = 0.0; @@ -72,10 +70,10 @@ int main() time += decomp.dtMax; // output observer - // const auto stepWrap = pode::StepCount(outerStep); - // for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - // obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); - // } + const auto stepWrap = pode::StepCount(outerStep); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); + } } diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc index 55ec8d23..9df7ad7f 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc @@ -41,8 +41,8 @@ int main() const int convergeStepMax = 10; vector dt(4, 0.002); // vector dt(4, 0.0025); // TODO: solver just gives up on domIdx > 0 for this time step - double abs_err_tol = 1e-13; - double rel_err_tol = 1e-13; + double abs_err_tol = 1e-11; + double rel_err_tol = 1e-11; // ---- end user inputs // load mesh info @@ -172,24 +172,11 @@ int main() stateHistVec[domIdx][0] = stateVec[domIdx]; } - // for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - // cerr << "Domain " << domIdx << endl; - // for (int cell = 0; cell < ghostGraphVec[domIdx].rows(); ++cell) { - // cerr << "Cell " << cell << ":"; - // for (int neigh = 0; neigh < 4; ++neigh) { - // cerr << " " << ghostGraphVec[domIdx](cell, neigh); - // } - // cerr << endl; - // } - - // } - // exit(-1); - // convergence int convergeStep = 0; while (convergeStep < convergeStepMax) { - cerr << "Schwarz iteration " << convergeStep + 1 << endl; + cout << "Schwarz iteration " << convergeStep + 1 << endl; // domain loop for (int domIdx = 0; domIdx < ndomains; ++domIdx) { @@ -207,7 +194,6 @@ int main() const auto startTimeWrap = pode::StepStartAt(timeDom); const auto stepWrap = pode::StepCount(stepDom); - cerr << "stepperVec call" << endl; stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); // for last iteration, compute convergence criteria @@ -227,8 +213,6 @@ int main() } // domain loop - exit(-1); - // broadcast boundary conditions broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); @@ -243,8 +227,8 @@ int main() } abs_err /= ndomains; rel_err /= ndomains; - cerr << "Average abs err: " << abs_err << endl; - cerr << "Average rel err: " << rel_err << endl; + cout << "Average abs err: " << abs_err << endl; + cout << "Average rel err: " << rel_err << endl; if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { break; } From 549a65a550c687d9097c8f985922d7e504f261a7 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Tue, 6 Jun 2023 15:02:10 -0700 Subject: [PATCH 11/17] overwrite double mach schwarz main and working copy --- .../firstorder/CMakeLists.txt | 4 +- .../main.cc | 655 ++---------------- .../main_working.cc | 655 ++---------------- 3 files changed, 91 insertions(+), 1223 deletions(-) diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt index f708fcae..72fa6fe2 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/firstorder/CMakeLists.txt @@ -1,14 +1,12 @@ set(testname eigen_2d_double_mach_firstorder_implicit_schwarz) set(exename ${testname}_exe) -set(exenameoop ${testname}_oop_exe) configure_file(../compare.py compare.py COPYONLY) configure_file(rho_gold.txt rho_gold.txt COPYONLY) configure_file(../plot.py plot.py COPYONLY) -add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main_working.cc) -add_executable(${exenameoop} ${CMAKE_CURRENT_SOURCE_DIR}/../main_oop.cc) +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) add_test(NAME ${testname} COMMAND ${CMAKE_COMMAND} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc index c827640e..aaa40abd 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -1,646 +1,81 @@ -#include "pressio/ode_steppers_implicit.hpp" -#include "pressio/ode_advancers.hpp" #include "pressiodemoapps/euler2d.hpp" +#include "pressiodemoapps/impl/schwarz.hpp" #include "../observer.hpp" using namespace std; -namespace pda = pressiodemoapps; -namespace plog = pressio::log; -namespace pode = pressio::ode; -namespace pls = pressio::linearsolvers; -namespace pnls = pressio::nonlinearsolvers; - -// TODO: Schwarz classes don't need access to appVec, should be fine with meshVec - -// forward declarations -void calc_neighbor_dims(int, int, int, int, vector> &); -template vector calc_exch_graph( - const int, const int, const int, const vector &, const vector> &); -template void broadcast_bcState( - const int, const int, const int, vector &, vector &, - const vector &, const vector> &, const vector &); -template vector calc_ghost_graph( - const int, const int, const vector &, const vector> &); -template array calcConvergence( - const state_t, const state_t, const int); int main() { + namespace pda = pressiodemoapps; + namespace plog = pressio::log; + namespace pode = pressio::ode; + namespace pls = pressio::linearsolvers; + namespace pnls = pressio::nonlinearsolvers; plog::initialize(pressio::logto::terminal); plog::setVerbosity({pressio::log::level::debug}); - // ---- user inputs - + // +++++ USER INPUTS +++++ string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; - const auto order = pda::InviscidFluxReconstruction::FirstOrder; + string obsRoot = "doubleMach2d_solution"; + const int obsFreq = 1; + + // problem definition const auto probId = pda::Euler2d::DoubleMachReflection; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; const auto scheme = pode::StepScheme::CrankNicolson; + + // time stepping const int numSteps = 100; - const int convergeStepMax = 10; vector dt(4, 0.002); - // vector dt(4, 0.0025); // TODO: solver just gives up on domIdx > 0 for this time step - double abs_err_tol = 1e-13; - double rel_err_tol = 1e-13; - // ---- end user inputs - - // load mesh info - // TODO: move this into a function that just initializes meshVec - int dim; - int ndomX, ndomY, ndomZ; - int overlap; - pda::impl::read_domain_info(meshRoot, dim, ndomX, ndomY, ndomZ, overlap); - const int ndomains = ndomX * ndomY; + const int convergeStepMax = 10; + const double abs_err_tol = 1e-11; + const double rel_err_tol = 1e-11; - // dt setup - if (dt.size() == 1) { - dt.resize(ndomains, dt[0]); - } else { - if (dt.size() != ndomains) { - cerr << "dt.size() must be 1 or ndomains, exiting" << endl; - exit(-1); - } - } + // +++++ END USER INPUTS +++++ - // controller step setup - double dtMax = *max_element(dt.begin(), dt.end()); - vector controlIters(ndomains); - double integral; - for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { - double niters = dtMax / dt[domIdx]; - if (round(niters) == niters) { - controlIters[domIdx] = int(round(niters)); - } else { - cerr << "dt of domain " << domIdx << " (" << dt[domIdx] << ") is not an integer divisor of maximum dt (" << dtMax << ")" << endl; - exit(-1); - } - } + // decomposition + auto decomp = pda::impl::SchwarzDecomp< + decltype(probId), + decltype(order), + decltype(scheme) + // itsolv_t + >(probId, order, scheme, meshRoot, dt); - // aliases - using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_0") ); - using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); - using state_t = typename app_t::state_type; - using jacob_t = typename app_t::jacobian_type; - using lin_solver_t = pls::Solver; - using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); - using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); + // observer + using state_t = decltype(decomp)::state_t; using obs_t = FomObserver; - using graph_t = typename mesh_t::graph_t; - - // problem vectors initialization - lin_solver_t linSolverObj; - vector meshVec(ndomains); - vector ncellsVec(ndomains); - vector appVec(ndomains); - vector stateVec(ndomains); - vector> stateHistVec(ndomains); // intra-controller step history, for interpolation - vector stepperVec; - vector nonlinSolverVec; - vector obsVec(ndomains); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) - { - meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); - ncellsVec[domIdx] = meshVec[domIdx].nx() * meshVec[domIdx].ny(); // TODO: generalize to 3D - - appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); - stateVec[domIdx] = appVec[domIdx].initialCondition(); - for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { // includes initial controller step solution - stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); - } - - stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); - nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); - nonlinSolverVec[domIdx].setTolerance(1e-5); - - obsVec[domIdx] = obs_t("doubleMach2d_solution_" + to_string(domIdx) + ".bin", 1); - obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, stateVec[domIdx]); + vector obsVec(decomp.ndomains); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); } - // ++++++++ BOUNDARY SETUP +++++++++++ - - // set up Schwarz boundary graphs - const auto stencilSize = pda::reconstructionTypeToStencilSize(order); - const int numDofPerCell = 4; - const int bcStencilSize = (stencilSize - 1) / 2; - const int bcStencilDof = bcStencilSize * numDofPerCell; - const int maxDomNeighbors = 4; // generalize to 2*ndim - - // determine neighboring domain IDs, - vector> exchDomIdVec(ndomains, vector(maxDomNeighbors, -1)); - calc_neighbor_dims(ndomX, ndomY, ndomZ, bcStencilDof, exchDomIdVec); - - // set up boundary broadcast patterns - const auto exchGraphVec = calc_exch_graph(ndomains, overlap, bcStencilSize, appVec, exchDomIdVec); - - // create stateBcVec, sized accordingly - vector stateBcVec(ndomains); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - // TODO: count numDofStencilBc AS NEEDED; lowers memory usage, but makes communication more difficult - const auto meshObj = meshVec[domIdx]; - int numDofStencilBc = 2 * bcStencilDof * (meshObj.nx() + meshObj.ny() + meshObj.nz()); - pda::resize(stateBcVec[domIdx], numDofStencilBc); - for (int dof = 0; dof < stateBcVec[domIdx].size(); ++dof) { - stateBcVec[domIdx](dof) = 0.0; - } - } - - // first communication, set internal pointer - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); - appVec[domIdx].setStateBc(&stateBcVec[domIdx]); - } - - // graph linking cell index to bcState start index - auto ghostGraphVec = calc_ghost_graph(ndomains, numDofPerCell, meshVec, exchDomIdVec); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); - } - - // +++++++++ SOLVE ++++++++++++ - - // controller outer loop + // solve double time = 0.0; - double abs_err, rel_err; - vector> convergeVals(ndomains); for (int outerStep = 1; outerStep <= numSteps; ++outerStep) { cout << "Step " << outerStep << endl; - // store initial step for resetting - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - stateHistVec[domIdx][0] = stateVec[domIdx]; - } - - // convergence - int convergeStep = 0; - while (convergeStep < convergeStepMax) { - - cerr << "Schwarz iteration " << convergeStep + 1 << endl; - - // domain loop - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - // reset to beginning of controller time - auto timeDom = time; - auto stepDom = outerStep * controlIters[domIdx]; - - const auto dtDom = dt[domIdx]; - const auto dtWrap = pode::StepSize(dtDom); - - // controller inner loop - for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { + // compute contoller step until convergence + decomp.calc_controller_step( + outerStep, + time, + rel_err_tol, + abs_err_tol, + convergeStepMax + ); - const auto startTimeWrap = pode::StepStartAt(timeDom); - const auto stepWrap = pode::StepCount(stepDom); + time += decomp.dtMax; - stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); - - // for last iteration, compute convergence criteria - // important to do this before saving history, as stateHistVec still has last convergence loop's state - if (innerStep == (controlIters[domIdx] - 1)) { - convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back(), ncellsVec[domIdx]); - } - - // store intra-step history - stateHistVec[domIdx][innerStep + 1] = stateVec[domIdx]; - - // set (interpolated) boundary conditions - - // update local step and time - stepDom++; - timeDom += dtDom; - - } - - // broadcast boundary conditions - broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); - - } - - // check convergence for all domains, break if conditions met - abs_err = 0.0; - rel_err = 0.0; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - abs_err += convergeVals[domIdx][0]; - rel_err += convergeVals[domIdx][1]; - } - abs_err /= ndomains; - rel_err /= ndomains; - cerr << "Average abs err: " << abs_err << endl; - cerr << "Average rel err: " << rel_err << endl; - if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { - break; - } - - convergeStep++; - - // reset interior state if not converged - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - stateVec[domIdx] = stateHistVec[domIdx][0]; - } - - } - - // output and updates + // output observer const auto stepWrap = pode::StepCount(outerStep); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - obsVec[domIdx](stepWrap, time + dtMax, stateVec[domIdx]); - } - - time += dtMax; - - } - return 0; -} - -void calc_neighbor_dims( - int ndomX, - int ndomY, - int ndomZ, - int bcStencilDof, - vector> & exchDomIdVec) -{ - // TODO: extend to 3D - - const int ndomains = ndomX * ndomY * ndomZ; - vector numDofStencilBcVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - int i = domIdx % ndomX; - int j = domIdx / ndomX; - int neighborId; - - // left boundary - if (i != 0) { - neighborId = domIdx - 1; - exchDomIdVec[domIdx][0] = neighborId; - } - - // "front" boundary - if (j != (ndomY - 1)) { - neighborId = domIdx + ndomX; - exchDomIdVec[domIdx][1] = neighborId; - } - - // right boundary - if (i != (ndomX - 1)) { - neighborId = domIdx + 1; - exchDomIdVec[domIdx][2] = neighborId; - } - - // "back" boundary - if (j != 0) { - neighborId = domIdx - ndomX; - exchDomIdVec[domIdx][3] = neighborId; - } - - // TODO: for 3D, need "bottom" and "top" - - } -} - -template -vector calc_exch_graph( - const int ndomains, - const int overlap, - const int bcStencilSize, - const vector & appVec, - const vector> & exchDomIdVec) -{ - // TODO: extend to 3D - - // BC cell indexing example - // L/R is from bottom to top, F/B is from left to right - // Trying to mix cell ordering and face ordering - // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ - // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ - // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| - // ¦_(2,1)_¦_(2,0)_|________|________|________|________|________|_(11,1)_¦_(11,0)_| - // ¦_(1,1)_¦_(1,0)_|________|________|________|________|________|_(10,1)_¦_(10,0)_| - // ¦_(0,1)_¦_(0,0)_|________|________|________|________|________|_(9, 1)_¦_(9, 0)_| - // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ - // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ - - vector exchGraphVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - // this domain's mesh and dimensions - const auto domMesh = appVec[domIdx].getMesh(); - const auto domGraph = domMesh.graph(); - int nx = domMesh.nx(); - int ny = domMesh.ny(); - - const auto & x = domMesh.viewX(); - const auto & y = domMesh.viewY(); - - // TODO: generalize to 3D - pda::resize(exchGraphVec[domIdx], 2*nx + 2*ny, bcStencilSize); - exchGraphVec[domIdx].setOnes(); - exchGraphVec[domIdx] *= -1; - - // loop through neighboring domains - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { - - int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; - if (neighDomIdx == -1) { - continue; // not a Schwarz BC - } - - // neighboring domain mesh and dimensions - const auto neighMesh = appVec[neighDomIdx].getMesh(); - int nxNeigh = neighMesh.nx(); - int nyNeigh = neighMesh.ny(); - - int exchCellIdx; - - // east-west neighbors will share a row index - // left - if (neighIdx == 0) { - if (ny != nyNeigh) { - cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; - exit(-1); - } - - int bcCellIdx = 0; // left boundary is the start - for (int yIdx = 0; yIdx < ny; ++yIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; - exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // north-south neighbors will share a column index - // "front" - if (neighIdx == 1) { - if (nx != nxNeigh) { - cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; - exit(-1); - } - - int bcCellIdx = ny * bcStencilSize; // skip left boundary indices - for (int xIdx = 0; xIdx < nx; ++xIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = (overlap + stencilIdx) * nxNeigh + xIdx; - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // right - if (neighIdx == 2) { - if (ny != nyNeigh) { - cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; - exit(-1); - } - - int bcCellIdx = (ny + nx) * bcStencilSize; // skip left and "front" boundary indices - for (int yIdx = 0; yIdx < ny; ++yIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; - // TODO: check for a different problem - // exchCellIdx = nxNeigh * yIdx + overlap - 1 + stencilIdx; // toward boundary - // exchCellIdx = nxNeigh * yIdx + overlap + 1 + stencilIdx; // away from boundary - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // "back" - if (neighIdx == 3) { - if (nx != nxNeigh) { - cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; - exit(-1); - } - - int bcCellIdx = (2*ny + nx) * bcStencilSize; // skip left, "front", and right boundary indices - for (int xIdx = 0; xIdx < nx; ++xIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = (nyNeigh - 1 - overlap - stencilIdx) * nxNeigh + xIdx; - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // TODO: generalize to 3D - - } // neighbor loop - } // domain loop - - return exchGraphVec; - -} - -template -void comm_stateBc( - const int startIdx, - const int endIdx, - const int bcStencilSize, - const int dofPerCell, - const graph_t & exchGraph, - state_t & bcState, - const state_t & intState) -{ - - int exchCellIdx; - for (int bcCellIdx = startIdx; bcCellIdx < endIdx; ++bcCellIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = exchGraph(bcCellIdx, stencilIdx); - for (int dof = 0; dof < dofPerCell; ++dof) { - bcState((bcCellIdx + stencilIdx) * dofPerCell + dof) = intState(exchCellIdx * dofPerCell + dof); - } - } - } - -} - -template -void broadcast_bcState( - const int domIdx, - const int dofPerCell, - const int bcStencilSize, - vector & stateVec, - vector & stateBcVec, - const vector & appVec, - const vector> & exchDomIdVec, - const vector & exchGraphVec) -{ - - const auto domState = stateVec[domIdx]; - - int exchCellIdx; - int startIdx; - int endIdx; - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { - - int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; - if (neighDomIdx == -1) { - continue; // not a Schwarz BC - } - - const auto neighMesh = appVec[neighDomIdx].getMesh(); - int nxNeigh = neighMesh.nx(); - int nyNeigh = neighMesh.ny(); - auto * neighStateBc = &stateBcVec[neighDomIdx]; - const auto neighExchGraph = exchGraphVec[neighDomIdx]; - - // this domain is the neighboring domain's left neighbor - if (neighIdx == 2) { - startIdx = 0; - endIdx = nyNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's front neighbor - if (neighIdx == 3) { - startIdx = nyNeigh; - endIdx = nyNeigh + nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's right neighbor - if (neighIdx == 0) { - startIdx = nyNeigh + nxNeigh; - endIdx = 2 * nyNeigh + nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's back neighbor - if (neighIdx == 1) { - startIdx = 2 * nyNeigh + nxNeigh; - endIdx = 2 * nyNeigh + 2 * nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); } } + return 0; } - -template -vector calc_ghost_graph( - const int ndomains, - const int dofPerCell, - const vector & meshVec, - const vector> & exchDomIdVec) -{ - - vector ghostGraphVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - const auto meshObj = meshVec[domIdx]; - const auto intGraph = meshObj.graph(); - int nx = meshObj.nx(); - int ny = meshObj.ny(); - - const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); - pda::resize(ghostGraphVec[domIdx], int(rowsBd.size()), 4); // TODO: generalize to 2 * ndim - ghostGraphVec[domIdx].setOnes(); - ghostGraphVec[domIdx] *= -1; - - for (decltype(rowsBd.size()) it = 0; it < rowsBd.size(); ++it) { - - // ASK FRANCESCO: is there an instance when rowsBd[it] != intGraph(rowsBd[it], 0)? - // The indices appear to be identical - // TODO: this is all totally wrong for higher order - - const auto smPt = rowsBd[it]; - const auto left0 = intGraph(smPt, 1); - const auto front0 = intGraph(smPt, 2); - const auto right0 = intGraph(smPt, 3); - const auto back0 = intGraph(smPt, 4); - - int stencilIdx = 0; // first order - int rowIdx = smPt / nx; - int colIdx = smPt % nx; - int bcCellIdx; - - if (left0 == -1) { - if (exchDomIdVec[domIdx][0] != -1) { - bcCellIdx = rowIdx; - ghostGraphVec[domIdx](it, 0) = bcCellIdx * dofPerCell; - } - } - - if (front0 == -1) { - if (exchDomIdVec[domIdx][1] != -1) { - bcCellIdx = ny + colIdx; - ghostGraphVec[domIdx](it, 1) = bcCellIdx * dofPerCell; - } - } - - if (right0 == -1) { - if (exchDomIdVec[domIdx][2] != -1) { - bcCellIdx = ny + nx + rowIdx; - ghostGraphVec[domIdx](it, 2) = bcCellIdx * dofPerCell; - } - } - - if (back0 == -1) { - if (exchDomIdVec[domIdx][3] != -1) { - bcCellIdx = 2 * ny + nx + colIdx; - ghostGraphVec[domIdx](it, 3) = bcCellIdx * dofPerCell; - } - } - // TODO: extend to higher order, 3D - - } // boundary cell loop - } // domain loop - - return ghostGraphVec; - -} - - -template -array calcConvergence( - const state_t state1, - const state_t state2, - const int numElems) -{ - // TODO: assumed to be an Eigen state, not sure how to generalize - // TODO: compute convergence for each variable separately - - int numDOF = state1.size(); - if (state2.size() != numDOF) { - cerr << "state1 size does not match state2 size, " << numDOF << " vs. " << state2.size() << endl; - exit(-1); - } - double numDOFPerCellD = double(numDOF) / numElems; - if (round(numDOFPerCellD) != numDOFPerCellD) { - cerr << "Computed a non-integer number of variables: " << numDOFPerCellD << endl; - exit(-1); - } - int numDOFPerCell = round(numDOFPerCellD); - - // absolute error - double abs_err = (state1 - state2).squaredNorm(); - - // handle edge cases for relative error - double rel_err; - double basenorm = state1.squaredNorm(); - if (basenorm > 0) { - rel_err = abs_err / basenorm; - } - else { - if (abs_err > 0) { - rel_err = 1.0; - } - else { - rel_err = 0.0; - } - } - - array errArr = {abs_err, rel_err}; - return errArr; - -} \ No newline at end of file diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc index 9df7ad7f..aaa40abd 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc @@ -1,646 +1,81 @@ -#include "pressio/ode_steppers_implicit.hpp" -#include "pressio/ode_advancers.hpp" #include "pressiodemoapps/euler2d.hpp" +#include "pressiodemoapps/impl/schwarz.hpp" #include "../observer.hpp" using namespace std; -namespace pda = pressiodemoapps; -namespace plog = pressio::log; -namespace pode = pressio::ode; -namespace pls = pressio::linearsolvers; -namespace pnls = pressio::nonlinearsolvers; - -// TODO: Schwarz classes don't need access to appVec, should be fine with meshVec - -// forward declarations -void calc_neighbor_dims(int, int, int, int, vector> &); -template vector calc_exch_graph( - const int, const int, const int, const vector &, const vector> &); -template void broadcast_bcState( - const int, const int, const int, vector &, vector &, - const vector &, const vector> &, const vector &); -template vector calc_ghost_graph( - const int, const int, const vector &, const vector> &); -template array calcConvergence( - const state_t, const state_t, const int); int main() { + namespace pda = pressiodemoapps; + namespace plog = pressio::log; + namespace pode = pressio::ode; + namespace pls = pressio::linearsolvers; + namespace pnls = pressio::nonlinearsolvers; plog::initialize(pressio::logto::terminal); plog::setVerbosity({pressio::log::level::debug}); - // ---- user inputs - + // +++++ USER INPUTS +++++ string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; - const auto order = pda::InviscidFluxReconstruction::FirstOrder; + string obsRoot = "doubleMach2d_solution"; + const int obsFreq = 1; + + // problem definition const auto probId = pda::Euler2d::DoubleMachReflection; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; const auto scheme = pode::StepScheme::CrankNicolson; + + // time stepping const int numSteps = 100; - const int convergeStepMax = 10; vector dt(4, 0.002); - // vector dt(4, 0.0025); // TODO: solver just gives up on domIdx > 0 for this time step - double abs_err_tol = 1e-11; - double rel_err_tol = 1e-11; - // ---- end user inputs + const int convergeStepMax = 10; + const double abs_err_tol = 1e-11; + const double rel_err_tol = 1e-11; - // load mesh info - // TODO: move this into a function that just initializes meshVec - int dim; - int ndomX, ndomY, ndomZ; - int overlap; - pda::impl::read_domain_info(meshRoot, dim, ndomX, ndomY, ndomZ, overlap); - const int ndomains = ndomX * ndomY; + // +++++ END USER INPUTS +++++ - // dt setup - if (dt.size() == 1) { - dt.resize(ndomains, dt[0]); - } else { - if (dt.size() != ndomains) { - cerr << "dt.size() must be 1 or ndomains, exiting" << endl; - exit(-1); - } - } + // decomposition + auto decomp = pda::impl::SchwarzDecomp< + decltype(probId), + decltype(order), + decltype(scheme) + // itsolv_t + >(probId, order, scheme, meshRoot, dt); - // controller step setup - double dtMax = *max_element(dt.begin(), dt.end()); - vector controlIters(ndomains); - double integral; - for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { - double niters = dtMax / dt[domIdx]; - if (round(niters) == niters) { - controlIters[domIdx] = int(round(niters)); - } else { - cerr << "dt of domain " << domIdx << " (" << dt[domIdx] << ") is not an integer divisor of maximum dt (" << dtMax << ")" << endl; - exit(-1); - } - } - - // aliases - using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_0") ); - using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); - using state_t = typename app_t::state_type; - using jacob_t = typename app_t::jacobian_type; - using lin_solver_t = pls::Solver; - using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); - using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); + // observer + using state_t = decltype(decomp)::state_t; using obs_t = FomObserver; - using graph_t = typename mesh_t::graph_t; - - // problem vectors initialization - lin_solver_t linSolverObj; - vector meshVec(ndomains); - vector ncellsVec(ndomains); - vector appVec(ndomains); - vector stateVec(ndomains); - vector> stateHistVec(ndomains); // intra-controller step history, for interpolation - vector stepperVec; - vector nonlinSolverVec; - vector obsVec(ndomains); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) - { - meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); - ncellsVec[domIdx] = meshVec[domIdx].nx() * meshVec[domIdx].ny(); // TODO: generalize to 3D - - appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); - stateVec[domIdx] = appVec[domIdx].initialCondition(); - for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { // includes initial controller step solution - stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); - } - - stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); - nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); - nonlinSolverVec[domIdx].setTolerance(1e-5); - - obsVec[domIdx] = obs_t("doubleMach2d_solution_" + to_string(domIdx) + ".bin", 1); - obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, stateVec[domIdx]); - } - - // ++++++++ BOUNDARY SETUP +++++++++++ - - // set up Schwarz boundary graphs - const auto stencilSize = pda::reconstructionTypeToStencilSize(order); - const int numDofPerCell = 4; - const int bcStencilSize = (stencilSize - 1) / 2; - const int bcStencilDof = bcStencilSize * numDofPerCell; - const int maxDomNeighbors = 4; // generalize to 2*ndim - - // determine neighboring domain IDs, - vector> exchDomIdVec(ndomains, vector(maxDomNeighbors, -1)); - calc_neighbor_dims(ndomX, ndomY, ndomZ, bcStencilDof, exchDomIdVec); - - // set up boundary broadcast patterns - const auto exchGraphVec = calc_exch_graph(ndomains, overlap, bcStencilSize, appVec, exchDomIdVec); - - // create stateBcVec, sized accordingly - vector stateBcVec(ndomains); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - // TODO: count numDofStencilBc AS NEEDED; lowers memory usage, but makes communication more difficult - const auto meshObj = meshVec[domIdx]; - int numDofStencilBc = 2 * bcStencilDof * (meshObj.nx() + meshObj.ny() + meshObj.nz()); - pda::resize(stateBcVec[domIdx], numDofStencilBc); - for (int dof = 0; dof < stateBcVec[domIdx].size(); ++dof) { - stateBcVec[domIdx](dof) = 0.0; - } - } - - // first communication, set internal pointer - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); - appVec[domIdx].setStateBc(&stateBcVec[domIdx]); + vector obsVec(decomp.ndomains); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); } - // graph linking cell index to bcState start index - auto ghostGraphVec = calc_ghost_graph(ndomains, numDofPerCell, meshVec, exchDomIdVec); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - appVec[domIdx].setGraphBc(&ghostGraphVec[domIdx]); - } - - // +++++++++ SOLVE ++++++++++++ - - // controller outer loop + // solve double time = 0.0; - double abs_err, rel_err; - vector> convergeVals(ndomains); for (int outerStep = 1; outerStep <= numSteps; ++outerStep) { cout << "Step " << outerStep << endl; - // store initial step for resetting - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - stateHistVec[domIdx][0] = stateVec[domIdx]; - } - - // convergence - int convergeStep = 0; - while (convergeStep < convergeStepMax) { - - cout << "Schwarz iteration " << convergeStep + 1 << endl; - - // domain loop - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - // reset to beginning of controller time - auto timeDom = time; - auto stepDom = outerStep * controlIters[domIdx]; - - const auto dtDom = dt[domIdx]; - const auto dtWrap = pode::StepSize(dtDom); + // compute contoller step until convergence + decomp.calc_controller_step( + outerStep, + time, + rel_err_tol, + abs_err_tol, + convergeStepMax + ); - // controller inner loop - for (int innerStep = 0; innerStep < controlIters[domIdx]; ++innerStep) { + time += decomp.dtMax; - const auto startTimeWrap = pode::StepStartAt(timeDom); - const auto stepWrap = pode::StepCount(stepDom); - - stepperVec[domIdx](stateVec[domIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[domIdx]); - - // for last iteration, compute convergence criteria - // important to do this before saving history, as stateHistVec still has last convergence loop's state - if (innerStep == (controlIters[domIdx] - 1)) { - convergeVals[domIdx] = calcConvergence(stateVec[domIdx], stateHistVec[domIdx].back(), ncellsVec[domIdx]); - } - - // store intra-step history - stateHistVec[domIdx][innerStep + 1] = stateVec[domIdx]; - - // set (interpolated) boundary conditions - - // update local step and time - stepDom++; - timeDom += dtDom; - - } // domain loop - - // broadcast boundary conditions - broadcast_bcState(domIdx, numDofPerCell, bcStencilSize, stateVec, stateBcVec, appVec, exchDomIdVec, exchGraphVec); - - } - - // check convergence for all domains, break if conditions met - abs_err = 0.0; - rel_err = 0.0; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - abs_err += convergeVals[domIdx][0]; - rel_err += convergeVals[domIdx][1]; - } - abs_err /= ndomains; - rel_err /= ndomains; - cout << "Average abs err: " << abs_err << endl; - cout << "Average rel err: " << rel_err << endl; - if ((rel_err < rel_err_tol) || (abs_err < abs_err_tol)) { - break; - } - - convergeStep++; - - // reset interior state if not converged - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - stateVec[domIdx] = stateHistVec[domIdx][0]; - } - - } // convergence loop - - // output and updates + // output observer const auto stepWrap = pode::StepCount(outerStep); - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - obsVec[domIdx](stepWrap, time + dtMax, stateVec[domIdx]); - } - - time += dtMax; - - } // outer time loop - return 0; -} - -void calc_neighbor_dims( - int ndomX, - int ndomY, - int ndomZ, - int bcStencilDof, - vector> & exchDomIdVec) -{ - // TODO: extend to 3D - - const int ndomains = ndomX * ndomY * ndomZ; - vector numDofStencilBcVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - int i = domIdx % ndomX; - int j = domIdx / ndomX; - int neighborId; - - // left boundary - if (i != 0) { - neighborId = domIdx - 1; - exchDomIdVec[domIdx][0] = neighborId; - } - - // "front" boundary - if (j != (ndomY - 1)) { - neighborId = domIdx + ndomX; - exchDomIdVec[domIdx][1] = neighborId; - } - - // right boundary - if (i != (ndomX - 1)) { - neighborId = domIdx + 1; - exchDomIdVec[domIdx][2] = neighborId; - } - - // "back" boundary - if (j != 0) { - neighborId = domIdx - ndomX; - exchDomIdVec[domIdx][3] = neighborId; - } - - // TODO: for 3D, need "bottom" and "top" - - } -} - -template -vector calc_exch_graph( - const int ndomains, - const int overlap, - const int bcStencilSize, - const vector & appVec, - const vector> & exchDomIdVec) -{ - // TODO: extend to 3D - - // BC cell indexing example - // L/R is from bottom to top, F/B is from left to right - // Trying to mix cell ordering and face ordering - // _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - // ¦_(4, 1)_¦_(5, 1)_¦_(6, 1)_¦_(7, 1)_¦_(8, 1)_¦ - // _ _ _ _ _ _ _ _¦_(4, 0)_¦_(5, 0)_¦_(6, 0)_¦_(7, 0)_¦_(8, 0)_¦_ _ _ _ _ _ _ _ _ - // ¦_(3,1)_¦_(3,0)_|________|________|________|________|________|_(12,1)_¦_(12,0)_| - // ¦_(2,1)_¦_(2,0)_|________|________|________|________|________|_(11,1)_¦_(11,0)_| - // ¦_(1,1)_¦_(1,0)_|________|________|________|________|________|_(10,1)_¦_(10,0)_| - // ¦_(0,1)_¦_(0,0)_|________|________|________|________|________|_(9, 1)_¦_(9, 0)_| - // ¦_(13,0)_¦_(14,0)_¦_(15,0)_¦_(16,0)_¦_(17,0)_¦ - // ¦_(13,1)_¦_(14,1)_¦_(15,1)_¦_(16,1)_¦_(17,1)_¦ - - vector exchGraphVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - // this domain's mesh and dimensions - const auto domMesh = appVec[domIdx].getMesh(); - const auto domGraph = domMesh.graph(); - int nx = domMesh.nx(); - int ny = domMesh.ny(); - - const auto & x = domMesh.viewX(); - const auto & y = domMesh.viewY(); - - // TODO: generalize to 3D - pda::resize(exchGraphVec[domIdx], 2*nx + 2*ny, bcStencilSize); - exchGraphVec[domIdx].setOnes(); - exchGraphVec[domIdx] *= -1; - - // loop through neighboring domains - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { - - int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; - if (neighDomIdx == -1) { - continue; // not a Schwarz BC - } - - // neighboring domain mesh and dimensions - const auto neighMesh = appVec[neighDomIdx].getMesh(); - int nxNeigh = neighMesh.nx(); - int nyNeigh = neighMesh.ny(); - - int exchCellIdx; - - // east-west neighbors will share a row index - // left - if (neighIdx == 0) { - if (ny != nyNeigh) { - cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; - exit(-1); - } - - int bcCellIdx = 0; // left boundary is the start - for (int yIdx = 0; yIdx < ny; ++yIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; - exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // north-south neighbors will share a column index - // "front" - if (neighIdx == 1) { - if (nx != nxNeigh) { - cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; - exit(-1); - } - - int bcCellIdx = ny * bcStencilSize; // skip left boundary indices - for (int xIdx = 0; xIdx < nx; ++xIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = (overlap + stencilIdx) * nxNeigh + xIdx; - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // right - if (neighIdx == 2) { - if (ny != nyNeigh) { - cerr << "Mesh y-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << ny << " != " << nyNeigh << endl; - exit(-1); - } - - int bcCellIdx = (ny + nx) * bcStencilSize; // skip left and "front" boundary indices - for (int yIdx = 0; yIdx < ny; ++yIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = nxNeigh * yIdx + overlap + stencilIdx; - // TODO: check for a different problem - // exchCellIdx = nxNeigh * yIdx + overlap - 1 + stencilIdx; // toward boundary - // exchCellIdx = nxNeigh * yIdx + overlap + 1 + stencilIdx; // away from boundary - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // "back" - if (neighIdx == 3) { - if (nx != nxNeigh) { - cerr << "Mesh x-dimension mismatch for domains " << domIdx << " v " << neighDomIdx << ": " << nx << " != " << nxNeigh << endl; - exit(-1); - } - - int bcCellIdx = (2*ny + nx) * bcStencilSize; // skip left, "front", and right boundary indices - for (int xIdx = 0; xIdx < nx; ++xIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = (nyNeigh - 1 - overlap - stencilIdx) * nxNeigh + xIdx; - exchGraphVec[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; - } - bcCellIdx++; - } - } - - // TODO: generalize to 3D - - } // neighbor loop - } // domain loop - - return exchGraphVec; - -} - -template -void comm_stateBc( - const int startIdx, - const int endIdx, - const int bcStencilSize, - const int dofPerCell, - const graph_t & exchGraph, - state_t & bcState, - const state_t & intState) -{ - - int exchCellIdx; - for (int bcCellIdx = startIdx; bcCellIdx < endIdx; ++bcCellIdx) { - for (int stencilIdx = 0; stencilIdx < bcStencilSize; ++stencilIdx) { - exchCellIdx = exchGraph(bcCellIdx, stencilIdx); - for (int dof = 0; dof < dofPerCell; ++dof) { - bcState((bcCellIdx + stencilIdx) * dofPerCell + dof) = intState(exchCellIdx * dofPerCell + dof); - } - } - } - -} - -template -void broadcast_bcState( - const int domIdx, - const int dofPerCell, - const int bcStencilSize, - vector & stateVec, - vector & stateBcVec, - const vector & appVec, - const vector> & exchDomIdVec, - const vector & exchGraphVec) -{ - - const auto domState = stateVec[domIdx]; - - int exchCellIdx; - int startIdx; - int endIdx; - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { - - int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; - if (neighDomIdx == -1) { - continue; // not a Schwarz BC - } - - const auto neighMesh = appVec[neighDomIdx].getMesh(); - int nxNeigh = neighMesh.nx(); - int nyNeigh = neighMesh.ny(); - auto * neighStateBc = &stateBcVec[neighDomIdx]; - const auto neighExchGraph = exchGraphVec[neighDomIdx]; - - // this domain is the neighboring domain's left neighbor - if (neighIdx == 2) { - startIdx = 0; - endIdx = nyNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's front neighbor - if (neighIdx == 3) { - startIdx = nyNeigh; - endIdx = nyNeigh + nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's right neighbor - if (neighIdx == 0) { - startIdx = nyNeigh + nxNeigh; - endIdx = 2 * nyNeigh + nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); - } - - // this domain is the neighboring domain's back neighbor - if (neighIdx == 1) { - startIdx = 2 * nyNeigh + nxNeigh; - endIdx = 2 * nyNeigh + 2 * nxNeigh; - comm_stateBc(startIdx, endIdx, bcStencilSize, dofPerCell, neighExchGraph, *neighStateBc, domState); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); } } + return 0; } - -template -vector calc_ghost_graph( - const int ndomains, - const int dofPerCell, - const vector & meshVec, - const vector> & exchDomIdVec) -{ - - vector ghostGraphVec(ndomains); - - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - const auto meshObj = meshVec[domIdx]; - const auto intGraph = meshObj.graph(); - int nx = meshObj.nx(); - int ny = meshObj.ny(); - - const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); - pda::resize(ghostGraphVec[domIdx], int(rowsBd.size()), 4); // TODO: generalize to 2 * ndim - ghostGraphVec[domIdx].setOnes(); - ghostGraphVec[domIdx] *= -1; - - for (decltype(rowsBd.size()) it = 0; it < rowsBd.size(); ++it) { - - // ASK FRANCESCO: is there an instance when rowsBd[it] != intGraph(rowsBd[it], 0)? - // The indices appear to be identical - // TODO: this is all totally wrong for higher order - - const auto smPt = rowsBd[it]; - const auto left0 = intGraph(smPt, 1); - const auto front0 = intGraph(smPt, 2); - const auto right0 = intGraph(smPt, 3); - const auto back0 = intGraph(smPt, 4); - - int stencilIdx = 0; // first order - int rowIdx = smPt / nx; - int colIdx = smPt % nx; - int bcCellIdx; - - if (left0 == -1) { - if (exchDomIdVec[domIdx][0] != -1) { - bcCellIdx = rowIdx; - ghostGraphVec[domIdx](it, 0) = bcCellIdx * dofPerCell; - } - } - - if (front0 == -1) { - if (exchDomIdVec[domIdx][1] != -1) { - bcCellIdx = ny + colIdx; - ghostGraphVec[domIdx](it, 1) = bcCellIdx * dofPerCell; - } - } - - if (right0 == -1) { - if (exchDomIdVec[domIdx][2] != -1) { - bcCellIdx = ny + nx + rowIdx; - ghostGraphVec[domIdx](it, 2) = bcCellIdx * dofPerCell; - } - } - - if (back0 == -1) { - if (exchDomIdVec[domIdx][3] != -1) { - bcCellIdx = 2 * ny + nx + colIdx; - ghostGraphVec[domIdx](it, 3) = bcCellIdx * dofPerCell; - } - } - // TODO: extend to higher order, 3D - - } // boundary cell loop - } // domain loop - - return ghostGraphVec; - -} - - -template -array calcConvergence( - const state_t state1, - const state_t state2, - const int numElems) -{ - // TODO: assumed to be an Eigen state, not sure how to generalize - // TODO: compute convergence for each variable separately - - int numDOF = state1.size(); - if (state2.size() != numDOF) { - cerr << "state1 size does not match state2 size, " << numDOF << " vs. " << state2.size() << endl; - exit(-1); - } - double numDOFPerCellD = double(numDOF) / numElems; - if (round(numDOFPerCellD) != numDOFPerCellD) { - cerr << "Computed a non-integer number of variables: " << numDOFPerCellD << endl; - exit(-1); - } - int numDOFPerCell = round(numDOFPerCellD); - - // absolute error - double abs_err = (state1 - state2).squaredNorm(); - - // handle edge cases for relative error - double rel_err; - double basenorm = state1.squaredNorm(); - if (basenorm > 0) { - rel_err = abs_err / basenorm; - } - else { - if (abs_err > 0) { - rel_err = 1.0; - } - else { - rel_err = 0.0; - } - } - - array errArr = {abs_err, rel_err}; - return errArr; - -} \ No newline at end of file From 5c230154020e9619b9437e63e6d4a9ea9dc04353 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Tue, 6 Jun 2023 15:16:52 -0700 Subject: [PATCH 12/17] remove read_domain_info from mesh_read_info.hpp --- .../pressiodemoapps/impl/mesh_read_info.hpp | 57 ------------------- 1 file changed, 57 deletions(-) diff --git a/include/pressiodemoapps/impl/mesh_read_info.hpp b/include/pressiodemoapps/impl/mesh_read_info.hpp index 9fb12cf5..dfdf40fb 100644 --- a/include/pressiodemoapps/impl/mesh_read_info.hpp +++ b/include/pressiodemoapps/impl/mesh_read_info.hpp @@ -134,62 +134,5 @@ void read_mesh_info(const std::string & meshDir, source.close(); } -void read_domain_info(const std::string & meshRoot, int & dim, - int & ndomX, int & ndomY, int & ndomZ, - int & overlap) -{ - const auto inFile = meshRoot + "/info_domain.dat"; - std::ifstream foundFile(inFile); - if(!foundFile){ - std::cout << "file not found " << inFile << std::endl; - exit(EXIT_FAILURE); - } - - // defaults - ndomX = 1; - ndomY = 1; - ndomZ = 1; - - std::ifstream source( inFile, std::ios_base::in); - std::string line; - while (std::getline(source, line) ) - { - std::istringstream ss(line); - std::string colVal; - ss >> colVal; - - if (colVal == "dim"){ - ss >> colVal; - dim = std::stoi(colVal); - } - - else if (colVal == "ndomX"){ - ss >> colVal; - ndomX = std::stoi(colVal); - } - - else if (colVal == "ndomY"){ - ss >> colVal; - ndomY = std::stoi(colVal); - } - - else if (colVal == "ndomZ"){ - ss >> colVal; - ndomZ = std::stoi(colVal); - } - - else if (colVal == "overlap"){ - ss >> colVal; - overlap = std::stoi(colVal); - // has to be an even number for simplicity, can change later - if (overlap % 2) { - std::cerr << "overlap must be an even number" << std::endl; - exit(-1); - } - } - } - source.close(); -} - }} #endif From eee2b120714c43b3961d37c12e593aabc2526aff Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Wed, 14 Jun 2023 09:47:52 -0700 Subject: [PATCH 13/17] 2d Riemann Schwarz --- .../impl/euler_2d_ghost_filler_neumann.hpp | 142 ++++++++++++++++++ .../impl/euler_2d_prob_class.hpp | 40 +++-- include/pressiodemoapps/impl/schwarz.hpp | 11 +- tests_cpp/CMakeLists.txt | 2 + .../main.cc | 3 - .../CMakeLists.txt | 4 + .../firstorder/CMakeLists.txt | 19 +++ .../eigen_2d_euler_riemann_implicit/main.cc | 42 ++++++ .../CMakeLists.txt | 4 + .../firstorder/CMakeLists.txt | 19 +++ .../main.cc | 78 ++++++++++ 11 files changed, 347 insertions(+), 17 deletions(-) create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/main.cc create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/firstorder/CMakeLists.txt create mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc diff --git a/include/pressiodemoapps/impl/euler_2d_ghost_filler_neumann.hpp b/include/pressiodemoapps/impl/euler_2d_ghost_filler_neumann.hpp index f9cb43ba..72b4beac 100644 --- a/include/pressiodemoapps/impl/euler_2d_ghost_filler_neumann.hpp +++ b/include/pressiodemoapps/impl/euler_2d_ghost_filler_neumann.hpp @@ -256,5 +256,147 @@ class Ghost2dNeumannFiller ghost_t & m_ghostBack; }; +template +class Ghost2dNeumannFillerWithCustomBc +{ + + using graph_t = typename mesh_t::graph_t; + +public: + Ghost2dNeumannFillerWithCustomBc() = delete; + Ghost2dNeumannFillerWithCustomBc(const int stencilSize, + int numDofPerCell, + const state_t & stateIn, + const mesh_t & meshIn, + ghost_t & ghostLeft, + ghost_t & ghostFront, + ghost_t & ghostRight, + ghost_t & ghostBack, + const state_t & stateBcs, + const graph_t & graphBcs) + : m_stencilSize(stencilSize), + m_numDofPerCell(numDofPerCell), + m_state(stateIn), + m_meshObj(meshIn), + m_ghostLeft(ghostLeft), + m_ghostFront(ghostFront), + m_ghostRight(ghostRight), + m_ghostBack(ghostBack), + m_stateBcs(stateBcs), + m_graphBcs(graphBcs) + {} + + template + void operator()(index_t smPt, int gRow) + { + if (m_numDofPerCell == 4){ + fourDofImpl(smPt, gRow); + } + } + +private: + + template + void fourDofImpl(index_t smPt, int gRow) + { + const auto & graph = m_meshObj.graph(); + const auto cellGID = graph(smPt, 0); + const auto uIndex = cellGID*m_numDofPerCell; + + const auto left0 = graph(smPt, 1); + const auto front0 = graph(smPt, 2); + const auto right0 = graph(smPt, 3); + const auto back0 = graph(smPt, 4); + + if (left0 == -1) + { + const auto bcIndex = m_graphBcs(gRow, 0); + if (bcIndex == -1) { + m_ghostLeft(gRow, 0) = m_state(uIndex); + m_ghostLeft(gRow, 1) = m_state(uIndex+1); + m_ghostLeft(gRow, 2) = m_state(uIndex+2); + m_ghostLeft(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostLeft(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostLeft(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostLeft(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostLeft(gRow, 3) = m_stateBcs(bcIndex+3); + } + } + + if (front0 == -1) + { + const auto bcIndex = m_graphBcs(gRow, 1); + if (bcIndex == -1) { + m_ghostFront(gRow, 0) = m_state(uIndex); + m_ghostFront(gRow, 1) = m_state(uIndex+1); + m_ghostFront(gRow, 2) = m_state(uIndex+2); + m_ghostFront(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostFront(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostFront(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostFront(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostFront(gRow, 3) = m_stateBcs(bcIndex+3); + } + } + + if (right0 == -1) + { + const auto bcIndex = m_graphBcs(gRow, 2); + if (bcIndex == -1) { + m_ghostRight(gRow, 0) = m_state(uIndex); + m_ghostRight(gRow, 1) = m_state(uIndex+1); + m_ghostRight(gRow, 2) = m_state(uIndex+2); + m_ghostRight(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostRight(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostRight(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostRight(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostRight(gRow, 3) = m_stateBcs(bcIndex+3); + } + } + + if (back0 == -1) + { + const auto bcIndex = m_graphBcs(gRow, 3); + if (bcIndex == -1) { + m_ghostBack(gRow, 0) = m_state(uIndex); + m_ghostBack(gRow, 1) = m_state(uIndex+1); + m_ghostBack(gRow, 2) = m_state(uIndex+2); + m_ghostBack(gRow, 3) = m_state(uIndex+3); + } + else { + m_ghostBack(gRow, 0) = m_stateBcs(bcIndex+0); + m_ghostBack(gRow, 1) = m_stateBcs(bcIndex+1); + m_ghostBack(gRow, 2) = m_stateBcs(bcIndex+2); + m_ghostBack(gRow, 3) = m_stateBcs(bcIndex+3); + } + } + + if (m_stencilSize >= 5){ + throw std::runtime_error("Higher order BCs not implemented for Schwarz Neumann"); + } + + } + +private: + int m_stencilSize; + int m_numDofPerCell; + const state_t & m_state; + const mesh_t & m_meshObj; + ghost_t & m_ghostLeft; + ghost_t & m_ghostFront; + ghost_t & m_ghostRight; + ghost_t & m_ghostBack; + + // Schwarz coupling + const state_t & m_stateBcs; + const graph_t & m_graphBcs; + +}; + }} #endif diff --git a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp index 987494e6..199a3d87 100644 --- a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp @@ -393,19 +393,40 @@ class EigenApp m_probEn == ::pressiodemoapps::Euler2d::Riemann or m_probEn == ::pressiodemoapps::Euler2d::testingonlyneumann) { - using ghost_filler_t = Ghost2dNeumannFiller< - U_t, MeshType, ghost_container_type>; - ghost_filler_t ghF(stencilSize, numDofPerCell, - U, m_meshObj, - m_ghostLeft, m_ghostFront, - m_ghostRight, m_ghostBack); + if (m_stateBc){ + using ghost_filler_t = Ghost2dNeumannFillerWithCustomBc< + U_t, MeshType, ghost_container_type>; + ghost_filler_t ghF(stencilSize, numDofPerCell, + U, m_meshObj, + m_ghostLeft, m_ghostFront, + m_ghostRight, m_ghostBack, + *m_stateBc, *m_ghostGraph); - const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); + const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); #ifdef PRESSIODEMOAPPS_ENABLE_OPENMP #pragma omp for schedule(static) #endif - for (decltype(rowsBd.size()) it=0; it; + ghost_filler_t ghF(stencilSize, numDofPerCell, + U, m_meshObj, + m_ghostLeft, m_ghostFront, + m_ghostRight, m_ghostBack); + + const auto & rowsBd = m_meshObj.graphRowsOfCellsNearBd(); +#ifdef PRESSIODEMOAPPS_ENABLE_OPENMP +#pragma omp for schedule(static) +#endif + for (decltype(rowsBd.size()) it=0; it(1)); diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp index c0860d87..70b988f1 100644 --- a/include/pressiodemoapps/impl/schwarz.hpp +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -24,7 +24,6 @@ namespace pressiodemoapps{ namespace impl { class prob_t, class order_t, class scheme_t - // class linsolver_t > class SchwarzDecomp { @@ -48,7 +47,8 @@ namespace pressiodemoapps{ namespace impl { order_t order, scheme_t scheme, const std::string & meshRoot, - vector & dtVec) + vector & dtVec, + const int icflag = 1) { // get decomposition info @@ -57,7 +57,7 @@ namespace pressiodemoapps{ namespace impl { // set up problem setup_controller(dtVec); - init_problem(probId, order, scheme, meshRoot); + init_problem(probId, order, scheme, meshRoot, icflag); // set up communication patterns bcStencilSize = (pda::reconstructionTypeToStencilSize(order) - 1) / 2; @@ -171,7 +171,8 @@ namespace pressiodemoapps{ namespace impl { prob_t probId, order_t order, scheme_t scheme, - const string & meshRoot) + const string & meshRoot, + const int icflag) { // problem vectors initialization for each subdomain @@ -187,7 +188,7 @@ namespace pressiodemoapps{ namespace impl { meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(meshRoot + "/domain_" + to_string(domIdx)); // problem and state - appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); + appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order, icflag); stateVec[domIdx] = appVec[domIdx].initialCondition(); for (int histIdx = 0; histIdx < controlIters[domIdx] + 1; ++histIdx) { stateHistVec[domIdx].emplace_back(appVec[domIdx].initialCondition()); diff --git a/tests_cpp/CMakeLists.txt b/tests_cpp/CMakeLists.txt index 843b777c..a99c97a6 100644 --- a/tests_cpp/CMakeLists.txt +++ b/tests_cpp/CMakeLists.txt @@ -82,6 +82,8 @@ add_subdirectory(eigen_2d_advdiffreac_probA_sample_mesh_test) add_subdirectory(eigen_2d_advdiffreac_probA_implicit) add_subdirectory(eigen_2d_euler_double_mach_reflection_schwarz) +add_subdirectory(eigen_2d_euler_riemann_implicit) +add_subdirectory(eigen_2d_euler_riemann_implicit_schwarz) # --------------------------------------------------------- # 3d problems diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc index aaa40abd..3bb692c8 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -10,8 +10,6 @@ int main() namespace pda = pressiodemoapps; namespace plog = pressio::log; namespace pode = pressio::ode; - namespace pls = pressio::linearsolvers; - namespace pnls = pressio::nonlinearsolvers; plog::initialize(pressio::logto::terminal); plog::setVerbosity({pressio::log::level::debug}); @@ -40,7 +38,6 @@ int main() decltype(probId), decltype(order), decltype(scheme) - // itsolv_t >(probId, order, scheme, meshRoot, dt); // observer diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt new file mode 100644 index 00000000..f568c0d8 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt @@ -0,0 +1,4 @@ + +add_subdirectory(firstorder) +#add_subdirectory(weno3) +#add_subdirectory(weno5) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt new file mode 100644 index 00000000..344cf6da --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt @@ -0,0 +1,19 @@ + +set(testname eigen_2d_riemann_firstorder_implicit) +set(exename ${testname}_exe) + +#configure_file(../plot.py plot.py COPYONLY) +#configure_file(../compare.py compare.py COPYONLY) +#configure_file(p_gold.txt p_gold.txt COPYONLY) +#configure_file(rho_gold.txt rho_gold.txt COPYONLY) + +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) + +add_test(NAME ${testname} +COMMAND ${CMAKE_COMMAND} +-DMESHDRIVER=${MESHSRC}/create_full_mesh.py +-DOUTDIR=${CMAKE_CURRENT_BINARY_DIR} +-DEXENAME=$ +-DSTENCILVAL=3 +-P ${CMAKE_CURRENT_SOURCE_DIR}/../test.cmake +) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc b/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc new file mode 100644 index 00000000..424efbb4 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc @@ -0,0 +1,42 @@ +#include "pressio/ode_steppers_implicit.hpp" +#include "pressio/ode_advancers.hpp" +#include "pressiodemoapps/euler2d.hpp" +#include "../observer.hpp" + +int main() +{ + namespace pda = pressiodemoapps; + const auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("/home/crwentl/research/runs/pressio/riemann/meshes/mesh_1x1_refx/domain_0"); +#ifdef USE_WENO5 + const auto order = pda::InviscidFluxReconstruction::Weno5; +#elif defined USE_WENO3 + const auto order = pda::InviscidFluxReconstruction::Weno3; +#else + const auto order = pda::InviscidFluxReconstruction::FirstOrder; +#endif + + const auto probId = pda::Euler2d::Riemann; + auto appObj = pda::create_problem_eigen(meshObj, probId, order, 2); + using app_t = decltype(appObj); + using state_t = typename app_t::state_type; + using jacob_t = typename app_t::jacobian_type; + + state_t state(appObj.initialCondition()); + + auto stepperObj = pressio::ode::create_implicit_stepper( + pressio::ode::StepScheme::CrankNicolson, appObj); + + using lin_solver_t = pressio::linearsolvers::Solver< + pressio::linearsolvers::iterative::Bicgstab, jacob_t>; + lin_solver_t linSolverObj; + auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); + NonLinSolver.setTolerance(1e-5); + + FomObserver Obs("riemann2d_solution.bin", 1); + + const auto dt = 0.001; + const auto Nsteps = pressio::ode::StepCount(1.0/dt); + pressio::ode::advance_n_steps(stepperObj, state, 0., dt, Nsteps, Obs, NonLinSolver); + + return 0; +} diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/CMakeLists.txt new file mode 100644 index 00000000..f568c0d8 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/CMakeLists.txt @@ -0,0 +1,4 @@ + +add_subdirectory(firstorder) +#add_subdirectory(weno3) +#add_subdirectory(weno5) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/firstorder/CMakeLists.txt new file mode 100644 index 00000000..bc377ba0 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/firstorder/CMakeLists.txt @@ -0,0 +1,19 @@ + +set(testname eigen_2d_riemann_firstorder_implicit_schwarz) +set(exename ${testname}_exe) + +#configure_file(../plot.py plot.py COPYONLY) +#configure_file(../compare.py compare.py COPYONLY) +#configure_file(p_gold.txt p_gold.txt COPYONLY) +#configure_file(rho_gold.txt rho_gold.txt COPYONLY) + +add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) + +#add_test(NAME ${testname} +#COMMAND ${CMAKE_COMMAND} +#-DMESHDRIVER=${MESHSRC}/create_full_mesh.py +#-DOUTDIR=${CMAKE_CURRENT_BINARY_DIR} +#-DEXENAME=$ +#-DSTENCILVAL=3 +#-P ${CMAKE_CURRENT_SOURCE_DIR}/../test.cmake +#) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc new file mode 100644 index 00000000..c5a79ad2 --- /dev/null +++ b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc @@ -0,0 +1,78 @@ + +#include "pressiodemoapps/euler2d.hpp" +#include "pressiodemoapps/impl/schwarz.hpp" +#include "../observer.hpp" + +using namespace std; + +int main() +{ + namespace pda = pressiodemoapps; + namespace plog = pressio::log; + namespace pode = pressio::ode; + + plog::initialize(pressio::logto::terminal); + plog::setVerbosity({pressio::log::level::debug}); + + // +++++ USER INPUTS +++++ + string meshRoot = "/home/crwentl/research/runs/pressio/riemann/meshes/mesh_2x2_refx"; + string obsRoot = "riemann2d_solution"; + const int obsFreq = 1; + + // problem definition + const auto probId = pda::Euler2d::Riemann; + const auto order = pda::InviscidFluxReconstruction::FirstOrder; + const auto scheme = pode::StepScheme::CrankNicolson; + + // time stepping + const int numSteps = 1000; + vector dt(1, 0.001); + const int convergeStepMax = 10; + const double abs_err_tol = 1e-11; + const double rel_err_tol = 1e-11; + + // +++++ END USER INPUTS +++++ + + // decomposition + auto decomp = pda::impl::SchwarzDecomp< + decltype(probId), + decltype(order), + decltype(scheme) + >(probId, order, scheme, meshRoot, dt, 2); + + // observer + using state_t = decltype(decomp)::state_t; + using obs_t = FomObserver; + vector obsVec(decomp.ndomains); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); + obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); + } + + // solve + double time = 0.0; + for (int outerStep = 1; outerStep <= numSteps; ++outerStep) + { + cout << "Step " << outerStep << endl; + + // compute contoller step until convergence + decomp.calc_controller_step( + outerStep, + time, + rel_err_tol, + abs_err_tol, + convergeStepMax + ); + + time += decomp.dtMax; + + // output observer + const auto stepWrap = pode::StepCount(outerStep); + for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { + obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); + } + + } + + return 0; +} From 95ff8abd311f643f964571ed03f43943bf8b81a5 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Wed, 14 Jun 2023 11:30:04 -0700 Subject: [PATCH 14/17] revert left Schwarz BC to original, modify Schwarz BC Jacobian factors --- .../impl/euler_2d_prob_class.hpp | 55 ++++++++++++++----- include/pressiodemoapps/impl/schwarz.hpp | 4 +- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp index 199a3d87..72d43103 100644 --- a/include/pressiodemoapps/impl/euler_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/euler_2d_prob_class.hpp @@ -775,11 +775,11 @@ class EigenApp const auto smPt = graphRows[it]; FillStencilX(smPt, it, numDofPerCell); - fillJacFactorsForCellBd(smPt, xAxis, bcCellJacFactors); + fillJacFactorsForCellBd(smPt, it, xAxis, bcCellJacFactors); funcx(smPt, numDofPerCell, bcCellJacFactors); FillStencilY(smPt, it, numDofPerCell); - fillJacFactorsForCellBd(smPt, yAxis, bcCellJacFactors); + fillJacFactorsForCellBd(smPt, it, yAxis, bcCellJacFactors); funcy(smPt, numDofPerCell, bcCellJacFactors); } } @@ -914,13 +914,13 @@ class EigenApp FillStencilVeloX(smPt, it, numDofPerCell); funcVeloX(smPt, numDofPerCell); FillStencilJacX(smPt, it, numDofPerCell); - fillJacFactorsForCellBd(smPt, xAxis, bcCellJacFactors); + fillJacFactorsForCellBd(smPt, it, xAxis, bcCellJacFactors); funcJacX(smPt, numDofPerCell, bcCellJacFactors); FillStencilVeloY(smPt, it, numDofPerCell); funcVeloY(smPt, numDofPerCell); FillStencilJacY(smPt, it, numDofPerCell); - fillJacFactorsForCellBd(smPt, yAxis, bcCellJacFactors); + fillJacFactorsForCellBd(smPt, it, yAxis, bcCellJacFactors); funcJacY(smPt, numDofPerCell, bcCellJacFactors); } } @@ -1050,16 +1050,41 @@ class EigenApp } } - void fillJacFactorsForCellBd(index_t graphRow, int axis, + void fillJacFactorsForCellBd(index_t smPt, int it, int axis, std::array & facs) const { + // Schwarz boundary always Dirichlet, for now + // TODO: modify this if implementing non-overlapping + if (m_ghostGraph) { + if (axis == 1) { + if (m_meshObj.hasBdLeft2d(smPt) && ((*m_ghostGraph)(it, 0) != -1)) { + facs = {0., 0., 0., 0.}; + return; + } + if (m_meshObj.hasBdRight2d(smPt) && ((*m_ghostGraph)(it, 2) != -1)) { + facs = {0., 0., 0., 0.}; + return; + } + } + if (axis == 2) { + if (m_meshObj.hasBdFront2d(smPt) && ((*m_ghostGraph)(it, 1) != -1)) { + facs = {0., 0., 0., 0.}; + return; + } + if (m_meshObj.hasBdBack2d(smPt) && ((*m_ghostGraph)(it, 3) != -1)) { + facs = {0., 0., 0., 0.}; + return; + } + } + } + if (m_probEn == ::pressiodemoapps::Euler2d::SedovFull or m_probEn == ::pressiodemoapps::Euler2d::Riemann or m_probEn == ::pressiodemoapps::Euler2d::testingonlyneumann) { // CRW: something here messing with Schwarz? - (void)graphRow; + (void)smPt; // homog neumann facs.fill(static_cast(1)); return; @@ -1067,13 +1092,13 @@ class EigenApp else if (m_probEn == ::pressiodemoapps::Euler2d::SedovSymmetry) { - if (axis == 1 && m_meshObj.hasBdLeft2d(graphRow)){ + if (axis == 1 && m_meshObj.hasBdLeft2d(smPt)){ // relfective facs = {1., -1., 1., 1.}; return; } - else if (axis == 2 && m_meshObj.hasBdBack2d(graphRow)){ + else if (axis == 2 && m_meshObj.hasBdBack2d(smPt)){ // relfective facs = {1., 1., -1., 1.}; return; @@ -1105,7 +1130,7 @@ class EigenApp const scalar_type wedgePosition = static_cast(1)/static_cast(6); const auto & x = m_meshObj.viewX(); - const auto cellGID = m_meshObj.graph()(graphRow, 0); + const auto cellGID = m_meshObj.graph()(smPt, 0); const auto myX = x(cellGID); if (axis == 1){ @@ -1114,13 +1139,13 @@ class EigenApp return; } - if (axis == 2 && m_meshObj.hasBdBack2d(graphRow) && (myX < wedgePosition)){ + if (axis == 2 && m_meshObj.hasBdBack2d(smPt) && (myX < wedgePosition)){ // homog neumann facs = {1., 1., 1., 1.}; return; } - if (axis == 2 && m_meshObj.hasBdBack2d(graphRow) && (myX >= wedgePosition)){ + if (axis == 2 && m_meshObj.hasBdBack2d(smPt) && (myX >= wedgePosition)){ // reflective facs = {1., 1., -1., 1.}; return; @@ -1133,26 +1158,26 @@ class EigenApp else if (m_probEn == ::pressiodemoapps::Euler2d::CrossShock) { - if (axis == 1 && m_meshObj.hasBdLeft2d(graphRow)){ + if (axis == 1 && m_meshObj.hasBdLeft2d(smPt)){ // dirichlet facs = {0., 0., 0., 0.}; return; } - if (axis == 1 && m_meshObj.hasBdRight2d(graphRow)){ + if (axis == 1 && m_meshObj.hasBdRight2d(smPt)){ // homog neumann facs = {1., 1., 1., 1.}; return; } - if (axis == 2 && m_meshObj.hasBdBack2d(graphRow)) + if (axis == 2 && m_meshObj.hasBdBack2d(smPt)) { // dirichlet for u,v, and homog neumann for rho and rho*E facs = {1., 0., 0., 1.}; return; } - if (axis == 2 && m_meshObj.hasBdFront2d(graphRow)) + if (axis == 2 && m_meshObj.hasBdFront2d(smPt)) { // homog neumann for rho and rho*E facs = {1., 1., 1., 1.}; diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp index 70b988f1..871441d5 100644 --- a/include/pressiodemoapps/impl/schwarz.hpp +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -397,8 +397,8 @@ namespace pressiodemoapps{ namespace impl { int bcCellIdx = 0; // left boundary is the start for (int yIdx = 0; yIdx < ny; ++yIdx) { for (int stencilIdx = 0; stencilIdx < bcStencil; ++stencilIdx) { - // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; - exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary + exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap - stencilIdx; + // exchCellIdx = (nxNeigh * (yIdx + 1) - 1) - overlap + 1 - stencilIdx; // toward boundary exchGraphs[domIdx](bcCellIdx, stencilIdx) = exchCellIdx; } bcCellIdx++; From 312f5c1d41d4db099fb5147b9252f11aa5e4e7d8 Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Thu, 6 Jul 2023 09:52:26 +0200 Subject: [PATCH 15/17] remove unused and update for new pressio --- ...ction_diffusion_reaction_2d_prob_class.hpp | 1 + ...2d_ghost_filler_double_mach_reflection.hpp | 2 - include/pressiodemoapps/impl/schwarz.hpp | 28 ++++++------- tests_cpp/CMakeLists.txt | 1 - .../main.cc | 2 +- .../CMakeLists.txt | 4 -- .../firstorder/CMakeLists.txt | 19 --------- .../eigen_2d_euler_riemann_implicit/main.cc | 42 ------------------- .../main.cc | 2 +- 9 files changed, 17 insertions(+), 84 deletions(-) delete mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt delete mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt delete mode 100644 tests_cpp/eigen_2d_euler_riemann_implicit/main.cc diff --git a/include/pressiodemoapps/impl/advection_diffusion_reaction_2d_prob_class.hpp b/include/pressiodemoapps/impl/advection_diffusion_reaction_2d_prob_class.hpp index f3bce795..6c6d4f7a 100644 --- a/include/pressiodemoapps/impl/advection_diffusion_reaction_2d_prob_class.hpp +++ b/include/pressiodemoapps/impl/advection_diffusion_reaction_2d_prob_class.hpp @@ -83,6 +83,7 @@ class EigenApp using state_type = Eigen::Matrix; using velocity_type = state_type; using jacobian_type = Eigen::SparseMatrix; + using graph_type = typename MeshType::graph_t; private: static constexpr int dimensionality{2}; diff --git a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp index a3fb3d5c..957ac330 100644 --- a/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp +++ b/include/pressiodemoapps/impl/euler_2d_ghost_filler_double_mach_reflection.hpp @@ -93,8 +93,6 @@ class DoubleMachReflection2dGhostFillerWithCustomBc constexpr int numDofPerCell = 4; constexpr scalar_type zero{0}; - constexpr scalar_type two{2}; - constexpr scalar_type three{3}; const auto & graph = m_meshObj.graph(); assert(::pressiodemoapps::extent(graph, 0) >= 5); diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp index 871441d5..e60fff13 100644 --- a/include/pressiodemoapps/impl/schwarz.hpp +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -38,7 +38,7 @@ namespace pressiodemoapps{ namespace impl { using stepper_t = decltype( pode::create_implicit_stepper(declval(), declval()) ); // TODO: generalize using linsolver_t = pls::Solver; - using nonlinsolver_t = decltype( pnls::create_newton_raphson( declval(), declval()) ); + using nonlinsolver_t = decltype( pressio::create_newton_solver( declval(), declval()) ); public: @@ -146,7 +146,7 @@ namespace pressiodemoapps{ namespace impl { if (dt.size() == 1) { dt.resize(ndomains, dt[0]); } else { - if (dt.size() != ndomains) { + if (dt.size() != (std::size_t) ndomains) { cerr << "dt.size() must be 1 or ndomains, exiting" << endl; exit(-1); } @@ -155,7 +155,7 @@ namespace pressiodemoapps{ namespace impl { // controller time step checks controlIters.resize(ndomains); - for (int domIdx = 0; domIdx < dt.size(); ++domIdx) { + for (int domIdx = 0; domIdx < (int) dt.size(); ++domIdx) { double niters = dtMax / dt[domIdx]; if (round(niters) == niters) { controlIters[domIdx] = int(round(niters)); @@ -196,8 +196,8 @@ namespace pressiodemoapps{ namespace impl { // time stepping stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); - nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), *linSolverObj) ); - nonlinSolverVec[domIdx].setTolerance(1e-5); + nonlinSolverVec.emplace_back( pressio::create_newton_solver(stepperVec.back(), *linSolverObj) ); + nonlinSolverVec[domIdx].setStopTolerance(1e-5); } } @@ -283,7 +283,7 @@ namespace pressiodemoapps{ namespace impl { int ny = domMesh.ny(); int nz = domMesh.nz(); - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + for (int neighIdx = 0; neighIdx < (int) exchDomIdVec[domIdx].size(); ++neighIdx) { int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; if (neighDomIdx == -1) { @@ -369,15 +369,15 @@ namespace pressiodemoapps{ namespace impl { int nx = domMesh.nx(); int ny = domMesh.ny(); - const auto & x = domMesh.viewX(); - const auto & y = domMesh.viewY(); + // const auto & x = domMesh.viewX(); + // const auto & y = domMesh.viewY(); // TODO: generalize to 3D pda::resize(exchGraphs[domIdx], 2*nx + 2*ny, bcStencil); exchGraphs[domIdx].fill(-1); // loop through neighboring domains - for (int neighIdx = 0; neighIdx < exchDomIds[domIdx].size(); ++neighIdx) { + for (int neighIdx = 0; neighIdx < (int) exchDomIds[domIdx].size(); ++neighIdx) { int neighDomIdx = exchDomIds[domIdx][neighIdx]; if (neighDomIdx == -1) { @@ -497,10 +497,10 @@ namespace pressiodemoapps{ namespace impl { const auto domState = stateVec[domIdx]; - int exchCellIdx; + // int exchCellIdx; int startIdx; int endIdx; - for (int neighIdx = 0; neighIdx < exchDomIdVec[domIdx].size(); ++neighIdx) { + for (int neighIdx = 0; neighIdx < (int) exchDomIdVec[domIdx].size(); ++neighIdx) { int neighDomIdx = exchDomIdVec[domIdx][neighIdx]; if (neighDomIdx == -1) { @@ -510,7 +510,7 @@ namespace pressiodemoapps{ namespace impl { const auto neighMesh = appVec[neighDomIdx].getMesh(); int nxNeigh = neighMesh.nx(); int nyNeigh = neighMesh.ny(); - int nzNeigh = neighMesh.nz(); + //int nzNeigh = neighMesh.nz(); auto * neighStateBc = &stateBcVec[neighDomIdx]; const auto neighExchGraph = exchGraphVec[neighDomIdx]; @@ -574,7 +574,7 @@ namespace pressiodemoapps{ namespace impl { const auto intGraph = meshObj.graph(); int nx = meshObj.nx(); int ny = meshObj.ny(); - int nz = meshObj.nz(); + // int nz = meshObj.nz(); const auto & rowsBd = meshObj.graphRowsOfCellsNearBd(); pda::resize(ghostGraphs[domIdx], int(rowsBd.size()), 2 * dim); @@ -592,7 +592,7 @@ namespace pressiodemoapps{ namespace impl { const auto right0 = intGraph(smPt, 3); const auto back0 = intGraph(smPt, 4); - int stencilIdx = 0; // first order + // int stencilIdx = 0; // first order int rowIdx = smPt / nx; int colIdx = smPt % nx; int bcCellIdx; diff --git a/tests_cpp/CMakeLists.txt b/tests_cpp/CMakeLists.txt index a99c97a6..f6e0d739 100644 --- a/tests_cpp/CMakeLists.txt +++ b/tests_cpp/CMakeLists.txt @@ -82,7 +82,6 @@ add_subdirectory(eigen_2d_advdiffreac_probA_sample_mesh_test) add_subdirectory(eigen_2d_advdiffreac_probA_implicit) add_subdirectory(eigen_2d_euler_double_mach_reflection_schwarz) -add_subdirectory(eigen_2d_euler_riemann_implicit) add_subdirectory(eigen_2d_euler_riemann_implicit_schwarz) # --------------------------------------------------------- diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc index 3bb692c8..7457d28f 100644 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main.cc @@ -17,7 +17,7 @@ int main() // +++++ USER INPUTS +++++ string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; string obsRoot = "doubleMach2d_solution"; - const int obsFreq = 1; + //const int obsFreq = 1; // FR: commented out because unused // problem definition const auto probId = pda::Euler2d::DoubleMachReflection; diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt deleted file mode 100644 index f568c0d8..00000000 --- a/tests_cpp/eigen_2d_euler_riemann_implicit/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ - -add_subdirectory(firstorder) -#add_subdirectory(weno3) -#add_subdirectory(weno5) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt b/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt deleted file mode 100644 index 344cf6da..00000000 --- a/tests_cpp/eigen_2d_euler_riemann_implicit/firstorder/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ - -set(testname eigen_2d_riemann_firstorder_implicit) -set(exename ${testname}_exe) - -#configure_file(../plot.py plot.py COPYONLY) -#configure_file(../compare.py compare.py COPYONLY) -#configure_file(p_gold.txt p_gold.txt COPYONLY) -#configure_file(rho_gold.txt rho_gold.txt COPYONLY) - -add_executable(${exename} ${CMAKE_CURRENT_SOURCE_DIR}/../main.cc) - -add_test(NAME ${testname} -COMMAND ${CMAKE_COMMAND} --DMESHDRIVER=${MESHSRC}/create_full_mesh.py --DOUTDIR=${CMAKE_CURRENT_BINARY_DIR} --DEXENAME=$ --DSTENCILVAL=3 --P ${CMAKE_CURRENT_SOURCE_DIR}/../test.cmake -) diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc b/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc deleted file mode 100644 index 424efbb4..00000000 --- a/tests_cpp/eigen_2d_euler_riemann_implicit/main.cc +++ /dev/null @@ -1,42 +0,0 @@ -#include "pressio/ode_steppers_implicit.hpp" -#include "pressio/ode_advancers.hpp" -#include "pressiodemoapps/euler2d.hpp" -#include "../observer.hpp" - -int main() -{ - namespace pda = pressiodemoapps; - const auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("/home/crwentl/research/runs/pressio/riemann/meshes/mesh_1x1_refx/domain_0"); -#ifdef USE_WENO5 - const auto order = pda::InviscidFluxReconstruction::Weno5; -#elif defined USE_WENO3 - const auto order = pda::InviscidFluxReconstruction::Weno3; -#else - const auto order = pda::InviscidFluxReconstruction::FirstOrder; -#endif - - const auto probId = pda::Euler2d::Riemann; - auto appObj = pda::create_problem_eigen(meshObj, probId, order, 2); - using app_t = decltype(appObj); - using state_t = typename app_t::state_type; - using jacob_t = typename app_t::jacobian_type; - - state_t state(appObj.initialCondition()); - - auto stepperObj = pressio::ode::create_implicit_stepper( - pressio::ode::StepScheme::CrankNicolson, appObj); - - using lin_solver_t = pressio::linearsolvers::Solver< - pressio::linearsolvers::iterative::Bicgstab, jacob_t>; - lin_solver_t linSolverObj; - auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); - NonLinSolver.setTolerance(1e-5); - - FomObserver Obs("riemann2d_solution.bin", 1); - - const auto dt = 0.001; - const auto Nsteps = pressio::ode::StepCount(1.0/dt); - pressio::ode::advance_n_steps(stepperObj, state, 0., dt, Nsteps, Obs, NonLinSolver); - - return 0; -} diff --git a/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc index c5a79ad2..af51745d 100644 --- a/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc +++ b/tests_cpp/eigen_2d_euler_riemann_implicit_schwarz/main.cc @@ -17,7 +17,7 @@ int main() // +++++ USER INPUTS +++++ string meshRoot = "/home/crwentl/research/runs/pressio/riemann/meshes/mesh_2x2_refx"; string obsRoot = "riemann2d_solution"; - const int obsFreq = 1; + //const int obsFreq = 1; //unused for now // problem definition const auto probId = pda::Euler2d::Riemann; From 90afc442cc6d363b3d3792ebac0ae775369443b3 Mon Sep 17 00:00:00 2001 From: Francesco Rizzi Date: Thu, 6 Jul 2023 10:08:19 +0200 Subject: [PATCH 16/17] fix uninitialized --- include/pressiodemoapps/impl/schwarz.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/pressiodemoapps/impl/schwarz.hpp b/include/pressiodemoapps/impl/schwarz.hpp index e60fff13..bd95303a 100644 --- a/include/pressiodemoapps/impl/schwarz.hpp +++ b/include/pressiodemoapps/impl/schwarz.hpp @@ -212,7 +212,9 @@ namespace pressiodemoapps{ namespace impl { for (int domIdx = 0; domIdx < ndomains; ++domIdx) { // subdomain indices - int i, j, k; + int i ={}; + int j = {}; + int k = {}; i = domIdx % ndomX; if (dim > 1) { j = domIdx / ndomX; From e001b52dc0ffd136ca6284a185b180c68e9370f7 Mon Sep 17 00:00:00 2001 From: Chris Wentland Date: Mon, 10 Jul 2023 13:53:47 -0700 Subject: [PATCH 17/17] remove old working files from double mach schwarz --- .../main_FR.cc | 100 ------------------ .../main_MWE.cc | 72 ------------- .../main_oop.cc | 81 -------------- .../main_working.cc | 81 -------------- 4 files changed, 334 deletions(-) delete mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc delete mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc delete mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc delete mode 100644 tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc deleted file mode 100644 index d4f902b0..00000000 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_FR.cc +++ /dev/null @@ -1,100 +0,0 @@ - -#include "pressio/ode_steppers_implicit.hpp" -#include "pressio/ode_advancers.hpp" -#include "pressiodemoapps/euler2d.hpp" -#include "../observer.hpp" - -using namespace std; - -int main() -{ - namespace pda = pressiodemoapps; - namespace plog = pressio::log; - namespace pode = pressio::ode; - namespace pls = pressio::linearsolvers; - namespace pnls = pressio::nonlinearsolvers; - - plog::initialize(pressio::logto::terminal); - plog::setVerbosity({pressio::log::level::debug}); - - // ---- user inputs - int ndomains = 2; - const auto order = pda::InviscidFluxReconstruction::FirstOrder; - const auto probId = pda::Euler2d::DoubleMachReflection; - const auto scheme = pode::StepScheme::CrankNicolson; - // ---- end user inputs - - // aliases - using mesh_t = decltype( pda::load_cellcentered_uniform_mesh_eigen(".") ); - using app_t = decltype( pda::create_problem_eigen(std::declval(), probId, order) ); - using state_t = typename app_t::state_type; - using jacob_t = typename app_t::jacobian_type; - using lin_solver_t = pls::Solver; - using stepper_t = decltype( pode::create_implicit_stepper(scheme, std::declval()) ); - using nonlin_solver_t = decltype( pnls::create_newton_raphson( std::declval(), std::declval()) ); - - // - // create things - // - /* Note: - only need a single linear solver instance, all the nonlinear solvers will reference the same - but make sure it does not go out of scope */ - lin_solver_t linSolverObj; - std::string path = "."; - std::vector meshVec(ndomains); - std::vector appVec(ndomains); - std::vector stateVec(ndomains); - std::vector stepperVec; - vector nonlinSolverVec; - std::cout << "INIT \n"; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) - { - meshVec[domIdx] = pda::load_cellcentered_uniform_mesh_eigen(path); - appVec[domIdx] = pda::create_problem_eigen(meshVec[domIdx], probId, order); - stateVec[domIdx] = appVec[domIdx].initialCondition(); - - stepperVec.emplace_back( pode::create_implicit_stepper(scheme, appVec[domIdx]) ); - nonlinSolverVec.emplace_back( pnls::create_newton_raphson(stepperVec.back(), linSolverObj) ); - - std::cout << " LOOP: " - << "domIdx = " << domIdx << " " - << "&meshObj = " << &meshVec[domIdx] << " " - << "&appObj = " << &appVec[domIdx] - << std::endl; - } - - std::cout << "\nVERIFY \n"; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { // - std::cout << " LOOP: " - << "domIdx = " << domIdx << " " - << "&meshObj = " << &meshVec[domIdx] << " " - << "&appObj = " << &appVec[domIdx] - << std::endl; - } - - // - // try solve - // - std::cout << "\n"; - auto fixTol = [](nonlin_solver_t & s){ s.setTolerance(1e-5); }; - auto fixIters = [](nonlin_solver_t & s){ s.setMaxIterations(3); }; - std::for_each(nonlinSolverVec.begin(), nonlinSolverVec.end(), fixIters); - - int numSteps = 3; - const auto dtWrap = pode::StepSize(0.0025); - const auto startTimeWrap = pode::StepStartAt(0); - double time = startTimeWrap.get(); - for (int stepId=1; stepId<=numSteps; ++stepId) - { - std::cout << " Doing step = " << stepId << "\n"; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - std::cout << " Doing domain = " << domIdx << "\n"; - stepperVec[domIdx](stateVec[domIdx], startTimeWrap, - pode::StepCount(stepId), dtWrap, - nonlinSolverVec[domIdx]); - } - time += dtWrap.get(); - } - - return 0; -} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc deleted file mode 100644 index 33791bd7..00000000 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_MWE.cc +++ /dev/null @@ -1,72 +0,0 @@ - -#include "pressio/ode_steppers_implicit.hpp" -#include "pressio/ode_advancers.hpp" -#include "pressiodemoapps/euler2d.hpp" -#include "../observer.hpp" - -using namespace std; - -int main() -{ - pressio::log::initialize(pressio::logto::terminal); - pressio::log::setVerbosity({pressio::log::level::debug}); - - namespace pda = pressiodemoapps; - - constexpr auto order = pda::InviscidFluxReconstruction::FirstOrder; - const auto probId = pda::Euler2d::DoubleMachReflection; - const auto scheme = pressio::ode::StepScheme::CrankNicolson; - - // ---- user inputs - - int ndomains = 2; - int checkIdx = 0; - - // ---- end user inputs - - // getting types - auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("."); - using mesh_t = decltype(meshObj); - - auto appObj = pda::create_problem_eigen(meshObj, probId, order); - using app_t = decltype(appObj); - using state_t = typename app_t::state_type; - using jacob_t = typename app_t::jacobian_type; - - auto stepperObj = pressio::ode::create_implicit_stepper( - scheme, appObj); - using lin_solver_t = pressio::linearsolvers::Solver< - pressio::linearsolvers::iterative::Bicgstab, jacob_t>; - lin_solver_t linSolverObj; - auto NonLinSolver = pressio::nonlinearsolvers::create_newton_raphson(stepperObj, linSolverObj); - NonLinSolver.setTolerance(1e-5); - - using nonlin_solver_t = decltype(NonLinSolver); - using stepper_t = decltype(stepperObj); - - // problem objects for each domain - vector meshVec; - vector appVec; - vector stateVec; - vector stepperVec; - vector linSolverVec(ndomains); - vector nonlinSolverVec; - for (int domIdx = 0; domIdx < ndomains; ++domIdx) { - - meshVec.push_back(pda::load_cellcentered_uniform_mesh_eigen(".")); - appVec.push_back(pda::create_problem_eigen(meshVec[domIdx], probId, order)); - stateVec.push_back(appVec[domIdx].initialCondition()); - stepperVec.push_back(pressio::ode::create_implicit_stepper(scheme, appVec[domIdx])); - nonlinSolverVec.push_back(pressio::nonlinearsolvers::create_newton_raphson(stepperVec[domIdx], linSolverVec[domIdx])); - nonlinSolverVec[domIdx].setTolerance(1e-5); - - } - - const auto dtWrap = ::pressio::ode::StepSize(0.0025); - auto startTimeWrap = ::pressio::ode::StepStartAt(0.01); - const auto stepWrap = ::pressio::ode::StepCount(0); - - stepperVec[checkIdx](stateVec[checkIdx], startTimeWrap, stepWrap, dtWrap, nonlinSolverVec[checkIdx]); - - return 0; -} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc deleted file mode 100644 index aaa40abd..00000000 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_oop.cc +++ /dev/null @@ -1,81 +0,0 @@ - -#include "pressiodemoapps/euler2d.hpp" -#include "pressiodemoapps/impl/schwarz.hpp" -#include "../observer.hpp" - -using namespace std; - -int main() -{ - namespace pda = pressiodemoapps; - namespace plog = pressio::log; - namespace pode = pressio::ode; - namespace pls = pressio::linearsolvers; - namespace pnls = pressio::nonlinearsolvers; - - plog::initialize(pressio::logto::terminal); - plog::setVerbosity({pressio::log::level::debug}); - - // +++++ USER INPUTS +++++ - string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; - string obsRoot = "doubleMach2d_solution"; - const int obsFreq = 1; - - // problem definition - const auto probId = pda::Euler2d::DoubleMachReflection; - const auto order = pda::InviscidFluxReconstruction::FirstOrder; - const auto scheme = pode::StepScheme::CrankNicolson; - - // time stepping - const int numSteps = 100; - vector dt(4, 0.002); - const int convergeStepMax = 10; - const double abs_err_tol = 1e-11; - const double rel_err_tol = 1e-11; - - // +++++ END USER INPUTS +++++ - - // decomposition - auto decomp = pda::impl::SchwarzDecomp< - decltype(probId), - decltype(order), - decltype(scheme) - // itsolv_t - >(probId, order, scheme, meshRoot, dt); - - // observer - using state_t = decltype(decomp)::state_t; - using obs_t = FomObserver; - vector obsVec(decomp.ndomains); - for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); - obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); - } - - // solve - double time = 0.0; - for (int outerStep = 1; outerStep <= numSteps; ++outerStep) - { - cout << "Step " << outerStep << endl; - - // compute contoller step until convergence - decomp.calc_controller_step( - outerStep, - time, - rel_err_tol, - abs_err_tol, - convergeStepMax - ); - - time += decomp.dtMax; - - // output observer - const auto stepWrap = pode::StepCount(outerStep); - for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); - } - - } - - return 0; -} diff --git a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc b/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc deleted file mode 100644 index aaa40abd..00000000 --- a/tests_cpp/eigen_2d_euler_double_mach_reflection_schwarz/main_working.cc +++ /dev/null @@ -1,81 +0,0 @@ - -#include "pressiodemoapps/euler2d.hpp" -#include "pressiodemoapps/impl/schwarz.hpp" -#include "../observer.hpp" - -using namespace std; - -int main() -{ - namespace pda = pressiodemoapps; - namespace plog = pressio::log; - namespace pode = pressio::ode; - namespace pls = pressio::linearsolvers; - namespace pnls = pressio::nonlinearsolvers; - - plog::initialize(pressio::logto::terminal); - plog::setVerbosity({pressio::log::level::debug}); - - // +++++ USER INPUTS +++++ - string meshRoot = "/home/crwentl/research/runs/pressio/double_mach/meshes/mesh_2x2"; - string obsRoot = "doubleMach2d_solution"; - const int obsFreq = 1; - - // problem definition - const auto probId = pda::Euler2d::DoubleMachReflection; - const auto order = pda::InviscidFluxReconstruction::FirstOrder; - const auto scheme = pode::StepScheme::CrankNicolson; - - // time stepping - const int numSteps = 100; - vector dt(4, 0.002); - const int convergeStepMax = 10; - const double abs_err_tol = 1e-11; - const double rel_err_tol = 1e-11; - - // +++++ END USER INPUTS +++++ - - // decomposition - auto decomp = pda::impl::SchwarzDecomp< - decltype(probId), - decltype(order), - decltype(scheme) - // itsolv_t - >(probId, order, scheme, meshRoot, dt); - - // observer - using state_t = decltype(decomp)::state_t; - using obs_t = FomObserver; - vector obsVec(decomp.ndomains); - for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - obsVec[domIdx] = obs_t(obsRoot + "_" + to_string(domIdx) + ".bin", 1); - obsVec[domIdx](::pressio::ode::StepCount(0), 0.0, decomp.stateVec[domIdx]); - } - - // solve - double time = 0.0; - for (int outerStep = 1; outerStep <= numSteps; ++outerStep) - { - cout << "Step " << outerStep << endl; - - // compute contoller step until convergence - decomp.calc_controller_step( - outerStep, - time, - rel_err_tol, - abs_err_tol, - convergeStepMax - ); - - time += decomp.dtMax; - - // output observer - const auto stepWrap = pode::StepCount(outerStep); - for (int domIdx = 0; domIdx < decomp.ndomains; ++domIdx) { - obsVec[domIdx](stepWrap, time, decomp.stateVec[domIdx]); - } - - } - - return 0; -}